فهرست منبع

initial commit

robert2206 8 سال پیش
کامیت
f7c16d9800
100فایلهای تغییر یافته به همراه1382 افزوده شده و 0 حذف شده
  1. 17 0
      .editorconfig
  2. 34 0
      .gitignore
  3. 39 0
      config.xml
  4. 12 0
      ionic.config.json
  5. 48 0
      package.json
  6. BIN
      resources/android/icon/drawable-hdpi-icon.png
  7. BIN
      resources/android/icon/drawable-ldpi-icon.png
  8. BIN
      resources/android/icon/drawable-mdpi-icon.png
  9. BIN
      resources/android/icon/drawable-xhdpi-icon.png
  10. BIN
      resources/android/icon/drawable-xxhdpi-icon.png
  11. BIN
      resources/android/icon/drawable-xxxhdpi-icon.png
  12. BIN
      resources/android/splash/drawable-land-hdpi-screen.png
  13. BIN
      resources/android/splash/drawable-land-ldpi-screen.png
  14. BIN
      resources/android/splash/drawable-land-mdpi-screen.png
  15. BIN
      resources/android/splash/drawable-land-xhdpi-screen.png
  16. BIN
      resources/android/splash/drawable-land-xxhdpi-screen.png
  17. BIN
      resources/android/splash/drawable-land-xxxhdpi-screen.png
  18. BIN
      resources/android/splash/drawable-port-hdpi-screen.png
  19. BIN
      resources/android/splash/drawable-port-ldpi-screen.png
  20. BIN
      resources/android/splash/drawable-port-mdpi-screen.png
  21. BIN
      resources/android/splash/drawable-port-xhdpi-screen.png
  22. BIN
      resources/android/splash/drawable-port-xxhdpi-screen.png
  23. BIN
      resources/android/splash/drawable-port-xxxhdpi-screen.png
  24. BIN
      resources/icon.png
  25. BIN
      resources/ios/icon/icon-40.png
  26. BIN
      resources/ios/icon/icon-40@2x.png
  27. BIN
      resources/ios/icon/icon-40@3x.png
  28. BIN
      resources/ios/icon/icon-50.png
  29. BIN
      resources/ios/icon/icon-50@2x.png
  30. BIN
      resources/ios/icon/icon-60.png
  31. BIN
      resources/ios/icon/icon-60@2x.png
  32. BIN
      resources/ios/icon/icon-60@3x.png
  33. BIN
      resources/ios/icon/icon-72.png
  34. BIN
      resources/ios/icon/icon-72@2x.png
  35. BIN
      resources/ios/icon/icon-76.png
  36. BIN
      resources/ios/icon/icon-76@2x.png
  37. BIN
      resources/ios/icon/icon-83.5@2x.png
  38. BIN
      resources/ios/icon/icon-small.png
  39. BIN
      resources/ios/icon/icon-small@2x.png
  40. BIN
      resources/ios/icon/icon-small@3x.png
  41. BIN
      resources/ios/icon/icon.png
  42. BIN
      resources/ios/icon/icon@2x.png
  43. BIN
      resources/ios/splash/Default-568h@2x~iphone.png
  44. BIN
      resources/ios/splash/Default-667h.png
  45. BIN
      resources/ios/splash/Default-736h.png
  46. BIN
      resources/ios/splash/Default-Landscape-736h.png
  47. BIN
      resources/ios/splash/Default-Landscape@2x~ipad.png
  48. BIN
      resources/ios/splash/Default-Landscape~ipad.png
  49. BIN
      resources/ios/splash/Default-Portrait@2x~ipad.png
  50. BIN
      resources/ios/splash/Default-Portrait~ipad.png
  51. BIN
      resources/ios/splash/Default@2x~iphone.png
  52. BIN
      resources/ios/splash/Default~iphone.png
  53. BIN
      resources/splash.png
  54. 90 0
      src/app/app.component.ts
  55. 27 0
      src/app/app.html
  56. 52 0
      src/app/app.module.ts
  57. 16 0
      src/app/app.scss
  58. 5 0
      src/app/main.ts
  59. BIN
      src/assets/icon/favicon.ico
  60. BIN
      src/assets/images/logo.png
  61. 14 0
      src/declarations.d.ts
  62. 5 0
      src/enums/doc-status.ts
  63. 41 0
      src/index.html
  64. 13 0
      src/manifest.json
  65. 18 0
      src/pages/about/about.html
  66. 3 0
      src/pages/about/about.scss
  67. 22 0
      src/pages/about/about.ts
  68. 18 0
      src/pages/customers/customers.html
  69. 3 0
      src/pages/customers/customers.scss
  70. 22 0
      src/pages/customers/customers.ts
  71. 11 0
      src/pages/home/home.html
  72. 3 0
      src/pages/home/home.scss
  73. 22 0
      src/pages/home/home.ts
  74. 27 0
      src/pages/login/login.html
  75. 60 0
      src/pages/login/login.scss
  76. 74 0
      src/pages/login/login.ts
  77. 18 0
      src/pages/orders/orders.html
  78. 3 0
      src/pages/orders/orders.scss
  79. 22 0
      src/pages/orders/orders.ts
  80. 21 0
      src/pages/page1/page1.html
  81. 3 0
      src/pages/page1/page1.scss
  82. 43 0
      src/pages/page1/page1.ts
  83. 23 0
      src/pages/page2/page2.html
  84. 3 0
      src/pages/page2/page2.scss
  85. 38 0
      src/pages/page2/page2.ts
  86. 18 0
      src/pages/products/products.html
  87. 3 0
      src/pages/products/products.scss
  88. 22 0
      src/pages/products/products.ts
  89. 18 0
      src/pages/tools/tools.html
  90. 3 0
      src/pages/tools/tools.scss
  91. 22 0
      src/pages/tools/tools.ts
  92. 14 0
      src/pipes/menu.ts
  93. 30 0
      src/service-worker.js
  94. 45 0
      src/services/auth-service.ts
  95. 15 0
      src/services/download-service.ts
  96. 94 0
      src/services/odoo-service.ts
  97. 98 0
      src/services/pouch-service.ts
  98. 24 0
      src/services/sync-service.ts
  99. 28 0
      src/services/upload-service.ts
  100. 78 0
      src/theme/variables.scss

+ 17 - 0
.editorconfig

@@ -0,0 +1,17 @@
+# EditorConfig helps developers define and maintain consistent coding styles between different editors and IDEs
+# editorconfig.org
+
+root = true
+
+[*]
+indent_style = space
+indent_size = 2
+
+# We recommend you to keep these unchanged
+end_of_line = lf
+charset = utf-8
+trim_trailing_whitespace = true
+insert_final_newline = true
+
+[*.md]
+trim_trailing_whitespace = false

