Update dependencies and fix code issues

This commit is contained in:
Eko Haryadi
2024-02-20 18:44:11 +07:00
parent 2758481259
commit a0ccf13466
65 changed files with 3454 additions and 2271 deletions

3351
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -27,6 +27,7 @@
"@vue/apollo-components": "^4.0.0", "@vue/apollo-components": "^4.0.0",
"@vue/apollo-composable": "^4.0.1", "@vue/apollo-composable": "^4.0.1",
"@vue/apollo-option": "^4.0.0", "@vue/apollo-option": "^4.0.0",
"@vueform/multiselect": "^2.6.6",
"axios": "^1.6.7", "axios": "^1.6.7",
"devextreme": "23.1.5", "devextreme": "23.1.5",
"devextreme-vue": "23.1.5", "devextreme-vue": "23.1.5",

View File

@ -1,5 +1,5 @@
/* /*
! tailwindcss v3.3.3 | MIT License | https://tailwindcss.com ! tailwindcss v3.4.1 | MIT License | https://tailwindcss.com
*/ */
/* /*
@ -32,9 +32,11 @@
4. Use the user's configured `sans` font-family by default. 4. Use the user's configured `sans` font-family by default.
5. Use the user's configured `sans` font-feature-settings by default. 5. Use the user's configured `sans` font-feature-settings by default.
6. Use the user's configured `sans` font-variation-settings by default. 6. Use the user's configured `sans` font-variation-settings by default.
7. Disable tap highlights on iOS
*/ */
html { html,
:host {
line-height: 1.5; line-height: 1.5;
/* 1 */ /* 1 */
-webkit-text-size-adjust: 100%; -webkit-text-size-adjust: 100%;
@ -50,6 +52,8 @@ html {
/* 5 */ /* 5 */
font-variation-settings: normal; font-variation-settings: normal;
/* 6 */ /* 6 */
-webkit-tap-highlight-color: transparent;
/* 7 */
} }
/* /*
@ -121,8 +125,10 @@ strong {
} }
/* /*
1. Use the user's configured `mono` font family by default. 1. Use the user's configured `mono` font-family by default.
2. Correct the odd `em` font sizing in all browsers. 2. Use the user's configured `mono` font-feature-settings by default.
3. Use the user's configured `mono` font-variation-settings by default.
4. Correct the odd `em` font sizing in all browsers.
*/ */
code, code,
@ -131,8 +137,12 @@ samp,
pre { pre {
font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
/* 1 */ /* 1 */
font-size: 1em; font-feature-settings: normal;
/* 2 */ /* 2 */
font-variation-settings: normal;
/* 3 */
font-size: 1em;
/* 4 */
} }
/* /*
@ -567,10 +577,26 @@ select {
background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M12.207 4.793a1 1 0 010 1.414l-5 5a1 1 0 01-1.414 0l-2-2a1 1 0 011.414-1.414L6.5 9.086l4.293-4.293a1 1 0 011.414 0z'/%3e%3c/svg%3e"); background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M12.207 4.793a1 1 0 010 1.414l-5 5a1 1 0 01-1.414 0l-2-2a1 1 0 011.414-1.414L6.5 9.086l4.293-4.293a1 1 0 011.414 0z'/%3e%3c/svg%3e");
} }
@media (forced-colors: active) {
[type='checkbox']:checked {
-webkit-appearance: auto;
-moz-appearance: auto;
appearance: auto;
}
}
[type='radio']:checked { [type='radio']:checked {
background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3ccircle cx='8' cy='8' r='3'/%3e%3c/svg%3e"); background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3ccircle cx='8' cy='8' r='3'/%3e%3c/svg%3e");
} }
@media (forced-colors: active) {
[type='radio']:checked {
-webkit-appearance: auto;
-moz-appearance: auto;
appearance: auto;
}
}
[type='checkbox']:checked:hover,[type='checkbox']:checked:focus,[type='radio']:checked:hover,[type='radio']:checked:focus { [type='checkbox']:checked:hover,[type='checkbox']:checked:focus,[type='radio']:checked:hover,[type='radio']:checked:focus {
border-color: transparent; border-color: transparent;
background-color: currentColor; background-color: currentColor;
@ -585,6 +611,14 @@ select {
background-repeat: no-repeat; background-repeat: no-repeat;
} }
@media (forced-colors: active) {
[type='checkbox']:indeterminate {
-webkit-appearance: auto;
-moz-appearance: auto;
appearance: auto;
}
}
[type='checkbox']:indeterminate:hover,[type='checkbox']:indeterminate:focus { [type='checkbox']:indeterminate:hover,[type='checkbox']:indeterminate:focus {
border-color: transparent; border-color: transparent;
background-color: currentColor; background-color: currentColor;
@ -705,6 +739,40 @@ select {
--tw-backdrop-sepia: ; --tw-backdrop-sepia: ;
} }
.container {
width: 100%;
}
@media (min-width: 640px) {
.container {
max-width: 640px;
}
}
@media (min-width: 768px) {
.container {
max-width: 768px;
}
}
@media (min-width: 1024px) {
.container {
max-width: 1024px;
}
}
@media (min-width: 1280px) {
.container {
max-width: 1280px;
}
}
@media (min-width: 1536px) {
.container {
max-width: 1536px;
}
}
html { html {
height: 100%; height: 100%;
--tw-bg-opacity: 1; --tw-bg-opacity: 1;
@ -883,6 +951,10 @@ body {
visibility: visible; visibility: visible;
} }
.invisible {
visibility: hidden;
}
.static { .static {
position: static; position: static;
} }
@ -912,14 +984,30 @@ body {
bottom: 0px; bottom: 0px;
} }
.-bottom-px {
bottom: -1px;
}
.-left-2 { .-left-2 {
left: -0.5rem; left: -0.5rem;
} }
.-left-px {
left: -1px;
}
.-right-px {
right: -1px;
}
.bottom-0 { .bottom-0 {
bottom: 0px; bottom: 0px;
} }
.bottom-auto {
bottom: auto;
}
.left-0 { .left-0 {
left: 0px; left: 0px;
} }
@ -960,6 +1048,10 @@ body {
top: 100%; top: 100%;
} }
.top-px {
top: 1px;
}
.z-10 { .z-10 {
z-index: 10; z-index: 10;
} }
@ -984,6 +1076,37 @@ body {
grid-column: span 7 / span 7; grid-column: span 7 / span 7;
} }
.-m-px {
margin: -1px;
}
.m-0 {
margin: 0px;
}
.m-3 {
margin: 0.75rem;
}
.m-3\.5 {
margin: 0.875rem;
}
.mx-0 {
margin-left: 0px;
margin-right: 0px;
}
.mx-0\.5 {
margin-left: 0.125rem;
margin-right: 0.125rem;
}
.mx-1 {
margin-left: 0.25rem;
margin-right: 0.25rem;
}
.mx-2 { .mx-2 {
margin-left: 0.5rem; margin-left: 0.5rem;
margin-right: 0.5rem; margin-right: 0.5rem;
@ -1017,6 +1140,14 @@ body {
margin-right: -3rem; margin-right: -3rem;
} }
.-mt-px {
margin-top: -1px;
}
.mb-1 {
margin-bottom: 0.25rem;
}
.mb-2 { .mb-2 {
margin-bottom: 0.5rem; margin-bottom: 0.5rem;
} }
@ -1065,6 +1196,14 @@ body {
margin-right: 0.5rem; margin-right: 0.5rem;
} }
.mr-3 {
margin-right: 0.75rem;
}
.mr-3\.5 {
margin-right: 0.875rem;
}
.mt-0 { .mt-0 {
margin-top: 0px; margin-top: 0px;
} }
@ -1109,6 +1248,14 @@ body {
margin-top: 1.5rem; margin-top: 1.5rem;
} }
.box-border {
box-sizing: border-box;
}
.box-content {
box-sizing: content-box;
}
.line-clamp-1 { .line-clamp-1 {
overflow: hidden; overflow: hidden;
display: -webkit-box; display: -webkit-box;
@ -1160,6 +1307,10 @@ body {
height: 4rem; height: 4rem;
} }
.h-3 {
height: 0.75rem;
}
.h-4 { .h-4 {
height: 1rem; height: 1rem;
} }
@ -1213,6 +1364,10 @@ body {
height: 100%; height: 100%;
} }
.h-px {
height: 1px;
}
.h-screen-80 { .h-screen-80 {
height: 80vh; height: 80vh;
} }
@ -1265,6 +1420,18 @@ body {
width: 4rem; width: 4rem;
} }
.w-2 {
width: 0.5rem;
}
.w-2\.5 {
width: 0.625rem;
}
.w-3 {
width: 0.75rem;
}
.w-4 { .w-4 {
width: 1rem; width: 1rem;
} }
@ -1313,6 +1480,14 @@ body {
width: 100%; width: 100%;
} }
.w-px {
width: 1px;
}
.min-w-0 {
min-width: 0px;
}
.max-w-2xl { .max-w-2xl {
max-width: 42rem; max-width: 42rem;
} }
@ -1321,6 +1496,10 @@ body {
max-width: 80rem; max-width: 80rem;
} }
.max-w-full {
max-width: 100%;
}
.max-w-sm { .max-w-sm {
max-width: 24rem; max-width: 24rem;
} }
@ -1337,6 +1516,10 @@ body {
flex: none; flex: none;
} }
.flex-shrink {
flex-shrink: 1;
}
.flex-shrink-0 { .flex-shrink-0 {
flex-shrink: 0; flex-shrink: 0;
} }
@ -1349,6 +1532,10 @@ body {
flex-grow: 1; flex-grow: 1;
} }
.flex-grow-0 {
flex-grow: 0;
}
.grow { .grow {
flex-grow: 1; flex-grow: 1;
} }
@ -1367,6 +1554,11 @@ body {
transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
} }
.-translate-y-full {
--tw-translate-y: -100%;
transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
}
.translate-x-0 { .translate-x-0 {
--tw-translate-x: 0px; --tw-translate-x: 0px;
transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
@ -1392,6 +1584,11 @@ body {
transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
} }
.translate-y-full {
--tw-translate-y: 100%;
transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
}
.rotate-180 { .rotate-180 {
--tw-rotate: 180deg; --tw-rotate: 180deg;
transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
@ -1427,6 +1624,10 @@ body {
cursor: default; cursor: default;
} }
.cursor-not-allowed {
cursor: not-allowed;
}
.cursor-pointer { .cursor-pointer {
cursor: pointer; cursor: pointer;
} }
@ -1442,6 +1643,16 @@ body {
scroll-padding-bottom: 0.5rem; scroll-padding-bottom: 0.5rem;
} }
.list-none {
list-style-type: none;
}
.appearance-none {
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
}
.auto-cols-auto { .auto-cols-auto {
grid-auto-columns: auto; grid-auto-columns: auto;
} }
@ -1502,10 +1713,6 @@ body {
gap: 0.25rem; gap: 0.25rem;
} }
.gap-2 {
gap: 0.5rem;
}
.gap-3 { .gap-3 {
gap: 0.75rem; gap: 0.75rem;
} }
@ -1605,12 +1812,24 @@ body {
overflow-y: auto; overflow-y: auto;
} }
.overflow-y-scroll {
overflow-y: scroll;
}
.truncate { .truncate {
overflow: hidden; overflow: hidden;
text-overflow: ellipsis; text-overflow: ellipsis;
white-space: nowrap; white-space: nowrap;
} }
.overflow-ellipsis {
text-overflow: ellipsis;
}
.whitespace-normal {
white-space: normal;
}
.whitespace-nowrap { .whitespace-nowrap {
white-space: nowrap; white-space: nowrap;
} }
@ -1619,6 +1838,10 @@ body {
white-space: pre-wrap; white-space: pre-wrap;
} }
.break-all {
word-break: break-all;
}
.rounded { .rounded {
border-radius: 0.25rem; border-radius: 0.25rem;
} }
@ -1639,15 +1862,29 @@ body {
border-radius: 0.375rem; border-radius: 0.375rem;
} }
.rounded-sm {
border-radius: 0.125rem;
}
.rounded-xl { .rounded-xl {
border-radius: 0.75rem; border-radius: 0.75rem;
} }
.rounded-b {
border-bottom-right-radius: 0.25rem;
border-bottom-left-radius: 0.25rem;
}
.rounded-b-2xl { .rounded-b-2xl {
border-bottom-right-radius: 1rem; border-bottom-right-radius: 1rem;
border-bottom-left-radius: 1rem; border-bottom-left-radius: 1rem;
} }
.rounded-b-none {
border-bottom-right-radius: 0px;
border-bottom-left-radius: 0px;
}
.rounded-l-full { .rounded-l-full {
border-top-left-radius: 9999px; border-top-left-radius: 9999px;
border-bottom-left-radius: 9999px; border-bottom-left-radius: 9999px;
@ -1658,11 +1895,21 @@ body {
border-bottom-right-radius: 9999px; border-bottom-right-radius: 9999px;
} }
.rounded-t {
border-top-left-radius: 0.25rem;
border-top-right-radius: 0.25rem;
}
.rounded-t-2xl { .rounded-t-2xl {
border-top-left-radius: 1rem; border-top-left-radius: 1rem;
border-top-right-radius: 1rem; border-top-right-radius: 1rem;
} }
.rounded-t-none {
border-top-left-radius: 0px;
border-top-right-radius: 0px;
}
.border { .border {
border-width: 1px; border-width: 1px;
} }
@ -1723,11 +1970,6 @@ body {
background-color: rgb(0 0 0 / var(--tw-bg-opacity)); background-color: rgb(0 0 0 / var(--tw-bg-opacity));
} }
.bg-blue-50 {
--tw-bg-opacity: 1;
background-color: rgb(239 246 255 / var(--tw-bg-opacity));
}
.bg-gray-100 { .bg-gray-100 {
--tw-bg-opacity: 1; --tw-bg-opacity: 1;
background-color: rgb(243 244 246 / var(--tw-bg-opacity)); background-color: rgb(243 244 246 / var(--tw-bg-opacity));
@ -1738,6 +1980,11 @@ body {
background-color: rgb(229 231 235 / var(--tw-bg-opacity)); background-color: rgb(229 231 235 / var(--tw-bg-opacity));
} }
.bg-gray-300 {
--tw-bg-opacity: 1;
background-color: rgb(209 213 219 / var(--tw-bg-opacity));
}
.bg-gray-50 { .bg-gray-50 {
--tw-bg-opacity: 1; --tw-bg-opacity: 1;
background-color: rgb(249 250 251 / var(--tw-bg-opacity)); background-color: rgb(249 250 251 / var(--tw-bg-opacity));
@ -1758,6 +2005,16 @@ body {
background-color: rgb(17 24 39 / var(--tw-bg-opacity)); background-color: rgb(17 24 39 / var(--tw-bg-opacity));
} }
.bg-green-500 {
--tw-bg-opacity: 1;
background-color: rgb(34 197 94 / var(--tw-bg-opacity));
}
.bg-green-600 {
--tw-bg-opacity: 1;
background-color: rgb(22 163 74 / var(--tw-bg-opacity));
}
.bg-indigo-600 { .bg-indigo-600 {
--tw-bg-opacity: 1; --tw-bg-opacity: 1;
background-color: rgb(79 70 229 / var(--tw-bg-opacity)); background-color: rgb(79 70 229 / var(--tw-bg-opacity));
@ -1808,6 +2065,10 @@ body {
background-color: rgb(13 148 136 / var(--tw-bg-opacity)); background-color: rgb(13 148 136 / var(--tw-bg-opacity));
} }
.bg-transparent {
background-color: transparent;
}
.bg-vtd-primary-100 { .bg-vtd-primary-100 {
--tw-bg-opacity: 1; --tw-bg-opacity: 1;
background-color: rgb(205 222 227 / var(--tw-bg-opacity)); background-color: rgb(205 222 227 / var(--tw-bg-opacity));
@ -1850,6 +2111,10 @@ body {
--tw-bg-opacity: 0.05; --tw-bg-opacity: 0.05;
} }
.bg-opacity-50 {
--tw-bg-opacity: 0.5;
}
.bg-opacity-60 { .bg-opacity-60 {
--tw-bg-opacity: 0.6; --tw-bg-opacity: 0.6;
} }
@ -1862,10 +2127,30 @@ body {
--tw-bg-opacity: 0.8; --tw-bg-opacity: 0.8;
} }
.bg-multiselect-caret {
background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 320 512' fill='currentColor' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M31.3 192h257.3c17.8 0 26.7 21.5 14.1 34.1L174.1 354.8c-7.8 7.8-20.5 7.8-28.3 0L17.2 226.1C4.6 213.5 13.5 192 31.3 192z'%3e%3c/path%3e%3c/svg%3e");
}
.bg-multiselect-remove {
background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 320 512' fill='currentColor' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M207.6 256l107.72-107.72c6.23-6.23 6.23-16.34 0-22.58l-25.03-25.03c-6.23-6.23-16.34-6.23-22.58 0L160 208.4 52.28 100.68c-6.23-6.23-16.34-6.23-22.58 0L4.68 125.7c-6.23 6.23-6.23 16.34 0 22.58L112.4 256 4.68 363.72c-6.23 6.23-6.23 16.34 0 22.58l25.03 25.03c6.23 6.23 16.34 6.23 22.58 0L160 303.6l107.72 107.72c6.23 6.23 16.34 6.23 22.58 0l25.03-25.03c6.23-6.23 6.23-16.34 0-22.58L207.6 256z'%3e%3c/path%3e%3c/svg%3e");
}
.bg-multiselect-spinner {
background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 512 512' fill='%2322c55e' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M456.433 371.72l-27.79-16.045c-7.192-4.152-10.052-13.136-6.487-20.636 25.82-54.328 23.566-118.602-6.768-171.03-30.265-52.529-84.802-86.621-144.76-91.424C262.35 71.922 256 64.953 256 56.649V24.56c0-9.31 7.916-16.609 17.204-15.96 81.795 5.717 156.412 51.902 197.611 123.408 41.301 71.385 43.99 159.096 8.042 232.792-4.082 8.369-14.361 11.575-22.424 6.92z'%3e%3c/path%3e%3c/svg%3e");
}
.bg-none { .bg-none {
background-image: none; background-image: none;
} }
.bg-center {
background-position: center;
}
.bg-no-repeat {
background-repeat: no-repeat;
}
.fill-gray-500 { .fill-gray-500 {
fill: #6b7280; fill: #6b7280;
} }
@ -1907,10 +2192,6 @@ body {
padding: 0px; padding: 0px;
} }
.p-0\.5 {
padding: 0.125rem;
}
.p-1 { .p-1 {
padding: 0.25rem; padding: 0.25rem;
} }
@ -1977,6 +2258,11 @@ body {
padding-bottom: 0px; padding-bottom: 0px;
} }
.py-0\.5 {
padding-top: 0.125rem;
padding-bottom: 0.125rem;
}
.py-1 { .py-1 {
padding-top: 0.25rem; padding-top: 0.25rem;
padding-bottom: 0.25rem; padding-bottom: 0.25rem;
@ -2022,6 +2308,16 @@ body {
padding-bottom: 1.5rem; padding-bottom: 1.5rem;
} }
.py-\[5px\] {
padding-top: 5px;
padding-bottom: 5px;
}
.py-px {
padding-top: 1px;
padding-bottom: 1px;
}
.pb-4 { .pb-4 {
padding-bottom: 1rem; padding-bottom: 1rem;
} }
@ -2046,6 +2342,10 @@ body {
padding-left: 0.75rem; padding-left: 0.75rem;
} }
.pl-3\.5 {
padding-left: 0.875rem;
}
.pr-10 { .pr-10 {
padding-right: 2.5rem; padding-right: 2.5rem;
} }
@ -2054,10 +2354,22 @@ body {
padding-right: 3rem; padding-right: 3rem;
} }
.pr-16 {
padding-right: 4rem;
}
.pr-2 { .pr-2 {
padding-right: 0.5rem; padding-right: 0.5rem;
} }
.pr-3 {
padding-right: 0.75rem;
}
.pr-3\.5 {
padding-right: 0.875rem;
}
.pr-4 { .pr-4 {
padding-right: 1rem; padding-right: 1rem;
} }
@ -2098,6 +2410,10 @@ body {
text-align: start; text-align: start;
} }
.font-sans {
font-family: Plus Jakarta Sans, sans-serif;
}
.text-2xl { .text-2xl {
font-size: 1.5rem; font-size: 1.5rem;
line-height: 2rem; line-height: 2rem;
@ -2186,10 +2502,18 @@ body {
line-height: 1; line-height: 1;
} }
.leading-normal {
line-height: 1.5;
}
.leading-relaxed { .leading-relaxed {
line-height: 1.625; line-height: 1.625;
} }
.leading-snug {
line-height: 1.375;
}
.tracking-tight { .tracking-tight {
letter-spacing: -0.025em; letter-spacing: -0.025em;
} }
@ -2208,11 +2532,6 @@ body {
color: rgb(96 165 250 / var(--tw-text-opacity)); color: rgb(96 165 250 / var(--tw-text-opacity));
} }
.text-blue-700 {
--tw-text-opacity: 1;
color: rgb(29 78 216 / var(--tw-text-opacity));
}
.text-dark { .text-dark {
--tw-text-opacity: 1; --tw-text-opacity: 1;
color: rgb(21 22 23 / var(--tw-text-opacity)); color: rgb(21 22 23 / var(--tw-text-opacity));
@ -2258,6 +2577,11 @@ body {
color: rgb(17 24 39 / var(--tw-text-opacity)); color: rgb(17 24 39 / var(--tw-text-opacity));
} }
.text-green-100 {
--tw-text-opacity: 1;
color: rgb(220 252 231 / var(--tw-text-opacity));
}
.text-green-400 { .text-green-400 {
--tw-text-opacity: 1; --tw-text-opacity: 1;
color: rgb(74 222 128 / var(--tw-text-opacity)); color: rgb(74 222 128 / var(--tw-text-opacity));
@ -2323,6 +2647,10 @@ body {
color: rgb(13 148 136 / var(--tw-text-opacity)); color: rgb(13 148 136 / var(--tw-text-opacity));
} }
.text-transparent {
color: transparent;
}
.text-vtd-primary-500 { .text-vtd-primary-500 {
--tw-text-opacity: 1; --tw-text-opacity: 1;
color: rgb(3 91 113 / var(--tw-text-opacity)); color: rgb(3 91 113 / var(--tw-text-opacity));
@ -2385,6 +2713,10 @@ body {
opacity: 0.75; opacity: 0.75;
} }
.opacity-90 {
opacity: 0.9;
}
.shadow { .shadow {
--tw-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1); --tw-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);
--tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color); --tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);
@ -2426,6 +2758,11 @@ body {
--tw-shadow: var(--tw-shadow-colored); --tw-shadow: var(--tw-shadow-colored);
} }
.outline-none {
outline: 2px solid transparent;
outline-offset: 2px;
}
.outline { .outline {
outline-style: solid; outline-style: solid;
} }
@ -2455,10 +2792,6 @@ body {
--tw-ring-color: rgb(0 0 0 / var(--tw-ring-opacity)); --tw-ring-color: rgb(0 0 0 / var(--tw-ring-opacity));
} }
.ring-blue-700\/10 {
--tw-ring-color: rgb(29 78 216 / 0.1);
}
.ring-gray-300 { .ring-gray-300 {
--tw-ring-opacity: 1; --tw-ring-opacity: 1;
--tw-ring-color: rgb(209 213 219 / var(--tw-ring-opacity)); --tw-ring-color: rgb(209 213 219 / var(--tw-ring-opacity));
@ -2584,6 +2917,11 @@ body {
border-color: rgb(3 91 113 / var(--tw-border-opacity)); border-color: rgb(3 91 113 / var(--tw-border-opacity));
} }
.hover\:bg-black:hover {
--tw-bg-opacity: 1;
background-color: rgb(0 0 0 / var(--tw-bg-opacity));
}
.hover\:bg-gray-50:hover { .hover\:bg-gray-50:hover {
--tw-bg-opacity: 1; --tw-bg-opacity: 1;
background-color: rgb(249 250 251 / var(--tw-bg-opacity)); background-color: rgb(249 250 251 / var(--tw-bg-opacity));
@ -2629,6 +2967,10 @@ body {
background-color: rgb(255 255 0 / var(--tw-bg-opacity)); background-color: rgb(255 255 0 / var(--tw-bg-opacity));
} }
.hover\:bg-opacity-10:hover {
--tw-bg-opacity: 0.1;
}
.hover\:text-primary-500:hover { .hover\:text-primary-500:hover {
--tw-text-opacity: 1; --tw-text-opacity: 1;
color: rgb(3 91 113 / var(--tw-text-opacity)); color: rgb(3 91 113 / var(--tw-text-opacity));
@ -2639,6 +2981,10 @@ body {
color: rgb(2 73 90 / var(--tw-text-opacity)); color: rgb(2 73 90 / var(--tw-text-opacity));
} }
.hover\:opacity-80:hover {
opacity: 0.8;
}
.focus\:border-0:focus { .focus\:border-0:focus {
border-width: 0px; border-width: 0px;
} }
@ -2835,53 +3181,15 @@ body {
color: rgb(255 255 255 / var(--tw-text-opacity)); color: rgb(255 255 255 / var(--tw-text-opacity));
} }
.group:hover .group-hover\:opacity-60 {
opacity: 0.6;
}
.peer:checked ~ .peer-checked\:text-primary-500 { .peer:checked ~ .peer-checked\:text-primary-500 {
--tw-text-opacity: 1; --tw-text-opacity: 1;
color: rgb(3 91 113 / var(--tw-text-opacity)); color: rgb(3 91 113 / var(--tw-text-opacity));
} }
@media (prefers-color-scheme: dark) {
.dark\:bg-opacity-50 {
--tw-bg-opacity: 0.5;
}
.dark\:text-vtd-primary-400 {
--tw-text-opacity: 1;
color: rgb(53 124 141 / var(--tw-text-opacity));
}
.dark\:text-opacity-70 {
--tw-text-opacity: 0.7;
}
.dark\:hover\:text-vtd-primary-300:hover {
--tw-text-opacity: 1;
color: rgb(104 157 170 / var(--tw-text-opacity));
}
.dark\:focus\:border-vtd-primary-500:focus {
--tw-border-opacity: 1;
border-color: rgb(3 91 113 / var(--tw-border-opacity));
}
.dark\:focus\:bg-opacity-50:focus {
--tw-bg-opacity: 0.5;
}
.dark\:focus\:text-vtd-primary-300:focus {
--tw-text-opacity: 1;
color: rgb(104 157 170 / var(--tw-text-opacity));
}
.dark\:focus\:ring-opacity-20:focus {
--tw-ring-opacity: 0.2;
}
.dark\:focus\:ring-opacity-25:focus {
--tw-ring-opacity: 0.25;
}
}
@media (min-width: 640px) { @media (min-width: 640px) {
.sm\:static { .sm\:static {
position: static; position: static;
@ -3378,3 +3686,105 @@ body {
line-height: 1.25rem; line-height: 1.25rem;
} }
} }
.rtl\:left-auto:where([dir="rtl"], [dir="rtl"] *) {
left: auto;
}
.rtl\:right-0:where([dir="rtl"], [dir="rtl"] *) {
right: 0px;
}
.rtl\:ml-1:where([dir="rtl"], [dir="rtl"] *) {
margin-left: 0.25rem;
}
.rtl\:ml-3:where([dir="rtl"], [dir="rtl"] *) {
margin-left: 0.75rem;
}
.rtl\:ml-3\.5:where([dir="rtl"], [dir="rtl"] *) {
margin-left: 0.875rem;
}
.rtl\:mr-0:where([dir="rtl"], [dir="rtl"] *) {
margin-right: 0px;
}
.rtl\:pl-0:where([dir="rtl"], [dir="rtl"] *) {
padding-left: 0px;
}
.rtl\:pl-2:where([dir="rtl"], [dir="rtl"] *) {
padding-left: 0.5rem;
}
.rtl\:pl-3:where([dir="rtl"], [dir="rtl"] *) {
padding-left: 0.75rem;
}
.rtl\:pl-3\.5:where([dir="rtl"], [dir="rtl"] *) {
padding-left: 0.875rem;
}
.rtl\:pr-0:where([dir="rtl"], [dir="rtl"] *) {
padding-right: 0px;
}
.rtl\:pr-2:where([dir="rtl"], [dir="rtl"] *) {
padding-right: 0.5rem;
}
.rtl\:pr-3:where([dir="rtl"], [dir="rtl"] *) {
padding-right: 0.75rem;
}
.rtl\:pr-3\.5:where([dir="rtl"], [dir="rtl"] *) {
padding-right: 0.875rem;
}
.rtl\:text-right:where([dir="rtl"], [dir="rtl"] *) {
text-align: right;
}
@media (prefers-color-scheme: dark) {
.dark\:bg-opacity-50 {
--tw-bg-opacity: 0.5;
}
.dark\:text-vtd-primary-400 {
--tw-text-opacity: 1;
color: rgb(53 124 141 / var(--tw-text-opacity));
}
.dark\:text-opacity-70 {
--tw-text-opacity: 0.7;
}
.dark\:hover\:text-vtd-primary-300:hover {
--tw-text-opacity: 1;
color: rgb(104 157 170 / var(--tw-text-opacity));
}
.dark\:focus\:border-vtd-primary-500:focus {
--tw-border-opacity: 1;
border-color: rgb(3 91 113 / var(--tw-border-opacity));
}
.dark\:focus\:bg-opacity-50:focus {
--tw-bg-opacity: 0.5;
}
.dark\:focus\:text-vtd-primary-300:focus {
--tw-text-opacity: 1;
color: rgb(104 157 170 / var(--tw-text-opacity));
}
.dark\:focus\:ring-opacity-20:focus {
--tw-ring-opacity: 0.2;
}
.dark\:focus\:ring-opacity-25:focus {
--tw-ring-opacity: 0.25;
}
}

View File

@ -45,6 +45,7 @@ const buttonStyle = computed(() => {
}) })
const emit = defineEmits(['on:click']) const emit = defineEmits(['on:click'])
</script> </script>
<template> <template>

View File

@ -12,7 +12,31 @@ const formatter = ref({
}) })
const emit = defineEmits(['update:dateValue']) const emit = defineEmits(['update:dateValue'])
const customShortcuts = () => {
return [
{
label: "Last 15 Days",
atClick: () => {
const date = new Date();
return [new Date(date.setDate(date.getDate() + 1)), date];
},
},
{
label: "Last Years",
atClick: () => {
const date = new Date();
return [new Date(date.setFullYear(date.getFullYear() - 1)), new Date()];
},
},
{
label: "Last 3 Years",
atClick: () => {
const date = new Date();
return [new Date(date.setFullYear(date.getFullYear() - 3)), new Date()];
},
},
];
};
watch(dateValue, (newValue) => { watch(dateValue, (newValue) => {
emit('update:dateValue', newValue) emit('update:dateValue', newValue)
}) })
@ -24,7 +48,7 @@ watch(dateValue, (newValue) => {
v-model="dateValue" v-model="dateValue"
:formatter="formatter" :formatter="formatter"
separator=" s/d " separator=" s/d "
:shortcuts="false" :shortcuts="customShortcuts"
:auto-apply="false" :auto-apply="false"
as-single as-single
use-range use-range

View File

@ -2,19 +2,10 @@
<script setup lang="ts"> <script setup lang="ts">
// components // components
import Button from '@/components/Button.vue' import Button from '@/components/Button.vue'
import { useSearchStore } from '@/stores/filtersAction'
// icons // icons
import { PhArrowsCounterClockwise, PhFileText, PhMagnifyingGlass } from '@phosphor-icons/vue' import { PhArrowsCounterClockwise, PhFileText, PhMagnifyingGlass } from '@phosphor-icons/vue'
const cariButton = useSearchStore()
defineProps({
reportButton: {
type: Boolean,
default: false
}
})
const emit = defineEmits(['runSearch']) const emit = defineEmits(['runSearch','resetForm'])
</script> </script>
<template> <template>
@ -26,7 +17,7 @@ const emit = defineEmits(['runSearch'])
<div class="filter-footer rounded-b-2xl px-4 py-3 bg-primary-50 flex justify-end"> <div class="filter-footer rounded-b-2xl px-4 py-3 bg-primary-50 flex justify-end">
<div class="filter-buttons flex gap-3 flex-wrap"> <div class="filter-buttons flex gap-3 flex-wrap">
<Button <Button
@click="() => (cariButton.isTriggerChange = !cariButton.isTriggerChange)" @on:click="() => emit('resetForm')"
label="Ulangi" label="Ulangi"
style-type="outline" style-type="outline"
class-name="bg-white" class-name="bg-white"
@ -35,11 +26,10 @@ const emit = defineEmits(['runSearch'])
</Button> </Button>
<Button <Button
v-if="reportButton"
label="Lihat Laporan" label="Lihat Laporan"
style-type="outline" style-type="outline"
class-name="bg-white" class-name="bg-white"
> >
<PhFileText size="18" class="ml-1" weight="regular" /> <PhFileText size="18" class="ml-1" weight="regular" />
</Button> </Button>

View File

@ -10,6 +10,12 @@ import {
itemsPosko itemsPosko
} from './reference' } from './reference'
const props = defineProps({
runReset: {
type: Boolean,
required: true
}
});
import Select from '@/components/Select.vue' import Select from '@/components/Select.vue'
import DatePicker from '@/components/DatePicker.vue' import DatePicker from '@/components/DatePicker.vue'
const uidPlaceholder = 'Semua Unit Induk Distribusi/Wilayah' const uidPlaceholder = 'Semua Unit Induk Distribusi/Wilayah'
@ -17,7 +23,7 @@ const up3laceholder = 'Semua Unit Pelaksanaan Pelayanan Pelanggan'
const poskoPlaceholder = 'Semua Posko' const poskoPlaceholder = 'Semua Posko'
const up3 = ref({ id: 0, name: up3laceholder }) const up3 = ref({ id: 0, name: up3laceholder })
const uid = ref({ id: 0, name: uidPlaceholder }) const uid = ref({ id: 0, name: uidPlaceholder })
const posko = ref({ id: "", name: poskoPlaceholder }) const posko = ref({ id: 0, name: poskoPlaceholder })
const emit = defineEmits(['update:filters']) const emit = defineEmits(['update:filters'])
const data = ref({ const data = ref({
uid: uid.value, uid: uid.value,
@ -40,7 +46,7 @@ const setUid = (value: any) => {
const setUp3 = (value: any) => { const setUp3 = (value: any) => {
up3.value = value up3.value = value
selectedUp3Posko(value) selectedUp3Posko(value)
posko.value = { id: "", name: poskoPlaceholder } posko.value = { id: 0, name: poskoPlaceholder }
data.value.up3 = value data.value.up3 = value
} }
@ -49,7 +55,20 @@ const setPosko = (value: any) => {
selectedPosko(value) selectedPosko(value)
data.value.posko = value data.value.posko = value
} }
watch(() => props.runReset, (value) => {
if (value) {
uid.value = { id: 0, name: uidPlaceholder }
up3.value = { id: 0, name: up3laceholder }
posko.value = { id: 0, name: poskoPlaceholder }
data.value.periode = ''
data.value = {
uid: uid.value,
up3: up3.value,
posko: posko.value,
periode: ''
}
}
})
onMounted(() => { onMounted(() => {
emit('update:filters', data.value) emit('update:filters', data.value)
fetchUid() fetchUid()
@ -58,17 +77,13 @@ onMounted(() => {
<template> <template>
<div class="sm:grid sm:grid-cols-2 lg:grid-cols-3 sm:items-center"> <div class="sm:grid sm:grid-cols-2 lg:grid-cols-3 sm:items-center">
<label class="text-gray-800 font-semibold mb-2 sm:mb-0 block" <label class="text-gray-800 font-semibold mb-2 sm:mb-0 block">Unit Induk Distribusi/Wilayah:</label>
>Unit Induk Distribusi/Wilayah:</label
>
<Select :data="itemsUid" @update:selected="setUid($event)" :placeholder="uidPlaceholder" :selected="uid" /> <Select :data="itemsUid" @update:selected="setUid($event)" :placeholder="uidPlaceholder" :selected="uid" />
</div> </div>
<div class="sm:grid sm:grid-cols-2 lg:grid-cols-3 sm:items-center"> <div class="sm:grid sm:grid-cols-2 lg:grid-cols-3 sm:items-center">
<label class="text-gray-800 font-semibold mb-2 sm:mb-0 block" <label class="text-gray-800 font-semibold mb-2 sm:mb-0 block">Unit Pelaksanaan Pelayanan Pelanggan:</label>
>Unit Pelaksanaan Pelayanan Pelanggan:</label
>
<Select @update:selected="setUp3($event)" :data="itemsUp3" :selected="up3" :placeholder="up3laceholder" /> <Select @update:selected="setUp3($event)" :data="itemsUp3" :selected="up3" :placeholder="up3laceholder" />
</div> </div>
@ -82,8 +97,8 @@ onMounted(() => {
<div class="sm:grid sm:grid-cols-2 lg:grid-cols-3 sm:items-center"> <div class="sm:grid sm:grid-cols-2 lg:grid-cols-3 sm:items-center">
<label class="text-gray-800 font-semibold mb-2 sm:mb-0 block">Periode Tanggal:</label> <label class="text-gray-800 font-semibold mb-2 sm:mb-0 block">Periode Tanggal:</label>
<DatePicker @update:date-value="(value) => { <DatePicker @update:date-value="(value) => {
data.periode = value data.periode = value
} }
" /> " />
</div> </div>
</template> </template>

View File

@ -77,6 +77,6 @@ onMounted(() => {
<InlineRadioGroup @update:group-value="(value) => { <InlineRadioGroup @update:group-value="(value) => {
data.group = value data.group = value
console.log('data.group', value) console.log('data.group', value)
}" :radio-items="[{ id: 1, title: 'Tidak', checked: true }, { id: 2, title: 'Ya, Grupkan' }]" /> }" :radio-items="[{ id: 1, title: 'Tidak' }, { id: 2, title: 'Ya, Grupkan' }]" />
</div> </div>
</template> </template>

View File

@ -1,41 +1,63 @@
<script setup lang="ts"> <script setup lang="ts">
import Select from '@/components/Select.vue' import Select from '@/components/Select.vue'
import DatePicker from '@/components/DatePicker.vue' import DatePicker from '@/components/DatePicker.vue'
import { ref } from 'vue'; import { selectedUid, selectedUp3Posko, selectedPosko, fetchUid, itemsUid, itemsUp3, itemsPosko } from './reference';
const uidPlaceholder = 'Semua Unit Induk Distribusi/Wilayah'; import { onMounted, ref } from 'vue';
const up3Placeholder = 'Semua Unit Pelaksanaan Pelayanan Pelanggan'; const uidPlaceholder = 'Semua Distribusi/Wilayah';
const ulpPlaceholder = 'Semua Unit Layanan Pelanggan'; const up3Placeholder = 'Semua Area';
const uppp = ref({ id: 0, name: up3Placeholder }); const poskoPlaceholder = 'Semua Unit Layanan Pelanggan';
const up3 = ref({ id: 0, name: up3Placeholder });
const uid = ref({ id: 0, name: uidPlaceholder }); const uid = ref({ id: 0, name: uidPlaceholder });
const ulp = ref({ id: "", name: ulpPlaceholder }); const posko = ref({ id: 0, name: poskoPlaceholder });
const emit = defineEmits(['update:filters']) const emit = defineEmits(['update:filters'])
const data = ref({ const data = ref({
uid: uid.value, uid: uid.value,
up3: uppp.value, up3: up3.value,
posko: ulp.value, posko: posko.value,
periode: '', periode: '',
group: 1
}) })
const setUid = (value: any) => {
uid.value = value;
selectedUid(value);
up3.value = { id: 0, name: up3Placeholder };
data.value.uid = value;
};
const setUp3 = (value: any) => {
up3.value = value;
selectedUp3Posko(value);
posko.value = { id: 0, name: poskoPlaceholder };
data.value.up3 = value;
};
const setPosko = (value: any) => {
posko.value = value;
selectedPosko(value);
data.value.posko = value;
};
onMounted(() => {
emit('update:filters', data.value)
fetchUid()
})
</script> </script>
<template> <template>
<div class="sm:grid sm:grid-cols-2 lg:grid-cols-3 sm:items-center"> <div class="sm:grid sm:grid-cols-2 lg:grid-cols-3 sm:items-center">
<label class="text-gray-800 font-semibold mb-2 sm:mb-0 block">Distribusi/Wilayah:</label> <label class="text-gray-800 font-semibold mb-2 sm:mb-0 block">Distribusi/Wilayah:</label>
<Select :data="itemsUid" @update:selected="setUid($event)" :placeholder="uidPlaceholder" :selected="uid" />
<Select placeholder="Semua Distribusi/Wilayah" />
</div> </div>
<div class="sm:grid sm:grid-cols-2 lg:grid-cols-3 sm:items-center"> <div class="sm:grid sm:grid-cols-2 lg:grid-cols-3 sm:items-center">
<label class="text-gray-800 font-semibold mb-2 sm:mb-0 block">Area:</label> <label class="text-gray-800 font-semibold mb-2 sm:mb-0 block">Area:</label>
<Select @update:selected="setUp3($event)" :data="itemsUp3" :selected="up3" :placeholder="up3Placeholder" />
<Select placeholder="Semua Area" />
</div> </div>
<div class="sm:grid sm:grid-cols-2 lg:grid-cols-3 sm:items-center"> <div class="sm:grid sm:grid-cols-2 lg:grid-cols-3 sm:items-center">
<label class="text-gray-800 font-semibold mb-2 sm:mb-0 block">Posko:</label> <label class="text-gray-800 font-semibold mb-2 sm:mb-0 block">Posko:</label>
<Select @update:selected="setPosko($event)" :data="itemsPosko" :selected="posko" :placeholder="poskoPlaceholder" />
<Select placeholder="Semua Posko" />
</div> </div>
<div class="sm:grid sm:grid-cols-2 lg:grid-cols-3 sm:items-center"> <div class="sm:grid sm:grid-cols-2 lg:grid-cols-3 sm:items-center">

View File

@ -19,7 +19,7 @@ const poskoPlaceholder = 'Semua Posko'
const mediaPlaceholder = 'Semua Media' const mediaPlaceholder = 'Semua Media'
const up3 = ref({ id: 0, name: up3Placeholder }) const up3 = ref({ id: 0, name: up3Placeholder })
const uid = ref({ id: 0, name: uidPlaceholder }) const uid = ref({ id: 0, name: uidPlaceholder })
const posko = ref({ id: "", name: poskoPlaceholder }) const posko = ref({ id: 0, name: poskoPlaceholder })
const media = ref({ id: 0, name: mediaPlaceholder }) const media = ref({ id: 0, name: mediaPlaceholder })
const emit = defineEmits(['update:filters']) const emit = defineEmits(['update:filters'])
const data = ref({ const data = ref({
@ -44,7 +44,7 @@ const setUid = (value: any) => {
const setUp3 = (value: any) => { const setUp3 = (value: any) => {
up3.value = value up3.value = value
selectedUp3Posko(value) selectedUp3Posko(value)
posko.value = { id: "", name: poskoPlaceholder } posko.value = { id: 0, name: poskoPlaceholder }
data.value.up3 = value data.value.up3 = value
} }

View File

@ -1,17 +1,16 @@
<!-- <script setup lang="ts"> <script setup lang="ts">
import Select from '@/components/Select.vue' import Select from '@/components/Select.vue'
import SelectMulti from '@/components/SelectMulti.vue' import SelectMulti from '@/components/SelectMulti.vue'
import DatePicker from '@/components/DatePicker.vue' import DatePicker from '@/components/DatePicker.vue'
import { selectedUid, selectedUp3Posko, selectedPosko ,fetchUid, itemsUid,itemsUp3, itemsPosko} from './reference'; import { selectedUid, selectedUp3Posko, selectedPosko ,fetchUid, itemsUid,itemsUp3, itemsPosko} from './reference';
fetchData(); fetchUid();
const departments = [ const jenisTransakasi = [
{ id: 1, name: 'Marketing', contact: 'Durward Reynolds' }, { id: 1, value: 'Koreksi Transaksi Individual',label: 'Koreksi Transaksi Individual' },
{ id: 2, name: 'HR', contact: 'Kenton Towne' }, { id: 2, value: 'Cleansing Traksaksi TM',label: 'Cleansing Traksaksi TM', },
{ id: 3, name: 'Sales', contact: 'Therese Wunsch' }, { id: 3, value: 'Koreksi Transaksi TM',label: 'Koreksi Transaksi TM', },
{ id: 4, name: 'Finance', contact: 'Benedict Kessler' }, { id: 4, value: 'Koreksi Kode Gangguan dan Anev',label: 'Koreksi Kode Gangguan dan Anev' },
{ id: 5, name: 'Customer service', contact: 'Katelyn Rohan' },
] ]
</script> </script>
@ -38,12 +37,15 @@ const departments = [
<div class="sm:grid sm:grid-cols-2 lg:grid-cols-3 sm:items-center"> <div class="sm:grid sm:grid-cols-2 lg:grid-cols-3 sm:items-center">
<label class="text-gray-800 font-semibold mb-2 sm:mb-0 block">Jenis Transaksi:</label> <label class="text-gray-800 font-semibold mb-2 sm:mb-0 block">Jenis Transaksi:</label>
<SelectMulti :data="departments" placeholder="Semua Jenis Transaksi" /> <SelectMulti
:tags="jenisTransakasi"
placeholder="Semua Jenis Transaksi"
useLabel
label="Jenis Transaksi"
/>
</div> </div>
<div class="sm:grid sm:grid-cols-2 lg:grid-cols-3 sm:items-center"> <div class="sm:grid sm:grid-cols-2 lg:grid-cols-3 sm:items-center">
<label class="text-gray-800 font-semibold mb-2 sm:mb-0 block">Periode Tanggal:</label> <label class="text-gray-800 font-semibold mb-2 sm:mb-0 block">Periode Tanggal:</label>
<DatePicker /> <DatePicker />
</div> </div>
</template> --> </template>
<template></template>

View File

@ -38,7 +38,7 @@ const setUlp = (value: any) => {
}; };
onMounted(() => { onMounted(() => {
emit('update:filters', data.value) emit('update:filters', data.value)
fetchUid() // fetchUid()
}) })
</script> </script>

View File

@ -17,7 +17,7 @@ const uppPlaceholder = 'Semua Unit Pelaksanaan Pelayanan Pelanggan'
const poskoPlaceholder = 'Semua Posko' const poskoPlaceholder = 'Semua Posko'
const uppp = ref({ id: 0, name: uppPlaceholder }) const uppp = ref({ id: 0, name: uppPlaceholder })
const uid = ref({ id: 0, name: uidPlaceholder }) const uid = ref({ id: 0, name: uidPlaceholder })
const posko = ref({ id: "", name: poskoPlaceholder }) const posko = ref({ id: 0, name: poskoPlaceholder })
const emit = defineEmits(['update:filters']) const emit = defineEmits(['update:filters'])
const data = ref({ const data = ref({
uid: uid.value, uid: uid.value,
@ -40,7 +40,7 @@ const setUid = (value: any) => {
const setUp3 = (value: any) => { const setUp3 = (value: any) => {
uppp.value = value uppp.value = value
selectedUp3Posko(value) selectedUp3Posko(value)
posko.value = { id: "", name: poskoPlaceholder } posko.value = { id: 0, name: poskoPlaceholder }
data.value.up3 = value data.value.up3 = value
} }

View File

@ -10,7 +10,7 @@ const up3Placeholder = 'Semua Unit Pelaksanaan Pelayanan Pelanggan';
const poskoPlaceholder = 'Semua Unit Layanan Pelanggan'; const poskoPlaceholder = 'Semua Unit Layanan Pelanggan';
const up3 = ref({ id: 0, name: up3Placeholder }); const up3 = ref({ id: 0, name: up3Placeholder });
const uid = ref({ id: 0, name: uidPlaceholder }); const uid = ref({ id: 0, name: uidPlaceholder });
const posko = ref({ id: "", name: poskoPlaceholder }); const posko = ref({ id: 0, name: poskoPlaceholder });
const data = ref({ const data = ref({
uid: uid.value, uid: uid.value,
up3: up3.value, up3: up3.value,
@ -30,7 +30,7 @@ const setUid = (value: any) => {
const setUp3 = (value: any) => { const setUp3 = (value: any) => {
up3.value = value up3.value = value
selectedUp3Posko(value) selectedUp3Posko(value)
posko.value = { id: "", name: poskoPlaceholder } posko.value = { id: 0, name: poskoPlaceholder }
data.value.up3 = value data.value.up3 = value
} }

View File

@ -12,14 +12,14 @@ const up3Placeholder = 'Semua Unit Pelaksanaan Pelayanan Pelanggan';
const poskoPlaceholder = 'Semua Unit Layanan Pelanggan'; const poskoPlaceholder = 'Semua Unit Layanan Pelanggan';
const up3 = ref({ id: 0, name: up3Placeholder }); const up3 = ref({ id: 0, name: up3Placeholder });
const uid = ref({ id: 0, name: uidPlaceholder }); const uid = ref({ id: 0, name: uidPlaceholder });
const posko = ref({ id: "", name: poskoPlaceholder }); const posko = ref({ id: 0, name: poskoPlaceholder });
const data = ref({ const data = ref({
uid: uid.value, uid: uid.value,
up3: up3.value, up3: up3.value,
posko: posko.value, posko: posko.value,
periode: '', periode: '',
minTime: 1, minTime: useTotalDuration().getDataMin().split(' ')[0],
maxTime: 1 maxTime: useTotalDuration().getDataMax().split(' ')[0]
}) })
const setUid = (value: any) => { const setUid = (value: any) => {
uid.value = value uid.value = value
@ -31,7 +31,7 @@ const setUid = (value: any) => {
const setUp3 = (value: any) => { const setUp3 = (value: any) => {
up3.value = value up3.value = value
selectedUp3Posko(value) selectedUp3Posko(value)
posko.value = { id: "", name: poskoPlaceholder } posko.value = { id: 0, name: poskoPlaceholder }
data.value.up3 = value data.value.up3 = value
} }
@ -40,8 +40,6 @@ const setPosko = (value: any) => {
selectedPosko(value) selectedPosko(value)
data.value.posko = value data.value.posko = value
} }
const sla = [ const sla = [
{ {
id: 1, id: 1,
@ -53,28 +51,32 @@ const sla = [
} }
] ]
const setMin = (value: any) => { const setMin = (value: any) => {
console.log(value) console.log(value)
data.value.minTime = value data.value.minTime = value
useTotalDuration().setDataMin(value)
} }
const setMax = (value: any) => { const setMax = (value: any) => {
data.value.maxTime = value data.value.maxTime = value
useTotalDuration().setDataMax(value)
} }
const triggerInput = ref(false) const triggerInput = ref(false)
const changeDuration = (value: any) => { const changeDuration = (value: any) => {
if (value.id === 0) { if (value.id === 0) {
setMin("1 Menit")
setMax("5 Menit")
console.log('Durasi Menit') console.log('Durasi Menit')
data.value.minTime = 0
data.value.maxTime = 5
triggerInput.value = false triggerInput.value = false
} else if (value.id === 1) { } else if (value.id === 1) {
data.value.minTime = 0 setMin("1 Menit")
data.value.maxTime = 45 setMax("45 Menit")
console.log('Dibawah / Sesuai SLA (<= 45 menit)') console.log('Dibawah / Sesuai SLA (<= 45 menit)')
triggerInput.value = true triggerInput.value = true
} else { } else {
data.value.minTime = 46 setMin("45 Menit")
data.value.maxTime = 99999 * 60 * 24 setMax(99999 * 60 * 24+ ' Menit')
triggerInput.value = true triggerInput.value = true
console.log('Melebihi SLA (> 45 menit)') console.log('Melebihi SLA (> 45 menit)')
} }
@ -123,9 +125,12 @@ onMounted(() => {
<Select @update:selected="changeDuration($event)" :data="sla" placeholder="Durasi Menit" /> <Select @update:selected="changeDuration($event)" :data="sla" placeholder="Durasi Menit" />
<div class="grid grid-flow-col auto-cols-auto gap-x-1.5"> <div class="grid grid-flow-col auto-cols-auto gap-x-1.5">
<InputWithSuffix @default-value="data.minTime" @update:menit-value="setMin($event)" /> <InputWithSuffix
:value="`${data.minTime} Menit`"
/>
<small class="flex items-center">s/d</small> <small class="flex items-center">s/d</small>
<InputWithSuffix @default-value="data.maxTime" @update:menit-value="setMax($event)" /> <InputWithSuffix
:value="`${data.maxTime} Menit`"/>
</div> </div>
</div> </div>
</div> </div>

View File

@ -16,7 +16,7 @@ const uppPlaceholder = 'Semua Unit Pelaksanaan Pelayanan Pelanggan'
const poskoPlaceholder = 'Semua Posko' const poskoPlaceholder = 'Semua Posko'
const uppp = ref({ id: 0, name: uppPlaceholder }) const uppp = ref({ id: 0, name: uppPlaceholder })
const uid = ref({ id: 0, name: uidPlaceholder }) const uid = ref({ id: 0, name: uidPlaceholder })
const posko = ref({ id: "", name: poskoPlaceholder }) const posko = ref({ id: 0, name: poskoPlaceholder })
const emit = defineEmits(['update:filters']) const emit = defineEmits(['update:filters'])
const data = ref({ const data = ref({
uid: uid.value, uid: uid.value,
@ -39,7 +39,7 @@ const setUid = (value: any) => {
const setUp3 = (value: any) => { const setUp3 = (value: any) => {
uppp.value = value uppp.value = value
selectedUp3Posko(value) selectedUp3Posko(value)
posko.value = { id: "", name: poskoPlaceholder } posko.value = { id: 0, name: poskoPlaceholder }
data.value.up3 = value data.value.up3 = value
} }

View File

@ -42,7 +42,7 @@ const setUid = (value: any) => {
const setUp3 = (value: any) => { const setUp3 = (value: any) => {
uppp.value = value uppp.value = value
selectedUp3Posko(value) selectedUp3Posko(value)
posko.value = { id: "", name: poskoPlaceholder } posko.value = { id: 0, name: poskoPlaceholder }
data.value.up3 = value data.value.up3 = value
} }

View File

@ -5,7 +5,8 @@
<div v-for="item in radioItems" :key="item.id" class="flex items-center"> <div v-for="item in radioItems" :key="item.id" class="flex items-center">
<input v-model="groupValue" <input v-model="groupValue"
type="radio" name="radio" type="radio" name="radio"
:checked="item.checked" @change="onChange(item)" :checked="itemSelected.id === item.id ? true : false"
@change="onChange(item)"
class="w-4 h-4 border-gray-300 text-primary-500 peer focus:ring-primary-500" /> class="w-4 h-4 border-gray-300 text-primary-500 peer focus:ring-primary-500" />
<label :for="`${item.id}`" class="block ml-3 text-sm font-medium text-gray-700 peer-checked:text-primary-500">{{ <label :for="`${item.id}`" class="block ml-3 text-sm font-medium text-gray-700 peer-checked:text-primary-500">{{
item.title }}</label> item.title }}</label>

View File

@ -14,17 +14,21 @@ const props = defineProps({
type: Boolean, type: Boolean,
default: false default: false
}, },
defaultValue: { value: {
type: String, type: String,
default: '1 Menit' default: '1 Menit'
} }
}) })
const emit = defineEmits(['update:menitValue']) const handleInput = (e :any) => {
const menitValue = ref(props.defaultValue) e.value = e.value.replace(/[^0-9.]/g, '')
watch(menitValue, (newValue) => { }
emit('update:menitValue', newValue) const handleBlur = (e :any) => {
}) e.value = e.value ? e.value + ' Menit' : ''
}
const handleFocus = (e:any) => {
e.value = e.value.replace(/[^0-9.]/g, '')
}
</script> </script>
<template> <template>
@ -32,7 +36,7 @@ watch(menitValue, (newValue) => {
class="relative w-full overflow-hidden rounded-lg bg-gray-200"> class="relative w-full overflow-hidden rounded-lg bg-gray-200">
<input <input
v-model="menitValue" :value="props.value"
autocomplete="off" autocomplete="off"
type="text" type="text"
:placeholder="placeholder" :placeholder="placeholder"
@ -40,12 +44,10 @@ watch(menitValue, (newValue) => {
inputmode="numeric" inputmode="numeric"
pattern="[0-9.]*" pattern="[0-9.]*"
:disabled="disabled" :disabled="disabled"
:defaultValue="props.defaultValue" @oninput="handleInput($event)"
oninput="this.value = this.value.replace(/[^0-9.]/g, '')" @onblur="handleBlur($event)"
onblur="this.value = this.value ? this.value + ' Menit' : ''" @onfocus="handleFocus($event)"
onfocus="this.value = this.value.replace(/[^0-9.]/g, '')" class="w-full px-4 py-2 text-sm leading-6 placeholder:text-gray-400 text-gray-900 border-0 border-transparent rounded-lg outline-0 bg-gray-200 focus:outline-0 focus:border-0 focus:ring-0"
class="w-full px-4 py-2 text-sm leading-6 placeholder:text-gray-400 text-gray-900 border-0 border-transparent rounded-lg outline-0 bg-gray-200 focus:outline-0 focus:border-0 focus:ring-0
"
/> />
</div> </div>
</template> </template>

View File

@ -1,18 +1,24 @@
<template> <template>
<Filters @run-search="() => filterData(filters)" class="mb-4">
<Type4 @update:filters="(value) => {
filters = value
}
" />
</Filters>
<div class="mt-4 lg:mt-6 max-w-7xl"> <div class="mt-4 lg:mt-6 max-w-7xl">
<h1 class="text-xl font-medium md:text-2xl text-dark"> <h1 class="text-xl font-medium md:text-2xl text-dark">
Laporan Pengaduan Total Laporan Pengaduan Total
</h1> </h1>
</div> </div>
<DxDataGrid class="max-h-[calc(100vh-140px)]" :show-column-lines="true" :show-row-lines="false" :show-borders="true" <DxDataGrid class="max-h-[calc(100vh-140px)]" :data-source="data" :show-column-lines="true" :show-row-lines="false"
:row-alternation-enabled="true" :hover-state-enabled="true" @selection-changed="onSelectionChanged" :show-borders="true" :row-alternation-enabled="true" :hover-state-enabled="true"
:column-width="100" @exporting="onExporting" :allow-column-resizing="true" column-resizing-mode="widget" @selection-changed="onSelectionChanged" :column-width="100" @exporting="onExporting" :allow-column-resizing="true"
:word-wrap-enabled="true"> column-resizing-mode="widget" :word-wrap-enabled="true">
<DxSelection mode="single" /> <DxSelection mode="single" />
<DxPaging :enabled="false" /> <DxPaging :enabled="false" />
<DxScrolling column-rendering-mode="virtual" mode="virtual" /> <DxScrolling column-rendering-mode="virtual" mode="virtual" />
<DxLoadPanel :position="position" :show-indicator="showIndicator" :show-pane="showPane" :shading="shading" <DxLoadPanel :position="position" :show-indicator="showIndicator" :show-pane="showPane" :shading="shading"
v-if="loading" v-model:visible="loading" :enabled="true" /> v-if="loading" v-model:visible="loading" :enabled="true" />
<DxSearchPanel :visible="true" :highlight-case-sensitive="true" /> <DxSearchPanel :visible="true" :highlight-case-sensitive="true" />
<DxExport :enabled="true" :formats="['pdf', 'xlsx', 'document']" :allow-export-selected-data="false" /> <DxExport :enabled="true" :formats="['pdf', 'xlsx', 'document']" :allow-export-selected-data="false" />
<DxColumnFixing :enabled="true" /> <DxColumnFixing :enabled="true" />
@ -111,11 +117,16 @@ import { exportDataGrid as exportToExcel } from 'devextreme/excel_exporter'
import { saveAs } from 'file-saver' import { saveAs } from 'file-saver'
import { Workbook } from 'exceljs' import { Workbook } from 'exceljs'
import { AnomaliTable2 } from '.' import { AnomaliTable2 } from '.'
import { Type4 } from '@/components/Form/FiltersType'
import Filters from '@/components/Form/Filters.vue'
import { useQuery } from '@vue/apollo-composable'
import gql from 'graphql-tag'
const position = { of: '#data' }; const position = { of: '#data' };
const showIndicator = ref(true); const showIndicator = ref(true);
const shading = ref(true); const shading = ref(true);
const showPane = ref(true); const showPane = ref(true);
const loading = ref(false) const data = ref<any[]>([])
const onExporting = (e: any) => { const onExporting = (e: any) => {
if (e.format === 'pdf') { if (e.format === 'pdf') {
const doc = new jsPDF() const doc = new jsPDF()
@ -150,11 +161,70 @@ const onSelectionChanged = ({ selectedRowsData }: any) => {
console.log(data) console.log(data)
} }
onMounted(() => { const GET_laporanAnomaliPenangananPengaduanGangguanPetugas = gql`
const filters = useFiltersStore() query laporanAnomaliPenangananPengaduanGangguanPetugas($dateFrom: Date!, $dateTo: Date!, $posko: String, $idUid: Int, $idUp3: Int) {
laporanAnomaliPenangananPengaduanGangguanPetugas(
filters.setConfig({ dateFrom: $dateFrom
type: 'type-4' dateTo: $dateTo
posko: $posko
idUid: $idUid
idUp3: $idUp3
) {
nama_posko
persen_penyelesaian_petugas_anomali_cc_123_marking
persen_penyelesaian_petugas_anomali_cc_123_non_marking
persen_penyelesaian_petugas_anomali_marking
persen_penyelesaian_petugas_anomali_non_marking
persen_penyelesaian_petugas_anomali_pln_mobile_marking
persen_penyelesaian_petugas_anomali_pln_mobile_non_marking
total_penyelesaian_petugas_anomali_cc_123_marking
total_penyelesaian_petugas_anomali_cc_123_non_marking
total_penyelesaian_petugas_anomali_marking
total_penyelesaian_petugas_anomali_non_marking
total_penyelesaian_petugas_anomali_pln_mobile_marking
total_penyelesaian_petugas_anomali_pln_mobile_non_marking
total_petugas
}
}
`
const filterData = (params: any) => {
const { posko, uid, up3 } = params
const dateValue = params.periode.split(' s/d ')
refetch({
dateFrom: dateValue[0] ? dateValue[0].split('-').reverse().join('-') : new Date().toISOString().slice(0, 10),
dateTo: dateValue[1] ? dateValue[1].split('-').reverse().join('-') : new Date().toISOString().slice(0, 10),
posko: posko ? posko.id : "",
idUid: uid ? uid.id : 0,
idUp3: up3 ? up3.id : 0
}) })
}) onResult((queryResult) => {
if (queryResult.data != undefined) {
queryResult.data.daftarGangguanDialihkanKePoskoLain.forEach((item: any) => {
data.value = [
...data.value,
{
...item,
}
]
})
}
console.log(queryResult.data)
console.log(queryResult.loading)
console.log(queryResult.networkStatus)
})
onError((error) => {
console.log(error)
})
}
const { onResult, onError, loading, refetch } = useQuery(
GET_laporanAnomaliPenangananPengaduanGangguanPetugas,
{
dateFrom: new Date().toISOString().slice(0, 10),
dateTo: new Date().toISOString().slice(0, 10),
posko: '',
idUid: 0,
idUp3: 0
}
)
const filters = ref()
</script> </script>

View File

@ -4,7 +4,7 @@
Laporan Pengaduan PLN Mobile Laporan Pengaduan PLN Mobile
</h1> </h1>
</div> </div>
<DxDataGrid class="max-h-[calc(100vh-140px)]" :show-column-lines="true" :show-row-lines="false" :show-borders="true" <DxDataGrid class="max-h-[calc(100vh-140px)]" :data-source="data" :show-column-lines="true" :show-row-lines="false" :show-borders="true"
:row-alternation-enabled="true" :hover-state-enabled="true" @selection-changed="onSelectionChanged" :row-alternation-enabled="true" :hover-state-enabled="true" @selection-changed="onSelectionChanged"
@exporting="onExporting" :allow-column-resizing="true" column-resizing-mode="widget" :word-wrap-enabled="true"> @exporting="onExporting" :allow-column-resizing="true" column-resizing-mode="widget" :word-wrap-enabled="true">
<DxSelection mode="single" /> <DxSelection mode="single" />
@ -48,6 +48,7 @@ const showIndicator = ref(true);
const shading = ref(true); const shading = ref(true);
const showPane = ref(true); const showPane = ref(true);
const loading = ref(true) const loading = ref(true)
const data = ref<any[]>([])
const onExporting = (e: any) => { const onExporting = (e: any) => {
if (e.format === 'pdf') { if (e.format === 'pdf') {

View File

@ -1,4 +1,10 @@
<template> <template>
<Filters @run-search="() => filterData(filters)" class="mb-4">
<Type4 @update:filters="(value) => {
filters = value
}
" />
</Filters>
<div class="mt-4 lg:mt-6 max-w-7xl"> <div class="mt-4 lg:mt-6 max-w-7xl">
<h1 class="text-xl font-medium md:text-2xl text-dark"> <h1 class="text-xl font-medium md:text-2xl text-dark">
Laporan Pengaduan Total Laporan Pengaduan Total
@ -11,66 +17,70 @@
<DxSelection mode="single" /> <DxSelection mode="single" />
<DxPaging :enabled="false" /> <DxPaging :enabled="false" />
<DxScrolling column-rendering-mode="virtual" mode="virtual" /> <DxScrolling column-rendering-mode="virtual" mode="virtual" />
<DxLoadPanel :position="position" :show-indicator="showIndicator" :show-pane="showPane" :shading="shading" <DxLoadPanel :position="position" :show-indicator="showIndicator" :show-pane="showPane" :shading="shading"
v-if="loading" v-model:visible="loading" :enabled="true" /> v-if="loading" v-model:visible="loading" :enabled="true" />
<DxSearchPanel :visible="true" :highlight-case-sensitive="true" /> <DxSearchPanel :visible="true" :highlight-case-sensitive="true" />
<DxExport :enabled="true" :formats="['pdf', 'xlsx', 'document']" :allow-export-selected-data="false" /> <DxExport :enabled="true" :formats="['pdf', 'xlsx', 'document']" :allow-export-selected-data="false" />
<DxColumnFixing :enabled="true" /> <DxColumnFixing :enabled="true" />
<DxColumn :width="170" alignment="center" data-field="" caption="Nama Unit" css-class="custom-table-column" /> <DxColumn :width="170" alignment="center" data-field="nama_posko" caption="Nama Unit"
css-class="custom-table-column" />
<DxColumn alignment="center" caption="Total Petugas" css-class="custom-table-column"> <DxColumn alignment="center" caption="Total Petugas" css-class="custom-table-column">
<DxColumn :width="170" alignment="center" data-field="" caption="a" css-class="custom-table-column" /> <DxColumn :width="170" alignment="center" data-field="total_petugas" caption="a"
css-class="custom-table-column" />
</DxColumn> </DxColumn>
<DxColumn alignment="center" caption="Total Petugas Yang Pengaduan Diselesaikan Secara Anomali" <DxColumn alignment="center" caption="Total Petugas Yang Pengaduan Diselesaikan Secara Anomali"
css-class="custom-table-column"> css-class="custom-table-column">
<DxColumn alignment="center" caption="PLN Mobile" css-class="custom-table-column"> <DxColumn alignment="center" caption="PLN Mobile" css-class="custom-table-column">
<DxColumn :width="150" alignment="center" data-field="" data-type="number" caption="b" <DxColumn :width="150" alignment="center" data-field="total_penyelesaian_petugas_anomali_pln_mobile"
css-class="custom-table-column" /> data-type="number" caption="b" css-class="custom-table-column" />
</DxColumn> </DxColumn>
<DxColumn alignment="center" caption="CC 123" css-class="custom-table-column"> <DxColumn alignment="center" caption="CC 123" css-class="custom-table-column">
<DxColumn :width="150" alignment="center" data-field="" data-type="number" caption="c" <DxColumn :width="150" alignment="center" data-field="total_penyelesaian_petugas_anomali_cc_123"
css-class="custom-table-column" /> data-type="number" caption="c" css-class="custom-table-column" />
</DxColumn> </DxColumn>
<DxColumn alignment="center" caption="Total" css-class="custom-table-column"> <DxColumn alignment="center" caption="Total" css-class="custom-table-column">
<DxColumn :width="150" alignment="center" data-field="" data-type="number" caption="d=b+c" <DxColumn :width="150" alignment="center" data-field="total_penyelesaian_petugas_anomali" data-type="number"
css-class="custom-table-column" /> caption="d=b+c" css-class="custom-table-column" />
</DxColumn> </DxColumn>
</DxColumn> </DxColumn>
<DxColumn alignment="center" caption="% Petugas Yang Pengaduan Diselesaikan Secara Anomali" <DxColumn alignment="center" caption="% Petugas Yang Pengaduan Diselesaikan Secara Anomali"
css-class="custom-table-column"> css-class="custom-table-column">
<DxColumn alignment="center" caption="PLN Mobile" css-class="custom-table-column"> <DxColumn alignment="center" caption="PLN Mobile" css-class="custom-table-column">
<DxColumn alignment="center" caption="e=b/a" css-class="custom-table-column"> <DxColumn alignment="center" caption="e=b/a" css-class="custom-table-column">
<DxColumn :width="150" alignment="center" data-field="" data-type="number" caption="Marking" <DxColumn :width="150" alignment="center"
css-class="custom-table-column" /> data-field="total_penyelesaian_petugas_anomali_pln_mobile_marking" data-type="number"
<DxColumn :width="150" alignment="center" data-field="" data-type="number" caption="Non Marking" caption="Marking" css-class="custom-table-column" />
css-class="custom-table-column" /> <DxColumn :width="150" alignment="center"
data-field="total_penyelesaian_petugas_anomali_pln_mobile_non_marking" data-type="number"
caption="Non Marking" css-class="custom-table-column" />
</DxColumn> </DxColumn>
</DxColumn> </DxColumn>
<DxColumn alignment="center" caption="CC 123" css-class="custom-table-column"> <DxColumn alignment="center" caption="CC 123" css-class="custom-table-column">
<DxColumn alignment="center" caption="f=c/a" css-class="custom-table-column"> <DxColumn alignment="center" caption="f=c/a" css-class="custom-table-column">
<DxColumn :width="150" alignment="center" data-field="" data-type="number" caption="Marking" <DxColumn :width="150" alignment="center" data-field="total_penyelesaian_petugas_anomali_cc_123_marking"
css-class="custom-table-column" /> data-type="number" caption="Marking" css-class="custom-table-column" />
<DxColumn :width="150" alignment="center" data-field="" data-type="number" caption="Non Marking" <DxColumn :width="150" alignment="center"
css-class="custom-table-column" /> data-field="total_penyelesaian_petugas_anomali_cc_123_non_marking" data-type="number"
caption="Non Marking" css-class="custom-table-column" />
</DxColumn> </DxColumn>
</DxColumn> </DxColumn>
<DxColumn alignment="center" caption="Total" css-class="custom-table-column"> <DxColumn alignment="center" caption="Total" css-class="custom-table-column">
<DxColumn alignment="center" caption="g=e+f" css-class="custom-table-column"> <DxColumn alignment="center" caption="g=e+f" css-class="custom-table-column">
<DxColumn :width="150" alignment="center" data-field="" data-type="number" caption="Marking" <DxColumn :width="150" alignment="center" data-field="total_penyelesaian_petugas_anomali_marking"
css-class="custom-table-column" /> data-type="number" caption="Marking" css-class="custom-table-column" />
<DxColumn :width="150" alignment="center" data-field="" data-type="number" caption="Non Marking" <DxColumn :width="150" alignment="center" data-field="total_penyelesaian_petugas_anomali_non_marking"
css-class="custom-table-column" /> data-type="number" caption="Non Marking" css-class="custom-table-column" />
</DxColumn> </DxColumn>
</DxColumn> </DxColumn>
</DxColumn> </DxColumn>
</DxDataGrid> </DxDataGrid>
<AnomaliTable4 /> <AnomaliTable4 :filters-detail="filters" />
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { onMounted, ref } from 'vue' import { onMounted, ref } from 'vue'
import { useFiltersStore } from '@/stores/filters'
import { DxDataGrid } from 'devextreme-vue' import { DxDataGrid } from 'devextreme-vue'
import { DxColumn, DxColumnFixing, DxExport, DxLoadPanel, DxPaging, DxScrolling, DxSearchPanel, DxSelection } from 'devextreme-vue/data-grid' import { DxColumn, DxColumnFixing, DxExport, DxLoadPanel, DxPaging, DxScrolling, DxSearchPanel, DxSelection } from 'devextreme-vue/data-grid'
import { jsPDF } from 'jspdf' import { jsPDF } from 'jspdf'
@ -79,11 +89,16 @@ import { exportDataGrid as exportToExcel } from 'devextreme/excel_exporter'
import { saveAs } from 'file-saver' import { saveAs } from 'file-saver'
import { Workbook } from 'exceljs' import { Workbook } from 'exceljs'
import { AnomaliTable4 } from '.' import { AnomaliTable4 } from '.'
import { useQuery } from '@vue/apollo-composable'
import gql from 'graphql-tag'
import { Type4 } from '@/components/Form/FiltersType'
import Filters from '@/components/Form/Filters.vue'
const position = { of: '#data' }; const position = { of: '#data' };
const showIndicator = ref(true); const showIndicator = ref(true);
const shading = ref(true); const shading = ref(true);
const showPane = ref(true); const showPane = ref(true);
const loading = ref(true) const data = ref<any[]>([])
const onExporting = (e: any) => { const onExporting = (e: any) => {
if (e.format === 'pdf') { if (e.format === 'pdf') {
@ -118,12 +133,76 @@ const onSelectionChanged = ({ selectedRowsData }: any) => {
const data = selectedRowsData[0] const data = selectedRowsData[0]
console.log(data) console.log(data)
} }
const GET_laporanAnomaliPenangananPengaduanGangguanPetugas = gql`
query laporanAnomaliPenangananPengaduanGangguanPetugas($dateFrom: Date!,
$dateTo: Date!, $jenisLaporan: Int, $idUid: Int, $idUp3: Int,$posko: String) {
laporanAnomaliPenangananPengaduanGangguanPetugas(
dateFrom: $dateFrom
dateTo: $dateTo
jenisLaporan :$jenisLaporan
idUid: $idUid
idUp3: $idUp3
posko: $posko
onMounted(() => { ) {
const filters = useFiltersStore() nama_posko
persen_penyelesaian_petugas_anomali_cc_123_marking
filters.setConfig({ persen_penyelesaian_petugas_anomali_cc_123_non_marking
type: 'type-4' persen_penyelesaian_petugas_anomali_marking
persen_penyelesaian_petugas_anomali_non_marking
persen_penyelesaian_petugas_anomali_pln_mobile_marking
persen_penyelesaian_petugas_anomali_pln_mobile_non_marking
total_penyelesaian_petugas_anomali_cc_123_marking
total_penyelesaian_petugas_anomali_cc_123_non_marking
total_penyelesaian_petugas_anomali_marking
total_penyelesaian_petugas_anomali_non_marking
total_penyelesaian_petugas_anomali_pln_mobile_marking
total_penyelesaian_petugas_anomali_pln_mobile_non_marking
total_petugas
}
}
`
const filterData = (params: any) => {
const { posko, uid, up3 } = params
const dateValue = params.periode.split(' s/d ')
refetch({
dateFrom: dateValue[0] ? dateValue[0].split('-').reverse().join('-') : new Date().toISOString().slice(0, 10),
dateTo: dateValue[1] ? dateValue[1].split('-').reverse().join('-') : new Date().toISOString().slice(0, 10),
posko: posko ? posko.id : "",
idUid: uid ? uid.id : 0,
idUp3: up3 ? up3.id : 0
}) })
}) onResult((queryResult) => {
if (queryResult.data != undefined) {
queryResult.data.daftarGangguanDialihkanKePoskoLain.forEach((item: any) => {
data.value = [
...data.value,
{
...item,
total_penyelesaian_petugas_anomali_cc_123: item.total_penyelesaian_petugas_anomali_cc_123_marking + item.total_penyelesaian_petugas_anomali_cc_123_non_marking,
total_penyelesaian_petugas_anomali_pln_mobile: item.total_penyelesaian_petugas_anomali_pln_mobile_marking + item.total_penyelesaian_petugas_anomali_pln_mobile_non_marking,
total_penyelesaian_petugas_anomali: item.total_penyelesaian_petugas_anomali_marking + item.total_penyelesaian_petugas_anomali_non_marking,
}
]
})
}
console.log(queryResult.data)
console.log(queryResult.loading)
console.log(queryResult.networkStatus)
})
onError((error) => {
console.log(error)
})
}
const { onResult, onError, loading, refetch } = useQuery(
GET_laporanAnomaliPenangananPengaduanGangguanPetugas,
{
dateFrom: new Date().toISOString().slice(0, 10),
dateTo: new Date().toISOString().slice(0, 10),
posko: '',
idUid: 0,
idUp3: 0
}
)
const filters = ref()
</script> </script>

View File

@ -4,54 +4,56 @@
Laporan Pengaduan PLN Mobile Laporan Pengaduan PLN Mobile
</h1> </h1>
</div> </div>
<DxDataGrid class="max-h-[calc(100vh-140px)]" :show-column-lines="true" :show-row-lines="false" :show-borders="true" <DxDataGrid class="max-h-[calc(100vh-140px)]" :data-source="data" :show-column-lines="true" :show-row-lines="false"
:row-alternation-enabled="true" :hover-state-enabled="true" @selection-changed="onSelectionChanged" :show-borders="true" :row-alternation-enabled="true" :hover-state-enabled="true"
:column-width="100" @exporting="onExporting" :allow-column-resizing="true" column-resizing-mode="widget" @selection-changed="onSelectionChanged" :column-width="100" @exporting="onExporting" :allow-column-resizing="true"
:word-wrap-enabled="true"> column-resizing-mode="widget" :word-wrap-enabled="true">
<DxSelection mode="single" /> <DxSelection mode="single" />
<DxPaging :enabled="false" /> <DxPaging :enabled="false" />
<DxScrolling column-rendering-mode="virtual" mode="virtual" /> <DxScrolling column-rendering-mode="virtual" mode="virtual" />
<DxLoadPanel :position="position" :show-indicator="showIndicator" :show-pane="showPane" :shading="shading" <DxLoadPanel :position="position" :show-indicator="showIndicator" :show-pane="showPane" :shading="shading"
v-if="loading" v-model:visible="loading" :enabled="true" /> v-if="loading" v-model:visible="loading" :enabled="true" />
<DxSearchPanel :visible="true" :highlight-case-sensitive="true" /> <DxSearchPanel :visible="true" :highlight-case-sensitive="true" />
<DxExport :enabled="true" :formats="['pdf', 'xlsx', 'document']" :allow-export-selected-data="false" /> <DxExport :enabled="true" :formats="['pdf', 'xlsx', 'document']" :allow-export-selected-data="false" />
<DxColumnFixing :enabled="true" /> <DxColumnFixing :enabled="true" />
<DxColumn :width="170" alignment="center" data-field="" caption="Nama Unit" css-class="custom-table-column" /> <DxColumn :width="170" alignment="center" data-field="nama_posko" caption="Nama Unit"
<DxColumn :width="170" alignment="center" data-field="" caption="Nama Petugas" css-class="custom-table-column" /> css-class="custom-table-column" />
<DxColumn :width="170" alignment="center" data-field="nama_petugas" caption="Nama Petugas"
css-class="custom-table-column" />
<DxColumn alignment="center" caption="Total WO" css-class="custom-table-column"> <DxColumn alignment="center" caption="Total WO" css-class="custom-table-column">
<DxColumn alignment="center" caption="(PLN Mobile, CC123, DLL)" css-class="custom-table-column"> <DxColumn alignment="center" caption="(PLN Mobile, CC123, DLL)" css-class="custom-table-column">
<DxColumn :width="150" alignment="center" data-field="" data-type="number" caption="a" <DxColumn :width="150" alignment="center" data-field="total_wo" data-type="number" caption="a"
css-class="custom-table-column" /> css-class="custom-table-column" />
</DxColumn> </DxColumn>
</DxColumn> </DxColumn>
<DxColumn alignment="center" caption="Total Pengaduan Yang Diselesaikan Secara Anomali" <DxColumn alignment="center" caption="Total Pengaduan Yang Diselesaikan Secara Anomali"
css-class="custom-table-column"> css-class="custom-table-column">
<DxColumn alignment="center" caption="PLN Mobile" css-class="custom-table-column"> <DxColumn alignment="center" caption="PLN Mobile" css-class="custom-table-column">
<DxColumn :width="150" alignment="center" data-field="" data-type="number" caption="b" <DxColumn :width="150" alignment="center" data-field="total_penyelesaian_petugas_anomali_pln_mobile"
css-class="custom-table-column" /> data-type="number" caption="b" css-class="custom-table-column" />
</DxColumn> </DxColumn>
<DxColumn alignment="center" caption="CC 123" css-class="custom-table-column"> <DxColumn alignment="center" caption="CC 123" css-class="custom-table-column">
<DxColumn :width="150" alignment="center" data-field="" data-type="number" caption="c" <DxColumn :width="150" alignment="center" data-field="total_penyelesaian_petugas_anomali_cc_123"
css-class="custom-table-column" /> data-type="number" caption="c" css-class="custom-table-column" />
</DxColumn> </DxColumn>
<DxColumn alignment="center" caption="Total" css-class="custom-table-column"> <DxColumn alignment="center" caption="Total" css-class="custom-table-column">
<DxColumn :width="150" alignment="center" data-field="" data-type="number" caption="d=b+c" <DxColumn :width="150" alignment="center" data-field="total_penyelesaian_petugas_anomali" data-type="number"
css-class="custom-table-column" /> caption="d=b+c" css-class="custom-table-column" />
</DxColumn> </DxColumn>
</DxColumn> </DxColumn>
<DxColumn alignment="center" caption="% Pengaduan Yang Diselesaikan Secara Anomali" css-class="custom-table-column"> <DxColumn alignment="center" caption="% Pengaduan Yang Diselesaikan Secara Anomali" css-class="custom-table-column">
<DxColumn alignment="center" caption="PLN Mobile" css-class="custom-table-column"> <DxColumn alignment="center" caption="PLN Mobile" css-class="custom-table-column">
<DxColumn :width="150" alignment="center" data-field="" data-type="number" caption="e=b/a" <DxColumn :width="150" alignment="center" data-field="persen_penyelesaian_petugas_anomali_pln_mobile"
css-class="custom-table-column" /> data-type="number" caption="e=b/a" css-class="custom-table-column" />
</DxColumn> </DxColumn>
<DxColumn alignment="center" caption="CC 123" css-class="custom-table-column"> <DxColumn alignment="center" caption="CC 123" css-class="custom-table-column">
<DxColumn :width="150" alignment="center" data-field="" data-type="number" caption="f=c/a" <DxColumn :width="150" alignment="center" data-field="persen_penyelesaian_petugas_anomali_cc_123"
css-class="custom-table-column" /> data-type="number" caption="f=c/a" css-class="custom-table-column" />
</DxColumn> </DxColumn>
<DxColumn alignment="center" caption="Total" css-class="custom-table-column"> <DxColumn alignment="center" caption="Total" css-class="custom-table-column">
<DxColumn :width="150" alignment="center" data-field="" data-type="number" caption="g=e+f" <DxColumn :width="150" alignment="center" data-field="persen_penyelesaian_petugas_anomali"
css-class="custom-table-column" /> data-type="number" caption="g=e+f" css-class="custom-table-column" />
</DxColumn> </DxColumn>
</DxColumn> </DxColumn>
@ -59,6 +61,12 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
defineProps({
filtersDetail: {
type: Object as PropType<any>,
required: true
}
})
import { DxDataGrid } from 'devextreme-vue' import { DxDataGrid } from 'devextreme-vue'
import { DxColumn, DxColumnFixing, DxExport, DxLoadPanel, DxPaging, DxScrolling, DxSearchPanel, DxSelection } from 'devextreme-vue/data-grid' import { DxColumn, DxColumnFixing, DxExport, DxLoadPanel, DxPaging, DxScrolling, DxSearchPanel, DxSelection } from 'devextreme-vue/data-grid'
import { jsPDF } from 'jspdf' import { jsPDF } from 'jspdf'
@ -66,12 +74,18 @@ import { exportDataGrid as exportToPdf } from 'devextreme/pdf_exporter'
import { exportDataGrid as exportToExcel } from 'devextreme/excel_exporter' import { exportDataGrid as exportToExcel } from 'devextreme/excel_exporter'
import { saveAs } from 'file-saver' import { saveAs } from 'file-saver'
import { Workbook } from 'exceljs' import { Workbook } from 'exceljs'
import { ref } from 'vue' import { ref, watch, type PropType } from 'vue'
import { useQuery } from '@vue/apollo-composable'
import gql from 'graphql-tag'
const position = { of: '#data' }; const position = { of: '#data' };
const showIndicator = ref(true); const showIndicator = ref(true);
const shading = ref(true); const shading = ref(true);
const showPane = ref(true); const showPane = ref(true);
const loading = ref(true) const data = ref<any[]>([])
const filtersDetail = ref({}); // Declare the 'filters' variable
watch(() => filtersDetail.value, (newValue) => { // Access the 'value' property of the 'filters' ref
filterData(newValue)
}, { immediate: true })
const onExporting = (e: any) => { const onExporting = (e: any) => {
if (e.format === 'pdf') { if (e.format === 'pdf') {
const doc = new jsPDF() const doc = new jsPDF()
@ -105,5 +119,68 @@ const onSelectionChanged = ({ selectedRowsData }: any) => {
const data = selectedRowsData[0] const data = selectedRowsData[0]
console.log(data) console.log(data)
} }
const laporanAnomaliDetailPetugasPenangananPengaduanGangguan = gql`
query laporanAnomaliDetailPetugasPenangananPengaduanGangguan($dateFrom: Date!,
$dateTo: Date!, $jenisLaporan: Int, $idUid: Int, $idUp3: Int,$posko: String) {
laporanAnomaliDetailPetugasPenangananPengaduanGangguan(
dateFrom: $dateFrom
dateTo: $dateTo
jenisLaporan :$jenisLaporan
idUid: $idUid
idUp3: $idUp3
posko: $posko
) {
nama_petugas
nama_posko
persen_penyelesaian_petugas_anomali
persen_penyelesaian_petugas_anomali_cc_123
persen_penyelesaian_petugas_anomali_pln_mobile
total_penyelesaian_petugas_anomali
total_penyelesaian_petugas_anomali_cc_123
total_penyelesaian_petugas_anomali_pln_mobile
total_wo
}
}
`
const filterData = (params: any) => {
const { posko, uid, up3 } = params
const dateValue = params.periode.split(' s/d ')
refetch({
dateFrom: dateValue[0] ? dateValue[0].split('-').reverse().join('-') : new Date().toISOString().slice(0, 10),
dateTo: dateValue[1] ? dateValue[1].split('-').reverse().join('-') : new Date().toISOString().slice(0, 10),
posko: posko ? posko.id : "",
idUid: uid ? uid.id : 0,
idUp3: up3 ? up3.id : 0
})
onResult((queryResult) => {
if (queryResult.data != undefined) {
queryResult.data.daftarGangguanDialihkanKePoskoLain.forEach((item: any) => {
data.value = [
...data.value,
{
...item,
}
]
})
}
console.log(queryResult.data)
console.log(queryResult.loading)
console.log(queryResult.networkStatus)
})
onError((error) => {
console.log(error)
})
}
const { onResult, onError, loading, refetch } = useQuery(
laporanAnomaliDetailPetugasPenangananPengaduanGangguan,
{
dateFrom: new Date().toISOString().slice(0, 10),
dateTo: new Date().toISOString().slice(0, 10),
posko: '',
idUid: 0,
idUp3: 0
}
)
</script> </script>

View File

@ -1,4 +1,10 @@
<template> <template>
<Filters @run-search="() => filterData(filters)" class="mb-4">
<Type4 @update:filters="(value) => {
filters = value
}
" />
</Filters>
<div class="mt-4 lg:mt-6 max-w-7xl"> <div class="mt-4 lg:mt-6 max-w-7xl">
<h1 class="text-xl font-medium md:text-2xl text-dark"> <h1 class="text-xl font-medium md:text-2xl text-dark">
Laporan Pengaduan Total Laporan Pengaduan Total
@ -77,6 +83,8 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import Filters from '@/components/Form/Filters.vue'
import { onMounted, ref } from 'vue' import { onMounted, ref } from 'vue'
import { useFiltersStore } from '@/stores/filters' import { useFiltersStore } from '@/stores/filters'
import { DxDataGrid } from 'devextreme-vue' import { DxDataGrid } from 'devextreme-vue'
@ -87,11 +95,14 @@ import { exportDataGrid as exportToExcel } from 'devextreme/excel_exporter'
import { saveAs } from 'file-saver' import { saveAs } from 'file-saver'
import { Workbook } from 'exceljs' import { Workbook } from 'exceljs'
import { AnomaliTable6 } from '.' import { AnomaliTable6 } from '.'
import { Type4 } from '@/components/Form/FiltersType'
import { useQuery } from '@vue/apollo-composable'
import gql from 'graphql-tag'
const position = { of: '#data' }; const position = { of: '#data' };
const showIndicator = ref(true); const showIndicator = ref(true);
const shading = ref(true); const shading = ref(true);
const showPane = ref(true); const showPane = ref(true);
const loading = ref(true) const data = ref<any[]>([])
const onExporting = (e: any) => { const onExporting = (e: any) => {
if (e.format === 'pdf') { if (e.format === 'pdf') {
@ -127,11 +138,64 @@ const onSelectionChanged = ({ selectedRowsData }: any) => {
console.log(data) console.log(data)
} }
onMounted(() => { const GET_laporanCheckInCheckOut = gql`
const filters = useFiltersStore() query laporanCheckInCheckOut($dateFrom: Date!, $dateTo: Date!, $posko: String, $idUid: Int, $idUp3: Int) {
laporanCheckInCheckOut(
filters.setConfig({ dateFrom: $dateFrom
type: 'type-4' dateTo: $dateTo
posko: $posko
idUid: $idUid
idUp3: $idUp3
) {
avg_durasi_wo_gangguan_individual
avg_durasi_wo_penugasan_khusus
avg_rct_wo_gangguan_individual
avg_rpt_wo_gangguan_individual
jumlah_wo_gangguan_individual
jumlah_wo_penugasan_khusus
personil_yantek
user_regu
}
}
`
const filterData = (params: any) => {
const { posko, uid, up3 } = params
const dateValue = params.periode.split(' s/d ')
refetch({
dateFrom: dateValue[0] ? dateValue[0].split('-').reverse().join('-') : new Date().toISOString().slice(0, 10),
dateTo: dateValue[1] ? dateValue[1].split('-').reverse().join('-') : new Date().toISOString().slice(0, 10),
posko: posko ? posko.id : "",
idUid: uid ? uid.id : 0,
idUp3: up3 ? up3.id : 0
}) })
}) onResult((queryResult) => {
if (queryResult.data != undefined) {
queryResult.data.daftarGangguanDialihkanKePoskoLain.forEach((item: any) => {
data.value = [
...data.value,
{
...item,
}
]
})
}
console.log(queryResult.data)
console.log(queryResult.loading)
console.log(queryResult.networkStatus)
})
onError((error) => {
console.log(error)
})
}
const { onResult, onError, loading, refetch } = useQuery(
GET_laporanCheckInCheckOut,
{
dateFrom: new Date().toISOString().slice(0, 10),
dateTo: new Date().toISOString().slice(0, 10),
posko: '',
idUid: 0,
idUp3: 0
}
)
const filters = ref()
</script> </script>

View File

@ -35,6 +35,8 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import Filters from '@/components/Form/Filters.vue'
import { DxDataGrid } from 'devextreme-vue' import { DxDataGrid } from 'devextreme-vue'
import { DxColumn, DxColumnFixing, DxExport, DxLoadPanel, DxPaging, DxScrolling, DxSearchPanel, DxSelection } from 'devextreme-vue/data-grid' import { DxColumn, DxColumnFixing, DxExport, DxLoadPanel, DxPaging, DxScrolling, DxSearchPanel, DxSelection } from 'devextreme-vue/data-grid'
import { jsPDF } from 'jspdf' import { jsPDF } from 'jspdf'
@ -47,6 +49,7 @@ const position = { of: '#data' };
const showIndicator = ref(true); const showIndicator = ref(true);
const shading = ref(true); const shading = ref(true);
const showPane = ref(true); const showPane = ref(true);
const data = ref<any[]>([])
const loading = ref(false) const loading = ref(false)
const onExporting = (e: any) => { const onExporting = (e: any) => {

View File

@ -1,45 +1,47 @@
<template> <template>
<Filters @run-search="() => filterData(filters)" class="mb-4"> <Filters @run-search="() => filterData(filters)" class="mb-4">
<Type1 @update:filters="(value) => { <Type1 @update:filters="(value) => {
filters = value filters = value
} }
" /> " />
</Filters> </Filters>
<div id="data"> <div id="data">
<DxDataGrid class="max-h-[calc(100vh-140px)]" :show-column-lines="true" :show-row-lines="false" :show-borders="true" <DxDataGrid class="max-h-[calc(100vh-140px)]" :data-source="data" :show-column-lines="true" :show-row-lines="false"
:row-alternation-enabled="true" :hover-state-enabled="true" @selection-changed="onSelectionChanged" :show-borders="true" :row-alternation-enabled="true" :hover-state-enabled="true"
:column-width="100" @exporting="onExporting" :allow-column-resizing="true" column-resizing-mode="widget" @selection-changed="onSelectionChanged" :column-width="100" @exporting="onExporting"
:word-wrap-enabled="true"> :allow-column-resizing="true" column-resizing-mode="widget" :word-wrap-enabled="true">
<DxSelection mode="single" /> <DxSelection mode="single" />
<DxPaging :enabled="false" /> <DxPaging :enabled="false" />
<DxScrolling column-rendering-mode="virtual" mode="virtual" /> <DxScrolling column-rendering-mode="virtual" mode="virtual" />
<DxLoadPanel :position="position" :show-indicator="showIndicator" :show-pane="showPane" :shading="shading" <DxLoadPanel :position="position" :show-indicator="showIndicator" :show-pane="showPane" :shading="shading"
v-if="loading" v-model:visible="loading" :enabled="true" /> v-if="loading" v-model:visible="loading" :enabled="true" />
<DxSearchPanel :visible="true" :highlight-case-sensitive="true" /> <DxSearchPanel :visible="true" :highlight-case-sensitive="true" />
<DxExport :enabled="true" :formats="['pdf', 'xlsx', 'document']" :allow-export-selected-data="false" /> <DxExport :enabled="true" :formats="['pdf', 'xlsx', 'document']" :allow-export-selected-data="false" />
<DxColumnFixing :enabled="true" /> <DxColumnFixing :enabled="true" />
<DxColumn :width="200" alignment="center" data-field="" caption="User Regu" css-class="custom-table-column" /> <DxColumn :width="200" alignment="center" data-field="user_regu" caption="User Regu" css-class="custom-table-column" />
<DxColumn :width="200" alignment="center" data-field="" caption="Personil Yantek" <DxColumn :width="200" alignment="center" data-field="personil_yantek" caption="Personil Yantek"
css-class="custom-table-column" /> css-class="custom-table-column" />
<DxColumn :width="200" alignment="center" data-field="" data-type="number" <DxColumn :width="200" alignment="center" data-field="jumlah_wo_gangguan_individual" data-type="number"
caption="Jumlah WO Gangguan Individual" css-class="custom-table-column" /> caption="Jumlah WO Gangguan Individual" css-class="custom-table-column" />
<DxColumn :width="200" alignment="center" data-field="" data-type="number" <DxColumn :width="200" alignment="center" data-field="avg_durasi_wo_gangguan_individual" data-type="number"
caption="Rata-rata Durasi WO Gangguan" css-class="custom-table-column" /> caption="Rata-rata Durasi WO Gangguan" css-class="custom-table-column" />
<DxColumn :width="200" alignment="center" data-field="" data-type="number" caption="Rata-rata RPT WO Gangguan" <DxColumn :width="200" alignment="center" data-field="avg_rpt_wo_gangguan_individual" data-type="number"
caption="Rata-rata RPT WO Gangguan"
css-class="custom-table-column" /> css-class="custom-table-column" />
<DxColumn :width="200" alignment="center" data-field="" data-type="number" caption="Rata-rata RCT WO Gangguan" <DxColumn :width="200" alignment="center" data-field="avg_rct_wo_gangguan_individual" data-type="number" caption="Rata-rata RCT WO Gangguan"
css-class="custom-table-column" /> css-class="custom-table-column" />
<DxColumn :width="200" alignment="center" data-field="" data-type="number" caption="Jumlah Wo Penugasan Khusus" <DxColumn :width="200" alignment="center" data-field="jumlah_wo_penugasan_khusus" data-type="number" caption="Jumlah Wo Penugasan Khusus"
css-class="custom-table-column" /> css-class="custom-table-column" />
<DxColumn :width="200" alignment="center" data-field="" data-type="number" <DxColumn :width="200" alignment="center" data-field="avg_durasi_wo_penugasan_khusus" data-type="number"
caption="Rata-rata Duarasi WO Penugasan" css-class="custom-table-column" /> caption="Rata-rata Durasi WO Penugasan" css-class="custom-table-column" />
</DxDataGrid> </DxDataGrid>
</div> </div>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { onMounted, ref } from 'vue' import { onMounted, ref } from 'vue'
import { useFiltersStore } from '@/stores/filters' import { useFiltersStore } from '@/stores/filters'
import { DxDataGrid } from 'devextreme-vue' import { DxDataGrid } from 'devextreme-vue'
@ -51,13 +53,18 @@ import { saveAs } from 'file-saver'
import { Workbook } from 'exceljs' import { Workbook } from 'exceljs'
import { Type1 } from '@/components/Form/FiltersType' import { Type1 } from '@/components/Form/FiltersType'
import Filters from '@/components/Form/Filters.vue' import Filters from '@/components/Form/Filters.vue'
import { useQuery } from '@vue/apollo-composable'
import gql from 'graphql-tag'
const position = { of: '#data' } const position = { of: '#data' }
const showIndicator = ref(true) const showIndicator = ref(true)
const shading = ref(true) const shading = ref(true)
const showPane = ref(true) const showPane = ref(true)
const dataDetail = ref<any>() const dataDetail = ref<any>()
const data = ref<any[]>([])
const showDetail = ref(false) const showDetail = ref(false)
const loading = ref(false) const showData = () => {
showDetail.value = true
}
const onExporting = (e: any) => { const onExporting = (e: any) => {
if (e.format === 'pdf') { if (e.format === 'pdf') {
const doc = new jsPDF() const doc = new jsPDF()
@ -86,14 +93,72 @@ const onExporting = (e: any) => {
e.cancel = true e.cancel = true
} }
} }
const onSelectionChanged = ({ selectedRowsData }: any) => { const onSelectionChanged = ({ selectedRowsData }: any) => {
const data = selectedRowsData[0] const data = selectedRowsData[0]
dataDetail.value = data
console.log(data) console.log(data)
} }
const filters = ref(); const GET_laporanCheckInCheckOut = gql`
const filterData = (filters: any) => { query laporanCheckInCheckOut($dateFrom: Date!, $dateTo: Date!, $posko: String, $idUid: Int, $idUp3: Int) {
console.log(filters) laporanCheckInCheckOut(
dateFrom: $dateFrom
dateTo: $dateTo
posko: $posko
idUid: $idUid
idUp3: $idUp3
) {
avg_durasi_wo_gangguan_individual
avg_durasi_wo_penugasan_khusus
avg_rct_wo_gangguan_individual
avg_rpt_wo_gangguan_individual
jumlah_wo_gangguan_individual
jumlah_wo_penugasan_khusus
personil_yantek
user_regu
}
}
`
const filterData = (params: any) => {
const { posko, uid, up3 } = params
const dateValue = params.periode.split(' s/d ')
refetch({
dateFrom: dateValue[0] ? dateValue[0].split('-').reverse().join('-') : new Date().toISOString().slice(0, 10),
dateTo: dateValue[1] ? dateValue[1].split('-').reverse().join('-') : new Date().toISOString().slice(0, 10),
posko: posko ? posko.id : "",
idUid: uid ? uid.id : 0,
idUp3: up3 ? up3.id : 0
})
onResult((queryResult) => {
if (queryResult.data != undefined) {
queryResult.data.daftarGangguanDialihkanKePoskoLain.forEach((item: any) => {
data.value = [
...data.value,
{
...item,
}
]
})
}
console.log(queryResult.data)
console.log(queryResult.loading)
console.log(queryResult.networkStatus)
})
onError((error) => {
console.log(error)
})
} }
const { onResult, onError, loading, refetch } = useQuery(
GET_laporanCheckInCheckOut,
{
dateFrom: new Date().toISOString().slice(0, 10),
dateTo: new Date().toISOString().slice(0, 10),
posko: '',
idUid: 0,
idUp3: 0
}
)
const filters = ref()
</script> </script>

View File

@ -1,5 +1,5 @@
<template> <template>
<Filters @run-search="() => filterData(filters)" class="mb-4"> <Filters @run-search="() => filterData(filters)" class="mb-4">
<Type3 @update:filters="(value) => { <Type3 @update:filters="(value) => {
filters = value filters = value
} }
@ -13,47 +13,47 @@
<DxSelection mode="single" /> <DxSelection mode="single" />
<DxPaging :enabled="false" /> <DxPaging :enabled="false" />
<DxScrolling column-rendering-mode="virtual" mode="virtual" /> <DxScrolling column-rendering-mode="virtual" mode="virtual" />
<DxLoadPanel :position="position" :show-indicator="showIndicator" :show-pane="showPane" :shading="shading" <DxLoadPanel :position="position" :show-indicator="showIndicator" :show-pane="showPane" :shading="shading"
v-if="loading" v-model:visible="loading" :enabled="true" /> v-if="loading" v-model:visible="loading" :enabled="true" />
<DxSearchPanel :visible="true" :highlight-case-sensitive="true" /> <DxSearchPanel :visible="true" :highlight-case-sensitive="true" />
<DxExport :enabled="true" :formats="['pdf', 'xlsx', 'document']" :allow-export-selected-data="false" /> <DxExport :enabled="true" :formats="['pdf', 'xlsx', 'document']" :allow-export-selected-data="false" />
<DxColumnFixing :enabled="true" /> <DxColumnFixing :enabled="true" />
<DxColumn :width="170" alignment="center" data-field="" caption="Nama Unit" css-class="custom-table-column" /> <DxColumn :width="170" alignment="center" data-field="nama_posko" caption="Nama Unit" css-class="custom-table-column" />
<DxColumn alignment="center" caption="Total WO" css-class="custom-table-column"> <DxColumn alignment="center" caption="Total WO" css-class="custom-table-column">
<DxColumn alignment="center" caption="CC 123" css-class="custom-table-column"> <DxColumn alignment="center" caption="CC 123" css-class="custom-table-column">
<DxColumn :width="150" alignment="center" data-field="" data-type="number" caption="a" <DxColumn :width="150" alignment="center" data-field="total_wo_cc123" data-type="number" caption="a"
css-class="custom-table-column" /> css-class="custom-table-column" />
</DxColumn> </DxColumn>
<DxColumn alignment="center" caption="PLN Mobile" css-class="custom-table-column"> <DxColumn alignment="center" caption="PLN Mobile" css-class="custom-table-column">
<DxColumn :width="150" alignment="center" data-field="" data-type="number" caption="b" <DxColumn :width="150" alignment="center" data-field="total_wo_pln_mobile" data-type="number" caption="b"
css-class="custom-table-column" /> css-class="custom-table-column" />
</DxColumn> </DxColumn>
<DxColumn alignment="center" caption="COMCEN" css-class="custom-table-column"> <DxColumn alignment="center" caption="COMCEN" css-class="custom-table-column">
<DxColumn :width="150" alignment="center" data-field="" data-type="number" caption="c" <DxColumn :width="150" alignment="center" data-field="total_wo_comcen" data-type="number" caption="c"
css-class="custom-table-column" /> css-class="custom-table-column" />
</DxColumn> </DxColumn>
<DxColumn alignment="center" caption="Total" css-class="custom-table-column"> <DxColumn alignment="center" caption="Total" css-class="custom-table-column">
<DxColumn :width="150" alignment="center" data-field="" data-type="number" caption="d=b+c" <DxColumn :width="150" alignment="center" data-field="total_wo" data-type="number" caption="d=b+c"
css-class="custom-table-column" /> css-class="custom-table-column" />
</DxColumn> </DxColumn>
</DxColumn> </DxColumn>
<DxColumn alignment="center" caption="Rekomendasi sistem" css-class="custom-table-column"> <DxColumn alignment="center" caption="Rekomendasi sistem" css-class="custom-table-column">
<DxColumn alignment="center" caption="Mendatangkan Petugas" css-class="custom-table-column"> <DxColumn alignment="center" caption="Mendatangkan Petugas" css-class="custom-table-column">
<DxColumn :width="150" alignment="center" data-field="" data-type="number" caption="e" <DxColumn :width="150" alignment="center" data-field="rekomendasi_sistem_mendatangkan_petugas" data-type="number" caption="e"
css-class="custom-table-column" /> css-class="custom-table-column" />
</DxColumn> </DxColumn>
<DxColumn alignment="center" caption="Diberikan ke Pelanggan" css-class="custom-table-column"> <DxColumn alignment="center" caption="Diberikan ke Pelanggan" css-class="custom-table-column">
<DxColumn :width="150" alignment="center" data-field="" data-type="number" caption="f" <DxColumn :width="150" alignment="center" data-field="total_wo_loket" data-type="number" caption="f"
css-class="custom-table-column" /> css-class="custom-table-column" />
</DxColumn> </DxColumn>
</DxColumn> </DxColumn>
<DxColumn alignment="center" caption="DLPD" css-class="custom-table-column"> <DxColumn alignment="center" caption="DLPD" css-class="custom-table-column">
<DxColumn :width="150" alignment="center" data-field="" data-type="number" caption="g" <DxColumn :width="150" alignment="center" data-field="dlpd" data-type="number" caption="g"
css-class="custom-table-column" /> css-class="custom-table-column" />
</DxColumn> </DxColumn>
<DxColumn alignment="center" caption="Histori P2TL" css-class="custom-table-column"> <DxColumn alignment="center" caption="Histori P2TL" css-class="custom-table-column">
<DxColumn :width="150" alignment="center" data-field="" data-type="number" caption="h" <DxColumn :width="150" alignment="center" data-field="history_p2ti" data-type="number" caption="h"
css-class="custom-table-column" /> css-class="custom-table-column" />
</DxColumn> </DxColumn>
@ -73,13 +73,14 @@ import { saveAs } from 'file-saver'
import { Workbook } from 'exceljs' import { Workbook } from 'exceljs'
import Filters from '@/components/Form/Filters.vue' import Filters from '@/components/Form/Filters.vue'
import { Type3 } from '@/components/Form/FiltersType' import { Type3 } from '@/components/Form/FiltersType'
import { useQuery } from '@vue/apollo-composable'
import gql from 'graphql-tag'
const position = { of: '#data' } const position = { of: '#data' }
const showIndicator = ref(true) const showIndicator = ref(true)
const shading = ref(true) const shading = ref(true)
const showPane = ref(true) const showPane = ref(true)
const dataDetail = ref<any>() const dataDetail = ref<any>()
const showDetail = ref(false) const showDetail = ref(false)
const loading = ref(false)
const onExporting = (e: any) => { const onExporting = (e: any) => {
if (e.format === 'pdf') { if (e.format === 'pdf') {
const doc = new jsPDF() const doc = new jsPDF()
@ -109,13 +110,74 @@ const onExporting = (e: any) => {
} }
} }
const GET_laporanCttKwhPeriksa = gql`
query laporanCttKwhPeriksa($dateFrom: Date!, $dateTo: Date!, $posko: String, $idUid: Int, $idUp3: Int) {
laporanCttKwhPeriksa(
dateFrom: $dateFrom
dateTo: $dateTo
posko: $posko
idUid: $idUid
idUp3: $idUp3
) {
dlpd
history_p2ti
nama_posko
rekomendasi_sistem_mendatangkan_petugas
total_wo
total_wo_cc123
total_wo_comcen
total_wo_loket
total_wo_pln_mobile
}
}
`
const filterData = (params: any) => {
const { posko, uid, up3 } = params
const dateValue = params.periode.split(' s/d ')
refetch({
dateFrom: dateValue[0] ? dateValue[0].split('-').reverse().join('-') : new Date().toISOString().slice(0, 10),
dateTo: dateValue[1] ? dateValue[1].split('-').reverse().join('-') : new Date().toISOString().slice(0, 10),
posko: posko ? posko.id : "",
idUid: uid ? uid.id : 0,
idUp3: up3 ? up3.id : 0
})
onResult((queryResult) => {
if (queryResult.data != undefined) {
queryResult.data.daftarGangguanDialihkanKePoskoLain.forEach((item: any) => {
data.value = [
...data.value,
{
...item,
}
]
})
}
console.log(queryResult.data)
console.log(queryResult.loading)
console.log(queryResult.networkStatus)
})
onError((error) => {
console.log(error)
})
}
const { onResult, onError, loading, refetch } = useQuery(
GET_laporanCttKwhPeriksa,
{
dateFrom: new Date().toISOString().slice(0, 10),
dateTo: new Date().toISOString().slice(0, 10),
posko: '',
idUid: 0,
idUp3: 0
}
)
const onSelectionChanged = ({ selectedRowsData }: any) => { const onSelectionChanged = ({ selectedRowsData }: any) => {
const data = selectedRowsData[0] const data = selectedRowsData[0]
dataDetail.value = data
console.log(data) console.log(data)
} }
const showData = () => {
const filters = ref() showDetail.value = true
const filterData = (filters: any) => {
console.log(filters)
} }
const filters = ref()
</script> </script>

View File

@ -1,6 +1,6 @@
<template> <template>
<Filters @run-search="() => filterData(filters)" class="mb-4"> <Filters @reset-form="runReset = !runReset" @run-search="() => filterData(filters)" class="mb-4">
<Type1 @update:filters="(value) => { <Type1 :run-reset="runReset" @update:filters="(value) => {
filters = value filters = value
} }
" /> " />
@ -12,15 +12,18 @@
:hover-state-enabled="true" @selection-changed="onSelectionChanged" :column-width="100" @exporting="onExporting" :hover-state-enabled="true" @selection-changed="onSelectionChanged" :column-width="100" @exporting="onExporting"
:allow-column-resizing="true" column-resizing-mode="widget"> :allow-column-resizing="true" column-resizing-mode="widget">
<DxPaging :page-size="5" :enabled="true" /> <DxPaging :page-size="5" :enabled="true" />
<DxPager :visible="true" :allowed-page-sizes="[5, 10, 20, 'all']" display-mode="full" <DxPager :visible="true" :allowed-page-sizes="[5, 10, 20]" display-mode="full" :show-page-size-selector="true"
:show-page-size-selector="true" :show-info="true" :show-navigation-buttons="true" /> :show-info="true" :show-navigation-buttons="true" />
<DxSelection mode="single" /> <DxSelection mode="single" />
<!-- <DxScrolling column-rendering-mode="virtual" mode="virtual" row-rendering-mode="virtual" /> --> <!-- <DxScrolling column-rendering-mode="virtual" mode="virtual" row-rendering-mode="virtual" /> -->
<DxLoadPanel :position="position" :show-indicator="showIndicator" :show-pane="showPane" :shading="shading" <DxLoadPanel :position="position" :show-indicator="showIndicator" :show-pane="showPane" :shading="shading"
v-if="loading" v-model:visible="loading" :enabled="true" /> v-if="loading" v-model:visible="loading" :enabled="true" />
<DxSearchPanel :visible="true" :highlight-case-sensitive="true" /> <DxSearchPanel :visible="true" :highlight-case-sensitive="true" />
<DxExport :enabled="true" :formats="['pdf', 'xlsx', 'document']" :allow-export-selected-data="false" /> <DxExport :enabled="true" :formats="['pdf', 'xlsx', 'document']" :allow-export-selected-data="false" />
<DxColumn css-class="custom-table-column" :width="50" alignment="center"
:calculateCellValue="(item: any) => data.findIndex((i) => i == item) + 1" data-type="number" caption="No" />
<DxColumn css-class="custom-table-column" :width="150" alignment="center" data-field="no_laporan"
caption="No Laporan" cell-template="data" />
<DxColumn css-class="custom-table-column" :width="150" alignment="center" data-field="pembuat_laporan" <DxColumn css-class="custom-table-column" :width="150" alignment="center" data-field="pembuat_laporan"
caption="Pembuat Laporan" cell-template="data" /> caption="Pembuat Laporan" cell-template="data" />
<DxColumn css-class="custom-table-column" :width="150" alignment="center" data-field="waktu_lapor" <DxColumn css-class="custom-table-column" :width="150" alignment="center" data-field="waktu_lapor"
@ -31,13 +34,13 @@
caption="Tgl Response" cell-template="data" /> caption="Tgl Response" cell-template="data" />
<DxColumn css-class="custom-table-column" :width="150" alignment="center" data-field="waktu_recovery" <DxColumn css-class="custom-table-column" :width="150" alignment="center" data-field="waktu_recovery"
caption="Tgl Recovery" cell-template="data" /> caption="Tgl Recovery" cell-template="data" />
<DxColumn css-class="custom-table-column" :width="170" alignment="center" data-field="durasi_respon_time" <DxColumn css-class="custom-table-column" :width="170" alignment="center" data-field="durasi_response_time"
caption="Durasi Response Time" cell-template="data" /> caption="Durasi Response Time" cell-template="data" />
<DxColumn css-class="custom-table-column" :width="170" alignment="center" data-field="durasi_recovery_time" <DxColumn css-class="custom-table-column" :width="170" alignment="center" data-field="durasi_recovery_time"
caption="Durasi Recovery Time" cell-template="data" /> caption="Durasi Recovery Time" cell-template="data" />
<DxColumn css-class="custom-table-column" :width="170" alignment="center" data-field="posko_asal" <DxColumn css-class="custom-table-column" :width="170" alignment="center" data-field="nama_posko_lama"
caption="Posko Awal" cell-template="data" /> caption="Posko Awal" cell-template="data" />
<DxColumn css-class="custom-table-column" :width="170" alignment="center" data-field="posko_tujuan" <DxColumn css-class="custom-table-column" :width="170" alignment="center" data-field="nama_posko_baru"
caption="Posko Tujuan" cell-template="data" /> caption="Posko Tujuan" cell-template="data" />
<DxColumn css-class="custom-table-column" :width="150" alignment="center" data-field="status_akhir" caption="Status" <DxColumn css-class="custom-table-column" :width="150" alignment="center" data-field="status_akhir" caption="Status"
cell-template="data" /> cell-template="data" />
@ -125,14 +128,14 @@
<h3 class="text-sm font-medium w-[170px] text-gray-800"> <h3 class="text-sm font-medium w-[170px] text-gray-800">
Posko Awal: Posko Awal:
</h3> </h3>
<InputText :readonly="true" :value="dataDetail?.posko_asal" class-name="flex-1" /> <InputText :readonly="true" :value="dataDetail?.nama_posko_lama" class-name="flex-1" />
</div> </div>
<div class="flex flex-row items-center justify-between w-full"> <div class="flex flex-row items-center justify-between w-full">
<h3 class="text-sm font-medium w-[170px] text-gray-800"> <h3 class="text-sm font-medium w-[170px] text-gray-800">
Posko Tujuan: Posko Tujuan:
</h3> </h3>
<InputText :readonly="true" :value="dataDetail?.posko_tujuan" class-name="flex-1" /> <InputText :readonly="true" :value="dataDetail?.nama_posko_baru" class-name="flex-1" />
</div> </div>
<div class="flex flex-row items-center justify-between w-full"> <div class="flex flex-row items-center justify-between w-full">
@ -188,7 +191,7 @@
<h3 class="text-sm font-medium w-[170px] text-gray-800"> <h3 class="text-sm font-medium w-[170px] text-gray-800">
Posko: Posko:
</h3> </h3>
<InputText :readonly="true" :value="dataDetail?.posko_asal" class-name="flex-1" /> <InputText :readonly="true" :value="dataDetail?.nama_posko_lama" class-name="flex-1" />
</div> </div>
</div> </div>
@ -215,7 +218,6 @@ import { exportDataGrid as exportToPdf } from 'devextreme/pdf_exporter'
import { exportDataGrid as exportToExcel } from 'devextreme/excel_exporter' import { exportDataGrid as exportToExcel } from 'devextreme/excel_exporter'
import { saveAs } from 'file-saver' import { saveAs } from 'file-saver'
import { Workbook } from 'exceljs' import { Workbook } from 'exceljs'
import { useDialogStore } from '@/stores/dialog' import { useDialogStore } from '@/stores/dialog'
import DetailDialog from '@/components/Dialogs/DetailDialog.vue' import DetailDialog from '@/components/Dialogs/DetailDialog.vue'
import InputText from '@/components/InputText.vue' import InputText from '@/components/InputText.vue'
@ -230,24 +232,23 @@ const dialog = useDialogStore()
const data = ref<any[]>([]) const data = ref<any[]>([])
const dataDetail = ref<any>() const dataDetail = ref<any>()
const showDetail = ref(false) const showDetail = ref(false)
const runReset = ref(false)
const closeDetail = () => { const closeDetail = () => {
showDetail.value = false showDetail.value = false
} }
const onExporting = (e: any) => { const onExporting = (e: any) => {
if (e.format === 'pdf') { if (e.format === 'pdf') {
const doc = new jsPDF() const doc = new jsPDF()
exportToPdf({ exportToPdf({
jsPDFDocument: doc, jsPDFDocument: doc,
component: e.component, component: e.component,
indent: 5 indent: 100
}).then(() => { }).then(() => {
doc.save(`.pdf`) doc.save(`.pdf`)
}) })
} else { } else {
const workbook = new Workbook() const workbook = new Workbook()
const worksheet = workbook.addWorksheet('Employees') const worksheet = workbook.addWorksheet('Daftar Gangguan Dialihkan Ke Posko Lain')
exportToExcel({ exportToExcel({
component: e.component, component: e.component,
@ -255,7 +256,7 @@ const onExporting = (e: any) => {
autoFilterEnabled: true autoFilterEnabled: true
}).then(() => { }).then(() => {
workbook.xlsx.writeBuffer().then((buffer: any) => { workbook.xlsx.writeBuffer().then((buffer: any) => {
saveAs(new Blob([buffer], { type: 'application/octet-stream' }), 'DataGrid.xlsx') saveAs(new Blob([buffer], { type: 'application/octet-stream' }), 'DaftarGangguanDialihkanKePoskoLain.xlsx')
}) })
}) })
@ -264,7 +265,7 @@ const onExporting = (e: any) => {
} }
const GET_GANGGUAN_DATA_DI_ALIHAN_KE_POSKO_LAIN = gql` const GET_GANGGUAN_DATA_DI_ALIHAN_KE_POSKO_LAIN = gql`
query DaftarGangguan($dateFrom: Date!, $dateTo: Date!, $posko: String, $idUid: Int, $idUp3: Int) { query DaftarGangguan($dateFrom: Date!, $dateTo: Date!, $posko: Int, $idUid: Int, $idUp3: Int) {
daftarGangguanDialihkanKePoskoLain( daftarGangguanDialihkanKePoskoLain(
dateFrom: $dateFrom dateFrom: $dateFrom
dateTo: $dateTo dateTo: $dateTo
@ -275,18 +276,18 @@ const GET_GANGGUAN_DATA_DI_ALIHAN_KE_POSKO_LAIN = gql`
alamat_pelapor alamat_pelapor
durasi_recovery_time durasi_recovery_time
durasi_response_time durasi_response_time
waktu_lapor
waktu_dialihkan waktu_dialihkan
waktu_recovery waktu_recovery
waktu_response waktu_response
id_gangguan
idpel_nometer idpel_nometer
keterangan_pelapor keterangan_pelapor
media media
nama_pelapor nama_pelapor
no_laporan no_laporan
no_telp_pelapor no_telp_pelapor
posko_asal nama_posko_lama
posko_tujuan nama_posko_baru
status_akhir status_akhir
waktu_recovery waktu_recovery
waktu_response waktu_response
@ -299,7 +300,7 @@ const filterData = (params: any) => {
refetch({ refetch({
dateFrom: dateValue[0] ? dateValue[0].split('-').reverse().join('-') : new Date().toISOString().slice(0, 10), dateFrom: dateValue[0] ? dateValue[0].split('-').reverse().join('-') : new Date().toISOString().slice(0, 10),
dateTo: dateValue[1] ? dateValue[1].split('-').reverse().join('-') : new Date().toISOString().slice(0, 10), dateTo: dateValue[1] ? dateValue[1].split('-').reverse().join('-') : new Date().toISOString().slice(0, 10),
posko: posko ? posko.id : "", posko: posko ? posko.id : 0,
idUid: uid ? uid.id : 0, idUid: uid ? uid.id : 0,
idUp3: up3 ? up3.id : 0 idUp3: up3 ? up3.id : 0
}) })
@ -311,9 +312,7 @@ const filterData = (params: any) => {
{ {
...item, ...item,
pembuat_laporan: '-', pembuat_laporan: '-',
waktu_lapor: '-', posko: item.nama_posko_baru
status_akhir: fetchStatus(item.status_akhir),
posko: item.posko_asal
} }
] ]
}) })

View File

@ -6,7 +6,7 @@
} }
" /> " />
</Filters> </Filters>
<div> <div id="data">
<DxDataGrid class="max-h-[calc(100vh-140px)]" :data-source="data" :show-column-lines="true" :show-row-lines="false" <DxDataGrid class="max-h-[calc(100vh-140px)]" :data-source="data" :show-column-lines="true" :show-row-lines="false"
:show-borders="true" :row-alternation-enabled="true" :hover-state-enabled="true" :show-borders="true" :row-alternation-enabled="true" :hover-state-enabled="true"
@selection-changed="onSelectionChanged" :column-width="100" @exporting="onExporting" @selection-changed="onSelectionChanged" :column-width="100" @exporting="onExporting"

View File

@ -19,7 +19,8 @@
<DxSearchPanel :visible="true" :highlight-case-sensitive="true" /> <DxSearchPanel :visible="true" :highlight-case-sensitive="true" />
<DxExport :enabled="true" :formats="['pdf', 'xlsx', 'document']" :allow-export-selected-data="false" /> <DxExport :enabled="true" :formats="['pdf', 'xlsx', 'document']" :allow-export-selected-data="false" />
<DxColumnFixing :enabled="true" /> <DxColumnFixing :enabled="true" />
<DxColumn css-class="custom-table-column" :width="50" alignment="center"
:calculateCellValue="(item: any) => data.findIndex((i) => i == item) + 1" data-type="number" caption="No" />
<DxColumn :width="60" alignment="center" data-field="no" caption="NO" css-class="custom-table-column" /> <DxColumn :width="60" alignment="center" data-field="no" caption="NO" css-class="custom-table-column" />
<DxColumn :width="150" name="poskoGroup" alignment="center" data-field="posko" caption="Posko" <DxColumn :width="150" name="poskoGroup" alignment="center" data-field="posko" caption="Posko"
css-class="custom-table-column" :group-index="0" /> css-class="custom-table-column" :group-index="0" />
@ -260,7 +261,7 @@ const filterData = (params: any) => {
refetch({ refetch({
dateFrom: dateValue[0] ? dateValue[0].split('-').reverse().join('-') : new Date().toISOString().slice(0, 10), dateFrom: dateValue[0] ? dateValue[0].split('-').reverse().join('-') : new Date().toISOString().slice(0, 10),
dateTo: dateValue[1] ? dateValue[1].split('-').reverse().join('-') : new Date().toISOString().slice(0, 10), dateTo: dateValue[1] ? dateValue[1].split('-').reverse().join('-') : new Date().toISOString().slice(0, 10),
posko: posko ? posko.id : "", posko: posko ? posko.id : 0,
idUid: uid ? uid.id : 0, idUid: uid ? uid.id : 0,
idUp3: up3 ? up3.id : 0, idUp3: up3 ? up3.id : 0,
}) })

View File

@ -188,7 +188,7 @@ const filterData = (params: any) => {
refetch({ refetch({
dateFrom: dateValue[0] ? dateValue[0].split('-').reverse().join('-') : new Date().toISOString().slice(0, 10), dateFrom: dateValue[0] ? dateValue[0].split('-').reverse().join('-') : new Date().toISOString().slice(0, 10),
dateTo: dateValue[1] ? dateValue[1].split('-').reverse().join('-') : new Date().toISOString().slice(0, 10), dateTo: dateValue[1] ? dateValue[1].split('-').reverse().join('-') : new Date().toISOString().slice(0, 10),
posko: posko ? posko.id : "", posko: posko ? posko.id : 0,
idUid: uid ? uid.id : 0, idUid: uid ? uid.id : 0,
idUp3: up3 ? up3.id : 0, idUp3: up3 ? up3.id : 0,
}) })

View File

@ -191,7 +191,7 @@ const filterData = (params: any) => {
refetch({ refetch({
dateFrom: dateValue[0] ? dateValue[0].split('-').reverse().join('-') : new Date().toISOString().slice(0, 10), dateFrom: dateValue[0] ? dateValue[0].split('-').reverse().join('-') : new Date().toISOString().slice(0, 10),
dateTo: dateValue[1]? dateValue[1].split('-').reverse().join('-') : new Date().toISOString().slice(0, 10), dateTo: dateValue[1]? dateValue[1].split('-').reverse().join('-') : new Date().toISOString().slice(0, 10),
posko: posko ? posko.id : "", posko: posko ? posko.id : 0,
idUid: uid ? uid.id :0, idUid: uid ? uid.id :0,
idUp3: up3? up3.id:0, idUp3: up3? up3.id:0,
}) })

View File

@ -158,7 +158,7 @@ const filterData = (params: any) => {
refetch({ refetch({
dateFrom: dateValue[0] ? dateValue[0].split('-').reverse().join('-') : new Date().toISOString().slice(0, 10), dateFrom: dateValue[0] ? dateValue[0].split('-').reverse().join('-') : new Date().toISOString().slice(0, 10),
dateTo: dateValue[1] ? dateValue[1].split('-').reverse().join('-') : new Date().toISOString().slice(0, 10), dateTo: dateValue[1] ? dateValue[1].split('-').reverse().join('-') : new Date().toISOString().slice(0, 10),
posko: posko ? posko.id : "", posko: posko ? posko.id : 0,
idUid: uid ? uid.id : 0, idUid: uid ? uid.id : 0,
idUp3: up3 ? up3.id : 0, idUp3: up3 ? up3.id : 0,
}) })

View File

@ -124,7 +124,7 @@ const filterData = (params: any) => {
refetch({ refetch({
dateFrom: dateValue[0] ? dateValue[0].split('-').reverse().join('-') : new Date().toISOString().slice(0, 10), dateFrom: dateValue[0] ? dateValue[0].split('-').reverse().join('-') : new Date().toISOString().slice(0, 10),
dateTo: dateValue[1]? dateValue[1].split('-').reverse().join('-') : new Date().toISOString().slice(0, 10), dateTo: dateValue[1]? dateValue[1].split('-').reverse().join('-') : new Date().toISOString().slice(0, 10),
posko: posko ? posko.id : "", posko: posko ? posko.id : 0,
idUid: uid ? uid.id :0, idUid: uid ? uid.id :0,
idUp3: up3? up3.id:0, idUp3: up3? up3.id:0,
}) })

View File

@ -275,7 +275,7 @@ const filterData = (params: any) => {
refetch({ refetch({
dateFrom: dateValue[0] ? dateValue[0].split('-').reverse().join('-') : new Date().toISOString().slice(0, 10), dateFrom: dateValue[0] ? dateValue[0].split('-').reverse().join('-') : new Date().toISOString().slice(0, 10),
dateTo: dateValue[1] ? dateValue[1].split('-').reverse().join('-') : new Date().toISOString().slice(0, 10), dateTo: dateValue[1] ? dateValue[1].split('-').reverse().join('-') : new Date().toISOString().slice(0, 10),
posko: posko ? posko.id : "", posko: posko ? posko.id : 0,
idUid: uid ? uid.id :0, idUid: uid ? uid.id :0,
idUp3: up3? up3.id:0, idUp3: up3? up3.id:0,
}) })

View File

@ -205,7 +205,7 @@ const filterData = (params: any) => {
refetch({ refetch({
dateFrom: dateValue[0] ? dateValue[0].split('-').reverse().join('-') : new Date().toISOString().slice(0, 10), dateFrom: dateValue[0] ? dateValue[0].split('-').reverse().join('-') : new Date().toISOString().slice(0, 10),
dateTo: dateValue[1] ? dateValue[1].split('-').reverse().join('-') : new Date().toISOString().slice(0, 10), dateTo: dateValue[1] ? dateValue[1].split('-').reverse().join('-') : new Date().toISOString().slice(0, 10),
posko: posko ? posko.id : "", posko: posko ? posko.id : 0,
idUid: uid ? uid.id :0, idUid: uid ? uid.id :0,
idUp3: up3? up3.id:0, idUp3: up3? up3.id:0,
}) })

View File

@ -181,7 +181,7 @@ const filterData = (params: any) => {
refetch({ refetch({
dateFrom: dateValue[0] ? dateValue[0].split('-').reverse().join('-') : new Date().toISOString().slice(0, 10), dateFrom: dateValue[0] ? dateValue[0].split('-').reverse().join('-') : new Date().toISOString().slice(0, 10),
dateTo: dateValue[1] ? dateValue[1].split('-').reverse().join('-') : new Date().toISOString().slice(0, 10), dateTo: dateValue[1] ? dateValue[1].split('-').reverse().join('-') : new Date().toISOString().slice(0, 10),
posko: posko ? posko.id : "", posko: posko ? posko.id : 0,
idUid: uid ? uid.id :0, idUid: uid ? uid.id :0,
idUp3: up3? up3.id:0, idUp3: up3? up3.id:0,
}) })

View File

@ -154,7 +154,7 @@ const filterData = (params: any) => {
refetch({ refetch({
dateFrom: dateValue[0] ? dateValue[0].split('-').reverse().join('-') : new Date().toISOString().slice(0, 10), dateFrom: dateValue[0] ? dateValue[0].split('-').reverse().join('-') : new Date().toISOString().slice(0, 10),
dateTo: dateValue[1] ? dateValue[1].split('-').reverse().join('-') : new Date().toISOString().slice(0, 10), dateTo: dateValue[1] ? dateValue[1].split('-').reverse().join('-') : new Date().toISOString().slice(0, 10),
posko: posko ? posko.id : "", posko: posko ? posko.id : 0,
idUid: uid ? uid.id :0, idUid: uid ? uid.id :0,
idUp3: up3? up3.id:0, idUp3: up3? up3.id:0,
}) })

View File

@ -12,10 +12,10 @@
column-resizing-mode="widget"> column-resizing-mode="widget">
<DxSelection mode="single" /> <DxSelection mode="single" />
<DxPaging :page-size="5" :enabled="true" /> <DxPaging :page-size="5" :enabled="true" />
<DxPager :visible="true" :allowed-page-sizes="[5, 10, 20, 'all']" display-mode="full" <DxPager :visible="true" :allowed-page-sizes="[5, 10, 20]" display-mode="full"
:show-page-size-selector="true" :show-info="true" :show-navigation-buttons="true" /> :show-page-size-selector="true" :show-info="true" :show-navigation-buttons="true" />
<DxLoadPanel :position="position" :show-indicator="showIndicator" :show-pane="showPane" :shading="shading" <DxLoadPanel :position="position" :show-indicator="showIndicator" :show-pane="showPane" :shading="shading"
v-if="loading" v-model:visible="loading" :enabled="true" /> v-if="loading" v-model:visible.sync="loading" :enabled="true" />
<DxSearchPanel :visible="true" :highlight-case-sensitive="true" /> <DxSearchPanel :visible="true" :highlight-case-sensitive="true" />
<DxExport :enabled="true" :formats="['pdf', 'xlsx', 'document']" :allow-export-selected-data="false" /> <DxExport :enabled="true" :formats="['pdf', 'xlsx', 'document']" :allow-export-selected-data="false" />
<DxColumn css-class="custom-table-column" :width="50" alignment="center" <DxColumn css-class="custom-table-column" :width="50" alignment="center"
@ -240,7 +240,7 @@ const filterData = (params: any) => {
maxJmlLapor: maxJmlLapor ? maxJmlLapor : 1, maxJmlLapor: maxJmlLapor ? maxJmlLapor : 1,
dateFrom: dateValue[0] ? dateValue[0].split('-').reverse().join('-') : new Date().toISOString().slice(0, 10), dateFrom: dateValue[0] ? dateValue[0].split('-').reverse().join('-') : new Date().toISOString().slice(0, 10),
dateTo: dateValue[1] ? dateValue[1].split('-').reverse().join('-') : new Date().toISOString().slice(0, 10), dateTo: dateValue[1] ? dateValue[1].split('-').reverse().join('-') : new Date().toISOString().slice(0, 10),
posko: posko ? posko.id : "", posko: posko ? posko.id : 0,
idUid: uid ? uid.id : 0, idUid: uid ? uid.id : 0,
idUp3: up3 ? up3.id : 0 idUp3: up3 ? up3.id : 0
}) })

View File

@ -159,7 +159,7 @@ const filterData = (params: any) => {
refetch({ refetch({
dateFrom: dateValue[0] ? dateValue[0].split('-').reverse().join('-') : new Date().toISOString().slice(0, 10), dateFrom: dateValue[0] ? dateValue[0].split('-').reverse().join('-') : new Date().toISOString().slice(0, 10),
dateTo: dateValue[1] ? dateValue[1].split('-').reverse().join('-') : new Date().toISOString().slice(0, 10), dateTo: dateValue[1] ? dateValue[1].split('-').reverse().join('-') : new Date().toISOString().slice(0, 10),
posko: posko ? posko.id : "", posko: posko ? posko.id : 0,
idUid: uid ? uid.id :0, idUid: uid ? uid.id :0,
idUp3: up3? up3.id:0, idUp3: up3? up3.id:0,
}) })

View File

@ -11,7 +11,7 @@
:column-width="100" @exporting="" :allow-column-resizing="true" column-resizing-mode="widget"> :column-width="100" @exporting="" :allow-column-resizing="true" column-resizing-mode="widget">
<DxSelection mode="single" /> <DxSelection mode="single" />
<DxPaging :page-size="5" :enabled="true" /> <DxPaging :page-size="5" :enabled="true" />
<DxPager :visible="true" :allowed-page-sizes="[5, 10, 20, 'all']" display-mode="full" <DxPager :visible="true" :allowed-page-sizes="[5, 10, 20]" display-mode="full"
:show-page-size-selector="true" :show-info="true" :show-navigation-buttons="true" /> :show-page-size-selector="true" :show-info="true" :show-navigation-buttons="true" />
<DxLoadPanel :position="position" :show-indicator="showIndicator" :show-pane="showPane" :shading="shading" <DxLoadPanel :position="position" :show-indicator="showIndicator" :show-pane="showPane" :shading="shading"
v-if="loading" v-model:visible="loading" :enabled="true" /> v-if="loading" v-model:visible="loading" :enabled="true" />
@ -75,7 +75,7 @@ const filterData = (params: any) => {
dateTo: dateValue[1] ? dateValue[1].split('-').reverse().join('-') : new Date().toISOString().slice(0, 10), dateTo: dateValue[1] ? dateValue[1].split('-').reverse().join('-') : new Date().toISOString().slice(0, 10),
minDurasiResponseTime : minTime ? minTime : 0, minDurasiResponseTime : minTime ? minTime : 0,
maxDurasiResponseTime : maxTime ? maxTime : 1, maxDurasiResponseTime : maxTime ? maxTime : 1,
posko: posko ? posko.id : "", posko: posko ? posko.id : 0,
idUid: uid ? uid.id : 0, idUid: uid ? uid.id : 0,
idUp3: up3 ? up3.id : 0 idUp3: up3 ? up3.id : 0
}) })

View File

@ -11,7 +11,7 @@
@exporting="" :allow-column-resizing="true" column-resizing-mode="widget"> @exporting="" :allow-column-resizing="true" column-resizing-mode="widget">
<DxSelection mode="single" /> <DxSelection mode="single" />
<DxPaging :page-size="5" :enabled="true" /> <DxPaging :page-size="5" :enabled="true" />
<DxPager :visible="true" :allowed-page-sizes="[5, 10, 20, 'all']" display-mode="full" <DxPager :visible="true" :allowed-page-sizes="[5, 10, 20]" display-mode="full"
:show-page-size-selector="true" :show-info="true" :show-navigation-buttons="true" /> :show-page-size-selector="true" :show-info="true" :show-navigation-buttons="true" />
<DxLoadPanel :position="position" :show-indicator="showIndicator" :show-pane="showPane" :shading="shading" <DxLoadPanel :position="position" :show-indicator="showIndicator" :show-pane="showPane" :shading="shading"
v-if="loading" v-model:visible="loading" :enabled="true" /> v-if="loading" v-model:visible="loading" :enabled="true" />
@ -75,7 +75,7 @@ const filterData = (params: any) => {
dateTo: dateValue[1] ? dateValue[1].split('-').reverse().join('-') : new Date().toISOString().slice(0, 10), dateTo: dateValue[1] ? dateValue[1].split('-').reverse().join('-') : new Date().toISOString().slice(0, 10),
minDurasiRecoveryTime: minDurasiRecoveryTime ? minDurasiRecoveryTime : 1, minDurasiRecoveryTime: minDurasiRecoveryTime ? minDurasiRecoveryTime : 1,
maxDurasiRecoveryTime: maxDurasiRecoveryTime ? maxDurasiRecoveryTime : 1, maxDurasiRecoveryTime: maxDurasiRecoveryTime ? maxDurasiRecoveryTime : 1,
posko: posko ? posko.id : "", posko: posko ? posko.id : 0,
idUid: uid ? uid.id : 0, idUid: uid ? uid.id : 0,
idUp3: up3 ? up3.id : 0 idUp3: up3 ? up3.id : 0
}) })

View File

@ -11,7 +11,7 @@
:column-width="100" @exporting="" :allow-column-resizing="true" column-resizing-mode="widget"> :column-width="100" @exporting="" :allow-column-resizing="true" column-resizing-mode="widget">
<DxSelection mode="single" /> <DxSelection mode="single" />
<DxPaging :page-size="5" :enabled="true" /> <DxPaging :page-size="5" :enabled="true" />
<DxPager :visible="true" :allowed-page-sizes="[5, 10, 20, 'all']" display-mode="full" <DxPager :visible="true" :allowed-page-sizes="[5, 10, 20]" display-mode="full"
:show-page-size-selector="true" :show-info="true" :show-navigation-buttons="true" /> :show-page-size-selector="true" :show-info="true" :show-navigation-buttons="true" />
<DxLoadPanel :position="position" :show-indicator="showIndicator" :show-pane="showPane" :shading="shading" <DxLoadPanel :position="position" :show-indicator="showIndicator" :show-pane="showPane" :shading="shading"
v-if="loading" v-model:visible="loading" :enabled="true" /> v-if="loading" v-model:visible="loading" :enabled="true" />
@ -108,7 +108,7 @@ const filterData = (params: any) => {
refetch({ refetch({
dateFrom: dateValue[0] ? dateValue[0].split('-').reverse().join('-') : new Date().toISOString().slice(0, 10), dateFrom: dateValue[0] ? dateValue[0].split('-').reverse().join('-') : new Date().toISOString().slice(0, 10),
dateTo: dateValue[1] ? dateValue[1].split('-').reverse().join('-') : new Date().toISOString().slice(0, 10), dateTo: dateValue[1] ? dateValue[1].split('-').reverse().join('-') : new Date().toISOString().slice(0, 10),
posko: posko ? posko.id : "", posko: posko ? posko.id : 0,
idUid: uid ? uid.id : 0, idUid: uid ? uid.id : 0,
idUp3: up3 ? up3.id : 0 idUp3: up3 ? up3.id : 0
}) })

View File

@ -11,7 +11,7 @@
:column-width="100" @exporting="" :allow-column-resizing="true" column-resizing-mode="widget"> :column-width="100" @exporting="" :allow-column-resizing="true" column-resizing-mode="widget">
<DxSelection mode="single" /> <DxSelection mode="single" />
<DxPaging :page-size="5" :enabled="true" /> <DxPaging :page-size="5" :enabled="true" />
<DxPager :visible="true" :allowed-page-sizes="[5, 10, 20, 'all']" display-mode="full" <DxPager :visible="true" :allowed-page-sizes="[5, 10, 20]" display-mode="full"
:show-page-size-selector="true" :show-info="true" :show-navigation-buttons="true" /> :show-page-size-selector="true" :show-info="true" :show-navigation-buttons="true" />
<DxLoadPanel :position="position" :show-indicator="showIndicator" :show-pane="showPane" :shading="shading" <DxLoadPanel :position="position" :show-indicator="showIndicator" :show-pane="showPane" :shading="shading"
v-if="loading" v-model:visible="loading" :enabled="true"/> v-if="loading" v-model:visible="loading" :enabled="true"/>
@ -103,7 +103,7 @@ const filterData = (params: any) => {
refetch({ refetch({
dateFrom: dateValue[0] ? dateValue[0].split('-').reverse().join('-') : new Date().toISOString().slice(0, 10), dateFrom: dateValue[0] ? dateValue[0].split('-').reverse().join('-') : new Date().toISOString().slice(0, 10),
dateTo: dateValue[1] ? dateValue[1].split('-').reverse().join('-') : new Date().toISOString().slice(0, 10), dateTo: dateValue[1] ? dateValue[1].split('-').reverse().join('-') : new Date().toISOString().slice(0, 10),
posko: posko ? posko.id : "", posko: posko ? posko.id : 0,
idUid: uid ? uid.id : 0, idUid: uid ? uid.id : 0,
idUp3: up3 ? up3.id : 0, idUp3: up3 ? up3.id : 0,
media : media ? media.id : "Twitter" media : media ? media.id : "Twitter"

View File

@ -11,7 +11,7 @@
:column-width="100" @exporting="" :allow-column-resizing="true" column-resizing-mode="widget"> :column-width="100" @exporting="" :allow-column-resizing="true" column-resizing-mode="widget">
<DxSelection mode="single" /> <DxSelection mode="single" />
<DxPaging :page-size="5" :enabled="true" /> <DxPaging :page-size="5" :enabled="true" />
<DxPager :visible="true" :allowed-page-sizes="[5, 10, 20, 'all']" display-mode="full" <DxPager :visible="true" :allowed-page-sizes="[5, 10, 20]" display-mode="full"
:show-page-size-selector="true" :show-info="true" :show-navigation-buttons="true" /> :show-page-size-selector="true" :show-info="true" :show-navigation-buttons="true" />
<DxLoadPanel :position="position" :show-indicator="showIndicator" :show-pane="showPane" :shading="shading" <DxLoadPanel :position="position" :show-indicator="showIndicator" :show-pane="showPane" :shading="shading"
v-if="loading" v-model:visible="loading" :enabled="true" /> v-if="loading" v-model:visible="loading" :enabled="true" />
@ -110,7 +110,7 @@ const filterData = (params: any) => {
refetch({ refetch({
dateFrom: dateValue[0] ? dateValue[0].split('-').reverse().join('-') : new Date().toISOString().slice(0, 10), dateFrom: dateValue[0] ? dateValue[0].split('-').reverse().join('-') : new Date().toISOString().slice(0, 10),
dateTo: dateValue[1] ? dateValue[1].split('-').reverse().join('-') : new Date().toISOString().slice(0, 10), dateTo: dateValue[1] ? dateValue[1].split('-').reverse().join('-') : new Date().toISOString().slice(0, 10),
posko: posko ? posko.id : "", posko: posko ? posko.id : 0,
idUid: uid ? uid.id : 0, idUid: uid ? uid.id : 0,
idUp3: up3?.id ? up3.id : 0, idUp3: up3?.id ? up3.id : 0,
}) })

View File

@ -12,7 +12,7 @@
:allow-column-resizing="true" column-resizing-mode="widget"> :allow-column-resizing="true" column-resizing-mode="widget">
<DxSelection mode="single" /> <DxSelection mode="single" />
<DxPaging :page-size="5" :enabled="true" /> <DxPaging :page-size="5" :enabled="true" />
<DxPager :visible="true" :allowed-page-sizes="[5, 10, 20, 'all']" display-mode="full" <DxPager :visible="true" :allowed-page-sizes="[5, 10, 20]" display-mode="full"
:show-page-size-selector="true" :show-info="true" :show-navigation-buttons="true" /> :show-page-size-selector="true" :show-info="true" :show-navigation-buttons="true" />
<DxLoadPanel :position="position" :show-indicator="showIndicator" :show-pane="showPane" :shading="shading" <DxLoadPanel :position="position" :show-indicator="showIndicator" :show-pane="showPane" :shading="shading"
v-if="loading" v-model:visible="loading" :enabled="true" /> v-if="loading" v-model:visible="loading" :enabled="true" />

View File

@ -245,7 +245,7 @@ const filterData = (params: any) => {
refetch({ refetch({
dateFrom: dateValue[0] ? dateValue[0].split('-').reverse().join('-') : new Date().toISOString().slice(0, 10), dateFrom: dateValue[0] ? dateValue[0].split('-').reverse().join('-') : new Date().toISOString().slice(0, 10),
dateTo: dateValue[1] ? dateValue[1].split('-').reverse().join('-') : new Date().toISOString().slice(0, 10), dateTo: dateValue[1] ? dateValue[1].split('-').reverse().join('-') : new Date().toISOString().slice(0, 10),
posko: posko ? posko.id : "", posko: posko ? posko.id : 0,
idUid: uid ? uid.id : 0, idUid: uid ? uid.id : 0,
idUp3: up3 ? up3.id : 0 idUp3: up3 ? up3.id : 0
}) })

View File

@ -5,15 +5,14 @@
} }
" /> " />
</Filters> </Filters>
<div id="data">
<div>
<DxDataGrid class="max-h-[calc(100vh-140px)]" :data-source="data" :show-column-lines="true" :show-row-lines="false" <DxDataGrid class="max-h-[calc(100vh-140px)]" :data-source="data" :show-column-lines="true" :show-row-lines="false"
:show-borders="true" :row-alternation-enabled="true" :hover-state-enabled="true" :show-borders="true" :row-alternation-enabled="true" :hover-state-enabled="true"
@selection-changed="onSelectionChanged" :column-width="100" @exporting="onExporting" @selection-changed="onSelectionChanged" :column-width="100" @exporting="onExporting"
:allow-column-resizing="true" column-resizing-mode="widget" :word-wrap-enabled="true"> :allow-column-resizing="true" column-resizing-mode="widget" :word-wrap-enabled="true">
<DxSelection mode="single" /> <DxSelection mode="single" />
<DxPaging :page-size="5" :enabled="true" /> <DxPaging :page-size="5" :enabled="true" />
<DxPager :visible="true" :allowed-page-sizes="[5, 10, 20, 'all']" display-mode="full" <DxPager :visible="true" :allowed-page-sizes="[5, 10, 20]" display-mode="full"
:show-page-size-selector="true" :show-info="true" :show-navigation-buttons="true" /> :show-page-size-selector="true" :show-info="true" :show-navigation-buttons="true" />
<DxLoadPanel :position="position" :show-indicator="showIndicator" :show-pane="showPane" :shading="shading" <DxLoadPanel :position="position" :show-indicator="showIndicator" :show-pane="showPane" :shading="shading"
v-if="loading" v-model:visible="loading" :enabled="true" /> v-if="loading" v-model:visible="loading" :enabled="true" />

View File

@ -5,14 +5,14 @@
} }
" /> " />
</Filters> </Filters>
<div> <div id="data">
<DxDataGrid class="max-h-[calc(100vh-140px)]" :data-source="data" :show-column-lines="true" :show-row-lines="false" <DxDataGrid class="max-h-[calc(100vh-140px)]" :data-source="data" :show-column-lines="true" :show-row-lines="false"
:show-borders="true" :row-alternation-enabled="true" :hover-state-enabled="true" :show-borders="true" :row-alternation-enabled="true" :hover-state-enabled="true"
@selection-changed="onSelectionChanged" :column-width="100" @exporting="onExporting" @selection-changed="onSelectionChanged" :column-width="100" @exporting="onExporting"
:allow-column-resizing="true" column-resizing-mode="widget" :word-wrap-enabled="true"> :allow-column-resizing="true" column-resizing-mode="widget" :word-wrap-enabled="true">
<DxSelection mode="single" /> <DxSelection mode="single" />
<DxPaging :page-size="5" :enabled="true" /> <DxPaging :page-size="5" :enabled="true" />
<DxPager :visible="true" :allowed-page-sizes="[5, 10, 20, 'all']" display-mode="full" <DxPager :visible="true" :allowed-page-sizes="[5, 10, 20]" display-mode="full"
:show-page-size-selector="true" :show-info="true" :show-navigation-buttons="true" /> :show-page-size-selector="true" :show-info="true" :show-navigation-buttons="true" />
<DxLoadPanel :position="position" :show-indicator="showIndicator" :show-pane="showPane" :shading="shading" <DxLoadPanel :position="position" :show-indicator="showIndicator" :show-pane="showPane" :shading="shading"
v-if="loading" v-model:visible="loading" :enabled="true" /> v-if="loading" v-model:visible="loading" :enabled="true" />

View File

@ -5,14 +5,14 @@
} }
" /> " />
</Filters> </Filters>
<div> <div id="data">
<DxDataGrid class="max-h-[calc(100vh-140px)]" :data-source="data" :show-column-lines="true" :show-row-lines="false" <DxDataGrid class="max-h-[calc(100vh-140px)]" :data-source="data" :show-column-lines="true" :show-row-lines="false"
:show-borders="true" :row-alternation-enabled="true" :hover-state-enabled="true" :show-borders="true" :row-alternation-enabled="true" :hover-state-enabled="true"
@selection-changed="onSelectionChanged" :column-width="100" @exporting="onExporting" @selection-changed="onSelectionChanged" :column-width="100" @exporting="onExporting"
:allow-column-resizing="true" column-resizing-mode="widget" :word-wrap-enabled="true"> :allow-column-resizing="true" column-resizing-mode="widget" :word-wrap-enabled="true">
<DxSelection mode="single" /> <DxSelection mode="single" />
<DxPaging :page-size="5" :enabled="true" /> <DxPaging :page-size="5" :enabled="true" />
<DxPager :visible="true" :allowed-page-sizes="[5, 10, 20, 'all']" display-mode="full" <DxPager :visible="true" :allowed-page-sizes="[5, 10, 20]" display-mode="full"
:show-page-size-selector="true" :show-info="true" :show-navigation-buttons="true" /> :show-page-size-selector="true" :show-info="true" :show-navigation-buttons="true" />
<DxLoadPanel :position="position" :show-indicator="showIndicator" :show-pane="showPane" :shading="shading" <DxLoadPanel :position="position" :show-indicator="showIndicator" :show-pane="showPane" :shading="shading"
v-if="loading" v-model:visible="loading" :enabled="true" /> v-if="loading" v-model:visible="loading" :enabled="true" />

View File

@ -5,14 +5,14 @@
} }
" /> " />
</Filters> </Filters>
<div> <div id="data">
<DxDataGrid class="max-h-[calc(100vh-140px)]" :data-source="data" :show-column-lines="true" :show-row-lines="false" <DxDataGrid class="max-h-[calc(100vh-140px)]" :data-source="data" :show-column-lines="true" :show-row-lines="false"
:show-borders="true" :row-alternation-enabled="true" :hover-state-enabled="true" :show-borders="true" :row-alternation-enabled="true" :hover-state-enabled="true"
@selection-changed="onSelectionChanged" :column-width="100" @exporting="onExporting" @selection-changed="onSelectionChanged" :column-width="100" @exporting="onExporting"
:allow-column-resizing="true" column-resizing-mode="widget" :word-wrap-enabled="true"> :allow-column-resizing="true" column-resizing-mode="widget" :word-wrap-enabled="true">
<DxSelection mode="single" /> <DxSelection mode="single" />
<DxPaging :page-size="5" :enabled="true" /> <DxPaging :page-size="5" :enabled="true" />
<DxPager :visible="true" :allowed-page-sizes="[5, 10, 20, 'all']" display-mode="full" <DxPager :visible="true" :allowed-page-sizes="[5, 10, 20]" display-mode="full"
:show-page-size-selector="true" :show-info="true" :show-navigation-buttons="true" /> :show-page-size-selector="true" :show-info="true" :show-navigation-buttons="true" />
<DxLoadPanel :position="position" :show-indicator="showIndicator" :show-pane="showPane" :shading="shading" <DxLoadPanel :position="position" :show-indicator="showIndicator" :show-pane="showPane" :shading="shading"
v-if="loading" v-model:visible="loading" :enabled="true" /> v-if="loading" v-model:visible="loading" :enabled="true" />

View File

@ -5,14 +5,14 @@
} }
" /> " />
</Filters> </Filters>
<div> <div id="data">
<DxDataGrid class="max-h-[calc(100vh-140px)]" :data-source="data" :show-column-lines="true" :show-row-lines="false" <DxDataGrid class="max-h-[calc(100vh-140px)]" :data-source="data" :show-column-lines="true" :show-row-lines="false"
:show-borders="true" :row-alternation-enabled="true" :hover-state-enabled="true" :show-borders="true" :row-alternation-enabled="true" :hover-state-enabled="true"
@selection-changed="onSelectionChanged" :column-width="100" @exporting="onExporting" @selection-changed="onSelectionChanged" :column-width="100" @exporting="onExporting"
:allow-column-resizing="true" column-resizing-mode="widget" :word-wrap-enabled="true"> :allow-column-resizing="true" column-resizing-mode="widget" :word-wrap-enabled="true">
<DxSelection mode="single" /> <DxSelection mode="single" />
<DxPaging :page-size="5" :enabled="true" /> <DxPaging :page-size="5" :enabled="true" />
<DxPager :visible="true" :allowed-page-sizes="[5, 10, 20, 'all']" display-mode="full" <DxPager :visible="true" :allowed-page-sizes="[5, 10, 20]" display-mode="full"
:show-page-size-selector="true" :show-info="true" :show-navigation-buttons="true" /> :show-page-size-selector="true" :show-info="true" :show-navigation-buttons="true" />
<DxLoadPanel :position="position" :show-indicator="showIndicator" :show-pane="showPane" :shading="shading" <DxLoadPanel :position="position" :show-indicator="showIndicator" :show-pane="showPane" :shading="shading"
v-if="loading" v-model:visible="loading" :enabled="true" /> v-if="loading" v-model:visible="loading" :enabled="true" />

View File

@ -5,14 +5,14 @@
} }
" /> " />
</Filters> </Filters>
<div> <div id="data">
<DxDataGrid class="max-h-[calc(100vh-140px)]" :show-column-lines="true" :show-row-lines="false" :show-borders="true" <DxDataGrid class="max-h-[calc(100vh-140px)]" :show-column-lines="true" :show-row-lines="false" :show-borders="true"
:row-alternation-enabled="true" :hover-state-enabled="true" @selection-changed="onSelectionChanged" :row-alternation-enabled="true" :hover-state-enabled="true" @selection-changed="onSelectionChanged"
:column-width="100" @exporting="onExporting" :allow-column-resizing="true" column-resizing-mode="widget" :column-width="100" @exporting="onExporting" :allow-column-resizing="true" column-resizing-mode="widget"
:word-wrap-enabled="true"> :word-wrap-enabled="true">
<DxSelection mode="single" /> <DxSelection mode="single" />
<DxPaging :page-size="5" :enabled="true" /> <DxPaging :page-size="5" :enabled="true" />
<DxPager :visible="true" :allowed-page-sizes="[5, 10, 20, 'all']" display-mode="full" <DxPager :visible="true" :allowed-page-sizes="[5, 10, 20]" display-mode="full"
:show-page-size-selector="true" :show-info="true" :show-navigation-buttons="true" /> :show-page-size-selector="true" :show-info="true" :show-navigation-buttons="true" />
<DxLoadPanel :position="position" :show-indicator="showIndicator" :show-pane="showPane" :shading="shading" <DxLoadPanel :position="position" :show-indicator="showIndicator" :show-pane="showPane" :shading="shading"
v-if="loading" v-model:visible="loading" :enabled="true" /> v-if="loading" v-model:visible="loading" :enabled="true" />

View File

@ -5,14 +5,14 @@
} }
" /> " />
</Filters> </Filters>
<div> <div id="data">
<DxDataGrid class="max-h-[calc(100vh-140px)]" :data-source="data" :show-column-lines="true" :show-row-lines="false" <DxDataGrid class="max-h-[calc(100vh-140px)]" :data-source="data" :show-column-lines="true" :show-row-lines="false"
:show-borders="true" :row-alternation-enabled="true" :hover-state-enabled="true" :show-borders="true" :row-alternation-enabled="true" :hover-state-enabled="true"
@selection-changed="onSelectionChanged" :column-width="100" @exporting="onExporting" @selection-changed="onSelectionChanged" :column-width="100" @exporting="onExporting"
:allow-column-resizing="true" column-resizing-mode="widget" :word-wrap-enabled="true"> :allow-column-resizing="true" column-resizing-mode="widget" :word-wrap-enabled="true">
<DxSelection mode="single" /> <DxSelection mode="single" />
<DxPaging :page-size="5" :enabled="true" /> <DxPaging :page-size="5" :enabled="true" />
<DxPager :visible="true" :allowed-page-sizes="[5, 10, 20, 'all']" display-mode="full" <DxPager :visible="true" :allowed-page-sizes="[5, 10, 20]" display-mode="full"
:show-page-size-selector="true" :show-info="true" :show-navigation-buttons="true" /> :show-page-size-selector="true" :show-info="true" :show-navigation-buttons="true" />
<DxLoadPanel :position="position" :show-indicator="showIndicator" :show-pane="showPane" :shading="shading" <DxLoadPanel :position="position" :show-indicator="showIndicator" :show-pane="showPane" :shading="shading"
v-if="loading" v-model:visible="loading" :enabled="true" /> v-if="loading" v-model:visible="loading" :enabled="true" />

View File

@ -5,7 +5,7 @@
} }
" /> " />
</Filters> </Filters>
<div> <div id="data">
<DxDataGrid class="max-h-[calc(100vh-140px)]" :data-source="data" :show-column-lines="true" :show-row-lines="false" <DxDataGrid class="max-h-[calc(100vh-140px)]" :data-source="data" :show-column-lines="true" :show-row-lines="false"
:show-borders="true" :row-alternation-enabled="true" :hover-state-enabled="true" :show-borders="true" :row-alternation-enabled="true" :hover-state-enabled="true"
@selection-changed="onSelectionChanged" :column-width="100" @exporting="onExporting" @selection-changed="onSelectionChanged" :column-width="100" @exporting="onExporting"

View File

@ -5,7 +5,7 @@
} }
" /> " />
</Filters> </Filters>
<div> <div id="data">
<DxDataGrid class="max-h-[calc(100vh-140px)]" :data-source="data" :show-column-lines="true" :show-row-lines="false" <DxDataGrid class="max-h-[calc(100vh-140px)]" :data-source="data" :show-column-lines="true" :show-row-lines="false"
:show-borders="true" :row-alternation-enabled="true" :hover-state-enabled="true" :show-borders="true" :row-alternation-enabled="true" :hover-state-enabled="true"
@selection-changed="onSelectionChanged" :column-width="100" @exporting="onExporting" @selection-changed="onSelectionChanged" :column-width="100" @exporting="onExporting"

View File

@ -5,7 +5,7 @@
} }
" /> " />
</Filters> </Filters>
<div> <div id="data">
<DxDataGrid class="max-h-[calc(100vh-140px)]" :data-source="data" :show-column-lines="true" :show-row-lines="false" <DxDataGrid class="max-h-[calc(100vh-140px)]" :data-source="data" :show-column-lines="true" :show-row-lines="false"
:show-borders="true" :row-alternation-enabled="true" :hover-state-enabled="true" :show-borders="true" :row-alternation-enabled="true" :hover-state-enabled="true"
@selection-changed="onSelectionChanged" :column-width="100" @exporting="onExporting" @selection-changed="onSelectionChanged" :column-width="100" @exporting="onExporting"

View File

@ -11,30 +11,35 @@
@exporting="" :allow-column-resizing="true" column-resizing-mode="widget"> @exporting="" :allow-column-resizing="true" column-resizing-mode="widget">
<DxSelection mode="single" /> <DxSelection mode="single" />
<DxPaging :page-size="5" :enabled="true" /> <DxPaging :page-size="5" :enabled="true" />
<DxPager :visible="true" :allowed-page-sizes="[5, 10, 20, 'all']" display-mode="full" <DxPager :visible="true" :allowed-page-sizes="[5, 10, 20]" display-mode="full"
:show-page-size-selector="true" :show-info="true" :show-navigation-buttons="true" /> :show-page-size-selector="true" :show-info="true" :show-navigation-buttons="true" />
<DxLoadPanel :position="position" :show-indicator="showIndicator" :show-pane="showPane" :shading="shading" <DxLoadPanel :position="position" :show-indicator="showIndicator" :show-pane="showPane" :shading="shading"
v-if="loading" v-model:visible="loading" :enabled="true" /> v-if="loading" v-model:visible="loading" :enabled="true" />
<DxSearchPanel :visible="true" :highlight-case-sensitive="true" /> <DxSearchPanel :visible="true" :highlight-case-sensitive="true" />
<DxExport :enabled="true" :formats="['pdf', 'xlsx', 'document']" :allow-export-selected-data="false" /> <DxExport :enabled="true" :formats="['pdf', 'xlsx', 'document']" :allow-export-selected-data="false" />
<DxColumn css-class="custom-table-column" :width="50" alignment="center"
:calculateCellValue="(item: any) => data.findIndex((i) => i == item) + 1" data-type="number" caption="No" />
<DxColumn css-class="custom-table-column" :width="50" alignment="center" data-field="" data-type="number" <DxColumn css-class="custom-table-column" :width="170" alignment="center" data-field="nomo_gangguan"
caption="No" />
<DxColumn css-class="custom-table-column" :width="170" alignment="center" data-field=""
caption="Nomor Gangguan" /> caption="Nomor Gangguan" />
<DxColumn css-class="custom-table-column" :width="170" alignment="center" data-field="" <DxColumn css-class="custom-table-column" :width="170" alignment="center" data-field="nama_pelanggan"
caption="Nama Pelanggan" /> caption="Nama Pelanggan" />
<DxColumn css-class="custom-table-column" :width="170" alignment="center" data-field="" caption="Isi Laporan" /> <DxColumn css-class="custom-table-column" :width="170" alignment="center" data-field="isi_laporan"
<DxColumn css-class="custom-table-column" :width="170" alignment="center" data-field="" caption="Isi Laporan" />
<DxColumn css-class="custom-table-column" :width="170" alignment="center" data-field="penyebab_gangguan"
caption="Penyebab Gangguan" /> caption="Penyebab Gangguan" />
<DxColumn css-class="custom-table-column" :width="170" alignment="center" data-field="" caption="Tgl Padam" /> <DxColumn css-class="custom-table-column" :width="170" alignment="center" data-field="waktu_padam"
caption="Tgl Padam" />
<DxColumn css-class="custom-table-column" :width="170" alignment="center" data-field="" caption="Tgl Nyala" /> <DxColumn css-class="custom-table-column" :width="170" alignment="center" data-field="" caption="Tgl Nyala" />
<DxColumn css-class="custom-table-column" :width="170" alignment="center" data-field="" caption="Regu" /> <DxColumn css-class="custom-table-column" :width="170" alignment="center" data-field="regu" caption="Regu" />
<DxColumn css-class="custom-table-column" alignment="center" caption="Material Yang Dipakai"> <DxColumn css-class="custom-table-column" alignment="center" caption="Material Yang Dipakai">
<DxColumn css-class="custom-table-column" :width="170" alignment="center" data-field="" caption="Sumber" /> <DxColumn css-class="custom-table-column" :width="170" alignment="center" data-field="sumber"
caption="Sumber" />
<DxColumn css-class="custom-table-column" :width="170" alignment="center" data-field="" caption="Nama" /> <DxColumn css-class="custom-table-column" :width="170" alignment="center" data-field="" caption="Nama" />
<DxColumn css-class="custom-table-column" :width="170" alignment="center" data-field="" caption="Satuan" /> <DxColumn css-class="custom-table-column" :width="170" alignment="center" data-field="satuan"
<DxColumn css-class="custom-table-column" :width="170" alignment="center" data-field="" caption="Vol" /> caption="Satuan" />
<DxColumn css-class="custom-table-column" :width="170" alignment="center" data-field="volume"
caption="Vol" />
</DxColumn> </DxColumn>
</DxDataGrid> </DxDataGrid>
@ -42,19 +47,81 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { onMounted, ref } from 'vue' import { onMounted, ref } from 'vue'
import { useFiltersStore } from '@/stores/filters'
import { DxDataGrid } from 'devextreme-vue' import { DxDataGrid } from 'devextreme-vue'
import { DxColumn, DxExport, DxLoadPanel, DxPager, DxPaging, DxScrolling, DxSearchPanel, DxSelection } from 'devextreme-vue/data-grid' import { DxColumn, DxExport, DxLoadPanel, DxPager, DxPaging, DxScrolling, DxSearchPanel, DxSelection } from 'devextreme-vue/data-grid'
import Filters from '@/components/Form/Filters.vue'; import Filters from '@/components/Form/Filters.vue';
import { Type14 } from '@/components/Form/FiltersType'; import { Type14 } from '@/components/Form/FiltersType';
import { useQuery } from '@vue/apollo-composable';
import gql from 'graphql-tag';
const position = { of: '#data' } const position = { of: '#data' }
const showIndicator = ref(true) const showIndicator = ref(true)
const shading = ref(true) const shading = ref(true)
const showPane = ref(true) const showPane = ref(true)
const loading = ref(false) const data = ref<any[]>([])
const filters = ref()
const filterData = (filters: any) => { const daftarGangguanDanMaterialDipakai = gql`
console.log(filters) query DaftardaftarGangguanDanMaterialDipakai(
$dateFrom: Date!, $dateTo: Date!, $posko: String, $idUid: Int, $idUp3: Int
) {
daftarGangguanDanMaterialDipakai(
dateFrom: $dateFrom
dateTo: $dateTo
distribusi: $idUid
area: $idUp3
posko: $posko
) {
isi_laporan
nama_material
nama_pelanggan
nomor_gangguan
penyebab_gangguan
regu
satuan
sumber
volume
waktu_padam
}
}
`
const { onResult, onError, loading, refetch } = useQuery(daftarGangguanDanMaterialDipakai, {
dateFrom: new Date("2023-10-01").toISOString().slice(0, 10),
dateTo: new Date("2023-10-01").toISOString().slice(0, 10),
idUid: 0,
idUp3: 0,
posko: ''
})
const filterData = (params: any) => {
const dateValue = params.periode.split(' s/d ')
const { posko, idUid, idUp3 } = params
refetch({
dateFrom: dateValue[0] ? dateValue[0].split('-').reverse().join('-') : new Date().toISOString().slice(0, 10),
dateTo: dateValue[1]? dateValue[1].split('-').reverse().join('-') : new Date().toISOString().slice(0, 10),
idUid: idUid ? idUid.id : 0,
idUp3: idUp3 ? idUp3.id : 0,
posko: posko ? posko.id : "",
})
onResult((queryResult) => {
if (queryResult.data != undefined) {
queryResult.data.daftarGangguanDanMaterialDipakai.forEach((item: any) => {
data.value = [
...data.value,
{
...item
}
]
})
}
console.log(queryResult.data)
console.log(queryResult.loading)
console.log(queryResult.networkStatus)
})
onError((error) => {
console.log(error)
})
} }
const filters = ref()
</script> </script>

View File

@ -1,29 +1,35 @@
<template> <template>
<div> <Filters @run-search="() => filterData(filters)" class="mb-4">
<Type14 @update:filters="(value) => {
filters = value
}
" />
</Filters>
<div id="data">
<DxDataGrid class="max-h-[calc(100vh-140px)]" :show-column-lines="true" :show-row-lines="false" :show-borders="true" <DxDataGrid class="max-h-[calc(100vh-140px)]" :show-column-lines="true" :show-row-lines="false" :show-borders="true"
:row-alternation-enabled="true" :hover-state-enabled="true" @selection-changed="" :column-width="100" :row-alternation-enabled="true" :hover-state-enabled="true" @selection-changed="" :column-width="100"
@exporting="" :allow-column-resizing="true" column-resizing-mode="widget"> @exporting="" :allow-column-resizing="true" column-resizing-mode="widget">
<DxSelection mode="single" /> <DxSelection mode="single" />
<DxPaging :page-size="5" :enabled="true" /> <DxPaging :page-size="5" :enabled="true" />
<DxPager :visible="true" :allowed-page-sizes="[5, 10, 20, 'all']" display-mode="full" <DxPager :visible="true" :allowed-page-sizes="[5, 10, 20]" display-mode="full"
:show-page-size-selector="true" :show-info="true" :show-navigation-buttons="true" /> :show-page-size-selector="true" :show-info="true" :show-navigation-buttons="true" />
<DxLoadPanel :position="position" :show-indicator="showIndicator" :show-pane="showPane" :shading="shading" <DxLoadPanel :position="position" :show-indicator="showIndicator" :show-pane="showPane" :shading="shading"
v-if="loading" v-model:visible="loading" :enabled="true" /> v-if="loading" v-model:visible="loading" :enabled="true" />
<DxSearchPanel :visible="true" :highlight-case-sensitive="true" /> <DxSearchPanel :visible="true" :highlight-case-sensitive="true" />
<DxExport :enabled="true" :formats="['pdf', 'xlsx', 'document']" :allow-export-selected-data="false" /> <DxExport :enabled="true" :formats="['pdf', 'xlsx', 'document']" :allow-export-selected-data="false" />
<DxColumn css-class="custom-table-column" :width="50" alignment="center"
:calculateCellValue="(item: any) => data.findIndex((i) => i == item) + 1" data-type="number" caption="No" />
<DxColumn css-class="custom-table-column" :width="50" alignment="center" data-field="" data-type="number" <DxColumn css-class="custom-table-column" :width="170" alignment="center" data-field="kode_material"
caption="No" />
<DxColumn css-class="custom-table-column" :width="170" alignment="center" data-field=""
caption="Kode Material" /> caption="Kode Material" />
<DxColumn css-class="custom-table-column" :width="170" alignment="center" data-field="" <DxColumn css-class="custom-table-column" :width="170" alignment="center" data-field="nama_material"
caption="Nama Material" /> caption="Nama Material" />
<DxColumn css-class="custom-table-column" :width="120" alignment="center" data-field="" caption="Satuan" /> <DxColumn css-class="custom-table-column" :width="120" alignment="center" data-field="satuan" caption="Satuan" />
<DxColumn css-class="custom-table-column" :width="170" alignment="center" data-field="" <DxColumn css-class="custom-table-column" :width="170" alignment="center" data-field="sumber_material"
caption="Sumber Material" /> caption="Sumber Material" />
<DxColumn css-class="custom-table-column" alignment="center" caption="Tanggal"> <DxColumn css-class="custom-table-column" alignment="center" caption="Tanggal">
<DxColumn v-for="i in 31" css-class="custom-table-column" :width="150" alignment="center" data-field="" <DxColumn v-for="i in 31" :width="150" alignment="center" :data-field="`tgl${i}`" data-type="number"
:caption="i" /> :caption="i" css-class="custom-table-column" />
</DxColumn> </DxColumn>
</DxDataGrid> </DxDataGrid>
@ -31,21 +37,106 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { onMounted, ref } from 'vue' import { ref } from 'vue'
import { useFiltersStore } from '@/stores/filters'
import { DxDataGrid } from 'devextreme-vue' import { DxDataGrid } from 'devextreme-vue'
import { DxColumn, DxExport, DxLoadPanel, DxPager, DxPaging, DxScrolling, DxSearchPanel, DxSelection } from 'devextreme-vue/data-grid' import { DxColumn, DxExport, DxLoadPanel, DxPager, DxPaging, DxScrolling, DxSearchPanel, DxSelection } from 'devextreme-vue/data-grid'
import { Type14 } from '@/components/Form/FiltersType';
import Filters from '@/components/Form/Filters.vue';
import { useQuery } from '@vue/apollo-composable';
import gql from 'graphql-tag';
const position = { of: '#data' } const position = { of: '#data' }
const showIndicator = ref(true) const showIndicator = ref(true)
const shading = ref(true) const shading = ref(true)
const showPane = ref(true) const showPane = ref(true)
const loading = ref(false) const data = ref<any[]>([])
onMounted(() => { const rekapitulasiPemakaianMaterial = gql`
const filters = useFiltersStore() query DaftarrekapitulasiPemakaianMaterial(
$dateFrom: Date!, $dateTo: Date!, $posko: String, $idUid: Int, $idUp3: Int
) {
rekapitulasiPemakaianMaterial(
dateFrom: $dateFrom
dateTo: $dateTo
distribusi: $idUid
area: $idUp3
posko: $posko
) {
kode_material
nama_material
satuan
sumber_material
tgl1
tgl10
tgl11
tgl12
tgl13
tgl14
tgl15
tgl16
tgl17
tgl18
tgl19
tgl2
tgl20
tgl21
tgl22
tgl23
tgl24
tgl25
tgl26
tgl27
tgl28
tgl29
tgl3
tgl30
tgl31
tgl4
tgl5
tgl6
tgl7
tgl8
tgl9
filters.setConfig({ }
type: 'type-14' }
}) `
const { onResult, onError, loading, refetch } = useQuery(rekapitulasiPemakaianMaterial, {
dateFrom: new Date("2023-10-01").toISOString().slice(0, 10),
dateTo: new Date("2023-10-01").toISOString().slice(0, 10),
idUid: 0,
idUp3: 0,
posko: ''
}) })
const filterData = (params: any) => {
const dateValue = params.periode.split(' s/d ')
const { posko, idUid, idUp3 } = params
refetch({
dateFrom: dateValue[0] ? dateValue[0].split('-').reverse().join('-') : new Date().toISOString().slice(0, 10),
dateTo: dateValue[1]? dateValue[1].split('-').reverse().join('-') : new Date().toISOString().slice(0, 10),
idUid: idUid ? idUid.id : 0,
idUp3: idUp3 ? idUp3.id : 0,
posko: posko ? posko.id : "",
})
onResult((queryResult) => {
if (queryResult.data != undefined) {
queryResult.data.rekapitulasiPemakaianMaterial.forEach((item: any) => {
data.value = [
...data.value,
{
...item
}
]
})
}
console.log(queryResult.data)
console.log(queryResult.loading)
console.log(queryResult.networkStatus)
})
onError((error) => {
console.log(error)
})
}
const filters = ref()
</script> </script>

View File

@ -6,32 +6,34 @@
" /> " />
</Filters> </Filters>
<div id="data"> <div id="data">
<DxDataGrid class="max-h-[calc(100vh-140px)]" :data-source="data" :show-column-lines="true" :show-row-lines="false" :show-borders="true" <DxDataGrid class="max-h-[calc(100vh-140px)]" :data-source="data" :show-column-lines="true" :show-row-lines="false"
:row-alternation-enabled="true" :hover-state-enabled="true" @selection-changed="onSelectionChanged" :show-borders="true" :row-alternation-enabled="true" :hover-state-enabled="true"
:column-width="100" @exporting="onExporting" :allow-column-resizing="true" column-resizing-mode="widget" @selection-changed="onSelectionChanged" :column-width="100" @exporting="onExporting"
:word-wrap-enabled="true"> :allow-column-resizing="true" column-resizing-mode="widget" :word-wrap-enabled="true">
<DxSelection mode="single" /> <DxSelection mode="single" />
<DxPaging :enabled="false" /> <DxPaging :enabled="false" />
<DxScrolling column-rendering-mode="virtual" mode="virtual" /> <DxScrolling column-rendering-mode="virtual" mode="virtual" />
<DxLoadPanel :position="position" :show-indicator="showIndicator" :show-pane="showPane" :shading="shading" <DxLoadPanel :position="position" :show-indicator="showIndicator" :show-pane="showPane" :shading="shading"
v-if="loading" v-model:visible="loading" :enabled="true" /> v-if="loading" v-model:visible="loading" :enabled="true" />
<DxSearchPanel :visible="true" :highlight-case-sensitive="true" /> <DxSearchPanel :visible="true" :highlight-case-sensitive="true" />
<DxExport :enabled="true" :formats="['pdf', 'xlsx', 'document']" :allow-export-selected-data="false" /> <DxExport :enabled="true" :formats="['pdf', 'xlsx', 'document']" :allow-export-selected-data="false" />
<DxColumnFixing :enabled="true" /> <DxColumnFixing :enabled="true" />
<DxColumn :width="170" alignment="center" data-field="nama_posko" caption="Nama Unit" css-class="custom-table-column" /> <DxColumn :width="170" alignment="center" data-field="nama_posko" caption="Nama Unit"
<DxColumn alignment="center" caption="Januari 2019" css-class="custom-table-column"> css-class="custom-table-column" />
<DxColumn :width="120" alignment="center" data-field="keluhan_bulan_lalu" data-type="number" caption="Keluhan" <DxColumn alignment="center" :caption="`${getMonthName(bulanSekarang - 1)} ${tahunSekarang}`"
css-class="custom-table-column" /> css-class="custom-table-column">
<DxColumn :width="120" alignment="center" data-field="gangguan_bulan_lalu" data-type="number" caption="Gangguan" <DxColumn :width="120" alignment="center" data-field="keluhan_bulan_lalu" data-type="number"
css-class="custom-table-column" /> caption="Keluhan" css-class="custom-table-column" />
<DxColumn :width="120" alignment="center" data-field="gangguan_bulan_lalu" data-type="number"
caption="Gangguan" css-class="custom-table-column" />
<DxColumn alignment="center" caption="Informasi" css-class="custom-table-column"> <DxColumn alignment="center" caption="Informasi" css-class="custom-table-column">
<DxColumn :width="120" alignment="center" data-field="informasi_keluhan_bulan_lalu" data-type="number" caption="Keluhan" <DxColumn :width="120" alignment="center" data-field="informasi_keluhan_bulan_lalu" data-type="number"
css-class="custom-table-column" /> caption="Keluhan" css-class="custom-table-column" />
<DxColumn :width="120" alignment="center" data-field="informasi_gangguan_bulan_lalu" data-type="number" caption="Gangguan" <DxColumn :width="120" alignment="center" data-field="informasi_gangguan_bulan_lalu" data-type="number"
css-class="custom-table-column" /> caption="Gangguan" css-class="custom-table-column" />
<DxColumn :width="120" alignment="center" data-field="total_bulan_lalu" data-type="number" caption="Total" <DxColumn :width="120" alignment="center" data-field="total_bulan_lalu" data-type="number"
css-class="custom-table-column" /> caption="Total" css-class="custom-table-column" />
</DxColumn> </DxColumn>
<DxColumn alignment="center" caption="Belum Selesai" css-class="custom-table-column"> <DxColumn alignment="center" caption="Belum Selesai" css-class="custom-table-column">
<DxColumn :width="150" alignment="center" data-field="" data-type="number" caption="Jml" <DxColumn :width="150" alignment="center" data-field="" data-type="number" caption="Jml"
@ -39,22 +41,22 @@
<DxColumn :width="150" alignment="center" data-field="" data-type="number" caption="%" <DxColumn :width="150" alignment="center" data-field="" data-type="number" caption="%"
css-class="custom-table-column" /> css-class="custom-table-column" />
</DxColumn> </DxColumn>
<DxColumn alignment="center" caption="Total Komplain" css-class="custom-table-column" data-field="total_komplain_bulan_lalu" <DxColumn alignment="center" caption="Total Komplain" css-class="custom-table-column"
data-type="number" /> data-field="total_komplain_bulan_lalu" data-type="number" />
</DxColumn> </DxColumn>
<DxColumn alignment="center" caption="Januari 2020" css-class="custom-table-column"> <DxColumn alignment="center" caption="Januari 2020" css-class="custom-table-column">
<DxColumn :width="120" alignment="center" data-field="keluhan_bulan_ini" data-type="number" caption="Keluhan" <DxColumn :width="120" alignment="center" data-field="keluhan_bulan_ini" data-type="number"
css-class="custom-table-column" /> caption="Keluhan" css-class="custom-table-column" />
<DxColumn :width="120" alignment="center" data-field="keluhan_bulan_lalu" data-type="number" caption="Gangguan" <DxColumn :width="120" alignment="center" data-field="keluhan_bulan_lalu" data-type="number"
css-class="custom-table-column" /> caption="Gangguan" css-class="custom-table-column" />
<DxColumn alignment="center" caption="Informasi" css-class="custom-table-column"> <DxColumn alignment="center" caption="Informasi" css-class="custom-table-column">
<DxColumn :width="120" alignment="center" data-field="informasi_keluhan_bulan_ini" data-type="number" caption="Keluhan" <DxColumn :width="120" alignment="center" data-field="informasi_keluhan_bulan_ini" data-type="number"
css-class="custom-table-column" /> caption="Keluhan" css-class="custom-table-column" />
<DxColumn :width="120" alignment="center" data-field="informasi_gangguan_bulan_ini" data-type="number" caption="Gangguan" <DxColumn :width="120" alignment="center" data-field="informasi_gangguan_bulan_ini" data-type="number"
css-class="custom-table-column" /> caption="Gangguan" css-class="custom-table-column" />
<DxColumn :width="120" alignment="center" data-field="total_bulan_ini" data-type="number" caption="Total" <DxColumn :width="120" alignment="center" data-field="total_bulan_ini" data-type="number"
css-class="custom-table-column" /> caption="Total" css-class="custom-table-column" />
</DxColumn> </DxColumn>
<DxColumn alignment="center" caption="Belum Selesai" css-class="custom-table-column"> <DxColumn alignment="center" caption="Belum Selesai" css-class="custom-table-column">
<DxColumn :width="150" alignment="center" data-field="" data-type="number" caption="Jml" <DxColumn :width="150" alignment="center" data-field="" data-type="number" caption="Jml"
@ -62,26 +64,26 @@
<DxColumn :width="150" alignment="center" data-field="" data-type="number" caption="%" <DxColumn :width="150" alignment="center" data-field="" data-type="number" caption="%"
css-class="custom-table-column" /> css-class="custom-table-column" />
</DxColumn> </DxColumn>
<DxColumn alignment="center" caption="Total Komplain" css-class="custom-table-column" data-field="total_komplain_bulan_ini" <DxColumn alignment="center" caption="Total Komplain" css-class="custom-table-column"
data-type="number" /> data-field="total_komplain_bulan_ini" data-type="number" />
</DxColumn> </DxColumn>
<DxColumn alignment="center" caption="Delta Penurunan" css-class="custom-table-column"> <DxColumn alignment="center" caption="Delta Penurunan" css-class="custom-table-column">
<DxColumn :width="150" alignment="center" data-field="delta_penurunan_keluhan" data-type="number" caption="Keluhan" <DxColumn :width="150" alignment="center" data-field="delta_penurunan_keluhan" data-type="number"
css-class="custom-table-column" /> caption="Keluhan" css-class="custom-table-column" />
<DxColumn :width="150" alignment="center" data-field="delta_penurunan_gangguan" data-type="number" caption="Gangguan" <DxColumn :width="150" alignment="center" data-field="delta_penurunan_gangguan" data-type="number"
css-class="custom-table-column" /> caption="Gangguan" css-class="custom-table-column" />
<DxColumn :width="150" alignment="center" data-field="delta_penurunan_informasi" data-type="number" caption="Informasi" <DxColumn :width="150" alignment="center" data-field="delta_penurunan_informasi" data-type="number"
css-class="custom-table-column" /> caption="Informasi" css-class="custom-table-column" />
</DxColumn> </DxColumn>
<DxColumn alignment="center" caption="% Penurunan YoY" css-class="custom-table-column"> <DxColumn alignment="center" caption="% Penurunan YoY" css-class="custom-table-column">
<DxColumn :width="150" alignment="center" data-field="persen_penurunan_keluhan" data-type="number" caption="Keluhan" <DxColumn :width="150" alignment="center" data-field="persen_penurunan_keluhan" data-type="number"
css-class="custom-table-column" /> caption="Keluhan" css-class="custom-table-column" />
<DxColumn :width="150" alignment="center" data-field="persen_penurunan_gangguan" data-type="number" caption="Gangguan" <DxColumn :width="150" alignment="center" data-field="persen_penurunan_gangguan" data-type="number"
css-class="custom-table-column" /> caption="Gangguan" css-class="custom-table-column" />
<DxColumn :width="150" alignment="center" data-field="persen_penurunan_informasi" data-type="number" caption="Informasi" <DxColumn :width="150" alignment="center" data-field="persen_penurunan_informasi" data-type="number"
css-class="custom-table-column" /> caption="Informasi" css-class="custom-table-column" />
<DxColumn :width="150" alignment="center" data-field="persen_penurunan_total" data-type="number" caption="% Total" <DxColumn :width="150" alignment="center" data-field="persen_penurunan_total" data-type="number"
css-class="custom-table-column" /> caption="% Total" css-class="custom-table-column" />
</DxColumn> </DxColumn>
</DxDataGrid> </DxDataGrid>
@ -101,6 +103,7 @@ import { saveAs } from 'file-saver'
import { Workbook } from 'exceljs' import { Workbook } from 'exceljs'
import { useQuery } from '@vue/apollo-composable' import { useQuery } from '@vue/apollo-composable'
import gql from 'graphql-tag' import gql from 'graphql-tag'
import { getMonthName } from '@/utils/texts'
const position = { of: '#data' } const position = { of: '#data' }
const showIndicator = ref(true) const showIndicator = ref(true)
const shading = ref(true) const shading = ref(true)
@ -108,6 +111,15 @@ const showPane = ref(true)
const data = ref<any[]>([]) const data = ref<any[]>([])
const dataDetail = ref<any>() const dataDetail = ref<any>()
const showDetail = ref(false) const showDetail = ref(false)
const tahunSekarang = ref(new Date().getFullYear())
const bulanSekarang = ref(new Date().getMonth())
if (bulanSekarang.value - 1 == 0) {
let bulanLalu = 12
let tahunLalu = tahunSekarang.value - 1
} else {
let bulanLalu = bulanSekarang.value - 1
let tahunLalu = tahunSekarang.value
}
const onExporting = (e: any) => { const onExporting = (e: any) => {
if (e.format === 'pdf') { if (e.format === 'pdf') {
const doc = new jsPDF() const doc = new jsPDF()
@ -137,8 +149,8 @@ const onExporting = (e: any) => {
} }
} }
const onSelectionChanged = ({ selectedRowsData }: any) => { const onSelectionChanged = ({ selectedRowsData }: any) => {
const data = selectedRowsData[0] const data = selectedRowsData[0]
console.log(data) console.log(data)
} }
const penurunanJumlahKomplainBulanan = gql` const penurunanJumlahKomplainBulanan = gql`
query DaftarpenurunanJumlahKomplainBulanan( query DaftarpenurunanJumlahKomplainBulanan(
@ -181,42 +193,42 @@ const penurunanJumlahKomplainBulanan = gql`
} }
` `
const { onResult, onError, loading, refetch } = useQuery(penurunanJumlahKomplainBulanan, { const { onResult, onError, loading, refetch } = useQuery(penurunanJumlahKomplainBulanan, {
regional: '', regional: '',
posko: '', posko: '',
idUid: 0, idUid: 0,
idUp3: 0, idUp3: 0,
bulan: 10, bulan: 10,
tahun: 2023 tahun: 2023
}) })
const filterData = (params: any) => { const filterData = (params: any) => {
const { regional, posko, idUid, idUp3, bulan, tahun } = params const { regional, posko, idUid, idUp3, bulan, tahun } = params
refetch({ refetch({
regional: regional, regional: regional,
posko: posko ? posko.id : "", posko: posko ? posko.id : "",
idUid: idUid ? idUid.id : 0, idUid: idUid ? idUid.id : 0,
idUp3: idUp3 ? idUp3.id : 0, idUp3: idUp3 ? idUp3.id : 0,
bulan: bulan ? bulan.id : 10, bulan: bulan ? bulan.id : 10,
tahun: bulan ? tahun.id : 2023 tahun: bulan ? tahun.id : 2023
}) })
onResult((queryResult) => { onResult((queryResult) => {
if (queryResult.data != undefined) { if (queryResult.data != undefined) {
queryResult.data.penurunanJumlahKomplainBulanan.forEach((item: any) => { queryResult.data.penurunanJumlahKomplainBulanan.forEach((item: any) => {
data.value = [ data.value = [
...data.value, ...data.value,
{ {
...item ...item
} }
] ]
}) })
} }
console.log(queryResult.data) console.log(queryResult.data)
console.log(queryResult.loading) console.log(queryResult.loading)
console.log(queryResult.networkStatus) console.log(queryResult.networkStatus)
}) })
onError((error) => { onError((error) => {
console.log(error) console.log(error)
}) })
} }
const filters = ref() const filters = ref()
</script> </script>

View File

@ -71,6 +71,9 @@ const showPane = ref(true)
const data = ref<any[]>([]) const data = ref<any[]>([])
const dataDetail = ref<any>() const dataDetail = ref<any>()
const showDetail = ref(false) const showDetail = ref(false)
const tahunSekarang = ref(new Date().getFullYear())
const bulanSekarang = ref(new Date().getMonth())
const tahunLalu = ref(tahunSekarang.value - 1)
const onExporting = (e: any) => { const onExporting = (e: any) => {
if (e.format === 'pdf') { if (e.format === 'pdf') {
const doc = new jsPDF() const doc = new jsPDF()

View File

@ -11,7 +11,7 @@
@exporting="" :allow-column-resizing="true" column-resizing-mode="widget"> @exporting="" :allow-column-resizing="true" column-resizing-mode="widget">
<DxSelection mode="single" /> <DxSelection mode="single" />
<DxPaging :page-size="5" :enabled="true" /> <DxPaging :page-size="5" :enabled="true" />
<DxPager :visible="true" :allowed-page-sizes="[5, 10, 20, 'all']" display-mode="full" <DxPager :visible="true" :allowed-page-sizes="[5, 10, 20]" display-mode="full"
:show-page-size-selector="true" :show-info="true" :show-navigation-buttons="true" /> :show-page-size-selector="true" :show-info="true" :show-navigation-buttons="true" />
<DxLoadPanel :position="position" :show-indicator="showIndicator" :show-pane="showPane" :shading="shading" <DxLoadPanel :position="position" :show-indicator="showIndicator" :show-pane="showPane" :shading="shading"
v-if="loading" v-model:visible="loading" :enabled="true" /> v-if="loading" v-model:visible="loading" :enabled="true" />

View File

@ -1,107 +1,115 @@
<script setup lang="ts"> <script setup lang="ts">
interface DataItem {
id: number; import { type PropType } from 'vue'
name: string; import Multiselect from '@vueform/multiselect'
interface Tags {
id: number
value: string,
label: string
} }
import { ref, computed, onMounted } from 'vue' defineProps({
import {
Combobox,
ComboboxInput,
ComboboxButton,
ComboboxOptions,
ComboboxOption,
TransitionRoot
} from '@headlessui/vue'
import { CheckIcon, ChevronUpDownIcon } from '@heroicons/vue/20/solid'
const props = defineProps({
placeholder: { placeholder: {
type: String, type: String,
default: '' default: ''
}, },
data: { tags: {
type: Array as () => DataItem[], type: Array as PropType<Tags[]>,
default: [] required: true
},
useLabel: {
type: Boolean,
default: false
},
label: {
type: String,
default: ''
} }
}) })
const emit = defineEmits(["update:selected"])
const data = computed(() => [{ id: 0, name: props.placeholder }, ...props.data]);
let selected = ref<DataItem[]>([data.value[0]])
let query = ref('')
let filteredData = computed(() =>
query.value === ''
? data.value
: data.value.filter((item: DataItem) =>
item.name
.toLowerCase()
.replace(/\s+/g, '')
.includes(query.value.toLowerCase().replace(/\s+/g, ''))
)
)
const show = ref(false)
const removeJenis = (item: DataItem) => {
selected.value = selected.value.filter((i) => i.id !== item.id)
}
onMounted(() => {
})
</script> </script>
<template> <template>
<Combobox @update:modelValue="value => emit('update:selected', value)" v-model="selected" v-slot="{ open }" multiple> <div class="flex flex-col">
<div class="relative mt-1"> <Multiselect
mode="tags"
<div :placeholder="placeholder"
class="relative w-full cursor-default overflow-hidden rounded-lg bg-gray-200 text-left focus:outline-none focus-visible:ring-2 focus-visible:ring-white focus-visible:ring-opacity-75 focus-visible:ring-offset-2 focus-visible:ring-offset-teal-300 sm:text-sm"> :close-on-select="false"
<ComboboxInput class="w-full border-none py-2 pl-3 pr-10 bg-gray-200 text-sm leading-5 text-gray-900 focus:ring-0" :searchable="true"
:displayValue="(item: any) => (show || open ? '' : item.name)" @change="query = $event.target.value" :create-option="true"
@click="show = true" @blur="show = false" defaultValue="" /> :options="tags"
:classes="{
<ComboboxButton id="Test" class="absolute inset-y-0 right-0 flex items-center pr-2"> container:
<ChevronUpDownIcon class="h-5 w-5 text-gray-400" aria-hidden="true" /> 'relative py-[5px] mx-auto w-full flex items-center justify-end cursor-pointer rounded-lg bg-gray-200 text-left text-base leading-snug outline-none',
</ComboboxButton> containerDisabled: 'cursor-default bg-gray-50',
</div> containerOpen: 'rounded-b-none',
<span class="flex flex-wrap gap-2"> containerOpenTop: 'rounded-t-none',
<span v-if="selected.length == 0" class="p-0.5">Empty</span> containerActive: '',
<span v-for="item in selected" :key="item.id" class="inline-flex items-center rounded-md bg-blue-50 px-2 py-1 text-xs font-medium text-blue-700 ring-1 ring-inset ring-blue-700/10"> wrapper:
<span>{{ item.name }}</span> 'relative mx-auto w-full flex items-center justify-end box-border cursor-pointer outline-none',
<svg class="h-4 w-4 cursor-pointer" fill="none" stroke="currentColor" viewBox="0 0 24 24" singleLabel:
xmlns="http://www.w3.org/2000/svg" @click.stop.prevent="removeJenis(item)"> 'flex items-center h-full max-w-full absolute left-0 top-0 pointer-events-none bg-transparent leading-snug pl-3.5 pr-16 box-border rtl:left-auto rtl:right-0 rtl:pl-0 rtl:pr-3.5',
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12" /> singleLabelText: 'overflow-ellipsis overflow-hidden block whitespace-nowrap max-w-full',
</svg> multipleLabel:
</span> 'flex items-center h-full absolute left-0 top-0 pointer-events-none bg-transparent leading-snug pl-3.5 rtl:left-auto rtl:right-0 rtl:pl-0 rtl:pr-3.5',
</span> search:
<TransitionRoot :show="show || open" leave="transition ease-in duration-100" leaveFrom="opacity-100" 'w-full absolute inset-0 outline-none focus:ring-0 appearance-none box-border border-0 text-base font-sans bg-white rounded pl-3.5 rtl:pl-0 rtl:pr-3.5',
leaveTo="opacity-0" @after-leave="query = ''"> tags: 'flex-grow flex-shrink flex flex-wrap items-center mt-1 pl-2 min-w-0 rtl:pl-0 rtl:pr-2',
<ComboboxOptions static tag: 'bg-primary-500 text-white text-sm font-semibold py-0.5 pl-2 rounded mr-1 mb-1 flex items-center whitespace-nowrap min-w-0 rtl:pl-0 rtl:pr-2 rtl:mr-0 rtl:ml-1',
class="absolute mt-1 z-10 max-h-60 w-full overflow-auto rounded-md bg-gray-200 py-1 text-base shadow-lg ring-1 ring-black ring-opacity-5 focus:outline-none sm:text-sm"> tagDisabled: 'pr-2 opacity-50 rtl:pl-2',
<div v-if="filteredData.length === 0 && query !== ''" tagWrapper: 'whitespace-nowrap overflow-hidden overflow-ellipsis',
class="relative cursor-default select-none py-2 px-4 text-gray-700"> tagWrapperBreak: 'whitespace-normal break-all',
Nothing found. tagRemove:
</div> 'flex items-center justify-center p-1 mx-0.5 rounded-sm hover:bg-black hover:bg-opacity-10 group',
tagRemoveIcon:
<ComboboxOption v-for="item in filteredData" as="template" :key="item.id" :value="item" 'bg-multiselect-remove bg-center bg-no-repeat opacity-30 inline-block w-3 h-3 group-hover:opacity-60',
v-slot="{ selected, active }"> tagsSearchWrapper: 'inline-block relative mx-1 mb-1 flex-grow flex-shrink h-full',
<li class="relative cursor-default select-none py-2 pl-10 pr-4" :class="{ tagsSearch:
'bg-teal-600 text-white': active, ' bg-gray-200 absolute inset-0 border-0 outline-none focus:ring-0 appearance-none p-0 text-base font-sans box-border w-full',
'text-gray-900': !active tagsSearchCopy: 'invisible whitespace-pre-wrap inline-block h-px',
}"> placeholder:
<span class="block truncate" :class="{ 'font-medium': selected, 'font-normal': !selected }"> 'flex items-center text-sm h-full absolute left-0 top-0 pointer-events-none bg-transparent leading-snug pl-3.5 text-gray-400 rtl:left-auto rtl:right-0 rtl:pl-0 rtl:pr-3.5',
{{ item.name }} caret:
</span> 'bg-multiselect-caret bg-center bg-no-repeat w-2.5 h-4 py-px box-content mr-3.5 relative z-10 opacity-40 flex-shrink-0 flex-grow-0 transition-transform transform pointer-events-none rtl:mr-0 rtl:ml-3.5',
<span v-if="selected" class="absolute inset-y-0 left-0 flex items-center pl-3" caretOpen: 'rotate-180 pointer-events-auto',
:class="{ 'text-white': active, 'text-teal-600': !active }"> clear:
<CheckIcon class="h-5 w-5" aria-hidden="true" /> 'pr-3.5 relative z-10 opacity-40 transition duration-300 flex-shrink-0 flex-grow-0 flex hover:opacity-80 rtl:pr-0 rtl:pl-3.5',
</span> clearIcon:
</li> 'bg-multiselect-remove bg-center bg-no-repeat w-2.5 h-4 py-px box-content inline-block',
</ComboboxOption> spinner:
</ComboboxOptions> 'bg-multiselect-spinner bg-center bg-no-repeat w-4 h-4 z-10 mr-3.5 animate-spin flex-shrink-0 flex-grow-0 rtl:mr-0 rtl:ml-3.5',
</TransitionRoot> infinite: 'flex items-center justify-center w-full',
</div> infiniteSpinner:
</Combobox> 'bg-multiselect-spinner bg-center bg-no-repeat w-4 h-4 z-10 animate-spin flex-shrink-0 flex-grow-0 m-3.5',
</template> dropdown:
'max-h-60 absolute -left-px -right-px bottom-0 transform translate-y-full border border-gray-300 -mt-px overflow-y-scroll z-50 bg-white flex flex-col rounded-b',
dropdownTop: '-translate-y-full top-px bottom-auto rounded-b-none rounded-t',
dropdownHidden: 'hidden',
options: 'flex flex-col p-0 m-0 list-none',
optionsTop: '',
group: 'p-0 m-0',
groupLabel:
'flex text-sm box-border items-center justify-start text-left py-1 px-3 font-semibold bg-gray-200 cursor-default leading-normal',
groupLabelPointable: 'cursor-pointer',
groupLabelPointed: 'bg-gray-300 text-gray-700',
groupLabelSelected: 'bg-green-600 text-white',
groupLabelDisabled: 'bg-gray-100 text-gray-300 cursor-not-allowed',
groupLabelSelectedPointed: 'bg-green-600 text-white opacity-90',
groupLabelSelectedDisabled: 'text-green-100 bg-green-600 bg-opacity-50 cursor-not-allowed',
groupOptions: 'p-0 m-0',
option:
'flex items-center justify-start box-border text-left cursor-pointer text-base leading-snug py-2 px-3',
optionPointed: 'text-gray-800 bg-gray-100',
optionSelected: 'text-white bg-green-500',
optionDisabled: 'text-gray-300 cursor-not-allowed',
optionSelectedPointed: 'text-white bg-green-500 opacity-90',
optionSelectedDisabled: 'text-green-100 bg-green-500 bg-opacity-50 cursor-not-allowed',
noOptions: 'py-2 px-3 text-gray-600 bg-white text-left rtl:text-right',
noResults: 'py-2 px-3 text-gray-600 bg-white text-left rtl:text-right',
fakeInput:
'bg-transparent absolute left-0 right-0 -bottom-px w-full h-px border-0 p-0 appearance-none outline-none text-transparent',
assist: 'absolute -m-px w-px h-px overflow-hidden',
spacer: 'box-content'
}"
/>
</div>
</template>

View File

@ -2,8 +2,8 @@ import { ref } from 'vue'
import { defineStore } from 'pinia' import { defineStore } from 'pinia'
export const useTotalDuration = defineStore('totalDuration', () => { export const useTotalDuration = defineStore('totalDuration', () => {
const totalMin = ref(1) const totalMin = ref("1 Menit")
const totalMax = ref(1) const totalMax = ref("5 Menit")
const setDataMin = (value: any) => { const setDataMin = (value: any) => {
totalMin.value = value totalMin.value = value
} }

View File

@ -1,102 +1,116 @@
/** @type {import('tailwindcss').Config} */ /** @type {import('tailwindcss').Config} */
const colors = require("tailwindcss/colors") const svgToDataUri = require('mini-svg-data-uri')
const colors = require('tailwindcss/colors')
export default { export default {
content: [ content: [
"./index.html", './index.html',
"./src/**/*.{vue,js,ts,jsx,tsx}", './src/**/*.{vue,js,ts,jsx,tsx}',
"./src/**/**/*.{vue,js,ts,jsx,tsx}", './src/**/**/*.{vue,js,ts,jsx,tsx}',
"./node_modules/vue-tailwind-datepicker/**/*.js" './node_modules/vue-tailwind-datepicker/**/*.js'
], ],
theme: { theme: {
extend: { extend: {
backgroundImage: (theme) => ({
'multiselect-caret': `url("${svgToDataUri(
`<svg viewBox="0 0 320 512" fill="currentColor" xmlns="http://www.w3.org/2000/svg"><path d="M31.3 192h257.3c17.8 0 26.7 21.5 14.1 34.1L174.1 354.8c-7.8 7.8-20.5 7.8-28.3 0L17.2 226.1C4.6 213.5 13.5 192 31.3 192z"></path></svg>`
)}")`,
'multiselect-spinner': `url("${svgToDataUri(
`<svg viewBox="0 0 512 512" fill="${theme(
'colors.green.500'
)}" xmlns="http://www.w3.org/2000/svg"><path d="M456.433 371.72l-27.79-16.045c-7.192-4.152-10.052-13.136-6.487-20.636 25.82-54.328 23.566-118.602-6.768-171.03-30.265-52.529-84.802-86.621-144.76-91.424C262.35 71.922 256 64.953 256 56.649V24.56c0-9.31 7.916-16.609 17.204-15.96 81.795 5.717 156.412 51.902 197.611 123.408 41.301 71.385 43.99 159.096 8.042 232.792-4.082 8.369-14.361 11.575-22.424 6.92z"></path></svg>`
)}")`,
'multiselect-remove': `url("${svgToDataUri(
`<svg viewBox="0 0 320 512" fill="currentColor" xmlns="http://www.w3.org/2000/svg"><path d="M207.6 256l107.72-107.72c6.23-6.23 6.23-16.34 0-22.58l-25.03-25.03c-6.23-6.23-16.34-6.23-22.58 0L160 208.4 52.28 100.68c-6.23-6.23-16.34-6.23-22.58 0L4.68 125.7c-6.23 6.23-6.23 16.34 0 22.58L112.4 256 4.68 363.72c-6.23 6.23-6.23 16.34 0 22.58l25.03 25.03c6.23 6.23 16.34 6.23 22.58 0L160 303.6l107.72 107.72c6.23 6.23 16.34 6.23 22.58 0l25.03-25.03c6.23-6.23 6.23-16.34 0-22.58L207.6 256z"></path></svg>`
)}")`
}),
fontFamily: { fontFamily: {
sans: ['Plus Jakarta Sans', 'sans-serif'], sans: ['Plus Jakarta Sans', 'sans-serif']
}, },
width: { width: {
'266': '266px', 266: '266px',
'320': '320px', 320: '320px'
}, },
height: { height: {
'screen-80': '80vh' 'screen-80': '80vh'
}, },
colors: { colors: {
"vtd-primary": { 'vtd-primary': {
'50': '#e6eff1', 50: '#e6eff1',
'100': '#cddee3', 100: '#cddee3',
'200': '#9abdc6', 200: '#9abdc6',
'300': '#689daa', 300: '#689daa',
'400': '#357c8d', 400: '#357c8d',
'500': '#035b71', 500: '#035b71',
'600': '#02495a', 600: '#02495a',
'700': '#02495a', 700: '#02495a',
'800': '#01242d', 800: '#01242d',
'900': '#011217', 900: '#011217'
}, },
'layout': '#F3F7F9', layout: '#F3F7F9',
'dark': '#151617', dark: '#151617',
'aside': '#2E3536', aside: '#2E3536',
'primary': { primary: {
'50': '#e6eff1', 50: '#e6eff1',
'100': '#cddee3', 100: '#cddee3',
'200': '#9abdc6', 200: '#9abdc6',
'300': '#689daa', 300: '#689daa',
'400': '#357c8d', 400: '#357c8d',
'500': '#035b71', 500: '#035b71',
'600': '#02495a', 600: '#02495a',
'700': '#02495a', 700: '#02495a',
'800': '#01242d', 800: '#01242d',
'900': '#011217', 900: '#011217'
}, },
'secondary': { secondary: {
'50': '#e5eef7', 50: '#e5eef7',
'100': '#ccebef', 100: '#ccebef',
'200': '#99d7df', 200: '#99d7df',
'300': '#66c2d0', 300: '#66c2d0',
'400': '#33aec0', 400: '#33aec0',
'500': '#00a2b9', 500: '#00a2b9',
'600': '#007b8d', 600: '#007b8d',
'700': '#005c6a', 700: '#005c6a',
'800': '#003e46', 800: '#003e46',
'900': '#001f23', 900: '#001f23'
}, },
'red': { red: {
'50': '#ffe5e5', 50: '#ffe5e5',
'100': '#ffcccc', 100: '#ffcccc',
'200': '#ff9999', 200: '#ff9999',
'300': '#ff6666', 300: '#ff6666',
'400': '#ff3333', 400: '#ff3333',
'500': '#ff0000', 500: '#ff0000',
'600': '#cc0000', 600: '#cc0000',
'700': '#990000', 700: '#990000',
'800': '#660000', 800: '#660000',
'900': '#330000', 900: '#330000'
}, },
'yellow': { yellow: {
'50': '#ffffe5', 50: '#ffffe5',
'100': '#ffffcc', 100: '#ffffcc',
'200': '#ffff99', 200: '#ffff99',
'300': '#ffff66', 300: '#ffff66',
'400': '#ffff33', 400: '#ffff33',
'500': '#ffff00', 500: '#ffff00',
'600': '#cccc00', 600: '#cccc00',
'700': '#999900', 700: '#999900',
'800': '#666600', 800: '#666600',
'900': '#333300', 900: '#333300'
}, },
'gray': { gray: {
'50': '#f9fafb', 50: '#f9fafb',
'100': '#f3f4f6', 100: '#f3f4f6',
'200': '#e5e7eb', 200: '#e5e7eb',
'300': '#d1d5db', 300: '#d1d5db',
'400': '#9ca3af', 400: '#9ca3af',
'500': '#6b7280', 500: '#6b7280',
'600': '#4b5563', 600: '#4b5563',
'700': '#374151', 700: '#374151',
'800': '#1f2937', 800: '#1f2937',
'900': '#111827', 900: '#111827'
}, }
}, }
}, }
}, },
plugins: [ plugins: [
require('@tailwindcss/typography'), require('@tailwindcss/typography'),
@ -104,6 +118,6 @@ export default {
require('@tailwindcss/aspect-ratio'), require('@tailwindcss/aspect-ratio'),
require('@tailwindcss/container-queries'), require('@tailwindcss/container-queries'),
require('@headlessui/tailwindcss'), require('@headlessui/tailwindcss'),
require('@headlessui/tailwindcss')({ prefix: 'ui' }), require('@headlessui/tailwindcss')({ prefix: 'ui' })
], ]
} }