├── .gitattributes ├── .github └── workflows │ └── netcoresync_moor_build.yml ├── .gitignore ├── .vscode ├── launch.json ├── settings.json └── tasks.json ├── LICENSE ├── NETCoreSync.sln.disabled ├── NETCoreSync ├── NETCoreSync.csproj ├── README.md ├── SyncClient.cs ├── SyncConfiguration.cs ├── SyncEngine.cs ├── SyncEngineClasses.cs ├── SyncEngineHelpers.cs ├── SyncEngineInterfaces.cs ├── SyncExceptions.cs ├── SyncFriendlyIdAttribute.cs ├── SyncLog.cs ├── SyncPropertyAttribute.cs ├── SyncResult.cs ├── SyncSchemaAttribute.cs ├── SyncServer.cs └── docs │ ├── database-timestamp-how-it-works.md │ ├── database-timestamp-implementation-instruction.md │ ├── global-timestamp-how-it-works.md │ └── global-timestamp-implementation-instruction.md ├── NETCoreSyncServer.sln ├── NETCoreSyncServer ├── CHANGELOG.md ├── Extensions.cs ├── LICENSE ├── NETCoreSyncServer.csproj ├── NETCoreSyncServerOptions.cs ├── README.md ├── SyncEngine.cs ├── SyncEvent.cs ├── SyncExceptions.cs ├── SyncMessages.cs ├── SyncMiddleware.cs ├── SyncPropertyAttribute.cs ├── SyncService.cs └── SyncTableAttribute.cs ├── README.md ├── Samples ├── DatabaseTimeStamp │ ├── MobileSample.Android │ │ ├── Assets │ │ │ └── AboutAssets.txt │ │ ├── FodyWeavers.xml │ │ ├── MainActivity.cs │ │ ├── MobileSample.Android.csproj │ │ ├── Properties │ │ │ ├── AndroidManifest.xml │ │ │ └── AssemblyInfo.cs │ │ └── Resources │ │ │ ├── AboutResources.txt │ │ │ ├── Resource.designer.cs │ │ │ ├── drawable │ │ │ └── xamarin_logo.png │ │ │ ├── layout │ │ │ ├── Tabbar.axml │ │ │ └── Toolbar.axml │ │ │ ├── mipmap-anydpi-v26 │ │ │ ├── icon.xml │ │ │ └── icon_round.xml │ │ │ ├── mipmap-hdpi │ │ │ ├── icon.png │ │ │ └── launcher_foreground.png │ │ │ ├── mipmap-mdpi │ │ │ ├── icon.png │ │ │ └── launcher_foreground.png │ │ │ ├── mipmap-xhdpi │ │ │ ├── icon.png │ │ │ └── launcher_foreground.png │ │ │ ├── mipmap-xxhdpi │ │ │ ├── icon.png │ │ │ └── launcher_foreground.png │ │ │ ├── mipmap-xxxhdpi │ │ │ ├── icon.png │ │ │ └── launcher_foreground.png │ │ │ └── values │ │ │ ├── colors.xml │ │ │ └── styles.xml │ ├── MobileSample.iOS │ │ ├── AppDelegate.cs │ │ ├── Assets.xcassets │ │ │ └── AppIcon.appiconset │ │ │ │ ├── Contents.json │ │ │ │ ├── Icon1024.png │ │ │ │ ├── Icon120.png │ │ │ │ ├── Icon152.png │ │ │ │ ├── Icon167.png │ │ │ │ ├── Icon180.png │ │ │ │ ├── Icon20.png │ │ │ │ ├── Icon29.png │ │ │ │ ├── Icon40.png │ │ │ │ ├── Icon58.png │ │ │ │ ├── Icon60.png │ │ │ │ ├── Icon76.png │ │ │ │ ├── Icon80.png │ │ │ │ └── Icon87.png │ │ ├── Entitlements.plist │ │ ├── FodyWeavers.xml │ │ ├── Info.plist │ │ ├── Main.cs │ │ ├── MobileSample.iOS.csproj │ │ ├── Properties │ │ │ └── AssemblyInfo.cs │ │ └── Resources │ │ │ ├── Default-568h@2x.png │ │ │ ├── Default-Portrait.png │ │ │ ├── Default-Portrait@2x.png │ │ │ ├── Default.png │ │ │ ├── Default@2x.png │ │ │ ├── LaunchScreen.storyboard │ │ │ ├── tab_about.png │ │ │ ├── tab_about@2x.png │ │ │ ├── tab_about@3x.png │ │ │ ├── tab_feed.png │ │ │ ├── tab_feed@2x.png │ │ │ ├── tab_feed@3x.png │ │ │ ├── xamarin_logo.png │ │ │ ├── xamarin_logo@2x.png │ │ │ └── xamarin_logo@3x.png │ ├── MobileSample │ │ ├── App.xaml │ │ ├── App.xaml.cs │ │ ├── FodyWeavers.xml │ │ ├── MobileSample.csproj │ │ ├── Models │ │ │ ├── Configuration.cs │ │ │ ├── CustomSyncEngine.cs │ │ │ ├── Department.cs │ │ │ ├── Employee.cs │ │ │ ├── Knowledge.cs │ │ │ ├── MainMenuItem.cs │ │ │ ├── ReferenceItem.cs │ │ │ └── TimeStamp.cs │ │ ├── Services │ │ │ └── DatabaseService.cs │ │ ├── ViewModels │ │ │ ├── AboutViewModel.cs │ │ │ ├── BaseViewModel.cs │ │ │ ├── DepartmentItemViewModel.cs │ │ │ ├── DepartmentListViewModel.cs │ │ │ ├── EmployeeItemViewModel.cs │ │ │ ├── EmployeeListViewModel.cs │ │ │ ├── SetupViewModel.cs │ │ │ └── SyncViewModel.cs │ │ └── Views │ │ │ ├── AboutPage.xaml │ │ │ ├── AboutPage.xaml.cs │ │ │ ├── BaseContentPage.cs │ │ │ ├── DepartmentItemPage.xaml │ │ │ ├── DepartmentItemPage.xaml.cs │ │ │ ├── DepartmentListPage.xaml │ │ │ ├── DepartmentListPage.xaml.cs │ │ │ ├── EmployeeItemPage.xaml │ │ │ ├── EmployeeItemPage.xaml.cs │ │ │ ├── EmployeeListPage.xaml │ │ │ ├── EmployeeListPage.xaml.cs │ │ │ ├── MainPage.xaml │ │ │ ├── MainPage.xaml.cs │ │ │ ├── MenuPage.xaml │ │ │ ├── MenuPage.xaml.cs │ │ │ ├── SetupPage.xaml │ │ │ ├── SetupPage.xaml.cs │ │ │ ├── SyncPage.xaml │ │ │ └── SyncPage.xaml.cs │ └── WebSample │ │ ├── .gitignore │ │ ├── Controllers │ │ ├── HomeController.cs │ │ ├── SetupController.cs │ │ ├── SyncController.cs │ │ ├── SyncDepartmentController.cs │ │ └── SyncEmployeeController.cs │ │ ├── Models │ │ ├── CustomSyncEngine.cs │ │ ├── DatabaseContext.cs │ │ ├── ErrorViewModel.cs │ │ ├── Knowledge.cs │ │ ├── SyncDepartment.cs │ │ └── SyncEmployee.cs │ │ ├── Program.cs │ │ ├── Properties │ │ └── launchSettings.json │ │ ├── Startup.cs │ │ ├── Views │ │ ├── Home │ │ │ └── Index.cshtml │ │ ├── Setup │ │ │ └── Index.cshtml │ │ ├── Shared │ │ │ ├── Error.cshtml │ │ │ ├── _CookieConsentPartial.cshtml │ │ │ ├── _Layout.cshtml │ │ │ └── _ValidationScriptsPartial.cshtml │ │ ├── SyncDepartment │ │ │ ├── Create.cshtml │ │ │ ├── Delete.cshtml │ │ │ ├── Details.cshtml │ │ │ ├── Edit.cshtml │ │ │ └── Index.cshtml │ │ ├── SyncEmployee │ │ │ ├── Create.cshtml │ │ │ ├── Delete.cshtml │ │ │ ├── Details.cshtml │ │ │ ├── Edit.cshtml │ │ │ └── Index.cshtml │ │ ├── _ViewImports.cshtml │ │ └── _ViewStart.cshtml │ │ ├── WebSample.csproj │ │ ├── appsettings.Development.json │ │ ├── appsettings.json │ │ └── wwwroot │ │ ├── css │ │ ├── site.css │ │ └── site.min.css │ │ ├── favicon.ico │ │ ├── images │ │ ├── banner1.svg │ │ ├── banner2.svg │ │ └── banner3.svg │ │ ├── js │ │ ├── site.js │ │ └── site.min.js │ │ └── lib │ │ ├── bootstrap │ │ ├── .bower.json │ │ ├── LICENSE │ │ └── dist │ │ │ ├── css │ │ │ ├── bootstrap-theme.css │ │ │ ├── bootstrap-theme.css.map │ │ │ ├── bootstrap-theme.min.css │ │ │ ├── bootstrap-theme.min.css.map │ │ │ ├── bootstrap.css │ │ │ ├── bootstrap.css.map │ │ │ ├── bootstrap.min.css │ │ │ └── bootstrap.min.css.map │ │ │ ├── fonts │ │ │ ├── glyphicons-halflings-regular.eot │ │ │ ├── glyphicons-halflings-regular.svg │ │ │ ├── glyphicons-halflings-regular.ttf │ │ │ ├── glyphicons-halflings-regular.woff │ │ │ └── glyphicons-halflings-regular.woff2 │ │ │ └── js │ │ │ ├── bootstrap.js │ │ │ ├── bootstrap.min.js │ │ │ └── npm.js │ │ ├── jquery-validation-unobtrusive │ │ ├── .bower.json │ │ ├── LICENSE.txt │ │ ├── jquery.validate.unobtrusive.js │ │ └── jquery.validate.unobtrusive.min.js │ │ ├── jquery-validation │ │ ├── .bower.json │ │ ├── LICENSE.md │ │ └── dist │ │ │ ├── additional-methods.js │ │ │ ├── additional-methods.min.js │ │ │ ├── jquery.validate.js │ │ │ └── jquery.validate.min.js │ │ └── jquery │ │ ├── .bower.json │ │ ├── LICENSE.txt │ │ └── dist │ │ ├── jquery.js │ │ ├── jquery.min.js │ │ └── jquery.min.map ├── GlobalTimeStamp │ ├── MobileSample.Android │ │ ├── Assets │ │ │ └── AboutAssets.txt │ │ ├── MainActivity.cs │ │ ├── MobileSample.Android.csproj │ │ ├── Properties │ │ │ ├── AndroidManifest.xml │ │ │ └── AssemblyInfo.cs │ │ └── Resources │ │ │ ├── AboutResources.txt │ │ │ ├── Resource.designer.cs │ │ │ ├── drawable │ │ │ └── xamarin_logo.png │ │ │ ├── layout │ │ │ ├── Tabbar.axml │ │ │ └── Toolbar.axml │ │ │ ├── mipmap-anydpi-v26 │ │ │ ├── icon.xml │ │ │ └── icon_round.xml │ │ │ ├── mipmap-hdpi │ │ │ ├── icon.png │ │ │ └── launcher_foreground.png │ │ │ ├── mipmap-mdpi │ │ │ ├── icon.png │ │ │ └── launcher_foreground.png │ │ │ ├── mipmap-xhdpi │ │ │ ├── icon.png │ │ │ └── launcher_foreground.png │ │ │ ├── mipmap-xxhdpi │ │ │ ├── icon.png │ │ │ └── launcher_foreground.png │ │ │ ├── mipmap-xxxhdpi │ │ │ ├── icon.png │ │ │ └── launcher_foreground.png │ │ │ └── values │ │ │ ├── colors.xml │ │ │ └── styles.xml │ ├── MobileSample.iOS │ │ ├── AppDelegate.cs │ │ ├── Assets.xcassets │ │ │ └── AppIcon.appiconset │ │ │ │ ├── Contents.json │ │ │ │ ├── Icon1024.png │ │ │ │ ├── Icon120.png │ │ │ │ ├── Icon152.png │ │ │ │ ├── Icon167.png │ │ │ │ ├── Icon180.png │ │ │ │ ├── Icon20.png │ │ │ │ ├── Icon29.png │ │ │ │ ├── Icon40.png │ │ │ │ ├── Icon58.png │ │ │ │ ├── Icon60.png │ │ │ │ ├── Icon76.png │ │ │ │ ├── Icon80.png │ │ │ │ └── Icon87.png │ │ ├── Entitlements.plist │ │ ├── Info.plist │ │ ├── Main.cs │ │ ├── MobileSample.iOS.csproj │ │ ├── Properties │ │ │ └── AssemblyInfo.cs │ │ └── Resources │ │ │ ├── Default-568h@2x.png │ │ │ ├── Default-Portrait.png │ │ │ ├── Default-Portrait@2x.png │ │ │ ├── Default.png │ │ │ ├── Default@2x.png │ │ │ ├── LaunchScreen.storyboard │ │ │ ├── tab_about.png │ │ │ ├── tab_about@2x.png │ │ │ ├── tab_about@3x.png │ │ │ ├── tab_feed.png │ │ │ ├── tab_feed@2x.png │ │ │ ├── tab_feed@3x.png │ │ │ ├── xamarin_logo.png │ │ │ ├── xamarin_logo@2x.png │ │ │ └── xamarin_logo@3x.png │ ├── MobileSample │ │ ├── App.xaml │ │ ├── App.xaml.cs │ │ ├── MobileSample.csproj │ │ ├── Models │ │ │ ├── Configuration.cs │ │ │ ├── CustomSyncEngine.cs │ │ │ ├── DatabaseContext.cs │ │ │ ├── Department.cs │ │ │ ├── Employee.cs │ │ │ └── MainMenuItem.cs │ │ ├── Services │ │ │ └── DatabaseService.cs │ │ ├── ViewModels │ │ │ ├── AboutViewModel.cs │ │ │ ├── BaseViewModel.cs │ │ │ ├── DepartmentItemViewModel.cs │ │ │ ├── DepartmentListViewModel.cs │ │ │ ├── EmployeeItemViewModel.cs │ │ │ ├── EmployeeListViewModel.cs │ │ │ ├── SetupViewModel.cs │ │ │ └── SyncViewModel.cs │ │ └── Views │ │ │ ├── AboutPage.xaml │ │ │ ├── AboutPage.xaml.cs │ │ │ ├── BaseContentPage.cs │ │ │ ├── DepartmentItemPage.xaml │ │ │ ├── DepartmentItemPage.xaml.cs │ │ │ ├── DepartmentListPage.xaml │ │ │ ├── DepartmentListPage.xaml.cs │ │ │ ├── EmployeeItemPage.xaml │ │ │ ├── EmployeeItemPage.xaml.cs │ │ │ ├── EmployeeListPage.xaml │ │ │ ├── EmployeeListPage.xaml.cs │ │ │ ├── MainPage.xaml │ │ │ ├── MainPage.xaml.cs │ │ │ ├── MenuPage.xaml │ │ │ ├── MenuPage.xaml.cs │ │ │ ├── SetupPage.xaml │ │ │ ├── SetupPage.xaml.cs │ │ │ ├── SyncPage.xaml │ │ │ └── SyncPage.xaml.cs │ └── WebSample │ │ ├── .gitignore │ │ ├── Controllers │ │ ├── HomeController.cs │ │ ├── SetupController.cs │ │ ├── SyncController.cs │ │ ├── SyncDepartmentController.cs │ │ └── SyncEmployeeController.cs │ │ ├── Models │ │ ├── CustomSyncEngine.cs │ │ ├── DatabaseContext.cs │ │ ├── ErrorViewModel.cs │ │ ├── SyncDepartment.cs │ │ └── SyncEmployee.cs │ │ ├── Program.cs │ │ ├── Properties │ │ └── launchSettings.json │ │ ├── Startup.cs │ │ ├── Views │ │ ├── Home │ │ │ └── Index.cshtml │ │ ├── Setup │ │ │ └── Index.cshtml │ │ ├── Shared │ │ │ ├── Error.cshtml │ │ │ ├── _CookieConsentPartial.cshtml │ │ │ ├── _Layout.cshtml │ │ │ └── _ValidationScriptsPartial.cshtml │ │ ├── SyncDepartment │ │ │ ├── Create.cshtml │ │ │ ├── Delete.cshtml │ │ │ ├── Details.cshtml │ │ │ ├── Edit.cshtml │ │ │ └── Index.cshtml │ │ ├── SyncEmployee │ │ │ ├── Create.cshtml │ │ │ ├── Delete.cshtml │ │ │ ├── Details.cshtml │ │ │ ├── Edit.cshtml │ │ │ └── Index.cshtml │ │ ├── _ViewImports.cshtml │ │ └── _ViewStart.cshtml │ │ ├── WebSample.csproj │ │ ├── appsettings.Development.json │ │ ├── appsettings.json │ │ └── wwwroot │ │ ├── css │ │ ├── site.css │ │ └── site.min.css │ │ ├── favicon.ico │ │ ├── images │ │ ├── banner1.svg │ │ ├── banner2.svg │ │ └── banner3.svg │ │ ├── js │ │ ├── site.js │ │ └── site.min.js │ │ └── lib │ │ ├── bootstrap │ │ ├── .bower.json │ │ ├── LICENSE │ │ └── dist │ │ │ ├── css │ │ │ ├── bootstrap-theme.css │ │ │ ├── bootstrap-theme.css.map │ │ │ ├── bootstrap-theme.min.css │ │ │ ├── bootstrap-theme.min.css.map │ │ │ ├── bootstrap.css │ │ │ ├── bootstrap.css.map │ │ │ ├── bootstrap.min.css │ │ │ └── bootstrap.min.css.map │ │ │ ├── fonts │ │ │ ├── glyphicons-halflings-regular.eot │ │ │ ├── glyphicons-halflings-regular.svg │ │ │ ├── glyphicons-halflings-regular.ttf │ │ │ ├── glyphicons-halflings-regular.woff │ │ │ └── glyphicons-halflings-regular.woff2 │ │ │ └── js │ │ │ ├── bootstrap.js │ │ │ ├── bootstrap.min.js │ │ │ └── npm.js │ │ ├── jquery-validation-unobtrusive │ │ ├── .bower.json │ │ ├── LICENSE.txt │ │ ├── jquery.validate.unobtrusive.js │ │ └── jquery.validate.unobtrusive.min.js │ │ ├── jquery-validation │ │ ├── .bower.json │ │ ├── LICENSE.md │ │ └── dist │ │ │ ├── additional-methods.js │ │ │ ├── additional-methods.min.js │ │ │ ├── jquery.validate.js │ │ │ └── jquery.validate.min.js │ │ └── jquery │ │ ├── .bower.json │ │ ├── LICENSE.txt │ │ └── dist │ │ ├── jquery.js │ │ ├── jquery.min.js │ │ └── jquery.min.map └── ServerTimeStamp │ ├── WebSample │ ├── Controllers │ │ ├── AreaController.cs │ │ ├── CustomObjectController.cs │ │ ├── HomeController.cs │ │ └── PersonController.cs │ ├── Models │ │ ├── CustomSyncEngine.cs │ │ ├── DatabaseContext.cs │ │ ├── ErrorViewModel.cs │ │ ├── SyncArea.cs │ │ ├── SyncCustomObject.cs │ │ └── SyncPerson.cs │ ├── Program.cs │ ├── Properties │ │ └── launchSettings.json │ ├── README.md │ ├── Startup.cs │ ├── Views │ │ ├── Area │ │ │ └── Index.cshtml │ │ ├── CustomObject │ │ │ └── Index.cshtml │ │ ├── Home │ │ │ └── Index.cshtml │ │ ├── Person │ │ │ └── Index.cshtml │ │ ├── Shared │ │ │ ├── Error.cshtml │ │ │ ├── _Layout.cshtml │ │ │ └── _ValidationScriptsPartial.cshtml │ │ ├── _ViewImports.cshtml │ │ └── _ViewStart.cshtml │ ├── WebSample.csproj │ ├── appsettings.Development.json │ ├── appsettings.json │ └── wwwroot │ │ ├── css │ │ └── site.css │ │ ├── favicon.ico │ │ ├── js │ │ └── site.js │ │ └── lib │ │ ├── bootstrap │ │ ├── LICENSE │ │ └── dist │ │ │ ├── css │ │ │ ├── bootstrap-grid.css │ │ │ ├── bootstrap-grid.css.map │ │ │ ├── bootstrap-grid.min.css │ │ │ ├── bootstrap-grid.min.css.map │ │ │ ├── bootstrap-reboot.css │ │ │ ├── bootstrap-reboot.css.map │ │ │ ├── bootstrap-reboot.min.css │ │ │ ├── bootstrap-reboot.min.css.map │ │ │ ├── bootstrap.css │ │ │ ├── bootstrap.css.map │ │ │ ├── bootstrap.min.css │ │ │ └── bootstrap.min.css.map │ │ │ └── js │ │ │ ├── bootstrap.bundle.js │ │ │ ├── bootstrap.bundle.min.js │ │ │ ├── bootstrap.js │ │ │ └── bootstrap.min.js │ │ ├── jquery-validation-unobtrusive │ │ ├── LICENSE.txt │ │ ├── jquery.validate.unobtrusive.js │ │ └── jquery.validate.unobtrusive.min.js │ │ ├── jquery-validation │ │ ├── LICENSE.md │ │ └── dist │ │ │ ├── additional-methods.js │ │ │ ├── additional-methods.min.js │ │ │ ├── jquery.validate.js │ │ │ └── jquery.validate.min.js │ │ └── jquery │ │ ├── LICENSE.txt │ │ └── dist │ │ ├── jquery.js │ │ ├── jquery.min.js │ │ └── jquery.min.map │ └── clientsample │ ├── .gitignore │ ├── .metadata │ ├── README.md │ ├── android │ ├── .gitignore │ ├── app │ │ ├── build.gradle │ │ └── src │ │ │ ├── main │ │ │ ├── AndroidManifest.xml │ │ │ ├── kotlin │ │ │ │ └── com │ │ │ │ │ └── example │ │ │ │ │ └── clientsample │ │ │ │ │ └── MainActivity.kt │ │ │ └── res │ │ │ │ ├── drawable-v21 │ │ │ │ └── launch_background.xml │ │ │ │ ├── drawable │ │ │ │ └── launch_background.xml │ │ │ │ ├── mipmap-hdpi │ │ │ │ └── ic_launcher.png │ │ │ │ ├── mipmap-mdpi │ │ │ │ └── ic_launcher.png │ │ │ │ ├── mipmap-xhdpi │ │ │ │ └── ic_launcher.png │ │ │ │ ├── mipmap-xxhdpi │ │ │ │ └── ic_launcher.png │ │ │ │ ├── mipmap-xxxhdpi │ │ │ │ └── ic_launcher.png │ │ │ │ ├── values-night │ │ │ │ └── styles.xml │ │ │ │ └── values │ │ │ │ └── styles.xml │ │ │ └── profile │ │ │ └── AndroidManifest.xml │ ├── build.gradle │ ├── gradle.properties │ ├── gradle │ │ └── wrapper │ │ │ └── gradle-wrapper.properties │ └── settings.gradle │ ├── ios │ ├── .gitignore │ ├── Flutter │ │ ├── AppFrameworkInfo.plist │ │ ├── Debug.xcconfig │ │ └── Release.xcconfig │ ├── Podfile │ ├── Podfile.lock │ ├── Runner.xcodeproj │ │ ├── project.pbxproj │ │ ├── project.xcworkspace │ │ │ ├── contents.xcworkspacedata │ │ │ └── xcshareddata │ │ │ │ ├── IDEWorkspaceChecks.plist │ │ │ │ └── WorkspaceSettings.xcsettings │ │ └── xcshareddata │ │ │ └── xcschemes │ │ │ └── Runner.xcscheme │ ├── Runner.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata │ │ │ ├── IDEWorkspaceChecks.plist │ │ │ └── WorkspaceSettings.xcsettings │ └── Runner │ │ ├── AppDelegate.swift │ │ ├── Assets.xcassets │ │ ├── AppIcon.appiconset │ │ │ ├── Contents.json │ │ │ ├── Icon-App-1024x1024@1x.png │ │ │ ├── Icon-App-20x20@1x.png │ │ │ ├── Icon-App-20x20@2x.png │ │ │ ├── Icon-App-20x20@3x.png │ │ │ ├── Icon-App-29x29@1x.png │ │ │ ├── Icon-App-29x29@2x.png │ │ │ ├── Icon-App-29x29@3x.png │ │ │ ├── Icon-App-40x40@1x.png │ │ │ ├── Icon-App-40x40@2x.png │ │ │ ├── Icon-App-40x40@3x.png │ │ │ ├── Icon-App-60x60@2x.png │ │ │ ├── Icon-App-60x60@3x.png │ │ │ ├── Icon-App-76x76@1x.png │ │ │ ├── Icon-App-76x76@2x.png │ │ │ └── Icon-App-83.5x83.5@2x.png │ │ └── LaunchImage.imageset │ │ │ ├── Contents.json │ │ │ ├── LaunchImage.png │ │ │ ├── LaunchImage@2x.png │ │ │ ├── LaunchImage@3x.png │ │ │ └── README.md │ │ ├── Base.lproj │ │ ├── LaunchScreen.storyboard │ │ └── Main.storyboard │ │ ├── Info.plist │ │ └── Runner-Bridging-Header.h │ ├── lib │ ├── main.dart │ └── src │ │ ├── data │ │ ├── areas.dart │ │ ├── configurations.dart │ │ ├── custom_objects.dart │ │ ├── database.dart │ │ ├── database.g.dart │ │ ├── database_shared.dart │ │ ├── database_shared │ │ │ ├── database_default.dart │ │ │ ├── database_stub.dart │ │ │ └── database_web.dart │ │ └── persons.dart │ │ ├── global.dart │ │ ├── ui │ │ ├── area_entry_page.dart │ │ ├── area_list_page.dart │ │ ├── custom_object_entry_page.dart │ │ ├── custom_object_list_page.dart │ │ ├── home_page.dart │ │ ├── knowledge_view_page.dart │ │ ├── list_row_widget.dart │ │ ├── person_entry_page.dart │ │ ├── person_list_page.dart │ │ ├── signin_page.dart │ │ └── sync_page.dart │ │ ├── utils.dart │ │ ├── utils_shared.dart │ │ └── utils_shared │ │ ├── utils_default.dart │ │ ├── utils_stub.dart │ │ └── utils_web.dart │ ├── linux │ ├── .gitignore │ ├── CMakeLists.txt │ ├── flutter │ │ ├── CMakeLists.txt │ │ ├── generated_plugin_registrant.cc │ │ ├── generated_plugin_registrant.h │ │ └── generated_plugins.cmake │ ├── main.cc │ ├── my_application.cc │ └── my_application.h │ ├── macos │ ├── .gitignore │ ├── Flutter │ │ ├── Flutter-Debug.xcconfig │ │ ├── Flutter-Release.xcconfig │ │ └── GeneratedPluginRegistrant.swift │ ├── Podfile │ ├── Podfile.lock │ ├── Runner.xcodeproj │ │ ├── project.pbxproj │ │ ├── project.xcworkspace │ │ │ └── xcshareddata │ │ │ │ └── IDEWorkspaceChecks.plist │ │ └── xcshareddata │ │ │ └── xcschemes │ │ │ └── Runner.xcscheme │ ├── Runner.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata │ │ │ └── IDEWorkspaceChecks.plist │ └── Runner │ │ ├── AppDelegate.swift │ │ ├── Assets.xcassets │ │ └── AppIcon.appiconset │ │ │ ├── Contents.json │ │ │ ├── app_icon_1024.png │ │ │ ├── app_icon_128.png │ │ │ ├── app_icon_16.png │ │ │ ├── app_icon_256.png │ │ │ ├── app_icon_32.png │ │ │ ├── app_icon_512.png │ │ │ └── app_icon_64.png │ │ ├── Base.lproj │ │ └── MainMenu.xib │ │ ├── Configs │ │ ├── AppInfo.xcconfig │ │ ├── Debug.xcconfig │ │ ├── Release.xcconfig │ │ └── Warnings.xcconfig │ │ ├── DebugProfile.entitlements │ │ ├── Info.plist │ │ ├── MainFlutterWindow.swift │ │ └── Release.entitlements │ ├── pubspec.yaml │ ├── test │ └── widget_test.dart │ ├── web │ ├── favicon.png │ ├── icons │ │ ├── Icon-192.png │ │ └── Icon-512.png │ ├── index.html │ ├── manifest.json │ ├── sql-wasm.js │ └── sql-wasm.wasm │ └── windows │ ├── .gitignore │ ├── CMakeLists.txt │ ├── flutter │ ├── CMakeLists.txt │ ├── generated_plugin_registrant.cc │ ├── generated_plugin_registrant.h │ └── generated_plugins.cmake │ └── runner │ ├── CMakeLists.txt │ ├── Runner.rc │ ├── flutter_window.cpp │ ├── flutter_window.h │ ├── main.cpp │ ├── resource.h │ ├── resources │ └── app_icon.ico │ ├── run_loop.cpp │ ├── run_loop.h │ ├── runner.exe.manifest │ ├── utils.cpp │ ├── utils.h │ ├── win32_window.cpp │ └── win32_window.h ├── netcoresync_moor ├── .gitignore ├── .metadata ├── CHANGELOG.md ├── LICENSE ├── README.md ├── analysis_options.yaml ├── documentation │ ├── dev-notes.md │ └── server-timestamp-logic.md ├── example │ ├── main.dart │ └── main.g.dart ├── lib │ ├── netcoresync_moor.dart │ └── src │ │ ├── client_delete.dart │ │ ├── client_insert.dart │ │ ├── client_select.dart │ │ ├── client_update.dart │ │ ├── data_access.dart │ │ ├── netcoresync_annotations.dart │ │ ├── netcoresync_classes.dart │ │ ├── netcoresync_client.dart │ │ ├── netcoresync_engine.dart │ │ ├── netcoresync_exceptions.dart │ │ ├── netcoresync_knowledges.dart │ │ ├── sync_messages.dart │ │ ├── sync_session.dart │ │ └── sync_socket.dart ├── pubspec.yaml └── test │ ├── data │ ├── areas.dart │ ├── custom_objects.dart │ ├── database.dart │ ├── database.g.dart │ ├── database_shared.dart │ ├── database_shared │ │ ├── database_default.dart │ │ ├── database_stub.dart │ │ └── database_web.dart │ └── persons.dart │ ├── dylib │ └── sqlite3 │ │ ├── linux │ │ ├── README.md │ │ ├── libsqlite3.so │ │ └── sqlite3 │ │ └── macos │ │ ├── README.md │ │ └── libsqlite3.dylib │ ├── integration_tests │ └── netcoresync_sync_test.dart │ ├── moor_behavior_test.dart │ ├── netcoresync_operation_test.dart │ └── utils │ ├── helper.dart │ └── net_core_test_server.dart └── netcoresync_moor_generator ├── .gitignore ├── .metadata ├── CHANGELOG.md ├── LICENSE ├── README.md ├── analysis_options.yaml ├── build.yaml ├── example └── main.dart ├── lib ├── netcoresync_moor_generator.dart └── src │ ├── exceptions.dart │ ├── netcoresync_client_generator.dart │ └── table_generator.dart ├── pubspec.yaml └── test └── netcoresync_moor_generator_test.dart /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "[dart]": { 3 | "editor.formatOnSave": true, 4 | "editor.formatOnType": true, 5 | "editor.rulers": [80], 6 | "editor.selectionHighlight": false, 7 | "editor.suggest.snippetsPreventQuickSuggestions": false, 8 | "editor.suggestSelection": "first", 9 | "editor.tabCompletion": "onlySnippets", 10 | "editor.wordBasedSuggestions": false 11 | }, 12 | "dart.flutterSdkPath": ".fvm/flutter_sdk", 13 | // Remove .fvm files from search 14 | "search.exclude": { 15 | "**/.fvm": true 16 | }, 17 | // Remove from file watching 18 | "files.watcherExclude": { 19 | "**/.fvm": true 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /NETCoreSync/SyncFriendlyIdAttribute.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Text; 4 | 5 | namespace NETCoreSync 6 | { 7 | [AttributeUsage(AttributeTargets.Property, AllowMultiple = false)] 8 | public class SyncFriendlyIdAttribute : Attribute 9 | { 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /NETCoreSync/SyncPropertyAttribute.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Text; 4 | 5 | namespace NETCoreSync 6 | { 7 | [AttributeUsage(AttributeTargets.Property, AllowMultiple = false)] 8 | public class SyncPropertyAttribute : Attribute 9 | { 10 | public enum PropertyIndicatorEnum 11 | { 12 | Id, 13 | LastUpdated, 14 | Deleted, 15 | DatabaseInstanceId 16 | } 17 | 18 | public PropertyIndicatorEnum PropertyIndicator { get; set; } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /NETCoreSync/SyncResult.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | 3 | namespace NETCoreSync 4 | { 5 | public class SyncResult 6 | { 7 | public string ErrorMessage { get; set; } 8 | public List Log { get; } = new List(); 9 | public SyncLog ClientLog { get; } = new SyncLog(); 10 | public SyncLog ServerLog { get; } = new SyncLog(); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /NETCoreSync/SyncSchemaAttribute.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Text; 4 | 5 | namespace NETCoreSync 6 | { 7 | [AttributeUsage(AttributeTargets.Class, AllowMultiple = false)] 8 | public class SyncSchemaAttribute : Attribute 9 | { 10 | public string MapToClassName { get; set; } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /NETCoreSyncServer/CHANGELOG.md: -------------------------------------------------------------------------------- 1 | ## 1.0.1 2 | 3 | * Fix wrong link description. 4 | 5 | ## 1.0.0 6 | 7 | * Initial Release. 8 | -------------------------------------------------------------------------------- /NETCoreSyncServer/NETCoreSyncServerOptions.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace NETCoreSyncServer 4 | { 5 | public class NETCoreSyncServerOptions 6 | { 7 | public String Path { get; set; } = "/netcoresyncserver"; 8 | public double KeepAliveIntervalInSeconds { get; set; } = 120; 9 | public int SendReceiveBufferSizeInBytes { get; set; } = 1024 * 4; 10 | } 11 | } -------------------------------------------------------------------------------- /NETCoreSyncServer/README.md: -------------------------------------------------------------------------------- 1 | # NETCoreSyncServer 2 | 3 | [![build](https://github.com/aldycool/NETCoreSync/actions/workflows/netcoresync_moor_build.yml/badge.svg?event=push)](https://github.com/aldycool/NETCoreSync/actions/workflows/netcoresync_moor_build.yml?query=event%3Apush) [![codecov](https://codecov.io/gh/aldycool/NETCoreSync/branch/master/graph/badge.svg?token=S2GTBOB7XB)](https://codecov.io/gh/aldycool/NETCoreSync) 4 | 5 | | Client | Client Generator | Server | 6 | | :---: | :---: | :---: | 7 | | [![netcoresync_moor version](https://img.shields.io/pub/v/netcoresync_moor.svg)](https://pub.dev/packages/netcoresync_moor) | [![netcoresync_moor_generator version](https://img.shields.io/pub/v/netcoresync_moor_generator.svg)](https://pub.dev/packages/netcoresync_moor_generator) | [![Nuget](https://img.shields.io/nuget/v/NETCoreSyncServer)](https://www.nuget.org/packages/NETCoreSyncServer) | 8 | 9 | The server-side .NET Core framework that hosts the synchronization data middleware for Flutter clients that uses the `netcoresync_moor` package. This project is implemented in .NET 5.0 Middleware and uses WebSockets for its data communication. Visit the [netcoresync_moor repository](https://github.com/aldycool/NETCoreSync/blob/master/netcoresync_moor) for more details. 10 | -------------------------------------------------------------------------------- /NETCoreSyncServer/SyncEvent.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | 4 | namespace NETCoreSyncServer 5 | { 6 | public class SyncEvent 7 | { 8 | public Func? OnHandshake { get; set; } 9 | } 10 | } 11 | 12 | -------------------------------------------------------------------------------- /NETCoreSyncServer/SyncExceptions.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Reflection; 3 | 4 | namespace NETCoreSyncServer 5 | { 6 | public class NETCoreSyncServerException : Exception 7 | { 8 | public NETCoreSyncServerException(string message) : base(message) 9 | { 10 | } 11 | } 12 | 13 | public class NETCoreSyncServerMissingSyncPropertyAttributeException : Exception 14 | { 15 | public NETCoreSyncServerMissingSyncPropertyAttributeException(SyncPropertyAttribute.PropertyIndicatorEnum propertyIndicator, Type type) : base($"Missing Property with {nameof(SyncPropertyAttribute)} ({nameof(SyncPropertyAttribute.PropertyIndicator)}: {propertyIndicator.ToString()}) defined for Type: {type.FullName}") 16 | { 17 | } 18 | } 19 | 20 | public class NETCoreSyncServerMismatchPropertyTypeException : Exception 21 | { 22 | public NETCoreSyncServerMismatchPropertyTypeException(PropertyInfo propertyInfo, Type expectedType, Type type) : base($"Mismatch Property Type for Property: {propertyInfo.Name} ({propertyInfo.PropertyType.Name}) for Type: {type.FullName}. Expected Property Type: {expectedType.ToString()}") 23 | { 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /NETCoreSyncServer/SyncPropertyAttribute.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace NETCoreSyncServer 4 | { 5 | [AttributeUsage(AttributeTargets.Property, AllowMultiple = false)] 6 | public class SyncPropertyAttribute : Attribute 7 | { 8 | public enum PropertyIndicatorEnum 9 | { 10 | ID, 11 | SyncID, 12 | KnowledgeID, 13 | TimeStamp, 14 | Deleted 15 | } 16 | 17 | public PropertyIndicatorEnum PropertyIndicator { get; set; } 18 | 19 | public SyncPropertyAttribute(PropertyIndicatorEnum propertyIndicator) 20 | { 21 | PropertyIndicator = propertyIndicator; 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /NETCoreSyncServer/SyncService.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Reflection; 4 | 5 | namespace NETCoreSyncServer 6 | { 7 | internal class SyncService 8 | { 9 | public List Types { get; set; } = new List(); 10 | public Dictionary TableInfos { get; set; } = new Dictionary(); 11 | public SyncEvent? SyncEvent { get; set; } 12 | } 13 | 14 | internal class TableInfo 15 | { 16 | public SyncTableAttribute SyncTable { get; set; } = null!; 17 | public PropertyInfo PropertyInfoID { get; set; } = null!; 18 | public PropertyInfo PropertyInfoSyncID { get; set; } = null!; 19 | public PropertyInfo PropertyInfoKnowledgeID { get; set; } = null!; 20 | public PropertyInfo PropertyInfoTimeStamp { get; set; } = null!; 21 | public PropertyInfo PropertyInfoDeleted { get; set; } = null!; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /NETCoreSyncServer/SyncTableAttribute.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace NETCoreSyncServer 4 | { 5 | [AttributeUsage(AttributeTargets.Class, AllowMultiple = false)] 6 | public class SyncTableAttribute : Attribute 7 | { 8 | public string ClientClassName { get; set; } 9 | public int Order { get; set; } 10 | 11 | public SyncTableAttribute(string clientClassName = "", int order = 0) 12 | { 13 | ClientClassName = clientClassName; 14 | Order = order; 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /Samples/DatabaseTimeStamp/MobileSample.Android/Assets/AboutAssets.txt: -------------------------------------------------------------------------------- 1 | Any raw assets you want to be deployed with your application can be placed in 2 | this directory (and child directories) and given a Build Action of "AndroidAsset". 3 | 4 | These files will be deployed with you package and will be accessible using Android's 5 | AssetManager, like this: 6 | 7 | public class ReadAsset : Activity 8 | { 9 | protected override void OnCreate (Bundle bundle) 10 | { 11 | base.OnCreate (bundle); 12 | 13 | InputStream input = Assets.Open ("my_asset.txt"); 14 | } 15 | } 16 | 17 | Additionally, some Android functions will automatically load asset files: 18 | 19 | Typeface tf = Typeface.CreateFromAsset (Context.Assets, "fonts/samplefont.ttf"); 20 | -------------------------------------------------------------------------------- /Samples/DatabaseTimeStamp/MobileSample.Android/FodyWeavers.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /Samples/DatabaseTimeStamp/MobileSample.Android/MainActivity.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | using Android.App; 4 | using Android.Content.PM; 5 | using Android.Runtime; 6 | using Android.Views; 7 | using Android.Widget; 8 | using Android.OS; 9 | 10 | namespace MobileSample.Droid 11 | { 12 | [Activity(Label = "MobileSample", Icon = "@mipmap/icon", Theme = "@style/MainTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)] 13 | public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity 14 | { 15 | protected override void OnCreate(Bundle savedInstanceState) 16 | { 17 | TabLayoutResource = Resource.Layout.Tabbar; 18 | ToolbarResource = Resource.Layout.Toolbar; 19 | 20 | base.OnCreate(savedInstanceState); 21 | global::Xamarin.Forms.Forms.Init(this, savedInstanceState); 22 | LoadApplication(new App()); 23 | } 24 | } 25 | } -------------------------------------------------------------------------------- /Samples/DatabaseTimeStamp/MobileSample.Android/Properties/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /Samples/DatabaseTimeStamp/MobileSample.Android/Resources/drawable/xamarin_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aldycool/NETCoreSync/b57e24b32ef0a73face7ffa345f70d01b4abef59/Samples/DatabaseTimeStamp/MobileSample.Android/Resources/drawable/xamarin_logo.png -------------------------------------------------------------------------------- /Samples/DatabaseTimeStamp/MobileSample.Android/Resources/layout/Tabbar.axml: -------------------------------------------------------------------------------- 1 | 2 | 12 | -------------------------------------------------------------------------------- /Samples/DatabaseTimeStamp/MobileSample.Android/Resources/layout/Toolbar.axml: -------------------------------------------------------------------------------- 1 | 9 | 10 | -------------------------------------------------------------------------------- /Samples/DatabaseTimeStamp/MobileSample.Android/Resources/mipmap-anydpi-v26/icon.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /Samples/DatabaseTimeStamp/MobileSample.Android/Resources/mipmap-anydpi-v26/icon_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /Samples/DatabaseTimeStamp/MobileSample.Android/Resources/mipmap-hdpi/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aldycool/NETCoreSync/b57e24b32ef0a73face7ffa345f70d01b4abef59/Samples/DatabaseTimeStamp/MobileSample.Android/Resources/mipmap-hdpi/icon.png -------------------------------------------------------------------------------- /Samples/DatabaseTimeStamp/MobileSample.Android/Resources/mipmap-hdpi/launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aldycool/NETCoreSync/b57e24b32ef0a73face7ffa345f70d01b4abef59/Samples/DatabaseTimeStamp/MobileSample.Android/Resources/mipmap-hdpi/launcher_foreground.png -------------------------------------------------------------------------------- /Samples/DatabaseTimeStamp/MobileSample.Android/Resources/mipmap-mdpi/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aldycool/NETCoreSync/b57e24b32ef0a73face7ffa345f70d01b4abef59/Samples/DatabaseTimeStamp/MobileSample.Android/Resources/mipmap-mdpi/icon.png -------------------------------------------------------------------------------- /Samples/DatabaseTimeStamp/MobileSample.Android/Resources/mipmap-mdpi/launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aldycool/NETCoreSync/b57e24b32ef0a73face7ffa345f70d01b4abef59/Samples/DatabaseTimeStamp/MobileSample.Android/Resources/mipmap-mdpi/launcher_foreground.png -------------------------------------------------------------------------------- /Samples/DatabaseTimeStamp/MobileSample.Android/Resources/mipmap-xhdpi/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aldycool/NETCoreSync/b57e24b32ef0a73face7ffa345f70d01b4abef59/Samples/DatabaseTimeStamp/MobileSample.Android/Resources/mipmap-xhdpi/icon.png -------------------------------------------------------------------------------- /Samples/DatabaseTimeStamp/MobileSample.Android/Resources/mipmap-xhdpi/launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aldycool/NETCoreSync/b57e24b32ef0a73face7ffa345f70d01b4abef59/Samples/DatabaseTimeStamp/MobileSample.Android/Resources/mipmap-xhdpi/launcher_foreground.png -------------------------------------------------------------------------------- /Samples/DatabaseTimeStamp/MobileSample.Android/Resources/mipmap-xxhdpi/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aldycool/NETCoreSync/b57e24b32ef0a73face7ffa345f70d01b4abef59/Samples/DatabaseTimeStamp/MobileSample.Android/Resources/mipmap-xxhdpi/icon.png -------------------------------------------------------------------------------- /Samples/DatabaseTimeStamp/MobileSample.Android/Resources/mipmap-xxhdpi/launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aldycool/NETCoreSync/b57e24b32ef0a73face7ffa345f70d01b4abef59/Samples/DatabaseTimeStamp/MobileSample.Android/Resources/mipmap-xxhdpi/launcher_foreground.png -------------------------------------------------------------------------------- /Samples/DatabaseTimeStamp/MobileSample.Android/Resources/mipmap-xxxhdpi/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aldycool/NETCoreSync/b57e24b32ef0a73face7ffa345f70d01b4abef59/Samples/DatabaseTimeStamp/MobileSample.Android/Resources/mipmap-xxxhdpi/icon.png -------------------------------------------------------------------------------- /Samples/DatabaseTimeStamp/MobileSample.Android/Resources/mipmap-xxxhdpi/launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aldycool/NETCoreSync/b57e24b32ef0a73face7ffa345f70d01b4abef59/Samples/DatabaseTimeStamp/MobileSample.Android/Resources/mipmap-xxxhdpi/launcher_foreground.png -------------------------------------------------------------------------------- /Samples/DatabaseTimeStamp/MobileSample.Android/Resources/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #FFFFFF 4 | #3F51B5 5 | #303F9F 6 | #FF4081 7 | 8 | -------------------------------------------------------------------------------- /Samples/DatabaseTimeStamp/MobileSample.iOS/AppDelegate.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | 5 | using Foundation; 6 | using UIKit; 7 | 8 | namespace MobileSample.iOS 9 | { 10 | // The UIApplicationDelegate for the application. This class is responsible for launching the 11 | // User Interface of the application, as well as listening (and optionally responding) to 12 | // application events from iOS. 13 | [Register("AppDelegate")] 14 | public partial class AppDelegate : global::Xamarin.Forms.Platform.iOS.FormsApplicationDelegate 15 | { 16 | // 17 | // This method is invoked when the application has loaded and is ready to run. In this 18 | // method you should instantiate the window, load the UI into it and then make the window 19 | // visible. 20 | // 21 | // You have 17 seconds to return from this method, or iOS will terminate your application. 22 | // 23 | public override bool FinishedLaunching(UIApplication app, NSDictionary options) 24 | { 25 | global::Xamarin.Forms.Forms.Init(); 26 | 27 | LoadApplication(new App()); 28 | 29 | return base.FinishedLaunching(app, options); 30 | } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /Samples/DatabaseTimeStamp/MobileSample.iOS/Assets.xcassets/AppIcon.appiconset/Icon1024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aldycool/NETCoreSync/b57e24b32ef0a73face7ffa345f70d01b4abef59/Samples/DatabaseTimeStamp/MobileSample.iOS/Assets.xcassets/AppIcon.appiconset/Icon1024.png -------------------------------------------------------------------------------- /Samples/DatabaseTimeStamp/MobileSample.iOS/Assets.xcassets/AppIcon.appiconset/Icon120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aldycool/NETCoreSync/b57e24b32ef0a73face7ffa345f70d01b4abef59/Samples/DatabaseTimeStamp/MobileSample.iOS/Assets.xcassets/AppIcon.appiconset/Icon120.png -------------------------------------------------------------------------------- /Samples/DatabaseTimeStamp/MobileSample.iOS/Assets.xcassets/AppIcon.appiconset/Icon152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aldycool/NETCoreSync/b57e24b32ef0a73face7ffa345f70d01b4abef59/Samples/DatabaseTimeStamp/MobileSample.iOS/Assets.xcassets/AppIcon.appiconset/Icon152.png -------------------------------------------------------------------------------- /Samples/DatabaseTimeStamp/MobileSample.iOS/Assets.xcassets/AppIcon.appiconset/Icon167.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aldycool/NETCoreSync/b57e24b32ef0a73face7ffa345f70d01b4abef59/Samples/DatabaseTimeStamp/MobileSample.iOS/Assets.xcassets/AppIcon.appiconset/Icon167.png -------------------------------------------------------------------------------- /Samples/DatabaseTimeStamp/MobileSample.iOS/Assets.xcassets/AppIcon.appiconset/Icon180.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aldycool/NETCoreSync/b57e24b32ef0a73face7ffa345f70d01b4abef59/Samples/DatabaseTimeStamp/MobileSample.iOS/Assets.xcassets/AppIcon.appiconset/Icon180.png -------------------------------------------------------------------------------- /Samples/DatabaseTimeStamp/MobileSample.iOS/Assets.xcassets/AppIcon.appiconset/Icon20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aldycool/NETCoreSync/b57e24b32ef0a73face7ffa345f70d01b4abef59/Samples/DatabaseTimeStamp/MobileSample.iOS/Assets.xcassets/AppIcon.appiconset/Icon20.png -------------------------------------------------------------------------------- /Samples/DatabaseTimeStamp/MobileSample.iOS/Assets.xcassets/AppIcon.appiconset/Icon29.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aldycool/NETCoreSync/b57e24b32ef0a73face7ffa345f70d01b4abef59/Samples/DatabaseTimeStamp/MobileSample.iOS/Assets.xcassets/AppIcon.appiconset/Icon29.png -------------------------------------------------------------------------------- /Samples/DatabaseTimeStamp/MobileSample.iOS/Assets.xcassets/AppIcon.appiconset/Icon40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aldycool/NETCoreSync/b57e24b32ef0a73face7ffa345f70d01b4abef59/Samples/DatabaseTimeStamp/MobileSample.iOS/Assets.xcassets/AppIcon.appiconset/Icon40.png -------------------------------------------------------------------------------- /Samples/DatabaseTimeStamp/MobileSample.iOS/Assets.xcassets/AppIcon.appiconset/Icon58.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aldycool/NETCoreSync/b57e24b32ef0a73face7ffa345f70d01b4abef59/Samples/DatabaseTimeStamp/MobileSample.iOS/Assets.xcassets/AppIcon.appiconset/Icon58.png -------------------------------------------------------------------------------- /Samples/DatabaseTimeStamp/MobileSample.iOS/Assets.xcassets/AppIcon.appiconset/Icon60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aldycool/NETCoreSync/b57e24b32ef0a73face7ffa345f70d01b4abef59/Samples/DatabaseTimeStamp/MobileSample.iOS/Assets.xcassets/AppIcon.appiconset/Icon60.png -------------------------------------------------------------------------------- /Samples/DatabaseTimeStamp/MobileSample.iOS/Assets.xcassets/AppIcon.appiconset/Icon76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aldycool/NETCoreSync/b57e24b32ef0a73face7ffa345f70d01b4abef59/Samples/DatabaseTimeStamp/MobileSample.iOS/Assets.xcassets/AppIcon.appiconset/Icon76.png -------------------------------------------------------------------------------- /Samples/DatabaseTimeStamp/MobileSample.iOS/Assets.xcassets/AppIcon.appiconset/Icon80.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aldycool/NETCoreSync/b57e24b32ef0a73face7ffa345f70d01b4abef59/Samples/DatabaseTimeStamp/MobileSample.iOS/Assets.xcassets/AppIcon.appiconset/Icon80.png -------------------------------------------------------------------------------- /Samples/DatabaseTimeStamp/MobileSample.iOS/Assets.xcassets/AppIcon.appiconset/Icon87.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aldycool/NETCoreSync/b57e24b32ef0a73face7ffa345f70d01b4abef59/Samples/DatabaseTimeStamp/MobileSample.iOS/Assets.xcassets/AppIcon.appiconset/Icon87.png -------------------------------------------------------------------------------- /Samples/DatabaseTimeStamp/MobileSample.iOS/Entitlements.plist: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Samples/DatabaseTimeStamp/MobileSample.iOS/FodyWeavers.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /Samples/DatabaseTimeStamp/MobileSample.iOS/Main.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | 5 | using Foundation; 6 | using UIKit; 7 | 8 | namespace MobileSample.iOS 9 | { 10 | public class Application 11 | { 12 | // This is the main entry point of the application. 13 | static void Main(string[] args) 14 | { 15 | // if you want to use a different Application Delegate class from "AppDelegate" 16 | // you can specify it here. 17 | UIApplication.Main(args, null, "AppDelegate"); 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Samples/DatabaseTimeStamp/MobileSample.iOS/Resources/Default-568h@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aldycool/NETCoreSync/b57e24b32ef0a73face7ffa345f70d01b4abef59/Samples/DatabaseTimeStamp/MobileSample.iOS/Resources/Default-568h@2x.png -------------------------------------------------------------------------------- /Samples/DatabaseTimeStamp/MobileSample.iOS/Resources/Default-Portrait.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aldycool/NETCoreSync/b57e24b32ef0a73face7ffa345f70d01b4abef59/Samples/DatabaseTimeStamp/MobileSample.iOS/Resources/Default-Portrait.png -------------------------------------------------------------------------------- /Samples/DatabaseTimeStamp/MobileSample.iOS/Resources/Default-Portrait@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aldycool/NETCoreSync/b57e24b32ef0a73face7ffa345f70d01b4abef59/Samples/DatabaseTimeStamp/MobileSample.iOS/Resources/Default-Portrait@2x.png -------------------------------------------------------------------------------- /Samples/DatabaseTimeStamp/MobileSample.iOS/Resources/Default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aldycool/NETCoreSync/b57e24b32ef0a73face7ffa345f70d01b4abef59/Samples/DatabaseTimeStamp/MobileSample.iOS/Resources/Default.png -------------------------------------------------------------------------------- /Samples/DatabaseTimeStamp/MobileSample.iOS/Resources/Default@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aldycool/NETCoreSync/b57e24b32ef0a73face7ffa345f70d01b4abef59/Samples/DatabaseTimeStamp/MobileSample.iOS/Resources/Default@2x.png -------------------------------------------------------------------------------- /Samples/DatabaseTimeStamp/MobileSample.iOS/Resources/tab_about.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aldycool/NETCoreSync/b57e24b32ef0a73face7ffa345f70d01b4abef59/Samples/DatabaseTimeStamp/MobileSample.iOS/Resources/tab_about.png -------------------------------------------------------------------------------- /Samples/DatabaseTimeStamp/MobileSample.iOS/Resources/tab_about@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aldycool/NETCoreSync/b57e24b32ef0a73face7ffa345f70d01b4abef59/Samples/DatabaseTimeStamp/MobileSample.iOS/Resources/tab_about@2x.png -------------------------------------------------------------------------------- /Samples/DatabaseTimeStamp/MobileSample.iOS/Resources/tab_about@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aldycool/NETCoreSync/b57e24b32ef0a73face7ffa345f70d01b4abef59/Samples/DatabaseTimeStamp/MobileSample.iOS/Resources/tab_about@3x.png -------------------------------------------------------------------------------- /Samples/DatabaseTimeStamp/MobileSample.iOS/Resources/tab_feed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aldycool/NETCoreSync/b57e24b32ef0a73face7ffa345f70d01b4abef59/Samples/DatabaseTimeStamp/MobileSample.iOS/Resources/tab_feed.png -------------------------------------------------------------------------------- /Samples/DatabaseTimeStamp/MobileSample.iOS/Resources/tab_feed@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aldycool/NETCoreSync/b57e24b32ef0a73face7ffa345f70d01b4abef59/Samples/DatabaseTimeStamp/MobileSample.iOS/Resources/tab_feed@2x.png -------------------------------------------------------------------------------- /Samples/DatabaseTimeStamp/MobileSample.iOS/Resources/tab_feed@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aldycool/NETCoreSync/b57e24b32ef0a73face7ffa345f70d01b4abef59/Samples/DatabaseTimeStamp/MobileSample.iOS/Resources/tab_feed@3x.png -------------------------------------------------------------------------------- /Samples/DatabaseTimeStamp/MobileSample.iOS/Resources/xamarin_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aldycool/NETCoreSync/b57e24b32ef0a73face7ffa345f70d01b4abef59/Samples/DatabaseTimeStamp/MobileSample.iOS/Resources/xamarin_logo.png -------------------------------------------------------------------------------- /Samples/DatabaseTimeStamp/MobileSample.iOS/Resources/xamarin_logo@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aldycool/NETCoreSync/b57e24b32ef0a73face7ffa345f70d01b4abef59/Samples/DatabaseTimeStamp/MobileSample.iOS/Resources/xamarin_logo@2x.png -------------------------------------------------------------------------------- /Samples/DatabaseTimeStamp/MobileSample.iOS/Resources/xamarin_logo@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aldycool/NETCoreSync/b57e24b32ef0a73face7ffa345f70d01b4abef59/Samples/DatabaseTimeStamp/MobileSample.iOS/Resources/xamarin_logo@3x.png -------------------------------------------------------------------------------- /Samples/DatabaseTimeStamp/MobileSample/App.xaml: -------------------------------------------------------------------------------- 1 |  2 | 5 | 6 | 7 | 8 | #2196F3 9 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /Samples/DatabaseTimeStamp/MobileSample/FodyWeavers.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /Samples/DatabaseTimeStamp/MobileSample/Models/Configuration.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Text; 4 | 5 | namespace MobileSample.Models 6 | { 7 | public class Configuration : Realms.RealmObject 8 | { 9 | [Realms.PrimaryKey()] 10 | public string Id { get; set; } = Guid.NewGuid().ToString(); 11 | public string Key { get; set; } 12 | public string Value { get; set; } 13 | 14 | public override string ToString() 15 | { 16 | return $"{nameof(Id)}: {Id}, {nameof(Key)}: {Key}, {nameof(Value)}: {Value}"; 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /Samples/DatabaseTimeStamp/MobileSample/Models/Knowledge.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Text; 4 | 5 | namespace MobileSample.Models 6 | { 7 | public class Knowledge : Realms.RealmObject 8 | { 9 | [Realms.PrimaryKey()] 10 | public string Id { get; set; } = Guid.NewGuid().ToString(); 11 | 12 | public string DatabaseInstanceId { get; set; } 13 | public bool IsLocal { get; set; } 14 | public long MaxTimeStamp { get; set; } 15 | 16 | public override string ToString() 17 | { 18 | return $"{nameof(DatabaseInstanceId)}: {DatabaseInstanceId}, {nameof(IsLocal)}: {IsLocal}, {nameof(MaxTimeStamp)}: {MaxTimeStamp}"; 19 | } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /Samples/DatabaseTimeStamp/MobileSample/Models/MainMenuItem.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Text; 4 | 5 | namespace MobileSample.Models 6 | { 7 | public enum MenuItemType 8 | { 9 | About, 10 | DepartmentList, 11 | EmployeeList, 12 | Sync, 13 | Setup 14 | } 15 | 16 | public class MainMenuItem 17 | { 18 | public MenuItemType Id { get; set; } 19 | public string Title { get; set; } 20 | 21 | public static List GetMenus() 22 | { 23 | List menus = new List(); 24 | menus.Add(new MainMenuItem() { Id = MenuItemType.About, Title = "About" }); 25 | menus.Add(new MainMenuItem() { Id = MenuItemType.DepartmentList, Title = "Departments" }); 26 | menus.Add(new MainMenuItem() { Id = MenuItemType.EmployeeList, Title = "Employees" }); 27 | menus.Add(new MainMenuItem() { Id = MenuItemType.Sync, Title = "Sync" }); 28 | menus.Add(new MainMenuItem() { Id = MenuItemType.Setup, Title = "Setup" }); 29 | return menus; 30 | } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /Samples/DatabaseTimeStamp/MobileSample/Models/ReferenceItem.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Text; 4 | 5 | namespace MobileSample.Models 6 | { 7 | public class ReferenceItem 8 | { 9 | public string Id { get; set; } 10 | public string Name { get; set; } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Samples/DatabaseTimeStamp/MobileSample/Models/TimeStamp.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Text; 4 | 5 | namespace MobileSample.Models 6 | { 7 | public class TimeStamp : Realms.RealmObject 8 | { 9 | [Realms.PrimaryKey()] 10 | public string Id { get; set; } = Guid.NewGuid().ToString(); 11 | public Realms.RealmInteger Counter { get; set; } 12 | 13 | public override string ToString() 14 | { 15 | return $"{nameof(Id)}: {Id}, {nameof(Counter)}: {Counter}"; 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /Samples/DatabaseTimeStamp/MobileSample/ViewModels/AboutViewModel.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Linq; 3 | using System.Windows.Input; 4 | using Xamarin.Forms; 5 | using MobileSample.Models; 6 | 7 | namespace MobileSample.ViewModels 8 | { 9 | public class AboutViewModel : BaseViewModel 10 | { 11 | public AboutViewModel() 12 | { 13 | Title = MainMenuItem.GetMenus().Where(w => w.Id == MenuItemType.About).First().Title; 14 | OpenWebCommand = new Command(() => Device.OpenUri(new Uri("https://xamarin.com/platform"))); 15 | } 16 | 17 | public ICommand OpenWebCommand { get; } 18 | } 19 | } -------------------------------------------------------------------------------- /Samples/DatabaseTimeStamp/MobileSample/Views/AboutPage.xaml.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | using Xamarin.Forms; 4 | using Xamarin.Forms.Xaml; 5 | using MobileSample.ViewModels; 6 | 7 | namespace MobileSample.Views 8 | { 9 | [XamlCompilation(XamlCompilationOptions.Compile)] 10 | public partial class AboutPage : BaseContentPage 11 | { 12 | public AboutPage() 13 | { 14 | InitializeComponent(); 15 | BindingContext = ViewModel; 16 | } 17 | } 18 | } -------------------------------------------------------------------------------- /Samples/DatabaseTimeStamp/MobileSample/Views/BaseContentPage.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using System.Threading.Tasks; 6 | using Xamarin.Forms; 7 | using Xamarin.Forms.Xaml; 8 | using Autofac; 9 | using MobileSample.Models; 10 | using MobileSample.ViewModels; 11 | 12 | namespace MobileSample.Views 13 | { 14 | public class BaseContentPage : ContentPage where T : BaseViewModel 15 | { 16 | public T ViewModel { get; set; } 17 | 18 | public BaseContentPage(object initData) 19 | { 20 | using (var scope = App.Container.BeginLifetimeScope(builder => builder.RegisterInstance(Navigation).As())) 21 | { 22 | ViewModel = scope.Resolve(); 23 | ViewModel.WireEvents(this); 24 | ViewModel.Init(initData); 25 | } 26 | } 27 | 28 | public BaseContentPage() : this(null) 29 | { 30 | } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /Samples/DatabaseTimeStamp/MobileSample/Views/DepartmentItemPage.xaml: -------------------------------------------------------------------------------- 1 |  2 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /Samples/DatabaseTimeStamp/MobileSample/Views/DepartmentItemPage.xaml.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using System.Threading.Tasks; 6 | 7 | using Xamarin.Forms; 8 | using Xamarin.Forms.Xaml; 9 | using MobileSample.Models; 10 | using MobileSample.ViewModels; 11 | 12 | namespace MobileSample.Views 13 | { 14 | [XamlCompilation(XamlCompilationOptions.Compile)] 15 | public partial class DepartmentItemPage : BaseContentPage 16 | { 17 | public DepartmentItemPage(object initData) : base(initData) 18 | { 19 | InitializeComponent(); 20 | BindingContext = ViewModel; 21 | 22 | if (ViewModel.IsNewData) 23 | { 24 | for (int i = 0; i < ToolbarItems.Count; i++) 25 | { 26 | if (ToolbarItems[i].Text == "Delete") 27 | { 28 | ToolbarItems.Remove(ToolbarItems[i]); 29 | break; 30 | } 31 | } 32 | } 33 | } 34 | 35 | public DepartmentItemPage() : this(null) 36 | { 37 | } 38 | } 39 | } -------------------------------------------------------------------------------- /Samples/DatabaseTimeStamp/MobileSample/Views/DepartmentListPage.xaml.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using System.Threading.Tasks; 6 | 7 | using Xamarin.Forms; 8 | using Xamarin.Forms.Xaml; 9 | 10 | using MobileSample.ViewModels; 11 | 12 | namespace MobileSample.Views 13 | { 14 | [XamlCompilation(XamlCompilationOptions.Compile)] 15 | public partial class DepartmentListPage : BaseContentPage 16 | { 17 | public DepartmentListPage() : base(null) 18 | { 19 | InitializeComponent(); 20 | BindingContext = ViewModel; 21 | } 22 | } 23 | } -------------------------------------------------------------------------------- /Samples/DatabaseTimeStamp/MobileSample/Views/EmployeeItemPage.xaml.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using System.Threading.Tasks; 6 | 7 | using Xamarin.Forms; 8 | using Xamarin.Forms.Xaml; 9 | using MobileSample.Models; 10 | using MobileSample.ViewModels; 11 | 12 | namespace MobileSample.Views 13 | { 14 | [XamlCompilation(XamlCompilationOptions.Compile)] 15 | public partial class EmployeeItemPage : BaseContentPage 16 | { 17 | public EmployeeItemPage(object initData) : base(initData) 18 | { 19 | InitializeComponent(); 20 | BindingContext = ViewModel; 21 | 22 | if (ViewModel.IsNewData) 23 | { 24 | for (int i = 0; i < ToolbarItems.Count; i++) 25 | { 26 | if (ToolbarItems[i].Text == "Delete") 27 | { 28 | ToolbarItems.Remove(ToolbarItems[i]); 29 | break; 30 | } 31 | } 32 | } 33 | } 34 | 35 | public EmployeeItemPage() : this(null) 36 | { 37 | } 38 | } 39 | } -------------------------------------------------------------------------------- /Samples/DatabaseTimeStamp/MobileSample/Views/EmployeeListPage.xaml.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using System.Threading.Tasks; 6 | 7 | using Xamarin.Forms; 8 | using Xamarin.Forms.Xaml; 9 | 10 | using MobileSample.ViewModels; 11 | 12 | namespace MobileSample.Views 13 | { 14 | [XamlCompilation(XamlCompilationOptions.Compile)] 15 | public partial class EmployeeListPage : BaseContentPage 16 | { 17 | public EmployeeListPage() : base(null) 18 | { 19 | InitializeComponent(); 20 | BindingContext = ViewModel; 21 | } 22 | } 23 | } -------------------------------------------------------------------------------- /Samples/DatabaseTimeStamp/MobileSample/Views/MainPage.xaml: -------------------------------------------------------------------------------- 1 |  2 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /Samples/DatabaseTimeStamp/MobileSample/Views/MenuPage.xaml: -------------------------------------------------------------------------------- 1 |  2 | 6 | 7 | 9 | 10 | 11 | 12 | 13 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /Samples/DatabaseTimeStamp/MobileSample/Views/MenuPage.xaml.cs: -------------------------------------------------------------------------------- 1 | using MobileSample.Models; 2 | using System; 3 | using System.Collections.Generic; 4 | 5 | using Xamarin.Forms; 6 | using Xamarin.Forms.Xaml; 7 | 8 | namespace MobileSample.Views 9 | { 10 | [XamlCompilation(XamlCompilationOptions.Compile)] 11 | public partial class MenuPage : ContentPage 12 | { 13 | MainPage RootPage { get => Application.Current.MainPage as MainPage; } 14 | List menuItems; 15 | 16 | public MenuPage() 17 | { 18 | InitializeComponent(); 19 | 20 | menuItems = MainMenuItem.GetMenus(); 21 | 22 | ListViewMenu.ItemsSource = menuItems; 23 | 24 | ListViewMenu.SelectedItem = menuItems[0]; 25 | 26 | ListViewMenu.ItemSelected += async (sender, e) => 27 | { 28 | if (e.SelectedItem == null) 29 | return; 30 | 31 | var id = (int)((MainMenuItem)e.SelectedItem).Id; 32 | await RootPage.NavigateFromMenu(id); 33 | }; 34 | } 35 | } 36 | } -------------------------------------------------------------------------------- /Samples/DatabaseTimeStamp/MobileSample/Views/SetupPage.xaml: -------------------------------------------------------------------------------- 1 |  2 | 9 | 10 | 11 | 12 |