++ hoursweeky_plannedtowork, endwork_estimate, totalphases , actualphase

This commit is contained in:
Paolo Arena
2019-04-07 21:24:10 +02:00
parent f60edc1c5b
commit 884d84e2df
14 changed files with 239 additions and 108 deletions

View File

@@ -10,9 +10,11 @@ import { date } from 'quasar'
export default class CDate extends Vue { export default class CDate extends Vue {
@Prop() public mydate!: Date @Prop() public mydate!: Date
@Prop({ required: false }) public label: string @Prop({ required: false, default: '' }) public label: string
@Prop({ required: false, default: '' }) public data_class!: string @Prop({ required: false, default: '' }) public data_class!: string
@Prop({ required: false, default: false }) public readonly!: boolean @Prop({ required: false, default: false }) public readonly!: boolean
@Prop({ required: false, default: false }) public disable!: boolean
@Prop({ required: false, default: '' }) public color!: string
public mystyleicon: string = 'font-size: 1.5rem;' public mystyleicon: string = 'font-size: 1.5rem;'

View File

@@ -1,5 +1,5 @@
<template> <template>
<q-input :class="data_class" :readonly="readonly" :disable="readonly" debounce="1000" dense :value="getdatestring" stack-label :label="label" @input="changedate"> <q-input :class="data_class" :bg-color="color" :readonly="readonly" :disable="disable" debounce="1000" dense :value="getdatestring" stack-label :label="label" @input="changedate">
<template v-slot:append> <template v-slot:append>
<q-icon name="event" class="cursor-pointer" :style="mystyleicon"> <q-icon name="event" class="cursor-pointer" :style="mystyleicon">
<q-popup-proxy v-if="!readonly" ref="datePicker"> <q-popup-proxy v-if="!readonly" ref="datePicker">

View File

@@ -68,14 +68,23 @@ export default class SingleProject extends Vue {
@Watch('itemproject.begin_development') public valueChangedbegin_development() { @Watch('itemproject.begin_development') public valueChangedbegin_development() {
this.watchupdate('begin_development') this.watchupdate('begin_development')
} }
@Watch('itemproject.hoursweeky_plannedtowork') public valueChangedhoursweeky_plannedtowork() {
this.watchupdate('hoursweeky_plannedtowork')
}
@Watch('itemproject.begin_test') public valueChangedbegin_test() { @Watch('itemproject.begin_test') public valueChangedbegin_test() {
this.watchupdate('begin_test') this.watchupdate('begin_test')
} }
@Watch('itemproject.actualphase') public valueChangedactualphase() {
this.watchupdate('actualphase')
}
@Watch('itemproject.totalphases') public valueChangedtotalphases() {
this.watchupdate('totalphases')
}
@Watch('itemproject.progressCalc') public valueChanged6() { @Watch('itemproject.progressCalc') public valueChanged6() {
console.log('itemproject.progressCalc') console.log('itemproject.progressCalc')
this.updateClasses() this.updateClasses()
console.log('this.percentageProgress', this.percentageProgress, 'this.itemproject.progressCalc', this.itemproject.progressCalc) // console.log('this.percentageProgress', this.percentageProgress, 'this.itemproject.progressCalc', this.itemproject.progressCalc)
this.watchupdate('progressCalc') this.watchupdate('progressCalc')
} }

View File

@@ -70,8 +70,7 @@ export default class SingleTodo extends Vue {
console.log('itemtodo.hoursplanned', this.itemtodo.hoursplanned) console.log('itemtodo.hoursplanned', this.itemtodo.hoursplanned)
this.watchupdate('hoursplanned') this.watchupdate('hoursplanned')
} }
// ++TODO: FIX! STATUSTODO WILL NOT UPDATE IF I DON'T PUT { immediate: true } parameter. ! WHY??? @Watch('itemtodo.statustodo') public valueChangedstatus() {
@Watch('itemtodo.statustodo', {immediate: true}) public valueChangedstatus() {
console.log('itemtodo.statustodo', this.itemtodo.statustodo) console.log('itemtodo.statustodo', this.itemtodo.statustodo)
this.watchupdate('statustodo') this.watchupdate('statustodo')
} }

View File

@@ -9,8 +9,6 @@ export interface IProject {
id_parent?: string id_parent?: string
descr?: string descr?: string
longdescr?: string longdescr?: string
hoursplanned?: number
hoursworked?: number
priority?: number priority?: number
statusproj?: number statusproj?: number
created_at?: Date created_at?: Date
@@ -22,33 +20,19 @@ export interface IProject {
modified?: boolean modified?: boolean
pos?: number pos?: number
order?: number order?: number
progressCalc?: number
live_url?: string live_url?: string
test_url?: string test_url?: string
hoursplanned?: number
hoursworked?: number
progressCalc?: number
begin_development?: Date begin_development?: Date
hoursweeky_plannedtowork?: number
endwork_estimate?: Date
begin_test?: Date begin_test?: Date
totalphases?: number
actualphase?: number
} }
export interface IParamIProject {
categorySel?: string
checkPending?: boolean
id?: string
objtodo?: IProject
atfirst?: boolean
}
/*
export interface IDrag {
field?: string
idelemtochange?: string
prioritychosen?: number
oldIndex?: number
newIndex?: number
category: string
atfirst?: boolean
}
*/
export interface IProjectsState { export interface IProjectsState {
showtype: number showtype: number
projects: IProject[] projects: IProject[]

View File

@@ -248,7 +248,11 @@ const messages = {
hoursworked: 'Ore Lavorate', hoursworked: 'Ore Lavorate',
begin_development: 'Inizio Sviluppo', begin_development: 'Inizio Sviluppo',
begin_test: 'Inizio Test', begin_test: 'Inizio Test',
progresstask: 'Progressione' progresstask: 'Progressione',
actualphase: 'Fase Attuale',
hoursweeky_plannedtowork: 'Ore settimanali previste',
endwork_estimate: 'Data fine lavori stimata',
totalphases: 'Totale Fasi'
} }
}, },
'es': { 'es': {
@@ -494,7 +498,11 @@ const messages = {
hoursworked: 'Horas Trabajadas', hoursworked: 'Horas Trabajadas',
begin_development: 'Comienzo desarrollo', begin_development: 'Comienzo desarrollo',
begin_test: 'Comienzo Prueba', begin_test: 'Comienzo Prueba',
progresstask: 'Progresion' progresstask: 'Progresion',
actualphase: 'Fase Actual',
hoursweeky_plannedtowork: 'Horarios semanales programados',
endwork_estimate: 'Fecha estimada de finalización',
totalphases: 'Fases totales'
} }
}, },
'enUs': { 'enUs': {
@@ -740,7 +748,11 @@ const messages = {
hoursworked: 'Worked Hours', hoursworked: 'Worked Hours',
begin_development: 'Start Dev', begin_development: 'Start Dev',
begin_test: 'Start Test', begin_test: 'Start Test',
progresstask: 'Progression' progresstask: 'Progression',
actualphase: 'Actual Phase',
hoursweeky_plannedtowork: 'Scheduled weekly hours',
endwork_estimate: 'Estimated completion date',
totalphases: 'Total Phase'
} }
}, },
}; };

