Aucune description

app.js 16KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580
  1. // Ionic Starter App
  2. // angular.module is a global place for creating, registering and retrieving Angular modules
  3. // 'starter' is the name of this angular module example (also set in a <body> attribute in index.html)
  4. // the 2nd parameter is an array of 'requires'
  5. // 'starter.controllers' is found in controllers.js
  6. var db;
  7. angular.module('starter', ['ionic', 'ngCordova', 'ngCordovaOauth', 'starter.controllers'])
  8. .run(function($ionicPlatform, $cordovaSQLite) {
  9. $ionicPlatform.ready(function() {
  10. // Hide the accessory bar by default (remove this to show the accessory bar above the keyboard
  11. // for form inputs)
  12. if (window.cordova && window.cordova.plugins.Keyboard) {
  13. cordova.plugins.Keyboard.hideKeyboardAccessoryBar(true);
  14. cordova.plugins.Keyboard.disableScroll(true);
  15. }
  16. if (window.StatusBar) {
  17. // org.apache.cordova.statusbar required
  18. StatusBar.styleDefault();
  19. }
  20. if (window.cordova) {
  21. try {
  22. db = $cordovaSQLite.openDB({
  23. name: "tna.db",
  24. location: 'default'
  25. });
  26. } catch (error) {
  27. alert(error);
  28. }
  29. $cordovaSQLite.execute(db, 'CREATE TABLE IF NOT EXISTS Messages (id INTEGER PRIMARY KEY AUTOINCREMENT, message TEXT)');
  30. $cordovaSQLite.execute(db, 'CREATE TABLE IF NOT EXISTS Personal(key TEXT PRIMARY KEY, value TEXT)');
  31. }
  32. });
  33. })
  34. .filter('humanize', function(){
  35. return function humanize(number) {
  36. if(number < 1000) {
  37. return number;
  38. }
  39. var si = ['K', 'M', 'G', 'T', 'P', 'H'];
  40. var exp = Math.floor(Math.log(number) / Math.log(1000));
  41. var result = number / Math.pow(1000, exp);
  42. result = (result % 1 > (1 / Math.pow(1000, exp - 1))) ? result.toFixed(2) : result.toFixed(0);
  43. return result + si[exp - 1];
  44. };
  45. })
  46. .filter('get_url', ['IMG_URI', function(IMG_URI){
  47. return function(url) {
  48. return IMG_URI + url;
  49. };
  50. }])
  51. .filter('map_link',[function(){
  52. return function(geocode) {
  53. var isIOS = ionic.Platform.isIOS();
  54. var isAndroid = ionic.Platform.isAndroid();
  55. if( isIOS ) {
  56. return "maps://?q="+geocode;
  57. }
  58. if( isAnroid ) {
  59. return "geo:"+geocode;
  60. }
  61. };
  62. }])
  63. .filter('titleCase', function() {
  64. return function(input) {
  65. input = input || '';
  66. return input.replace(/\w\S*/g, function(txt){return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();});
  67. };
  68. })
  69. .filter('get_last_array', function(){
  70. return function(arr) {
  71. if( arr.length > 0 ){
  72. var v = arr[arr.length-1];
  73. if( v == ""){
  74. return "Untitled";
  75. }else {
  76. return v;
  77. }
  78. } else
  79. return "Untitled";
  80. };
  81. })
  82. .value('THROTTLE_MILLISECONDS', 4000)
  83. //.constant('API_URI', 'http://localhost:5050')
  84. .constant('API_URI', 'http://mcotn-api.simplico.net')
  85. //.constant('IMG_URI', 'http://simplico.net:5060')
  86. .constant('IMG_URI', 'http://mcotn-backend.simplico.net')
  87. //.constant('GEN_USER_API_URI', 'http://localhost:5052')
  88. .constant('GEN_USER_API_URI', 'http://mcotn-simplitic.simplico.net')
  89. .constant('SEARCH_API', '/api/v1.0/search?collection=posts')
  90. .constant('SHARE_API', '/api/v1.0/share')
  91. .constant('USER_API', '/api/v1.0/users_social')
  92. .constant('CMS_USER_API', '/api/v1.0/users')
  93. .constant('SETTING_API', '/api/v1.0/setting')
  94. .constant('FAV_API', '/api/v1.0/fav')
  95. .constant('NOTI_API', '/api/v1.0/noti')
  96. .constant('AUTH_API', '/auth')
  97. .constant('PAGE_LIMIT', 10)
  98. .constant('DB', 'lively.db')
  99. .constant('PUBLIC_TOKEN', 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoicHVibGljIiwicm9sZXMiOlsicHVibGljIl0sImV4cCI6MTczNDE2NTcxMCwiaWF0IjoxNDc0OTY1NzEwLCJuYmYiOjE0NzQ5NjU3MTAsImlkZW50aXR5IjoiNTdlOWVmMjZjMjU0ZmQ4N2Q3ZmQ4MzM2In0.-9fcm5s8qYbdqBDUX7cZJ5J3AX91fe6VrCLs_S-_eBU')
  100. .config(function($stateProvider, $urlRouterProvider, $cordovaInAppBrowserProvider, $ionicConfigProvider) {
  101. var defaultOptions = {
  102. location: 'no',
  103. clearcache: 'no',
  104. toolbar: 'yes'
  105. };
  106. $ionicConfigProvider.backButton.previousTitleText(false).text('');
  107. $cordovaInAppBrowserProvider.setDefaultOptions(defaultOptions);
  108. $stateProvider
  109. .state('app', {
  110. url: '/app',
  111. abstract: true,
  112. templateUrl: 'templates/menu.html',
  113. controller: 'AppCtrl'
  114. })
  115. .state('app.search', {
  116. url: '/search',
  117. views: {
  118. 'menuContent': {
  119. templateUrl: 'templates/search.html',
  120. controller: 'SearchCtrl'
  121. }
  122. }
  123. })
  124. .state('app.login', {
  125. url: '/login',
  126. views: {
  127. 'menuContent': {
  128. templateUrl: 'templates/login.html',
  129. controller: 'LoginCtrl'
  130. }
  131. }
  132. })
  133. .state('app.view', {
  134. url: '/view/:id',
  135. views: {
  136. 'menuContent': {
  137. templateUrl: 'templates/view.html',
  138. controller: 'ViewCtrl'
  139. }
  140. }
  141. })
  142. .state('app.browse', {
  143. url: '/browse',
  144. views: {
  145. 'menuContent': {
  146. templateUrl: 'templates/browse.html'
  147. }
  148. }
  149. })
  150. .state('app.playlists', {
  151. url: '/playlists',
  152. views: {
  153. 'menuContent': {
  154. templateUrl: 'templates/playlists.html',
  155. controller: 'PlaylistsCtrl'
  156. }
  157. }
  158. })
  159. .state('app.settings', {
  160. url: '/settings',
  161. cache: false,
  162. views: {
  163. 'menuContent': {
  164. templateUrl: 'templates/settings.html',
  165. controller: 'SettingCtrl'
  166. }
  167. }
  168. })
  169. .state('app.index', {
  170. url: '/index',
  171. views: {
  172. 'menuContent': {
  173. templateUrl: 'templates/index_page.html',
  174. controller: 'IndexPageCtrl'
  175. }
  176. }
  177. })
  178. .state('app.fav', {
  179. url: '/fav',
  180. cache: false,
  181. views: {
  182. 'menuContent': {
  183. templateUrl: 'templates/index_page.html',
  184. controller: 'FavCtrl'
  185. }
  186. }
  187. })
  188. .state('app.byauthor', {
  189. url: '/byauthor/:uid',
  190. views: {
  191. 'menuContent': {
  192. templateUrl: 'templates/byauthor.html',
  193. controller: 'ByAuthorCtrl'
  194. }
  195. }
  196. })
  197. .state('app.cat', {
  198. url: '/cat/:catname',
  199. views: {
  200. 'menuContent': {
  201. templateUrl: 'templates/index_page.html',
  202. controller: 'ListPageCtrl'
  203. }
  204. }
  205. })
  206. .state('app.nearby', {
  207. url: '/nearby',
  208. cache: false,
  209. views: {
  210. 'menuContent': {
  211. templateUrl: 'templates/nearby.html',
  212. controller: 'NearbyCtrl'
  213. }
  214. }
  215. })
  216. .state('app.single', {
  217. url: '/playlists/:playlistId',
  218. views: {
  219. 'menuContent': {
  220. templateUrl: 'templates/playlist.html',
  221. controller: 'PlaylistCtrl'
  222. }
  223. }
  224. });
  225. // if none of the above states are matched, use this as the fallback
  226. $urlRouterProvider.otherwise('/app/index');
  227. })
  228. .service('mcotcms', function($http, $httpParamSerializer, API_URI, SEARCH_API, PAGE_LIMIT, SHARE_API, USER_API,GEN_USER_API_URI, AUTH_API, $cordovaSQLite, SETTING_API, FAV_API, NOTI_API, CMS_USER_API) {
  229. this.all_posts = function(){
  230. console.log("all posts");
  231. return $http({
  232. method: 'GET',
  233. url: API_URI + SEARCH_API
  234. });
  235. }
  236. this.get_share = function(id){
  237. var params = {
  238. 'id': id,
  239. 'action': 'FETCH'
  240. };
  241. var qs = $httpParamSerializer(params);
  242. return $http({
  243. method: 'POST',
  244. url: GEN_USER_API_URI + SHARE_API,
  245. data: params
  246. });
  247. }
  248. this.update_share = function(id){
  249. var params = {
  250. 'id': id,
  251. 'action': 'update'
  252. };
  253. var qs = $httpParamSerializer(params);
  254. return $http({
  255. method: 'POST',
  256. url: GEN_USER_API_URI + SHARE_API,
  257. data: params
  258. });
  259. }
  260. this.clear_data = function(){
  261. console.log("clear data");
  262. window.localStorage.clear();
  263. }
  264. this.load_data = function(){
  265. return $cordovaSQLite.execute(db, 'SELECT * FROM Messages ORDER BY id DESC');
  266. }
  267. this.load_personal_data = function(key){
  268. return $cordovaSQLite.execute(db, 'SELECT * FROM Personal where key = ?', [key]);
  269. }
  270. this.get_settings = function(token){
  271. var params = {
  272. action: 'GET'
  273. };
  274. var qs = $httpParamSerializer(params);
  275. return $http({
  276. method: 'POST',
  277. url: GEN_USER_API_URI + SETTING_API,
  278. headers: {
  279. Authorization: 'JWT '+token,
  280. },
  281. data: params
  282. });
  283. }
  284. this.post_api = function(token, action, model){
  285. var params = {
  286. 'model': model,
  287. 'action': action
  288. };
  289. return $http({
  290. method: 'POST',
  291. url: API_URI + "/api/v2.0/posts",
  292. headers: {
  293. Authorization: 'JWT '+token,
  294. },
  295. data: params
  296. });
  297. }
  298. this.by_author = function(author_id){
  299. var params = {
  300. 'id': author_id,
  301. };
  302. var qs = $httpParamSerializer(params);
  303. return $http({
  304. method: 'GET',
  305. url: API_URI + CMS_USER_API + "?id=" + author_id,
  306. data: params
  307. });
  308. }
  309. this.more_on = function(oid, options){
  310. var params = {
  311. 'method': 'moreon',
  312. 'id': oid,
  313. /*
  314. 'query': {
  315. 'meta.location': {
  316. '$near': {
  317. '$geometry': {'type': "Point", 'coordinates': [position.longitude, position.latitude]},
  318. '$maxDistance': 5000
  319. }
  320. }
  321. },*/
  322. 'type': options.type,
  323. 'version': 'short'
  324. };
  325. var qs = $httpParamSerializer(params);
  326. return $http({
  327. method: 'POST',
  328. url: API_URI + SEARCH_API,
  329. data: params
  330. });
  331. }
  332. this.nearby = function(position, options){
  333. var page = options.page;
  334. var skip = page * PAGE_LIMIT;
  335. var limit = PAGE_LIMIT;
  336. var params = {
  337. 'query': {
  338. 'location': {
  339. '$near': {
  340. '$geometry': {'type': "Point", 'coordinates': [position.longitude, position.latitude]},
  341. '$maxDistance': 5000
  342. }
  343. }
  344. },
  345. 'type': options.type,
  346. 'skip': skip,
  347. 'page': page,
  348. 'limit': limit,
  349. 'version': 'short'
  350. };
  351. var qs = $httpParamSerializer(params);
  352. return $http({
  353. method: 'POST',
  354. url: API_URI + SEARCH_API,
  355. data: params
  356. });
  357. }
  358. this.save_settings = function(token, cats){
  359. var params = {
  360. 'cats': cats,
  361. 'action': 'UPDATE'
  362. };
  363. var qs = $httpParamSerializer(params);
  364. return $http({
  365. method: 'POST',
  366. url: GEN_USER_API_URI + SETTING_API,
  367. headers: {
  368. Authorization: 'JWT '+token,
  369. },
  370. data: params
  371. });
  372. }
  373. this.get_fav = function(token, options){
  374. var page = options.page;
  375. var skip = page * PAGE_LIMIT;
  376. var limit = PAGE_LIMIT;
  377. var params = {
  378. 'action': 'GET',
  379. 'type': options.type,
  380. 'skip': skip,
  381. 'page': page,
  382. 'limit': limit
  383. };
  384. var qs = $httpParamSerializer(params);
  385. return $http({
  386. method: 'POST',
  387. url: GEN_USER_API_URI + FAV_API,
  388. headers: {
  389. Authorization: 'JWT '+token,
  390. },
  391. data: params
  392. });
  393. }
  394. this.fetch_noti = function(token, options) {
  395. var params = {
  396. 'action': 'FETCH',
  397. 'type': options.type,
  398. };
  399. var qs = $httpParamSerializer(params);
  400. return $http({
  401. method: 'POST',
  402. url: GEN_USER_API_URI + NOTI_API,
  403. headers: {
  404. Authorization: 'JWT '+token,
  405. },
  406. data: params
  407. });
  408. }
  409. this.add_fav = function(token, post_id, type){
  410. var params = {
  411. 'post_id': post_id,
  412. 'action': 'ADD',
  413. 'type': type
  414. };
  415. var qs = $httpParamSerializer(params);
  416. return $http({
  417. method: 'POST',
  418. url: GEN_USER_API_URI + FAV_API,
  419. headers: {
  420. Authorization: 'JWT '+token,
  421. },
  422. data: params
  423. });
  424. }
  425. this.store_token = function(token){
  426. var storage = window.localStorage;
  427. console.log("token is ", token);
  428. storage.setItem("token", token);
  429. return $cordovaSQLite.execute(db, 'INSERT or REPLACE INTO Personal(key, value) VALUES (?, ?)', ['token', token]);
  430. }
  431. this.get_token = function(){
  432. return window.localStorage.getItem("token");
  433. }
  434. this.get_post_by_id = function(id){
  435. var params = {
  436. 'id': id,
  437. 'version': 'full'
  438. };
  439. var qs = $httpParamSerializer(params);
  440. return $http({
  441. method: 'POST',
  442. url: API_URI + SEARCH_API,
  443. data: params
  444. });
  445. }
  446. this.login = function(username, pass) {
  447. var params = {
  448. 'username': username,
  449. 'password': pass
  450. };
  451. var qs = $httpParamSerializer(params);
  452. return $http({
  453. method: 'POST',
  454. url: GEN_USER_API_URI + AUTH_API,
  455. data: params
  456. });
  457. }
  458. this.add_user = function(user_obj){
  459. var params = {
  460. 'obj': user_obj,
  461. 'action': 'add'
  462. };
  463. var qs = $httpParamSerializer(params);
  464. return $http({
  465. method: 'POST',
  466. url: GEN_USER_API_URI + USER_API,
  467. data: params
  468. });
  469. }
  470. this.add_user_by_form = function(user_obj){
  471. var params = {
  472. 'obj': user_obj,
  473. 'action': 'register_by_form'
  474. };
  475. var qs = $httpParamSerializer(params);
  476. return $http({
  477. method: 'POST',
  478. url: GEN_USER_API_URI + USER_API,
  479. data: params
  480. });
  481. }
  482. this.get_posts = function(option) {
  483. var query = option.query;
  484. var page = option.page;
  485. var skip = page * PAGE_LIMIT;
  486. var limit = PAGE_LIMIT;
  487. var version = option.version;
  488. var params = {
  489. 'query': query,
  490. 'page': page,
  491. 'skip': skip,
  492. 'limit': limit,
  493. 'version': version,
  494. 'sort': 'desc'
  495. };
  496. var qs = $httpParamSerializer(params);
  497. console.log(qs);
  498. return $http({
  499. method: 'POST',
  500. url: API_URI + SEARCH_API,
  501. data: params
  502. });
  503. }
  504. })
  505. .directive('searchBar', [function () {
  506. return {
  507. scope: {
  508. ngModel: '='
  509. },
  510. require: ['^ionNavBar', '?ngModel'],
  511. restrict: 'E',
  512. replace: true,
  513. template: '<ion-nav-buttons side="right">'+
  514. '<div class="searchBar">'+
  515. '<div class="searchTxt" ng-show="ngModel.show">'+
  516. '<div class="bgdiv"></div>'+
  517. '<div class="bgtxt">'+
  518. '<input type="text" placeholder="Procurar..." ng-model="ngModel.txt">'+
  519. '</div>'+
  520. '</div>'+
  521. '<i class="icon placeholder-icon" ng-click="ngModel.txt=\'\';ngModel.show=!ngModel.show"></i>'+
  522. '</div>'+
  523. '</ion-nav-buttons>',
  524. compile: function (element, attrs) {
  525. var icon=attrs.icon
  526. || (ionic.Platform.isAndroid() && 'ion-android-search')
  527. || (ionic.Platform.isIOS() && 'ion-ios7-search')
  528. || 'ion-search';
  529. angular.element(element[0].querySelector('.icon')).addClass(icon);
  530. return function($scope, $element, $attrs, ctrls) {
  531. var navBarCtrl = ctrls[0];
  532. $scope.navElement = $attrs.side === 'right' ? navBarCtrl.rightButtonsElement : navBarCtrl.leftButtonsElement;
  533. };
  534. },
  535. controller: ['$scope','$ionicNavBarDelegate', function($scope,$ionicNavBarDelegate){
  536. var title, definedClass;
  537. $scope.$watch('ngModel.show', function(showing, oldVal, scope) {
  538. if(showing!==oldVal) {
  539. if(showing) {
  540. if(!definedClass) {
  541. var numicons=$scope.navElement.children().length;
  542. angular.element($scope.navElement[0].querySelector('.searchBar')).addClass('numicons'+numicons);
  543. }
  544. title = $ionicNavBarDelegate.getTitle();
  545. $ionicNavBarDelegate.setTitle('');
  546. } else {
  547. $ionicNavBarDelegate.setTitle(title);
  548. }
  549. } else if (!title) {
  550. title = $ionicNavBarDelegate.getTitle();
  551. }
  552. });
  553. }]
  554. };
  555. }]);