diff --git a/.env.development b/.env.development index d04ef8a..180af45 100644 --- a/.env.development +++ b/.env.development @@ -1,4 +1,4 @@ -APP_VERSION="0.0.45" +APP_VERSION="0.0.47" SERVICE_WORKER_FILE='service-worker.js' APP_ID='1' APP_URL='https://freeplanet.app' @@ -7,7 +7,7 @@ LANG_DEFAULT='it' PAO_APP_ID='KKPPAA5KJK435J3KSS9F9D8S9F8SD98F9SDF' MASTER_KEY='KKPPSS5KJK435J3KSS9F9D8S9F8SD3CR3T' MONGODB_HOST='http://localhost:3000' -LOGO_REG='freeplanet-logo-full.svg' +LOGO_REG="freeplanet-logo-full.svg" TEST_EMAIL='paolo.arena77@gmail.com' TEST_USERNAME='paoloar77' TEST_PASSWORD='mypassword@1A' diff --git a/helpers.js b/helpers.js new file mode 100644 index 0000000..309db6c --- /dev/null +++ b/helpers.js @@ -0,0 +1,10 @@ +const path = require('path'); + +const ROOT = path.resolve(__dirname, '.'); + +function root(args) { + args = Array.prototype.slice.call(arguments, 0); + return path.join.apply(path, [ROOT].concat(args)); +} + +exports.root = root; diff --git a/package-lock.json b/package-lock.json index 99029ba..2a3e411 100644 --- a/package-lock.json +++ b/package-lock.json @@ -22113,7 +22113,7 @@ }, "serve-static": { "version": "1.13.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", + "resolved": "https://registry.npmjs.org/serve-statics/-/serve-static-1.13.2.tgz", "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", "dev": true, "requires": { diff --git a/quasar.conf.js b/quasar.conf.js index 49ee8e3..e4e9ede 100644 --- a/quasar.conf.js +++ b/quasar.conf.js @@ -1,7 +1,7 @@ // Configuration for your app const path = require('path'); - +const helpers = require('./helpers'); const webpack = require('webpack') const envparser = require('./config/envparser') @@ -12,24 +12,24 @@ const extendTypescriptToWebpack = (config) => { .add('.ts', '.js', '.vue') config.resolve .alias - .set('@components', path.resolve(__dirname, 'src/components/index.ts')) - // .set('@components', path.resolve(__dirname, 'src/components')) - .set('@views', path.resolve(__dirname, 'src/components/views/index.ts')) - // .set('@views', path.resolve(__dirname, 'src/components/views')) - .set('@src', path.resolve(__dirname, 'src')) - .set('@icons', path.resolve(__dirname, 'src/assets/icons')) - .set('@images', path.resolve(__dirname, 'src/assets/images')) - .set('@classes', path.resolve(__dirname, 'src/classes/index.ts')) - .set('@utils', path.resolve(__dirname, 'src/utils/index.ts')) - .set('@utils', path.resolve(__dirname, 'src/utils/*')) - .set('@css', path.resolve(__dirname, 'src/styles/variables.scss')) - .set('@router', path.resolve(__dirname, 'src/router/index.ts')) - .set('@validators', path.resolve(__dirname, 'src/utils/validators.ts')) - .set('@api', path.resolve(__dirname, 'src/store/Api/index.ts')) - .set('@paths', path.resolve(__dirname, 'src/store/Api/ApiRoutes.ts')) - .set('@types', path.resolve(__dirname, 'src/typings/index.ts')) - .set('@store', path.resolve(__dirname, 'src/store/index.ts')) - .set('@modules', path.resolve(__dirname, 'src/store/Modules/index.ts')) + .set('@components', helpers.root('src/components/index.ts')) + // .set('@components', helpers.root('src/components')) + .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('@icons', helpers.root('src/statics/icons/*')) + .set('@images', helpers.root('src/assets/images/*')) + .set('@classes', helpers.root('src/classes/index.ts')) + .set('@utils', helpers.root('src/utils/index.ts')) + .set('@utils', helpers.root('src/utils/*')) + .set('@router', helpers.root('src/router/index.ts')) + .set('@validators', helpers.root('src/utils/validators.ts')) + .set('@api', helpers.root('src/store/Api/index.ts')) + .set('@paths', helpers.root('src/store/Api/ApiRoutes.ts')) + .set('@types', helpers.root('src/typings/index.ts')) + .set('@store', helpers.root('src/store/index.ts')) + .set('@modules', helpers.root('src/store/Modules/index.ts')) config.module .rule('typescript') .test(/\.tsx?$/) @@ -87,8 +87,8 @@ module.exports = function (ctx) { config.resolve .alias .set('~', __dirname) - .set('@', path.resolve(__dirname, 'src')) - // .set('env', path.resolve(__dirname, 'config/helpers/env.js')) + .set('@', helpers.root('src')) + // .set('env', helpers.root('config/helpers/env.js')) config.module .rule('template-engine') .test(/\.pug$/) @@ -180,7 +180,7 @@ module.exports = function (ctx) { pwa: { runtimeCaching: [ { - urlPattern: '/statics', + urlPattern: '/assets', handler: 'networkFirst' } ] @@ -189,7 +189,7 @@ module.exports = function (ctx) { pwa: { // runtimeCaching: [ // { - // urlPattern: '/statics', + // urlPattern: '/assets', // handler: 'networkFirst' // } // ], diff --git a/src-pwa/custom-service-worker.js b/src-pwa/custom-service-worker.js index 0dc793e..b140498 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('../statics/js/idb.js'); -importScripts('../statics/js/storage.js'); +importScripts('../assets/js/idb.js'); +importScripts('../assets/js/storage.js'); importScripts('https://storage.googleapis.com/workbox-cdn/releases/3.0.0/workbox-sw.js'); //++Todo: Replace with local workbox.js @@ -122,24 +122,50 @@ if (workbox) { if (res.status === 200) { const clonedRes = res.clone(); - return clearAllData('todos') + // console.log('1) clearAllData(categories)') + return clearAllData('categories') .then(() => { - return clonedRes + // console.log('2) clearAllData(todos)') + return clearAllData('todos') + .then(() => { + // console.log('3) ....return clonedRes') + return clonedRes + }) }) } }) .then((clonedRes) => { + // console.log(' 3) ') if (clonedRes !== undefined) return clonedRes.json(); return null }) - .then(async data => { + .then(data => { + // console.log(' 4) data = ', data) if (data) { if (data.todos) { - console.log('***********************+++++++++++++++++++++++++++++++++++++++++++++++++++********** Records TODOS Received from Server [', data.todos.length, 'record]', data.todos) - for (let key in data.todos) { - await writeData('todos', data.todos[key]) + + let promiseChain = Promise.resolve(); + + console.log('*********+++++++++++++++++********** Records TODOS Received from Server [', data.todos.length, 'record]', data.todos) + + for (let cat in data.categories) { + promiseChain = promiseChain.then(() => { + return writeData('categories', { _id: cat, valore: data.categories[cat] } ) + }) } + + for (let indrecCat in data.todos) { + for (let indrec in data.todos[indrecCat]) { + promiseChain = promiseChain.then(() => { + return writeData('todos', data.todos[indrecCat][indrec]) + }) + } + } + + // console.log('promiseChain', promiseChain) + + return promiseChain } } }) @@ -180,7 +206,7 @@ if (workbox) { }); workbox.routing.registerRoute( - new RegExp(/.*\/(?:statics\/icons).*$/), + new RegExp(/.*\/(?:assets\/icons).*$/), workbox.strategies.cacheFirst({ cacheName: 'image-cache', plugins: [ @@ -232,9 +258,9 @@ if (workbox) { ); workbox.routing.registerRoute( - new RegExp(/.*\/(?:statics).*$/), + new RegExp(/.*\/(?:assets).*$/), workbox.strategies.cacheFirst({ - cacheName: 'statics', + cacheName: 'assets', plugins: [ new workbox.expiration.Plugin({ maxAgeSeconds: 10 * 24 * 60 * 60, diff --git a/src/App.ts b/src/App.ts index 749a7ef..1b46323 100644 --- a/src/App.ts +++ b/src/App.ts @@ -59,18 +59,18 @@ export default class App extends Vue { }) if (chiamaautologin) { - console.log('CHIAMA autologin_FromLocalStorage') + // console.log('CHIAMA autologin_FromLocalStorage') UserStore.actions.autologin_FromLocalStorage() .then((loadstorage) => { if (loadstorage) { if (UserStore.state.lang !== '') { - console.log('SETLOCALE :', this.$i18n.locale) + // console.log('SETLOCALE :', this.$i18n.locale) this.$i18n.locale = UserStore.state.lang // Set Lang } else { UserStore.mutations.setlang(this.$i18n.locale) } - console.log('lang CARICATO:', this.$i18n.locale) + // console.log('lang CARICATO:', this.$i18n.locale) globalroutines(this, 'loadapp', '') // this.$router.replace('/') diff --git a/src/App.vue b/src/App.vue index a43de50..c5327a0 100644 --- a/src/App.vue +++ b/src/App.vue @@ -1,6 +1,6 @@ diff --git a/src/components/todos/SubMenus/SubMenus.ts b/src/components/todos/SubMenus/SubMenus.ts index 5ab60ea..0eab2c2 100644 --- a/src/components/todos/SubMenus/SubMenus.ts +++ b/src/components/todos/SubMenus/SubMenus.ts @@ -2,7 +2,7 @@ import Vue from 'vue' import { Component, Prop } from 'vue-property-decorator' import { ITodo } from '../../../model/index' -import { rescodes } from '@src/store/Modules/rescodes' +import { tools } from '@src/store/Modules/tools' import { UserStore } from '@store' // Doesn't exist in quasar this ? error TS2305 @@ -16,7 +16,7 @@ import { UserStore } from '@store' }) export default class SubMenus extends Vue { - public selectPriority: [] = rescodes.selectPriority[UserStore.state.lang] + public selectPriority: [] = tools.selectPriority[UserStore.state.lang] @Prop({ required: false }) menuPopupTodo: any[] @Prop({ required: false }) itemtodo: ITodo @@ -47,7 +47,7 @@ export default class SubMenus extends Vue { } create () { - this.selectPriority = rescodes.selectPriority[UserStore.state.lang] + this.selectPriority = tools.selectPriority[UserStore.state.lang] console.log('CREAZIONE') } diff --git a/src/components/todos/todo/todo.ts b/src/components/todos/todo/todo.ts index d5b80f6..6c9e657 100644 --- a/src/components/todos/todo/todo.ts +++ b/src/components/todos/todo/todo.ts @@ -2,28 +2,18 @@ import Vue from 'vue' import { Component, Watch } from 'vue-property-decorator' import { SingleTodo } from '../SingleTodo' -import { ITodo } from '@src/model' +import { ITodo, ITodosState, IDrag, IGlobalState, ICfgServer } from '@src/model' -import { rescodes } from '../../../store/Modules/rescodes' +import { tools } from '../../../store/Modules/tools' import { Todos } from '@store' import { UserStore } from '@store' -import objectId from '../../../js/objectId.js' - -import _ from 'lodash' - - // _.cloneDeep( Per clonare un oggetto -import '../../../statics/css/dragula.css' +import { Getter } from 'vuex-class' +const namespace: string = 'Todos' -import globalroutines from '../../../globalroutines/index' - -import $ from 'jquery' -import Api from '@api' -import { Getter, State } from 'vuex-class' -import { GetterTree } from 'vuex' @Component({ @@ -31,77 +21,66 @@ import { GetterTree } from 'vuex' }) export default class Todo extends Vue { $q: any - filter: boolean = false title: string = '' todotop: string = '' todobottom: string = '' - todos_arr: ITodo[] = [] - prevRecords: ITodo[] = [] drag: boolean = true startpos: number = 0 listPriorityLabel: number[] = [] arrPrior: number[] = [] - prioritySel: number = 0 itemDragStart: any = null - itemDragEnd: any = null - selrowid: number = 0 polling = null - mytypetransgroup: string = '' // 'flip-list' - tmpstrTodos: string = '' loadDone: boolean = false - public dragging: number - public itemdrag: any = {} + public inddragging: number = -1 public service: any public actualMaxPosition: number = 15 public scrollable = true - public compKey1: number = 0 - public compKey2: number = 0 - public compKey3: number = 0 - // public priorcomplet: number[] = [] - public arrFiltered: any [] = [] - - - fieldtochange: String [] = ['descr', 'completed', 'category', 'expiring_at', 'priority', 'id_prev', 'id_next', 'pos', 'enableExpiring', 'progress'] - - - // @Prop({ required: false }) category: string + public categoryAtt: string = '' $refs: { single: SingleTodo[] } - @Watch('drag') changedrag() { - console.log('drag = ' + this.drag) - } - - // @Getter - - - @Watch('$route', { immediate: true, deep: true }) - onUrlChange(newVal: any) { - // Some action - } + @Getter('todos_dacompletare', { namespace }) + public todos_dacompletare: (state: ITodosState, category: string) => ITodo[] + @Getter('todos_completati', { namespace }) + public todos_completati: (state: ITodosState, category: string) => ITodo[] @Watch('$route.params.category') changecat() { - // console.log('changecat') - // this.mytypetransgroup = '' - this.updatetable(false, '$route.params.category').then(() => { - - const mythis = this - setTimeout(function () { - // mythis.mytypetransgroup = 'crossfade' - }, 1000) - - }) + this.categoryAtt = this.$route.params.category } - // Computed: - get todos_changed() { - return Todos.state.todos_changed + get doneTodosCount() { + return Todos.getters.doneTodosCount(this.categoryAtt) } + get TodosCount() { + return Todos.getters.TodosCount(this.categoryAtt) + } + + get todos_vista() { + let mystr = '' + const arr = Todos.getters.todos_dacompletare(this.categoryAtt) + for (let ind in arr) { + mystr += this.getstrelem(arr[ind]) + '\n' + } + + return mystr + '' + + } + + // get mytodos_dacompletare() { + // return todos_dacompletare(this.categoryAtt) + // } + + + // @Watch('$route', { immediate: true, deep: true }) + // onUrlChange(newVal: any) { + // // Some action + // } + // Computed: get reload_fromServer() { return Todos.state.reload_fromServer @@ -111,211 +90,66 @@ export default class Todo extends Vue { Todos.state.reload_fromServer = value } - // Computed: - get showingDataTodo() { - // return this.todos_arr.slice(0, this.actualMaxPosition) - return this.arrFiltered - } - - - @Watch('todos_changed', { immediate: true, deep: true }) - changetodos_changed(value: number, oldValue: number) { - - // this.$q.notify('Changed...') - - if ((value > 1) && (this.loadDone)) { - // console.log('Todos.state.todos_changed CHANGED!', value, oldValue) - this.updatetable(true, 'todos_changed') - } - } - - @Watch('reload_fromServer', { immediate: true }) - reload_fromServer_changed(value: number, oldValue: number) { - if (value > 0) { - // console.log('reload_fromServer_changed!', value, oldValue) - // if (value) { - Todos.actions.dbLoadTodo(false) - .then(() => { - // return Todos.actions.updatefromIndexedDbToStateTodo() - }) - } - // } - } - - - get testPao() { - return Todos.state.testpao - } - - @Watch('testPao', { immediate: true, deep: true }) - changedTestpao(value: string, oldValue: string) { - // console.log('testpao CHANGED', value, oldValue) - // this.updatetable(true, 'testPao') - } - - isTodoByElem(elem) { - return elem.descr.slice(-1) !== ':' - } - - getArrTodos() { - - let mystr = '' - let mythis = this - - mythis.tmpstrTodos = '' - return globalroutines(null, 'readall', 'todos', null) - .then(function (alldata) { - const myrecs = [...alldata] - - myrecs.forEach(rec => { - mystr = mystr + rec.descr + rec.completed + '] [' - }) - - mythis.tmpstrTodos = 'TODOS: ' + mystr - }) - } - - setArrTodos() { - - let mystr = '' - let mythis = this - - mythis.tmpstrTodos = '' - return globalroutines(null, 'write', 'todos', this.todos_arr[0]) - .then(function (alldata) { - mythis.getArrTodos() - }) - } - - getCategory() { - return this.$route.params.category - // return this.category - } - - change(param) { - console.log('Change... ' + param) - } - getmyid(id) { return 'row' + id } - getrefbyid(id) { - return 'single' + id - } - - - getelem(indelem, arr: ITodo[] = this.todos_arr) { - return (indelem >= 0) && (indelem < arr.length) ? arr[indelem] : null - } - - getLastElem() { - if (this.todos_arr.length > 0) - return this.todos_arr[this.todos_arr.length - 1] - else - return null - } - - onStart() { this.startpos = 0 this.itemDragStart = null } - updateLinkedList(drag: boolean, init: boolean, arr: ITodo[] = this.todos_arr) { - - // console.log('updateLinkedList', this.todos_arr) - - let idprev = '' - let idnext = '' - let pos = 1 - if (arr.length > 0) { - idprev = arr[0].id_prev - idnext = arr[0].id_next - } - arr.forEach((elem, index) => { - if (index === 0) { - idprev = rescodes.LIST_START - } else { - const elemprev = this.getelem(index - 1, arr) - idprev = elemprev._id - } - if (index === arr.length - 1) { - idnext = rescodes.LIST_END - } else { - const elemnext = this.getelem(index + 1, arr) - idnext = elemnext._id - } - - // elem.modified = ((elem.id_prev !== idprev) || (elem.id_next !== idnext) || (elem.pos !== pos)) ? true : elem.modified - // elem.modified = elem.pos !== pos ? true : elem.modified - - elem.id_prev = idprev - elem.id_next = idnext - if (elem.pos !== pos) { - elem.modified = true - elem.pos = pos - } - - if (elem.modified) - console.log('MODIFICATO QUIIIIIII', elem.descr, elem.pos, pos, elem.id_prev, elem.id_next) - - if (init) { - elem.modified = false - } - - pos++ - - // this.logelem('updateLinked', elem) - - }) - } logelem(mystr, elem) { - console.log(mystr, 'elem [', elem._id, '] ', elem.descr, ' Pr(', this.getPriorityByInd(elem.priority), ') [', elem.id_prev, '-', elem.id_next, '] modif=', elem.modified) + console.log(mystr, 'elem [', elem._id, '] ', elem.descr, ' Pr(', this.getPriorityByInd(elem.priority), ') [', elem.id_prev, '] modif=', elem.modified) } - getPriorityToSet(ind1, ind2) { - let elem1 = this.getelem(ind1) - let elem2 = this.getelem(ind2) - - if ((elem1 !== null) && (elem2 !== null)) { - if (elem1.priority === elem2.priority) { - return elem1.priority - } else { - // if different priority then take the first - return elem1.priority - } - } else { - return (elem1 != null) ? elem1.priority : ((elem2 != null) ? elem2.priority : null) - } + getstrelem(elem) { + return 'elem [' + elem._id + '] ' + elem.descr + ' Pr(' + this.getPriorityByInd(elem.priority) + ') [ID_PREV=' + elem.id_prev + '] modif=' + elem.modified + ' ' } + // getPriorityToSet(ind1, ind2) { + // let elem1 = this.getelem(ind1) + // let elem2 = this.getelem(ind2) + // + // if ((elem1 !== null) && (elem2 !== null)) { + // if (elem1.priority === elem2.priority) { + // return elem1.priority + // } else { + // // if different priority then take the first + // return elem1.priority + // } + // } else { + // return (elem1 != null) ? elem1.priority : ((elem2 != null) ? elem2.priority : null) + // } + // } + // + getCompleted(ind1, ind2) { - let elem1 = this.getelem(ind1) - let elem2 = this.getelem(ind2) - - if ((elem1 !== null) && (elem2 !== null)) { - if (elem1.completed === elem2.completed) { - return elem1.completed - } else { - return elem1.completed - } - } else { - return (elem1 != null) ? elem1.completed : ((elem2 != null) ? elem2.completed : null) - } + // let elem1 = this.getelem(ind1) + // let elem2 = this.getelem(ind2) + // + // if ((elem1 !== null) && (elem2 !== null)) { + // if (elem1.completed === elem2.completed) { + // return elem1.completed + // } else { + // return elem1.completed + // } + // } else { + // return (elem1 != null) ? elem1.completed : ((elem2 != null) ? elem2.completed : null) + // } } getTitlePriority(priority) { let cl = '' - if (priority === rescodes.Todos.PRIORITY_HIGH) + if (priority === tools.Todos.PRIORITY_HIGH) cl = 'high_priority' - else if (priority === rescodes.Todos.PRIORITY_NORMAL) + else if (priority === tools.Todos.PRIORITY_NORMAL) cl = 'medium_priority' - else if (priority === rescodes.Todos.PRIORITY_LOW) + else if (priority === tools.Todos.PRIORITY_LOW) cl = 'low_priority' return cl + ' titlePriority' @@ -324,7 +158,7 @@ export default class Todo extends Vue { logga_arr(myarr: ITodo[]) { let mystr = '\n' myarr.forEach(item => { - mystr += '[' + item.pos + '] ' + item.descr + ' Pr(' + this.getPriorityByInd(item.priority) + ') [' + item.id_prev + '-' + item.id_next + '] modif=' + item.modified + '\n' + mystr += '[' + item.pos + '] ' + item.descr + ' Pr(' + this.getPriorityByInd(item.priority) + ') [' + item.id_prev + '] modif=' + item.modified + '\n' // mystr += '[' + item.pos + '] ' + item.descr + '\n' }) @@ -332,88 +166,31 @@ export default class Todo extends Vue { } async onEnd(itemdragend) { - console.log('3) newindex=', itemdragend.newIndex, 'oldindex=', itemdragend.oldIndex) + console.log('************ END DRAG: ', itemdragend) + this.inddragging = -1 - if (itemdragend.newIndex === itemdragend.oldIndex) - return // If nothing change, exit + await Todos.actions.swapElems(itemdragend) - // console.log('this.todos_arr PRIMA', this.logga_arr(this.todos_arr)) - // console.log('this.state.todos PRIMA', this.logga_arr(Todos.state.todos)) - // MOVE - this.todos_arr.splice(itemdragend.newIndex, 0, this.todos_arr.splice(itemdragend.oldIndex, 1)[0]) - - // console.log('this.todos_arr DOPO 1', this.logga_arr(this.todos_arr)) - - - let myobj = this.getelem(itemdragend.newIndex) - - const indini = itemdragend.newIndex - 1 - const indfine = itemdragend.newIndex + 1 - console.log('indini', indini, 'indfine', indfine) // If the newIndex is between another priority, then change priority - let completed = this.getCompleted(indini, indfine) - let changecompleted = false - if (completed != null) { - myobj.modified = (myobj.completed !== completed) ? true : myobj.modified - myobj.completed = completed - changecompleted = true - console.log('Newcompleted: ', completed, 'modif', myobj.modified) - } + // if (!changecompleted) { + // // if I changed the completed, I don't have to put in other list priority + // let newpriority = this.getPriorityToSet(indini, indfine) + // if (newpriority != null && newpriority >= 0) { + // myobj.modified = (myobj.priority !== newpriority) ? true : myobj.modified + // myobj.priority = newpriority + // console.log('NewPriority: ', newpriority) + // } + // } - if (!changecompleted) { - // if I changed the completed, I don't have to put in other list priority - let newpriority = this.getPriorityToSet(indini, indfine) - if (newpriority != null && newpriority >= 0) { - myobj.modified = (myobj.priority !== newpriority) ? true : myobj.modified - myobj.priority = newpriority - console.log('NewPriority: ', newpriority) - } - } - - this.updateLinkedList(false, false) - - // console.log('this.todos_arr DOPO ORDERLIST POS', this.logga_arr(this.todos_arr)) - // console.log('this.state.todos DOPÔ ORDERLIST POS', this.logga_arr(Todos.state.todos)) - - // Updated only elements modified - await this.updateModifyRecords(true) - - await this.updatetable(false, 'onEnd') - - // console.log('this.todos_arr DOPO 2', this.logga_arr(this.todos_arr)) - // console.log('this.state.todos DOPÔ 2', this.logga_arr(Todos.state.todos)) - - } - - async updateModifyRecords(refresh: boolean = false) { - let update = false - // console.log('updateModifyRecords - INI') - - for (const elem of this.todos_arr) { - if (elem.modified) { - console.log('calling MODIFY 3') - await this.modify(elem, false) - .then(() => { - update = true - elem.modified = false - }) - } - } - - // console.log('updateModifyRecords - FINE') - - if (update) - return await this.updatetable(refresh, 'updateModifyRecords') - } - - async updateAll(drag?: boolean) { - this.updateLinkedList(drag, false) - - // Updated only elements modified - await this.updateModifyRecords(true) - - await this.updatetable(false, 'onEnd') + // let completed = this.getCompleted(indini, indfine) + // let changecompleted = false + // if (completed != null) { + // myobj.modified = (myobj.completed !== completed) ? true : myobj.modified + // myobj.completed = completed + // changecompleted = true + // console.log('Newcompleted: ', completed, 'modif', myobj.modified) + // } } @@ -425,6 +202,21 @@ export default class Todo extends Vue { return parseInt(el.attributes['index'].value) } + + private getElementParentId(el: any) { + const elem = [].slice.call(el.parentElement.children) + console.log('elem', elem) + const id = elem.attributes['id'].substring(3) + return id + } + + private getElementId(el: any) { + console.log(' el ', el) + const id = el.attributes['id'].value.substring(3) + return id + } + + created() { const $service = this.$dragula.$service $service.options('first', @@ -448,7 +240,10 @@ export default class Todo extends Vue { }) $service.eventBus.$on('dragend', (args) => { - let itemdragend = { + let itemdragend: IDrag = { + // newIndex: this.getElementIndex(args.el), + // oldIndex: this.getElementOldIndex(args.el) + category: this.categoryAtt, newIndex: this.getElementIndex(args.el), oldIndex: this.getElementOldIndex(args.el) } @@ -459,7 +254,8 @@ export default class Todo extends Vue { let mythis = this $service.eventBus.$on('drag', function (el, source) { - console.log('+++ DRAG') + // mythis.inddragging = mythis.getElementIndex(el) + console.log('+++ DRAG ind=', mythis.inddragging) mythis.scrollable = false }) $service.eventBus.$on('drop', function (el, source) { @@ -472,6 +268,9 @@ export default class Todo extends Vue { } mounted() { + // console.log('*** MOUNTED ***') + + this.categoryAtt = this.$route.params.category let mythis = this if (window) { @@ -482,12 +281,11 @@ export default class Todo extends Vue { } }, { passive: false }) } - } setarrPriority() { this.arrPrior = [] - const arr = rescodes.selectPriority[UserStore.state.lang] + const arr = tools.selectPriority[UserStore.state.lang] if (arr) { arr.forEach(rec => { this.arrPrior.push(rec.value) @@ -496,26 +294,18 @@ export default class Todo extends Vue { // console.log('Array PRIOR:', this.arrPrior) } - beforedestroy() { - clearInterval(this.polling) - } - async load() { - - - // this.todos_arr = [...Todos.state.todos] + this.categoryAtt = this.$route.params.category // Set last category selected - localStorage.setItem(rescodes.localStorage.categorySel, this.getCategory()) + localStorage.setItem(tools.localStorage.categorySel, this.categoryAtt) - for (let todosKey in rescodes.Todos) { - this.listPriorityLabel.push(rescodes.Todos[todosKey]) + for (let todosKey in tools.Todos) { + this.listPriorityLabel.push(tools.Todos[todosKey]) } // console.log('Priority:' + this.listPriorityLabel) this.setarrPriority() - await this.updatetable(false, 'load') - this.loadDone = true this.checkUpdate_everytime() @@ -529,40 +319,15 @@ export default class Todo extends Vue { }, 60000) } - initcat() { - - let tomorrow = new Date() - tomorrow.setDate(tomorrow.getDate() + 1) - - - const objtodo: ITodo = { - // _id: new Date().toISOString(), // Create NEW - _id: objectId(), - userId: UserStore.state.userId, - descr: '', - priority: rescodes.Todos.PRIORITY_NORMAL, - completed: false, - created_at: new Date(), - modify_at: new Date(), - completed_at: new Date(), - category: '', - expiring_at: tomorrow, - enableExpiring: false, - id_prev: '', - id_next: '', - pos: 0, - modified: false, - progress: 0 - } - // return this.copy(objtodo) - return objtodo - + beforedestroy() { + clearInterval(this.polling) } + getPriorityByInd(index) { // console.log('LANG in PRIOR', UserStore.state.lang) try { - const arr = rescodes.selectPriority[UserStore.state.lang] + const arr = tools.selectPriority[UserStore.state.lang] for (let rec of arr) { if (rec.value === index) return rec.label @@ -574,10 +339,14 @@ export default class Todo extends Vue { } isRegistered() { - return localStorage.getItem(rescodes.localStorage.userId) !== '' + return localStorage.getItem(tools.localStorage.userId) !== '' } - async insertTodo(atfirst: boolean = false) { + mydeleteItem(idobj: string) { + return Todos.actions.deleteItem({ cat: this.categoryAtt, idobj }) + } + + insertTodo(atfirst: boolean = false) { let descr = this.todobottom.trim() if (atfirst) descr = this.todotop.trim() @@ -585,159 +354,42 @@ export default class Todo extends Vue { if (descr === '') return + if (UserStore.state.userId === undefined) { + this.$q.notify(this.$t('todo.usernotdefined')) + return + } + if (!this.isRegistered()) { // Not logged this.$q.notify(this.$t('user.notregistered')) return } - const objtodo = this.initcat() - - objtodo.descr = descr - objtodo.category = this.getCategory() - - let elemtochange: ITodo - - if (atfirst) { - elemtochange = this.getFirstList() - objtodo.id_prev = rescodes.LIST_START - objtodo.id_next = (elemtochange !== null) ? elemtochange._id : rescodes.LIST_END - objtodo.pos = (elemtochange !== null) ? elemtochange.pos - 1 : 1 - } else { - elemtochange = this.getLastList() - objtodo.id_prev = (elemtochange !== null) ? elemtochange._id : rescodes.LIST_START - objtodo.id_next = rescodes.LIST_END - objtodo.pos = (elemtochange !== null) ? elemtochange.pos + 1 : 1 - } - objtodo.modified = false - - console.log('objtodo', objtodo) - - if (objtodo.userId === undefined) { - this.$q.notify(this.$t('todo.usernotdefined')) - return + let myobj: ITodo = { + descr: descr, + category: this.categoryAtt } - // Create record in Memory - Todos.mutations.createNewItem({ objtodo, atfirst }) + return Todos.actions.insertTodo({ myobj, atfirst }) + .then((data) => { - // 1) Insert into the IndexedDb - const id = await globalroutines(this, 'write', 'todos', objtodo) + console.log('data', data) + if (data !== null) + this.$q.notify(data) - // update also the last elem - if (atfirst) { - if (elemtochange !== null) { - elemtochange.id_prev = id - } - } else { - if (elemtochange !== null) { - elemtochange.id_next = id - } - } - // Modify the other record - await this.modify(elemtochange, false) + // empty the field + if (atfirst) + this.todotop = '' + else + this.todobottom = '' - // empty the field - if (atfirst) - this.todotop = '' - else - this.todobottom = '' - this.updatetable(false, 'insertTodo') - this.saveItemToSyncAndDb(rescodes.DB.TABLE_SYNC_TODOS, 'POST', objtodo, true) - - // console.log('ESCO.........') + }) } - async cmdToSyncAndDb(cmd, table, method, item: ITodo, id, msg: String, update: boolean) { - // Send to Server to Sync - - console.log('cmdToSyncAndDb', cmd, table, method, item.descr, id, msg) - - let cmdSw = cmd - if ((cmd === rescodes.DB.CMD_SYNC_NEW_TODOS) || (cmd === rescodes.DB.CMD_DELETE_TODOS)) { - cmdSw = rescodes.DB.CMD_SYNC_TODOS - } - - // if (process.env.DEV) { - // console.log('serviceWorker ', ('serviceWorker' in navigator) ? 'PRESENT!' : 'DOESN\'T EXIST!') - // console.log('SyncManager ', ('SyncManager' in window) ? 'PRESENT!' : 'DOESN\'T EXIST!') - // } - - const mythis = this - if ('serviceWorker' in navigator) { - const ready = await navigator.serviceWorker.ready - .then(function (sw) { - // _id: new Date().toISOString(), - // console.log('---------------------- navigator.serviceWorker.ready') - - return globalroutines(mythis, 'write', table, item, id) - .then(function (id) { - // 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 = { - _id: multiparams, - value: multiparams - } - return globalroutines(mythis, 'write', 'swmsg', mymsgkey, multiparams) - .then(ris => { - // if ('SyncManager' in window) { - // console.log(' SENDING... sw.sync.register', multiparams) - // return sw.sync.register(multiparams) - // } else { - // #Todo ++ Alternative 2 to SyncManager - return Api.syncAlternative(multiparams) - // } - }) - .then(function () { - if (msg !== '') { - let data = { message: msg, position: 'bottom', timeout: 3000 } - mythis.$q.notify(data) - } - }) - .catch(function (err) { - console.error('Errore in globalroutines', table, err) - }) - }) - }) - - // if (update) { - // // // Update the array in memory, from IndexedDb update the todos array - // await Todos.actions.updatefromIndexedDbToStateTodo() - // .then((ris) => { - // return ris - // }) - // } - - } - - if (cmd === rescodes.DB.CMD_SYNC_NEW_TODOS) { - if (method === 'POST') - await Todos.actions.dbInsertTodo(item) - else if (method === 'PATCH') - await Todos.actions.dbSaveTodo(item) - } else if (cmd === rescodes.DB.CMD_DELETE_TODOS) { - await Todos.actions.dbDeleteTodo(item) - } - } - - async saveItemToSyncAndDb(table: String, method, item: ITodo, update: boolean) { - // let msg = (method === 'PATCH') ? 'Modif: ' : '++Create: ' - // msg = msg + item.descr - return await this.cmdToSyncAndDb(rescodes.DB.CMD_SYNC_NEW_TODOS, table, method, item, 0, '', update) - } - - - deleteItemToSyncAndDb(table: String, item: ITodo, id, update: boolean) { - // let msg = 'Delete: ' + item.descr - this.cmdToSyncAndDb(rescodes.DB.CMD_DELETE_TODOS, table, 'DELETE', item, id, '', update) - } - /* sendMessageToSW(recdata, method) { @@ -752,219 +404,29 @@ export default class Todo extends Vue { } */ - - getElemById(id, lista = this.todos_arr) { - let myobj: ITodo - for (myobj of lista) { - if (myobj._id === id) { - return myobj - } - } - - return null - } - - async deleteitem(id) { - console.log('deleteitem: KEY = ', id) - - - let myobjtrov = this.getElemById(id) - - if (myobjtrov !== null) { - let myobjprev = this.getElemById(myobjtrov.id_prev) - let myobjnext = this.getElemById(myobjtrov.id_next) - - if (myobjprev !== null) { - myobjprev.id_next = myobjtrov.id_next - myobjprev.modified = true - console.log('calling MODIFY 2') - await this.modify(myobjprev, false) - } - - if (myobjnext !== null) { - myobjnext.id_prev = myobjtrov.id_prev - myobjnext.modified = true - console.log('calling MODIFY 1') - await this.modify(myobjnext, false) - } - - // 1) Delete from the Todos Array - Todos.mutations.deletemyitem(myobjtrov) - Todos.mutations.setTodos_changed() - - // 2) Delete from the IndexedDb - globalroutines(this, 'delete', 'todos', null, id) - .then((ris) => { - // Update in to the UI - this.updatetable(true, 'deleteitem') - - }).catch((error) => { - console.log('err: ', error) - }) - - // 3) Delete from the Server (call) - this.deleteItemToSyncAndDb(rescodes.DB.TABLE_DELETE_TODOS, myobjtrov, id, true) - - } - - // console.log('FINE deleteitem') - } - - getElem(myarray: ITodo[], id) { - for (let i = 0; i < myarray.length - 1; i++) { - if (myarray[i]._id === id) - return myarray[i] - } - return null - } - - isRecordModifPos(itemnew: ITodo, itemold: ITodo) { - return itemnew.pos !== itemold.pos - } - - async updatetable(refresh: boolean = false, strpos = '') { - console.log('updatetable', strpos) - - this.prevRecords = [...this.todos_arr] - - // To cloning an array... - // this.prevRecords = _.cloneDeep(this.todos_arr) - - - return await Todos.actions.getTodosByCategory(this.getCategory()) - .then(arrris => { - - // this.todos_arr = [] - - let arrtemp = [...arrris] - - arrtemp = _.orderBy(arrtemp, ['completed', 'priority', 'pos'], ['asc', 'desc', 'asc']) - - this.updateLinkedList(false, true, arrtemp) - - // If changed the position, then set modified - arrtemp.forEach(itemNew => { - const itemOld = this.getElem(this.prevRecords, itemNew._id) - if (itemOld) - itemNew.modified = this.isRecordModifPos(itemNew, itemOld) ? true : false - }) - - this.todos_arr = [...arrtemp] // make copy - - this.arrFiltered = this.todos_arr.filter((item, index) => index < this.actualMaxPosition) - - console.log('AGGIORNA todos_arr [', this.todos_arr.length, ']') - - }) - } - - clearArr() { - // this.todos_arr = [] - } - - existArr(x) { - return x = (typeof x !== 'undefined' && x instanceof Array) ? x : [] - } - - getFirstList(arrlist = this.todos_arr) { - let elem: ITodo - for (elem of arrlist) { - if (elem.id_prev === rescodes.LIST_START) { - return elem - } - } - return null - } - - getLastList(arrlist = this.todos_arr) { - let elem: ITodo - for (elem of arrlist) { - if (elem.id_next === rescodes.LIST_END) { - return elem - } - } - return null - } - - setArrayFinale(arrris) { - - // Sort List: - let myarr = [] - - let current = this.getFirstList(arrris) - let currentprec = current - - if (current !== null) - myarr.push(current) - - let index = -1 - while (current !== null && current.id_next !== rescodes.LIST_END && index < arrris.length) { - this.logelem('current : ', current) - console.log('id_next', current.id_next) - // let changed = (prior !== elem.priority) ? true : false - current = this.getElemById(current.id_next, arrris) - if (current === null) - break - if (current._id === currentprec._id) - break - myarr.push(current) - currentprec = current - this.logelem('current AFTER : ', current) - index++ - } - - return myarr - - - } - - sortarr(arr, field) { - - return arr.slice().sort(function (a, b) { - return a[field] - b[field] - }) - - // let ind1 = -1 - // let val1 = -1 - // for (let x = 0; x <= arr.length; x++) { - // if (x[field] < ind1) { - // val11 = x[field] - // ind1 = x - // } - // for (let y: ITodo = null of arr) { - // - // } - // } - } - - updateitem(myobj) { - console.log('calling MODIFY 4 updateitem', myobj) + async updateitem({ myitem, field }) { + console.log('calling MODIFY updateitem', myitem, field) // Update the others components... - this.compKey1++ - this.compKey2++ - this.compKey3++ - console.log('this.compKey3', this.compKey3) - return this.modify(myobj, true) + const itemdragend: IDrag = { + category: this.categoryAtt, + field, + idelemtochange: myitem._id, + prioritychosen: myitem.priority, + atfirst: false + } + + await Todos.actions.swapElems(itemdragend) + + await Todos.actions.modify({ myitem, field }) + } - - // inactiveAllButtons() { - // let divs = this.$children.filter(function (child) { - // return child.$attrs['component-type'] === 'my-custom-button' - // }) - // divs.forEach(i => { - // divs[i].isActive = false - // }) - // } - // - deselectAllRows(item: ITodo, check, onlythis: boolean = false) { // console.log('deselectAllRows : ', item) for (let i = 0; i < this.$refs.single.length; i++) { - let contr = this.$refs.single[i] // @ts-ignore let id = contr.itemtodo._id @@ -982,140 +444,10 @@ export default class Todo extends Vue { } } - // updateRow(rec: ITodo) { - // let index = -1 - // // get index - // this.$refs.single.forEach( (singletodo: SingleTodo) => { - // if (singletodo.itemtodo._id === rec._id) - // index = -1 - // }) - // - // } - - modifyField(recOut, recIn, field) { - if (String(recOut[field]) !== String(recIn[field])) { - // console.log('*************** CAMPO ', field, 'MODIFICATO!', recOut[field], recIn[field]) - recOut.modified = true - recOut[field] = recIn[field] - return true - } - return false - } - - - async modify(myobj: ITodo, update: boolean) { - if (myobj === null) - return new Promise(function (resolve, reject) { - resolve() - }) - const myobjsaved = rescodes.jsonCopy(myobj) - return await globalroutines(this, 'read', 'todos', null, myobjsaved._id) - .then(miorec => { - if (miorec === undefined) { - console.log('~~~~~~~~~~~~~~~~~~~~ !!!!!!!!!!!!!!!!!! Record not Found !!!!!! id=', myobjsaved._id) - return - } - - if (this.modifyField(miorec, myobjsaved, 'completed')) - miorec.completed_at = new Date().getDate() - - this.fieldtochange.forEach(field => { - this.modifyField(miorec, myobjsaved, field) - }) - - - if (miorec.modified) { - // console.log('Todo MODIFICATO! ', miorec.descr, miorec.pos, 'SALVALO SULLA IndexedDB todos') - miorec.modify_at = new Date().getDate() - miorec.modified = false - - // 1) Modify on Global Memory - Todos.mutations.modifymyItem(miorec) - - if (update) { - // 4) Update the filter in Memory - this.updatetable(false, 'modify') - } - - // this.logelem('modify', miorec) - // 2) Modify on IndexedDb - return globalroutines(this, 'write', 'todos', miorec) - .then(ris => { - - // 3) Modify on the Server (call) - this.saveItemToSyncAndDb(rescodes.DB.TABLE_SYNC_TODOS_PATCH, 'PATCH', miorec, update) - - }) - } - }) - } - - clicktest() { - console.log('clicktest!') - - const objtodo = this.initcat() - objtodo.descr = 'PROVA' - objtodo.category = this.getCategory() - Todos.state.todos.push(objtodo) - Todos.mutations.setTodos_changed() - - console.log('Todos.state.todos', Todos.state.todos) - } - - clicktest2() { - this.updatetable(false, 'clicktest') - console.log('Todos.state.todos', Todos.state.todos) - } - checkUpdate() { Todos.actions.waitAndcheckPendingMsg() } - /* - dragStart(which, ev) { - this.itemdrag.indTemp = which - console.log('1) DRAG INIZIO: ', which) - this.itemdrag.oldIndex = which - this.dragging = which - } - - public randomHexColor() { - return Math.random().toString(16).slice(2, 8) - } - - dragEnter(index, ev) { - if (this.itemdrag.indTemp !== index) { - console.log(`[${index}] DRAG ENTER`) - this.itemdrag.indTemp = index - - this.getItemDrag(index).addClass('draggato2').removeClass('non-draggato') - } - } - - getItemDrag(index) { - return $('div[name=REF' + index + ']') - } - - dragLeave(index, ev) { - if (this.itemdrag.indTemp !== index) { - this.getItemDrag(index).addClass('non-draggato').removeClass('draggato') - } - } - - dragEnd(ev) { - this.dragging = -1 - } - - dragFinish(to, ev) { - this.itemdrag.indTemp = -1 - this.getItemDrag(to).addClass('non-draggato').removeClass('draggato') - console.log('2) DRAG FINE: ', to) - this.itemdrag.newIndex = to - this.onEnd(this.itemdrag) - - } - */ - loadMoreTodo(index, done) { setTimeout(() => { this.actualMaxPosition += 15 diff --git a/src/components/todos/todo/todo.vue b/src/components/todos/todo/todo.vue index eb24127..2a40eb5 100644 --- a/src/components/todos/todo/todo.vue +++ b/src/components/todos/todo/todo.vue @@ -4,7 +4,7 @@

-
{{ getCategory() }}
+
{{ categoryAtt }}
- -
-
--> +
+
-
+ :class="getTitlePriority(mytodo.priority)">
-
- -
{{ priorcomplet = true }}
-
- @@ -43,19 +39,40 @@
- + + +
+ +
+ + +
+
+ + + + + +
{{ prior = mytodo.priority, priorcomplet = mytodo.completed }} +
+
+
+
- - - +
+ @@ -72,7 +89,10 @@ + + + diff --git a/src/globalroutines/indexdb.js b/src/globalroutines/indexdb.js index 967046e..9b78994 100644 --- a/src/globalroutines/indexdb.js +++ b/src/globalroutines/indexdb.js @@ -3,7 +3,7 @@ import _ from 'lodash' import { UserStore, Todos } from '@store' import { i18n } from '../plugins/i18n' -import {idbKeyval as storage} from '../js/storage.js'; +import { idbKeyval as storage } from '../js/storage.js'; function saveConfigIndexDb(context) { @@ -27,20 +27,43 @@ function writeConfigIndexDb(context, data) { } async function readfromIndexDbToStateTodos(context, table) { - // console.log('*** read from IndexDb to state.todos') + console.log('*** readfromIndexDbToStateTodos ***') return await storage.getalldata(table) - .then(records => { + .then(reccat => { // console.log('&&&&&&& readfromIndexDbToStateTodos OK: Num RECORD: ', records.length) - if (table === 'todos') { - Todos.state.todos = [...records] - Todos.mutations.setTodos_changed() - // console.log('Todos.state.todos_changed:', Todos.state.todos_changed) - // setTimeout(testfunc2, 3000) + if (table === 'categories') { + console.log('reccat', reccat) + Todos.state.categories = [] + for (let indcat in reccat) { + Todos.state.categories.push(reccat[indcat].valore) + } + + console.log('ARRAY Categories', Todos.state.categories) + + return storage.getalldata('todos') + .then(records => { + console.log('todos records', records) + // console.log('&&&&&&& readfromIndexDbToStateTodos OK: Num RECORD: ', records.length) + + for (let myrec in records) { + const cat = myrec.category + let indcat = state.categories.indexOf(cat) + if (Todos.state.todos[indcat] === undefined) + Todos.state.todos[indcat] = {} + + // add to the right array + Todos.state.todos[indcat].push(myrec) + + } + + console.log('************ ARRAYS SALVATI IN MEMORIA Todos.state.todos ', Todos.state.todos) + }) } + }).catch((error) => { - console.log('err: ', error) - }) + console.log('err: ', error) + }) } @@ -49,11 +72,9 @@ function consolelogpao(str, str2 = '', str3 = '') { // Todos.mutations.setTestpao(str + str2 + str3) } -function testfunc2 () { +function testfunc2() { consolelogpao('testfunc2') - Todos.mutations.setTodos_changed() - consolelogpao('testfunc2: Todos.state.todos_changed:', Todos.state.todos_changed) } export default async (context, cmd, table, datakey = null, id = '') => { diff --git a/src/globalroutines/util.js b/src/globalroutines/util.js index 565e4c5..4e50d98 100644 --- a/src/globalroutines/util.js +++ b/src/globalroutines/util.js @@ -1,5 +1,5 @@ import { UserStore } from "../store/Modules"; -import messages from "../statics/i18n"; +import messages from "../assets/i18n"; function translate(params) { let msg = params.split('.') diff --git a/src/index.template.html b/src/index.template.html index 9bfff83..d15b744 100644 --- a/src/index.template.html +++ b/src/index.template.html @@ -10,21 +10,20 @@ - - - - - - - - - - + + + + + + + + + - +
diff --git a/src/js/storage.js b/src/js/storage.js index 9905be7..81d7077 100644 --- a/src/js/storage.js +++ b/src/js/storage.js @@ -15,6 +15,7 @@ export let idbKeyval = (() => { 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' }); @@ -56,7 +57,7 @@ export let idbKeyval = (() => { let req; await withStore('readonly', table, store => { - console.log('getdata', table, key) + // console.log('getdata', table, key) req = store.get(key); }); diff --git a/src/layouts/drawer/drawer.scss b/src/layouts/drawer/drawer.scss new file mode 100644 index 0000000..b0b04f7 --- /dev/null +++ b/src/layouts/drawer/drawer.scss @@ -0,0 +1,50 @@ +.background-red { + background-color: red; + padding: 2px; +} + +.fixed-bottom { + margin-bottom: 1%; +} + +.fixed-bottom a img { + width: 25px; + height: 25px; +} + +#avatar { + padding: 20px; +} + +#profile { + height: 130px; + background-color: #009688; +} + +#user-name { + left: 90px; + bottom: 77px; + position: relative; + width: 159px; +} + +#user-actions { + left: 90px; + bottom: 71px; + position: relative; + width: 171px; +} + +#menu-collapse { + margin-top: 5%; +} + +.fixed-left:hover { + cursor: ew-resize; +} + +footer { + small { + color: red; + } +} diff --git a/src/layouts/drawer/drawer.ts b/src/layouts/drawer/drawer.ts new file mode 100644 index 0000000..3757172 --- /dev/null +++ b/src/layouts/drawer/drawer.ts @@ -0,0 +1,119 @@ +import menuOne from './menuOne.vue' + +import Vue from 'vue' +import { Component, Watch, Prop } from 'vue-property-decorator' +import { Store } from 'vuex' +import { UserStore } from '@modules' +import { GlobalStore } from '@modules' +import { ITodoList } from '../../model' + + +@Component({ + components: { + menuOne + } +}) + +export default class Drawer extends Vue { + public $q + $t: any + public arrlista = GlobalStore.state.listatodo + photo = '' + user = null + links + + created() { + let listatodo = [] + + this.arrlista.forEach((elem: ITodoList) => { + let item = { + route: '/todo/' + elem.namecat, + faIcon: 'fa fa-list-alt', + materialIcon: 'todo', + name: 'pages.' + elem.description + } + listatodo.push(item) + + }) + + if (UserStore.state.isAdmin) { + this.links = { + Dashboard: { + routes: [ + { route: '/', faIcon: 'fa fa-home', materialIcon: 'home', name: 'pages.home' }, + { + route: '/todo', faIcon: 'fa fa-list-alt', materialIcon: 'todo', 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: '/admin/cfgserv', faIcon: 'fa fa-database', materialIcon: 'admin', name: 'pages.Admin' }, + { route: '/admin/testp1/par1', faIcon: 'fa fa-database', materialIcon: 'admin', name: 'pages.Test1' }, + { route: '/admin/testp1/par2', faIcon: 'fa fa-database', materialIcon: 'admin', name: 'pages.Test2' }, + { 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, + } + } + } else { + // PRODUCTION USER: + if (process.env.PROD) { + this.links = { + Dashboard: { + routes: [ + { route: '/', faIcon: 'fa fa-home', materialIcon: 'home', name: 'pages.home' }, + ], + show: true, + } + } + } else { + // SERVER TEST + this.links = { + Dashboard: { + routes: [ + { route: '/', faIcon: 'fa fa-home', materialIcon: 'home', name: 'pages.home' }, + { + route: '/todo', faIcon: 'fa fa-list-alt', materialIcon: 'todo', 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, + } + } + + } + } + + + } + + + get MenuCollapse() { + return GlobalStore.state.menuCollapse + // return true + } + + get Username() { + return UserStore.state.username + } + + get Verificato() { + return UserStore.state.verified_email + } + + get Email() { + return UserStore.state.email + } + + logoutHandler() { + UserStore.actions.logout() + this.$router.push('/signin') + this.$q.notify(this.$t('logout.uscito')) + } +} + diff --git a/src/layouts/drawer/drawer.vue b/src/layouts/drawer/drawer.vue index 6e218f7..c22c031 100644 --- a/src/layouts/drawer/drawer.vue +++ b/src/layouts/drawer/drawer.vue @@ -31,153 +31,8 @@ - - diff --git a/src/model/GlobalStore.ts b/src/model/GlobalStore.ts index 0393d7b..d5adf31 100644 --- a/src/model/GlobalStore.ts +++ b/src/model/GlobalStore.ts @@ -14,6 +14,11 @@ export interface ICfgServer { valore: string } +export interface ITestp1 { + contatore: number + mioarray: ICfgServer[] +} + export type StateConnection = 'online' | 'offline' export interface IGlobalState { @@ -29,6 +34,7 @@ export interface IGlobalState { stateConnection: string networkDataReceived: boolean cfgServer: ICfgServer[] + testp1: ITestp1 connData: IConnData posts: IPost[] listatodo: ITodoList[] diff --git a/src/model/Todos.ts b/src/model/Todos.ts index 001d441..85ce990 100644 --- a/src/model/Todos.ts +++ b/src/model/Todos.ts @@ -1,28 +1,48 @@ export interface ITodo { _id?: any, - userId: string + userId?: string category?: string descr?: string, - priority: number, - completed: boolean, - created_at: Date, - modify_at: Date, - completed_at: Date, - expiring_at: Date, + priority?: number, + completed?: boolean, + created_at?: Date, + modify_at?: Date, + completed_at?: Date, + expiring_at?: Date, enableExpiring?: boolean, id_prev?: string, - id_next?: string, modified?: boolean, pos?: number, order?: number, progress?: number } +export interface IParamTodo { + categorySel?: string + checkPending?: boolean + id?: string + objtodo?: ITodo + atfirst?: boolean +} + +export interface IDrag { + field?: string + idelemtochange?: string + prioritychosen?: number + oldIndex?: number + newIndex?: number + category: string + atfirst?: boolean +} + + export interface ITodosState { visuOnlyUncompleted: boolean - todos: ITodo[] - todos_changed: number + todos: [ ITodo[] ] + categories: string[] + // todos_changed: number reload_fromServer: number testpao: String insidePending: boolean + visuLastCompleted: number } diff --git a/src/plugins/i18n.js b/src/plugins/i18n.js index 180f7cf..60a1a0a 100644 --- a/src/plugins/i18n.js +++ b/src/plugins/i18n.js @@ -1,13 +1,13 @@ // src/plugins/i18n.js import VueI18n from 'vue-i18n'; -import messages from 'src/statics/i18n'; -import { rescodes } from "../store/Modules/rescodes"; +import messages from 'src/assets/i18n'; +import { tools } from "../store/Modules/tools"; export default ({ app, store, Vue }) => { Vue.use(VueI18n); // Vue.config.lang = process.env.LANG_DEFAULT; - let mylang = rescodes.getItemLS(rescodes.localStorage.lang) + let mylang = tools.getItemLS(tools.localStorage.lang) if ((navigator) && (mylang === '')) { mylang = navigator.language diff --git a/src/root/home/home.scss b/src/root/home/home.scss index 6580a26..9d3fbd4 100644 --- a/src/root/home/home.scss +++ b/src/root/home/home.scss @@ -1,3 +1,209 @@ .mycard { visibility: hidden; } + +.landing { + background: #000 url(../../assets/images/cover.jpg) no-repeat 50% fixed; + background-size: cover +} + +.landing > section { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + padding: 0 16px +} + +.landing > section.padding { + padding: 180px 16px +} + +.landing > section > div { + position: relative; + max-width: 1040px; + width: 100% +} + +.landing__toolbar { + background: -webkit-gradient(linear, left top, left bottom, from(#000), to(transparent)); + background: linear-gradient(180deg, #000, transparent); + padding: 0 !important +} + +.landing__toolbar .q-btn { + border-radius: 0 0 5px 5px; + -ms-flex-item-align: stretch; + align-self: stretch +} + +.landing__hero { + min-height: 100vh +} + +.landing__arrow { + bottom: 8px; + opacity: .4 +} + +.landing__front { + background: -webkit-gradient(linear, left top, left bottom, from(transparent), color-stop(15%, rgba(0, 0, 0, .6))); + background: linear-gradient(180deg, transparent, rgba(0, 0, 0, .6) 15%) +} + +.landing__logo { + width: 150px; + height: 150px; + margin-top: 21px; + -webkit-animation: logo-rotate 240s linear infinite; + animation: logo-rotate 240s linear infinite +} + +.landing__features .q-icon { + font-size: 64px +} + +.landing__features h4, .landing__features h6 { + margin: 26px 0 +} + +.landing__features p { + opacity: .6; + font-size: 16px +} + +.landing__footer { + background: -webkit-gradient(linear, left top, left bottom, color-stop(65%, rgba(0, 0, 0, .1)), to(#000)); + background: linear-gradient(180deg, rgba(0, 0, 0, .1) 65%, #000); + padding-top: 72px !important; + padding-bottom: 72px !important +} + +.landing__footer .doc-link { + color: #fff +} + +.landing__footer .doc-link:hover { + opacity: .8 +} + +.landing__swirl-bg { + background-repeat: no-repeat !important; + background-position: top; + background-size: contain !important; + background-image: url(https://cdn.quasar-framework.org/img/landing_first_section.png) !important +} + + +@media (max-width: 718px) { + .landing__hero { + text-align: center + } + .landing__hero .text-h1 { + font-size: 3rem; + line-height: 3.05rem; + margin-bottom: 24px + } + .landing > section.padding { + padding-top: 90px; + padding-bottom: 90px + } + .landing .feature-item { + text-align: center + } + .landing__hero-content { + padding-bottom: 180px + } + .landing__hero-btns { + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center + } +} + +body.mobile .landing { + background: unset +} + +body.mobile .landing:before { + content: ""; + position: fixed; + top: 0; + height: 100vh; + left: 0; + right: 0; + bottom: 0; + z-index: -1; + background: #000 url(../../assets/images/cover.jpg) 50%; + background-size: cover +} + +@-webkit-keyframes logo-rotate { + to { + -webkit-transform: rotate(-1turn); + transform: rotate(-1turn) + } +} + +@keyframes logo-rotate { + to { + -webkit-transform: rotate(-1turn); + transform: rotate(-1turn) + } +} + + + + +.home { + //background-color: rgb(250, 250, 250); + padding: 5px; + display: flex; + //flex-wrap: nowrap; + flex-direction: column; + align-items: center; + justify-content: space-between; +} + +.shadow { + //color: white; + text-shadow: 2px 2px 4px #000000; +} + +.shadow-max { + //color: white; + text-shadow: 4px 4px 8px #000000; +} + + +.text-h1 { + font-size: 6rem; + font-weight: 300; + line-height: 6rem; + letter-spacing: -.01562em; +} + +.text-weight-bold { + font-weight: 700; +} + +.text-subtitle1 { + font-size: 1.25rem; + font-weight: 400; + line-height: 1.75rem; + letter-spacing: .00937em; + &.big { + font-size: 1.5rem; + } +} +.text-subtitle2 { + + font-size: 1rem; + font-weight: 400; + line-height: 1.75rem; + letter-spacing: .00937em; +} + + diff --git a/src/root/home/home.ts b/src/root/home/home.ts index e3ece4f..fb11f6d 100644 --- a/src/root/home/home.ts +++ b/src/root/home/home.ts @@ -30,6 +30,7 @@ export default class Home extends Vue { GlobalStore.actions.prova() } + meta() { return { keywords: { name: 'keywords', content: 'Quasar website' }, @@ -95,7 +96,7 @@ export default class Home extends Vue { options = { body: 'You successfully subscribed to our Notification service!', icon: '/statics/icons/app-icon-96x96.png', - image: '/src/images/sf-boat.jpg', + image: '/assets/images/sf-boat.jpg', dir: 'ltr', lang: 'enUs', // BCP 47, vibrate: [100, 50, 200], @@ -152,7 +153,7 @@ export default class Home extends Vue { options = { body: mythis.$t('notification.subscribed'), icon: '/statics/icons/android-chrome-192x192.png', - image: '/statics/images/freeplanet.png', + image: '/assets/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 21ef8dc..464d739 100644 --- a/src/root/home/home.vue +++ b/src/root/home/home.vue @@ -1,33 +1,95 @@ -