+ 34 - 0
.gitignore

@@ -0,0 +1,34 @@
+# Specifies intentionally untracked files to ignore when using Git
+# http://git-scm.com/docs/gitignore
+
+*~
+*.sw[mnpcod]
+*.log
+*.tmp
+*.tmp.*
+log.txt
+*.sublime-project
+*.sublime-workspace
+.vscode/
+npm-debug.log*
+
+.idea/
+.sass-cache/
+.tmp/
+.versions/
+coverage/
+dist/
+node_modules/
+tmp/
+temp/
+hooks/
+platforms/
+plugins/
+plugins/android.json
+plugins/ios.json
+www/
+$RECYCLE.BIN/
+
+.DS_Store
+Thumbs.db
+UserInterfaceState.xcuserstate

+ 39 - 0
config.xml

@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<widget id="com.ionicframework.odoomobilev3166502" version="0.0.1" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0">
+  <name>odoo-mobile-v3</name>
+  <description>An awesome Ionic/Cordova app.</description>
+  <author email="hi@ionicframework" href="http://ionicframework.com/">Ionic Framework Team</author>
+  <content src="index.html"/>
+  <access origin="*"/>
+  <allow-navigation href="http://ionic.local/*"/>
+  <allow-intent href="http://*/*"/>
+  <allow-intent href="https://*/*"/>
+  <allow-intent href="tel:*"/>
+  <allow-intent href="sms:*"/>
+  <allow-intent href="mailto:*"/>
+  <allow-intent href="geo:*"/>
+  <platform name="android">
+    <allow-intent href="market:*"/>
+  </platform>
+  <platform name="ios">
+    <allow-intent href="itms:*"/>
+    <allow-intent href="itms-apps:*"/>
+  </platform>
+  <preference name="webviewbounce" value="false"/>
+  <preference name="UIWebViewBounce" value="false"/>
+  <preference name="DisallowOverscroll" value="true"/>
+  <preference name="android-minSdkVersion" value="16"/>
+  <preference name="BackupWebStorage" value="none"/>
+  <preference name="SplashMaintainAspectRatio" value="true"/>
+  <preference name="FadeSplashScreenDuration" value="300"/>
+  <preference name="SplashShowOnlyFirstTime" value="false"/>
+  <feature name="StatusBar">
+    <param name="ios-package" onload="true" value="CDVStatusBar"/>
+  </feature>
+  <plugin name="ionic-plugin-keyboard" spec="~2.2.1"/>
+  <plugin name="cordova-plugin-whitelist" spec="1.3.1"/>
+  <plugin name="cordova-plugin-console" spec="1.0.5"/>
+  <plugin name="cordova-plugin-statusbar" spec="2.2.1"/>
+  <plugin name="cordova-plugin-device" spec="1.1.4"/>
+  <plugin name="cordova-plugin-splashscreen" spec="~4.0.1"/>
+</widget>

+ 12 - 0
ionic.config.json

@@ -0,0 +1,12 @@
+{
+    "name": "odoo-mobile-v3",
+       "app_id": "",
+    "v2": true,
+    "typescript": true,
+    "proxies": [
+        {
+            "path": "/",
+            "proxyUrl": "http://192.168.88.123:8069/"
+        }
+    ]
+}

+ 48 - 0
package.json

@@ -0,0 +1,48 @@
+{
+  "name": "ionic-hello-world",
+  "author": "Ionic Framework",
+  "homepage": "http://ionicframework.com/",
+  "private": true,
+  "scripts": {
+    "clean": "ionic-app-scripts clean",
+    "build": "ionic-app-scripts build",
+    "ionic:build": "ionic-app-scripts build",
+    "ionic:serve": "ionic-app-scripts serve"
+  },
+  "dependencies": {
+    "@angular/common": "2.2.1",
+    "@angular/compiler": "2.2.1",
+    "@angular/compiler-cli": "2.2.1",
+    "@angular/core": "2.2.1",
+    "@angular/forms": "2.2.1",
+    "@angular/http": "2.2.1",
+    "@angular/platform-browser": "2.2.1",
+    "@angular/platform-browser-dynamic": "2.2.1",
+    "@angular/platform-server": "2.2.1",
+    "@ionic/storage": "1.1.7",
+    "angular2-odoo-jsonrpc": "0.0.7",
+    "ionic-angular": "2.0.0",
+    "ionic-native": "2.4.1",
+    "ionicons": "3.0.0",
+    "ng2-validation": "^3.3.0",
+    "pouchdb": "^6.1.2",
+    "pouchdb-find": "^0.10.5",
+    "rxjs": "5.0.0-beta.12",
+    "sw-toolbox": "3.4.0",
+    "zone.js": "0.6.26"
+  },
+  "devDependencies": {
+    "@ionic/app-scripts": "1.0.0",
+    "typescript": "2.0.9"
+  },
+  "cordovaPlugins": [
+    "cordova-plugin-whitelist",
+    "cordova-plugin-console",
+    "cordova-plugin-statusbar",
+    "cordova-plugin-device",
+    "cordova-plugin-splashscreen",
+    "ionic-plugin-keyboard"
+  ],
+  "cordovaPlatforms": [],
+  "description": "odoo-mobile-v3: An Ionic project"
+}

BIN
resources/android/icon/drawable-hdpi-icon.png


BIN
resources/android/icon/drawable-ldpi-icon.png


BIN
resources/android/icon/drawable-mdpi-icon.png


BIN
resources/android/icon/drawable-xhdpi-icon.png


BIN
resources/android/icon/drawable-xxhdpi-icon.png


BIN
resources/android/icon/drawable-xxxhdpi-icon.png


BIN
resources/android/splash/drawable-land-hdpi-screen.png


BIN
resources/android/splash/drawable-land-ldpi-screen.png


BIN
resources/android/splash/drawable-land-mdpi-screen.png


BIN
resources/android/splash/drawable-land-xhdpi-screen.png


BIN
resources/android/splash/drawable-land-xxhdpi-screen.png


BIN
resources/android/splash/drawable-land-xxxhdpi-screen.png


BIN
resources/android/splash/drawable-port-hdpi-screen.png


BIN
resources/android/splash/drawable-port-ldpi-screen.png


BIN
resources/android/splash/drawable-port-mdpi-screen.png


BIN
resources/android/splash/drawable-port-xhdpi-screen.png


