From 41edd96c8ce9592589053c9c1d61cc4ddffe50c9 Mon Sep 17 00:00:00 2001 From: Paolo Arena Date: Tue, 5 Mar 2019 23:44:48 +0100 Subject: [PATCH] fix "Todo Completati" statics instead of assets --- .env.development | 1 + .gitignore | 7 +- package-lock.json | 6 +- quasar.conf.js | 16 +- src-pwa/custom-service-worker.js | 10 +- src/assets/i18n.js | 418 ------- src/assets/images/freeplanet-logo-full.svg | 1186 -------------------- src/assets/images/freeplanet.png | Bin 40476 -> 0 bytes src/assets/js/fetch.js | 461 -------- src/assets/js/idb.js | 311 ----- src/assets/js/material.min.js | 10 - src/assets/js/promise.js | 372 ------ src/assets/js/storage.js | 126 --- src/components/Header.vue | 10 +- src/components/logo/logo.ts | 2 +- src/components/offline/offline.ts | 2 +- src/components/todos/todo/todo.ts | 2 +- src/globalroutines/util.js | 2 +- src/index.template.html | 12 +- src/middleware/auth.js | 12 + src/plugins/guard.js | 45 +- src/plugins/i18n.js | 2 +- src/root/home/home.scss | 4 +- src/root/home/home.ts | 4 +- src/root/home/home.vue | 21 +- src/root/home/old-home.vue | 2 +- src/router/route-config.ts | 44 +- src/store/Api/Inst-Pao.ts | 3 +- src/store/Api/Instance.ts | 6 +- src/store/Modules/GlobalStore.ts | 31 +- src/store/Modules/Todos.ts | 12 +- src/store/Modules/UserStore.ts | 6 +- src/views/login/signin/signin.ts | 9 +- tsconfig.json | 6 +- yarn.lock | 6 +- 35 files changed, 184 insertions(+), 2983 deletions(-) delete mode 100644 src/assets/i18n.js delete mode 100644 src/assets/images/freeplanet-logo-full.svg delete mode 100644 src/assets/images/freeplanet.png delete mode 100644 src/assets/js/fetch.js delete mode 100644 src/assets/js/idb.js delete mode 100644 src/assets/js/material.min.js delete mode 100644 src/assets/js/promise.js delete mode 100644 src/assets/js/storage.js create mode 100644 src/middleware/auth.js diff --git a/.env.development b/.env.development index acbd665..211e8d9 100644 --- a/.env.development +++ b/.env.development @@ -13,3 +13,4 @@ TEST_USERNAME='paoloar77' TEST_PASSWORD='mypassword@1A' PUBLICKEY_PUSH='BGxRrFWnPoa_ImUaWXmeEOFVI9VNKVKaAPsvsM1XY6wn24yxp9MyOQ4crNYCJKxSXV65Y1GblW5_VLoamedcZ1I' IN_CONSTRUCTION='0' +DEBUG='1' diff --git a/.gitignore b/.gitignore index b327f0b..de79285 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ .DS_Store .thumbs.db .env +.env.development .env.production .env.production.bak .env.prod.bak @@ -12,7 +13,6 @@ node_modules /src-cordova/platforms /src-cordova/plugins /src-cordova/www -/src-pwa /src-ssr npm-debug.log* yarn-debug.log* @@ -34,3 +34,8 @@ deploy.sh deploy_on_production.sh deploy_on_test_server.sh send_to_production.sh +compileandserve.sh +deploy_all.sh +deploy_frontend.sh +mongodb_delete_pc_locale_paolo.sh +serve_on_localhost.sh diff --git a/package-lock.json b/package-lock.json index ff0c07c..3532751 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17708,9 +17708,9 @@ "wordwrap": "0.0.3" } }, - "optimize-css-assets-webpack-plugin": { + "optimize-css-statics-webpack-plugin": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.1.tgz", + "resolved": "https://registry.npmjs.org/optimize-css-statics-webpack-plugin/-/optimize-css-statics-webpack-plugin-5.0.1.tgz", "integrity": "sha512-Rqm6sSjWtx9FchdP0uzTQDc7GXDKnwVEGoSxjezPkzMewx7gEWE9IMUYKmigTRC4U3RaNSwYVnUDLuIdtTpm0A==", "dev": true, "requires": { @@ -19341,7 +19341,7 @@ "net": "1.0.2", "node-loader": "0.6.0", "opn": "5.3.0", - "optimize-css-assets-webpack-plugin": "5.0.1", + "optimize-css-statics-webpack-plugin": "5.0.1", "ouch": "2.0.0", "postcss-loader": "3.0.0", "postcss-rtl": "1.3.2", diff --git a/quasar.conf.js b/quasar.conf.js index e4e9ede..328b023 100644 --- a/quasar.conf.js +++ b/quasar.conf.js @@ -17,9 +17,9 @@ const extendTypescriptToWebpack = (config) => { .set('@views', helpers.root('src/components/views/index.ts')) // .set('@views', helpers.root('src/components/views')) .set('@src', helpers.root('src')) - .set('@css', helpers.root('src/assets/css/*')) + .set('@css', helpers.root('src/statics/css/*')) .set('@icons', helpers.root('src/statics/icons/*')) - .set('@images', helpers.root('src/assets/images/*')) + .set('@images', helpers.root('src/statics/images/*')) .set('@classes', helpers.root('src/classes/index.ts')) .set('@utils', helpers.root('src/utils/index.ts')) .set('@utils', helpers.root('src/utils/*')) @@ -59,7 +59,7 @@ module.exports = function (ctx) { store: 'src/store/index.ts' }, // app plugins (/src/plugins) - plugins: ['i18n', 'axios', 'vee-validate', 'myconfig', 'local-storage', 'error-handler', 'globalroutines', 'vue-idb', 'dragula'], + plugins: ['i18n', 'axios', 'vee-validate', 'myconfig', 'local-storage', 'error-handler', 'globalroutines', 'vue-idb', 'dragula', 'guard'], css: [ 'app.styl' ], @@ -72,6 +72,12 @@ module.exports = function (ctx) { 'fontawesome' ], supportIE: false, + aliases: { + quasar: path.resolve(__dirname, '../node_modules/quasar-framework/'), + src: path.resolve(__dirname, '../src'), + statics: path.resolve(__dirname, '../src/statics'), + components: path.resolve(__dirname, '../src/components') + }, build: { showProgress: true, env: envparser(), @@ -180,7 +186,7 @@ module.exports = function (ctx) { pwa: { runtimeCaching: [ { - urlPattern: '/assets', + urlPattern: '/statics', handler: 'networkFirst' } ] @@ -189,7 +195,7 @@ module.exports = function (ctx) { pwa: { // runtimeCaching: [ // { - // urlPattern: '/assets', + // urlPattern: '/statics', // handler: 'networkFirst' // } // ], diff --git a/src-pwa/custom-service-worker.js b/src-pwa/custom-service-worker.js index b140498..b7fd3b4 100644 --- a/src-pwa/custom-service-worker.js +++ b/src-pwa/custom-service-worker.js @@ -8,8 +8,8 @@ console.log(' [ VER-0.0.27 ] _---------________------ PAO: this is my custom service worker'); -importScripts('../assets/js/idb.js'); -importScripts('../assets/js/storage.js'); +importScripts('../statics/js/idb.js'); +importScripts('../statics/js/storage.js'); importScripts('https://storage.googleapis.com/workbox-cdn/releases/3.0.0/workbox-sw.js'); //++Todo: Replace with local workbox.js @@ -206,7 +206,7 @@ if (workbox) { }); workbox.routing.registerRoute( - new RegExp(/.*\/(?:assets\/icons).*$/), + new RegExp(/.*\/(?:statics\/icons).*$/), workbox.strategies.cacheFirst({ cacheName: 'image-cache', plugins: [ @@ -258,9 +258,9 @@ if (workbox) { ); workbox.routing.registerRoute( - new RegExp(/.*\/(?:assets).*$/), + new RegExp(/.*\/(?:statics).*$/), workbox.strategies.cacheFirst({ - cacheName: 'assets', + cacheName: 'statics', plugins: [ new workbox.expiration.Plugin({ maxAgeSeconds: 10 * 24 * 60 * 60, diff --git a/src/assets/i18n.js b/src/assets/i18n.js deleted file mode 100644 index e4ae674..0000000 --- a/src/assets/i18n.js +++ /dev/null @@ -1,418 +0,0 @@ -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' - }, - 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' - }, - 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: 'dev\'essere una email valida', - errore_generico: 'Si prega di compilare correttamente i campi', - atleast: 'dev\'essere lungo almeno di', - complexity: 'deve contenere almeno 1 carattere minuscolo, 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', - } - }, - 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 alto', - 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: 'Nuova Versione!' - }, - connection: 'Connessione', - }, - 'esEs': { - 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' - }, - 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' - }, - 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: 'Entrar', - 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: 'Nueva Versión!' - }, - 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 constuction...', - myDescriz: '', - sottoTitoloApp: 'The first Real Social', - sottoTitoloApp2: 'Free, Fair and solidarity', - sottoTitoloApp3: 'Where the conscience and community help live' - }, - 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' - }, - 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: 'New Version!' - }, - connection: 'Conexión', - }, -}; - -export default messages; diff --git a/src/assets/images/freeplanet-logo-full.svg b/src/assets/images/freeplanet-logo-full.svg deleted file mode 100644 index b9c10df..0000000 --- a/src/assets/images/freeplanet-logo-full.svg +++ /dev/null @@ -1,1186 +0,0 @@ - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/assets/images/freeplanet.png b/src/assets/images/freeplanet.png deleted file mode 100644 index b5e10dbbf6c395dc6195dc61bb6087c4f40d7a84..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40476 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 diff --git a/src/assets/js/fetch.js b/src/assets/js/fetch.js deleted file mode 100644 index 6bac6b3..0000000 --- a/src/assets/js/fetch.js +++ /dev/null @@ -1,461 +0,0 @@ -(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/assets/js/idb.js b/src/assets/js/idb.js deleted file mode 100644 index 9835513..0000000 --- a/src/assets/js/idb.js +++ /dev/null @@ -1,311 +0,0 @@ -'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/assets/js/material.min.js b/src/assets/js/material.min.js deleted file mode 100644 index 46524fb..0000000 --- a/src/assets/js/material.min.js +++ /dev/null @@ -1,10 +0,0 @@ -/** - * 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;s0&&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/assets/js/promise.js b/src/assets/js/promise.js deleted file mode 100644 index dd5e735..0000000 --- a/src/assets/js/promise.js +++ /dev/null @@ -1,372 +0,0 @@ -/** - * 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/assets/js/storage.js b/src/assets/js/storage.js deleted file mode 100644 index 5dc436f..0000000 --- a/src/assets/js/storage.js +++ /dev/null @@ -1,126 +0,0 @@ -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/components/Header.vue b/src/components/Header.vue index bf4a524..adc4926 100644 --- a/src/components/Header.vue +++ b/src/components/Header.vue @@ -237,10 +237,10 @@ } public selectOpLang = [ - { label: 'English', icon: 'fa-flag-us', value: 'enUs', image: '../assets/images/gb.png', short: 'EN' }, - // { label: 'German', icon: 'fa-flag-de', value: 'de', image: '../assets/images/de.png', short: 'DE' }, - { label: 'Italiano', icon: 'fa-facebook', value: 'it', image: '../assets/images/it.png', short: 'IT' }, - { label: 'Español', icon: 'fa-flag-es', value: 'esEs', image: '../assets/images/es.png', short: 'ES' } + { label: 'English', icon: 'fa-flag-us', value: 'enUs', image: '../statics/images/gb.png', short: 'EN' }, + // { label: 'German', icon: 'fa-flag-de', value: 'de', image: '../statics/images/de.png', short: 'DE' }, + { label: 'Italiano', icon: 'fa-facebook', value: 'it', image: '../statics/images/it.png', short: 'IT' }, + { label: 'Español', icon: 'fa-flag-es', value: 'esEs', image: '../statics/images/es.png', short: 'ES' } ] @@ -329,7 +329,7 @@ // dynamic import, so loading on demand only import(`quasar-framework/i18n/${mylangtopass}`).then(lang => { this.$q.i18n.set(lang.default) - import(`src/assets/i18n`).then(function () { + import(`src/statics/i18n`).then(function () { }) }) } diff --git a/src/components/logo/logo.ts b/src/components/logo/logo.ts index c70501e..5c43ec4 100644 --- a/src/components/logo/logo.ts +++ b/src/components/logo/logo.ts @@ -13,7 +13,7 @@ export default class Logo extends Vue { logoimg: string = '' created() { - this.logoimg = 'assets/images/' + process.env.LOGO_REG + this.logoimg = 'statics/images/' + process.env.LOGO_REG this.animate() } diff --git a/src/components/offline/offline.ts b/src/components/offline/offline.ts index 455a3a0..1a3cd52 100644 --- a/src/components/offline/offline.ts +++ b/src/components/offline/offline.ts @@ -13,7 +13,7 @@ export default class Offline extends Vue { logoimg: string = '' created() { - this.logoimg = '/assets/images/' + process.env.LOGO_REG + this.logoimg = '/statics/images/' + process.env.LOGO_REG this.animate() } diff --git a/src/components/todos/todo/todo.ts b/src/components/todos/todo/todo.ts index 59c8f7d..fc9671f 100644 --- a/src/components/todos/todo/todo.ts +++ b/src/components/todos/todo/todo.ts @@ -69,7 +69,7 @@ export default class Todo extends Vue { } set showtype (value) { - // console.log('showtype', value) + console.log('showtype', value) GlobalStore.mutations.setShowType(value) } diff --git a/src/globalroutines/util.js b/src/globalroutines/util.js index 4e50d98..565e4c5 100644 --- a/src/globalroutines/util.js +++ b/src/globalroutines/util.js @@ -1,5 +1,5 @@ import { UserStore } from "../store/Modules"; -import messages from "../assets/i18n"; +import messages from "../statics/i18n"; function translate(params) { let msg = params.split('.') diff --git a/src/index.template.html b/src/index.template.html index b50f0e9..ba11dae 100644 --- a/src/index.template.html +++ b/src/index.template.html @@ -13,12 +13,12 @@ - - - - - - + + + + + + diff --git a/src/middleware/auth.js b/src/middleware/auth.js new file mode 100644 index 0000000..b01c5cf --- /dev/null +++ b/src/middleware/auth.js @@ -0,0 +1,12 @@ +import { tools } from "../store/Modules/tools"; + +import { RouteNames } from '../router/route-names' + +export default function auth({ next, router }) { + const tok = tools.getItemLS(tools.localStorage.token) + if (!tok) { + return router.push({ name: RouteNames.login }); + } + + return next(); +} diff --git a/src/plugins/guard.js b/src/plugins/guard.js index 1dc69bc..45dde93 100644 --- a/src/plugins/guard.js +++ b/src/plugins/guard.js @@ -8,8 +8,47 @@ export default ({ app, router, store, Vue }) => { // *** Per non permettere di accedere alle pagine in cui è necessario essere Loggati ! *** // ****************************************** - /* + // Creates a `nextMiddleware()` function which not only +// runs the default `next()` callback but also triggers +// the subsequent Middleware function. + function nextFactory(context, middleware, index) { + const subsequentMiddleware = middleware[index] + // If no subsequent Middleware exists, + // the default `next()` callback is returned. + if (!subsequentMiddleware) return context.next + + return (...parameters) => { + // Run the default Vue Router `next()` callback first. + context.next(...parameters) + // Then run the subsequent Middleware with a new + // `nextMiddleware()` callback. + const nextMiddleware = nextFactory(context, middleware, index + 1) + subsequentMiddleware({ ...context, next: nextMiddleware }) + }; + } + router.beforeEach((to, from, next) => { + if (to.meta.middleware) { + const middleware = Array.isArray(to.meta.middleware) + ? to.meta.middleware + : [to.meta.middleware]; + + const context = { + from, + next, + router, + to, + }; + const nextMiddleware = nextFactory(context, middleware, 1) + + return middleware[0]({ ...context, next: nextMiddleware }) + } + + return next() + }) + + + /*router.beforeEach((to, from, next) => { var accessToken = store.state.session.userSession.accessToken // ESTANDO LOGEADO if (accessToken) { @@ -45,6 +84,6 @@ export default ({ app, router, store, Vue }) => { next('/') } } - }) - */ + })*/ + } diff --git a/src/plugins/i18n.js b/src/plugins/i18n.js index 60a1a0a..8ca36c0 100644 --- a/src/plugins/i18n.js +++ b/src/plugins/i18n.js @@ -1,6 +1,6 @@ // src/plugins/i18n.js import VueI18n from 'vue-i18n'; -import messages from 'src/assets/i18n'; +import messages from 'src/statics/i18n'; import { tools } from "../store/Modules/tools"; export default ({ app, store, Vue }) => { diff --git a/src/root/home/home.scss b/src/root/home/home.scss index 6c5e9fa..365d49a 100644 --- a/src/root/home/home.scss +++ b/src/root/home/home.scss @@ -3,7 +3,7 @@ } .landing { - background: #000 url(../../assets/images/cover.jpg) no-repeat 50% fixed; + background: #000 url(../../statics/images/cover.jpg) no-repeat 50% fixed; background-size: cover } @@ -142,7 +142,7 @@ body.mobile .landing:before { right: 0; bottom: 0; z-index: -1; - background: #000 url(../../assets/images/cover.jpg) 50%; + background: #000 url(../../statics/images/cover.jpg) 50%; background-size: cover } diff --git a/src/root/home/home.ts b/src/root/home/home.ts index 4579132..20508b3 100644 --- a/src/root/home/home.ts +++ b/src/root/home/home.ts @@ -112,7 +112,7 @@ export default class Home extends Vue { options = { body: 'You successfully subscribed to our Notification service!', icon: '/statics/icons/app-icon-96x96.png', - image: '/assets/images/sf-boat.jpg', + image: '/statics/images/sf-boat.jpg', dir: 'ltr', lang: 'enUs', // BCP 47, vibrate: [100, 50, 200], @@ -169,7 +169,7 @@ export default class Home extends Vue { options = { body: mythis.$t('notification.subscribed'), icon: '/statics/icons/android-chrome-192x192.png', - image: '/assets/images/freeplanet.png', + image: '/statics/images/freeplanet.png', dir: 'ltr', lang: 'enUs', // BCP 47, vibrate: [100, 50, 200], diff --git a/src/root/home/home.vue b/src/root/home/home.vue index 6a97d94..5c6cb7c 100644 --- a/src/root/home/home.vue +++ b/src/root/home/home.vue @@ -18,16 +18,6 @@
{{$t('msg.sottoTitoloApp3')}}
-
- - - - -
+ + + + diff --git a/src/root/home/old-home.vue b/src/root/home/old-home.vue index efdb3be..a80a15e 100644 --- a/src/root/home/old-home.vue +++ b/src/root/home/old-home.vue @@ -50,7 +50,7 @@ - + diff --git a/src/router/route-config.ts b/src/router/route-config.ts index e789834..382d662 100644 --- a/src/router/route-config.ts +++ b/src/router/route-config.ts @@ -1,54 +1,59 @@ import { RouteConfig as VueRouteConfig } from 'vue-router' import { RouteNames } from './route-names' +import { tools } from '@src/store/Modules/tools' + +import auth from '../middleware/auth' + export const RouteConfig: VueRouteConfig[] = [ { - component: () => import('@/root/home/home.vue'), - name: RouteNames.home, path: '/', - meta: { name: 'Home' } + name: RouteNames.home, + component: () => import('@/root/home/home.vue') }, { path: '/signup', - component: () => import('@/views/login/signup/signup.vue'), - meta: { name: 'Registration' } + name: 'Registration', + component: () => import('@/views/login/signup/signup.vue') }, { path: '/signin', - component: () => import('@/views/login/signin/signin.vue'), - meta: { name: 'Login' } + name: RouteNames.login, + component: () => import('@/views/login/signin/signin.vue') }, { path: '/vreg', - component: () => import('@/views/login/vreg/vreg.vue'), - meta: { name: 'Verify Reg' } + name: 'Verify Reg', + component: () => import('@/views/login/vreg/vreg.vue') }, { path: '/todo/:category', + name: 'Todos', component: () => import('@/components/todos/todo/todo.vue'), - // props: { category: 'personal' }, - meta: { name: 'Todos' } + meta: { + middleware: [auth] + } }, { path: '/category', - component: () => import('@/components/categories/category/category.vue'), - meta: { name: 'Categories' } + name: 'category', + component: () => import('@/components/categories/category/category.vue') }, { path: '/admin/cfgserv', - component: () => import('@/components/admin/cfgServer/cfgServer.vue'), - meta: { name: 'Categories' } + name: 'cfgserv', + component: () => import('@/components/admin/cfgServer/cfgServer.vue') }, { path: '/admin/testp1/:category', - component: () => import('@/components/admin/testp1/testp1.vue'), - meta: { name: 'Categories' } + name: 'Categories', + component: () => import('@/components/admin/testp1/testp1.vue') }, { path: '/offline', - component: () => import('@/components/offline/offline.vue'), - meta: { name: 'Offline' } + name: 'Offline', + component: () => import('@/components/offline/offline.vue') } /* { @@ -74,4 +79,3 @@ export const RouteConfig: VueRouteConfig[] = [ meta: { name: 'Embeeded' } }*/ ] - diff --git a/src/store/Api/Inst-Pao.ts b/src/store/Api/Inst-Pao.ts index cb1b04c..328ba05 100644 --- a/src/store/Api/Inst-Pao.ts +++ b/src/store/Api/Inst-Pao.ts @@ -4,7 +4,8 @@ import * as Types from '@src/store/Api/ApiTypes' async function sendRequest(url: string, method: string, mydata: any) { - console.log('sendRequest', method, url) + if (!process.env.DEBUG) + console.log('sendRequest', method, url) let request if (method === 'GET') diff --git a/src/store/Api/Instance.ts b/src/store/Api/Instance.ts index a67cdce..a916607 100644 --- a/src/store/Api/Instance.ts +++ b/src/store/Api/Instance.ts @@ -17,12 +17,14 @@ export const axiosInstance: AxiosInstance = axios.create({ axiosInstance.interceptors.response.use( (response) => { - console.log(response) + if (process.env.DEBUG === '1') + console.log(response) return response }, (error) => { if (error.response) { - console.log(error.response.status) + if (process.env.DEBUG === '1') + console.log(error.response.status) console.log('Request Error: ', error.response) } return Promise.reject(error) diff --git a/src/store/Modules/GlobalStore.ts b/src/store/Modules/GlobalStore.ts index 5a79b45..57598ba 100644 --- a/src/store/Modules/GlobalStore.ts +++ b/src/store/Modules/GlobalStore.ts @@ -7,7 +7,7 @@ import translate from './../../globalroutines/util' import urlBase64ToUint8Array from '../../js/utility' -import messages from '../../assets/i18n' +import messages from '../../statics/i18n' import { GlobalStore, Todos, UserStore } from '@store' import globalroutines from './../../globalroutines/index' import Api from '@api' @@ -62,11 +62,15 @@ async function getConfig(id) { async function getstateConnSaved() { const config = await getConfig(costanti.CONFIG_ID_CFG) console.log('config', config) - if (config.length > 1) { - const cfgstateconn = config[1] - return cfgstateconn.stateconn + if (config) { + if (config.length > 1) { + const cfgstateconn = config[1] + return cfgstateconn.stateconn + } else { + return 'online' + } } else { - return 'online' + return 'offline' } } @@ -84,12 +88,12 @@ namespace Getters { 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 => id => { - const config = state.arrConfig.find(item => item._id === id) + const getConfigStringbyId = b.read(state => params => { + const config = state.arrConfig.find(item => item._id === params.id) if (config) { return config.value } else { - return '' + return params.default } }, 'getConfigStringbyId') @@ -199,15 +203,18 @@ namespace Mutations { } function setShowType(state: IGlobalState, showtype: number) { - // console.log('setShowType', showtype) + console.log('setShowType', showtype) const config = Getters.getters.getConfigbyId(costanti.CONFIG_ID_SHOW_TYPE_TODOS) - // console.log('config', config) + console.log('config', config) if (config) { config.value = String(showtype) Todos.state.showtype = parseInt(config.value) - // console.log('Todos.state.showtype', Todos.state.showtype) - GlobalStore.mutations.saveConfig({ _id: costanti.CONFIG_ID_SHOW_TYPE_TODOS, value: String(showtype) }) + } else { + Todos.state.showtype = showtype } + console.log('Todos.state.showtype', Todos.state.showtype) + GlobalStore.mutations.saveConfig({ _id: costanti.CONFIG_ID_SHOW_TYPE_TODOS, value: String(showtype) }) + } export const mutations = { diff --git a/src/store/Modules/Todos.ts b/src/store/Modules/Todos.ts index 23af60e..5eea7ae 100644 --- a/src/store/Modules/Todos.ts +++ b/src/store/Modules/Todos.ts @@ -404,7 +404,8 @@ namespace Actions { return sendSwMsgIfAvailable() .then(something => { if (something) { - console.log('something') + if (process.env.DEBUG === '1') + console.log('something') // Refresh data return waitAndRefreshData(context) } @@ -482,13 +483,13 @@ namespace Actions { // console.log('PRIMA showtype = ', state.showtype) - state.showtype = parseInt(GlobalStore.getters.getConfigStringbyId(costanti.CONFIG_ID_SHOW_TYPE_TODOS)) + state.showtype = parseInt(GlobalStore.getters.getConfigStringbyId({id: costanti.CONFIG_ID_SHOW_TYPE_TODOS, default: costanti.ShowTypeTask.SHOW_LAST_N_COMPLETED })) // console.log('showtype = ', state.showtype) // console.log('ARRAY TODOS = ', state.todos) - - console.log('dbLoadTodo', 'state.todos', state.todos, 'state.categories', state.categories) + if (process.env.DEBUG === '1') + console.log('dbLoadTodo', 'state.todos', state.todos, 'state.categories', state.categories) return res }) @@ -499,7 +500,8 @@ namespace Actions { }) if (ris.status !== 200) { - console.log('ris.status', ris.status) + if (process.env.DEBUG === '1') + console.log('ris.status', ris.status) if (ris.status === serv_constants.RIS_CODE__HTTP_FORBIDDEN_INVALID_TOKEN) { consolelogpao('UNAUTHORIZING... TOKEN EXPIRED... !! ') } else { diff --git a/src/store/Modules/UserStore.ts b/src/store/Modules/UserStore.ts index bccf12e..696ab60 100644 --- a/src/store/Modules/UserStore.ts +++ b/src/store/Modules/UserStore.ts @@ -367,7 +367,7 @@ namespace Actions { } async function signin(context, authData: ISigninOptions) { - console.log('LOGIN signin') + // console.log('LOGIN signin') // console.log('MYLANG = ' + state.lang) @@ -406,8 +406,8 @@ namespace Actions { } // console.log('PASSO 4') - - console.log(usertosend) + if (process.env.DEBUG === '1') + console.log(usertosend) Mutations.mutations.setServerCode(tools.CALLING) diff --git a/src/views/login/signin/signin.ts b/src/views/login/signin/signin.ts index 43aa868..3028988 100644 --- a/src/views/login/signin/signin.ts +++ b/src/views/login/signin/signin.ts @@ -147,11 +147,16 @@ export default class Signin extends Vue { return } - this.$q.loading.show({ message: this.$t('login.incorso') }) + let msg = this.$t('login.incorso') + if (process.env.DEBUG) + msg += ' ' + process.env.MONGODB_HOST + this.$q.loading.show({ message: msg}) // disable Button Login: this.iswaitingforRes = true - console.log(this.signin) + if (process.env.DEBUG) + console.log('this.signin', this.signin) + UserStore.actions.signin(this.signin) .then((riscode) => { // console.log('signin FINITO CALL: riscode=', riscode) diff --git a/tsconfig.json b/tsconfig.json index 829275f..145a20a 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -25,10 +25,10 @@ "paths": { "@src/*": ["./*"], "@components": ["./components/index.ts"], - "@css/*": ["./assets/css/*"], + "@css/*": ["./statics/css/*"], "@icons/*": ["./statics/icons/*"], - "@images/*": ["./assets/images/*"], - "@js/*": ["./assets/js/*"], + "@images/*": ["./statics/images/*"], + "@js/*": ["./statics/js/*"], "@classes": ["./classes/index.ts"], "@utils/*": ["./utils/*"], "@validators": ["./utils/validators.ts"], diff --git a/yarn.lock b/yarn.lock index 3afa1a7..223b6bb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10189,9 +10189,9 @@ optimist@^0.6.1: minimist "~0.0.1" wordwrap "~0.0.2" -optimize-css-assets-webpack-plugin@5.0.1: +optimize-css-statics-webpack-plugin@5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.1.tgz#9eb500711d35165b45e7fd60ba2df40cb3eb9159" + resolved "https://registry.yarnpkg.com/optimize-css-statics-webpack-plugin/-/optimize-css-statics-webpack-plugin-5.0.1.tgz#9eb500711d35165b45e7fd60ba2df40cb3eb9159" integrity sha512-Rqm6sSjWtx9FchdP0uzTQDc7GXDKnwVEGoSxjezPkzMewx7gEWE9IMUYKmigTRC4U3RaNSwYVnUDLuIdtTpm0A== dependencies: cssnano "^4.1.0" @@ -11751,7 +11751,7 @@ quasar-cli@^0.17.23: net "1.0.2" node-loader "0.6.0" opn "5.3.0" - optimize-css-assets-webpack-plugin "5.0.1" + optimize-css-statics-webpack-plugin "5.0.1" ouch "2.0.0" postcss-loader "3.0.0" postcss-rtl "1.3.2"