Adding notes

This commit is contained in:
Selim Mustafaev 2021-09-26 18:47:14 +03:00
parent c1097249c3
commit d656cc1698
17 changed files with 587 additions and 200 deletions

View File

@ -50,6 +50,8 @@
7A6DD90A24329541009DE740 /* RoadNumbers2.0.otf in Resources */ = {isa = PBXBuildFile; fileRef = 7A6DD90924329541009DE740 /* RoadNumbers2.0.otf */; }; 7A6DD90A24329541009DE740 /* RoadNumbers2.0.otf in Resources */ = {isa = PBXBuildFile; fileRef = 7A6DD90924329541009DE740 /* RoadNumbers2.0.otf */; };
7A6DD90C24335A6D009DE740 /* FlagLayer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A6DD90B24335A6D009DE740 /* FlagLayer.swift */; }; 7A6DD90C24335A6D009DE740 /* FlagLayer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A6DD90B24335A6D009DE740 /* FlagLayer.swift */; };
7A6E03282485951700DB22ED /* OwnersController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A6E03272485951700DB22ED /* OwnersController.swift */; }; 7A6E03282485951700DB22ED /* OwnersController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A6E03272485951700DB22ED /* OwnersController.swift */; };
7A6F095E26DB9F85003A965D /* NotesController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A6F095D26DB9F85003A965D /* NotesController.swift */; };
7A6F096026DBF588003A965D /* VehicleNote.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A6F095F26DBF588003A965D /* VehicleNote.swift */; };
7A7547E024032CB6004E8406 /* VehiclePhotoCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A7547DF24032CB6004E8406 /* VehiclePhotoCell.swift */; }; 7A7547E024032CB6004E8406 /* VehiclePhotoCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A7547DF24032CB6004E8406 /* VehiclePhotoCell.swift */; };
7A761C042677F18E0005F28F /* Api.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A11474323FF06CA00B424AF /* Api.swift */; }; 7A761C042677F18E0005F28F /* Api.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A11474323FF06CA00B424AF /* Api.swift */; };
7A761C052677F1BC0005F28F /* CocoaError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A27ADF824A09CAD0035F39E /* CocoaError.swift */; }; 7A761C052677F1BC0005F28F /* CocoaError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A27ADF824A09CAD0035F39E /* CocoaError.swift */; };
@ -68,25 +70,21 @@
7A8AB76B25A1D95500ECF2C1 /* SourceStatusRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A8AB76A25A1D95500ECF2C1 /* SourceStatusRow.swift */; }; 7A8AB76B25A1D95500ECF2C1 /* SourceStatusRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A8AB76A25A1D95500ECF2C1 /* SourceStatusRow.swift */; };
7A96AE2D246B2B7400297C33 /* GoogleSignInController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A96AE2C246B2B7400297C33 /* GoogleSignInController.swift */; }; 7A96AE2D246B2B7400297C33 /* GoogleSignInController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A96AE2C246B2B7400297C33 /* GoogleSignInController.swift */; };
7A96AE2F246B2BCD00297C33 /* WebKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7A96AE2E246B2BCD00297C33 /* WebKit.framework */; }; 7A96AE2F246B2BCD00297C33 /* WebKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7A96AE2E246B2BCD00297C33 /* WebKit.framework */; };
7A99406426E4BFAE002E9CB6 /* VehicleNoteCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A99406326E4BFAE002E9CB6 /* VehicleNoteCell.swift */; };
7A9FEEC82529AB23001CA50E /* RxRealmDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A9FEEC72529AB23001CA50E /* RxRealmDataSource.swift */; }; 7A9FEEC82529AB23001CA50E /* RxRealmDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A9FEEC72529AB23001CA50E /* RxRealmDataSource.swift */; };
7AA7BC2C25A5DFB80053A5D5 /* RxSwift in Frameworks */ = {isa = PBXBuildFile; productRef = 7A11471C23FEA18700B424AF /* RxSwift */; }; 7AA54C1C26CD977A00F2BF28 /* RxCocoa in Frameworks */ = {isa = PBXBuildFile; productRef = 7AA54C1B26CD977A00F2BF28 /* RxCocoa */; };
7AA7BC2D25A5DFB80053A5D5 /* RxRelay in Frameworks */ = {isa = PBXBuildFile; productRef = 7A11471E23FEA18700B424AF /* RxRelay */; }; 7AA54C1E26CD977A00F2BF28 /* RxSwift in Frameworks */ = {isa = PBXBuildFile; productRef = 7AA54C1D26CD977A00F2BF28 /* RxSwift */; settings = {ATTRIBUTES = (Required, ); }; };
7AA7BC2E25A5DFB80053A5D5 /* RxCocoa in Frameworks */ = {isa = PBXBuildFile; productRef = 7A11472023FEA18700B424AF /* RxCocoa */; }; 7AA54C2026CD977A00F2BF28 /* RxRealm in Frameworks */ = {isa = PBXBuildFile; productRef = 7AA54C1F26CD977A00F2BF28 /* RxRealm */; };
7AA7BC2F25A5DFB80053A5D5 /* RxBlocking in Frameworks */ = {isa = PBXBuildFile; productRef = 7A11472223FEA18700B424AF /* RxBlocking */; };
7AA7BC3025A5DFB80053A5D5 /* Realm in Frameworks */ = {isa = PBXBuildFile; productRef = 7A11472523FEA1F400B424AF /* Realm */; };
7AA7BC3125A5DFB80053A5D5 /* RealmSwift in Frameworks */ = {isa = PBXBuildFile; productRef = 7A11472723FEA1F400B424AF /* RealmSwift */; };
7AA7BC3225A5DFB80053A5D5 /* RxRealm in Frameworks */ = {isa = PBXBuildFile; productRef = 7A530B8A240181F500CBFE6E /* RxRealm */; };
7AA7BC3325A5DFB80053A5D5 /* Kingfisher in Frameworks */ = {isa = PBXBuildFile; productRef = 7AF58D332402A91C00CE01A0 /* Kingfisher */; }; 7AA7BC3325A5DFB80053A5D5 /* Kingfisher in Frameworks */ = {isa = PBXBuildFile; productRef = 7AF58D332402A91C00CE01A0 /* Kingfisher */; };
7AA7BC3425A5DFB80053A5D5 /* SwiftDate in Frameworks */ = {isa = PBXBuildFile; productRef = 7A051610241412CA00FC55AC /* SwiftDate */; };
7AA7BC3525A5DFB80053A5D5 /* ExceptionCatcher in Frameworks */ = {isa = PBXBuildFile; productRef = 7A813DC02508C4D900CC93B9 /* ExceptionCatcher */; }; 7AA7BC3525A5DFB80053A5D5 /* ExceptionCatcher in Frameworks */ = {isa = PBXBuildFile; productRef = 7A813DC02508C4D900CC93B9 /* ExceptionCatcher */; };
7AA7BC3625A5DFB80053A5D5 /* PKHUD in Frameworks */ = {isa = PBXBuildFile; productRef = 7AABDE1C2532F3EB0041AFC6 /* PKHUD */; }; 7AA7BC3625A5DFB80053A5D5 /* PKHUD in Frameworks */ = {isa = PBXBuildFile; productRef = 7AABDE1C2532F3EB0041AFC6 /* PKHUD */; };
7AA7BC3725A5DFB80053A5D5 /* DifferenceKit in Frameworks */ = {isa = PBXBuildFile; productRef = 7AABDE22253327F10041AFC6 /* DifferenceKit */; };
7AA7BC3825A5DFB80053A5D5 /* Eureka in Frameworks */ = {isa = PBXBuildFile; productRef = 7AEF47A3253DC4D2001D6238 /* Eureka */; }; 7AA7BC3825A5DFB80053A5D5 /* Eureka in Frameworks */ = {isa = PBXBuildFile; productRef = 7AEF47A3253DC4D2001D6238 /* Eureka */; };
7AABB1F0267E9CAA00D7AB32 /* DifferenceKit in Frameworks */ = {isa = PBXBuildFile; productRef = 7AABB1EF267E9CAA00D7AB32 /* DifferenceKit */; }; 7AABB1F0267E9CAA00D7AB32 /* DifferenceKit in Frameworks */ = {isa = PBXBuildFile; productRef = 7AABB1EF267E9CAA00D7AB32 /* DifferenceKit */; settings = {ATTRIBUTES = (Required, ); }; };
7AABB1F2267E9CC800D7AB32 /* SwiftDate in Frameworks */ = {isa = PBXBuildFile; productRef = 7AABB1F1267E9CC800D7AB32 /* SwiftDate */; }; 7AABB1F2267E9CC800D7AB32 /* SwiftDate in Frameworks */ = {isa = PBXBuildFile; productRef = 7AABB1F1267E9CC800D7AB32 /* SwiftDate */; };
7AABDE26253350C30041AFC6 /* RxSectionedDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AABDE25253350C30041AFC6 /* RxSectionedDataSource.swift */; }; 7AABDE26253350C30041AFC6 /* RxSectionedDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AABDE25253350C30041AFC6 /* RxSectionedDataSource.swift */; };
7AB67E8C2435C38700258F61 /* CustomTextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AB67E8B2435C38700258F61 /* CustomTextField.swift */; }; 7AB67E8C2435C38700258F61 /* CustomTextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AB67E8B2435C38700258F61 /* CustomTextField.swift */; };
7AB67E8E2435D1A000258F61 /* CustomButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AB67E8D2435D1A000258F61 /* CustomButton.swift */; }; 7AB67E8E2435D1A000258F61 /* CustomButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AB67E8D2435D1A000258F61 /* CustomButton.swift */; };
7AC76D7B270083AE0084DB27 /* TextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AC76D7A270083AE0084DB27 /* TextView.swift */; };
7ADF6C93250B954900F237B2 /* Navigation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7ADF6C92250B954900F237B2 /* Navigation.swift */; }; 7ADF6C93250B954900F237B2 /* Navigation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7ADF6C92250B954900F237B2 /* Navigation.swift */; };
7ADF6C95250D037700F237B2 /* ShowEventController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7ADF6C94250D037700F237B2 /* ShowEventController.swift */; }; 7ADF6C95250D037700F237B2 /* ShowEventController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7ADF6C94250D037700F237B2 /* ShowEventController.swift */; };
7ADF6C97250F41B000F237B2 /* PNKeyboard.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7ADF6C96250F41B000F237B2 /* PNKeyboard.swift */; }; 7ADF6C97250F41B000F237B2 /* PNKeyboard.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7ADF6C96250F41B000F237B2 /* PNKeyboard.swift */; };
@ -104,8 +102,6 @@
7AF6D1E92677A8410086EA64 /* FakeLocationManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AF6D1E82677A8410086EA64 /* FakeLocationManager.swift */; }; 7AF6D1E92677A8410086EA64 /* FakeLocationManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AF6D1E82677A8410086EA64 /* FakeLocationManager.swift */; };
7AF6D2042677C03B0086EA64 /* AutoCatCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7AF6D1EF2677C03B0086EA64 /* AutoCatCore.framework */; }; 7AF6D2042677C03B0086EA64 /* AutoCatCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7AF6D1EF2677C03B0086EA64 /* AutoCatCore.framework */; };
7AF6D2052677C03B0086EA64 /* AutoCatCore.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 7AF6D1EF2677C03B0086EA64 /* AutoCatCore.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 7AF6D2052677C03B0086EA64 /* AutoCatCore.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 7AF6D1EF2677C03B0086EA64 /* AutoCatCore.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
7AF6D20F2677C0EA0086EA64 /* RxCocoa in Frameworks */ = {isa = PBXBuildFile; productRef = 7AF6D20E2677C0EA0086EA64 /* RxCocoa */; };
7AF6D2112677C0EA0086EA64 /* RxSwift in Frameworks */ = {isa = PBXBuildFile; productRef = 7AF6D2102677C0EA0086EA64 /* RxSwift */; };
7AF6D2122677C12E0086EA64 /* Location.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A000AA124C2EEDE001F5B00 /* Location.swift */; }; 7AF6D2122677C12E0086EA64 /* Location.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A000AA124C2EEDE001F5B00 /* Location.swift */; };
7AF6D2132677C15A0086EA64 /* AudioRecord.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A659B5824A2B1BA0043A0F2 /* AudioRecord.swift */; }; 7AF6D2132677C15A0086EA64 /* AudioRecord.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A659B5824A2B1BA0043A0F2 /* AudioRecord.swift */; };
7AF6D2142677C1680086EA64 /* VehicleEvent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AAE6AD224CDDF950023860B /* VehicleEvent.swift */; }; 7AF6D2142677C1680086EA64 /* VehicleEvent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AAE6AD224CDDF950023860B /* VehicleEvent.swift */; };
@ -124,7 +120,6 @@
7AF6D2212677C1680086EA64 /* PagedResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6841A913FABBB0AB20DEF4FC /* PagedResponse.swift */; }; 7AF6D2212677C1680086EA64 /* PagedResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6841A913FABBB0AB20DEF4FC /* PagedResponse.swift */; };
7AF6D2232677C2B40086EA64 /* Realm in Frameworks */ = {isa = PBXBuildFile; productRef = 7AF6D2222677C2B40086EA64 /* Realm */; }; 7AF6D2232677C2B40086EA64 /* Realm in Frameworks */ = {isa = PBXBuildFile; productRef = 7AF6D2222677C2B40086EA64 /* Realm */; };
7AF6D2252677C2B40086EA64 /* RealmSwift in Frameworks */ = {isa = PBXBuildFile; productRef = 7AF6D2242677C2B40086EA64 /* RealmSwift */; }; 7AF6D2252677C2B40086EA64 /* RealmSwift in Frameworks */ = {isa = PBXBuildFile; productRef = 7AF6D2242677C2B40086EA64 /* RealmSwift */; };
7AF6D2272677C2B40086EA64 /* RxRealm in Frameworks */ = {isa = PBXBuildFile; productRef = 7AF6D2262677C2B40086EA64 /* RxRealm */; };
7AF6D2282677C2DC0086EA64 /* Constants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A96AE30246B2FE400297C33 /* Constants.swift */; }; 7AF6D2282677C2DC0086EA64 /* Constants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A96AE30246B2FE400297C33 /* Constants.swift */; };
7AF6D22A2677C3AD0086EA64 /* Exportable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AE8424D26109F78002F6B31 /* Exportable.swift */; }; 7AF6D22A2677C3AD0086EA64 /* Exportable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AE8424D26109F78002F6B31 /* Exportable.swift */; };
/* End PBXBuildFile section */ /* End PBXBuildFile section */
@ -230,6 +225,8 @@
7A6DD90B24335A6D009DE740 /* FlagLayer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FlagLayer.swift; sourceTree = "<group>"; }; 7A6DD90B24335A6D009DE740 /* FlagLayer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FlagLayer.swift; sourceTree = "<group>"; };
7A6DD90D24337930009DE740 /* PlateNumber.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlateNumber.swift; sourceTree = "<group>"; }; 7A6DD90D24337930009DE740 /* PlateNumber.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlateNumber.swift; sourceTree = "<group>"; };
7A6E03272485951700DB22ED /* OwnersController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OwnersController.swift; sourceTree = "<group>"; }; 7A6E03272485951700DB22ED /* OwnersController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OwnersController.swift; sourceTree = "<group>"; };
7A6F095D26DB9F85003A965D /* NotesController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotesController.swift; sourceTree = "<group>"; };
7A6F095F26DBF588003A965D /* VehicleNote.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VehicleNote.swift; sourceTree = "<group>"; };
7A7547DF24032CB6004E8406 /* VehiclePhotoCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VehiclePhotoCell.swift; sourceTree = "<group>"; }; 7A7547DF24032CB6004E8406 /* VehiclePhotoCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VehiclePhotoCell.swift; sourceTree = "<group>"; };
7A761C0A267E8FF90005F28F /* Error.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Error.swift; sourceTree = "<group>"; }; 7A761C0A267E8FF90005F28F /* Error.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Error.swift; sourceTree = "<group>"; };
7A813DBD2506A57100CC93B9 /* AuthenticationServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AuthenticationServices.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk/System/Library/Frameworks/AuthenticationServices.framework; sourceTree = DEVELOPER_DIR; }; 7A813DBD2506A57100CC93B9 /* AuthenticationServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AuthenticationServices.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk/System/Library/Frameworks/AuthenticationServices.framework; sourceTree = DEVELOPER_DIR; };
@ -247,12 +244,14 @@
7A96AE2E246B2BCD00297C33 /* WebKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk/System/Library/Frameworks/WebKit.framework; sourceTree = DEVELOPER_DIR; }; 7A96AE2E246B2BCD00297C33 /* WebKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk/System/Library/Frameworks/WebKit.framework; sourceTree = DEVELOPER_DIR; };
7A96AE30246B2FE400297C33 /* Constants.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Constants.swift; sourceTree = "<group>"; }; 7A96AE30246B2FE400297C33 /* Constants.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Constants.swift; sourceTree = "<group>"; };
7A96AE32246C095700297C33 /* Base64FS.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Base64FS.swift; sourceTree = "<group>"; }; 7A96AE32246C095700297C33 /* Base64FS.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Base64FS.swift; sourceTree = "<group>"; };
7A99406326E4BFAE002E9CB6 /* VehicleNoteCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VehicleNoteCell.swift; sourceTree = "<group>"; };
7A9FEEC72529AB23001CA50E /* RxRealmDataSource.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RxRealmDataSource.swift; sourceTree = "<group>"; }; 7A9FEEC72529AB23001CA50E /* RxRealmDataSource.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RxRealmDataSource.swift; sourceTree = "<group>"; };
7AABDE25253350C30041AFC6 /* RxSectionedDataSource.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RxSectionedDataSource.swift; sourceTree = "<group>"; }; 7AABDE25253350C30041AFC6 /* RxSectionedDataSource.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RxSectionedDataSource.swift; sourceTree = "<group>"; };
7AAE6AD224CDDF950023860B /* VehicleEvent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VehicleEvent.swift; sourceTree = "<group>"; }; 7AAE6AD224CDDF950023860B /* VehicleEvent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VehicleEvent.swift; sourceTree = "<group>"; };
7AB562B9249C9E9B00473D53 /* VehicleRegion.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VehicleRegion.swift; sourceTree = "<group>"; }; 7AB562B9249C9E9B00473D53 /* VehicleRegion.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VehicleRegion.swift; sourceTree = "<group>"; };
7AB67E8B2435C38700258F61 /* CustomTextField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomTextField.swift; sourceTree = "<group>"; }; 7AB67E8B2435C38700258F61 /* CustomTextField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomTextField.swift; sourceTree = "<group>"; };
7AB67E8D2435D1A000258F61 /* CustomButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomButton.swift; sourceTree = "<group>"; }; 7AB67E8D2435D1A000258F61 /* CustomButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomButton.swift; sourceTree = "<group>"; };
7AC76D7A270083AE0084DB27 /* TextView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TextView.swift; sourceTree = "<group>"; };
7ADF6C92250B954900F237B2 /* Navigation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Navigation.swift; sourceTree = "<group>"; }; 7ADF6C92250B954900F237B2 /* Navigation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Navigation.swift; sourceTree = "<group>"; };
7ADF6C94250D037700F237B2 /* ShowEventController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShowEventController.swift; sourceTree = "<group>"; }; 7ADF6C94250D037700F237B2 /* ShowEventController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShowEventController.swift; sourceTree = "<group>"; };
7ADF6C96250F41B000F237B2 /* PNKeyboard.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PNKeyboard.swift; sourceTree = "<group>"; }; 7ADF6C96250F41B000F237B2 /* PNKeyboard.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PNKeyboard.swift; sourceTree = "<group>"; };
@ -282,21 +281,12 @@
isa = PBXFrameworksBuildPhase; isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
7AA7BC3125A5DFB80053A5D5 /* RealmSwift in Frameworks */,
7AA7BC3525A5DFB80053A5D5 /* ExceptionCatcher in Frameworks */, 7AA7BC3525A5DFB80053A5D5 /* ExceptionCatcher in Frameworks */,
7AA7BC3025A5DFB80053A5D5 /* Realm in Frameworks */,
7AA7BC2C25A5DFB80053A5D5 /* RxSwift in Frameworks */,
7AA7BC2F25A5DFB80053A5D5 /* RxBlocking in Frameworks */,
7AA7BC3825A5DFB80053A5D5 /* Eureka in Frameworks */, 7AA7BC3825A5DFB80053A5D5 /* Eureka in Frameworks */,
7AA7BC3325A5DFB80053A5D5 /* Kingfisher in Frameworks */, 7AA7BC3325A5DFB80053A5D5 /* Kingfisher in Frameworks */,
7A813DBE2506A57100CC93B9 /* AuthenticationServices.framework in Frameworks */, 7A813DBE2506A57100CC93B9 /* AuthenticationServices.framework in Frameworks */,
7AA7BC3625A5DFB80053A5D5 /* PKHUD in Frameworks */, 7AA7BC3625A5DFB80053A5D5 /* PKHUD in Frameworks */,
7AA7BC2E25A5DFB80053A5D5 /* RxCocoa in Frameworks */,
7AA7BC3425A5DFB80053A5D5 /* SwiftDate in Frameworks */,
7AF6D2042677C03B0086EA64 /* AutoCatCore.framework in Frameworks */, 7AF6D2042677C03B0086EA64 /* AutoCatCore.framework in Frameworks */,
7AA7BC3725A5DFB80053A5D5 /* DifferenceKit in Frameworks */,
7AA7BC3225A5DFB80053A5D5 /* RxRealm in Frameworks */,
7AA7BC2D25A5DFB80053A5D5 /* RxRelay in Frameworks */,
7A96AE2F246B2BCD00297C33 /* WebKit.framework in Frameworks */, 7A96AE2F246B2BCD00297C33 /* WebKit.framework in Frameworks */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
@ -312,13 +302,13 @@
isa = PBXFrameworksBuildPhase; isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
7AA54C1E26CD977A00F2BF28 /* RxSwift in Frameworks */,
7AABB1F0267E9CAA00D7AB32 /* DifferenceKit in Frameworks */, 7AABB1F0267E9CAA00D7AB32 /* DifferenceKit in Frameworks */,
7AF6D2252677C2B40086EA64 /* RealmSwift in Frameworks */, 7AF6D2252677C2B40086EA64 /* RealmSwift in Frameworks */,
7AA54C1C26CD977A00F2BF28 /* RxCocoa in Frameworks */,
7AF6D2232677C2B40086EA64 /* Realm in Frameworks */, 7AF6D2232677C2B40086EA64 /* Realm in Frameworks */,
7AF6D2112677C0EA0086EA64 /* RxSwift in Frameworks */,
7AABB1F2267E9CC800D7AB32 /* SwiftDate in Frameworks */, 7AABB1F2267E9CC800D7AB32 /* SwiftDate in Frameworks */,
7AF6D20F2677C0EA0086EA64 /* RxCocoa in Frameworks */, 7AA54C2026CD977A00F2BF28 /* RxRealm in Frameworks */,
7AF6D2272677C2B40086EA64 /* RxRealm in Frameworks */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };
@ -417,6 +407,7 @@
7A11471723FDEBFA00B424AF /* ReportController.swift */, 7A11471723FDEBFA00B424AF /* ReportController.swift */,
7A3F07AC2436350B00E59687 /* SearchController.swift */, 7A3F07AC2436350B00E59687 /* SearchController.swift */,
7AEFE727240455E200910EB7 /* SettingsController.swift */, 7AEFE727240455E200910EB7 /* SettingsController.swift */,
7A6F095D26DB9F85003A965D /* NotesController.swift */,
); );
path = Controllers; path = Controllers;
sourceTree = "<group>"; sourceTree = "<group>";
@ -460,6 +451,7 @@
7A2DE69725868AC800A113FC /* VehicleAd.swift */, 7A2DE69725868AC800A113FC /* VehicleAd.swift */,
7AAE6AD224CDDF950023860B /* VehicleEvent.swift */, 7AAE6AD224CDDF950023860B /* VehicleEvent.swift */,
7AB562B9249C9E9B00473D53 /* VehicleRegion.swift */, 7AB562B9249C9E9B00473D53 /* VehicleRegion.swift */,
7A6F095F26DBF588003A965D /* VehicleNote.swift */,
); );
path = Models; path = Models;
sourceTree = "<group>"; sourceTree = "<group>";
@ -490,6 +482,7 @@
7AE26A3224EEF9EC00625033 /* UIViewControllerExt.swift */, 7AE26A3224EEF9EC00625033 /* UIViewControllerExt.swift */,
7A8A220A248D67B60073DFD9 /* VehicleReportImage.swift */, 7A8A220A248D67B60073DFD9 /* VehicleReportImage.swift */,
7A761C0A267E8FF90005F28F /* Error.swift */, 7A761C0A267E8FF90005F28F /* Error.swift */,
7AC76D7A270083AE0084DB27 /* TextView.swift */,
); );
path = Extensions; path = Extensions;
sourceTree = "<group>"; sourceTree = "<group>";
@ -502,6 +495,7 @@
7A1090E724A394F100B4F0B2 /* AudioRecordCell.swift */, 7A1090E724A394F100B4F0B2 /* AudioRecordCell.swift */,
7A813DC22508EE4F00CC93B9 /* EventCell.swift */, 7A813DC22508EE4F00CC93B9 /* EventCell.swift */,
7AEFC3BD2529D3CC00BADFB2 /* ConfigurableCell.swift */, 7AEFC3BD2529D3CC00BADFB2 /* ConfigurableCell.swift */,
7A99406326E4BFAE002E9CB6 /* VehicleNoteCell.swift */,
); );
path = Cells; path = Cells;
sourceTree = "<group>"; sourceTree = "<group>";
@ -644,18 +638,9 @@
); );
name = AutoCat; name = AutoCat;
packageProductDependencies = ( packageProductDependencies = (
7A11471C23FEA18700B424AF /* RxSwift */,
7A11471E23FEA18700B424AF /* RxRelay */,
7A11472023FEA18700B424AF /* RxCocoa */,
7A11472223FEA18700B424AF /* RxBlocking */,
7A11472523FEA1F400B424AF /* Realm */,
7A11472723FEA1F400B424AF /* RealmSwift */,
7A530B8A240181F500CBFE6E /* RxRealm */,
7AF58D332402A91C00CE01A0 /* Kingfisher */, 7AF58D332402A91C00CE01A0 /* Kingfisher */,
7A051610241412CA00FC55AC /* SwiftDate */,
7A813DC02508C4D900CC93B9 /* ExceptionCatcher */, 7A813DC02508C4D900CC93B9 /* ExceptionCatcher */,
7AABDE1C2532F3EB0041AFC6 /* PKHUD */, 7AABDE1C2532F3EB0041AFC6 /* PKHUD */,
7AABDE22253327F10041AFC6 /* DifferenceKit */,
7AEF47A3253DC4D2001D6238 /* Eureka */, 7AEF47A3253DC4D2001D6238 /* Eureka */,
); );
productName = AutoCat; productName = AutoCat;
@ -695,13 +680,13 @@
); );
name = AutoCatCore; name = AutoCatCore;
packageProductDependencies = ( packageProductDependencies = (
7AF6D20E2677C0EA0086EA64 /* RxCocoa */,
7AF6D2102677C0EA0086EA64 /* RxSwift */,
7AF6D2222677C2B40086EA64 /* Realm */, 7AF6D2222677C2B40086EA64 /* Realm */,
7AF6D2242677C2B40086EA64 /* RealmSwift */, 7AF6D2242677C2B40086EA64 /* RealmSwift */,
7AF6D2262677C2B40086EA64 /* RxRealm */,
7AABB1EF267E9CAA00D7AB32 /* DifferenceKit */, 7AABB1EF267E9CAA00D7AB32 /* DifferenceKit */,
7AABB1F1267E9CC800D7AB32 /* SwiftDate */, 7AABB1F1267E9CC800D7AB32 /* SwiftDate */,
7AA54C1B26CD977A00F2BF28 /* RxCocoa */,
7AA54C1D26CD977A00F2BF28 /* RxSwift */,
7AA54C1F26CD977A00F2BF28 /* RxRealm */,
); );
productName = AutoCatCore; productName = AutoCatCore;
productReference = 7AF6D1EF2677C03B0086EA64 /* AutoCatCore.framework */; productReference = 7AF6D1EF2677C03B0086EA64 /* AutoCatCore.framework */;
@ -805,6 +790,7 @@
7A813DC9250B5C9700CC93B9 /* LocationRow.swift in Sources */, 7A813DC9250B5C9700CC93B9 /* LocationRow.swift in Sources */,
7A2DE69B25869ABD00A113FC /* AdsController.swift in Sources */, 7A2DE69B25869ABD00A113FC /* AdsController.swift in Sources */,
7A6DD90824329144009DE740 /* CenterTextLayer.swift in Sources */, 7A6DD90824329144009DE740 /* CenterTextLayer.swift in Sources */,
7A99406426E4BFAE002E9CB6 /* VehicleNoteCell.swift in Sources */,
7A8AB76B25A1D95500ECF2C1 /* SourceStatusRow.swift in Sources */, 7A8AB76B25A1D95500ECF2C1 /* SourceStatusRow.swift in Sources */,
7A813DC32508EE4F00CC93B9 /* EventCell.swift in Sources */, 7A813DC32508EE4F00CC93B9 /* EventCell.swift in Sources */,
7A3F07AD2436350B00E59687 /* SearchController.swift in Sources */, 7A3F07AD2436350B00E59687 /* SearchController.swift in Sources */,
@ -827,12 +813,14 @@
7A27ADF7249FEF690035F39E /* Recorder.swift in Sources */, 7A27ADF7249FEF690035F39E /* Recorder.swift in Sources */,
7A3F07AB24360DC800E59687 /* Dated.swift in Sources */, 7A3F07AB24360DC800E59687 /* Dated.swift in Sources */,
7A33381124990DAE00D878F1 /* FiltersController.swift in Sources */, 7A33381124990DAE00D878F1 /* FiltersController.swift in Sources */,
7AC76D7B270083AE0084DB27 /* TextView.swift in Sources */,
7A1090E824A394F100B4F0B2 /* AudioRecordCell.swift in Sources */, 7A1090E824A394F100B4F0B2 /* AudioRecordCell.swift in Sources */,
7A64AE762469DFB600ABE48E /* ContentTransformers.swift in Sources */, 7A64AE762469DFB600ABE48E /* ContentTransformers.swift in Sources */,
7A11471823FDEBFA00B424AF /* ReportController.swift in Sources */, 7A11471823FDEBFA00B424AF /* ReportController.swift in Sources */,
7AE24C5F251F1B4E00758E39 /* Buttons.swift in Sources */, 7AE24C5F251F1B4E00758E39 /* Buttons.swift in Sources */,
7A11471A23FE839000B424AF /* AuthController.swift in Sources */, 7A11471A23FE839000B424AF /* AuthController.swift in Sources */,
7A530B7A24001D3300CBFE6E /* CheckController.swift in Sources */, 7A530B7A24001D3300CBFE6E /* CheckController.swift in Sources */,
7A6F095E26DB9F85003A965D /* NotesController.swift in Sources */,
7A6E03282485951700DB22ED /* OwnersController.swift in Sources */, 7A6E03282485951700DB22ED /* OwnersController.swift in Sources */,
7A64AE742469DFB600ABE48E /* MediaContentView.swift in Sources */, 7A64AE742469DFB600ABE48E /* MediaContentView.swift in Sources */,
7A1090EC24A4E3E100B4F0B2 /* CellProgressView.swift in Sources */, 7A1090EC24A4E3E100B4F0B2 /* CellProgressView.swift in Sources */,
@ -887,6 +875,7 @@
7AF6D2122677C12E0086EA64 /* Location.swift in Sources */, 7AF6D2122677C12E0086EA64 /* Location.swift in Sources */,
7AF6D2142677C1680086EA64 /* VehicleEvent.swift in Sources */, 7AF6D2142677C1680086EA64 /* VehicleEvent.swift in Sources */,
7AF6D2172677C1680086EA64 /* VehicleRegion.swift in Sources */, 7AF6D2172677C1680086EA64 /* VehicleRegion.swift in Sources */,
7A6F096026DBF588003A965D /* VehicleNote.swift in Sources */,
7AF6D21E2677C1680086EA64 /* PlateNumber.swift in Sources */, 7AF6D21E2677C1680086EA64 /* PlateNumber.swift in Sources */,
7AF6D21F2677C1680086EA64 /* Response.swift in Sources */, 7AF6D21F2677C1680086EA64 /* Response.swift in Sources */,
7A761C07267E8E7F0005F28F /* AnyEncodable.swift in Sources */, 7A761C07267E8E7F0005F28F /* AnyEncodable.swift in Sources */,
@ -1091,7 +1080,7 @@
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_ENTITLEMENTS = AutoCat/AutoCat.entitlements; CODE_SIGN_ENTITLEMENTS = AutoCat/AutoCat.entitlements;
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 78; CURRENT_PROJECT_VERSION = 79;
DEVELOPMENT_TEAM = 46DTTB8X4S; DEVELOPMENT_TEAM = 46DTTB8X4S;
INFOPLIST_FILE = AutoCat/Info.plist; INFOPLIST_FILE = AutoCat/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 13.0; IPHONEOS_DEPLOYMENT_TARGET = 13.0;
@ -1116,7 +1105,7 @@
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_ENTITLEMENTS = AutoCat/AutoCat.entitlements; CODE_SIGN_ENTITLEMENTS = AutoCat/AutoCat.entitlements;
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 78; CURRENT_PROJECT_VERSION = 79;
DEVELOPMENT_TEAM = 46DTTB8X4S; DEVELOPMENT_TEAM = 46DTTB8X4S;
INFOPLIST_FILE = AutoCat/Info.plist; INFOPLIST_FILE = AutoCat/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 13.0; IPHONEOS_DEPLOYMENT_TARGET = 13.0;
@ -1351,51 +1340,26 @@
/* End XCRemoteSwiftPackageReference section */ /* End XCRemoteSwiftPackageReference section */
/* Begin XCSwiftPackageProductDependency section */ /* Begin XCSwiftPackageProductDependency section */
7A051610241412CA00FC55AC /* SwiftDate */ = {
isa = XCSwiftPackageProductDependency;
package = 7A05160F241412CA00FC55AC /* XCRemoteSwiftPackageReference "SwiftDate" */;
productName = SwiftDate;
};
7A11471C23FEA18700B424AF /* RxSwift */ = {
isa = XCSwiftPackageProductDependency;
package = 7A11471B23FEA18700B424AF /* XCRemoteSwiftPackageReference "RxSwift" */;
productName = RxSwift;
};
7A11471E23FEA18700B424AF /* RxRelay */ = {
isa = XCSwiftPackageProductDependency;
package = 7A11471B23FEA18700B424AF /* XCRemoteSwiftPackageReference "RxSwift" */;
productName = RxRelay;
};
7A11472023FEA18700B424AF /* RxCocoa */ = {
isa = XCSwiftPackageProductDependency;
package = 7A11471B23FEA18700B424AF /* XCRemoteSwiftPackageReference "RxSwift" */;
productName = RxCocoa;
};
7A11472223FEA18700B424AF /* RxBlocking */ = {
isa = XCSwiftPackageProductDependency;
package = 7A11471B23FEA18700B424AF /* XCRemoteSwiftPackageReference "RxSwift" */;
productName = RxBlocking;
};
7A11472523FEA1F400B424AF /* Realm */ = {
isa = XCSwiftPackageProductDependency;
package = 7A11472423FEA1F400B424AF /* XCRemoteSwiftPackageReference "realm-cocoa" */;
productName = Realm;
};
7A11472723FEA1F400B424AF /* RealmSwift */ = {
isa = XCSwiftPackageProductDependency;
package = 7A11472423FEA1F400B424AF /* XCRemoteSwiftPackageReference "realm-cocoa" */;
productName = RealmSwift;
};
7A530B8A240181F500CBFE6E /* RxRealm */ = {
isa = XCSwiftPackageProductDependency;
package = 7A530B89240181F500CBFE6E /* XCRemoteSwiftPackageReference "RxRealm" */;
productName = RxRealm;
};
7A813DC02508C4D900CC93B9 /* ExceptionCatcher */ = { 7A813DC02508C4D900CC93B9 /* ExceptionCatcher */ = {
isa = XCSwiftPackageProductDependency; isa = XCSwiftPackageProductDependency;
package = 7A813DBF2508C4D900CC93B9 /* XCRemoteSwiftPackageReference "ExceptionCatcher" */; package = 7A813DBF2508C4D900CC93B9 /* XCRemoteSwiftPackageReference "ExceptionCatcher" */;
productName = ExceptionCatcher; productName = ExceptionCatcher;
}; };
7AA54C1B26CD977A00F2BF28 /* RxCocoa */ = {
isa = XCSwiftPackageProductDependency;
package = 7A11471B23FEA18700B424AF /* XCRemoteSwiftPackageReference "RxSwift" */;
productName = RxCocoa;
};
7AA54C1D26CD977A00F2BF28 /* RxSwift */ = {
isa = XCSwiftPackageProductDependency;
package = 7A11471B23FEA18700B424AF /* XCRemoteSwiftPackageReference "RxSwift" */;
productName = RxSwift;
};
7AA54C1F26CD977A00F2BF28 /* RxRealm */ = {
isa = XCSwiftPackageProductDependency;
package = 7A530B89240181F500CBFE6E /* XCRemoteSwiftPackageReference "RxRealm" */;
productName = RxRealm;
};
7AABB1EF267E9CAA00D7AB32 /* DifferenceKit */ = { 7AABB1EF267E9CAA00D7AB32 /* DifferenceKit */ = {
isa = XCSwiftPackageProductDependency; isa = XCSwiftPackageProductDependency;
package = 7AABDE21253327F10041AFC6 /* XCRemoteSwiftPackageReference "DifferenceKit" */; package = 7AABDE21253327F10041AFC6 /* XCRemoteSwiftPackageReference "DifferenceKit" */;
@ -1411,11 +1375,6 @@
package = 7AABDE1B2532F3EB0041AFC6 /* XCRemoteSwiftPackageReference "PKHUD" */; package = 7AABDE1B2532F3EB0041AFC6 /* XCRemoteSwiftPackageReference "PKHUD" */;
productName = PKHUD; productName = PKHUD;
}; };
7AABDE22253327F10041AFC6 /* DifferenceKit */ = {
isa = XCSwiftPackageProductDependency;
package = 7AABDE21253327F10041AFC6 /* XCRemoteSwiftPackageReference "DifferenceKit" */;
productName = DifferenceKit;
};
7AEF47A3253DC4D2001D6238 /* Eureka */ = { 7AEF47A3253DC4D2001D6238 /* Eureka */ = {
isa = XCSwiftPackageProductDependency; isa = XCSwiftPackageProductDependency;
package = 7AEF47A2253DC4D2001D6238 /* XCRemoteSwiftPackageReference "Eureka" */; package = 7AEF47A2253DC4D2001D6238 /* XCRemoteSwiftPackageReference "Eureka" */;
@ -1426,16 +1385,6 @@
package = 7AF58D322402A91C00CE01A0 /* XCRemoteSwiftPackageReference "Kingfisher" */; package = 7AF58D322402A91C00CE01A0 /* XCRemoteSwiftPackageReference "Kingfisher" */;
productName = Kingfisher; productName = Kingfisher;
}; };
7AF6D20E2677C0EA0086EA64 /* RxCocoa */ = {
isa = XCSwiftPackageProductDependency;
package = 7A11471B23FEA18700B424AF /* XCRemoteSwiftPackageReference "RxSwift" */;
productName = RxCocoa;
};
7AF6D2102677C0EA0086EA64 /* RxSwift */ = {
isa = XCSwiftPackageProductDependency;
package = 7A11471B23FEA18700B424AF /* XCRemoteSwiftPackageReference "RxSwift" */;
productName = RxSwift;
};
7AF6D2222677C2B40086EA64 /* Realm */ = { 7AF6D2222677C2B40086EA64 /* Realm */ = {
isa = XCSwiftPackageProductDependency; isa = XCSwiftPackageProductDependency;
package = 7A11472423FEA1F400B424AF /* XCRemoteSwiftPackageReference "realm-cocoa" */; package = 7A11472423FEA1F400B424AF /* XCRemoteSwiftPackageReference "realm-cocoa" */;
@ -1446,11 +1395,6 @@
package = 7A11472423FEA1F400B424AF /* XCRemoteSwiftPackageReference "realm-cocoa" */; package = 7A11472423FEA1F400B424AF /* XCRemoteSwiftPackageReference "realm-cocoa" */;
productName = RealmSwift; productName = RealmSwift;
}; };
7AF6D2262677C2B40086EA64 /* RxRealm */ = {
isa = XCSwiftPackageProductDependency;
package = 7A530B89240181F500CBFE6E /* XCRemoteSwiftPackageReference "RxRealm" */;
productName = RxRealm;
};
/* End XCSwiftPackageProductDependency section */ /* End XCSwiftPackageProductDependency section */
}; };
rootObject = 7A1146F523FDE7E500B424AF /* Project object */; rootObject = 7A1146F523FDE7E500B424AF /* Project object */;