BIN
resources/android/splash/drawable-port-xxhdpi-screen.png


BIN
resources/android/splash/drawable-port-xxxhdpi-screen.png


BIN
resources/icon.png


BIN
resources/ios/icon/icon-40.png


BIN
resources/ios/icon/icon-40@2x.png


BIN
resources/ios/icon/icon-40@3x.png


BIN
resources/ios/icon/icon-50.png


BIN
resources/ios/icon/icon-50@2x.png


BIN
resources/ios/icon/icon-60.png


BIN
resources/ios/icon/icon-60@2x.png


BIN
resources/ios/icon/icon-60@3x.png


BIN
resources/ios/icon/icon-72.png


BIN
resources/ios/icon/icon-72@2x.png


BIN
resources/ios/icon/icon-76.png


BIN
resources/ios/icon/icon-76@2x.png


BIN
resources/ios/icon/icon-83.5@2x.png


BIN
resources/ios/icon/icon-small.png


BIN
resources/ios/icon/icon-small@2x.png


BIN
resources/ios/icon/icon-small@3x.png


BIN
resources/ios/icon/icon.png


BIN
resources/ios/icon/icon@2x.png


BIN
resources/ios/splash/Default-568h@2x~iphone.png


BIN
resources/ios/splash/Default-667h.png


BIN
resources/ios/splash/Default-736h.png


BIN
resources/ios/splash/Default-Landscape-736h.png


BIN
resources/ios/splash/Default-Landscape@2x~ipad.png


BIN
resources/ios/splash/Default-Landscape~ipad.png


BIN
resources/ios/splash/Default-Portrait@2x~ipad.png


BIN
resources/ios/splash/Default-Portrait~ipad.png


BIN
resources/ios/splash/Default@2x~iphone.png


BIN
resources/ios/splash/Default~iphone.png


BIN
resources/splash.png


+ 90 - 0
src/app/app.component.ts

@@ -0,0 +1,90 @@
+import { Component, ViewChild } from '@angular/core';
+import { Nav, Platform } from 'ionic-angular';
+import { StatusBar, Splashscreen } from 'ionic-native';
+
+import { Page1 } from '../pages/page1/page1';
+import { Page2 } from '../pages/page2/page2';
+import { LoginPage } from "../pages/login/login";
+import { HomePage } from "../pages/home/home";
+import { CustomersPage } from "../pages/customers/customers";
+import { ProductsPage } from "../pages/products/products";
+import { OrdersPage } from "../pages/orders/orders";
+import { ToolsPage } from "../pages/tools/tools";
+import { AboutPage } from "../pages/about/about";
+
+@Component({
+  templateUrl: 'app.html'
+})
+export class MyApp {
+    @ViewChild(Nav) nav: Nav;
+
+    rootPage: any = LoginPage;
+    homePage: any = HomePage;
+    entries: Array<{ visible: boolean, title: string, pages: Array<{ visible: boolean, title: string, icon: string, component: any }> }>;
+
+    pages: Array<{title: string, component: any}>;
+
+    constructor(public platform: Platform) {
+        this.initializeApp();
+
+        this.entries = [
+            {
+                visible: true,
+                title: "Ventas",
+                pages: [
+                    {
+                        visible: true,
+                        title: "Clientes",
+                        icon: "people",
+                        component: CustomersPage
+                    },
+                    {
+                        visible: true,
+                        title: "Presupuestos",
+                        icon: "basket",
+                        component: OrdersPage 
+                    },
+                    {
+                        visible: true,
+                        title: 'Productos',
+                        icon: "cube",
+                        component: ProductsPage
+                    },
+                ]
+            },
+            {
+                visible: true,
+                title: "Herramientas",
+                pages: [
+                    {
+                        visible: true,
+                        title: 'Herramientas',
+                        icon: "build",
+                        component: ToolsPage
+                    },
+                    {
+                        visible: true,
+                        title: "Acerca",
+                        icon: "information-circle",
+                        component: AboutPage
+                    }
+                ]
+            }
+        ];
+    }
+
+    initializeApp() {
+        this.platform.ready().then(() => {
+        // Okay, so the platform is ready and our plugins are available.
+        // Here you can do any higher level native things you might need.
+            StatusBar.styleDefault();
+            Splashscreen.hide();
+        });
+    }
+
+    openPage(page) {
+        // Reset the content nav to have just this page
+        // we wouldn't want the back button to show in this scenario
+        this.nav.setRoot(page.component);
+    }
+}

+ 27 - 0
src/app/app.html

@@ -0,0 +1,27 @@
+<ion-menu [content]="content">
+    <ion-header>
+        <ion-toolbar>
+            <ion-title>Menú</ion-title>
+        </ion-toolbar>
+    </ion-header>
+
+    <ion-content>
+        <ion-list inset>
+            <button ion-item menuClose (click)="nav.setRoot(homePage)">
+                <ion-icon color="primary" name="home" style="padding-right: 25px;"></ion-icon>
+                Inicio
+            </button>
+
+            <div *ngFor="let e of (entries | menu: true)">
+                <ion-list-header>{{ e.title }}</ion-list-header>
+                <button ion-item menuClose *ngFor="let p of (e.pages | menu: true)" (click)="openPage(p)">
+                    <ion-icon color="primary" name="{{ p.icon }}" style="padding-right: 25px;"></ion-icon>
+                    {{ p.title }}
+                </button>
+            </div>
+        </ion-list>
+    </ion-content>
+</ion-menu>
+
+<!-- Disable swipe-to-go-back because it's poor UX to combine STGB with side menus -->
+<ion-nav [root]="rootPage" #content swipeBackEnabled="false"></ion-nav>

+ 52 - 0
src/app/app.module.ts

@@ -0,0 +1,52 @@
+import { NgModule, ErrorHandler } from "@angular/core";
+import { ReactiveFormsModule } from "@angular/forms";
+import { IonicApp, IonicModule, IonicErrorHandler } from "ionic-angular";
+import { MyApp } from "./app.component";
+
+// Pages
+import { LoginPage } from "../pages/login/login";
+import { HomePage } from "../pages/home/home";
+import { Page1 } from '../pages/page1/page1';
+import { Page2 } from '../pages/page2/page2';
+
+// Services
+import { OdooRPCService } from "angular2-odoo-jsonrpc";
+import { AuthService } from "../services/auth-service";
+import { OdooService } from "../services/odoo-service";
+import { PouchService } from "../services/pouch-service";
+
+// Pipes
+import { MenuPipe } from "../pipes/menu";
+
+@NgModule({
+    declarations: [
+        MyApp,
+        // Pages
+        LoginPage,
+        HomePage,
+        Page1,
+        Page2,
+        // Pipes
+        MenuPipe
+    ],
+    imports: [
+        IonicModule.forRoot(MyApp),
+        ReactiveFormsModule
+    ],
+    bootstrap: [IonicApp],
+    entryComponents: [
+        MyApp,
+        LoginPage,
+        HomePage,
+        Page1,
+        Page2
+    ],
+    providers: [
+        OdooRPCService,
+        AuthService,
+        OdooService,
+        PouchService,
+        { provide: ErrorHandler, useClass: IonicErrorHandler }
+    ]
+})
+export class AppModule {}

