mirror of
https://bitbucket.org/studiotem/jandl-taskmanager-app.git
synced 2026-10-21 06:20:21 +00:00
build(production): added edit to timeblocks in subtask edit; fixed search for mastertasks in subtask; fixed calendar position in timeblocks
This commit is contained in:
commit
4949c28ae6
25 files changed
+2319
-1308
No files matched your search
@@ -1 +1 @@
|
||||
.subheader[data-v-45dcb20a]{max-width:100%;margin:0;border-bottom:1px solid rgba(33,33,33,.08);gap:25px;flex-wrap:wrap;flex:0 0 auto}.subheader-input[data-v-45dcb20a]{max-width:250px!important;min-width:250px;height:56px}.subheader-input[data-v-45dcb20a] .v-input__control .v-field{height:50px!important;--v-input-control-height:50px!important;--v-input-padding-top:15px!important}.subheader-input[data-v-45dcb20a] .v-input__details{display:none}.subheader-input.disabled[data-v-45dcb20a]{pointer-events:none!important}@media(max-width:600px){.subheader[data-v-45dcb20a]{gap:15px;padding:20px!important}.subheader-input[data-v-45dcb20a]{max-width:100%!important;min-width:100%;margin-bottom:15px}}[data-v-45dcb20a] .v-select__selection-text{display:-webkit-box;-webkit-line-clamp:1;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis}td[data-v-7c46cac8],th[data-v-7c46cac8],v-table[data-v-7c46cac8]{border:thin solid rgba(var(--v-border-color),var(--v-border-opacity))}.office-icon[data-v-7c46cac8]{height:20px;margin-left:12px}@media screen and (max-width:496px){.task-action div[data-v-7c46cac8]{display:flex;flex-direction:column}.task-action div .pencil-icon[data-v-7c46cac8],.task-action div .trash-icon[data-v-7c46cac8]{border-radius:50%;margin:6px;padding:6px}}.disabled[data-v-7c46cac8]{opacity:.5;pointer-events:none}tbody tr[data-v-7c46cac8]:hover{background:rgba(0,0,0,.1)}
|
||||
.subheader[data-v-45dcb20a]{max-width:100%;margin:0;border-bottom:1px solid rgba(33,33,33,.08);gap:25px;flex-wrap:wrap;flex:0 0 auto}.subheader-input[data-v-45dcb20a]{max-width:250px!important;min-width:250px;height:56px}.subheader-input[data-v-45dcb20a] .v-input__control .v-field{height:50px!important;--v-input-control-height:50px!important;--v-input-padding-top:15px!important}.subheader-input[data-v-45dcb20a] .v-input__details{display:none}.subheader-input.disabled[data-v-45dcb20a]{pointer-events:none!important}@media(max-width:600px){.subheader[data-v-45dcb20a]{gap:15px;padding:20px!important}.subheader-input[data-v-45dcb20a]{max-width:100%!important;min-width:100%;margin-bottom:15px}}[data-v-45dcb20a] .v-select__selection-text{display:-webkit-box;-webkit-line-clamp:1;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis}td[data-v-f717e9f4],th[data-v-f717e9f4],v-table[data-v-f717e9f4]{border:thin solid rgba(var(--v-border-color),var(--v-border-opacity))}.office-icon[data-v-f717e9f4]{height:20px;margin-left:12px}@media screen and (max-width:496px){.task-action div[data-v-f717e9f4]{display:flex;flex-direction:column}.task-action div .pencil-icon[data-v-f717e9f4],.task-action div .trash-icon[data-v-f717e9f4]{border-radius:50%;margin:6px;padding:6px}}.disabled[data-v-f717e9f4]{opacity:.5;pointer-events:none}tbody tr[data-v-f717e9f4]:hover{background:rgba(0,0,0,.1)}
|
||||
+1
-1
@@ -4,4 +4,4 @@
|
||||
* ress.css • v2.0.4
|
||||
* MIT License
|
||||
* github.com/filipelinhares/ress
|
||||
*/html{box-sizing:border-box;overflow-y:scroll;word-break:normal;-moz-tab-size:4;-o-tab-size:4;tab-size:4}*,:after,:before{background-repeat:no-repeat;box-sizing:inherit}:after,:before{text-decoration:inherit;vertical-align:inherit}*{padding:0;margin:0}hr{overflow:visible;height:0}details,main{display:block}summary{display:list-item}small{font-size:80%}[hidden]{display:none}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}a:active,a:hover{outline-width:0}pre{font-size:1em}b,strong{font-weight:bolder}input{border-radius:0}[disabled]{cursor:default}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}textarea{resize:vertical}button,input,optgroup,select,textarea{font:inherit}optgroup{font-weight:700}button{overflow:visible}button,select{text-transform:none}[role=button],[type=button],[type=reset],[type=submit],button{cursor:pointer;color:inherit}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button:-moz-focusring{outline:1px dotted ButtonText}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}button,input,select,textarea{background-color:transparent;border-style:none}select{-moz-appearance:none;-webkit-appearance:none}select::-ms-expand{display:none}select::-ms-value{color:currentColor}legend{border:0;color:inherit;display:table;white-space:normal;max-width:100%}::-webkit-file-upload-button{-webkit-appearance:button;color:inherit;font:inherit}::-ms-clear,::-ms-reveal{display:none}img{border-style:none}progress{vertical-align:baseline}@media screen{[hidden~=screen]{display:inherit}[hidden~=screen]:not(:active):not(:focus):not(:target){position:absolute!important;clip:rect(0 0 0 0)!important}}[aria-busy=true]{cursor:progress}[aria-controls]{cursor:pointer}[aria-disabled=true]{cursor:default}.elevation-24{box-shadow:0 11px 15px -7px var(--v-shadow-key-umbra-opacity,rgba(0,0,0,.2)),0 24px 38px 3px var(--v-shadow-key-penumbra-opacity,rgba(0,0,0,.14)),0 9px 46px 8px var(--v-shadow-key-penumbra-opacity,rgba(0,0,0,.12))!important}.elevation-23{box-shadow:0 11px 14px -7px var(--v-shadow-key-umbra-opacity,rgba(0,0,0,.2)),0 23px 36px 3px var(--v-shadow-key-penumbra-opacity,rgba(0,0,0,.14)),0 9px 44px 8px var(--v-shadow-key-penumbra-opacity,rgba(0,0,0,.12))!important}.elevation-22{box-shadow:0 10px 14px -6px var(--v-shadow-key-umbra-opacity,rgba(0,0,0,.2)),0 22px 35px 3px var(--v-shadow-key-penumbra-opacity,rgba(0,0,0,.14)),0 8px 42px 7px var(--v-shadow-key-penumbra-opacity,rgba(0,0,0,.12))!important}.elevation-21{box-shadow:0 10px 13px -6px var(--v-shadow-key-umbra-opacity,rgba(0,0,0,.2)),0 21px 33px 3px var(--v-shadow-key-penumbra-opacity,rgba(0,0,0,.14)),0 8px 40px 7px var(--v-shadow-key-penumbra-opacity,rgba(0,0,0,.12))!important}.elevation-20{box-shadow:0 10px 13px -6px var(--v-shadow-key-umbra-opacity,rgba(0,0,0,.2)),0 20px 31px 3px var(--v-shadow-key-penumbra-opacity,rgba(0,0,0,.14)),0 8px 38px 7px var(--v-shadow-key-penumbra-opacity,rgba(0,0,0,.12))!important}.elevation-19{box-shadow:0 9px 12px -6px var(--v-shadow-key-umbra-opacity,rgba(0,0,0,.2)),0 19px 29px 2px var(--v-shadow-key-penumbra-opacity,rgba(0,0,0,.14)),0 7px 36px 6px var(--v-shadow-key-penumbra-opacity,rgba(0,0,0,.12))!important}.elevation-18{box-shadow:0 9px 11px -5px var(--v-shadow-key-umbra-opacity,rgba(0,0,0,.2)),0 18px 28px 2px var(--v-shadow-key-penumbra-opacity,rgba(0,0,0,.14)),0 7px 34px 6px var(--v-shadow-key-penumbra-opacity,rgba(0,0,0,.12))!important}.elevation-17{box-shadow:0 8px 11px -5px var(--v-shadow-key-umbra-opacity,rgba(0,0,0,.2)),0 17px 26px 2px var(--v-shadow-key-penumbra-opacity,rgba(0,0,0,.14)),0 6px 32px 5px var(--v-shadow-key-penumbra-opacity,rgba(0,0,0,.12))!important}.elevation-16{box-shadow:0 8px 10px -5px var(--v-shadow-key-umbra-opacity,rgba(0,0,0,.2)),0 16px 24px 2px var(--v-shadow-key-penumbra-opacity,rgba(0,0,0,.14)),0 6px 30px 5px var(--v-shadow-key-penumbra-opacity,rgba(0,0,0,.12))!important}.elevation-15{box-shadow:0 8px 9px -5px var(--v-shadow-key-umbra-opacity,rgba(0,0,0,.2)),0 15px 22px 2px var(--v-shadow-key-penumbra-opacity,rgba(0,0,0,.14)),0 6px 28px 5px var(--v-shadow-key-penumbra-opacity,rgba(0,0,0,.12))!important}.elevation-14{box-shadow:0 7px 9px -4px var(--v-shadow-key-umbra-opacity,rgba(0,0,0,.2)),0 14px 21px 2px var(--v-shadow-key-penumbra-opacity,rgba(0,0,0,.14)),0 5px 26px 4px var(--v-shadow-key-penumbra-opacity,rgba(0,0,0,.12))!important}.elevation-13{box-shadow:0 7px 8px -4px var(--v-shadow-key-umbra-opacity,rgba(0,0,0,.2)),0 13px 19px 2px var(--v-shadow-key-penumbra-opacity,rgba(0,0,0,.Line truncated
|
||||
*/html{box-sizing:border-box;overflow-y:scroll;word-break:normal;-moz-tab-size:4;-o-tab-size:4;tab-size:4}*,:after,:before{background-repeat:no-repeat;box-sizing:inherit}:after,:before{text-decoration:inherit;vertical-align:inherit}*{padding:0;margin:0}hr{overflow:visible;height:0}details,main{display:block}summary{display:list-item}small{font-size:80%}[hidden]{display:none}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}a:active,a:hover{outline-width:0}pre{font-size:1em}b,strong{font-weight:bolder}input{border-radius:0}[disabled]{cursor:default}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}textarea{resize:vertical}button,input,optgroup,select,textarea{font:inherit}optgroup{font-weight:700}button{overflow:visible}button,select{text-transform:none}[role=button],[type=button],[type=reset],[type=submit],button{cursor:pointer;color:inherit}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button:-moz-focusring{outline:1px dotted ButtonText}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}button,input,select,textarea{background-color:transparent;border-style:none}select{-moz-appearance:none;-webkit-appearance:none}select::-ms-expand{display:none}select::-ms-value{color:currentColor}legend{border:0;color:inherit;display:table;white-space:normal;max-width:100%}::-webkit-file-upload-button{-webkit-appearance:button;color:inherit;font:inherit}::-ms-clear,::-ms-reveal{display:none}img{border-style:none}progress{vertical-align:baseline}@media screen{[hidden~=screen]{display:inherit}[hidden~=screen]:not(:active):not(:focus):not(:target){position:absolute!important;clip:rect(0 0 0 0)!important}}[aria-busy=true]{cursor:progress}[aria-controls]{cursor:pointer}[aria-disabled=true]{cursor:default}.elevation-24{box-shadow:0 11px 15px -7px var(--v-shadow-key-umbra-opacity,rgba(0,0,0,.2)),0 24px 38px 3px var(--v-shadow-key-penumbra-opacity,rgba(0,0,0,.14)),0 9px 46px 8px var(--v-shadow-key-penumbra-opacity,rgba(0,0,0,.12))!important}.elevation-23{box-shadow:0 11px 14px -7px var(--v-shadow-key-umbra-opacity,rgba(0,0,0,.2)),0 23px 36px 3px var(--v-shadow-key-penumbra-opacity,rgba(0,0,0,.14)),0 9px 44px 8px var(--v-shadow-key-penumbra-opacity,rgba(0,0,0,.12))!important}.elevation-22{box-shadow:0 10px 14px -6px var(--v-shadow-key-umbra-opacity,rgba(0,0,0,.2)),0 22px 35px 3px var(--v-shadow-key-penumbra-opacity,rgba(0,0,0,.14)),0 8px 42px 7px var(--v-shadow-key-penumbra-opacity,rgba(0,0,0,.12))!important}.elevation-21{box-shadow:0 10px 13px -6px var(--v-shadow-key-umbra-opacity,rgba(0,0,0,.2)),0 21px 33px 3px var(--v-shadow-key-penumbra-opacity,rgba(0,0,0,.14)),0 8px 40px 7px var(--v-shadow-key-penumbra-opacity,rgba(0,0,0,.12))!important}.elevation-20{box-shadow:0 10px 13px -6px var(--v-shadow-key-umbra-opacity,rgba(0,0,0,.2)),0 20px 31px 3px var(--v-shadow-key-penumbra-opacity,rgba(0,0,0,.14)),0 8px 38px 7px var(--v-shadow-key-penumbra-opacity,rgba(0,0,0,.12))!important}.elevation-19{box-shadow:0 9px 12px -6px var(--v-shadow-key-umbra-opacity,rgba(0,0,0,.2)),0 19px 29px 2px var(--v-shadow-key-penumbra-opacity,rgba(0,0,0,.14)),0 7px 36px 6px var(--v-shadow-key-penumbra-opacity,rgba(0,0,0,.12))!important}.elevation-18{box-shadow:0 9px 11px -5px var(--v-shadow-key-umbra-opacity,rgba(0,0,0,.2)),0 18px 28px 2px var(--v-shadow-key-penumbra-opacity,rgba(0,0,0,.14)),0 7px 34px 6px var(--v-shadow-key-penumbra-opacity,rgba(0,0,0,.12))!important}.elevation-17{box-shadow:0 8px 11px -5px var(--v-shadow-key-umbra-opacity,rgba(0,0,0,.2)),0 17px 26px 2px var(--v-shadow-key-penumbra-opacity,rgba(0,0,0,.14)),0 6px 32px 5px var(--v-shadow-key-penumbra-opacity,rgba(0,0,0,.12))!important}.elevation-16{box-shadow:0 8px 10px -5px var(--v-shadow-key-umbra-opacity,rgba(0,0,0,.2)),0 16px 24px 2px var(--v-shadow-key-penumbra-opacity,rgba(0,0,0,.14)),0 6px 30px 5px var(--v-shadow-key-penumbra-opacity,rgba(0,0,0,.12))!important}.elevation-15{box-shadow:0 8px 9px -5px var(--v-shadow-key-umbra-opacity,rgba(0,0,0,.2)),0 15px 22px 2px var(--v-shadow-key-penumbra-opacity,rgba(0,0,0,.14)),0 6px 28px 5px var(--v-shadow-key-penumbra-opacity,rgba(0,0,0,.12))!important}.elevation-14{box-shadow:0 7px 9px -4px var(--v-shadow-key-umbra-opacity,rgba(0,0,0,.2)),0 14px 21px 2px var(--v-shadow-key-penumbra-opacity,rgba(0,0,0,.14)),0 5px 26px 4px var(--v-shadow-key-penumbra-opacity,rgba(0,0,0,.12))!important}.elevation-13{box-shadow:0 7px 8px -4px var(--v-shadow-key-umbra-opacity,rgba(0,0,0,.2)),0 13px 19px 2px var(--v-shadow-key-penumbra-opacity,rgba(0,0,0,.Line truncated
|
||||
Vendored
-1
@@ -1 +0,0 @@
|
||||
@import url(https://fonts.googleapis.com/css2?family=Roboto:wght@100&display=swap);.close-icon[data-v-4aa4bee3]:hover{background:red;color:#fff!important}.upload-btn[data-v-a2a40214]{color:#6200ee;border-radius:4px;border:1px solid #e5e5e5}.hidden-input[data-v-a2a40214]{opacity:0;overflow:hidden;position:absolute;width:1px;height:1px}.gif-loader[data-v-a2a40214]{height:30px}.completed{background:#06dece}.width-100[data-v-f216d188]{width:100%}.gif-loader[data-v-f01fa1ac]{height:30px;margin-left:30px}.timeblock[data-v-2c730af8]{position:relative;border-top:1px solid #e0e0e0;padding:20px 0 5px 0}.timeblock .splitted-time-inputs[data-v-2c730af8]{display:flex!important;flex-direction:row!important;gap:15px;margin-bottom:-11px}.timeblock .x-button[data-v-2c730af8]{display:flex;justify-content:flex-end;align-items:center;position:relative;bottom:5px}.timeblock .x-button button[data-v-2c730af8]{margin-right:5px}.error input[data-v-2c730af8]{border:1px solid red!important}.datepicker-wrapper[data-v-2c730af8]{width:100%}.datepicker-wrapper .datepicker-input[data-v-2c730af8]{width:100%!important;pointer-events:none}.w-full[data-v-551d0bf6]{width:100%}.date-wrap[data-v-551d0bf6]{display:flex;flex-flow:row;width:100%;gap:20px;margin-bottom:20px}.date-wrap .dp__main[data-v-551d0bf6]{width:calc(50% - 10px)!important}.scrolling[data-v-551d0bf6]{overflow:hidden!important}.border-bottom[data-v-551d0bf6]{border-bottom:1px solid rgba(0,0,0,.1)}.done-btn[data-v-551d0bf6]{background:#7f39fb!important;border-radius:4px!important;color:#fff!important;height:50px;width:203px}.remove-employee[data-v-551d0bf6]{position:relative;width:100%}.remove-employee svg[data-v-551d0bf6]{position:absolute;right:205px;top:28px;z-index:5;opacity:.5}.remove-employee.hide-arrow[data-v-551d0bf6] .mdi-menu-down,.remove-employee.hide-arrow[data-v-551d0bf6] .mdi-menu-up{display:none}.employee-wrapper[data-v-551d0bf6]{position:relative;width:100%}.employee-wrapper svg[data-v-551d0bf6]{position:absolute;right:4px;top:28px;z-index:5;opacity:.5}.employee-wrapper.hide-arrow[data-v-551d0bf6] .mdi-menu-down,.employee-wrapper.hide-arrow[data-v-551d0bf6] .mdi-menu-up{display:none}@media screen and (max-width:522px){.files[data-v-551d0bf6]{margin-top:104px!important}}.timeblocks[data-v-551d0bf6]{display:flex;flex-direction:column;align-items:center;border-bottom:1px solid #e0e0e0}.timeblocks .end-button[data-v-551d0bf6]{width:100%;display:flex;justify-content:flex-end;align-items:center;border-top:1px solid #e0e0e0;height:70px}.timeblocks .end-button button[data-v-551d0bf6]{background:#7f39fb!important;border-radius:4px!important;color:#fff!important;height:50px;width:203px}.timeblocks .splitted-time-inputs[data-v-551d0bf6]{display:flex!important;flex-direction:row!important;gap:15px;margin-bottom:-11px}.timeblock[data-v-551d0bf6]{position:relative;border-top:1px solid #e0e0e0;padding:20px 0 10px 0}.timeblock .splitted-time-inputs[data-v-551d0bf6]{display:flex!important;flex-direction:row!important;gap:15px;margin-bottom:-11px}.datepicker-wrapper[data-v-551d0bf6]{width:70%}.datepicker-wrapper .datepicker-input[data-v-551d0bf6]{width:100%!important;pointer-events:none}tbody[data-v-753dec0e],v-table[data-v-753dec0e]{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[data-v-753dec0e]:not(:last-child){border-right:thin solid rgba(var(--v-border-color),var(--v-border-opacity))}.office-icon[data-v-753dec0e]{height:20px;margin-left:12px}.line-clamp[data-v-753dec0e]{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis}.date-wrap[data-v-4b1eca40]{display:flex;flex-flow:row;width:100%;gap:20px}.date-wrap .dp__main[data-v-4b1eca40]{width:calc(50% - 10px)!important}.employee-select-avatar[data-v-4b1eca40]{background:#6200ee;color:#fff;border-radius:50%;font-size:11.5px;height:22px;width:22px;position:absolute;top:50%;right:12px;transform:translateY(-50%)}.remove-input[data-v-4b1eca40]{position:absolute;top:50%;right:0;transform:translate(-15px,-50%);color:#666!important;z-index:10;cursor:pointer}.scrolling[data-v-4b1eca40]{overflow:hidden!important}.border-bottom[data-v-4b1eca40]{border-bottom:1px solid rgba(0,0,0,.1)}.subtask-btn[data-v-4b1eca40]{border:thin solid rgba(var(--v-border-color),var(--v-border-opacity))!important;color:#7f39fb!important;height:53px;text-align:center}[data-v-4b1eca40] .v-field__clearable{opacity:1!important}.card-content[data-v-3c7fa7bc]{margin-top:20px;padding:20px}.card-actions[data-v-3c7fa7bc]{width:100%;display:grid;grid-template-columns:1fr 1fr;gap:10px}.finish-icon[data-v-3c7fa7bc]{cursor:pointer}.finish-icon.disabled[data-v-3c7fa7bc]{opacity:.5;pointer-events:none}.finish-icon.finished[data-v-3c7fa7bc]{background:#06dece}.vuecal__weekdays-headings{border-bottom:1px solid #ddd;margin-bottom:-1px}.vuecal--view-with-time .vuecal__weekdays-headings,.vuecal--week-numbers .vuecal__weekdaysLine truncated
|
||||
Vendored
+1
@@ -0,0 +1 @@
|
||||
@import url(https://fonts.googleapis.com/css2?family=Roboto:wght@100&display=swap);.close-icon[data-v-d203e48e]:hover{background:red;color:#fff!important}.upload-btn[data-v-a2a40214]{color:#6200ee;border-radius:4px;border:1px solid #e5e5e5}.hidden-input[data-v-a2a40214]{opacity:0;overflow:hidden;position:absolute;width:1px;height:1px}.gif-loader[data-v-a2a40214]{height:30px}.completed{background:#06dece}.width-100[data-v-dc6acca2]{width:100%}.gif-loader[data-v-f01fa1ac]{height:30px;margin-left:30px}.timeblock[data-v-4d980d7a]{position:relative;border-top:1px solid #e0e0e0;padding:20px 0 5px 0}.timeblock .splitted-time-inputs[data-v-4d980d7a]{display:flex!important;flex-direction:row!important;gap:15px;margin-bottom:-11px}.timeblock .x-button[data-v-4d980d7a]{display:flex;justify-content:flex-end;align-items:center;position:relative;bottom:5px}.timeblock .x-button button[data-v-4d980d7a]{margin-right:5px}.error input[data-v-4d980d7a]{border:1px solid red!important}.datepicker-wrapper[data-v-4d980d7a]{width:100%}.datepicker-wrapper .datepicker-input[data-v-4d980d7a]{width:100%!important;pointer-events:none}.w-full[data-v-3db8381d]{width:100%}.date-wrap[data-v-3db8381d]{display:flex;flex-flow:row;width:100%;gap:20px;margin-bottom:20px}.date-wrap .dp__main[data-v-3db8381d]{width:calc(50% - 10px)!important}.scrolling[data-v-3db8381d]{overflow:hidden!important}.border-bottom[data-v-3db8381d]{border-bottom:1px solid rgba(0,0,0,.1)}.done-btn[data-v-3db8381d]{background:#7f39fb!important;border-radius:4px!important;color:#fff!important;height:50px;width:203px}.remove-employee[data-v-3db8381d]{position:relative;width:100%}.remove-employee svg[data-v-3db8381d]{position:absolute;right:205px;top:28px;z-index:5;opacity:.5}.remove-employee.hide-arrow[data-v-3db8381d] .mdi-menu-down,.remove-employee.hide-arrow[data-v-3db8381d] .mdi-menu-up{display:none}.employee-wrapper[data-v-3db8381d]{position:relative;width:100%}.employee-wrapper svg[data-v-3db8381d]{position:absolute;right:4px;top:28px;z-index:5;opacity:.5}.employee-wrapper.hide-arrow[data-v-3db8381d] .mdi-menu-down,.employee-wrapper.hide-arrow[data-v-3db8381d] .mdi-menu-up{display:none}@media screen and (max-width:522px){.files[data-v-3db8381d]{margin-top:104px!important}}.timeblocks[data-v-3db8381d]{display:flex;flex-direction:column;align-items:center;border-bottom:1px solid #e0e0e0}.timeblocks .end-button[data-v-3db8381d]{width:100%;display:flex;justify-content:flex-end;align-items:center;border-top:1px solid #e0e0e0;height:70px}.timeblocks .end-button button[data-v-3db8381d]{background:#7f39fb!important;border-radius:4px!important;color:#fff!important;height:50px;width:203px}.timeblocks .splitted-time-inputs[data-v-3db8381d]{display:flex!important;flex-direction:row!important;gap:15px;margin-bottom:-11px}.timeblock[data-v-3db8381d]{position:relative;border-top:1px solid #e0e0e0;padding:20px 0 10px 0}.timeblock .splitted-time-inputs[data-v-3db8381d]{display:flex!important;flex-direction:row!important;gap:15px;margin-bottom:-11px}.datepicker-wrapper[data-v-3db8381d]{width:70%}.datepicker-wrapper .datepicker-input[data-v-3db8381d]{width:100%!important;pointer-events:none}tbody[data-v-753dec0e],v-table[data-v-753dec0e]{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[data-v-753dec0e]:not(:last-child){border-right:thin solid rgba(var(--v-border-color),var(--v-border-opacity))}.office-icon[data-v-753dec0e]{height:20px;margin-left:12px}.line-clamp[data-v-753dec0e]{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis}.date-wrap[data-v-ea627ecc]{display:flex;flex-flow:row;width:100%;gap:20px}.date-wrap .dp__main[data-v-ea627ecc]{width:calc(50% - 10px)!important}.employee-select-avatar[data-v-ea627ecc]{background:#6200ee;color:#fff;border-radius:50%;font-size:11.5px;height:22px;width:22px;position:absolute;top:50%;right:12px;transform:translateY(-50%)}.remove-input[data-v-ea627ecc]{position:absolute;top:50%;right:0;transform:translate(-15px,-50%);color:#666!important;z-index:10;cursor:pointer}.scrolling[data-v-ea627ecc]{overflow:hidden!important}.border-bottom[data-v-ea627ecc]{border-bottom:1px solid rgba(0,0,0,.1)}.subtask-btn[data-v-ea627ecc]{border:thin solid rgba(var(--v-border-color),var(--v-border-opacity))!important;color:#7f39fb!important;height:53px;text-align:center}[data-v-ea627ecc] .v-field__clearable{opacity:1!important}.datepicker-wrapper[data-v-ea627ecc]{width:100%}.datepicker-wrapper .datepicker-input[data-v-ea627ecc]{width:100%!important;height:100%;pointer-events:none}.card-content[data-v-f007e35e]{margin-top:20px;padding:20px}.card-actions[data-v-f007e35e]{width:100%;display:grid;grid-template-columns:1fr 1fr;gap:10px}.finish-icon[data-v-f007e35e]{cursor:pointer}.finish-icon.disabled[data-v-f007e35e]{opacity:.5;pointer-events:none}.finish-icon.finished[data-v-f007e35e]{background:#06dece}.vuecal__Line truncated
|
||||
Vendored
+1
-1
@@ -1 +1 @@
|
||||
<!doctype html><html lang=""><head><meta charset="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><meta name="viewport" content="width=device-width,initial-scale=1"/><link rel="icon" href="/favicon/favicon.ico"/><title>ToDo by JANDL</title><script defer="defer" src="/js/chunk-vendors.54b37fd9.js"></script><script defer="defer" src="/js/index.e583b35f.js"></script><link href="/css/chunk-vendors.449f2bf6.css" rel="stylesheet"><link href="/css/index.3ee28f2f.css" rel="stylesheet"></head><body><noscript><strong>We're sorry but ToDo by JANDL doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id="app"></div></body></html>
|
||||
<!doctype html><html lang=""><head><meta charset="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><meta name="viewport" content="width=device-width,initial-scale=1"/><link rel="icon" href="/favicon/favicon.ico"/><title>ToDo by JANDL</title><script defer="defer" src="/js/chunk-vendors.54b37fd9.js"></script><script defer="defer" src="/js/index.059a398f.js"></script><link href="/css/chunk-vendors.19043be7.css" rel="stylesheet"><link href="/css/index.e95c2c85.css" rel="stylesheet"></head><body><noscript><strong>We're sorry but ToDo by JANDL doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id="app"></div></body></html>
|
||||
Vendored
+2
@@ -0,0 +1,2 @@
|
||||
"use strict";(self["webpackChunkjandl"]=self["webpackChunkjandl"]||[]).push([[1277],{35299:function(e,t,s){s.d(t,{Z:function(){return k}});var a=s(73396),i=s(60988),n=s(16824),l=s(10240),r=s(45869);function o(e,t,s,o,d,c){return(0,a.wg)(),(0,a.j4)(n.o,{class:"px-10 py-8 subheader"},{default:(0,a.w5)((()=>[(0,a.Wm)(i.f,{"custom-filter":e.customFilter,"match-any":!0,modelValue:d.selectedEmployeeId,"onUpdate:modelValue":t[0]||(t[0]=e=>d.selectedEmployeeId=e),class:"subheader-input",variant:"outlined",label:"Zamestanec",items:e.enrichedEmployees,"item-title":"_fullName","item-value":"id"},null,8,["custom-filter","modelValue","items"]),(0,a.Wm)(r.hw,{modelValue:d.searchQuery,"onUpdate:modelValue":t[1]||(t[1]=e=>d.searchQuery=e),class:"subheader-input",variant:"outlined",placeholder:"Vyhľadávanie","prepend-inner-icon":"mdi-magnify",onInput:c.onInput,type:"text"},null,8,["modelValue","onInput"]),(0,a.Wm)(l.r,{modelValue:d.sortOrder,"onUpdate:modelValue":t[2]||(t[2]=e=>d.sortOrder=e),class:"subheader-input",items:d.sortOptions,variant:"outlined",label:"Zoradiť podľa","item-title":"text","item-value":"value"},null,8,["modelValue","items"])])),_:1})}var d=s(20065),c=s(83299),u={mixins:[c.Z],emits:["search","employee-selected","update-sort-order"],data(){return{selectedEmployeeId:null,searchQuery:"",sortOrder:null,sortOptions:[{text:"Zrušiť filter",value:null},{text:"Názov (A-Z)",value:"nameAsc"},{text:"Názov (Z-A)",value:"nameDesc"},{text:"Dátum (Najnovší - Najstarší)",value:"deadlineDesc"},{text:"Dátum (Najstarší - Najnovší)",value:"deadlineAsc"}]}},mounted(){this.selectedEmployeeId=this.$store.getters["auth/user"].id},computed:{...(0,d.Se)("tm",["enrichedEmployees"])},methods:{onInput(){this.$emit("search",this.searchQuery)}},watch:{selectedEmployeeId(){this.$emit("employee-selected",this.selectedEmployeeId)},sortOrder(e){this.$emit("update-sort-order",e)}}},m=s(40089);const h=(0,m.Z)(u,[["render",o],["__scopeId","data-v-45dcb20a"]]);var k=h},21277:function(e,t,s){s.r(t),s.d(t,{default:function(){return A}});var a=s(73396);function i(e,t,s,i,n,l){const r=(0,a.up)("Z-tasks-search"),o=(0,a.up)("A-ongoing-table"),d=(0,a.up)("W-loadable");return(0,a.wg)(),(0,a.iD)("div",null,[(0,a.Wm)(r,{onSearch:l.onSearch,onEmployeeSelected:l.onEmployeeSelected,onUpdateSortOrder:l.onUpdateSortOrder},null,8,["onSearch","onEmployeeSelected","onUpdateSortOrder"]),(0,a.Wm)(d,{content:l.filteredOngoingTasks,emptyMessage:n.searchQuery.length?"Neboli nájdené žiadne úlohy":"Nenašli sa žiadne záznamy"},{default:(0,a.w5)((()=>[(0,a.Wm)(o,{subtasks:l.filteredOngoingTasks},null,8,["subtasks"])])),_:1},8,["content","emptyMessage"])])}var n=s(35299),l=s(20065),r=s(49242),o=s(87139),d=s(4413),c=s(80678);const u=e=>((0,a.dD)("data-v-f717e9f4"),e=e(),(0,a.Cn)(),e),m=u((()=>(0,a._)("th",{class:"text-left"},"Názov",-1))),h=u((()=>(0,a._)("th",{class:"text-left"},"Deadline",-1))),k=u((()=>(0,a._)("th",{class:"text-left"},"Najbližší neuzavretý",-1))),p=u((()=>(0,a._)("th",{class:"text-left"},"Naplánované",-1))),f=u((()=>(0,a._)("th",{class:"text-left"},"Zostávajúce",-1))),y=u((()=>(0,a._)("th",{class:"text-left"},"Akcia",-1))),g=["onClick"],_={key:0},b={class:"task-action"},D={class:"d-flex justify-start align-center"},w=["src","onClick"],v=["src","onClick"],S=["src"],C=["src","onClick"],M=["src","onClick"];function T(e,t,s,i,n,l){return(0,a.wg)(),(0,a.j4)(d.Y,null,{default:(0,a.w5)((()=>[(0,a._)("thead",null,[(0,a._)("tr",null,[(0,a._)("th",{onClick:t[0]||(t[0]=(...e)=>l.getSelectedTimeblockDeadline&&l.getSelectedTimeblockDeadline(...e)),class:"text-left"}," Kód projektu "),m,h,k,p,f,y])]),(0,a._)("tbody",null,[((0,a.wg)(!0),(0,a.iD)(a.HY,null,(0,a.Ko)(s.subtasks,(e=>((0,a.wg)(),(0,a.iD)("tr",{class:"cursor-pointer",key:e.id,onClick:(0,r.iM)((t=>l.editTask(e,!1)),["stop"])},[(0,a._)("td",null,(0,o.zw)(e.project_code),1),(0,a._)("td",null,(0,o.zw)(e.title??e.master_task),1),e.deadline?((0,a.wg)(),(0,a.iD)("td",_,(0,o.zw)(l.getDeadline(e)),1)):(0,a.kq)("",!0),(0,a.Wm)(c.N,{text:"Deadline z Mastertasku",location:"end"},{activator:(0,a.w5)((({props:t})=>[e.deadline?(0,a.kq)("",!0):((0,a.wg)(),(0,a.iD)("td",(0,o.vs)((0,a.dG)({key:0},t)),(0,o.zw)(l.getDeadline(e))+"* ",17))])),_:2},1024),(0,a._)("td",null,(0,o.zw)(l.displayTimeblock(e)),1),(0,a._)("td",null,(0,o.zw)(e.duration)+" h",1),(0,a._)("td",null,(0,o.zw)((e.duration-e.spent_time).toFixed(2))+" h",1),(0,a._)("td",b,[(0,a._)("div",D,[(0,a._)("img",{class:(0,o.C_)(["pencil-icon mr-3",{disabled:n.loadingSubtask[e.id]}]),src:n.checkmarkDouble,onClick:(0,r.iM)((t=>l.handleCompleteTask(e)),["stop"])},null,10,w),"office365"==e.type?((0,a.wg)(),(0,a.iD)(a.HY,{key:0},[(0,a._)("img",{class:"pencil-icon",src:n.eye,onClick:(0,r.iM)((t=>l.editTask(e,!1)),["stop"])},null,8,v),(0,a._)("img",{class:"office-icon",src:n.office365},null,8,S)],64)):((0,a.wg)(),(0,a.iD)(a.HY,{key:1},[(0,a._)("img",{class:"pencil-icon",src:n.eye,onClick:(0,r.iM)((t=>l.editTask(e,!1)),["stop"])},null,8,C),Line truncated
|
||||
//# sourceMappingURL=1277.95db0fe3.js.map
|
||||
Vendored
+1
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"js/1277.95db0fe3.js","mappings":"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 truncated
|
||||
Vendored
-2
@@ -1,2 +0,0 @@
|
||||
"use strict";(self["webpackChunkjandl"]=self["webpackChunkjandl"]||[]).push([[2885],{35299:function(e,t,s){s.d(t,{Z:function(){return k}});var a=s(73396),l=s(60988),n=s(16824),i=s(10240),r=s(45869);function o(e,t,s,o,d,c){return(0,a.wg)(),(0,a.j4)(n.o,{class:"px-10 py-8 subheader"},{default:(0,a.w5)((()=>[(0,a.Wm)(l.f,{"custom-filter":e.customFilter,"match-any":!0,modelValue:d.selectedEmployeeId,"onUpdate:modelValue":t[0]||(t[0]=e=>d.selectedEmployeeId=e),class:"subheader-input",variant:"outlined",label:"Zamestanec",items:e.enrichedEmployees,"item-title":"_fullName","item-value":"id"},null,8,["custom-filter","modelValue","items"]),(0,a.Wm)(r.hw,{modelValue:d.searchQuery,"onUpdate:modelValue":t[1]||(t[1]=e=>d.searchQuery=e),class:"subheader-input",variant:"outlined",placeholder:"Vyhľadávanie","prepend-inner-icon":"mdi-magnify",onInput:c.onInput,type:"text"},null,8,["modelValue","onInput"]),(0,a.Wm)(i.r,{modelValue:d.sortOrder,"onUpdate:modelValue":t[2]||(t[2]=e=>d.sortOrder=e),class:"subheader-input",items:d.sortOptions,variant:"outlined",label:"Zoradiť podľa","item-title":"text","item-value":"value"},null,8,["modelValue","items"])])),_:1})}var d=s(20065),c=s(83299),u={mixins:[c.Z],emits:["search","employee-selected","update-sort-order"],data(){return{selectedEmployeeId:null,searchQuery:"",sortOrder:null,sortOptions:[{text:"Zrušiť filter",value:null},{text:"Názov (A-Z)",value:"nameAsc"},{text:"Názov (Z-A)",value:"nameDesc"},{text:"Dátum (Najnovší - Najstarší)",value:"deadlineDesc"},{text:"Dátum (Najstarší - Najnovší)",value:"deadlineAsc"}]}},mounted(){this.selectedEmployeeId=this.$store.getters["auth/user"].id},computed:{...(0,d.Se)("tm",["enrichedEmployees"])},methods:{onInput(){this.$emit("search",this.searchQuery)}},watch:{selectedEmployeeId(){this.$emit("employee-selected",this.selectedEmployeeId)},sortOrder(e){this.$emit("update-sort-order",e)}}},m=s(40089);const h=(0,m.Z)(u,[["render",o],["__scopeId","data-v-45dcb20a"]]);var k=h},72885:function(e,t,s){s.r(t),s.d(t,{default:function(){return A}});var a=s(73396);function l(e,t,s,l,n,i){const r=(0,a.up)("Z-tasks-search"),o=(0,a.up)("A-ongoing-table"),d=(0,a.up)("W-loadable");return(0,a.wg)(),(0,a.iD)("div",null,[(0,a.Wm)(r,{onSearch:i.onSearch,onEmployeeSelected:i.onEmployeeSelected,onUpdateSortOrder:i.onUpdateSortOrder},null,8,["onSearch","onEmployeeSelected","onUpdateSortOrder"]),(0,a.Wm)(d,{content:i.filteredOngoingTasks,emptyMessage:n.searchQuery.length?"Neboli nájdené žiadne úlohy":"Nenašli sa žiadne záznamy"},{default:(0,a.w5)((()=>[(0,a.Wm)(o,{subtasks:i.filteredOngoingTasks},null,8,["subtasks"])])),_:1},8,["content","emptyMessage"])])}var n=s(35299),i=s(20065),r=s(49242),o=s(87139),d=s(4413),c=s(80678);const u=e=>((0,a.dD)("data-v-7c46cac8"),e=e(),(0,a.Cn)(),e),m=u((()=>(0,a._)("th",{class:"text-left"},"Názov",-1))),h=u((()=>(0,a._)("th",{class:"text-left"},"Deadline",-1))),k=u((()=>(0,a._)("th",{class:"text-left"},"Najbližší neuzavretý",-1))),p=u((()=>(0,a._)("th",{class:"text-left"},"Naplánované",-1))),y=u((()=>(0,a._)("th",{class:"text-left"},"Zostávajúce",-1))),f=u((()=>(0,a._)("th",{class:"text-left"},"Akcia",-1))),g=["onClick"],_={key:0},b={class:"task-action"},D={class:"d-flex justify-start align-center"},w=["src","onClick"],v=["src","onClick"],S=["src"],C=["src","onClick"],T=["src","onClick"];function O(e,t,s,l,n,i){return(0,a.wg)(),(0,a.j4)(d.Y,null,{default:(0,a.w5)((()=>[(0,a._)("thead",null,[(0,a._)("tr",null,[(0,a._)("th",{onClick:t[0]||(t[0]=(...e)=>i.getSelectedTimeblockDeadline&&i.getSelectedTimeblockDeadline(...e)),class:"text-left"},"Kód projektu"),m,h,k,p,y,f])]),(0,a._)("tbody",null,[((0,a.wg)(!0),(0,a.iD)(a.HY,null,(0,a.Ko)(s.subtasks,(e=>((0,a.wg)(),(0,a.iD)("tr",{class:"cursor-pointer",key:e.id,onClick:(0,r.iM)((t=>i.editTask(e,!1)),["stop"])},[(0,a._)("td",null,(0,o.zw)(e.project_code),1),(0,a._)("td",null,(0,o.zw)(e.title??e.master_task),1),e.deadline?((0,a.wg)(),(0,a.iD)("td",_,(0,o.zw)(i.getDeadline(e)),1)):(0,a.kq)("",!0),(0,a.Wm)(c.N,{text:"Deadline z Mastertasku",location:"end"},{activator:(0,a.w5)((({props:t})=>[e.deadline?(0,a.kq)("",!0):((0,a.wg)(),(0,a.iD)("td",(0,o.vs)((0,a.dG)({key:0},t)),(0,o.zw)(i.getDeadline(e))+"*",17))])),_:2},1024),(0,a._)("td",null,(0,o.zw)(i.displayTimeblock(e)),1),(0,a._)("td",null,(0,o.zw)(e.duration)+" h",1),(0,a._)("td",null,(0,o.zw)((e.duration-e.spent_time).toFixed(2))+" h",1),(0,a._)("td",b,[(0,a._)("div",D,[(0,a._)("img",{class:(0,o.C_)(["pencil-icon mr-3",{disabled:n.loadingSubtask[e.id]}]),src:n.checkmarkDouble,onClick:(0,r.iM)((t=>i.handleCompleteTask(e)),["stop"])},null,10,w),"office365"==e.type?((0,a.wg)(),(0,a.iD)(a.HY,{key:0},[(0,a._)("img",{class:"pencil-icon",src:n.eye,onClick:(0,r.iM)((t=>i.editTask(e,!1)),["stop"])},null,8,v),(0,a._)("img",{class:"office-icon",src:n.office365},null,8,S)],64)):((0,a.wg)(),(0,a.iD)(a.HY,{key:1},[(0,a._)("img",{class:"pencil-icon",src:n.eye,onClick:(0,r.iM)((t=>i.editTask(e,!1)),["stop"])},null,8,C),(0,Line truncated
|
||||
//# sourceMappingURL=2885.d75b7a04.js.map
|
||||
Vendored
-1
@@ -1 +0,0 @@
|
||||
{"version":3,"file":"js/2885.d75b7a04.js","mappings":"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 truncated
|
||||
Vendored
+2
@@ -0,0 +1,2 @@
|
||||
(function(){var e={41993:function(e){function t(e){return Promise.resolve().then((function(){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}))}t.keys=function(){return[]},t.resolve=t,t.id=41993,e.exports=t},46700:function(e,t,s){var a={"./af":63906,"./af.js":63906,"./ar":40902,"./ar-dz":3853,"./ar-dz.js":3853,"./ar-kw":20299,"./ar-kw.js":20299,"./ar-ly":96825,"./ar-ly.js":96825,"./ar-ma":66379,"./ar-ma.js":66379,"./ar-sa":87700,"./ar-sa.js":87700,"./ar-tn":2059,"./ar-tn.js":2059,"./ar.js":40902,"./az":76043,"./az.js":76043,"./be":7936,"./be.js":7936,"./bg":34078,"./bg.js":34078,"./bm":14014,"./bm.js":14014,"./bn":29554,"./bn-bd":17114,"./bn-bd.js":17114,"./bn.js":29554,"./bo":6529,"./bo.js":6529,"./br":65437,"./br.js":65437,"./bs":19647,"./bs.js":19647,"./ca":59951,"./ca.js":59951,"./cs":26113,"./cs.js":26113,"./cv":37965,"./cv.js":37965,"./cy":35858,"./cy.js":35858,"./da":33515,"./da.js":33515,"./de":62831,"./de-at":6263,"./de-at.js":6263,"./de-ch":51127,"./de-ch.js":51127,"./de.js":62831,"./dv":4510,"./dv.js":4510,"./el":68616,"./el.js":68616,"./en-au":24595,"./en-au.js":24595,"./en-ca":73545,"./en-ca.js":73545,"./en-gb":79609,"./en-gb.js":79609,"./en-ie":43727,"./en-ie.js":43727,"./en-il":93302,"./en-il.js":93302,"./en-in":46305,"./en-in.js":46305,"./en-nz":39128,"./en-nz.js":39128,"./en-sg":84569,"./en-sg.js":84569,"./eo":50650,"./eo.js":50650,"./es":26358,"./es-do":64214,"./es-do.js":64214,"./es-mx":38639,"./es-mx.js":38639,"./es-us":30232,"./es-us.js":30232,"./es.js":26358,"./et":47279,"./et.js":47279,"./eu":15515,"./eu.js":15515,"./fa":27981,"./fa.js":27981,"./fi":37090,"./fi.js":37090,"./fil":79208,"./fil.js":79208,"./fo":2799,"./fo.js":2799,"./fr":23463,"./fr-ca":2213,"./fr-ca.js":2213,"./fr-ch":52848,"./fr-ch.js":52848,"./fr.js":23463,"./fy":41468,"./fy.js":41468,"./ga":88163,"./ga.js":88163,"./gd":2898,"./gd.js":2898,"./gl":76312,"./gl.js":76312,"./gom-deva":20682,"./gom-deva.js":20682,"./gom-latn":49178,"./gom-latn.js":49178,"./gu":31400,"./gu.js":31400,"./he":52795,"./he.js":52795,"./hi":17009,"./hi.js":17009,"./hr":46506,"./hr.js":46506,"./hu":69565,"./hu.js":69565,"./hy-am":93864,"./hy-am.js":93864,"./id":5626,"./id.js":5626,"./is":36649,"./is.js":36649,"./it":90151,"./it-ch":95348,"./it-ch.js":95348,"./it.js":90151,"./ja":79830,"./ja.js":79830,"./jv":33751,"./jv.js":33751,"./ka":63365,"./ka.js":63365,"./kk":85980,"./kk.js":85980,"./km":99571,"./km.js":99571,"./kn":25880,"./kn.js":25880,"./ko":16809,"./ko.js":16809,"./ku":96773,"./ku.js":96773,"./ky":65505,"./ky.js":65505,"./lb":50553,"./lb.js":50553,"./lo":51237,"./lo.js":51237,"./lt":91563,"./lt.js":91563,"./lv":61057,"./lv.js":61057,"./me":96495,"./me.js":96495,"./mi":83096,"./mi.js":83096,"./mk":43874,"./mk.js":43874,"./ml":46055,"./ml.js":46055,"./mn":87747,"./mn.js":87747,"./mr":17113,"./mr.js":17113,"./ms":8687,"./ms-my":7948,"./ms-my.js":7948,"./ms.js":8687,"./mt":14532,"./mt.js":14532,"./my":4655,"./my.js":4655,"./nb":56961,"./nb.js":56961,"./ne":2512,"./ne.js":2512,"./nl":48448,"./nl-be":72936,"./nl-be.js":72936,"./nl.js":48448,"./nn":49031,"./nn.js":49031,"./oc-lnc":5174,"./oc-lnc.js":5174,"./pa-in":30118,"./pa-in.js":30118,"./pl":93448,"./pl.js":93448,"./pt":33518,"./pt-br":62447,"./pt-br.js":62447,"./pt.js":33518,"./ro":70817,"./ro.js":70817,"./ru":10262,"./ru.js":10262,"./sd":58990,"./sd.js":58990,"./se":43842,"./se.js":43842,"./si":37711,"./si.js":37711,"./sk":80756,"./sk.js":80756,"./sl":3772,"./sl.js":3772,"./sq":6187,"./sq.js":6187,"./sr":40732,"./sr-cyrl":75713,"./sr-cyrl.js":75713,"./sr.js":40732,"./ss":99455,"./ss.js":99455,"./sv":69770,"./sv.js":69770,"./sw":80959,"./sw.js":80959,"./ta":36459,"./ta.js":36459,"./te":25302,"./te.js":25302,"./tet":67975,"./tet.js":67975,"./tg":71294,"./tg.js":71294,"./th":2385,"./th.js":2385,"./tk":24613,"./tk.js":24613,"./tl-ph":58668,"./tl-ph.js":58668,"./tlh":58190,"./tlh.js":58190,"./tr":74506,"./tr.js":74506,"./tzl":63440,"./tzl.js":63440,"./tzm":69852,"./tzm-latn":42350,"./tzm-latn.js":42350,"./tzm.js":69852,"./ug-cn":70730,"./ug-cn.js":70730,"./uk":40099,"./uk.js":40099,"./ur":72100,"./ur.js":72100,"./uz":96002,"./uz-latn":26322,"./uz-latn.js":26322,"./uz.js":96002,"./vi":14207,"./vi.js":14207,"./x-pseudo":24674,"./x-pseudo.js":24674,"./yo":10570,"./yo.js":10570,"./zh-cn":73644,"./zh-cn.js":73644,"./zh-hk":22591,"./zh-hk.js":22591,"./zh-mo":89503,"./zh-mo.js":89503,"./zh-tw":88080,"./zh-tw.js":88080};function i(e){var t=n(e);return s(t)}function n(e){if(!s.o(a,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return a[e]}i.keys=function(){return Object.keys(a)},i.resolve=n,e.exports=i,i.id=46700},27791:function(e,t,s){"use strict";s.d(t,{$t:function(){return Nr}});var a=s(49242),i=s(74973);async function n(){const e=await s.e(3657).then(s.t.bind(s,33657,23));e.load({google:{families:["Roboto:100,300,400,500,700,900&display=swap"]}})}var l=s(38685),o=(s(29773),(0,l.Rd)()),r=(s(57658),s(96149));function d(){const e=r.CLine truncated
|
||||
//# sourceMappingURL=index.059a398f.js.map
|
||||
Vendored
+1
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"js/index.059a398f.js","mappings":"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 truncated
|
||||
Vendored
-2
@@ -1,2 +0,0 @@
|
||||
(function(){var e={41993:function(e){function t(e){return Promise.resolve().then((function(){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}))}t.keys=function(){return[]},t.resolve=t,t.id=41993,e.exports=t},46700:function(e,t,s){var a={"./af":63906,"./af.js":63906,"./ar":40902,"./ar-dz":3853,"./ar-dz.js":3853,"./ar-kw":20299,"./ar-kw.js":20299,"./ar-ly":96825,"./ar-ly.js":96825,"./ar-ma":66379,"./ar-ma.js":66379,"./ar-sa":87700,"./ar-sa.js":87700,"./ar-tn":2059,"./ar-tn.js":2059,"./ar.js":40902,"./az":76043,"./az.js":76043,"./be":7936,"./be.js":7936,"./bg":34078,"./bg.js":34078,"./bm":14014,"./bm.js":14014,"./bn":29554,"./bn-bd":17114,"./bn-bd.js":17114,"./bn.js":29554,"./bo":6529,"./bo.js":6529,"./br":65437,"./br.js":65437,"./bs":19647,"./bs.js":19647,"./ca":59951,"./ca.js":59951,"./cs":26113,"./cs.js":26113,"./cv":37965,"./cv.js":37965,"./cy":35858,"./cy.js":35858,"./da":33515,"./da.js":33515,"./de":62831,"./de-at":6263,"./de-at.js":6263,"./de-ch":51127,"./de-ch.js":51127,"./de.js":62831,"./dv":4510,"./dv.js":4510,"./el":68616,"./el.js":68616,"./en-au":24595,"./en-au.js":24595,"./en-ca":73545,"./en-ca.js":73545,"./en-gb":79609,"./en-gb.js":79609,"./en-ie":43727,"./en-ie.js":43727,"./en-il":93302,"./en-il.js":93302,"./en-in":46305,"./en-in.js":46305,"./en-nz":39128,"./en-nz.js":39128,"./en-sg":84569,"./en-sg.js":84569,"./eo":50650,"./eo.js":50650,"./es":26358,"./es-do":64214,"./es-do.js":64214,"./es-mx":38639,"./es-mx.js":38639,"./es-us":30232,"./es-us.js":30232,"./es.js":26358,"./et":47279,"./et.js":47279,"./eu":15515,"./eu.js":15515,"./fa":27981,"./fa.js":27981,"./fi":37090,"./fi.js":37090,"./fil":79208,"./fil.js":79208,"./fo":2799,"./fo.js":2799,"./fr":23463,"./fr-ca":2213,"./fr-ca.js":2213,"./fr-ch":52848,"./fr-ch.js":52848,"./fr.js":23463,"./fy":41468,"./fy.js":41468,"./ga":88163,"./ga.js":88163,"./gd":2898,"./gd.js":2898,"./gl":76312,"./gl.js":76312,"./gom-deva":20682,"./gom-deva.js":20682,"./gom-latn":49178,"./gom-latn.js":49178,"./gu":31400,"./gu.js":31400,"./he":52795,"./he.js":52795,"./hi":17009,"./hi.js":17009,"./hr":46506,"./hr.js":46506,"./hu":69565,"./hu.js":69565,"./hy-am":93864,"./hy-am.js":93864,"./id":5626,"./id.js":5626,"./is":36649,"./is.js":36649,"./it":90151,"./it-ch":95348,"./it-ch.js":95348,"./it.js":90151,"./ja":79830,"./ja.js":79830,"./jv":33751,"./jv.js":33751,"./ka":63365,"./ka.js":63365,"./kk":85980,"./kk.js":85980,"./km":99571,"./km.js":99571,"./kn":25880,"./kn.js":25880,"./ko":16809,"./ko.js":16809,"./ku":96773,"./ku.js":96773,"./ky":65505,"./ky.js":65505,"./lb":50553,"./lb.js":50553,"./lo":51237,"./lo.js":51237,"./lt":91563,"./lt.js":91563,"./lv":61057,"./lv.js":61057,"./me":96495,"./me.js":96495,"./mi":83096,"./mi.js":83096,"./mk":43874,"./mk.js":43874,"./ml":46055,"./ml.js":46055,"./mn":87747,"./mn.js":87747,"./mr":17113,"./mr.js":17113,"./ms":8687,"./ms-my":7948,"./ms-my.js":7948,"./ms.js":8687,"./mt":14532,"./mt.js":14532,"./my":4655,"./my.js":4655,"./nb":56961,"./nb.js":56961,"./ne":2512,"./ne.js":2512,"./nl":48448,"./nl-be":72936,"./nl-be.js":72936,"./nl.js":48448,"./nn":49031,"./nn.js":49031,"./oc-lnc":5174,"./oc-lnc.js":5174,"./pa-in":30118,"./pa-in.js":30118,"./pl":93448,"./pl.js":93448,"./pt":33518,"./pt-br":62447,"./pt-br.js":62447,"./pt.js":33518,"./ro":70817,"./ro.js":70817,"./ru":10262,"./ru.js":10262,"./sd":58990,"./sd.js":58990,"./se":43842,"./se.js":43842,"./si":37711,"./si.js":37711,"./sk":80756,"./sk.js":80756,"./sl":3772,"./sl.js":3772,"./sq":6187,"./sq.js":6187,"./sr":40732,"./sr-cyrl":75713,"./sr-cyrl.js":75713,"./sr.js":40732,"./ss":99455,"./ss.js":99455,"./sv":69770,"./sv.js":69770,"./sw":80959,"./sw.js":80959,"./ta":36459,"./ta.js":36459,"./te":25302,"./te.js":25302,"./tet":67975,"./tet.js":67975,"./tg":71294,"./tg.js":71294,"./th":2385,"./th.js":2385,"./tk":24613,"./tk.js":24613,"./tl-ph":58668,"./tl-ph.js":58668,"./tlh":58190,"./tlh.js":58190,"./tr":74506,"./tr.js":74506,"./tzl":63440,"./tzl.js":63440,"./tzm":69852,"./tzm-latn":42350,"./tzm-latn.js":42350,"./tzm.js":69852,"./ug-cn":70730,"./ug-cn.js":70730,"./uk":40099,"./uk.js":40099,"./ur":72100,"./ur.js":72100,"./uz":96002,"./uz-latn":26322,"./uz-latn.js":26322,"./uz.js":96002,"./vi":14207,"./vi.js":14207,"./x-pseudo":24674,"./x-pseudo.js":24674,"./yo":10570,"./yo.js":10570,"./zh-cn":73644,"./zh-cn.js":73644,"./zh-hk":22591,"./zh-hk.js":22591,"./zh-mo":89503,"./zh-mo.js":89503,"./zh-tw":88080,"./zh-tw.js":88080};function i(e){var t=l(e);return s(t)}function l(e){if(!s.o(a,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return a[e]}i.keys=function(){return Object.keys(a)},i.resolve=l,e.exports=i,i.id=46700},66246:function(e,t,s){"use strict";s.d(t,{$t:function(){return Br}});var a=s(49242),i=s(74973);async function l(){const e=await s.e(3657).then(s.t.bind(s,33657,23));e.load({google:{families:["Roboto:100,300,400,500,700,900&display=swap"]}})}var n=s(38685),o=(s(29773),(0,n.Rd)()),r=(s(57658),s(96149));function d(){const e=r.CLine truncated
|
||||
//# sourceMappingURL=index.e583b35f.js.map
|
||||
Vendored
-1
@@ -1 +0,0 @@
|
||||
{"version":3,"file":"js/index.e583b35f.js","mappings":"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 truncated
|
||||
@@ -1,32 +1,45 @@
|
||||
import moment from 'moment'
|
||||
import moment from 'moment';
|
||||
|
||||
export default {
|
||||
enrichEmployees(employees) {
|
||||
return employees.map(employee => ({
|
||||
...employee,
|
||||
_fullName: `${ employee.name } ${ employee.surname }`,
|
||||
_initials: employee.name.charAt(0) + employee.surname.charAt(0)
|
||||
}))
|
||||
},
|
||||
enrichEmployees(employees) {
|
||||
return employees.map((employee) => ({
|
||||
...employee,
|
||||
_fullName: `${employee.name} ${employee.surname}`,
|
||||
_initials: employee.name.charAt(0) + employee.surname.charAt(0),
|
||||
}));
|
||||
},
|
||||
|
||||
formatDateTime(date) {
|
||||
moment(date)
|
||||
return moment(date).format('DD.MM.yyyy, HH:mm')
|
||||
},
|
||||
formatDateTime(date) {
|
||||
moment(date);
|
||||
return moment(date).format('DD.MM.yyyy, HH:mm');
|
||||
},
|
||||
|
||||
formatDateTimeForBackend(date) {
|
||||
return moment(date).format('YYYY-MM-DD HH:mm:ss')
|
||||
},
|
||||
formatTimeblockDateTime(timeblock) {
|
||||
// Handle new format with separate date and time fields
|
||||
if (timeblock.date && timeblock.starts_at_time) {
|
||||
const dateStr = moment(timeblock.date).format('DD.MM.yyyy');
|
||||
return `${dateStr}, ${timeblock.starts_at_time}`;
|
||||
}
|
||||
// Fallback to old format
|
||||
if (timeblock.start) {
|
||||
return this.formatDateTime(timeblock.start);
|
||||
}
|
||||
return '';
|
||||
},
|
||||
|
||||
formatDate(date) {
|
||||
return moment(date).format('DD.MM.yyyy')
|
||||
},
|
||||
formatDateTimeForBackend(date) {
|
||||
return moment(date).format('YYYY-MM-DD HH:mm:ss');
|
||||
},
|
||||
|
||||
isBefore(date, compareTo = null) {
|
||||
return moment(date).isBefore(moment(compareTo))
|
||||
},
|
||||
formatDate(date) {
|
||||
return moment(date).format('DD.MM.yyyy');
|
||||
},
|
||||
|
||||
isAfter(date, compareTo = moment()) {
|
||||
return moment(date).isAfter(moment(compareTo))
|
||||
}
|
||||
}
|
||||
isBefore(date, compareTo = null) {
|
||||
return moment(date).isBefore(moment(compareTo));
|
||||
},
|
||||
|
||||
isAfter(date, compareTo = moment()) {
|
||||
return moment(date).isAfter(moment(compareTo));
|
||||
},
|
||||
};
|
||||
@@ -3,6 +3,7 @@ export default {
|
||||
data() {
|
||||
return {
|
||||
preventInputFocus: false,
|
||||
savedScrollPosition: null,
|
||||
};
|
||||
},
|
||||
|
||||
@@ -20,18 +21,44 @@ export default {
|
||||
},
|
||||
|
||||
onDateOpen($event) {
|
||||
if ($event == undefined) {
|
||||
// $event should be the element reference (or any truthy value to trigger saving)
|
||||
if ($event) {
|
||||
// Find the scrollable modal container
|
||||
const modalContent = document.querySelector('.v-dialog .modal-content');
|
||||
if (modalContent) {
|
||||
this.savedScrollPosition = modalContent.scrollTop;
|
||||
}
|
||||
|
||||
this.preventInputFocus = true;
|
||||
|
||||
// Reset after datepicker is opened
|
||||
setTimeout(() => {
|
||||
this.preventInputFocus = false;
|
||||
this.savedScrollPosition = null;
|
||||
}, 500);
|
||||
}
|
||||
},
|
||||
|
||||
onInputFocus($event) {
|
||||
setTimeout(() => {
|
||||
if (this.preventInputFocus) {
|
||||
$event.target.blur();
|
||||
this.preventInputFocus = false;
|
||||
// If we have a saved scroll position and an unwanted focus happened
|
||||
if (this.preventInputFocus && this.savedScrollPosition !== null) {
|
||||
const target = $event.target;
|
||||
|
||||
// Only intercept text input focus (autocomplete fields)
|
||||
if (target.tagName === 'INPUT' && target.type === 'text') {
|
||||
// Blur the focused element
|
||||
setTimeout(() => {
|
||||
target.blur();
|
||||
|
||||
const modalContent = document.querySelector(
|
||||
'.v-dialog .modal-content',
|
||||
);
|
||||
if (modalContent && this.savedScrollPosition !== null) {
|
||||
modalContent.scrollTop = this.savedScrollPosition;
|
||||
}
|
||||
}, 0);
|
||||
}
|
||||
}, 100);
|
||||
}
|
||||
},
|
||||
},
|
||||
};
|
||||
File diff suppressed because it is too large.
Load diff
@@ -1,170 +1,244 @@
|
||||
<template>
|
||||
<v-row no-gutters>
|
||||
<v-col cols="5">
|
||||
<v-sheet class="py-3">
|
||||
<div class="d-flex align-center">
|
||||
<v-icon icon="mdi-clock-time-three-outline" size="large"></v-icon>
|
||||
<p class="mx-3">Odpracovaný čas</p>
|
||||
</div>
|
||||
</v-sheet>
|
||||
</v-col>
|
||||
<v-row no-gutters>
|
||||
<v-col cols="5">
|
||||
<v-sheet class="py-3">
|
||||
<div class="d-flex align-center">
|
||||
<v-icon icon="mdi-clock-time-three-outline" size="large"></v-icon>
|
||||
<p class="mx-3">Odpracovaný čas</p>
|
||||
</div>
|
||||
</v-sheet>
|
||||
</v-col>
|
||||
|
||||
<v-col cols="7">
|
||||
<v-sheet class="py-3">
|
||||
<p>{{ hours }} h</p>
|
||||
</v-sheet>
|
||||
<v-col cols="7">
|
||||
<v-sheet class="py-3">
|
||||
<p>{{ hours }} h</p>
|
||||
</v-sheet>
|
||||
|
||||
<v-sheet class="py-3">
|
||||
<div class="d-flex align-center mb-3">
|
||||
<v-icon @click="showModal = true" class="add-date cursor-pointer mr-2" icon="mdi-plus" size="medium" />
|
||||
<p class="task-badge rounded-pill">Pridať záznam</p>
|
||||
</div>
|
||||
<v-sheet class="py-3">
|
||||
<div class="d-flex align-center mb-3">
|
||||
<v-icon
|
||||
@click="showModal = true"
|
||||
class="add-date cursor-pointer mr-2"
|
||||
icon="mdi-plus"
|
||||
size="medium"
|
||||
/>
|
||||
<p class="task-badge rounded-pill">Pridať záznam</p>
|
||||
</div>
|
||||
|
||||
<template v-if="subtask.timesheets.length">
|
||||
<div v-for="timesheet in subtask.timesheets" :key="timesheet.id" class="d-flex align-center mb-3">
|
||||
<v-icon @click.stop="deleteTimesheet(timesheet)" class="circle-border cursor-pointer mr-2" icon="mdi-minus" size="medium" />
|
||||
<template v-if="subtask.timesheets.length">
|
||||
<div
|
||||
v-for="timesheet in subtask.timesheets"
|
||||
:key="timesheet.id"
|
||||
class="d-flex align-center mb-3"
|
||||
>
|
||||
<v-icon
|
||||
@click.stop="deleteTimesheet(timesheet)"
|
||||
class="circle-border cursor-pointer mr-2"
|
||||
icon="mdi-minus"
|
||||
size="medium"
|
||||
/>
|
||||
|
||||
<div class="d-flex align-center flex-start width-100">
|
||||
<p class="task-badge rounded-pill">{{ timesheet.time }}</p>
|
||||
<!-- <p class="ml-5">{{ timesheet.employee_name }} ({{ moment(timesheet.timestamp).format('D.M.YYYY') }})</p> -->
|
||||
<p class="ml-5">{{ timesheet.employee_name }} ({{ timesheet.timestamp }})</p>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
</v-sheet>
|
||||
</v-col>
|
||||
</v-row>
|
||||
<div class="d-flex align-center flex-start width-100">
|
||||
<p class="task-badge rounded-pill">{{ timesheet.time }}</p>
|
||||
<!-- <p class="ml-5">{{ timesheet.employee_name }} ({{ moment(timesheet.timestamp).format('D.M.YYYY') }})</p> -->
|
||||
<p class="ml-5">
|
||||
{{ timesheet.employee_name }} ({{ timesheet.timestamp }})
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
</v-sheet>
|
||||
</v-col>
|
||||
</v-row>
|
||||
|
||||
<v-dialog max-width="750" v-model="showModal" persistent>
|
||||
<v-card>
|
||||
<div class="d-flex justify-space-between align-center">
|
||||
<h1>Pridať odpracovaný čas</h1>
|
||||
<v-dialog max-width="750" v-model="showModal" persistent>
|
||||
<v-card>
|
||||
<div class="d-flex justify-space-between align-center">
|
||||
<h1>Pridať odpracovaný čas</h1>
|
||||
|
||||
<v-icon @click.stop="closeModal()" icon="mdi-close" size="large"></v-icon>
|
||||
</div>
|
||||
<v-card-actions class="mt-10 d-flex justify-start align-center">
|
||||
<v-text-field v-model="form.hours" variant="solo" bg-color="white" type="number" :hint="v$.form.hours.$errors ? errorUtils.parseErrors(v$.form.hours.$errors) : null" :class="{ error: v$.form.hours.$errors.length }" class="mb-2" label="Odpracovaný čas" />
|
||||
</v-card-actions>
|
||||
<v-btn @click="submit()" class="button primary mt-5">Potvrdiť</v-btn>
|
||||
</v-card>
|
||||
</v-dialog>
|
||||
<v-icon
|
||||
@click.stop="closeModal()"
|
||||
icon="mdi-close"
|
||||
size="large"
|
||||
></v-icon>
|
||||
</div>
|
||||
<v-card-actions class="mt-10 d-flex justify-start align-center">
|
||||
<v-text-field
|
||||
v-model="form.hours"
|
||||
variant="solo"
|
||||
bg-color="white"
|
||||
type="number"
|
||||
:hint="
|
||||
v$.form.hours.$errors
|
||||
? errorUtils.parseErrors(v$.form.hours.$errors)
|
||||
: null
|
||||
"
|
||||
:class="{ error: v$.form.hours.$errors.length }"
|
||||
class="mb-2"
|
||||
label="Odpracovaný čas"
|
||||
/>
|
||||
</v-card-actions>
|
||||
<v-btn @click="submit()" class="button primary mt-5">Potvrdiť</v-btn>
|
||||
</v-card>
|
||||
</v-dialog>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import moment from 'moment'
|
||||
import errorUtils from '@/plugins/lib@auth/_utils/error.utils'
|
||||
import useVuelidate from '@vuelidate/core'
|
||||
import { required, numeric, minValue } from '@vuelidate/validators'
|
||||
import tmUtils from '@/plugins/tm@_utils/tm.utils'
|
||||
import { mapGetters } from 'vuex'
|
||||
import modalMixin from '@/plugins/tm@modal/_mixins/modal.mixin'
|
||||
import moment from 'moment';
|
||||
import errorUtils from '@/plugins/lib@auth/_utils/error.utils';
|
||||
import useVuelidate from '@vuelidate/core';
|
||||
import { required, numeric, minValue } from '@vuelidate/validators';
|
||||
import tmUtils from '@/plugins/tm@_utils/tm.utils';
|
||||
import { mapGetters } from 'vuex';
|
||||
import modalMixin from '@/plugins/tm@modal/_mixins/modal.mixin';
|
||||
|
||||
export default {
|
||||
mixins: [ modalMixin ],
|
||||
props: {
|
||||
hours: {
|
||||
type: Number,
|
||||
required: true
|
||||
},
|
||||
mixins: [modalMixin],
|
||||
props: {
|
||||
hours: {
|
||||
type: Number,
|
||||
required: true,
|
||||
},
|
||||
|
||||
subtask: {
|
||||
type: Object,
|
||||
required: true
|
||||
}
|
||||
},
|
||||
subtask: {
|
||||
type: Object,
|
||||
required: true,
|
||||
},
|
||||
},
|
||||
|
||||
data() {
|
||||
return {
|
||||
moment,
|
||||
v$: useVuelidate(),
|
||||
errorUtils,
|
||||
showModal: false,
|
||||
form: {
|
||||
hours: null
|
||||
}
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
moment,
|
||||
v$: useVuelidate(),
|
||||
errorUtils,
|
||||
showModal: false,
|
||||
form: {
|
||||
hours: null,
|
||||
},
|
||||
};
|
||||
},
|
||||
|
||||
validations() {
|
||||
return {
|
||||
form: {
|
||||
hours: {required, numeric, minValue: minValue(0.1)}
|
||||
}
|
||||
}
|
||||
},
|
||||
validations() {
|
||||
return {
|
||||
form: {
|
||||
hours: { required, numeric, minValue: minValue(0.1) },
|
||||
},
|
||||
};
|
||||
},
|
||||
|
||||
computed: {
|
||||
...mapGetters('auth', ['user'])
|
||||
},
|
||||
computed: {
|
||||
...mapGetters('auth', ['user']),
|
||||
},
|
||||
|
||||
methods: {
|
||||
async submit() {
|
||||
if (!await this.v$.$validate())
|
||||
return
|
||||
methods: {
|
||||
async submit() {
|
||||
if (!(await this.v$.$validate())) return;
|
||||
|
||||
const subtask = JSON.parse(JSON.stringify(this.subtask))
|
||||
const subtask = JSON.parse(JSON.stringify(this.subtask));
|
||||
|
||||
subtask.timesheets.push({
|
||||
id: null,
|
||||
employee_id: this.user.id,
|
||||
time: typeof this.form.hours == 'string' ? parseFloat(this.form.hours) : this.form.hours
|
||||
})
|
||||
subtask.timesheets.push({
|
||||
id: null,
|
||||
employee_id: this.user.id,
|
||||
time:
|
||||
typeof this.form.hours == 'string'
|
||||
? parseFloat(this.form.hours)
|
||||
: this.form.hours,
|
||||
});
|
||||
|
||||
if(subtask.deadline) subtask.deadline = tmUtils.formatDateTimeForBackend(this._mergeDeadlineTimeDate())
|
||||
if (subtask.deadline)
|
||||
subtask.deadline = tmUtils.formatDateTimeForBackend(
|
||||
this._mergeDeadlineTimeDate(),
|
||||
);
|
||||
|
||||
this._update(subtask)
|
||||
},
|
||||
this._update(subtask);
|
||||
},
|
||||
|
||||
async deleteTimesheet({ id }) {
|
||||
const subtask = JSON.parse(JSON.stringify(this.subtask))
|
||||
subtask.timesheets = subtask.timesheets.filter(timesheet => timesheet.id != id)
|
||||
if(subtask.deadline) subtask.deadline = tmUtils.formatDateTimeForBackend(this._mergeDeadlineTimeDate())
|
||||
async deleteTimesheet({ id }) {
|
||||
const subtask = JSON.parse(JSON.stringify(this.subtask));
|
||||
subtask.timesheets = subtask.timesheets.filter(
|
||||
(timesheet) => timesheet.id != id,
|
||||
);
|
||||
if (subtask.deadline)
|
||||
subtask.deadline = tmUtils.formatDateTimeForBackend(
|
||||
this._mergeDeadlineTimeDate(),
|
||||
);
|
||||
|
||||
this._update(subtask)
|
||||
},
|
||||
this._update(subtask);
|
||||
},
|
||||
|
||||
closeModal() {
|
||||
this.form = {
|
||||
hours: null
|
||||
}
|
||||
closeModal() {
|
||||
this.form = {
|
||||
hours: null,
|
||||
};
|
||||
|
||||
this.showModal = false
|
||||
this.$nextTick(() => this.v$.$reset())
|
||||
},
|
||||
this.showModal = false;
|
||||
this.$nextTick(() => this.v$.$reset());
|
||||
},
|
||||
|
||||
async _update(data) {
|
||||
try {
|
||||
data.timesheets = data.timesheets.map((timesheet) => {
|
||||
delete timesheet.employee_name
|
||||
return timesheet
|
||||
})
|
||||
const { subtask } = await this.$axios.put_auth(`v1/subtasks/${data.id}`, data)
|
||||
async _update(data) {
|
||||
try {
|
||||
const timesheets = data.timesheets.map((timesheet) => {
|
||||
delete timesheet.employee_name;
|
||||
return timesheet;
|
||||
});
|
||||
|
||||
this.closeModal()
|
||||
this.$events.emit('on-subtask-edited', subtask)
|
||||
} catch (error) {
|
||||
this.$toast.error(error.message || error)
|
||||
// Convert timeblocks from internal format to BE format
|
||||
const timeblocks = (data.timeblocks || [])
|
||||
.filter((timeblock) => {
|
||||
// Filter timeblocks that have either old format (date) or new format (start)
|
||||
return timeblock.date || timeblock.start;
|
||||
})
|
||||
.map((timeblock) => {
|
||||
// If already in BE format (has start field), return as is
|
||||
if (timeblock.start && !timeblock.date) {
|
||||
return {
|
||||
id: timeblock.id || null,
|
||||
start: timeblock.start,
|
||||
end: timeblock.end,
|
||||
is_finished: timeblock.is_finished || 0,
|
||||
};
|
||||
}
|
||||
|
||||
if (process.env.NODE_ENV === 'development')
|
||||
console.log('[a-task-spent-time.vue] Error: ', error)
|
||||
}
|
||||
},
|
||||
// Convert from internal format to BE format
|
||||
const dateStr = moment(timeblock.date).format('YYYY-MM-DD');
|
||||
return {
|
||||
id: timeblock.id || null,
|
||||
start: `${dateStr} ${timeblock.starts_at_time}:00`,
|
||||
end: `${dateStr} ${timeblock.ends_at_time}:00`,
|
||||
is_finished: timeblock.is_finished || 0,
|
||||
};
|
||||
});
|
||||
|
||||
_mergeDeadlineTimeDate() {
|
||||
const date = new Date(this.subtask.deadline)
|
||||
console.log('a-task-spent-time', this.subtask)
|
||||
const timeParts = this.subtask._deadline_time.split(':')
|
||||
const { subtask } = await this.$axios.put_auth(
|
||||
`v1/subtasks/${data.id}`,
|
||||
{ ...data, timesheets, timeblocks },
|
||||
);
|
||||
|
||||
date.setHours(parseInt(timeParts[0]))
|
||||
date.setMinutes(parseInt(timeParts[1]))
|
||||
this.closeModal();
|
||||
this.$events.emit('on-subtask-edited', subtask);
|
||||
} catch (error) {
|
||||
this.$toast.error(error.message || error);
|
||||
|
||||
return date
|
||||
},
|
||||
}
|
||||
}
|
||||
if (process.env.NODE_ENV === 'development')
|
||||
console.log('[a-task-spent-time.vue] Error: ', error);
|
||||
}
|
||||
},
|
||||
|
||||
_mergeDeadlineTimeDate() {
|
||||
const date = new Date(this.subtask.deadline);
|
||||
console.log('a-task-spent-time', this.subtask);
|
||||
const timeParts = this.subtask._deadline_time.split(':');
|
||||
|
||||
date.setHours(parseInt(timeParts[0]));
|
||||
date.setMinutes(parseInt(timeParts[1]));
|
||||
|
||||
return date;
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="sass" scoped>
|
||||
.width-100
|
||||
width: 100%
|
||||
</style>
|
||||
</style>
|
||||
@@ -1,309 +1,495 @@
|
||||
<template>
|
||||
<v-row no-gutters>
|
||||
<v-col cols="5">
|
||||
<v-sheet class="py-3">
|
||||
<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-row no-gutters>
|
||||
<v-col cols="5">
|
||||
<v-sheet class="py-3">
|
||||
<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="py-3">
|
||||
<div class="d-flex align-center mb-3" v-if="!isOffice365Task">
|
||||
<v-icon @click="showModal = true" class="add-date cursor-pointer mr-2" icon="mdi-plus" size="medium" />
|
||||
<p class="task-badge rounded-pill">Pridať záznam</p>
|
||||
</div>
|
||||
<v-col cols="7">
|
||||
<v-sheet class="py-3">
|
||||
<div class="d-flex align-center mb-3" v-if="!isOffice365Task">
|
||||
<v-icon
|
||||
@click="showModal = true"
|
||||
class="add-date cursor-pointer mr-2"
|
||||
icon="mdi-plus"
|
||||
size="medium"
|
||||
/>
|
||||
<p class="task-badge rounded-pill">Pridať záznam</p>
|
||||
</div>
|
||||
|
||||
<div v-for="(timeblock, index) in timeblocks" :key="timeblock.id" class="d-flex align-center mb-3">
|
||||
<v-icon v-if="!isOffice365Task" @click.stop="subtask.id ? deleteTimeblock(timeblock) : deleteTimeblockWithoutId(index)" class="circle-border cursor-pointer mr-2" icon="mdi-minus" size="medium" />
|
||||
<p class="task-badge rounded-pill" :class="{'strike-through': timeblock.is_finished}">{{ tmUtils.formatDateTime(timeblock.start) }} - {{ tmUtils.formatDateTime(timeblock.end) }}</p>
|
||||
<v-icon v-if="!isOffice365Task" v-show="subtask.id" @click.stop="toggleTimeblockIsFinished(timeblock)" class="circle-border cursor-pointer ml-2" :class="{'completed': timeblock.is_finished}" icon="mdi-check" size="medium" />
|
||||
</div>
|
||||
</v-sheet>
|
||||
</v-col>
|
||||
</v-row>
|
||||
<div
|
||||
v-for="(timeblock, index) in timeblocks"
|
||||
:key="timeblock.id"
|
||||
class="d-flex align-center mb-3"
|
||||
>
|
||||
<v-icon
|
||||
v-if="!isOffice365Task"
|
||||
@click.stop="
|
||||
subtask.id
|
||||
? deleteTimeblock(timeblock)
|
||||
: deleteTimeblockWithoutId(index)
|
||||
"
|
||||
class="circle-border cursor-pointer mr-2"
|
||||
icon="mdi-minus"
|
||||
size="medium"
|
||||
/>
|
||||
<p
|
||||
class="task-badge rounded-pill"
|
||||
:class="{ 'strike-through': timeblock.is_finished }"
|
||||
>
|
||||
{{ formatTimeblockStart(timeblock) }} -
|
||||
{{ formatTimeblockEnd(timeblock) }}
|
||||
</p>
|
||||
<v-icon
|
||||
v-if="!isOffice365Task"
|
||||
v-show="subtask.id"
|
||||
@click.stop="toggleTimeblockIsFinished(timeblock)"
|
||||
class="circle-border cursor-pointer ml-2"
|
||||
:class="{ completed: timeblock.is_finished }"
|
||||
icon="mdi-check"
|
||||
size="medium"
|
||||
/>
|
||||
</div>
|
||||
</v-sheet>
|
||||
</v-col>
|
||||
</v-row>
|
||||
|
||||
<v-dialog max-width="750" v-model="showModal" persistent>
|
||||
<v-card>
|
||||
<div class="d-flex justify-space-between align-center">
|
||||
<h1>Pridať dátum</h1>
|
||||
<v-icon @click.stop="closeModal()" icon="mdi-close" size="large"></v-icon>
|
||||
</div>
|
||||
<v-dialog max-width="750" v-model="showModal" persistent>
|
||||
<v-card>
|
||||
<div class="d-flex justify-space-between align-center">
|
||||
<h1>Pridať dátum</h1>
|
||||
<v-icon
|
||||
@click.stop="closeModal()"
|
||||
icon="mdi-close"
|
||||
size="large"
|
||||
></v-icon>
|
||||
</div>
|
||||
|
||||
<v-card-actions class="mt-10 d-flex flex-column modal-content">
|
||||
<Datepicker v-model="form.date" format="dd.MM.yyyy" locale="sk" select-text="Vybrať" cancel-text="Zrušiť" placeholder="Dátum" :auto-apply="true" :enable-time-picker="false" class="mb-5 modal-input" :class="{error: v$.form.date.$errors.length}" />
|
||||
<v-text-field v-model="form.starts_at_time" type="time" variant="solo" bg-color="white" :hint="v$.form.starts_at_time.$errors ? errorUtils.parseErrors(v$.form.starts_at_time.$errors) : null" :class="{ error: v$.form.starts_at_time.$errors.length }" class="mb-1 modal-input" label="Začiatok" />
|
||||
<v-text-field v-model="form.ends_at_time" type="time" variant="solo" bg-color="white" :hint="v$.form.ends_at_time.$errors ? errorUtils.parseErrors(v$.form.ends_at_time.$errors) : null" :class="{ error: v$.form.ends_at_time.$errors.length }" class="modal-input" label="Koniec" />
|
||||
</v-card-actions>
|
||||
<v-card-actions class="mt-10 d-flex flex-column modal-content">
|
||||
<Datepicker
|
||||
v-model="form.date"
|
||||
format="dd.MM.yyyy"
|
||||
locale="sk"
|
||||
select-text="Vybrať"
|
||||
cancel-text="Zrušiť"
|
||||
placeholder="Dátum"
|
||||
:auto-apply="true"
|
||||
:enable-time-picker="false"
|
||||
class="mb-5 modal-input"
|
||||
:class="{ error: v$.form.date.$errors.length }"
|
||||
/>
|
||||
<v-text-field
|
||||
v-model="form.starts_at_time"
|
||||
type="time"
|
||||
variant="solo"
|
||||
bg-color="white"
|
||||
:hint="
|
||||
v$.form.starts_at_time.$errors
|
||||
? errorUtils.parseErrors(v$.form.starts_at_time.$errors)
|
||||
: null
|
||||
"
|
||||
:class="{ error: v$.form.starts_at_time.$errors.length }"
|
||||
class="mb-1 modal-input"
|
||||
label="Začiatok"
|
||||
/>
|
||||
<v-text-field
|
||||
v-model="form.ends_at_time"
|
||||
type="time"
|
||||
variant="solo"
|
||||
bg-color="white"
|
||||
:hint="
|
||||
v$.form.ends_at_time.$errors
|
||||
? errorUtils.parseErrors(v$.form.ends_at_time.$errors)
|
||||
: null
|
||||
"
|
||||
:class="{ error: v$.form.ends_at_time.$errors.length }"
|
||||
class="modal-input"
|
||||
label="Koniec"
|
||||
/>
|
||||
</v-card-actions>
|
||||
|
||||
<v-btn @click="submit()" class="button primary mt-5">Potvrdiť</v-btn>
|
||||
</v-card>
|
||||
</v-dialog>
|
||||
<v-dialog v-model="visible" max-width="750" persistent>
|
||||
<v-card>
|
||||
<div class="d-flex justify-space-between align-center">
|
||||
<h1 class="text-red">Ste si istý, že chcete pridať timeblock po deadline <br> <b class="text-black">z mastertasku {{ subtask?.project_code }} ?</b></h1>
|
||||
<v-btn @click="submit()" class="button primary mt-5">Potvrdiť</v-btn>
|
||||
</v-card>
|
||||
</v-dialog>
|
||||
<v-dialog v-model="visible" max-width="750" persistent>
|
||||
<v-card>
|
||||
<div class="d-flex justify-space-between align-center">
|
||||
<h1 class="text-red">
|
||||
Ste si istý, že chcete pridať timeblock po deadline <br />
|
||||
<b class="text-black">z mastertasku {{ subtask?.project_code }} ?</b>
|
||||
</h1>
|
||||
|
||||
<v-icon
|
||||
@click.stop="visible = false"
|
||||
icon="mdi-close"
|
||||
size="large"
|
||||
class="mb-15"
|
||||
></v-icon>
|
||||
</div>
|
||||
<v-card-actions class="mt-10 d-flex justify-start align-center mobile-view">
|
||||
<v-btn class="button primary half" variant="flat" @click.stop="confirmSubmit()">ÁNO</v-btn>
|
||||
<v-btn class="button primary half outline" @click.stop="visible = false">ZRUŠIŤ</v-btn>
|
||||
</v-card-actions>
|
||||
</v-card>
|
||||
</v-dialog>
|
||||
<v-icon
|
||||
@click.stop="visible = false"
|
||||
icon="mdi-close"
|
||||
size="large"
|
||||
class="mb-15"
|
||||
></v-icon>
|
||||
</div>
|
||||
<v-card-actions
|
||||
class="mt-10 d-flex justify-start align-center mobile-view"
|
||||
>
|
||||
<v-btn
|
||||
class="button primary half"
|
||||
variant="flat"
|
||||
@click.stop="confirmSubmit()"
|
||||
>ÁNO</v-btn
|
||||
>
|
||||
<v-btn class="button primary half outline" @click.stop="visible = false"
|
||||
>ZRUŠIŤ</v-btn
|
||||
>
|
||||
</v-card-actions>
|
||||
</v-card>
|
||||
</v-dialog>
|
||||
</template>
|
||||
|
||||
|
||||
<script>
|
||||
import tmUtils from '@/plugins/tm@_utils/tm.utils'
|
||||
import errorUtils from '@/plugins/lib@auth/_utils/error.utils'
|
||||
import useVuelidate from '@vuelidate/core'
|
||||
import { required } from '@vuelidate/validators'
|
||||
import Datepicker from '@vuepic/vue-datepicker'
|
||||
import moment from 'moment'
|
||||
import modalMixin from '@/plugins/tm@modal/_mixins/modal.mixin'
|
||||
import { mapGetters } from 'vuex'
|
||||
|
||||
import tmUtils from '@/plugins/tm@_utils/tm.utils';
|
||||
import errorUtils from '@/plugins/lib@auth/_utils/error.utils';
|
||||
import useVuelidate from '@vuelidate/core';
|
||||
import { required } from '@vuelidate/validators';
|
||||
import Datepicker from '@vuepic/vue-datepicker';
|
||||
import moment from 'moment';
|
||||
import modalMixin from '@/plugins/tm@modal/_mixins/modal.mixin';
|
||||
import { mapGetters } from 'vuex';
|
||||
|
||||
export default {
|
||||
mixins: [ modalMixin ],
|
||||
emits: ['update-subtask'],
|
||||
mixins: [modalMixin],
|
||||
emits: ['update-subtask'],
|
||||
|
||||
components: {
|
||||
Datepicker
|
||||
},
|
||||
components: {
|
||||
Datepicker,
|
||||
},
|
||||
|
||||
props: {
|
||||
timeblocks: {
|
||||
type: Array,
|
||||
required: true
|
||||
},
|
||||
props: {
|
||||
timeblocks: {
|
||||
type: Array,
|
||||
required: true,
|
||||
},
|
||||
|
||||
subtask: {
|
||||
type: Object,
|
||||
required: true
|
||||
}
|
||||
},
|
||||
subtask: {
|
||||
type: Object,
|
||||
required: true,
|
||||
},
|
||||
},
|
||||
|
||||
data() {
|
||||
return {
|
||||
v$: useVuelidate(),
|
||||
errorUtils,
|
||||
tmUtils,
|
||||
showModal: false,
|
||||
visible: false,
|
||||
form: {
|
||||
date: null,
|
||||
starts_at_time: '09:00',
|
||||
ends_at_time: '16:00'
|
||||
}
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
v$: useVuelidate(),
|
||||
errorUtils,
|
||||
tmUtils,
|
||||
showModal: false,
|
||||
visible: false,
|
||||
form: {
|
||||
date: null,
|
||||
starts_at_time: '09:00',
|
||||
ends_at_time: '16:00',
|
||||
},
|
||||
};
|
||||
},
|
||||
|
||||
validations() {
|
||||
return {
|
||||
form: {
|
||||
date: { required },
|
||||
starts_at_time: { required },
|
||||
ends_at_time: { required }
|
||||
}
|
||||
}
|
||||
},
|
||||
validations() {
|
||||
return {
|
||||
form: {
|
||||
date: { required },
|
||||
starts_at_time: { required },
|
||||
ends_at_time: { required },
|
||||
},
|
||||
};
|
||||
},
|
||||
|
||||
computed: {
|
||||
...mapGetters('tm', ['mastertasks']),
|
||||
isOffice365Task() {
|
||||
return this.subtask.type == 'office365'
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
...mapGetters('tm', ['mastertasks']),
|
||||
isOffice365Task() {
|
||||
return this.subtask.type == 'office365';
|
||||
},
|
||||
},
|
||||
|
||||
methods: {
|
||||
async submit() {
|
||||
if (!await this.v$.$validate())
|
||||
return
|
||||
methods: {
|
||||
formatTimeblockStart(timeblock) {
|
||||
// Handle internal format with date and time fields
|
||||
if (timeblock.date && timeblock.starts_at_time) {
|
||||
const dateStr = moment(timeblock.date).format('DD.MM.yyyy');
|
||||
return `${dateStr}, ${timeblock.starts_at_time}`;
|
||||
}
|
||||
// Fallback to backend format
|
||||
if (timeblock.start) {
|
||||
return tmUtils.formatDateTime(timeblock.start);
|
||||
}
|
||||
return '';
|
||||
},
|
||||
|
||||
const subtask = JSON.parse(JSON.stringify(this.subtask))
|
||||
const splittedStartsAtTime = this.form.starts_at_time.split(':')
|
||||
const splittedEndsAtTime = this.form.ends_at_time.split(':')
|
||||
const start = moment(this.form.date).hours(parseInt(splittedStartsAtTime[0])).minutes(parseInt(splittedStartsAtTime[1])).toISOString()
|
||||
const end = moment(this.form.date).hours(parseInt(splittedEndsAtTime[0])).minutes(parseInt(splittedEndsAtTime[1])).toISOString()
|
||||
formatTimeblockEnd(timeblock) {
|
||||
// Handle internal format with date and time fields
|
||||
if (timeblock.date && timeblock.ends_at_time) {
|
||||
return timeblock.ends_at_time;
|
||||
}
|
||||
// Fallback to backend format
|
||||
if (timeblock.end) {
|
||||
return tmUtils.formatDateTime(timeblock.end);
|
||||
}
|
||||
return '';
|
||||
},
|
||||
|
||||
if (!subtask?.timeblocks) { subtask.timeblocks = [] }
|
||||
if (!subtask?.timesheets) { subtask.timesheets = [] }
|
||||
if (!subtask?.is_finished) { subtask.is_finished = 0 }
|
||||
async submit() {
|
||||
if (!(await this.v$.$validate())) return;
|
||||
|
||||
subtask.timeblocks.push({
|
||||
end: tmUtils.formatDateTimeForBackend(end),
|
||||
id: null,
|
||||
is_finished: 0,
|
||||
start: tmUtils.formatDateTimeForBackend(start)
|
||||
})
|
||||
const subtask = JSON.parse(JSON.stringify(this.subtask));
|
||||
|
||||
if(subtask.deadline) subtask.deadline = tmUtils.formatDateTimeForBackend(this._mergeDeadlineTimeDate())
|
||||
if (!subtask?.timeblocks) {
|
||||
subtask.timeblocks = [];
|
||||
}
|
||||
if (!subtask?.timesheets) {
|
||||
subtask.timesheets = [];
|
||||
}
|
||||
if (!subtask?.is_finished) {
|
||||
subtask.is_finished = 0;
|
||||
}
|
||||
|
||||
const isAfterDeadline = this.isAfterDeadline()
|
||||
// Add timeblock in internal format
|
||||
subtask.timeblocks.push({
|
||||
id: null,
|
||||
date: this.form.date,
|
||||
starts_at_time: this.form.starts_at_time,
|
||||
ends_at_time: this.form.ends_at_time,
|
||||
is_finished: 0,
|
||||
});
|
||||
|
||||
if (isAfterDeadline) {
|
||||
this.visible = true
|
||||
} else {
|
||||
if (!subtask.id) {
|
||||
this.$emit('update-unfinished-subtask', subtask)
|
||||
} else {
|
||||
this._update(subtask)
|
||||
}
|
||||
}
|
||||
},
|
||||
if (subtask.deadline)
|
||||
subtask.deadline = tmUtils.formatDateTimeForBackend(
|
||||
this._mergeDeadlineTimeDate(),
|
||||
);
|
||||
|
||||
async confirmSubmit() {
|
||||
const subtask = JSON.parse(JSON.stringify(this.subtask))
|
||||
const splittedStartsAtTime = this.form.starts_at_time.split(':')
|
||||
const splittedEndsAtTime = this.form.ends_at_time.split(':')
|
||||
const start = moment(this.form.date).hours(parseInt(splittedStartsAtTime[0])).minutes(parseInt(splittedStartsAtTime[1])).toISOString()
|
||||
const end = moment(this.form.date).hours(parseInt(splittedEndsAtTime[0])).minutes(parseInt(splittedEndsAtTime[1])).toISOString()
|
||||
const isAfterDeadline = this.isAfterDeadline();
|
||||
|
||||
if (!subtask?.timeblocks) { subtask.timeblocks = [] }
|
||||
if (!subtask?.timesheets) { subtask.timesheets = [] }
|
||||
if (!subtask?.is_finished) { subtask.is_finished = 0 }
|
||||
if (isAfterDeadline) {
|
||||
this.visible = true;
|
||||
} else {
|
||||
if (!subtask.id) {
|
||||
this.$emit('update-unfinished-subtask', subtask);
|
||||
this.closeModal();
|
||||
} else {
|
||||
this._update(subtask);
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
subtask.timeblocks.push({
|
||||
end: tmUtils.formatDateTimeForBackend(end),
|
||||
id: null,
|
||||
is_finished: 0,
|
||||
start: tmUtils.formatDateTimeForBackend(start)
|
||||
})
|
||||
async confirmSubmit() {
|
||||
const subtask = JSON.parse(JSON.stringify(this.subtask));
|
||||
|
||||
if(subtask.deadline) subtask.deadline = tmUtils.formatDateTimeForBackend(this._mergeDeadlineTimeDate())
|
||||
if (!subtask?.timeblocks) {
|
||||
subtask.timeblocks = [];
|
||||
}
|
||||
if (!subtask?.timesheets) {
|
||||
subtask.timesheets = [];
|
||||
}
|
||||
if (!subtask?.is_finished) {
|
||||
subtask.is_finished = 0;
|
||||
}
|
||||
|
||||
if (!subtask.id) {
|
||||
this.$emit('update-unfinished-subtask', subtask)
|
||||
this.closeModal()
|
||||
return
|
||||
}
|
||||
// Add timeblock in internal format
|
||||
subtask.timeblocks.push({
|
||||
id: null,
|
||||
date: this.form.date,
|
||||
starts_at_time: this.form.starts_at_time,
|
||||
ends_at_time: this.form.ends_at_time,
|
||||
is_finished: 0,
|
||||
});
|
||||
|
||||
this.visible = false
|
||||
this._update(subtask)
|
||||
},
|
||||
if (subtask.deadline)
|
||||
subtask.deadline = tmUtils.formatDateTimeForBackend(
|
||||
this._mergeDeadlineTimeDate(),
|
||||
);
|
||||
|
||||
async toggleTimeblockIsFinished(originalTimeblock) {
|
||||
// TODO: Pridat odpracovany cas modal?
|
||||
console.log('toggleTimeblockIsFinished 5', this.subtask)
|
||||
const subtask = JSON.parse(JSON.stringify(this.subtask))
|
||||
const timeblock = JSON.parse(JSON.stringify(originalTimeblock))
|
||||
if (!subtask.id) {
|
||||
this.$emit('update-unfinished-subtask', subtask);
|
||||
this.closeModal();
|
||||
return;
|
||||
}
|
||||
|
||||
timeblock.is_finished = timeblock.is_finished == 1 ? 0 : 1
|
||||
this.visible = false;
|
||||
this._update(subtask);
|
||||
},
|
||||
|
||||
try {
|
||||
const {data: newTimeblock} = await this.$axios.put_auth(`v1/timeblocks/${timeblock.id}`, timeblock)
|
||||
async toggleTimeblockIsFinished(originalTimeblock) {
|
||||
// TODO: Pridat odpracovany cas modal?
|
||||
const subtask = JSON.parse(JSON.stringify(this.subtask));
|
||||
const timeblock = JSON.parse(JSON.stringify(originalTimeblock));
|
||||
|
||||
subtask.timeblocks = subtask.timeblocks.map(originalTimeblock => {
|
||||
if (originalTimeblock.id == newTimeblock.id)
|
||||
return newTimeblock
|
||||
timeblock.is_finished = timeblock.is_finished == 1 ? 0 : 1;
|
||||
|
||||
return originalTimeblock
|
||||
})
|
||||
try {
|
||||
// Convert timeblock to backend format before sending
|
||||
const timeblockForBackend = {
|
||||
id: timeblock.id,
|
||||
is_finished: timeblock.is_finished,
|
||||
};
|
||||
|
||||
this.$events.emit('on-subtask-edited', subtask)
|
||||
this.$emit('update-subtask', subtask)
|
||||
// If timeblock is in internal format, convert it
|
||||
if (timeblock.date) {
|
||||
const dateStr = moment(timeblock.date).format('YYYY-MM-DD');
|
||||
timeblockForBackend.start = `${dateStr} ${timeblock.starts_at_time}:00`;
|
||||
timeblockForBackend.end = `${dateStr} ${timeblock.ends_at_time}:00`;
|
||||
} else {
|
||||
// Already in backend format
|
||||
timeblockForBackend.start = timeblock.start;
|
||||
timeblockForBackend.end = timeblock.end;
|
||||
}
|
||||
|
||||
if (timeblock.is_finished)
|
||||
this.$events.emit('show-task-add-time-modal', { subtask })
|
||||
} catch (error) {
|
||||
this.$toast.error(error.message || error)
|
||||
const { data: newTimeblock } = await this.$axios.put_auth(
|
||||
`v1/timeblocks/${timeblock.id}`,
|
||||
timeblockForBackend,
|
||||
);
|
||||
|
||||
if (process.env.NODE_ENV === 'development')
|
||||
console.log('[a-task-timeblocks.vue] Error: ', error)
|
||||
}
|
||||
},
|
||||
// Convert returned timeblock from backend format to internal format
|
||||
const startMoment = moment(newTimeblock.start, 'YYYY-MM-DD HH:mm:ss');
|
||||
const endMoment = moment(newTimeblock.end, 'YYYY-MM-DD HH:mm:ss');
|
||||
const convertedTimeblock = {
|
||||
id: newTimeblock.id,
|
||||
date: startMoment.toDate(),
|
||||
starts_at_time: startMoment.format('HH:mm'),
|
||||
ends_at_time: endMoment.format('HH:mm'),
|
||||
is_finished: newTimeblock.is_finished,
|
||||
};
|
||||
|
||||
async deleteTimeblock({ id }) {
|
||||
const subtask = JSON.parse(JSON.stringify(this.subtask))
|
||||
subtask.timeblocks = subtask.timeblocks.map((originalTimeblock) => {
|
||||
if (originalTimeblock.id == convertedTimeblock.id)
|
||||
return convertedTimeblock;
|
||||
|
||||
subtask.timeblocks = subtask.timeblocks.filter(timeblock => timeblock.id != id)
|
||||
if(subtask.deadline) subtask.deadline = tmUtils.formatDateTimeForBackend(this._mergeDeadlineTimeDate())
|
||||
return originalTimeblock;
|
||||
});
|
||||
|
||||
this._update(subtask)
|
||||
},
|
||||
this.$events.emit('on-subtask-edited', subtask);
|
||||
this.$emit('update-subtask', subtask);
|
||||
|
||||
deleteTimeblockWithoutId(i) {
|
||||
this.$emit('delete-timeblock')
|
||||
},
|
||||
if (timeblock.is_finished)
|
||||
this.$events.emit('show-task-add-time-modal', { subtask });
|
||||
} catch (error) {
|
||||
this.$toast.error(error.message || error);
|
||||
|
||||
async _update(data) {
|
||||
try {
|
||||
const timesheets = data.timesheets.map((timesheet) => {
|
||||
delete timesheet.employee_name
|
||||
return timesheet
|
||||
})
|
||||
if (process.env.NODE_ENV === 'development')
|
||||
console.log('[a-task-timeblocks.vue] Error: ', error);
|
||||
}
|
||||
},
|
||||
|
||||
const { subtask } = await this.$axios.put_auth(`v1/subtasks/${data.id}`, {...data, timesheets})
|
||||
async deleteTimeblock({ id }) {
|
||||
const subtask = JSON.parse(JSON.stringify(this.subtask));
|
||||
|
||||
this.closeModal()
|
||||
this.$events.emit('on-subtask-edited', subtask)
|
||||
} catch (error) {
|
||||
this.$toast.error(error.message || error)
|
||||
subtask.timeblocks = subtask.timeblocks.filter(
|
||||
(timeblock) => timeblock.id != id,
|
||||
);
|
||||
if (subtask.deadline)
|
||||
subtask.deadline = tmUtils.formatDateTimeForBackend(
|
||||
this._mergeDeadlineTimeDate(),
|
||||
);
|
||||
|
||||
if (process.env.NODE_ENV === 'development')
|
||||
console.log('[a-task-timeblocks.vue] Error: ', error)
|
||||
}
|
||||
},
|
||||
this._update(subtask);
|
||||
},
|
||||
|
||||
isAfterDeadline() {
|
||||
const deadline = this.getDeadline(this.subtask)
|
||||
deleteTimeblockWithoutId(i) {
|
||||
this.$emit('delete-timeblock');
|
||||
},
|
||||
|
||||
if (!deadline)
|
||||
return
|
||||
async _update(data) {
|
||||
try {
|
||||
const timesheets = data.timesheets.map((timesheet) => {
|
||||
delete timesheet.employee_name;
|
||||
return timesheet;
|
||||
});
|
||||
|
||||
const mDate = moment(this.form.date)
|
||||
const mDeadline = moment(deadline)
|
||||
// Convert timeblocks from internal format to BE format
|
||||
const timeblocks = (data.timeblocks || [])
|
||||
.filter((timeblock) => {
|
||||
// Filter timeblocks that have either old format (date) or new format (start)
|
||||
return timeblock.date || timeblock.start;
|
||||
})
|
||||
.map((timeblock) => {
|
||||
// If already in BE format (has start field), return as is
|
||||
if (timeblock.start && !timeblock.date) {
|
||||
return {
|
||||
id: timeblock.id || null,
|
||||
start: timeblock.start,
|
||||
end: timeblock.end,
|
||||
is_finished: timeblock.is_finished || 0,
|
||||
};
|
||||
}
|
||||
|
||||
const [hours, minutes] = this.form.ends_at_time.split(':').map(Number)
|
||||
// Convert from internal format to BE format
|
||||
const dateStr = moment(timeblock.date).format('YYYY-MM-DD');
|
||||
return {
|
||||
id: timeblock.id || null,
|
||||
start: `${dateStr} ${timeblock.starts_at_time}:00`,
|
||||
end: `${dateStr} ${timeblock.ends_at_time}:00`,
|
||||
is_finished: timeblock.is_finished || 0,
|
||||
};
|
||||
});
|
||||
|
||||
mDate.hours(hours)
|
||||
mDate.minutes(minutes)
|
||||
const { subtask } = await this.$axios.put_auth(
|
||||
`v1/subtasks/${data.id}`,
|
||||
{ ...data, timesheets, timeblocks },
|
||||
);
|
||||
|
||||
return mDate.isAfter(mDeadline)
|
||||
},
|
||||
this.closeModal();
|
||||
this.$events.emit('on-subtask-edited', subtask);
|
||||
} catch (error) {
|
||||
this.$toast.error(error.message || error);
|
||||
|
||||
getDeadline(subtask) {
|
||||
if (subtask?.deadline)
|
||||
return subtask.deadline
|
||||
if (process.env.NODE_ENV === 'development')
|
||||
console.log('[a-task-timeblocks.vue] Error: ', error);
|
||||
}
|
||||
},
|
||||
|
||||
return subtask.master_task_deadline
|
||||
},
|
||||
isAfterDeadline() {
|
||||
const deadline = this.getDeadline(this.subtask);
|
||||
|
||||
_mergeDeadlineTimeDate() {
|
||||
const date = new Date(this.subtask.deadline)
|
||||
const timeParts = this.subtask._deadline_time.split(':')
|
||||
if (!deadline) return;
|
||||
|
||||
date.setHours(parseInt(timeParts[0]))
|
||||
date.setMinutes(parseInt(timeParts[1]))
|
||||
const mDate = moment(this.form.date);
|
||||
const mDeadline = moment(deadline);
|
||||
|
||||
return date
|
||||
},
|
||||
const [hours, minutes] = this.form.ends_at_time.split(':').map(Number);
|
||||
|
||||
closeModal() {
|
||||
this.form = {
|
||||
date: null,
|
||||
starts_at_time: '09:00',
|
||||
ends_at_time: '16:00'
|
||||
}
|
||||
mDate.hours(hours);
|
||||
mDate.minutes(minutes);
|
||||
|
||||
this.showModal = false
|
||||
this.$nextTick(() => this.v$.$reset())
|
||||
}
|
||||
}
|
||||
}
|
||||
return mDate.isAfter(mDeadline);
|
||||
},
|
||||
|
||||
getDeadline(subtask) {
|
||||
if (subtask?.deadline) return subtask.deadline;
|
||||
|
||||
return subtask.master_task_deadline;
|
||||
},
|
||||
|
||||
_mergeDeadlineTimeDate() {
|
||||
const date = new Date(this.subtask.deadline);
|
||||
const timeParts = this.subtask._deadline_time.split(':');
|
||||
|
||||
date.setHours(parseInt(timeParts[0]));
|
||||
date.setMinutes(parseInt(timeParts[1]));
|
||||
|
||||
return date;
|
||||
},
|
||||
|
||||
closeModal() {
|
||||
this.form = {
|
||||
date: null,
|
||||
starts_at_time: '09:00',
|
||||
ends_at_time: '16:00',
|
||||
};
|
||||
|
||||
this.showModal = false;
|
||||
this.$nextTick(() => this.v$.$reset());
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="sass">
|
||||
.completed
|
||||
background: #06dece
|
||||
</style>
|
||||
</style>
|
||||
@@ -4,14 +4,13 @@
|
||||
<button @click="$emit('removeTimeblock')" class="x-button">x</button>
|
||||
</div>
|
||||
<div
|
||||
@click="openDatepicker('datepicker')"
|
||||
@click="handleDatepickerClick"
|
||||
class="datepicker-wrapper"
|
||||
ref="datepicker-wrapper"
|
||||
:ref="`timeblock-datepicker-wrapper-${index}`"
|
||||
>
|
||||
<Datepicker
|
||||
:model-value="timeblock.date"
|
||||
ref="datepicker"
|
||||
@open="onDateOpen"
|
||||
:ref="`timeblock-datepicker-${index}`"
|
||||
@update:model-value="updateDate"
|
||||
format="dd.MM.yyyy"
|
||||
locale="sk"
|
||||
@@ -27,7 +26,6 @@
|
||||
<v-text-field
|
||||
:value="timeblock.starts_at_time"
|
||||
@input="updateStartTime"
|
||||
@focus="onInputFocus"
|
||||
:class="{ error: v$?.timeblock.starts_at_time.$errors.length }"
|
||||
type="time"
|
||||
variant="solo"
|
||||
@@ -37,7 +35,6 @@
|
||||
<v-text-field
|
||||
:value="timeblock.ends_at_time"
|
||||
@input="updateEndTime"
|
||||
@focus="onInputFocus"
|
||||
:class="{ error: v$?.timeblock.ends_at_time.$errors.length }"
|
||||
type="time"
|
||||
variant="solo"
|
||||
@@ -88,6 +85,10 @@ export default {
|
||||
type: Function,
|
||||
default: () => ({}),
|
||||
},
|
||||
|
||||
index: {
|
||||
type: Number,
|
||||
},
|
||||
},
|
||||
|
||||
data() {
|
||||
@@ -106,23 +107,63 @@ export default {
|
||||
},
|
||||
|
||||
methods: {
|
||||
handleDatepickerClick() {
|
||||
// Pass the datepicker wrapper element reference to the mixin
|
||||
const scrollTarget =
|
||||
this.$refs[`timeblock-datepicker-wrapper-${this.index}`];
|
||||
this.onDateOpen(scrollTarget);
|
||||
// Open the datepicker
|
||||
this.openDatepicker(`timeblock-datepicker-${this.index}`);
|
||||
|
||||
setTimeout(() => {
|
||||
const calendar = document.querySelector(
|
||||
'.dp__menu.dp__menu_index.dp__theme_light',
|
||||
);
|
||||
|
||||
if (!calendar) return;
|
||||
|
||||
// Get the datepicker wrapper element
|
||||
const datepickerWrapper =
|
||||
this.$refs[`timeblock-datepicker-wrapper-${this.index}`];
|
||||
|
||||
// Get the modal container
|
||||
const modalContainer = document.querySelector('.v-overlay__content');
|
||||
|
||||
if (!datepickerWrapper || !modalContainer) return;
|
||||
|
||||
// Get bounding rectangles
|
||||
const wrapperRect = datepickerWrapper.getBoundingClientRect();
|
||||
const modalRect = modalContainer.getBoundingClientRect();
|
||||
|
||||
// Calculate position relative to modal
|
||||
const topPosition =
|
||||
wrapperRect.top - modalRect.top + wrapperRect.height;
|
||||
const leftPosition = wrapperRect.left - modalRect.left;
|
||||
|
||||
// Apply positioning
|
||||
// calendar.style.position = 'absolute';
|
||||
calendar.style.top = `${topPosition + 210}px`;
|
||||
// calendar.style.left = `${leftPosition}px`;
|
||||
}, 100);
|
||||
},
|
||||
|
||||
async openDatepicker(ref) {
|
||||
this.$refs[ref].openMenu();
|
||||
},
|
||||
|
||||
updateDate(date) {
|
||||
const timeblock = { ...this.timeblock };
|
||||
if (date) timeblock.date = date;
|
||||
this.$emit('updateTimeblock', timeblock);
|
||||
const updated = { ...this.timeblock, date };
|
||||
this.$emit('updateTimeblock', updated);
|
||||
},
|
||||
|
||||
updateStartTime(event) {
|
||||
const timeblock = { ...this.timeblock };
|
||||
timeblock.starts_at_time = event.target.value;
|
||||
this.$emit('updateTimeblock', timeblock);
|
||||
const updated = { ...this.timeblock, starts_at_time: event.target.value };
|
||||
this.$emit('updateTimeblock', updated);
|
||||
},
|
||||
|
||||
updateEndTime(event) {
|
||||
const timeblock = { ...this.timeblock };
|
||||
timeblock.ends_at_time = event.target.value;
|
||||
this.$emit('updateTimeblock', timeblock);
|
||||
const updated = { ...this.timeblock, ends_at_time: event.target.value };
|
||||
this.$emit('updateTimeblock', updated);
|
||||
},
|
||||
},
|
||||
};
|
||||
@@ -158,4 +199,3 @@ export default {
|
||||
width: 100% !important
|
||||
pointer-events: none
|
||||
</style>
|
||||
e
|
||||
@@ -1,63 +1,114 @@
|
||||
<template>
|
||||
<v-dialog v-model="visible" max-width="750" persistent>
|
||||
<v-card>
|
||||
<div class="d-flex justify-space-between align-center">
|
||||
<h1>Ste si istý, že chcete {{ subtask.is_finished ? 'znovu otvoriť' : 'dokončiť' }} sub task, z mastertasku <b>{{ subtask?.master_task?.name || subtask.master_task }}</b>?</h1>
|
||||
<v-icon
|
||||
@click.stop="closeModal()"
|
||||
icon="mdi-close"
|
||||
size="large"
|
||||
></v-icon>
|
||||
</div>
|
||||
<v-card-actions class="mt-10 d-flex justify-start align-center mobile-view">
|
||||
<v-btn class="button primary half" variant="flat" @click="complete()">ÁNO</v-btn>
|
||||
<v-btn class="button primary half outline" @click.stop="visible = false">ZRUŠIŤ</v-btn>
|
||||
</v-card-actions>
|
||||
</v-card>
|
||||
</v-dialog>
|
||||
<v-dialog v-model="visible" max-width="750" persistent>
|
||||
<v-card>
|
||||
<div class="d-flex justify-space-between align-center">
|
||||
<h1>
|
||||
Ste si istý, že chcete
|
||||
{{ subtask.is_finished ? 'znovu otvoriť' : 'dokončiť' }} sub task, z
|
||||
mastertasku
|
||||
<b>{{ subtask?.master_task?.name || subtask.master_task }}</b
|
||||
>?
|
||||
</h1>
|
||||
<v-icon
|
||||
@click.stop="closeModal()"
|
||||
icon="mdi-close"
|
||||
size="large"
|
||||
></v-icon>
|
||||
</div>
|
||||
<v-card-actions
|
||||
class="mt-10 d-flex justify-start align-center mobile-view"
|
||||
>
|
||||
<v-btn class="button primary half" variant="flat" @click="complete()"
|
||||
>ÁNO</v-btn
|
||||
>
|
||||
<v-btn class="button primary half outline" @click.stop="visible = false"
|
||||
>ZRUŠIŤ</v-btn
|
||||
>
|
||||
</v-card-actions>
|
||||
</v-card>
|
||||
</v-dialog>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import modalMixin from '@/plugins/tm@modal/_mixins/modal.mixin'
|
||||
import modalMixin from '@/plugins/tm@modal/_mixins/modal.mixin';
|
||||
import moment from 'moment';
|
||||
|
||||
export default {
|
||||
mixins: [ modalMixin ],
|
||||
emits: ['close', 'on-subtask-edited'],
|
||||
mixins: [modalMixin],
|
||||
emits: ['close', 'on-subtask-edited'],
|
||||
|
||||
data() {
|
||||
return {
|
||||
visible: false,
|
||||
subtask: null
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
visible: false,
|
||||
subtask: null,
|
||||
};
|
||||
},
|
||||
|
||||
methods: {
|
||||
async showModal({ subtask }) {
|
||||
this.subtask = subtask
|
||||
this.visible = true
|
||||
},
|
||||
methods: {
|
||||
async showModal({ subtask }) {
|
||||
this.subtask = subtask;
|
||||
this.visible = true;
|
||||
},
|
||||
|
||||
async complete() {
|
||||
try {
|
||||
const tempSubtask = {...this.subtask, is_finished: this.subtask.is_finished ? 0 : 1, timesheets: this.subtask.timesheets.map((timesheet) => {
|
||||
delete timesheet.employee_name
|
||||
return timesheet
|
||||
})}
|
||||
const { subtask } = await this.$axios.put_auth(`v1/subtasks/${tempSubtask.id}`, tempSubtask)
|
||||
async complete() {
|
||||
try {
|
||||
const timesheets = this.subtask.timesheets.map((timesheet) => {
|
||||
delete timesheet.employee_name;
|
||||
return timesheet;
|
||||
});
|
||||
|
||||
this.visible = false
|
||||
this.$emit('on-subtask-edited', subtask)
|
||||
} catch (error) {
|
||||
this.$toast.error(this.$parseError(error))
|
||||
// Convert timeblocks from internal format to BE format
|
||||
const timeblocks = (this.subtask.timeblocks || [])
|
||||
.filter((timeblock) => {
|
||||
// Filter timeblocks that have either old format (date) or new format (start)
|
||||
return timeblock.date || timeblock.start;
|
||||
})
|
||||
.map((timeblock) => {
|
||||
// If already in BE format (has start field), return as is
|
||||
if (timeblock.start && !timeblock.date) {
|
||||
return {
|
||||
id: timeblock.id || null,
|
||||
start: timeblock.start,
|
||||
end: timeblock.end,
|
||||
is_finished: timeblock.is_finished || 0,
|
||||
};
|
||||
}
|
||||
|
||||
if (process.env.NODE_ENV === 'development')
|
||||
console.log('[z-complete-task-modal.vue] Error: ', error)
|
||||
}
|
||||
},
|
||||
// Convert from internal format to BE format
|
||||
const dateStr = moment(timeblock.date).format('YYYY-MM-DD');
|
||||
return {
|
||||
id: timeblock.id || null,
|
||||
start: `${dateStr} ${timeblock.starts_at_time}:00`,
|
||||
end: `${dateStr} ${timeblock.ends_at_time}:00`,
|
||||
is_finished: timeblock.is_finished || 0,
|
||||
};
|
||||
});
|
||||
|
||||
closeModal() {
|
||||
this.visible = false
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
const tempSubtask = {
|
||||
...this.subtask,
|
||||
is_finished: this.subtask.is_finished ? 0 : 1,
|
||||
timesheets,
|
||||
timeblocks,
|
||||
};
|
||||
|
||||
const { subtask } = await this.$axios.put_auth(
|
||||
`v1/subtasks/${tempSubtask.id}`,
|
||||
tempSubtask,
|
||||
);
|
||||
|
||||
this.visible = false;
|
||||
this.$emit('on-subtask-edited', subtask);
|
||||
} catch (error) {
|
||||
this.$toast.error(this.$parseError(error));
|
||||
|
||||
if (process.env.NODE_ENV === 'development')
|
||||
console.log('[z-complete-task-modal.vue] Error: ', error);
|
||||
}
|
||||
},
|
||||
|
||||
closeModal() {
|
||||
this.visible = false;
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
@@ -1,86 +1,139 @@
|
||||
<template>
|
||||
<v-dialog v-model="visible" max-width="500" persistent>
|
||||
<v-card>
|
||||
<div class="d-flex justify-space-between align-center">
|
||||
<h4 class="mt-3">Vyberte časový úsek, ktorý chcete odstrániť</h4>
|
||||
<v-dialog v-model="visible" max-width="500" persistent>
|
||||
<v-card>
|
||||
<div class="d-flex justify-space-between align-center">
|
||||
<h4 class="mt-3">Vyberte časový úsek, ktorý chcete odstrániť</h4>
|
||||
|
||||
<v-icon
|
||||
@click.stop="closeModal()"
|
||||
icon="mdi-close"
|
||||
size="large"
|
||||
></v-icon>
|
||||
</div>
|
||||
<div v-for="(timeblock, index) in subtask.timeblocks" :key="timeblock.id" class="d-flex align-center justify-center mb-3 mt-3">
|
||||
<p class="task-badge rounded-pill" :class="{'strike-through': timeblock.is_finished}">{{ tmUtils.formatDateTime(timeblock.start) }} - {{ tmUtils.formatDateTime(timeblock.end) }}</p>
|
||||
<v-icon @click.stop="subtask.id ? deleteTimeblock(timeblock) : deleteTimeblockWithoutId(index)" class="close-icon circle-border cursor-pointer ml-3 text-red" icon="mdi-close" size="medium" />
|
||||
</div>
|
||||
</v-card>
|
||||
</v-dialog>
|
||||
<v-icon
|
||||
@click.stop="closeModal()"
|
||||
icon="mdi-close"
|
||||
size="large"
|
||||
></v-icon>
|
||||
</div>
|
||||
<div
|
||||
v-for="(timeblock, index) in subtask.timeblocks"
|
||||
:key="timeblock.id"
|
||||
class="d-flex align-center justify-center mb-3 mt-3"
|
||||
>
|
||||
<p
|
||||
class="task-badge rounded-pill"
|
||||
:class="{ 'strike-through': timeblock.is_finished }"
|
||||
>
|
||||
{{ tmUtils.formatDateTime(timeblock.start) }} -
|
||||
{{ tmUtils.formatDateTime(timeblock.end) }}
|
||||
</p>
|
||||
<v-icon
|
||||
@click.stop="
|
||||
subtask.id
|
||||
? deleteTimeblock(timeblock)
|
||||
: deleteTimeblockWithoutId(index)
|
||||
"
|
||||
class="close-icon circle-border cursor-pointer ml-3 text-red"
|
||||
icon="mdi-close"
|
||||
size="medium"
|
||||
/>
|
||||
</div>
|
||||
</v-card>
|
||||
</v-dialog>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import modalMixin from '@/plugins/tm@modal/_mixins/modal.mixin'
|
||||
import tmUtils from '@/plugins/tm@_utils/tm.utils'
|
||||
import modalMixin from '@/plugins/tm@modal/_mixins/modal.mixin';
|
||||
import tmUtils from '@/plugins/tm@_utils/tm.utils';
|
||||
import moment from 'moment';
|
||||
|
||||
export default {
|
||||
mixins: [ modalMixin ],
|
||||
emits: ['on-subtask-edited'],
|
||||
mixins: [modalMixin],
|
||||
emits: ['on-subtask-edited'],
|
||||
|
||||
data() {
|
||||
return {
|
||||
visible: false,
|
||||
subtask: null,
|
||||
isDeleting: false,
|
||||
tmUtils
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
visible: false,
|
||||
subtask: null,
|
||||
isDeleting: false,
|
||||
tmUtils,
|
||||
};
|
||||
},
|
||||
|
||||
methods: {
|
||||
async showModal({ subtask }) {
|
||||
this.subtask = subtask
|
||||
this.visible = true
|
||||
},
|
||||
methods: {
|
||||
async showModal({ subtask }) {
|
||||
this.subtask = subtask;
|
||||
this.visible = true;
|
||||
},
|
||||
|
||||
closeModal() {
|
||||
this.visible = false
|
||||
},
|
||||
closeModal() {
|
||||
this.visible = false;
|
||||
},
|
||||
|
||||
async deleteTimeblock({ id }) {
|
||||
const subtask = JSON.parse(JSON.stringify(this.subtask))
|
||||
subtask.timeblocks = subtask.timeblocks.filter(timeblock => timeblock.id != id)
|
||||
if(subtask.deadline) subtask.deadline = tmUtils.formatDateTimeForBackend(subtask.deadline)
|
||||
async deleteTimeblock({ id }) {
|
||||
const subtask = JSON.parse(JSON.stringify(this.subtask));
|
||||
subtask.timeblocks = subtask.timeblocks.filter(
|
||||
(timeblock) => timeblock.id != id,
|
||||
);
|
||||
if (subtask.deadline)
|
||||
subtask.deadline = tmUtils.formatDateTimeForBackend(subtask.deadline);
|
||||
|
||||
this._update(subtask)
|
||||
},
|
||||
this._update(subtask);
|
||||
},
|
||||
|
||||
deleteTimeblockWithoutId(i) {
|
||||
this.$emit('delete-timeblock')
|
||||
},
|
||||
deleteTimeblockWithoutId(i) {
|
||||
this.$emit('delete-timeblock');
|
||||
},
|
||||
|
||||
async _update(data) {
|
||||
try {
|
||||
const timesheets = data.timesheets.map((timesheet) => {
|
||||
delete timesheet.employee_name
|
||||
return timesheet
|
||||
})
|
||||
async _update(data) {
|
||||
try {
|
||||
const timesheets = data.timesheets.map((timesheet) => {
|
||||
delete timesheet.employee_name;
|
||||
return timesheet;
|
||||
});
|
||||
|
||||
const { subtask } = await this.$axios.put_auth(`v1/subtasks/${data.id}`, {...data, timesheets})
|
||||
// Convert timeblocks from internal format to BE format
|
||||
const timeblocks = (data.timeblocks || [])
|
||||
.filter((timeblock) => {
|
||||
// Filter timeblocks that have either old format (date) or new format (start)
|
||||
return timeblock.date || timeblock.start;
|
||||
})
|
||||
.map((timeblock) => {
|
||||
// If already in BE format (has start field), return as is
|
||||
if (timeblock.start && !timeblock.date) {
|
||||
return {
|
||||
id: timeblock.id || null,
|
||||
start: timeblock.start,
|
||||
end: timeblock.end,
|
||||
is_finished: timeblock.is_finished || 0,
|
||||
};
|
||||
}
|
||||
|
||||
this.closeModal()
|
||||
this.$events.emit('on-subtask-edited', subtask)
|
||||
} catch (error) {
|
||||
this.$toast.error(error.message || error)
|
||||
// Convert from internal format to BE format
|
||||
const dateStr = moment(timeblock.date).format('YYYY-MM-DD');
|
||||
return {
|
||||
id: timeblock.id || null,
|
||||
start: `${dateStr} ${timeblock.starts_at_time}:00`,
|
||||
end: `${dateStr} ${timeblock.ends_at_time}:00`,
|
||||
is_finished: timeblock.is_finished || 0,
|
||||
};
|
||||
});
|
||||
|
||||
if (process.env.NODE_ENV === 'development')
|
||||
console.log('[z-delete-timeblock-modal.vue] Error: ', error)
|
||||
}
|
||||
},
|
||||
}
|
||||
}
|
||||
const { subtask } = await this.$axios.put_auth(
|
||||
`v1/subtasks/${data.id}`,
|
||||
{ ...data, timesheets, timeblocks },
|
||||
);
|
||||
|
||||
this.closeModal();
|
||||
this.$events.emit('on-subtask-edited', subtask);
|
||||
} catch (error) {
|
||||
this.$toast.error(error.message || error);
|
||||
|
||||
if (process.env.NODE_ENV === 'development')
|
||||
console.log('[z-delete-timeblock-modal.vue] Error: ', error);
|
||||
}
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="sass" scoped>
|
||||
.close-icon:hover
|
||||
background: red
|
||||
color: #fff !important
|
||||
</style>
|
||||
</style>
|
||||
@@ -1,95 +1,151 @@
|
||||
<template>
|
||||
<v-dialog max-width="750" v-model="visible" persistent>
|
||||
<v-card>
|
||||
<div class="d-flex justify-space-between align-center">
|
||||
<h1>Pridať odpracovaný čas</h1>
|
||||
<v-dialog max-width="750" v-model="visible" persistent>
|
||||
<v-card>
|
||||
<div class="d-flex justify-space-between align-center">
|
||||
<h1>Pridať odpracovaný čas</h1>
|
||||
|
||||
<v-icon @click.stop="closeModal()" icon="mdi-close" size="large"></v-icon>
|
||||
</div>
|
||||
<v-card-actions class="mt-10 d-flex justify-start align-center">
|
||||
<v-text-field v-model="form.hours" variant="solo" bg-color="white" type="number" :hint="v$.form.hours.$errors ? errorUtils.parseErrors(v$.form.hours.$errors) : null" :class="{ error: v$.form.hours.$errors.length }" class="mb-2" label="Odpracovaný čas" />
|
||||
</v-card-actions>
|
||||
<v-btn @click="submit()" class="button primary mt-5">Potvrdiť</v-btn>
|
||||
</v-card>
|
||||
</v-dialog>
|
||||
<v-icon
|
||||
@click.stop="closeModal()"
|
||||
icon="mdi-close"
|
||||
size="large"
|
||||
></v-icon>
|
||||
</div>
|
||||
<v-card-actions class="mt-10 d-flex justify-start align-center">
|
||||
<v-text-field
|
||||
v-model="form.hours"
|
||||
variant="solo"
|
||||
bg-color="white"
|
||||
type="number"
|
||||
:hint="
|
||||
v$.form.hours.$errors
|
||||
? errorUtils.parseErrors(v$.form.hours.$errors)
|
||||
: null
|
||||
"
|
||||
:class="{ error: v$.form.hours.$errors.length }"
|
||||
class="mb-2"
|
||||
label="Odpracovaný čas"
|
||||
/>
|
||||
</v-card-actions>
|
||||
<v-btn @click="submit()" class="button primary mt-5">Potvrdiť</v-btn>
|
||||
</v-card>
|
||||
</v-dialog>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import errorUtils from '@/plugins/lib@auth/_utils/error.utils'
|
||||
import useVuelidate from '@vuelidate/core'
|
||||
import { required, numeric, minValue } from '@vuelidate/validators'
|
||||
import modalMixin from '@/plugins/tm@modal/_mixins/modal.mixin'
|
||||
import tmUtils from '@/plugins/tm@_utils/tm.utils'
|
||||
import errorUtils from '@/plugins/lib@auth/_utils/error.utils';
|
||||
import useVuelidate from '@vuelidate/core';
|
||||
import { required, numeric, minValue } from '@vuelidate/validators';
|
||||
import modalMixin from '@/plugins/tm@modal/_mixins/modal.mixin';
|
||||
import tmUtils from '@/plugins/tm@_utils/tm.utils';
|
||||
import moment from 'moment';
|
||||
|
||||
export default {
|
||||
mixins: [ modalMixin ],
|
||||
emits: ['close', 'on-subtask-edited'],
|
||||
mixins: [modalMixin],
|
||||
emits: ['close', 'on-subtask-edited'],
|
||||
|
||||
data() {
|
||||
return {
|
||||
v$: useVuelidate(),
|
||||
errorUtils,
|
||||
visible: false,
|
||||
subtask: null,
|
||||
form: {
|
||||
hours: null
|
||||
}
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
v$: useVuelidate(),
|
||||
errorUtils,
|
||||
visible: false,
|
||||
subtask: null,
|
||||
form: {
|
||||
hours: null,
|
||||
},
|
||||
};
|
||||
},
|
||||
|
||||
validations() {
|
||||
return {
|
||||
form: {
|
||||
hours: {required, numeric, minValue: minValue(0.1)}
|
||||
}
|
||||
}
|
||||
},
|
||||
validations() {
|
||||
return {
|
||||
form: {
|
||||
hours: { required, numeric, minValue: minValue(0.1) },
|
||||
},
|
||||
};
|
||||
},
|
||||
|
||||
methods: {
|
||||
async showModal({ subtask }) {
|
||||
this.subtask = subtask
|
||||
this.visible = true
|
||||
this.form.hours = null
|
||||
this.$nextTick(() => this.v$.$reset())
|
||||
},
|
||||
methods: {
|
||||
async showModal({ subtask }) {
|
||||
this.subtask = subtask;
|
||||
this.visible = true;
|
||||
this.form.hours = null;
|
||||
this.$nextTick(() => this.v$.$reset());
|
||||
},
|
||||
|
||||
async submit() {
|
||||
if (!await this.v$.$validate())
|
||||
return
|
||||
async submit() {
|
||||
if (!(await this.v$.$validate())) return;
|
||||
|
||||
if (this.subtask.deadline) this.subtask.deadline = tmUtils.formatDateTimeForBackend(this.subtask.deadline)
|
||||
if (this.subtask.deadline)
|
||||
this.subtask.deadline = tmUtils.formatDateTimeForBackend(
|
||||
this.subtask.deadline,
|
||||
);
|
||||
|
||||
this.subtask.timesheets.push({
|
||||
id: null,
|
||||
employee_id: this.subtask.employee_id,
|
||||
time: typeof this.form.hours == 'string' ? parseFloat(this.form.hours) : this.form.hours
|
||||
})
|
||||
this.subtask.timesheets.push({
|
||||
id: null,
|
||||
employee_id: this.subtask.employee_id,
|
||||
time:
|
||||
typeof this.form.hours == 'string'
|
||||
? parseFloat(this.form.hours)
|
||||
: this.form.hours,
|
||||
});
|
||||
|
||||
const payload = {
|
||||
...this.subtask,
|
||||
timesheets: this.subtask.timesheets.map((timesheet) => {
|
||||
delete timesheet.employee_name
|
||||
return timesheet
|
||||
})
|
||||
}
|
||||
const timesheets = this.subtask.timesheets.map((timesheet) => {
|
||||
delete timesheet.employee_name;
|
||||
return timesheet;
|
||||
});
|
||||
|
||||
try {
|
||||
const { subtask } = await this.$axios.put_auth(`v1/subtasks/${this.subtask.id}`, payload)
|
||||
// Convert timeblocks from internal format to BE format
|
||||
const timeblocks = (this.subtask.timeblocks || [])
|
||||
.filter((timeblock) => {
|
||||
// Filter timeblocks that have either old format (date) or new format (start)
|
||||
return timeblock.date || timeblock.start;
|
||||
})
|
||||
.map((timeblock) => {
|
||||
// If already in BE format (has start field), return as is
|
||||
if (timeblock.start && !timeblock.date) {
|
||||
return {
|
||||
id: timeblock.id || null,
|
||||
start: timeblock.start,
|
||||
end: timeblock.end,
|
||||
is_finished: timeblock.is_finished || 0,
|
||||
};
|
||||
}
|
||||
|
||||
this.closeModal()
|
||||
this.$events.emit('on-subtask-edited', subtask)
|
||||
} catch (error) {
|
||||
this.$toast.error(error.message || error)
|
||||
// Convert from internal format to BE format
|
||||
const dateStr = moment(timeblock.date).format('YYYY-MM-DD');
|
||||
return {
|
||||
id: timeblock.id || null,
|
||||
start: `${dateStr} ${timeblock.starts_at_time}:00`,
|
||||
end: `${dateStr} ${timeblock.ends_at_time}:00`,
|
||||
is_finished: timeblock.is_finished || 0,
|
||||
};
|
||||
});
|
||||
|
||||
if (process.env.NODE_ENV === 'development')
|
||||
console.log('[z-task-add-time-modal.vue] Error: ', error)
|
||||
}
|
||||
},
|
||||
const payload = {
|
||||
...this.subtask,
|
||||
timesheets,
|
||||
timeblocks,
|
||||
};
|
||||
|
||||
closeModal() {
|
||||
this.visible = false
|
||||
this.v$.$reset()
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
try {
|
||||
const { subtask } = await this.$axios.put_auth(
|
||||
`v1/subtasks/${this.subtask.id}`,
|
||||
payload,
|
||||
);
|
||||
|
||||
this.closeModal();
|
||||
this.$events.emit('on-subtask-edited', subtask);
|
||||
} catch (error) {
|
||||
this.$toast.error(error.message || error);
|
||||
|
||||
if (process.env.NODE_ENV === 'development')
|
||||
console.log('[z-task-add-time-modal.vue] Error: ', error);
|
||||
}
|
||||
},
|
||||
|
||||
closeModal() {
|
||||
this.visible = false;
|
||||
this.v$.$reset();
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
@@ -38,8 +38,8 @@
|
||||
v-model="subtask.master_task_id"
|
||||
label="Master task"
|
||||
:class="{ error: v$.subtask.master_task_id.$errors.length }"
|
||||
:items="mastertasks"
|
||||
:item-title="(item) => item.name + ' [' + item.project_code + ']'"
|
||||
:items="enrichedMastertasks"
|
||||
:item-title="(item) => item._fullName || item.name"
|
||||
item-value="id"
|
||||
variant="solo"
|
||||
class="modal-input"
|
||||
@@ -234,70 +234,23 @@
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<template v-if="!subtask.id">
|
||||
<div class="timeblocks w-100">
|
||||
<A-timeblock
|
||||
v-for="(timeblock, index) in timeblocks"
|
||||
:key="index"
|
||||
@updateTimeblock="(val) => updateTimeblock(val, index)"
|
||||
@removeTimeblock="removeTimeblock(index)"
|
||||
:timeblock="timeblock"
|
||||
:deletable="index > 0"
|
||||
editable
|
||||
:ref="`timetable-${index}`"
|
||||
:prevent-input-focus="preventInputFocus"
|
||||
:on-input-focus="onInputFocus"
|
||||
:on-date-open="onDateOpen"
|
||||
/>
|
||||
<div class="end-button w-100">
|
||||
<button
|
||||
@click="
|
||||
timeblocks.push({
|
||||
date: null,
|
||||
starts_at_time: null,
|
||||
ends_at_time: null,
|
||||
})
|
||||
"
|
||||
>
|
||||
Pridať časový blok
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<div
|
||||
v-else
|
||||
v-for="(timeblock, index) in subtask.timeblocks"
|
||||
:key="index"
|
||||
class="timeblock w-100"
|
||||
>
|
||||
<Datepicker
|
||||
:model-value="timeblock.start.substring(0, 10)"
|
||||
format="dd.MM.yyyy"
|
||||
locale="sk"
|
||||
select-text="Vybrať"
|
||||
cancel-text="Zrušiť"
|
||||
placeholder="Dátum"
|
||||
:auto-apply="true"
|
||||
:enable-time-picker="false"
|
||||
readonly
|
||||
class="mb-5 modal-input"
|
||||
<div class="timeblocks w-100">
|
||||
<A-timeblock
|
||||
v-for="(timeblock, index) in editableTimeblocks"
|
||||
:key="index"
|
||||
@updateTimeblock="(val) => updateTimeblock(val, index)"
|
||||
@removeTimeblock="removeTimeblock(index)"
|
||||
:timeblock="timeblock"
|
||||
:deletable="index > 0"
|
||||
:editable="true"
|
||||
:ref="`timetable-${index}`"
|
||||
:prevent-input-focus="preventInputFocus"
|
||||
:on-input-focus="onInputFocus"
|
||||
:on-date-open="onDateOpen"
|
||||
:index="index"
|
||||
/>
|
||||
<div class="splitted-time-inputs w-100">
|
||||
<v-text-field
|
||||
:value="timeblock.start.substring(11, 16)"
|
||||
type="time"
|
||||
variant="solo"
|
||||
bg-color="white"
|
||||
label="Začiatok"
|
||||
/>
|
||||
<v-text-field
|
||||
:value="timeblock.end.substring(11, 16)"
|
||||
type="time"
|
||||
variant="solo"
|
||||
bg-color="white"
|
||||
label="Koniec"
|
||||
/>
|
||||
<div class="end-button w-100" v-if="!subtask.id">
|
||||
<button @click="addTimeblock">Pridať časový blok</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -397,7 +350,6 @@
|
||||
<script>
|
||||
import Datepicker from '@vuepic/vue-datepicker';
|
||||
import ZFilesUpload from '@/plugins/tm@_components/z-files-upload.vue';
|
||||
import ATaskTimeblocks from '@/plugins/tm@modal/task/_components/_components/a-task-timeblocks.vue';
|
||||
import useVuelidate from '@vuelidate/core';
|
||||
import { required, requiredIf, optional } from '@vuelidate/validators';
|
||||
import errorUtils from '@/plugins/lib@auth/_utils/error.utils';
|
||||
@@ -453,6 +405,33 @@ export default {
|
||||
|
||||
computed: {
|
||||
...mapGetters('tm', ['mastertasks', 'enrichedEmployees']),
|
||||
enrichedMastertasks() {
|
||||
return this.mastertasks.map((mastertask) => ({
|
||||
...mastertask,
|
||||
_fullName: `${mastertask.name} [${mastertask.project_code}]`,
|
||||
}));
|
||||
},
|
||||
|
||||
// Unified timeblocks for both create and update modes
|
||||
editableTimeblocks: {
|
||||
get() {
|
||||
if (this.subtask?.id) {
|
||||
// Update mode: use subtask.timeblocks (from BE)
|
||||
return this.subtask.timeblocks || [];
|
||||
}
|
||||
// Create mode: use this.timeblocks (local state)
|
||||
return this.timeblocks;
|
||||
},
|
||||
set(value) {
|
||||
if (this.subtask?.id) {
|
||||
// Update mode: update subtask.timeblocks (Vue 3 reactivity)
|
||||
this.subtask.timeblocks = value;
|
||||
} else {
|
||||
// Create mode: update this.timeblocks
|
||||
this.timeblocks = value;
|
||||
}
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
validations() {
|
||||
@@ -487,10 +466,36 @@ export default {
|
||||
|
||||
data.deadline = splittedDeadline[0];
|
||||
data._deadline_time = splittedDeadline[1];
|
||||
|
||||
// Convert BE format timeblocks to internal format
|
||||
const convertedTimeblocks = [];
|
||||
if (data.timeblocks && data.timeblocks.length > 0) {
|
||||
data.timeblocks.forEach((timeblock) => {
|
||||
// If already in internal format, keep as is
|
||||
if (timeblock.date) {
|
||||
convertedTimeblocks.push(timeblock);
|
||||
return;
|
||||
}
|
||||
|
||||
// Convert from BE format to internal format
|
||||
if (timeblock.start && timeblock.end) {
|
||||
const startMoment = moment(timeblock.start, 'YYYY-MM-DD HH:mm:ss');
|
||||
const endMoment = moment(timeblock.end, 'YYYY-MM-DD HH:mm:ss');
|
||||
convertedTimeblocks.push({
|
||||
id: timeblock.id || null,
|
||||
date: startMoment.toDate(),
|
||||
starts_at_time: startMoment.format('HH:mm'),
|
||||
ends_at_time: endMoment.format('HH:mm'),
|
||||
is_finished: timeblock.is_finished || 0,
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
data.timeblocks = convertedTimeblocks;
|
||||
|
||||
this.subtask = this._enrichTask(data);
|
||||
|
||||
// TODO: Remove? riesil som neodstranovanie jedineho zanamu v trvani a odpracovanom case
|
||||
console.log('2', this.subtask);
|
||||
this.$forceUpdate();
|
||||
});
|
||||
|
||||
@@ -514,11 +519,42 @@ export default {
|
||||
},
|
||||
|
||||
updateTimeblock(val, index) {
|
||||
this.timeblocks[index] = val;
|
||||
if (this.subtask?.id) {
|
||||
// Update mode: direct assignment (Vue 3 reactivity)
|
||||
this.subtask.timeblocks[index] = val;
|
||||
} else {
|
||||
// Create mode: direct assignment
|
||||
this.timeblocks[index] = val;
|
||||
}
|
||||
},
|
||||
|
||||
addTimeblock() {
|
||||
const newTimeblock = {
|
||||
date: null,
|
||||
starts_at_time: null,
|
||||
ends_at_time: null,
|
||||
};
|
||||
|
||||
if (this.subtask?.id) {
|
||||
// Update mode
|
||||
if (!this.subtask.timeblocks) {
|
||||
this.subtask.timeblocks = [];
|
||||
}
|
||||
this.subtask.timeblocks.push(newTimeblock);
|
||||
} else {
|
||||
// Create mode
|
||||
this.timeblocks.push(newTimeblock);
|
||||
}
|
||||
},
|
||||
|
||||
removeTimeblock(index) {
|
||||
this.timeblocks.splice(index, 1);
|
||||
if (this.subtask?.id) {
|
||||
// Update mode
|
||||
this.subtask.timeblocks.splice(index, 1);
|
||||
} else {
|
||||
// Create mode
|
||||
this.timeblocks.splice(index, 1);
|
||||
}
|
||||
},
|
||||
|
||||
async showModal({ subtask, editMode = false, mastertask = {} }) {
|
||||
@@ -543,6 +579,35 @@ export default {
|
||||
`v1/subtasks/${subtask.id}`,
|
||||
);
|
||||
|
||||
// Convert BE format timeblocks to internal format
|
||||
const convertedTimeblocks = [];
|
||||
if (data.timeblocks && data.timeblocks.length > 0) {
|
||||
data.timeblocks.forEach((timeblock) => {
|
||||
// If already in internal format, keep as is
|
||||
if (timeblock.date) {
|
||||
convertedTimeblocks.push(timeblock);
|
||||
return;
|
||||
}
|
||||
|
||||
// Convert from BE format to internal format
|
||||
if (timeblock.start && timeblock.end) {
|
||||
const startMoment = moment(
|
||||
timeblock.start,
|
||||
'YYYY-MM-DD HH:mm:ss',
|
||||
);
|
||||
const endMoment = moment(timeblock.end, 'YYYY-MM-DD HH:mm:ss');
|
||||
convertedTimeblocks.push({
|
||||
id: timeblock.id || null,
|
||||
date: startMoment.toDate(),
|
||||
starts_at_time: startMoment.format('HH:mm'),
|
||||
ends_at_time: endMoment.format('HH:mm'),
|
||||
is_finished: timeblock.is_finished || 0,
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
data.timeblocks = convertedTimeblocks;
|
||||
|
||||
if (!data.deadline) {
|
||||
this.editMode = editMode || !data.id;
|
||||
return (this.subtask = this._enrichTask(data));
|
||||
@@ -618,9 +683,7 @@ export default {
|
||||
|
||||
async validateAllFields() {
|
||||
const employeesValid = await this._validateEmployees();
|
||||
const timeblocksValid = this.subtask?.id
|
||||
? true
|
||||
: await this._validateTimeblocks();
|
||||
const timeblocksValid = await this._validateTimeblocks();
|
||||
|
||||
if (!(await this.v$.$validate())) return;
|
||||
if (!employeesValid || !timeblocksValid) return;
|
||||
@@ -655,9 +718,22 @@ export default {
|
||||
return timesheet;
|
||||
});
|
||||
|
||||
// Convert timeblocks from internal format to BE format for update
|
||||
const timeblocks = (this.subtask.timeblocks || [])
|
||||
.filter((timeblock) => timeblock.date) // Only send timeblocks with dates
|
||||
.map((timeblock) => {
|
||||
const dateStr = moment(timeblock.date).format('YYYY-MM-DD');
|
||||
return {
|
||||
id: timeblock.id || null,
|
||||
start: `${dateStr} ${timeblock.starts_at_time}:00`,
|
||||
end: `${dateStr} ${timeblock.ends_at_time}:00`,
|
||||
is_finished: timeblock.is_finished || 0,
|
||||
};
|
||||
});
|
||||
|
||||
const { subtask } = await this.$axios.patch_auth_form(
|
||||
`v1/subtasks/${this.subtask.id}`,
|
||||
{ ...this.subtask, timesheets },
|
||||
{ ...this.subtask, timesheets, timeblocks },
|
||||
);
|
||||
localStorage.removeItem('subtaskData');
|
||||
|
||||
@@ -803,12 +879,19 @@ export default {
|
||||
},
|
||||
|
||||
async _validateTimeblocks() {
|
||||
let invalid = false;
|
||||
for (let i = 0; i < this.timeblocks.length; i++) {
|
||||
let valid = true;
|
||||
const timeblocks = this.editableTimeblocks;
|
||||
|
||||
for (let i = 0; i < timeblocks.length; i++) {
|
||||
const ref = this.$refs[`timetable-${i}`];
|
||||
invalid = (await ref[0].v$.$validate()) || invalid;
|
||||
if (ref && ref[0]) {
|
||||
const isValid = await ref[0].v$.$validate();
|
||||
if (!isValid) {
|
||||
valid = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
return invalid;
|
||||
return valid;
|
||||
},
|
||||
|
||||
_enrichTask(subtask) {
|
||||
|
||||
@@ -1,159 +1,226 @@
|
||||
<template>
|
||||
<v-dialog v-model="visible" max-width="750" persistent>
|
||||
<v-card>
|
||||
<div class="d-flex justify-space-between align-center">
|
||||
<h1>Sub Task má nedokončené úlohy</h1>
|
||||
<v-dialog v-model="visible" max-width="750" persistent>
|
||||
<v-card>
|
||||
<div class="d-flex justify-space-between align-center">
|
||||
<h1>Sub Task má nedokončené úlohy</h1>
|
||||
|
||||
<v-icon
|
||||
@click.stop="closeModal()"
|
||||
icon="mdi-close"
|
||||
size="large"
|
||||
></v-icon>
|
||||
</div>
|
||||
<v-icon
|
||||
@click.stop="closeModal()"
|
||||
icon="mdi-close"
|
||||
size="large"
|
||||
></v-icon>
|
||||
</div>
|
||||
|
||||
<div class="card-content">
|
||||
<div v-for="(timeblock) in subtask?.timeblocks" :key="timeblock.id" class="d-flex align-center mb-3">
|
||||
<p class="task-badge rounded-pill" :class="{'strike-through': timeblock.is_finished}">{{ tmUtils.formatDateTime(timeblock.start) }} - {{ tmUtils.formatDateTime(timeblock.end) }}</p>
|
||||
<v-icon @click.stop="handleFinishTimeblock(timeblock)" class="finish-icon circle-border cursor-pointer ml-2" :class="{'disabled': loadingTimeblocks[timeblock.id] || loadingCloseAll, 'finished': timeblock.is_finished}" icon="mdi-check" size="medium" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="card-content">
|
||||
<div
|
||||
v-for="timeblock in subtask?.timeblocks"
|
||||
:key="timeblock.id"
|
||||
class="d-flex align-center mb-3"
|
||||
>
|
||||
<p
|
||||
class="task-badge rounded-pill"
|
||||
:class="{ 'strike-through': timeblock.is_finished }"
|
||||
>
|
||||
{{ tmUtils.formatDateTime(timeblock.start) }} -
|
||||
{{ tmUtils.formatDateTime(timeblock.end) }}
|
||||
</p>
|
||||
<v-icon
|
||||
@click.stop="handleFinishTimeblock(timeblock)"
|
||||
class="finish-icon circle-border cursor-pointer ml-2"
|
||||
:class="{
|
||||
disabled: loadingTimeblocks[timeblock.id] || loadingCloseAll,
|
||||
finished: timeblock.is_finished,
|
||||
}"
|
||||
icon="mdi-check"
|
||||
size="medium"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card-actions">
|
||||
<v-btn @click="closeModal()" class="button secondary">Zrušiť</v-btn>
|
||||
<v-btn @click="handleFinishAllTimeblocks()" :loading="loadingCloseAll" class="button primary">Uzatvoriť všetky</v-btn>
|
||||
</div>
|
||||
</v-card>
|
||||
</v-dialog>
|
||||
<div class="card-actions">
|
||||
<v-btn @click="closeModal()" class="button secondary">Zrušiť</v-btn>
|
||||
<v-btn
|
||||
@click="handleFinishAllTimeblocks()"
|
||||
:loading="loadingCloseAll"
|
||||
class="button primary"
|
||||
>Uzatvoriť všetky</v-btn
|
||||
>
|
||||
</div>
|
||||
</v-card>
|
||||
</v-dialog>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import modalMixin from '@/plugins/tm@modal/_mixins/modal.mixin'
|
||||
import tmUtils from '@/plugins/tm@_utils/tm.utils'
|
||||
import modalMixin from '@/plugins/tm@modal/_mixins/modal.mixin';
|
||||
import tmUtils from '@/plugins/tm@_utils/tm.utils';
|
||||
import moment from 'moment';
|
||||
|
||||
export default {
|
||||
mixins: [ modalMixin ],
|
||||
emits: ['close', 'on-subtask-edited'],
|
||||
mixins: [modalMixin],
|
||||
emits: ['close', 'on-subtask-edited'],
|
||||
|
||||
props: {
|
||||
mode: {
|
||||
type: String,
|
||||
default: 'edit' // edit or delete
|
||||
}
|
||||
},
|
||||
props: {
|
||||
mode: {
|
||||
type: String,
|
||||
default: 'edit', // edit or delete
|
||||
},
|
||||
},
|
||||
|
||||
data() {
|
||||
return {
|
||||
tmUtils,
|
||||
visible: false,
|
||||
subtask: null,
|
||||
loadingTimeblocks: {},
|
||||
loadingCloseAll: false
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
tmUtils,
|
||||
visible: false,
|
||||
subtask: null,
|
||||
loadingTimeblocks: {},
|
||||
loadingCloseAll: false,
|
||||
};
|
||||
},
|
||||
|
||||
methods: {
|
||||
async showModal({ subtask }) {
|
||||
this.subtask = subtask
|
||||
this.visible = true
|
||||
},
|
||||
methods: {
|
||||
async showModal({ subtask }) {
|
||||
this.subtask = subtask;
|
||||
this.visible = true;
|
||||
},
|
||||
|
||||
async complete() {
|
||||
console.log('complete')
|
||||
},
|
||||
async complete() {
|
||||
console.log('complete');
|
||||
},
|
||||
|
||||
closeModal() {
|
||||
this.visible = false
|
||||
},
|
||||
closeModal() {
|
||||
this.visible = false;
|
||||
},
|
||||
|
||||
async handleFinishTimeblock(timeblock) {
|
||||
const subtask = JSON.parse(JSON.stringify(this.subtask))
|
||||
async handleFinishTimeblock(timeblock) {
|
||||
const subtask = JSON.parse(JSON.stringify(this.subtask));
|
||||
|
||||
try {
|
||||
this.loadingTimeblocks[timeblock.id] = true
|
||||
await this.$axios.put_auth(`v1/timeblocks/${timeblock.id}`, {...timeblock, is_finished: 1})
|
||||
timeblock.is_finished = 1
|
||||
try {
|
||||
this.loadingTimeblocks[timeblock.id] = true;
|
||||
await this.$axios.put_auth(`v1/timeblocks/${timeblock.id}`, {
|
||||
...timeblock,
|
||||
is_finished: 1,
|
||||
});
|
||||
timeblock.is_finished = 1;
|
||||
|
||||
const areAllTimeblocksFinished = subtask.timeblocks.every(timeblock => timeblock.is_finished)
|
||||
const areAllTimeblocksFinished = subtask.timeblocks.every(
|
||||
(timeblock) => timeblock.is_finished,
|
||||
);
|
||||
|
||||
if (areAllTimeblocksFinished) {
|
||||
await this._finishSubtask()
|
||||
this.$store.dispatch('tm/removeOngoingSubtask', this.subtask.id)
|
||||
}
|
||||
if (areAllTimeblocksFinished) {
|
||||
await this._finishSubtask();
|
||||
this.$store.dispatch('tm/removeOngoingSubtask', this.subtask.id);
|
||||
}
|
||||
|
||||
this.$events.emit('on-subtask-edited', subtask)
|
||||
this.closeModal()
|
||||
} catch (error) {
|
||||
this.$toast.error(error.message || error)
|
||||
this.$events.emit('on-subtask-edited', subtask);
|
||||
this.closeModal();
|
||||
} catch (error) {
|
||||
this.$toast.error(error.message || error);
|
||||
|
||||
if (process.env.NODE_ENV === 'development')
|
||||
console.log('[a-task-timeblocks.vue] Error: ', error)
|
||||
} finally {
|
||||
this.loadingTimeblocks[timeblock.id] = false
|
||||
}
|
||||
},
|
||||
if (process.env.NODE_ENV === 'development')
|
||||
console.log('[a-task-timeblocks.vue] Error: ', error);
|
||||
} finally {
|
||||
this.loadingTimeblocks[timeblock.id] = false;
|
||||
}
|
||||
},
|
||||
|
||||
async handleFinishAllTimeblocks() {
|
||||
this.loadingCloseAll = true
|
||||
async handleFinishAllTimeblocks() {
|
||||
this.loadingCloseAll = true;
|
||||
|
||||
try {
|
||||
const promises = this.subtask.timeblocks.map(timeblock => {
|
||||
return this.$axios.put_auth(`v1/timeblocks/${timeblock.id}`, {...timeblock, is_finished: 1})
|
||||
})
|
||||
try {
|
||||
const promises = this.subtask.timeblocks.map((timeblock) => {
|
||||
return this.$axios.put_auth(`v1/timeblocks/${timeblock.id}`, {
|
||||
...timeblock,
|
||||
is_finished: 1,
|
||||
});
|
||||
});
|
||||
|
||||
await Promise.all(promises)
|
||||
await Promise.all(promises);
|
||||
|
||||
this.subtask.timeblocks = this.subtask.timeblocks.map(timeblock => {
|
||||
timeblock.is_finished = 1
|
||||
return timeblock
|
||||
})
|
||||
this.subtask.timeblocks = this.subtask.timeblocks.map((timeblock) => {
|
||||
timeblock.is_finished = 1;
|
||||
return timeblock;
|
||||
});
|
||||
|
||||
await this._finishSubtask()
|
||||
await this._finishSubtask();
|
||||
|
||||
this.$store.dispatch('tm/removeOngoingSubtask', this.subtask.id)
|
||||
this.$events.emit('on-subtask-edited', this.subtask)
|
||||
this.closeModal()
|
||||
} catch (error) {
|
||||
this.$toast.error(error.message || error)
|
||||
} finally {
|
||||
this.loadingCloseAll = false
|
||||
}
|
||||
},
|
||||
this.$store.dispatch('tm/removeOngoingSubtask', this.subtask.id);
|
||||
this.$events.emit('on-subtask-edited', this.subtask);
|
||||
this.closeModal();
|
||||
} catch (error) {
|
||||
this.$toast.error(error.message || error);
|
||||
} finally {
|
||||
this.loadingCloseAll = false;
|
||||
}
|
||||
},
|
||||
|
||||
async _finishSubtask() {
|
||||
const tempSubtask = {...this.subtask, is_finished: 1, timesheets: this.subtask.timesheets.map((timesheet) => {
|
||||
delete timesheet.employee_name
|
||||
return timesheet
|
||||
})}
|
||||
async _finishSubtask() {
|
||||
const timesheets = this.subtask.timesheets.map((timesheet) => {
|
||||
delete timesheet.employee_name;
|
||||
return timesheet;
|
||||
});
|
||||
|
||||
return this.$axios.put_auth(`v1/subtasks/${tempSubtask.id}`, tempSubtask)
|
||||
}
|
||||
}
|
||||
}
|
||||
// Convert timeblocks from internal format to BE format
|
||||
const timeblocks = (this.subtask.timeblocks || [])
|
||||
.filter((timeblock) => {
|
||||
// Filter timeblocks that have either old format (date) or new format (start)
|
||||
return timeblock.date || timeblock.start;
|
||||
})
|
||||
.map((timeblock) => {
|
||||
// If already in BE format (has start field), return as is
|
||||
if (timeblock.start && !timeblock.date) {
|
||||
return {
|
||||
id: timeblock.id || null,
|
||||
start: timeblock.start,
|
||||
end: timeblock.end,
|
||||
is_finished: timeblock.is_finished || 0,
|
||||
};
|
||||
}
|
||||
|
||||
// Convert from internal format to BE format
|
||||
const dateStr = moment(timeblock.date).format('YYYY-MM-DD');
|
||||
return {
|
||||
id: timeblock.id || null,
|
||||
start: `${dateStr} ${timeblock.starts_at_time}:00`,
|
||||
end: `${dateStr} ${timeblock.ends_at_time}:00`,
|
||||
is_finished: timeblock.is_finished || 0,
|
||||
};
|
||||
});
|
||||
|
||||
const tempSubtask = {
|
||||
...this.subtask,
|
||||
is_finished: 1,
|
||||
timesheets,
|
||||
timeblocks,
|
||||
};
|
||||
|
||||
return this.$axios.put_auth(`v1/subtasks/${tempSubtask.id}`, tempSubtask);
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.card-content {
|
||||
margin-top: 20px;
|
||||
padding: 20px;
|
||||
margin-top: 20px;
|
||||
padding: 20px;
|
||||
}
|
||||
|
||||
.card-actions {
|
||||
width: 100%;
|
||||
display: grid;
|
||||
grid-template-columns: 1fr 1fr;
|
||||
gap: 10px;
|
||||
width: 100%;
|
||||
display: grid;
|
||||
grid-template-columns: 1fr 1fr;
|
||||
gap: 10px;
|
||||
}
|
||||
|
||||
.finish-icon {
|
||||
cursor: pointer;
|
||||
cursor: pointer;
|
||||
|
||||
&.disabled {
|
||||
opacity: 0.5;
|
||||
pointer-events: none;
|
||||
}
|
||||
&.disabled {
|
||||
opacity: 0.5;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
&.finished {
|
||||
background: #06dece;
|
||||
}
|
||||
&.finished {
|
||||
background: #06dece;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
</style>
|
||||
@@ -1,154 +1,226 @@
|
||||
<template>
|
||||
<v-table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th @click="getSelectedTimeblockDeadline" class="text-left">Kód projektu</th>
|
||||
<th class="text-left">Názov</th>
|
||||
<th class="text-left">Deadline</th>
|
||||
<th class="text-left">Najbližší neuzavretý</th>
|
||||
<th class="text-left">Naplánované</th>
|
||||
<th class="text-left">Zostávajúce</th>
|
||||
<th class="text-left">Akcia</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<v-table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th @click="getSelectedTimeblockDeadline" class="text-left">
|
||||
Kód projektu
|
||||
</th>
|
||||
<th class="text-left">Názov</th>
|
||||
<th class="text-left">Deadline</th>
|
||||
<th class="text-left">Najbližší neuzavretý</th>
|
||||
<th class="text-left">Naplánované</th>
|
||||
<th class="text-left">Zostávajúce</th>
|
||||
<th class="text-left">Akcia</th>
|
||||
</tr>
|
||||
</thead>
|
||||
|
||||
<tbody>
|
||||
<tr class="cursor-pointer" v-for="subtask in subtasks" :key="subtask.id" @click.stop="editTask(subtask, false)">
|
||||
<td>{{ subtask.project_code }}</td>
|
||||
<td>{{ subtask.title ?? subtask.master_task }}</td>
|
||||
<td v-if="subtask.deadline">{{ getDeadline(subtask) }}</td>
|
||||
<v-tooltip text="Deadline z Mastertasku" location="end">
|
||||
<template v-slot:activator="{ props }">
|
||||
<td v-if="!subtask.deadline" v-bind="props">{{ getDeadline(subtask) }}*</td>
|
||||
</template>
|
||||
</v-tooltip>
|
||||
<td>{{ displayTimeblock(subtask) }}</td>
|
||||
<td>{{ subtask.duration }} h</td>
|
||||
<td>{{ (subtask.duration - subtask.spent_time).toFixed(2) }} h</td>
|
||||
<tbody>
|
||||
<tr
|
||||
class="cursor-pointer"
|
||||
v-for="subtask in subtasks"
|
||||
:key="subtask.id"
|
||||
@click.stop="editTask(subtask, false)"
|
||||
>
|
||||
<td>{{ subtask.project_code }}</td>
|
||||
<td>{{ subtask.title ?? subtask.master_task }}</td>
|
||||
<td v-if="subtask.deadline">{{ getDeadline(subtask) }}</td>
|
||||
<v-tooltip text="Deadline z Mastertasku" location="end">
|
||||
<template v-slot:activator="{ props }">
|
||||
<td v-if="!subtask.deadline" v-bind="props">
|
||||
{{ getDeadline(subtask) }}*
|
||||
</td>
|
||||
</template>
|
||||
</v-tooltip>
|
||||
<td>{{ displayTimeblock(subtask) }}</td>
|
||||
<td>{{ subtask.duration }} h</td>
|
||||
<td>{{ (subtask.duration - subtask.spent_time).toFixed(2) }} h</td>
|
||||
|
||||
<td class="task-action">
|
||||
<div class="d-flex justify-start align-center">
|
||||
<img class="pencil-icon mr-3" :class="{'disabled': loadingSubtask[subtask.id]}" :src="checkmarkDouble" @click.stop="handleCompleteTask(subtask)">
|
||||
<td class="task-action">
|
||||
<div class="d-flex justify-start align-center">
|
||||
<img
|
||||
class="pencil-icon mr-3"
|
||||
:class="{ disabled: loadingSubtask[subtask.id] }"
|
||||
:src="checkmarkDouble"
|
||||
@click.stop="handleCompleteTask(subtask)"
|
||||
/>
|
||||
|
||||
<template v-if="subtask.type == 'office365'">
|
||||
<img class="pencil-icon" :src="eye" @click.stop="editTask(subtask, false)">
|
||||
<img class="office-icon" :src="office365" />
|
||||
</template>
|
||||
<template v-if="subtask.type == 'office365'">
|
||||
<img
|
||||
class="pencil-icon"
|
||||
:src="eye"
|
||||
@click.stop="editTask(subtask, false)"
|
||||
/>
|
||||
<img class="office-icon" :src="office365" />
|
||||
</template>
|
||||
|
||||
<template v-else>
|
||||
<img class="pencil-icon" :src="eye" @click.stop="editTask(subtask, false)">
|
||||
<img class="trash-icon" :src="bin" @click.stop="deleteTask(subtask)" />
|
||||
</template>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
|
||||
|
||||
</v-table>
|
||||
<template v-else>
|
||||
<img
|
||||
class="pencil-icon"
|
||||
:src="eye"
|
||||
@click.stop="editTask(subtask, false)"
|
||||
/>
|
||||
<img
|
||||
class="trash-icon"
|
||||
:src="bin"
|
||||
@click.stop="deleteTask(subtask)"
|
||||
/>
|
||||
</template>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</v-table>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { bin, eye, office365, checkmarkDouble } from '@/plugins/app/_img'
|
||||
import { bin, eye, office365, checkmarkDouble } from '@/plugins/app/_img';
|
||||
|
||||
import { mapGetters } from 'vuex'
|
||||
import moment from 'moment'
|
||||
import { mapGetters } from 'vuex';
|
||||
import moment from 'moment';
|
||||
|
||||
export default {
|
||||
props: {
|
||||
subtasks: {
|
||||
type: Array,
|
||||
required: true
|
||||
}
|
||||
},
|
||||
props: {
|
||||
subtasks: {
|
||||
type: Array,
|
||||
required: true,
|
||||
},
|
||||
},
|
||||
|
||||
data() {
|
||||
return {
|
||||
eye,
|
||||
bin,
|
||||
office365,
|
||||
checkmarkDouble,
|
||||
loadingSubtask: {}
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
eye,
|
||||
bin,
|
||||
office365,
|
||||
checkmarkDouble,
|
||||
loadingSubtask: {},
|
||||
};
|
||||
},
|
||||
|
||||
computed: {
|
||||
...mapGetters('tm', ['mastertasks'])
|
||||
},
|
||||
computed: {
|
||||
...mapGetters('tm', ['mastertasks']),
|
||||
},
|
||||
|
||||
methods: {
|
||||
editTask(subtask, editMode = false) {
|
||||
this.$events.emit('show-subtask-modal', {subtask, editMode})
|
||||
},
|
||||
methods: {
|
||||
editTask(subtask, editMode = false) {
|
||||
this.$events.emit('show-subtask-modal', { subtask, editMode });
|
||||
},
|
||||
|
||||
async handleCompleteTask(subtask) {
|
||||
const areAllTimeBlocksFinished = subtask.timeblocks.every(tb => tb.is_finished)
|
||||
async handleCompleteTask(subtask) {
|
||||
const areAllTimeBlocksFinished = subtask.timeblocks.every(
|
||||
(tb) => tb.is_finished,
|
||||
);
|
||||
|
||||
if (!areAllTimeBlocksFinished) {
|
||||
this.$events.emit('show-unable-to-complete-task-modal', { subtask })
|
||||
} else {
|
||||
await this._finishSubtask(subtask)
|
||||
}
|
||||
},
|
||||
if (!areAllTimeBlocksFinished) {
|
||||
this.$events.emit('show-unable-to-complete-task-modal', { subtask });
|
||||
} else {
|
||||
await this._finishSubtask(subtask);
|
||||
}
|
||||
},
|
||||
|
||||
deleteTask(subtask) {
|
||||
if (subtask.type == 'office365')
|
||||
return this.$events.emit('show-unable-to-edit-office-task-modal', { mode: 'delete' })
|
||||
deleteTask(subtask) {
|
||||
if (subtask.type == 'office365')
|
||||
return this.$events.emit('show-unable-to-edit-office-task-modal', {
|
||||
mode: 'delete',
|
||||
});
|
||||
|
||||
this.$events.emit('show-delete-task-modal', {subtask})
|
||||
},
|
||||
this.$events.emit('show-delete-task-modal', { subtask });
|
||||
},
|
||||
|
||||
getDeadline(subtask) {
|
||||
if (subtask?.deadline)
|
||||
return moment(subtask.deadline).format('DD.MM.yyyy')
|
||||
getDeadline(subtask) {
|
||||
if (subtask?.deadline)
|
||||
return moment(subtask.deadline).format('DD.MM.yyyy');
|
||||
|
||||
return moment(subtask.master_task_deadline).format('DD.MM.yyyy')
|
||||
},
|
||||
return moment(subtask.master_task_deadline).format('DD.MM.yyyy');
|
||||
},
|
||||
|
||||
getSelectedTimeblockDeadline(timeblocks) {
|
||||
const currentDate = moment()
|
||||
getSelectedTimeblockDeadline(timeblocks) {
|
||||
const currentDate = moment();
|
||||
|
||||
const unfinishedTimeblocks = timeblocks.filter(tb => tb.is_finished === 0)
|
||||
if (unfinishedTimeblocks.length > 0) return moment(unfinishedTimeblocks[0].end).format('DD.MM.yyyy, HH:mm')
|
||||
const unfinishedTimeblocks = timeblocks.filter(
|
||||
(tb) => tb.is_finished === 0,
|
||||
);
|
||||
if (unfinishedTimeblocks.length > 0)
|
||||
return moment(unfinishedTimeblocks[0].end).format('DD.MM.yyyy, HH:mm');
|
||||
|
||||
const upcomingTimeblocks = timeblocks
|
||||
.filter(tb => moment(tb.end).isAfter(currentDate))
|
||||
.sort((a, b) => moment(a.end).diff(moment(b.end)))
|
||||
const upcomingTimeblocks = timeblocks
|
||||
.filter((tb) => moment(tb.end).isAfter(currentDate))
|
||||
.sort((a, b) => moment(a.end).diff(moment(b.end)));
|
||||
|
||||
if (upcomingTimeblocks.length > 0 && upcomingTimeblocks.is_finished === 0) return moment(upcomingTimeblocks[0].end).format('DD.MM.yyyy, HH:mm')
|
||||
if (upcomingTimeblocks.length > 0 && upcomingTimeblocks.is_finished === 0)
|
||||
return moment(upcomingTimeblocks[0].end).format('DD.MM.yyyy, HH:mm');
|
||||
|
||||
return ''
|
||||
},
|
||||
return '';
|
||||
},
|
||||
|
||||
displayTimeblock(subtask) {
|
||||
const timeblockDeadline = this.getSelectedTimeblockDeadline(subtask.timeblocks)
|
||||
displayTimeblock(subtask) {
|
||||
const timeblockDeadline = this.getSelectedTimeblockDeadline(
|
||||
subtask.timeblocks,
|
||||
);
|
||||
|
||||
return timeblockDeadline !== '' ? timeblockDeadline : 'Žiadny termín'
|
||||
},
|
||||
return timeblockDeadline !== '' ? timeblockDeadline : 'Žiadny termín';
|
||||
},
|
||||
|
||||
async _finishSubtask(subtask) {
|
||||
const tempSubtask = {...subtask, is_finished: 1, timesheets: subtask?.timesheets.map((timesheet) => {
|
||||
delete timesheet.employee_name
|
||||
return timesheet
|
||||
}) || []}
|
||||
async _finishSubtask(subtask) {
|
||||
const timesheets =
|
||||
subtask?.timesheets.map((timesheet) => {
|
||||
delete timesheet.employee_name;
|
||||
return timesheet;
|
||||
}) || [];
|
||||
|
||||
try {
|
||||
this.loadingSubtask[subtask.id] = true
|
||||
await this.$axios.put_auth(`v1/subtasks/${tempSubtask.id}`, tempSubtask)
|
||||
// Convert timeblocks from internal format to BE format
|
||||
const timeblocks = (subtask.timeblocks || [])
|
||||
.filter((timeblock) => {
|
||||
// Filter timeblocks that have either old format (date) or new format (start)
|
||||
return timeblock.date || timeblock.start;
|
||||
})
|
||||
.map((timeblock) => {
|
||||
// If already in BE format (has start field), return as is
|
||||
if (timeblock.start && !timeblock.date) {
|
||||
return {
|
||||
id: timeblock.id || null,
|
||||
start: timeblock.start,
|
||||
end: timeblock.end,
|
||||
is_finished: timeblock.is_finished || 0,
|
||||
};
|
||||
}
|
||||
|
||||
this.$store.dispatch('tm/removeOngoingSubtask', subtask.id)
|
||||
this.$events.emit('on-subtask-edited', subtask)
|
||||
} catch (error) {
|
||||
this.$toast.error(error.message || error)
|
||||
// Convert from internal format to BE format
|
||||
const dateStr = moment(timeblock.date).format('YYYY-MM-DD');
|
||||
return {
|
||||
id: timeblock.id || null,
|
||||
start: `${dateStr} ${timeblock.starts_at_time}:00`,
|
||||
end: `${dateStr} ${timeblock.ends_at_time}:00`,
|
||||
is_finished: timeblock.is_finished || 0,
|
||||
};
|
||||
});
|
||||
|
||||
if (process.env.NODE_ENV === 'development')
|
||||
console.log('[a-ongoing-table.vue] Error: ', error)
|
||||
} finally {
|
||||
this.loadingSubtask[subtask.id] = false
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
const tempSubtask = {
|
||||
...subtask,
|
||||
is_finished: 1,
|
||||
timesheets,
|
||||
timeblocks,
|
||||
};
|
||||
|
||||
try {
|
||||
this.loadingSubtask[subtask.id] = true;
|
||||
await this.$axios.put_auth(
|
||||
`v1/subtasks/${tempSubtask.id}`,
|
||||
tempSubtask,
|
||||
);
|
||||
|
||||
this.$store.dispatch('tm/removeOngoingSubtask', subtask.id);
|
||||
this.$events.emit('on-subtask-edited', subtask);
|
||||
} catch (error) {
|
||||
this.$toast.error(error.message || error);
|
||||
|
||||
if (process.env.NODE_ENV === 'development')
|
||||
console.log('[a-ongoing-table.vue] Error: ', error);
|
||||
} finally {
|
||||
this.loadingSubtask[subtask.id] = false;
|
||||
}
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="sass" scoped>
|
||||
|
||||
Reference in new issue
Block a user