Files
freeplanet/src/store/Modules/Projects.ts

335 lines
9.1 KiB
TypeScript
Raw Normal View History

import { IProject, IProjectsState, IDrag, IMenuList } from 'model'
2019-03-22 20:51:42 +01:00
import { storeBuilder } from './Store/Store'
import Api from '@api'
import { tools } from './tools'
import * as ApiTables from './ApiTables'
import { GlobalStore, UserStore } from '@store'
import globalroutines from './../../globalroutines/index'
import objectId from '@src/js/objectId'
import { costanti } from '@src/store/Modules/costanti'
2019-03-28 12:58:34 +01:00
const nametable = 'projects'
2019-03-22 20:51:42 +01:00
// import _ from 'lodash'
const stateglob: IProjectsState = {
2019-03-22 20:51:42 +01:00
showtype: costanti.ShowTypeTask.SHOW_LAST_N_COMPLETED,
2019-03-28 12:58:34 +01:00
projects: [],
2019-03-22 20:51:42 +01:00
insidePending: false,
visuLastCompleted: 10
}
const listFieldsToChange: string [] = ['descr', 'longdescr', 'hoursplanned', 'hoursworked', 'id_parent', 'statusproj', 'category', 'expiring_at', 'priority', 'id_prev', 'pos', 'enableExpiring', 'progress', 'live_url', 'test_url', 'begin_development', 'begin_test']
2019-03-22 20:51:42 +01:00
const b = storeBuilder.module<IProjectsState>('Projects', stateglob)
2019-03-22 20:51:42 +01:00
const stateGetter = b.state()
2019-03-28 12:58:34 +01:00
function getarrByCategory(category: string) {
if (!stateglob.projects) {
2019-03-22 20:51:42 +01:00
return []
}
return stateglob.projects
2019-03-22 20:51:42 +01:00
}
function initcat() {
const rec = Getters.getters.getRecordEmpty()
rec.userId = UserStore.state.userId
return rec
2019-03-22 20:51:42 +01:00
}
namespace Getters {
const getRecordEmpty = b.read((state: IProjectsState) => (): IProject => {
2019-04-05 16:16:29 +02:00
// const tomorrow = tools.getDateNow()
// tomorrow.setDate(tomorrow.getDate() + 1)
const obj: IProject = {
_id: objectId(),
descr: '',
longdescr: '',
id_parent: '',
priority: tools.Priority.PRIORITY_NORMAL,
statusproj: tools.Status.OPENED,
2019-04-05 16:16:29 +02:00
created_at: tools.getDateNow(),
modify_at: tools.getDateNow(),
completed_at: tools.getDateNull(),
category: '',
// expiring_at: tomorrow,
enableExpiring: false,
id_prev: '',
pos: 0,
modified: false,
hoursworked: 0,
hoursplanned: 0,
live_url: '',
test_url: '',
2019-04-05 16:16:29 +02:00
progressCalc: 0,
begin_development: tools.getDateNull(),
begin_test: tools.getDateNull()
}
return obj
}, 'getRecordEmpty')
const items_dacompletare = b.read((state: IProjectsState) => (id_parent: string): IProject[] => {
2019-03-28 12:58:34 +01:00
if (state.projects) {
// console.log('state.projects', state.projects)
return tools.mapSort(state.projects.filter((proj) => proj.id_parent === id_parent))
2019-03-22 20:51:42 +01:00
} else {
return []
}
2019-03-28 12:58:34 +01:00
}, 'items_dacompletare')
2019-03-22 20:51:42 +01:00
const listaprojects = b.read((state: IProjectsState) => (): IMenuList[] => {
if (state.projects) {
// console.log('state.projects', state.projects)
const listaproj = tools.mapSort(state.projects.filter((proj) => proj.id_parent === process.env.PROJECT_ID_MAIN))
const myarr: IMenuList[] = []
for (const proj of listaproj) {
myarr.push({nametranslate: '', description: proj.descr, idelem: proj._id})
}
return myarr
} else {
return []
}
}, 'listaprojects')
const getDescrById = b.read((state: IProjectsState) => (id: string): string => {
if (id === process.env.PROJECT_ID_MAIN)
return 'Projects'
2019-03-28 12:58:34 +01:00
if (state.projects) {
const itemtrov = state.projects.find((item) => item._id === id)
if (!!itemtrov)
return itemtrov.descr
2019-03-22 20:51:42 +01:00
}
return ''
}, 'getDescrById')
const getParentById = b.read((state: IProjectsState) => (id: string): string => {
2019-03-28 12:58:34 +01:00
if (state.projects) {
const itemfound = state.projects.find((item) => item._id === id)
if (!!itemfound) {
return itemfound.id_parent
}
}
return ''
}, 'getParentById')
const getRecordById = b.read((state: IProjectsState) => (id: string): IProject => {
if (state.projects) {
return state.projects.find((item) => item._id === id)
2019-03-22 20:51:42 +01:00
}
return null
}, 'getRecordById')
2019-03-22 20:51:42 +01:00
export const getters = {
get getRecordEmpty() {
return getRecordEmpty()
},
2019-03-28 12:58:34 +01:00
get items_dacompletare() {
return items_dacompletare()
2019-03-22 20:51:42 +01:00
},
get listaprojects() {
return listaprojects()
},
get getDescrById() {
return getDescrById()
2019-03-22 20:51:42 +01:00
},
get getParentById() {
return getParentById()
2019-03-22 20:51:42 +01:00
},
get getRecordById() {
return getRecordById()
2019-03-22 20:51:42 +01:00
}
2019-03-22 20:51:42 +01:00
}
}
namespace Mutations {
function createNewItem(state: IProjectsState, { objproj, atfirst, categorySel }) {
// console.log('createNewItem', objproj, 'cat=', categorySel, 'state.projects', state.projects)
2019-03-28 12:58:34 +01:00
if (state.projects === undefined) {
state.projects = []
state.projects.push(objproj)
console.log('push state.projects', state.projects)
2019-03-22 20:51:42 +01:00
return
}
if (atfirst) {
2019-03-28 12:58:34 +01:00
state.projects.unshift(objproj)
2019-03-22 20:51:42 +01:00
}
else {
2019-03-28 12:58:34 +01:00
state.projects.push(objproj)
2019-03-22 20:51:42 +01:00
}
// console.log('state.projects', state.projects)
2019-03-22 20:51:42 +01:00
}
function deletemyitem(state: IProjectsState, myitem: IProject) {
// Find record
2019-03-28 12:58:34 +01:00
const ind = tools.getIndexById(state.projects, myitem._id)
2019-03-22 20:51:42 +01:00
2019-03-28 12:58:34 +01:00
ApiTables.removeitemfromarray(state.projects, ind)
2019-03-22 20:51:42 +01:00
}
export const mutations = {
deletemyitem: b.commit(deletemyitem),
createNewItem: b.commit(createNewItem)
}
}
namespace Actions {
async function dbLoad(context, { checkPending, onlyiffirsttime }) {
if (onlyiffirsttime) {
if (stateglob.projects.length > 0) {
// if already set, then exit.
return false
}
}
2019-03-22 20:51:42 +01:00
if (UserStore.state.userId === '') {
return false // Login not made
}
console.log('dbLoad', nametable, checkPending, 'userid=', UserStore.state.userId)
2019-03-22 20:51:42 +01:00
const ris = await Api.SendReq('/projects/' + UserStore.state.userId, 'GET', null)
.then((res) => {
2019-03-28 12:58:34 +01:00
if (res.data.projects) { // console.log('RISULTANTE CATEGORIES DAL SERVER = ', res.data.categories)
stateglob.projects = res.data.projects
2019-03-22 20:51:42 +01:00
} else {
stateglob.projects = []
2019-03-22 20:51:42 +01:00
}
stateglob.showtype = parseInt(GlobalStore.getters.getConfigStringbyId({
2019-03-22 20:51:42 +01:00
id: costanti.CONFIG_ID_SHOW_TYPE_TODOS,
default: costanti.ShowTypeTask.SHOW_LAST_N_COMPLETED
}), 10)
if (process.env.DEBUG === '1') {
console.log('dbLoad', 'state.projects', stateglob.projects)
2019-03-22 20:51:42 +01:00
}
return res
})
.catch((error) => {
2019-03-28 12:58:34 +01:00
console.log('error dbLoad', error)
2019-03-22 20:51:42 +01:00
UserStore.mutations.setErrorCatch(error)
return error
})
ApiTables.aftercalling(ris, checkPending, nametable)
2019-03-22 20:51:42 +01:00
}
async function deleteItem(context, { idobj }) {
2019-03-22 20:51:42 +01:00
console.log('deleteItem: KEY = ', idobj)
const myarr = getarrByCategory('')
2019-03-22 20:51:42 +01:00
const myobjtrov = tools.getElemById(myarr, idobj)
console.log('myobjtrov', myobjtrov.descr)
if (!!myobjtrov) {
const myobjnext = tools.getElemPrevById(myarr, myobjtrov._id)
if (!!myobjnext) {
myobjnext.id_prev = myobjtrov.id_prev
myobjnext.modified = true
await modify(context, { myitem: myobjnext, field: 'id_prev' })
}
ApiTables.table_DeleteRecord(nametable, myobjtrov, idobj)
}
}
2019-03-28 12:58:34 +01:00
async function dbInsert(context, { myobj, atfirst }) {
2019-03-22 20:51:42 +01:00
const objproj = initcat()
objproj.descr = myobj.descr
objproj.category = myobj.category
objproj.id_parent = myobj.id_parent
2019-03-22 20:51:42 +01:00
let elemtochange: IProject = null
2019-03-28 12:58:34 +01:00
const myarr = getarrByCategory(objproj.category)
2019-03-22 20:51:42 +01:00
if (atfirst) {
console.log('INSERT AT THE TOP')
elemtochange = tools.getFirstList(myarr)
objproj.id_prev = ApiTables.LIST_START
} else {
console.log('INSERT AT THE BOTTOM')
// INSERT AT THE BOTTOM , so GET LAST ITEM
const lastelem = tools.getLastListNotCompleted(nametable, objproj.id_parent)
2019-03-22 20:51:42 +01:00
objproj.id_prev = (!!lastelem) ? lastelem._id : ApiTables.LIST_START
}
objproj.modified = false
Mutations.mutations.createNewItem({ objproj, atfirst, categorySel: objproj.category }) // 1) Create record in Memory
const id = await globalroutines(context, 'write', nametable, objproj) // 2) Insert into the IndexedDb
let field = ''
if (atfirst) { // update also the last elem
if (!!elemtochange) {
elemtochange.id_prev = id
console.log('elemtochange', elemtochange)
field = 'id_prev'
// Modify the other record
await modify(context, { myitem: elemtochange, field })
}
}
// 3) send to the Server
await ApiTables.Sync_SaveItem(nametable, 'POST', objproj)
return id
2019-03-22 20:51:42 +01:00
}
2019-04-05 23:59:52 +02:00
async function modify(context, { myitem, field } ) {
return await ApiTables.table_ModifyRecord(nametable, myitem, listFieldsToChange, field)
2019-03-22 20:51:42 +01:00
}
async function swapElems(context, itemdragend: IDrag) {
console.log('PROJECT swapElems', itemdragend, stateglob.projects)
2019-03-22 20:51:42 +01:00
const myarr = Getters.getters.items_dacompletare(itemdragend.id_proj)
2019-03-22 20:51:42 +01:00
2019-04-05 23:59:52 +02:00
tools.swapGeneralElem(nametable, myarr, itemdragend, listFieldsToChange)
2019-03-22 20:51:42 +01:00
}
export const actions = {
2019-03-28 12:58:34 +01:00
dbLoad: b.dispatch(dbLoad),
2019-03-22 20:51:42 +01:00
swapElems: b.dispatch(swapElems),
deleteItem: b.dispatch(deleteItem),
2019-03-28 12:58:34 +01:00
dbInsert: b.dispatch(dbInsert),
2019-03-22 20:51:42 +01:00
modify: b.dispatch(modify)
}
}
// Module
const ProjectsModule = {
get state() {
return stateGetter()
},
getters: Getters.getters,
mutations: Mutations.mutations,
actions: Actions.actions
}
export default ProjectsModule