+ 16 - 0
src/app/app.scss

@@ -0,0 +1,16 @@
+// http://ionicframework.com/docs/v2/theming/
+
+
+// App Global Sass
+// --------------------------------------------------
+// Put style rules here that you want to apply globally. These
+// styles are for the entire app and not just one component.
+// Additionally, this file can be also used as an entry point
+// to import other Sass files to be included in the output CSS.
+//
+// Shared Sass variables, which can be used to adjust Ionic's
+// default Sass variables, belong in "theme/variables.scss".
+//
+// To declare rules for a specific mode, create a child rule
+// for the .md, .ios, or .wp mode classes. The mode class is
+// automatically applied to the <body> element in the app.

+ 5 - 0
src/app/main.ts

@@ -0,0 +1,5 @@
+import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
+
+import { AppModule } from './app.module';
+
+platformBrowserDynamic().bootstrapModule(AppModule);

BIN
src/assets/icon/favicon.ico


BIN
src/assets/images/logo.png


+ 14 - 0
src/declarations.d.ts

@@ -0,0 +1,14 @@
+/*
+  Declaration files are how the Typescript compiler knows about the type information(or shape) of an object.
+  They're what make intellisense work and make Typescript know all about your code.
+
+  A wildcard module is declared below to allow third party libraries to be used in an app even if they don't
+  provide their own type declarations.
+
+  To learn more about using third party libraries in an Ionic app, check out the docs here:
+  http://ionicframework.com/docs/v2/resources/third-party-libs/
+
+  For more info on type definition files, check out the Typescript docs here:
+  https://www.typescriptlang.org/docs/handbook/declaration-files/introduction.html
+*/
+declare module '*';

+ 5 - 0
src/enums/doc-status.ts

@@ -0,0 +1,5 @@
+export const enum DocStatus {
+    Created = 1,
+    Updated = 2,
+    Deleted = 3
+}

+ 41 - 0
src/index.html

@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<html lang="en" dir="ltr">
+<head>
+  <meta charset="UTF-8">
+  <title>Ionic App</title>
+  <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no">
+  <meta name="format-detection" content="telephone=no">
+  <meta name="msapplication-tap-highlight" content="no">
+
+  <link rel="icon" type="image/x-icon" href="assets/icon/favicon.ico">
+  <link rel="manifest" href="manifest.json">
+  <meta name="theme-color" content="#4e8ef7">
+  
+  <!-- cordova.js required for cordova apps -->
+  <script src="cordova.js"></script>
+
+  <!-- un-comment this code to enable service worker
+  <script>
+    if ('serviceWorker' in navigator) {
+      navigator.serviceWorker.register('service-worker.js')
+        .then(() => console.log('service worker installed'))
+        .catch(err => console.log('Error', err));
+    }
+  </script>-->
+
+  <link href="build/main.css" rel="stylesheet">
+
+</head>
+<body>
+
+  <!-- Ionic's root component and where the app will load -->
+  <ion-app></ion-app>
+
+  <!-- The polyfills js is generated during the build process -->
+  <script src="build/polyfills.js"></script>
+
+  <!-- The bundle js is generated during the build process -->
+  <script src="build/main.js"></script>
+
+</body>
+</html>

+ 13 - 0
src/manifest.json

@@ -0,0 +1,13 @@
+{
+  "name": "Ionic",
+  "short_name": "Ionic",
+  "start_url": "index.html",
+  "display": "standalone",
+  "icons": [{
+    "src": "assets/imgs/logo.png",
+    "sizes": "512x512",
+    "type": "image/png"
+  }],
+  "background_color": "#4e8ef7",
+  "theme_color": "#4e8ef7"
+}

+ 18 - 0
src/pages/about/about.html

@@ -0,0 +1,18 @@
+<!--
+  Generated template for the About page.
+
+  See http://ionicframework.com/docs/v2/components/#navigation for more info on
+  Ionic pages and navigation.
+-->
+<ion-header>
+
+  <ion-navbar>
+    <ion-title>about</ion-title>
+  </ion-navbar>
+
+</ion-header>
+
+
+<ion-content padding>
+
+</ion-content>

+ 3 - 0
src/pages/about/about.scss

@@ -0,0 +1,3 @@
+page-about {
+
+}

+ 22 - 0
src/pages/about/about.ts

@@ -0,0 +1,22 @@
+import { Component } from '@angular/core';
+import { NavController, NavParams } from 'ionic-angular';
+
+/*
+  Generated class for the About page.
+
+  See http://ionicframework.com/docs/v2/components/#navigation for more info on
+  Ionic pages and navigation.
+*/
+@Component({
+  selector: 'page-about',
+  templateUrl: 'about.html'
+})
+export class AboutPage {
+
+  constructor(public navCtrl: NavController, public navParams: NavParams) {}
+
+  ionViewDidLoad() {
+    console.log('ionViewDidLoad AboutPage');
+  }
+
+}

+ 18 - 0
src/pages/customers/customers.html

@@ -0,0 +1,18 @@
+<!--
+  Generated template for the Customers page.
+
+  See http://ionicframework.com/docs/v2/components/#navigation for more info on
+  Ionic pages and navigation.
+-->
+<ion-header>
+
+  <ion-navbar>
+    <ion-title>customers</ion-title>
+  </ion-navbar>
+
+</ion-header>
+
+
+<ion-content padding>
+
+</ion-content>

+ 3 - 0
src/pages/customers/customers.scss

@@ -0,0 +1,3 @@
+page-customers {
+
+}

+ 22 - 0
src/pages/customers/customers.ts

@@ -0,0 +1,22 @@
+import { Component } from '@angular/core';
+import { NavController, NavParams } from 'ionic-angular';
+
+/*
+  Generated class for the Customers page.
+
+  See http://ionicframework.com/docs/v2/components/#navigation for more info on
+  Ionic pages and navigation.
+*/
+@Component({
+  selector: 'page-customers',
+  templateUrl: 'customers.html'
+})
+export class CustomersPage {
+
+  constructor(public navCtrl: NavController, public navParams: NavParams) {}
+
+  ionViewDidLoad() {
+    console.log('ionViewDidLoad CustomersPage');
+  }
+
+}