View File

@ -67,7 +67,7 @@
BreakpointExtensionID = "Xcode.Breakpoint.SwiftErrorBreakpoint"> BreakpointExtensionID = "Xcode.Breakpoint.SwiftErrorBreakpoint">
<BreakpointContent <BreakpointContent
uuid = "4F72AC4F-FBCE-4C10-8BC2-2F434652DB31" uuid = "4F72AC4F-FBCE-4C10-8BC2-2F434652DB31"
shouldBeEnabled = "Yes" shouldBeEnabled = "No"
ignoreCount = "0" ignoreCount = "0"
continueAfterRunningActions = "No"> continueAfterRunningActions = "No">
</BreakpointContent> </BreakpointContent>
@ -76,7 +76,7 @@
BreakpointExtensionID = "Xcode.Breakpoint.ExceptionBreakpoint"> BreakpointExtensionID = "Xcode.Breakpoint.ExceptionBreakpoint">
<BreakpointContent <BreakpointContent
uuid = "42580582-DA14-40D4-869A-FF91FCA9957C" uuid = "42580582-DA14-40D4-869A-FF91FCA9957C"
shouldBeEnabled = "Yes" shouldBeEnabled = "No"
ignoreCount = "0" ignoreCount = "0"
continueAfterRunningActions = "No" continueAfterRunningActions = "No"
breakpointStackSelectionBehavior = "1" breakpointStackSelectionBehavior = "1"
@ -84,5 +84,21 @@
stopOnStyle = "0"> stopOnStyle = "0">
</BreakpointContent> </BreakpointContent>
</BreakpointProxy> </BreakpointProxy>
<BreakpointProxy
BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
<BreakpointContent
uuid = "CA002588-A70B-4F96-BD13-7CC6C39BC2D5"
shouldBeEnabled = "Yes"
ignoreCount = "0"
continueAfterRunningActions = "No"
filePath = "../../../Library/Developer/Xcode/DerivedData/AutoCat-fhilwnlnsrpirleiajogdcyhyyey/SourcePackages/checkouts/RxSwift/RxCocoa/Foundation/URLSession+Rx.swift"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
startingLineNumber = "193"
endingLineNumber = "193"
landmarkName = "data(request:)"
landmarkType = "7">
</BreakpointContent>
</BreakpointProxy>
</Breakpoints> </Breakpoints>
</Bucket> </Bucket>

