[subTask, masterTask detail-modal]

This commit is contained in:
romankko2 committed 2023-01-11 12:10:24 +01:00
1 parent f237ba05bf
commit 258b13c92a
31 files changed
+1464 -87

No files matched your search

+26
View File
@@ -12,6 +12,7 @@
"@capacitor/preferences": "^4.0.2", "@capacitor/preferences": "^4.0.2",
"@fullcalendar/core": "^6.0.2", "@fullcalendar/core": "^6.0.2",
"@fullcalendar/daygrid": "^6.0.2", "@fullcalendar/daygrid": "^6.0.2",
"@fullcalendar/interaction": "6.0.2",
"@fullcalendar/vue3": "^6.0.2", "@fullcalendar/vue3": "^6.0.2",
"@ionic/vue": "^6.3.6", "@ionic/vue": "^6.3.6",
"@mdi/font": "5.9.55", "@mdi/font": "5.9.55",
@@ -22,6 +23,7 @@
"axios-auth-refresh": "^3.3.4", "axios-auth-refresh": "^3.3.4",
"core-js": "^3.8.3", "core-js": "^3.8.3",
"date-fns": "^2.29.3", "date-fns": "^2.29.3",
"lodash-es": "^4.17.21",
"mitt": "^2.1.0", "mitt": "^2.1.0",
"moment": "^2.29.4", "moment": "^2.29.4",
"node-polyfill-webpack-plugin": "^2.0.1", "node-polyfill-webpack-plugin": "^2.0.1",
@@ -1869,6 +1871,14 @@
"@fullcalendar/core": "~6.0.2" "@fullcalendar/core": "~6.0.2"
} }
}, },
"node_modules/@fullcalendar/interaction": {
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/@fullcalendar/interaction/-/interaction-6.0.2.tgz",
"integrity": "sha512-RPWWCp6wdzVCc3XdcBUZuduFGX/mB8OrV2xBF5wrGFbGAZE3OYuEPcVnLF1SsC+pJVntG6z1fL5aQ/OM8nul9Q==",
"peerDependencies": {
"@fullcalendar/core": "~6.0.2"
}
},
"node_modules/@fullcalendar/vue3": { "node_modules/@fullcalendar/vue3": {
"version": "6.0.2", "version": "6.0.2",
"resolved": "https://registry.npmjs.org/@fullcalendar/vue3/-/vue3-6.0.2.tgz", "resolved": "https://registry.npmjs.org/@fullcalendar/vue3/-/vue3-6.0.2.tgz",
@@ -8423,6 +8433,11 @@
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
"dev": true "dev": true
}, },
"node_modules/lodash-es": {
"version": "4.17.21",
"resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz",
"integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw=="
},
"node_modules/lodash.debounce": { "node_modules/lodash.debounce": {
"version": "4.0.8", "version": "4.0.8",
"resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
@@ -15031,6 +15046,12 @@
"integrity": "sha512-OoHo+HbKmunq2hy5K6T2390DmSwXIENxHBeKFPlUXHK48xD/zXQI3N1zRlZRd83+Yrq+vDF6l8ObO9PMu2leJw==", "integrity": "sha512-OoHo+HbKmunq2hy5K6T2390DmSwXIENxHBeKFPlUXHK48xD/zXQI3N1zRlZRd83+Yrq+vDF6l8ObO9PMu2leJw==",
"requires": {} "requires": {}
}, },
"@fullcalendar/interaction": {
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/@fullcalendar/interaction/-/interaction-6.0.2.tgz",
"integrity": "sha512-RPWWCp6wdzVCc3XdcBUZuduFGX/mB8OrV2xBF5wrGFbGAZE3OYuEPcVnLF1SsC+pJVntG6z1fL5aQ/OM8nul9Q==",
"requires": {}
},
"@fullcalendar/vue3": { "@fullcalendar/vue3": {
"version": "6.0.2", "version": "6.0.2",
"resolved": "https://registry.npmjs.org/@fullcalendar/vue3/-/vue3-6.0.2.tgz", "resolved": "https://registry.npmjs.org/@fullcalendar/vue3/-/vue3-6.0.2.tgz",
@@ -19997,6 +20018,11 @@
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
"dev": true "dev": true
}, },
"lodash-es": {
"version": "4.17.21",
"resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz",
"integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw=="
},
"lodash.debounce": { "lodash.debounce": {
"version": "4.0.8", "version": "4.0.8",
"resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
+1
View File
@@ -13,6 +13,7 @@
"@fullcalendar/core": "^6.0.2", "@fullcalendar/core": "^6.0.2",
"@fullcalendar/daygrid": "^6.0.2", "@fullcalendar/daygrid": "^6.0.2",
"@fullcalendar/vue3": "^6.0.2", "@fullcalendar/vue3": "^6.0.2",
"lodash-es": "^4.17.21",
"@ionic/vue": "^6.3.6", "@ionic/vue": "^6.3.6",
"@mdi/font": "5.9.55", "@mdi/font": "5.9.55",
"@vuelidate/core": "^2.0.0", "@vuelidate/core": "^2.0.0",
+35 -4
View File
@@ -2,8 +2,10 @@
"data": { "data": {
"id": 1, "id": 1,
"name": "Master task 1", "name": "Master task 1",
"description": "Nejaky popis tasku", "description": "Urna vitae, suscipit suspendisse lectus arcu, imperdiet. Vulputate sit nec ut et. Urna ut a ac amet, donec orci non. Posuere elit magna consequat volutpat bibendum. Accumsan gravida elit condimentum sed. Congue non, dictum nec accumsan egestas vel. Sed molestie pretium odio morbi. Amet nunc, diam ridiculus dis condimentum arcu. Rhoncus, elementum, quis aenean neque. Faucibus leo laoreet lobortis vitae elementum. Condimentum ornare iaculis in fames in ut sit enim.",
"duration": 5400000, "duration": 5400000,
"worked_time": 4400000,
"remaining_time": 1200000,
"time_worked": 0, "time_worked": 0,
"starts_at": "2022-05-10T00:00:00+00:00", "starts_at": "2022-05-10T00:00:00+00:00",
"deadline": "2022-11-10T00:00:00+00:00", "deadline": "2022-11-10T00:00:00+00:00",
@@ -17,7 +19,6 @@
"name": "Rastislav", "name": "Rastislav",
"surname": "Kuttner" "surname": "Kuttner"
}, },
{ {
"id": 4, "id": 4,
"name": "Viliam", "name": "Viliam",
@@ -30,8 +31,38 @@
"surname": "Gajdos" "surname": "Gajdos"
} }
], ],
"files": [] "files": [
{
"content_type": "application/pdf",
"created_at": "2022-09-23 07:02:55",
"description": null,
"disk_name": "632d5a1924093750079385.pdf",
"extension": "pdf",
"name": "File1.pdf",
"file_size": 132385,
"google_file_id": "1TgBRHhX-JVc5mkREUmoCRO4Sta3diqjo",
"id": 265,
"path": "",
"sort_order": 265,
"title": null,
"updated_at": "2022-09-23 07:02:55"
},
{
"id":274,
"disk_name":"632d5a3a48955848077357.rar",
"name":"File2.rar",
"file_size":58231,
"content_type":"application\/x-rar",
"title":null,
"description":null,
"sort_order":274,
"created_at":"2022-09-23 07:03:29",
"updated_at":"2022-09-23 07:03:29",
"google_file_id":"1CD6P9fAmCRoZTmjc3JWi1ysVDLDSReId",
"path":"",
"extension":"rar"
}
]
}, },
"status": 200 "status": 200
} }
+57 -3
View File
@@ -1,13 +1,37 @@
{ {
"data": { "data": {
"id": 1, "id": 1,
"description": "Nejaky popis tasku", "description": "Urna vitae, suscipit suspendisse lectus arcu, imperdiet. Vulputate sit nec ut et. Urna ut a ac amet, donec orci non. Posuere elit magna consequat volutpat bibendum. Accumsan gravida elit condimentum sed. Congue non, dictum nec accumsan egestas vel. Sed molestie pretium odio morbi. Amet nunc, diam ridiculus dis condimentum arcu. Rhoncus, elementum, quis aenean neque. Faucibus leo laoreet lobortis vitae elementum. Condimentum ornare iaculis in fames in ut sit enim.",
"project_code": "CO-2201", "project_code": "CO-2201",
"master_task_id": 1, "master_task_id": 1,
"master_task": "Master task 1", "master_task": "Master task 1",
"team_id": 1, "team_id": 1,
"team": {
"id": 1,
"name": "Team 1",
"employees": [
{
"id": 1,
"name": "Rastislav",
"surname": "Kuttner"
},
{
"id": 2,
"name": "Lenka",
"surname": "Nemeckova"
},
{
"id": 3,
"name": "Peter",
"surname": "Bucan"
}
]
},
"employee_id": 1, "employee_id": 1,
"duration": 1000000, "duration": 1000000,
"remaining_time": 150,
"is_finished": false, "is_finished": false,
"starts_at": "2022-11-10T11:00:00+00:00", "starts_at": "2022-11-10T11:00:00+00:00",
"ends_at": "2022-11-12T16:00:00+00:00", "ends_at": "2022-11-12T16:00:00+00:00",
@@ -30,8 +54,38 @@
"surname": "Spinelli" "surname": "Spinelli"
} }
], ],
"files": [] "files": [
{
"content_type": "application/pdf",
"created_at": "2022-09-23 07:02:55",
"description": null,
"disk_name": "632d5a1924093750079385.pdf",
"extension": "pdf",
"name": "File1.pdf",
"file_size": 132385,
"google_file_id": "1TgBRHhX-JVc5mkREUmoCRO4Sta3diqjo",
"id": 265,
"path": "",
"sort_order": 265,
"title": null,
"updated_at": "2022-09-23 07:02:55"
},
{
"id":274,
"disk_name":"632d5a3a48955848077357.rar",
"name":"File2.rar",
"file_size":58231,
"content_type":"application\/x-rar",
"title":null,
"description":null,
"sort_order":274,
"created_at":"2022-09-23 07:03:29",
"updated_at":"2022-09-23 07:03:29",
"google_file_id":"1CD6P9fAmCRoZTmjc3JWi1ysVDLDSReId",
"path":"",
"extension":"rar"
}
]
}, },
"status": 200 "status": 200
} }
+5 -11
View File
@@ -85,17 +85,11 @@ const routes: Array<RouteRecordRaw> = [
meta: { title: 'Váš profil' }, meta: { title: 'Váš profil' },
component: () => import('@/plugins/tm@profile/profile/my-profile.vue') component: () => import('@/plugins/tm@profile/profile/my-profile.vue')
}, },
// { {
// path: '/app/search/:searchText', path: '/app/search',
// redirect: to => { name: 'Search',
// return { path: '/app/search', query: { q: to.params.searchText } } component: () => import('@/plugins/lib@search/search/search.vue')
// }, }
// },
// {
// path: '/app/search',
// name: 'Search',
// component: () => import('@/plugins/lib@search/search/search.vue')
// }
] ]
} }
] ]
@@ -7,7 +7,7 @@
<div class="d-flex justify-end align-center w-100 header-sm"> <div class="d-flex justify-end align-center w-100 header-sm">
<img class="search-icon" :src="require('@/plugins/app/_layout/app/_img/search-icon.svg')" alt="search-icon" /> <img class="search-icon" :src="require('@/plugins/app/_layout/app/_img/search-icon.svg')" alt="search-icon" />
<input class="search-input mx-2" type="text" placeholder="Vyhľadávanie" /> <input class="search-input mx-2" v-model="search" type="text" placeholder="Vyhľadávanie" @click="$router.push({name: 'Search'})" @keyup="eventBus.emit('onSearch', search)" />
<v-menu> <v-menu>
<template v-slot:activator="{ props }"> <template v-slot:activator="{ props }">
@@ -73,7 +73,8 @@ export default {
data() { data() {
return { return {
user: null user: null,
search: ''
} }
}, },
@@ -0,0 +1,4 @@
.cancel-btn {
border: thin solid rgba(var(--v-border-color), var(--v-border-opacity)) !important;
color: #7f39fb !important;
}/*# sourceMappingURL=z-cancel-btn.css.map */
@@ -0,0 +1 @@
{"version":3,"sources":["z-cancel-btn.sass","z-cancel-btn.css"],"names":[],"mappings":"AAAA;EACC,kFAAA;EACA,yBAAA;ACCD","file":"z-cancel-btn.css"}
@@ -0,0 +1,5 @@
.z-btn {
background: #7f39fb !important;
border-radius: 4px !important;
color: #fff !important;
}/*# sourceMappingURL=z-default-btn.css.map */
@@ -0,0 +1 @@
{"version":3,"sources":["z-default-btn.sass","z-default-btn.css"],"names":[],"mappings":"AAAA;EACC,8BAAA;EACA,6BAAA;EACA,sBAAA;ACCD","file":"z-default-btn.css"}
@@ -0,0 +1,24 @@
.dp__input {
height: 56px;
border: 1px solid #E5E5E5 !important;
}
.dp__range_end, .dp__range_start, .dp__active_date {
background: #7F39FB !important;
}
.dp__select {
color: #7F39FB !important;
}
.dp__today {
border: 1px solid #7F39FB !important;
}
.dp__range_between {
background: #F4E8FF !important;
}
.dp__action {
font-weight: 500 !important;
}/*# sourceMappingURL=date-picker.css.map */
@@ -0,0 +1 @@
{"version":3,"sources":["date-picker.sass","date-picker.css"],"names":[],"mappings":"AAAA;EACC,YAAA;EACA,oCAAA;ACCD;;ADCA;EACC,8BAAA;ACED;;ADAA;EACC,yBAAA;ACGD;;ADDA;EACC,oCAAA;ACID;;ADFA;EACC,8BAAA;ACKD;;ADHA;EACC,2BAAA;ACMD","file":"date-picker.css"}
+79
View File
@@ -0,0 +1,79 @@
.task-action .trash-icon {
padding: 10px;
background: rgba(0, 0, 0, 0.04);
margin-left: 12px;
border-radius: 50%;
cursor: pointer;
}
.task-action .pencil-icon {
padding: 10px;
background: rgba(0, 0, 0, 0.04);
border-radius: 50%;
cursor: pointer;
}
.status-badge {
background: #F2E7FE;
color: #7F39FB;
width: -webkit-fit-content;
width: -moz-fit-content;
width: fit-content;
}
.task-badge {
background: rgba(0, 0, 0, 0.04);
width: -webkit-fit-content;
width: -moz-fit-content;
width: fit-content;
}
.description-detail {
background: rgba(0, 0, 0, 0.04);
color: rgba(0, 0, 0, 0.6);
height: -webkit-fit-content;
height: -moz-fit-content;
height: fit-content;
}
.employee-selected-avatar {
background: #6200EE;
color: #fff;
border-radius: 50%;
padding: 13px;
font-size: 11.5px;
height: 24px;
width: 24px;
}
th {
font-size: 16px !important;
}
.task-action {
width: 50%;
}
.v-card {
padding: 35px !important;
}
.cursor-pointer:hover {
cursor: pointer;
}
.hover-background:hover {
background-color: rgba(0, 0, 0, var(--v-hover-opacity));
}
.v-input__control {
border-radius: 4px;
}
.border-select .v-input__control {
border: 1px solid #E5E5E5 !important;
}
input[type=time]::-webkit-calendar-picker-indicator {
display: none;
border: 1px solid #E5E5E5 !important;
}/*# sourceMappingURL=global.css.map */
@@ -0,0 +1 @@
{"version":3,"sources":["global.sass","global.css"],"names":[],"mappings":"AACC;EACC,aAAA;EACA,+BAAA;EACA,iBAAA;EACA,kBAAA;EACA,eAAA;ACAF;ADCC;EACC,aAAA;EACA,+BAAA;EACA,kBAAA;EACA,eAAA;ACCF;;ADCA;EACC,mBAAA;EACA,cAAA;EACA,0BAAA;EAAA,uBAAA;EAAA,kBAAA;ACED;;ADAA;EACC,+BAAA;EACA,0BAAA;EAAA,uBAAA;EAAA,kBAAA;ACGD;;ADDA;EACC,+BAAA;EACA,yBAAA;EACA,2BAAA;EAAA,wBAAA;EAAA,mBAAA;ACID;;ADFA;EACC,mBAAA;EACA,WAAA;EACA,kBAAA;EACA,aAAA;EACA,iBAAA;EACA,YAAA;EACA,WAAA;ACKD;;ADHA;EACC,0BAAA;ACMD;;ADJA;EACC,UAAA;ACOD;;ADLA;EACC,wBAAA;ACQD;;ADNA;EACC,eAAA;ACSD;;ADPA;EACC,uDAAA;ACUD;;ADRA;EACC,kBAAA;ACWD;;ADTA;EACC,oCAAA;ACYD;;ADVA;EACC,aAAA;EACA,oCAAA;ACaD","file":"global.css"}
+23
View File
@@ -11,6 +11,29 @@
border-radius: 50% border-radius: 50%
cursor: pointer cursor: pointer
.status-badge
background: #F2E7FE
color: #7F39FB
width: fit-content
.task-badge
background: rgba(0, 0, 0, 0.04)
width: fit-content
.description-detail
background: rgba(0, 0, 0, 0.04)
color: rgba(0, 0, 0, 0.6)
height: fit-content
.employee-selected-avatar
background: #6200EE
color: #fff
border-radius: 50%
padding: 13px
font-size: 11.5px
height: 24px
width: 24px
th th
font-size: 16px !important font-size: 16px !important
@@ -0,0 +1,4 @@
.v-dialog h1 {
font-size: 26px;
font-weight: 500;
}/*# sourceMappingURL=v-dialog.css.map */
@@ -0,0 +1 @@
{"version":3,"sources":["v-dialog.sass","v-dialog.css"],"names":[],"mappings":"AACC;EACC,eAAA;EACA,gBAAA;ACAF","file":"v-dialog.css"}
@@ -0,0 +1,94 @@
* {
margin: 0;
padding: 0;
}
html {
scroll-behavior: smooth;
}
#app {
overflow-x: hidden;
}
.w-app {
font: 15px "Avenir", Helvetica, Arial, sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
background-color: #fff !important;
color: #2c3e50;
margin-top: 8em;
padding-top: 12em;
}
.page-container {
width: 100%;
max-width: 1200px;
margin-left: auto;
margin-right: auto;
}
a {
text-decoration: none;
color: #42b983;
}
a[name] {
position: relative;
top: -4em;
display: block;
}
.scrollable {
height: 250px;
overflow-y: scroll;
padding-right: 1.8em;
}
.footer {
font-size: 0.9em;
font-style: italic;
margin: 3em 0 3.5em;
}
.footer .w-icon {
font-size: 1.2em;
}
.footer .w-icon.heart {
transition: 1s ease-out;
cursor: pointer;
}
.footer .w-icon.heart:hover {
-webkit-animation: pulse 1.8s ease-out infinite;
animation: pulse 1.8s ease-out infinite;
}
@-webkit-keyframes pulse {
0%, 20%, 30%, 35%, 45%, 100% {
transform: scale(1);
}
25%, 40% {
transform: scale(1.3);
}
}
@keyframes pulse {
0%, 20%, 30%, 35%, 45%, 100% {
transform: scale(1);
}
25%, 40% {
transform: scale(1.3);
}
}
@media screen and (max-width: 1240px) {
:root {
--container-padding: 20px;
}
.page-container {
padding-left: var(--container-padding);
padding-right: var(--container-padding);
}
}
@media screen and (max-width: 524px) {
:root {
--container-padding: 12px;
}
}/*# sourceMappingURL=index.css.map */
@@ -0,0 +1 @@
{"version":3,"sources":["_base.scss","index.css","_variables.scss"],"names":[],"mappings":"AAGA;EAAG,SAAA;EAAU,UAAA;ACAb;;ADEA;EAAM,uBAAA;ACEN;;ADAA;EAAM,kBAAA;ACIN;;ADFA;EACE,iDAAA;EACA,mCAAA;EACA,kCAAA;EACA,iCAAA;EACA,cAAA;EACA,eAAA;EACA,iBAAA;ACKF;;ADFA;EACE,WAAA;EACA,iBEpBe;EFqBf,iBAAA;EACA,kBAAA;ACKF;;ADAA;EACE,qBAAA;EACA,cE9BQ;ADiCV;ADDE;EACE,kBAAA;EACA,SAAA;EACA,cAAA;ACGJ;;ADCA;EACE,aAAA;EACA,kBAAA;EACA,oBAAA;ACEF;;ADCA;EACE,gBAAA;EACA,kBAAA;EACA,mBAAA;ACEF;ADAE;EACE,gBAAA;ACEJ;ADAI;EAAS,uBAAA;EAAwB,eAAA;ACIrC;ADHI;EAAe,+CAAA;UAAA,uCAAA;ACMnB;;ADFA;EACE;IAA8B,mBAAA;ECM9B;EDLA;IAAU,qBAAA;ECQV;AACF;;ADXA;EACE;IAA8B,mBAAA;ECM9B;EDLA;IAAU,qBAAA;ECQV;AACF;ADJA;EACE;IAAO,yBAAA;ECOP;EDNA;IACE,sCAAA;IACA,uCAAA;ECQF;AACF;ADLA;EACE;IAAO,yBAAA;ECQP;AACF","file":"index.css"}
@@ -0,0 +1,396 @@
.vuecal {
height: 100%;
box-shadow: 0 0 0 1px inset rgba(0, 0, 0, 0.08);
}
.vuecal * {
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
.vuecal--has-touch *:not(.vuecal__event-title--edit) {
-webkit-touch-callout: none;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
.vuecal .clickable {
cursor: pointer;
}
.vuecal--resizing-event, .vuecal--drag-creating-event {
cursor: ns-resize;
}
.vuecal--dragging-event {
cursor: move;
cursor: -webkit-grabbing;
cursor: grabbing;
}
.vuecal .dragging-helper {
position: absolute;
width: 60px;
height: 40px;
background: rgba(138, 190, 230, 0.8);
border: 1px solid #61a9e0;
z-index: 10;
}
.vuecal--xsmall {
font-size: 0.9em;
}
.vuecal__flex {
display: flex;
flex-direction: row;
}
.vuecal__flex[column] {
flex-direction: column;
flex: 1 1 auto;
}
.vuecal__flex[grow] {
flex: 1 1 auto;
width: 100%;
}
.vuecal__flex[wrap] {
flex-wrap: wrap;
}
.vuecal__split-days-headers.slide-fade--right-leave-active {
display: none;
}
.vuecal--week-numbers.vuecal--month-view .vuecal__split-days-headers {
margin-left: 3em;
}
.vuecal--day-view:not(.vuecal--overflow-x) .vuecal__split-days-headers {
margin-left: 3em;
height: 2.2em;
}
.vuecal--day-view.vuecal--twelve-hour:not(.vuecal--overflow-x) .vuecal__split-days-headers {
margin-left: 4em;
}
.vuecal__split-days-headers .day-split-header {
display: flex;
flex-grow: 1;
flex-basis: 0;
justify-content: center;
align-items: center;
height: 100%;
}
.vuecal__split-days-headers .vuecal--day-view.vuecal--overflow-x.vuecal--sticky-split-labels .day-split-header {
height: 1.5em;
}
.vuecal__body {
position: relative;
overflow: hidden;
}
.vuecal__all-day {
min-height: 1.7em;
margin-bottom: -1px;
flex-shrink: 0;
}
.vuecal__all-day-text {
width: 3em;
box-sizing: border-box;
color: #999;
padding-right: 2px;
display: flex;
flex-shrink: 0;
align-items: center;
justify-content: flex-end;
border-bottom: 1px solid #ddd;
-webkit-hyphens: auto;
-ms-hyphens: auto;
hyphens: auto;
}
.vuecal__all-day-text span {
font-size: 0.85em;
text-align: right;
line-height: 1.1;
}
.vuecal--twelve-hour .vuecal__all-day > span {
width: 4em;
}
.vuecal__bg {
overflow: auto;
overflow-x: hidden;
-webkit-overflow-scrolling: touch;
min-height: 60px;
position: relative;
width: 100%;
}
.vuecal--no-time .vuecal__bg {
display: flex;
flex: 1 1 auto;
overflow: auto;
}
.vuecal__week-numbers {
width: 3em;
flex-shrink: 0 !important;
}
.vuecal__week-numbers .vuecal__week-number-cell {
opacity: 0.4;
font-size: 0.9em;
align-items: center;
justify-items: center;
justify-content: center;
}
.vuecal__scrollbar-check {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
overflow: scroll;
visibility: hidden;
z-index: -1;
}
.vuecal__scrollbar-check div {
height: 120%;
}
.vuecal__time-column {
width: 3em;
height: 100%;
flex-shrink: 0;
}
.vuecal--twelve-hour .vuecal__time-column {
width: 4em;
font-size: 0.9em;
}
.vuecal--overflow-x.vuecal--week-view .vuecal__time-column {
margin-top: 4em;
box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.3);
}
.vuecal--overflow-x.vuecal--week-view.vuecal--sticky-split-labels .vuecal__time-column {
margin-top: 3.4em;
}
.vuecal--overflow-x.vuecal--day-view.vuecal--sticky-split-labels .vuecal__time-column {
margin-top: 1.5em;
}
.vuecal__time-column .vuecal__time-cell {
color: #999;
text-align: right;
padding-right: 2px;
font-size: 0.9em;
}
.vuecal__time-column .vuecal__time-cell-line:before {
content: "";
position: absolute;
left: 0;
right: 0;
border-top: 1px solid rgba(196, 196, 196, 0.3);
}
.vuecal__cells {
margin: 0 1px 1px 0;
}
.vuecal--overflow-x.vuecal--day-view .vuecal__cells {
margin: 0;
}
.vuecal--events-on-month-view.vuecal--short-events .vuecal__cells {
width: 99.9%;
}
.vuecal--overflow-x.vuecal--day-view .vuecal__cells, .vuecal--overflow-x.vuecal--week-view .vuecal__cells {
flex-wrap: nowrap;
overflow: auto;
}
.slide-fade--left-enter-active, .slide-fade--left-leave-active,
.slide-fade--right-enter-active, .slide-fade--right-leave-active {
transition: 0.25s ease-out;
}
.slide-fade--left-enter-from,
.slide-fade--right-leave-to {
transform: translateX(-15px);
opacity: 0;
}
.slide-fade--left-leave-to,
.slide-fade--right-enter-from {
transform: translateX(15px);
opacity: 0;
}
.slide-fade--left-leave-active,
.slide-fade--right-leave-active {
position: absolute !important;
height: 100%;
}
.vuecal__title-bar .slide-fade--left-leave-active,
.vuecal__title-bar .slide-fade--right-leave-active {
left: 0;
right: 0;
height: auto;
}
.vuecal__heading .slide-fade--left-leave-active,
.vuecal__heading .slide-fade--right-leave-active {
display: flex;
align-items: center;
}
.vuecal--green-theme .vuecal__menu, .vuecal--green-theme .vuecal__cell-events-count {
background-color: #42b983;
color: #fff;
}
.vuecal--green-theme .vuecal__title-bar {
background-color: #e4f5ef;
}
.vuecal--green-theme .vuecal__cell--today, .vuecal--green-theme .vuecal__cell--current {
background-color: rgba(240, 240, 255, 0.4);
}
.vuecal--green-theme:not(.vuecal--day-view) .vuecal__cell--selected {
background-color: rgba(235, 255, 245, 0.4);
}
.vuecal--green-theme .vuecal__cell--selected:before {
border-color: rgba(66, 185, 131, 0.5);
}
.vuecal--green-theme .vuecal__cell--highlighted:not(.vuecal__cell--has-splits),
.vuecal--green-theme .vuecal__cell-split--highlighted {
background-color: rgba(195, 255, 225, 0.5);
}
.vuecal--green-theme .vuecal__arrow--highlighted,
.vuecal--green-theme .vuecal__today-btn--highlighted,
.vuecal--green-theme .vuecal__view-btn--highlighted {
background-color: rgba(136, 236, 191, 0.25);
}
.vuecal--blue-theme .vuecal__menu, .vuecal--blue-theme .vuecal__cell-events-count {
background-color: rgba(66, 163, 185, 0.8);
color: #fff;
}
.vuecal--blue-theme .vuecal__title-bar {
background-color: rgba(0, 165, 188, 0.3);
}
.vuecal--blue-theme .vuecal__cell--today, .vuecal--blue-theme .vuecal__cell--current {
background-color: rgba(240, 240, 255, 0.4);
}
.vuecal--blue-theme:not(.vuecal--day-view) .vuecal__cell--selected {
background-color: rgba(235, 253, 255, 0.4);
}
.vuecal--blue-theme .vuecal__cell--selected:before {
border-color: rgba(115, 191, 204, 0.5);
}
.vuecal--blue-theme .vuecal__cell--highlighted:not(.vuecal__cell--has-splits),
.vuecal--blue-theme .vuecal__cell-split--highlighted {
background-color: rgba(0, 165, 188, 0.06);
}
.vuecal--blue-theme .vuecal__arrow--highlighted,
.vuecal--blue-theme .vuecal__today-btn--highlighted,
.vuecal--blue-theme .vuecal__view-btn--highlighted {
background-color: rgba(66, 163, 185, 0.2);
}
.vuecal--rounded-theme .vuecal__weekdays-headings {
border: none;
}
.vuecal--rounded-theme .vuecal__cell, .vuecal--rounded-theme .vuecal__cell:before {
background: none;
border: none;
}
.vuecal--rounded-theme .vuecal__cell--out-of-scope {
opacity: 0.4;
}
.vuecal--rounded-theme .vuecal__cell-content {
width: 30px;
height: 30px;
flex-grow: 0;
border: 1px solid transparent;
border-radius: 30px;
color: #333;
}
.vuecal--rounded-theme.vuecal--day-view .vuecal__cell-content {
width: auto;
background: none;
}
.vuecal--rounded-theme.vuecal--year-view .vuecal__cell {
width: 33.33%;
}
.vuecal--rounded-theme.vuecal--year-view .vuecal__cell-content {
width: 85px;
}
.vuecal--rounded-theme.vuecal--years-view .vuecal__cell-content {
width: 52px;
}
.vuecal--rounded-theme .vuecal__cell {
background-color: transparent !important;
}
.vuecal--rounded-theme.vuecal--green-theme:not(.vuecal--day-view) .vuecal__cell-content {
background-color: #f1faf7;
}
.vuecal--rounded-theme.vuecal--green-theme:not(.vuecal--day-view) .vuecal__cell--today .vuecal__cell-content {
background-color: #42b983;
color: #fff;
}
.vuecal--rounded-theme.vuecal--green-theme .vuecal--day-view .vuecal__cell--today:before {
background-color: rgba(66, 185, 131, 0.05);
}
.vuecal--rounded-theme.vuecal--green-theme:not(.vuecal--day-view) .vuecal__cell--selected .vuecal__cell-content {
border-color: #42b983;
}
.vuecal--rounded-theme.vuecal--green-theme .vuecal__cell--highlighted:not(.vuecal__cell--has-splits),
.vuecal--rounded-theme.vuecal--green-theme .vuecal__cell-split--highlighted {
background-color: rgba(195, 255, 225, 0.5);
}
.vuecal--rounded-theme.vuecal--blue-theme:not(.vuecal--day-view) .vuecal__cell-content {
background-color: rgba(100, 182, 255, 0.2);
}
.vuecal--rounded-theme.vuecal--blue-theme:not(.vuecal--day-view) .vuecal__cell--today .vuecal__cell-content {
background-color: #8fb7e4;
color: #fff;
}
.vuecal--rounded-theme.vuecal--blue-theme .vuecal--day-view .vuecal__cell--today:before {
background-color: rgba(143, 183, 228, 0.1);
}
.vuecal--rounded-theme.vuecal--blue-theme:not(.vuecal--day-view) .vuecal__cell--selected .vuecal__cell-content {
border-color: #61a9e0;
}
.vuecal--rounded-theme.vuecal--blue-theme .vuecal__cell--highlighted:not(.vuecal__cell--has-splits),
.vuecal--rounded-theme.vuecal--blue-theme .vuecal__cell-split--highlighted {
background-color: rgba(0, 165, 188, 0.06);
}
.vuecal--date-picker .vuecal__title-bar {
font-size: 1.2em;
}
.vuecal--date-picker .vuecal__heading {
height: 2.2em;
font-weight: 500;
opacity: 0.4;
}
.vuecal--date-picker .vuecal__weekdays-headings {
border: none;
}
.vuecal--date-picker .vuecal__body {
margin-left: 1px;
}
.vuecal--date-picker .vuecal__cell, .vuecal--date-picker .vuecal__cell:before {
background: none;
border: none;
}
.vuecal--date-picker .vuecal__cell-content {
height: 26px;
flex-grow: 0;
border: 1px solid transparent;
border-radius: 25px;
transition: background-color 0.2s cubic-bezier(0.39, 0.58, 0.57, 1);
}
.vuecal--date-picker.vuecal--years-view .vuecal__cell-content {
flex: 0;
padding: 0 4px;
height: 24px;
}
.vuecal--date-picker.vuecal--year-view .vuecal__cell-content {
flex: 0;
padding: 0 15px;
}
.vuecal--date-picker.vuecal--month-view .vuecal__cell-content {
width: 26px;
}
.vuecal--date-picker:not(.vuecal--day-view) .vuecal__cell-content:hover {
background-color: rgba(0, 0, 0, 0.1);
}
.vuecal--date-picker:not(.vuecal--day-view) .vuecal__cell--selected .vuecal__cell-content {
background-color: #42b982;
color: #fff;
}
.vuecal--date-picker:not(.vuecal--day-view) .vuecal__cell--current .vuecal__cell-content, .vuecal--date-picker:not(.vuecal--day-view) .vuecal__cell--today .vuecal__cell-content {
border-color: #42b982;
}/*# sourceMappingURL=styles.css.map */
@@ -0,0 +1 @@
{"version":3,"sources":["styles.scss","styles.css"],"names":[],"mappings":"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","file":"styles.css"}
@@ -0,0 +1,93 @@
.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 */
@@ -0,0 +1 @@
{"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"}
@@ -0,0 +1,10 @@
<template>
<div>
</div>
</template>
<script>
export default {
}
</script>
+32 -2
View File
@@ -1,4 +1,34 @@
<template> <template>
<div> <form>
</div> <A-search-result-team />
</form>
</template> </template>
<script>
import { debounce } from 'lodash-es'
import ASearchResultTeam from '@/plugins/lib@search/search/_components/a-seach-result-team.vue'
export default {
components: {
ASearchResultTeam
},
data() {
return {
search: null
}
},
created() {
this.eventBus.on('onSearch', (search) => {
this.search = search
})
},
methods: {
debounceSearch: debounce(function () {
console.log("object")
}, 2000),
}
}
</script>
@@ -1,17 +1,25 @@
<template> <template>
<div id="calendar" class="mb-12"> <div id="calendar" class="mb-12">
<FullCalendar ref="fullCalendar" :options="calendarOptions" /> <FullCalendar ref="fullCalendar" :options="calendarOptions"/>
<Z-master-task-modal ref="z-master-task-modal" />
</div> </div>
</template> </template>
<script> <script>
import FullCalendar from '@fullcalendar/vue3' import FullCalendar 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'
export default { export default {
components: { components: {
FullCalendar FullCalendar,
ZMasterTaskModal
}, },
props: ['events', 'month'], props: ['events', 'month'],
methods: {
editTask(masterTask, editMode) {
this.$refs['z-master-task-modal'].create(masterTask, editMode)
}
},
computed: { computed: {
calendarOptions() { calendarOptions() {
return { return {
@@ -22,7 +30,15 @@ export default {
height: 650, height: 650,
firstDay: 1, firstDay: 1,
dayHeaderClassNames: ['w-day-header'], dayHeaderClassNames: ['w-day-header'],
events: this.events events: this.events,
eventContent: function(eventInfo) {
return { html: eventInfo.event.extendedProps.title_html }
},
eventClick: (info) => {
console.log(info.event._def)
// alert(JSON.stringify(info.event._def))
this.editTask(info.event._def.publicId, false)
}
} }
} }
}, },
@@ -60,9 +76,21 @@ export default {
&: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-title) &:deep(.fc-event)
font-size: 12px font-size: 12px
padding-left: 10px padding-left: 10px
&:deep(.fc-event)
margin-top: 5px margin-top: 5px
&:after
background: unset
&:deep(.fc-day-today)
background: white
a
background: #3700B3
width: 32px
height: 32px
color: white
text-align: center
border-radius: 50%
border: 5px solid white
line-height: 15px
</style> </style>
@@ -83,7 +83,7 @@ export default {
} }
</script> </script>
<style lang="sass" scoped> <style lang="sass" scoped>
// TODO: zjednotit styly ikon v hlobalnom sass subore // TODO: zjednotit styly ikon v globalnom sass subore
// TODO: ↓ // TODO: ↓
.subheader .subheader
max-width: 100% max-width: 100%
@@ -7,7 +7,7 @@
<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: {
@@ -34,6 +34,7 @@ export default {
this.events = events.map(item => ({ this.events = events.map(item => ({
id: item.id, id: item.id,
title: `${item.project_code} - ${item.name}`, title: `${item.project_code} - ${item.name}`,
title_html: `${item.project_code} - <b>${item.name}</b>`,
start: item.starts_at, start: item.starts_at,
end: item.deadline, end: item.deadline,
is_finished: item.is_finished, is_finished: item.is_finished,
@@ -47,7 +47,7 @@
</template> </template>
<template v-slot:event="{ event }"> <template v-slot:event="{ event }">
<div class="event-wrapper w-100 h-100 d-flex flex-column justify-space-between" :class="{'short-event' : getEventLenght(event) <= 9000000, 'mini-event' : getEventLenght(event) <= 5400000, 'micro-event' : getEventLenght(event) <= 3600000}"> <div @click.stop="editTask(event.id)" class="event-wrapper w-100 h-100 d-flex flex-column justify-space-between" :class="{'short-event' : getEventLenght(event) <= 9000000, 'mini-event' : getEventLenght(event) <= 5400000, 'micro-event' : getEventLenght(event) <= 3600000}">
<div class="event-content"> <div class="event-content">
<small v-if="(event.project_code && !event.is_blocker)" class="project-code">{{ event.project_code }}</small> <small v-if="(event.project_code && !event.is_blocker)" class="project-code">{{ event.project_code }}</small>
<h3>{{ event.title }}</h3> <h3>{{ event.title }}</h3>
@@ -60,14 +60,15 @@
</div> </div>
<div class="event-footer d-flex"> <div class="event-footer d-flex">
<v-btn rounded class="event-footer-button me-2" @click="this.showCompleteModal = {task: event}"><img :src="require('./_img/checkmark.svg')" alt=""></v-btn> <v-btn rounded class="event-footer-button me-2" @click.stop="this.showCompleteModal = {task: event}"><img :src="require('./_img/checkmark.svg')" alt=""></v-btn>
<v-btn rounded class="event-footer-button me-2" @click="editTask(event.id)" :style="{opacity: 0.3}"><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="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>
</div> </div>
</div> </div>
</template> </template>
</Vue-cal> </Vue-cal>
<Z-sub-task-modal ref="z-sub-task-modal" />
<Z-complete-task-modal v-if="showCompleteModal" :visible="showCompleteModal ? true : false" :task="showCompleteModal.task" @close="showCompleteModal = null" /> <Z-complete-task-modal v-if="showCompleteModal" :visible="showCompleteModal ? true : false" :task="showCompleteModal.task" @close="showCompleteModal = null" />
<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>
@@ -76,11 +77,13 @@
<script> <script>
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'
export default { export default {
components: { components: {
ZCompleteTaskModal, ZCompleteTaskModal,
ZDeleteTaskModal ZDeleteTaskModal,
ZSubTaskModal
}, },
props: { props: {
@@ -185,10 +188,6 @@ export default {
} }
}, },
editTask(id) {
console.log('edit', id)
},
eventFocused(event) { eventFocused(event) {
this.focusedEventId = event.task_id this.focusedEventId = event.task_id
console.log(`Focused: ${event.task_id}`) console.log(`Focused: ${event.task_id}`)
@@ -204,6 +203,10 @@ export default {
top: defaultTimeToScrollTo.getBoundingClientRect().top - toolbarHeight - subheaderHeight top: defaultTimeToScrollTo.getBoundingClientRect().top - toolbarHeight - subheaderHeight
}) })
}, },
editTask(subTask, editMode) {
this.$refs['z-sub-task-modal'].create(subTask, editMode)
}
} }
} }
</script> </script>
@@ -1,9 +1,9 @@
<template> <template>
<v-dialog v-model="visible" max-width="650" max-height="90%" height="700px"> <v-dialog v-model="visible" max-width="650" max-height="90%" height="700px">
<W-loadable :content="masterTask" class="h-100"> <W-loadable :content="masterTask && employees" class="h-100">
<v-card height="100%" class="d-flex flex-column scrolling"> <v-card v-if="editMode" height="100%" class="d-flex flex-column scrolling">
<div class="d-flex justify-space-between align-center modal-header"> <div class="d-flex justify-space-between align-center modal-header">
<h1>Vytvoriť master task</h1> <h1>{{ masterTask.id ? 'Upraviť master task' : 'Vytvoriť master task' }}</h1>
<v-icon <v-icon
@click.stop="close()" @click.stop="close()"
icon="mdi-close" icon="mdi-close"
@@ -116,6 +116,184 @@
<v-btn class="z-btn" @click="save()">VYTVORIŤ</v-btn> <v-btn class="z-btn" @click="save()">VYTVORIŤ</v-btn>
</v-card> </v-card>
<v-card v-else height="100%" class="d-flex flex-column scrolling">
<div class="d-flex justify-space-between align-center">
<p>{{ masterTask.project_code }}</p>
<v-icon
@click.stop="close()"
icon="mdi-close"
size="large"
class="pb-5"
></v-icon>
</div>
<div class="d-flex justify-space-between align-center modal-header border-bottom pb-4">
<h1>{{ masterTask.name }}</h1>
<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="trash-icon" :src="require('@/plugins/tm@overview/_img/trash-icon.svg')" alt="trash-icon" @click.stop="deleteTask()"/>
</div>
</div>
<v-card-actions class="d-flex flex-column modal-content">
<div class="w-100">
<v-row no-gutters class="align-center">
<v-col cols="5">
<v-sheet class="pa-2 ma-2">
<div class="d-flex align-center">
<v-icon
icon="mdi-drag-vertical"
size="large"
></v-icon>
<p class="mx-3">Status</p>
</div>
</v-sheet>
</v-col>
<v-col cols="7">
<v-sheet class="ma-2">
<p v-if="masterTask.is_finished" class="status-badge px-4 py-2 rounded-pill">Ukončený</p>
<p v-if="!masterTask.is_finished" class="status-badge px-4 py-2 rounded-pill">Neukončený</p>
</v-sheet>
</v-col>
</v-row>
<v-row no-gutters class="align-center">
<v-col cols="5">
<v-sheet class="pa-2 ma-2">
<div class="d-flex align-center">
<v-icon
icon="mdi-calendar-week"
size="large"
></v-icon>
<p class="mx-3">Deadline</p>
</div>
</v-sheet>
</v-col>
<v-col cols="7">
<v-sheet class="ma-2">
<p class="text-red-darken-4">{{ formattedDeadline }}</p>
</v-sheet>
</v-col>
</v-row>
<v-row no-gutters class="align-center">
<v-col cols="5">
<v-sheet class="pa-2 ma-2">
<div class="d-flex align-center">
<v-icon
icon="mdi-account-multiple-outline"
size="large"
></v-icon>
<p class="mx-3">Tím</p>
</div>
</v-sheet>
</v-col>
<v-col cols="7">
<v-sheet class="ma-2 d-flex scroll-employees">
<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">
<p class="employee-selected-avatar d-flex justify-center align-center">
{{ employee.name.charAt(0) + employee.surname.charAt(0) }}
</p>
<p class="ml-2" v-html="`${masterTask.employees[index].name} ${masterTask.employees[index].surname}`" />
</div>
</v-sheet>
</v-col>
</v-row>
<v-row no-gutters class="align-center">
<v-col cols="5">
<v-sheet class="pa-2 ma-2">
<div class="d-flex align-center">
<v-icon
icon="mdi-clock-time-three-outline"
size="large"
></v-icon>
<p class="mx-3">Naplánovaný čas</p>
</div>
</v-sheet>
</v-col>
<v-col cols="7">
<v-sheet class="ma-2">
<p>{{ (masterTask.duration / 60 / 60).toFixed(2) }} h</p>
</v-sheet>
</v-col>
</v-row>
<v-row no-gutters class="align-center">
<v-col cols="5">
<v-sheet class="pa-2 ma-2">
<div class="d-flex align-center">
<v-icon
icon="mdi-timer-outline"
size="large"
></v-icon>
<p class="mx-3">Odpracovaný čas</p>
</div>
</v-sheet>
</v-col>
<v-col cols="7">
<v-sheet class="ma-2">
<p class="text-red-darken-4">{{ masterTask.worked_time }} h</p>
</v-sheet>
</v-col>
</v-row>
<v-row no-gutters class="align-center border-bottom">
<v-col cols="5">
<v-sheet class="pa-2 ma-2">
<div class="d-flex align-center">
<v-icon
icon="mdi-clock-time-three-outline"
size="large"
></v-icon>
<p class="mx-3">Zostávajúci čas</p>
</div>
</v-sheet>
</v-col>
<v-col cols="7">
<v-sheet class="ma-2">
<p class="text-red-darken-4">{{ masterTask.remaining_time }} h</p>
</v-sheet>
</v-col>
</v-row>
<div class="px-5 py-5 border-bottom">
<p>Popis zadania</p>
<section class="description-detail px-2 py-2 w-100 rounded mt-2">{{ masterTask.description }}</section>
<p class="mt-5">Prílohy</p>
<div class="w-100 d-flex align-center">
<div v-for="(file, index) in masterTask.files" :key="file.id" class="d-flex align-center flex-wrap" :class="[index === 0 ? 'ml-0': 'ml-2']">
<v-chip class="mt-2">
{{ file.name }}
<v-icon class="mx-1" icon="mdi-paperclip"></v-icon>
</v-chip>
</div>
</div>
</div>
<div class="d-flex justify-start align-center mt-8">
<v-btn class="z-btn" @click="save()">Ukončiť mastertask</v-btn>
</div>
<v-table class="mt-7 mb-5">
<tbody class="px-5 py-5">
<tr v-for="(employee, index) in masterTask.employees" :key="employee.id">
<td class="w-25">{{ masterTask.name }}</td>
<td class="d-flex align-center">
<p class="employee-selected-avatar d-flex justify-center align-center">
{{ employee.name.charAt(0) + employee.surname.charAt(0) }}
</p>
<p class="ml-2" v-html="`${masterTask.employees[index].name} ${masterTask.employees[index].surname}`" />
</td>
<td class="task-action">
<div class="d-flex justify-start">
<img class="pencil-icon" :src="require('@/plugins/tm@dashboard/tasks/_components/_img/checkmark.svg')" alt="checkmark-icon" :style="{opacity: 0.3}">
<img class="pencil-icon ml-2" :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" :style="{opacity: 0.3}">
</div>
</td>
</tr>
</tbody>
</v-table>
<div class="d-flex align-center ">
<v-btn class="subtask-btn w-100"><v-icon class="mx-1" icon="mdi-plus" />Pridať Subtask</v-btn>
</div>
</div>
</v-card-actions>
</v-card>
</W-loadable> </W-loadable>
</v-dialog> </v-dialog>
</template> </template>
@@ -127,6 +305,7 @@ import useVuelidate from '@vuelidate/core'
import { required } from '@vuelidate/validators' import { required } from '@vuelidate/validators'
import errorUtils from '@/plugins/lib@auth/_utils/error.utils' import errorUtils from '@/plugins/lib@auth/_utils/error.utils'
import ZAutocomplete from '@/plugins/tm@_components/z-autocomplete.vue' import ZAutocomplete from '@/plugins/tm@_components/z-autocomplete.vue'
import moment from 'moment'
const atLeastOne = (value) => value.length const atLeastOne = (value) => value.length
@@ -141,6 +320,7 @@ export default {
data() { data() {
return { return {
editMode: false,
visible: false, visible: false,
errorUtils, errorUtils,
v$: useVuelidate(), v$: useVuelidate(),
@@ -178,10 +358,9 @@ export default {
}, },
methods: { methods: {
async create(masterTask = null) { async create(masterTaskId = null, editMode = false) {
if (masterTask) { if (masterTaskId) {
this.masterTask = masterTask await this._load(masterTaskId)
await this._load()
} else { } else {
this.masterTask = { this.masterTask = {
project_code: null, project_code: null,
@@ -195,6 +374,7 @@ export default {
} }
} }
this.editMode = editMode || (!this.masterTask.id)
this.visible = true this.visible = true
}, },
@@ -221,6 +401,15 @@ export default {
this.masterTask = null this.masterTask = null
}, },
async _load(masterTaskId) {
try {
this.masterTask = await this.$axios.get_auth_data(`v1/master-tasks/${masterTaskId}`)
console.log(this.masterTask)
} catch (error) {
this.$toast.error(error)
}
},
async _create() { async _create() {
try { try {
await this.$axios.post_auth('v1/master-tasks') await this.$axios.post_auth('v1/master-tasks')
@@ -237,6 +426,15 @@ export default {
} }
}, },
async deleteTask(masterTaskId) {
try {
await this.$axios.delete(`v1/master-tasks/${masterTaskId}`)
this.close()
} catch (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)
this.masterTask.employees.push(employee) this.masterTask.employees.push(employee)
@@ -292,6 +490,12 @@ export default {
value: `${employee.name} ${employee.surname}`, value: `${employee.name} ${employee.surname}`,
} }
}) })
},
formattedDeadline() {
let deadline = moment(this.masterTask.deadline)
let date = deadline.format('DD.MM.yyyy')
return date
} }
}, },
@@ -351,4 +555,34 @@ export default {
height: 50px height: 50px
.scrolling .scrolling
overflow: hidden !important overflow: hidden !important
.scroll-employees
overflow-x: scroll
.trash-icon
padding: 10px
background: rgba(0, 0, 0, 0.04)
margin-left: 12px
border-radius: 50%
cursor: pointer
.pencil-icon
padding: 10px
background: rgba(0, 0, 0, 0.04)
border-radius: 50%
cursor: pointer
.border-bottom
border-bottom: 1px solid rgba(0,0,0,.1)
.subtask-btn
border: thin solid rgba(var(--v-border-color), var(--v-border-opacity)) !important
color: #7f39fb !important
height: 53px
text-align: center
v-table, tbody
border-top: thin solid rgba(var(--v-border-color), var(--v-border-opacity))
border-bottom: thin solid rgba(var(--v-border-color), var(--v-border-opacity))
td:not(:last-child)
border-right: thin solid rgba(var(--v-border-color), var(--v-border-opacity))
</style> </style>
@@ -1,9 +1,9 @@
<template> <template>
<v-dialog v-model="visible" max-width="650" max-height="90%" height="700px"> <v-dialog v-model="visible" max-width="650" max-height="90%" height="700px">
<W-loadable :content="subTask" class="h-100"> <W-loadable :content="task && employees" class="h-100">
<v-card height="100%" class="d-flex flex-column scrolling"> <v-card v-if="editMode" height="100%" class="d-flex flex-column scrolling">
<div class="d-flex justify-space-between align-center modal-header"> <div class="d-flex justify-space-between align-center modal-header">
<h1>Vytvoriť subtask</h1> <h1>{{ task.id ? 'Upraviť task' : 'Vytvoriť task' }}</h1>
<v-icon <v-icon
@click.stop="close()" @click.stop="close()"
icon="mdi-close" icon="mdi-close"
@@ -13,7 +13,7 @@
<v-card-actions class="d-flex flex-column modal-content"> <v-card-actions class="d-flex flex-column modal-content">
<v-text-field <v-text-field
v-model="subTask.project_code" v-model="task.project_code"
@focus="onInputFocus" @focus="onInputFocus"
class="modal-input" class="modal-input"
label="Kód projektu" label="Kód projektu"
@@ -30,16 +30,16 @@
:items="masterTaskOptions" :items="masterTaskOptions"
></v-select> ></v-select>
<p v-if="subTask.team.employees" class="d-flex justify-start align-center w-100 mb-3 text-grey">Priradení zamestnanci</p> <p v-if="task.team.employees" class="d-flex justify-start align-center w-100 mb-3 text-grey">Priradení zamestnanci</p>
<v-text-field <v-text-field
v-for="(employee, index) in subTask.employees" v-for="(employee, index) in task.employees"
:key="employee.id" :key="employee.id"
@focus="onInputFocus" @focus="onInputFocus"
class="modal-input" class="modal-input"
:value="`${employee.name} ${employee.surname}`" :value="`${employee.name} ${employee.surname}`"
variant="solo" variant="solo"
v-model="subTask.employees[index].name" v-model="task.employees[index].name"
disabled disabled
> >
<p class="employee-select-avatar d-flex justify-center align-center"> <p class="employee-select-avatar d-flex justify-center align-center">
@@ -50,24 +50,24 @@
<Z-autocomplete <Z-autocomplete
v-if="showAddEmployeeInput" v-if="showAddEmployeeInput"
:options="employeesOptions" :options="employeesOptions"
:validations="v$.subTask.employees" :validations="v$.task.employees"
:class="{ error: v$.subTask.employees.$errors.length }" :class="{ error: v$.task.employees.$errors.length }"
class="modal-input" class="modal-input"
@option-selected="employeeSelected" @option-selected="employeeSelected"
/> />
<v-btn class="w-100 mb-5 add-employee-btn" :disabled="!subTask.team.employees" @click="showAddEmployeeInput = true"> <v-btn class="w-100 mb-5 add-employee-btn" :disabled="!task.team.employees" @click="showAddEmployeeInput = true">
<v-icon class="mx-1" icon="mdi-plus" />Pridať zamestnanca <v-icon class="mx-1" icon="mdi-plus" />Pridať zamestnanca
</v-btn> </v-btn>
<Datepicker <Datepicker
class="modal-input mb-5" class="modal-input mb-5"
v-model="subTask.date" v-model="task.date"
format="dd.MM.yyyy, HH:mm" format="dd.MM.yyyy, HH:mm"
locale="sk" locale="sk"
:class="{ error: v$.subTask.date.$errors.length }" :class="{ error: v$.task.date.$errors.length }"
@focus="onDateFocus" @focus="onDateFocus"
:validations="v$.subTask.date" :validations="v$.task.date"
select-text="Vybrať" select-text="Vybrať"
cancel-text="Zrušiť" cancel-text="Zrušiť"
placeholder="Trvanie od - do" placeholder="Trvanie od - do"
@@ -76,16 +76,16 @@
/> />
<v-text-field <v-text-field
v-model="subTask.duration" v-model="task.duration"
@focus="onInputFocus" @focus="onInputFocus"
class="modal-input" class="modal-input"
variant="solo" variant="solo"
type="number" type="number"
label="Časový odhad" label="Časový odhad"
:class="{ error: v$.subTask.duration.$errors.length }" :class="{ error: v$.task.duration.$errors.length }"
:hint=" :hint="
v$.subTask.duration.$errors v$.task.duration.$errors
? errorUtils.parseErrors(v$.subTask.duration.$errors) ? errorUtils.parseErrors(v$.task.duration.$errors)
: null : null
" "
append-inner-icon="mdi-clock-outline" append-inner-icon="mdi-clock-outline"
@@ -95,19 +95,198 @@
label="Popis" label="Popis"
class="modal-input" class="modal-input"
variant="solo" variant="solo"
:class="{ error: v$.subTask.description.$errors.length }" :class="{ error: v$.task.description.$errors.length }"
:hint=" :hint="
v$.subTask.description.$errors v$.task.description.$errors
? errorUtils.parseErrors(v$.subTask.description.$errors) ? errorUtils.parseErrors(v$.task.description.$errors)
: null : null
" "
v-model="subTask.description" v-model="task.description"
></v-textarea> ></v-textarea>
<Z-files-upload @files-uploaded="filesUploaded"/> <Z-files-upload @files-uploaded="filesUploaded"/>
</v-card-actions> </v-card-actions>
<v-btn class="z-btn" @click="save()">VYTVORIŤ</v-btn> <v-btn class="z-btn" @click="save()">{{ task.id ? 'UPRAVIŤ' : 'VYTVORIŤ' }}</v-btn>
</v-card>
<v-card v-else height="100%" class="d-flex flex-column scrolling">
<div class="d-flex justify-space-between align-center">
<p>{{ task.project_code }}</p>
<v-icon
@click.stop="close()"
icon="mdi-close"
size="large"
class="pb-5"
></v-icon>
</div>
<div class="d-flex justify-space-between align-center modal-header border-bottom pb-4">
<h1>{{ task.master_task }}</h1>
<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="trash-icon" :src="require('@/plugins/tm@overview/_img/trash-icon.svg')" alt="trash-icon" @click.stop="deleteTask()"/>
</div>
</div>
<v-card-actions class="d-flex flex-column modal-content">
<div class="w-100">
<v-row no-gutters class="align-center">
<v-col cols="5">
<v-sheet class="pa-2 ma-2">
<div class="d-flex align-center">
<v-icon
icon="mdi-link"
size="large"
></v-icon>
<p class="mx-3">Mastertask</p>
</div>
</v-sheet>
</v-col>
<v-col cols="7">
<v-sheet class="ma-2">
<p class="task-badge px-4 py-2 rounded-pill">{{ task.master_task }}</p>
</v-sheet>
</v-col>
</v-row>
<v-row no-gutters class="align-center">
<v-col cols="5">
<v-sheet class="pa-2 ma-2">
<div class="d-flex align-center">
<v-icon
icon="mdi-drag-vertical"
size="large"
></v-icon>
<p class="mx-3">Status</p>
</div>
</v-sheet>
</v-col>
<v-col cols="7">
<v-sheet class="ma-2">
<p v-if="task.is_finished" class="status-badge px-4 py-2 rounded-pill">Ukončený</p>
<p v-if="!task.is_finished" class="status-badge px-4 py-2 rounded-pill">Neukončený</p>
</v-sheet>
</v-col>
</v-row>
<v-row no-gutters class="align-center">
<v-col cols="5">
<v-sheet class="pa-2 ma-2">
<div class="d-flex align-center">
<v-icon
icon="mdi-calendar-week"
size="large"
></v-icon>
<p class="mx-3">Trvanie</p>
</div>
</v-sheet>
</v-col>
<v-col cols="7">
<v-sheet class="ma-2">
<p v-html="`${formattedStartDate} - ${formattedEndDate}`" />
</v-sheet>
</v-col>
</v-row>
<v-row no-gutters class="align-center">
<v-col cols="5">
<v-sheet class="pa-2 ma-2">
<div class="d-flex align-center">
<v-icon
icon="mdi-account-outline"
size="large"
></v-icon>
<p class="mx-3">Priradený</p>
</div>
</v-sheet>
</v-col>
<v-col cols="7">
<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">
<p class="employee-selected-avatar d-flex justify-center align-center">
{{ employee.name.charAt(0) + employee.surname.charAt(0) }}
</p>
<p class="ml-2" v-html="`${task.employees[index].name} ${task.employees[index].surname}`" />
</div>
</v-sheet>
</v-col>
</v-row>
<v-row no-gutters class="align-center">
<v-col cols="5">
<v-sheet class="pa-2 ma-2">
<div class="d-flex align-center">
<v-icon
icon="mdi-clock-time-three-outline"
size="large"
></v-icon>
<p class="mx-3">Naplánovaný čas</p>
</div>
</v-sheet>
</v-col>
<v-col cols="7">
<v-sheet class="ma-2">
<p>{{ (task.duration / 60 / 60).toFixed(2) }} h</p>
</v-sheet>
</v-col>
</v-row>
<v-row no-gutters class="align-center">
<v-col cols="5">
<v-sheet class="pa-2 ma-2">
<div class="d-flex align-center">
<v-icon
icon="mdi-timer-outline"
size="large"
></v-icon>
<p class="mx-3">Odpracovaný čas</p>
</div>
</v-sheet>
</v-col>
<v-col cols="7">
<v-sheet class="ma-2">
<v-text-field
v-model="task.nieco"
class="modal-input"
variant="solo"
type="number"
placeholder="h"
></v-text-field>
</v-sheet>
</v-col>
</v-row>
<v-row no-gutters class="align-center border-bottom">
<v-col cols="5">
<v-sheet class="pa-2 ma-2">
<div class="d-flex align-center">
<v-icon
icon="mdi-clock-time-three-outline"
size="large"
></v-icon>
<p class="mx-3">Zostávajúci čas</p>
</div>
</v-sheet>
</v-col>
<v-col cols="7">
<v-sheet class="ma-2">
<p>{{ task.remaining_time }} h</p>
</v-sheet>
</v-col>
</v-row>
<div class="px-5 py-5 border-bottom">
<p>Popis zadania</p>
<section class="description-detail px-2 py-2 w-100 rounded mt-2">{{ task.description }}</section>
<p class="mt-5">Prílohy</p>
<div class="w-100 d-flex align-center">
<div v-for="(file, index) in task.files" :key="file.id" class="d-flex align-center flex-wrap" :class="[index === 0 ? 'ml-0': 'ml-2']">
<v-chip class="mt-2">
{{ file.name }}
<v-icon class="mx-1" icon="mdi-paperclip"></v-icon>
</v-chip>
</div>
</div>
</div>
<div class="d-flex justify-start align-center mt-8">
<v-btn class="done-btn">Dokončené</v-btn>
<v-btn class="add-employee-btn" @click="save()">Uložiť zmeny</v-btn>
</div>
</div>
</v-card-actions>
</v-card> </v-card>
</W-loadable> </W-loadable>
</v-dialog> </v-dialog>
@@ -120,6 +299,7 @@ import useVuelidate from '@vuelidate/core'
import { required } from '@vuelidate/validators' import { required } from '@vuelidate/validators'
import errorUtils from '@/plugins/lib@auth/_utils/error.utils' import errorUtils from '@/plugins/lib@auth/_utils/error.utils'
import ZAutocomplete from '@/plugins/tm@_components/z-autocomplete.vue' import ZAutocomplete from '@/plugins/tm@_components/z-autocomplete.vue'
import moment from 'moment'
const atLeastOne = (value) => value.length const atLeastOne = (value) => value.length
@@ -134,8 +314,9 @@ export default {
data() { data() {
return { return {
editMode: false,
visible: false, visible: false,
subTask: null, task: null,
errorUtils, errorUtils,
v$: useVuelidate(), v$: useVuelidate(),
preventInputFocus: false, preventInputFocus: false,
@@ -148,7 +329,7 @@ export default {
validations() { validations() {
return { return {
subTask: { task: {
project_code: { required }, project_code: { required },
date: { required }, date: { required },
team: { required }, team: { required },
@@ -169,12 +350,11 @@ export default {
}, },
methods: { methods: {
async create(subTask = null) { async create(taskId = null, editMode = false) {
if (subTask) { if (taskId) {
this.subTask = subTask await this._load(taskId)
await this._load()
} else { } else {
this.subTask = { this.task = {
project_code: null, project_code: null,
date: null, date: null,
team: {}, team: {},
@@ -185,6 +365,7 @@ export default {
} }
} }
this.editMode = editMode || (!this.task.id)
this.visible = true this.visible = true
}, },
@@ -193,7 +374,7 @@ export default {
return return
try { try {
if (this.subTask.id) if (this.task.id)
await this._update() await this._update()
else else
await this._create() await this._create()
@@ -201,14 +382,23 @@ export default {
this.close() this.close()
this.$router.push({ name: 'Dashboard - Tasks' }) this.$router.push({ name: 'Dashboard - Tasks' })
} catch (error) { } catch (error) {
console.log(error) this.$toast(error)
} }
}, },
close() { close() {
this.visible = false this.visible = false
this.$emit('close', this.subTask) this.$emit('close', this.task)
this.subTask = null this.task = null
},
async _load(taskId) {
try {
this.task = await this.$axios.get_auth_data(`v1/tasks/${taskId}`)
console.log(this.task)
} catch (error) {
this.$toast.error(error)
}
}, },
async _create() { async _create() {
@@ -221,7 +411,16 @@ export default {
async _update() { async _update() {
try { try {
await this.$axios.post_auth(`v1/master-tasks/${this.subTask.id}`) await this.$axios.post_auth(`v1/master-tasks/${this.task.id}`)
} catch (error) {
this.$toast.error(error)
}
},
async deleteTask(taskId) {
try {
await this.$axios.delete(`v1/tasks/${taskId}`)
this.close()
} catch (error) { } catch (error) {
this.$toast.error(error) this.$toast.error(error)
} }
@@ -229,7 +428,7 @@ export default {
employeeSelected(selectedOption) { employeeSelected(selectedOption) {
const employee = this.employees.find((empl) => empl.id == selectedOption.key) const employee = this.employees.find((empl) => empl.id == selectedOption.key)
this.subTask.employees.push(employee) this.task.employees.push(employee)
this.showAddEmployeeInput = false this.showAddEmployeeInput = false
}, },
@@ -248,7 +447,7 @@ export default {
}, },
filesUploaded(files) { filesUploaded(files) {
this.subTask.files = files this.task.files = files
} }
}, },
@@ -258,7 +457,7 @@ export default {
}, },
employeesOptions() { employeesOptions() {
const selectedEmployeesIds = this.subTask.employees.map( const selectedEmployeesIds = this.task.employees.map(
(employee) => employee.id (employee) => employee.id
) )
const employees = this.employees.filter( const employees = this.employees.filter(
@@ -271,14 +470,26 @@ export default {
value: `${employee.name} ${employee.surname}`, value: `${employee.name} ${employee.surname}`,
} }
}) })
},
formattedStartDate() {
let startDate = moment(this.task.starts_at)
let date = startDate.format('DD.MM.yyyy, HH:mm')
return date
},
formattedEndDate() {
let endDate = moment(this.task.ends_at)
let date = endDate.format('DD.MM.yyyy, HH:mm')
return date
} }
}, },
watch: { watch: {
selectedMasterTask() { selectedMasterTask() {
this.subTask.team = this.masterTasks.find(masterTask => `${masterTask.name} - ${masterTask.id}` == this.selectedMasterTask) this.task.team = this.masterTasks.find(masterTask => `${masterTask.name} - ${masterTask.id}` == this.selectedMasterTask)
this.subTask.employees = this.subTask.team.employees this.task.employees = this.task.team.employees
this.subTask.project_code = this.masterTasks.filter(x => `${x.name} - ${x.id}` == this.selectedMasterTask)[0].project_code this.task.project_code = this.masterTasks.filter(x => `${x.name} - ${x.id}` == this.selectedMasterTask)[0].project_code
} }
} }
} }
@@ -322,6 +533,29 @@ export default {
border: 1px solid #E0E0E0 border: 1px solid #E0E0E0
border-radius: 4px border-radius: 4px
height: 50px height: 50px
width: 203px
.scrolling .scrolling
overflow: hidden !important overflow: hidden !important
.trash-icon
padding: 10px
background: rgba(0, 0, 0, 0.04)
margin-left: 12px
border-radius: 50%
cursor: pointer
.pencil-icon
padding: 10px
background: rgba(0, 0, 0, 0.04)
border-radius: 50%
cursor: pointer
.border-bottom
border-bottom: 1px solid rgba(0,0,0,.1)
.done-btn
background: #7f39fb !important
border-radius: 4px !important
color: #fff !important
height: 50px
width: 203px
</style> </style>