+ 11 - 0
src/pages/home/home.html

@@ -0,0 +1,11 @@
+<ion-header>
+
+    <ion-navbar>
+        <ion-title>Home</ion-title>
+    </ion-navbar>
+
+</ion-header>
+
+<ion-content padding>
+
+</ion-content>

+ 3 - 0
src/pages/home/home.scss

@@ -0,0 +1,3 @@
+page-home {
+
+}

+ 22 - 0
src/pages/home/home.ts

@@ -0,0 +1,22 @@
+import { Component } from '@angular/core';
+import { NavController, NavParams } from 'ionic-angular';
+
+/*
+  Generated class for the Home page.
+
+  See http://ionicframework.com/docs/v2/components/#navigation for more info on
+  Ionic pages and navigation.
+*/
+@Component({
+  selector: 'page-home',
+  templateUrl: 'home.html'
+})
+export class HomePage {
+
+  constructor(public navCtrl: NavController, public navParams: NavParams) {}
+
+  ionViewDidLoad() {
+    console.log('ionViewDidLoad HomePage');
+  }
+
+}

+ 27 - 0
src/pages/login/login.html

@@ -0,0 +1,27 @@
+<ion-content padding>
+    <img class="pulse" src="./assets/images/logo.png" />
+
+    <form [formGroup]="loginForm" (ngSubmit)="signin(loginForm.value)">
+        <ion-item>
+            <ion-icon name="desktop" item-left></ion-icon>
+            <ion-input type="url" placeholder="URL del servidor" formControlName="host"></ion-input>
+        </ion-item>
+
+        <ion-item>
+            <ion-icon name="cloud" item-left></ion-icon>
+            <ion-input type="text" placeholder="Base de Datos" formControlName="database"></ion-input>
+        </ion-item>
+
+        <ion-item>
+            <ion-icon name="person" item-left></ion-icon>
+            <ion-input type="text" placeholder="Usuario o email" formControlName="username"></ion-input>
+        </ion-item>
+
+        <ion-item>
+            <ion-icon name="unlock" item-left></ion-icon>
+            <ion-input type="password" placeholder="Contraseña" formControlName="password"></ion-input>
+        </ion-item>
+
+        <button ion-button block type="submit" [disabled]="!loginForm.valid">Entrar</button>
+    </form>
+</ion-content>

+ 60 - 0
src/pages/login/login.scss

@@ -0,0 +1,60 @@
+page-login {
+    ion-content {
+        background: #3f50b4 !important;
+    }
+
+    img {
+        display: block;
+        width: 13.4rem;
+        margin: 50px auto;
+        filter: brightness(0) invert(1);
+    }
+
+    ion-item {
+        border-radius: 2px !important;
+        margin-bottom: 2px !important;
+    }
+
+    .item-inner {
+        margin-left: 5px !important;
+    }
+
+    .item-icon {
+        color: #d3d3d3 !important;
+    }
+
+    @keyframes pulse_animation {
+	    0% { 
+            transform: scale(1); 
+        }
+	    30% {
+            transform: scale(1);
+        }
+	    40% { 
+            transform: scale(1.08);
+        }
+	    50% {
+            transform: scale(1);
+        }
+	    60% { 
+            transform: scale(1);
+        }
+	    70% {
+            transform: scale(1.05);
+        }
+	    80% {
+            transform: scale(1);
+        }
+	    100% {
+            transform: scale(1);
+        }
+    }
+
+    .pulse {
+	    animation-name: pulse_animation;
+	    animation-duration: 5000ms;
+	    transform-origin: 70% 70%;
+	    animation-iteration-count: infinite;
+	    animation-timing-function: linear;
+    }
+}

+ 74 - 0
src/pages/login/login.ts

@@ -0,0 +1,74 @@
+import { Component, OnInit } from '@angular/core';
+import { NavController, MenuController, LoadingController, Loading, AlertController, NavParams } from 'ionic-angular';
+import { Validators, FormGroup, FormBuilder } from "@angular/forms";
+
+import { AuthService } from "../../services/auth-service";
+import { PouchService } from "../../services/pouch-service";
+
+@Component({
+  	selector: 'page-login',
+  	templateUrl: 'login.html'
+})
+export class LoginPage implements OnInit {
+	
+	loader: Loading;
+	loginForm: FormGroup;
+
+	constructor(
+		public navCtrl: NavController,
+		public menuCtrl: MenuController,
+		public loadingCtrl: LoadingController,
+		public alertCtrl: AlertController,
+		public navParams: NavParams,
+		public formBuilder: FormBuilder,
+		public auth: AuthService,
+		public pouch: PouchService
+	) { 
+		this.loginForm = this.formBuilder.group({
+			host: ['http://localhost:8100', Validators.required],
+			database: ['odoo', Validators.required],
+			username: ['admin', Validators.required],
+			password: ['admin', Validators.required],
+		});
+	}
+
+	/**
+	 *
+	 */
+	ionViewDidLoad() {
+		this.menuCtrl.enable(false);
+	}
+
+	/**
+	 *
+	 */
+	ngOnInit() {
+		console.log('init');
+	}
+	
+	/**
+	 *
+	 */
+	signin(login): void {
+		this.loader = this.loadingCtrl.create({
+			content: "Identificando usuario, espere..."
+		});
+		this.loader.present();
+
+		this.auth.initialize(login.host);
+		this.auth.login(login.database, login.username, login.password).subscribe(response => {
+			this.loader.dismiss();
+			console.log(response);
+		}, error => { 
+			this.loader.dismiss();
+
+			this.alertCtrl.create({
+				title: 'Atención',
+				message: 'No se puede conectar al servidor',
+				buttons: [
+					'Aceptar'
+				]
+			}).present();
+		});
+	}
+}

+ 18 - 0
src/pages/orders/orders.html

@@ -0,0 +1,18 @@
+<!--
+  Generated template for the Orders page.
+
+  See http://ionicframework.com/docs/v2/components/#navigation for more info on
+  Ionic pages and navigation.
+-->
+<ion-header>
+
+  <ion-navbar>
+    <ion-title>orders</ion-title>
+  </ion-navbar>
+
+</ion-header>
+
+
+<ion-content padding>
+
+</ion-content>

+ 3 - 0
src/pages/orders/orders.scss