View File

@ -26,7 +26,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
let config = Realm.Configuration( let config = Realm.Configuration(
schemaVersion: 32, schemaVersion: 35,
migrationBlock: { migration, oldSchemaVersion in migrationBlock: { migration, oldSchemaVersion in
if oldSchemaVersion <= 3 { if oldSchemaVersion <= 3 {
var numbers: [String] = [] var numbers: [String] = []
@ -140,7 +140,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
HUD.dimsBackground = true HUD.dimsBackground = true
HUD.allowsInteraction = false HUD.allowsInteraction = false
Logging.URLRequests = { _ in false }; //Logging.URLRequests = { _ in false };
return true return true
} }

View File

@ -1,9 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="17701" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="pme-aR-UNJ"> <document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="18122" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="pme-aR-UNJ">
<device id="retina4_7" orientation="portrait" appearance="dark"/> <device id="retina4_7" orientation="portrait" appearance="dark"/>
<dependencies> <dependencies>
<deployment identifier="iOS"/> <deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="17703"/> <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="18093"/>
<capability name="Safe area layout guides" minToolsVersion="9.0"/> <capability name="Safe area layout guides" minToolsVersion="9.0"/>
<capability name="System colors in document resources" minToolsVersion="11.0"/> <capability name="System colors in document resources" minToolsVersion="11.0"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
@ -72,6 +72,79 @@
</objects> </objects>
<point key="canvasLocation" x="1094" y="2353"/> <point key="canvasLocation" x="1094" y="2353"/>
</scene> </scene>
<!--Notes Controller-->
<scene sceneID="MkZ-J0-OzU">
<objects>
<viewController storyboardIdentifier="NotesController" id="Z9b-nr-Xre" customClass="NotesController" customModule="AutoCat" customModuleProvider="target" sceneMemberID="viewController">
<view key="view" contentMode="scaleToFill" id="yXB-Zh-8mU">
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<tableView clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="default" rowHeight="-1" estimatedRowHeight="-1" sectionHeaderHeight="28" sectionFooterHeight="28" translatesAutoresizingMaskIntoConstraints="NO" id="P8L-hv-BMJ">
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
<color key="backgroundColor" systemColor="systemBackgroundColor"/>
<prototypes>
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" insetsLayoutMarginsFromSafeArea="NO" selectionStyle="none" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="VehicleNoteCell" id="J6y-ZM-MCf" customClass="VehicleNoteCell" customModule="AutoCat" customModuleProvider="target">
<rect key="frame" x="0.0" y="24.5" width="375" height="62"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="J6y-ZM-MCf" id="wBh-vB-ORX">
<rect key="frame" x="0.0" y="0.0" width="375" height="62"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" spacing="8" translatesAutoresizingMaskIntoConstraints="NO" id="wnx-I3-WKd">
<rect key="frame" x="16" y="11" width="343" height="40"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" ambiguous="YES" text="Some note about vehicle" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="P90-i3-hFg">
<rect key="frame" x="0.0" y="0.0" width="343" height="17"/>
<fontDescription key="fontDescription" style="UICTFontTextStyleBody"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" ambiguous="YES" text="date" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="6jy-cJ-rbF">
<rect key="frame" x="0.0" y="25" width="343" height="15"/>
<fontDescription key="fontDescription" style="UICTFontTextStyleFootnote"/>
<color key="textColor" systemColor="secondaryLabelColor"/>
<nil key="highlightedColor"/>
</label>
</subviews>
</stackView>
</subviews>
<constraints>
<constraint firstAttribute="trailingMargin" secondItem="wnx-I3-WKd" secondAttribute="trailing" id="6sm-CE-5i4"/>
<constraint firstItem="wnx-I3-WKd" firstAttribute="leading" secondItem="wBh-vB-ORX" secondAttribute="leadingMargin" id="GUA-uS-9Lc"/>
<constraint firstAttribute="bottomMargin" secondItem="wnx-I3-WKd" secondAttribute="bottom" id="Vc6-PA-ApE"/>
<constraint firstItem="wnx-I3-WKd" firstAttribute="top" secondItem="wBh-vB-ORX" secondAttribute="topMargin" id="yMv-Mu-URo"/>
</constraints>
</tableViewCellContentView>
<connections>
<outlet property="date" destination="6jy-cJ-rbF" id="3rT-KG-jbc"/>
<outlet property="noteText" destination="P90-i3-hFg" id="L7m-DE-JOe"/>
</connections>
</tableViewCell>
</prototypes>
<connections>
<outlet property="dataSource" destination="Z9b-nr-Xre" id="5uP-Qe-g06"/>
<outlet property="delegate" destination="Z9b-nr-Xre" id="c45-KP-Wem"/>
</connections>
</tableView>
</subviews>
<viewLayoutGuide key="safeArea" id="lTb-Q2-gfw"/>
<color key="backgroundColor" systemColor="systemBackgroundColor"/>
<constraints>
<constraint firstAttribute="bottom" secondItem="P8L-hv-BMJ" secondAttribute="bottom" id="Rmj-6p-gt5"/>
<constraint firstItem="P8L-hv-BMJ" firstAttribute="leading" secondItem="lTb-Q2-gfw" secondAttribute="leading" id="UYg-XA-NX0"/>
<constraint firstItem="P8L-hv-BMJ" firstAttribute="top" secondItem="lTb-Q2-gfw" secondAttribute="top" id="fgf-Du-DxG"/>
<constraint firstItem="P8L-hv-BMJ" firstAttribute="trailing" secondItem="lTb-Q2-gfw" secondAttribute="trailing" id="qh5-eJ-MUc"/>
</constraints>
</view>
<connections>
<outlet property="notesTable" destination="P8L-hv-BMJ" id="97A-qf-on9"/>
</connections>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="InU-Kk-GEn" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="1880.8" y="2352.7736131934034"/>
</scene>
<!--Osago Controller--> <!--Osago Controller-->
<scene sceneID="LgB-gR-z4l"> <scene sceneID="LgB-gR-z4l">
<objects> <objects>
@ -100,14 +173,14 @@
<color key="backgroundColor" systemColor="systemBackgroundColor"/> <color key="backgroundColor" systemColor="systemBackgroundColor"/>
<prototypes> <prototypes>
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" insetsLayoutMarginsFromSafeArea="NO" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="EventCell" id="QIb-Hv-tvk" customClass="EventCell" customModule="AutoCat" customModuleProvider="target"> <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" insetsLayoutMarginsFromSafeArea="NO" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="EventCell" id="QIb-Hv-tvk" customClass="EventCell" customModule="AutoCat" customModuleProvider="target">
<rect key="frame" x="0.0" y="28" width="375" height="127.5"/> <rect key="frame" x="0.0" y="24.5" width="375" height="130.5"/>
<autoresizingMask key="autoresizingMask"/> <autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="QIb-Hv-tvk" id="Ypt-ch-fGT"> <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="QIb-Hv-tvk" id="Ypt-ch-fGT">
<rect key="frame" x="0.0" y="0.0" width="375" height="127.5"/> <rect key="frame" x="0.0" y="0.0" width="375" height="130.5"/>
<autoresizingMask key="autoresizingMask"/> <autoresizingMask key="autoresizingMask"/>
<subviews> <subviews>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" spacing="8" translatesAutoresizingMaskIntoConstraints="NO" id="HP8-oO-yhP"> <stackView opaque="NO" contentMode="scaleToFill" axis="vertical" spacing="8" translatesAutoresizingMaskIntoConstraints="NO" id="HP8-oO-yhP">
<rect key="frame" x="8" y="8" width="359" height="111.5"/> <rect key="frame" x="8" y="8" width="359" height="114.5"/>
<subviews> <subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" ambiguous="YES" text="" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="xcQ-Wz-gJ0"> <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" ambiguous="YES" text="" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="xcQ-Wz-gJ0">
<rect key="frame" x="0.0" y="0.0" width="359" height="50"/> <rect key="frame" x="0.0" y="0.0" width="359" height="50"/>
@ -116,7 +189,7 @@
<nil key="highlightedColor"/> <nil key="highlightedColor"/>
</label> </label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" ambiguous="YES" text="" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="1tQ-zM-6T9"> <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" ambiguous="YES" text="" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="1tQ-zM-6T9">
<rect key="frame" x="0.0" y="58" width="359" height="53.5"/> <rect key="frame" x="0.0" y="58" width="359" height="56.5"/>
<fontDescription key="fontDescription" style="UICTFontTextStyleSubhead"/> <fontDescription key="fontDescription" style="UICTFontTextStyleSubhead"/>
<color key="textColor" systemColor="secondaryLabelColor"/> <color key="textColor" systemColor="secondaryLabelColor"/>
<nil key="highlightedColor"/> <nil key="highlightedColor"/>
@ -196,23 +269,23 @@
<color key="backgroundColor" systemColor="systemBackgroundColor"/> <color key="backgroundColor" systemColor="systemBackgroundColor"/>
<prototypes> <prototypes>
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" insetsLayoutMarginsFromSafeArea="NO" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="VehicleCell" id="VEP-QD-i6y" customClass="VehicleCell" customModule="AutoCat" customModuleProvider="target"> <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" insetsLayoutMarginsFromSafeArea="NO" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="VehicleCell" id="VEP-QD-i6y" customClass="VehicleCell" customModule="AutoCat" customModuleProvider="target">
<rect key="frame" x="0.0" y="28" width="375" height="85"/> <rect key="frame" x="0.0" y="24.5" width="375" height="81.5"/>
<autoresizingMask key="autoresizingMask"/> <autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="VEP-QD-i6y" id="8hH-8I-XLB"> <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="VEP-QD-i6y" id="8hH-8I-XLB">
<rect key="frame" x="0.0" y="0.0" width="375" height="85"/> <rect key="frame" x="0.0" y="0.0" width="375" height="81.5"/>
<autoresizingMask key="autoresizingMask"/> <autoresizingMask key="autoresizingMask"/>
<subviews> <subviews>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" spacing="8" translatesAutoresizingMaskIntoConstraints="NO" id="E0H-HY-s2L"> <stackView opaque="NO" contentMode="scaleToFill" axis="vertical" spacing="8" translatesAutoresizingMaskIntoConstraints="NO" id="E0H-HY-s2L">
<rect key="frame" x="8" y="8" width="359" height="69"/> <rect key="frame" x="8" y="8" width="359" height="65.5"/>
<subviews> <subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Kia Optima" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="AQY-7N-q8D"> <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Kia Optima" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="AQY-7N-q8D">
<rect key="frame" x="0.0" y="0.0" width="359" height="20.5"/> <rect key="frame" x="0.0" y="0.0" width="359" height="17"/>
<fontDescription key="fontDescription" style="UICTFontTextStyleHeadline"/> <fontDescription key="fontDescription" style="UICTFontTextStyleHeadline"/>
<nil key="textColor"/> <nil key="textColor"/>
<nil key="highlightedColor"/> <nil key="highlightedColor"/>
</label> </label>
<stackView opaque="NO" tag="8" contentMode="scaleToFill" alignment="bottom" translatesAutoresizingMaskIntoConstraints="NO" id="vMC-Bk-8rZ"> <stackView opaque="NO" tag="8" contentMode="scaleToFill" alignment="bottom" translatesAutoresizingMaskIntoConstraints="NO" id="vMC-Bk-8rZ">
<rect key="frame" x="0.0" y="28.5" width="359" height="40.5"/> <rect key="frame" x="0.0" y="25" width="359" height="40.5"/>
<subviews> <subviews>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="cvf-vM-QnT" customClass="PlateView" customModule="AutoCat" customModuleProvider="target"> <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="cvf-vM-QnT" customClass="PlateView" customModule="AutoCat" customModuleProvider="target">
<rect key="frame" x="0.0" y="0.5" width="303" height="40"/> <rect key="frame" x="0.0" y="0.5" width="303" height="40"/>
@ -222,16 +295,16 @@
</constraints> </constraints>
</view> </view>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" alignment="bottom" spacing="8" translatesAutoresizingMaskIntoConstraints="NO" id="quG-e3-h5v"> <stackView opaque="NO" contentMode="scaleToFill" axis="vertical" alignment="bottom" spacing="8" translatesAutoresizingMaskIntoConstraints="NO" id="quG-e3-h5v">
<rect key="frame" x="303" y="0.5" width="56" height="40"/> <rect key="frame" x="303" y="3.5" width="56" height="37"/>
<subviews> <subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" horizontalCompressionResistancePriority="751" text="1.01.2021" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="RPA-NR-0C6"> <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" horizontalCompressionResistancePriority="751" text="1.01.2021" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="RPA-NR-0C6">
<rect key="frame" x="0.0" y="0.0" width="56" height="16"/> <rect key="frame" x="3.5" y="0.0" width="52.5" height="14.5"/>
<fontDescription key="fontDescription" style="UICTFontTextStyleFootnote"/> <fontDescription key="fontDescription" style="UICTFontTextStyleFootnote"/>
<color key="textColor" systemColor="secondaryLabelColor"/> <color key="textColor" systemColor="secondaryLabelColor"/>
<nil key="highlightedColor"/> <nil key="highlightedColor"/>
</label> </label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="aOM-gr-Yem"> <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="aOM-gr-Yem">
<rect key="frame" x="23" y="24" width="33" height="16"/> <rect key="frame" x="25" y="22.5" width="31" height="14.5"/>
<fontDescription key="fontDescription" style="UICTFontTextStyleFootnote"/> <fontDescription key="fontDescription" style="UICTFontTextStyleFootnote"/>
<color key="textColor" systemColor="tertiaryLabelColor"/> <color key="textColor" systemColor="tertiaryLabelColor"/>
<nil key="highlightedColor"/> <nil key="highlightedColor"/>
@ -393,7 +466,7 @@
<color key="backgroundColor" systemColor="systemBackgroundColor"/> <color key="backgroundColor" systemColor="systemBackgroundColor"/>
<prototypes> <prototypes>
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" insetsLayoutMarginsFromSafeArea="NO" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="AudioRecordCell" id="mzE-bt-IiX" customClass="AudioRecordCell" customModule="AutoCat" customModuleProvider="target"> <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" insetsLayoutMarginsFromSafeArea="NO" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="AudioRecordCell" id="mzE-bt-IiX" customClass="AudioRecordCell" customModule="AutoCat" customModuleProvider="target">
<rect key="frame" x="0.0" y="28" width="375" height="50.5"/> <rect key="frame" x="0.0" y="24.5" width="375" height="50.5"/>
<autoresizingMask key="autoresizingMask"/> <autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="mzE-bt-IiX" id="bqu-eN-DJP"> <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="mzE-bt-IiX" id="bqu-eN-DJP">
<rect key="frame" x="0.0" y="0.0" width="375" height="50.5"/> <rect key="frame" x="0.0" y="0.0" width="375" height="50.5"/>
@ -487,10 +560,10 @@
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews> <subviews>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" spacing="16" translatesAutoresizingMaskIntoConstraints="NO" id="Peq-Zq-kNT"> <stackView opaque="NO" contentMode="scaleToFill" axis="vertical" spacing="16" translatesAutoresizingMaskIntoConstraints="NO" id="Peq-Zq-kNT">
<rect key="frame" x="62.5" y="68" width="250" height="114.5"/> <rect key="frame" x="62.5" y="68" width="250" height="110.5"/>
<subviews> <subviews>
<textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" placeholder="A001AA 777" textAlignment="center" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="8FU-Gy-4MU" customClass="SwiftMaskTextfield" customModule="AutoCat" customModuleProvider="target"> <textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" placeholder="A001AA 777" textAlignment="center" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="8FU-Gy-4MU" customClass="SwiftMaskTextfield" customModule="AutoCat" customModuleProvider="target">
<rect key="frame" x="0.0" y="0.0" width="250" height="50.5"/> <rect key="frame" x="0.0" y="0.0" width="250" height="46.5"/>
<fontDescription key="fontDescription" style="UICTFontTextStyleTitle0"/> <fontDescription key="fontDescription" style="UICTFontTextStyleTitle0"/>
<textInputTraits key="textInputTraits" returnKeyType="done"/> <textInputTraits key="textInputTraits" returnKeyType="done"/>
<connections> <connections>
@ -499,7 +572,7 @@
</connections> </connections>
</textField> </textField>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="Ync-fd-xQI" customClass="CustomButton" customModule="AutoCat" customModuleProvider="target"> <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="Ync-fd-xQI" customClass="CustomButton" customModule="AutoCat" customModuleProvider="target">
<rect key="frame" x="0.0" y="66.5" width="250" height="48"/> <rect key="frame" x="0.0" y="62.5" width="250" height="48"/>
<color key="backgroundColor" systemColor="systemBlueColor"/> <color key="backgroundColor" systemColor="systemBlueColor"/>
<constraints> <constraints>
<constraint firstAttribute="height" constant="48" id="YE0-lL-OwL"/> <constraint firstAttribute="height" constant="48" id="YE0-lL-OwL"/>
@ -518,27 +591,27 @@
</constraints> </constraints>
</stackView> </stackView>
<tableView clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" keyboardDismissMode="onDrag" dataMode="prototypes" style="plain" separatorStyle="default" rowHeight="-1" estimatedRowHeight="-1" sectionHeaderHeight="28" sectionFooterHeight="28" translatesAutoresizingMaskIntoConstraints="NO" id="JKr-UE-x8f"> <tableView clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" keyboardDismissMode="onDrag" dataMode="prototypes" style="plain" separatorStyle="default" rowHeight="-1" estimatedRowHeight="-1" sectionHeaderHeight="28" sectionFooterHeight="28" translatesAutoresizingMaskIntoConstraints="NO" id="JKr-UE-x8f">
<rect key="frame" x="0.0" y="206.5" width="375" height="411.5"/> <rect key="frame" x="0.0" y="202.5" width="375" height="415.5"/>
<color key="backgroundColor" systemColor="systemBackgroundColor"/> <color key="backgroundColor" systemColor="systemBackgroundColor"/>
<prototypes> <prototypes>
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" insetsLayoutMarginsFromSafeArea="NO" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="VehicleCell" id="3ON-lr-UlV" customClass="VehicleCell" customModule="AutoCat" customModuleProvider="target"> <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" insetsLayoutMarginsFromSafeArea="NO" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="VehicleCell" id="3ON-lr-UlV" customClass="VehicleCell" customModule="AutoCat" customModuleProvider="target">
<rect key="frame" x="0.0" y="28" width="375" height="85"/> <rect key="frame" x="0.0" y="24.5" width="375" height="81.5"/>
<autoresizingMask key="autoresizingMask"/> <autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="3ON-lr-UlV" id="IGw-UK-ebp"> <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="3ON-lr-UlV" id="IGw-UK-ebp">
<rect key="frame" x="0.0" y="0.0" width="375" height="85"/> <rect key="frame" x="0.0" y="0.0" width="375" height="81.5"/>
<autoresizingMask key="autoresizingMask"/> <autoresizingMask key="autoresizingMask"/>
<subviews> <subviews>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" spacing="8" translatesAutoresizingMaskIntoConstraints="NO" id="6IZ-gM-D28"> <stackView opaque="NO" contentMode="scaleToFill" axis="vertical" spacing="8" translatesAutoresizingMaskIntoConstraints="NO" id="6IZ-gM-D28">
<rect key="frame" x="8" y="8" width="359" height="69"/> <rect key="frame" x="8" y="8" width="359" height="65.5"/>
<subviews> <subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Kia Optima" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="h3N-1o-J20"> <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Kia Optima" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="h3N-1o-J20">
<rect key="frame" x="0.0" y="0.0" width="359" height="20.5"/> <rect key="frame" x="0.0" y="0.0" width="359" height="17"/>
<fontDescription key="fontDescription" style="UICTFontTextStyleHeadline"/> <fontDescription key="fontDescription" style="UICTFontTextStyleHeadline"/>
<nil key="textColor"/> <nil key="textColor"/>
<nil key="highlightedColor"/> <nil key="highlightedColor"/>
</label> </label>
<stackView opaque="NO" contentMode="scaleToFill" alignment="bottom" spacing="8" translatesAutoresizingMaskIntoConstraints="NO" id="nX1-KA-jqp"> <stackView opaque="NO" contentMode="scaleToFill" alignment="bottom" spacing="8" translatesAutoresizingMaskIntoConstraints="NO" id="nX1-KA-jqp">
<rect key="frame" x="0.0" y="28.5" width="359" height="40.5"/> <rect key="frame" x="0.0" y="25" width="359" height="40.5"/>
<subviews> <subviews>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="VHX-o0-3BP" customClass="PlateView" customModule="AutoCat" customModuleProvider="target"> <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="VHX-o0-3BP" customClass="PlateView" customModule="AutoCat" customModuleProvider="target">
<rect key="frame" x="0.0" y="0.5" width="295" height="40"/> <rect key="frame" x="0.0" y="0.5" width="295" height="40"/>
@ -548,16 +621,16 @@
</constraints> </constraints>
</view> </view>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" alignment="bottom" spacing="8" translatesAutoresizingMaskIntoConstraints="NO" id="ApN-fV-Qw4"> <stackView opaque="NO" contentMode="scaleToFill" axis="vertical" alignment="bottom" spacing="8" translatesAutoresizingMaskIntoConstraints="NO" id="ApN-fV-Qw4">
<rect key="frame" x="303" y="0.5" width="56" height="40"/> <rect key="frame" x="303" y="3.5" width="56" height="37"/>
<subviews> <subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" horizontalCompressionResistancePriority="751" text="1.01.2021" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="rKr-3e-WYb"> <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" horizontalCompressionResistancePriority="751" text="1.01.2021" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="rKr-3e-WYb">
<rect key="frame" x="0.0" y="0.0" width="56" height="16"/> <rect key="frame" x="3.5" y="0.0" width="52.5" height="14.5"/>
<fontDescription key="fontDescription" style="UICTFontTextStyleFootnote"/> <fontDescription key="fontDescription" style="UICTFontTextStyleFootnote"/>
<color key="textColor" systemColor="secondaryLabelColor"/> <color key="textColor" systemColor="secondaryLabelColor"/>
<nil key="highlightedColor"/> <nil key="highlightedColor"/>
</label> </label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="UOb-db-Sty"> <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="UOb-db-Sty">
<rect key="frame" x="23" y="24" width="33" height="16"/> <rect key="frame" x="25" y="22.5" width="31" height="14.5"/>
<fontDescription key="fontDescription" style="UICTFontTextStyleFootnote"/> <fontDescription key="fontDescription" style="UICTFontTextStyleFootnote"/>
<color key="textColor" systemColor="tertiaryLabelColor"/> <color key="textColor" systemColor="tertiaryLabelColor"/>
<nil key="highlightedColor"/> <nil key="highlightedColor"/>
@ -855,6 +928,7 @@
<tabBarItem key="tabBarItem" title="Check" image="check" landscapeImage="check-compact" id="QJd-35-4OB"/> <tabBarItem key="tabBarItem" title="Check" image="check" landscapeImage="check-compact" id="QJd-35-4OB"/>
<toolbarItems/> <toolbarItems/>
<navigationBar key="navigationBar" contentMode="scaleToFill" insetsLayoutMarginsFromSafeArea="NO" id="AAc-4d-GNh"> <navigationBar key="navigationBar" contentMode="scaleToFill" insetsLayoutMarginsFromSafeArea="NO" id="AAc-4d-GNh">
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
<autoresizingMask key="autoresizingMask"/> <autoresizingMask key="autoresizingMask"/>
</navigationBar> </navigationBar>
<nil name="viewControllers"/> <nil name="viewControllers"/>
@ -873,6 +947,7 @@
<tabBarItem key="tabBarItem" title="Search" image="search" landscapeImage="search-compact" id="gDG-z8-R0t"/> <tabBarItem key="tabBarItem" title="Search" image="search" landscapeImage="search-compact" id="gDG-z8-R0t"/>
<toolbarItems/> <toolbarItems/>
<navigationBar key="navigationBar" contentMode="scaleToFill" insetsLayoutMarginsFromSafeArea="NO" id="vdY-9n-hjX"> <navigationBar key="navigationBar" contentMode="scaleToFill" insetsLayoutMarginsFromSafeArea="NO" id="vdY-9n-hjX">
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
<autoresizingMask key="autoresizingMask"/> <autoresizingMask key="autoresizingMask"/>
</navigationBar> </navigationBar>
<nil name="viewControllers"/> <nil name="viewControllers"/>
@ -890,6 +965,7 @@
<navigationController storyboardIdentifier="ReportNavController" automaticallyAdjustsScrollViewInsets="NO" id="Km4-b6-SGW" sceneMemberID="viewController"> <navigationController storyboardIdentifier="ReportNavController" automaticallyAdjustsScrollViewInsets="NO" id="Km4-b6-SGW" sceneMemberID="viewController">
<toolbarItems/> <toolbarItems/>
<navigationBar key="navigationBar" contentMode="scaleToFill" insetsLayoutMarginsFromSafeArea="NO" id="JaO-tp-k6N"> <navigationBar key="navigationBar" contentMode="scaleToFill" insetsLayoutMarginsFromSafeArea="NO" id="JaO-tp-k6N">
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
<autoresizingMask key="autoresizingMask"/> <autoresizingMask key="autoresizingMask"/>
</navigationBar> </navigationBar>
<nil name="viewControllers"/> <nil name="viewControllers"/>
@ -908,6 +984,7 @@
<tabBarItem key="tabBarItem" title="Records" image="record" landscapeImage="record-compact" id="lxF-EY-z8V"/> <tabBarItem key="tabBarItem" title="Records" image="record" landscapeImage="record-compact" id="lxF-EY-z8V"/>
<toolbarItems/> <toolbarItems/>
<navigationBar key="navigationBar" contentMode="scaleToFill" insetsLayoutMarginsFromSafeArea="NO" id="8YG-pw-LE7"> <navigationBar key="navigationBar" contentMode="scaleToFill" insetsLayoutMarginsFromSafeArea="NO" id="8YG-pw-LE7">
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
<autoresizingMask key="autoresizingMask"/> <autoresizingMask key="autoresizingMask"/>
</navigationBar> </navigationBar>
<nil name="viewControllers"/> <nil name="viewControllers"/>
@ -925,6 +1002,7 @@
<navigationController storyboardIdentifier="GlobalEventsNavigation" automaticallyAdjustsScrollViewInsets="NO" id="HWa-Ea-ZKD" sceneMemberID="viewController"> <navigationController storyboardIdentifier="GlobalEventsNavigation" automaticallyAdjustsScrollViewInsets="NO" id="HWa-Ea-ZKD" sceneMemberID="viewController">
<toolbarItems/> <toolbarItems/>
<navigationBar key="navigationBar" contentMode="scaleToFill" insetsLayoutMarginsFromSafeArea="NO" id="REm-5j-xeL"> <navigationBar key="navigationBar" contentMode="scaleToFill" insetsLayoutMarginsFromSafeArea="NO" id="REm-5j-xeL">
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
<autoresizingMask key="autoresizingMask"/> <autoresizingMask key="autoresizingMask"/>
</navigationBar> </navigationBar>
<nil name="viewControllers"/> <nil name="viewControllers"/>

View File

@ -0,0 +1,21 @@
import UIKit
import AutoCatCore
class VehicleNoteCell: UITableViewCell {
@IBOutlet weak var noteText: UILabel!
@IBOutlet weak var date: UILabel!
private var dateFormatter = DateFormatter()
override func awakeFromNib() {
super.awakeFromNib()
self.dateFormatter.dateStyle = .medium
self.dateFormatter.timeStyle = .medium
}
func configure(with note: VehicleNote) {
self.noteText.text = note.text
self.date.text = self.dateFormatter.string(from: Date(timeIntervalSince1970: note.date))
}
}

View File

@ -10,7 +10,6 @@ import AutoCatCore
enum EventAction: Equatable { enum EventAction: Equatable {
case doNotSend case doNotSend
case receiveAndSend case receiveAndSend
case sendSpecific(VehicleEvent)
} }
enum HistoryFilter { enum HistoryFilter {
@ -24,7 +23,6 @@ extension String.StringInterpolation {
switch value { switch value {
case .doNotSend: appendLiteral("do not send"); break case .doNotSend: appendLiteral("do not send"); break
case .receiveAndSend: appendLiteral("receive and send"); break case .receiveAndSend: appendLiteral("receive and send"); break
case .sendSpecific(let event): appendLiteral("send specific (\(event.latitude), \(event.longitude)"); break
} }
} }
} }
@ -91,11 +89,13 @@ class CheckController: UIViewController, UITableViewDelegate, UITextFieldDelegat
case .checkNumber(let number, let event): case .checkNumber(let number, let event):
ad.quickAction = .none ad.quickAction = .none
var action: EventAction = .receiveAndSend var action: EventAction = .receiveAndSend
var events: [VehicleEvent] = []
if let event = event { if let event = event {
action = .sendSpecific(event) events = [event]
action = .doNotSend
} }
HUD.show(.progress) HUD.show(.progress)
self.check(number: number, action: action).subscribe { (vehicle, errors) in self.check(number: number, action: action, notes: [], events: events).subscribe { (vehicle, errors) in
if !vehicle.unrecognized { if !vehicle.unrecognized {
self.updateDetailController(with: vehicle) self.updateDetailController(with: vehicle)
} }
@ -214,7 +214,7 @@ class CheckController: UIViewController, UITableViewDelegate, UITextFieldDelegat
self.check.isEnabled = false self.check.isEnabled = false
HUD.show(.progress) HUD.show(.progress)
self.check(number: numberNormalized, action: .receiveAndSend).subscribe { (vehicle, errors) in self.check(number: numberNormalized, action: .receiveAndSend, notes: [], events: []).subscribe { (vehicle, errors) in
if !vehicle.unrecognized { if !vehicle.unrecognized {
self.updateDetailController(with: vehicle) self.updateDetailController(with: vehicle)
} }
@ -317,13 +317,7 @@ class CheckController: UIViewController, UITableViewDelegate, UITextFieldDelegat
func update(vehicle: Vehicle) { func update(vehicle: Vehicle) {
HUD.show(.progress) HUD.show(.progress)
self.check(number: vehicle.getNumber(), action: .doNotSend, notes: Array(vehicle.notes), events: Array(vehicle.events), force: true).subscribe { (vehicle, errors) in
var eventAction: EventAction = .doNotSend
if vehicle.unrecognized, let savedEvent = vehicle.events.first {
eventAction = .sendSpecific(savedEvent)
}
self.check(number: vehicle.getNumber(), action: eventAction, force: true).subscribe { (vehicle, errors) in
if !vehicle.unrecognized { if !vehicle.unrecognized {
self.updateDetailController(with: vehicle) self.updateDetailController(with: vehicle)
} }
@ -359,10 +353,6 @@ class CheckController: UIViewController, UITableViewDelegate, UITextFieldDelegat
} }
func getEvent(for action: EventAction) -> Single<VehicleEvent> { func getEvent(for action: EventAction) -> Single<VehicleEvent> {
if case .sendSpecific(let event) = action {
return Single.just(event)
}
if let event = RxLocationManager.lastEvent, (Date().timeIntervalSince1970 - event.date) < 100 { if let event = RxLocationManager.lastEvent, (Date().timeIntervalSince1970 - event.date) < 100 {
return Single<VehicleEvent>.just(event) return Single<VehicleEvent>.just(event)
} else { } else {
@ -370,7 +360,7 @@ class CheckController: UIViewController, UITableViewDelegate, UITextFieldDelegat
} }
} }
func check(number: String, action: EventAction, force: Bool = false) -> Single<(vehicle: Vehicle, errors: [Error])> { func check(number: String, action: EventAction, notes: [VehicleNote], events: [VehicleEvent], force: Bool = false) -> Single<(vehicle: Vehicle, errors: [Error])> {
var eventSingle: Single<(event: VehicleEvent?, error: Error?)> = .just((event: nil, error: nil)) var eventSingle: Single<(event: VehicleEvent?, error: Error?)> = .just((event: nil, error: nil))
if action != .doNotSend { if action != .doNotSend {
eventSingle = self.getEvent(for: action) eventSingle = self.getEvent(for: action)
@ -380,7 +370,7 @@ class CheckController: UIViewController, UITableViewDelegate, UITextFieldDelegat
.catchError { .just((event: nil, error: $0)) } .catchError { .just((event: nil, error: $0)) }
} }
let checkSingle = Api.checkVehicle(by: number, force: force) let checkSingle = Api.checkVehicle(by: number, notes: notes, events: events, force: force)
.observeOn(MainScheduler.instance) .observeOn(MainScheduler.instance)
.map { (vehicle: Vehicle) -> (vehicle: Vehicle, error: Error?) in .map { (vehicle: Vehicle) -> (vehicle: Vehicle, error: Error?) in
try self.save(vehicle: vehicle) try self.save(vehicle: vehicle)

View File

@ -198,19 +198,15 @@ class EventsController: UIViewController, UITableViewDataSource, UITableViewDele
} }
let event = vehicle.events[index] let event = vehicle.events[index]
if let eventId = event.id { HUD.show(.progress)
HUD.show(.progress) Api.remove(event: event.id).observeOn(MainScheduler.instance).subscribe(onSuccess: { vehicle in
Api.remove(event: eventId).observeOn(MainScheduler.instance).subscribe(onSuccess: { vehicle in let result = self.update(vehicle: vehicle)
let result = self.update(vehicle: vehicle) completion?(result)
completion?(result) }, onError: { error in
}, onError: { error in completion?(false)
completion?(false) HUD.show(error: error)
HUD.show(error: error) print(error)
print(error) }).disposed(by: self.bag)
}).disposed(by: self.bag)
} else {
self.showAlert(title: "Error", message: "Event ID is not found. Please try to update vehicle record, containing this event.")
}
} }
func editEvent(index: Int) { func editEvent(index: Int) {

View File

@ -0,0 +1,268 @@
import UIKit
import AutoCatCore
import MobileCoreServices
import PKHUD
import RxSwift
import ExceptionCatcher
import RealmSwift
class NotesController: UIViewController, UITableViewDataSource, UITableViewDelegate {
@IBOutlet weak var notesTable: UITableView!
private var textView = UITextView()
private var bag = DisposeBag()
var vehicle: Vehicle? {
didSet {
if self.isViewLoaded {
self.notesTable.reloadData()
}
}
}
override func viewDidLoad() {
super.viewDidLoad()
self.title = NSLocalizedString("Notes", comment: "")
self.navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(addNote(_:)))
self.notesTable.reloadData()
self.hideKeyboardWhenTappedAround()
}
@discardableResult
func update(vehicle: Vehicle) -> Bool {
do {
if let v = self.vehicle, let realm = v.realm, !v.isFrozen {
try ExceptionCatcher.catch {
try realm.write {
realm.add(vehicle, update: .all)
}
}
} else {
self.vehicle?.notes.removeAll()
self.vehicle?.notes.append(objectsIn: vehicle.notes)
}
self.notesTable.reloadData()
return true
} catch {
self.show(error: error)
return false
}
}
// MARK: - UITableViewDataSource
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.vehicle?.notes.count ?? 0
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
guard let cell = tableView.dequeueReusableCell(withIdentifier: "VehicleNoteCell", for: indexPath) as? VehicleNoteCell else {
return UITableViewCell()
}
if let note = self.vehicle?.notes[indexPath.row] {
cell.configure(with: note)
}
return cell
}
// MARK: - UITableViewDelegate
func tableView(_ tableView: UITableView, contextMenuConfigurationForRowAt indexPath: IndexPath, point: CGPoint) -> UIContextMenuConfiguration? {
return UIContextMenuConfiguration(identifier: nil, previewProvider: nil) { _ in
let copy = UIAction(title: NSLocalizedString("Copy", comment: ""), image: UIImage(systemName: "doc.on.doc")) { action in
self.copyNote(index: indexPath.row)
}
let edit = UIAction(title: NSLocalizedString("Edit", comment: ""), image: UIImage(systemName: "pencil")) { action in
self.editNote(index: indexPath.row)
}
let delete = UIAction(title: NSLocalizedString("Delete", comment: ""), image: UIImage(systemName: "trash"), attributes: .destructive) { action in
self.deleteNote(index: indexPath.row)
}
return UIMenu(title: NSLocalizedString("Actions", comment: ""), children: [copy, edit, delete])
}
}
func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? {
let copy = UIContextualAction(style: .normal, title: NSLocalizedString("Copy", comment: "")) { action, view, completion in
self.copyNote(index: indexPath.row)
completion(true)
}
copy.image = UIImage(systemName: "doc.on.doc")
copy.backgroundColor = .systemBlue
let delete = UIContextualAction(style: .destructive, title: NSLocalizedString("Delete", comment: "")) { action, view, completion in
self.deleteNote(index: indexPath.row, completion: completion)
}
delete.image = UIImage(systemName: "trash")
let edit = UIContextualAction(style: .normal, title: NSLocalizedString("Edit", comment: "")) { action, view, completion in
self.editNote(index: indexPath.row)
completion(true)
}
edit.image = UIImage(systemName: "pencil")
edit.backgroundColor = .systemBlue
let configuration = UISwipeActionsConfiguration(actions: [delete, edit, copy])
configuration.performsFirstActionWithFullSwipe = false
return configuration
}
// MARK: - Actions
@objc func addNote(_ sender: UIBarButtonItem) {
guard let vehicle = self.vehicle else {
HUD.flash(.labeledError(title: nil, subtitle: "Unknown vehicle"))
return
}
self.showAddNoteAlert(text: nil) { noteText in
let note = VehicleNote(text: noteText)
if vehicle.unrecognized {
if let realm = vehicle.realm {
try? realm.write {
vehicle.notes.append(note)
vehicle.updatedDate = Date().timeIntervalSince1970
}
self.notesTable.reloadData()
}
return
}
HUD.show(.progress)
Api.add(notes: [note], to: vehicle.getNumber())
.observeOn(MainScheduler.instance)
.subscribe(onSuccess: {
HUD.hide()
self.update(vehicle: $0)
}, onError: { error in
HUD.hide()
self.show(error: error)
})
.disposed(by: self.bag)
}
}
func copyNote(index: Int) {
guard let vehicle = self.vehicle else {
HUD.flash(.labeledError(title: nil, subtitle: "Unknown vehicle"))
return
}
UIPasteboard.general.setValue(vehicle.notes[index].text, forPasteboardType: kUTTypePlainText as String)
}
func editNote(index: Int) {
guard let vehicle = self.vehicle else {
HUD.flash(.labeledError(title: nil, subtitle: "Unknown vehicle"))
return
}
let note = vehicle.notes[index]
self.showAddNoteAlert(text: note.text) { noteText in
if vehicle.unrecognized {
if let realm = vehicle.realm {
try? realm.write {
note.text = noteText
vehicle.updatedDate = Date().timeIntervalSince1970
}
self.notesTable.reloadData()
}
return
}
HUD.show(.progress)
let newNote = note.clone()
newNote.text = noteText
Api.edit(note: newNote)
.observeOn(MainScheduler.instance)
.subscribe(onSuccess: {
HUD.hide()
self.update(vehicle: $0)
}, onError: { error in
HUD.hide()
self.show(error: error)
})
.disposed(by: self.bag)
}
}
func deleteNote(index: Int, completion: ((Bool) -> Void)? = nil) {
guard let vehicle = self.vehicle else {
HUD.flash(.labeledError(title: nil, subtitle: "Unknown vehicle"))
return
}
let note = vehicle.notes[index]
if vehicle.unrecognized {
if let realm = vehicle.realm {
try? realm.write {
vehicle.notes.remove(at: index)
vehicle.updatedDate = Date().timeIntervalSince1970
realm.delete(note)
}
self.notesTable.reloadData()
}
return
}
HUD.show(.progress)
Api.remove(note: note.id)
.observeOn(MainScheduler.instance)
.subscribe(onSuccess: { vehicle in
HUD.hide()
let result = self.update(vehicle: vehicle)
completion?(result)
}, onError: { error in
completion?(false)
HUD.hide()
self.show(error: error)
print(error)
}).disposed(by: self.bag)
}
// MARK: - Utils
func showAddNoteAlert(text: String?, completion: @escaping (String) -> Void) {
let alertController = UIAlertController(title: NSLocalizedString("New note", comment: ""), message: nil, preferredStyle: .alert)
let cancelAction = UIAlertAction.init(title: NSLocalizedString("Cancel", comment: ""), style: .default)
alertController.addAction(cancelAction)
let saveAction = UIAlertAction(title: NSLocalizedString("Done", comment: ""), style: .default) { (action) in
let enteredText = self.textView.text ?? ""
completion(enteredText)
}
alertController.addAction(saveAction)
self.textView = UITextView()
self.textView.text = text
self.textView.addDoneButton(title: NSLocalizedString("Done", comment: ""), target: self, selector: #selector(tapDone(sender:)))
self.textView.translatesAutoresizingMaskIntoConstraints = false
alertController.view.addSubview(self.textView)
NSLayoutConstraint.activate([
self.textView.topAnchor.constraint(equalTo: alertController.view.topAnchor, constant: 60),
self.textView.bottomAnchor.constraint(equalTo: alertController.view.bottomAnchor, constant: -60),
self.textView.leadingAnchor.constraint(equalTo: alertController.view.leadingAnchor, constant: 8),
self.textView.trailingAnchor.constraint(equalTo: alertController.view.trailingAnchor, constant: -8),
self.textView.heightAnchor.constraint(greaterThanOrEqualToConstant: 100)
])
self.present(alertController, animated: true) {
self.textView.becomeFirstResponder()
}
}
@objc func tapDone(sender: Any) {
self.textView.endEditing(true)
}
}

View File

@ -127,6 +127,17 @@ class ReportController: FormViewController, MediaBrowserViewControllerDataSource
self.navigationController?.pushViewController(controller, animated: true) self.navigationController?.pushViewController(controller, animated: true)
} }
<<< LabelRow("Notes") { row in
row.title = NSLocalizedString("Notes", comment: "")
}
.cellUpdate { cell, _ in cell.accessoryType = .disclosureIndicator }
.onCellSelection { _, row in
let sb = UIStoryboard(name: "Main", bundle: nil)
let controller = sb.instantiateViewController(identifier: "NotesController") as NotesController
controller.vehicle = self.vehicle
self.navigationController?.pushViewController(controller, animated: true)
}
if Settings.shared.showDebugInfo { if Settings.shared.showDebugInfo {
self.form +++ Section(NSLocalizedString("Debug info", comment: "noun")) self.form +++ Section(NSLocalizedString("Debug info", comment: "noun"))
<<< SourceStatusRow("DebugAutocod") { $0.title = NSLocalizedString("Autocod", comment: "") } <<< SourceStatusRow("DebugAutocod") { $0.title = NSLocalizedString("Autocod", comment: "") }
@ -178,6 +189,7 @@ class ReportController: FormViewController, MediaBrowserViewControllerDataSource
self.update(row: "Owners", with: String(self.vehicle?.ownershipPeriods.count ?? 0)) self.update(row: "Owners", with: String(self.vehicle?.ownershipPeriods.count ?? 0))
self.update(row: "Photos", with: String(self.vehicle?.photos.count ?? 0)) self.update(row: "Photos", with: String(self.vehicle?.photos.count ?? 0))
self.update(row: "Ads", with: String(self.vehicle?.ads.count ?? 0)) self.update(row: "Ads", with: String(self.vehicle?.ads.count ?? 0))
self.update(row: "Notes", with: String(self.vehicle?.notes.count ?? 0))
if let dInfo = self.vehicle?.debugInfo { if let dInfo = self.vehicle?.debugInfo {
self.update(sourceStatusRow: "DebugAutocod", with: dInfo.autocod) self.update(sourceStatusRow: "DebugAutocod", with: dInfo.autocod)

View File

@ -158,7 +158,7 @@ class SearchController: UIViewController, UISearchResultsUpdating, UITableViewDe
func update(vehicle: Vehicle, at indexPath: IndexPath) { func update(vehicle: Vehicle, at indexPath: IndexPath) {
HUD.show(.progress) HUD.show(.progress)
Api.checkVehicle(by: vehicle.getNumber(), force: true).observeOn(MainScheduler.instance).subscribe { newVehicle in Api.checkVehicle(by: vehicle.getNumber(), notes: Array(vehicle.notes), events: [], force: true).observeOn(MainScheduler.instance).subscribe { newVehicle in
HUD.hide() HUD.hide()
do { do {
let realm = try Realm() let realm = try Realm()

View File

@ -3,6 +3,11 @@ import PKHUD
import AutoCatCore import AutoCatCore
extension UIViewController { extension UIViewController {
func show(error: Error) {
self.show(error: error, animated: true, completion: nil)
}
func show(error: Error, animated: Bool = true, completion: (() -> Void)? = nil) { func show(error: Error, animated: Bool = true, completion: (() -> Void)? = nil) {
let msg = (error as NSError).displayMessage let msg = (error as NSError).displayMessage
let alert = UIAlertController(title: msg.title, message: msg.body, preferredStyle: .alert) let alert = UIAlertController(title: msg.title, message: msg.body, preferredStyle: .alert)

View File

@ -0,0 +1,16 @@
import UIKit
extension UITextView {
func addDoneButton(title: String, target: Any, selector: Selector) {
let toolBar = UIToolbar(frame: CGRect(x: 0.0,
y: 0.0,
width: UIScreen.main.bounds.size.width,
height: 44.0))
let flexible = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
let barButton = UIBarButtonItem(title: title, style: .plain, target: target, action: selector)
toolBar.setItems([flexible, barButton], animated: false)
self.inputAccessoryView = toolBar
}
}

View File

@ -16,9 +16,6 @@
/* No comment provided by engineer. */ /* No comment provided by engineer. */
"Added by" = "Добавлено"; "Added by" = "Добавлено";
/* sort by added time */
"added time" = "времени добавления";
/* No comment provided by engineer. */ /* No comment provided by engineer. */
"Added time" = "Время добавления"; "Added time" = "Время добавления";
@ -31,12 +28,6 @@
/* No comment provided by engineer. */ /* No comment provided by engineer. */
"Alternative order" = "Альтернативный порядок"; "Alternative order" = "Альтернативный порядок";
/* Added by */
"Anyone" = "Кем угодно";
/* Added by */
"Anyone but me" = "Кем угодно кроме меня";
/* No comment provided by engineer. */ /* No comment provided by engineer. */
"As link" = "В виде ссылки"; "As link" = "В виде ссылки";
@ -46,9 +37,6 @@
/* No comment provided by engineer. */ /* No comment provided by engineer. */
"As text and photos" = "В виде текста и фотографий"; "As text and photos" = "В виде текста и фотографий";
/* sort order */
"ascending" = "по возростанию";
/* No comment provided by engineer. */ /* No comment provided by engineer. */
"AutoCat Account" = "Аккаунт в АвтоКот"; "AutoCat Account" = "Аккаунт в АвтоКот";
@ -127,9 +115,6 @@
/* No comment provided by engineer. */ /* No comment provided by engineer. */
"Delete" = "Удалить"; "Delete" = "Удалить";
/* sort order */
"descending" = "по убыванию";
/* No comment provided by engineer. */ /* No comment provided by engineer. */
"Description" = "Описание"; "Description" = "Описание";
@ -181,9 +166,6 @@
/* No comment provided by engineer. */ /* No comment provided by engineer. */
"If enabled, app will try to recognize shortened plate numbers (without region) and add default region" = "Если опция включена, приложение попытается распознавать укороченные номера (без региона) и добавлять регион по умолчанию"; "If enabled, app will try to recognize shortened plate numbers (without region) and add default region" = "Если опция включена, приложение попытается распознавать укороченные номера (без региона) и добавлять регион по умолчанию";
/* Owner type */
"individual" = "Физ. лицо";
/* No comment provided by engineer. */ /* No comment provided by engineer. */
"Insurance organization name" = "Наименование страховой организации"; "Insurance organization name" = "Наименование страховой организации";
@ -196,9 +178,6 @@
/* No comment provided by engineer. */ /* No comment provided by engineer. */
"Left" = "Левый"; "Left" = "Левый";
/* Owner type */
"legal" = "Юр. лицо";
/* No comment provided by engineer. */ /* No comment provided by engineer. */
"Link" = "Ссылка"; "Link" = "Ссылка";
@ -211,9 +190,6 @@
/* No comment provided by engineer. */ /* No comment provided by engineer. */
"Main filters" = "Основные фильтры"; "Main filters" = "Основные фильтры";
/* Added by */
"Me" = "Мной";
/* No comment provided by engineer. */ /* No comment provided by engineer. */
"Mileage" = "Пробег"; "Mileage" = "Пробег";
@ -223,12 +199,18 @@
/* No comment provided by engineer. */ /* No comment provided by engineer. */
"More actions" = "Больше действий"; "More actions" = "Больше действий";
/* No comment provided by engineer. */
"New note" = "Новая заметка";
/* No comment provided by engineer. */ /* No comment provided by engineer. */
"No" = "Нет"; "No" = "Нет";
/* No comment provided by engineer. */ /* No comment provided by engineer. */
"Nomerogram" = "Номерограм"; "Nomerogram" = "Номерограм";
/* No comment provided by engineer. */
"Notes" = "Заметки";
/* No comment provided by engineer. */ /* No comment provided by engineer. */
"now" = "Настоящий момент"; "now" = "Настоящий момент";
@ -361,9 +343,6 @@
/* No comment provided by engineer. */ /* No comment provided by engineer. */
"To" = "По"; "To" = "По";
/* No comment provided by engineer. */
"Today" = "Сегодня";
/* No comment provided by engineer. */ /* No comment provided by engineer. */
"Unrecognized" = "Нераспознанные"; "Unrecognized" = "Нераспознанные";
@ -373,9 +352,6 @@
/* No comment provided by engineer. */ /* No comment provided by engineer. */
"Update time" = "Время обновления"; "Update time" = "Время обновления";
/* sort by updated time */
"updated time" = "времени обновления";
/* No comment provided by engineer. */ /* No comment provided by engineer. */
"Vehicle region" = "Регион регистрации ТС"; "Vehicle region" = "Регион регистрации ТС";
@ -409,9 +385,6 @@
/* No comment provided by engineer. */ /* No comment provided by engineer. */
"Yes" = "Да"; "Yes" = "Да";
/* No comment provided by engineer. */
"Yesterday" = "Вчера";
/* No comment provided by engineer. */ /* No comment provided by engineer. */
"You are currently signed in with email %@. It will help to gather more data about vehicles." = "Сейчас вы залогинены с почтой %@. Это поможет собирать больше данных для отчета"; "You are currently signed in with email %@. It will help to gather more data about vehicles." = "Сейчас вы залогинены с почтой %@. Это поможет собирать больше данных для отчета";

View File

@ -183,6 +183,7 @@ public class Vehicle: Object, Decodable, Identifiable, Differentiable, Cloneable
public var events = List<VehicleEvent>() public var events = List<VehicleEvent>()
public var osagoContracts = List<Osago>() public var osagoContracts = List<Osago>()
public var ads = List<VehicleAd>() public var ads = List<VehicleAd>()
public var notes = List<VehicleNote>()
@objc public dynamic var debugInfo: DebugInfo? @objc public dynamic var debugInfo: DebugInfo?
lazy var formatter: DateFormatter = { lazy var formatter: DateFormatter = {
@ -223,6 +224,7 @@ public class Vehicle: Object, Decodable, Identifiable, Differentiable, Cloneable
case events case events
case osagoContracts case osagoContracts
case ads case ads
case notes
case debugInfo case debugInfo
} }
@ -266,6 +268,10 @@ public class Vehicle: Object, Decodable, Identifiable, Differentiable, Cloneable
if let ads = try container.decodeIfPresent([VehicleAd].self, forKey: .ads) { if let ads = try container.decodeIfPresent([VehicleAd].self, forKey: .ads) {
self.ads.append(objectsIn: ads) self.ads.append(objectsIn: ads)
} }
if let notes = try container.decodeIfPresent([VehicleNote].self, forKey: .notes) {
self.notes.append(objectsIn: notes)
}
} }
required init() { required init() {
@ -342,6 +348,10 @@ public class Vehicle: Object, Decodable, Identifiable, Differentiable, Cloneable
let ads = List<VehicleAd>() let ads = List<VehicleAd>()
ads.append(objectsIn: copy.ads.map { $0.clone() }) ads.append(objectsIn: copy.ads.map { $0.clone() })
self.ads = ads self.ads = ads
let notes = List<VehicleNote>()
notes.append(objectsIn: copy.notes.map { $0.clone() })
self.notes = notes
} }
// MARK: - Exportable // MARK: - Exportable

View File

@ -4,7 +4,7 @@ import RxSwift
import CoreLocation import CoreLocation
public class VehicleEvent: Object, Codable, Cloneable { public class VehicleEvent: Object, Codable, Cloneable {
@objc public dynamic var id: String? @objc public dynamic var id: String = UUID().uuidString
@objc public dynamic var date: TimeInterval = Date().timeIntervalSince1970 @objc public dynamic var date: TimeInterval = Date().timeIntervalSince1970
@objc public dynamic var latitude: Double = 0 @objc public dynamic var latitude: Double = 0
@objc public dynamic var longitude: Double = 0 @objc public dynamic var longitude: Double = 0
@ -44,6 +44,10 @@ public class VehicleEvent: Object, Codable, Cloneable {
} }
} }
public override static func primaryKey() -> String? {
return "id"
}
public override static func ignoredProperties() -> [String] { public override static func ignoredProperties() -> [String] {
return ["plateNumber"] return ["plateNumber"]
} }

View File

@ -0,0 +1,31 @@
import Foundation
import RealmSwift
public class VehicleNote: Object, Codable, Cloneable {
@objc public dynamic var id: String = UUID().uuidString
@objc public dynamic var user: String = ""
@objc public dynamic var date: TimeInterval = Date().timeIntervalSince1970
@objc public dynamic var text: String = ""
// MARK: - Cloneable
public required init(copy: VehicleNote) {
self.id = copy.id
self.user = copy.user
self.date = copy.date
self.text = copy.text
}
required init() {
super.init()
}
public init(text: String) {
self.text = text
self.user = Settings.shared.user.email
}
public override static func primaryKey() -> String? {
return "id"
}
}

View File

@ -209,15 +209,25 @@ public class Api {
return self.makeGetRequest(api: "vehicles", params: params) return self.makeGetRequest(api: "vehicles", params: params)
} }
public static func checkVehicle(by number: String, force: Bool = false) -> Single<Vehicle> { public static func checkVehicle(by number: String, notes: [VehicleNote], events: [VehicleEvent], force: Bool = false) -> Single<Vehicle> {
return self.refreshFbToken().flatMap { () -> Single<Vehicle> in return self.refreshFbToken().flatMap { () -> Single<Vehicle> in
var body = [ var body = [
"number": number, "number": AnyEncodable(number),
"forceUpdate": String(force) "forceUpdate": AnyEncodable(force)
] ]
if let token = Settings.shared.user.firebaseIdToken { if let token = Settings.shared.user.firebaseIdToken {
body["googleIdToken"] = token body["googleIdToken"] = AnyEncodable(token)
} }
if !notes.isEmpty {
body["notes"] = AnyEncodable(notes)
}
if !events.isEmpty {
body["events"] = AnyEncodable(events)
}
return self.makeBodyRequest(api: "vehicles/check", body: body).map { (vehicle: Vehicle) -> Vehicle in return self.makeBodyRequest(api: "vehicles/check", body: body).map { (vehicle: Vehicle) -> Vehicle in
vehicle.addedDate = Date().timeIntervalSince1970 vehicle.addedDate = Date().timeIntervalSince1970
return vehicle return vehicle
@ -280,4 +290,17 @@ public class Api {
] ]
return self.makeBodyRequest(api: "vehicles/checkOsago", body: body) return self.makeBodyRequest(api: "vehicles/checkOsago", body: body)
} }
public static func add(notes: [VehicleNote], to number: String) -> Single<Vehicle> {
let body = ["number": AnyEncodable(number), "notes": AnyEncodable(notes)]
return self.makeBodyRequest(api: "notes", body: body)
}
public static func edit(note: VehicleNote) -> Single<Vehicle> {
return self.makeBodyRequest(api: "notes", body: ["note": note], method: "PUT")
}
public static func remove(note id: String) -> Single<Vehicle> {
return self.makeBodyRequest(api: "notes", body: ["noteId": id], method: "DELETE")
}
} }