View File

@@ -9,7 +9,7 @@ export { addAuthHeaders, removeAuthHeaders, API_URL } from './Instance'
import Paths from '@paths' import Paths from '@paths'
import { tools } from '@src/store/Modules/tools' import { tools } from '@src/store/Modules/tools'
import { GlobalStore, UserStore } from '@modules' import { GlobalStore, Projects, UserStore } from '@modules'
import globalroutines from './../../globalroutines/index' import globalroutines from './../../globalroutines/index'
import { serv_constants } from '@src/store/Modules/serv_constants' import { serv_constants } from '@src/store/Modules/serv_constants'
import router from '@router' import router from '@router'
@@ -122,6 +122,21 @@ export namespace ApiTool {
}) })
} }
function ReceiveResponsefromServer(tablesync, nametab, method, risdata) {
// console.log('ReceiveResponsefromServer', nametab, method, risdata)
if (!!risdata) {
// Updated somw data after Server arrived data.
if (method === 'PATCH') {
if (nametab === 'projects') {
if (!!risdata.projectris) {
const copyrec = tools.jsonCopy(risdata.projectris)
Projects.mutations.updateProject({ objproj: copyrec })
}
}
}
}
}
export async function syncAlternative(mystrparam) { export async function syncAlternative(mystrparam) {
// console.log('[ALTERNATIVE Background syncing', mystrparam) // console.log('[ALTERNATIVE Background syncing', mystrparam)
@@ -155,7 +170,8 @@ export namespace ApiTool {
// Insert/Delete/Update table to the server // Insert/Delete/Update table to the server
return SendReq(link, method, rec) return SendReq(link, method, rec)
.then(() => { .then((ris) => {
ReceiveResponsefromServer(tablesync, nametab, method, ris.data)
lettoqualcosa = true lettoqualcosa = true
return globalroutines(null, 'delete', tablesync, null, rec._id) return globalroutines(null, 'delete', tablesync, null, rec._id)
}) })

View File

@@ -20,7 +20,9 @@ const stateglob: IProjectsState = {
visuLastCompleted: 10 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'] const listFieldsToChange: string [] = ['descr', 'longdescr', 'hoursplanned', 'hoursworked', 'id_parent', 'statusproj', 'category', 'expiring_at', 'priority', 'id_prev', 'pos', 'enableExpiring', 'progressCalc', 'live_url', 'test_url', 'begin_development', 'begin_test', 'actualphase', 'totalphases', 'hoursweeky_plannedtowork', 'endwork_estimate']
const listFieldsUpdateCalculation: string [] = ['hoursplanned', 'hoursworked', 'progressCalc', 'endwork_estimate']
const b = storeBuilder.module<IProjectsState>('Projects', stateglob) const b = storeBuilder.module<IProjectsState>('Projects', stateglob)
const stateGetter = b.state() const stateGetter = b.state()
@@ -39,6 +41,12 @@ function initcat() {
return rec return rec
} }
function updateDataCalculated(projout, projin) {
listFieldsUpdateCalculation.forEach((field) => {
projout[field] = projin[field];
});
}
namespace Getters { namespace Getters {
const getRecordEmpty = b.read((state: IProjectsState) => (): IProject => { const getRecordEmpty = b.read((state: IProjectsState) => (): IProject => {
// const tomorrow = tools.getDateNow() // const tomorrow = tools.getDateNow()
@@ -60,13 +68,17 @@ namespace Getters {
id_prev: '', id_prev: '',
pos: 0, pos: 0,
modified: false, modified: false,
hoursworked: 0,
hoursplanned: 0,
live_url: '', live_url: '',
test_url: '', test_url: '',
totalphases: 1,
actualphase: 1,
hoursworked: 0,
hoursplanned: 0,
progressCalc: 0, progressCalc: 0,
begin_development: tools.getDateNull(), begin_development: tools.getDateNull(),
begin_test: tools.getDateNull() begin_test: tools.getDateNull(),
hoursweeky_plannedtowork: 0,
endwork_estimate: tools.getDateNull()
} }
return obj return obj
@@ -87,7 +99,7 @@ namespace Getters {
const listaproj = tools.mapSort(state.projects.filter((proj) => proj.id_parent === process.env.PROJECT_ID_MAIN)) const listaproj = tools.mapSort(state.projects.filter((proj) => proj.id_parent === process.env.PROJECT_ID_MAIN))
const myarr: IMenuList[] = [] const myarr: IMenuList[] = []
for (const proj of listaproj) { for (const proj of listaproj) {
myarr.push({nametranslate: '', description: proj.descr, idelem: proj._id}) myarr.push({ nametranslate: '', description: proj.descr, idelem: proj._id })
} }
return myarr return myarr
@@ -165,9 +177,20 @@ namespace Mutations {
else { else {
state.projects.push(objproj) state.projects.push(objproj)
} }
}
// console.log('state.projects', state.projects) function updateProject(state: IProjectsState, { objproj }) {
if (!!objproj) {
console.log('updateProject', objproj)
const index = tools.getIndexById(state.projects, objproj._id)
console.log('index', index)
if (index >= 0) {
updateDataCalculated(state.projects[index], objproj)
// state.projects.splice(index, 1, objproj)
// tools.notifyarraychanged(state.projects)
}
}
} }
function deletemyitem(state: IProjectsState, myitem: IProject) { function deletemyitem(state: IProjectsState, myitem: IProject) {
@@ -179,7 +202,8 @@ namespace Mutations {
export const mutations = { export const mutations = {
deletemyitem: b.commit(deletemyitem), deletemyitem: b.commit(deletemyitem),
createNewItem: b.commit(createNewItem) createNewItem: b.commit(createNewItem),
updateProject: b.commit(updateProject)
} }
} }
@@ -298,7 +322,7 @@ namespace Actions {
return id return id
} }
async function modify(context, { myitem, field } ) { async function modify(context, { myitem, field }) {
return await ApiTables.table_ModifyRecord(nametable, myitem, listFieldsToChange, field) return await ApiTables.table_ModifyRecord(nametable, myitem, listFieldsToChange, field)
} }

View File

@@ -6,5 +6,7 @@ export const costanti = {
}, },
CONFIG_ID_CFG: '1', CONFIG_ID_CFG: '1',
CONFIG_ID_STATE_CONN: '2', CONFIG_ID_STATE_CONN: '2',
CONFIG_ID_SHOW_TYPE_TODOS: '3' CONFIG_ID_SHOW_TYPE_TODOS: '3',
MAX_PHASES: 5
} }

View File

@@ -153,7 +153,7 @@ export const tools = {
icon: 'expand_less' icon: 'expand_less'
}, },
{ {
id: 2, id: 3,
label: 'Completato', label: 'Completato',
value: 10, // Status.COMPLETED value: 10, // Status.COMPLETED
icon: 'expand_less' icon: 'expand_less'
@@ -174,7 +174,7 @@ export const tools = {
icon: 'expand_less' icon: 'expand_less'
}, },
{ {
id: 2, id: 3,
label: 'Completado', label: 'Completado',
value: 10, // Status.COMPLETED value: 10, // Status.COMPLETED
icon: 'expand_less' icon: 'expand_less'
@@ -195,7 +195,7 @@ export const tools = {
icon: 'expand_less' icon: 'expand_less'
}, },
{ {
id: 2, id: 3,
label: 'Completed', label: 'Completed',
value: 10, // Status.COMPLETED value: 10, // Status.COMPLETED
icon: 'expand_less' icon: 'expand_less'
@@ -691,10 +691,7 @@ export const tools = {
} }
, ,
logga_arrproj(myarr logga_arrproj(myarr: IProject[]) {
:
IProject[]
) {
let mystr = '\n' let mystr = '\n'
myarr.forEach((item) => { myarr.forEach((item) => {
mystr += tools.getelemprojstr(item) + ' ' mystr += tools.getelemprojstr(item) + ' '
@@ -795,18 +792,18 @@ export const tools = {
console.log('swapElems PRIORITY', itemdragend) console.log('swapElems PRIORITY', itemdragend)
} }
console.log('swapGeneralElem', 'new =', itemdragend.newIndex, 'Old =', itemdragend.oldIndex, itemdragend)
if (itemdragend.newIndex === itemdragend.oldIndex) { if (itemdragend.newIndex === itemdragend.oldIndex) {
return return
} }
console.log('swapGeneralElem', 'new =', itemdragend.newIndex, 'Old =', itemdragend.oldIndex, itemdragend)
if (tools.isOkIndex(myarr, itemdragend.newIndex) && tools.isOkIndex(myarr, itemdragend.oldIndex)) { if (tools.isOkIndex(myarr, itemdragend.newIndex) && tools.isOkIndex(myarr, itemdragend.oldIndex)) {
console.log('SPLICE!') console.log('SPLICE!')
console.log(' PRIMA!', tools.logga_arrproj(myarr)) // console.log(' PRIMA!', tools.logga_arrproj(myarr))
myarr.splice(itemdragend.newIndex, 0, myarr.splice(itemdragend.oldIndex, 1)[0]) myarr.splice(itemdragend.newIndex, 0, myarr.splice(itemdragend.oldIndex, 1)[0])
console.log(' DOPO!', tools.logga_arrproj(myarr)) // console.log(' DOPO!', tools.logga_arrproj(myarr))
// Ora inverti gli indici // Ora inverti gli indici
const indold = itemdragend.oldIndex const indold = itemdragend.oldIndex
@@ -874,7 +871,7 @@ export const tools = {
, ,
getElemById(myarr, id) { getElemById(myarr, id) {
console.log('getElemById', myarr, id) // console.log('getElemById', myarr, id)
return myarr.find((elem) => elem._id === id) return myarr.find((elem) => elem._id === id)
} }
, ,
@@ -1271,6 +1268,7 @@ export const tools = {
, ,
getTimestampsNow() { getTimestampsNow() {
return new Date().valueOf() return new Date().valueOf()
} },
} }

View File

@@ -182,3 +182,7 @@ $heightBtn: 100%;
text-align: center; text-align: center;
//line-height: $heightitem; //line-height: $heightitem;
} }
.endwork_estimate {
color: blue;
}

View File

@@ -13,7 +13,7 @@ import { UserStore } from '@store'
import { Getter } from 'vuex-class' import { Getter } from 'vuex-class'
import { Screen } from 'quasar' import { date, Screen } from 'quasar'
import { CProgress } from '../../../components/CProgress' import { CProgress } from '../../../components/CProgress'
import { CDate } from '../../../components/CDate' import { CDate } from '../../../components/CDate'
@@ -45,7 +45,7 @@ export default class ProjList extends Vue {
public splitterModel = 50 // start at 50% public splitterModel = 50 // start at 50%
public itemproj: IProject = null public itemproj: IProject = null
public idsel: string = '' public idsel: string = ''
public itemsel: IProject = Projects.getters.getRecordEmpty() public itemselproj: IProject = Projects.getters.getRecordEmpty()
public itemtodosel: ITodo = Todos.getters.getRecordEmpty() public itemtodosel: ITodo = Todos.getters.getRecordEmpty()
public whatisSel: number = 0 public whatisSel: number = 0
public colProgress: string = 'blue' public colProgress: string = 'blue'
@@ -59,13 +59,35 @@ export default class ProjList extends Vue {
ctodo: CTodo ctodo: CTodo
} }
@Getter('items_dacompletare', { namespace })
public items_dacompletare: (state: IProjectsState, id_parent: string) => IProject[]
@Watch('items_dacompletare')
public changeitems() {
this.idProjParentAtt = Projects.getters.getParentById(this.idProjAtt)
}
@Watch('$route.params.idProj')
public changeparent() {
this.idProjAtt = this.$route.params.idProj
this.idProjParentAtt = Projects.getters.getParentById(this.idProjAtt)
this.selproj()
}
@Watch('itemselproj.progressCalc')
public changeprogress() {
this.updateclasses()
}
get getidProjParentAtt() { get getidProjParentAtt() {
return this.idProjParentAtt return this.idProjParentAtt
} }
public watchupdatetodo(field = '') { // I use this because the statustodo will disappear from the UI, so it won't call the status changed...
console.log('watchupdatetodo', field) // in this case I need to call manually the modify.
this.$emit('eventupdate', {myitem: this.itemtodosel, field } ) public modifyfieldtodo(field) {
console.log('modifyfieldtodo', field)
Todos.actions.modify({ myitem: this.itemtodosel, field })
} }
get getrouteup() { get getrouteup() {
@@ -103,26 +125,6 @@ export default class ProjList extends Vue {
return Projects.getters.getDescrById(this.idProjAtt) return Projects.getters.getDescrById(this.idProjAtt)
} }
@Getter('items_dacompletare', { namespace })
public items_dacompletare: (state: IProjectsState, id_parent: string) => IProject[]
@Watch('items_dacompletare')
public changeitems() {
this.idProjParentAtt = Projects.getters.getParentById(this.idProjAtt)
}
@Watch('$route.params.idProj')
public changeparent() {
this.idProjAtt = this.$route.params.idProj
this.idProjParentAtt = Projects.getters.getParentById(this.idProjAtt)
this.selproj()
}
@Watch('itemsel.progressCalc')
public changeprogress() {
this.updateclasses()
}
public showTask(field_value) { public showTask(field_value) {
return field_value === tools.MenuAction.SHOW_TASK return field_value === tools.MenuAction.SHOW_TASK
} }
@@ -257,7 +259,7 @@ export default class ProjList extends Vue {
public setidsel(id: string) { public setidsel(id: string) {
this.idsel = id this.idsel = id
this.whatisSel = tools.WHAT_PROJECT this.whatisSel = tools.WHAT_PROJECT
this.itemsel = Projects.getters.getRecordById(this.idsel) this.itemselproj = Projects.getters.getRecordById(this.idsel)
} }
public setitemsel(item: ITodo) { public setitemsel(item: ITodo) {
this.whatisSel = tools.WHAT_TODO this.whatisSel = tools.WHAT_TODO
@@ -331,13 +333,61 @@ export default class ProjList extends Vue {
} }
public updateclasses() { public updateclasses() {
this.colProgress = tools.getProgressColor(this.itemsel.progressCalc) this.colProgress = tools.getProgressColor(this.itemselproj.progressCalc)
} }
public checkUpdate() { public checkUpdate() {
ApiTables.waitAndcheckPendingMsg() ApiTables.waitAndcheckPendingMsg()
} }
get getCalcHoursWorked() {
if (this.itemselproj.hoursplanned <= 0) {
return 0
}
return Math.round(this.itemselproj.hoursworked / this.itemselproj.hoursplanned * 100)
}
get calcprogressWeekly() {
if (this.itemselproj.hoursplanned <= 0) {
return 0
}
return Math.round(this.itemselproj.hoursworked / this.itemselproj.hoursplanned * 100)
}
get calcEndWork_Estimate() {
if (date.isValid(this.itemselproj.begin_development) && (this.itemselproj.hoursweeky_plannedtowork > 0)) {
const hoursw = this.itemselproj.hoursweeky_plannedtowork
try {
let orerimaste = this.itemselproj.hoursplanned - this.itemselproj.hoursworked
if (orerimaste < 0) {
orerimaste = 0
}
const weeks = orerimaste / hoursw
const days = Math.round(weeks * 7)
const mydate = this.itemselproj.begin_development
this.itemselproj.endwork_estimate = date.addToDate(mydate, { days })
console.log(' days', days, 'weeks', weeks, 'orerimaste', orerimaste, 'dateestimated', this.itemselproj.endwork_estimate)
return this.itemselproj.endwork_estimate
}catch (e) {
this.itemselproj.endwork_estimate = tools.getDateNull()
}
return tools.getDateNull()
} else {
return tools.getDateNull()
}
}
private getElementIndex(el: any) { private getElementIndex(el: any) {
return [].slice.call(el.parentElement.children).indexOf(el) return [].slice.call(el.parentElement.children).indexOf(el)
} }
@@ -346,16 +396,6 @@ export default class ProjList extends Vue {
return parseInt(el.attributes.index.value, 10) return parseInt(el.attributes.index.value, 10)
} }
get getCalcHoursWorked() {
if (this.itemsel.hoursplanned <= 0) {
return 0
}
const myperc = Math.round(this.itemsel.hoursworked / this.itemsel.hoursplanned * 100)
return myperc
}
get getCalcTodoHoursWorked() { get getCalcTodoHoursWorked() {
if (this.itemtodosel.hoursplanned <= 0) { if (this.itemtodosel.hoursplanned <= 0) {
return 0 return 0

View File

@@ -105,12 +105,12 @@
</div> </div>
</template> </template>
<template v-if="(whatisSel === tools.WHAT_PROJECT) && (!!itemsel.descr)" v-slot:after> <template v-if="(whatisSel === tools.WHAT_PROJECT) && (!!itemselproj.descr)" v-slot:after>
<div class="q-pa-xs clMain"> <div class="q-pa-xs clMain">
<div class="flex-container clMain"> <div class="flex-container clMain">
<q-icon class="flex-item flex-icon" name="format_align_center"/> <q-icon class="flex-item flex-icon" name="format_align_center"/>
<div class="flex-item projecttitle shadow-4"> <div class="flex-item projecttitle shadow-4">
{{itemsel.descr}} {{itemselproj.descr}}
</div> </div>
</div> </div>
<div class="flex-container clMain"> <div class="flex-container clMain">
@@ -118,10 +118,10 @@
<div class="flex-item itemdescr"> <div class="flex-item itemdescr">
<q-input <q-input
ref="input" ref="input"
v-model="itemsel.longdescr" v-model="itemselproj.longdescr"
:label="$t('proj.longdescr')" :label="$t('proj.longdescr')"
outlined outlined
debounce="500" debounce="1000"
autogrow autogrow
/> />
@@ -133,7 +133,7 @@
<q-input <q-input
ref="input2" ref="input2"
readonly readonly
v-model="itemsel.hoursworked" v-model="itemselproj.hoursworked"
type="number" type="number"
rounded outlined rounded outlined
:label="$t('proj.hoursworked')" :label="$t('proj.hoursworked')"
@@ -146,31 +146,71 @@
ref="input3" ref="input3"
type="number" type="number"
readonly readonly
v-model="itemsel.hoursplanned" v-model="itemselproj.hoursplanned"
rounded outlined rounded outlined
:label="$t('proj.hoursplanned')" :label="$t('proj.hoursplanned')"
debounce="500"> debounce="500">
</q-input> </q-input>
<CProgress :descr="$t('proj.progresstask')" <CProgress :descr="$t('proj.progresstask')"
:progressval="itemsel.progressCalc"></CProgress> :progressval="itemselproj.progressCalc"></CProgress>
</div> </div>
</div> </div>
<div class="flex-container clMain"> <div class="flex-container clMain">
<q-icon class="flex-item flex-icon" name="developer_mode"/> <q-icon class="flex-item flex-icon" name="developer_mode"/>
<div class="flex-item itemdata"> <div class="flex-item itemdata">
<CDate :mydate="itemsel.begin_development" @input="itemsel.begin_development = new Date(arguments[0])" <CDate :mydate="itemselproj.begin_development"
@input="itemselproj.begin_development = new Date(arguments[0])"
:label="$t('proj.begin_development')"> :label="$t('proj.begin_development')">
</CDate> </CDate>
</div> </div>
<div style="margin: 10px;"></div> <div style="margin: 10px;"></div>
<div class="flex-item itemdata"> <div class="flex-item itemdata">
<CDate :mydate="itemsel.begin_test" @input="itemsel.begin_test = new Date(arguments[0])" <CDate :mydate="itemselproj.begin_test" @input="itemselproj.begin_test = new Date(arguments[0])"
:label="$t('proj.begin_test')"> :label="$t('proj.begin_test')">
</CDate> </CDate>
</div> </div>
</div> </div>
<div class="flex-container clMain">
<q-icon class="flex-item flex-icon" name="outlined_flag"/>
<div class="flex-item itemstatus">
<q-select rounded outlined v-model="itemselproj.actualphase" :options="selectPhase"
:label="$t('proj.actualphase')" emit-value map-options>
</q-select>
</div>
<q-icon class="flex-item flex-icon" name="outlined_flag"/>
<div class="flex-item itemstatus">
<q-select rounded outlined v-model="itemselproj.totalphases" :options="selectPhase"
:label="$t('proj.totalphases')" emit-value map-options>
</q-select>
</div>
</div>
<div class="flex-container clMain">
<q-icon class="flex-item flex-icon" name="watch_later"/>
<div class="flex-item itemdata content-center">
<q-input
ref="input3"
type="number"
v-model="itemselproj.hoursweeky_plannedtowork"
rounded outlined
maxlength="2"
:label="$t('proj.hoursweeky_plannedtowork')"
debounce="500">
</q-input>
<CProgress :progressval="calcprogressWeekly"></CProgress>
</div>
<q-icon class="flex-item flex-icon" name="developer_mode"/>
<div class="flex-item itemdata">
<CDate color="green-2" :mydate="calcEndWork_Estimate" :readonly="true"
:label="$t('proj.endwork_estimate')">
</CDate>
</div>
</div>
</div> </div>
</template> </template>
<template v-else-if="(whatisSel === tools.WHAT_TODO) && (!!itemtodosel.descr)" v-slot:after> <template v-else-if="(whatisSel === tools.WHAT_TODO) && (!!itemtodosel.descr)" v-slot:after>
<div class="q-pa-xs clMain"> <div class="q-pa-xs clMain">
@@ -194,14 +234,13 @@
<div class="flex-item itemstatus"> <div class="flex-item itemstatus">
<q-select rounded outlined v-model="itemtodosel.statustodo" :options="selectStatus" <q-select rounded outlined v-model="itemtodosel.statustodo" :options="selectStatus"
:label="$t('todo.status')" emit-value map-options :label="$t('todo.status')" emit-value map-options
@input="watchupdatetodo('statustodo')"> @input="modifyfieldtodo('statustodo')">
</q-select> </q-select>
</div> </div>
<q-icon class="flex-item flex-icon" name="outlined_flag"/> <q-icon class="flex-item flex-icon" name="outlined_flag"/>
<div class="flex-item itemstatus"> <div class="flex-item itemstatus">
<q-select rounded outlined v-model="itemtodosel.phase" :options="selectPhase" <q-select rounded outlined v-model="itemtodosel.phase" :options="selectPhase"
:label="$t('todo.phase')" emit-value map-options :label="$t('todo.phase')" emit-value map-options>
@input="watchupdatetodo('phase')">
</q-select> </q-select>
</div> </div>
</div> </div>
@@ -233,13 +272,14 @@
<CProgress :descr="$t('proj.progresstask')" <CProgress :descr="$t('proj.progresstask')"
:progressval="itemtodosel.progress" :progressval="itemtodosel.progress"
:slider="true" @input="itemtodosel.progress = arguments[0]"></CProgress> :slider="true" @input="itemtodosel.progress = arguments[0]"></CProgress>
</div> </div>
</div> </div>
<div class="flex-container clMain"> <div class="flex-container clMain">
<q-icon class="flex-item flex-icon" name="developer_mode"/> <q-icon class="flex-item flex-icon" name="developer_mode"/>
<div class="flex-item itemdata"> <div class="flex-item itemdata">
<CDate :mydate="itemtodosel.start_date" @input="itemtodosel.start_date = new Date(arguments[0])" <CDate :mydate="itemtodosel.start_date"
@input="itemtodosel.start_date = new Date(arguments[0])"
:label="$t('todo.start_date')"> :label="$t('todo.start_date')">
</CDate> </CDate>
@@ -248,7 +288,8 @@
<q-icon class="flex-item flex-icon" name="event"/> <q-icon class="flex-item flex-icon" name="event"/>
<div class="flex-item itemdata"> <div class="flex-item itemdata">
<CDate :readonly="itemtodosel.statustodo !== tools.Status.COMPLETED" <CDate :readonly="itemtodosel.statustodo !== tools.Status.COMPLETED"
:mydate="itemtodosel.completed_at" @input="itemtodosel.completed_at = new Date(arguments[0])" :mydate="itemtodosel.completed_at"
@input="itemtodosel.completed_at = new Date(arguments[0])"
:label="$t('todo.completed_at')"> :label="$t('todo.completed_at')">
</CDate> </CDate>
</div> </div>

View File

@@ -67,5 +67,5 @@
"dist", "dist",
"node_modules" "node_modules"
], ],
"compileOnSave": true "compileOnSave": false
} }