-
FreePlanet
-
{{$t('msg.sottoTitoloApp')}}
-
-
{{$t('msg.sottoTitoloApp2')}}
-
-
{{$t('msg.sottoTitoloApp3')}}
+
+
+
+
+
+
+
+
+
{{appname}}
+
+ {{$t('msg.sottoTitoloApp')}}
+
+
{{$t('msg.sottoTitoloApp2')}}
+
+
+ {{$t('msg.sottoTitoloApp3')}}
+
+
+
+ {{$t('msg.sottoTitoloApp4')}}
+
+
+
+
+
+ {{$t('msg.underconstruction')}}
+
+
+
+
+
+
+ {{$t('login.enter')}}
+
+
+ {{$t('reg.submit')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
- {{$t('msg.underconstruction')}}
-
-
-
-
-
-
- {{$t('login.enter')}}
-
-
- {{$t('reg.submit')}}
-
+
+
Ver. {{getenv('APP_VERSION')}}
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+ expand_more
+
+
+
+
+
+
+
+
+
+
+
FreePlanet
+
+ {{$t('msg.sottoTitoloApp')}}
+
+
{{$t('msg.sottoTitoloApp2')}}
+
+
+ {{$t('msg.sottoTitoloApp3')}}
+
+
+
+ {{$t('msg.sottoTitoloApp4')}}
+
+
+
+
+
+ {{$t('msg.underconstruction')}}
+
+
+
+
+
+
+ {{$t('login.enter')}}
+
+
+ {{$t('reg.submit')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Ver. {{getenv('APP_VERSION')}}
+
+
+
+
+
+ expand_more
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
FreePlanet
+
+ {{$t('msg.sottoTitoloApp')}}
+
+
{{$t('msg.sottoTitoloApp2')}}
+
+
+ {{$t('msg.sottoTitoloApp3')}}
+
+
+
+ {{$t('msg.sottoTitoloApp4')}}
+
+
+
+
+
+ {{$t('msg.underconstruction')}}
+
+
+
+
+
+
+ {{$t('login.enter')}}
+
+
+ {{$t('reg.submit')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Ver. {{getenv('APP_VERSION')}}
+
+
+
+
+
+ expand_more
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{{$t('homepage.descrapp_title1')}}
+
+
+
+
+
+
+ {{$t('homepage.freesocial.title')}}
+
+
+
+
+ {{$t('homepage.freetalent.title')}}
+
+
+
+
+ {{$t('homepage.freegas.title')}}
+
+
+
+
+ {{$t('homepage.freeliving.title')}}
+
+
+
+
+
+
+
+
+ {{$t('homepage.freecollabora.title')}}
+
+
+
+
+ {{$t('homepage.freesostieni.title')}}
+
+
+
+
+
+
+
{{$t('homepage.multiplatform.title')}}
+
+
+
+
+ {{$t('homepage.free.title')}}
+
+
+
+
+
+
+
+
+
diff --git a/src/root/home/old-home.vue b/src/root/home/old-home.vue
deleted file mode 100644
index a80a15e..0000000
--- a/src/root/home/old-home.vue
+++ /dev/null
@@ -1,98 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
High performance, Material
- Design
- 2 , full front end stack with Vuejs
-
-
-
-
-
expand_more
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/router/route-config.ts b/src/router/route-config.ts
index 382d662..a3f9268 100644
--- a/src/router/route-config.ts
+++ b/src/router/route-config.ts
@@ -43,7 +43,10 @@ export const RouteConfig: VueRouteConfig[] = [
{
path: '/admin/cfgserv',
name: 'cfgserv',
- component: () => import('@/components/admin/cfgServer/cfgServer.vue')
+ component: () => import('@/components/admin/cfgServer/cfgServer.vue'),
+ meta: {
+ middleware: [auth]
+ }
},
{
path: '/admin/testp1/:category',
diff --git a/src/statics/css/dragula.css b/src/statics/css/dragula.css
new file mode 100644
index 0000000..b18c16e
--- /dev/null
+++ b/src/statics/css/dragula.css
@@ -0,0 +1,22 @@
+.gu-mirror {
+ position: fixed !important;
+ margin: 0 !important;
+ z-index: 9999 !important;
+ opacity: 0.8;
+ -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=80)";
+ filter: alpha(opacity=80);
+}
+.gu-hide {
+ display: none !important;
+}
+.gu-unselectable {
+ -webkit-user-select: none !important;
+ -moz-user-select: none !important;
+ -ms-user-select: none !important;
+ user-select: none !important;
+}
+.gu-transit {
+ opacity: 0.2;
+ -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=20)";
+ filter: alpha(opacity=20);
+}
diff --git a/src/statics/i18n.js b/src/statics/i18n.js
new file mode 100644
index 0000000..458655f
--- /dev/null
+++ b/src/statics/i18n.js
@@ -0,0 +1,695 @@
+const messages = {
+ it: {
+ dialog: {
+ ok: 'Ok',
+ yes: 'Si',
+ no: 'No',
+ delete: 'Elimina',
+ cancel: 'Annulla',
+ msg: {
+ titledeleteTask: 'Elimina Task',
+ deleteTask: "Vuoi Eliminare {mytodo}?"
+ }
+ },
+ comp: {
+ Conta: "Conta",
+ },
+ msg: {
+ hello: 'Buongiorno',
+ myAppName: 'FreePlanet',
+ underconstruction: 'App in costruzione...',
+ myDescriz: '',
+ sottoTitoloApp: 'Il primo Vero Social',
+ sottoTitoloApp2: 'Libero, Equo e Solidale',
+ sottoTitoloApp3: 'dove Vive Consapevolezza e Aiuto Comunitario',
+ sottoTitoloApp4: 'Gratuito e senza Pubblicità ',
+ },
+ homepage: {
+ descrapp_title1: 'Uniti per Evolvere e Sperimentare',
+ descrapp_pag1: 'Riscopri come il valore della
Condivisione e della
Cooperazione , possa aiutarci a ritrovare il profondo ' +
+ 'senso della
Vita , perduto in questa società consumista, e riporti quei
Sani Pricìpi Naturali ed Umani di
Fratellanza ' +
+ ' che intere popolazioni antiche conoscevano bene.',
+ descrapp_pag2: 'E\' giunta l\'ora di utilizzare i nuovi strumenti
Tecnologici a nostro
favore , per
Liberarci ' +
+ 'così piano piano dalla
schiavitù del
"Lavoro per generare Denaro" e trasformando le nostre
Capacitá in ' +
+ '
Risorse Umane per poterci sostenere e vivere in
Armonia con gli altri.',
+ freesocial: {
+ title: 'Free Social',
+ descr: 'Una Community organizzata per
Categorie , dove potrai unirti a
Gruppi Tematici , ' +
+ 'Condividere
Esperienze e unire Competenze per organizzare e sostenere
Progetti Innovativi per il Popolo.
' +
+ 'Verranno evidenziati sviluppi
Etici come l\'
Auto-Produzione , la
Sostenibilitá , ' +
+ 'la Buona
Salute Naturale e il
Rispetto per l\'Ambiente e per tutti gli
Esseri Viventi di questo ' +
+ '
Pianeta . Chiunque potrá esprimere il proprio
Consenso o Dissenso partecipando a
Sondaggi Interattivi ' +
+ ' e realizzare insieme i
Cambiamenti necessari alla nostra Società .',
+ },
+ freetalent: {
+ title: 'Free Talent',
+ descr: 'Condividi i tuoi
Talenti e
Abilità , ' +
+ 'al posto del denaro guadagnagnerai
Tempo .
' +
+ '
"1 ora" diventa moneta di scambio, uguale per tutti.
' +
+ 'Potrai utilizzare questi tuoi
"Crediti Tempo" per soddisfare le tue necessità , cercando nelle
Competenze Disponibili .
' +
+ 'Nel Dare e Ricevere, si creeranno così legami di
Amicizia, Solidarietà , Cooperazione e Divertimento ' +
+ 'Questo progetto vuole diffondere, ora in maniera informatizzata, questa realtà che gia esiste da tanti anni, e viene chiamata
"Banca del Tempo" . ' +
+ 'Le
segreterie sparse in tutto il mondo, serviranno a dare maggiore
affidabilità e
fiducia negli scambi di talenti tra persone sconosciute. ' +
+ 'Creeremo così una
rete di fiducia nel vicinato, come giá viene praticato in numerosi
Ecovillaggi e Comunità del mondo.',
+ },
+ freegas: {
+ title: 'Free G.A.S.',
+ descr: 'Ti piacerebbe utilizzare una App che ti permetta facilmente di acquistare Prodotti Locali direttamente dal
Produttore ?
' +
+ 'Con i
Gruppi di Acquisto Solidale si evitano intermediazioni inutili, ottenendo parecchi benefici tra cui:
' +
+ '
Qualitá Superiore del prodotto ' +
+ 'Le Recensioni dei consumatori favoriranno i Produttori con Sani Intenti ' +
+ 'Possiblità d\'interagire con il Produttore ' +
+ 'Apertura alle Relazioni tra persone, condividendo Ricette e Consigli preziosi ' +
+ 'Risparmio di soldi (prezzi all\'Ingrosso) ' +
+ 'Valorizzare il Territorio e l\'Economia Locale ' +
+ 'Condizioni Eque per i Lavoratori ' +
+ 'Ridotto Impatto Ambientale ',
+ },
+ freeliving: {
+ title: 'Free Co-Living',
+ descr: 'Unire più realtà , condividendo l\'esperienza di abitare insieme, per un periodo definito:
' +
+ '1) C\'è chi
Vive solo ed ha una casa.
' +
+ '2) Chi ha bisogno di un
alloggio temporaneo.
' +
+ 'Oggi sempre più persone
abitano da sole e vorrebbero continuare a vivere nella propria abitazione.
' +
+ 'Altre persone invece hanno bisogno di una
stanza , per scelta o per necessita, ed in cambio sono disponibili a ' +
+ '
contribuire alle spese per le utenze domestiche o magari
aiutare la persona a
fare la spesa , cucinare,
pulire casa oppure offrendogli semplicemente
compagnia .
' +
+ 'Tramite questo strumento, le persone potranno trovarsi, mettersi in contatto e decidere in che forma
co-abitare e per quanto tempo. Le
recensioni rilasciate ed il
dettaglio dei profili utenti, ' +
+ 'aiuterà nella scelta della persona più in
sintonia .'
+
+ },
+ freecollabora: {
+ title: 'Chi può Collaborare?',
+ descr: 'Tutti coloro che sono in linea con
Princìpi Etici e ricerca del
Benessere Globale del Pianeta ' +
+ 'Pertanto sono i benvenuti:' +
+ '
' +
+ 'Associazioni no-profit, Ecovillaggi, Comunità ' +
+ 'Gruppi che intendono promuovere Progetti Sociali Innovativi per una Decrescita Felice ' +
+ 'Chi gestisce un Gruppo di Acquisto Solidale (G.A.S.) ' +
+ 'Chi gestisce una Banca del Tempo ' +
+ 'Chiunque voglia partecipare , nella forma che ritiene più opportuna. ' +
+ ' ',
+ },
+ freesostieni: {
+ title: 'Come Sostenere il progetto?',
+ descr: '
' +
+ 'Condividendolo a tutti coloro che vogliono far parte insieme della crescita e sviluppo di una Nuova Era ' +
+ 'Rispondendo ai Sondaggi Popolari e lasciando Feedback ' +
+ 'Tramite una donazione (anche 1€ ) per le spese. ' +
+ ' ',
+ },
+ multiplatform: {
+ title: 'Multi-piattaforma',
+ descr: 'E\' compatibile con Google Chrome, Firefox, Safari, iOS, Android e PC. L\'Applicazione s\'installa facilmente, senza passare dallo store. ' +
+ 'basta condividere il nome del sito
www.freeplanet.app .
' +
+ 'Dopo la registrazione chiederà di aggiungerlo alla lista delle applicazioni e sullo sfondo',
+ },
+ free: {
+ title: 'Gratuita, Open Source e Niente Pubblicità ',
+ descr: 'Vedo un
futuro dove non si utilizzerà più denaro. Dove le persone si
aiuteranno a vicenda e non avranno bisogno di "possedere" cose, ma le
condivideranno con gli altri.
' +
+ 'Questa App
non è in vendita , non ha scopi commerciali,
non ha prezzo ed appartiene al
Popolo del Nuovo Mondo . A me il compito di gestirla e proteggerla. ' +
+ 'Verranno accettate solo donazioni Libere di privati ed Associazioni no-profit, in linea con i Principi, che serviranno per coprire le spese.
' +
+ '
Grazie a Tutti per il sostegno . '
+ },
+ contacts: 'Contatti'
+ },
+ pages: {
+ home: 'Principale',
+ SignUp: 'Registrazione',
+ SignIn: 'Login',
+ vreg: 'Verifica Reg',
+ Test: 'Test',
+ Category: 'Categorie',
+ Todo: 'Todo',
+ personal: 'Personale',
+ work: 'Lavoro',
+ shopping: 'Spesa',
+ Admin: 'Admin',
+ Test1: 'Test1',
+ Test2: 'Test2',
+ },
+ components: {
+ authentication: {
+ login: {
+ facebook: 'Facebook'
+ },
+ email_verification: {
+ title: 'Inizia la tua registrazione',
+ introduce_email: 'inserisci la tua email',
+ email: 'Email',
+ invalid_email: 'La tua email è invalida',
+ verify_email: 'Verifica la tua email',
+ go_login: 'Torna al Login',
+ incorrect_input: 'Inserimento incorretto.',
+ link_sent: 'Per confermare la Registrazione, leggi la tua casella di posta e Clicca su "Verifica Email".\nSe non la trovi, cerca nella cartella Spam.'
+ }
+ }
+ },
+ fetch: {
+ errore_generico: 'Errore Generico',
+ errore_server: 'Impossibile accedere al Server. Riprovare Grazie',
+ error_doppiologin: 'Rieseguire il Login. Accesso aperto da un altro dispositivo.',
+ },
+ user: {
+ notregistered: 'Devi registrarti al servizio prima di porter memorizzare i dati',
+ loggati: 'Utente non loggato'
+ },
+ reg: {
+ incorso: 'Registrazione in corso...',
+ richiesto: 'Campo Richiesto',
+ email: 'Email',
+ username: 'Nome Utente',
+ username_login: 'Nome Utente o email',
+ password: 'Password',
+ repeatPassword: 'Ripeti password',
+ terms: "Accetto i termini e le condizioni",
+ submit: "Registrati",
+ title_verif_reg: "Verifica Registrazione",
+ verificato: "Verificato",
+ non_verificato: "Non Verificato",
+ forgetpassword: "Password dimenticata?",
+ err: {
+ required: 'è richiesto',
+ email: 'inserire una email valida',
+ errore_generico: 'Si prega di compilare correttamente i campi',
+ atleast: 'dev\'essere lungo almeno di',
+ complexity: 'deve contenere almeno 1 minuscola, 1 maiuscola e 1 cifra',
+ notmore: 'non dev\'essere lungo più di',
+ char: 'caratteri',
+ terms: 'Devi accettare le condizioni, per continuare.',
+ duplicate_email: 'l\'Email è già stata registrata',
+ duplicate_username: 'L\'Username è stato già utilizzato',
+ sameaspassword: 'Le password devono essere identiche',
+ },
+ tips: {
+ email: 'inserisci la tua email',
+ username: 'username lunga almeno 6 caratteri',
+ password: 'deve contenere 1 minuscola, 1 maiuscola e 1 cifra',
+ repeatpassword: 'ripetere la password',
+
+ }
+ },
+ login: {
+ incorso: 'Login in corso',
+ enter: 'Login',
+ errato: "Username o password errata. Riprovare",
+ completato: 'Login effettuato!',
+ },
+ reset: {
+ title_reset_pwd: "Reimposta la tua Password",
+ send_reset_pwd: 'Invia Reimposta la password',
+ incorso: 'Richiesta Nuova Email...',
+ email_sent: 'Email inviata',
+ check_email: 'Controlla la tua email, ti arriverà un messaggio con un link per reimpostare la tua password. Questo link, per sicurezza, scadrà dopo 4 ore.',
+ title_update_pwd: 'Aggiorna la tua password',
+ update_password: 'Aggiorna Password',
+ },
+ logout: {
+ uscito: 'Sei Uscito',
+ },
+ errors: {
+ graphql: {
+ undefined: 'non definito'
+ }
+ },
+ todo: {
+ titleprioritymenu: 'Priorità :',
+ inserttop: 'Inserisci il Task in cima',
+ insertbottom: 'Inserisci il Task in basso',
+ edit: 'Descrizione Task:',
+ completed: 'Ultimi Completati',
+ usernotdefined: 'Attenzione, occorre essere Loggati per poter aggiungere un Todo'
+ },
+ notification: {
+ status: 'Stato',
+ ask: 'Attiva le Notifiche',
+ waitingconfirm: 'Conferma la richiesta di Notifica',
+ confirmed: 'Notifiche Attivate!',
+ denied: 'Notifiche Disabilitate! Attenzione così non vedrai arrivarti i messaggi. Riabilitali per vederli.',
+ titlegranted: 'Permesso Notifiche Abilitato!',
+ statusnot: 'Stato Notifiche',
+ titledenied: 'Permesso Notifiche Disabilitato!',
+ title_subscribed: 'Sottoscrizione a FreePlanet.app!',
+ subscribed: 'Ora potrai ricevere i messaggi e le notifiche.',
+ newVersionAvailable: 'Aggiorna'
+ },
+ connection: 'Connessione',
+ },
+ 'es': {
+ dialog: {
+ ok: 'Vale',
+ yes: 'SÃ',
+ no: 'No',
+ delete: 'Borrar',
+ cancel: 'Cancelar',
+ msg: {
+ titledeleteTask: 'Borrar Tarea',
+ deleteTask: 'Quieres borrar {mytodo}?'
+ }
+ },
+ comp: {
+ Conta: "Conta",
+ },
+ msg: {
+ hello: 'Buenos DÃas',
+ myAppName: 'FreePlanet',
+ underconstruction: 'App en construcción...',
+ myDescriz: '',
+ sottoTitoloApp: 'El primer Verdadero Social',
+ sottoTitoloApp2: 'Libre, justo y Solidario',
+ sottoTitoloApp3: 'Donde vive Conciencia y Ayuda comunitaria',
+ sottoTitoloApp4: 'Gratis y sin publicidad',
+ },
+ homepage: {
+ descrapp_title1: 'Unidos para evolucionar y experimentar',
+ descrapp_pag1: 'Redescubra cómo el valor de
Compartir y
Cooperación puede ayudarnos a encontrar el profundo ' +
+ 'sentido de la
Vida , perdido en esta sociedad consumista, y mostrando esos
Principios Naturales Saludables y la
Hermandad Humana ' +
+ 'que toda la población antigua conocÃa bien.',
+ descrapp_pag2: 'Ha llegado el momento de utilizar las nuevas herramientas
tecnológicas en nuestro
favor , para
liberarnos ' +
+ 'tan lentamente desde la
esclavitud de
"Trabaja para generar dinero" y transformando nuestra
Capacidad en' +
+ '
Recursos humanos para poder apoyar y vivir en
Armonia con otros.',
+ freesocial: {
+ title: 'Free Social',
+ descr: 'Una comunidad organizada por
CategorÃas , donde puedes unirte a
Grupos temáticos , ' +
+ 'Compartir
experiencias y combinar habilidades para organizar y apoyar
proyectos innovadores para la gente.
' +
+ 'Los desarrollos
éticos como
: Auto-producción ,
Sostenibilidad , ' +
+ 'la Buena
Salud natural y
Respeto por el Medio Ambiente y para todos los
Seres vivos de este' +
+ '
Planeta . Cualquiera puede expresar su
consentimiento o disidencia participando en
Encuestas Interactivas ' +
+ 'y llevar a cabo juntos los
Cambios necesarios para nuestra sociedad.',
+ },
+ freetalent: {
+ title: 'Free Talent',
+ descr: 'Comparte tus
Talentos y
Habilidades , ' +
+ 'en lugar de dinero, ganarás
Tiempo .
' +
+ '
"1 hora" se convierte en una moneda de intercambio, igual para todos.
' +
+ 'Puedes usar estos
"Créditos de tiempo" para satisfacer tus necesidades, buscando en
Habilidades disponibles .
' +
+ 'En Dar y Recibir, crearemos asà vÃnculos de
Amistad, Solidaridad, Cooperación y Diversión .
' +
+ 'Este proyecto apunta a difundir esta realidad, que ya existe desde hace muchos años y se llama
"Banco de tiempo" . ' +
+ 'Las
secretarÃas dispersas por todo el mundo, servirán para dar mayor
fiabilidad y
confianza en el intercambio de talentos entre personas desconocidas. ' +
+ 'Asà crearemos una
red de confianza en el vecindario, como ya se practica en numerosos
Ecoaldeas y en la Comunidades del mundo.',
+ },
+ freegas: {
+ title: 'Free G.A.S. (G.C.S.)',
+ descr: '¿Le gustarÃa usar una aplicación que le permita comprar productos locales directamente desde el
Productor ?
' +
+ 'Con
Grupos de Compra Solidarios evitamos intermediarios innecesarios, obteniendo muchos beneficios, incluyendo:
' +
+ '
Superior Quality del producto ' +
+ ' Opiniones de consumidores favorecerá a los productores con intenciones saludables ' +
+ ' Posibilidad de interactuar con el Productor ' +
+ ' Abierto a relaciones entre personas, compartiendo Recetas y Consejos preciosos ' +
+ ' Ahorros de dinero (precios al por mayor) ' +
+ ' Mejorando el Territorio y la EconomÃa Local ' +
+ ' Condiciones Justa para Trabajadores ' +
+ ' Reducido Impacto Ambiental ',
+ },
+ freeliving: {
+ title: 'Free Co-Living',
+ descr: 'Para unir más realidad, compartiendo la experiencia de vivir juntos, por un perÃodo definido:
'+
+ '1) Hay quien
vive solo y tiene un hogar.
' +
+ '2) Quién necesita un alojamiento
temporal .
' +
+ 'Hoy en dÃa, más y más personas
viven solas y les gustarÃa seguir viviendo en sus propios hogares.
' +
+ 'Otras personas necesitan una
Habitación , por elección o por necesidad, y a cambio están disponibles en' +
+ '
contribuir a los gastos para los billetes de casa o tal vez
ayuda a la persona mayor para
ir de compras , cocinar,
limpiar casa o simplemente ofreciéndole
compañÃa .
' +
+ 'A través de esta herramienta, las personas pueden ponerse en contacto y decidir en qué forma
co-habitar . Los
comentarios publicados y el
detalle de los perfiles de usuario, ' +
+ 'ayudará a elegir a la persona más en
armonÃa .'
+
+ },
+ freecollabora: {
+ title: '¿Quién puede colaborar?',
+ descr: 'Todos aquellos que están en lÃnea con
Principios éticos y la investigación de
Bienestar Global del Planeta ' +
+ 'Por eso son bienvenidos:' +
+ '
' +
+ ' Asociaciones sin ánimo de lucro, Ecoaldeas, Comunidades ' +
+ ' Grupos que desean promover Proyectos sociales innovadores para Feliz Decrecimiento ' +
+ ' Quién administra un Grupo de Compra Solidario (G.C.S.) ' +
+ ' Quién administra un Banco de Tiempo ' +
+ ' Cualquier persona que quiera participar , en la forma que considere más apropiada. ' +
+ ' ',
+ },
+ freesostieni: {
+ title: '¿Cómo apoyar el proyecto?',
+ descr: '
' +
+ ' Compartiéndolo a todos aquellos que quieran unirse en el crecimiento y desarrollo de una Nueva Era ' +
+ ' Respondiendo a Encuestas populares y dejando Comentarios ' +
+ ' A través de una donación (incluso € 1 ) para los gastos. ' +
+ ' ',
+ },
+ multiplatform: {
+ title: 'Multi-plataforma',
+ descr: 'Compatible con Google Chrome, Firefox, Safari, iOS, Android y PC. La aplicación se instala fácilmente, sin pasar por el store. ' +
+ 'para compartirlo, necesita solo el nombre del sitio web:
www.freeplanet.app .
' +
+ 'Después del registro, le pedirá que lo agregue a la lista de aplicaciones y en la pantalla.',
+ },
+ free: {
+ title: 'Libre, Código Abierto y Sin Publicidad',
+ descr: 'Veo un
futuro en el que ya no usarás dinero. Donde las personas
se ayudarán unos a otros y no necesiten "poseer" cosas, pero
compartirán con otros.
' +
+ 'Esta aplicación
no está a la venta , no tiene un propósito comercial,
no tiene precio y pertenece a
la Gente del Nuevo Mundo . A mà la tarea de gestionarlo y protegerlo. ' +
+ 'Solo se aceptarán donaciones de particulares y asociaciones sin änimo de lucro, en lÃnea con los Principios, que se utilizarán para cubrir los gastos.
' +
+ '
Gracias a todos por el apoyo . '
+ },
+ contacts: 'Contactos'
+ },
+ pages: {
+ home: 'Principal',
+ SignUp: 'Nueva Cuenta',
+ SignIn: 'Entrar',
+ vreg: 'Verifica Reg',
+ Test: 'Test',
+ Category: 'CategorÃas',
+ Todo: 'Tareas',
+ personal: 'Personal',
+ work: 'Trabajo',
+ shopping: 'Compras',
+ Admin: 'Administración',
+ Test1: 'Test1',
+ Test2: 'Test2',
+ },
+ components: {
+ authentication: {
+ login: {
+ facebook: 'Facebook'
+ },
+ email_verification: {
+ title: 'Crea una cuenta',
+ introduce_email: 'ingrese su dirección de correo electrónico',
+ email: 'Email',
+ invalid_email: 'Tu correo electrónico no es válido',
+ verify_email: 'Revisa tu email',
+ go_login: 'Vuelve al Login',
+ incorrect_input: 'Entrada correcta.',
+ link_sent: 'Para confirmar el registro, lea su buzón y haga clic en "Verificar correo electrónico".\n' + 'Si no lo encuentras, busca en la carpeta Spam.'
+ }
+ }
+ },
+ fetch: {
+ errore_generico: 'Error genérico',
+ errore_server: 'No se puede acceder al Servidor. Inténtalo de nuevo, Gracias',
+ error_doppiologin: 'Vuelva a iniciar sesión. Acceso abierto por otro dispositivo.',
+ },
+ user: {
+ notregistered: 'Debe registrarse en el servicio antes de poder almacenar los datos',
+ loggati: 'Usuario no ha iniciado sesión'
+ },
+ reg: {
+ incorso: 'Registro en curso...',
+ richiesto: 'Campo requerido',
+ email: 'Email',
+ username: 'Nombre usuario',
+ username_login: 'Nombre usuario o email',
+ password: 'contraseña',
+ repeatPassword: 'Repetir contraseña',
+ terms: "Acepto los términos y condiciones",
+ submit: "Registrarse",
+ title_verif_reg: "Verifica registro",
+ verificato: "Verificado",
+ non_verificato: "No Verificado",
+ forgetpassword: "¿Olvidaste tu contraseña?",
+ err: {
+ required: 'se requiere',
+ email: 'Debe ser una email válida.',
+ errore_generico: 'Por favor, rellene los campos correctamente',
+ atleast: 'debe ser al menos largo',
+ complexity: 'debe contener al menos 1 minúscula, 1 mayúscula y 1 dÃgito',
+ notmore: 'no tiene que ser más largo que',
+ char: 'caracteres',
+ terms: 'Debes aceptar las condiciones, para continuar..',
+ duplicate_email: 'La email ya ha sido registrada',
+ duplicate_username: 'El nombre de usuario ya ha sido utilizado',
+ sameaspassword: 'Las contraseñas deben ser idénticas',
+ }
+ },
+ login: {
+ incorso: 'Login en curso',
+ enter: 'Entra',
+ errato: "Nombre de usuario, correo o contraseña incorrectos. inténtelo de nuevo",
+ completato: 'Login realizado!',
+ },
+ reset: {
+ title_reset_pwd: "Restablece tu contraseña",
+ send_reset_pwd: 'Enviar restablecer contraseña',
+ incorso: 'Solicitar nueva Email...',
+ email_sent: 'Email enviada',
+ check_email: 'Revise su correo electrónico, recibirá un mensaje con un enlace para restablecer su contraseña. Este enlace, por razones de seguridad, expirará después de 4 horas.',
+ title_update_pwd: 'Actualiza tu contraseña',
+ update_password: 'Actualizar contraseña',
+ },
+ logout: {
+ uscito: 'Estás desconectado',
+ },
+ errors: {
+ graphql: {
+ undefined: 'no definido'
+ }
+ },
+ todo: {
+ titleprioritymenu: 'Prioridad:',
+ inserttop: 'Ingrese una nueva Tarea arriba',
+ insertbottom: 'Ingrese una nueva Tarea abajo',
+ edit: 'Descripción Tarea:',
+ completed: 'Ultimos Completados',
+ usernotdefined: 'Atención, debes iniciar sesión para agregar una Tarea'
+ },
+ notification: {
+ status: 'Estado',
+ ask: 'Activar notificaciones',
+ waitingconfirm: 'Confirmar la solicitud de notificación.',
+ confirmed: 'Notificaciones activadas!',
+ denied: 'Notificaciones deshabilitadas! Ten cuidado, asà no verás llegar los mensajes. RehabilÃtalos para verlos.',
+ titlegranted: 'Notificaciones permitidas habilitadas!',
+ statusnot: 'Estado Notificaciones',
+ titledenied: 'Notificaciones permitidas deshabilitadas!',
+ title_subscribed: 'Suscripción a FreePlanet.app!',
+ subscribed: 'Ahora puedes recibir mensajes y notificaciones.',
+ newVersionAvailable: 'Actualiza'
+ },
+ connection: 'Connection',
+ },
+ 'enUs': {
+ dialog: {
+ ok: 'Ok',
+ yes: 'Yes',
+ no: 'No',
+ delete: 'Delete',
+ cancel: 'Cancel',
+ msg: {
+ titledeleteTask: 'Delete Task',
+ deleteTask: 'Delete Task {mytodo}?'
+ }
+ },
+ comp: {
+ Conta: "Count",
+ },
+ msg: {
+ hello: 'Hello!',
+ myAppName: 'FreePlanet',
+ underconstruction: 'App in construction...',
+ myDescriz: '',
+ sottoTitoloApp: 'The first Real Social',
+ sottoTitoloApp2: 'Free, Fair and Equitable',
+ sottoTitoloApp3: 'Where the conscience and community help live',
+ sottoTitoloApp4: 'Free and without advertising',
+ },
+ homepage: {
+ descrapp_title1: 'Together to Evolve and Experiment',
+ descrapp_pag1: 'Rediscover how the value of
Sharing and
Cooperation , can help us find the deep meaning of' +
+ '
Life , lost in this consumer society, and showing those
Healthy Natural Principles and Human
Brotherhood ' +
+ 'that entire ancient populations knew well.',
+ descrapp_pag2: 'The time has come to use the new
Technological tools in our
favor , to
Free ourselves ' +
+ 'so slowly from the
slavery of the
"Work to generate Money" and transforming our
Capacity into' +
+ '
Human Resources to be able to support and live in
Harmony with others.',
+ freesocial: {
+ title: 'Free Social',
+ descr: 'A Community organized by
Categories , where you can join
Thematic Groups , ' +
+ 'Share
Experiences and combine Skills to organize and support
Innovative Projects for the People.
' +
+ '
Ethical developments such as
Auto-Production ,
Sustainability , ' +
+ 'Good
Natural Health and
Respect for the Environment and for all
Living Beings of this' +
+ '
Planet . Anyone can express their
Consent or Dissent by participating in
Interactive Surveys ' +
+ 'and carry out together the
Changes needed for our society.',
+ },
+ freetalent: {
+ title: 'Free Talent',
+ descr: 'Share your
Talents and
Skills , ' +
+ 'instead of money, you\'ll earn
Time .
' +
+ '
"1 hour" becomes a currency of exchange, equal for all.
' +
+ 'You can use these
"Time Credits" to meet your needs, looking in
Available Skills .
' +
+ 'In Giving and Receiving, we will thus create bonds of
Friendship, Solidarity, Cooperation and Enjoyment ' +
+ 'This project aims to spread this reality, which already exists for many years and is called
"Time Bank" . ' +
+ 'The
secretariats in all over the world, will serve an extra to give greater
reliability and
trust in the exchange of talents between unknown people. ' +
+ 'We will thus create a
trust network in the neighborhood, as is already practiced in numerous
Ecovillages and Community of the world. ',
+ },
+ freegas: {
+ title: 'Free G.A.S.',
+ descr: 'Would you like to use an App that allows you to easily Buy Local Products directly from
Manufacturer ?
' +
+ 'With
Solidarity Purchase Groups (in Italian: "Gruppo di Aacquisto Solidale") we avoid unnecessary intermediaries, obtaining many benefits including:
' +
+ '
Superior Quality of the product ' +
+ ' Consumer Reviews will favor Producers with Healthy Intents ' +
+ ' Possibility to interact with the Producer ' +
+ ' Open to Relations between people, sharing Recipes and precious Tips ' +
+ ' Savings money (wholesale prices) ' +
+ ' Enhancing the Territory and the Local Economy ' +
+ ' Fair Conditions for Workers ' +
+ ' Reduced Environmental Impact '
+ },
+ freeliving: {
+ title: 'Free Co-Living',
+ descr: 'Join more reality, sharing the experience of living together, for a defined period:
' +
+ '1) Someone
Lives alone and has a house.
' +
+ '2) Who needs a temporary
accommodation .
' +
+ 'Today more and more people
live alone and would like to continue living in their own house.
' +
+ 'Other people instead need a
room , by choice or by necessity, and in return they are available to' +
+ '
contribute to expenses for households or maybe
help to
go shopping , cooking,
cleaning house or simply offering him
companionship .
' +
+ 'Through this tool, people can get in touch and decide in which way
co-living . The
reviews released and the
detail of user profiles, ' +
+ 'will help in
choosing the person more in
tune .'
+
+ },
+ freecollabora: {
+ title: 'Who can collaborate?',
+ descr: 'All those who are in line with
Ethical Principles and research of
Global Wellness of the Planet ' +
+ 'Therefore they are welcome:' +
+ '
' +
+ ' Non-profit associations, Ecovillages, Communities ' +
+ ' Groups that want to promote Innovative Social Projects for Happy Degrowth ' +
+ ' Who manages a Solidarity Purchase Group ' +
+ ' Who manages a Time Bank ' +
+ ' Anyone who wants to participate , in the form it considers most appropriate. ' +
+ ' ',
+ },
+ freesostieni: {
+ title: 'How to support the project?',
+ descr: '
' +
+ ' Sharing it to all those who want to join together in the growth and development of a New Era ' +
+ ' Answering to Popular Polls and leaving Feedback ' +
+ ' Through a donation (even $ 1 ) for expenses. ' +
+ ' ',
+ },
+ multiplatform: {
+ title: 'Multi-platform',
+ descr: 'It is compatible with Google Chrome, Firefox, Safari, iOS, Android and PC. The Application is easily installed, without going through the store. ' +
+ 'just share the name of this site
www.freeplanet.app .
' +
+ 'After registration it will ask to be added to the application list and in the screen',
+ },
+ free: {
+ title: 'Free, Open Source and No Advertising',
+ descr: 'I see a
future where you will no longer use money. Where people
will help each other and won\'t need to "own" things, but
will share with others.
' +
+ 'This App
is not for sale , has no commercial purpose,
is priceless and belongs to the
New World People . To me the task of managing it and protecting it. ' +
+ 'Only donations from private individuals and non-profit associations will be accepted, in line with the Principles, which will be used to cover the expenses.
' +
+ '
Thanks all for the support . '
+ },
+ contacts: 'Contacts'
+ },
+ pages: {
+ home: 'Dashboard',
+ SignUp: 'SignUp',
+ SignIn: 'SignIn',
+ vreg: 'Verify Reg',
+ Test: 'Test',
+ Category: 'Category',
+ Todo: 'Todo',
+ personal: 'Personal',
+ work: 'Work',
+ shopping: 'Shopping',
+ Admin: 'Admin',
+ Test1: 'Test1',
+ Test2: 'Test2',
+ },
+ components: {
+ authentication: {
+ login: {
+ facebook: 'Facebook'
+ },
+ email_verification: {
+ title: 'Begin your registration',
+ introduce_email: 'Enter your email',
+ email: 'Email',
+ invalid_email: 'Your email is invalid',
+ verify_email: 'Verify your email',
+ go_login: 'Back to Login',
+ incorrect_input: 'Incorrect input.',
+ link_sent: 'To confirm the Registration, read your mailbox and click on "Verify email".\nIf you can not find it check your junk mail or spam.'
+ }
+ }
+ },
+ fetch: {
+ errore_generico: 'Generic Error',
+ errore_server: 'Unable to access to the Server. Retry. Thank you.',
+ error_doppiologin: 'Signup again. Another access was made with another device.',
+ },
+ user: {
+ notregistered: 'You need first to SignUp before storing data',
+ loggati: 'User not logged in'
+ },
+ reg: {
+ incorso: 'Registration please wait...',
+ richiesto: 'Field Required',
+ email: 'Email',
+ username_login: 'Username or email',
+ username: 'Username',
+ password: 'Password',
+ repeatPassword: 'Repeat password',
+ terms: "I agree with the terms and conditions",
+ submit: "Submit",
+ title_verif_reg: "Verify Registration",
+ verificato: "Verified",
+ non_verificato: "Not Verified",
+ forgetpassword: "Forget Password?",
+ err: {
+ required: 'is required',
+ email: 'must be a valid email',
+ errore_generico: 'Please review fields again',
+ atleast: 'must be at least',
+ complexity: 'must contains at least 1 lowercase letter, 1 uppercase letter, and 1 digit',
+ notmore: 'must not be more than',
+ char: 'characters long',
+ terms: 'You need to agree with the terms & conditions.',
+ duplicate_email: 'Email was already registered',
+ duplicate_username: 'Username is already taken',
+ sameaspassword: 'Passwords must be identical',
+ }
+ },
+ login: {
+ incorso: 'Login...',
+ enter: 'Login',
+ errato: "Username or password wrong. Please retry again",
+ completato: 'Login successfully!',
+ },
+ reset: {
+ title_reset_pwd: "Reset your Password",
+ send_reset_pwd: 'Send password request',
+ incorso: 'Request New Email...',
+ email_sent: 'Email sent',
+ check_email: 'Check your email for a message with a link to update your password. This link will expire in 4 hours for security reasons.',
+ title_update_pwd: 'Update your password',
+ update_password: 'Update Password',
+ },
+ logout: {
+ uscito: 'Logout successfully',
+ },
+ errors: {
+ graphql: {
+ undefined: 'undefined'
+ }
+ },
+ todo: {
+ titleprioritymenu: 'Priority:',
+ inserttop: 'Insert Task at the top',
+ insertbottom: 'Insert Task at the bottom',
+ edit: 'Task Description:',
+ completed: 'Lasts Completed',
+ usernotdefined: 'Attention, you need to be Signed In to add a new Task'
+ },
+ notification: {
+ status: 'Status',
+ ask: 'Enable Notification',
+ waitingconfirm: 'Confirm the Request Notification',
+ confirmed: 'Notifications Enabled!',
+ denied: 'Notifications Disabled! Attention, you will not see your messages incoming. Reenable it for see it',
+ titlegranted: 'Notification Permission Granted!',
+ statusnot: 'status Notification',
+ titledenied: 'Notification Permission Denied!',
+ title_subscribed: 'Subscribed to FreePlanet.app!',
+ subscribed: 'You can now receive Notification and Messages.',
+ newVersionAvailable: 'Upgrade'
+ },
+ connection: 'Conexión',
+ },
+};
+
+export default messages;
diff --git a/src/statics/images/.directory b/src/statics/images/.directory
new file mode 100644
index 0000000..7f0268a
--- /dev/null
+++ b/src/statics/images/.directory
@@ -0,0 +1,5 @@
+[Dolphin]
+PreviewsShown=true
+Timestamp=2019,2,24,19,27,34
+Version=4
+ViewMode=1
diff --git a/src/statics/images/all_together.jpg b/src/statics/images/all_together.jpg
new file mode 100644
index 0000000..07667df
Binary files /dev/null and b/src/statics/images/all_together.jpg differ
diff --git a/src/layouts/img/avatar-1.svg b/src/statics/images/avatar-1.svg
similarity index 100%
rename from src/layouts/img/avatar-1.svg
rename to src/statics/images/avatar-1.svg
diff --git a/src/statics/images/cover.jpg b/src/statics/images/cover.jpg
new file mode 100644
index 0000000..af6d14f
Binary files /dev/null and b/src/statics/images/cover.jpg differ
diff --git a/src/statics/images/de.png b/src/statics/images/de.png
new file mode 100644
index 0000000..97cb239
Binary files /dev/null and b/src/statics/images/de.png differ
diff --git a/src/statics/images/es.png b/src/statics/images/es.png
new file mode 100644
index 0000000..d66a950
Binary files /dev/null and b/src/statics/images/es.png differ
diff --git a/src/statics/images/freeplanet-logo-full-prec.svg b/src/statics/images/freeplanet-logo-full-prec.svg
new file mode 100644
index 0000000..6c9eaaa
--- /dev/null
+++ b/src/statics/images/freeplanet-logo-full-prec.svg
@@ -0,0 +1,1186 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ image/svg+xml
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/statics/images/freeplanet-logo-full.odg b/src/statics/images/freeplanet-logo-full.odg
new file mode 100644
index 0000000..854da65
Binary files /dev/null and b/src/statics/images/freeplanet-logo-full.odg differ
diff --git a/src/statics/images/freeplanet-logo-full.svg b/src/statics/images/freeplanet-logo-full.svg
new file mode 100644
index 0000000..b9c10df
--- /dev/null
+++ b/src/statics/images/freeplanet-logo-full.svg
@@ -0,0 +1,1186 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ image/svg+xml
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/statics/images/freeplanet-logo-full_old2.svg b/src/statics/images/freeplanet-logo-full_old2.svg
new file mode 100644
index 0000000..db5a6b4
--- /dev/null
+++ b/src/statics/images/freeplanet-logo-full_old2.svg
@@ -0,0 +1,726 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ image/svg+xml
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ FreePlanet
+ FreePlanet
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/statics/images/freeplanet.png b/src/statics/images/freeplanet.png
new file mode 100644
index 0000000..b5e10db
Binary files /dev/null and b/src/statics/images/freeplanet.png differ
diff --git a/src/statics/images/gb.png b/src/statics/images/gb.png
new file mode 100644
index 0000000..fa38aaa
Binary files /dev/null and b/src/statics/images/gb.png differ
diff --git a/src/statics/images/group-together.jpg b/src/statics/images/group-together.jpg
new file mode 100644
index 0000000..58cafa4
Binary files /dev/null and b/src/statics/images/group-together.jpg differ
diff --git a/src/statics/images/it.png b/src/statics/images/it.png
new file mode 100644
index 0000000..3db1442
Binary files /dev/null and b/src/statics/images/it.png differ
diff --git a/src/statics/images/landing_first_section.png b/src/statics/images/landing_first_section.png
new file mode 100644
index 0000000..328d9af
Binary files /dev/null and b/src/statics/images/landing_first_section.png differ
diff --git a/src/statics/images/mountains.jpg b/src/statics/images/mountains.jpg
new file mode 100644
index 0000000..83fef46
Binary files /dev/null and b/src/statics/images/mountains.jpg differ
diff --git a/src/statics/images/old.freeplanet-logo-full.svg b/src/statics/images/old.freeplanet-logo-full.svg
new file mode 100644
index 0000000..763ad10
--- /dev/null
+++ b/src/statics/images/old.freeplanet-logo-full.svg
@@ -0,0 +1,482 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ image/svg+xml
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Free Planet
+ Free Planet
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/statics/js/fetch.js b/src/statics/js/fetch.js
new file mode 100644
index 0000000..6bac6b3
--- /dev/null
+++ b/src/statics/js/fetch.js
@@ -0,0 +1,461 @@
+(function(self) {
+ 'use strict';
+
+ if (self.fetch) {
+ return
+ }
+
+ var support = {
+ searchParams: 'URLSearchParams' in self,
+ iterable: 'Symbol' in self && 'iterator' in Symbol,
+ blob: 'FileReader' in self && 'Blob' in self && (function() {
+ try {
+ new Blob()
+ return true
+ } catch(e) {
+ return false
+ }
+ })(),
+ formData: 'FormData' in self,
+ arrayBuffer: 'ArrayBuffer' in self
+ }
+
+ if (support.arrayBuffer) {
+ var viewClasses = [
+ '[object Int8Array]',
+ '[object Uint8Array]',
+ '[object Uint8ClampedArray]',
+ '[object Int16Array]',
+ '[object Uint16Array]',
+ '[object Int32Array]',
+ '[object Uint32Array]',
+ '[object Float32Array]',
+ '[object Float64Array]'
+ ]
+
+ var isDataView = function(obj) {
+ return obj && DataView.prototype.isPrototypeOf(obj)
+ }
+
+ var isArrayBufferView = ArrayBuffer.isView || function(obj) {
+ return obj && viewClasses.indexOf(Object.prototype.toString.call(obj)) > -1
+ }
+ }
+
+ function normalizeName(name) {
+ if (typeof name !== 'string') {
+ name = String(name)
+ }
+ if (/[^a-z0-9\-#$%&'*+.\^_`|~]/i.test(name)) {
+ throw new TypeError('Invalid character in header field name')
+ }
+ return name.toLowerCase()
+ }
+
+ function normalizeValue(value) {
+ if (typeof value !== 'string') {
+ value = String(value)
+ }
+ return value
+ }
+
+ // Build a destructive iterator for the value list
+ function iteratorFor(items) {
+ var iterator = {
+ next: function() {
+ var value = items.shift()
+ return {done: value === undefined, value: value}
+ }
+ }
+
+ if (support.iterable) {
+ iterator[Symbol.iterator] = function() {
+ return iterator
+ }
+ }
+
+ return iterator
+ }
+
+ function Headers(headers) {
+ this.map = {}
+
+ if (headers instanceof Headers) {
+ headers.forEach(function(value, name) {
+ this.append(name, value)
+ }, this)
+ } else if (Array.isArray(headers)) {
+ headers.forEach(function(header) {
+ this.append(header[0], header[1])
+ }, this)
+ } else if (headers) {
+ Object.getOwnPropertyNames(headers).forEach(function(name) {
+ this.append(name, headers[name])
+ }, this)
+ }
+ }
+
+ Headers.prototype.append = function(name, value) {
+ name = normalizeName(name)
+ value = normalizeValue(value)
+ var oldValue = this.map[name]
+ this.map[name] = oldValue ? oldValue+','+value : value
+ }
+
+ Headers.prototype['delete'] = function(name) {
+ delete this.map[normalizeName(name)]
+ }
+
+ Headers.prototype.get = function(name) {
+ name = normalizeName(name)
+ return this.has(name) ? this.map[name] : null
+ }
+
+ Headers.prototype.has = function(name) {
+ return this.map.hasOwnProperty(normalizeName(name))
+ }
+
+ Headers.prototype.set = function(name, value) {
+ this.map[normalizeName(name)] = normalizeValue(value)
+ }
+
+ Headers.prototype.forEach = function(callback, thisArg) {
+ for (var name in this.map) {
+ if (this.map.hasOwnProperty(name)) {
+ callback.call(thisArg, this.map[name], name, this)
+ }
+ }
+ }
+
+ Headers.prototype.keys = function() {
+ var items = []
+ this.forEach(function(value, name) { items.push(name) })
+ return iteratorFor(items)
+ }
+
+ Headers.prototype.values = function() {
+ var items = []
+ this.forEach(function(value) { items.push(value) })
+ return iteratorFor(items)
+ }
+
+ Headers.prototype.entries = function() {
+ var items = []
+ this.forEach(function(value, name) { items.push([name, value]) })
+ return iteratorFor(items)
+ }
+
+ if (support.iterable) {
+ Headers.prototype[Symbol.iterator] = Headers.prototype.entries
+ }
+
+ function consumed(body) {
+ if (body.bodyUsed) {
+ return Promise.reject(new TypeError('Already read'))
+ }
+ body.bodyUsed = true
+ }
+
+ function fileReaderReady(reader) {
+ return new Promise(function(resolve, reject) {
+ reader.onload = function() {
+ resolve(reader.result)
+ }
+ reader.onerror = function() {
+ reject(reader.error)
+ }
+ })
+ }
+
+ function readBlobAsArrayBuffer(blob) {
+ var reader = new FileReader()
+ var promise = fileReaderReady(reader)
+ reader.readAsArrayBuffer(blob)
+ return promise
+ }
+
+ function readBlobAsText(blob) {
+ var reader = new FileReader()
+ var promise = fileReaderReady(reader)
+ reader.readAsText(blob)
+ return promise
+ }
+
+ function readArrayBufferAsText(buf) {
+ var view = new Uint8Array(buf)
+ var chars = new Array(view.length)
+
+ for (var i = 0; i < view.length; i++) {
+ chars[i] = String.fromCharCode(view[i])
+ }
+ return chars.join('')
+ }
+
+ function bufferClone(buf) {
+ if (buf.slice) {
+ return buf.slice(0)
+ } else {
+ var view = new Uint8Array(buf.byteLength)
+ view.set(new Uint8Array(buf))
+ return view.buffer
+ }
+ }
+
+ function Body() {
+ this.bodyUsed = false
+
+ this._initBody = function(body) {
+ this._bodyInit = body
+ if (!body) {
+ this._bodyText = ''
+ } else if (typeof body === 'string') {
+ this._bodyText = body
+ } else if (support.blob && Blob.prototype.isPrototypeOf(body)) {
+ this._bodyBlob = body
+ } else if (support.formData && FormData.prototype.isPrototypeOf(body)) {
+ this._bodyFormData = body
+ } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {
+ this._bodyText = body.toString()
+ } else if (support.arrayBuffer && support.blob && isDataView(body)) {
+ this._bodyArrayBuffer = bufferClone(body.buffer)
+ // IE 10-11 can't handle a DataView body.
+ this._bodyInit = new Blob([this._bodyArrayBuffer])
+ } else if (support.arrayBuffer && (ArrayBuffer.prototype.isPrototypeOf(body) || isArrayBufferView(body))) {
+ this._bodyArrayBuffer = bufferClone(body)
+ } else {
+ throw new Error('unsupported BodyInit type')
+ }
+
+ if (!this.headers.get('content-type')) {
+ if (typeof body === 'string') {
+ this.headers.set('content-type', 'text/plain;charset=UTF-8')
+ } else if (this._bodyBlob && this._bodyBlob.type) {
+ this.headers.set('content-type', this._bodyBlob.type)
+ } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {
+ this.headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8')
+ }
+ }
+ }
+
+ if (support.blob) {
+ this.blob = function() {
+ var rejected = consumed(this)
+ if (rejected) {
+ return rejected
+ }
+
+ if (this._bodyBlob) {
+ return Promise.resolve(this._bodyBlob)
+ } else if (this._bodyArrayBuffer) {
+ return Promise.resolve(new Blob([this._bodyArrayBuffer]))
+ } else if (this._bodyFormData) {
+ throw new Error('could not read FormData body as blob')
+ } else {
+ return Promise.resolve(new Blob([this._bodyText]))
+ }
+ }
+
+ this.arrayBuffer = function() {
+ if (this._bodyArrayBuffer) {
+ return consumed(this) || Promise.resolve(this._bodyArrayBuffer)
+ } else {
+ return this.blob().then(readBlobAsArrayBuffer)
+ }
+ }
+ }
+
+ this.text = function() {
+ var rejected = consumed(this)
+ if (rejected) {
+ return rejected
+ }
+
+ if (this._bodyBlob) {
+ return readBlobAsText(this._bodyBlob)
+ } else if (this._bodyArrayBuffer) {
+ return Promise.resolve(readArrayBufferAsText(this._bodyArrayBuffer))
+ } else if (this._bodyFormData) {
+ throw new Error('could not read FormData body as text')
+ } else {
+ return Promise.resolve(this._bodyText)
+ }
+ }
+
+ if (support.formData) {
+ this.formData = function() {
+ return this.text().then(decode)
+ }
+ }
+
+ this.json = function() {
+ return this.text().then(JSON.parse)
+ }
+
+ return this
+ }
+
+ // HTTP methods whose capitalization should be normalized
+ var methods = ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST', 'PUT']
+
+ function normalizeMethod(method) {
+ var upcased = method.toUpperCase()
+ return (methods.indexOf(upcased) > -1) ? upcased : method
+ }
+
+ function Request(input, options) {
+ options = options || {}
+ var body = options.body
+
+ if (input instanceof Request) {
+ if (input.bodyUsed) {
+ throw new TypeError('Already read')
+ }
+ this.url = input.url
+ this.credentials = input.credentials
+ if (!options.headers) {
+ this.headers = new Headers(input.headers)
+ }
+ this.method = input.method
+ this.mode = input.mode
+ if (!body && input._bodyInit != null) {
+ body = input._bodyInit
+ input.bodyUsed = true
+ }
+ } else {
+ this.url = String(input)
+ }
+
+ this.credentials = options.credentials || this.credentials || 'omit'
+ if (options.headers || !this.headers) {
+ this.headers = new Headers(options.headers)
+ }
+ this.method = normalizeMethod(options.method || this.method || 'GET')
+ this.mode = options.mode || this.mode || null
+ this.referrer = null
+
+ if ((this.method === 'GET' || this.method === 'HEAD') && body) {
+ throw new TypeError('Body not allowed for GET or HEAD requests')
+ }
+ this._initBody(body)
+ }
+
+ Request.prototype.clone = function() {
+ return new Request(this, { body: this._bodyInit })
+ }
+
+ function decode(body) {
+ var form = new FormData()
+ body.trim().split('&').forEach(function(bytes) {
+ if (bytes) {
+ var split = bytes.split('=')
+ var name = split.shift().replace(/\+/g, ' ')
+ var value = split.join('=').replace(/\+/g, ' ')
+ form.append(decodeURIComponent(name), decodeURIComponent(value))
+ }
+ })
+ return form
+ }
+
+ function parseHeaders(rawHeaders) {
+ var headers = new Headers()
+ rawHeaders.split(/\r?\n/).forEach(function(line) {
+ var parts = line.split(':')
+ var key = parts.shift().trim()
+ if (key) {
+ var value = parts.join(':').trim()
+ headers.append(key, value)
+ }
+ })
+ return headers
+ }
+
+ Body.call(Request.prototype)
+
+ function Response(bodyInit, options) {
+ if (!options) {
+ options = {}
+ }
+
+ this.type = 'default'
+ this.status = 'status' in options ? options.status : 200
+ this.ok = this.status >= 200 && this.status < 300
+ this.statusText = 'statusText' in options ? options.statusText : 'OK'
+ this.headers = new Headers(options.headers)
+ this.url = options.url || ''
+ this._initBody(bodyInit)
+ }
+
+ Body.call(Response.prototype)
+
+ Response.prototype.clone = function() {
+ return new Response(this._bodyInit, {
+ status: this.status,
+ statusText: this.statusText,
+ headers: new Headers(this.headers),
+ url: this.url
+ })
+ }
+
+ Response.error = function() {
+ var response = new Response(null, {status: 0, statusText: ''})
+ response.type = 'error'
+ return response
+ }
+
+ var redirectStatuses = [301, 302, 303, 307, 308]
+
+ Response.redirect = function(url, status) {
+ if (redirectStatuses.indexOf(status) === -1) {
+ throw new RangeError('Invalid status code')
+ }
+
+ return new Response(null, {status: status, headers: {location: url}})
+ }
+
+ self.Headers = Headers
+ self.Request = Request
+ self.Response = Response
+
+ self.fetch = function(input, init) {
+ return new Promise(function(resolve, reject) {
+ var request = new Request(input, init)
+ var xhr = new XMLHttpRequest()
+
+ xhr.onload = function() {
+ var options = {
+ status: xhr.status,
+ statusText: xhr.statusText,
+ headers: parseHeaders(xhr.getAllResponseHeaders() || '')
+ }
+ options.url = 'responseURL' in xhr ? xhr.responseURL : options.headers.get('X-Request-URL')
+ var body = 'response' in xhr ? xhr.response : xhr.responseText
+ resolve(new Response(body, options))
+ }
+
+ xhr.onerror = function() {
+ reject(new TypeError('Network request failed'))
+ }
+
+ xhr.ontimeout = function() {
+ reject(new TypeError('Network request failed'))
+ }
+
+ xhr.open(request.method, request.url, true)
+
+ if (request.credentials === 'include') {
+ xhr.withCredentials = true
+ }
+
+ if ('responseType' in xhr && support.blob) {
+ xhr.responseType = 'blob'
+ }
+
+ request.headers.forEach(function(value, name) {
+ xhr.setRequestHeader(name, value)
+ })
+
+ xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit)
+ })
+ }
+ self.fetch.polyfill = true
+})(typeof self !== 'undefined' ? self : this);
diff --git a/src/statics/js/globalenv.js b/src/statics/js/globalenv.js
new file mode 100644
index 0000000..df39dab
--- /dev/null
+++ b/src/statics/js/globalenv.js
@@ -0,0 +1,26 @@
+
+// importScripts('/statics/js/immortal-db.min.js');
+
+/*
+const cfgenv = {
+ website: 'http://localhost:8081',
+ serverweb: 'http://localhost:3000',
+ dbname: 'mydb3',
+ dbversion: 10,
+}
+*/
+
+/*
+async function clearAllDataImmortal(table) {
+ console.log('clearAllDataImmortal', table)
+ const db = ImmortalDB.ImmortalDB
+ await db.remove(table)
+}
+
+async function writeDataImmortal(table, datavalue) {
+ console.log('writeDataImmortal', table, datavalue)
+ const db = ImmortalDB.ImmortalDB
+ await db.set(table, datavalue)
+}
+
+*/
diff --git a/src/statics/js/idb.js b/src/statics/js/idb.js
new file mode 100644
index 0000000..9835513
--- /dev/null
+++ b/src/statics/js/idb.js
@@ -0,0 +1,311 @@
+'use strict';
+
+(function() {
+ function toArray(arr) {
+ return Array.prototype.slice.call(arr);
+ }
+
+ function promisifyRequest(request) {
+ return new Promise(function(resolve, reject) {
+ request.onsuccess = function() {
+ resolve(request.result);
+ };
+
+ request.onerror = function() {
+ reject(request.error);
+ };
+ });
+ }
+
+ function promisifyRequestCall(obj, method, args) {
+ var request;
+ var p = new Promise(function(resolve, reject) {
+ request = obj[method].apply(obj, args);
+ promisifyRequest(request).then(resolve, reject);
+ });
+
+ p.request = request;
+ return p;
+ }
+
+ function promisifyCursorRequestCall(obj, method, args) {
+ var p = promisifyRequestCall(obj, method, args);
+ return p.then(function(value) {
+ if (!value) return;
+ return new Cursor(value, p.request);
+ });
+ }
+
+ function proxyProperties(ProxyClass, targetProp, properties) {
+ properties.forEach(function(prop) {
+ Object.defineProperty(ProxyClass.prototype, prop, {
+ get: function() {
+ return this[targetProp][prop];
+ },
+ set: function(val) {
+ this[targetProp][prop] = val;
+ }
+ });
+ });
+ }
+
+ function proxyRequestMethods(ProxyClass, targetProp, Constructor, properties) {
+ properties.forEach(function(prop) {
+ if (!(prop in Constructor.prototype)) return;
+ ProxyClass.prototype[prop] = function() {
+ return promisifyRequestCall(this[targetProp], prop, arguments);
+ };
+ });
+ }
+
+ function proxyMethods(ProxyClass, targetProp, Constructor, properties) {
+ properties.forEach(function(prop) {
+ if (!(prop in Constructor.prototype)) return;
+ ProxyClass.prototype[prop] = function() {
+ return this[targetProp][prop].apply(this[targetProp], arguments);
+ };
+ });
+ }
+
+ function proxyCursorRequestMethods(ProxyClass, targetProp, Constructor, properties) {
+ properties.forEach(function(prop) {
+ if (!(prop in Constructor.prototype)) return;
+ ProxyClass.prototype[prop] = function() {
+ return promisifyCursorRequestCall(this[targetProp], prop, arguments);
+ };
+ });
+ }
+
+ function Index(index) {
+ this._index = index;
+ }
+
+ proxyProperties(Index, '_index', [
+ 'name',
+ 'keyPath',
+ 'multiEntry',
+ 'unique'
+ ]);
+
+ proxyRequestMethods(Index, '_index', IDBIndex, [
+ 'get',
+ 'getKey',
+ 'getAll',
+ 'getAllKeys',
+ 'count'
+ ]);
+
+ proxyCursorRequestMethods(Index, '_index', IDBIndex, [
+ 'openCursor',
+ 'openKeyCursor'
+ ]);
+
+ function Cursor(cursor, request) {
+ this._cursor = cursor;
+ this._request = request;
+ }
+
+ proxyProperties(Cursor, '_cursor', [
+ 'direction',
+ 'key',
+ 'primaryKey',
+ 'value'
+ ]);
+
+ proxyRequestMethods(Cursor, '_cursor', IDBCursor, [
+ 'update',
+ 'delete'
+ ]);
+
+ // proxy 'next' methods
+ ['advance', 'continue', 'continuePrimaryKey'].forEach(function(methodName) {
+ if (!(methodName in IDBCursor.prototype)) return;
+ Cursor.prototype[methodName] = function() {
+ var cursor = this;
+ var args = arguments;
+ return Promise.resolve().then(function() {
+ cursor._cursor[methodName].apply(cursor._cursor, args);
+ return promisifyRequest(cursor._request).then(function(value) {
+ if (!value) return;
+ return new Cursor(value, cursor._request);
+ });
+ });
+ };
+ });
+
+ function ObjectStore(store) {
+ this._store = store;
+ }
+
+ ObjectStore.prototype.createIndex = function() {
+ return new Index(this._store.createIndex.apply(this._store, arguments));
+ };
+
+ ObjectStore.prototype.index = function() {
+ return new Index(this._store.index.apply(this._store, arguments));
+ };
+
+ proxyProperties(ObjectStore, '_store', [
+ 'name',
+ 'keyPath',
+ 'indexNames',
+ 'autoIncrement'
+ ]);
+
+ proxyRequestMethods(ObjectStore, '_store', IDBObjectStore, [
+ 'put',
+ 'add',
+ 'delete',
+ 'clear',
+ 'get',
+ 'getAll',
+ 'getKey',
+ 'getAllKeys',
+ 'count'
+ ]);
+
+ proxyCursorRequestMethods(ObjectStore, '_store', IDBObjectStore, [
+ 'openCursor',
+ 'openKeyCursor'
+ ]);
+
+ proxyMethods(ObjectStore, '_store', IDBObjectStore, [
+ 'deleteIndex'
+ ]);
+
+ function Transaction(idbTransaction) {
+ this._tx = idbTransaction;
+ this.complete = new Promise(function(resolve, reject) {
+ idbTransaction.oncomplete = function() {
+ resolve();
+ };
+ idbTransaction.onerror = function() {
+ reject(idbTransaction.error);
+ };
+ idbTransaction.onabort = function() {
+ reject(idbTransaction.error);
+ };
+ });
+ }
+
+ Transaction.prototype.objectStore = function() {
+ return new ObjectStore(this._tx.objectStore.apply(this._tx, arguments));
+ };
+
+ proxyProperties(Transaction, '_tx', [
+ 'objectStoreNames',
+ 'mode'
+ ]);
+
+ proxyMethods(Transaction, '_tx', IDBTransaction, [
+ 'abort'
+ ]);
+
+ function UpgradeDB(db, oldVersion, transaction) {
+ this._db = db;
+ this.oldVersion = oldVersion;
+ this.transaction = new Transaction(transaction);
+ }
+
+ UpgradeDB.prototype.createObjectStore = function() {
+ return new ObjectStore(this._db.createObjectStore.apply(this._db, arguments));
+ };
+
+ proxyProperties(UpgradeDB, '_db', [
+ 'name',
+ 'version',
+ 'objectStoreNames'
+ ]);
+
+ proxyMethods(UpgradeDB, '_db', IDBDatabase, [
+ 'deleteObjectStore',
+ 'close'
+ ]);
+
+ function DB(db) {
+ this._db = db;
+ }
+
+ DB.prototype.transaction = function() {
+ return new Transaction(this._db.transaction.apply(this._db, arguments));
+ };
+
+ proxyProperties(DB, '_db', [
+ 'name',
+ 'version',
+ 'objectStoreNames'
+ ]);
+
+ proxyMethods(DB, '_db', IDBDatabase, [
+ 'close'
+ ]);
+
+ // Add cursor iterators
+ // TODO: remove this once browsers do the right thing with promises
+ ['openCursor', 'openKeyCursor'].forEach(function(funcName) {
+ [ObjectStore, Index].forEach(function(Constructor) {
+ Constructor.prototype[funcName.replace('open', 'iterate')] = function() {
+ var args = toArray(arguments);
+ var callback = args[args.length - 1];
+ var nativeObject = this._store || this._index;
+ var request = nativeObject[funcName].apply(nativeObject, args.slice(0, -1));
+ request.onsuccess = function() {
+ callback(request.result);
+ };
+ };
+ });
+ });
+
+ // polyfill getAll
+ [Index, ObjectStore].forEach(function(Constructor) {
+ if (Constructor.prototype.getAll) return;
+ Constructor.prototype.getAll = function(query, count) {
+ var instance = this;
+ var items = [];
+
+ return new Promise(function(resolve) {
+ instance.iterateCursor(query, function(cursor) {
+ if (!cursor) {
+ resolve(items);
+ return;
+ }
+ items.push(cursor.value);
+
+ if (count !== undefined && items.length == count) {
+ resolve(items);
+ return;
+ }
+ cursor.continue();
+ });
+ });
+ };
+ });
+
+ var exp = {
+ open: function(name, version, upgradeCallback) {
+ var p = promisifyRequestCall(indexedDB, 'open', [name, version]);
+ var request = p.request;
+
+ request.onupgradeneeded = function(event) {
+ if (upgradeCallback) {
+ upgradeCallback(new UpgradeDB(request.result, event.oldVersion, request.transaction));
+ }
+ };
+
+ return p.then(function(db) {
+ return new DB(db);
+ });
+ },
+ delete: function(name) {
+ return promisifyRequestCall(indexedDB, 'deleteDatabase', [name]);
+ }
+ };
+
+ if (typeof module !== 'undefined') {
+ module.exports = exp;
+ module.exports.default = module.exports;
+ }
+ else {
+ self.idb = exp;
+ }
+}());
diff --git a/src/statics/js/material.min.js b/src/statics/js/material.min.js
new file mode 100644
index 0000000..46524fb
--- /dev/null
+++ b/src/statics/js/material.min.js
@@ -0,0 +1,10 @@
+/**
+ * material-design-lite - Material Design Components in CSS, JS and HTML
+ * @version v1.3.0
+ * @license Apache-2.0
+ * @copyright 2015 Google, Inc.
+ * @link https://github.com/google/material-design-lite
+ */
+!function(){"use strict";function e(e,t){if(e){if(t.element_.classList.contains(t.CssClasses_.MDL_JS_RIPPLE_EFFECT)){var s=document.createElement("span");s.classList.add(t.CssClasses_.MDL_RIPPLE_CONTAINER),s.classList.add(t.CssClasses_.MDL_JS_RIPPLE_EFFECT);var i=document.createElement("span");i.classList.add(t.CssClasses_.MDL_RIPPLE),s.appendChild(i),e.appendChild(s)}e.addEventListener("click",function(s){if("#"===e.getAttribute("href").charAt(0)){s.preventDefault();var i=e.href.split("#")[1],n=t.element_.querySelector("#"+i);t.resetTabState_(),t.resetPanelState_(),e.classList.add(t.CssClasses_.ACTIVE_CLASS),n.classList.add(t.CssClasses_.ACTIVE_CLASS)}})}}function t(e,t,s,i){function n(){var n=e.href.split("#")[1],a=i.content_.querySelector("#"+n);i.resetTabState_(t),i.resetPanelState_(s),e.classList.add(i.CssClasses_.IS_ACTIVE),a.classList.add(i.CssClasses_.IS_ACTIVE)}if(i.tabBar_.classList.contains(i.CssClasses_.JS_RIPPLE_EFFECT)){var a=document.createElement("span");a.classList.add(i.CssClasses_.RIPPLE_CONTAINER),a.classList.add(i.CssClasses_.JS_RIPPLE_EFFECT);var l=document.createElement("span");l.classList.add(i.CssClasses_.RIPPLE),a.appendChild(l),e.appendChild(a)}i.tabBar_.classList.contains(i.CssClasses_.TAB_MANUAL_SWITCH)||e.addEventListener("click",function(t){"#"===e.getAttribute("href").charAt(0)&&(t.preventDefault(),n())}),e.show=n}var s={upgradeDom:function(e,t){},upgradeElement:function(e,t){},upgradeElements:function(e){},upgradeAllRegistered:function(){},registerUpgradedCallback:function(e,t){},register:function(e){},downgradeElements:function(e){}};s=function(){function e(e,t){for(var s=0;s
0&&l(t.children))}function o(t){var s="undefined"==typeof t.widget&&"undefined"==typeof t.widget,i=!0;s||(i=t.widget||t.widget);var n={classConstructor:t.constructor||t.constructor,className:t.classAsString||t.classAsString,cssClass:t.cssClass||t.cssClass,widget:i,callbacks:[]};if(c.forEach(function(e){if(e.cssClass===n.cssClass)throw new Error("The provided cssClass has already been registered: "+e.cssClass);if(e.className===n.className)throw new Error("The provided className has already been registered")}),t.constructor.prototype.hasOwnProperty(C))throw new Error("MDL component classes must not have "+C+" defined as a property.");var a=e(t.classAsString,n);a||c.push(n)}function r(t,s){var i=e(t);i&&i.callbacks.push(s)}function _(){for(var e=0;e0&&this.container_.classList.contains(this.CssClasses_.IS_VISIBLE)&&(e.keyCode===this.Keycodes_.UP_ARROW?(e.preventDefault(),t[t.length-1].focus()):e.keyCode===this.Keycodes_.DOWN_ARROW&&(e.preventDefault(),t[0].focus()))}},d.prototype.handleItemKeyboardEvent_=function(e){if(this.element_&&this.container_){var t=this.element_.querySelectorAll("."+this.CssClasses_.ITEM+":not([disabled])");if(t&&t.length>0&&this.container_.classList.contains(this.CssClasses_.IS_VISIBLE)){var s=Array.prototype.slice.call(t).indexOf(e.target);if(e.keyCode===this.Keycodes_.UP_ARROW)e.preventDefault(),s>0?t[s-1].focus():t[t.length-1].focus();else if(e.keyCode===this.Keycodes_.DOWN_ARROW)e.preventDefault(),t.length>s+1?t[s+1].focus():t[0].focus();else if(e.keyCode===this.Keycodes_.SPACE||e.keyCode===this.Keycodes_.ENTER){e.preventDefault();var i=new MouseEvent("mousedown");e.target.dispatchEvent(i),i=new MouseEvent("mouseup"),e.target.dispatchEvent(i),e.target.click()}else e.keyCode===this.Keycodes_.ESCAPE&&(e.preventDefault(),this.hide())}}},d.prototype.handleItemClick_=function(e){e.target.hasAttribute("disabled")?e.stopPropagation():(this.closing_=!0,window.setTimeout(function(e){this.hide(),this.closing_=!1}.bind(this),this.Constant_.CLOSE_TIMEOUT))},d.prototype.applyClip_=function(e,t){this.element_.classList.contains(this.CssClasses_.UNALIGNED)?this.element_.style.clip="":this.element_.classList.contains(this.CssClasses_.BOTTOM_RIGHT)?this.element_.style.clip="rect(0 "+t+"px 0 "+t+"px)":this.element_.classList.contains(this.CssClasses_.TOP_LEFT)?this.element_.style.clip="rect("+e+"px 0 "+e+"px 0)":this.element_.classList.contains(this.CssClasses_.TOP_RIGHT)?this.element_.style.clip="rect("+e+"px "+t+"px "+e+"px "+t+"px)":this.element_.style.clip=""},d.prototype.removeAnimationEndListener_=function(e){e.target.classList.remove(d.prototype.CssClasses_.IS_ANIMATING)},d.prototype.addAnimationEndListener_=function(){this.element_.addEventListener("transitionend",this.removeAnimationEndListener_),this.element_.addEventListener("webkitTransitionEnd",this.removeAnimationEndListener_)},d.prototype.show=function(e){if(this.element_&&this.container_&&this.outline_){var t=this.element_.getBoundingClientRect().height,s=this.element_.getBoundingClientRect().width;this.container_.style.width=s+"px",this.container_.style.height=t+"px",this.outline_.style.width=s+"px",this.outline_.style.height=t+"px";for(var i=this.Constant_.TRANSITION_DURATION_SECONDS*this.Constant_.TRANSITION_DURATION_FRACTION,n=this.element_.querySelectorAll("."+this.CssClasses_.ITEM),a=0;a0&&this.showSnackbar(this.queuedNotifications_.shift())},C.prototype.cleanup_=function(){this.element_.classList.remove(this.cssClasses_.ACTIVE),setTimeout(function(){this.element_.setAttribute("aria-hidden","true"),this.textElement_.textContent="",Boolean(this.actionElement_.getAttribute("aria-hidden"))||(this.setActionHidden_(!0),this.actionElement_.textContent="",this.actionElement_.removeEventListener("click",this.actionHandler_)),this.actionHandler_=void 0,this.message_=void 0,this.actionText_=void 0,this.active=!1,this.checkQueue_()}.bind(this),this.Constant_.ANIMATION_LENGTH)},C.prototype.setActionHidden_=function(e){e?this.actionElement_.setAttribute("aria-hidden","true"):this.actionElement_.removeAttribute("aria-hidden")},s.register({constructor:C,classAsString:"MaterialSnackbar",cssClass:"mdl-js-snackbar",widget:!0});var u=function(e){this.element_=e,this.init()};window.MaterialSpinner=u,u.prototype.Constant_={MDL_SPINNER_LAYER_COUNT:4},u.prototype.CssClasses_={MDL_SPINNER_LAYER:"mdl-spinner__layer",MDL_SPINNER_CIRCLE_CLIPPER:"mdl-spinner__circle-clipper",MDL_SPINNER_CIRCLE:"mdl-spinner__circle",MDL_SPINNER_GAP_PATCH:"mdl-spinner__gap-patch",MDL_SPINNER_LEFT:"mdl-spinner__left",MDL_SPINNER_RIGHT:"mdl-spinner__right"},u.prototype.createLayer=function(e){var t=document.createElement("div");t.classList.add(this.CssClasses_.MDL_SPINNER_LAYER),t.classList.add(this.CssClasses_.MDL_SPINNER_LAYER+"-"+e);var s=document.createElement("div");s.classList.add(this.CssClasses_.MDL_SPINNER_CIRCLE_CLIPPER),s.classList.add(this.CssClasses_.MDL_SPINNER_LEFT);var i=document.createElement("div");i.classList.add(this.CssClasses_.MDL_SPINNER_GAP_PATCH);var n=document.createElement("div");n.classList.add(this.CssClasses_.MDL_SPINNER_CIRCLE_CLIPPER),n.classList.add(this.CssClasses_.MDL_SPINNER_RIGHT);for(var a=[s,i,n],l=0;l=this.maxRows&&e.preventDefault()},L.prototype.onFocus_=function(e){this.element_.classList.add(this.CssClasses_.IS_FOCUSED)},L.prototype.onBlur_=function(e){this.element_.classList.remove(this.CssClasses_.IS_FOCUSED)},L.prototype.onReset_=function(e){this.updateClasses_()},L.prototype.updateClasses_=function(){this.checkDisabled(),this.checkValidity(),this.checkDirty(),this.checkFocus()},L.prototype.checkDisabled=function(){this.input_.disabled?this.element_.classList.add(this.CssClasses_.IS_DISABLED):this.element_.classList.remove(this.CssClasses_.IS_DISABLED)},L.prototype.checkDisabled=L.prototype.checkDisabled,L.prototype.checkFocus=function(){Boolean(this.element_.querySelector(":focus"))?this.element_.classList.add(this.CssClasses_.IS_FOCUSED):this.element_.classList.remove(this.CssClasses_.IS_FOCUSED)},L.prototype.checkFocus=L.prototype.checkFocus,L.prototype.checkValidity=function(){this.input_.validity&&(this.input_.validity.valid?this.element_.classList.remove(this.CssClasses_.IS_INVALID):this.element_.classList.add(this.CssClasses_.IS_INVALID))},L.prototype.checkValidity=L.prototype.checkValidity,L.prototype.checkDirty=function(){this.input_.value&&this.input_.value.length>0?this.element_.classList.add(this.CssClasses_.IS_DIRTY):this.element_.classList.remove(this.CssClasses_.IS_DIRTY)},L.prototype.checkDirty=L.prototype.checkDirty,L.prototype.disable=function(){this.input_.disabled=!0,this.updateClasses_()},L.prototype.disable=L.prototype.disable,L.prototype.enable=function(){this.input_.disabled=!1,this.updateClasses_()},L.prototype.enable=L.prototype.enable,L.prototype.change=function(e){this.input_.value=e||"",this.updateClasses_()},L.prototype.change=L.prototype.change,L.prototype.init=function(){if(this.element_&&(this.label_=this.element_.querySelector("."+this.CssClasses_.LABEL),this.input_=this.element_.querySelector("."+this.CssClasses_.INPUT),this.input_)){this.input_.hasAttribute(this.Constant_.MAX_ROWS_ATTRIBUTE)&&(this.maxRows=parseInt(this.input_.getAttribute(this.Constant_.MAX_ROWS_ATTRIBUTE),10),isNaN(this.maxRows)&&(this.maxRows=this.Constant_.NO_MAX_ROWS)),this.input_.hasAttribute("placeholder")&&this.element_.classList.add(this.CssClasses_.HAS_PLACEHOLDER),this.boundUpdateClassesHandler=this.updateClasses_.bind(this),this.boundFocusHandler=this.onFocus_.bind(this),this.boundBlurHandler=this.onBlur_.bind(this),this.boundResetHandler=this.onReset_.bind(this),this.input_.addEventListener("input",this.boundUpdateClassesHandler),this.input_.addEventListener("focus",this.boundFocusHandler),this.input_.addEventListener("blur",this.boundBlurHandler),this.input_.addEventListener("reset",this.boundResetHandler),this.maxRows!==this.Constant_.NO_MAX_ROWS&&(this.boundKeyDownHandler=this.onKeyDown_.bind(this),this.input_.addEventListener("keydown",this.boundKeyDownHandler));var e=this.element_.classList.contains(this.CssClasses_.IS_INVALID);this.updateClasses_(),this.element_.classList.add(this.CssClasses_.IS_UPGRADED),e&&this.element_.classList.add(this.CssClasses_.IS_INVALID),this.input_.hasAttribute("autofocus")&&(this.element_.focus(),this.checkFocus())}},s.register({constructor:L,classAsString:"MaterialTextfield",cssClass:"mdl-js-textfield",widget:!0});var I=function(e){this.element_=e,this.init()};window.MaterialTooltip=I,I.prototype.Constant_={},I.prototype.CssClasses_={IS_ACTIVE:"is-active",BOTTOM:"mdl-tooltip--bottom",LEFT:"mdl-tooltip--left",RIGHT:"mdl-tooltip--right",TOP:"mdl-tooltip--top"},I.prototype.handleMouseEnter_=function(e){var t=e.target.getBoundingClientRect(),s=t.left+t.width/2,i=t.top+t.height/2,n=-1*(this.element_.offsetWidth/2),a=-1*(this.element_.offsetHeight/2);this.element_.classList.contains(this.CssClasses_.LEFT)||this.element_.classList.contains(this.CssClasses_.RIGHT)?(s=t.width/2,i+a<0?(this.element_.style.top="0",this.element_.style.marginTop="0"):(this.element_.style.top=i+"px",this.element_.style.marginTop=a+"px")):s+n<0?(this.element_.style.left="0",this.element_.style.marginLeft="0"):(this.element_.style.left=s+"px",this.element_.style.marginLeft=n+"px"),this.element_.classList.contains(this.CssClasses_.TOP)?this.element_.style.top=t.top-this.element_.offsetHeight-10+"px":this.element_.classList.contains(this.CssClasses_.RIGHT)?this.element_.style.left=t.left+t.width+10+"px":this.element_.classList.contains(this.CssClasses_.LEFT)?this.element_.style.left=t.left-this.element_.offsetWidth-10+"px":this.element_.style.top=t.top+t.height+10+"px",this.element_.classList.add(this.CssClasses_.IS_ACTIVE)},I.prototype.hideTooltip_=function(){this.element_.classList.remove(this.CssClasses_.IS_ACTIVE)},I.prototype.init=function(){if(this.element_){var e=this.element_.getAttribute("for")||this.element_.getAttribute("data-mdl-for");e&&(this.forElement_=document.getElementById(e)),this.forElement_&&(this.forElement_.hasAttribute("tabindex")||this.forElement_.setAttribute("tabindex","0"),this.boundMouseEnterHandler=this.handleMouseEnter_.bind(this),this.boundMouseLeaveAndScrollHandler=this.hideTooltip_.bind(this),this.forElement_.addEventListener("mouseenter",this.boundMouseEnterHandler,!1),this.forElement_.addEventListener("touchend",this.boundMouseEnterHandler,!1),this.forElement_.addEventListener("mouseleave",this.boundMouseLeaveAndScrollHandler,!1),window.addEventListener("scroll",this.boundMouseLeaveAndScrollHandler,!0),window.addEventListener("touchstart",this.boundMouseLeaveAndScrollHandler))}},s.register({constructor:I,classAsString:"MaterialTooltip",cssClass:"mdl-tooltip"});var f=function(e){this.element_=e,this.init()};window.MaterialLayout=f,f.prototype.Constant_={MAX_WIDTH:"(max-width: 1024px)",TAB_SCROLL_PIXELS:100,RESIZE_TIMEOUT:100,MENU_ICON:"",CHEVRON_LEFT:"chevron_left",CHEVRON_RIGHT:"chevron_right"},f.prototype.Keycodes_={ENTER:13,ESCAPE:27,SPACE:32},f.prototype.Mode_={STANDARD:0,SEAMED:1,WATERFALL:2,SCROLL:3},f.prototype.CssClasses_={CONTAINER:"mdl-layout__container",HEADER:"mdl-layout__header",DRAWER:"mdl-layout__drawer",CONTENT:"mdl-layout__content",DRAWER_BTN:"mdl-layout__drawer-button",ICON:"material-icons",JS_RIPPLE_EFFECT:"mdl-js-ripple-effect",RIPPLE_CONTAINER:"mdl-layout__tab-ripple-container",RIPPLE:"mdl-ripple",RIPPLE_IGNORE_EVENTS:"mdl-js-ripple-effect--ignore-events",HEADER_SEAMED:"mdl-layout__header--seamed",HEADER_WATERFALL:"mdl-layout__header--waterfall",HEADER_SCROLL:"mdl-layout__header--scroll",FIXED_HEADER:"mdl-layout--fixed-header",OBFUSCATOR:"mdl-layout__obfuscator",TAB_BAR:"mdl-layout__tab-bar",TAB_CONTAINER:"mdl-layout__tab-bar-container",TAB:"mdl-layout__tab",TAB_BAR_BUTTON:"mdl-layout__tab-bar-button",TAB_BAR_LEFT_BUTTON:"mdl-layout__tab-bar-left-button",TAB_BAR_RIGHT_BUTTON:"mdl-layout__tab-bar-right-button",TAB_MANUAL_SWITCH:"mdl-layout__tab-manual-switch",PANEL:"mdl-layout__tab-panel",HAS_DRAWER:"has-drawer",HAS_TABS:"has-tabs",HAS_SCROLLING_HEADER:"has-scrolling-header",CASTING_SHADOW:"is-casting-shadow",IS_COMPACT:"is-compact",IS_SMALL_SCREEN:"is-small-screen",IS_DRAWER_OPEN:"is-visible",IS_ACTIVE:"is-active",IS_UPGRADED:"is-upgraded",IS_ANIMATING:"is-animating",ON_LARGE_SCREEN:"mdl-layout--large-screen-only",ON_SMALL_SCREEN:"mdl-layout--small-screen-only"},f.prototype.contentScrollHandler_=function(){if(!this.header_.classList.contains(this.CssClasses_.IS_ANIMATING)){var e=!this.element_.classList.contains(this.CssClasses_.IS_SMALL_SCREEN)||this.element_.classList.contains(this.CssClasses_.FIXED_HEADER);this.content_.scrollTop>0&&!this.header_.classList.contains(this.CssClasses_.IS_COMPACT)?(this.header_.classList.add(this.CssClasses_.CASTING_SHADOW),this.header_.classList.add(this.CssClasses_.IS_COMPACT),e&&this.header_.classList.add(this.CssClasses_.IS_ANIMATING)):this.content_.scrollTop<=0&&this.header_.classList.contains(this.CssClasses_.IS_COMPACT)&&(this.header_.classList.remove(this.CssClasses_.CASTING_SHADOW),this.header_.classList.remove(this.CssClasses_.IS_COMPACT),e&&this.header_.classList.add(this.CssClasses_.IS_ANIMATING))}},f.prototype.keyboardEventHandler_=function(e){e.keyCode===this.Keycodes_.ESCAPE&&this.drawer_.classList.contains(this.CssClasses_.IS_DRAWER_OPEN)&&this.toggleDrawer()},f.prototype.screenSizeHandler_=function(){this.screenSizeMediaQuery_.matches?this.element_.classList.add(this.CssClasses_.IS_SMALL_SCREEN):(this.element_.classList.remove(this.CssClasses_.IS_SMALL_SCREEN),this.drawer_&&(this.drawer_.classList.remove(this.CssClasses_.IS_DRAWER_OPEN),this.obfuscator_.classList.remove(this.CssClasses_.IS_DRAWER_OPEN)))},f.prototype.drawerToggleHandler_=function(e){if(e&&"keydown"===e.type){if(e.keyCode!==this.Keycodes_.SPACE&&e.keyCode!==this.Keycodes_.ENTER)return;e.preventDefault()}this.toggleDrawer()},f.prototype.headerTransitionEndHandler_=function(){this.header_.classList.remove(this.CssClasses_.IS_ANIMATING)},f.prototype.headerClickHandler_=function(){this.header_.classList.contains(this.CssClasses_.IS_COMPACT)&&(this.header_.classList.remove(this.CssClasses_.IS_COMPACT),this.header_.classList.add(this.CssClasses_.IS_ANIMATING))},f.prototype.resetTabState_=function(e){for(var t=0;t0?c.classList.add(this.CssClasses_.IS_ACTIVE):c.classList.remove(this.CssClasses_.IS_ACTIVE),this.tabBar_.scrollLeft0)return;this.setFrameCount(1);var i,n,a=e.currentTarget.getBoundingClientRect();if(0===e.clientX&&0===e.clientY)i=Math.round(a.width/2),n=Math.round(a.height/2);else{var l=void 0!==e.clientX?e.clientX:e.touches[0].clientX,o=void 0!==e.clientY?e.clientY:e.touches[0].clientY;i=Math.round(l-a.left),n=Math.round(o-a.top)}this.setRippleXY(i,n),this.setRippleStyles(!0),window.requestAnimationFrame(this.animFrameHandler.bind(this))}},S.prototype.upHandler_=function(e){e&&2!==e.detail&&window.setTimeout(function(){this.rippleElement_.classList.remove(this.CssClasses_.IS_VISIBLE)}.bind(this),0)},S.prototype.init=function(){if(this.element_){var e=this.element_.classList.contains(this.CssClasses_.RIPPLE_CENTER);this.element_.classList.contains(this.CssClasses_.RIPPLE_EFFECT_IGNORE_EVENTS)||(this.rippleElement_=this.element_.querySelector("."+this.CssClasses_.RIPPLE),this.frameCount_=0,this.rippleSize_=0,this.x_=0,this.y_=0,this.ignoringMouseDown_=!1,this.boundDownHandler=this.downHandler_.bind(this),this.element_.addEventListener("mousedown",this.boundDownHandler),this.element_.addEventListener("touchstart",this.boundDownHandler),this.boundUpHandler=this.upHandler_.bind(this),this.element_.addEventListener("mouseup",this.boundUpHandler),this.element_.addEventListener("mouseleave",this.boundUpHandler),this.element_.addEventListener("touchend",this.boundUpHandler),this.element_.addEventListener("blur",this.boundUpHandler),this.getFrameCount=function(){return this.frameCount_},this.setFrameCount=function(e){this.frameCount_=e},this.getRippleElement=function(){return this.rippleElement_},this.setRippleXY=function(e,t){this.x_=e,this.y_=t},this.setRippleStyles=function(t){if(null!==this.rippleElement_){var s,i,n,a="translate("+this.x_+"px, "+this.y_+"px)";t?(i=this.Constant_.INITIAL_SCALE,n=this.Constant_.INITIAL_SIZE):(i=this.Constant_.FINAL_SCALE,n=this.rippleSize_+"px",e&&(a="translate("+this.boundWidth/2+"px, "+this.boundHeight/2+"px)")),s="translate(-50%, -50%) "+a+i,this.rippleElement_.style.webkitTransform=s,this.rippleElement_.style.msTransform=s,this.rippleElement_.style.transform=s,t?this.rippleElement_.classList.remove(this.CssClasses_.IS_ANIMATING):this.rippleElement_.classList.add(this.CssClasses_.IS_ANIMATING)}},this.animFrameHandler=function(){this.frameCount_-- >0?window.requestAnimationFrame(this.animFrameHandler.bind(this)):this.setRippleStyles(!1)})}},s.register({constructor:S,classAsString:"MaterialRipple",cssClass:"mdl-js-ripple-effect",widget:!1})}();
+//# sourceMappingURL=material.min.js.map
diff --git a/src/statics/js/promise.js b/src/statics/js/promise.js
new file mode 100644
index 0000000..dd5e735
--- /dev/null
+++ b/src/statics/js/promise.js
@@ -0,0 +1,372 @@
+/**
+ * setImmediate polyfill v1.0.1, supports IE9+
+ * © 2014–2015 Dmitry Korobkin
+ * Released under the MIT license
+ * github.com/Octane/setImmediate
+ */
+window.setImmediate || function () {'use strict';
+
+ var uid = 0;
+ var storage = {};
+ var firstCall = true;
+ var slice = Array.prototype.slice;
+ var message = 'setImmediatePolyfillMessage';
+
+ function fastApply(args) {
+ var func = args[0];
+ switch (args.length) {
+ case 1:
+ return func();
+ case 2:
+ return func(args[1]);
+ case 3:
+ return func(args[1], args[2]);
+ }
+ return func.apply(window, slice.call(args, 1));
+ }
+
+ function callback(event) {
+ var key = event.data;
+ var data;
+ if (typeof key == 'string' && key.indexOf(message) == 0) {
+ data = storage[key];
+ if (data) {
+ delete storage[key];
+ fastApply(data);
+ }
+ }
+ }
+
+ window.setImmediate = function setImmediate() {
+ var id = uid++;
+ var key = message + id;
+ var i = arguments.length;
+ var args = new Array(i);
+ while (i--) {
+ args[i] = arguments[i];
+ }
+ storage[key] = args;
+ if (firstCall) {
+ firstCall = false;
+ window.addEventListener('message', callback);
+ }
+ window.postMessage(key, '*');
+ return id;
+ };
+
+ window.clearImmediate = function clearImmediate(id) {
+ delete storage[message + id];
+ };
+
+}();
+
+/**
+ * Promise polyfill v1.0.10
+ * requires setImmediate
+ *
+ * © 2014–2015 Dmitry Korobkin
+ * Released under the MIT license
+ * github.com/Octane/Promise
+ */
+(function (global) {'use strict';
+
+ var STATUS = '[[PromiseStatus]]';
+ var VALUE = '[[PromiseValue]]';
+ var ON_FUlFILLED = '[[OnFulfilled]]';
+ var ON_REJECTED = '[[OnRejected]]';
+ var ORIGINAL_ERROR = '[[OriginalError]]';
+ var PENDING = 'pending';
+ var INTERNAL_PENDING = 'internal pending';
+ var FULFILLED = 'fulfilled';
+ var REJECTED = 'rejected';
+ var NOT_ARRAY = 'not an array.';
+ var REQUIRES_NEW = 'constructor Promise requires "new".';
+ var CHAINING_CYCLE = 'then() cannot return same Promise that it resolves.';
+
+ var setImmediate = global.setImmediate || require('timers').setImmediate;
+ var isArray = Array.isArray || function (anything) {
+ return Object.prototype.toString.call(anything) == '[object Array]';
+ };
+
+ function InternalError(originalError) {
+ this[ORIGINAL_ERROR] = originalError;
+ }
+
+ function isInternalError(anything) {
+ return anything instanceof InternalError;
+ }
+
+ function isObject(anything) {
+ //Object.create(null) instanceof Object → false
+ return Object(anything) === anything;
+ }
+
+ function isCallable(anything) {
+ return typeof anything == 'function';
+ }
+
+ function isPromise(anything) {
+ return anything instanceof Promise;
+ }
+
+ function identity(value) {
+ return value;
+ }
+
+ function thrower(reason) {
+ throw reason;
+ }
+
+ function enqueue(promise, onFulfilled, onRejected) {
+ if (!promise[ON_FUlFILLED]) {
+ promise[ON_FUlFILLED] = [];
+ promise[ON_REJECTED] = [];
+ }
+ promise[ON_FUlFILLED].push(onFulfilled);
+ promise[ON_REJECTED].push(onRejected);
+ }
+
+ function clearAllQueues(promise) {
+ delete promise[ON_FUlFILLED];
+ delete promise[ON_REJECTED];
+ }
+
+ function callEach(queue) {
+ var i;
+ var length = queue.length;
+ for (i = 0; i < length; i++) {
+ queue[i]();
+ }
+ }
+
+ function call(resolve, reject, value) {
+ var anything = toPromise(value);
+ if (isPromise(anything)) {
+ anything.then(resolve, reject);
+ } else if (isInternalError(anything)) {
+ reject(anything[ORIGINAL_ERROR]);
+ } else {
+ resolve(value);
+ }
+ }
+
+ function toPromise(anything) {
+ var then;
+ if (isPromise(anything)) {
+ return anything;
+ }
+ if(isObject(anything)) {
+ try {
+ then = anything.then;
+ } catch (error) {
+ return new InternalError(error);
+ }
+ if (isCallable(then)) {
+ return new Promise(function (resolve, reject) {
+ setImmediate(function () {
+ try {
+ then.call(anything, resolve, reject);
+ } catch (error) {
+ reject(error);
+ }
+ });
+ });
+ }
+ }
+ return null;
+ }
+
+ function resolvePromise(promise, resolver) {
+ function resolve(value) {
+ if (promise[STATUS] == PENDING) {
+ fulfillPromise(promise, value);
+ }
+ }
+ function reject(reason) {
+ if (promise[STATUS] == PENDING) {
+ rejectPromise(promise, reason);
+ }
+ }
+ try {
+ resolver(resolve, reject);
+ } catch(error) {
+ reject(error);
+ }
+ }
+
+ function fulfillPromise(promise, value) {
+ var queue;
+ var anything = toPromise(value);
+ if (isPromise(anything)) {
+ promise[STATUS] = INTERNAL_PENDING;
+ anything.then(
+ function (value) {
+ fulfillPromise(promise, value);
+ },
+ function (reason) {
+ rejectPromise(promise, reason);
+ }
+ );
+ } else if (isInternalError(anything)) {
+ rejectPromise(promise, anything[ORIGINAL_ERROR]);
+ } else {
+ promise[STATUS] = FULFILLED;
+ promise[VALUE] = value;
+ queue = promise[ON_FUlFILLED];
+ if (queue && queue.length) {
+ clearAllQueues(promise);
+ callEach(queue);
+ }
+ }
+ }
+
+ function rejectPromise(promise, reason) {
+ var queue = promise[ON_REJECTED];
+ promise[STATUS] = REJECTED;
+ promise[VALUE] = reason;
+ if (queue && queue.length) {
+ clearAllQueues(promise);
+ callEach(queue);
+ }
+ }
+
+ function Promise(resolver) {
+ var promise = this;
+ if (!isPromise(promise)) {
+ throw new TypeError(REQUIRES_NEW);
+ }
+ promise[STATUS] = PENDING;
+ promise[VALUE] = undefined;
+ resolvePromise(promise, resolver);
+ }
+
+ Promise.prototype.then = function (onFulfilled, onRejected) {
+ var promise = this;
+ var nextPromise;
+ onFulfilled = isCallable(onFulfilled) ? onFulfilled : identity;
+ onRejected = isCallable(onRejected) ? onRejected : thrower;
+ nextPromise = new Promise(function (resolve, reject) {
+ function tryCall(func) {
+ var value;
+ try {
+ value = func(promise[VALUE]);
+ } catch (error) {
+ reject(error);
+ return;
+ }
+ if (value === nextPromise) {
+ reject(new TypeError(CHAINING_CYCLE));
+ } else {
+ call(resolve, reject, value);
+ }
+ }
+ function asyncOnFulfilled() {
+ setImmediate(tryCall, onFulfilled);
+ }
+ function asyncOnRejected() {
+ setImmediate(tryCall, onRejected);
+ }
+ switch (promise[STATUS]) {
+ case FULFILLED:
+ asyncOnFulfilled();
+ break;
+ case REJECTED:
+ asyncOnRejected();
+ break;
+ default:
+ enqueue(promise, asyncOnFulfilled, asyncOnRejected);
+ }
+ });
+ return nextPromise;
+ };
+
+ Promise.prototype['catch'] = function (onRejected) {
+ return this.then(identity, onRejected);
+ };
+
+ Promise.resolve = function (value) {
+ var anything = toPromise(value);
+ if (isPromise(anything)) {
+ return anything;
+ }
+ return new Promise(function (resolve, reject) {
+ if (isInternalError(anything)) {
+ reject(anything[ORIGINAL_ERROR]);
+ } else {
+ resolve(value);
+ }
+ });
+ };
+
+ Promise.reject = function (reason) {
+ return new Promise(function (resolve, reject) {
+ reject(reason);
+ });
+ };
+
+ Promise.race = function (values) {
+ return new Promise(function (resolve, reject) {
+ var i;
+ var length;
+ if (isArray(values)) {
+ length = values.length;
+ for (i = 0; i < length; i++) {
+ call(resolve, reject, values[i]);
+ }
+ } else {
+ reject(new TypeError(NOT_ARRAY));
+ }
+ });
+ };
+
+ Promise.all = function (values) {
+ return new Promise(function (resolve, reject) {
+ var fulfilledCount = 0;
+ var promiseCount = 0;
+ var anything;
+ var length;
+ var value;
+ var i;
+ if (isArray(values)) {
+ values = values.slice(0);
+ length = values.length;
+ for (i = 0; i < length; i++) {
+ value = values[i];
+ anything = toPromise(value);
+ if (isPromise(anything)) {
+ promiseCount++;
+ anything.then(
+ function (index) {
+ return function (value) {
+ values[index] = value;
+ fulfilledCount++;
+ if (fulfilledCount == promiseCount) {
+ resolve(values);
+ }
+ };
+ }(i),
+ reject
+ );
+ } else if (isInternalError(anything)) {
+ reject(anything[ORIGINAL_ERROR]);
+ } else {
+ //[1, , 3] → [1, undefined, 3]
+ values[i] = value;
+ }
+ }
+ if (!promiseCount) {
+ resolve(values);
+ }
+ } else {
+ reject(new TypeError(NOT_ARRAY));
+ }
+ });
+ };
+
+ if (typeof module != 'undefined' && module.exports) {
+ module.exports = global.Promise || Promise;
+ } else if (!global.Promise) {
+ global.Promise = Promise;
+ }
+
+}(this));
\ No newline at end of file
diff --git a/src/statics/js/storage.js b/src/statics/js/storage.js
new file mode 100644
index 0000000..5dc436f
--- /dev/null
+++ b/src/statics/js/storage.js
@@ -0,0 +1,126 @@
+let idbKeyval = (() => {
+ let db;
+ // console.log('idbKeyval...')
+
+ function getDB() {
+ if (!db) {
+ // console.log('CREO DB STORAGE JS !')
+ db = new Promise((resolve, reject) => {
+ const openreq = indexedDB.open('mydb3', 11);
+
+ openreq.onerror = () => {
+ reject(openreq.error);
+ };
+
+ openreq.onupgradeneeded = () => {
+ // First time setup: create an empty object store
+ openreq.result.createObjectStore('todos', { keyPath: '_id' });
+ openreq.result.createObjectStore('categories', { keyPath: '_id' });
+ openreq.result.createObjectStore('sync_todos', { keyPath: '_id' });
+ openreq.result.createObjectStore('sync_todos_patch', { keyPath: '_id' });
+ openreq.result.createObjectStore('delete_todos', { keyPath: '_id' });
+ openreq.result.createObjectStore('config', { keyPath: '_id' });
+ openreq.result.createObjectStore('swmsg', { keyPath: '_id' });
+ };
+
+ openreq.onsuccess = () => {
+ resolve(openreq.result);
+ };
+ });
+ }
+ return db;
+ }
+
+ async function withStore(type, table, callback, ) {
+ const db = await getDB();
+ return new Promise((resolve, reject) => {
+ const transaction = db.transaction(table, type);
+ transaction.oncomplete = () => resolve();
+ transaction.onerror = () => reject(transaction.error);
+ callback(transaction.objectStore(table));
+ });
+ }
+
+ return {
+ async get(key) {
+ let req;
+ await withStore('readonly', 'keyval', store => {
+ req = store.get(key);
+ });
+ return req.result;
+ },
+
+ // jsonCopy(src) {
+ // return JSON.parse(JSON.stringify(src));
+ // },
+
+ // contains(a, b) {
+ // // array matches
+ // if (Array.isArray(b)) {
+ // return b.some(x => a.indexOf(x) > -1);
+ // }
+ // // string match
+ // return a.indexOf(b) > -1;
+ // },
+
+ async getdata(table, key) {
+ let req;
+
+ await withStore('readonly', table, store => {
+ // console.log('store', store, 'key', key)
+ req = store.get(key);
+ });
+
+ return req.result;
+ },
+ async getalldata(table) {
+ let req;
+ await withStore('readonly', table, store => {
+ req = store.getAll();
+ });
+ return req.result;
+ },
+ async set(key, value) {
+ let req;
+ await withStore('readwrite', 'keyval', store => {
+ req = store.put(value, key);
+ });
+ return req.result;
+ },
+ async setdata(table, value) {
+ let req;
+ // console.log('setdata', table, value)
+
+ await withStore('readwrite', table, store => {
+ req = store.put(value);
+ });
+ return req.result;
+ },
+ async delete(key) {
+ return await withStore('readwrite', 'keyval', store => {
+ store.delete(key);
+ });
+ },
+ async deletedata(table, key) {
+ return await withStore('readwrite', table, store => {
+ store.delete(key);
+ });
+ },
+ async clearalldata(table) {
+ // console.log('clearalldata', table)
+ return await withStore('readwrite', table, store => {
+ store.clear();
+ });
+ }
+ };
+})();
+
+// iOS add-to-homescreen is missing IDB, or at least it used to.
+// I haven't tested this in a while.
+if (!self.indexedDB) {
+ idbKeyval = {
+ get: key => Promise.resolve(localStorage.getItem(key)),
+ set: (key, val) => Promise.resolve(localStorage.setItem(key, val)),
+ delete: key => Promise.resolve(localStorage.removeItem(key))
+ };
+}
diff --git a/src/statics/js/track.js b/src/statics/js/track.js
new file mode 100644
index 0000000..7f5bd2c
--- /dev/null
+++ b/src/statics/js/track.js
@@ -0,0 +1,43 @@
+function geturl() {
+ const miaurl = document.location.href
+
+ if (miaurl.includes('test.')) {
+ return 'https://test.freeplanet.app/'
+ } else {
+ if (miaurl.includes('localhost')) {
+ return 'http://localhost:8080/'
+ } else {
+ return 'https://freeplanet.app/'
+ }
+ }
+}
+
+function getidtrack() {
+ const miaurl = document.location.href
+
+ if (miaurl.includes('test.') || miaurl.includes('localhost')) {
+ return '4c40a07bc88a9c50c9b70dc9c5cd8e2e'
+ } else {
+ return '9853abef079fc8330ab188a9cbf07a0c'
+ }
+}
+
+
+var owa_baseUrl = geturl() + 'owa/';
+if (owa_cmds)
+ var owa_cmds = [];
+else
+ var owa_cmds = owa_cmds || [];
+owa_cmds.push(['setSiteId', getidtrack()]);
+owa_cmds.push(['trackPageView']);
+// owa_cmds.push(['trackClicks']);
+
+(function () {
+ var _owa = document.createElement('script');
+ _owa.type = 'text/javascript';
+ _owa.async = true;
+ owa_baseUrl = ('https:' == document.location.protocol ? window.owa_baseSecUrl || owa_baseUrl.replace(/http:/, 'https:') : owa_baseUrl);
+ _owa.src = owa_baseUrl + 'modules/base/js/owa.tracker-combined-min.js';
+ var _owa_s = document.getElementsByTagName('script')[0];
+ _owa_s.parentNode.insertBefore(_owa, _owa_s);
+}());
diff --git a/src/store/Api/Instance.ts b/src/store/Api/Instance.ts
index a916607..e91a27b 100644
--- a/src/store/Api/Instance.ts
+++ b/src/store/Api/Instance.ts
@@ -22,10 +22,16 @@ axiosInstance.interceptors.response.use(
return response
},
(error) => {
+ // console.log('error', error)
if (error.response) {
if (process.env.DEBUG === '1')
- console.log(error.response.status)
+ console.log('Status = ', error.response.status)
console.log('Request Error: ', error.response)
+ if (error.response.status) {
+ GlobalStore.mutations.setStateConnection('online')
+ }
+ } else {
+ GlobalStore.mutations.setStateConnection('offline')
}
return Promise.reject(error)
}
@@ -39,10 +45,10 @@ export const removeAuthHeaders = () => {
delete axiosInstance.defaults.headers.Authorization
}
-async function Request(type: string, path: string, payload: any, setAuthToken?: boolean): Promise {
+async function Request(type: string, path: string, payload: any): Promise {
let ricevuto = false
try {
- // console.log(`Axios Request [${type}]:`, axiosInstance.defaults)
+ console.log(`Axios Request [${type}]:`, axiosInstance.defaults, 'path:', path)
let response: AxiosResponse
if (type === 'post' || type === 'put' || type === 'patch') {
response = await axiosInstance[type](path, payload, {
@@ -52,7 +58,7 @@ async function Request(type: string, path: string, payload: any, setAuthToken?:
}
})
ricevuto = true
- // console.log('Request Response: ', response)
+ console.log('Request Response: ', response)
// console.log(new Types.AxiosSuccess(response.data, response.status))
const setAuthToken = (path === '/updatepwd')
@@ -97,6 +103,7 @@ async function Request(type: string, path: string, payload: any, setAuthToken?:
'x-auth': UserStore.state.x_auth_token
}
})
+ ricevuto = true
return new Types.AxiosSuccess(response.data, response.status)
} else if (type === 'postFormData') {
response = await axiosInstance.post(path, payload, {
@@ -105,11 +112,12 @@ async function Request(type: string, path: string, payload: any, setAuthToken?:
'x-auth': UserStore.state.x_auth_token
}
})
+ ricevuto = true
return new Types.AxiosSuccess(response.data, response.status)
}
}
catch (error) {
- setTimeout(function () {
+ setTimeout(() => {
GlobalStore.state.connData.uploading_server = (GlobalStore.state.connData.uploading_server === 1) ? -1 : GlobalStore.state.connData.uploading_server
GlobalStore.state.connData.downloading_server = (GlobalStore.state.connData.downloading_server === 1) ? -1 : GlobalStore.state.connData.downloading_server
}, 1000)
diff --git a/src/store/Api/index.ts b/src/store/Api/index.ts
index f51b0ae..bcab6bd 100644
--- a/src/store/Api/index.ts
+++ b/src/store/Api/index.ts
@@ -16,7 +16,6 @@ import router from '@router'
import * as Types from '@src/store/Api/ApiTypes'
import { costanti } from '@src/store/Modules/costanti'
-
// const algoliaApi = new AlgoliaSearch()
export namespace ApiTool {
export async function post(path: string, payload?: any) {
@@ -57,7 +56,7 @@ export namespace ApiTool {
refresh_token
}, {
headers: {
- 'Authorization': `Bearer ${token}`
+ Authorization: `Bearer ${token}`
}
})
}
@@ -65,23 +64,22 @@ export namespace ApiTool {
export async function SendReq(url: string, method: string, mydata: any, setAuthToken: boolean = false): Promise {
UserStore.mutations.setServerCode(tools.EMPTY)
UserStore.mutations.setResStatus(0)
- return await new Promise(function (resolve, reject) {
-
+ return await new Promise((resolve, reject) => {
return sendRequest(url, method, mydata)
- .then(res => {
+ .then((res) => {
// console.log('res', res)
- setTimeout(function () {
- if (method === 'get')
+ setTimeout(() => {
+ if (method === 'get') {
GlobalStore.state.connData.downloading_server = 0
+ }
else {
GlobalStore.state.connData.uploading_server = 0
GlobalStore.state.connData.downloading_server = 0
}
}, 1000)
-
UserStore.mutations.setResStatus(res.status)
if (res.status === serv_constants.RIS_CODE__HTTP_FORBIDDEN_INVALID_TOKEN) {
// Forbidden
@@ -95,10 +93,11 @@ export namespace ApiTool {
return resolve(res)
})
- .catch(error => {
- setTimeout(function () {
- if (method === 'get')
+ .catch((error) => {
+ setTimeout(() => {
+ if (method === 'get') {
GlobalStore.state.connData.downloading_server = -1
+ }
else {
GlobalStore.state.connData.uploading_server = -1
GlobalStore.state.connData.downloading_server = -1
@@ -114,13 +113,13 @@ export namespace ApiTool {
export async function syncAlternative(mystrparam) {
// console.log('[ALTERNATIVE Background syncing', mystrparam)
- let multiparams = mystrparam.split('|')
+ const multiparams = mystrparam.split('|')
if (multiparams) {
if (multiparams.length > 3) {
- let cmd = multiparams[0]
- let table = multiparams[1]
- let method = multiparams[2]
- let token = multiparams[3]
+ const cmd = multiparams[0]
+ const table = multiparams[1]
+ const method = multiparams[2]
+ const token = multiparams[3]
// let lang = multiparams[3]
if (cmd === 'sync-todos') {
@@ -136,17 +135,18 @@ export namespace ApiTool {
// console.log('A1) INIZIO.............................................................')
return globalroutines(null, 'readall', table, null)
- .then(function (alldata) {
+ .then((alldata) => {
const myrecs = [...alldata]
// console.log('----------------------- LEGGO QUALCOSA ')
- const promises = myrecs.map(rec => {
+ const promises = myrecs.map((rec) => {
// console.log('syncing', table, '', rec.descr)
// let link = String(process.env.MONGODB_HOST) + '/todos'
let link = '/todos'
- if (method !== 'POST')
+ if (method !== 'POST') {
link += '/' + rec._id
+ }
// console.log(' [Alternative] ++++++++++++++++++ SYNCING !!!! ', rec.descr, table, 'FETCH: ', method, link, 'data:')
@@ -166,7 +166,7 @@ export namespace ApiTool {
.then(() => {
return globalroutines(null, 'delete', 'swmsg', null, mystrparam)
})
- .catch(function (err) {
+ .catch((err) => {
if (err.message === 'Failed to fetch') {
errorfromserver = true
}
@@ -177,11 +177,11 @@ export namespace ApiTool {
// CALL ALL THE PROMISES
return Promise.all(promises).then(() => {
return (errorfromserver && !lettoqualcosa)
- }).catch(err => {
+ }).catch((err) => {
return (errorfromserver && !lettoqualcosa)
})
- }).catch(e => {
+ }).catch((e) => {
// console.log('ERROR:', e)
return (errorfromserver && !lettoqualcosa)
})
@@ -200,6 +200,5 @@ export namespace ApiTool {
}
}
-
}
export default ApiTool
diff --git a/src/store/Modules/GlobalStore.ts b/src/store/Modules/GlobalStore.ts
index 57598ba..c4b6bd3 100644
--- a/src/store/Modules/GlobalStore.ts
+++ b/src/store/Modules/GlobalStore.ts
@@ -1,4 +1,4 @@
-import { ICfgServer, IConfig, IGlobalState, StateConnection } from 'model'
+import { ICfgServer, IConfig, IGlobalState, ITodoList, StateConnection } from 'model'
import { storeBuilder } from './Store/Store'
import Vue from 'vue'
@@ -7,22 +7,21 @@ import translate from './../../globalroutines/util'
import urlBase64ToUint8Array from '../../js/utility'
-import messages from '../../statics/i18n'
-import { GlobalStore, Todos, UserStore } from '@store'
-import globalroutines from './../../globalroutines/index'
import Api from '@api'
-import { tools } from '@src/store/Modules/tools'
-import { costanti } from '@src/store/Modules/costanti'
import * as Types from '@src/store/Api/ApiTypes'
+import { costanti } from '@src/store/Modules/costanti'
+import { tools } from '@src/store/Modules/tools'
+import { GlobalStore, Todos, UserStore } from '@store'
+import messages from '../../statics/i18n'
+import globalroutines from './../../globalroutines/index'
const allTables = ['todos', 'categories', 'sync_todos', 'sync_todos_patch', 'delete_todos', 'config', 'swmsg']
const allTablesAfterLogin = ['todos', 'categories', 'sync_todos', 'sync_todos_patch', 'delete_todos', 'config', 'swmsg']
-
let stateConnDefault = 'online'
getstateConnSaved()
- .then(conn => {
+ .then((conn) => {
stateConnDefault = conn
})
@@ -41,6 +40,7 @@ const state: IGlobalState = {
testp1: { contatore: 0, mioarray: [] },
category: 'personal',
posts: [],
+ menulinks: {},
listatodo: [
{ namecat: 'personal', description: 'personal' },
{ namecat: 'work', description: 'work' },
@@ -61,7 +61,7 @@ async function getConfig(id) {
async function getstateConnSaved() {
const config = await getConfig(costanti.CONFIG_ID_CFG)
- console.log('config', config)
+ // console.log('config', config)
if (config) {
if (config.length > 1) {
const cfgstateconn = config[1]
@@ -74,22 +74,21 @@ async function getstateConnSaved() {
}
}
-
const b = storeBuilder.module('GlobalModule', state)
// Getters
namespace Getters {
- const conta = b.read(state => state.conta, 'conta')
- const listatodo = b.read(state => state.listatodo, 'listatodo')
- const category = b.read(state => state.category, 'category')
+ const conta = b.read((state) => state.conta, 'conta')
+ const listatodo = b.read((state) => state.listatodo, 'listatodo')
+ const category = b.read((state) => state.category, 'category')
- const testpao1_getter_contatore = b.read(state => param1 => state.testp1.contatore + 100 + param1, 'testpao1_getter_contatore')
- const testpao1_getter_array = b.read(state => param1 => state.testp1.mioarray.filter(item => item).map(item => item.valore), 'testpao1_getter_array')
+ const testpao1_getter_contatore = b.read((state) => (param1) => state.testp1.contatore + 100 + param1, 'testpao1_getter_contatore')
+ const testpao1_getter_array = b.read((state) => (param1) => state.testp1.mioarray.filter((item) => item).map((item) => item.valore), 'testpao1_getter_array')
- const getConfigbyId = b.read(state => id => state.arrConfig.find(item => item._id === id), 'getConfigbyId')
- const getConfigStringbyId = b.read(state => params => {
- const config = state.arrConfig.find(item => item._id === params.id)
+ const getConfigbyId = b.read((state) => (id) => state.arrConfig.find((item) => item._id === id), 'getConfigbyId')
+ const getConfigStringbyId = b.read((state) => (params) => {
+ const config = state.arrConfig.find((item) => item._id === params.id)
if (config) {
return config.value
} else {
@@ -97,16 +96,88 @@ namespace Getters {
}
}, 'getConfigStringbyId')
- const showtype = b.read(state => {
+ const showtype = b.read((state) => {
// const config = state.arrConfig.find(item => item._id === cat + costanti.CONFIG_ID_SHOW_TYPE_TODOS)
- const config = state.arrConfig.find(item => item._id === costanti.CONFIG_ID_SHOW_TYPE_TODOS)
- if (config)
+ const config = state.arrConfig.find((item) => item._id === costanti.CONFIG_ID_SHOW_TYPE_TODOS)
+ if (config) {
return config.value
- else
+ }
+ else {
return ''
+ }
}, 'showtype')
+ const getmenu = b.read((state) => {
+
+ const arrlista = GlobalStore.state.listatodo
+ let listatodo = []
+
+ arrlista.forEach((elem: ITodoList) => {
+ const item = {
+ faIcon: 'fa fa-list-alt',
+ materialIcon: 'todo',
+ name: 'pages.' + elem.description,
+ route: '/todo/' + elem.namecat
+ }
+ listatodo.push(item)
+
+ })
+
+
+ if (UserStore.state.isAdmin) {
+ state.menulinks = {
+ Dashboard: {
+ routes: [
+ { route: '/', faIcon: 'fa fa-home', materialIcon: 'home', name: 'pages.home' },
+ {
+ route: '/todo', faIcon: 'fa fa-list-alt', materialIcon: 'format_list_numbered', name: 'pages.Todo',
+ routes2: listatodo
+ },
+ { route: '/category', faIcon: 'fa fa-list-alt', materialIcon: 'category', name: 'pages.Category' },
+ { route: '/admin/cfgserv', faIcon: 'fa fa-database', materialIcon: 'event_seat', name: 'pages.Admin' },
+ { route: '/admin/testp1/par1', faIcon: 'fa fa-database', materialIcon: 'restore', name: 'pages.Test1' },
+ { route: '/admin/testp1/par2', faIcon: 'fa fa-database', materialIcon: 'restore', name: 'pages.Test2' }
+ /* {route: '/vreg?idlink=aaa', faIcon: 'fa fa-login', materialIcon: 'login', name: 'pages.vreg'},*/
+ ],
+ show: true
+ }
+ }
+ } else {
+ // PRODUCTION USER:
+ if (process.env.PROD) {
+ state.menulinks = {
+ Dashboard: {
+ routes: [
+ { route: '/', faIcon: 'fa fa-home', materialIcon: 'home', name: 'pages.home' }
+ ],
+ show: true
+ }
+ }
+ } else {
+ // SERVER TEST
+ state.menulinks = {
+ Dashboard: {
+ routes: [
+ { route: '/', faIcon: 'fa fa-home', materialIcon: 'home', name: 'pages.home' },
+ {
+ route: '/todo', faIcon: 'fa fa-list-alt', materialIcon: 'format_list_numbered', name: 'pages.Todo',
+ routes2: listatodo
+ },
+ { route: '/category', faIcon: 'fa fa-list-alt', materialIcon: 'category', name: 'pages.Category' }
+ // { route: '/signup', faIcon: 'fa fa-registered', materialIcon: 'home', name: 'pages.SignUp' },
+ // { route: '/signin', faIcon: 'fa fa-anchor', materialIcon: 'home', name: 'pages.SignIn' },
+ /* {route: '/vreg?idlink=aaa', faIcon: 'fa fa-login', materialIcon: 'login', name: 'pages.vreg'},*/
+ ],
+ show: true
+ }
+ }
+ }
+ }
+
+ return state.menulinks
+
+ }, 'getmenu')
export const getters = {
get testpao1_getter_contatore() {
@@ -139,20 +210,25 @@ namespace Getters {
return showtype()
},
+ get getmenu() {
+ return getmenu()
+ },
+
get isOnline() {
console.log('*********************** isOnline')
return state.stateConnection === 'online'
},
get isNewVersionAvailable() {
- console.log('state.cfgServer', state.cfgServer)
- const serversrec = state.cfgServer.find(x => x.chiave === tools.SERVKEY_VERS)
- console.log('Record ', serversrec)
+ // console.log('state.cfgServer', state.cfgServer)
+ const serversrec = state.cfgServer.find((x) => x.chiave === tools.SERVKEY_VERS)
+ // console.log('Record ', serversrec)
if (serversrec) {
console.log('Vers Server ', serversrec.valore, 'Vers locale:', process.env.APP_VERSION)
return serversrec.valore !== process.env.APP_VERSION
- } else
+ } else {
return false
+ }
}
}
}
@@ -273,7 +349,7 @@ namespace Actions {
} else {
// Create a new subscription
console.log('Create a new subscription')
- let convertedVapidPublicKey = urlBase64ToUint8Array(mykey)
+ const convertedVapidPublicKey = urlBase64ToUint8Array(mykey)
return reg.pushManager.subscribe({
userVisibleOnly: true,
applicationServerKey: convertedVapidPublicKey
@@ -291,8 +367,9 @@ namespace Actions {
// Calling the Server to Save in the MongoDB the Subscriber
function saveNewSubscriptionToServer(context, newSub) {
// If already subscribed, exit
- if (!newSub)
+ if (!newSub) {
return
+ }
// console.log('saveSubscriptionToServer: ', newSub)
// console.log('context', context)
@@ -308,7 +385,7 @@ namespace Actions {
}
}
- let myres = {
+ const myres = {
options,
subs: newSub,
others: {
@@ -318,13 +395,13 @@ namespace Actions {
}
return Api.SendReq('/subscribe', 'POST', myres)
- .then(res => {
+ .then((res) => {
state.wasAlreadySubscribed = true
state.wasAlreadySubOnDb = true
localStorage.setItem(tools.localStorage.wasAlreadySubOnDb, String(state.wasAlreadySubOnDb))
})
- .catch(e => {
+ .catch((e) => {
console.log('Error during Subscription!', e)
})
}
@@ -332,25 +409,21 @@ namespace Actions {
async function deleteSubscriptionToServer(context) {
console.log('DeleteSubscriptionToServer: ')
- return await fetch(process.env.MONGODB_HOST + '/subscribe/del', {
- method: 'DELETE',
- headers: {
- 'Content-Type': 'application/json',
- 'Accept': 'application/json',
- 'x-auth': UserStore.state.x_auth_token
- }
- })
+ return Api.SendReq('/subscribe/del', 'DELETE', null)
+ .then((res) => {
+
+ })
}
function t(params) {
- let msg = params.split('.')
- let lang = UserStore.state.lang
+ const msg = params.split('.')
+ const lang = UserStore.state.lang
- let stringa = messages[lang]
+ const stringa = messages[lang]
let ris = stringa
- msg.forEach(param => {
+ msg.forEach((param) => {
ris = ris[param]
})
@@ -380,14 +453,16 @@ namespace Actions {
console.log('REMOVE ALL SUBSCRIPTION...')
await navigator.serviceWorker.ready.then(function (reg) {
console.log('... Ready')
- reg.pushManager.getSubscription().then(function (subscription) {
+ reg.pushManager.getSubscription().then((subscription) => {
console.log(' Found Subscription...')
- subscription.unsubscribe().then(function (successful) {
- // You've successfully unsubscribed
- console.log('You\'ve successfully unsubscribed')
- }).catch(function (e) {
- // Unsubscription failed
- })
+ if (subscription) {
+ subscription.unsubscribe().then(function (successful) {
+ // You've successfully unsubscribed
+ console.log('You\'ve successfully unsubscribed')
+ }).catch(function (e) {
+ // Unsubscription failed
+ })
+ }
})
})
}
@@ -408,7 +483,6 @@ namespace Actions {
}
-
async function loadAfterLogin(context) {
console.log('loadAfterLogin')
actions.clearDataAfterLoginOnlyIfActiveConnection()
@@ -419,8 +493,8 @@ namespace Actions {
async function saveCfgServerKey(context, dataval: ICfgServer) {
console.log('saveCfgServerKey dataval', dataval)
- let ris = await Api.SendReq('/admin/updateval', 'POST', { pairval: dataval })
- .then(res => {
+ const ris = await Api.SendReq('/admin/updateval', 'POST', { pairval: dataval })
+ .then((res) => {
})
@@ -434,8 +508,8 @@ namespace Actions {
state.networkDataReceived = false
- let ris = await Api.SendReq('/checkupdates', 'GET', null)
- .then(res => {
+ const ris = await Api.SendReq('/checkupdates', 'GET', null)
+ .then((res) => {
state.networkDataReceived = true
console.log('******* checkUpdates RES :', res.data.cfgServer)
@@ -449,7 +523,7 @@ namespace Actions {
return res
})
- .catch(error => {
+ .catch((error) => {
console.log('error checkUpdates', error)
UserStore.mutations.setErrorCatch(error)
return error
@@ -477,10 +551,9 @@ const GlobalModule = {
get state() {
return stateGetter()
},
+ actions: Actions.actions,
getters: Getters.getters,
- mutations: Mutations.mutations,
- actions: Actions.actions
+ mutations: Mutations.mutations
}
-
export default GlobalModule
diff --git a/src/store/Modules/Todos.ts b/src/store/Modules/Todos.ts
index 5eea7ae..fd37c59 100644
--- a/src/store/Modules/Todos.ts
+++ b/src/store/Modules/Todos.ts
@@ -695,7 +695,7 @@ namespace Actions {
}
// 3) send to the Server
- await saveItemToSyncAndDb(tools.DB.TABLE_SYNC_TODOS, 'POST', objtodo)
+ return await saveItemToSyncAndDb(tools.DB.TABLE_SYNC_TODOS, 'POST', objtodo)
.then((ris) => {
// Check if need to be moved...
const indelem = getIndexById(objtodo.category, objtodo._id)
diff --git a/src/store/Modules/UserStore.ts b/src/store/Modules/UserStore.ts
index 696ab60..18ee291 100644
--- a/src/store/Modules/UserStore.ts
+++ b/src/store/Modules/UserStore.ts
@@ -31,7 +31,6 @@ const state: IUserState = {
isAdmin: false
}
-
const b = storeBuilder.module('UserModule', state)
const stateGetter = b.state()
@@ -40,7 +39,7 @@ namespace Getters {
// return state.userInfos.firstname?capitalize(state.userInfos.firstname) + " " + capitalize(state.userInfos.lastname):null;
// })
- const lang = b.read(state => {
+ const lang = b.read((state) => {
if (state.lang !== '') {
return state.lang
} else {
@@ -60,11 +59,11 @@ namespace Getters {
// }
// }, 'tok')
- const isServerError = b.read(state => {
+ const isServerError = b.read((state) => {
return (state.servercode === tools.ERR_SERVERFETCH)
}, 'isServerError')
- const getServerCode = b.read(state => {
+ const getServerCode = b.read((state) => {
return state.servercode
}, 'getServerCode')
@@ -84,27 +83,27 @@ namespace Getters {
// get fullName() { return fullName();},
}
-
}
-
namespace Mutations {
function authUser(state: IUserState, data: IUserState ) {
state.userId = data.userId
state.username = data.username
- if (data.verified_email)
+ if (data.verified_email) {
state.verified_email = data.verified_email
+ }
- if (data.categorySel)
- state.categorySel = data.categorySel // ??
-
+ if (data.categorySel) {
+ state.categorySel = data.categorySel
+ } // ??
resetArrToken(state.tokens)
state.tokens.push({ access: 'auth', token: state.x_auth_token, data_login: new Date() })
// ++Todo: Settings Users Admin
- if (state.username === 'paoloar77')
+ if (state.username === 'paoloar77') {
state.isAdmin = true
+ }
// console.log('state.tokens', state.tokens)
}
@@ -144,7 +143,6 @@ namespace Mutations {
state.x_auth_token = x_auth_token
}
-
function resetArrToken(arrtokens) {
if (!arrtokens.tokens) {
arrtokens.tokens = []
@@ -165,7 +163,6 @@ namespace Mutations {
state.categorySel = 'personal'
}
-
function setErrorCatch(state: IUserState, axerr: Types.AxiosError) {
if (state.servercode !== tools.ERR_SERVERFETCH) {
state.servercode = axerr.getCode()
@@ -192,7 +189,6 @@ namespace Mutations {
return msgerrore
}
-
export const mutations = {
authUser: b.commit(authUser),
setpassword: b.commit(setpassword),
@@ -207,7 +203,6 @@ namespace Mutations {
getMsgError: b.commit(getMsgError)
}
-
}
namespace Actions {
@@ -225,7 +220,7 @@ namespace Actions {
async function resetpwd(context, paramquery: IUserState) {
- let usertosend = {
+ const usertosend = {
keyappid: process.env.PAO_APP_ID,
idapp: process.env.APP_ID,
email: paramquery.email,
@@ -237,7 +232,7 @@ namespace Actions {
Mutations.mutations.setServerCode(tools.CALLING)
return await Api.SendReq('/updatepwd', 'POST', usertosend, true)
- .then(res => {
+ .then((res) => {
return { code: res.data.code, msg: res.data.msg }
})
.catch((error: Types.AxiosError) => {
@@ -249,7 +244,7 @@ namespace Actions {
async function requestpwd(context, paramquery: IUserState) {
- let usertosend = {
+ const usertosend = {
keyappid: process.env.PAO_APP_ID,
idapp: process.env.APP_ID,
email: paramquery.email
@@ -259,7 +254,7 @@ namespace Actions {
Mutations.mutations.setServerCode(tools.CALLING)
return await Api.SendReq('/requestnewpwd', 'POST', usertosend)
- .then(res => {
+ .then((res) => {
return { code: res.data.code, msg: res.data.msg }
}).catch((error) => {
UserStore.mutations.setErrorCatch(error)
@@ -269,7 +264,7 @@ namespace Actions {
}
async function vreg(context, paramquery: ILinkReg) {
- let usertosend = {
+ const usertosend = {
keyappid: process.env.PAO_APP_ID,
idapp: process.env.APP_ID,
idlink: paramquery.idlink
@@ -279,7 +274,7 @@ namespace Actions {
Mutations.mutations.setServerCode(tools.CALLING)
return await Api.SendReq('/vreg', 'POST', usertosend)
- .then(res => {
+ .then((res) => {
// console.log("RITORNO 2 ");
// mutations.setServerCode(myres);
if (res.data.code === serv_constants.RIS_CODE_EMAIL_VERIFIED) {
@@ -300,12 +295,12 @@ namespace Actions {
// console.log("PASSW: " + authData.password);
- let mylang = state.lang
+ const mylang = state.lang
console.log('MYLANG: ' + mylang)
return bcrypt.hash(authData.password, bcrypt.genSaltSync(12))
.then((hashedPassword: string) => {
- let usertosend = {
+ const usertosend = {
keyappid: process.env.PAO_APP_ID,
lang: mylang,
email: authData.email,
@@ -319,7 +314,7 @@ namespace Actions {
Mutations.mutations.setServerCode(tools.CALLING)
return Api.SendReq('/users', 'POST', usertosend)
- .then(res => {
+ .then((res) => {
const newuser = res.data
@@ -328,8 +323,8 @@ namespace Actions {
Mutations.mutations.setServerCode(res.status)
if (res.status === 200) {
- let userId = newuser._id
- let username = authData.username
+ const userId = newuser._id
+ const username = authData.username
if (process.env.DEV) {
console.log('USERNAME = ' + username)
console.log('IDUSER= ' + userId)
@@ -376,12 +371,12 @@ namespace Actions {
try {
if ('serviceWorker' in navigator) {
sub = await navigator.serviceWorker.ready
- .then(function (swreg) {
+ .then(function(swreg) {
console.log('swreg')
- let sub = swreg.pushManager.getSubscription()
+ const sub = swreg.pushManager.getSubscription()
return sub
})
- .catch(e => {
+ .catch((e) => {
sub = null
})
}
@@ -406,8 +401,9 @@ namespace Actions {
}
// console.log('PASSO 4')
- if (process.env.DEBUG === '1')
+ if (process.env.DEBUG === '1') {
console.log(usertosend)
+ }
Mutations.mutations.setServerCode(tools.CALLING)
@@ -416,7 +412,7 @@ namespace Actions {
console.log('Api.SendReq')
return Api.SendReq('/users/login', 'POST', usertosend, true)
- .then(res => {
+ .then((res) => {
myres = res
if (myres.status !== 200) {
@@ -424,16 +420,16 @@ namespace Actions {
}
return myres
- }).then(res => {
+ }).then((res) => {
if (res.success) {
GlobalStore.mutations.SetwasAlreadySubOnDb(res.data.subsExistonDb)
- let myuser: IUserState = res.data.usertosend
+ const myuser: IUserState = res.data.usertosend
if (myuser) {
- let userId = myuser.userId
- let username = authData.username
- let verified_email = myuser.verified_email
+ const userId = myuser.userId
+ const username = authData.username
+ const verified_email = myuser.verified_email
Mutations.mutations.authUser({
userId,
@@ -458,7 +454,7 @@ namespace Actions {
return tools.OK
- }).then(code => {
+ }).then((code) => {
if (code === tools.OK) {
return setGlobal(true)
.then(() => {
@@ -491,14 +487,14 @@ namespace Actions {
await GlobalStore.actions.clearDataAfterLogout()
- let usertosend = {
+ const usertosend = {
keyappid: process.env.PAO_APP_ID,
idapp: process.env.APP_ID
}
console.log(usertosend)
const riscall = await Api.SendReq('/users/me/token', 'DELETE', usertosend)
- .then(res => {
+ .then((res) => {
console.log(res)
}).then(() => {
Mutations.mutations.clearAuthData()
@@ -525,7 +521,6 @@ namespace Actions {
})
}
-
async function autologin_FromLocalStorage(context) {
try {
// console.log('*** autologin_FromLocalStorage ***')
@@ -538,7 +533,7 @@ namespace Actions {
return false
}
const expirationDateStr = localStorage.getItem(tools.localStorage.expirationDate)
- let expirationDate = new Date(String(expirationDateStr))
+ const expirationDate = new Date(String(expirationDateStr))
const now = new Date()
if (now >= expirationDate) {
console.log('!!! Login Expired')
@@ -571,16 +566,14 @@ namespace Actions {
}
}
-
export const actions = {
- resetpwd: b.dispatch(resetpwd),
- requestpwd: b.dispatch(requestpwd),
- vreg: b.dispatch(vreg),
- signup: b.dispatch(signup),
- signin: b.dispatch(signin),
+ autologin_FromLocalStorage: b.dispatch(autologin_FromLocalStorage),
logout: b.dispatch(logout),
- autologin_FromLocalStorage: b.dispatch(autologin_FromLocalStorage)
-
+ requestpwd: b.dispatch(requestpwd),
+ resetpwd: b.dispatch(resetpwd),
+ signin: b.dispatch(signin),
+ signup: b.dispatch(signup),
+ vreg: b.dispatch(vreg)
}
}
@@ -589,9 +582,9 @@ const UserModule = {
get state() {
return stateGetter()
},
+ actions: Actions.actions,
getters: Getters.getters,
- mutations: Mutations.mutations,
- actions: Actions.actions
+ mutations: Mutations.mutations
}
export default UserModule
diff --git a/src/store/Modules/tools.ts b/src/store/Modules/tools.ts
index 0946e19..3851757 100644
--- a/src/store/Modules/tools.ts
+++ b/src/store/Modules/tools.ts
@@ -1,8 +1,15 @@
-import { ITodo } from '@src/model'
-import { costanti } from './costanti'
-import globalroutines from './../../globalroutines/index'
-import { Todos, UserStore } from '@store'
import Api from '@api'
+import { ITodo } from '@src/model'
+import { Todos, UserStore } from '@store'
+import globalroutines from './../../globalroutines/index'
+import { costanti } from './costanti'
+import Quasar from 'quasar'
+
+export interface INotify {
+ color?: string | 'primary'
+ textColor?: string
+ icon?: string | ''
+}
export const tools = {
EMPTY: 0,
@@ -14,6 +21,8 @@ export const tools = {
DUPLICATE_EMAIL_ID: 11000,
DUPLICATE_USERNAME_ID: 11100,
+ arrLangUsed: ['enUs', 'it', 'es'],
+
LIST_END: '10000000',
LIST_START: '0',
@@ -53,12 +62,11 @@ export const tools = {
COMPLETED: 110,
PROGRESS_BAR: 120,
PRIORITY: 130,
- SHOW_TASK: 150,
+ SHOW_TASK: 150
},
-
selectPriority: {
- 'it': [
+ it: [
{
id: 1,
label: 'Alta',
@@ -77,7 +85,7 @@ export const tools = {
value: 0,
icon: 'expand_more'
}],
- 'esEs': [
+ es: [
{
id: 1,
label: 'Alta',
@@ -96,7 +104,7 @@ export const tools = {
value: 0,
icon: 'expand_more'
}],
- 'enUs': [
+ enUs: [
{
id: 1,
label: 'High',
@@ -115,7 +123,7 @@ export const tools = {
value: 0,
icon: 'expand_more'
}],
- 'de': [
+ de: [
{
id: 1,
label: 'High',
@@ -135,13 +143,12 @@ export const tools = {
icon: 'expand_more'
}]
-
},
INDEX_MENU_DELETE: 4,
menuPopupTodo: {
- 'it': [
+ it: [
{
id: 10,
label: '',
@@ -178,7 +185,7 @@ export const tools = {
checked: false
}
],
- 'esEs': [
+ es: [
{
id: 10,
label: '',
@@ -215,7 +222,7 @@ export const tools = {
checked: false
}
],
- 'enUs': [
+ enUs: [
{
id: 10,
label: '',
@@ -255,34 +262,34 @@ export const tools = {
},
menuPopupConfigTodo: {
- 'it': [
+ it: [
{
id: 10,
label: 'Mostra Task',
value: 150, // SHOW_TASK
- icon: 'rowing',
- },
+ icon: 'rowing'
+ }
],
- 'esEs': [
+ es: [
{
id: 10,
label: 'Mostrar Tareas',
value: 150,
- icon: 'rowing',
- },
+ icon: 'rowing'
+ }
],
- 'enUs': [
+ enUs: [
{
id: 10,
label: 'Show Task',
value: 150,
- icon: 'rowing',
- },
+ icon: 'rowing'
+ }
]
},
listOptionShowTask: {
- 'it': [
+ it: [
{
id: 10,
label: 'Mostra gli ultimi N completati',
@@ -305,7 +312,7 @@ export const tools = {
checked: true
}
],
- 'esEs': [
+ es: [
{
id: 10,
label: 'Mostrar los ultimos N completados',
@@ -328,7 +335,7 @@ export const tools = {
checked: true
}
],
- 'enUs': [
+ enUs: [
{
id: 10,
label: 'Show last N Completed',
@@ -359,15 +366,17 @@ export const tools = {
getItemLS(item) {
let ris = localStorage.getItem(item)
- if ((ris == null) || (ris === '') || (ris === 'null'))
+ if ((ris == null) || (ris === '') || (ris === 'null')) {
ris = ''
+ }
return ris
},
notifyarraychanged(array) {
- if (array.length > 0)
+ if (array.length > 0) {
array.splice(array.length - 1, 1, array[array.length - 1])
+ }
},
existArr(x) {
@@ -375,8 +384,8 @@ export const tools = {
},
json2array(json) {
- let result = []
- let keys = Object.keys(json)
+ const result = []
+ const keys = Object.keys(json)
keys.forEach(function (key) {
result.push(json[key])
})
@@ -403,13 +412,13 @@ export const tools = {
// console.log('id', id)
const sep = '|'
- let multiparams = cmdSw + sep + table + sep + method + sep + UserStore.state.x_auth_token + sep + UserStore.state.lang
- let mymsgkey = {
+ const multiparams = cmdSw + sep + table + sep + method + sep + UserStore.state.x_auth_token + sep + UserStore.state.lang
+ const mymsgkey = {
_id: multiparams,
value: multiparams
}
return globalroutines(null, 'write', 'swmsg', mymsgkey, multiparams)
- .then(ris => {
+ .then((ris) => {
// if ('SyncManager' in window) {
// console.log(' SENDING... sw.sync.register', multiparams)
// return sw.sync.register(multiparams)
@@ -431,9 +440,55 @@ export const tools = {
})
})
}
+ },
+ showNotif(q: any, msg, data?: INotify | null) {
+ let myicon = data ? data.icon : 'ion-add'
+ if (!myicon)
+ myicon = 'ion-add'
+ let mycolor = data ? data.color : 'primary'
+ if (!mycolor)
+ mycolor = 'primary'
+ q.notify({
+ message: msg,
+ icon: myicon,
+ classes: 'my-notif-class',
+ color: mycolor,
+ timeout: 3000
+ })
+ },
+
+ checkLangPassed(mylang) {
+
+ const mybrowserLang = Quasar.lang.isoName
+
+ if (mylang !== '') {
+ if ((mylang.toLowerCase() === 'enus') || (mylang.toLowerCase() === 'en-us')) {
+ mylang = 'enUs'
+ }
+ if ((mylang.toLowerCase() === 'es') || (mylang.toLowerCase() === 'es-es') || (mylang.toLowerCase() === 'eses')) {
+ mylang = 'es'
+ }
+
+ if (!(tools.arrLangUsed.includes(mylang))) {
+ console.log('non incluso ', mylang)
+ mylang = tools.arrLangUsed[0]
+
+ // Metti Inglese come default
+ UserStore.mutations.setlang(mylang)
+ }
+ }
+
+ if (!mylang) {
+ mylang = process.env.LANG_DEFAULT
+ }
+ console.log('mylang calc : ', mylang)
+
+ return mylang
+ },
+
+ getimglogo() {
+ return 'statics/images/' + process.env.LOGO_REG
}
-
-
}
diff --git a/src/track/index.ts b/src/track/index.ts
new file mode 100644
index 0000000..a8bede0
--- /dev/null
+++ b/src/track/index.ts
@@ -0,0 +1,50 @@
+// Start Open Web Analytics Tracker
+export default ({ app, router, store, Vue }) => {
+ console.log('Track 1')
+ function geturl() {
+ const miaurl = document.location.href
+
+ if (miaurl.includes('test.')) {
+ return 'https://test.freeplanet.app/'
+ } else {
+ if (miaurl.includes('localhost')) {
+ return 'http://localhost:8080/'
+ } else {
+ return 'https://freeplanet.app/'
+ }
+ }
+ }
+
+ let owa_cmds
+
+ if (owa_cmds) {
+ owa_cmds = owa_cmds || []
+ }
+ else {
+ owa_cmds = []
+ }
+
+ let idsite = ''
+ if (process.env.PROD) {
+ idsite = '9853abef079fc8330ab188a9cbf07a0c'
+ } else {
+ // TEST
+ idsite = '4c40a07bc88a9c50c9b70dc9c5cd8e2e'
+ }
+
+ owa_cmds.push(['setSiteId', idsite])
+ owa_cmds.push(['trackPageView'])
+ owa_cmds.push(['trackClicks'])
+
+ const owa_baseUrl = geturl() + 'owa/'
+ console.log('******* setTrack', 'owa_baseUrl:', owa_baseUrl)
+ const _owa = document.createElement('script')
+ _owa.type = 'text/javascript'
+ _owa.async = true
+
+ // owa_baseUrl = ('https:' === document.location.protocol ? window.owa_baseSecUrl || owa_baseUrl.replace(/http:/, 'https:') : owa_baseUrl)
+
+ _owa.src = owa_baseUrl + 'modules/base/js/owa.tracker-combined-min.js'
+ const _owa_s = document.getElementsByTagName('script')[0]
+ _owa_s.parentNode.insertBefore(_owa, _owa_s)
+}
diff --git a/src/typings/libs/errorHandler.d.ts b/src/typings/libs/errorHandler.d.ts
index 5c6cd10..b63a644 100644
--- a/src/typings/libs/errorHandler.d.ts
+++ b/src/typings/libs/errorHandler.d.ts
@@ -5,4 +5,3 @@ declare module 'vue/types/vue' {
$errorHandler: errorHandler
}
}
-
diff --git a/src/typings/libs/track.d.ts b/src/typings/libs/track.d.ts
new file mode 100644
index 0000000..5c3449e
--- /dev/null
+++ b/src/typings/libs/track.d.ts
@@ -0,0 +1,8 @@
+import { track } from '../../track'
+
+declare module 'vue/types/vue' {
+ interface Vue {
+ $track: track
+ }
+}
+
diff --git a/src/views/Auth.vue b/src/views/Auth.vue
index 157598b..356daa9 100644
--- a/src/views/Auth.vue
+++ b/src/views/Auth.vue
@@ -2,8 +2,9 @@
-
diff --git a/src/views/dashboard/one/cardTodo.vue b/src/views/dashboard/one/cardTodo.vue
deleted file mode 100644
index 089b74d..0000000
--- a/src/views/dashboard/one/cardTodo.vue
+++ /dev/null
@@ -1,75 +0,0 @@
-
-
-
-
-
-
-
-
-
-
{{index + 1}}
-
- {{todo.title}}
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/views/dashboard/one/cardTotal.vue b/src/views/dashboard/one/cardTotal.vue
deleted file mode 100644
index 912aa05..0000000
--- a/src/views/dashboard/one/cardTotal.vue
+++ /dev/null
@@ -1,49 +0,0 @@
-
-
-
-
-
-
diff --git a/src/views/dashboard/one/dashboard.vue b/src/views/dashboard/one/dashboard.vue
deleted file mode 100644
index 24ae95d..0000000
--- a/src/views/dashboard/one/dashboard.vue
+++ /dev/null
@@ -1,91 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/views/dashboard/one/knobStatistics.vue b/src/views/dashboard/one/knobStatistics.vue
deleted file mode 100644
index 35e1e1f..0000000
--- a/src/views/dashboard/one/knobStatistics.vue
+++ /dev/null
@@ -1,41 +0,0 @@
-
-
-
-
-
-
-
diff --git a/src/views/dashboard/one/tagKnob.vue b/src/views/dashboard/one/tagKnob.vue
deleted file mode 100644
index 97a2d99..0000000
--- a/src/views/dashboard/one/tagKnob.vue
+++ /dev/null
@@ -1,66 +0,0 @@
-
-
-
-
-
- {{title}}
-
-
-
-
-
diff --git a/src/views/form/_examples/advancedFormOne/advancedFormOne.vue b/src/views/form/_examples/advancedFormOne/advancedFormOne.vue
deleted file mode 100644
index 101be3f..0000000
--- a/src/views/form/_examples/advancedFormOne/advancedFormOne.vue
+++ /dev/null
@@ -1,107 +0,0 @@
-
-
-
-
-
- Choose photos to reveal of the user
-
-
-
{ currentStep = stepNumber }">
-
-
-
- Continue
-
-
-
-
-
-
-
- Back
-
-
- Preview
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/views/form/_examples/advancedFormOne/cardUserData.vue b/src/views/form/_examples/advancedFormOne/cardUserData.vue
deleted file mode 100644
index fa0e5b6..0000000
--- a/src/views/form/_examples/advancedFormOne/cardUserData.vue
+++ /dev/null
@@ -1,70 +0,0 @@
-
-
-
-
{{userData.name}}
- {{userData.email}}
-
Choose one of the user Albums
-
-
-
-
-
-
diff --git a/src/views/form/embeeded/eDateTime.vue b/src/views/form/embeeded/eDateTime.vue
deleted file mode 100644
index f03551e..0000000
--- a/src/views/form/embeeded/eDateTime.vue
+++ /dev/null
@@ -1,112 +0,0 @@
-
-
-
-
-
-
- {{validationMessages[key]}}
-
-
-
- check
-
-
- clear
-
-
-
-
-
-
-
diff --git a/src/views/form/embeeded/eInput.vue b/src/views/form/embeeded/eInput.vue
deleted file mode 100644
index 4b400a2..0000000
--- a/src/views/form/embeeded/eInput.vue
+++ /dev/null
@@ -1,108 +0,0 @@
-
-
-
-
- {{label}}
-
-
-
- {{validationMessages[key]}}
-
-
-
- check
-
-
- clear
-
-
-
-
-
-
-
diff --git a/src/views/form/embeeded/eSelect.vue b/src/views/form/embeeded/eSelect.vue
deleted file mode 100644
index 214fd52..0000000
--- a/src/views/form/embeeded/eSelect.vue
+++ /dev/null
@@ -1,115 +0,0 @@
-
-
-
-
-
-
- {{validationMessages[key]}}
-
-
-
- check
-
-
- clear
-
-
-
-
-
-
-
diff --git a/src/views/form/embeeded/embeeded.vue b/src/views/form/embeeded/embeeded.vue
deleted file mode 100644
index de681df..0000000
--- a/src/views/form/embeeded/embeeded.vue
+++ /dev/null
@@ -1,119 +0,0 @@
-
-
-
-
-
diff --git a/src/views/form/simpleForm/modalAdress.vue b/src/views/form/simpleForm/modalAdress.vue
deleted file mode 100644
index a65bc1d..0000000
--- a/src/views/form/simpleForm/modalAdress.vue
+++ /dev/null
@@ -1,98 +0,0 @@
-
-
-
-
- Adress of {{user.name}}
-
-
-
-
-
-
-
-
-
diff --git a/src/views/form/simpleForm/simpleForm.vue b/src/views/form/simpleForm/simpleForm.vue
deleted file mode 100644
index 72665e6..0000000
--- a/src/views/form/simpleForm/simpleForm.vue
+++ /dev/null
@@ -1,92 +0,0 @@
-
-
-
-
-
- Search Users
-
-
-
-
-
- Save
-
-
- Check Adress
-
-
-
-
-
-
-
-
-
-
diff --git a/src/views/form/simpleForm/userForm.vue b/src/views/form/simpleForm/userForm.vue
deleted file mode 100644
index 735d0eb..0000000
--- a/src/views/form/simpleForm/userForm.vue
+++ /dev/null
@@ -1,46 +0,0 @@
-
-
-
-
-
-
diff --git a/src/views/login/logoData.js b/src/views/login/logoData.js
deleted file mode 100644
index 51ba008..0000000
--- a/src/views/login/logoData.js
+++ /dev/null
@@ -1,90 +0,0 @@
-/* eslint-disable */
-export default {
- Digitalizer: `
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- `,
- Keytronic:
- `
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- `,
- Molectron: `
-
-
- `
-
-}
diff --git a/src/views/login/requestresetpwd.vue b/src/views/login/requestresetpwd.vue
index 1c1bebf..64d986d 100644
--- a/src/views/login/requestresetpwd.vue
+++ b/src/views/login/requestresetpwd.vue
@@ -2,9 +2,12 @@
-
- {{ $t('reset.title_reset_pwd')}}
-
+
+ {{ $t('reset.title_reset_pwd')}}
+
-
- {{ $t('reset.email_sent')}}
-
+
+ {{ $t('reset.email_sent')}}
+
@@ -45,72 +51,65 @@
-
diff --git a/src/views/login/signin/signin.ts b/src/views/login/signin/signin.ts
index 3028988..5c5f67f 100644
--- a/src/views/login/signin/signin.ts
+++ b/src/views/login/signin/signin.ts
@@ -1,12 +1,11 @@
+import { GlobalStore, UserStore } from '@store'
import Vue from 'vue'
import { Component, Prop, Watch } from 'vue-property-decorator'
-import { GlobalStore, UserStore } from '@store'
-import { tools } from '../../../store/Modules/tools'
import { serv_constants } from '../../../store/Modules/serv_constants'
-
+import { tools } from '../../../store/Modules/tools'
import { ISigninOptions, IUserState } from 'model'
-import { validations, TSignin } from './signin-validate'
+import { TSignin, validations } from './signin-validate'
import { validationMixin } from 'vuelidate'
@@ -18,31 +17,29 @@ import globalroutines from '../../../globalroutines/index'
// import {Loading, QSpinnerFacebook, QSpinnerGears} from 'quasar'
-
@Component({
mixins: [validationMixin],
- validations: validations,
+ validations,
components: { Logo }
})
export default class Signin extends Vue {
public $v
public $q
- loading: boolean
- $t: any
+ public loading: boolean
+ public $t: any
public iswaitingforRes: boolean = false
public signin: ISigninOptions = {
username: process.env.TEST_USERNAME || '',
- password: process.env.TEST_PASSWORD
+ password: process.env.TEST_PASSWORD || ''
}
-
- created() {
+ public created() {
this.$v.$reset()
if (UserStore.state.resStatus === serv_constants.RIS_CODE__HTTP_FORBIDDEN_INVALID_TOKEN) {
- this.showNotif(this.$t('fetch.error_doppiologin'))
+ tools.showNotif(this.$q, this.$t('fetch.error_doppiologin'))
}
// this.$myconfig.socialLogin.facebook = true
@@ -53,9 +50,6 @@ export default class Signin extends Vue {
return process.env
}
- showNotif(msg: any) {
- this.$q.notify(msg)
- }
public getlinkforgetpwd() {
return '/requestresetpwd'
@@ -63,47 +57,47 @@ export default class Signin extends Vue {
public errorMsg(cosa: string, item: any) {
try {
- if (!item.$error) return ''
- if (item.$params.email && !item.email) return this.$t('reg.err.email')
+ if (!item.$error) { return '' }
+ if (item.$params.email && !item.email) { return this.$t('reg.err.email') }
- if (!item.required) return this.$t('reg.err.required')
- if (!item.minLength) return this.$t('reg.err.atleast') + ` ${item.$params.minLength.min} ` + this.$t('reg.err.char')
- if (!item.maxLength) return this.$t('reg.err.notmore') + ` ${item.$params.maxLength.max} ` + this.$t('reg.err.char')
+ if (!item.required) { return this.$t('reg.err.required') }
+ if (!item.minLength) { return this.$t('reg.err.atleast') + ` ${item.$params.minLength.min} ` + this.$t('reg.err.char') }
+ if (!item.maxLength) { return this.$t('reg.err.notmore') + ` ${item.$params.maxLength.max} ` + this.$t('reg.err.char') }
return ''
} catch (error) {
// console.log("ERR : " + error);
}
}
- checkErrors(riscode) {
+ public checkErrors(riscode) {
// console.log('checkErrors: ', riscode)
try {
if (riscode === tools.OK) {
- this.showNotif({ type: 'positive', message: this.$t('login.completato') })
+ tools.showNotif(this.$q, this.$t('login.completato'), { color: 'positive', icon: 'check'})
this.$router.push('/')
} else if (riscode === serv_constants.RIS_CODE_LOGIN_ERR) {
// Wait N seconds to avoid calling many times...
- return new Promise(function (resolve, reject) {
- setTimeout(function () {
+ return new Promise(function(resolve, reject) {
+ setTimeout(function() {
resolve('anything')
}, 3000)
}).then(() => {
setTimeout( () => {
this.$q.loading.hide()
}, 200)
- this.showNotif(this.$t('login.errato'))
+ tools.showNotif(this.$q, this.$t('login.errato'))
this.iswaitingforRes = false
this.$router.push('/signin')
})
} else if (riscode === tools.ERR_SERVERFETCH) {
- this.showNotif(this.$t('fetch.errore_server'))
+ tools.showNotif(this.$q, this.$t('fetch.errore_server'))
} else if (riscode === tools.ERR_GENERICO) {
- let msg = this.$t('fetch.errore_generico') + UserStore.mutations.getMsgError(riscode)
- this.showNotif(msg)
+ const msg = this.$t('fetch.errore_generico') + UserStore.mutations.getMsgError(riscode)
+ tools.showNotif(this.$q, msg)
} else {
- this.showNotif('Errore num ' + riscode)
+ tools.showNotif(this.$q, 'Errore num ' + riscode)
}
if (riscode !== serv_constants.RIS_CODE_LOGIN_ERR) {
@@ -118,44 +112,46 @@ export default class Signin extends Vue {
}
}
- redirect(response) {
+ public redirect(response) {
this.loading = false
window.location.href = response.data.redirect
}
- error(error) {
+ public error(error) {
this.loading = false
this.$errorHandler(this, error)
}
- facebook() {
+ public facebook() {
this.loading = true
this.$axios.get('/backend/loginFacebook')
- .then(response => this.redirect(response))
- .catch(error => this.error(error))
+ .then((response) => this.redirect(response))
+ .catch((error) => this.error(error))
}
- google() {
+ public google() {
}
- submit() {
+ public submit() {
this.$v.signin.$touch()
if (this.$v.signin.$error) {
- this.showNotif(this.$t('reg.err.errore_generico'))
+ tools.showNotif(this.$q, this.$t('reg.err.errore_generico'))
return
}
let msg = this.$t('login.incorso')
- if (process.env.DEBUG)
+ if (process.env.DEBUG) {
msg += ' ' + process.env.MONGODB_HOST
+ }
this.$q.loading.show({ message: msg})
// disable Button Login:
this.iswaitingforRes = true
- if (process.env.DEBUG)
+ if (process.env.DEBUG) {
console.log('this.signin', this.signin)
+ }
UserStore.actions.signin(this.signin)
.then((riscode) => {
@@ -165,10 +161,12 @@ export default class Signin extends Vue {
}
return riscode
}).then((riscode) => {
- if (UserStore.state.lang !== '')
- this.$i18n.locale = UserStore.state.lang // Set Lang
- else
- UserStore.mutations.setlang(this.$i18n.locale) // Set Lang
+ if (UserStore.state.lang !== '') {
+ this.$i18n.locale = UserStore.state.lang
+ } // Set Lang
+ else {
+ UserStore.mutations.setlang(this.$i18n.locale)
+ } // Set Lang
// console.log('LANG ORA=', UserStore.state.lang)
@@ -178,10 +176,10 @@ export default class Signin extends Vue {
.then((riscode) => {
if (riscode === tools.OK) {
GlobalStore.actions.createPushSubscription()
- .then(rissub => {
+ .then((rissub) => {
})
- .catch(e => {
+ .catch((e) => {
console.log('ERROR Subscription = ' + e)
})
}
@@ -189,7 +187,7 @@ export default class Signin extends Vue {
this.checkErrors(riscode)
})
- .catch(error => {
+ .catch((error) => {
console.log('ERROR SIGNIN = ' + error)
this.checkErrors(error)
diff --git a/src/views/login/signin/signin.vue b/src/views/login/signin/signin.vue
index 61605a1..aefd450 100644
--- a/src/views/login/signin/signin.vue
+++ b/src/views/login/signin/signin.vue
@@ -9,51 +9,54 @@