├── .bowerrc
├── src
├── img
│ ├── ionic.png
│ ├── logo.png
│ ├── slide1.jpg
│ ├── slide2.jpg
│ └── slide3.jpg
├── js
│ ├── templates.js
│ ├── app
│ │ ├── intro
│ │ │ ├── intro-header.html
│ │ │ ├── intro-header.directive.js
│ │ │ ├── intro.router.js
│ │ │ ├── nav-buttons.html
│ │ │ ├── intro.ctrl.js
│ │ │ └── intro.html
│ │ ├── mainPage
│ │ │ ├── chatDetail.html
│ │ │ ├── chatDetail.ctrl.js
│ │ │ ├── account.html
│ │ │ ├── dash.ctrl.js
│ │ │ ├── chats.ctrl.js
│ │ │ ├── tabs.html
│ │ │ ├── chats.html
│ │ │ ├── dash.html
│ │ │ ├── account.ctrl.js
│ │ │ ├── mainPage.router.js
│ │ │ └── services
│ │ │ │ └── chats.service.js
│ │ ├── auth
│ │ │ ├── login
│ │ │ │ ├── logout.ctrl.js
│ │ │ │ ├── login.router.js
│ │ │ │ ├── loggedout.html
│ │ │ │ ├── login.ctrl.js
│ │ │ │ └── login.html
│ │ │ ├── signup
│ │ │ │ ├── signup.router.js
│ │ │ │ ├── signup.html
│ │ │ │ └── signup.ctrl.js
│ │ │ ├── changePassword
│ │ │ │ ├── changePassword.router.js
│ │ │ │ ├── changePassword.ctrl.js
│ │ │ │ └── changePassword.html
│ │ │ └── forgotPassword
│ │ │ │ ├── forgotPassword.html
│ │ │ │ └── forgotPassword.js
│ │ ├── util
│ │ │ ├── services
│ │ │ │ ├── dummy
│ │ │ │ │ └── tracking.service.dummyImpl.js
│ │ │ │ ├── storage.service.js
│ │ │ │ ├── tracking.service.js
│ │ │ │ ├── local
│ │ │ │ │ └── storage.service.localImpl.js
│ │ │ │ ├── logentries
│ │ │ │ │ └── tracking.service.logentriesImpl.js
│ │ │ │ ├── stopWatch.service.js
│ │ │ │ └── logging.service.js
│ │ │ ├── templates
│ │ │ │ └── form-errors.html
│ │ │ └── directives
│ │ │ │ ├── formErrors.directive.js
│ │ │ │ ├── itemEnteredIndicator.directive.js
│ │ │ │ ├── formField.directive.js
│ │ │ │ └── formDirtyCheck.directive.js
│ │ ├── user
│ │ │ ├── services
│ │ │ │ ├── user.service.js
│ │ │ │ ├── firebase
│ │ │ │ │ └── oauthHelper.service.js
│ │ │ │ └── mock
│ │ │ │ │ └── user.service.mockImpl.js
│ │ │ └── models
│ │ │ │ └── user.model.js
│ │ ├── appHooks.service.mockImpl.js
│ │ ├── appHooks.service.firebasekImpl.js
│ │ ├── appHooks.service.js
│ │ ├── application.ctrl.js
│ │ ├── manage
│ │ │ ├── image-crop-modal.html
│ │ │ └── userProfile.html
│ │ ├── menu
│ │ │ └── menu.html
│ │ ├── firebase
│ │ │ └── fbutil.service.js
│ │ ├── image
│ │ │ └── services
│ │ │ │ ├── image.service.js
│ │ │ │ └── fileManager.service.js
│ │ ├── app.js
│ │ └── application.service.js
│ ├── config
│ │ ├── config-dev.json
│ │ ├── config-prod.json
│ │ └── config-base.json
│ ├── lib
│ │ ├── ng-img-crop-customized
│ │ │ ├── README.md
│ │ │ └── ng-img-crop.scss
│ │ └── logentries
│ │ │ └── le.min.js
│ ├── modules.js
│ └── locales
│ │ └── en.json
└── index-template.html
├── scss
├── app
│ ├── .gitignore
│ ├── _text.scss
│ ├── app.scss
│ ├── _util.scss
│ ├── _tabs.scss
│ ├── _button.scss
│ ├── _bar.scss
│ ├── _layout.scss
│ ├── _styles.scss
│ ├── _form.scss
│ ├── _content-banner.scss
│ ├── _profile.scss
│ ├── _intro.scss
│ ├── _action-sheet-customized.scss
│ └── variables.scss
├── ionic.app.scss
└── ionic-customized.scss
├── typings
└── tsd.d.ts
├── www
└── .gitignore
├── bin
├── ionic_serve.sh
├── run_protractor.sh
└── protractor-chromedriver.sh
├── ionic.config.json
├── .gitignore
├── tsd.json
├── test
├── e2e
│ ├── pages
│ │ ├── logout.page.js
│ │ ├── sideMenu.page.js
│ │ └── login.page.js
│ ├── specs
│ │ └── auth
│ │ │ └── login.spec.js
│ └── common
│ │ ├── utils.js
│ │ └── login.helper.js
└── unit
│ └── mainPage
│ ├── services
│ └── chats.service-spec.js
│ └── account.ctrl-spec.js
├── bower.json
├── LICENSE
├── karma.conf.js
├── package.json
├── hooks
├── after_prepare
│ └── 010_add_platform_class.js
└── README.md
├── protractor.conf.js
├── config.xml
└── gulpfile.js
/.bowerrc:
--------------------------------------------------------------------------------
1 | {
2 | "directory": "src/lib"
3 | }
4 |
--------------------------------------------------------------------------------
/src/img/ionic.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/leob/ionic-quickstarter/HEAD/src/img/ionic.png
--------------------------------------------------------------------------------
/src/img/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/leob/ionic-quickstarter/HEAD/src/img/logo.png
--------------------------------------------------------------------------------
/src/img/slide1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/leob/ionic-quickstarter/HEAD/src/img/slide1.jpg
--------------------------------------------------------------------------------
/src/img/slide2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/leob/ionic-quickstarter/HEAD/src/img/slide2.jpg
--------------------------------------------------------------------------------
/src/img/slide3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/leob/ionic-quickstarter/HEAD/src/img/slide3.jpg
--------------------------------------------------------------------------------
/scss/app/.gitignore:
--------------------------------------------------------------------------------
1 | # Git-ignore override for this directory. See: http://stackoverflow.com/a/5581995/2474068
2 | !_*
3 | !.gitignore
4 |
--------------------------------------------------------------------------------
/typings/tsd.d.ts:
--------------------------------------------------------------------------------
1 |
2 | ///
5 | {{vm.chat.lastText}} 6 |
7 |
6 | {{chat.lastText}}
17 | 18 | 19 |
28 | * function(firebaseRef) {
29 | * var ref = firebaseRef('path/to/data');
30 | * }
31 | *
32 | *
33 | * @function
34 | * @name firebaseRef
35 | * @param {String|Array...} path relative path to the root folder in Firebase instance
36 | * @return a Firebase instance
37 | */
38 | function ref(path) {
39 | var fbRef = new $window.Firebase(FirebaseConfiguration.url);
40 | var args = Array.prototype.slice.call(arguments);
41 | if( args.length ) {
42 | fbRef = fbRef.child(pathRef(args));
43 | }
44 | return fbRef;
45 | }
46 |
47 | // Convert a Node.js or Firebase style callback to an Angular style future/promise
48 | var handler = function(fn, context) {
49 | return defer(function(def) {
50 | fn.call(context, function(err, result) {
51 | if( err !== null ) {
52 | def.reject(err);
53 | } else {
54 | def.resolve(result);
55 | }
56 | });
57 |
58 | });
59 | };
60 |
61 | // Convert an alternatve style future/promise, used for some Firebase APIs
62 | var handlerForResult = function(fn, context) {
63 | return defer(function(def) {
64 | fn.call(context, function(result) {
65 | def.resolve(result);
66 | }, function(err) {
67 | def.reject(err);
68 | });
69 |
70 | });
71 | };
72 |
73 | // Abstract the process of creating a future/promise
74 | var defer = function(fn, context) {
75 | var def = $q.defer();
76 | fn.call(context, def);
77 | return def.promise;
78 | };
79 |
80 | return {
81 | ref: ref,
82 | defer: defer,
83 | handler: handler,
84 | handlerForResult: handlerForResult
85 | };
86 | })
87 | ;
88 | }());
89 |
--------------------------------------------------------------------------------
/src/js/app/image/services/image.service.js:
--------------------------------------------------------------------------------
1 | ;(function() {
2 | "use strict";
3 |
4 | appModule('app.image')
5 |
6 | //
7 | // http://devdactic.com/complete-image-guide-ionic
8 | // https://github.com/iblank/ngImgCrop
9 | // http://stackoverflow.com/questions/6752366/resizing-photo-on-a-canvas-without-losing-the-aspect-ratio
10 | // http://forum.ionicframework.com/t/impossible-to-resize-image-taken-by-camera/22588/2
11 | // http://www.ngroutes.com/questions/1b80967/can-you-save-base64-data-as-a-file-with-ngcordova.html
12 | // http://stackoverflow.com/questions/9902797/phone-gap-camera-orientation
13 | // http://simonmacdonald.blogspot.ca/2012/07/change-to-camera-code-in-phonegap-190.html ["correctOrientation"]
14 | //
15 |
16 | .factory('ImageService', function($cordovaCamera, $q, $log) {
17 |
18 | function optionsForType(type, quality, targetSize) {
19 | var source;
20 | switch (type) {
21 | case 0:
22 | source = Camera.PictureSourceType.CAMERA;
23 | break;
24 | case 1:
25 | source = Camera.PictureSourceType.PHOTOLIBRARY;
26 | break;
27 | }
28 | return {
29 | quality: quality, // e.g. 75,
30 | destinationType: Camera.DestinationType.FILE_URI,
31 | sourceType: source,
32 | allowEdit: false, //true,
33 | encodingType: Camera.EncodingType.JPEG,
34 | popoverOptions: CameraPopoverOptions,
35 | saveToPhotoAlbum: true, //false,
36 | targetWidth: targetSize, // e.g. 500,
37 | targetHeight: targetSize, // e.g. 500,
38 | correctOrientation: true // SEE: simonmacdonald.blogspot.ca/2012/07/change-to-camera-code-in-phonegap-190.html
39 | };
40 | }
41 |
42 | var getPicture = function (type, quality, targetSize) {
43 | return $q(function (resolve, reject) {
44 | var options = optionsForType(type, quality, targetSize);
45 |
46 | $cordovaCamera.getPicture(options).then(function (imageUrl) {
47 |
48 | $log.debug('ImageService#getPicture, $cordovaCamera.getPicture imageUrl = ' + imageUrl);
49 |
50 | resolve(imageUrl);
51 |
52 | }, function (error) {
53 | $log.debug('ImageService#getPicture, $cordovaCamera.getPicture error = ' + JSON.stringify(error));
54 |
55 | reject(error);
56 | });
57 |
58 | });
59 | };
60 |
61 | var cleanup = function () {
62 | // Cleanup temp files from the camera's picture taking process. Only needed for Camera.DestinationType.FILE_URI.
63 | // Returns a promise the result of which is probably ignored.
64 | return $cordovaCamera.cleanup();
65 | };
66 |
67 | return {
68 | getPicture: getPicture,
69 | cleanup: cleanup
70 | };
71 | });
72 | }());
73 |
--------------------------------------------------------------------------------
/src/js/app/intro/intro.html:
--------------------------------------------------------------------------------
1 |