├── .gitattributes ├── app ├── .buildignore ├── robots.txt ├── favicon.ico ├── images │ ├── angular.png │ ├── cordova.png │ └── yeoman.png ├── styles │ ├── material.css │ ├── main.css │ └── app.css ├── views │ ├── search.html │ ├── tabs.html │ ├── about.html │ ├── dialog.html │ ├── pulltorefresh.html │ ├── toolbar.html │ ├── main.html │ ├── form.html │ ├── list.html │ └── sidenav.html ├── scripts │ ├── controllers │ │ ├── about.js │ │ ├── main.js │ │ ├── search.js │ │ ├── dialog.js │ │ ├── pulltorefresh.js │ │ └── global.js │ ├── directives │ │ └── scrolltotoponnavclick.js │ ├── app.js │ └── rootScope.js ├── template │ ├── bottom-sheet-list-template.html │ └── bottom-sheet-grid-template.html ├── index.html ├── 404.html └── .htaccess ├── .bowerrc ├── .gitignore ├── .travis.yml ├── docs └── images │ ├── GruntForm.png │ ├── AndroidForm.png │ ├── iPhoneForm.png │ ├── GruntSlideNav.png │ ├── iPhoneAppSlideNav.png │ ├── AndroidAppSlideNav.png │ └── AndroidFormNumberInput.png ├── .jshintrc ├── test ├── spec │ ├── controllers │ │ ├── main.js │ │ ├── about.js │ │ ├── search.js │ │ └── global.js │ ├── directives │ │ └── scrolltotoponnavclick.js │ └── rootScope.js ├── .jshintrc └── karma.conf.js ├── .editorconfig ├── bower.json ├── package.json ├── README.md └── Gruntfile.js /.gitattributes: -------------------------------------------------------------------------------- 1 | * text=auto -------------------------------------------------------------------------------- /app/.buildignore: -------------------------------------------------------------------------------- 1 | *.coffee -------------------------------------------------------------------------------- /.bowerrc: -------------------------------------------------------------------------------- 1 | { 2 | "directory": "bower_components" 3 | } 4 | -------------------------------------------------------------------------------- /app/robots.txt: -------------------------------------------------------------------------------- 1 | # robotstxt.org 2 | 3 | User-agent: * 4 | -------------------------------------------------------------------------------- /app/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/infomofo/cordova-angular-md-template/HEAD/app/favicon.ico -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .idea 2 | node_modules 3 | dist 4 | .tmp 5 | .sass-cache 6 | bower_components 7 | cordova 8 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - '0.10' 4 | before_script: 5 | - 'npm install -g grunt-cli' 6 | -------------------------------------------------------------------------------- /app/images/angular.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/infomofo/cordova-angular-md-template/HEAD/app/images/angular.png -------------------------------------------------------------------------------- /app/images/cordova.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/infomofo/cordova-angular-md-template/HEAD/app/images/cordova.png -------------------------------------------------------------------------------- /app/images/yeoman.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/infomofo/cordova-angular-md-template/HEAD/app/images/yeoman.png -------------------------------------------------------------------------------- /docs/images/GruntForm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/infomofo/cordova-angular-md-template/HEAD/docs/images/GruntForm.png -------------------------------------------------------------------------------- /docs/images/AndroidForm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/infomofo/cordova-angular-md-template/HEAD/docs/images/AndroidForm.png -------------------------------------------------------------------------------- /docs/images/iPhoneForm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/infomofo/cordova-angular-md-template/HEAD/docs/images/iPhoneForm.png -------------------------------------------------------------------------------- /docs/images/GruntSlideNav.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/infomofo/cordova-angular-md-template/HEAD/docs/images/GruntSlideNav.png -------------------------------------------------------------------------------- /docs/images/iPhoneAppSlideNav.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/infomofo/cordova-angular-md-template/HEAD/docs/images/iPhoneAppSlideNav.png -------------------------------------------------------------------------------- /docs/images/AndroidAppSlideNav.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/infomofo/cordova-angular-md-template/HEAD/docs/images/AndroidAppSlideNav.png -------------------------------------------------------------------------------- /docs/images/AndroidFormNumberInput.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/infomofo/cordova-angular-md-template/HEAD/docs/images/AndroidFormNumberInput.png -------------------------------------------------------------------------------- /app/styles/material.css: -------------------------------------------------------------------------------- 1 | /* 2 | Suggestions for tweaks when using material design on mobile 3 | */ 4 | 5 | /* Several interacted elements get dotted borders after interaction, which is not expected on mobile devices */ 6 | md-radio-group { 7 | border:none 8 | } 9 | -------------------------------------------------------------------------------- /app/views/search.html: -------------------------------------------------------------------------------- 1 |
Searching for:
3 |8 |
9 |{{ item.name }}
9 |Click the tab header change between tab contents
5 |
4 | 
5 | This app uses angular and material design!
6 |
8 | 
9 | This app was scaffolded initially with Yeoman!
10 |
12 | 13 | This app uses Font-Awesome! 14 |
15 |
16 | 
17 | This app is built with the cordova framework to run on mobile devices!
18 |
20 | 21 | This app is hosted on github, where you can find all the source code! 22 |
23 | 24 |5 | This pane demonstrates a pull-to-refresh gesture. Pulling down on this app will trigger a callback called 6 | "refreshFunction" that will wait for 2 seconds and then 7 | add a random quote to the top of this list. While it is refreshing, a material design progress bar will display 8 | at the top of the content area. 9 |
10 |19 |
20 |9 | This is a demo app testing the use of angular/material widgets in a cordova application container. 10 |
11 | 12 |14 |
npm installgruntgrunt serve to open the application as a standard webpagecd cordova; cordova emulate ios to emulate it on an ios simulator running on your machinecd cordova; cordova run android to emulate it on an android simulator running on your machine, or to a connected android device with debugging options turned on.New directives, filters, routes, and controllers, as well as their respective karma tests can be added with standard yeoman generator-angular commands
30 | 31 |This app will also contain example grunt tests that can be run on an integration server, such as Travis.
33 |Selected Value: {{ data.group1 }}
34 |This pane demonstrates a common list pane. When you scroll down the inner toolbar disappears.
12 | 13 |18 | The titles of Washed Out's breakthrough song and the first single from Paracosm share the 19 | two most important words in Ernest Greene's musical language: feel it. It's a simple request, as well... 20 |
21 |33 | this is a list item! 34 |
35 |Sorry, but the page you were trying to view does not exist.
146 |It looks like this was the result of either:
147 |15 | The application's landing screen 16 |
17 |30 | About this app 31 |
32 |65 | Various methods of alerting users to information 66 |
67 |80 | Demonstrations of input elements 81 |
82 |95 | Demonstration of a list of content 96 |
97 |110 | Demonstration of a pane with several tabs 111 |
112 |125 | Demonstration of pull-to-refresh functionality 126 |
127 |yo angular:route myroute
132 |
133 | Generated files not in git
134 | --------------------------
135 |
136 | * node_modules - node modules - these are generated by npm install
137 | * bower_components - bower dependencies - these are generated by grunt
138 | * dist - the generated application
139 | * cordova - the generated cordova mobile applications for ios and android
140 |
--------------------------------------------------------------------------------
/app/scripts/controllers/pulltorefresh.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | /**
4 | * @ngdoc function
5 | * @name yoAngularCordovaApp.controller:PullToRefreshCtrl
6 | * @description
7 | * # PullToRefreshCtrl
8 | * Controller of the yoAngularCordovaApp
9 | */
10 | angular.module('yoAngularCordovaApp')
11 | .controller('PullToRefreshCtrl', function ($scope, $q) {
12 |
13 |
14 | $scope.listItems = [];
15 |
16 | var icons = [
17 | 'anchor',
18 | 'archive',
19 | 'area-chart',
20 | 'arrows',
21 | 'arrows-h',
22 | 'arrows-v',
23 | 'asterisk',
24 | 'at',
25 | 'ban',
26 | 'bar-chart',
27 | 'barcode',
28 | 'bars',
29 | 'bed',
30 | 'beer',
31 | 'bell',
32 | 'bell-o',
33 | 'bell-slash',
34 | 'bell-slash-o',
35 | 'bicycle',
36 | 'binoculars',
37 | 'birthday-cake',
38 | 'bolt',
39 | 'bomb',
40 | 'book',
41 | 'bookmark',
42 | 'bookmark-o',
43 | 'briefcase',
44 | 'bug',
45 | 'building',
46 | 'building-o',
47 | 'bullhorn',
48 | 'bullseye',
49 | 'bus',
50 | 'cab',
51 | 'calculator',
52 | 'calendar',
53 | 'calendar-o',
54 | 'camera',
55 | 'camera-retro',
56 | 'car',
57 | 'caret-square-o-down',
58 | 'caret-square-o-left',
59 | 'caret-square-o-right',
60 | 'caret-square-o-up',
61 | 'cart-arrow-down',
62 | 'cart-plus',
63 | 'cc',
64 | 'certificate',
65 | 'check',
66 | 'check-circle',
67 | 'check-circle-o',
68 | 'check-square',
69 | 'check-square-o',
70 | 'child',
71 | 'circle',
72 | 'circle-o',
73 | 'circle-o-notch',
74 | 'circle-thin',
75 | 'clock-o',
76 | 'close',
77 | 'cloud',
78 | 'cloud-download',
79 | 'cloud-upload',
80 | 'code',
81 | 'code-fork',
82 | 'coffee',
83 | 'cog',
84 | 'cogs',
85 | 'comment',
86 | 'comment-o',
87 | 'comments',
88 | 'comments-o',
89 | 'compass',
90 | 'copyright',
91 | 'credit-card',
92 | 'crop',
93 | 'crosshairs',
94 | 'cube',
95 | 'cubes',
96 | 'cutlery',
97 | 'dashboard',
98 | 'database',
99 | 'desktop',
100 | 'diamond',
101 | 'dot-circle-o',
102 | 'download',
103 | 'edit',
104 | 'ellipsis-h',
105 | 'ellipsis-v',
106 | 'envelope',
107 | 'envelope-o',
108 | 'envelope-square',
109 | 'eraser',
110 | 'exchange',
111 | 'exclamation',
112 | 'exclamation-circle',
113 | 'exclamation-triangle',
114 | 'external-link',
115 | 'external-link-square',
116 | 'eye',
117 | 'eye-slash',
118 | 'eyedropper',
119 | 'fax',
120 | 'female',
121 | 'fighter-jet',
122 | 'file-archive-o',
123 | 'file-audio-o',
124 | 'file-code-o',
125 | 'file-excel-o',
126 | 'file-image-o',
127 | 'file-movie-o',
128 | 'file-pdf-o',
129 | 'file-photo-o',
130 | 'file-picture-o',
131 | 'file-powerpoint-o',
132 | 'file-sound-o',
133 | 'file-video-o',
134 | 'file-word-o',
135 | 'file-zip-o',
136 | 'film',
137 | 'filter',
138 | 'fire',
139 | 'fire-extinguisher',
140 | 'flag',
141 | 'flag-checkered',
142 | 'flag-o',
143 | 'flash',
144 | 'flask',
145 | 'folder',
146 | 'folder-o',
147 | 'folder-open',
148 | 'folder-open-o',
149 | 'frown-o',
150 | 'futbol-o',
151 | 'gamepad',
152 | 'gavel',
153 | 'gear',
154 | 'gears',
155 | 'genderless',
156 | 'gift',
157 | 'glass',
158 | 'globe',
159 | 'graduation-cap',
160 | 'group',
161 | 'hdd-o',
162 | 'headphones',
163 | 'heart',
164 | 'heart-o',
165 | 'heartbeat',
166 | 'history',
167 | 'home',
168 | 'hotel',
169 | 'image',
170 | 'inbox',
171 | 'info',
172 | 'info-circle',
173 | 'institution',
174 | 'key',
175 | 'keyboard-o',
176 | 'language',
177 | 'laptop',
178 | 'leaf',
179 | 'legal',
180 | 'lemon-o',
181 | 'level-down',
182 | 'level-up',
183 | 'life-bouy',
184 | 'life-buoy',
185 | 'life-ring',
186 | 'life-saver',
187 | 'lightbulb-o',
188 | 'line-chart',
189 | 'location-arrow',
190 | 'lock',
191 | 'magic',
192 | 'magnet',
193 | 'mail-forward',
194 | 'mail-reply',
195 | 'mail-reply-all',
196 | 'male',
197 | 'map-marker',
198 | 'meh-o',
199 | 'microphone',
200 | 'microphone-slash',
201 | 'minus',
202 | 'minus-circle',
203 | 'minus-square',
204 | 'minus-square-o',
205 | 'mobile',
206 | 'mobile-phone',
207 | 'money',
208 | 'moon-o',
209 | 'mortar-board',
210 | 'motorcycle',
211 | 'music',
212 | 'navicon',
213 | 'newspaper-o',
214 | 'paint-brush',
215 | 'paper-plane',
216 | 'paper-plane-o',
217 | 'paw',
218 | 'pencil',
219 | 'pencil-square',
220 | 'pencil-square-o',
221 | 'phone',
222 | 'phone-square',
223 | 'photo',
224 | 'picture-o',
225 | 'pie-chart',
226 | 'plane',
227 | 'plug',
228 | 'plus',
229 | 'plus-circle',
230 | 'plus-square',
231 | 'plus-square-o',
232 | 'power-off',
233 | 'print',
234 | 'puzzle-piece',
235 | 'qrcode',
236 | 'question',
237 | 'question-circle',
238 | 'quote-left',
239 | 'quote-right',
240 | 'random',
241 | 'recycle',
242 | 'refresh',
243 | 'remove',
244 | 'reorder',
245 | 'reply',
246 | 'reply-all',
247 | 'retweet',
248 | 'road',
249 | 'rocket',
250 | 'rss',
251 | 'rss-square',
252 | 'search',
253 | 'search-minus',
254 | 'search-plus',
255 | 'send',
256 | 'send-o',
257 | 'server',
258 | 'share',
259 | 'share-alt',
260 | 'share-alt-square',
261 | 'share-square',
262 | 'share-square-o',
263 | 'shield',
264 | 'ship',
265 | 'shopping-cart',
266 | 'sign-in',
267 | 'sign-out',
268 | 'signal',
269 | 'sitemap',
270 | 'sliders',
271 | 'smile-o',
272 | 'soccer-ball-o',
273 | 'sort',
274 | 'sort-alpha-asc',
275 | 'sort-alpha-desc',
276 | 'sort-amount-asc',
277 | 'sort-amount-desc',
278 | 'sort-asc',
279 | 'sort-desc',
280 | 'sort-down',
281 | 'sort-numeric-asc',
282 | 'sort-numeric-desc',
283 | 'sort-up',
284 | 'space-shuttle',
285 | 'spinner',
286 | 'spoon',
287 | 'square',
288 | 'square-o',
289 | 'star',
290 | 'star-half',
291 | 'star-half-empty',
292 | 'star-half-full',
293 | 'star-half-o',
294 | 'star-o',
295 | 'street-view',
296 | 'suitcase',
297 | 'sun-o',
298 | 'support',
299 | 'tablet',
300 | 'tachometer',
301 | 'tag',
302 | 'tags',
303 | 'tasks',
304 | 'taxi',
305 | 'terminal',
306 | 'thumb-tack',
307 | 'thumbs-down',
308 | 'thumbs-o-down',
309 | 'thumbs-o-up',
310 | 'thumbs-up',
311 | 'ticket',
312 | 'times',
313 | 'times-circle',
314 | 'times-circle-o',
315 | 'tint',
316 | 'toggle-down',
317 | 'toggle-left',
318 | 'toggle-off',
319 | 'toggle-on',
320 | 'toggle-right',
321 | 'toggle-up',
322 | 'trash',
323 | 'trash-o',
324 | 'tree',
325 | 'trophy',
326 | 'truck',
327 | 'tty',
328 | 'umbrella',
329 | 'university',
330 | 'unlock',
331 | 'unlock-alt',
332 | 'unsorted',
333 | 'upload',
334 | 'user',
335 | 'user-plus',
336 | 'user-secret',
337 | 'user-times',
338 | 'users',
339 | 'video-camera',
340 | 'volume-down',
341 | 'volume-off',
342 | 'volume-up',
343 | 'warning',
344 | 'wheelchair',
345 | 'wifi',
346 | 'wrench'
347 | ];
348 |
349 |
350 | var random = function(elementArray) {
351 | return elementArray[Math.floor(Math.random()*elementArray.length)];
352 | };
353 | $scope.randomItem = function() {
354 | $scope.listItems.unshift({
355 | icon: random(icons),
356 | text: random($scope.quotes),
357 | time: new Date()
358 | });
359 | };
360 |
361 | for (var i = 0; i < 20; i++) {
362 | $scope.randomItem();
363 | }
364 |
365 | $scope.refreshFunction = function() {
366 | var deferred = $q.defer();
367 | setTimeout(function() {
368 | $scope.randomItem();
369 | deferred.resolve(true);
370 | }, 2000);
371 | return deferred.promise;
372 | };
373 |
374 | });
375 |
--------------------------------------------------------------------------------
/app/scripts/controllers/global.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | /**
4 | * @ngdoc function
5 | * @name yoAngularCordovaApp.controller:GlobalCtrl
6 | * @description
7 | * # GlobalCtrl
8 | * Controller of the yoAngularCordovaApp
9 | */
10 | angular.module('yoAngularCordovaApp')
11 | .controller('GlobalCtrl', function ($scope, $rootScope, $mdSidenav, $mdToast, $mdDialog){
12 |
13 | $scope.searchModel = {
14 | searchActive: false,
15 | searchQuery: null
16 | };
17 |
18 | $scope.clickNav = function() {
19 | // Publish an event that can be handled by directives
20 | $rootScope.$emit('NavClicked');
21 | };
22 |
23 | /**
24 | * Closes the mdSidenav and handles any related behavior
25 | */
26 | $scope.closeSideNav = function(){
27 | $mdSidenav('left').close()
28 | .then(function(){
29 | });
30 | };
31 |
32 | /**
33 | * A replacement for the sidenav toggle button if it is replaced with a hamburger action.
34 | */
35 | $scope.handleHamburger = function() {
36 | if ($rootScope.isHistoryEmpty()) {
37 | $scope.toggleSideNav();
38 | } else {
39 | $rootScope.backFunction(true);
40 | }
41 | };
42 |
43 | $scope.openSidenav = function() {
44 | $mdToast.hide();
45 | $mdSidenav('left').open()
46 | .then(function(){
47 | });
48 | };
49 |
50 | $scope.executeSearch = function() {
51 | var path = '/search/' + $scope.searchModel.searchQuery;
52 | console.debug('go to path ' + path);
53 | $scope.disableSearch();
54 | // lose focus on search bar
55 | $rootScope.go(path);
56 | };
57 |
58 | $scope.disableSearch = function() {
59 | //var searchBox = angular.element('#searchBox');
60 | //searchBox.blur();
61 | $scope.searchModel.searchActive = false;
62 | $scope.searchModel.searchQuery = null;
63 | };
64 |
65 | /**
66 | * Closes the mdSidenav and handles any related behavior
67 | */
68 | $scope.closeSideNav = function(){
69 | $mdSidenav('left').close()
70 | .then(function(){
71 | });
72 | };
73 |
74 | /**
75 | * A replacement for the sidenav toggle button if it is replaced with a hamburger action.
76 | */
77 | $scope.handleHamburger = function() {
78 | if ($rootScope.isHistoryEmpty()) {
79 | $scope.toggleSideNav();
80 | } else {
81 | $rootScope.backFunction(true);
82 | }
83 | };
84 |
85 | /**
86 | * Handles the event of clicking on the nav bar- this is a common application convention that will make the active
87 | * scrollable container scroll to the top.
88 | */
89 | $scope.$on('NavClicked', function() {
90 | var domElement = document.getElementById('scrollcontainer');
91 | domElement.style.overflow = 'hidden';
92 | // wait for any current momentum scrolling to finish and then jump to top
93 | //$('#scrollcontainer').animate({scrollTop: 0}, 'fast');
94 | domElement.style.overflow = '';
95 | });
96 |
97 | /**
98 | * Displays the search box element on the toolbar
99 | */
100 | $scope.showSearch = function() {
101 | //var searchBox = angular.element('#searchBox');
102 | //searchBox.focus();
103 | $scope.searchModel.searchActive = true;
104 | };
105 |
106 | $scope.toggleSearch = function() {
107 | if ($scope.searchModel.searchActive) {
108 | $scope.disableSearch();
109 | } else {
110 | $scope.showSearch();
111 | }
112 | };
113 |
114 | /**
115 | * Displays an alert toast in the bottom right that disappears after 3 seconds
116 | *
117 | * Suitable for displaying short unactionable messages to the user
118 | *
119 | * @param message The alert message to display to the user
120 | */
121 | $scope.showAlertToast = function(message) {
122 | var toast = $mdToast.simple()
123 | .content(message)
124 | .highlightAction(false)
125 | .position('bottom right')
126 | .hideDelay(2000);
127 | $mdToast.show(toast);
128 | };
129 |
130 | /**
131 | * Displays an alert toast in the bottom right that disappears when dismissed by the user
132 | *
133 | * Suitable for displaying short unactionable messages to the user
134 | *
135 | * @param message The alert message to display to the user
136 | */
137 | $scope.showAlertToastPersistent = function(message) {
138 | var toast = $mdToast.simple()
139 | .content(message)
140 | .highlightAction(false)
141 | .position('bottom right')
142 | .hideDelay(0);
143 | $mdToast.show(toast);
144 | };
145 |
146 | /**
147 | * Displays an undoable toast in the bottom right that disappears after 3 seconds
148 | *
149 | * @param message the message to display to the user
150 | * @param callback the function to call when the undo action is clicked
151 | */
152 | $scope.showUndoToast = function(message, callback) {
153 | var toast = $mdToast.simple()
154 | .content(message)
155 | .action('undo')
156 | .highlightAction(false)
157 | .position('bottom right')
158 | .hideDelay(2000);
159 | $mdToast.show(toast).then(function() {
160 | callback(true);
161 | });
162 | };
163 |
164 | /**
165 | * Displays an undoable toast in the bottom right that disappears when dismissed by the user
166 | *
167 | * @param message the message to display to the user
168 | * @param callback the function to call when the undo action is clicked
169 | */
170 | $scope.showUndoToastPersistent = function(message, callback) {
171 | var toast = $mdToast.simple()
172 | .content(message)
173 | .action('undo')
174 | .highlightAction(false)
175 | .position('bottom right')
176 | .hideDelay(0);
177 | $mdToast.show(toast).then(function() {
178 | callback(true);
179 | });
180 | };
181 |
182 | /**
183 | * Displays an alert modal dialog
184 | *
185 | * Suitable for displaying short messages to the user
186 | *
187 | * @param title The title of the dialog box
188 | * @param message The alert message to display to the user
189 | * @param ev An event to animate the dialog box from
190 | */
191 | $scope.showAlertDialog = function(title, message, ev) {
192 | console.log(ev);
193 | $mdDialog.show(
194 | $mdDialog.alert()
195 | .title(title)
196 | .content(message)
197 | .ariaLabel('A modal dialog box: ' + message)
198 | .ok('close')
199 | //.targetEvent(ev)
200 | );
201 | };
202 |
203 | var backButton = function() {
204 | console.debug('back button');
205 | $rootScope.backFunction();
206 | $rootScope.$apply();
207 | };
208 | document.addEventListener('backbutton', backButton, false);
209 |
210 | $scope.quotes = [
211 | 'Michael: You\'re wearing ostrich-skin boots.',
212 | 'Lindsay: Well, I don\'t care about ostriches.',
213 | 'Lucille Bluth: I\'ll be in the hospital bar.',
214 | 'Michael: Uh, you know there isn\'t a hospital bar, Mother.',
215 | 'Lucille: Well, this is why people hate hospitals. [Cackles at her own wit]',
216 | 'Buster: She\'s just wigged out because I have a girlfriend.',
217 | 'Lucille: A waiter hands him a note and suddenly he\'s Steve McQueen. He doesn\'t even know what she looks like.',
218 | 'Buster: I know that she\'s a brownish area with points.',
219 | 'Michael: You\'re just jumping right into this, huh?',
220 | 'Buster: That\'s what you do when life hands you a chance to be with someone special. You just grab that brownish area by its points and you don\'t let go no matter what your mom says.',
221 | 'Prison warden: You really think you can break out of my prison?',
222 | 'Gob: You won\'t even know I was here.',
223 | 'Narrator: The warden was intrigued. Less about the stunt, and more about the prison beatings this brash magician was sure to receive.',
224 | 'Michael: Hey, speaking of kidding, How serious are you about Marta? I get the sense that there’s not much of a future there. Am I reading that right?',
225 | 'Gob: [from inside the prison] Let me ask you something. How would you feel if I came down on you hard?',
226 | 'Michael: You\'re saying I\'m not reading this right.',
227 | 'Gob: No, I\'m saying move the bike. I need to jump on you to break my fall.',
228 | 'Marta: I just couldn\'t find my keys.',
229 | 'Michael: Well, my brother may have eaten them.',
230 |
231 | 'Gob: Take off your glasses. Oh... wait, wait. Let down your hair. No: glasses on, hair back up. Let\'s just get that hair right back up.',
232 | 'Kitty: Let me turn the lights off.',
233 | 'Gob: Yes, yes, please.',
234 | 'Kitty: How\'s that? Is that better?',
235 | 'Gob: It just seems like there\'s still light coming in from under the door.',
236 | 'George Sr.: I just haven\'t had sex in a month.',
237 | 'Michael: You know, you\'ve been here two months.',
238 | 'George Sr.: It\'s hard to gauge time.',
239 | 'Michael: Yeah, I\'ll bet.',
240 | 'Gob: I [bleep]ed Kitty!',
241 | 'Michael: Gob! I just wanted you to get the information.',
242 | 'Gob: I got the information.',
243 | 'Michael: You did, huh? About the international accounts?',
244 | 'Gob: Oh, I see what you\'re getting at. No, I didn\'t get any information.',
245 | 'Kitty: Gob? I wish I would have know you were coming. I am a mess.',
246 | 'Gob: I don\'t know if a call from me would\'ve changed that.',
247 | 'Kitty: Do you like my outfit?',
248 | 'Gob: Not as much as I like what\'s underneath it.',
249 | 'Kitty: Gob!',
250 | 'Gob: No, I need your chair. Get up.',
251 |
252 | 'Michael: Come on, face it. You just do all this charity crap just to stroke your ego. You don\'t even know what the auction\'s for tonight.',
253 | 'Lindsay: The wetlands.',
254 | 'Michael: To do what with them?',
255 | 'Lindsay: Dry them.',
256 | 'Michael: Save them.',
257 | 'Lindsay: From drying.',
258 | 'Lindsay: Look, I screwed up, ok? I\'m lost, and I hate them. I hate the Wetlands. They\'re stupid and wet, and there are bugs everywhere, and I think I maced a crane, Michael.',
259 | 'Narrator: Tobias had intended to park the family’s only vehicle at the airport parking lot, but was waved onto the tarmac instead, where he found a spot close to his gate.',
260 | 'Lucille: Supposedly, Luz had to take her daughter to the hospital. That’s Lupe, her sister.',
261 | 'Michael: I hope she’s okay.',
262 | 'Lucille: She’s awful. Can barely wash a dish.',
263 | 'Lindsay: (loudly) Well, how embarrassing. My own brother buying me? I\'d rather die. (whispers to Michael) Thank you. Maybe you\'re not that selfish.',
264 |
265 | '[at the prison]',
266 | 'Barry Zuckerkorn: Are all the guys in here... you know? [referencing gay inmates]',
267 | 'George Sr.: Oh, no, no. No, not all of them.',
268 | 'Barry Zuckerkorn: Yeah. It\'s never the ones you hope.',
269 | 'George Sr.: Hope?',
270 | 'Barry Zuckerkorn: Think.',
271 | 'Lucille: What\'d she do, get you drunk?',
272 | 'Michael: No, we just, uh, well... we — we did drink a little bit. How\'d you know that?',
273 | 'Lucille: Because that\'s what she said she\'d do. I said you wouldn\'t give her the money, and she said, "He will if I get him drunk." Probably because she thinks you\'re a cheap bastard. Oh... her words.',
274 | 'Wayne Jarvis: I use one adjective to describe myself, what is it?',
275 | 'Michael: Professional.',
276 | '[Jarvis shakes head and walks out]',
277 | 'Michael: Did I just wake you up? I didn’t even know you were home.',
278 | 'Lindsay: No, Michael, I don’t just sleep all day.',
279 | 'Narrator: Actually, Lindsay was so upset at Michael that she tried meditating to calm herself but ended up taking a two-hour angry nap.',
280 | 'Michael: I love Marta.',
281 | 'Lindsay: Mom\'s housekeeper?',
282 | 'Wayne Jarvis: I shall duck behind the couch.',
283 | 'Michael: What a pro.',
284 | 'Wayne Jarvis: I shall duck behind that little garbage can.',
285 | 'Michael: Guy\'s a pro.',
286 | 'Michael: [to Lucille] Oh, um... there\'s a big bowl of candy in my office. Why don\'t you go eat it?',
287 | 'Wayne Jarvis: Wayne Jarvis, attorney at law. I have a responsibility to tell you that there is no candy in this office.',
288 | 'Gob: [to Michael] Well, if it isn\'t the boy who lives under the stairs.',
289 |
290 | 'Michael: Hey, Mom. Remember we had that conversation about trying to cut back on things that aren\'t necessities?',
291 | 'Lucille: Like it was yesterday.',
292 | 'Michael: It was this morning.',
293 | 'Lucille: You\'re my third least favorite child.',
294 | 'Michael: I can live with that.',
295 | '[Speaking of the surprise party for Lucille]',
296 | 'Maeby: We [George Michael and Maeby] don\'t have to go, do we?',
297 | 'Michael: This is a Bluth family celebration. It\'s no place for children.',
298 | 'Michael: I can\'t believe she got that driver\'s license renewed.',
299 | 'Gob: She didn\'t. I dummied her up a new one. Not my best work, though. She wanted to look 48. I nearly airbrushed her into oblivion. Ended up checking “albino” in the form.',
300 | 'Lindsay: It would just give Dad one more reason to think that I\'ve got nothing to offer but my looks.',
301 | 'Gob: Yeah, I got some of that. Except he also didn\'t like my looks.',
302 |
303 | 'Buster: And I\'m going to continue dating, Mom.',
304 | 'Michael: It sounds a little bit like "dating Mom."',
305 | 'Buster: It\'s starting to feel a little like it.',
306 | 'Michael: Since when are you against leather?',
307 | 'Maeby: Yeah, you\'re not even a vegetarian.',
308 | 'Lindsay: Well, I\'m not against the insides. I mean, people need meat to survive.',
309 | 'Michael: You are aware they don\'t remove it from the cow surgically, right?',
310 | 'Man at the store: May I help you?',
311 | 'Tobias: Oh, I hope so. Um, I\'m looking for something that says, "Dad likes leather."',
312 | 'Man: Something that says, "leather daddy"?',
313 | 'Tobias: Oh, is there such a thing?',
314 | 'Michael: I\'m a saint, you know. I\'m a living saint, and I get absolutely nothing out of it.',
315 | 'Lindsay: Well, you get a false feeling of superiority',
316 | 'Michael: That is nice, but this time it\'s not enough.',
317 | 'Cab driver: Where to, mate?',
318 | 'Tobias: The Gothic Castle.',
319 | 'Cab driver: Gothic Asshole?',
320 | 'Tobias: That\'s what I said.',
321 | 'Rollo: If you care about your brother, you\'ll get in this car.',
322 | 'Michael: Which brother?',
323 | 'Rollo: Gob.',
324 | '[Michael leaves]',
325 | 'Lucille: You\'re the only one who chose a spouse I liked and she had to die.',
326 | 'Michael: I know, that\'s rough for you.'
327 |
328 | ];
329 | });
330 |
--------------------------------------------------------------------------------
/Gruntfile.js:
--------------------------------------------------------------------------------
1 | // Generated on 2014-11-16 using generator-angular 0.10.0
2 | 'use strict';
3 |
4 | // # Globbing
5 | // for performance reasons we're only matching one level down:
6 | // 'test/spec/{,*/}*.js'
7 | // use this if you want to recursively match all subfolders:
8 | // 'test/spec/**/*.js'
9 |
10 | module.exports = function (grunt) {
11 |
12 | // Load grunt tasks automatically
13 | require('load-grunt-tasks')(grunt);
14 |
15 | // Time how long tasks take. Can help when optimizing build times
16 | require('time-grunt')(grunt);
17 |
18 | var extend = require('extend');
19 |
20 | var customConfig = {
21 | // The following variables can be customized for an application that forks this repo
22 | appName: 'YoAngularCordova',
23 | appPackage: 'com.sample.YoAngularCordova',
24 | plugins: [
25 | 'https://github.com/j-mcnally/cordova-statusTap',
26 | 'org.apache.cordova.statusbar'
27 | ],
28 | platforms: ['ios', 'android'],
29 | statusBarBackgroundColor: '#388E3C' // Should be the 700 color for your main color http://www.google.com/design/spec/style/color.html#color-color-palette
30 | };
31 |
32 | var appConfig = extend (true,
33 | {
34 | app: require('./bower.json').appPath || 'app',
35 | dist: 'dist',
36 | cordova: 'cordova'
37 | }, customConfig);
38 |
39 | // Define the configuration for all the tasks
40 | grunt.initConfig({
41 |
42 | // Project settings
43 | yeoman: appConfig,
44 |
45 | // Watches files for changes and runs tasks based on the changed files
46 | watch: {
47 | bower: {
48 | files: ['bower.json'],
49 | tasks: ['wiredep']
50 | },
51 | js: {
52 | files: ['<%= yeoman.app %>/scripts/{,*/}*.js'],
53 | tasks: ['newer:jshint:all'],
54 | options: {
55 | livereload: '<%= connect.options.livereload %>'
56 | }
57 | },
58 | jsTest: {
59 | files: ['test/spec/{,*/}*.js'],
60 | tasks: ['newer:jshint:test', 'karma']
61 | },
62 | styles: {
63 | files: ['<%= yeoman.app %>/styles/{,*/}*.css'],
64 | tasks: ['newer:copy:styles', 'autoprefixer']
65 | },
66 | gruntfile: {
67 | files: ['Gruntfile.js']
68 | },
69 | livereload: {
70 | options: {
71 | livereload: '<%= connect.options.livereload %>'
72 | },
73 | files: [
74 | '<%= yeoman.app %>/{,*/}*.html',
75 | '.tmp/styles/{,*/}*.css',
76 | '<%= yeoman.app %>/images/{,*/}*.{png,jpg,jpeg,gif,webp,svg}'
77 | ]
78 | }
79 | },
80 |
81 | // The actual grunt server settings
82 | connect: {
83 | options: {
84 | port: 9000,
85 | // Change this to '0.0.0.0' to access the server from outside.
86 | hostname: 'localhost',
87 | livereload: 35729
88 | },
89 | livereload: {
90 | options: {
91 | open: true,
92 | middleware: function (connect) {
93 | return [
94 | connect.static('.tmp'),
95 | connect().use(
96 | '/bower_components',
97 | connect.static('./bower_components')
98 | ),
99 | connect.static(appConfig.app)
100 | ];
101 | }
102 | }
103 | },
104 | test: {
105 | options: {
106 | port: 9001,
107 | middleware: function (connect) {
108 | return [
109 | connect.static('.tmp'),
110 | connect.static('test'),
111 | connect().use(
112 | '/bower_components',
113 | connect.static('./bower_components')
114 | ),
115 | connect.static(appConfig.app)
116 | ];
117 | }
118 | }
119 | },
120 | dist: {
121 | options: {
122 | open: true,
123 | base: '<%= yeoman.dist %>'
124 | }
125 | }
126 | },
127 |
128 | // Make sure code styles are up to par and there are no obvious mistakes
129 | jshint: {
130 | options: {
131 | jshintrc: '.jshintrc',
132 | reporter: require('jshint-stylish')
133 | },
134 | all: {
135 | src: [
136 | 'Gruntfile.js',
137 | '<%= yeoman.app %>/scripts/{,*/}*.js'
138 | ]
139 | },
140 | test: {
141 | options: {
142 | jshintrc: 'test/.jshintrc'
143 | },
144 | src: ['test/spec/{,*/}*.js']
145 | }
146 | },
147 |
148 | // Empties folders to start fresh
149 | clean: {
150 | dist: {
151 | files: [{
152 | dot: true,
153 | src: [
154 | '.tmp',
155 | '<%= yeoman.dist %>/{,*/}*',
156 | '!<%= yeoman.dist %>/.git{,*/}*'
157 | ]
158 | }]
159 | },
160 | server: '.tmp'
161 | },
162 |
163 | // Add vendor prefixed styles
164 | autoprefixer: {
165 | options: {
166 | browsers: ['last 1 version']
167 | },
168 | dist: {
169 | files: [{
170 | expand: true,
171 | cwd: '.tmp/styles/',
172 | src: '{,*/}*.css',
173 | dest: '.tmp/styles/'
174 | }]
175 | }
176 | },
177 |
178 | // Automatically inject Bower components into the app
179 | wiredep: {
180 | app: {
181 | src: ['<%= yeoman.app %>/index.html'],
182 | exclude: [
183 | 'bower_components/bootstrap/dist/js/bootstrap.js'
184 | //'bower_components/jquery/dist/jquery.js'
185 | ],
186 | ignorePath: /\.\.\//
187 | }
188 | },
189 |
190 | // Renames files for browser caching purposes
191 | filerev: {
192 | dist: {
193 | src: [
194 | '<%= yeoman.dist %>/scripts/{,*/}*.js',
195 | '<%= yeoman.dist %>/styles/{,*/}*.css',
196 | '<%= yeoman.dist %>/images/{,*/}*.{png,jpg,jpeg,gif,webp,svg}',
197 | '<%= yeoman.dist %>/styles/fonts/*'
198 | ]
199 | }
200 | },
201 |
202 | // Reads HTML for usemin blocks to enable smart builds that automatically
203 | // concat, minify and revision files. Creates configurations in memory so
204 | // additional tasks can operate on them
205 | useminPrepare: {
206 | html: '<%= yeoman.app %>/index.html',
207 | options: {
208 | dest: '<%= yeoman.dist %>',
209 | flow: {
210 | html: {
211 | steps: {
212 | js: ['concat', 'uglifyjs'],
213 | css: ['cssmin']
214 | },
215 | post: {}
216 | }
217 | }
218 | }
219 | },
220 |
221 | // Performs rewrites based on filerev and the useminPrepare configuration
222 | usemin: {
223 | html: ['<%= yeoman.dist %>/{,*/}*.html'],
224 | css: ['<%= yeoman.dist %>/styles/{,*/}*.css'],
225 | options: {
226 | assetsDirs: ['<%= yeoman.dist %>','<%= yeoman.dist %>/images']
227 | }
228 | },
229 |
230 | // The following *-min tasks will produce minified files in the dist folder
231 | // By default, your `index.html`'s will take care of
232 | // minification. These next options are pre-configured if you do not wish
233 | // to use the Usemin blocks.
234 | // cssmin: {
235 | // dist: {
236 | // files: {
237 | // '<%= yeoman.dist %>/styles/main.css': [
238 | // '.tmp/styles/{,*/}*.css'
239 | // ]
240 | // }
241 | // }
242 | // },
243 | // uglify: {
244 | // dist: {
245 | // files: {
246 | // '<%= yeoman.dist %>/scripts/scripts.js': [
247 | // '<%= yeoman.dist %>/scripts/scripts.js'
248 | // ]
249 | // }
250 | // }
251 | // },
252 | // concat: {
253 | // dist: {}
254 | // },
255 |
256 | imagemin: {
257 | dist: {
258 | files: [{
259 | expand: true,
260 | cwd: '<%= yeoman.app %>/images',
261 | src: '{,*/}*.{png,jpg,jpeg,gif}',
262 | dest: '<%= yeoman.dist %>/images'
263 | }]
264 | }
265 | },
266 |
267 | svgmin: {
268 | dist: {
269 | files: [{
270 | expand: true,
271 | cwd: '<%= yeoman.app %>/images',
272 | src: '{,*/}*.svg',
273 | dest: '<%= yeoman.dist %>/images'
274 | }]
275 | }
276 | },
277 |
278 | htmlmin: {
279 | dist: {
280 | options: {
281 | collapseWhitespace: true,
282 | conservativeCollapse: true,
283 | collapseBooleanAttributes: true,
284 | removeCommentsFromCDATA: true,
285 | removeOptionalTags: true
286 | },
287 | files: [{
288 | expand: true,
289 | cwd: '<%= yeoman.dist %>',
290 | src: ['*.html', 'views/{,*/}*.html'],
291 | dest: '<%= yeoman.dist %>'
292 | }]
293 | }
294 | },
295 |
296 | // ng-annotate tries to make the code safe for minification automatically
297 | // by using the Angular long form for dependency injection.
298 | ngAnnotate: {
299 | dist: {
300 | files: [{
301 | expand: true,
302 | cwd: '.tmp/concat/scripts',
303 | src: ['*.js', '!oldieshim.js'],
304 | dest: '.tmp/concat/scripts'
305 | }]
306 | }
307 | },
308 |
309 | // Replace Google CDN references
310 | cdnify: {
311 | dist: {
312 | html: ['<%= yeoman.dist %>/*.html']
313 | }
314 | },
315 |
316 | // Copies remaining files to places other tasks can use
317 | copy: {
318 | dist: {
319 | files: [{
320 | expand: true,
321 | dot: true,
322 | cwd: '<%= yeoman.app %>',
323 | dest: '<%= yeoman.dist %>',
324 | src: [
325 | '*.{ico,png,txt}',
326 | '.htaccess',
327 | '*.html',
328 | 'views/{,*/}*.html',
329 | 'template/{,*/}*.html',
330 | 'images/{,*/}*.{webp}',
331 | 'fonts/{,*/}*.*'
332 | ]
333 | }, {
334 | expand: true,
335 | cwd: '.tmp/images',
336 | dest: '<%= yeoman.dist %>/images',
337 | src: ['generated/*']
338 | }, {
339 | expand: true,
340 | cwd: 'bower_components/font-awesome',
341 | src: 'fonts/*',
342 | dest: '<%= yeoman.dist %>'
343 | }]
344 | },
345 | styles: {
346 | expand: true,
347 | cwd: '<%= yeoman.app %>/styles',
348 | dest: '.tmp/styles/',
349 | src: '{,*/}*.css'
350 | }
351 | },
352 |
353 | // Run some tasks in parallel to speed up the build process
354 | concurrent: {
355 | server: [
356 | 'copy:styles'
357 | ],
358 | test: [
359 | 'copy:styles'
360 | ],
361 | dist: [
362 | 'copy:styles',
363 | 'imagemin',
364 | 'svgmin'
365 | ]
366 | },
367 |
368 | // Test settings
369 | karma: {
370 | unit: {
371 | configFile: 'test/karma.conf.js',
372 | singleRun: true
373 | }
374 | },
375 | cordovacli: {
376 | options: {
377 | path: '<%= yeoman.cordova %>',
378 | id: '<%= yeoman.appPackage %>',
379 | name: '<%= yeoman.appName %>',
380 | platforms: appConfig.platforms
381 | },
382 | cordova: {
383 | options: {
384 | command: ['create','platform','plugin','build'],
385 | }
386 | },
387 | create: {
388 | options: {
389 | command: 'create',
390 | args: ['--copy-from=<%= yeoman.dist %>']
391 | }
392 | },
393 | addPlatforms: {
394 | options: {
395 | command: 'platform',
396 | action: 'add'
397 | }
398 | },
399 | addPlugins: {
400 | options: {
401 | command: 'plugin',
402 | action: 'add',
403 | plugins: appConfig.plugins
404 | }
405 | },
406 | build: {
407 | options: {
408 | command: 'build'
409 | }
410 | },
411 | emulateAndroid: {
412 | options: {
413 | command: 'emulate',
414 | platforms: ['android']
415 | }
416 | },
417 | emulateIos: {
418 | options: {
419 | command: 'emulate',
420 | platforms: ['ios']
421 | }
422 | },
423 | runAndroid: {
424 | options: {
425 | command: 'run',
426 | platforms: ['android']
427 | }
428 | },
429 | runIos: {
430 | options: {
431 | command: 'run',
432 | platforms: ['ios']
433 | }
434 | }
435 | },
436 | shell: {
437 | cordovaClean: {
438 | command: 'rm -Rf <%= yeoman.cordova %>'
439 | }
440 | }
441 | });
442 | grunt.loadNpmTasks('grunt-cordovacli');
443 |
444 | //var xpath = require('xpath');
445 | var DOMParser = require('xmldom').DOMParser;
446 | grunt.registerTask('addCordovaPreferences', function(){
447 | var cordovaConfig = appConfig.cordova + '/config.xml';
448 | var xml = grunt.file.read(cordovaConfig);
449 | var doc = new DOMParser().parseFromString(xml);
450 |
451 | var node = doc.getElementsByTagName('widget')[0];
452 |
453 | //var author = node.getElementsByTagName("author")[0];
454 | //author.setAttribute('email','contact@example.com');
455 | //author.setAttribute('href','http://example.com');
456 | //author.nodeValue='contact@example.com';
457 |
458 | // grunt.log.writeln('Adding to: ' + node);
459 | var KeyboardShrinksView = doc.createElement('preference');
460 | KeyboardShrinksView.setAttribute('name', 'KeyboardShrinksView');
461 | KeyboardShrinksView.setAttribute('value', true);
462 | grunt.log.writeln('Adding: ' + KeyboardShrinksView);
463 | node.appendChild(KeyboardShrinksView);
464 |
465 | var StatusBarOverlaysWebView = doc.createElement('preference');
466 | StatusBarOverlaysWebView.setAttribute('name', 'StatusBarOverlaysWebView');
467 | StatusBarOverlaysWebView.setAttribute('value', false);
468 | grunt.log.writeln('Adding: ' + StatusBarOverlaysWebView);
469 | node.appendChild(StatusBarOverlaysWebView);
470 |
471 | var StatusBarBackgroundColor = doc.createElement('preference');
472 | StatusBarBackgroundColor.setAttribute('name', 'StatusBarBackgroundColor');
473 | StatusBarBackgroundColor.setAttribute('value', appConfig.statusBarBackgroundColor);
474 | grunt.log.writeln('Adding: ' + StatusBarBackgroundColor);
475 | node.appendChild(StatusBarBackgroundColor);
476 |
477 | var KeyboardDisplayRequiresUserAction = doc.createElement('preference');
478 | KeyboardDisplayRequiresUserAction.setAttribute('name', 'KeyboardDisplayRequiresUserAction');
479 | KeyboardDisplayRequiresUserAction.setAttribute('value', false);
480 | grunt.log.writeln('Adding: ' + KeyboardDisplayRequiresUserAction);
481 | node.appendChild(KeyboardDisplayRequiresUserAction);
482 |
483 | var DisallowOverscroll = doc.createElement('preference');
484 | DisallowOverscroll.setAttribute('name', 'DisallowOverscroll');
485 | DisallowOverscroll.setAttribute('value', true);
486 | grunt.log.writeln('Adding: ' + DisallowOverscroll);
487 | node.appendChild(DisallowOverscroll);
488 |
489 | grunt.file.write(cordovaConfig, doc);
490 | });
491 |
492 | grunt.registerTask('serve', 'Compile then start a connect web server', function (target) {
493 | if (target === 'dist') {
494 | return grunt.task.run(['build', 'connect:dist:keepalive']);
495 | }
496 |
497 | grunt.task.run([
498 | 'clean:server',
499 | 'wiredep',
500 | 'concurrent:server',
501 | 'autoprefixer',
502 | 'connect:livereload',
503 | 'watch'
504 | ]);
505 | });
506 |
507 | grunt.registerTask('server', 'DEPRECATED TASK. Use the "serve" task instead', function (target) {
508 | grunt.log.warn('The `server` task has been deprecated. Use `grunt serve` to start a server.');
509 | grunt.task.run(['serve:' + target]);
510 | });
511 |
512 | grunt.registerTask('test', [
513 | 'clean:server',
514 | 'concurrent:test',
515 | 'autoprefixer',
516 | 'connect:test',
517 | 'karma'
518 | ]);
519 |
520 | grunt.registerTask('build', [
521 | 'clean:dist',
522 | 'wiredep',
523 | 'useminPrepare',
524 | 'concurrent:dist',
525 | 'autoprefixer',
526 | 'concat',
527 | 'ngAnnotate',
528 | 'copy:dist',
529 | 'cdnify',
530 | 'cssmin',
531 | 'uglify',
532 | 'filerev',
533 | 'usemin',
534 | 'htmlmin'
535 | ]);
536 |
537 | grunt.registerTask('default', [
538 | 'newer:jshint',
539 | // 'test',
540 | 'build',
541 | 'cordova'
542 | ]);
543 |
544 | grunt.registerTask('cordova',
545 | [
546 | 'shell:cordovaClean',
547 | 'cordovacli:create',
548 | 'addCordovaPreferences',
549 | 'cordovacli:addPlatforms',
550 | 'cordovacli:addPlugins',
551 | 'cordovacli:build'
552 | ]);
553 | };
554 |
--------------------------------------------------------------------------------
/app/.htaccess:
--------------------------------------------------------------------------------
1 | # Apache Configuration File
2 |
3 | # (!) Using `.htaccess` files slows down Apache, therefore, if you have access
4 | # to the main server config file (usually called `httpd.conf`), you should add
5 | # this logic there: http://httpd.apache.org/docs/current/howto/htaccess.html.
6 |
7 | # ##############################################################################
8 | # # CROSS-ORIGIN RESOURCE SHARING (CORS) #
9 | # ##############################################################################
10 |
11 | # ------------------------------------------------------------------------------
12 | # | Cross-domain AJAX requests |
13 | # ------------------------------------------------------------------------------
14 |
15 | # Enable cross-origin AJAX requests.
16 | # http://code.google.com/p/html5security/wiki/CrossOriginRequestSecurity
17 | # http://enable-cors.org/
18 |
19 | #