├── src ├── pages │ ├── chat │ │ ├── chat.scss │ │ ├── chat.module.ts │ │ ├── chat.html │ │ └── chat.ts │ ├── favs │ │ ├── favs.scss │ │ ├── favs.module.ts │ │ ├── favs.ts │ │ └── favs.html │ ├── home │ │ ├── home.scss │ │ ├── home.ts │ │ ├── home.module.ts │ │ └── home.html │ ├── list │ │ ├── list.scss │ │ ├── list.module.ts │ │ ├── list.html │ │ └── list.ts │ ├── room │ │ ├── room.scss │ │ ├── room.module.ts │ │ ├── room.html │ │ └── room.ts │ ├── about │ │ ├── about.scss │ │ ├── about.module.ts │ │ ├── about.ts │ │ └── about.html │ ├── phones │ │ ├── phones.scss │ │ ├── phones.module.ts │ │ ├── phones.html │ │ └── phones.ts │ ├── add-room │ │ ├── add-room.scss │ │ ├── add-room.module.ts │ │ ├── add-room.ts │ │ └── add-room.html │ ├── calendarview │ │ ├── calendarview.scss │ │ ├── calendarview.module.ts │ │ ├── calendarview.html │ │ └── calendarview.ts │ ├── event-detail │ │ ├── event-detail.scss │ │ ├── event-detail.module.ts │ │ ├── event-detail.ts │ │ └── event-detail.html │ └── home-chat │ │ ├── home-chat.module.ts │ │ ├── home-chat.html │ │ ├── home-chat.scss │ │ └── home-chat.ts ├── lock │ └── ionic3-calendar-en │ │ ├── index.d.ts │ │ ├── index.ts │ │ ├── calendar.png │ │ ├── index.js │ │ ├── index.js.map │ │ ├── src │ │ └── calendar │ │ │ ├── calendar.module.ts │ │ │ ├── calendar.module.js.map │ │ │ ├── pipes │ │ │ ├── month-name.ts │ │ │ ├── month-name.js.map │ │ │ └── month-name.js │ │ │ ├── calendar.html │ │ │ ├── calendar.scss │ │ │ ├── calendar.module.js │ │ │ ├── calendar.js.map │ │ │ ├── calendar.ts │ │ │ └── calendar.js │ │ ├── tsconfig.json │ │ ├── package.json │ │ └── README.md ├── assets │ └── icon │ │ └── favicon.ico ├── app │ ├── main.ts │ ├── app.html │ ├── app.scss │ ├── app.module.ts │ └── app.component.ts ├── manifest.json ├── service-worker.js ├── services │ ├── config.ts │ └── events.ts ├── index.html └── theme │ └── variables.scss ├── resources ├── icon.png ├── splash.png ├── ios │ ├── icon │ │ ├── icon.png │ │ ├── icon-40.png │ │ ├── icon-50.png │ │ ├── icon-60.png │ │ ├── icon-72.png │ │ ├── icon-76.png │ │ ├── icon@2x.png │ │ ├── icon-1024.png │ │ ├── icon-40@2x.png │ │ ├── icon-40@3x.png │ │ ├── icon-50@2x.png │ │ ├── icon-60@2x.png │ │ ├── icon-60@3x.png │ │ ├── icon-72@2x.png │ │ ├── icon-76@2x.png │ │ ├── icon-small.png │ │ ├── icon-83.5@2x.png │ │ ├── icon-small@2x.png │ │ └── icon-small@3x.png │ └── splash │ │ ├── Default-667h.png │ │ ├── Default-736h.png │ │ ├── Default~iphone.png │ │ ├── Default@2x~iphone.png │ │ ├── Default-568h@2x~iphone.png │ │ ├── Default-Landscape-736h.png │ │ ├── Default-Landscape~ipad.png │ │ ├── Default-Portrait~ipad.png │ │ ├── Default-Landscape@2x~ipad.png │ │ ├── Default-Portrait@2x~ipad.png │ │ ├── Default-Portrait@~ipadpro.png │ │ ├── Default-Landscape@~ipadpro.png │ │ └── Default@2x~universal~anyany.png ├── android │ ├── icon │ │ ├── drawable-hdpi-icon.png │ │ ├── drawable-ldpi-icon.png │ │ ├── drawable-mdpi-icon.png │ │ ├── drawable-xhdpi-icon.png │ │ ├── drawable-xxhdpi-icon.png │ │ └── drawable-xxxhdpi-icon.png │ └── splash │ │ ├── drawable-land-hdpi-screen.png │ │ ├── drawable-land-ldpi-screen.png │ │ ├── drawable-land-mdpi-screen.png │ │ ├── drawable-land-xhdpi-screen.png │ │ ├── drawable-port-hdpi-screen.png │ │ ├── drawable-port-ldpi-screen.png │ │ ├── drawable-port-mdpi-screen.png │ │ ├── drawable-port-xhdpi-screen.png │ │ ├── drawable-land-xxhdpi-screen.png │ │ ├── drawable-land-xxxhdpi-screen.png │ │ ├── drawable-port-xxhdpi-screen.png │ │ └── drawable-port-xxxhdpi-screen.png └── README.md ├── static └── img │ └── promo.jpg ├── ionic.config.json ├── tslint.json ├── .editorconfig ├── .gitignore ├── tsconfig.json ├── google-services.json ├── GoogleService-Info.plist ├── README.md ├── terms.html ├── package.json ├── config.xml ├── privacy.html └── LICENSE /src/pages/chat/chat.scss: -------------------------------------------------------------------------------- 1 | page-chat { 2 | 3 | } 4 | -------------------------------------------------------------------------------- /src/pages/favs/favs.scss: -------------------------------------------------------------------------------- 1 | page-favs { 2 | 3 | } 4 | -------------------------------------------------------------------------------- /src/pages/home/home.scss: -------------------------------------------------------------------------------- 1 | page-home { 2 | 3 | } 4 | -------------------------------------------------------------------------------- /src/pages/list/list.scss: -------------------------------------------------------------------------------- 1 | page-list { 2 | 3 | } 4 | -------------------------------------------------------------------------------- /src/pages/room/room.scss: -------------------------------------------------------------------------------- 1 | page-room { 2 | 3 | } 4 | -------------------------------------------------------------------------------- /src/pages/about/about.scss: -------------------------------------------------------------------------------- 1 | page-about { 2 | 3 | } 4 | -------------------------------------------------------------------------------- /src/pages/phones/phones.scss: -------------------------------------------------------------------------------- 1 | page-phones { 2 | 3 | } 4 | -------------------------------------------------------------------------------- /src/pages/add-room/add-room.scss: -------------------------------------------------------------------------------- 1 | page-add-room { 2 | 3 | } 4 | -------------------------------------------------------------------------------- /src/pages/calendarview/calendarview.scss: -------------------------------------------------------------------------------- 1 | page-calendarview { 2 | 3 | } 4 | -------------------------------------------------------------------------------- /src/pages/event-detail/event-detail.scss: -------------------------------------------------------------------------------- 1 | page-event-detail { 2 | 3 | } 4 | -------------------------------------------------------------------------------- /resources/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/piraces/fiestasEjea/master/resources/icon.png -------------------------------------------------------------------------------- /resources/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/piraces/fiestasEjea/master/resources/splash.png -------------------------------------------------------------------------------- /static/img/promo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/piraces/fiestasEjea/master/static/img/promo.jpg -------------------------------------------------------------------------------- /src/lock/ionic3-calendar-en/index.d.ts: -------------------------------------------------------------------------------- 1 | export { CalendarModule } from './src/calendar/calendar.module'; -------------------------------------------------------------------------------- /src/pages/home/home.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/piraces/fiestasEjea/master/src/pages/home/home.ts -------------------------------------------------------------------------------- /src/lock/ionic3-calendar-en/index.ts: -------------------------------------------------------------------------------- 1 | export { CalendarModule } from './src/calendar/calendar.module'; 2 | -------------------------------------------------------------------------------- /resources/ios/icon/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/piraces/fiestasEjea/master/resources/ios/icon/icon.png -------------------------------------------------------------------------------- /src/assets/icon/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/piraces/fiestasEjea/master/src/assets/icon/favicon.ico -------------------------------------------------------------------------------- /resources/ios/icon/icon-40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/piraces/fiestasEjea/master/resources/ios/icon/icon-40.png -------------------------------------------------------------------------------- /resources/ios/icon/icon-50.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/piraces/fiestasEjea/master/resources/ios/icon/icon-50.png -------------------------------------------------------------------------------- /resources/ios/icon/icon-60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/piraces/fiestasEjea/master/resources/ios/icon/icon-60.png -------------------------------------------------------------------------------- /resources/ios/icon/icon-72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/piraces/fiestasEjea/master/resources/ios/icon/icon-72.png -------------------------------------------------------------------------------- /resources/ios/icon/icon-76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/piraces/fiestasEjea/master/resources/ios/icon/icon-76.png -------------------------------------------------------------------------------- /resources/ios/icon/icon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/piraces/fiestasEjea/master/resources/ios/icon/icon@2x.png -------------------------------------------------------------------------------- /resources/ios/icon/icon-1024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/piraces/fiestasEjea/master/resources/ios/icon/icon-1024.png -------------------------------------------------------------------------------- /resources/ios/icon/icon-40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/piraces/fiestasEjea/master/resources/ios/icon/icon-40@2x.png -------------------------------------------------------------------------------- /resources/ios/icon/icon-40@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/piraces/fiestasEjea/master/resources/ios/icon/icon-40@3x.png -------------------------------------------------------------------------------- /resources/ios/icon/icon-50@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/piraces/fiestasEjea/master/resources/ios/icon/icon-50@2x.png -------------------------------------------------------------------------------- /resources/ios/icon/icon-60@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/piraces/fiestasEjea/master/resources/ios/icon/icon-60@2x.png -------------------------------------------------------------------------------- /resources/ios/icon/icon-60@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/piraces/fiestasEjea/master/resources/ios/icon/icon-60@3x.png -------------------------------------------------------------------------------- /resources/ios/icon/icon-72@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/piraces/fiestasEjea/master/resources/ios/icon/icon-72@2x.png -------------------------------------------------------------------------------- /resources/ios/icon/icon-76@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/piraces/fiestasEjea/master/resources/ios/icon/icon-76@2x.png -------------------------------------------------------------------------------- /resources/ios/icon/icon-small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/piraces/fiestasEjea/master/resources/ios/icon/icon-small.png -------------------------------------------------------------------------------- /resources/ios/icon/icon-83.5@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/piraces/fiestasEjea/master/resources/ios/icon/icon-83.5@2x.png -------------------------------------------------------------------------------- /resources/ios/icon/icon-small@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/piraces/fiestasEjea/master/resources/ios/icon/icon-small@2x.png -------------------------------------------------------------------------------- /resources/ios/icon/icon-small@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/piraces/fiestasEjea/master/resources/ios/icon/icon-small@3x.png -------------------------------------------------------------------------------- /resources/ios/splash/Default-667h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/piraces/fiestasEjea/master/resources/ios/splash/Default-667h.png -------------------------------------------------------------------------------- /resources/ios/splash/Default-736h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/piraces/fiestasEjea/master/resources/ios/splash/Default-736h.png -------------------------------------------------------------------------------- /resources/ios/splash/Default~iphone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/piraces/fiestasEjea/master/resources/ios/splash/Default~iphone.png -------------------------------------------------------------------------------- /src/lock/ionic3-calendar-en/calendar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/piraces/fiestasEjea/master/src/lock/ionic3-calendar-en/calendar.png -------------------------------------------------------------------------------- /src/lock/ionic3-calendar-en/index.js: -------------------------------------------------------------------------------- 1 | export { CalendarModule } from './src/calendar/calendar.module'; 2 | //# sourceMappingURL=index.js.map -------------------------------------------------------------------------------- /resources/ios/splash/Default@2x~iphone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/piraces/fiestasEjea/master/resources/ios/splash/Default@2x~iphone.png -------------------------------------------------------------------------------- /resources/android/icon/drawable-hdpi-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/piraces/fiestasEjea/master/resources/android/icon/drawable-hdpi-icon.png -------------------------------------------------------------------------------- /resources/android/icon/drawable-ldpi-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/piraces/fiestasEjea/master/resources/android/icon/drawable-ldpi-icon.png -------------------------------------------------------------------------------- /resources/android/icon/drawable-mdpi-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/piraces/fiestasEjea/master/resources/android/icon/drawable-mdpi-icon.png -------------------------------------------------------------------------------- /resources/android/icon/drawable-xhdpi-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/piraces/fiestasEjea/master/resources/android/icon/drawable-xhdpi-icon.png -------------------------------------------------------------------------------- /resources/android/icon/drawable-xxhdpi-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/piraces/fiestasEjea/master/resources/android/icon/drawable-xxhdpi-icon.png -------------------------------------------------------------------------------- /resources/android/icon/drawable-xxxhdpi-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/piraces/fiestasEjea/master/resources/android/icon/drawable-xxxhdpi-icon.png -------------------------------------------------------------------------------- /resources/ios/splash/Default-568h@2x~iphone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/piraces/fiestasEjea/master/resources/ios/splash/Default-568h@2x~iphone.png -------------------------------------------------------------------------------- /resources/ios/splash/Default-Landscape-736h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/piraces/fiestasEjea/master/resources/ios/splash/Default-Landscape-736h.png -------------------------------------------------------------------------------- /resources/ios/splash/Default-Landscape~ipad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/piraces/fiestasEjea/master/resources/ios/splash/Default-Landscape~ipad.png -------------------------------------------------------------------------------- /resources/ios/splash/Default-Portrait~ipad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/piraces/fiestasEjea/master/resources/ios/splash/Default-Portrait~ipad.png -------------------------------------------------------------------------------- /resources/ios/splash/Default-Landscape@2x~ipad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/piraces/fiestasEjea/master/resources/ios/splash/Default-Landscape@2x~ipad.png -------------------------------------------------------------------------------- /resources/ios/splash/Default-Portrait@2x~ipad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/piraces/fiestasEjea/master/resources/ios/splash/Default-Portrait@2x~ipad.png -------------------------------------------------------------------------------- /resources/ios/splash/Default-Portrait@~ipadpro.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/piraces/fiestasEjea/master/resources/ios/splash/Default-Portrait@~ipadpro.png -------------------------------------------------------------------------------- /resources/ios/splash/Default-Landscape@~ipadpro.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/piraces/fiestasEjea/master/resources/ios/splash/Default-Landscape@~ipadpro.png -------------------------------------------------------------------------------- /resources/ios/splash/Default@2x~universal~anyany.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/piraces/fiestasEjea/master/resources/ios/splash/Default@2x~universal~anyany.png -------------------------------------------------------------------------------- /resources/android/splash/drawable-land-hdpi-screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/piraces/fiestasEjea/master/resources/android/splash/drawable-land-hdpi-screen.png -------------------------------------------------------------------------------- /resources/android/splash/drawable-land-ldpi-screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/piraces/fiestasEjea/master/resources/android/splash/drawable-land-ldpi-screen.png -------------------------------------------------------------------------------- /resources/android/splash/drawable-land-mdpi-screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/piraces/fiestasEjea/master/resources/android/splash/drawable-land-mdpi-screen.png -------------------------------------------------------------------------------- /resources/android/splash/drawable-land-xhdpi-screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/piraces/fiestasEjea/master/resources/android/splash/drawable-land-xhdpi-screen.png -------------------------------------------------------------------------------- /resources/android/splash/drawable-port-hdpi-screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/piraces/fiestasEjea/master/resources/android/splash/drawable-port-hdpi-screen.png -------------------------------------------------------------------------------- /resources/android/splash/drawable-port-ldpi-screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/piraces/fiestasEjea/master/resources/android/splash/drawable-port-ldpi-screen.png -------------------------------------------------------------------------------- /resources/android/splash/drawable-port-mdpi-screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/piraces/fiestasEjea/master/resources/android/splash/drawable-port-mdpi-screen.png -------------------------------------------------------------------------------- /resources/android/splash/drawable-port-xhdpi-screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/piraces/fiestasEjea/master/resources/android/splash/drawable-port-xhdpi-screen.png -------------------------------------------------------------------------------- /ionic.config.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "fiestasEjea", 3 | "integrations": { 4 | "cordova": {} 5 | }, 6 | "type": "ionic-angular", 7 | "pro_id": "$R_IONIC_PRO_ID" 8 | } -------------------------------------------------------------------------------- /resources/android/splash/drawable-land-xxhdpi-screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/piraces/fiestasEjea/master/resources/android/splash/drawable-land-xxhdpi-screen.png -------------------------------------------------------------------------------- /resources/android/splash/drawable-land-xxxhdpi-screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/piraces/fiestasEjea/master/resources/android/splash/drawable-land-xxxhdpi-screen.png -------------------------------------------------------------------------------- /resources/android/splash/drawable-port-xxhdpi-screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/piraces/fiestasEjea/master/resources/android/splash/drawable-port-xxhdpi-screen.png -------------------------------------------------------------------------------- /resources/android/splash/drawable-port-xxxhdpi-screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/piraces/fiestasEjea/master/resources/android/splash/drawable-port-xxxhdpi-screen.png -------------------------------------------------------------------------------- /src/lock/ionic3-calendar-en/index.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC"} -------------------------------------------------------------------------------- /src/app/main.ts: -------------------------------------------------------------------------------- 1 | import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; 2 | 3 | import { AppModule } from './app.module'; 4 | 5 | platformBrowserDynamic().bootstrapModule(AppModule); 6 | -------------------------------------------------------------------------------- /tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "rules": { 3 | "no-duplicate-variable": true, 4 | "no-unused-variable": [ 5 | true 6 | ] 7 | }, 8 | "rulesDirectory": [ 9 | "node_modules/tslint-eslint-rules/dist/rules" 10 | ] 11 | } 12 | -------------------------------------------------------------------------------- /src/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Ionic", 3 | "short_name": "Ionic", 4 | "start_url": "index.html", 5 | "display": "standalone", 6 | "icons": [{ 7 | "src": "assets/imgs/logo.png", 8 | "sizes": "512x512", 9 | "type": "image/png" 10 | }], 11 | "background_color": "#4e8ef7", 12 | "theme_color": "#4e8ef7" 13 | } -------------------------------------------------------------------------------- /src/pages/chat/chat.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { IonicPageModule } from 'ionic-angular'; 3 | import { ChatPage } from './chat'; 4 | 5 | @NgModule({ 6 | declarations: [ 7 | ChatPage, 8 | ], 9 | imports: [ 10 | IonicPageModule.forChild(ChatPage), 11 | ], 12 | }) 13 | export class ChatPageModule {} 14 | -------------------------------------------------------------------------------- /src/pages/favs/favs.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { IonicPageModule } from 'ionic-angular'; 3 | import { FavsPage } from './favs'; 4 | 5 | @NgModule({ 6 | declarations: [ 7 | FavsPage, 8 | ], 9 | imports: [ 10 | IonicPageModule.forChild(FavsPage), 11 | ], 12 | }) 13 | export class FavsPageModule {} 14 | -------------------------------------------------------------------------------- /src/pages/home/home.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { IonicPageModule } from 'ionic-angular'; 3 | import { HomePage } from './home'; 4 | 5 | @NgModule({ 6 | declarations: [ 7 | HomePage, 8 | ], 9 | imports: [ 10 | IonicPageModule.forChild(HomePage), 11 | ], 12 | }) 13 | export class HomePageModule {} 14 | -------------------------------------------------------------------------------- /src/pages/list/list.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { IonicPageModule } from 'ionic-angular'; 3 | import { ListPage } from './list'; 4 | 5 | @NgModule({ 6 | declarations: [ 7 | ListPage, 8 | ], 9 | imports: [ 10 | IonicPageModule.forChild(ListPage), 11 | ], 12 | }) 13 | export class ListPageModule {} 14 | -------------------------------------------------------------------------------- /src/pages/room/room.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { IonicPageModule } from 'ionic-angular'; 3 | import { RoomPage } from './room'; 4 | 5 | @NgModule({ 6 | declarations: [ 7 | RoomPage, 8 | ], 9 | imports: [ 10 | IonicPageModule.forChild(RoomPage), 11 | ], 12 | }) 13 | export class RoomPageModule {} 14 | -------------------------------------------------------------------------------- /src/pages/about/about.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { IonicPageModule } from 'ionic-angular'; 3 | import { AboutPage } from './about'; 4 | 5 | @NgModule({ 6 | declarations: [ 7 | AboutPage, 8 | ], 9 | imports: [ 10 | IonicPageModule.forChild(AboutPage), 11 | ], 12 | }) 13 | export class AboutPageModule {} 14 | -------------------------------------------------------------------------------- /src/pages/phones/phones.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { IonicPageModule } from 'ionic-angular'; 3 | import { PhonesPage } from './phones'; 4 | 5 | @NgModule({ 6 | declarations: [ 7 | PhonesPage, 8 | ], 9 | imports: [ 10 | IonicPageModule.forChild(PhonesPage), 11 | ], 12 | }) 13 | export class PhonesPageModule {} 14 | -------------------------------------------------------------------------------- /src/pages/add-room/add-room.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { IonicPageModule } from 'ionic-angular'; 3 | import { AddRoomPage } from './add-room'; 4 | 5 | @NgModule({ 6 | declarations: [ 7 | AddRoomPage, 8 | ], 9 | imports: [ 10 | IonicPageModule.forChild(AddRoomPage), 11 | ], 12 | }) 13 | export class AddRoomPageModule {} 14 | -------------------------------------------------------------------------------- /src/pages/home-chat/home-chat.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { IonicPageModule } from 'ionic-angular'; 3 | import { HomeChatPage } from './home-chat'; 4 | 5 | @NgModule({ 6 | declarations: [ 7 | HomeChatPage, 8 | ], 9 | imports: [ 10 | IonicPageModule.forChild(HomeChatPage), 11 | ], 12 | }) 13 | export class HomeChatPageModule {} 14 | -------------------------------------------------------------------------------- /src/pages/event-detail/event-detail.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { IonicPageModule } from 'ionic-angular'; 3 | import { EventDetailPage } from './event-detail'; 4 | 5 | @NgModule({ 6 | declarations: [ 7 | EventDetailPage, 8 | ], 9 | imports: [ 10 | IonicPageModule.forChild(EventDetailPage), 11 | ] 12 | }) 13 | export class EventDetailPageModule {} 14 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # EditorConfig helps developers define and maintain consistent coding styles between different editors and IDEs 2 | # editorconfig.org 3 | 4 | root = true 5 | 6 | [*] 7 | indent_style = space 8 | indent_size = 2 9 | 10 | # We recommend you to keep these unchanged 11 | end_of_line = lf 12 | charset = utf-8 13 | trim_trailing_whitespace = true 14 | insert_final_newline = true 15 | 16 | [*.md] 17 | trim_trailing_whitespace = false -------------------------------------------------------------------------------- /resources/README.md: -------------------------------------------------------------------------------- 1 | These are Cordova resources. You can replace icon.png and splash.png and run 2 | `ionic cordova resources` to generate custom icons and splash screens for your 3 | app. See `ionic cordova resources --help` for details. 4 | 5 | Cordova reference documentation: 6 | 7 | - Icons: https://cordova.apache.org/docs/en/latest/config_ref/images.html 8 | - Splash Screens: https://cordova.apache.org/docs/en/latest/reference/cordova-plugin-splashscreen/ 9 | -------------------------------------------------------------------------------- /src/lock/ionic3-calendar-en/src/calendar/calendar.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { IonicModule } from 'ionic-angular'; 3 | import { Calendar } from './calendar'; 4 | import { monthName } from './pipes/month-name'; 5 | @NgModule({ 6 | declarations: [ 7 | Calendar, 8 | monthName 9 | ], 10 | imports: [ 11 | IonicModule, 12 | ], 13 | exports: [ 14 | Calendar, 15 | monthName 16 | ] 17 | }) 18 | export class CalendarModule { } 19 | -------------------------------------------------------------------------------- /src/pages/calendarview/calendarview.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { IonicPageModule } from 'ionic-angular'; 3 | import { CalendarviewPage } from './calendarview'; 4 | import { CalendarModule } from '../../lock/ionic3-calendar-en'; 5 | 6 | @NgModule({ 7 | declarations: [ 8 | CalendarviewPage, 9 | ], 10 | imports: [ 11 | CalendarModule, 12 | IonicPageModule.forChild(CalendarviewPage), 13 | ], 14 | }) 15 | export class CalendarviewPageModule {} 16 | -------------------------------------------------------------------------------- /src/lock/ionic3-calendar-en/src/calendar/calendar.module.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"calendar.module.js","sourceRoot":"","sources":["calendar.module.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAc/C,IAAa,cAAc;IAA3B;IAA8B,CAAC;IAAD,qBAAC;AAAD,CAAC,AAA/B,IAA+B;AAAlB,cAAc;IAb1B,QAAQ,CAAC;QACR,YAAY,EAAE;YACZ,QAAQ;YACR,SAAS;SACV;QACD,OAAO,EAAE;YACP,WAAW;SACZ;QACD,OAAO,EAAE;YACP,QAAQ;YACR,SAAS;SACV;KACF,CAAC;GACW,cAAc,CAAI;SAAlB,cAAc"} -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Specifies intentionally untracked files to ignore when using Git 2 | # http://git-scm.com/docs/gitignore 3 | 4 | *~ 5 | *.sw[mnpcod] 6 | *.log 7 | *.tmp 8 | *.tmp.* 9 | log.txt 10 | *.sublime-project 11 | *.sublime-workspace 12 | .vscode/ 13 | npm-debug.log* 14 | 15 | .idea/ 16 | .ionic/ 17 | .sourcemaps/ 18 | .sass-cache/ 19 | .tmp/ 20 | .versions/ 21 | coverage/ 22 | dist/ 23 | node_modules/ 24 | tmp/ 25 | temp/ 26 | platforms/ 27 | plugins/ 28 | plugins/android.json 29 | plugins/ios.json 30 | www/ 31 | $RECYCLE.BIN/ 32 | 33 | .DS_Store 34 | Thumbs.db 35 | UserInterfaceState.xcuserstate 36 | src/services/config.js -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "allowSyntheticDefaultImports": true, 4 | "declaration": false, 5 | "emitDecoratorMetadata": true, 6 | "experimentalDecorators": true, 7 | "lib": [ 8 | "dom", 9 | "es2015" 10 | ], 11 | "module": "es2015", 12 | "moduleResolution": "node", 13 | "sourceMap": true, 14 | "target": "es5" 15 | }, 16 | "include": [ 17 | "src/**/*.ts" 18 | ], 19 | "exclude": [ 20 | "node_modules", 21 | "src/**/*.spec.ts", 22 | "src/**/__tests__/*.ts" 23 | ], 24 | "compileOnSave": false, 25 | "atom": { 26 | "rewriteTsconfig": false 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/app/app.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Menú 5 | 6 | 7 | 8 | 9 | 10 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /src/lock/ionic3-calendar-en/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "skipLibCheck": true, 4 | "allowSyntheticDefaultImports": true, 5 | "declaration": false, 6 | "emitDecoratorMetadata": true, 7 | "experimentalDecorators": true, 8 | "lib": [ 9 | "dom", 10 | "es2015" 11 | ], 12 | "module": "es2015", 13 | "moduleResolution": "node", 14 | "sourceMap": true, 15 | "target": "es5" 16 | }, 17 | "include": [ 18 | "src/**/*.ts", 19 | "index.ts" 20 | ], 21 | "exclude": [ 22 | "node_modules" 23 | ], 24 | "compileOnSave": false, 25 | "atom": { 26 | "rewriteTsconfig": false 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/lock/ionic3-calendar-en/src/calendar/pipes/month-name.ts: -------------------------------------------------------------------------------- 1 | import {Pipe} from '@angular/core'; 2 | 3 | @Pipe({ 4 | name: 'monthName' 5 | }) 6 | export class monthName { 7 | private lang: string; // (es or en) 8 | transform(value, args) { 9 | if (args === 'es') { this.lang = 'es'; } 10 | let monthNames = [ 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December' ]; 11 | if (this.lang === 'es') { 12 | monthNames = [ 'Enero', 'Febrero', 'Marzo', 'Abril', 'Mayo', 'Junio', 'Julio', 'Agosto', 'Septiembre', 'Octubre', 'Noviembre', 'Diciembre' ]; 13 | } 14 | return monthNames[value - 1]; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/service-worker.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Check out https://googlechromelabs.github.io/sw-toolbox/ for 3 | * more info on how to use sw-toolbox to custom configure your service worker. 4 | */ 5 | 6 | 7 | 'use strict'; 8 | importScripts('./build/sw-toolbox.js'); 9 | 10 | self.toolbox.options.cache = { 11 | name: 'ionic-cache' 12 | }; 13 | 14 | // pre-cache our key assets 15 | self.toolbox.precache( 16 | [ 17 | './build/main.js', 18 | './build/vendor.js', 19 | './build/main.css', 20 | './build/polyfills.js', 21 | 'index.html', 22 | 'manifest.json' 23 | ] 24 | ); 25 | 26 | // dynamically cache any other local assets 27 | self.toolbox.router.any('/*', self.toolbox.fastest); 28 | 29 | // for any other requests go to the network, cache, 30 | // and then only use that cached resource if your user goes offline 31 | self.toolbox.router.default = self.toolbox.networkFirst; 32 | -------------------------------------------------------------------------------- /src/lock/ionic3-calendar-en/src/calendar/pipes/month-name.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"month-name.js","sourceRoot":"","sources":["month-name.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAC,IAAI,EAAC,MAAM,eAAe,CAAC;AAKnC,IAAa,SAAS;IAAtB;IAUA,CAAC;IARC,6BAAS,GAAT,UAAU,KAAK,EAAE,IAAI;QACnB,EAAE,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC;YAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QAAC,CAAC;QACxC,IAAI,UAAU,GAAG,CAAE,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,CAAE,CAAC;QAC9I,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC;YACvB,UAAU,GAAG,CAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,CAAE,CAAC;QAC/I,CAAC;QACD,MAAM,CAAC,UAAU,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;IAC/B,CAAC;IACH,gBAAC;AAAD,CAAC,AAVD,IAUC;AAVY,SAAS;IAHrB,IAAI,CAAC;QACJ,IAAI,EAAE,WAAW;KAClB,CAAC;GACW,SAAS,CAUrB;SAVY,SAAS"} -------------------------------------------------------------------------------- /src/app/app.scss: -------------------------------------------------------------------------------- 1 | // http://ionicframework.com/docs/theming/ 2 | 3 | 4 | // App Global Sass 5 | // -------------------------------------------------- 6 | // Put style rules here that you want to apply globally. These 7 | // styles are for the entire app and not just one component. 8 | // Additionally, this file can be also used as an entry point 9 | // to import other Sass files to be included in the output CSS. 10 | // 11 | // Shared Sass variables, which can be used to adjust Ionic's 12 | // default Sass variables, belong in "theme/variables.scss". 13 | // 14 | // To declare rules for a specific mode, create a child rule 15 | // for the .md, .ios, or .wp mode classes. The mode class is 16 | // automatically applied to the element in the app. 17 | 18 | .textoInfo{ 19 | overflow: initial; 20 | white-space: initial; 21 | font-size:100%; 22 | } 23 | 24 | .no-padding { 25 | padding: 0px !important; 26 | } -------------------------------------------------------------------------------- /src/pages/add-room/add-room.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | import { IonicPage, NavController, NavParams } from 'ionic-angular'; 3 | import * as firebase from 'firebase'; 4 | 5 | /** 6 | * Generated class for the AddRoomPage page. 7 | * 8 | * See https://ionicframework.com/docs/components/#navigation for more info on 9 | * Ionic pages and navigation. 10 | */ 11 | 12 | @IonicPage() 13 | @Component({ 14 | selector: 'page-add-room', 15 | templateUrl: 'add-room.html', 16 | }) 17 | export class AddRoomPage { 18 | data = { roomname:'' }; 19 | ref = firebase.database().ref('chatrooms/'); 20 | 21 | constructor(public navCtrl: NavController, public navParams: NavParams) { 22 | } 23 | 24 | addRoom() { 25 | let newData = this.ref.push(); 26 | newData.set({ 27 | roomname:this.data.roomname 28 | }); 29 | this.navCtrl.pop(); 30 | } 31 | 32 | ionViewDidLoad() { 33 | console.log('ionViewDidLoad AddRoomPage'); 34 | } 35 | 36 | } 37 | -------------------------------------------------------------------------------- /src/pages/add-room/add-room.html: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | 10 | 13 | Añadir sala 14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | Introduce el nombre de la sala 24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |
32 | -------------------------------------------------------------------------------- /src/pages/room/room.html: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | 10 | 13 | Salas de chat 14 | 15 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | {{room.roomname}} 29 | 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /src/lock/ionic3-calendar-en/src/calendar/calendar.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |
{{displayYear}} - {{displayMonth + 1 | monthName:lang}}
8 |
9 | 10 | 11 | 12 |
13 | 14 | 15 | {{head}} 16 | 17 | 18 | 19 | 20 | {{day.date}} 21 | 22 | 23 | 24 | 25 |
26 | -------------------------------------------------------------------------------- /src/services/config.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@angular/core'; 2 | @Injectable() 3 | export class ConfigService { 4 | public firebaseConfig = { 5 | apiKey: 'AIzaSyAMGaCJ0WGTQfjPa05b5_EAHJvasbzbt_s', 6 | authDomain: 'fiestas-de-ejea.firebaseapp.com', 7 | databaseURL: 'https://fiestas-de-ejea.firebaseio.com', 8 | projectId: 'fiestas-de-ejea', 9 | storageBucket: 'fiestas-de-ejea.appspot.com', 10 | messagingSenderId: "1093028778751" 11 | }; 12 | 13 | public admobBannerIos = 'ca-app-pub-3240812764495845/9464327607'; 14 | public admobBannerAndroid = 'ca-app-pub-3240812764495845/4978287685'; 15 | 16 | public admobIntersitialIos = 'ca-app-pub-3240812764495845/6437675173'; 17 | public admobIntersitialAndroid = 'ca-app-pub-3240812764495845/2290654400'; 18 | 19 | constructor(){ 20 | 21 | } 22 | 23 | $FIREBASE_APIKEY 24 | $FIREBASE_AUTHDOMAIN 25 | $FIREBASE_DATABASEURL 26 | $FIREBASE_PROJECTID 27 | $FIREBASE_STORAGEBUCKET 28 | $FIREBASE_MESSAGESENDERID 29 | 30 | $ADMOB_BANNER_IOS 31 | $ADMOB_BANNER_ANDROID 32 | 33 | $ADMOB_INTERSITIAL_IOS 34 | $ADMOB_INTERSITIAL_ANDROID 35 | } -------------------------------------------------------------------------------- /google-services.json: -------------------------------------------------------------------------------- 1 | { 2 | "project_info": { 3 | "project_number": "$R_GS_PROJECTNUMBER", 4 | "firebase_url": "$R_GS_FIREBASEURL", 5 | "project_id": "$R_GS_PROJECTID", 6 | "storage_bucket": "$R_GS_STORAGEBUCKET" 7 | }, 8 | "client": [ 9 | { 10 | "client_info": { 11 | "mobilesdk_app_id": "$R_GS_MOBILESDK_APPID", 12 | "android_client_info": { 13 | "package_name": "$R_GS_PACKAGENAME" 14 | } 15 | }, 16 | "oauth_client": [ 17 | { 18 | "client_id": "$R_GS_CLIENTID", 19 | "client_type": 3 20 | } 21 | ], 22 | "api_key": [ 23 | { 24 | "current_key": "$R_GS_CURRENTKEY" 25 | } 26 | ], 27 | "services": { 28 | "analytics_service": { 29 | "status": 1 30 | }, 31 | "appinvite_service": { 32 | "status": 1, 33 | "other_platform_oauth_client": [] 34 | }, 35 | "ads_service": { 36 | "status": 2 37 | } 38 | } 39 | } 40 | ], 41 | "configuration_version": "1" 42 | } -------------------------------------------------------------------------------- /src/lock/ionic3-calendar-en/src/calendar/calendar.scss: -------------------------------------------------------------------------------- 1 | ion-calendar { 2 | font-family: Helvetica, Arial, sans-serif; 3 | .center { 4 | text-align: center; 5 | } 6 | .calendar-header-col { 7 | font-size: 1rem; 8 | color: #666; 9 | } 10 | .calendar-row { 11 | &:last-child { 12 | border-bottom: 1px solid #eee; 13 | } 14 | .calendar-col { 15 | display: flex; 16 | justify-content: center; 17 | padding: 0.8rem; 18 | font-size: 1.2rem; 19 | border-left: 1px solid #eee; 20 | border-top: 1px solid #eee; 21 | &:last-child { 22 | border-right: 1px solid #eee; 23 | } 24 | } 25 | .not-this-month { 26 | color: #989898; 27 | background: #eee; 28 | } 29 | .today { 30 | color: #fff; 31 | box-shadow: inset 0 0 10px #aaa; 32 | background: #46b592; 33 | } 34 | .eventBlip { 35 | background: #46b592; 36 | width: 6.5px; 37 | height: 6.5px; 38 | display: inline-block; 39 | border-radius: 6.5px; 40 | position: absolute; 41 | top: 3.5px; 42 | right: 3.5px; 43 | } 44 | .select { 45 | box-shadow: none; 46 | color: #fff; 47 | background: #46b592; 48 | } 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /src/pages/about/about.ts: -------------------------------------------------------------------------------- 1 | import { Component, ViewChild} from '@angular/core'; 2 | import { IonicPage, NavController, NavParams, Content } from 'ionic-angular'; 3 | import { InAppBrowser } from '@ionic-native/in-app-browser'; 4 | 5 | /** 6 | * Generated class for the AboutPage page. 7 | * 8 | * See https://ionicframework.com/docs/components/#navigation for more info on 9 | * Ionic pages and navigation. 10 | */ 11 | 12 | @IonicPage() 13 | @Component({ 14 | selector: 'page-about', 15 | templateUrl: 'about.html', 16 | }) 17 | export class AboutPage { 18 | @ViewChild(Content) content: Content; 19 | groups = [false, false, false, false, false]; 20 | 21 | constructor(public navCtrl: NavController, public navParams: NavParams, private iab: InAppBrowser) { 22 | } 23 | 24 | ionViewDidLoad() { 25 | console.log('ionViewDidLoad AboutPage'); 26 | } 27 | 28 | toggleGroup(id) { 29 | this.groups[id] = !this.groups[id]; 30 | let TIME_IN_MS = 300; 31 | setTimeout( () => { 32 | this.content.resize(); 33 | }, TIME_IN_MS); 34 | } 35 | 36 | //Devuelve cierto si el grupo "id" se está mostrando. 37 | isGroupShown(id) { 38 | return this.groups[id]; 39 | } 40 | 41 | openLink(link){ 42 | this.iab.create(link); 43 | } 44 | 45 | } 46 | -------------------------------------------------------------------------------- /GoogleService-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | AD_UNIT_ID_FOR_BANNER_TEST 6 | $R_AD_UNIT_ID_FOR_BANNER_TEST 7 | AD_UNIT_ID_FOR_INTERSTITIAL_TEST 8 | $R_AD_UNIT_ID_FOR_INTERSTITIAL_TEST 9 | CLIENT_ID 10 | $R_CLIENT_ID 11 | REVERSED_CLIENT_ID 12 | $R_REVERSED_CLIENT_ID 13 | API_KEY 14 | $R_API_KEY 15 | GCM_SENDER_ID 16 | $R_GCM_SENDER_ID 17 | PLIST_VERSION 18 | $R_PLIST_VERSION 19 | BUNDLE_ID 20 | $R_BUNDLE_ID 21 | PROJECT_ID 22 | $R_PROJECT_ID 23 | STORAGE_BUCKET 24 | $R_STORAGE_BUCKET 25 | IS_ADS_ENABLED 26 | 27 | IS_ANALYTICS_ENABLED 28 | 29 | IS_APPINVITE_ENABLED 30 | 31 | IS_GCM_ENABLED 32 | 33 | IS_SIGNIN_ENABLED 34 | 35 | GOOGLE_APP_ID 36 | $R_GOOGLE_APP_ID 37 | DATABASE_URL 38 | $R_DATABASE_URL 39 | 40 | -------------------------------------------------------------------------------- /src/lock/ionic3-calendar-en/src/calendar/calendar.module.js: -------------------------------------------------------------------------------- 1 | var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { 2 | var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; 3 | if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); 4 | else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; 5 | return c > 3 && r && Object.defineProperty(target, key, r), r; 6 | }; 7 | import { NgModule } from '@angular/core'; 8 | import { IonicModule } from 'ionic-angular'; 9 | import { Calendar } from './calendar'; 10 | import { monthName } from './pipes/month-name'; 11 | var CalendarModule = (function () { 12 | function CalendarModule() { 13 | } 14 | return CalendarModule; 15 | }()); 16 | CalendarModule = __decorate([ 17 | NgModule({ 18 | declarations: [ 19 | Calendar, 20 | monthName 21 | ], 22 | imports: [ 23 | IonicModule, 24 | ], 25 | exports: [ 26 | Calendar, 27 | monthName 28 | ] 29 | }) 30 | ], CalendarModule); 31 | export { CalendarModule }; 32 | //# sourceMappingURL=calendar.module.js.map -------------------------------------------------------------------------------- /src/pages/calendarview/calendarview.html: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | 10 | 13 | Calendario 14 | 15 | 16 | 17 | 18 | 19 | 20 | {{dateString}} 21 | 22 | No hay ningún evento para este día 23 | 24 | 25 | 26 | 27 | 32 | 33 | 34 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /src/lock/ionic3-calendar-en/src/calendar/pipes/month-name.js: -------------------------------------------------------------------------------- 1 | var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { 2 | var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; 3 | if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); 4 | else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; 5 | return c > 3 && r && Object.defineProperty(target, key, r), r; 6 | }; 7 | import { Pipe } from '@angular/core'; 8 | var monthName = (function () { 9 | function monthName() { 10 | } 11 | monthName.prototype.transform = function (value, args) { 12 | if (args === 'es') { 13 | this.lang = 'es'; 14 | } 15 | var monthNames = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']; 16 | if (this.lang === 'es') { 17 | monthNames = ['Enero', 'Febrero', 'Marzo', 'Abril', 'Mayo', 'Junio', 'Julio', 'Agosto', 'Septiembre', 'Octubre', 'Noviembre', 'Diciembre']; 18 | } 19 | return monthNames[value - 1]; 20 | }; 21 | return monthName; 22 | }()); 23 | monthName = __decorate([ 24 | Pipe({ 25 | name: 'monthName' 26 | }) 27 | ], monthName); 28 | export { monthName }; 29 | //# sourceMappingURL=month-name.js.map -------------------------------------------------------------------------------- /src/pages/chat/chat.html: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | 10 | 13 | Chat 14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | Elige un nombre de usuario 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | He leído y acepto los términos y condiciones de uso 32 | 33 | Términos y condiciones de uso 34 | 35 | Debes aceptar los términos y condiciones de uso y introducir un nickname 36 | 37 | 38 |
39 |
40 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Fiestas de Ejea 2 | 3 | [![Build Status](https://app.bitrise.io/app/d02708923f993056/status.svg?token=XYSePkoDu7Qt0ld6YKVbAg)](https://app.bitrise.io/app/d02708923f993056) 4 | 5 | App para las fiestas de Ejea de los caballeros desarrollada con Ionic (Angular), Firebase y con CI/CD. 6 | 7 | Actualmente disponible para Android y iOS. 8 | 9 | ![Vista de promoción](https://github.com/piraces/fiestasEjea/raw/master/static/img/promo.jpg) 10 | 11 | ## Descripción 12 | 13 | Esta app no es solo una guía de fiestas para este año... 14 | 15 | Fiestas de Ejea es la app que necesitas para enterarte y estar al día de todas las fiestas y eventos que ocurren en Ejea y sus pueblos. 16 | 17 | Contiene una completa guía de las Fiestas de la Virgen de la Oliva, así como otras fiestas características que se realizan en la comarca. 18 | 19 | Eso no es todo, además te ofrece diferentes utilidades para que no te pierdas una: 20 | 21 | - Visualización de eventos en próximos y en progreso. 22 | - Manejo de eventos favoritos y avisos para tus eventos marcados. 23 | - Chat completo, donde todo el mundo puede participar y relacionarse. 24 | - Teléfonos de interés. 25 | - Información de interés sobre las fiestas y las tradiciones. 26 | - División por categorías. 27 | - Calendario con eventos. 28 | 29 | ¡Y muchas cosas más por venir! 30 | 31 | ## Tecnologías utilizadas 32 | 33 | Ionic (Angular), Firebase y con CI/CD (Bitrise.io). 34 | 35 | ## Contribuir 36 | 37 | Todo el mundo puede contribuir abriendo un "issue", "pull request", o haciendo un "fork" del repositorio en cuestión. 38 | 39 | ## Licencia 40 | 41 | [Apache License 2.0]("https://github.com/piraces/fiestasEjea/blob/master/LICENSE") 42 | -------------------------------------------------------------------------------- /src/lock/ionic3-calendar-en/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "_args": [ 3 | [ 4 | "ionic3-calendar-en@1.1.3", 5 | "/Users/piraces/Projects/github/fiestasejea" 6 | ] 7 | ], 8 | "_from": "ionic3-calendar-en@1.1.3", 9 | "_id": "ionic3-calendar-en@1.1.3", 10 | "_inBundle": false, 11 | "_integrity": "sha512-3b9so4vnt+F5mxe//378HO1AFic8FVqXqWjjqZS7t8zQUytgrOx3uAOjvIYQqIZD+s3Y1zEa73yHso/hy13dow==", 12 | "_location": "/ionic3-calendar-en", 13 | "_phantomChildren": {}, 14 | "_requested": { 15 | "type": "version", 16 | "registry": true, 17 | "raw": "ionic3-calendar-en@1.1.3", 18 | "name": "ionic3-calendar-en", 19 | "escapedName": "ionic3-calendar-en", 20 | "rawSpec": "1.1.3", 21 | "saveSpec": null, 22 | "fetchSpec": "1.1.3" 23 | }, 24 | "_requiredBy": [ 25 | "/" 26 | ], 27 | "_resolved": "https://registry.npmjs.org/ionic3-calendar-en/-/ionic3-calendar-en-1.1.3.tgz", 28 | "_spec": "1.1.3", 29 | "_where": "/Users/piraces/Projects/github/fiestasejea", 30 | "author": { 31 | "name": "gbrits_0" 32 | }, 33 | "bugs": { 34 | "url": "https://github.com/gbrits/ionic-calendar/issues" 35 | }, 36 | "dependencies": {}, 37 | "description": "An event calendar component for the Ionic hybrid mobile development platform", 38 | "devDependencies": { 39 | "typescript": "2.3.4" 40 | }, 41 | "homepage": "https://github.com/gbrits/ionic-calendar#readme", 42 | "license": "ISC", 43 | "main": "index.js", 44 | "name": "ionic3-calendar-en", 45 | "repository": { 46 | "type": "git", 47 | "url": "git+https://github.com/gbrits/ionic-calendar.git" 48 | }, 49 | "scripts": { 50 | "test": "echo \"Error: no test specified\" && exit 1" 51 | }, 52 | "version": "1.1.3" 53 | } 54 | -------------------------------------------------------------------------------- /terms.html: -------------------------------------------------------------------------------- 1 | El uso del chat interno de “Fiestas Ejea” (esta aplicación) esta abierto a cualquier usuario que tenga acceso a la misma. 2 | Para utilizar el servicio de chat de forma activa debes aceptar las condiciones de uso y normas de comportamiento. 3 | 4 | Considerando la naturaleza de este chat de discusión en tiempo real, es imposible revisar todos y cada uno de los mensajes e información que aquí se muestran. Recuerde que nosotros no monitorizamos activamente el contenido de los mensajes y no somos responsables de la información que se muestra en los mismos. Todos los mensajes reflejan los puntos de vista del autor, y ni el prestador de servicio de la aplicación ni servicios de terceros serán responsables del contenido de cualquier mensaje. 5 | 6 | - Al acceder o hacer uso del servicio, aceptas las condiciones de uso y política de privacidad y confirmas que eres mayor de edad según las leyes de tu país o tienes autorización paterna para el uso de este servicio. 7 | 8 | Estas de acuerdo, al acceder y usar este servicio, que no lo utilizarás para enviar mensajes que contengan: 9 | 10 | Estafas o ventas de productos falsificados o no originales. 11 | 12 | Daños a personas o empresas (información falsa, injurias, difamación, amenazas, etc.). 13 | 14 | Datos personales de terceros sin consentimiento. 15 | 16 | Actividades de denegación de servicio. 17 | 18 | Descargas o enlaces a contenido con derechos de autor (software, video, audio, eventos deportivos…) sin autorización o permiso del propietario. 19 | 20 | Distribución, intercambio o difusión de cualquier tipo de contenido ilegal (enlaces a contenidos externos, perfiles, fotos, vídeos, etc). 21 | 22 | Comentarios xenófobos, racistas o difamatorios. 23 | 24 | Cualquier otro tipo de actividades o contenidos ilícitos. 25 | -------------------------------------------------------------------------------- /src/pages/room/room.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | import { IonicPage, NavController, NavParams } from 'ionic-angular'; 3 | import { AddRoomPage } from '../add-room/add-room'; 4 | import { HomeChatPage } from '../home-chat/home-chat'; 5 | import * as firebase from 'firebase'; 6 | /** 7 | * Generated class for the RoomPage page. 8 | * 9 | * See https://ionicframework.com/docs/components/#navigation for more info on 10 | * Ionic pages and navigation. 11 | */ 12 | 13 | @IonicPage() 14 | @Component({ 15 | selector: 'page-room', 16 | templateUrl: 'room.html', 17 | }) 18 | export class RoomPage { 19 | rooms = []; 20 | ref = firebase.database().ref('chatrooms/'); 21 | 22 | constructor(public navCtrl: NavController, public navParams: NavParams) { 23 | this.ref.on('value', resp => { 24 | this.rooms = []; 25 | this.rooms = snapshotToArray(resp); 26 | }); 27 | } 28 | 29 | addRoom() { 30 | this.navCtrl.push(AddRoomPage); 31 | } 32 | 33 | joinRoom(key) { 34 | this.navCtrl.setRoot(HomeChatPage, { 35 | key:key, 36 | nickname:this.navParams.get("nickname") 37 | }); 38 | } 39 | 40 | ionViewDidLoad() { 41 | console.log('ionViewDidLoad RoomPage'); 42 | } 43 | } 44 | 45 | export const snapshotToArray = snapshot => { 46 | let returnArr = []; 47 | let pinnedArr = []; 48 | let communityArr = []; 49 | 50 | snapshot.forEach(childSnapshot => { 51 | let item = childSnapshot.val(); 52 | item.key = childSnapshot.key; 53 | returnArr.push(item); 54 | }); 55 | returnArr.forEach(element => { 56 | if(element.pinned){ 57 | pinnedArr.push(element); 58 | } else { 59 | communityArr.push(element); 60 | } 61 | }); 62 | pinnedArr.sort(); 63 | communityArr.sort(); 64 | returnArr = pinnedArr.concat(communityArr); 65 | return returnArr; 66 | }; -------------------------------------------------------------------------------- /src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Fiestas de Ejea 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | -------------------------------------------------------------------------------- /src/pages/home-chat/home-chat.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 | Sala de chat 8 | 9 | 10 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | {{chat.sendDate | date:'short'}} 22 | {{chat.message}} 23 |
24 | 25 |
26 |
27 | Yo 28 | {{chat.sendDate | date:'short'}} 29 |

{{chat.message}}

30 |
31 |
32 |
33 |
34 | {{chat.user}} 35 | {{chat.sendDate | date:'short'}} 36 |

{{chat.message}}

37 |
38 |
39 |
40 |
41 |
42 |
43 | 44 | 45 | 46 | 47 | 50 | 51 | 52 | -------------------------------------------------------------------------------- /src/pages/chat/chat.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | import { IonicPage, NavController, NavParams } from 'ionic-angular'; 3 | import { RoomPage } from '../room/room'; 4 | import { InAppBrowser } from '@ionic-native/in-app-browser'; 5 | import { Storage } from '@ionic/storage'; 6 | 7 | /** 8 | * Generated class for the ChatPage page. 9 | * 10 | * See https://ionicframework.com/docs/components/#navigation for more info on 11 | * Ionic pages and navigation. 12 | */ 13 | 14 | @IonicPage() 15 | @Component({ 16 | selector: 'page-chat', 17 | templateUrl: 'chat.html', 18 | }) 19 | export class ChatPage { 20 | terms: boolean; 21 | error: boolean = false; 22 | data = { nickname:"" }; 23 | 24 | constructor(public navCtrl: NavController, public navParams: NavParams, private iab: InAppBrowser, public storage: Storage) { 25 | this.get("nickname").then((result)=>{ 26 | if(result != null){ 27 | this.data.nickname = result; 28 | } 29 | }); 30 | this.get("terms").then((result)=>{ 31 | if(result != null){ 32 | this.terms = result; 33 | } 34 | }); 35 | } 36 | 37 | enterNickname() { 38 | if(this.terms === true && this.data.nickname.length > 0){ 39 | this.error = false; 40 | this.set("nickname", this.data.nickname); 41 | this.set("terms", this.terms); 42 | this.navCtrl.setRoot(RoomPage, { 43 | nickname: this.data.nickname 44 | }); 45 | } else { 46 | this.error = true; 47 | } 48 | } 49 | 50 | ionViewDidLoad() { 51 | console.log('ionViewDidLoad ChatPage'); 52 | } 53 | 54 | openLink(link){ 55 | this.iab.create(link); 56 | } 57 | 58 | public set(settingName, value) { 59 | return this.storage.set(`setting:${settingName}`, value); 60 | } 61 | public async get(settingName) { 62 | return await this.storage.get(`setting:${settingName}`); 63 | } 64 | public async remove(settingName) { 65 | return await this.storage.remove(`setting:${settingName}`); 66 | } 67 | public async keys() { 68 | return await this.storage.keys(); 69 | } 70 | public clear() { 71 | this.storage.clear().then(() => { 72 | console.log('all keys cleared'); 73 | }); 74 | } 75 | 76 | } 77 | -------------------------------------------------------------------------------- /src/pages/favs/favs.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | import { IonicPage, NavController, NavParams } from 'ionic-angular'; 3 | import { Storage } from '@ionic/storage'; 4 | import { Md5 } from 'ts-md5/dist/md5'; 5 | import { EventsService } from '../../services/events'; 6 | 7 | /** 8 | * Generated class for the FavsPage page. 9 | * 10 | * See https://ionicframework.com/docs/components/#navigation for more info on 11 | * Ionic pages and navigation. 12 | */ 13 | 14 | @IonicPage() 15 | @Component({ 16 | selector: 'page-favs', 17 | templateUrl: 'favs.html', 18 | }) 19 | export class FavsPage { 20 | favEvents: any = []; 21 | 22 | 23 | constructor(public navCtrl: NavController, public navParams: NavParams, public storage: Storage, public events: EventsService) { 24 | this.keys().then(data => { 25 | events.allEvents.forEach(original => { 26 | data.forEach(element => { 27 | let key = element.replace('setting:', ''); 28 | let hash = Md5.hashStr(JSON.stringify(original)).toString(); 29 | if(key == hash){ 30 | let mainImage = ""; 31 | let starred = true; 32 | this.favEvents.push({starred: starred, mainImage: mainImage, event: original}); 33 | } 34 | }); 35 | }); 36 | }); 37 | } 38 | 39 | ionViewDidLoad() { 40 | console.log('ionViewDidLoad FavsPage'); 41 | } 42 | 43 | customTrackBy(index: number, obj: any): any { 44 | return index; 45 | } 46 | 47 | unstarEvent(item){ 48 | let hash = Md5.hashStr(JSON.stringify(item.event)).toString(); 49 | var index = this.favEvents.indexOf(item); 50 | if (index > -1) { 51 | this.favEvents.splice(index, 1); 52 | } 53 | this.remove(hash); 54 | // this.localNotifications.cancel(hash.toString()); 55 | } 56 | 57 | public set(settingName,value){ 58 | return this.storage.set(`setting:${ settingName }`,value); 59 | } 60 | public async get(settingName){ 61 | return await this.storage.get(`setting:${ settingName }`); 62 | } 63 | public async remove(settingName){ 64 | return await this.storage.remove(`setting:${ settingName }`); 65 | } 66 | public async keys(){ 67 | return await this.storage.keys(); 68 | } 69 | public clear() { 70 | this.storage.clear().then(() => { 71 | console.log('all keys cleared'); 72 | }); 73 | } 74 | 75 | } 76 | -------------------------------------------------------------------------------- /src/pages/event-detail/event-detail.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | import { IonicPage, NavController, NavParams } from 'ionic-angular'; 3 | import { Storage } from '@ionic/storage'; 4 | import { Md5 } from 'ts-md5/dist/md5'; 5 | 6 | /** 7 | * Generated class for the EventDetailPage page. 8 | * 9 | * See https://ionicframework.com/docs/components/#navigation for more info on 10 | * Ionic pages and navigation. 11 | */ 12 | 13 | @IonicPage() 14 | @Component({ 15 | selector: 'page-event-detail', 16 | templateUrl: 'event-detail.html', 17 | }) 18 | export class EventDetailPage { 19 | mainImage: string; 20 | event: any; 21 | starred: boolean; 22 | hash: any; 23 | hashEvent: any; 24 | 25 | constructor(public navCtrl: NavController, public navParams: NavParams, public storage: Storage) { 26 | this.event = navParams.data; 27 | this.mainImage = ""; 28 | this.hash = Md5.hashStr(JSON.stringify(this.event)).toString(); 29 | this.hashEvent = this.event; 30 | this.get(this.hash).then(data => { 31 | this.starred = data != null; 32 | }); 33 | 34 | } 35 | 36 | ionViewDidLoad() { 37 | console.log('ionViewDidLoad EventDetailPage'); 38 | } 39 | 40 | unstarEvent(){ 41 | this.remove(this.hash); 42 | this.starred = false; 43 | // this.localNotifications.cancel(this.hash.toString()); 44 | } 45 | 46 | starEvent(){ 47 | this.set(this.hash, this.hash).then(result => { 48 | this.starred = true; 49 | // let scheduledDate = this.hashEvent.start; 50 | // scheduledDate.setHours(scheduledDate.getHours() - 1); 51 | // this.localNotifications.schedule({ 52 | // id: this.hash.toString(), 53 | // title: this.hashEvent.title.toString(), 54 | // text: 'El evento: "' + this.hashEvent.title.toString() + ' comienza en 1h', 55 | // trigger: {at: scheduledDate} 56 | // }); 57 | }); 58 | } 59 | 60 | public set(settingName,value){ 61 | return this.storage.set(`setting:${ settingName }`,value); 62 | } 63 | public async get(settingName){ 64 | return await this.storage.get(`setting:${ settingName }`); 65 | } 66 | public async remove(settingName){ 67 | return await this.storage.remove(`setting:${ settingName }`); 68 | } 69 | public clear() { 70 | this.storage.clear().then(() => { 71 | console.log('all keys cleared'); 72 | }); 73 | } 74 | 75 | } 76 | -------------------------------------------------------------------------------- /src/pages/event-detail/event-detail.html: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | 10 | 13 | Detalle del evento 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 26 | 29 | 30 | 31 | 32 | 33 |

{{event.title}}

34 |

{{event.description}}

35 |
36 | 37 | 38 | 39 |

Artista(s):

40 |

{{event.artists}}

41 |
42 | 43 | 44 | 45 |

Colaboran:

46 |

{{event.colaborators}}

47 |
48 | 49 | 50 | 51 |

Lugar:

52 |

{{event.place}}

53 |
54 | 55 | 56 | {{event.start.toLocaleDateString('es-ES', { weekday: 'short', month: 'short', day: 'numeric' })}} - {{event.start.toTimeString().split(' ')[0].substring(0, 5)}} 57 | ➡ {{event.end.toLocaleDateString('es-ES', { weekday: 'short', month: 'short', day: 'numeric' })}} - {{event.end.toTimeString().split(' ')[0].substring(0, 5)}} 58 | 59 | 60 |
61 |
62 |
63 | -------------------------------------------------------------------------------- /src/theme/variables.scss: -------------------------------------------------------------------------------- 1 | // Ionic Variables and Theming. For more info, please see: 2 | // http://ionicframework.com/docs/theming/ 3 | 4 | // Font path is used to include ionicons, 5 | // roboto, and noto sans fonts 6 | $font-path: "../assets/fonts"; 7 | 8 | 9 | // The app direction is used to include 10 | // rtl styles in your app. For more info, please see: 11 | // http://ionicframework.com/docs/theming/rtl-support/ 12 | $app-direction: ltr; 13 | 14 | 15 | @import "ionic.globals"; 16 | 17 | 18 | // Shared Variables 19 | // -------------------------------------------------- 20 | // To customize the look and feel of this app, you can override 21 | // the Sass variables found in Ionic's source scss files. 22 | // To view all the possible Ionic variables, see: 23 | // http://ionicframework.com/docs/theming/overriding-ionic-variables/ 24 | 25 | 26 | 27 | 28 | // Named Color Variables 29 | // -------------------------------------------------- 30 | // Named colors makes it easy to reuse colors on various components. 31 | // It's highly recommended to change the default colors 32 | // to match your app's branding. Ionic uses a Sass map of 33 | // colors so you can add, rename and remove colors as needed. 34 | // The "primary" color is the only required color in the map. 35 | 36 | $colors: ( 37 | primary: #488aff, 38 | secondary: #32db64, 39 | danger: #f53d3d, 40 | light: #f4f4f4, 41 | dark: #222 42 | ); 43 | 44 | 45 | // App iOS Variables 46 | // -------------------------------------------------- 47 | // iOS only Sass variables can go here 48 | 49 | 50 | 51 | 52 | // App Material Design Variables 53 | // -------------------------------------------------- 54 | // Material Design only Sass variables can go here 55 | 56 | 57 | 58 | 59 | // App Windows Variables 60 | // -------------------------------------------------- 61 | // Windows only Sass variables can go here 62 | 63 | 64 | 65 | 66 | // App Theme 67 | // -------------------------------------------------- 68 | // Ionic apps can have different themes applied, which can 69 | // then be future customized. This import comes last 70 | // so that the above variables are used and Ionic's 71 | // default are overridden. 72 | 73 | @import "ionic.theme.default"; 74 | 75 | 76 | // Ionicons 77 | // -------------------------------------------------- 78 | // The premium icon font for Ionic. For more info, please see: 79 | // http://ionicframework.com/docs/ionicons/ 80 | 81 | @import "ionic.ionicons"; 82 | 83 | 84 | // Fonts 85 | // -------------------------------------------------- 86 | 87 | @import "roboto"; 88 | @import "noto-sans"; 89 | -------------------------------------------------------------------------------- /src/services/events.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@angular/core'; 2 | import { HttpClient } from '@angular/common/http'; 3 | import { Storage } from '@ionic/storage'; 4 | import { Pro } from '@ionic/pro'; 5 | 6 | import { Observable } from "rxjs/Rx"; 7 | 8 | @Injectable() 9 | export class EventsService { 10 | public allEvents: any; 11 | 12 | constructor(private http: HttpClient, public storage: Storage){ 13 | 14 | } 15 | 16 | load(): Promise { 17 | return new Promise((resolve) => { 18 | this.http.get("https://raw.githubusercontent.com/piraces/fiestasEjea/master/events.min.json", {responseType: 'text'}) 19 | .timeout(5000) 20 | .catch((err) => { 21 | let details = err.json(); 22 | Pro.monitoring.handleNewError(details); 23 | this.allEvents = []; 24 | resolve(true); 25 | return Observable.throw(new Error(details)); 26 | }).subscribe( 27 | response => { 28 | var events = JSON.parse(response); 29 | events.forEach(element => { 30 | element.start = new Date(element.start); 31 | element.end = new Date(element.end); 32 | }); 33 | this.allEvents = events; 34 | resolve(true); 35 | }, 36 | error => { 37 | // Try to get from localstorage 38 | this.get("localevents").then(result => { 39 | if(result != null){ 40 | // LocalStorage 41 | var events = JSON.parse(result); 42 | events.forEach(element => { 43 | element.start = new Date(element.start); 44 | element.end = new Date(element.end); 45 | }); 46 | this.allEvents = events; 47 | resolve(true); 48 | } else { 49 | this.allEvents = []; 50 | resolve(true); 51 | } 52 | }); 53 | }, 54 | () => { 55 | // 'onCompleted' callback. 56 | // No errors, route to new page here 57 | }); 58 | }); 59 | } 60 | 61 | public set(settingName, value) { 62 | return this.storage.set(`setting:${settingName}`, value); 63 | } 64 | public async get(settingName) { 65 | return await this.storage.get(`setting:${settingName}`); 66 | } 67 | public async remove(settingName) { 68 | return await this.storage.remove(`setting:${settingName}`); 69 | } 70 | public async keys() { 71 | return await this.storage.keys(); 72 | } 73 | public clear() { 74 | this.storage.clear().then(() => { 75 | console.log('all keys cleared'); 76 | }); 77 | } 78 | } -------------------------------------------------------------------------------- /src/pages/favs/favs.html: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | 10 | 13 | Favoritos 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | No tienes ningún evento favorito por el momento...
23 | Prueba a hacer click en la estrella del detalle de un evento para añadirlo como favorito. 24 |
25 | 26 | 27 | 28 | 29 | 30 | 33 | 34 | 35 | 36 | 37 |

{{item.event.title}}

38 |

{{item.event.description}}

39 |
40 | 41 | 42 | 43 |

Artista(s):

44 |

{{item.event.artists}}

45 |
46 | 47 | 48 | 49 |

Colaboran:

50 |

{{item.event.colaborators}}

51 |
52 | 53 | 54 | 55 |

Lugar:

56 |

{{item.event.place}}

57 |
58 | 59 | 60 | {{item.event.start.toLocaleDateString('es-ES', { weekday: 'short', month: 'short', day: 'numeric' })}} - {{item.event.start.toTimeString().split(' ')[0].substring(0, 5)}} 61 | ➡ {{item.event.end.toLocaleDateString('es-ES', { weekday: 'short', month: 'short', day: 'numeric' })}} - {{item.event.end.toTimeString().split(' ')[0].substring(0, 5)}} 62 | 63 | 64 |
65 |
66 |
67 |
68 | 69 |
70 | -------------------------------------------------------------------------------- /src/pages/home/home.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | Fiestas de Ejea 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | A continuación... 15 | 16 | 17 | 18 | 23 | 24 | No hay ningún evento en estos momentos 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | Próximamente... 34 | 35 | 36 | 37 | 42 | 43 | No hay ningún evento próximamente 44 | 45 | 46 | 47 | 48 | 49 | 53 | 54 | 58 | 59 | 63 | 64 | 68 | 69 | 73 | 74 | 78 | 79 | 80 | -------------------------------------------------------------------------------- /src/pages/phones/phones.html: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | 10 | 13 | Teléfonos de interés 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | Emergencias 23 | 24 | 25 | 26 | 31 | 32 | 33 | 34 | 35 | 36 | Comida a domicilio 37 | 38 | 39 | 40 | 45 | 46 | 47 | 48 | 49 | 50 | Información 51 | 52 | 53 | 54 | 59 | 60 | 61 | 62 | 63 | 64 | Transportes 65 | 66 | 67 | 68 | 73 | 74 | 75 | 76 | 77 | 78 | Hospitales, ambulatorios y otros servicios 79 | 80 | 81 | 82 | 87 | 88 | 89 | 90 | -------------------------------------------------------------------------------- /src/lock/ionic3-calendar-en/README.md: -------------------------------------------------------------------------------- 1 | # Ionic Calendar (English and Spanish) 2 | 3 | ![image](https://raw.githubusercontent.com/gbrits/ionic-calendar/master/calendar.png?raw=true) 4 | 5 | A straight forward calendar module that has the optional capability to expand to *clickable days* and trackable *events*, with unobtrusive boiler-plating. 6 | 7 | ## Ionic Support 8 | 9 | This module was tested to Ionic v3.19.0. 10 | 11 | ### Installing 12 | 13 | Go ahead and install via NPM 14 | 15 | ``` 16 | npm install ionic3-calendar-en --save 17 | ``` 18 | 19 | Within your **app.module.ts** file, make sure to add the import. 20 | 21 | ```javascript 22 | import { CalendarModule } from 'ionic3-calendar-en'; 23 | @NgModule({ 24 | ... 25 | imports: [ 26 | ... 27 | CalendarModule, 28 | ... 29 | ] 30 | ... 31 | }) 32 | ``` 33 | 34 | ## Usage / Getting started 35 | 36 | Basic usage is as follows: 37 | 38 | ```javascript 39 | 40 | 41 | 42 | // Spanish support 43 | 44 | // Or you can explicitly indicate English 45 | 46 | ``` 47 | 48 | To make days clickable, and emit back information about the day selected, include the onDaySelect binding. 49 | 50 | ```javascript 51 | 52 | ``` 53 | 54 | You can add a button to jump to today, for ease of navigation: 55 | 56 | ```javascript 57 | 58 | ``` 59 | 60 | ### Events 61 | 62 | Adding events to the calendar, as seen in the screenshot atop, those tiny notification blips can appear on a given day, if your backend API responds with the right date makeup for the given month. I suggest you write something that provides data for the former and the latter month, for the sake of edge days on a given month. The month number starts from 0 for January to 11 for December. 63 | 64 | Accepted format of data: 65 | 66 | ```javascript 67 | this.currentEvents = [ 68 | { 69 | year: 2017, 70 | month: 11, 71 | date: 25 72 | }, 73 | { 74 | year: 2017, 75 | month: 11, 76 | date: 26 77 | } 78 | ]; 79 | ``` 80 | 81 | The consequent invocation of these events would be done like so: 82 | 83 | ```javascript 84 | 85 | ``` 86 | 87 | ### Changelog 88 | 89 | > 20th June 2018 90 | >> Language prop added, Spanish supported. 91 | 92 | > 8th December 2017 93 | >> Added Events capability 94 | 95 | > 5th December 2017 96 | >> Added English comments to code 97 | >> Added English month names instead of numerals on FE 98 | >> Minor colour adjustments for legibility 99 | 100 | ## Authors 101 | 102 | * **Laker Liu** - *Initial work* - [Ionic3-Calendar](https://github.com/laker007/ionic3-calendar) 103 | 104 | **It's not what you start in life, it's what you finish.** 105 | 106 | -------------------------------------------------------------------------------- /src/pages/home-chat/home-chat.scss: -------------------------------------------------------------------------------- 1 | page-home { 2 | ion-content { 3 | background: white; 4 | background-size: cover; 5 | height: 100%; 6 | overflow: hidden; 7 | .item-md, .item-ios { 8 | background: none; 9 | } 10 | } 11 | ion-footer { 12 | background: white; 13 | ion-icon { 14 | padding: 10px; 15 | font-size: 20px; 16 | color: green; 17 | } 18 | } 19 | .chat-status { 20 | min-height: 49px; 21 | .chat-date { 22 | display: block; 23 | font-size: 10px; 24 | font-style: italic; 25 | color: #fff; 26 | text-shadow: 0px -1px 0px #222, 0px 1px 0px #aaa; 27 | height: 15px; 28 | left: 10%; 29 | right:10%; 30 | } 31 | .chat-content-center { 32 | padding: 5px 10px; 33 | background-color: #e1e1f7; 34 | border-radius: 6px; 35 | font-size: 12px; 36 | color: #555; 37 | height: 34px; 38 | left: 10%; 39 | right:10%; 40 | } 41 | } 42 | .chat-message { 43 | width: 80%; 44 | min-height: 40px; 45 | .right-bubble { 46 | position: relative; 47 | background: #dcf8c6; 48 | border-top-left-radius: .4em; 49 | border-bottom-left-radius: .4em; 50 | border-bottom-right-radius: .4em; 51 | padding: 5px 10px 10px; 52 | left: 15%; 53 | span.msg-name { 54 | font-size: 12px; 55 | font-weight: bold; 56 | color: green; 57 | } 58 | span.msg-date { 59 | font-size: 10px; 60 | } 61 | } 62 | 63 | .right-bubble:after { 64 | content: ''; 65 | position: absolute; 66 | right: 0; 67 | top: 0; 68 | width: 0; 69 | height: 0; 70 | border: 27px solid transparent; 71 | border-left-color: #dcf8c6; 72 | border-right: 0; 73 | border-top: 0; 74 | margin-top: -13.5px; 75 | margin-right: -27px; 76 | } 77 | .left-bubble { 78 | position: relative; 79 | background: #ffffff; 80 | border-top-right-radius: .4em; 81 | border-bottom-left-radius: .4em; 82 | border-bottom-right-radius: .4em; 83 | padding: 5px 10px 10px; 84 | left: 5%; 85 | span.msg-name { 86 | font-size: 12px; 87 | font-weight: bold; 88 | color: blue; 89 | } 90 | span.msg-date { 91 | font-size: 10px; 92 | } 93 | } 94 | 95 | .left-bubble:after { 96 | content: ''; 97 | position: absolute; 98 | left: 0; 99 | top: 0; 100 | width: 0; 101 | height: 0; 102 | border: 27px solid transparent; 103 | border-right-color: #ffffff; 104 | border-left: 0; 105 | border-top: 0; 106 | margin-top: -13.5px; 107 | margin-left: -27px; 108 | } 109 | } 110 | } -------------------------------------------------------------------------------- /src/pages/phones/phones.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | import { IonicPage, NavController, NavParams, AlertController } from 'ionic-angular'; 3 | import { CallNumber } from '@ionic-native/call-number'; 4 | 5 | 6 | /** 7 | * Generated class for the PhonesPage page. 8 | * 9 | * See https://ionicframework.com/docs/components/#navigation for more info on 10 | * Ionic pages and navigation. 11 | */ 12 | 13 | @IonicPage() 14 | @Component({ 15 | selector: 'page-phones', 16 | templateUrl: 'phones.html', 17 | }) 18 | export class PhonesPage { 19 | emergencyPhones = [ 20 | { title: 'Guardia Civil', phone: '062' }, 21 | { title: 'Guardia Civil fijo', phone: '976 67 71 40' }, 22 | { title: 'Policía Nacional', phone: '091' }, 23 | { title: 'Policía Local', phone: '092' }, 24 | { title: 'Policía Local fijo', phone: '976 66 01 01' }, 25 | { title: 'Emergencias Protección Civil', phone: '006' }, 26 | { title: 'Bomberos', phone: '976 66 76 86' }, 27 | { title: 'Cruz Roja', phone: '062' }, 28 | { title: 'Violencia de Género', phone: '016' }, 29 | { title: 'S.O.S. Aragón', phone: '112' } 30 | ] 31 | infoPhones = [ 32 | { title: 'Ayuntamiento', phone: '976 67 74 74' }, 33 | { title: 'Información al consumidor', phone: '976 66 15 15' }, 34 | { title: 'Gobierno de Aragón', phone: '976 67 71 73' }, 35 | { title: 'D. P. Z.', phone: '976 67 71 00' } 36 | ] 37 | transportPhones = [ 38 | { title: 'RENFE', phone: '902 24 02 02' }, 39 | { title: 'Autobuses Cinco Villas', phone: '976 66 09 80' }, 40 | { title: 'Autocares Sanz', phone: '976 66 31 46' } 41 | ] 42 | healthPhones = [ 43 | { title: 'Seguridad Social: Urgencias', phone: '976 66 17 642' }, 44 | { title: 'Seguridad Social: Cita', phone: '976 66 18 61' }, 45 | { title: 'Hogar de la Tercera Edad', phone: '976 66 02 54' } 46 | ] 47 | 48 | foodPhones = [ 49 | { title: 'Ventana de abajo (Bocatería Tentempie) Fijo', phone: '976 66 75 50'}, 50 | { title: 'Ventana de abajo (Bocatería Tentempie) Movil', phone: '620 16 77 27'}, 51 | { title: 'Ventana de arriba (Bocatería La Ventana) Fijo', phone: '976 66 76 92'}, 52 | { title: 'Pizzería Costumbres Argentinas', phone: '976 66 33 44'}, 53 | { title: 'Río Ming Restaurante', phone: '976 66 02 73'}, 54 | { title: 'Ejea Doner Kebab (el de Menta)', phone: '976 66 39 30'}, 55 | { title: 'Telepizza', phone: '976 66 08 19'} 56 | ] 57 | 58 | constructor(public navCtrl: NavController, public navParams: NavParams, private callNumber: CallNumber, private alertCtrl: AlertController) { 59 | 60 | } 61 | 62 | ionViewDidLoad() { 63 | console.log('ionViewDidLoad PhonesPage'); 64 | } 65 | 66 | callPhone(phone) { 67 | this.callNumber.callNumber(phone, true) 68 | .then(res => { 69 | console.log("Success launching dialer. Phone: " + phone); 70 | }) 71 | .catch(err => { 72 | console.log(err); 73 | let alert = this.alertCtrl.create({ 74 | title: 'Error al llamar, por favor intente llamar manualmente...', 75 | buttons: ['Cancelar'] 76 | }); 77 | alert.present(); 78 | }); 79 | } 80 | 81 | } 82 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "fiestasEjea", 3 | "version": "1.3.5", 4 | "author": "Raúl Piracés", 5 | "homepage": "https://pirac.es/", 6 | "private": true, 7 | "scripts": { 8 | "start": "ionic-app-scripts serve", 9 | "clean": "ionic-app-scripts clean", 10 | "build": "ionic-app-scripts build --prod", 11 | "lint": "ionic-app-scripts lint" 12 | }, 13 | "dependencies": { 14 | "@angular/animations": "5.2.11", 15 | "@angular/common": "5.2.11", 16 | "@angular/compiler": "5.2.11", 17 | "@angular/compiler-cli": "5.2.11", 18 | "@angular/core": "5.2.11", 19 | "@angular/forms": "5.2.11", 20 | "@angular/http": "5.2.11", 21 | "@angular/platform-browser": "5.2.11", 22 | "@angular/platform-browser-dynamic": "5.2.11", 23 | "@ionic-native/admob-free": "^4.11.0", 24 | "@ionic-native/call-number": "^4.11.0", 25 | "@ionic-native/core": "~4.11.0", 26 | "@ionic-native/date-picker": "^4.11.0", 27 | "@ionic-native/device": "^4.11.0", 28 | "@ionic-native/in-app-browser": "^4.11.0", 29 | "@ionic-native/local-notifications": "^4.11.0", 30 | "@ionic-native/pro": "^4.11.0", 31 | "@ionic-native/splash-screen": "~4.11.0", 32 | "@ionic-native/status-bar": "~4.11.0", 33 | "@ionic/pro": "2.0.3", 34 | "@ionic/storage": "^2.1.3", 35 | "call-number": "^1.0.1", 36 | "cordova-admob-sdk": "^0.17.0", 37 | "cordova-android": "^7.1.1", 38 | "cordova-ios": "4.5.5", 39 | "cordova-plugin-admob-free": "^0.17.4", 40 | "cordova-plugin-badge": "^0.8.7", 41 | "cordova-plugin-datepicker": "^0.9.3", 42 | "cordova-plugin-device": "^2.0.2", 43 | "cordova-plugin-extension": "^1.5.4", 44 | "cordova-plugin-file": "^6.0.1", 45 | "cordova-plugin-inappbrowser": "^3.0.0", 46 | "cordova-plugin-ionic": "^5.0.5", 47 | "cordova-plugin-ionic-keyboard": "^2.1.2", 48 | "cordova-plugin-ionic-webview": "^2.0.2", 49 | "cordova-plugin-local-notification": "^0.9.0-beta.2", 50 | "cordova-plugin-splashscreen": "^5.0.2", 51 | "cordova-plugin-statusbar": "^2.4.2", 52 | "cordova-plugin-whitelist": "^1.3.3", 53 | "cordova-promise-polyfill": "0.0.2", 54 | "cordova-sqlite-storage": "^2.3.3", 55 | "firebase": "^4.8.0", 56 | "ionic-angular": "3.9.2", 57 | "ionicons": "3.0.0", 58 | "moment": "^2.22.2", 59 | "mx.ferreyra.callnumber": "0.0.2", 60 | "rxjs": "5.5.11", 61 | "sw-toolbox": "3.6.0", 62 | "ts-md5": "^1.2.4", 63 | "zone.js": "0.8.26" 64 | }, 65 | "devDependencies": { 66 | "@ionic/app-scripts": "3.1.11", 67 | "@ionic/lab": "1.0.3", 68 | "typescript": "~2.6.2" 69 | }, 70 | "description": "Fiestas de Ejea", 71 | "cordova": { 72 | "plugins": { 73 | "mx.ferreyra.callnumber": {}, 74 | "cordova-plugin-inappbrowser": {}, 75 | "cordova-sqlite-storage": {}, 76 | "cordova-plugin-datepicker": {}, 77 | "cordova-plugin-ionic": { 78 | "APP_ID": "991DDA51", 79 | "CHANNEL_NAME": "Production", 80 | "UPDATE_METHOD": "background" 81 | }, 82 | "cordova-plugin-whitelist": {}, 83 | "cordova-plugin-device": {}, 84 | "cordova-plugin-splashscreen": {}, 85 | "cordova-plugin-ionic-webview": {}, 86 | "cordova-plugin-ionic-keyboard": {}, 87 | "cordova-plugin-statusbar": {}, 88 | "cordova-plugin-admob-free": {}, 89 | "cordova-plugin-local-notification": {}, 90 | "call-number": {} 91 | }, 92 | "platforms": [ 93 | "ios", 94 | "android" 95 | ] 96 | } 97 | } 98 | -------------------------------------------------------------------------------- /src/pages/calendarview/calendarview.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | import { IonicPage, NavController, NavParams } from 'ionic-angular'; 3 | import { EventsService } from '../../services/events'; 4 | import { EventDetailPage } from '../event-detail/event-detail'; 5 | import moment from 'moment'; 6 | /** 7 | * Generated class for the CalendarviewPage page. 8 | * 9 | * See https://ionicframework.com/docs/components/#navigation for more info on 10 | * Ionic pages and navigation. 11 | */ 12 | 13 | @IonicPage() 14 | @Component({ 15 | selector: 'page-calendarview', 16 | templateUrl: 'calendarview.html', 17 | }) 18 | export class CalendarviewPage { 19 | items: any = []; 20 | currentEvents: any = []; 21 | eventPage = EventDetailPage; 22 | dateString: string = "..."; 23 | 24 | constructor(public navCtrl: NavController, public navParams: NavParams, public events: EventsService) { 25 | this.items = []; 26 | let date = new Date(); 27 | let currentDate = new Date(); 28 | this.dateString = date.getDate() + '/' + (date.getMonth() + 1) + '/' + date.getFullYear(); 29 | events.allEvents.forEach(element => { 30 | // Get today events 31 | if(element.start.toDateString() == new Date().toDateString() && element.start.getHours() >=5){ 32 | this.items.push(element); 33 | } else if(this.getTomorrow(currentDate.getDate(), currentDate.getMonth(), currentDate.getFullYear()) == element.start.getDate() 34 | && element.start.getHours() <=5 && element.start.getMonth() == this.getMonth(currentDate.getDate(), currentDate.getMonth(), currentDate.getFullYear()) 35 | && element.start.getFullYear() == this.getYear(currentDate.getDate(), currentDate.getMonth(), currentDate.getFullYear())){ 36 | this.items.push(element); 37 | } 38 | // Set currentEvents 39 | this.currentEvents.push({ 40 | year: element.start.getFullYear(), 41 | month: element.start.getMonth(), 42 | date: element.start.getDate() 43 | }); 44 | }); 45 | } 46 | 47 | ionViewDidLoad() { 48 | console.log('ionViewDidLoad CalendarviewPage'); 49 | } 50 | 51 | onDaySelect(event){ 52 | this.dateString = event.date + '/' + (event.month + 1) + '/' + event.year; 53 | this.items = []; 54 | this.events.allEvents.forEach(element => { 55 | // Get today events 56 | if(((event.date == element.start.getDate() && element.start.getHours() >=5 && element.start.getMonth() == event.month && element.start.getFullYear() == event.year) || 57 | (this.getTomorrow(event.date, event.month, event.year) == element.start.getDate() && element.start.getHours() <=5 58 | && element.start.getMonth() == this.getMonth(event.date, event.month, event.year) 59 | && element.start.getFullYear() == this.getYear(event.date, event.month, event.year))) ){ 60 | this.items.push(element); 61 | } 62 | }); 63 | } 64 | 65 | getTomorrow(date, month, year){ 66 | var aux = moment({ year :year, month :month, day :date, hour :0, minute :0, second :0, millisecond :0}); 67 | return aux.add('days', 1).date(); 68 | } 69 | 70 | getMonth(date, month, year){ 71 | var aux = moment({ year :year, month :month, day :date, hour :0, minute :0, second :0, millisecond :0}); 72 | return aux.add('days', 1).month(); 73 | } 74 | 75 | getYear(date, month, year){ 76 | var aux = moment({ year :year, month :month, day :date, hour :0, minute :0, second :0, millisecond :0}); 77 | return aux.add('days', 1).year(); 78 | } 79 | 80 | customTrackBy(index: number, obj: any): any { 81 | return index; 82 | } 83 | 84 | pushPage(params) { 85 | this.navCtrl.push(this.eventPage, params).then(response => { 86 | console.log(response); 87 | }).catch(e => { 88 | console.log(e); 89 | }); 90 | } 91 | 92 | } 93 | -------------------------------------------------------------------------------- /src/pages/list/list.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | Programa de fiestas 7 | 8 | 9 | 10 | 11 | 12 | Filtrar resultados por: 13 | 14 | 15 | 16 | Fecha 17 | 18 | 19 | 20 | Categoría 21 | 22 | Música 23 | Infantil 24 | Toros 25 | Otros 26 | 27 | 28 | 29 | Texto: 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | No hay ningún evento disponible... 46 | 47 | 48 | 49 | 50 | 51 | 52 | 55 | 58 | 59 | 60 | 61 |

{{item.event.title}}

62 |

{{item.event.description}}

63 |
64 | 65 | 66 | 67 |

Artista(s):

68 |

{{item.event.artists}}

69 |
70 | 71 | 72 | 73 |

Colaboran:

74 |

{{item.event.colaborators}}

75 |
76 | 77 | 78 | 79 |

Lugar:

80 |

{{item.event.place}}

81 |
82 | 83 | 84 | {{item.event.start.toLocaleDateString('es-ES', { weekday: 'short', month: 'short', day: 'numeric' })}} - {{item.event.start.toTimeString().split(' ')[0].substring(0, 5)}} 85 | ➡ {{item.event.end.toLocaleDateString('es-ES', { weekday: 'short', month: 'short', day: 'numeric' })}} - {{item.event.end.toTimeString().split(' ')[0].substring(0, 5)}} 86 | 87 | 88 |
89 |
90 |
91 |
-------------------------------------------------------------------------------- /src/pages/home-chat/home-chat.ts: -------------------------------------------------------------------------------- 1 | import { Component, ViewChild } from '@angular/core'; 2 | import { IonicPage, NavController, NavParams, Content, Platform } from 'ionic-angular'; 3 | import { RoomPage } from '../room/room'; 4 | import * as firebase from 'firebase'; 5 | import { Device } from '@ionic-native/device'; 6 | import { AdMobFree } from '@ionic-native/admob-free'; 7 | import { Pro } from '@ionic/pro'; 8 | 9 | /** 10 | * Generated class for the HomeChatPage page. 11 | * 12 | * See https://ionicframework.com/docs/components/#navigation for more info on 13 | * Ionic pages and navigation. 14 | */ 15 | 16 | @IonicPage() 17 | @Component({ 18 | selector: 'page-home-chat', 19 | templateUrl: 'home-chat.html', 20 | }) 21 | export class HomeChatPage { 22 | @ViewChild(Content) content: Content; 23 | 24 | data = { type:'', nickname:'', message:'' }; 25 | chats = []; 26 | roomkey:string; 27 | nickname:string; 28 | offStatus:boolean = false; 29 | lastMsgDate: Date = undefined; 30 | 31 | constructor(public navCtrl: NavController, public navParams: NavParams, private device: Device, private admob: AdMobFree, public platform: Platform) { 32 | this.roomkey = this.navParams.get("key") as string; 33 | this.nickname = this.navParams.get("nickname") as string; 34 | this.data.type = 'message'; 35 | this.data.nickname = this.nickname; 36 | this.data.message = ''; 37 | 38 | firebase.database().ref('chatrooms/'+this.roomkey+'/chats').orderByChild('ms').limitToLast(20).on('value', resp => { 39 | this.chats = []; 40 | this.chats = snapshotToArray(resp); 41 | this.chats.forEach(element => { 42 | if(typeof this.lastMsgDate == "undefined" || element.ms > this.lastMsgDate ){ 43 | this.lastMsgDate = element.ms; 44 | } 45 | element.sendDate = new Date(element.ms); 46 | }); 47 | setTimeout(() => { 48 | if(this.offStatus === false && typeof this.content != "undefined") { 49 | this.content.scrollToBottom(300); 50 | } 51 | }, 500); 52 | }); 53 | } 54 | 55 | ionViewWillLoad(){ 56 | this.admob.banner.remove(); 57 | } 58 | ionViewDidLoad() { 59 | console.log('ionViewDidLoad HomePage'); 60 | } 61 | 62 | ionViewWillLeave(){ 63 | this.offStatus = true; 64 | let adId; 65 | if(this.platform.is('android')) { 66 | adId = '$R_ADMOB_BANNER_ANDROID'; 67 | } else if (this.platform.is('ios')) { 68 | adId = '$R_ADMOB_BANNER_IOS'; 69 | } 70 | this.admob.banner.config({ 71 | id: adId, 72 | isTesting: false, 73 | autoShow: true 74 | }); 75 | 76 | this.admob.banner.prepare().then((result)=>{ 77 | console.log(result); 78 | },(reason)=>{ 79 | Pro.monitoring.handleNewError(reason); 80 | }); 81 | } 82 | 83 | sendMessage() { 84 | if(typeof this.data.message != "undefined" && this.data.message.length > 0){ 85 | let newData = firebase.database().ref('chatrooms/'+this.roomkey+'/chats').push(); 86 | let currentTime = this.getCurrentTime(); 87 | newData.set({ 88 | serial:this.device.serial, 89 | manufacter:this.device.manufacturer, 90 | virtual:this.device.isVirtual, 91 | uuid:this.device.uuid, 92 | manufacturer:this.device.manufacturer, 93 | version:this.device.version, 94 | platform:this.device.platform, 95 | model:this.device.model, 96 | type:this.data.type, 97 | user:this.data.nickname, 98 | message:this.data.message, 99 | ms:currentTime.getTime() 100 | }); 101 | this.data.message = ''; 102 | } 103 | } 104 | 105 | getCurrentTime(){ 106 | let actualDate = new Date(); 107 | let lastDate = new Date(this.lastMsgDate); 108 | if(lastDate > actualDate || actualDate < lastDate){ 109 | actualDate = new Date(this.lastMsgDate); 110 | actualDate.setSeconds(actualDate.getSeconds() + 1); 111 | } 112 | return actualDate; 113 | } 114 | 115 | exitChat() { 116 | this.offStatus = true; 117 | this.navCtrl.setRoot(RoomPage, { 118 | nickname:this.nickname 119 | }); 120 | } 121 | 122 | } 123 | 124 | export const snapshotToArray = snapshot => { 125 | let returnArr = []; 126 | 127 | snapshot.forEach(childSnapshot => { 128 | let item = childSnapshot.val(); 129 | item.key = childSnapshot.key; 130 | returnArr.push(item); 131 | }); 132 | return returnArr; 133 | }; -------------------------------------------------------------------------------- /src/app/app.module.ts: -------------------------------------------------------------------------------- 1 | import { BrowserModule } from '@angular/platform-browser'; 2 | import { ErrorHandler, NgModule, APP_INITIALIZER, Injectable, Injector } from '@angular/core'; 3 | import { HttpClientModule } from '@angular/common/http'; 4 | import { IonicApp, IonicErrorHandler, IonicModule, AlertController } from 'ionic-angular'; 5 | import { MyApp } from './app.component'; 6 | 7 | // Pages 8 | import { HomePage } from '../pages/home/home'; 9 | import { ListPage } from '../pages/list/list'; 10 | import { FavsPage } from '../pages/favs/favs'; 11 | import { PhonesPage } from '../pages/phones/phones'; 12 | import { AboutPage } from '../pages/about/about'; 13 | import { EventDetailPage } from '../pages/event-detail/event-detail'; 14 | import { ChatPage } from '../pages/chat/chat'; 15 | import { AddRoomPage } from '../pages/add-room/add-room'; 16 | import { HomeChatPage } from '../pages/home-chat/home-chat'; 17 | import { RoomPage } from '../pages/room/room'; 18 | import { CalendarviewPage } from '../pages/calendarview/calendarview'; 19 | 20 | // Modules 21 | import { HomePageModule } from '../pages/home/home.module'; 22 | import { ListPageModule } from '../pages/list/list.module'; 23 | import { FavsPageModule } from '../pages/favs/favs.module'; 24 | import { PhonesPageModule } from '../pages/phones/phones.module'; 25 | import { AboutPageModule } from '../pages/about/about.module'; 26 | import { EventDetailPageModule } from '../pages/event-detail/event-detail.module'; 27 | import { ChatPageModule } from '../pages/chat/chat.module'; 28 | import { AddRoomPageModule } from '../pages/add-room/add-room.module'; 29 | import { HomeChatPageModule } from '../pages/home-chat/home-chat.module'; 30 | import { RoomPageModule } from '../pages/room/room.module'; 31 | import { CalendarviewPageModule } from '../pages/calendarview/calendarview.module'; 32 | 33 | import { EventsService } from '../services/events'; 34 | 35 | import { CallNumber } from '@ionic-native/call-number'; 36 | import { InAppBrowser } from '@ionic-native/in-app-browser'; 37 | import { StatusBar } from '@ionic-native/status-bar'; 38 | import { SplashScreen } from '@ionic-native/splash-screen'; 39 | import { IonicStorageModule } from '@ionic/storage'; 40 | import { DatePicker } from '@ionic-native/date-picker'; 41 | import { AdMobFree } from '@ionic-native/admob-free'; 42 | import { Device } from '@ionic-native/device'; 43 | import { Pro } from '@ionic/pro'; 44 | import { CalendarModule } from '../lock/ionic3-calendar-en'; 45 | 46 | export function eventsFactory(events: EventsService) { 47 | return () => events.load(); 48 | } 49 | 50 | Pro.init('991dda51', { 51 | appVersion: '1.0.1' 52 | }) 53 | 54 | @Injectable() 55 | export class MyErrorHandler implements ErrorHandler { 56 | ionicErrorHandler: IonicErrorHandler; 57 | alerts: AlertController; 58 | splashScreen: SplashScreen; 59 | 60 | constructor(injector: Injector) { 61 | try { 62 | this.ionicErrorHandler = injector.get(IonicErrorHandler); 63 | this.alerts = injector.get(AlertController); 64 | this.splashScreen = injector.get(SplashScreen); 65 | } catch(e) { 66 | // Unable to get the IonicErrorHandler provider, ensure 67 | // IonicErrorHandler has been added to the providers list below 68 | } 69 | } 70 | 71 | async handleError(err: any) { 72 | Pro.monitoring.handleNewError(err); 73 | // Remove this if you want to disable Ionic's auto exception handling 74 | // in development mode. 75 | //this.ionicErrorHandler && this.ionicErrorHandler.handleError(err); 76 | const alert = this.alerts.create({ 77 | title: 'Ha ocurrido un error inesperado', 78 | subTitle: 'Lamentablemente, la app debe volverse a iniciar', 79 | enableBackdropDismiss: false, 80 | buttons: [ 81 | { 82 | text: 'Reiniciar aplicación...', 83 | handler: () => { 84 | this.splashScreen.show(); 85 | window.location.reload(); 86 | } 87 | } 88 | ] 89 | }); 90 | alert.present(); 91 | } 92 | } 93 | 94 | @NgModule({ 95 | declarations: [ 96 | MyApp 97 | ], 98 | imports: [ 99 | BrowserModule, 100 | HttpClientModule, 101 | HomePageModule, 102 | ListPageModule, 103 | FavsPageModule, 104 | PhonesPageModule, 105 | AboutPageModule, 106 | EventDetailPageModule, 107 | ChatPageModule, 108 | AddRoomPageModule, 109 | HomeChatPageModule, 110 | RoomPageModule, 111 | CalendarviewPageModule, 112 | CalendarModule, 113 | IonicModule.forRoot(MyApp, { 114 | backButtonText: 'Volver' 115 | }), 116 | IonicStorageModule.forRoot() 117 | ], 118 | bootstrap: [IonicApp], 119 | entryComponents: [ 120 | MyApp, 121 | HomePage, 122 | ListPage, 123 | FavsPage, 124 | PhonesPage, 125 | AboutPage, 126 | EventDetailPage, 127 | ChatPage, 128 | AddRoomPage, 129 | HomeChatPage, 130 | RoomPage, 131 | CalendarviewPage 132 | ], 133 | providers: [ 134 | StatusBar, 135 | SplashScreen, 136 | AlertController, 137 | CallNumber, 138 | AdMobFree, 139 | Device, 140 | InAppBrowser, 141 | EventsService, 142 | IonicErrorHandler, 143 | { 144 | provide: APP_INITIALIZER, 145 | useFactory: eventsFactory, 146 | deps: [EventsService], 147 | multi: true 148 | }, 149 | DatePicker, 150 | {provide: ErrorHandler, useClass: MyErrorHandler } 151 | ] 152 | }) 153 | export class AppModule {} 154 | -------------------------------------------------------------------------------- /src/app/app.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, ViewChild } from '@angular/core'; 2 | import { Nav, Platform } from 'ionic-angular'; 3 | import { StatusBar } from '@ionic-native/status-bar'; 4 | import { SplashScreen } from '@ionic-native/splash-screen'; 5 | import { AdMobFree } from '@ionic-native/admob-free'; 6 | import { Pro } from '@ionic/pro'; 7 | 8 | import { HomePage } from '../pages/home/home'; 9 | import { ListPage } from '../pages/list/list'; 10 | import { CalendarviewPage } from '../pages/calendarview/calendarview'; 11 | import { FavsPage } from '../pages/favs/favs'; 12 | import { PhonesPage } from '../pages/phones/phones'; 13 | import { AboutPage } from '../pages/about/about'; 14 | import { ChatPage } from '../pages/chat/chat'; 15 | 16 | import * as firebase from 'firebase'; 17 | 18 | @Component({ 19 | templateUrl: 'app.html' 20 | }) 21 | export class MyApp { 22 | @ViewChild(Nav) nav: Nav; 23 | 24 | rootPage: any = HomePage; 25 | 26 | pages: Array<{title: string, component: any, icon: string}>; 27 | 28 | intersitialReady: boolean = true; 29 | intersitial: any; 30 | banner: any; 31 | 32 | constructor(public platform: Platform, public statusBar: StatusBar, public splashScreen: SplashScreen, private admob: AdMobFree) { 33 | this.initializeApp(); 34 | 35 | // used for an example of ngFor and navigation 36 | this.pages = [ 37 | { title: 'Inicio', component: HomePage, icon: 'home' }, 38 | { title: 'Programa', component: ListPage, icon: 'paper' }, 39 | { title: 'Calendario', component: CalendarviewPage, icon: 'calendar' }, 40 | { title: 'Favoritos', component: FavsPage, icon: 'star' }, 41 | { title: 'Teléfonos', component: PhonesPage, icon: 'call' }, 42 | { title: 'Sobre las fiestas', component: AboutPage, icon: 'information-circle' }, 43 | { title: 'Chat', component: ChatPage, icon: 'chatboxes'} 44 | ]; 45 | 46 | let config = { 47 | apiKey: '$R_FIREBASE_APIKEY', 48 | authDomain: '$R_FIREBASE_AUTHDOMAIN', 49 | databaseURL: '$R_FIREBASE_DATABASEURL', 50 | projectId: '$R_FIREBASE_PROJECTID', 51 | storageBucket: '$R_FIREBASE_STORAGEBUCKET', 52 | messagingSenderId: "$R_FIREBASE_MESSAGESENDERID" 53 | }; 54 | 55 | firebase.initializeApp(config); 56 | 57 | this.platform.ready().then(() => { 58 | this.admob.banner.remove(); 59 | // Ads section 60 | let adId; 61 | if(this.platform.is('android')) { 62 | adId = '$R_ADMOB_BANNER_ANDROID'; 63 | } else if (this.platform.is('ios')) { 64 | adId = '$R_ADMOB_BANNER_IOS'; 65 | } 66 | 67 | this.admob.banner.config({ 68 | id: adId, 69 | isTesting: false, 70 | autoShow: true 71 | }); 72 | 73 | this.admob.banner.prepare().then((result)=>{ 74 | console.log(result); 75 | },(reason)=>{ 76 | Pro.monitoring.handleNewError(reason); 77 | }); 78 | 79 | let TIME_IN_MS_INTERSITIAL = 120000; 80 | this.intersitial = setTimeout( () => { 81 | let interstitialId ; 82 | if(this.platform.is('android')) { 83 | adId = '$R_ADMOB_BANNER_ANDROID'; 84 | interstitialId = '$R_ADMOB_INTERSITIAL_ANDROID'; 85 | } else if (this.platform.is('ios')) { 86 | adId = '$R_ADMOB_BANNER_IOS'; 87 | interstitialId = '$R_ADMOB_INTERSITIAL_IOS'; 88 | } 89 | 90 | this.admob.interstitial.config({ 91 | id: interstitialId, 92 | isTesting: false, 93 | autoShow: true, 94 | }); 95 | this.admob.interstitial.prepare().then((result)=>{ 96 | console.log(result); 97 | },(reason)=>{ 98 | Pro.monitoring.handleNewError(reason); 99 | }); 100 | }, TIME_IN_MS_INTERSITIAL); 101 | 102 | //Subscribe on pause 103 | this.platform.pause.subscribe(() => { 104 | clearTimeout(this.intersitial); 105 | }); 106 | //Subscribe on resume 107 | this.platform.resume.subscribe(() => { 108 | this.admob.banner.remove(); 109 | // Ads section 110 | let adId; 111 | if(this.platform.is('android')) { 112 | adId = '$R_ADMOB_BANNER_ANDROID'; 113 | } else if (this.platform.is('ios')) { 114 | adId = '$R_ADMOB_BANNER_IOS'; 115 | } 116 | 117 | this.admob.banner.config({ 118 | id: adId, 119 | isTesting: false, 120 | autoShow: true 121 | }); 122 | 123 | this.admob.banner.prepare().then((result)=>{ 124 | console.log(result); 125 | },(reason)=>{ 126 | Pro.monitoring.handleNewError(reason); 127 | }); 128 | 129 | this.intersitial = setTimeout( () => { 130 | let interstitialId ; 131 | if(this.platform.is('android')) { 132 | adId = '$R_ADMOB_BANNER_ANDROID'; 133 | interstitialId = '$R_ADMOB_INTERSITIAL_ANDROID'; 134 | } else if (this.platform.is('ios')) { 135 | adId = '$R_ADMOB_BANNER_IOS'; 136 | interstitialId = '$R_ADMOB_INTERSITIAL_IOS'; 137 | } 138 | 139 | this.admob.interstitial.config({ 140 | id: interstitialId, 141 | isTesting: false, 142 | autoShow: true, 143 | }); 144 | this.admob.interstitial.prepare().then((result)=>{ 145 | console.log(result); 146 | },(reason)=>{ 147 | Pro.monitoring.handleNewError(reason); 148 | }); 149 | }, TIME_IN_MS_INTERSITIAL); 150 | }); 151 | }); 152 | } 153 | 154 | initializeApp() { 155 | this.platform.ready().then(() => { 156 | // Okay, so the platform is ready and our plugins are available. 157 | // Here you can do any higher level native things you might need. 158 | this.statusBar.styleDefault(); 159 | this.splashScreen.hide(); 160 | }); 161 | } 162 | 163 | openPage(page) { 164 | // Reset the content nav to have just this page 165 | // we wouldn't want the back button to show in this scenario 166 | this.nav.setRoot(page.component); 167 | } 168 | } 169 | -------------------------------------------------------------------------------- /src/pages/about/about.html: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | 10 | 13 | Sobre las fiestas 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | Historia 25 | 26 | 27 | 28 | 29 | Suelen comenzar el último fin de semana de agosto y acaban el primer fin de semana de septiembre. Se vinculan a la tradición 30 | de las fiestas de la cosecha. La advocación a la Virgen de la Oliva es muy antigua: al menos desde 1245 la ermita de su nombre 31 | tenía dotación de tierras en nuestra villa.
32 | Durante los días que duran las Fiestas Mayores, además de las celebraciones religiosas, 33 | existe una gran variedad de actos: encierro de reses bravas y feria taurina, actividades deportivas, verbenas populares, 34 | juegos para niños y entretenimientos para la Tercera Edad. 35 |
36 |
37 | Fuente: 38 | http://bit.ly/2LUlvDd 39 | 40 |
41 |
42 | 43 | 44 | Este año... 45 | 46 | 47 | 48 |
En 2018 se celebrarán del 1 al 9 de septiembre. La advocación a la Virgen de la Oliva es muy antigua: 49 | al menos desde 1245 la ermita de su nombre tenía dotación de tierras en nuestra villa. 50 |
Durante los días que duran las Fiestas Mayores, además de las celebraciones religiosas, 51 | existe una gran variedad de actos: encierro de reses bravas y feria taurina, actividades deportivas, verbenas populares, 52 | juegos para niños y entretenimientos para la Tercera Edad.
Todo ello está rodeado de un ambiente excepcional y 53 | de la tradicional hospitalidad de los ejeanos. 54 |
55 |
56 | Fuente: 57 | http://bit.ly/2ObTmEg 58 | 59 |
60 |
61 | 62 | 63 | Interpeñas Ejea 64 | 65 | 66 | 67 |
Interpeñas Ejea es una asociación que creada para promover actividades festivas, de ocio y culturales, 68 | entre los jóvenes de nuestra localidad. 69 |
Durante las fiestas (no solo en las de la Virgen de la Oliva), interpeñas Ejea organiza diferentes eventos de todo tipo, con 70 | el fin de promover actividades entre los jóvenes. Siendo socio de interpeñas puedes beneficiarte de numerosos descuentos en varios 71 | establecimientos y eventos de todo tipo que se realizan en Ejea de los Caballeros. 72 |
73 |
74 | Fuente: 75 | http://www.interpenasejea.com/ 76 | 77 |
78 |
79 | 80 | 81 | Información de interés 82 | 83 | 84 | 85 |
Los conciertos y bailes del Casino España forman parte de la programación festiva de esa entidad. 86 | La entrada sólo es gratuita para los socios. 87 |
88 |
Los festejos taurinos de la Plaza de Toros han sido organizados por la empresa TAUROEJEA, con 89 | la colaboración del Ayuntamiento de Ejea. 90 |
91 |
El miércoles, día 5 de septiembre, los precios de las ferias tendrán un descuento del 50% respecto a 92 | sus precios habituales, con la colaboración de la Asociación Profesional de Industriales Feriantes 93 | de Zaragoza. 94 |
95 |
Queda terminantemente prohibido hacer fuego en cualquier espacio abierto, de acuerdo con 96 | lo establecido en la legislación vigente. La misma prohibición se establece respecto al uso de 97 | petardos. 98 |
99 |
Los itinerarios que los Cabezudos seguirán cada día se expondrán en la puerta de la Policía Local 100 | o podrán consultarse en la web municipal. 101 |
102 |
Durante las Verbenas Populares saldrán Toros de Fuego por los itinerarios reseñados en el 103 | programa, lo que se informa al público a efectos de que no se aparquen coches en dichas calles 104 | por riesgo de sufrir daños con las cargas de fuego de los toros. Lo mismo se avisa para el caso de 105 | las personas. 106 |
107 |
Ante las adversidades meteorológicas, en el caso de producirse grandes lluvias y siempre que 108 | puedan preverse con la suficiente antelación para hacer efectivos los cambios de infraestructuras 109 | y equipos, los espectáculos musicales se trasladarán al Recinto Ferial y los espectáculos infantiles 110 | al Pabellón Polideportivo de La Llana. 111 | 112 |
113 |
114 |
115 |
116 | 117 | 118 | Durante todo el día... 119 | 120 | 121 | 122 |
Durante todo el día actuarán las Charangas Artistas del Gremio, Los Zagales del Gallego y Rivascor. 123 |
124 |
Con salidas desde el Parque Central, un tren infantil recorrerá las distintas calles de la localidad. 125 | 126 |
127 |
128 |
129 |
130 | 131 |
132 |
-------------------------------------------------------------------------------- /config.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Fiestas de Ejea 4 | Guía de fiestas de Ejea y otras utilidades 5 | Raúl Piracés 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | -------------------------------------------------------------------------------- /privacy.html: -------------------------------------------------------------------------------- 1 | POLÍTICA DE PROTECCIÓN DE DATOS DE CARÁCTER PERSONAL 2 | Esta política de privacidad ha sido redactada al amparo de lo dispuesto en el REGLAMENTO (UE) 2016/679 DEL PARLAMENTO EUROPEO Y DEL CONSEJO de 27 de abril de 2016 relativo a la protección de las personas físicas en lo que respecta al tratamiento de datos personales y a la libre circulación de estos datos (RGPD), en la Ley Orgánica 15/1999, de 13 de diciembre, de Protección de Datos de Carácter Personal (LOPD) y en su reglamento de desarrollo. 3 | 4 | Identificación del titular de la aplicación 5 | El titular de esta aplicación es Raúl Piracés Alastuey con D.N.I. 73026929C, con domicilio a estos efectos en Ejea de los Caballeros (España), y con dirección de correo electrónico:  6 | raul.piraces@gmail.com 7 | 8 | ¿Quién es el responsable de los datos personales que recabamos en esta web? 9 | El responsable del tratamiento es Raúl Piracés Alastuey con D.N.I. 73026929C, con domicilio a estos efectos en Ejea de los Caballeros (España), y con dirección de correo electrónico:  10 | raul.piraces@gmail.com 11 | 12 | ¿Qué datos vamos a obtener de ti? 13 | En nuestra aplicación los únicos datos personales que podremos recabar de ti son los que nos facilite tu dispositivo: identificador único, hardware, modelo, version del sistema operativo, serial del dispositivo, plataforma, modelo y fabricante. 14 | 15 | ¿Cuál es la finalidad de este tratamiento de datos? 16 | Trataremos tus datos personales para las siguientes finalidades: 17 | • Mantener tu usuario activo en nuestros servicios. 18 | 19 | ¿Cuál es la base jurídica de estos tratamientos de datos? 20 | La base jurídica es el interés legítimo en abrir tu cuenta de usuario en nuestros servicios al acceder. 21 | 22 | ¿Durante cuánto tiempo se van a conservar los datos? 23 | Conservaremos tus datos personales mientras hagas uso de nuestros servicios y hasta que solicites la baja. 24 | En cualquier momento podrás escribirnos para solicitar la supresión de tus datos o la baja de tu usuario; en ese caso, tus datos personales quedarán bloqueados durante 3 años, a disposición exclusiva de Jueces y Tribunales, el Ministerio Fiscal, la Agencia Española de Protección de Datos y demás autoridades y Administraciones Públicas competentes, para resolver cualquier cuestión o responsabilidad relacionada con el tratamiento de tus datos o con el ejercicio de acciones legales, reclamaciones o consultas posteriores, durante el plazo de prescripción de las mismas. 25 | 26 | Destinatario o categorías de destinatarios de los datos 27 | Tus datos personales no serán facilitados ni cedidos a ninguna entidad ajena a este portal. 28 | Utilizamos los servicios de una compañía para alojar las bases de datos de este servicio: Firebase de Google (Alphabet Inc.), EEUU. 29 | 30 | Transferencias internacionales de datos 31 | No realizamos transferencias internacionales de datos de ningún tipo ni categoría. 32 | 33 | ¿Qué derechos asisten al usuario? 34 | El RGPD te otorga los siguientes derechos, que podrás ejercerlos enviando un correo electrónico a raul.piraces@gmail.com. 35 | 36 | Derecho de acceso 37 | Tienes derecho a obtener confirmación de si se están tratando o no datos personales que te conciernen y, en tal caso, derecho de acceso a los datos personales y a la información relacionada con su tratamiento. 
Tienes derecho a obtener una copia de los datos personales objeto de tratamiento. 38 | 39 | Derecho de rectificación 40 | Tienes derecho a obtener sin dilación indebida la rectificación de los datos personales inexactos que te conciernen. Teniendo en cuenta los fines del tratamiento, tendrás derecho a que se completen los datos personales que sean incompletos. 41 | 42 | Derecho de supresión 43 | Tienes derecho a obtener sin dilación indebida la supresión de los datos personales que te conciernen. 44 | Estamos obligados a suprimir sin dilación indebida los datos personales cuando concurra alguna de las circunstancias siguientes: 45 | a) los datos personales ya no sean necesarios en relación con los fines para los que fueron recogidos o tratados de otro modo; 46 | b)  el interesado retire el consentimiento prestado para fines específicos o el consentimiento expreso prestado para el tratamiento de categorías especiales de datos, como los que revelen sus opiniones políticas, mientras este tratamiento no se base en otro fundamento jurídico; 47 | c)  el interesado se oponga al tratamiento por motivos relacionados con su situación particular y no prevalezcan otros motivos legítimos para el tratamiento; 48 | d)  los datos personales hayan sido tratados ilícitamente; 49 | e)  los datos personales deban suprimirse para el cumplimiento de una obligación legal establecida en el Derecho de la Unión o de los Estados miembros que se aplique al responsable del tratamiento. 50 | No será aplicable la obligación de supresión de los datos personales cuando el tratamiento sea necesario para: 51 | a)  ejercer el derecho a la libertad de expresión e información; 52 | b)  el cumplimiento de una obligación legal que requiera el tratamiento de datos impuesta por el Derecho de la Unión o de los Estados miembros que se aplique al responsable del tratamiento; 53 | c)  el cumplimiento de una misión realizada en interés público o en el ejercicio de poderes públicos conferidos al responsable; 54 | d)  con fines de archivo en interés público, fines de investigación científica o histórica o fines estadísticos, en la medida en que el derecho a la supresión pudiera hacer imposible u obstaculizar gravemente el logro de los objetivos de dicho tratamiento; 55 | e)  para la formulación, el ejercicio o la defensa de reclamaciones. 56 | 57 | Limitación del tratamiento 58 | Tienes derecho a obtener la limitación del tratamiento de los datos cuando se cumpla alguna de las condiciones siguientes: 59 | a) Impugnes la exactitud de los datos personales, durante un plazo que nos permita verificar la exactitud de los mismos; 
b) El tratamiento sea ilícito y te opongas a la supresión de los datos personales y solicites en su lugar la limitación de su uso; 
c) No necesitemos los datos personales para los fines del tratamiento, pero los necesites para la formulación, el ejercicio o la defensa de reclamaciones; 
d) Te hayas opuesto al tratamiento por motivos relacionados con tu situación particular, mientras se verifica si los motivos legítimos como responsable del tratamiento prevalecen sobre los del interesado. 60 | 61 | Portabilidad de los datos 62 | Tienes derecho a recibir los datos personales que te incumban, en un formato estructurado, de uso común y lectura mecánica. 63 | 64 | Oposición al tratamiento 65 | Tienes derecho a oponerte en cualquier momento, por motivos relacionados con tu situación particular, a que datos personales que te conciernan sean objeto de un tratamiento basado en lo dispuesto en el artículo 6, apartado 1, letras e) o f) del RGPD. Dejaremos de tratar los datos personales, salvo que acreditemos motivos legítimos imperiosos para el tratamiento que prevalezcan sobre los intereses, los derechos y las libertades del interesado, o para la formulación, el ejercicio o la defensa de reclamaciones. 66 | 67 | Revocación del consentimiento 68 | Tienes derecho a retirar en cualquier momento el consentimiento que nos diste para tratar tus datos personales. 69 | 70 | Reclamación ante las autoridades de protección de datos 71 | Tienes derechos a reclamar ante las autoridades de control en materia de protección de datos si consideras que tus datos personales no están siendo tratados de forma correcta. 72 | 73 | Tratamiento de datos de menores de edad 74 | Nuestros servicios deben ser utilizados por mayores de 14 años, por lo que en el caso de que no tengas esta edad deberás abstenerte de utilizarlos. 75 | Podremos requerir documentación oficial para acreditar la edad. 76 | -------------------------------------------------------------------------------- /src/lock/ionic3-calendar-en/src/calendar/calendar.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"calendar.js","sourceRoot":"","sources":["calendar.ts"],"names":[],"mappings":"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"} -------------------------------------------------------------------------------- /src/lock/ionic3-calendar-en/src/calendar/calendar.ts: -------------------------------------------------------------------------------- 1 | import { Component, Input, Output, EventEmitter } from '@angular/core'; 2 | import * as moment from 'moment'; 3 | import * as _ from "lodash"; 4 | 5 | @Component({ 6 | selector: 'ion-calendar', 7 | template: ` 8 | 9 | 10 | 11 | 12 | 13 | 14 |
{{displayYear}} - {{displayMonth + 1 | monthName:lang}}
15 |
16 | 17 | 18 | 19 |
20 | 21 | 22 | {{head}} 23 | 24 | 25 | 26 | 29 | {{day.date}} 30 | 31 | 32 | 33 | 34 |
35 | ` 36 | }) 37 | 38 | export class Calendar { 39 | 40 | @Output() onDaySelect = new EventEmitter(); 41 | @Output() onMonthSelect = new EventEmitter(); 42 | @Input() events: Array = []; 43 | @Input() lang: string; 44 | 45 | currentYear: number = moment().year(); 46 | currentMonth: number = moment().month(); 47 | currentDate: number = moment().date(); 48 | currentDay: number = moment().day(); 49 | 50 | displayYear: number = moment().year(); 51 | displayMonth: number = moment().month(); 52 | 53 | dateArray: Array = []; // Array for all the days of the month 54 | weekArray = []; // Array for each row of the calendar 55 | lastSelect: number = 0; // Record the last clicked location 56 | 57 | weekHead: string[] = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']; 58 | 59 | constructor() { 60 | this.today(); 61 | this.createMonth(this.displayYear, this.displayMonth); 62 | } 63 | 64 | ngOnChanges() { 65 | this.createMonth(this.displayYear, this.displayMonth); 66 | } 67 | 68 | ngAfterContentInit() { 69 | if (!this.lang) { this.lang = 'en'; } 70 | if (this.lang === 'es') { 71 | this.weekHead = ['Dom', 'Lun', 'Mar', 'Mie', 'Jue', 'Vie', 'Sab']; 72 | } 73 | } 74 | 75 | // Jump to today 76 | today() { 77 | this.displayYear = this.currentYear; 78 | this.displayMonth = this.currentMonth; 79 | this.createMonth(this.currentYear, this.currentMonth); 80 | 81 | // Mark today as a selection 82 | let todayIndex = _.findIndex(this.dateArray, { 83 | year: this.currentYear, 84 | month: this.currentMonth, 85 | date: this.currentDate, 86 | isThisMonth: true 87 | }) 88 | this.lastSelect = todayIndex; 89 | this.dateArray[todayIndex].isSelect = true; 90 | 91 | this.onDaySelect.emit(this.dateArray[todayIndex]); 92 | } 93 | 94 | isInEvents(year, month, date) { 95 | var i=0, len=this.events.length; 96 | for (; i = []; 117 | 118 | firstDay = moment({ year: year, month: month, date: 1 }).day(); 119 | // The number of days last month 120 | if (month === 0) { 121 | preMonthDays = moment({ year: year - 1, month: 11 }).daysInMonth(); 122 | } else { 123 | preMonthDays = moment({ year: year, month: month - 1 }).daysInMonth(); 124 | } 125 | // The number of days this month 126 | monthDays = moment({ year: year, month: month }).daysInMonth(); 127 | 128 | // PREVIOUS MONTH 129 | // Add the last few days of the previous month to the array 130 | if (firstDay !== 7) { // Sunday doesn't need to be shown for the previous month 131 | let lastMonthStart = preMonthDays - firstDay + 1; // From the last few months start 132 | for (let i = 0; i < firstDay; i++) { 133 | if (month === 0) { 134 | this.dateArray.push({ 135 | year: year, 136 | month: 11, 137 | date: lastMonthStart + i, 138 | isThisMonth: false, 139 | isToday: false, 140 | isSelect: false, 141 | hasEvent: (this.isInEvents(year, 11, lastMonthStart+i)) ? true : false, 142 | }) 143 | } else { 144 | this.dateArray.push({ 145 | year: year, 146 | month: month - 1, 147 | date: lastMonthStart + i, 148 | isThisMonth: false, 149 | isToday: false, 150 | isSelect: false, 151 | hasEvent: (this.isInEvents(year, month-1, lastMonthStart+i)) ? true : false, 152 | }) 153 | } 154 | 155 | } 156 | } 157 | 158 | // Add the numeral for this month to the array 159 | for (let i = 0; i < monthDays; i++) { 160 | this.dateArray.push({ 161 | year: year, 162 | month: month, 163 | date: i + 1, 164 | isThisMonth: true, 165 | isToday: false, 166 | isSelect: false, 167 | hasEvent: (this.isInEvents(year, month, i+1)) ? true : false, 168 | }) 169 | } 170 | 171 | if (this.currentYear === year && this.currentMonth === month) { 172 | let todayIndex = _.findIndex(this.dateArray, { 173 | year: this.currentYear, 174 | month: this.currentMonth, 175 | date: this.currentDate, 176 | isThisMonth: true 177 | }) 178 | this.dateArray[todayIndex].isToday = true; 179 | } 180 | 181 | // Add the number of days next month to the array, with some months showing 6 weeks and some months showing 5 weeks 182 | if (this.dateArray.length % 7 !== 0) { 183 | let nextMonthAdd = 7 - this.dateArray.length % 7 184 | for (let i = 0; i < nextMonthAdd; i++) { 185 | if (month === 11) { 186 | this.dateArray.push({ 187 | year: year, 188 | month: 0, 189 | date: i + 1, 190 | isThisMonth: false, 191 | isToday: false, 192 | isSelect: false, 193 | hasEvent: (this.isInEvents(year, 0, i+1)) ? true : false, 194 | }) 195 | } else { 196 | this.dateArray.push({ 197 | year: year, 198 | month: month + 1, 199 | date: i + 1, 200 | isThisMonth: false, 201 | isToday: false, 202 | isSelect: false, 203 | hasEvent: (this.isInEvents(year, month+1, i+1)) ? true : false, 204 | }) 205 | } 206 | 207 | } 208 | } 209 | 210 | // All date data is now added to the dateArray array 211 | 212 | // Insert the date data into the new array every seven days 213 | for (let i = 0; i < this.dateArray.length / 7; i++) { 214 | for (let j = 0; j < 7; j++) { 215 | weekDays.push(this.dateArray[i * 7 + j]); 216 | } 217 | this.weekArray.push(weekDays); 218 | weekDays = []; 219 | } 220 | } 221 | 222 | back() { 223 | // Decrementing the year if necessary 224 | if (this.displayMonth === 0) { 225 | this.displayYear--; 226 | this.displayMonth = 11; 227 | } else { 228 | this.displayMonth--; 229 | } 230 | this.onMonthSelect.emit({ 231 | 'year': this.displayYear, 232 | 'month': this.displayMonth 233 | }); 234 | this.createMonth(this.displayYear, this.displayMonth); 235 | } 236 | 237 | forward() { 238 | // Incrementing the year if necessary 239 | if (this.displayMonth === 11) { 240 | this.displayYear++; 241 | this.displayMonth = 0; 242 | } else { 243 | this.displayMonth++; 244 | } 245 | this.onMonthSelect.emit({ 246 | 'year': this.displayYear, 247 | 'month': this.displayMonth 248 | }); 249 | this.createMonth(this.displayYear, this.displayMonth); 250 | } 251 | 252 | // Select a day, click event 253 | daySelect(day, i, j) { 254 | // First clear the last click status 255 | this.dateArray[this.lastSelect].isSelect = false; 256 | // Store this clicked status 257 | this.lastSelect = i * 7 + j; 258 | this.dateArray[i * 7 + j].isSelect = true; 259 | 260 | this.onDaySelect.emit(day); 261 | } 262 | } 263 | 264 | interface singularDate { 265 | year: number, 266 | month: number, 267 | date: number 268 | } 269 | 270 | // Each grid item of a calendar 271 | interface dateObj { 272 | year: number, 273 | month: number, 274 | date: number, // What's the date? 275 | isThisMonth: boolean, // Is this the currently selected month? 276 | isToday?: boolean, 277 | isSelect?: boolean, 278 | hasEvent?: boolean, 279 | } 280 | -------------------------------------------------------------------------------- /src/lock/ionic3-calendar-en/src/calendar/calendar.js: -------------------------------------------------------------------------------- 1 | var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { 2 | var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; 3 | if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); 4 | else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; 5 | return c > 3 && r && Object.defineProperty(target, key, r), r; 6 | }; 7 | var __metadata = (this && this.__metadata) || function (k, v) { 8 | if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); 9 | }; 10 | import { Component, Input, Output, EventEmitter } from '@angular/core'; 11 | import * as moment from 'moment'; 12 | import * as _ from "lodash"; 13 | var Calendar = (function () { 14 | function Calendar() { 15 | this.onDaySelect = new EventEmitter(); 16 | this.onMonthSelect = new EventEmitter(); 17 | this.events = []; 18 | this.currentYear = moment().year(); 19 | this.currentMonth = moment().month(); 20 | this.currentDate = moment().date(); 21 | this.currentDay = moment().day(); 22 | this.displayYear = moment().year(); 23 | this.displayMonth = moment().month(); 24 | this.dateArray = []; // Array for all the days of the month 25 | this.weekArray = []; // Array for each row of the calendar 26 | this.lastSelect = 0; // Record the last clicked location 27 | this.weekHead = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']; 28 | this.today(); 29 | this.createMonth(this.displayYear, this.displayMonth); 30 | } 31 | Calendar.prototype.ngOnChanges = function () { 32 | this.createMonth(this.displayYear, this.displayMonth); 33 | }; 34 | Calendar.prototype.ngAfterContentInit = function () { 35 | console.info(this.lang); 36 | if (!this.lang) { 37 | this.lang = 'en'; 38 | } 39 | if (this.lang === 'es') { 40 | this.weekHead = ['Dom', 'Lun', 'Mar', 'Mie', 'Jue', 'Vie', 'Sab']; 41 | } 42 | }; 43 | // Jump to today 44 | Calendar.prototype.today = function () { 45 | this.displayYear = this.currentYear; 46 | this.displayMonth = this.currentMonth; 47 | this.createMonth(this.currentYear, this.currentMonth); 48 | // Mark today as a selection 49 | var todayIndex = _.findIndex(this.dateArray, { 50 | year: this.currentYear, 51 | month: this.currentMonth, 52 | date: this.currentDate, 53 | isThisMonth: true 54 | }); 55 | this.lastSelect = todayIndex; 56 | this.dateArray[todayIndex].isSelect = true; 57 | this.onDaySelect.emit(this.dateArray[todayIndex]); 58 | }; 59 | Calendar.prototype.isInEvents = function (year, month, date) { 60 | var i = 0, len = this.events.length; 61 | for (; i < len; i++) { 62 | if (this.events[i].year == year && this.events[i].month == month && this.events[i].date == date) { 63 | return true; 64 | } 65 | } 66 | return false; 67 | }; 68 | Calendar.prototype.createMonth = function (year, month) { 69 | this.dateArray = []; // Clear last month's data 70 | this.weekArray = []; // Clear week data 71 | var firstDay; 72 | // The day of the week on the first day of the current month of 73 | // selection determines how many days to take out last month. Sunday 74 | // does not show last month, Monday shows the previous month, Tuesday 75 | // shows the last two days 76 | var preMonthDays; // The number of days for the previous month 77 | var monthDays; // The number of days for the month 78 | var weekDays = []; 79 | firstDay = moment({ year: year, month: month, date: 1 }).day(); 80 | // The number of days last month 81 | if (month === 0) { 82 | preMonthDays = moment({ year: year - 1, month: 11 }).daysInMonth(); 83 | } 84 | else { 85 | preMonthDays = moment({ year: year, month: month - 1 }).daysInMonth(); 86 | } 87 | // The number of days this month 88 | monthDays = moment({ year: year, month: month }).daysInMonth(); 89 | // PREVIOUS MONTH 90 | // Add the last few days of the previous month to the array 91 | if (firstDay !== 7) { 92 | var lastMonthStart = preMonthDays - firstDay + 1; // From the last few months start 93 | for (var i = 0; i < firstDay; i++) { 94 | if (month === 0) { 95 | this.dateArray.push({ 96 | year: year, 97 | month: 11, 98 | date: lastMonthStart + i, 99 | isThisMonth: false, 100 | isToday: false, 101 | isSelect: false, 102 | hasEvent: (this.isInEvents(year, 11, lastMonthStart + i)) ? true : false, 103 | }); 104 | } 105 | else { 106 | this.dateArray.push({ 107 | year: year, 108 | month: month - 1, 109 | date: lastMonthStart + i, 110 | isThisMonth: false, 111 | isToday: false, 112 | isSelect: false, 113 | hasEvent: (this.isInEvents(year, month - 1, lastMonthStart + i)) ? true : false, 114 | }); 115 | } 116 | } 117 | } 118 | // Add the numeral for this month to the array 119 | for (var i = 0; i < monthDays; i++) { 120 | this.dateArray.push({ 121 | year: year, 122 | month: month, 123 | date: i + 1, 124 | isThisMonth: true, 125 | isToday: false, 126 | isSelect: false, 127 | hasEvent: (this.isInEvents(year, month, i + 1)) ? true : false, 128 | }); 129 | } 130 | if (this.currentYear === year && this.currentMonth === month) { 131 | var todayIndex = _.findIndex(this.dateArray, { 132 | year: this.currentYear, 133 | month: this.currentMonth, 134 | date: this.currentDate, 135 | isThisMonth: true 136 | }); 137 | this.dateArray[todayIndex].isToday = true; 138 | } 139 | // Add the number of days next month to the array, with some months showing 6 weeks and some months showing 5 weeks 140 | if (this.dateArray.length % 7 !== 0) { 141 | var nextMonthAdd = 7 - this.dateArray.length % 7; 142 | for (var i = 0; i < nextMonthAdd; i++) { 143 | if (month === 11) { 144 | this.dateArray.push({ 145 | year: year, 146 | month: 0, 147 | date: i + 1, 148 | isThisMonth: false, 149 | isToday: false, 150 | isSelect: false, 151 | hasEvent: (this.isInEvents(year, 0, i + 1)) ? true : false, 152 | }); 153 | } 154 | else { 155 | this.dateArray.push({ 156 | year: year, 157 | month: month + 1, 158 | date: i + 1, 159 | isThisMonth: false, 160 | isToday: false, 161 | isSelect: false, 162 | hasEvent: (this.isInEvents(year, month + 1, i + 1)) ? true : false, 163 | }); 164 | } 165 | } 166 | } 167 | // All date data is now added to the dateArray array 168 | // Insert the date data into the new array every seven days 169 | for (var i = 0; i < this.dateArray.length / 7; i++) { 170 | for (var j = 0; j < 7; j++) { 171 | weekDays.push(this.dateArray[i * 7 + j]); 172 | } 173 | this.weekArray.push(weekDays); 174 | weekDays = []; 175 | } 176 | }; 177 | Calendar.prototype.back = function () { 178 | // Decrementing the year if necessary 179 | if (this.displayMonth === 0) { 180 | this.displayYear--; 181 | this.displayMonth = 11; 182 | } 183 | else { 184 | this.displayMonth--; 185 | } 186 | this.onMonthSelect.emit({ 187 | 'year': this.displayYear, 188 | 'month': this.displayMonth 189 | }); 190 | this.createMonth(this.displayYear, this.displayMonth); 191 | }; 192 | Calendar.prototype.forward = function () { 193 | // Incrementing the year if necessary 194 | if (this.displayMonth === 11) { 195 | this.displayYear++; 196 | this.displayMonth = 0; 197 | } 198 | else { 199 | this.displayMonth++; 200 | } 201 | this.onMonthSelect.emit({ 202 | 'year': this.displayYear, 203 | 'month': this.displayMonth 204 | }); 205 | this.createMonth(this.displayYear, this.displayMonth); 206 | }; 207 | // Select a day, click event 208 | Calendar.prototype.daySelect = function (day, i, j) { 209 | // First clear the last click status 210 | this.dateArray[this.lastSelect].isSelect = false; 211 | // Store this clicked status 212 | this.lastSelect = i * 7 + j; 213 | this.dateArray[i * 7 + j].isSelect = true; 214 | this.onDaySelect.emit(day); 215 | }; 216 | return Calendar; 217 | }()); 218 | __decorate([ 219 | Output(), 220 | __metadata("design:type", Object) 221 | ], Calendar.prototype, "onDaySelect", void 0); 222 | __decorate([ 223 | Output(), 224 | __metadata("design:type", Object) 225 | ], Calendar.prototype, "onMonthSelect", void 0); 226 | __decorate([ 227 | Input(), 228 | __metadata("design:type", Array) 229 | ], Calendar.prototype, "events", void 0); 230 | __decorate([ 231 | Input(), 232 | __metadata("design:type", String) 233 | ], Calendar.prototype, "lang", void 0); 234 | Calendar = __decorate([ 235 | Component({ 236 | selector: 'ion-calendar', 237 | template: "\n \n \n \n \n \n \n
{{displayYear}} - {{displayMonth + 1 | monthName:lang}}
\n
\n \n \n \n
\n\n \n {{head}}\n \n\n \n \n {{day.date}}\n \n \n \n\n
\n" 238 | }), 239 | __metadata("design:paramtypes", []) 240 | ], Calendar); 241 | export { Calendar }; 242 | //# sourceMappingURL=calendar.js.map -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright 2018 Raúl Piracés Alastuey 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. -------------------------------------------------------------------------------- /src/pages/list/list.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | import { NavController, NavParams, LoadingController } from 'ionic-angular'; 3 | import { Storage } from '@ionic/storage'; 4 | import { Md5 } from 'ts-md5/dist/md5'; 5 | import moment from 'moment'; 6 | 7 | import { EventsService } from '../../services/events'; 8 | 9 | @Component({ 10 | selector: 'page-list', 11 | templateUrl: 'list.html' 12 | }) 13 | export class ListPage { 14 | myDate: any; 15 | category: any; 16 | text: any; 17 | 18 | selectedDate: any; 19 | selectedCategory: any; 20 | selectedText: string = ""; 21 | 22 | lastFilter: any; 23 | starred: boolean; 24 | 25 | hash: any; 26 | hashEvent: any; 27 | 28 | showEvents: any = []; 29 | allEvents: any = []; 30 | 31 | constructor(public navCtrl: NavController, public navParams: NavParams, public events: EventsService, public storage: Storage, public loadingController: LoadingController) { 32 | let loading = this.loadingController.create({ content: "Cargando..." }); 33 | loading.present(); 34 | this.allEvents = events.allEvents; 35 | this.keys().then(data => { 36 | events.allEvents.forEach(original => { 37 | let isStarred = false; 38 | data.forEach(element => { 39 | let key = element.replace('setting:', ''); 40 | let hash = Md5.hashStr(JSON.stringify(original)).toString(); 41 | if (key == hash) { 42 | let mainImage = this.getMainImage(original); 43 | isStarred = true; 44 | this.showEvents.push({ starred: true, mainImage: mainImage, event: original }); 45 | } 46 | }); 47 | if (!isStarred) { 48 | this.showEvents.push({ starred: false, mainImage: this.getMainImage(original), event: original }) 49 | } 50 | }); 51 | loading.dismiss(); 52 | }); 53 | } 54 | 55 | getMainImage(original) { 56 | let mainImage = ""; 57 | return mainImage; 58 | } 59 | 60 | categoryFilter(category, change, load) { 61 | if(this.lastFilter == "category" && this.showEvents.length == 0){ 62 | this.lastFilter = undefined; 63 | } 64 | this.category = category; 65 | let loading = this.loadingController.create({ content: "Cargando..." }); 66 | if(this.lastFilter != "text" && load && category != null){ 67 | loading.present(); 68 | } 69 | let eventsFiltered = typeof this.lastFilter == "undefined" ? this.allEvents : this.generateCompleteEvent(this.showEvents); 70 | this.showEvents = []; 71 | eventsFiltered.forEach(element => { 72 | if (element.type == category) { 73 | this.isStarred(element).then(result => { 74 | if(result != null){ 75 | result = true; 76 | } 77 | this.showEvents.push({ starred: result, mainImage: this.getMainImage(element), event: element }); 78 | }); 79 | } 80 | }); 81 | 82 | // Otros filtros 83 | if(!change){ 84 | this.lastFilter = "category"; 85 | } 86 | if(this.lastFilter != "date" && typeof this.myDate != "undefined" && this.myDate.toString().length != 0){ 87 | this.dateFilter(this.myDate, true, true); 88 | } 89 | if(this.lastFilter != "text" && typeof this.text != "undefined" && this.text.toString().length != 0){ 90 | this.textFilter(this.text, true); 91 | } 92 | if(this.lastFilter != "text" && load && category != null){ 93 | loading.dismiss(); 94 | } 95 | } 96 | 97 | dateFilter(myDate, change, load) { 98 | if(this.lastFilter == "date" && this.showEvents.length == 0){ 99 | this.lastFilter = undefined; 100 | } 101 | this.myDate = myDate; 102 | let loading = this.loadingController.create({ content: "Cargando..." }); 103 | if(this.lastFilter != "text" && load && myDate != null){ 104 | loading.present(); 105 | } 106 | let eventsFiltered = typeof this.lastFilter == "undefined" ? this.allEvents : this.generateCompleteEvent(this.showEvents); 107 | this.showEvents = []; 108 | eventsFiltered.forEach(element => { 109 | if ((myDate.day == element.start.getDate() && element.start.getHours() >=5 && element.start.getMonth() == myDate.month - 1) || 110 | (this.getTomorrow(myDate.day, myDate.month, new Date().getFullYear()) == element.start.getDate() && element.start.getHours() <=5 && this.getMonth(myDate.date, myDate.month, new Date().getFullYear() == myDate.month - 1))) { 111 | this.isStarred(element).then(result => { 112 | if(result != null){ 113 | result = true; 114 | } 115 | this.showEvents.push({ starred: result, mainImage: this.getMainImage(element), event: element }); 116 | }); 117 | } 118 | }); 119 | 120 | // Otros filtros 121 | if(!change){ 122 | this.lastFilter = "date"; 123 | } 124 | if(this.lastFilter != "category" && typeof this.category != "undefined" && this.category.toString().length != 0){ 125 | this.categoryFilter(this.category, true, true); 126 | } 127 | if(this.lastFilter != "text" && typeof this.text != "undefined" && this.text.toString().length != 0){ 128 | this.textFilter(this.text, true); 129 | } 130 | if(this.lastFilter != "text" && load && myDate != null){ 131 | loading.dismiss(); 132 | } 133 | } 134 | 135 | textFilter(text, change) { 136 | if(this.lastFilter == "text" && this.showEvents.length == 0){ 137 | this.lastFilter = undefined; 138 | } 139 | this.text = text.value; 140 | if (typeof text.value != "undefined" && text.value.length > 3) { 141 | let eventsFiltered = typeof this.lastFilter == "undefined" ? this.allEvents : this.generateCompleteEvent(this.showEvents); 142 | this.showEvents = []; 143 | eventsFiltered.forEach(element => { 144 | var re = new RegExp(text.value, 'i'); 145 | if (element.title.match(re)) { 146 | this.isStarred(element).then(result => { 147 | if(result != null){ 148 | result = true; 149 | } 150 | this.showEvents.push({ starred: result, mainImage: this.getMainImage(element), event: element }); 151 | }); 152 | } 153 | }); 154 | } else if(typeof text.value != "undefined" && text.value.length == 0){ 155 | this.lastFilter = undefined; 156 | } 157 | 158 | // Otros filtros 159 | if(!change && typeof text.value != "undefined" && text.value.length > 3){ 160 | this.lastFilter = "text"; 161 | } 162 | if(this.lastFilter != "category" && typeof this.category != "undefined" && this.category.toString().length != 0){ 163 | this.categoryFilter(this.category, true, false); 164 | } 165 | if(this.lastFilter != "date" && typeof this.myDate != "undefined" && this.myDate.toString().length != 0){ 166 | this.dateFilter(this.myDate, true, false); 167 | } 168 | } 169 | 170 | deleteFilters(reconstruct) { 171 | this.showEvents = []; 172 | this.selectedCategory = null; 173 | this.selectedDate = null; 174 | this.selectedText = null; 175 | if(reconstruct){ 176 | this.reconstruct(); 177 | } 178 | } 179 | 180 | async isStarred(item) { 181 | let hash = Md5.hashStr(JSON.stringify(item)).toString(); 182 | return this.get(hash); 183 | } 184 | 185 | starEvent(item) { 186 | let hash = Md5.hashStr(JSON.stringify(item.event)).toString(); 187 | this.hash = hash; 188 | this.hashEvent = item.event; 189 | this.set(hash, hash).then(result => 190 | { 191 | this.showEvents.forEach(element => { 192 | if(element.event == item.event){ 193 | element.starred = true; 194 | } 195 | }); 196 | this.allEvents.forEach(element => { 197 | if(element.event == item.event){ 198 | element.starred = true; 199 | } 200 | }); 201 | // let scheduledDate = item.event.start; 202 | // scheduledDate.setHours(scheduledDate.getHours() - 1); 203 | // this.localNotifications.schedule({ 204 | // id: this.hash.toString(), 205 | // title: this.hashEvent.title.toString(), 206 | // text: 'El evento: "' + this.hashEvent.title.toString() + ' comienza en 1h', 207 | // trigger: {at: scheduledDate} 208 | // }); 209 | } 210 | ); 211 | } 212 | 213 | unstarEvent(item) { 214 | let hash = Md5.hashStr(JSON.stringify(item.event)).toString(); 215 | this.remove(hash).then(result => 216 | { 217 | this.showEvents.forEach(element => { 218 | if(element.event == item.event){ 219 | element.starred = false; 220 | } 221 | }); 222 | this.allEvents.forEach(element => { 223 | if(element.event == item.event){ 224 | element.starred = false; 225 | } 226 | }); 227 | // this.localNotifications.cancel(hash.toString()); 228 | } 229 | ); 230 | } 231 | 232 | generateCompleteEvent(array){ 233 | let newArray = []; 234 | array.forEach(element => { 235 | newArray.push(element.event); 236 | }); 237 | return newArray; 238 | } 239 | 240 | getTomorrow(date, month, year){ 241 | var aux = moment({ year :year, month :month, day :date, hour :0, minute :0, second :0, millisecond :0}); 242 | return aux.add('days', 1).date(); 243 | } 244 | 245 | getMonth(date, month, year){ 246 | var aux = moment({ year :year, month :month, day :date, hour :0, minute :0, second :0, millisecond :0}); 247 | return aux.add('days', 1).month(); 248 | } 249 | 250 | getYear(date, month, year){ 251 | var aux = moment({ year :year, month :month, day :date, hour :0, minute :0, second :0, millisecond :0}); 252 | return aux.add('days', 1).year(); 253 | } 254 | 255 | reconstruct() { 256 | let loading = this.loadingController.create({ content: "Cargando..." }); 257 | loading.present(); 258 | this.showEvents = []; 259 | this.keys().then(data => { 260 | this.allEvents.forEach(original => { 261 | let isStarred = false; 262 | data.forEach(element => { 263 | let key = element.replace('setting:', ''); 264 | let hash = Md5.hashStr(JSON.stringify(original)).toString(); 265 | if (key == hash) { 266 | let mainImage = this.getMainImage(original); 267 | isStarred = true; 268 | this.showEvents.push({ starred: true, mainImage: mainImage, event: original }); 269 | } 270 | }); 271 | if (!isStarred) { 272 | this.showEvents.push({ starred: false, mainImage: this.getMainImage(original), event: original }) 273 | } 274 | }); 275 | loading.dismiss(); 276 | }); 277 | } 278 | 279 | yesterday() { 280 | let loading = this.loadingController.create({ content: "Cargando..." }); 281 | loading.present(); 282 | var currentDate = new Date(); 283 | currentDate.setDate(currentDate.getDate() - 1); 284 | this.deleteFilters(false); 285 | this.showEvents = []; 286 | this.keys().then(data => { 287 | this.allEvents.forEach(original => { 288 | let isStarred = false; 289 | data.forEach(element => { 290 | let key = element.replace('setting:', ''); 291 | let hash = Md5.hashStr(JSON.stringify(original)).toString(); 292 | if (key == hash) { 293 | let mainImage = this.getMainImage(original); 294 | isStarred = true; 295 | if((currentDate.getDate() == original.start.getDate() && original.start.getHours() >=5 && currentDate.getMonth() == original.start.getMonth() && currentDate.getFullYear() == original.start.getFullYear()) 296 | || (this.getTomorrow(currentDate.getDate(), currentDate.getMonth(), currentDate.getFullYear()) == original.start.getDate() && original.start.getHours() <=5 297 | && this.getMonth(currentDate.getDate(), currentDate.getMonth(), currentDate.getFullYear()) == original.start.getMonth() 298 | && this.getYear(currentDate.getDate(), currentDate.getMonth(), currentDate.getFullYear()) == original.start.getFullYear())){ 299 | this.showEvents.push({ starred: true, mainImage: mainImage, event: original }); 300 | } 301 | } 302 | }); 303 | if (!isStarred) { 304 | if((currentDate.getDate() == original.start.getDate() && original.start.getHours() >=5 && currentDate.getMonth() == original.start.getMonth() && currentDate.getFullYear() == original.start.getFullYear()) 305 | || (this.getTomorrow(currentDate.getDate(), currentDate.getMonth(), currentDate.getFullYear()) == original.start.getDate() && original.start.getHours() <=5 306 | && this.getMonth(currentDate.getDate(), currentDate.getMonth(), currentDate.getFullYear()) == original.start.getMonth() 307 | && this.getYear(currentDate.getDate(), currentDate.getMonth(), currentDate.getFullYear()) == original.start.getFullYear())){ 308 | this.showEvents.push({ starred: false, mainImage: this.getMainImage(original), event: original }); 309 | } 310 | } 311 | }); 312 | loading.dismiss(); 313 | }); 314 | } 315 | 316 | today() { 317 | let loading = this.loadingController.create({ content: "Cargando..." }); 318 | loading.present(); 319 | var currentDate = new Date(); 320 | this.deleteFilters(false); 321 | this.showEvents = []; 322 | this.keys().then(data => { 323 | this.allEvents.forEach(original => { 324 | let isStarred = false; 325 | data.forEach(element => { 326 | let key = element.replace('setting:', ''); 327 | let hash = Md5.hashStr(JSON.stringify(original)).toString(); 328 | if (key == hash) { 329 | let mainImage = this.getMainImage(original); 330 | isStarred = true; 331 | if((currentDate.getDate() == original.start.getDate() && original.start.getHours() >=5 && currentDate.getMonth() == original.start.getMonth() && currentDate.getFullYear() == original.start.getFullYear()) 332 | || (this.getTomorrow(currentDate.getDate(), currentDate.getMonth(), currentDate.getFullYear()) == original.start.getDate() && original.start.getHours() <=5 333 | && this.getMonth(currentDate.getDate(), currentDate.getMonth(), currentDate.getFullYear()) == original.start.getMonth() 334 | && this.getYear(currentDate.getDate(), currentDate.getMonth(), currentDate.getFullYear()) == original.start.getFullYear())){ 335 | this.showEvents.push({ starred: true, mainImage: mainImage, event: original }); 336 | } 337 | } 338 | }); 339 | if (!isStarred) { 340 | if((currentDate.getDate() == original.start.getDate() && original.start.getHours() >=5 && currentDate.getMonth() == original.start.getMonth() && currentDate.getFullYear() == original.start.getFullYear()) 341 | || (this.getTomorrow(currentDate.getDate(), currentDate.getMonth(), currentDate.getFullYear()) == original.start.getDate() && original.start.getHours() <=5 342 | && this.getMonth(currentDate.getDate(), currentDate.getMonth(), currentDate.getFullYear()) == original.start.getMonth() 343 | && this.getYear(currentDate.getDate(), currentDate.getMonth(), currentDate.getFullYear()) == original.start.getFullYear())){ 344 | this.showEvents.push({ starred: false, mainImage: this.getMainImage(original), event: original }) 345 | } 346 | } 347 | }); 348 | loading.dismiss(); 349 | }); 350 | } 351 | 352 | tomorrow() { 353 | let loading = this.loadingController.create({ content: "Cargando..." }); 354 | loading.present(); 355 | var currentDate = new Date(); 356 | currentDate.setDate(currentDate.getDate() + 1); 357 | this.deleteFilters(false); 358 | this.showEvents = []; 359 | this.keys().then(data => { 360 | this.allEvents.forEach(original => { 361 | let isStarred = false; 362 | data.forEach(element => { 363 | let key = element.replace('setting:', ''); 364 | let hash = Md5.hashStr(JSON.stringify(original)).toString(); 365 | if (key == hash) { 366 | let mainImage = this.getMainImage(original); 367 | isStarred = true; 368 | if((currentDate.getDate() == original.start.getDate() && original.start.getHours() >=5 && currentDate.getMonth() == original.start.getMonth() && currentDate.getFullYear() == original.start.getFullYear()) 369 | || (this.getTomorrow(currentDate.getDate(), currentDate.getMonth(), currentDate.getFullYear()) == original.start.getDate() && original.start.getHours() <=5 370 | && this.getMonth(currentDate.getDate(), currentDate.getMonth(), currentDate.getFullYear()) == original.start.getMonth() 371 | && this.getYear(currentDate.getDate(), currentDate.getMonth(), currentDate.getFullYear()) == original.start.getFullYear())){ 372 | this.showEvents.push({ starred: true, mainImage: mainImage, event: original }); 373 | } 374 | } 375 | }); 376 | if (!isStarred) { 377 | if((currentDate.getDate() == original.start.getDate() && original.start.getHours() >=5 && currentDate.getMonth() == original.start.getMonth() && currentDate.getFullYear() == original.start.getFullYear()) 378 | || (this.getTomorrow(currentDate.getDate(), currentDate.getMonth(), currentDate.getFullYear()) == original.start.getDate() && original.start.getHours() <=5 379 | && this.getMonth(currentDate.getDate(), currentDate.getMonth(), currentDate.getFullYear()) == original.start.getMonth() 380 | && this.getYear(currentDate.getDate(), currentDate.getMonth(), currentDate.getFullYear()) == original.start.getFullYear())){ 381 | this.showEvents.push({ starred: false, mainImage: this.getMainImage(original), event: original }) 382 | } 383 | } 384 | }); 385 | loading.dismiss(); 386 | }); 387 | } 388 | 389 | customTrackBy(index: number, obj: any): any { 390 | return index; 391 | } 392 | 393 | public set(settingName, value) { 394 | return this.storage.set(`setting:${settingName}`, value); 395 | } 396 | public async get(settingName) { 397 | return await this.storage.get(`setting:${settingName}`); 398 | } 399 | public async remove(settingName) { 400 | return await this.storage.remove(`setting:${settingName}`); 401 | } 402 | public async keys() { 403 | return await this.storage.keys(); 404 | } 405 | public clear() { 406 | this.storage.clear().then(() => { 407 | console.log('all keys cleared'); 408 | }); 409 | } 410 | } 411 | --------------------------------------------------------------------------------