diff --git a/quasar.extensions.json b/quasar.extensions.json
new file mode 100644
index 0000000..97d1675
--- /dev/null
+++ b/quasar.extensions.json
@@ -0,0 +1,6 @@
+{
+ "@quasar/typescript": {
+ "webpack": "plugin",
+ "rename": true
+ }
+}
\ No newline at end of file
diff --git a/src/boot/axios.ts b/src/boot/axios.ts
new file mode 100644
index 0000000..11b8239
--- /dev/null
+++ b/src/boot/axios.ts
@@ -0,0 +1,5 @@
+import axios from 'axios'
+
+export default ({ Vue }) => {
+ Vue.prototype.$axios = axios
+}
diff --git a/src/boot/dialog.ts b/src/boot/dialog.ts
new file mode 100644
index 0000000..5b145d3
--- /dev/null
+++ b/src/boot/dialog.ts
@@ -0,0 +1,5 @@
+import Dialog from 'quasar'
+
+export default ({ Vue }) => {
+ Vue.use(Dialog)
+}
diff --git a/src/boot/dragula.ts b/src/boot/dragula.ts
new file mode 100644
index 0000000..76abac7
--- /dev/null
+++ b/src/boot/dragula.ts
@@ -0,0 +1,10 @@
+import Vue from 'vue'
+import { Vue2Dragula } from 'vue2-dragula'
+
+export default ({ Vue }) => {
+ Vue.use(Vue2Dragula, {
+ logging: {
+ service: false // to only log methods in service (DragulaService)
+ }
+ })
+}
diff --git a/src/boot/error-handler.ts b/src/boot/error-handler.ts
new file mode 100644
index 0000000..77e6339
--- /dev/null
+++ b/src/boot/error-handler.ts
@@ -0,0 +1,7 @@
+// import something here
+import errorHandler from '../error-handler'
+// leave the export, even if you don't use it
+export default ({ app, router, Vue }) => {
+ // something to do
+ Vue.prototype.$errorHandler = errorHandler
+}
diff --git a/src/boot/globalroutines.ts b/src/boot/globalroutines.ts
new file mode 100644
index 0000000..b3ff5a0
--- /dev/null
+++ b/src/boot/globalroutines.ts
@@ -0,0 +1,8 @@
+import globalroutines from '../globalroutines'
+
+export default ({ app, router, store, Vue }) => {
+ // something to do
+ Vue.prototype.$globalroutines = globalroutines
+}
+
+
diff --git a/src/boot/guard.ts b/src/boot/guard.ts
new file mode 100644
index 0000000..45dde93
--- /dev/null
+++ b/src/boot/guard.ts
@@ -0,0 +1,89 @@
+// import something here
+
+// leave the export, even if you don't use it
+export default ({ app, router, store, Vue }) => {
+ // something to do
+
+ // ******************************************
+ // *** 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) {
+ // SE PERMITE IR DE AREA PUBLICA A PRIVADA
+ if (!from.matched.some(record => record.meta.requiresAuth) && to.matched.some(record => record.meta.requiresAuth)) {
+ next()
+ }
+ // SE PERMITE IR DE UNA AREA PRIVADA A OTRA PRIVADA
+ if (from.matched.some(record => record.meta.requiresAuth) && to.matched.some(record => record.meta.requiresAuth)) {
+ next()
+ }
+ // NO SE PERMITE IR A UN AREA PUBLICA DESDE UN AREA PRIVADA
+ if (from.matched.some(record => record.meta.requiresAuth) && !to.matched.some(record => record.meta.requiresAuth)) {
+ next(false)
+ }
+ // SE REDIRIJE AL PANEL
+ if (!from.matched.some(record => record.meta.requiresAuth) && !to.matched.some(record => record.meta.requiresAuth)) {
+ next('/Panel')
+ }
+ // NO ESTA LOGEADO
+ } else {
+ // SE PERMITE IR DE UNA AREA PUBLICA A OTRA PUBLICA
+ if (!from.matched.some(record => record.meta.requiresAuth) && !to.matched.some(record => record.meta.requiresAuth)) {
+ next()
+ }
+ // SE PERMITE IR DE UNA AREA PRIVADA A UNA PUBLICA (LOGOUT)
+ if (from.matched.some(record => record.meta.requiresAuth) && !to.matched.some(record => record.meta.requiresAuth)) {
+ next()
+ }
+ // NO SE PERMITE IR DE UNA AREA PUBLICA A UNA PRIVADA
+ if (!from.matched.some(record => record.meta.requiresAuth) && to.matched.some(record => record.meta.requiresAuth)) {
+ // REDIRIGIR A LOGIN
+ next('/')
+ }
+ }
+ })*/
+
+}
diff --git a/src/boot/local-storage.ts b/src/boot/local-storage.ts
new file mode 100644
index 0000000..a7acbde
--- /dev/null
+++ b/src/boot/local-storage.ts
@@ -0,0 +1,7 @@
+// import something here
+import { _LocalStorage } from '../local-storage'
+// leave the export, even if you don't use it
+export default ({ app, router, Vue }) => {
+ // something to do
+ Vue.prototype.$_localStorage = _LocalStorage
+}
diff --git a/src/boot/myconfig.ts b/src/boot/myconfig.ts
new file mode 100644
index 0000000..64d6adc
--- /dev/null
+++ b/src/boot/myconfig.ts
@@ -0,0 +1,9 @@
+// import something here
+import myconfig from '../myconfig'
+
+// leave the export, even if you don't use it
+export default ({ Vue }) => {
+ //Vue.use(myconfig);
+ // something to do
+ Vue.prototype.$myconfig = myconfig
+}
diff --git a/src/boot/vee-validate.ts b/src/boot/vee-validate.ts
new file mode 100644
index 0000000..d849de1
--- /dev/null
+++ b/src/boot/vee-validate.ts
@@ -0,0 +1,5 @@
+import VeeValidate from "vee-validate";
+
+export default ({ Vue }) => {
+ Vue.use(VeeValidate, { inject: false })
+}
diff --git a/src/boot/vue-i18n.ts b/src/boot/vue-i18n.ts
new file mode 100644
index 0000000..952c7e3
--- /dev/null
+++ b/src/boot/vue-i18n.ts
@@ -0,0 +1,45 @@
+// src/boot/vue-i18n.js
+import VueI18n from 'vue-i18n'
+import messages from '../statics/i18n'
+import { tools } from '../store/Modules/tools'
+
+export default ({ app, store, Vue }) => {
+ Vue.use(VueI18n)
+ // Vue.config.lang = process.env.LANG_DEFAULT;
+
+ let mylang = tools.getItemLS(tools.localStorage.lang)
+
+ if ((navigator) && (mylang === '')) {
+ mylang = navigator.language
+ // console.log(`LANG NAVIGATOR ${mylang}`)
+ }
+
+ if (mylang === '')
+ mylang = process.env.LANG_DEFAULT;
+
+ if (mylang.toLowerCase() === 'es-es')
+ mylang = 'es'
+
+ // console.log('MYLANG2=', mylang)
+ // console.log('process.env.LANG_DEFAULT=', process.env.LANG_DEFAULT)
+ Vue.config.lang = mylang
+
+ // import(`quasar/lang/${mylang}`).then(lang => {
+ // console.log(' ... LANGDEFAULT=', lang)
+ // this.$q.i18n.set(lang.default)
+ // import(`src/statics/i18n`).then(function () {
+ // })
+ // })
+
+ // console.log("PLUGINS INIT....");
+
+ // console.log("LANG_DEFAULT: ")
+ // console.log(process.env.LANG_DEFAULT)
+
+ // Set i18n instance on app
+ app.i18n = new VueI18n({
+ fallbackLocale: mylang,
+ locale: mylang,
+ messages
+ })
+}
diff --git a/src/boot/vue-idb.ts b/src/boot/vue-idb.ts
new file mode 100644
index 0000000..3b1f502
--- /dev/null
+++ b/src/boot/vue-idb.ts
@@ -0,0 +1,20 @@
+import Vue from 'vue'
+import VueIdb from 'vue-idb'
+
+export default ({ Vue }) => {
+ Vue.use(VueIdb)
+
+}
+
+
+/*
+
+
+export default new VueIdb({
+ version: 1,
+ database: 'test',
+ schemas: [
+ { categories: '++_id, sub_categ_id, descr_it' }
+ ]
+})
+*/
diff --git a/src/boot/vuelidate.ts b/src/boot/vuelidate.ts
new file mode 100644
index 0000000..30d04fc
--- /dev/null
+++ b/src/boot/vuelidate.ts
@@ -0,0 +1,5 @@
+import Vuelidate from 'vuelidate'
+
+export default ({ Vue }) => {
+ Vue.use(Vuelidate)
+}
diff --git a/src/env.d.ts b/src/env.d.ts
new file mode 100644
index 0000000..503c2b6
--- /dev/null
+++ b/src/env.d.ts
@@ -0,0 +1,7 @@
+declare namespace NodeJS {
+ interface ProcessEnv {
+ NODE_ENV: string
+ VUE_ROUTER_MODE: 'hash' | 'history' | 'abstract' | undefined
+ VUE_ROUTER_BASE: string | undefined
+ }
+}
diff --git a/src/error-handler/backend.ts b/src/error-handler/backend.ts
new file mode 100644
index 0000000..24a1501
--- /dev/null
+++ b/src/error-handler/backend.ts
@@ -0,0 +1,24 @@
+// import { i18n } from '../boot/vue-i18n'
+import { Notify } from 'quasar'
+export default (error) => {
+/*
+ let message = this.$i18n.t('errors.backend.undefined')
+ if (error.response.data.error && error.response.data.message) {
+ message = error.response.data.message
+ }
+
+ if (error.response.data.errors) {
+ const errors = Object.keys(error.response.data.errors)
+ message = error.response.data.errors[errors[0]][0]
+ }
+
+ Notify.create({
+ message,
+ position: 'center'
+ })
+
+ if (message === this.$i18n.t('errors.backend.undefined')) {
+ console.log(error.response)
+ }
+*/
+}
diff --git a/src/error-handler/firebase.ts b/src/error-handler/firebase.ts
new file mode 100644
index 0000000..3f058f6
--- /dev/null
+++ b/src/error-handler/firebase.ts
@@ -0,0 +1,24 @@
+import store from '../store'
+// import { i18n } from '../boot/vue-i18n'
+import { Notify } from 'quasar'
+
+export default (error) => {
+/*
+ switch (error.code) {
+ case 'messaging/notifications-blocked':
+ case 'messaging/permission-blocked':
+ store.commit('session/fcmNotificationPromptShowed', true)
+ store.commit('session/fcmNotificationsBlocked', true)
+ break
+ case 'messaging/token-unsubscribe-failed':
+ Notify.create({
+ message: i18n.t('errors.firebase.try_again'),
+ position: 'center'
+ })
+ break
+ default:
+ console.error(error)
+ break
+ }
+*/
+}
diff --git a/src/error-handler/graphql.ts b/src/error-handler/graphql.ts
new file mode 100644
index 0000000..9f9591c
--- /dev/null
+++ b/src/error-handler/graphql.ts
@@ -0,0 +1,21 @@
+// import { i18n } from '../boot/vue-i18n'
+import { Notify } from 'quasar'
+export default (error) => {
+/*
+ let message = this.$i18n.t('errors.graphql.undefined')
+
+ if (error[0].validation) {
+ let errors = Object.keys(error[0].validation)
+ message = error[0].validation[errors[0]][0]
+ }
+
+ Notify.create({
+ message,
+ position: 'center'
+ })
+
+ if (message === this.$i18n.t('errors.graphql.undefined')) {
+ console.log(error.response)
+ }
+*/
+}
diff --git a/src/error-handler/index.ts b/src/error-handler/index.ts
new file mode 100644
index 0000000..ebb18cc
--- /dev/null
+++ b/src/error-handler/index.ts
@@ -0,0 +1,21 @@
+// import Backend from './backend'
+// import Firebase from './firebase'
+import Graphql from './graphql'
+
+export default (context, error) => {
+ /*
+ if (error.constructor.name === 'FirebaseError') {
+ Firebase(error)
+ return
+ }
+ if (error.response && error.response.data && error.response.data.backend) {
+ Backend(error)
+ return
+ }*/
+
+ if (error[0] && error[0].locations && error[0].validation) {
+ Graphql(error)
+ return
+ }
+ console.log('Error handler', error)
+}
diff --git a/src/globalroutines/index.ts b/src/globalroutines/index.ts
new file mode 100644
index 0000000..1ae91ce
--- /dev/null
+++ b/src/globalroutines/index.ts
@@ -0,0 +1,24 @@
+import indexdb from './indexdb'
+import { GlobalStore } from "../store/Modules";
+
+export default async (context, cmd, table, data = null, id = '') => {
+ const descr = data !== null ? data.descr : ''
+ // console.log('globalroutines', cmd, table, descr, id)
+ return await indexdb(context, cmd, table, data, id)
+ .then(ris => {
+ setTimeout(function () {
+ GlobalStore.state.connData.uploading_indexeddb = 0
+ GlobalStore.state.connData.downloading_indexeddb = 0
+ }, 1000)
+ return ris
+ }
+
+ ).catch(err => {
+ setTimeout(function () {
+ GlobalStore.state.connData.uploading_indexeddb = (GlobalStore.state.connData.uploading_indexeddb === 1) ? -1 : GlobalStore.state.connData.uploading_indexeddb
+ GlobalStore.state.connData.downloading_indexeddb = (GlobalStore.state.connData.downloading_indexeddb === 1) ? -1 : GlobalStore.state.connData.downloading_indexeddb
+ }, 1000)
+
+ console.log('ERROR INDEXEDDB: ', err)
+ })
+}
diff --git a/src/globalroutines/indexdb.ts b/src/globalroutines/indexdb.ts
new file mode 100644
index 0000000..d1d28cf
--- /dev/null
+++ b/src/globalroutines/indexdb.ts
@@ -0,0 +1,123 @@
+import { Todos, UserStore } from '@store'
+import _ from 'lodash'
+import store, { GlobalStore } from '../store'
+
+import { idbKeyval as storage } from '../js/storage.js'
+import { costanti } from '../store/Modules/costanti'
+import { ICfgData } from '@src/model'
+
+function saveConfigIndexDb(context) {
+
+ const data: ICfgData = {}
+ data._id = costanti.CONFIG_ID_CFG
+ data.lang = UserStore.state.lang
+ data.token = UserStore.state.x_auth_token
+ data.userId = UserStore.state.userId
+
+ writeConfigIndexDb('config', data)
+}
+
+function writeConfigIndexDb(context, data) {
+ // console.log('writeConfigIndexDb', data)
+
+ storage.setdata('config', data)
+ .then((ris) => {
+ return true
+ })
+
+}
+
+async function readfromIndexDbToStateTodos(context, table) {
+ console.log('*** readfromIndexDbToStateTodos ***')
+
+ return await storage.getalldata(table)
+ .then((reccat) => {
+ // console.log('&&&&&&& readfromIndexDbToStateTodos OK: Num RECORD: ', records.length)
+ if (table === 'categories') {
+ console.log('reccat', reccat)
+ Todos.state.categories = []
+ for (const 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 (const myrec in records) {
+ const cat = myrec.category
+ const 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)
+ })
+
+}
+
+function consolelogpao(str, str2 = '', str3 = '') {
+ console.log(str, str2, str3)
+ // Todos.mutations.setTestpao(str + str2 + str3)
+}
+
+function testfunc2() {
+ consolelogpao('testfunc2')
+
+}
+
+export default async (context, cmd, table, datakey = null, id = '') => {
+
+ // console.log('TABLE', table, 'cmd', cmd)
+ if (cmd === 'loadapp') {
+ // ****** LOAD APP AL CARICAMENTO ! *******
+ return saveConfigIndexDb(context)
+
+ } else if (cmd === 'write') {
+ if (GlobalStore) {
+ GlobalStore.state.connData.uploading_indexeddb = 1
+ }
+ return await storage.setdata(table, datakey)
+ } else if (cmd === 'updatefromIndexedDbToStateTodo') {
+ return await readfromIndexDbToStateTodos(context, table)
+ } else if (cmd === 'readall') {
+ if (GlobalStore) {
+ GlobalStore.state.connData.downloading_indexeddb = 1
+ }
+ return await storage.getalldata(table)
+ } else if (cmd === 'count') {
+ return await storage.count(table)
+ } else if (cmd === 'read') {
+ if (GlobalStore) {
+ GlobalStore.state.connData.downloading_indexeddb = 1
+ }
+ return await storage.getdata(table, id)
+ } else if (cmd === 'delete') {
+ if (GlobalStore) {
+ GlobalStore.state.connData.uploading_indexeddb = 1
+ }
+ return await storage.deletedata(table, id)
+ } else if (cmd === 'clearalldata') {
+ if (GlobalStore) {
+ GlobalStore.state.connData.uploading_indexeddb = 1
+ }
+ return await storage.clearalldata(table)
+ } else if (cmd === 'log') {
+ consolelogpao(table)
+ }
+}
diff --git a/src/globalroutines/util.ts b/src/globalroutines/util.ts
new file mode 100644
index 0000000..565e4c5
--- /dev/null
+++ b/src/globalroutines/util.ts
@@ -0,0 +1,23 @@
+import { UserStore } from "../store/Modules";
+import messages from "../statics/i18n";
+
+function translate(params) {
+ let msg = params.split('.')
+ let lang = UserStore.state.lang
+
+ let stringa = messages[lang]
+
+ let ris = stringa
+ if (ris !== undefined) {
+ msg.forEach(param => {
+ ris = ris[param]
+ })
+ } else {
+ console.log('ERRORE IN TRANSLATE! ', params, ' NON ESISTE!')
+ return params
+ }
+
+ return ris
+}
+
+export default translate
diff --git a/src/local-storage/index.ts b/src/local-storage/index.ts
new file mode 100644
index 0000000..e5dfc21
--- /dev/null
+++ b/src/local-storage/index.ts
@@ -0,0 +1,66 @@
+import { LocalStorage } from 'quasar'
+// import { onFail } from '../../_LOCALE/src/session/logout'
+// import appSetup from './app-setup'
+import config from '../config'
+
+let authorized = false
+
+export default () => {
+
+ // #Todo: Fix localStorage security ...
+ /*
+ if (config.localStorage.enableListener) {
+ window.addEventListener('storage', (e) => {
+ if (!authorized) {
+ console.warn('Unauthorized local storage change')
+ switch (config.localStorage.unauthChange) {
+ case 'block':
+ if (e.key === 'null' || e.key === null) {
+ reload()
+ } else {
+ _LocalStorage.setNative(e.key, e.oldValue)
+ }
+ break
+ case 'clear':
+ reload()
+ break
+ default:
+ reload()
+ break
+ }
+ }
+ }, false)
+ }
+ */
+ return Promise.resolve(true)
+}
+
+const reload = () => {
+ // onFail().then(success => appSetup())
+}
+
+export const _LocalStorage = {
+ setNative(key, value) {
+ authorized = true
+ localStorage.setItem(key, value)
+ authorized = false
+ },
+ set(key, value) {
+ authorized = true
+ LocalStorage.set(key, value)
+ authorized = false
+ },
+ remove(key) {
+ authorized = true
+ LocalStorage.remove(key)
+ authorized = false
+ },
+ clear() {
+ authorized = true
+ LocalStorage.clear()
+ authorized = false
+ },
+ get(key) {
+ return LocalStorage.get.item(key)
+ }
+}
diff --git a/src/middleware/auth.ts b/src/middleware/auth.ts
new file mode 100644
index 0000000..b01c5cf
--- /dev/null
+++ b/src/middleware/auth.ts
@@ -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/statics/css/dragula.css b/src/statics/css/dragula.css
new file mode 100644
index 0000000..b18c16e
--- /dev/null
+++ b/src/statics/css/dragula.css
@@ -0,0 +1,22 @@
+.gu-mirror {
+ position: fixed !important;
+ margin: 0 !important;
+ z-index: 9999 !important;
+ opacity: 0.8;
+ -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=80)";
+ filter: alpha(opacity=80);
+}
+.gu-hide {
+ display: none !important;
+}
+.gu-unselectable {
+ -webkit-user-select: none !important;
+ -moz-user-select: none !important;
+ -ms-user-select: none !important;
+ user-select: none !important;
+}
+.gu-transit {
+ opacity: 0.2;
+ -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=20)";
+ filter: alpha(opacity=20);
+}
diff --git a/src/statics/i18n.js b/src/statics/i18n.js
new file mode 100644
index 0000000..57155bb
--- /dev/null
+++ b/src/statics/i18n.js
@@ -0,0 +1,507 @@
+const messages = {
+ it: {
+ dialog: {
+ ok: 'Ok',
+ yes: 'Si',
+ no: 'No',
+ delete: 'Elimina',
+ cancel: 'Annulla',
+ msg: {
+ titledeleteTask: 'Elimina Task',
+ deleteTask: "Vuoi Eliminare {mytodo}?"
+ }
+ },
+ comp: {
+ Conta: "Conta",
+ },
+ msg: {
+ hello: 'Buongiorno',
+ myAppName: 'FreePlanet',
+ underconstruction: 'App in costruzione...',
+ myDescriz: '',
+ sottoTitoloApp: 'Il primo Vero Social',
+ sottoTitoloApp2: 'Libero, Equo e Solidale',
+ sottoTitoloApp3: 'dove Vive Consapevolezza e Aiuto Comunitario',
+ sottoTitoloApp4: 'Gratuito e senza Pubblicità',
+ },
+ homepage: {
+ descrapp_title1: 'Uniti per Evolvere e Sperimentare',
+ descrapp_pag1: 'Riscopri come il valore della Condivisione e della Cooperazione, possa aiutarci a ritrovare il profondo ' +
+ 'senso della Vita, perduto in questa società consumista, e riporti quei Sani Pricìpi Naturali ed Umani di Fratellanza' +
+ ' che intere popolazioni antiche conoscevano bene.',
+ descrapp_pag2: 'E\' giunta l\'ora di utilizzare i nuovi strumenti Tecnologici a nostro favore, per Liberarci ' +
+ 'così piano piano dalla schiavitù del "Lavoro per generare Denaro" e trasformando le nostre Capacitá in ' +
+ 'Risorse Umane per poterci sostenere e vivere in Armonia con gli altri.',
+ freesocial: {
+ title: 'Free Social',
+ descr: 'Una Community organizzata per Categorie, dove potrai unirti a Gruppi Tematici, ' +
+ 'Condividere Esperienze e unire Competenze per organizzare e sostenere Progetti Innovativi per il Popolo. ' +
+ 'Verranno evidenziati sviluppi Etici come l\'Auto-Produzione, la Sostenibilitá, ' +
+ 'la Buona Salute Naturale e il Rispetto per l\'Ambiente e per tutti gli Esseri Viventi di questo ' +
+ 'Pianeta. Chiunque potrá esprimere il proprio Consenso o Dissenso partecipando a Sondaggi Interattivi' +
+ ' e realizzare insieme i Cambiamenti necessari alla nostra Società.',
+ },
+ freetalent: {
+ title: 'Free Talent',
+ descr: 'Condividi i tuoi Talenti e Abilità, ' +
+ 'al posto del denaro guadagnagnerai Tempo. ' +
+ '"1 ora" diventa moneta di scambio, uguale per tutti, per adulti ed anziani, uomini e donne. ' +
+ 'Potrai utilizzare questi tuoi "Crediti Tempo" per soddisfare le tue necessità, cercando nelle Competenze Disponibili. ' +
+ 'Nel Dare e Ricevere, si creeranno così legami di Amicizia, Solidarietà e Cooperazione di cui l\'Essere Umano ha bisogno per potersi esprimere ' +
+ 'pienamente.
' +
+ 'Questo progetto vuole diffondere, in maniera informatizzata, questa realtà che gia esiste da tanti anni, e viene chiamata "Banca del Tempo". ' +
+ 'Le segreterie sparse in tutto il mondo, serviranno a dare maggiore affidabilità e fiducia negli scambi di talenti tra persone sconosciute. ' +
+ 'Creeremo così una rete di fiducia nel vicinato, come giá viene praticato in numerosi Ecovillaggi e Comunità del mondo. ',
+ },
+ freegas: {
+ title: 'Free G.A.S.',
+ descr: 'Ti piacerebbe utilizzare una App che ti permetta facilmente di acquistare Prodotti Locali direttamente dal Produttore? ' +
+ 'Con i Gruppi di Acquisto Solidale si evitano intermediazioni inutili, ottenendo parecchi benefici tra cui: ' +
+ '
Qualitá Superiore del prodotto
' +
+ '
Le Recensioni dei consumatori favoriranno i Produttori con Sani Intenti
' +
+ '
Possiblità d\'interagire con il Produttore
' +
+ '
Apertura alle Relazioni tra persone, condividendo Ricette e Consigli preziosi
' +
+ '
Risparmio di soldi (prezzi all\'Ingrosso)
' +
+ '
Valorizzare il Territorio e l\'Economia Locale
' +
+ '
Condizioni Eque per i Lavoratori
' +
+ '
Ridotto Impatto Ambientale
',
+ },
+ freeliving: {
+ title: 'Free Living',
+ descr: 'Una soluzione meravigliosa per unire 2 realtà: ' +
+ '1) Il Vivere soli in una casa grande. ' +
+ '2) l\'avere bisogno di un alloggio temporaneo. ' +
+ 'Tante persone Anziane (e non) abitano da sole e vorrebbero continuare a vivere nella propria abitazione, ma hanno difficoltà a farlo. ' +
+ 'Altre persone invece hanno bisogno di una stanza, per scelta o per necessita, ed in cambio sono disponibili a ' +
+ 'contribuire alle spese per le utenze domestiche o magari aiutare la persona anziana a fare la spesa, cucinare, pulire casa oppure offrendogli semplicemente compagnia. ' +
+ 'Tramite questo strumento, le persone potranno mettersi in contatto e decidere in che forma co-abitare. Le recensioni rilasciate ed il dettaglio dei profili utenti, ' +
+ 'aiuterà nella scelta della persona più in sintonia.'
+
+ },
+ freecollabora: {
+ title: 'Chi può Collaborare con Noi?',
+ descr: 'Tutti coloro che sono in linea con Princìpi Etici e ricerca del Benessere Globale del Pianeta ' +
+ 'Sono i benvenuti:' +
+ '
' +
+ '
Associazioni, Ecovillaggi, Comunità
' +
+ '
Gruppi che intendono promuovere Progetti Sociali Innovativi per una Decrescita Felice
' +
+ '
Chi gestisce un Gruppo di Acquisto Solidale (G.A.S.)
' +
+ '
Chi gestisce una Banca del Tempo
' +
+ '
Chiunque voglia aiutare, nella forma che ritiene più opportuna.
Condividendo il progetto a Gruppi, Comunità, Associazioni No-profit, G.A.S.
' +
+ '
Rispondendo attivamente ai Sondaggi Popolari e lasciando Feedback
' +
+ '
Effettuando piccole donazioni (anche 1€). ' +
+ 'Il ricavato, tolti i costi, verrá ripartito al 50% per il lavoro svolto, ' +
+ 'l\'altro per sostenere Progetti Sociali votati dalle persone stesse