@@ -0,0 +1,3 @@
+page-orders {
+
+}

+ 22 - 0
src/pages/orders/orders.ts

@@ -0,0 +1,22 @@
+import { Component } from '@angular/core';
+import { NavController, NavParams } from 'ionic-angular';
+
+/*
+  Generated class for the Orders page.
+
+  See http://ionicframework.com/docs/v2/components/#navigation for more info on
+  Ionic pages and navigation.
+*/
+@Component({
+  selector: 'page-orders',
+  templateUrl: 'orders.html'
+})
+export class OrdersPage {
+
+  constructor(public navCtrl: NavController, public navParams: NavParams) {}
+
+  ionViewDidLoad() {
+    console.log('ionViewDidLoad OrdersPage');
+  }
+
+}

+ 21 - 0
src/pages/page1/page1.html

@@ -0,0 +1,21 @@
+<ion-header>
+  <ion-navbar>
+    <button ion-button menuToggle>
+      <ion-icon name="menu"></ion-icon>
+    </button>
+    <ion-title>Page One</ion-title>
+  </ion-navbar>
+</ion-header>
+
+<ion-content padding>
+  <h3>Ionic Menu Starter</h3>
+
+  <p>
+    If you get lost, the <a href="http://ionicframework.com/docs/v2">docs</a> will show you the way.
+  </p>
+
+  <button ion-button secondary menuToggle>Toggle Menu</button>
+
+  <button ion-button (click)="testLogin($event)">Login</button>
+  <button ion-button (click)="testCall($event)">Call</button>
+</ion-content>

+ 3 - 0
src/pages/page1/page1.scss

@@ -0,0 +1,3 @@
+page-page1 {
+
+}

+ 43 - 0
src/pages/page1/page1.ts

@@ -0,0 +1,43 @@
+import { Component } from '@angular/core';
+import { NavController } from 'ionic-angular';
+
+import { AuthService } from "../../services/auth-service";
+import { OdooService } from "../../services/odoo-service";
+import { PouchService } from "../../services/pouch-service";
+
+@Component({
+    selector: 'page-page1',
+    templateUrl: 'page1.html'
+})
+export class Page1 {
+
+    constructor(
+        public navCtrl: NavController,
+        public auth: AuthService,
+        public odoo: OdooService,
+        public pouch: PouchService
+    ) { 
+        auth.initialize("http://localhost", 8100);
+    }
+
+    /**
+     *
+     */
+    testLogin(e) {
+        this.auth.login("odoo", "admin", "admin").subscribe(data => { 
+            console.log(data);
+        }, err => { 
+            console.log(err);
+        });
+    }
+
+    /**
+     *
+     */
+    testCall(e) {
+        this.odoo.checkAccessRights('res.partner', ['read']).subscribe(result => {
+            console.log(result);
+            
+        });
+    }
+}

+ 23 - 0
src/pages/page2/page2.html

@@ -0,0 +1,23 @@
+<ion-header>
+  <ion-navbar>
+    <button ion-button menuToggle>
+      <ion-icon name="menu"></ion-icon>
+    </button>
+    <ion-title>Page Two</ion-title>
+  </ion-navbar>
+</ion-header>
+
+<ion-content>
+  <ion-list>
+    <button ion-item *ngFor="let item of items" (click)="itemTapped($event, item)">
+      <ion-icon [name]="item.icon" item-left></ion-icon>
+      {{item.title}}
+      <div class="item-note" item-right>
+        {{item.note}}
+      </div>
+    </button>
+  </ion-list>
+  <div *ngIf="selectedItem" padding>
+    You navigated here from <b>{{selectedItem.title}}</b>
+  </div>
+</ion-content>

+ 3 - 0
src/pages/page2/page2.scss

@@ -0,0 +1,3 @@
+page-page2 {
+
+}

+ 38 - 0
src/pages/page2/page2.ts

@@ -0,0 +1,38 @@
+import { Component } from '@angular/core';
+
+import { NavController, NavParams } from 'ionic-angular';
+
+@Component({
+  selector: 'page-page2',
+  templateUrl: 'page2.html'
+})
+export class Page2 {
+  selectedItem: any;
+  icons: string[];
+  items: Array<{title: string, note: string, icon: string}>;
+
+  constructor(public navCtrl: NavController, public navParams: NavParams) {
+    // If we navigated to this page, we will have an item available as a nav param
+    this.selectedItem = navParams.get('item');
+
+    // Let's populate this page with some filler content for funzies
+    this.icons = ['flask', 'wifi', 'beer', 'football', 'basketball', 'paper-plane',
+    'american-football', 'boat', 'bluetooth', 'build'];
+
+    this.items = [];
+    for (let i = 1; i < 11; i++) {
+      this.items.push({
+        title: 'Item ' + i,
+        note: 'This is item #' + i,
+        icon: this.icons[Math.floor(Math.random() * this.icons.length)]
+      });
+    }
+  }
+
+  itemTapped(event, item) {
+    // That's right, we're pushing to ourselves!
+    this.navCtrl.push(Page2, {
+      item: item
+    });
+  }
+}

+ 18 - 0
src/pages/products/products.html

@@ -0,0 +1,18 @@
+<!--
+  Generated template for the Products page.
+
+  See http://ionicframework.com/docs/v2/components/#navigation for more info on
+  Ionic pages and navigation.
+-->
+<ion-header>
+
+  <ion-navbar>
+    <ion-title>products</ion-title>
+  </ion-navbar>
+
+</ion-header>
+
+
+<ion-content padding>
+
+</ion-content>

+ 3 - 0
src/pages/products/products.scss

@@ -0,0 +1,3 @@
+page-products {
+
+}

+ 22 - 0
src/pages/products/products.ts

@@ -0,0 +1,22 @@
+import { Component } from '@angular/core';
+import { NavController, NavParams } from 'ionic-angular';
+
+/*
+  Generated class for the Products page.
+
+  See http://ionicframework.com/docs/v2/components/#navigation for more info on
+  Ionic pages and navigation.
+*/
+@Component({
+  selector: 'page-products',
+  templateUrl: 'products.html'
+})
+export class ProductsPage {
+
+  constructor(public navCtrl: NavController, public navParams: NavParams) {}
+
+  ionViewDidLoad() {
+    console.log('ionViewDidLoad ProductsPage');
+  }
+
+}

+ 18 - 0
src/pages/tools/tools.html

@@ -0,0 +1,18 @@
+<!--
+  Generated template for the Tools page.
+
+  See http://ionicframework.com/docs/v2/components/#navigation for more info on
+  Ionic pages and navigation.
+-->
+<ion-header>
+
+  <ion-navbar>
+    <ion-title>tools</ion-title>
+  </ion-navbar>
+
+</ion-header>
+
+
+<ion-content padding>
+
+</ion-content>

