project started, some html and js files added, showing events and users work communicating with server api
arnaucode idoctnef@openmailbox.org
Sat, 18 Feb 2017 11:07:07 +0100
29 files changed,
873 insertions(+),
0 deletions(-)
jump to
A
.editorconfig
@@ -0,0 +1,14 @@
+# http://editorconfig.org +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true + +[*.md] +insert_final_newline = false +trim_trailing_whitespace = false
A
.gitignore
@@ -0,0 +1,9 @@
+# Specifies intentionally untracked files to ignore when using Git +# http://git-scm.com/docs/gitignore + +node_modules/ +platforms/ +plugins/ +npm-debug.log +.idea/ +www/lib/
A
bower.json
@@ -0,0 +1,11 @@
+{ + "name": "HelloIonic", + "private": "true", + "devDependencies": { + "ionic": "driftyco/ionic-bower#1.3.2" + }, + "dependencies": { + "angular-translate": "^2.14.0", + "ui-leaflet": "^2.0.0" + } +}
A
config.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?> +<widget id="com.ionicframework.openeventsplatformapp652778" version="0.0.1" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0"> + <name>openEventsPlatformApp</name> + <description> + An Ionic Framework and Cordova project. + </description> + <author email="you@example.com" href="http://example.com/"> + Your Name Here + </author> + <content src="index.html"/> + <access origin="*"/> + <preference name="webviewbounce" value="false"/> + <preference name="UIWebViewBounce" value="false"/> + <preference name="DisallowOverscroll" value="true"/> + <preference name="SplashScreenDelay" value="2000"/> + <preference name="FadeSplashScreenDuration" value="2000"/> + <preference name="android-minSdkVersion" value="16"/> + <preference name="BackupWebStorage" value="none"/> + <feature name="StatusBar"> + <param name="ios-package" value="CDVStatusBar" onload="true"/> + </feature> +</widget>
A
gulpfile.js
@@ -0,0 +1,51 @@
+var gulp = require('gulp'); +var gutil = require('gulp-util'); +var bower = require('bower'); +var concat = require('gulp-concat'); +var sass = require('gulp-sass'); +var minifyCss = require('gulp-minify-css'); +var rename = require('gulp-rename'); +var sh = require('shelljs'); + +var paths = { + sass: ['./scss/**/*.scss'] +}; + +gulp.task('default', ['sass']); + +gulp.task('sass', function(done) { + gulp.src('./scss/ionic.app.scss') + .pipe(sass()) + .on('error', sass.logError) + .pipe(gulp.dest('./www/css/')) + .pipe(minifyCss({ + keepSpecialComments: 0 + })) + .pipe(rename({ extname: '.min.css' })) + .pipe(gulp.dest('./www/css/')) + .on('end', done); +}); + +gulp.task('watch', ['sass'], function() { + gulp.watch(paths.sass, ['sass']); +}); + +gulp.task('install', ['git-check'], function() { + return bower.commands.install() + .on('log', function(data) { + gutil.log('bower', gutil.colors.cyan(data.id), data.message); + }); +}); + +gulp.task('git-check', function(done) { + if (!sh.which('git')) { + console.log( + ' ' + gutil.colors.red('Git is not installed.'), + '\n Git, the version control system, is required to download Ionic.', + '\n Download git here:', gutil.colors.cyan('http://git-scm.com/downloads') + '.', + '\n Once git is installed, run \'' + gutil.colors.cyan('gulp install') + '\' again.' + ); + process.exit(1); + } + done(); +});
A
hooks/README.md
@@ -0,0 +1,83 @@
+<!-- +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# +--> +# Cordova Hooks + +This directory may contain scripts used to customize cordova commands. This +directory used to exist at `.cordova/hooks`, but has now been moved to the +project root. Any scripts you add to these directories will be executed before +and after the commands corresponding to the directory name. Useful for +integrating your own build systems or integrating with version control systems. + +__Remember__: Make your scripts executable. + +## Hook Directories +The following subdirectories will be used for hooks: + + after_build/ + after_compile/ + after_docs/ + after_emulate/ + after_platform_add/ + after_platform_rm/ + after_platform_ls/ + after_plugin_add/ + after_plugin_ls/ + after_plugin_rm/ + after_plugin_search/ + after_prepare/ + after_run/ + after_serve/ + before_build/ + before_compile/ + before_docs/ + before_emulate/ + before_platform_add/ + before_platform_rm/ + before_platform_ls/ + before_plugin_add/ + before_plugin_ls/ + before_plugin_rm/ + before_plugin_search/ + before_prepare/ + before_run/ + before_serve/ + pre_package/ <-- Windows 8 and Windows Phone only. + +## Script Interface + +All scripts are run from the project's root directory and have the root directory passes as the first argument. All other options are passed to the script using environment variables: + +* CORDOVA_VERSION - The version of the Cordova-CLI. +* CORDOVA_PLATFORMS - Comma separated list of platforms that the command applies to (e.g.: android, ios). +* CORDOVA_PLUGINS - Comma separated list of plugin IDs that the command applies to (e.g.: org.apache.cordova.file, org.apache.cordova.file-transfer) +* CORDOVA_HOOK - Path to the hook that is being executed. +* CORDOVA_CMDLINE - The exact command-line arguments passed to cordova (e.g.: cordova run ios --emulate) + +If a script returns a non-zero exit code, then the parent cordova command will be aborted. + + +## Writing hooks + +We highly recommend writting your hooks using Node.js so that they are +cross-platform. Some good examples are shown here: + +[http://devgirl.org/2013/11/12/three-hooks-your-cordovaphonegap-project-needs/](http://devgirl.org/2013/11/12/three-hooks-your-cordovaphonegap-project-needs/) +
A
hooks/after_prepare/010_add_platform_class.js
@@ -0,0 +1,94 @@
+#!/usr/bin/env node + +// Add Platform Class +// v1.0 +// Automatically adds the platform class to the body tag +// after the `prepare` command. By placing the platform CSS classes +// directly in the HTML built for the platform, it speeds up +// rendering the correct layout/style for the specific platform +// instead of waiting for the JS to figure out the correct classes. + +var fs = require('fs'); +var path = require('path'); + +var rootdir = process.argv[2]; + +function addPlatformBodyTag(indexPath, platform) { + // add the platform class to the body tag + try { + var platformClass = 'platform-' + platform; + var cordovaClass = 'platform-cordova platform-webview'; + + var html = fs.readFileSync(indexPath, 'utf8'); + + var bodyTag = findBodyTag(html); + if(!bodyTag) return; // no opening body tag, something's wrong + + if(bodyTag.indexOf(platformClass) > -1) return; // already added + + var newBodyTag = bodyTag; + + var classAttr = findClassAttr(bodyTag); + if(classAttr) { + // body tag has existing class attribute, add the classname + var endingQuote = classAttr.substring(classAttr.length-1); + var newClassAttr = classAttr.substring(0, classAttr.length-1); + newClassAttr += ' ' + platformClass + ' ' + cordovaClass + endingQuote; + newBodyTag = bodyTag.replace(classAttr, newClassAttr); + + } else { + // add class attribute to the body tag + newBodyTag = bodyTag.replace('>', ' class="' + platformClass + ' ' + cordovaClass + '">'); + } + + html = html.replace(bodyTag, newBodyTag); + + fs.writeFileSync(indexPath, html, 'utf8'); + + process.stdout.write('add to body class: ' + platformClass + '\n'); + } catch(e) { + process.stdout.write(e); + } +} + +function findBodyTag(html) { + // get the body tag + try{ + return html.match(/<body(?=[\s>])(.*?)>/gi)[0]; + }catch(e){} +} + +function findClassAttr(bodyTag) { + // get the body tag's class attribute + try{ + return bodyTag.match(/ class=["|'](.*?)["|']/gi)[0]; + }catch(e){} +} + +if (rootdir) { + + // go through each of the platform directories that have been prepared + var platforms = (process.env.CORDOVA_PLATFORMS ? process.env.CORDOVA_PLATFORMS.split(',') : []); + + for(var x=0; x<platforms.length; x++) { + // open up the index.html file at the www root + try { + var platform = platforms[x].trim().toLowerCase(); + var indexPath; + + if(platform == 'android') { + indexPath = path.join('platforms', platform, 'assets', 'www', 'index.html'); + } else { + indexPath = path.join('platforms', platform, 'www', 'index.html'); + } + + if(fs.existsSync(indexPath)) { + addPlatformBodyTag(indexPath, platform); + } + + } catch(e) { + process.stdout.write(e); + } + } + +}
A
package.json
@@ -0,0 +1,26 @@
+{ + "name": "openeventsplatformapp", + "version": "1.1.1", + "description": "openEventsPlatformApp: An Ionic project", + "dependencies": { + "gulp": "^3.5.6", + "gulp-sass": "^2.0.4", + "gulp-concat": "^2.2.0", + "gulp-minify-css": "^0.3.0", + "gulp-rename": "^1.2.0" + }, + "devDependencies": { + "bower": "^1.3.3", + "gulp-util": "^2.2.14", + "shelljs": "^0.3.0" + }, + "cordovaPlugins": [ + "cordova-plugin-whitelist", + "cordova-plugin-statusbar", + "cordova-plugin-console", + "cordova-plugin-device", + "cordova-plugin-splashscreen", + "ionic-plugin-keyboard" + ], + "cordovaPlatforms": [] +}
A
scss/ionic.app.scss
@@ -0,0 +1,23 @@
+/* +To customize the look and feel of Ionic, you can override the variables +in ionic's _variables.scss file. + +For example, you might change some of the default colors: + +$light: #fff !default; +$stable: #f8f8f8 !default; +$positive: #387ef5 !default; +$calm: #11c1f3 !default; +$balanced: #33cd5f !default; +$energized: #ffc900 !default; +$assertive: #ef473a !default; +$royal: #886aea !default; +$dark: #444 !default; +*/ + +// The path for our ionicons font files, relative to the built CSS in www/css +$ionicons-font-path: "../lib/ionic/fonts" !default; + +// Include all of Ionic +@import "www/lib/ionic/scss/ionic"; +
A
www/index.html
@@ -0,0 +1,56 @@
+<!DOCTYPE html> +<html> + <head> + <meta charset="utf-8"> + <meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no, width=device-width"> + <title></title> + + <link rel="manifest" href="manifest.json"> + + <!-- 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="lib/ionic/css/ionic.css" rel="stylesheet"> + <link href="css/style.css" rel="stylesheet"> + + <!-- IF using Sass (run gulp sass first), then uncomment below and remove the CSS includes above + <link href="css/ionic.app.css" rel="stylesheet"> + --> + + <!-- ionic/angularjs js --> + <script src="lib/ionic/js/ionic.bundle.js"></script> + + <!-- cordova script (this will be a 404 during development) --> + <script src="cordova.js"></script> + + <!-- openstreetmaps angular - leaflet --> + <script src="lib/leaflet/dist/leaflet.js"></script> + <script src="lib/angular-simple-logger/dist/angular-simple-logger.js"></script> + <!--<script src="lib/ui-leaflet/dist/ui-leaflet_dev_mapped.js"></script>--> + <script src="lib/ui-leaflet/dist/ui-leaflet.js"></script> + <link rel="stylesheet" href="lib/leaflet/dist/leaflet.css" /> + + <!-- Angular Translate --> + <script src="lib/angular-translate/angular-translate.js"></script> + <script src="js/translations.js"></script> + + <!-- your app's js --> + <script src="js/app.js"></script> + <script src="js/menu.js"></script> + <script src="js/events.js"></script> + <script src="js/event.js"></script> + <script src="js/users.js"></script> + <script src="js/user.js"></script> + + </head> + + <body ng-app="app"> + <ion-nav-view></ion-nav-view> + </body> +</html>
A
www/js/app.js
@@ -0,0 +1,125 @@
+var urlapi = "http://localhost:3000/api/"; + + +angular.module('app', [ + 'ionic', + 'pascalprecht.translate', + 'app.menu', + 'app.events', + 'app.event', + 'app.users', + 'app.user' + ]) + +.run(function($ionicPlatform) { + $ionicPlatform.ready(function() { + // Hide the accessory bar by default (remove this to show the accessory bar above the keyboard + // for form inputs) + if (window.cordova && window.cordova.plugins.Keyboard) { + cordova.plugins.Keyboard.hideKeyboardAccessoryBar(true); + cordova.plugins.Keyboard.disableScroll(true); + + } + if (window.StatusBar) { + // org.apache.cordova.statusbar required + StatusBar.styleDefault(); + } + }); +}) + +.config(function($stateProvider, $urlRouterProvider) { + $stateProvider + + // setup an abstract state for the tabs directive + .state('app', { + url: '/app', + abstract: true, + templateUrl: 'templates/menu.html', + controller: 'MenuCtrl' + }) + + // Each tab has its own nav history stack: + + .state('app.events', { + url: '/events', + views: { + 'menuContent': { + templateUrl: 'templates/events.html', + controller: 'EventsCtrl' + } + } + }).state('app.event', { + url: '/events/:eventid', + views: { + 'menuContent': { + templateUrl: 'templates/event.html', + controller: 'EventCtrl' + } + } + }) + .state('app.users', { + url: '/users', + views: { + 'menuContent': { + templateUrl: 'templates/users.html', + controller: 'UsersCtrl' + } + } + }) + .state('app.user', { + url: '/users/:userid', + views: { + 'menuContent': { + templateUrl: 'templates/user.html', + controller: 'UserCtrl' + } + } + }); + + // if none of the above states are matched, use this as the fallback + $urlRouterProvider.otherwise('/app/events'); +}) + /* translator */ + .config(['$translateProvider', function($translateProvider) { + + /* get lang from the file translations.js */ + for (lang in translations) { + $translateProvider.translations(lang, translations[lang]); + } + + if (window.localStorage.getItem('lang')) { + $translateProvider.preferredLanguage(window.localStorage.getItem('lang')); + } else { + $translateProvider.preferredLanguage('english'); + }; + + $translateProvider.useSanitizeValueStrategy('escape'); + + }]) + .factory('httpInterceptor', function httpInterceptor($q, $window, $location) { + return { + request: function(config) { + return config; + }, + requestError: function(config) { + return config; + }, + response: function(res) { + return res; + }, + responseError: function(res) { + return res; + } + } + }) + .factory('api', function($http) { + return { + init: function() { + $http.defaults.headers.common['X-Access-Token'] = localStorage.getItem("cim_app_token"); + $http.defaults.headers.post['X-Access-Token'] = localStorage.getItem("cim_app_token"); + } + }; + }) + .run(function(api) { + api.init(); + });
A
www/js/event.js
@@ -0,0 +1,57 @@
+angular.module('app.event', ['pascalprecht.translate', 'ui-leaflet']) + +.controller('EventCtrl', function($scope, $http, $ionicModal, + $stateParams, $timeout, $ionicLoading, $filter, + leafletData, leafletBoundsHelpers) { + + + $scope.center= { + lat: 0, + lng: 0, + zoom: 1 + }; + $scope.markers=[]; + $scope.tiles= { + url: "http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png", + options: { + attribution: '<a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors' + } + }; + + + $scope.event={}; + $scope.doRefresh = function() { + /* events refresh: */ + $http.get(urlapi + 'events/id/'+ $stateParams.eventid) + .then(function(data){ + console.log('data success events'); + console.log(data); // for browser console + //$scope.events = data.data; // for UI + $scope.event=data.data; + $scope.$broadcast('scroll.refreshComplete');//refresher stop + + if($scope.event.location) + { + $scope.markers=[]; + $scope.markers.push({ + lat: Number($scope.event.location.geo.lat), + lng: Number($scope.event.location.geo.long), + message: $scope.event.location.name + }); + $scope.center= { + lat: (Number($scope.travel.from.lat)+Number($scope.travel.to.lat))/2, + lng: (Number($scope.travel.from.long)+Number($scope.travel.to.long))/2, + zoom: 4 + }; + } + + }, function(data){ + console.log('data error'); + $scope.$broadcast('scroll.refreshComplete');//refresher stop + $ionicLoading.show({ template: 'Error connecting server', noBackdrop: true, duration: 2000 }); + + }); + }; + $scope.doRefresh(); + +});
A
www/js/events.js
@@ -0,0 +1,27 @@
+angular.module('app.events', ['pascalprecht.translate']) + +.controller('EventsCtrl', function($scope, $http, $ionicModal, $timeout, $ionicLoading, $filter) { + + + $scope.events=[]; + $scope.page=0; + $scope.doRefresh = function() { + /* events refresh: */ + $http.get(urlapi + 'events?page=' + $scope.page) + .then(function(data){ + console.log('data success events'); + console.log(data); // for browser console + //$scope.events = data.data; // for UI + $scope.events=data.data; + $scope.$broadcast('scroll.refreshComplete');//refresher stop + + }, function(data){ + console.log('data error'); + $scope.$broadcast('scroll.refreshComplete');//refresher stop + $ionicLoading.show({ template: 'Error connecting server', noBackdrop: true, duration: 2000 }); + + }); + }; + $scope.doRefresh(); + +});
A
www/js/translations.js
@@ -0,0 +1,7 @@
+var translations = { + "english": { + "Actual_language": "Actual language: ", + "Menu": "Menu", + "Signup": "Signup" + } +};
A
www/js/user.js
@@ -0,0 +1,54 @@
+angular.module('app.user', ['pascalprecht.translate', 'ui-leaflet']) + +.controller('UserCtrl', function($scope, $http, $ionicModal, + $stateParams, $timeout, $ionicLoading, $filter, + leafletData, leafletBoundsHelpers) { + + $scope.center= { + lat: 0, + lng: 0, + zoom: 1 + }; + $scope.markers=[]; + $scope.tiles= { + url: "http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png", + options: { + attribution: '<a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors' + } + }; + + $scope.user={}; + $scope.doRefresh = function() { + /* events refresh: */ + $http.get(urlapi + 'users/id/'+ $stateParams.userid) + .then(function(data){ + console.log('data success events'); + console.log(data); // for browser console + //$scope.events = data.data; // for UI + $scope.user=data.data; + $scope.$broadcast('scroll.refreshComplete');//refresher stop + if($scope.user.location) + { + $scope.markers=[]; + $scope.markers.push({ + lat: Number($scope.user.location.geo.lat), + lng: Number($scope.user.location.geo.long), + message: $scope.user.location.name + }); + $scope.center= { + lat: Number($scope.user.location.geo.lat), + lng: Number($scope.user.location.geo.long), + zoom: 16 + }; + } + + }, function(data){ + console.log('data error'); + $scope.$broadcast('scroll.refreshComplete');//refresher stop + $ionicLoading.show({ template: 'Error connecting server', noBackdrop: true, duration: 2000 }); + + }); + }; + $scope.doRefresh(); + +});
A
www/js/users.js
@@ -0,0 +1,27 @@
+angular.module('app.users', ['pascalprecht.translate']) + +.controller('UsersCtrl', function($scope, $http, $ionicModal, $timeout, $ionicLoading, $filter) { + + + $scope.users=[]; + $scope.page=0; + $scope.doRefresh = function() { + /* users refresh: */ + $http.get(urlapi + 'users?page=' + $scope.page) + .then(function(data){ + console.log('data success users'); + console.log(data); // for browser console + //$scope.users = data.data; // for UI + $scope.users=data.data; + $scope.$broadcast('scroll.refreshComplete');//refresher stop + + }, function(data){ + console.log('data error'); + $scope.$broadcast('scroll.refreshComplete');//refresher stop + $ionicLoading.show({ template: 'Error connecting server', noBackdrop: true, duration: 2000 }); + + }); + }; + $scope.doRefresh(); + +});
A
www/manifest.json
@@ -0,0 +1,12 @@
+ +{ + "name": "My Ionic App", + "short_name": "My Ionic App", + "start_url": "index.html", + "display": "standalone", + "icons": [{ + "src": "icon.png", + "sizes": "512x512", + "type": "image/png" + }] +}
A
www/service-worker.js
@@ -0,0 +1,12 @@
+ +self.addEventListener('activate', function (event) { + +}); + +self.addEventListener('fetch', function (event) { + +}); + +self.addEventListener('push', function (event) { + +});
A
www/templates/event.html
@@ -0,0 +1,24 @@
+<ion-view view-title="Event"> + <ion-content> + <a class="item item-avatar" ng-href="#/app/users/{{event.user._id}}"> + <img ng-src="{{event.user.img}}"> + <h2>{{event.user.username}}</h2> + <p>{{event.user.description}}</p> + </a> + <a class="item"> + <h2>{{event.title}}</h2> + <p>{{event.description}}</p> + <p>{{event.date | date: 'HH:mm, dd/MM/yyyy'}}</p> + </a> + + <div class="item item-image"> + <img ng-src="{{event.img}}"> + </div> + + <div class="item"> + <h2>Map</h2> + </div> + + <leaflet width="100%" height="40%" markers="markers" center="center" tiles="tiles" id="map-simple-map"></leaflet> + </ion-content> +</ion-view>
A
www/templates/events.html
@@ -0,0 +1,17 @@
+<ion-view view-title="Events"> + <ion-content> + <ion-refresher + pulling-text="{{'Pull_to_refresh' | translate}}..." + on-refresh="doRefresh()"> + </ion-refresher> + + <a class="item item-thumbnail-left" href="#/app/events/{{event._id}}" + ng-repeat="event in events"> + <img ng-src="{{event.img}}"> + <div class="badge item-note">{{event.user.username}}</div> + <h2>{{event.title}}</h2> + <p>{{event.description}}</p> + <p>{{event.date | date: 'HH:mm, dd/MM/yyyy'}}</p> + </a> + </ion-content> +</ion-view>
A
www/templates/tabs.html
@@ -0,0 +1,22 @@
+<!-- +Create tabs with an icon and label, using the tabs-positive style. +Each tab's child <ion-nav-view> directive will have its own +navigation history that also transitions its views in and out. +--> +<!-- tabs-color-active-balanced --> +<!--<ion-tabs class="tabs-icon-top tabs-color-active-balanced"> + + <ion-tab title="Events" icon-off="ion-calendar" icon-on="ion-calendar" href="#/app/events"> + <ion-nav-view name="tab-events"></ion-nav-view> + </ion-tab> + + <ion-tab title="People" icon-off="ion-person-stalker" icon-on="ion-person-stalker" href="#/app/users"> + <ion-nav-view name="tab-users"></ion-nav-view> + </ion-tab> + + <ion-tab title="Settings" icon-off="ion-ios-gear" icon-on="ion-ios-gear" href="#/app/settings"> + <ion-nav-view name="tab-settings"></ion-nav-view> + </ion-tab> + +</ion-tabs> +-->
A
www/templates/user.html
@@ -0,0 +1,20 @@
+<ion-view view-title="User"> + <ion-content> + <div class="item item-avatar"> + <img ng-src="{{user.img}}"> + <div class="o_pullRight"> + <span class="badge badge-balanced"> + Following + </span> + </div> + <h2>{{user.username}}</h2> + <p>{{user.email}}</p> + </div> + <div class="item item-body"> + asdf asdflk jasdfljashd fljkas dflka shdfklasd {{user.description}} + </div> + + <leaflet width="100%" height="40%" markers="markers" center="center" + tiles="tiles" id="map-simple-map"></leaflet> + </ion-content> +</ion-view>
A
www/templates/users.html
@@ -0,0 +1,18 @@
+<ion-view view-title="Users"> + <ion-content> + <ion-refresher + pulling-text="{{'Pull_to_refresh' | translate}}..." + on-refresh="doRefresh()"> + </ion-refresher> + <ion-list><!-- item-remove-animate --> + <ion-item class="item-avatar item-icon-right" + ng-repeat="user in users" type="item-text-wrap" href="#/app/users/{{user._id}}"> + <img ng-src="{{user.img}}"> + <h2>{{user.username}}</h2> + <p>{{user.email}}</p> + + <span class="badge badge-balanced">Following</span> + </ion-item> + </ion-list> + </ion-content> +</ion-view>