mirror of
https://bitbucket.org/studiotem/jandl-taskmanager-app.git
synced 2026-10-21 14:29:34 +00:00
[Review]
This commit is contained in:
1 parent
79f563a82d
commit
d46a9151fc
27 files changed
+279
-339
No files matched your search
@@ -79,6 +79,7 @@ export default {
|
|||||||
},
|
},
|
||||||
|
|
||||||
async created() {
|
async created() {
|
||||||
|
// Kravarik: Toto negetuj takto ale cez ...mapGetters z auth store
|
||||||
try {
|
try {
|
||||||
this.user = await this.$axios.get_auth_data('v1/auth/info')
|
this.user = await this.$axios.get_auth_data('v1/auth/info')
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
@@ -93,6 +94,7 @@ export default {
|
|||||||
this.$router.push('/')
|
this.$router.push('/')
|
||||||
this.$toast.success('Boli ste odhlásený')
|
this.$toast.success('Boli ste odhlásený')
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
// Kravarik: Do toastu posielaj len error, on si to vo vnutri vyparsuje (ak ne tak to treba dokodit v toaste)
|
||||||
this.$toast.error(error.data.error)
|
this.$toast.error(error.data.error)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -1,93 +0,0 @@
|
|||||||
.auth-card {
|
|
||||||
position: absolute;
|
|
||||||
top: 50%;
|
|
||||||
left: 50%;
|
|
||||||
transform: translate(-50%, -50%);
|
|
||||||
border: 1px solid rgba(0, 0, 0, 0.1);
|
|
||||||
border-radius: 16px;
|
|
||||||
padding: 30px;
|
|
||||||
width: 100%;
|
|
||||||
max-width: 486px;
|
|
||||||
margin: auto;
|
|
||||||
}
|
|
||||||
.auth-card img {
|
|
||||||
position: absolute;
|
|
||||||
right: 60px;
|
|
||||||
bottom: 188px;
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
.auth-card .button {
|
|
||||||
color: white !important;
|
|
||||||
}
|
|
||||||
.auth-card .v-field {
|
|
||||||
border-bottom: 1px solid rgba(0, 0, 0, 0);
|
|
||||||
}
|
|
||||||
.auth-card .error .v-field {
|
|
||||||
border-bottom: 1px solid red;
|
|
||||||
}
|
|
||||||
|
|
||||||
@media screen and (max-width: 904px) {
|
|
||||||
.auth-card {
|
|
||||||
position: relative;
|
|
||||||
padding: 0;
|
|
||||||
border: none;
|
|
||||||
top: 0;
|
|
||||||
left: 0;
|
|
||||||
transform: translate(0, 0);
|
|
||||||
}
|
|
||||||
.auth-card h1 {
|
|
||||||
font-size: 19px;
|
|
||||||
}
|
|
||||||
.auth-card p {
|
|
||||||
font-size: 15px;
|
|
||||||
}
|
|
||||||
.auth-card .v-icon {
|
|
||||||
position: absolute !important;
|
|
||||||
right: 15px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.v-field--variant-solo {
|
|
||||||
box-shadow: none !important;
|
|
||||||
border: 1px solid rgba(0, 0, 0, 0.1) !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
.auth-card .error .v-field {
|
|
||||||
border: 0.5px solid red !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
.error .v-field {
|
|
||||||
border: 0.5px solid red !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
.error .dp__input {
|
|
||||||
border: 0.5px solid red !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
.v-input__append {
|
|
||||||
margin: 0 !important;
|
|
||||||
}
|
|
||||||
.v-input__append .v-icon {
|
|
||||||
position: absolute !important;
|
|
||||||
right: 45px;
|
|
||||||
}
|
|
||||||
|
|
||||||
input::-webkit-outer-spin-button,
|
|
||||||
input::-webkit-inner-spin-button {
|
|
||||||
-webkit-appearance: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.error-message {
|
|
||||||
position: absolute;
|
|
||||||
top: 50%;
|
|
||||||
left: 30px;
|
|
||||||
color: red;
|
|
||||||
opacity: 0.8;
|
|
||||||
}
|
|
||||||
|
|
||||||
.v-select .v-field--variant-solo {
|
|
||||||
border: none !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
.v-messages__message {
|
|
||||||
color: red !important;
|
|
||||||
}/*# sourceMappingURL=auth.theme.css.map */
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
{"version":3,"sources":["auth.theme.sass","auth.theme.css"],"names":[],"mappings":"AAAA;EACC,kBAAA;EACA,QAAA;EACA,SAAA;EACA,gCAAA;EACA,oCAAA;EACA,mBAAA;EACA,aAAA;EACA,WAAA;EACA,gBAAA;EACA,YAAA;ACCD;ADCC;EACC,kBAAA;EACA,WAAA;EACA,aAAA;EACA,eAAA;ACCF;ADCC;EACC,uBAAA;ACCF;ADCC;EACC,yCAAA;ACCF;ADCC;EACC,4BAAA;ACCF;;ADCA;EACC;IACC,kBAAA;IACA,UAAA;IACA,YAAA;IACA,MAAA;IACA,OAAA;IACA,0BAAA;ECEA;EDAA;IACC,eAAA;ECED;EDAA;IACC,eAAA;ECED;EDAA;IACC,6BAAA;IACA,WAAA;ECED;AACF;ADDA;EACC,2BAAA;EACA,+CAAA;ACGD;;ADDA;EACC,kCAAA;ACID;;ADFA;EACC,kCAAA;ACKD;;ADHA;EACC,kCAAA;ACMD;;ADJA;EACC,oBAAA;ACOD;ADLC;EACC,6BAAA;EACA,WAAA;ACOF;;ADLA;;EAEC,wBAAA;ACQD;;ADNA;EACC,kBAAA;EACA,QAAA;EACA,UAAA;EACA,UAAA;EACA,YAAA;ACSD;;ADPA;EACC,uBAAA;ACUD;;ADRA;EACC,qBAAA;ACWD","file":"auth.theme.css"}
|
|
||||||
@@ -40,6 +40,7 @@ export default {
|
|||||||
await this.$axios.post_data('v1/auth/forgot', this.form)
|
await this.$axios.post_data('v1/auth/forgot', this.form)
|
||||||
this.$router.push({ name: 'Reset password' })
|
this.$router.push({ name: 'Reset password' })
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
// Kravarik: Error upravit
|
||||||
this.$toast.error(error.data.error)
|
this.$toast.error(error.data.error)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -44,6 +44,7 @@ export default {
|
|||||||
await this.$axios.post_data('v1/auth/login', this.form)
|
await this.$axios.post_data('v1/auth/login', this.form)
|
||||||
this.$router.push({ name: 'Overview - Ongoing tasks'})
|
this.$router.push({ name: 'Overview - Ongoing tasks'})
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
// Kravarik: Error upravit
|
||||||
this.$toast.error(error.data.error)
|
this.$toast.error(error.data.error)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -49,6 +49,7 @@ export default {
|
|||||||
await this.$axios.post_data('v1/auth/reset', this.form)
|
await this.$axios.post_data('v1/auth/reset', this.form)
|
||||||
this.$router.push({ name: 'Login' })
|
this.$router.push({ name: 'Login' })
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
// Kravarik: Error upravit
|
||||||
this.$toast.error(error.data.error)
|
this.$toast.error(error.data.error)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ export default {
|
|||||||
return {
|
return {
|
||||||
search: null
|
search: null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
created() {
|
created() {
|
||||||
this.eventBus.on('onSearch', (search) => {
|
this.eventBus.on('onSearch', (search) => {
|
||||||
|
|||||||
@@ -1,96 +1,104 @@
|
|||||||
<template>
|
<template>
|
||||||
<div id="calendar" class="mb-12">
|
<div id="calendar" class="mb-12">
|
||||||
<FullCalendar ref="fullCalendar" :options="calendarOptions"/>
|
<V-full-calendar ref="fullCalendar" :options="calendarOptions" />
|
||||||
<Z-master-task-modal ref="z-master-task-modal" />
|
<Z-master-task-modal ref="z-master-task-modal" />
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<script>
|
<script>
|
||||||
import FullCalendar from '@fullcalendar/vue3'
|
import VFullCalendar from '@fullcalendar/vue3'
|
||||||
import dayGridPlugin from '@fullcalendar/daygrid'
|
import dayGridPlugin from '@fullcalendar/daygrid'
|
||||||
import ZMasterTaskModal from '@/plugins/tm@modal/master-task/z-master-task-modal.vue'
|
import ZMasterTaskModal from '@/plugins/tm@modal/master-task/z-master-task-modal.vue'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
components: {
|
components: {
|
||||||
FullCalendar,
|
VFullCalendar,
|
||||||
ZMasterTaskModal
|
ZMasterTaskModal
|
||||||
},
|
},
|
||||||
props: ['events', 'month'],
|
|
||||||
methods: {
|
// Kravarik: Prepisat propy na objektovy zapis
|
||||||
editTask(masterTask, editMode) {
|
props: ['events', 'month'],
|
||||||
this.$refs['z-master-task-modal'].create(masterTask, editMode)
|
|
||||||
}
|
methods: {
|
||||||
},
|
editTask(masterTask, editMode) {
|
||||||
computed: {
|
this.$refs['z-master-task-modal'].create(masterTask, editMode)
|
||||||
calendarOptions() {
|
}
|
||||||
return {
|
},
|
||||||
plugins: [ dayGridPlugin ],
|
|
||||||
initialView: 'dayGridMonth',
|
// Kravarik: Comuted ma byt za data hned
|
||||||
headerToolbar: false,
|
computed: {
|
||||||
locale: 'sk',
|
calendarOptions() {
|
||||||
height: 650,
|
return {
|
||||||
firstDay: 1,
|
plugins: [dayGridPlugin],
|
||||||
dayHeaderClassNames: ['w-day-header'],
|
initialView: 'dayGridMonth',
|
||||||
events: this.events,
|
headerToolbar: false,
|
||||||
eventContent: function(eventInfo) {
|
locale: 'sk',
|
||||||
return { html: eventInfo.event.extendedProps.title_html }
|
height: 650,
|
||||||
},
|
firstDay: 1,
|
||||||
eventClick: (info) => {
|
dayHeaderClassNames: ['w-day-header'],
|
||||||
console.log(info.event._def)
|
events: this.events,
|
||||||
// alert(JSON.stringify(info.event._def))
|
// Kravarik: Skus toto prepisat na arrow function ako je v eventClick
|
||||||
this.editTask(info.event._def.publicId, false)
|
eventContent: function (eventInfo) {
|
||||||
}
|
return { html: eventInfo.event.extendedProps.title_html }
|
||||||
}
|
},
|
||||||
}
|
eventClick: (info) => {
|
||||||
},
|
this.editTask(info.event._def.publicId, false)
|
||||||
watch: {
|
}
|
||||||
month(selectedMonth) {
|
}
|
||||||
const currentYear = (new Date()).getFullYear()
|
}
|
||||||
this.$refs.fullCalendar?.getApi().gotoDate(new Date(currentYear, selectedMonth, 1))
|
},
|
||||||
}
|
|
||||||
},
|
// Kravarik: Toto nechat na konci
|
||||||
mounted() {
|
watch: {
|
||||||
const currentYear = (new Date()).getFullYear()
|
month(selectedMonth) {
|
||||||
this.calendarOptions.events = this.events
|
const currentYear = new Date().getFullYear()
|
||||||
this.$refs.fullCalendar?.getApi().gotoDate(new Date(currentYear, this.month, 1))
|
this.$refs.fullCalendar?.getApi().gotoDate(new Date(currentYear, selectedMonth, 1))
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
// Kravarik: Posunut nad methods
|
||||||
|
mounted() {
|
||||||
|
const currentYear = new Date().getFullYear()
|
||||||
|
this.calendarOptions.events = this.events
|
||||||
|
this.$refs.fullCalendar?.getApi().gotoDate(new Date(currentYear, this.month, 1))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
<style lang="sass" scoped>
|
<style lang="sass" scoped>
|
||||||
#calendar
|
#calendar
|
||||||
&:deep(.w-day-header)
|
&:deep(.w-day-header)
|
||||||
text-align: left
|
text-align: left
|
||||||
padding-left: 10px
|
padding-left: 10px
|
||||||
&:deep(.fc-daygrid-day-number)
|
&:deep(.fc-daygrid-day-number)
|
||||||
color: black
|
color: black
|
||||||
&:deep(.fc-col-header-cell-cushion)
|
&:deep(.fc-col-header-cell-cushion)
|
||||||
font-size: 20px
|
font-size: 20px
|
||||||
font-weight: 500
|
font-weight: 500
|
||||||
line-height: 45px
|
line-height: 45px
|
||||||
text-transform: capitalize
|
text-transform: capitalize
|
||||||
color: black
|
color: black
|
||||||
&:deep(.fc-theme-standard .fc-scrollgrid)
|
&:deep(.fc-theme-standard .fc-scrollgrid)
|
||||||
border: none
|
border: none
|
||||||
&:deep(.fc-event-start)
|
&:deep(.fc-event-start)
|
||||||
border-top-left-radius: 30px
|
border-top-left-radius: 30px
|
||||||
border-bottom-left-radius: 30px
|
border-bottom-left-radius: 30px
|
||||||
&:deep(.fc-event-end)
|
&:deep(.fc-event-end)
|
||||||
border-top-right-radius: 30px
|
border-top-right-radius: 30px
|
||||||
border-bottom-right-radius: 30px
|
border-bottom-right-radius: 30px
|
||||||
&:deep(.fc-event)
|
&:deep(.fc-event)
|
||||||
font-size: 12px
|
font-size: 12px
|
||||||
padding-left: 10px
|
padding-left: 10px
|
||||||
margin-top: 5px
|
margin-top: 5px
|
||||||
&:after
|
&:after
|
||||||
background: unset
|
background: unset
|
||||||
&:deep(.fc-day-today)
|
&:deep(.fc-day-today)
|
||||||
background: white
|
background: white
|
||||||
a
|
a
|
||||||
background: #3700B3
|
background: #3700B3
|
||||||
width: 32px
|
width: 32px
|
||||||
height: 32px
|
height: 32px
|
||||||
color: white
|
color: white
|
||||||
text-align: center
|
text-align: center
|
||||||
border-radius: 50%
|
border-radius: 50%
|
||||||
border: 5px solid white
|
border: 5px solid white
|
||||||
line-height: 15px
|
line-height: 15px
|
||||||
</style>
|
</style>
|
||||||
@@ -1,89 +1,66 @@
|
|||||||
<template>
|
<template>
|
||||||
<v-row class="px-10 py-8 subheader">
|
<v-row class="px-10 py-8 subheader">
|
||||||
<v-select
|
<v-select v-model="filter.selectedProject" class="subheader-input" :items="projects" label="Projekt" variant="outlined"></v-select>
|
||||||
v-model="filter.selectedProject"
|
|
||||||
class="subheader-input"
|
|
||||||
:items="projects"
|
|
||||||
label="Projekt"
|
|
||||||
variant="outlined"
|
|
||||||
></v-select>
|
|
||||||
|
|
||||||
<v-select
|
<v-select v-model="filter.selectedTeam" class="subheader-input" :items="teams" label="Tím" variant="outlined"></v-select>
|
||||||
v-model="filter.selectedTeam"
|
|
||||||
class="subheader-input"
|
|
||||||
:items="teams"
|
|
||||||
label="Tím"
|
|
||||||
variant="outlined"
|
|
||||||
></v-select>
|
|
||||||
|
|
||||||
<v-select
|
<v-select v-model="filter.selectedEmployee" class="subheader-input" :items="employees" label="Zamestnanec" variant="outlined"></v-select>
|
||||||
v-model="filter.selectedEmployee"
|
|
||||||
class="subheader-input"
|
|
||||||
:items="employees"
|
|
||||||
label="Zamestnanec"
|
|
||||||
variant="outlined"
|
|
||||||
></v-select>
|
|
||||||
|
|
||||||
<v-select
|
<v-select v-model="filter.selectedMonth" class="subheader-input" :items="months" label="Mesiac" variant="outlined"></v-select>
|
||||||
v-model="filter.selectedMonth"
|
|
||||||
class="subheader-input"
|
|
||||||
:items="months"
|
|
||||||
label="Mesiac"
|
|
||||||
variant="outlined"
|
|
||||||
></v-select>
|
|
||||||
|
|
||||||
<div class="subheader-input switch">
|
<div class="subheader-input switch">
|
||||||
<p class="switch-label">Zobraziť ukončené</p>
|
<p class="switch-label">Zobraziť ukončené</p>
|
||||||
<v-switch
|
<v-switch v-model="filter.showFinishedTasks" color="#6200EE" hide-details></v-switch>
|
||||||
v-model="filter.showFinishedTasks"
|
</div>
|
||||||
color="#6200EE"
|
</v-row>
|
||||||
hide-details
|
|
||||||
></v-switch>
|
|
||||||
</div>
|
|
||||||
</v-row>
|
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
export default {
|
export default {
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
months: [
|
months: [
|
||||||
{ title: 'Január', value: 0 },
|
{ title: 'Január', value: 0 },
|
||||||
{ title: 'Február', value: 1 },
|
{ title: 'Február', value: 1 },
|
||||||
{ title: 'Marec', value: 2 },
|
{ title: 'Marec', value: 2 },
|
||||||
{ title: 'Apríl', value: 3 },
|
{ title: 'Apríl', value: 3 },
|
||||||
{ title: 'Máj', value: 4 },
|
{ title: 'Máj', value: 4 },
|
||||||
{ title: 'Jún', value: 5 },
|
{ title: 'Jún', value: 5 },
|
||||||
{ title: 'Júl', value: 6 },
|
{ title: 'Júl', value: 6 },
|
||||||
{ title: 'August', value: 7 },
|
{ title: 'August', value: 7 },
|
||||||
{ title: 'September', value: 8 },
|
{ title: 'September', value: 8 },
|
||||||
{ title: 'Október', value: 9 },
|
{ title: 'Október', value: 9 },
|
||||||
{ title: 'November', value: 10 },
|
{ title: 'November', value: 10 },
|
||||||
{ title: 'December', value: 11 },
|
{ title: 'December', value: 11 }
|
||||||
],
|
],
|
||||||
filter: {
|
filter: {
|
||||||
selectedProject: null,
|
selectedProject: null,
|
||||||
selectedTeam: null,
|
selectedTeam: null,
|
||||||
selectedEmployee: null,
|
selectedEmployee: null,
|
||||||
selectedMonth: (new Date()).getMonth(),
|
selectedMonth: new Date().getMonth(),
|
||||||
showFinishedTasks: false
|
showFinishedTasks: false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
props: ['projects', 'teams', 'employees'],
|
|
||||||
emits: ['filterChanged'],
|
// Kravarik: Props hodit nad data
|
||||||
watch: {
|
props: ['projects', 'teams', 'employees'],
|
||||||
filter: {
|
|
||||||
handler() {
|
// Kravarik: Emits ma byt uplne prve
|
||||||
this.$emit('filterChanged', this.filter)
|
emits: ['filterChanged'],
|
||||||
},
|
|
||||||
deep: true
|
watch: {
|
||||||
}
|
filter: {
|
||||||
}
|
handler() {
|
||||||
|
this.$emit('filterChanged', this.filter)
|
||||||
|
},
|
||||||
|
deep: true
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
<style lang="sass" scoped>
|
<style lang="sass" scoped>
|
||||||
// TODO: zjednotit styly ikon v globalnom sass subore
|
// Kravarik: TODO zjednotit styly ikon v globalnom sass subore
|
||||||
// TODO: ↓
|
// TODO: ↓
|
||||||
.subheader
|
.subheader
|
||||||
max-width: 100%
|
max-width: 100%
|
||||||
|
|||||||
@@ -1,55 +1,61 @@
|
|||||||
<template>
|
<template>
|
||||||
<div>
|
<div>
|
||||||
<a-project-filter :projects="projects" @filterChanged="onFilterChanged"></a-project-filter>
|
<!-- Kravarik: Dat velke A -->
|
||||||
<a-project-calendar :events="filteredEvents" :month="filter.selectedMonth"></a-project-calendar>
|
<a-project-filter :projects="projects" @filterChanged="onFilterChanged"></a-project-filter>
|
||||||
</div>
|
<a-project-calendar :events="filteredEvents" :month="filter.selectedMonth"></a-project-calendar>
|
||||||
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import AProjectCalendar from './_components/a-project-calendar.vue'
|
import AProjectCalendar from './_components/a-project-calendar.vue'
|
||||||
import AProjectFilter from './_components/a-project-filter.vue'
|
import AProjectFilter from './_components/a-project-filter.vue'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
components: {
|
components: {
|
||||||
AProjectCalendar,
|
AProjectCalendar,
|
||||||
AProjectFilter
|
AProjectFilter
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
filter: {
|
// Kravarik: Toto premenuj na nejaky filterSettings alebo co to je
|
||||||
selectedEmployee: null,
|
filter: {
|
||||||
selectedMonth: (new Date()).getMonth(),
|
selectedEmployee: null,
|
||||||
selectedProject: null,
|
selectedMonth: new Date().getMonth(),
|
||||||
selectedTeam: null,
|
selectedProject: null,
|
||||||
showFinishedTasks: false
|
selectedTeam: null,
|
||||||
},
|
showFinishedTasks: false
|
||||||
projects: ['Projekt1', 'Projekt2', 'Projekt3', 'Projekt4'],
|
},
|
||||||
selectedProject: null,
|
// Kravarik: Toto je preco hardcodenute?
|
||||||
events: [],
|
projects: ['Projekt1', 'Projekt2', 'Projekt3', 'Projekt4'],
|
||||||
filteredEvents: []
|
selectedProject: null,
|
||||||
}
|
events: [],
|
||||||
},
|
filteredEvents: []
|
||||||
async created() {
|
}
|
||||||
const events = await this.$axios.get_auth_data('v1/overview/projects')
|
},
|
||||||
this.events = events.map(item => ({
|
async created() {
|
||||||
id: item.id,
|
// Kravarik: Toto preco nieje v trycatch?
|
||||||
title: `${item.project_code} - ${item.name}`,
|
const events = await this.$axios.get_auth_data('v1/overview/projects')
|
||||||
title_html: `${item.project_code} - <b>${item.name}</b>`,
|
|
||||||
start: item.starts_at,
|
// Kravarik: Nemusis nahodou z map returnovat? Ci ked {} obalis to () tak nemusis potom?
|
||||||
end: item.deadline,
|
this.events = events.map((item) => ({
|
||||||
is_finished: item.is_finished,
|
id: item.id,
|
||||||
project_code: item.project_code,
|
title: `${item.project_code} - ${item.name}`,
|
||||||
backgroundColor: item.color,
|
title_html: `${item.project_code} - <b>${item.name}</b>`,
|
||||||
borderColor: item.color
|
start: item.starts_at,
|
||||||
}))
|
end: item.deadline,
|
||||||
this.filteredEvents = this.events.filter(item => !item.is_finished)
|
is_finished: item.is_finished,
|
||||||
},
|
project_code: item.project_code,
|
||||||
methods: {
|
backgroundColor: item.color,
|
||||||
// TODO: prepojit filtrovanie na BE
|
borderColor: item.color
|
||||||
onFilterChanged(filterValues) {
|
}))
|
||||||
this.filter = filterValues
|
this.filteredEvents = this.events.filter((item) => !item.is_finished)
|
||||||
this.filteredEvents = this.events.filter(item => this.filter.showFinishedTasks || item.is_finished == false)
|
},
|
||||||
}
|
methods: {
|
||||||
}
|
// Kravarik: TODO prepojit filtrovanie na BE
|
||||||
|
onFilterChanged(filterValues) {
|
||||||
|
this.filter = filterValues
|
||||||
|
this.filteredEvents = this.events.filter((item) => this.filter.showFinishedTasks || item.is_finished == false)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
@@ -42,17 +42,24 @@ export default {
|
|||||||
|
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
|
// Kaluza: Napojit na BE
|
||||||
employees: ['Foo', 'Bar', 'Fizz', 'Buzz'],
|
employees: ['Foo', 'Bar', 'Fizz', 'Buzz'],
|
||||||
|
|
||||||
|
// Kaluza: Toto je preco hardcoded
|
||||||
selectedDate: "13.11.2022 - 17.11.2022",
|
selectedDate: "13.11.2022 - 17.11.2022",
|
||||||
|
|
||||||
|
// Kaluza: Napojit funkcnost
|
||||||
selectedEmployee: 'Bar',
|
selectedEmployee: 'Bar',
|
||||||
date: new Date()
|
date: new Date()
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
created() {
|
created() {
|
||||||
|
// Kaluza: getWeek pouzivas iba v js a nevolas ho z html a je to pomocna funkcia, takze ju nazvi _getWeek
|
||||||
this.getWeek()
|
this.getWeek()
|
||||||
},
|
},
|
||||||
|
|
||||||
|
// Kaluza: Computed ma byt hned za data
|
||||||
computed: {
|
computed: {
|
||||||
time() {
|
time() {
|
||||||
return this.unscheduledTime
|
return this.unscheduledTime
|
||||||
|
|||||||
@@ -66,7 +66,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="event-footer d-flex">
|
<div class="event-footer d-flex">
|
||||||
<v-btn rounded class="event-footer-button me-2" :class="{'completed': event.completed}" @click="clickCompleteTask(event)"><img :src="require('./_img/checkmark.svg')" alt=""></v-btn>
|
<v-btn rounded class="event-footer-button me-2" :class="{'completed': event.completed}" @click="clickCompleteTask(event)"><img :src="require('./_img/checkmark.svg')" alt=""></v-btn>
|
||||||
<v-btn rounded class="event-footer-button me-2" @click.stop="editTask(event.id, true)"><img :src="require('./_img/pencil.svg')" alt=""></v-btn>
|
<v-btn rounded class="event-footer-button me-2" @click.stop="editTask(event.id, true)"><img :src="require('./_img/pencil.svg')" alt=""></v-btn>
|
||||||
<v-btn rounded class="event-footer-button me-2" @click.stop="this.showDeleteModal = {task: event}"><img :src="require('./_img/bin.svg')" alt=""></v-btn>
|
<v-btn rounded class="event-footer-button me-2" @click.stop="this.showDeleteModal = {task: event}"><img :src="require('./_img/bin.svg')" alt=""></v-btn>
|
||||||
@@ -83,12 +83,15 @@
|
|||||||
</Vue-cal>
|
</Vue-cal>
|
||||||
|
|
||||||
<Z-sub-task-modal ref="z-sub-task-modal" />
|
<Z-sub-task-modal ref="z-sub-task-modal" />
|
||||||
|
|
||||||
|
<!-- Kravarik: Prerobit modaly na novy sposob -->
|
||||||
<Z-complete-task-modal v-if="showCompleteModal" :visible="showCompleteModal ? true : false" :task="showCompleteModal.task" @completeTask="completeTask" @close="showCompleteModal = null" />
|
<Z-complete-task-modal v-if="showCompleteModal" :visible="showCompleteModal ? true : false" :task="showCompleteModal.task" @completeTask="completeTask" @close="showCompleteModal = null" />
|
||||||
<Z-delete-task-modal v-if="showDeleteModal" :visible="showDeleteModal ? true : false" :task="showDeleteModal.task" @deleteTask="deleteTask" @close="showDeleteModal = null" />
|
<Z-delete-task-modal v-if="showDeleteModal" :visible="showDeleteModal ? true : false" :task="showDeleteModal.task" @deleteTask="deleteTask" @close="showDeleteModal = null" />
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
|
// Kaluza: Cely tento komponent presun do tm@dashboard/_components/z-timeline.vue
|
||||||
import ZCompleteTaskModal from '@/plugins/tm@modal/task/z-complete-task-modal.vue'
|
import ZCompleteTaskModal from '@/plugins/tm@modal/task/z-complete-task-modal.vue'
|
||||||
import ZDeleteTaskModal from '@/plugins/tm@modal/task/z-delete-task-modal.vue'
|
import ZDeleteTaskModal from '@/plugins/tm@modal/task/z-delete-task-modal.vue'
|
||||||
import ZSubTaskModal from '@/plugins/tm@modal/sub-task/z-sub-task-modal.vue'
|
import ZSubTaskModal from '@/plugins/tm@modal/sub-task/z-sub-task-modal.vue'
|
||||||
@@ -142,12 +145,10 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
mounted() {
|
|
||||||
// console.log(this.calData.tasks)
|
|
||||||
},
|
|
||||||
|
|
||||||
methods: {
|
methods: {
|
||||||
weekChanged() {
|
weekChanged() {
|
||||||
|
// Kaluza: Skus tieto document.getElementBy... prerobit na this.$el.getElement ...
|
||||||
|
// Je za tym viacero problemov ktore by to mohlo sposobit, v tejto appke asi ne ale nech si drzime best practices
|
||||||
const scrollContainer = document.getElementsByClassName('vuecal__scrollable-body')[0]
|
const scrollContainer = document.getElementsByClassName('vuecal__scrollable-body')[0]
|
||||||
scrollContainer.scrollLeft = 0
|
scrollContainer.scrollLeft = 0
|
||||||
},
|
},
|
||||||
@@ -162,7 +163,9 @@ export default {
|
|||||||
},
|
},
|
||||||
|
|
||||||
correctMargins() {
|
correctMargins() {
|
||||||
if (!document.getElementsByClassName('vuecal__split-days-headers').length) return
|
if (!document.getElementsByClassName('vuecal__split-days-headers').length)
|
||||||
|
return
|
||||||
|
|
||||||
const heightOfDayHeader = document.getElementsByClassName('vuecal__split-days-headers')[0].clientHeight
|
const heightOfDayHeader = document.getElementsByClassName('vuecal__split-days-headers')[0].clientHeight
|
||||||
document.getElementsByClassName('vuecal__time-column')[0].style.marginTop = `${heightOfDayHeader}px`
|
document.getElementsByClassName('vuecal__time-column')[0].style.marginTop = `${heightOfDayHeader}px`
|
||||||
document.getElementsByClassName('vuecal__cells-body')[0].style.marginTop = `${heightOfDayHeader}px`
|
document.getElementsByClassName('vuecal__cells-body')[0].style.marginTop = `${heightOfDayHeader}px`
|
||||||
@@ -230,7 +233,7 @@ export default {
|
|||||||
.calendar-wrapper
|
.calendar-wrapper
|
||||||
width: 100%
|
width: 100%
|
||||||
height: 100%
|
height: 100%
|
||||||
// padding: 0 20px 0 0
|
// padding: 0 20px 0 0
|
||||||
|
|
||||||
&:deep()
|
&:deep()
|
||||||
.vuecal__cells
|
.vuecal__cells
|
||||||
|
|||||||
@@ -6,6 +6,7 @@
|
|||||||
<Z-timeline :calData="timelineData" :calConfig="config" :splits="splitDays" @eventMoved="onEventMoved" @completeTask="completeTask" @reopenTask="reopenTask" @deleteTask="deleteTask" />
|
<Z-timeline :calData="timelineData" :calConfig="config" :splits="splitDays" @eventMoved="onEventMoved" @completeTask="completeTask" @reopenTask="reopenTask" @deleteTask="deleteTask" />
|
||||||
</W-loadable>
|
</W-loadable>
|
||||||
|
|
||||||
|
<!-- Kaluza: Toto vyhodit a pouzit w toast -->
|
||||||
<v-snackbar
|
<v-snackbar
|
||||||
v-model="errorToast"
|
v-model="errorToast"
|
||||||
:timeout="2000"
|
:timeout="2000"
|
||||||
@@ -32,8 +33,11 @@ export default {
|
|||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
timelineData: null,
|
timelineData: null,
|
||||||
|
|
||||||
|
// Kaluza: Vyhodit tieto toast veci
|
||||||
errorToast: false,
|
errorToast: false,
|
||||||
errorToastMessage: "Nepodarilo sa nacitat data!",
|
errorToastMessage: "Nepodarilo sa nacitat data!",
|
||||||
|
|
||||||
dataLoaded: false,
|
dataLoaded: false,
|
||||||
splitDays: [],
|
splitDays: [],
|
||||||
unscheduledTime: 0,
|
unscheduledTime: 0,
|
||||||
@@ -53,12 +57,14 @@ export default {
|
|||||||
this.generateSplits(week.firstDay)
|
this.generateSplits(week.firstDay)
|
||||||
this.generateNonWorkingHours(week.firstDay)
|
this.generateNonWorkingHours(week.firstDay)
|
||||||
} catch(error) {
|
} catch(error) {
|
||||||
|
// Kaluza: Ked to davas do w loadable tak nepouzi toast a iba daj this.timeineData = {error} a loadable ho parsne a zobrazi
|
||||||
this.timelineData = {}
|
this.timelineData = {}
|
||||||
console.error(error)
|
console.error(error)
|
||||||
this.triggerToast("Nepodarilo sa nacitat data!")
|
this.triggerToast("Nepodarilo sa nacitat data!")
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
// Kaluza: Toto prosimta premenuj lebo neviem vobec co znamena splits
|
||||||
generateSplits(date) {
|
generateSplits(date) {
|
||||||
this.splitDays = []
|
this.splitDays = []
|
||||||
for (let i = 0; i < 7; i++) {
|
for (let i = 0; i < 7; i++) {
|
||||||
@@ -72,6 +78,7 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
// Kaluza: Toto nazvi nejako inak aby bolo viac jasne ze z coho to preformatovava na co
|
||||||
formatData(date) {
|
formatData(date) {
|
||||||
// format events
|
// format events
|
||||||
this.timelineData.tasks.forEach(event => {
|
this.timelineData.tasks.forEach(event => {
|
||||||
@@ -130,11 +137,13 @@ export default {
|
|||||||
this.timelineData.tasks.push(...nonWorkingHours)
|
this.timelineData.tasks.push(...nonWorkingHours)
|
||||||
},
|
},
|
||||||
|
|
||||||
|
// Kaluza: Vyhodit
|
||||||
triggerToast(message) {
|
triggerToast(message) {
|
||||||
this.errorToastMessage = message
|
this.errorToastMessage = message
|
||||||
this.errorToast = true
|
this.errorToast = true
|
||||||
},
|
},
|
||||||
|
|
||||||
|
// Kaluza: Vyhodit ak sa nepouzije
|
||||||
async onEventMoved(event) {
|
async onEventMoved(event) {
|
||||||
console.log("drag", event)
|
console.log("drag", event)
|
||||||
// try {
|
// try {
|
||||||
@@ -153,6 +162,13 @@ export default {
|
|||||||
},
|
},
|
||||||
|
|
||||||
completeTask(id) {
|
completeTask(id) {
|
||||||
|
// Kaluza: Tu pridaj request na BE, nepouzi filter ale find a sprav to takto
|
||||||
|
// 1. const task = this.timelineData.tasks.find(task => task.id == id)
|
||||||
|
// 2. task.completed = true
|
||||||
|
// 3. V tryCatch zavolaj request na BE
|
||||||
|
// 4. Ak to spadne do catchu tak daj task.completed = false a pod tym daj this.$toast.error(error)
|
||||||
|
|
||||||
|
// A AKO NAD TYM ROZMYSLAM completeTask A reopenTask MOZES SPOJIT DO JEDNEJ A VZDY LEN DAS task.completed = !task.completed
|
||||||
this.timelineData.tasks.filter(task => {
|
this.timelineData.tasks.filter(task => {
|
||||||
if (task.id == id) {
|
if (task.id == id) {
|
||||||
task.completed = true
|
task.completed = true
|
||||||
@@ -161,6 +177,7 @@ export default {
|
|||||||
},
|
},
|
||||||
|
|
||||||
reopenTask(id) {
|
reopenTask(id) {
|
||||||
|
// Kaluza: Toto rovnakym sposobom ako complete task
|
||||||
this.timelineData.tasks.filter(task => {
|
this.timelineData.tasks.filter(task => {
|
||||||
if (task.id == id) {
|
if (task.id == id) {
|
||||||
task.completed = false
|
task.completed = false
|
||||||
@@ -169,6 +186,7 @@ export default {
|
|||||||
},
|
},
|
||||||
|
|
||||||
deleteTask(id) {
|
deleteTask(id) {
|
||||||
|
// Kaluza: Toto rovnako ako complete a reopen
|
||||||
this.timelineData.tasks.splice(this.timelineData.tasks.findIndex(item => item.id === id), 1)
|
this.timelineData.tasks.splice(this.timelineData.tasks.findIndex(item => item.id === id), 1)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -42,6 +42,7 @@ export default {
|
|||||||
|
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
|
// Kaluza: Napojit funkcionalitu
|
||||||
employees: ['Foo', 'Bar', 'Fizz', 'Buzz'],
|
employees: ['Foo', 'Bar', 'Fizz', 'Buzz'],
|
||||||
selectedDate: new Date(),
|
selectedDate: new Date(),
|
||||||
day: new Date(),
|
day: new Date(),
|
||||||
|
|||||||
@@ -6,6 +6,7 @@
|
|||||||
<Z-timeline :calData="timelineData" :calConfig="config" :splits="splitDays" @eventMoved="onEventMoved" @completeTask="completeTask" @reopenTask="reopenTask" @deleteTask="deleteTask" />
|
<Z-timeline :calData="timelineData" :calConfig="config" :splits="splitDays" @eventMoved="onEventMoved" @completeTask="completeTask" @reopenTask="reopenTask" @deleteTask="deleteTask" />
|
||||||
</W-loadable>
|
</W-loadable>
|
||||||
|
|
||||||
|
<!-- Kaluza: vyhodit toto a nahradit za wToast -->
|
||||||
<v-snackbar
|
<v-snackbar
|
||||||
v-model="errorToast"
|
v-model="errorToast"
|
||||||
:timeout="2000"
|
:timeout="2000"
|
||||||
@@ -54,6 +55,7 @@ export default {
|
|||||||
this.formatData()
|
this.formatData()
|
||||||
this.generateNonWorkingHours(date)
|
this.generateNonWorkingHours(date)
|
||||||
} catch(error) {
|
} catch(error) {
|
||||||
|
// Kaluza: Upravit podla feedbacku v tasks.modal
|
||||||
this.timelineData = {}
|
this.timelineData = {}
|
||||||
console.error(error)
|
console.error(error)
|
||||||
this.triggerToast("Nepodarilo sa nacitat data!")
|
this.triggerToast("Nepodarilo sa nacitat data!")
|
||||||
@@ -74,6 +76,7 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
// Kaluza: Upravit podla feedbacku v tasks.modal
|
||||||
formatData() {
|
formatData() {
|
||||||
this.timelineData.tasks = []
|
this.timelineData.tasks = []
|
||||||
this.unscheduledTime = 0
|
this.unscheduledTime = 0
|
||||||
@@ -129,11 +132,13 @@ export default {
|
|||||||
this.timelineData.tasks.push(...nonWorkingHours)
|
this.timelineData.tasks.push(...nonWorkingHours)
|
||||||
},
|
},
|
||||||
|
|
||||||
|
// Kaluza: Upravit podla feedbacku v tasks.modal
|
||||||
triggerToast(message) {
|
triggerToast(message) {
|
||||||
this.errorToastMessage = message
|
this.errorToastMessage = message
|
||||||
this.errorToast = true
|
this.errorToast = true
|
||||||
},
|
},
|
||||||
|
|
||||||
|
// Kaluza: Upravit podla feedbacku v tasks.modal
|
||||||
async onEventMoved(event) {
|
async onEventMoved(event) {
|
||||||
console.log("drag", event)
|
console.log("drag", event)
|
||||||
// try {
|
// try {
|
||||||
@@ -151,6 +156,7 @@ export default {
|
|||||||
// }
|
// }
|
||||||
},
|
},
|
||||||
|
|
||||||
|
// Kaluza: Upravit podla feedbacku v tasks.modal
|
||||||
completeTask(id) {
|
completeTask(id) {
|
||||||
this.timelineData.tasks.filter(task => {
|
this.timelineData.tasks.filter(task => {
|
||||||
if (task.id == id) {
|
if (task.id == id) {
|
||||||
@@ -159,6 +165,7 @@ export default {
|
|||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
|
||||||
|
// Kaluza: Upravit podla feedbacku v tasks.modal
|
||||||
reopenTask(id) {
|
reopenTask(id) {
|
||||||
this.timelineData.tasks.filter(task => {
|
this.timelineData.tasks.filter(task => {
|
||||||
if (task.id == id) {
|
if (task.id == id) {
|
||||||
@@ -166,7 +173,7 @@ export default {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
|
||||||
deleteTask(id) {
|
deleteTask(id) {
|
||||||
this.timelineData.tasks.splice(this.timelineData.tasks.findIndex(item => item.id === id), 1)
|
this.timelineData.tasks.splice(this.timelineData.tasks.findIndex(item => item.id === id), 1)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -142,7 +142,7 @@ export default {
|
|||||||
|
|
||||||
async save() {
|
async save() {
|
||||||
if (!(await this.v$.$validate()))
|
if (!(await this.v$.$validate()))
|
||||||
return
|
return
|
||||||
|
|
||||||
try {
|
try {
|
||||||
if (this.blocker.id)
|
if (this.blocker.id)
|
||||||
|
|||||||
@@ -132,7 +132,7 @@
|
|||||||
<div class="d-flex justify-start">
|
<div class="d-flex justify-start">
|
||||||
<img class="pencil-icon" :src="require('@/plugins/tm@overview/_img/pencil-icon.svg')" alt="pencil-icon" @click.stop="editMode = !editMode" />
|
<img class="pencil-icon" :src="require('@/plugins/tm@overview/_img/pencil-icon.svg')" alt="pencil-icon" @click.stop="editMode = !editMode" />
|
||||||
<img class="trash-icon" :src="require('@/plugins/tm@overview/_img/trash-icon.svg')" alt="trash-icon" @click.stop="deleteTask()"/>
|
<img class="trash-icon" :src="require('@/plugins/tm@overview/_img/trash-icon.svg')" alt="trash-icon" @click.stop="deleteTask()"/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<v-card-actions class="d-flex flex-column modal-content">
|
<v-card-actions class="d-flex flex-column modal-content">
|
||||||
@@ -191,7 +191,7 @@
|
|||||||
<p class="task-badge px-4 py-2 rounded-pill flex-shrink-0">{{ masterTask.team }}</p>
|
<p class="task-badge px-4 py-2 rounded-pill flex-shrink-0">{{ masterTask.team }}</p>
|
||||||
<div class="d-flex align-center flex-shrink-0 mx-3" v-for="(employee, index) in masterTask.employees" :key="employee.id">
|
<div class="d-flex align-center flex-shrink-0 mx-3" v-for="(employee, index) in masterTask.employees" :key="employee.id">
|
||||||
<p class="employee-selected-avatar d-flex justify-center align-center">
|
<p class="employee-selected-avatar d-flex justify-center align-center">
|
||||||
{{ employee.name.charAt(0) + employee.surname.charAt(0) }}
|
{{ employee.name.charAt(0) + employee.surname.charAt(0) }}
|
||||||
</p>
|
</p>
|
||||||
<p class="ml-2" v-html="`${masterTask.employees[index].name} ${masterTask.employees[index].surname}`" />
|
<p class="ml-2" v-html="`${masterTask.employees[index].name} ${masterTask.employees[index].surname}`" />
|
||||||
</div>
|
</div>
|
||||||
@@ -274,7 +274,7 @@
|
|||||||
<td class="w-25">{{ masterTask.name }}</td>
|
<td class="w-25">{{ masterTask.name }}</td>
|
||||||
<td class="d-flex align-center">
|
<td class="d-flex align-center">
|
||||||
<p class="employee-selected-avatar d-flex justify-center align-center">
|
<p class="employee-selected-avatar d-flex justify-center align-center">
|
||||||
{{ employee.name.charAt(0) + employee.surname.charAt(0) }}
|
{{ employee.name.charAt(0) + employee.surname.charAt(0) }}
|
||||||
</p>
|
</p>
|
||||||
<p class="ml-2" v-html="`${masterTask.employees[index].name} ${masterTask.employees[index].surname}`" />
|
<p class="ml-2" v-html="`${masterTask.employees[index].name} ${masterTask.employees[index].surname}`" />
|
||||||
</td>
|
</td>
|
||||||
@@ -353,6 +353,7 @@ export default {
|
|||||||
// this.masterTask = await this.$axios.get_auth_data(`v1/master-task/${this.masterTaksId}`)
|
// this.masterTask = await this.$axios.get_auth_data(`v1/master-task/${this.masterTaksId}`)
|
||||||
// this.selectedTeam = `${this.masterTask.team.name} - ${this.masterTask.team.id}`)
|
// this.selectedTeam = `${this.masterTask.team.name} - ${this.masterTask.team.id}`)
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
// Kravarik: Pridaj toast
|
||||||
console.log(error)
|
console.log(error)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -404,7 +405,6 @@ export default {
|
|||||||
async _load(masterTaskId) {
|
async _load(masterTaskId) {
|
||||||
try {
|
try {
|
||||||
this.masterTask = await this.$axios.get_auth_data(`v1/master-tasks/${masterTaskId}`)
|
this.masterTask = await this.$axios.get_auth_data(`v1/master-tasks/${masterTaskId}`)
|
||||||
console.log(this.masterTask)
|
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
this.$toast.error(error)
|
this.$toast.error(error)
|
||||||
}
|
}
|
||||||
@@ -433,7 +433,7 @@ export default {
|
|||||||
} catch (error) {
|
} catch (error) {
|
||||||
this.$toast.error(error)
|
this.$toast.error(error)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
employeeSelected(selectedOption) {
|
employeeSelected(selectedOption) {
|
||||||
const employee = this.employees.find((empl) => empl.id == selectedOption.key)
|
const employee = this.employees.find((empl) => empl.id == selectedOption.key)
|
||||||
|
|||||||
@@ -125,7 +125,7 @@
|
|||||||
<div class="d-flex justify-start">
|
<div class="d-flex justify-start">
|
||||||
<img class="pencil-icon" :src="require('@/plugins/tm@overview/_img/pencil-icon.svg')" alt="pencil-icon" @click.stop="editMode = !editMode" />
|
<img class="pencil-icon" :src="require('@/plugins/tm@overview/_img/pencil-icon.svg')" alt="pencil-icon" @click.stop="editMode = !editMode" />
|
||||||
<img class="trash-icon" :src="require('@/plugins/tm@overview/_img/trash-icon.svg')" alt="trash-icon" @click.stop="deleteTask()"/>
|
<img class="trash-icon" :src="require('@/plugins/tm@overview/_img/trash-icon.svg')" alt="trash-icon" @click.stop="deleteTask()"/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<v-card-actions class="d-flex flex-column modal-content">
|
<v-card-actions class="d-flex flex-column modal-content">
|
||||||
@@ -201,7 +201,7 @@
|
|||||||
<v-sheet class="ma-2 d-flex flex-wrap">
|
<v-sheet class="ma-2 d-flex flex-wrap">
|
||||||
<div class="d-flex align-center mb-2 me-2" v-for="(employee, index) in task.employees" :key="employee.id">
|
<div class="d-flex align-center mb-2 me-2" v-for="(employee, index) in task.employees" :key="employee.id">
|
||||||
<p class="employee-selected-avatar d-flex justify-center align-center">
|
<p class="employee-selected-avatar d-flex justify-center align-center">
|
||||||
{{ employee.name.charAt(0) + employee.surname.charAt(0) }}
|
{{ employee.name.charAt(0) + employee.surname.charAt(0) }}
|
||||||
</p>
|
</p>
|
||||||
<p class="ml-2" v-html="`${task.employees[index].name} ${task.employees[index].surname}`" />
|
<p class="ml-2" v-html="`${task.employees[index].name} ${task.employees[index].surname}`" />
|
||||||
</div>
|
</div>
|
||||||
@@ -345,6 +345,7 @@ export default {
|
|||||||
this.masterTasks = await this.$axios.get_auth_data('v1/master-tasks')
|
this.masterTasks = await this.$axios.get_auth_data('v1/master-tasks')
|
||||||
this.employees = await this.$axios.get_auth_data('v1/employees')
|
this.employees = await this.$axios.get_auth_data('v1/employees')
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
// Kravarik: Pridaj toast
|
||||||
console.log(error)
|
console.log(error)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -424,7 +425,7 @@ export default {
|
|||||||
} catch (error) {
|
} catch (error) {
|
||||||
this.$toast.error(error)
|
this.$toast.error(error)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
employeeSelected(selectedOption) {
|
employeeSelected(selectedOption) {
|
||||||
const employee = this.employees.find((empl) => empl.id == selectedOption.key)
|
const employee = this.employees.find((empl) => empl.id == selectedOption.key)
|
||||||
@@ -474,13 +475,13 @@ export default {
|
|||||||
|
|
||||||
formattedStartDate() {
|
formattedStartDate() {
|
||||||
let startDate = moment(this.task.starts_at)
|
let startDate = moment(this.task.starts_at)
|
||||||
let date = startDate.format('DD.MM.yyyy, HH:mm')
|
let date = startDate.format('DD.MM.yyyy, HH:mm')
|
||||||
return date
|
return date
|
||||||
},
|
},
|
||||||
|
|
||||||
formattedEndDate() {
|
formattedEndDate() {
|
||||||
let endDate = moment(this.task.ends_at)
|
let endDate = moment(this.task.ends_at)
|
||||||
let date = endDate.format('DD.MM.yyyy, HH:mm')
|
let date = endDate.format('DD.MM.yyyy, HH:mm')
|
||||||
return date
|
return date
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -104,20 +104,6 @@ export default {
|
|||||||
},
|
},
|
||||||
|
|
||||||
methods: {
|
methods: {
|
||||||
async create(team = null) {
|
|
||||||
if (team) {
|
|
||||||
this.team = team
|
|
||||||
await this._load()
|
|
||||||
} else {
|
|
||||||
this.team = {
|
|
||||||
name: '',
|
|
||||||
employees: []
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
this.visible = true
|
|
||||||
},
|
|
||||||
|
|
||||||
async save() {
|
async save() {
|
||||||
if (!(await this.v$.$validate()))
|
if (!(await this.v$.$validate()))
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -33,6 +33,7 @@ export default {
|
|||||||
try {
|
try {
|
||||||
this.employees = await this.$axios.get_auth_data('v1/employees')
|
this.employees = await this.$axios.get_auth_data('v1/employees')
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
// Kravarik: Pridaj toast
|
||||||
console.log(error)
|
console.log(error)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -49,7 +50,7 @@ export default {
|
|||||||
return `${employee.name} ${employee.surname}`
|
return `${employee.name} ${employee.surname}`
|
||||||
})
|
})
|
||||||
return employees
|
return employees
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,6 +21,7 @@
|
|||||||
<img class="pencil-icon" :src="require('@/plugins/tm@overview/_img/pencil-icon.svg')" alt="pencil-icon" :style="{opacity: 0.3}"/>
|
<img class="pencil-icon" :src="require('@/plugins/tm@overview/_img/pencil-icon.svg')" alt="pencil-icon" :style="{opacity: 0.3}"/>
|
||||||
<img class="trash-icon" :src="require('@/plugins/tm@overview/_img/trash-icon.svg')" alt="trash-icon" @click.stop="showDeleteModal = { task }" />
|
<img class="trash-icon" :src="require('@/plugins/tm@overview/_img/trash-icon.svg')" alt="trash-icon" @click.stop="showDeleteModal = { task }" />
|
||||||
|
|
||||||
|
<!-- Kravarik: Aj tento modal prerob novym sposobom -->
|
||||||
<Z-delete-task-modal v-if="showDeleteModal" :visible="showDeleteModal ? true : false" :task="showDeleteModal.task" @close="showDeleteModal = null" />
|
<Z-delete-task-modal v-if="showDeleteModal" :visible="showDeleteModal ? true : false" :task="showDeleteModal.task" @close="showDeleteModal = null" />
|
||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
<div>
|
<div>
|
||||||
|
|
||||||
<Z-tasks-search @queryChange="filterOngoingTasks" />
|
<Z-tasks-search @queryChange="filterOngoingTasks" />
|
||||||
|
|
||||||
<W-loadable :content="ongoingTasks">
|
<W-loadable :content="ongoingTasks">
|
||||||
<A-ongoing-table :tasks="filteredOngoingTasks" />
|
<A-ongoing-table :tasks="filteredOngoingTasks" />
|
||||||
<h6
|
<h6
|
||||||
@@ -12,7 +12,7 @@
|
|||||||
Aktuálnemu hľadaniu nevyhovujú žiadne prebiehajúce úlohy
|
Aktuálnemu hľadaniu nevyhovujú žiadne prebiehajúce úlohy
|
||||||
</h6>
|
</h6>
|
||||||
</W-loadable>
|
</W-loadable>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@@ -38,19 +38,22 @@ export default {
|
|||||||
this.ongoingTasks = await this.$axios.get_auth_data('v1/overview/ongoing-tasks')
|
this.ongoingTasks = await this.$axios.get_auth_data('v1/overview/ongoing-tasks')
|
||||||
this.filterOngoingTasks()
|
this.filterOngoingTasks()
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
// Kravarik: ked to je takto ze idu data do w-loadable tak musis dat this.ongoingTasks = {error}
|
||||||
|
// Ten toast vyhod a to kde nastavujes error musis dat do {} ako v riadku hore lebo ono to pozera if (content.error)
|
||||||
this.ongoingTasks = error
|
this.ongoingTasks = error
|
||||||
this.$toast.error(error)
|
this.$toast.error(error)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
methods: {
|
methods: {
|
||||||
|
// Kravarik: Toto sprav cez computed. A bude tam ze if (!searchQuerry) return this.ongoing tasks. Else to prefiltrujes
|
||||||
filterOngoingTasks(searchQuery) {
|
filterOngoingTasks(searchQuery) {
|
||||||
if(!searchQuery) return this.filteredOngoingTasks = this.ongoingTasks
|
if(!searchQuery) return this.filteredOngoingTasks = this.ongoingTasks
|
||||||
this.filteredOngoingTasks = this.ongoingTasks.filter((task) => {
|
this.filteredOngoingTasks = this.ongoingTasks.filter((task) => {
|
||||||
return this.filterParams(searchQuery, task.title) || this.filterParams(searchQuery, task.project_code)
|
return this.filterParams(searchQuery, task.title) || this.filterParams(searchQuery, task.project_code)
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
|
||||||
filterParams(searchQuery, row) {
|
filterParams(searchQuery, row) {
|
||||||
return row.toLowerCase().includes(searchQuery.toLowerCase())
|
return row.toLowerCase().includes(searchQuery.toLowerCase())
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,6 +19,7 @@
|
|||||||
<img class="pencil-icon" :src="require('@/plugins/tm@overview/_img/pencil-icon.svg')" alt="pencil-icon" :style="{opacity: 0.3}">
|
<img class="pencil-icon" :src="require('@/plugins/tm@overview/_img/pencil-icon.svg')" alt="pencil-icon" :style="{opacity: 0.3}">
|
||||||
<img class="trash-icon" :src="require('@/plugins/tm@overview/_img/trash-icon.svg')" alt="trash-icon" @click.stop="showDeleteModal = { task }">
|
<img class="trash-icon" :src="require('@/plugins/tm@overview/_img/trash-icon.svg')" alt="trash-icon" @click.stop="showDeleteModal = { task }">
|
||||||
|
|
||||||
|
<!-- Kravarik: Aj tento modal prerob novym sposobom -->
|
||||||
<Z-delete-task-modal v-if="showDeleteModal" :visible="showDeleteModal ? true : false" :task="showDeleteModal.task" @close="showDeleteModal = null" />
|
<Z-delete-task-modal v-if="showDeleteModal" :visible="showDeleteModal ? true : false" :task="showDeleteModal.task" @close="showDeleteModal = null" />
|
||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
|
|||||||
@@ -38,19 +38,22 @@ export default {
|
|||||||
this.unscheduledTasks = await this.$axios.get_auth_data('v1/overview/unscheduled-tasks')
|
this.unscheduledTasks = await this.$axios.get_auth_data('v1/overview/unscheduled-tasks')
|
||||||
this.filterUnscheduledTasks()
|
this.filterUnscheduledTasks()
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
// Kravarik: ked to je takto ze idu data do w-loadable tak musis dat this.ongoingTasks = {error}
|
||||||
|
// Ten toast vyhod a to kde nastavujes error musis dat do {} ako v riadku hore lebo ono to pozera if (content.error)
|
||||||
this.unscheduledTasks = error
|
this.unscheduledTasks = error
|
||||||
this.$toast.error(error)
|
this.$toast.error(error)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
methods: {
|
methods: {
|
||||||
|
// Kravarik: Toto sprav cez computed. A bude tam ze if (!searchQuerry) return this.unscheduled tasks. Else to prefiltrujes
|
||||||
filterUnscheduledTasks(searchQuery) {
|
filterUnscheduledTasks(searchQuery) {
|
||||||
if(!searchQuery) return this.filteredUnscheduledTasks = this.unscheduledTasks
|
if(!searchQuery) return this.filteredUnscheduledTasks = this.unscheduledTasks
|
||||||
this.filteredUnscheduledTasks = this.unscheduledTasks.filter((task) => {
|
this.filteredUnscheduledTasks = this.unscheduledTasks.filter((task) => {
|
||||||
return this.filterParams(searchQuery, task.title) || this.filterParams(searchQuery, task.project_code)
|
return this.filterParams(searchQuery, task.title) || this.filterParams(searchQuery, task.project_code)
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
|
||||||
filterParams(searchQuery, row) {
|
filterParams(searchQuery, row) {
|
||||||
return row.toLowerCase().includes(searchQuery.toLowerCase())
|
return row.toLowerCase().includes(searchQuery.toLowerCase())
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,6 +22,7 @@
|
|||||||
</v-table>
|
</v-table>
|
||||||
|
|
||||||
<Z-team-modal ref="z-team-modal" />
|
<Z-team-modal ref="z-team-modal" />
|
||||||
|
<!-- Kravarik: Aj tento modal prerob novym sposobom -->
|
||||||
<Z-delete-team-modal v-if="deleteModal" :visible="deleteModal ? true : false" :team="deleteModal.team" @close="(deleteModal = null)" />
|
<Z-delete-team-modal v-if="deleteModal" :visible="deleteModal ? true : false" :team="deleteModal.team" @close="(deleteModal = null)" />
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@@ -22,6 +22,8 @@ export default {
|
|||||||
try {
|
try {
|
||||||
this.teams = await this.$axios.get_auth_data('v1/teams')
|
this.teams = await this.$axios.get_auth_data('v1/teams')
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
// Kravarik: ked to je takto ze idu data do w-loadable tak musis dat this.ongoingTasks = {error}
|
||||||
|
// Ten toast vyhod a to kde nastavujes error musis dat do {} ako v riadku hore lebo ono to pozera if (content.error)
|
||||||
this.teams = {error: error.data.error}
|
this.teams = {error: error.data.error}
|
||||||
this.$toast.error(error.data.error)
|
this.$toast.error(error.data.error)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -86,6 +86,7 @@ export default {
|
|||||||
|
|
||||||
created() {
|
created() {
|
||||||
// TEMP
|
// TEMP
|
||||||
|
// Kravarik: Vyhodit
|
||||||
this.$store.dispatch('auth/login', {
|
this.$store.dispatch('auth/login', {
|
||||||
email: 'xx@asdasd.asd',
|
email: 'xx@asdasd.asd',
|
||||||
password: 'sdfsdfsdf'
|
password: 'sdfsdfsdf'
|
||||||
@@ -108,8 +109,10 @@ export default {
|
|||||||
if (!(await this.v$.$validate())) return
|
if (!(await this.v$.$validate())) return
|
||||||
try {
|
try {
|
||||||
await this.$store.dispatch('wAuth/updateUserInfo', this.user)
|
await this.$store.dispatch('wAuth/updateUserInfo', this.user)
|
||||||
|
|
||||||
this.$toast.success('Profil bol úspešne zmenený')
|
this.$toast.success('Profil bol úspešne zmenený')
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
// Kravarik: Posli iba errror
|
||||||
this.$toast.error(error.response.data.error)
|
this.$toast.error(error.response.data.error)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
Reference in new issue
Block a user