+ 3 - 0
src/pages/tools/tools.scss

@@ -0,0 +1,3 @@
+page-tools {
+
+}

+ 22 - 0
src/pages/tools/tools.ts

@@ -0,0 +1,22 @@
+import { Component } from '@angular/core';
+import { NavController, NavParams } from 'ionic-angular';
+
+/*
+  Generated class for the Tools page.
+
+  See http://ionicframework.com/docs/v2/components/#navigation for more info on
+  Ionic pages and navigation.
+*/
+@Component({
+  selector: 'page-tools',
+  templateUrl: 'tools.html'
+})
+export class ToolsPage {
+
+  constructor(public navCtrl: NavController, public navParams: NavParams) {}
+
+  ionViewDidLoad() {
+    console.log('ionViewDidLoad ToolsPage');
+  }
+
+}

+ 14 - 0
src/pipes/menu.ts

@@ -0,0 +1,14 @@
+import { Injectable, Pipe, PipeTransform } from '@angular/core';
+
+@Pipe({
+  	name: 'menu'
+})
+@Injectable()
+export class MenuPipe implements PipeTransform {
+  
+    transform(menus: Array<any>, visible: boolean) {
+        return menus.filter(item => { 
+            return item.visible == visible;
+        });
+    }
+}

+ 30 - 0
src/service-worker.js

@@ -0,0 +1,30 @@
+/**
+ * Check out https://googlechrome.github.io/sw-toolbox/docs/master/index.html for
+ * more info on how to use sw-toolbox to custom configure your service worker.
+ */
+
+
+'use strict';
+importScripts('./build/sw-toolbox.js');
+
+self.toolbox.options.cache = {
+  name: 'ionic-cache'
+};
+
+// pre-cache our key assets
+self.toolbox.precache(
+  [
+    './build/main.js',
+    './build/main.css',
+    './build/polyfills.js',
+    'index.html',
+    'manifest.json'
+  ]
+);
+
+// dynamically cache any other local assets
+self.toolbox.router.any('/*', self.toolbox.cacheFirst);
+
+// for any other requests go to the network, cache,
+// and then only use that cached resource if your user goes offline
+self.toolbox.router.default = self.toolbox.networkFirst;

+ 45 - 0
src/services/auth-service.ts

@@ -0,0 +1,45 @@
+import { Injectable } from "@angular/core";
+import { Observable } from "rxjs/Observable";
+import { Observer } from "rxjs/Observer";
+import { OdooRPCService } from "angular2-odoo-jsonrpc";
+
+import 'rxjs/add/observable/throw'
+import "rxjs/add/observable/fromPromise";
+
+@Injectable()
+export class AuthService {
+
+    constructor(
+        public odooRPC: OdooRPCService
+    ) { }
+
+    /**
+     *
+     */
+    initialize(url: string, port?: number) {
+        let host = url;
+
+        if (port) {
+            host = host + ":" + port;
+        }
+        
+        this.odooRPC.init({
+            odoo_server: host,
+            http_auth: "username:password"
+        });
+    }
+
+    /**
+     *
+     */
+    login(database: string, username: string, password: string): Observable<any> {
+        return Observable.fromPromise(this.odooRPC.login(database, username, password));
+    }
+
+    /**
+     *
+     */
+    logout(): Observable<any> {
+        return Observable.fromPromise(this.odooRPC.logout());
+    }
+}

+ 15 - 0
src/services/download-service.ts

@@ -0,0 +1,15 @@
+import { Injectable } from "@angular/core";
+import { Observable } from "rxjs/Observable";
+import { Observer } from "rxjs/Observer";
+
+@Injectable()
+export class DownloadService {
+
+    constructor() { }
+
+    do(): Observable<any> {
+        return Observable.create((observer: Observer<any>) => { 
+            
+        });
+    }
+}

+ 94 - 0
src/services/odoo-service.ts

@@ -0,0 +1,94 @@
+import { Injectable } from "@angular/core";
+import { OdooRPCService } from "angular2-odoo-jsonrpc";
+import { Observable } from "rxjs/Observable";
+import { Observer } from "rxjs/Observer";
+
+@Injectable()
+export class OdooService {
+
+    constructor(
+        private odooRPC: OdooRPCService
+    ) { }
+
+    /**
+     * Example:
+     * instance.searchRead('res.partner', [[['is_company', '=', true], ['customer', '=', true]]], { 'fields': ['name', 'comment']})
+     */
+    searchRead(model: string, domain: any, fields: any): Observable<any> {
+        return Observable.create((observer: Observer<any>) => { 
+            this.odooRPC.searchRead(model, domain, fields).then(response => { 
+                observer.next(response);
+                observer.complete();
+            }).catch(error => observer.error(error));
+        });
+    }
+
+    /**
+     * Example:
+     * instance.call('res.partner', 'search', [[['customer', '=', true], ['is_company', '=', false]]], { 'limit': 1})
+     */
+    call(model: string, method: string, args: any, kwargs?: any): Observable<any> {
+        return Observable.create((observer: Observer<any>) => {
+            this.odooRPC.call(model, method, args, kwargs).then(response => { 
+                observer.next(response);
+                observer.complete();
+            }).then(error => observer.error(error));
+        });
+    }
+
+    /**
+     * Example:
+     * instance.search('res.partner', [[['customer', '=', true], ['is_company', '=', false]]], { 'limit': 1})
+     */
+    search(model: string, args: any, kwargs?: any): Observable<any> {
+        return this.call(model, 'read', args, kwargs);
+    }
+
+    /**
+     * Example:
+     * instance.fieldsGet('res.partner', [8, 3, 1], { 'fields': ['name', 'comment']})
+     */
+    read(model: string, args: any, kwargs?: any): Observable<any> {
+        return this.call(model, 'read', args, kwargs);
+    }
+
+    /**
+     * Example:
+     * instance.read('res.partner', { 'attributes': ['string', 'help', 'type']})
+     */
+    fieldsGet(model: string, kwargs: any): Observable<any> {
+        return this.call(model, 'fields_get', [], kwargs);
+    }
+
+    /**
+     * Example:
+     * instance.create('res.partner', 'create', [{ 'name': 'New Partner' }])
+     */
+    create(model: string, args: any): Observable<any> {
+        return this.call(model, 'create', args);
+    }
+
+    /**
+     * Example:
+     * instance.write('res.partner', [[id], {'name': 'New name'}])
+     */
+    write(model: string, args: any): Observable<any> {
+        return this.call(model, 'write', args);
+    }
+
+    /**
+     * Example:
+     * instance.unlink('res.partner', [[id]])
+     */
+    unlink(model: string, args: any): Observable<any> {
+        return this.call(model, 'unlink', args);
+    }
+
+    /**
+     * Example:
+     * instance.checkAccessRights('res.partner', ['read'])
+     */
+    checkAccessRights(model: string, action: Array<string>): Observable<any> {
+        return this.call(model, 'check_access_rights', action, { 'raise_exception': false });
+    }
+}

+ 98 - 0
src/services/pouch-service.ts

@@ -0,0 +1,98 @@
+import { Injectable } from "@angular/core";
+import { Observable } from "rxjs/Observable";
+import { Observer } from "rxjs/Observer";
+import PouchDB from "pouchdb";
+import * as PouchFind from "pouchdb-find";
+
+PouchDB.plugin(PouchFind);
+
+@Injectable()
+export class PouchService {
+
+    pouchDB: any;
+
+    constructor() {
+        this.initialize();
+    }
+
+    /**
+     *
+     */
+    private initialize(): void {
+        this.pouchDB = new PouchDB("odoo", {
+            auto_compaction: true
+        });
+        this.pouchDB.createIndex({
+            index: {
+                fields: ['type']
+            }
+        }).then(response => console.log(response)).catch(error => console.log(error));
+    }
+
+    /**
+     *
+     */
+    save(data: any): Observable<any> {
+        if (!data.type) {
+            return Observable.throw("Error: Cannot save data without type");
+        }
+
+        return Observable.create((observer: Observer<any>) => {
+            this.pouchDB.put(data).then(response => {
+                observer.next(response);
+                observer.complete();
+            }).catch(error => observer.error(error));
+        });
+    }
+
+    /**
+     *
+     */
+    remove(data: any): Observable<any> {
+        if (!data._id || !data._rev) {
+            return Observable.throw("Error: Cannot remove data without id or rev");
+        }
+
+        return Observable.create((observer: Observer<any>) => {
+            this.pouchDB.remove(data).then(response => {
+                observer.next(response);
+                observer.complete();
+            }).catch(error => observer.error(error));
+        });
+    }
+
+    /**
+     *
+     */
+    get(data: any): Observable<any> {
+        if (!data._id) {
+            return Observable.throw("Error: Cannot get data without id");
+        }
+
+        return Observable.create((observer: Observer<any>) => {
+            this.pouchDB.get(data._id).then(response => {
+                observer.next(response);
+                observer.complete();
+            }).catch(error => observer.error(error));
+        });
+
+    }
+
+    /**
+     *
+     */
+    getAll(type: string): Observable<any> {
+        return Observable.create((observer: Observer<any>) => {
+            this.pouchDB.find({
+                selector: {
+                    name: {
+                        $eq: type
+                    }
+                }
+            }).then(response => {
+                observer.next(response);
+                observer.complete();
+            }).catch(error => observer.error(error));
+        });
+    }
+}

+ 24 - 0
src/services/sync-service.ts

@@ -0,0 +1,24 @@
+import { Injectable } from "@angular/core";
+import { Observable } from "rxjs/Observable";
+import { Observer } from "rxjs/Observer";
+
+import { UploadService } from "../services/upload-service";
+import { DownloadService } from "../services/download-service";
+
+@Injectable()
+export class SyncService {
+
+    constructor(
+        public upload: UploadService,
+        public download: DownloadService
+    ) { }
+
+    /**
+     *
+     */
+    do(): Observable<any> {
+        return Observable.create((observer: Observable<any>) => {
+
+        });
+    }
+}

+ 28 - 0
src/services/upload-service.ts

@@ -0,0 +1,28 @@
+import { Injectable } from "@angular/core";
+import { Observable } from "rxjs/Observable";
+import { Observer } from "rxjs/Observer";
+
+import { PouchService } from "../services/pouch-service";
+import { OdooService } from "../services/odoo-service";
+
+@Injectable()
+export class UploadService {
+
+    constructor(
+        public pouch: PouchService,
+        public odoo: OdooService
+    ) { }
+
+    do(): Observable<any> {
+        return Observable.create();
+    }
+
+    /**
+     *
+     */
+    toCreate(): Observable<any> {
+        return Observable.create((observer: Observer<any>) => {
+         
+        });
+    }
+}

+ 78 - 0
src/theme/variables.scss

@@ -0,0 +1,78 @@
+// Ionic Variables and Theming. For more info, please see:
+// http://ionicframework.com/docs/v2/theming/
+$font-path: "../assets/fonts";
+
+@import "ionic.globals";
+
+
+// Shared Variables
+// --------------------------------------------------
+// To customize the look and feel of this app, you can override
+// the Sass variables found in Ionic's source scss files.
+// To view all the possible Ionic variables, see:
+// http://ionicframework.com/docs/v2/theming/overriding-ionic-variables/
+
+
+
+
+// Named Color Variables
+// --------------------------------------------------
+// Named colors makes it easy to reuse colors on various components.
+// It's highly recommended to change the default colors
+// to match your app's branding. Ionic uses a Sass map of
+// colors so you can add, rename and remove colors as needed.
+// The "primary" color is the only required color in the map.
+
+$colors: (
+  primary:    #387ef5,
+  secondary:  #32db64,
+  danger:     #f53d3d,
+  light:      #f4f4f4,
+  dark:       #222
+);
+
+
+// App iOS Variables
+// --------------------------------------------------
+// iOS only Sass variables can go here
+
+
+
+
+// App Material Design Variables
+// --------------------------------------------------
+// Material Design only Sass variables can go here
+
+
+
+
+// App Windows Variables
+// --------------------------------------------------
+// Windows only Sass variables can go here
+
+
+
+
+// App Theme
+// --------------------------------------------------
+// Ionic apps can have different themes applied, which can
+// then be future customized. This import comes last
+// so that the above variables are used and Ionic's
+// default are overridden.
+
+@import "ionic.theme.default";
+
+
+// Ionicons
+// --------------------------------------------------
+// The premium icon font for Ionic. For more info, please see:
+// http://ionicframework.com/docs/v2/ionicons/
+
+@import "ionic.ionicons";
+
+
+// Fonts
+// --------------------------------------------------
+
+@import "roboto";
+@import "noto-sans";

برخی فایل ها در این مقایسه diff نمایش داده نمی شوند زیرا تعداد فایل ها بسیار زیاد است