ilk commit

This commit is contained in:
burakovec
2025-07-04 14:11:18 +03:00
parent 7604d77a89
commit 1754e646a8
306 changed files with 24956 additions and 0 deletions

21
src/App.vue Normal file
View File

@ -0,0 +1,21 @@
<template>
<RouterView v-if="loaded" />
<toasts />
<dialogs />
<loading />
</template>
<script setup lang="ts">
import { ref, onBeforeMount, onMounted } from 'vue'
import { RouterView } from 'vue-router'
import { useUsersStore } from '@/stores/usersStore'
const usersStore = useUsersStore()
import Loading from '@/components/Loading.vue'
const loaded = ref<boolean>(false)
onBeforeMount(async () => {
usersStore.SetUserData()
loaded.value = true
})
</script>

File diff suppressed because it is too large Load Diff

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" width="8" height="12" viewBox="0 0 8 12">
<path
d="M1.10141 -4.92493e-07L8 5.99999L1.10141 12L-4.2108e-08 11.0367L5.79689 5.99999L-4.82429e-07 0.963319L1.10141 -4.92493e-07Z" />
</svg>

After

Width:  |  Height:  |  Size: 236 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

240
src/assets/images/icons.svg Normal file
View File

@ -0,0 +1,240 @@
<?xml version="1.0" encoding="utf-8"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1">
<symbol id="mobilemenu" viewBox="0 0 24 19">
<path
d="M0,19v-2h24v2H0ZM0,11v-2h24v2H0ZM0,2V0h24v2H0Z" />
</symbol>
<symbol id="dashboard" viewBox="0 0 24 24">
<path
d="M13.0594 18.53C13.0594 15.5137 15.5133 13.0599 18.5297 13.0599C21.5461 13.0599 24 15.5137 24 18.53C24 21.5462 21.5461 24 18.5297 24C15.5133 24 13.0594 21.5462 13.0594 18.53ZM14.3305 18.53C14.3305 20.8448 16.2139 22.729 18.5297 22.729C20.8455 22.729 22.7289 20.8448 22.7289 18.53C22.7289 16.2143 20.8455 14.3308 18.5297 14.3308C16.2139 14.3308 14.3305 16.2143 14.3305 18.53ZM2.25604 24C1.0117 24 0 22.9884 0 21.7441V17.8588C0 16.6144 1.0117 15.6019 2.25604 15.6019H8.68457C9.92891 15.6019 10.9406 16.6144 10.9406 17.8588V21.7441C10.9406 22.9884 9.92891 24 8.68457 24H2.25604ZM1.27109 17.8588V21.7441C1.27109 22.2869 1.71231 22.729 2.25604 22.729H8.68457C9.22741 22.729 9.66864 22.2869 9.66864 21.7441V17.8588C9.66864 17.315 9.22741 16.8739 8.68457 16.8739H2.25604C1.71231 16.8739 1.27109 17.315 1.27109 17.8588ZM2.25604 13.4833C1.0117 13.4833 0 12.4716 0 11.2272V2.25686C0 1.01261 1.0117 0 2.25604 0H8.68457C9.92891 0 10.9406 1.01261 10.9406 2.25686V11.2272C10.9406 12.4716 9.92891 13.4833 8.68457 13.4833H2.25604ZM1.27109 2.25686V11.2272C1.27109 11.7701 1.71231 12.2122 2.25604 12.2122H8.68457C9.22741 12.2122 9.66864 11.7701 9.66864 11.2272V2.25686C9.66864 1.7132 9.22741 1.27193 8.68457 1.27193H2.25604C1.71231 1.27193 1.27109 1.7132 1.27109 2.25686ZM15.3154 10.9411C14.0711 10.9411 13.0594 9.92859 13.0594 8.68434V2.25686C13.0594 1.01261 14.0711 0 15.3154 0H21.744C22.9883 0 24 1.01261 24 2.25686V8.68434C24 9.92859 22.9883 10.9411 21.744 10.9411H15.3154ZM14.3305 2.25686V8.68434C14.3305 9.22801 14.7717 9.67012 15.3154 9.67012H21.744C22.2868 9.67012 22.7289 9.22801 22.7289 8.68434V2.25686C22.7289 1.7132 22.2868 1.27193 21.744 1.27193H15.3154C14.7717 1.27193 14.3305 1.7132 14.3305 2.25686Z"
/>
</symbol>
<symbol id="draws" viewBox="0 0 24 19">
<path
d="M3.00878 18.7923C2.54563 18.5579 2.20043 18.1536 2.0365 17.6563L1.47534 15.9514C0.629229 15.7402 0 14.9655 0 14.0447V10.6443L0.505656 10.4882C0.936721 10.3547 1.22728 9.95737 1.22728 9.50049C1.22728 9.04279 0.936721 8.64542 0.505656 8.51191L0 8.35584V4.95544C0 3.87287 0.869936 2.99196 1.93936 2.99196H10.956L19.5115 0.101871C20.0025 -0.0644893 20.5281 -0.0256757 20.9921 0.207907C21.4552 0.442309 21.8004 0.84576 21.9644 1.34391L22.5259 3.0489C23.3715 3.26015 24 4.0349 24 4.95544V8.35584L23.4952 8.51191C23.0641 8.64542 22.7736 9.04279 22.7736 9.50049C22.7736 9.95737 23.0641 10.3547 23.4952 10.4882L24 10.6443V14.0447C24 15.1273 23.1309 16.0082 22.0615 16.0082H13.0439L4.48932 18.8983C4.2881 18.9663 4.08081 19 3.87351 19C3.57689 19 3.28286 18.9302 3.00878 18.7923ZM3.39041 17.1994C3.43378 17.3304 3.52485 17.4373 3.64714 17.4994C3.76943 17.5614 3.90821 17.57 4.03831 17.527L8.53283 16.0082H2.99837L3.39041 17.1994ZM22.0615 14.5627C22.3434 14.5627 22.5732 14.33 22.5732 14.0447V11.6502C21.823 11.2158 21.3468 10.4072 21.3468 9.50049C21.3468 8.59293 21.823 7.78439 22.5732 7.34996V4.95544C22.5732 4.74758 22.4511 4.56754 22.2757 4.48524L11.1513 4.43742H7.5406V14.5627H17.3224H22.0615ZM6.11471 14.5627V4.43742H1.93936C1.65661 4.43742 1.42763 4.67018 1.42763 4.95544V7.34996C2.17788 7.78439 2.65404 8.59293 2.65404 9.50049C2.65404 10.4072 2.17788 11.2158 1.42763 11.6502V14.0447C1.42763 14.33 1.65661 14.5627 1.93936 14.5627H6.11471ZM21.0025 2.99196L20.6105 1.80078C20.5671 1.66973 20.476 1.56288 20.3537 1.5008C20.2314 1.43872 20.0927 1.42925 19.9626 1.47321L15.4661 2.99196H21.0025Z"
/>
</symbol>
<symbol id="users" viewBox="0 0 24 17">
<path
d="M2.60271 17C1.16753 17 0 15.8504 0 14.4372V2.56195C0 1.14961 1.16753 0 2.60271 0H21.3964C22.8325 0 24 1.14961 24 2.56195V14.4372C24 15.8504 22.8325 17 21.3964 17H2.60271ZM1.20442 2.56195V14.4372C1.20442 15.1959 1.8315 15.8131 2.60271 15.8131H21.3964C22.1676 15.8131 22.7947 15.1959 22.7947 14.4372V2.56195C22.7947 1.80317 22.1676 1.18606 21.3964 1.18606H2.60271C1.8315 1.18606 1.20442 1.80317 1.20442 2.56195ZM14.0498 13.7785V12.5916H21.1228V13.7785H14.0498ZM9.98449 12.5883C10.5592 12.5883 11.0268 12.1279 11.0268 11.5625C11.0268 10.3435 10.0197 9.35151 8.78093 9.35151H5.72956C4.49083 9.35151 3.48372 10.3435 3.48372 11.5625C3.48372 12.1279 3.95124 12.5883 4.52515 12.5883V13.7752C3.28641 13.7752 2.27844 12.7824 2.27844 11.5625C2.27844 9.68979 3.82686 8.16557 5.72956 8.16557H8.78093C10.6836 8.16557 12.2312 9.68979 12.2312 11.5625C12.2312 12.7824 11.2232 13.7752 9.98449 13.7752V12.5883ZM14.0498 9.83134V8.64448H21.1228V9.83134H14.0498ZM4.96265 5.48162C4.96265 4.23704 5.99121 3.22483 7.25482 3.22483C8.51843 3.22483 9.54699 4.23704 9.54699 5.48162C9.54699 6.72517 8.51843 7.73829 7.25482 7.73829C5.99121 7.73829 4.96265 6.72517 4.96265 5.48162ZM6.16792 5.48162C6.16792 6.0716 6.65604 6.55223 7.25482 6.55223C7.85445 6.55223 8.34257 6.0716 8.34257 5.48162C8.34257 4.89072 7.85445 4.41089 7.25482 4.41089C6.65604 4.41089 6.16792 4.89072 6.16792 5.48162Z"
/>
</symbol>
<symbol id="customers" viewBox="0 0 24 24">
<path
d="M18.4565 24V18.5003H19.7275V22.6731C21.4314 22.3714 22.729 20.88 22.729 19.0913C22.729 15.3616 19.6948 12.3273 15.9649 12.3273H8.03511C4.3061 12.3273 1.27103 15.3616 1.27103 19.0913C1.27103 20.88 2.5695 22.3714 4.27335 22.6731V18.5003H5.54439V24H4.90798C2.20218 24 0 21.7983 0 19.0913C0 14.661 3.60509 11.0562 8.03511 11.0562H15.9649C20.3958 11.0562 24 14.661 24 19.0913C24 21.7983 21.7987 24 19.092 24H18.4565ZM6.97474 5.0256C6.97474 2.25405 9.22914 0 12.0004 0C14.7718 0 17.0261 2.25405 17.0261 5.0256C17.0261 7.79714 14.7718 10.0512 12.0004 10.0512C9.22914 10.0512 6.97474 7.79714 6.97474 5.0256ZM8.24577 5.0256C8.24577 7.09571 9.93015 8.77995 12.0004 8.77995C14.0707 8.77995 15.7551 7.09571 15.7551 5.0256C15.7551 2.95477 14.0707 1.27125 12.0004 1.27125C9.93015 1.27125 8.24577 2.95477 8.24577 5.0256Z"
/>
</symbol>
<symbol id="sitemanagement" viewBox="0 0 24 24">
<path
d="M2.85686 24C1.28151 24 0 22.7185 0 21.1441V2.8568C0 1.28153 1.28151 0 2.85686 0H21.1431C22.7185 0 24 1.28153 24 2.8568V21.1441C24 22.7185 22.7185 24 21.1431 24H2.85686ZM1.3227 21.1441C1.3227 21.9889 2.01106 22.6774 2.85686 22.6774H21.1431C21.9899 22.6774 22.6773 21.9889 22.6773 21.1441V7.44929H1.3227V21.1441ZM22.6773 6.12741V2.8568C22.6773 2.01106 21.9899 1.32275 21.1431 1.32275H2.85686C2.01106 1.32275 1.3227 2.01106 1.3227 2.8568V6.12741H22.6773ZM4.09627 19.4003V18.0776H19.901V19.4003H4.09627ZM13.3927 15.3059C12.3382 15.3059 11.4814 14.4481 11.4814 13.3937V11.6462C11.4814 10.5926 12.3382 9.73498 13.3927 9.73498H18.6524C19.7069 9.73498 20.5637 10.5926 20.5637 11.6462V13.3937C20.5637 14.4481 19.7069 15.3059 18.6524 15.3059H13.3927ZM12.8032 11.6462V13.3937C12.8032 13.7186 13.0678 13.9832 13.3927 13.9832H18.6524C18.9774 13.9832 19.2419 13.7186 19.2419 13.3937V11.6462C19.2419 11.3213 18.9774 11.0576 18.6524 11.0576H13.3927C13.0678 11.0576 12.8032 11.3213 12.8032 11.6462ZM3.43629 12.5204C3.43629 11.1327 4.56493 10.005 5.95171 10.005C7.33849 10.005 8.46714 11.1327 8.46714 12.5204C8.46714 13.9072 7.33849 15.0359 5.95171 15.0359C4.56493 15.0359 3.43629 13.9072 3.43629 12.5204ZM4.75899 12.5204C4.75899 13.1777 5.29448 13.7132 5.95171 13.7132C6.60986 13.7132 7.14535 13.1777 7.14535 12.5204C7.14535 11.8623 6.60986 11.3268 5.95171 11.3268C5.29448 11.3268 4.75899 11.8623 4.75899 12.5204Z"
/>
</symbol>
<symbol id="settings" viewBox="0 0 22 24">
<path
d="M8.00699 21.6953L7.98174 20.5648C7.11216 20.2453 6.30211 19.7893 5.56333 19.205L4.61347 19.7957C4.08668 20.1225 3.46697 20.2199 2.868 20.0706C2.26904 19.9214 1.76389 19.5426 1.44366 19.0047L0.511844 17.4373C-0.148458 16.326 0.198833 14.8733 1.28671 14.1978L2.23747 13.6081C2.14005 13.0665 2.09134 12.5276 2.09134 11.9997C2.09134 11.6047 2.1193 11.206 2.17523 10.7918L1.19921 10.2458C0.658879 9.94355 0.266487 9.4438 0.0932926 8.83949C-0.079 8.23505 -0.011346 7.59789 0.28543 7.04542L1.14779 5.43803C1.44366 4.88544 1.93258 4.48408 2.52432 4.30754C3.11517 4.13088 3.73848 4.20014 4.27971 4.50322L5.25844 5.05112C5.96655 4.43853 6.75494 3.9489 7.61009 3.58928L7.58573 2.45064C7.55777 1.1509 8.56987 0.0695468 9.84176 0.0404112L11.6359 0.000288013C12.8898 -0.0197119 13.965 1.00436 13.993 2.3041L14.0183 3.43459C14.8878 3.75495 15.6979 4.21014 16.4358 4.79445L17.3865 4.20372C18.4735 3.52928 19.8951 3.88335 20.5563 4.9947L21.4882 6.56209C21.8084 7.09999 21.904 7.73357 21.7579 8.34517C21.6117 8.95689 21.241 9.47393 20.7142 9.80158L19.7625 10.3913C19.8599 10.9339 19.9087 11.4727 19.9087 11.9997C19.9087 12.3956 19.8807 12.7944 19.8248 13.2066L20.7999 13.7537C21.3411 14.0559 21.7335 14.5556 21.9067 15.1599C22.079 15.7644 22.0113 16.4015 21.7146 16.954L20.8522 18.5615C20.5563 19.114 20.0674 19.5153 19.4757 19.692C18.8839 19.8685 18.2606 19.7984 17.7203 19.4962L16.7416 18.9483C16.0334 19.56 15.2451 20.0497 14.3899 20.4101L14.4143 21.5488C14.4422 22.8485 13.4301 23.9299 12.1591 23.9581L10.365 23.9991C10.3478 24 10.3298 24 10.3126 24C9.0642 24 8.03495 22.9769 8.00699 21.6953ZM5.99542 18.0089C6.80817 18.7171 7.73096 19.235 8.73585 19.549L9.14448 19.6774L9.18868 21.668C9.19499 21.9757 9.31858 22.2615 9.53597 22.4736C9.75246 22.6857 10.0222 22.8012 10.3388 22.7921L12.1321 22.7512C12.4334 22.7448 12.713 22.6183 12.9214 22.3962C13.1288 22.1751 13.2398 21.8829 13.2326 21.5761L13.1893 19.5763L13.5916 19.4298C14.5866 19.0676 15.4832 18.5105 16.2581 17.7733L16.5702 17.4756L18.2877 18.4377C18.552 18.5851 18.8569 18.6188 19.1446 18.5332C19.4333 18.4468 19.6714 18.251 19.8167 17.9816L20.679 16.3733C20.8233 16.1039 20.8558 15.7935 20.7719 15.4986C20.688 15.2036 20.4959 14.9597 20.2325 14.8123L18.5186 13.852L18.5944 13.4241C18.6837 12.9254 18.727 12.4593 18.727 11.9997C18.727 11.4244 18.6593 10.8292 18.5249 10.2302L18.4293 9.80615L20.1008 8.76936C20.3579 8.60912 20.5383 8.35702 20.6096 8.05937C20.6817 7.76085 20.6339 7.45135 20.4779 7.18925L19.5469 5.62185C19.224 5.07939 18.5294 4.90643 18.0008 5.23593L16.3293 6.27358L16.0046 5.99049C15.1909 5.28321 14.269 4.76445 13.2641 4.45038L12.8555 4.32297L12.8122 2.33138C12.7987 1.70608 12.2962 1.20633 11.6874 1.20633C11.6783 1.20633 11.6702 1.20633 11.6612 1.20732L9.86792 1.2483C9.24731 1.26188 8.75389 1.78978 8.76742 2.42336L8.81072 4.4231L8.40931 4.56964C7.41434 4.93186 6.5168 5.48889 5.74194 6.22617L5.42893 6.52382L3.71232 5.56173C3.44802 5.41432 3.14313 5.38062 2.85538 5.46618C2.56672 5.55272 2.32858 5.7484 2.18335 6.01778L1.32098 7.62517C1.17666 7.89554 1.14418 8.20591 1.22807 8.50085C1.31196 8.79578 1.5032 9.03973 1.7675 9.18714L3.4823 10.1474L3.40563 10.5753C3.31632 11.0759 3.27303 11.5419 3.27303 11.9997C3.27303 12.5759 3.34068 13.1702 3.47508 13.7682L3.5707 14.1934L1.8992 15.2301C1.36879 15.5596 1.19921 16.2686 1.52124 16.8102L2.45306 18.3776C2.60911 18.6407 2.85628 18.8245 3.14764 18.8983C3.43991 18.971 3.74299 18.9229 4.00008 18.7635L5.67158 17.7258L5.99542 18.0089ZM7.0003 11.9997C7.0003 9.74689 8.79448 7.91381 11 7.91381C13.2046 7.91381 14.9997 9.74689 14.9997 11.9997C14.9997 14.2525 13.2046 16.0866 11 16.0866C8.79448 16.0866 7.0003 14.2525 7.0003 11.9997ZM8.18199 11.9997C8.18199 13.5871 9.44667 14.8787 11 14.8787C12.5542 14.8787 13.818 13.5871 13.818 11.9997C13.818 10.4123 12.5542 9.12072 11 9.12072C9.44667 9.12072 8.18199 10.4123 8.18199 11.9997Z"
/>
</symbol>
<symbol id="logs" viewBox="0 0 21 24">
<path
d="M2.69772 24C1.20988 24 0 22.7179 0 21.1435V2.85645C0 1.28125 1.20988 0 2.69772 0H18.3023C19.7901 0 21 1.28125 21 2.85645V21.1435C21 22.7179 19.7901 24 18.3023 24H2.69772ZM1.24819 2.85645V21.1435C1.24819 21.9894 1.89856 22.6776 2.69772 22.6776H18.3023C19.1014 22.6776 19.7518 21.9894 19.7518 21.1435V2.85645C19.7518 2.01062 19.1014 1.32152 18.3023 1.32152H15.6063V2.43409C15.6063 3.50988 14.7796 4.38418 13.7639 4.38418H7.2361C6.22044 4.38418 5.39455 3.50988 5.39455 2.43409V1.32152H2.69772C1.89856 1.32152 1.24819 2.01062 1.24819 2.85645ZM6.64274 2.43409C6.64274 2.78038 6.90912 3.06179 7.2361 3.06179H13.7639C14.0918 3.06179 14.3573 2.78038 14.3573 2.43409V1.32152H6.64274V2.43409ZM3.55836 20.8879V18.5868H5.73578V20.8879H3.55836ZM6.80489 20.3994V19.0751H13.5759V20.3994H6.80489ZM3.55836 17.059V14.7579H5.73578V17.059H3.55836ZM6.80489 16.5706V15.2464H14.0909V16.5706H6.80489ZM3.55836 13.2202V10.9191H5.73578V13.2202H3.55836ZM6.80489 12.7419V11.4185H12.4373V12.7419H6.80489ZM3.55836 9.39146V7.09036H5.73578V9.39146H3.55836ZM6.80489 8.90297V7.57971H16.8225V8.90297H6.80489Z"
/>
</symbol>
<symbol id="profile" viewBox="0 0 20 20">
<path
d="M14.9009 20V18.9144H18.9152V14.9H20V20H14.9009ZM0 20V14.9H1.08564V18.9144H5.09997V20H0ZM13.2756 16.8909V13.7301H14.3611V15.7192C15.0653 15.4906 15.5759 14.8279 15.5759 14.0483C15.5759 12.1505 14.0325 10.6069 12.1347 10.6069H7.86616C5.96838 10.6069 4.42577 12.1505 4.42577 14.0483C4.42577 14.8279 4.93556 15.4906 5.63969 15.7192V13.7301H6.7252V16.8909H6.18286C4.61473 16.8909 3.33929 15.6155 3.33929 14.0483C3.33929 11.5519 5.36989 9.52221 7.86616 9.52221H12.1347C14.6309 9.52221 16.6615 11.5519 16.6615 14.0483C16.6615 15.6155 15.3861 16.8909 13.818 16.8909H13.2756ZM7.09444 5.96663C7.09444 4.36427 8.39801 3.06069 10.0005 3.06069C11.6028 3.06069 12.9056 4.36427 12.9056 5.96663C12.9056 7.56815 11.6028 8.87173 10.0005 8.87173C8.39801 8.87173 7.09444 7.56815 7.09444 5.96663ZM8.17912 5.96663C8.17912 6.97049 8.99567 7.78704 10.0005 7.78704C11.0042 7.78704 11.8209 6.97049 11.8209 5.96663C11.8209 4.96277 11.0042 4.14538 10.0005 4.14538C8.99567 4.14538 8.17912 4.96277 8.17912 5.96663ZM18.9152 5.1V1.08552H14.9009V0H20V5.1H18.9152ZM0 5.1V0H5.09997V1.08552H1.08564V5.1H0Z"
/>
</symbol>
<symbol id="logout" viewBox="0 0 20 20">
<path
d="M0.858723 19.4401C0.31307 18.9761 0 18.2932 0 17.566V2.43415C0 1.707 0.31307 1.02316 0.857883 0.559171C1.3955 0.102297 2.09325 -0.0867583 2.78044 0.0371523L12.3059 0.795215C13.4221 1.01322 14.233 2.01813 14.233 3.18583H13.1612C13.1612 2.55634 12.7304 2.01175 12.1326 1.88244L2.61155 1.1245C2.23131 1.05027 1.84039 1.15247 1.54232 1.40753C1.2434 1.66087 1.07187 2.0353 1.07187 2.43415V17.566C1.07187 17.9639 1.2434 18.3384 1.54232 18.5926C1.84123 18.8468 2.23131 18.949 2.61155 18.8747L2.67081 18.8666L12.1326 18.1177C12.7304 17.9875 13.1612 17.4439 13.1612 16.8134H14.233C14.233 17.9811 13.4221 18.986 12.3059 19.2049L12.2467 19.2121L2.78044 19.962C2.6425 19.9874 2.50456 20 2.36662 20C1.82096 20 1.28766 19.8055 0.858723 19.4401ZM16.2476 12.7511L18.3814 10.5586H6.82204V9.45239H18.4209L16.2759 7.24899L17.0338 6.47019L19.6763 9.18555C19.8841 9.39902 20 9.68304 20 9.98508C20 10.2881 19.8841 10.5713 19.6763 10.7856L17.0046 13.529L16.2476 12.7511Z"
/>
</symbol>
<symbol id="list" viewBox="0 0 23 24">
<path
d="M0 20.6313C0 18.774 1.47682 17.2626 3.29305 17.2626C5.10845 17.2626 6.58611 18.774 6.58611 20.6313C6.58611 22.4887 5.10845 24 3.29305 24C1.47682 24 0 22.4887 0 20.6313ZM1.83527 20.6313C1.83527 21.454 2.4884 22.1227 3.29305 22.1227C4.09602 22.1227 4.75084 21.454 4.75084 20.6313C4.75084 19.8095 4.09602 19.14 3.29305 19.14C2.4884 19.14 1.83527 19.8095 1.83527 20.6313ZM8.88161 20.9632V19.0875H23V20.9632H8.88161ZM0 12.0001C0 10.1426 1.47682 8.63136 3.29305 8.63136C5.10845 8.63136 6.58611 10.1426 6.58611 12.0001C6.58611 13.8574 5.10845 15.3688 3.29305 15.3688C1.47682 15.3688 0 13.8574 0 12.0001ZM1.83527 12.0001C1.83527 12.8218 2.4884 13.4914 3.29305 13.4914C4.09602 13.4914 4.75084 12.8218 4.75084 12.0001C4.75084 11.1774 4.09602 10.5086 3.29305 10.5086C2.4884 10.5086 1.83527 11.1774 1.83527 12.0001ZM8.88161 12.9416V11.0651H23V12.9416H8.88161ZM0 3.3687C0 1.5114 1.47682 0 3.29305 0C5.10845 0 6.58611 1.5114 6.58611 3.3687C6.58611 5.22611 5.10845 6.7374 3.29305 6.7374C1.47682 6.7374 0 5.22611 0 3.3687ZM1.83527 3.3687C1.83527 4.19045 2.4884 4.86013 3.29305 4.86013C4.09602 4.86013 4.75084 4.19045 4.75084 3.3687C4.75084 2.54604 4.09602 1.87738 3.29305 1.87738C2.4884 1.87738 1.83527 2.54604 1.83527 3.3687ZM8.88161 4.91913V3.04345H23V4.91913H8.88161Z"
/>
</symbol>
<symbol id="notification" viewBox="0 0 19 24">
<path
d="M5.23695 20.4417H2.32023C1.64909 20.4417 1.02771 20.1408 0.61628 19.6155C0.205667 19.09 0.0659286 18.4189 0.233103 17.7752C0.593959 16.3884 1.14931 15.0598 1.88311 13.8265L2.2628 13.1871C3.44476 11.2003 4.1767 8.93572 4.37992 6.63864C4.58488 4.32563 6.36311 2.53368 8.62776 2.25002V0.849609H9.89459V2.25037C12.1584 2.53531 13.935 4.32668 14.14 6.63864C14.3431 8.93572 15.075 11.2003 16.2562 13.1879L16.6368 13.8265C17.3705 15.0598 17.9258 16.3884 18.2867 17.7752C18.4539 18.4189 18.3141 19.09 17.9036 19.6155C17.4922 20.1408 16.8707 20.4417 16.1996 20.4417H13.2828C12.9786 22.3695 11.2905 23.8496 9.25949 23.8496C7.22921 23.8496 5.54119 22.3695 5.23695 20.4417ZM9.25949 22.5982C10.5913 22.5982 11.7096 21.6753 11.9968 20.4417H6.52308C6.81011 21.6753 7.92837 22.5982 9.25949 22.5982ZM5.63815 6.74827C5.41866 9.22973 4.62847 11.676 3.35129 13.8222L2.97079 14.4616C2.29791 15.5939 1.7879 16.8143 1.45622 18.0872C1.38763 18.3538 1.44506 18.6315 1.61561 18.8493C1.78534 19.0661 2.0425 19.1912 2.32023 19.1912H16.1996C16.4773 19.1912 16.7345 19.0661 16.905 18.8493C17.0747 18.6315 17.133 18.3538 17.0636 18.0872C16.7319 16.8143 16.2228 15.5939 15.5491 14.4616L15.1685 13.823C13.8914 11.676 13.1011 9.22973 12.8816 6.74827C12.7343 5.08838 11.496 3.7904 9.89459 3.51592V4.81123H8.62776V3.51534C7.026 3.78877 5.78556 5.08734 5.63815 6.74827Z"
/>
</symbol>
<symbol id="search" viewBox="0 0 24 24">
<path
d="M19.1462 23.171L13.344 17.367C12.0921 18.0082 10.6745 18.3702 9.17412 18.3702C4.11061 18.3702 -0.0078125 14.2501 -0.0078125 9.18462C-0.0078125 4.12013 4.11061 0 9.17412 0C14.2367 0 18.3551 4.12013 18.3551 9.18462C18.3551 10.686 17.9931 12.1045 17.3521 13.3571L23.1547 19.1614C24.2597 20.2671 24.2597 22.0653 23.1547 23.171C22.6024 23.7233 21.8767 24 21.1511 24C20.4254 24 19.6985 23.7233 19.1462 23.171ZM14.634 16.7178L20.1164 22.2009C20.6863 22.7717 21.6148 22.7726 22.1857 22.2009C22.7564 21.6309 22.7564 20.7015 22.1857 20.1315L16.7034 14.6475L14.634 16.7178ZM1.36247 9.18462C1.36247 13.4939 4.86678 16.999 9.17412 16.999C13.4805 16.999 16.9848 13.4939 16.9848 9.18462C16.9848 4.8763 13.4805 1.37126 9.17412 1.37126C4.86678 1.37126 1.36247 4.8763 1.36247 9.18462Z"
/>
</symbol>
<symbol id="export" viewBox="0 0 24 21">
<path
d="M3.43873 20.9985C2.07263 20.9985 0.960938 19.9042 0.960938 18.5592V2.93835C0.960938 1.59241 2.07263 0.498047 3.43873 0.498047H17.0102C18.3763 0.498047 19.488 1.59241 19.488 2.93835V5.88464H18.3405V2.93835C18.3405 2.21533 17.7435 1.62793 17.0102 1.62793H13.768V4.1842C13.768 5.10266 13.0085 5.84998 12.0759 5.84998H8.37298C7.43946 5.84998 6.68093 5.10266 6.68093 4.1842V1.62793H3.43873C2.70544 1.62793 2.10842 2.21533 2.10842 2.93835V18.5592C2.10842 19.2812 2.70544 19.8695 3.43873 19.8695H17.0102C17.7435 19.8695 18.3405 19.2812 18.3405 18.5592V14.3848H19.488V18.5592C19.488 19.9042 18.3763 20.9985 17.0102 20.9985H3.43873ZM7.82816 4.1842C7.82816 4.47974 8.07251 4.72009 8.37298 4.72009H12.0759C12.3764 4.72009 12.6205 4.47974 12.6205 4.1842V1.62793H7.82816V4.1842ZM4.43131 16.5697V15.4398H9.12882V16.5697H4.43131ZM11.4196 13.5542L15.3059 11.0803C17.0016 10 18.9669 9.42944 20.9864 9.42944H22.7655L20.8014 7.49622L21.6129 6.69739L24.9609 9.99353L21.6795 13.225L20.8681 12.4263L22.7647 10.5585H20.9864C19.1885 10.5585 17.4391 11.0673 15.9284 12.0287L12.0431 14.5027L11.4196 13.5542ZM4.43131 12.6199V11.489H9.12882V12.6199H4.43131Z"
/>
</symbol>
<symbol id="filter" viewBox="0 0 21 24">
<path
d="M8.1513 24.829C7.83877 24.6395 7.65213 24.3089 7.65213 23.9442V15.3907L0.243889 6.03584C-0.000572536 5.70245 -0.0344848 5.28842 0.143372 4.93893C0.321472 4.58944 0.675721 4.37255 1.06901 4.37255H6.73821V5.52056H1.30102L8.58996 14.7229C8.73293 14.919 8.8032 15.1302 8.8032 15.351V23.7595L12.0805 22.0593V15.351C12.0805 15.1302 12.1498 14.919 12.2793 14.7399L19.5807 5.52056H16.6291V4.37255H19.8137C20.2067 4.37255 20.561 4.58944 20.7391 4.93893C20.9172 5.28842 20.8833 5.70245 20.652 6.01876L13.2306 15.3907V22.1284C13.2306 22.5159 13.0164 22.8673 12.6707 23.0462L9.16867 24.8631C9.01716 24.9417 8.85321 24.9805 8.68951 24.9805C8.50384 24.9805 8.31818 24.9303 8.1513 24.829ZM7.51673 8.91447V7.76548H13.3735V8.91447H7.51673ZM8.99642 5.51678V4.36779H14.852V5.51678H8.99642ZM7.51673 2.12946V0.980469H13.3735V2.12946H7.51673Z"
/>
</symbol>
<symbol id="document" viewBox="0 0 22 24">
<path
d="M19.1269 23.9995H2.95311C1.32617 23.9995 0 22.7169 0 21.1433V7.57198C0 6.27611 0.574217 5.04195 1.57226 4.17804L5.07681 1.14994C5.93813 0.405034 7.05011 -0.00488281 8.20765 -0.00488281H19.1269C20.7538 -0.00488281 22.08 1.27776 22.08 2.85132V21.1389C22.08 22.7125 20.7538 23.9951 19.1269 23.9951V23.9995ZM8.20765 1.32184C7.38734 1.32184 6.59894 1.61275 5.98826 2.14167L2.48372 5.16977C1.77734 5.78245 1.36718 6.65958 1.36718 7.57639V21.1477C1.36718 21.994 2.07812 22.6816 2.95311 22.6816H19.1269C20.0019 22.6816 20.7128 21.994 20.7128 21.1477V2.85572C20.7128 2.00944 20.0019 1.32184 19.1269 1.32184H8.20765Z"
/>
</symbol>
<symbol id="replace" viewBox="0 0 24 18">
<path
d="M20.0105 3.43183V7.35828H18.306L21.1519 12.2892L23.9978 7.35828H22.2933V3.43183C22.2933 1.54471 20.7562 0 18.8615 0H2.84375V2.28282H18.8691C19.5007 2.28282 20.0181 2.80025 20.0181 3.43183H20.0105Z"
/>
<path
d="M3.98732 14.8534V10.927H5.69182L2.84591 5.99609L0 10.9346H1.7045V14.861C1.7045 16.7482 3.2416 18.2929 5.13634 18.2929H21.1617V16.01H5.13634C4.50476 16.01 3.98732 15.4926 3.98732 14.861V14.8534Z"
/>
</symbol>
<symbol id="upload" viewBox="0 0 24 24">
<path
d="M21.1438 9.31348V10.6209C21.9901 10.6209 22.6777 11.3008 22.6777 12.1375V21.1762C22.6777 22.0129 21.9901 22.6928 21.1438 22.6928H2.8562C2.00992 22.6928 1.32231 22.0129 1.32231 21.1762V12.1375C1.32231 11.3008 2.00992 10.6209 2.8562 10.6209V9.31348C1.28264 9.31348 0 10.5817 0 12.1375V21.1762C0 22.732 1.28264 24.0002 2.8562 24.0002H21.1438C22.7174 24.0002 24 22.732 24 21.1762V12.1375C24 10.5817 22.7174 9.31348 21.1438 9.31348Z"
/>
<path
d="M11.3398 2.50154V15.8504H12.6621V2.50154L14.985 4.80262L15.9239 3.8787L12.001 0L8.07812 3.8787L9.01256 4.80262L11.3398 2.50154Z"
/>
</symbol>
<symbol id="oplist" viewBox="0 0 24 21">
<g>
<path d="M21.1683 15.2676H3.02344V16.7225H21.1683V15.2676Z" />
<path d="M21.1683 19.5449H3.02344V20.9999H21.1683V19.5449Z" />
<path
d="M21.9092 12.6386H20.4232C20.4232 12.042 20.3489 11.4261 20.2052 10.8102L20.0863 10.3009L21.9687 9.1806C22.2263 9.02541 22.4095 8.78291 22.4789 8.49677C22.5482 8.21063 22.5037 7.91478 22.3451 7.66259L21.3297 6.02333C21.0077 5.50439 20.3092 5.33464 19.7792 5.65474L17.8968 6.77506L17.4857 6.43557C16.6089 5.70324 15.6182 5.16975 14.5334 4.84481L14.0182 4.68961L13.9687 2.54111C13.9538 1.93003 13.4337 1.44504 12.8145 1.45959L10.8578 1.50324C10.2337 1.51779 9.73833 2.02217 9.75319 2.63326L9.80273 4.79146L9.29747 4.96605C8.22254 5.33949 7.2566 5.91663 6.4244 6.67806L6.03307 7.03695L4.09623 5.99908C3.82873 5.85843 3.52657 5.82448 3.23926 5.90693C2.95195 5.98938 2.70923 6.17852 2.56558 6.43557L1.6244 8.11848C1.32719 8.65197 1.52533 9.3261 2.07022 9.61709L4.00211 10.655L3.90799 11.1691C3.81387 11.688 3.76434 12.1681 3.76434 12.6386H2.27827C2.27827 12.2409 2.30304 11.8432 2.36248 11.4309L1.35691 10.8926C0.0937503 10.2088 -0.371884 8.65197 0.321614 7.41525L1.26279 5.73234C1.59963 5.13095 2.15443 4.69446 2.82316 4.50531C3.49189 4.31132 4.20025 4.38892 4.81449 4.71871L5.82502 5.2619C6.57301 4.65081 7.40521 4.15612 8.3018 3.78753L8.27703 2.66236C8.24731 1.25104 9.39158 0.0773701 10.8331 0.0434209L12.7848 -0.000228052C14.2263 -0.0341772 15.425 1.091 15.4597 2.50231L15.4845 3.61779C16.3959 3.94758 17.2529 4.40832 18.0306 4.9903L19.0114 4.40832C20.2448 3.67598 21.8547 4.05912 22.6027 5.26675L23.6182 6.90601C23.9798 7.48799 24.0888 8.17668 23.9253 8.84111C23.7619 9.50555 23.3408 10.0681 22.7414 10.4222L21.7606 11.0042C21.8597 11.5522 21.9092 12.1002 21.9092 12.6386Z"
/>
<path
d="M16.4604 12.6393H14.9744C14.9744 11.034 13.6418 9.7245 12.0022 9.7245C10.3626 9.7245 9.02513 11.0291 9.02513 12.6393H7.53906C7.53906 10.2289 9.5403 8.26953 12.0022 8.26953C14.4641 8.26953 16.4604 10.2289 16.4604 12.6393Z"
/>
</g>
</symbol>
<symbol id="edit" viewBox="0 0 24 24">
<g>
<path
d="M21.1438 24H2.8562C1.28264 24 0 22.7174 0 21.1438V2.8562C0 1.28264 1.28264 0 2.8562 0H12.3284V1.32231H2.8562C2.00992 1.32231 1.32231 2.00992 1.32231 2.8562V21.1438C1.32231 21.9901 2.00992 22.6777 2.8562 22.6777H21.1438C21.9901 22.6777 22.6777 21.9901 22.6777 21.1438V11.6716H24V21.1438C24 22.7174 22.7174 24 21.1438 24Z"
/>
<path
d="M5.25441 18.6843L6.79711 12.2799L18.2704 0.806612C19.3459 -0.268871 21.0913 -0.268871 22.1624 0.806612L23.1938 1.83802C24.2693 2.9135 24.2693 4.65895 23.1938 5.73003L11.7161 17.2077L5.25 18.6843H5.25441ZM7.9916 12.9543L7.03512 16.9212L11.0506 16.0044L22.2594 4.79559C22.8191 4.23581 22.8191 3.32782 22.2594 2.77245L21.228 1.74105C20.6682 1.18127 19.7602 1.18127 19.2048 1.74105L7.9916 12.9543Z"
/>
</g>
</symbol>
<!-- arrows -->
<symbol id="arrow" viewBox="0 0 8 12">
<path
d="M1.10141 -4.92493e-07L8 5.99999L1.10141 12L-4.2108e-08 11.0367L5.79689 5.99999L-4.82429e-07 0.963319L1.10141 -4.92493e-07Z" />
</symbol>
<symbol id="arrowline" viewBox="0 0 10 16">
<path
d="M0.835938 11.8862L1.66668 11.0282L4.78047 14.2455V0.570312H5.95585V14.2505L9.07457 11.0282L9.90531 11.8862L5.37063 16.5703L0.835938 11.8862Z"
/>
</symbol>
<symbol id="arrowsortable" viewBox="0 0 10 19">
<path
d="M0.101562 13.9539L1.00171 13.0295L5.01831 17.1523L9.03418 13.0295L9.93506 13.9539L5.01831 19.001L0.101562 13.9539ZM5.01831 2.59668L1.00171 6.71777L0.101562 5.79346L5.01831 0.748047L9.93506 5.79346L9.03418 6.71777L5.01831 2.59668Z"
/>
</symbol>
<!-- other -->
<symbol id="close" viewBox="0 0 13 13">
<path
d="M6.50062 7.75155L1.59971 12.6523L0.5 11.5535L5.40166 6.65272L0.5 1.75193L1.59971 0.652344L6.50062 5.55401L11.4013 0.652344L12.501 1.75193L7.59958 6.65272L12.501 11.5535L11.4013 12.6523L6.50062 7.75155Z"
/>
</symbol>
<symbol id="plus" viewBox="0 0 24 24">
<path
d="M10.9922 23.9994V12.9994H-0.0078125V11H10.9922V0H12.9819V11H23.9915V12.9994H12.9819V23.9994H10.9922Z"
/>
</symbol>
<!-- export -->
<symbol id="xls" viewBox="0 0 21 24">
<path
d="M17.5332 24.0003H2.70705C1.21567 24.0003 0 22.7846 0 21.2932V7.17729C0 5.9491 0.526371 4.77938 1.44125 3.96058L4.65379 1.09061C5.44334 0.384605 6.46266 -0.00390625 7.52376 -0.00390625H17.5332C19.0245 -0.00390625 20.2402 1.21176 20.2402 2.70314V21.289C20.2402 22.7804 19.0245 23.9961 17.5332 23.9961V24.0003ZM7.52376 1.25353C6.7718 1.25353 6.04909 1.52925 5.4893 2.03056L2.27676 4.90053C1.62924 5.48121 1.25326 6.31254 1.25326 7.18147V21.2974C1.25326 22.0995 1.90496 22.7512 2.70705 22.7512H17.5332C18.3352 22.7512 18.9869 22.0995 18.9869 21.2974V2.70732C18.9869 1.90523 18.3352 1.25353 17.5332 1.25353H7.52376Z"
/>
<path
d="M11.4956 17.6314L10.6094 18.5176L13.9799 21.8881L14.866 21.0019L11.4956 17.6314Z"
/>
<path
d="M13.9799 17.6285L10.6094 20.999L11.4956 21.8852L14.866 18.5147L13.9799 17.6285Z"
/>
<path
d="M3.8986 4.99609H5.18946L6.16283 6.62116L7.21557 4.99609H8.48972L6.81453 7.44414L8.48972 9.94649H7.24899L6.15865 8.24622L5.0892 9.94649H3.83594L5.51949 7.44414L3.89442 4.99609H3.8986Z"
/>
<path
d="M10.0329 4.99609V7.76998C10.0622 8.59296 10.0789 8.64727 10.2794 8.84779C10.4799 9.01907 10.7181 9.06502 11.3614 9.06502H12.3724V9.94649H11.2528C10.2794 9.9632 9.95357 9.87964 9.53163 9.5538C9.09299 9.16111 8.98855 8.81019 8.98438 7.77416V5.00027H10.0371L10.0329 4.99609Z"
/>
<path
d="M12.9178 9.06057H15.1737C15.5538 9.06057 15.7669 9.03133 15.8922 8.94778C16.0635 8.8517 16.1512 8.68877 16.1512 8.48825C16.1512 8.26684 16.0384 8.06632 15.8463 7.97023C15.7335 7.90339 15.5413 7.87415 15.299 7.87415H14.3883C13.816 7.87415 13.4316 7.77807 13.1768 7.56919C12.8635 7.31018 12.6797 6.90078 12.6797 6.45796C12.6797 5.84386 13.0055 5.30078 13.4943 5.11697C13.7324 5.02924 13.9914 5 14.6014 5H17.0494V5.88146H14.8395C14.3799 5.88146 14.2087 5.89817 14.0917 5.95666C13.9371 6.04439 13.8452 6.20731 13.8452 6.4329C13.8452 6.62506 13.9288 6.78799 14.0666 6.88407C14.2003 6.96762 14.3632 6.99687 14.7476 6.99687H15.5413C16.2557 6.99687 16.6316 7.10131 16.9199 7.37702C17.1664 7.60679 17.3209 8.04543 17.3209 8.49661C17.3209 9.01044 17.0912 9.47415 16.7277 9.72898C16.4771 9.90026 16.1638 9.95039 15.3993 9.95039H12.9136V9.06893L12.9178 9.06057Z"
/>
<path
d="M9.48826 20.382H4.19531V11.7178H16.0428V16.6765H9.48409V20.382H9.48826ZM5.44858 19.1287H8.235V16.6765H5.44858V19.1287ZM9.48826 15.4233H14.7937V12.971H9.48826V15.4233ZM5.44858 15.4233H8.235V12.971H5.44858V15.4233Z"
/>
</symbol>
<symbol id="pdf" viewBox="0 0 21 24">
<path
d="M17.5332 0H7.52376C6.46266 0 5.44334 0.388512 4.65379 1.09452L1.44125 3.96449C0.526371 4.78329 0 5.953 0 7.1812V21.2971C0 22.7885 1.21567 24.0042 2.70705 24.0042H17.5332C19.0245 24.0042 20.2402 22.7885 20.2402 21.2971V2.70705C20.2402 1.21567 19.0245 0 17.5332 0ZM18.9869 21.293C18.9869 22.095 18.3352 22.7467 17.5332 22.7467H2.70705C1.90496 22.7467 1.25326 22.095 1.25326 21.293V7.17702C1.25326 6.30809 1.62507 5.47676 2.27676 4.89608L5.4893 2.02611C6.04909 1.5248 6.7718 1.24909 7.52376 1.24909H17.5332C18.3352 1.24909 18.9869 1.90078 18.9869 2.70287V21.2888V21.293Z"
/>
<path
d="M7.00285 7.87442C7.3287 7.58617 7.52086 7.10993 7.52086 6.60445C7.52086 6.15327 7.35794 5.73552 7.05298 5.41803C6.73548 5.08382 6.42217 4.99609 5.5783 4.99609H3.10938V9.94649H4.16212V8.21698H5.85402C6.4347 8.21698 6.7146 8.13343 7.00285 7.87442ZM4.16212 7.33134V5.87756H5.6159C5.79971 5.87756 5.92922 5.89427 6.01695 5.92769C6.23836 6.01541 6.36368 6.24518 6.36368 6.56685C6.36368 6.84675 6.27595 7.09322 6.13392 7.20602C6.02112 7.29374 5.8582 7.33134 5.59084 7.33134H4.15794H4.16212Z"
/>
<path
d="M11.3684 9.8465C11.9491 9.69193 12.3042 9.33266 12.488 8.73945C12.605 8.36764 12.6802 7.8914 12.6802 7.47783C12.6802 6.71334 12.4713 5.98644 12.1538 5.63135C11.7611 5.18018 11.1971 4.99219 10.2029 4.99219H8.10156V9.94258H10.2029C10.8337 9.94258 11.1094 9.92169 11.3684 9.8465ZM9.15848 5.87783H10.2029C10.6415 5.87783 10.8838 5.95302 11.0927 6.12848C11.3517 6.35825 11.523 6.88462 11.523 7.46947C11.523 7.99584 11.3809 8.50133 11.1595 8.75198C10.9882 8.94415 10.6457 9.05694 10.2029 9.05694H9.15848V5.87365V5.87783Z"
/>
<path
d="M14.198 5.26776C13.5463 5.67715 13.3834 6.09073 13.375 7.36071V9.94243H14.4277V7.90379H17.3729V7.02232H14.4277V6.75496C14.4653 6.06567 14.7327 5.89439 15.8022 5.87768H17.3729V4.99622H15.6685C15.0001 4.9795 14.5698 5.06306 14.198 5.27193V5.26776Z"
/>
<path
d="M15.2324 18.6738C15.1112 18.5652 14.9692 18.4608 14.8104 18.3647C14.1629 17.9845 13.2438 17.8007 11.9906 17.8007H11.8653C11.7984 17.7381 11.7274 17.6754 11.6522 17.6085C11.176 17.1824 10.8 16.7146 10.5034 16.1965C11.0799 14.9224 11.3556 13.7903 11.3222 12.8211C11.318 12.6582 11.2929 12.5078 11.2512 12.3657C11.1885 12.136 11.0841 11.9354 10.9378 11.7683H10.9337C10.6997 11.501 10.3739 11.3506 10.0438 11.3506C9.71382 11.3506 9.40468 11.4968 9.17909 11.76C8.95768 12.0232 8.84071 12.3824 8.83653 12.8044C8.82818 13.4519 8.88248 14.0618 8.9911 14.6258C9.00363 14.6717 9.00781 14.7135 9.02034 14.7595C9.12896 15.2733 9.29188 15.7579 9.50494 16.2091C9.25846 16.7104 9.00781 17.1448 8.83653 17.4373C8.70703 17.6587 8.56081 17.8926 8.41042 18.1266C7.73366 18.2477 7.16133 18.3939 6.66421 18.5777C5.98744 18.82 5.44854 19.1375 5.06003 19.5135C4.80938 19.7558 4.6381 20.0106 4.55455 20.2822C4.46682 20.5579 4.471 20.8336 4.57126 21.0801C4.66316 21.3099 4.83026 21.502 5.0475 21.6315C5.1018 21.6649 5.15611 21.69 5.2146 21.7109C5.3817 21.7777 5.56551 21.8153 5.75768 21.8153C6.2005 21.8153 6.66003 21.6232 7.04436 21.2806C7.7629 20.6373 8.5065 19.6012 8.94515 18.9495C9.30442 18.8952 9.69711 18.8451 10.1357 18.7991C10.6538 18.7448 11.1133 18.7156 11.531 18.6989C11.6606 18.8159 11.7817 18.9245 11.9028 19.0289C12.5587 19.6138 13.06 20.0357 13.5112 20.3323C13.5112 20.3323 13.5112 20.3323 13.5154 20.3323C13.695 20.4493 13.8663 20.5495 14.0334 20.6247C14.2256 20.7125 14.4177 20.7626 14.6183 20.7626C14.8689 20.7626 15.107 20.6874 15.3034 20.5454C15.5039 20.3991 15.6459 20.1944 15.7128 19.9605C15.788 19.6806 15.7462 19.3673 15.5874 19.0874C15.4997 18.937 15.3827 18.7908 15.2365 18.6613L15.2324 18.6738ZM7.15298 19.8644C6.90233 20.1694 6.66003 20.4242 6.4428 20.6206C6.25481 20.7877 6.05011 20.8921 5.85794 20.9213C5.82452 20.9255 5.7911 20.9297 5.7535 20.9297C5.58222 20.9297 5.44436 20.8629 5.40259 20.7584C5.35663 20.6498 5.40677 20.4367 5.68248 20.1736C6.10024 19.7725 6.75194 19.4592 7.66682 19.2211C7.49554 19.4592 7.32426 19.6723 7.15716 19.8686L7.15298 19.8644ZM10.0438 12.2529C10.1817 12.2529 10.3237 12.3783 10.3906 12.6122C10.4073 12.6832 10.424 12.7626 10.424 12.8545C10.4282 12.9631 10.424 13.0801 10.424 13.1971C10.4073 13.5313 10.3488 13.8864 10.2527 14.2665C10.1942 14.5088 10.1149 14.7636 10.0146 15.031C9.90598 14.6592 9.82661 14.2623 9.78483 13.8404C9.74724 13.5146 9.73053 13.1762 9.73888 12.8211C9.74306 12.4827 9.86838 12.2529 10.048 12.2529H10.0438ZM10.5911 17.8634C10.4825 17.8717 10.3697 17.8801 10.2569 17.8926C10.1859 17.901 10.1107 17.9052 10.0397 17.9135C9.88927 17.9302 9.73888 17.9469 9.59684 17.9595L9.61355 17.9302H9.58431C9.58431 17.9302 9.59684 17.9093 9.6052 17.8968C9.71382 17.7088 9.85585 17.4707 10.0062 17.195L10.0188 17.2242L10.0522 17.1532C10.1608 17.3119 10.282 17.4665 10.4073 17.6169C10.4658 17.6879 10.5326 17.7548 10.5953 17.8258H10.5535L10.5911 17.8634ZM14.8438 19.7391C14.823 19.8185 14.731 19.877 14.6183 19.877C14.5514 19.877 14.4846 19.8602 14.4136 19.8268C14.2924 19.7683 14.1671 19.6973 14.0334 19.6096C14.0292 19.6096 14.0209 19.6054 14.0167 19.5971C13.7034 19.3965 13.3566 19.1166 12.9263 18.7407C13.5363 18.8033 14.0167 18.937 14.3592 19.1375C14.5096 19.2253 14.6224 19.313 14.6976 19.4007C14.823 19.5344 14.8689 19.6555 14.8438 19.7349V19.7391Z"
/>
</symbol>
<symbol id="csv" viewBox="0 0 21 24">
<path
d="M17.5332 0H7.52376C6.46266 0 5.44334 0.388512 4.65379 1.09452L1.44125 3.96449C0.526371 4.78329 0 5.953 0 7.1812V21.2971C0 22.7885 1.21567 24.0042 2.70705 24.0042H17.5332C19.0245 24.0042 20.2402 22.7885 20.2402 21.2971V2.70705C20.2402 1.21567 19.0245 0 17.5332 0ZM18.9869 21.293C18.9869 22.095 18.3352 22.7467 17.5332 22.7467H2.70705C1.90496 22.7467 1.25326 22.095 1.25326 21.293V7.17702C1.25326 6.30809 1.62507 5.47676 2.27676 4.89608L5.4893 2.02611C6.04909 1.5248 6.7718 1.24909 7.52376 1.24909H17.5332C18.3352 1.24909 18.9869 1.90078 18.9869 2.70287V21.2888V21.293Z"
/>
<path
d="M6.92505 9.94258V9.06112H5.41278C4.9992 9.06112 4.69424 8.97757 4.49372 8.823C4.218 8.60159 4.07179 8.07939 4.07179 7.38174C4.07179 6.84702 4.16787 6.45433 4.33915 6.25381C4.56891 5.9948 4.89476 5.87365 5.37936 5.87365H6.92923V4.99219H5.25403C4.74019 4.99219 4.24306 5.08827 3.94646 5.23866C3.28641 5.58122 2.90625 6.38749 2.90625 7.47783C2.90625 8.38853 3.15273 9.09454 3.61226 9.49558C3.99659 9.82979 4.39346 9.94258 5.20808 9.94258H6.92923H6.92505Z"
/>
<path
d="M9.07944 7.87469H9.99014C10.2366 7.87469 10.4288 7.90394 10.5374 7.97078C10.7296 8.06686 10.8424 8.26738 10.8424 8.48879C10.8424 8.68932 10.7546 8.85224 10.5834 8.94832C10.458 9.03187 10.2408 9.06112 9.86482 9.06112H7.60894V9.94258H10.0946C10.8591 9.94258 11.1724 9.89245 11.423 9.72117C11.7865 9.47052 12.0163 9.00263 12.0163 8.48879C12.0163 8.03762 11.8617 7.59898 11.6152 7.36921C11.327 7.09349 10.9468 6.98905 10.2366 6.98905H9.44289C9.05855 6.98905 8.89563 6.95981 8.76195 6.87626C8.61991 6.78018 8.54054 6.61725 8.54054 6.42509C8.54054 6.20368 8.62826 6.04075 8.78701 5.94885C8.90398 5.89036 9.07526 5.87365 9.53479 5.87365H11.7447V4.99219H9.29667C8.68675 4.99219 8.42774 5.02143 8.18962 5.10916C7.70085 5.29297 7.375 5.83605 7.375 6.45015C7.375 6.89715 7.55881 7.30237 7.87213 7.56138C8.12278 7.77026 8.51129 7.86634 9.08362 7.86634L9.07944 7.87469Z"
/>
<path
d="M14.8944 8.71829L13.4406 4.99609H12.25L14.3388 9.94231H15.3915L17.5555 4.99609H16.3691L14.8944 8.71829Z"
/>
<path d="M8.30813 13.6777H3.98438V14.931H8.30813V13.6777Z" />
<path d="M8.30813 18.7363H3.98438V19.9896H8.30813V18.7363Z" />
<path d="M16.2581 13.6777H9.15625V14.931H16.2581V13.6777Z" />
<path d="M16.2581 18.7363H9.15625V19.9896H16.2581V18.7363Z" />
</symbol>
<symbol id="accounting" viewBox="0 0 22 20">
<path
d="M2.48146 18.8981H9.24804V20H2.48146C1.11436 20 0 18.9311 0 17.6198V2.38017C0 1.06887 1.11436 0 2.48146 0H14.5403C15.9074 0 17.0218 1.06887 17.0218 2.38017V6.47199H15.8729V2.38017C15.8729 1.67493 15.2755 1.10193 14.5403 1.10193H2.48146C1.74621 1.10193 1.14883 1.67493 1.14883 2.38017V17.6198C1.14883 18.3251 1.74621 18.8981 2.48146 18.8981ZM4.24682 3.89715V4.99908H12.7788V3.89715H4.24682ZM8.94552 7.47842H4.24299V8.58035H8.94552V7.47842ZM8.94552 11.0597H4.24299V12.1616H8.94552V11.0597ZM4.24682 15.7429H8.94935V14.641H4.24682V15.7429ZM19.3654 13.3627H18.2165V17.7117H19.3654V13.3627ZM14.2186 16.2534H13.0698V17.7117H14.2186V16.2534ZM17.0218 16.2534H15.8729V17.7117H17.0218V16.2534ZM14.2186 13.3627H13.0698V14.8209H14.2186V13.3627ZM17.0218 13.3627H15.8729V14.8209H17.0218V13.3627ZM22 9.32966V18.4279C22 19.2948 21.2648 20 20.361 20H12.2273C11.3236 20 10.5883 19.2948 10.5883 18.4279V9.32966C10.5883 8.46281 11.3236 7.75758 12.2273 7.75758H20.361C21.2648 7.75758 22 8.46281 22 9.32966ZM20.8512 12.18H11.7372V18.4279C11.7372 18.6887 11.9554 18.8981 12.2273 18.8981H20.361C20.6329 18.8981 20.8512 18.6887 20.8512 18.4279V12.18ZM20.8512 9.32966C20.8512 9.06887 20.6329 8.8595 20.361 8.8595H12.2273C11.9554 8.8595 11.7372 9.06887 11.7372 9.32966V11.0817H20.8512V9.32966Z"
/>
</symbol>
<symbol id="accounting1" viewBox="0 0 20 24">
<path
d="M18.2332 0H1.76677C0.79257 0 0 0.790802 0 1.76283V22.2372C0 23.2092 0.79257 24 1.76677 24H18.2332C19.2074 24 20 23.2092 20 22.2372V1.76283C20 0.790802 19.2074 0 18.2332 0ZM1.76677 1.23563H18.2332C18.5263 1.23563 18.7616 1.4704 18.7616 1.76283V6.32229H1.23839V1.76283C1.23839 1.4704 1.47368 1.23563 1.76677 1.23563ZM18.2332 22.7644H1.76677C1.47368 22.7644 1.23839 22.5296 1.23839 22.2372V7.55792H18.7616V22.2372C18.7616 22.5296 18.5263 22.7644 18.2332 22.7644Z"
/>
<path
d="M5.22188 10.2228H3.86378C3.44885 10.2228 3.11249 10.5584 3.11249 10.9724V12.0721C3.11249 12.4861 3.44885 12.8217 3.86378 12.8217H5.22188C5.6368 12.8217 5.97317 12.4861 5.97317 12.0721V10.9724C5.97317 10.5584 5.6368 10.2228 5.22188 10.2228Z"
/>
<path
d="M5.22188 17.9907H3.86378C3.44885 17.9907 3.11249 18.3263 3.11249 18.7403V19.8401C3.11249 20.2541 3.44885 20.5897 3.86378 20.5897H5.22188C5.6368 20.5897 5.97317 20.2541 5.97317 19.8401V18.7403C5.97317 18.3263 5.6368 17.9907 5.22188 17.9907Z"
/>
<path
d="M5.22188 14.1067H3.86378C3.44885 14.1067 3.11249 14.4424 3.11249 14.8564V15.9561C3.11249 16.3701 3.44885 16.7057 3.86378 16.7057H5.22188C5.6368 16.7057 5.97317 16.3701 5.97317 15.9561V14.8564C5.97317 14.4424 5.6368 14.1067 5.22188 14.1067Z"
/>
<path
d="M10.7699 10.2228H9.41177C8.99684 10.2228 8.66047 10.5584 8.66047 10.9724V12.0721C8.66047 12.4861 8.99684 12.8217 9.41177 12.8217H10.7699C11.1848 12.8217 11.5212 12.4861 11.5212 12.0721V10.9724C11.5212 10.5584 11.1848 10.2228 10.7699 10.2228Z"
/>
<path
d="M10.7699 17.9907H9.41177C8.99684 17.9907 8.66047 18.3263 8.66047 18.7403V19.8401C8.66047 20.2541 8.99684 20.5897 9.41177 20.5897H10.7699C11.1848 20.5897 11.5212 20.2541 11.5212 19.8401V18.7403C11.5212 18.3263 11.1848 17.9907 10.7699 17.9907Z"
/>
<path
d="M10.7699 14.1067H9.41177C8.99684 14.1067 8.66047 14.4424 8.66047 14.8564V15.9561C8.66047 16.3701 8.99684 16.7057 9.41177 16.7057H10.7699C11.1848 16.7057 11.5212 16.3701 11.5212 15.9561V14.8564C11.5212 14.4424 11.1848 14.1067 10.7699 14.1067Z"
/>
<path
d="M16.1362 10.2228H14.7781C14.3632 10.2228 14.0268 10.5584 14.0268 10.9724V12.0721C14.0268 12.4861 14.3632 12.8217 14.7781 12.8217H16.1362C16.5511 12.8217 16.8875 12.4861 16.8875 12.0721V10.9724C16.8875 10.5584 16.5511 10.2228 16.1362 10.2228Z"
/>
<path
d="M16.1362 14.1067H14.7781C14.3632 14.1067 14.0268 14.4424 14.0268 14.8564V19.8401C14.0268 20.2541 14.3632 20.5897 14.7781 20.5897H16.1362C16.5511 20.5897 16.8875 20.2541 16.8875 19.8401V14.8564C16.8875 14.4424 16.5511 14.1067 16.1362 14.1067Z"
/>
</symbol>
</svg>

After

Width:  |  Height:  |  Size: 41 KiB

View File

@ -0,0 +1,12 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<symbol id="mpiicon" viewBox="0 0 46 44">
<path
d="M41.4958 21.323C39.1715 23.5521 36.0885 24.8363 32.8555 24.922V27.0183C32.9935 33.8368 28.8005 40.007 22.3757 42.4411C20.3994 43.1976 18.2989 43.584 16.1808 43.5801C12.4809 43.5801 5.65137 42.2803 1.35247 33.6222L1.31027 33.5313L1.26767 33.4335C0.293966 31.3184 -0.130034 28.9953 0.0346658 26.6759V26.5711V6.82277C0.0279672 4.90602 0.837366 3.07558 2.26397 1.78188C5.05877 -0.752304 9.39637 -0.56041 11.9523 2.21071C13.2466 0.814102 15.0712 0.0183254 16.9842 0.0163723C19.4275 0.0197903 21.6846 1.31044 22.9113 3.40553C24.7789 1.60976 27.7529 0.177017 32.2847 0.191055C32.9403 0.191055 33.6941 0.225967 34.399 0.288955H34.5045L34.6316 0.302749C40.9029 1.01247 45.515 6.46742 45.1258 12.7136C45.0216 15.9277 43.7297 18.9917 41.4958 21.323ZM34.11 3.73402C33.4618 3.65028 32.8485 3.65028 32.2777 3.65028C24.2574 3.65028 23.7007 8.92616 23.7007 8.92616V27.0952H20.3319V6.82973C20.3319 4.9966 18.8331 3.51051 16.9842 3.51051C16.9793 3.51051 16.9747 3.51027 16.9701 3.51027C15.1251 3.50661 13.6263 4.98634 13.6224 6.81581V27.0813H10.2255V6.81581C10.2255 4.98244 8.72667 3.49635 6.87777 3.49635C5.02887 3.49635 3.53007 4.98244 3.53007 6.81581V27.0813H3.49487C3.42457 28.7981 3.77007 30.5067 4.50277 32.0636C7.77977 38.6535 12.5935 40.093 16.1808 40.093C17.8351 40.0985 19.4764 39.8026 21.0227 39.2196C26.0912 37.3236 29.4174 32.4802 29.3389 27.1091V21.3579C30.0966 21.4501 30.8588 21.4967 31.6224 21.4977C41.6651 21.4977 41.6158 12.595 41.6158 12.595C41.6158 12.595 42.1937 4.95705 34.11 3.73402ZM32.6159 16.089C30.6698 16.089 29.0922 14.5246 29.0922 12.595C29.0922 10.6653 30.6698 9.10085 32.6159 9.10085C34.5622 9.10085 36.1398 10.6653 36.1398 12.595C36.1398 14.5246 34.5622 16.089 32.6159 16.089Z"
fill="#2365AF" />
</symbol>
<symbol id="mpilogo" viewBox="0 0 167 44">
<path
d="M157.261 43.3425C152.095 43.3425 147.895 39.6947 147.895 35.2153C147.895 30.736 152.095 27.0742 157.261 27.0742V27.0603C162.392 27.0603 166.62 30.7152 166.62 35.2013C166.62 39.6876 162.427 43.3425 157.261 43.3425ZM157.261 30.3307C154.978 30.3307 153.124 32.5249 153.124 35.2224C153.124 37.9198 154.978 40.114 157.261 40.114C159.545 40.114 161.391 37.9198 161.391 35.2224C161.391 32.5249 159.538 30.3307 157.261 30.3307ZM145.548 42.5808H136.731C132.975 41.9309 129.945 40.3726 129.945 35.0618C129.839 30.219 132.439 27.319 139.001 27.2279L144.773 27.151V31.1554H138.916C136.189 31.4768 135.399 33.0841 135.484 35.2643C135.653 38.3949 137.556 39.3733 140.636 39.3733C141.383 39.3175 141.925 39.2824 142.045 38.4508V35.8373H139.001V32.8115H146.957V41.26C146.812 41.9491 146.25 42.476 145.548 42.5808ZM116.991 33.2866V42.6437H105.207L103.727 40.4913H98.5753L97.476 42.6437L91.7811 42.5109L98.8854 27.1372V27.151H103.959L110.901 40.7219V27.151H117.773L123.002 30.6452V27.151H129.007V42.6437H123.7C123.82 37.5704 121.72 34.181 116.991 33.2866ZM102.289 34.6913L101.324 32.8115L100.358 34.6913L99.3928 36.5711H103.255L102.289 34.6913ZM109.118 3.50343H115.215V19.1847H109.118V3.50343ZM112.107 0.240005L114.721 2.36452H109.612L112.107 0.240005ZM96.3129 19.1847V14.1254V3.50343H101.916V14.1254H107.843V19.1847H101.916H96.3129ZM83.7538 19.1847V14.1254V3.50343H89.3498V14.1254H95.2839V19.1847H89.3498H83.7538ZM91.3514 27.1091L96.933 27.1859C94.9035 36.1658 89.1805 41.3298 79.2152 42.6648V38.3601C81.9003 38.0735 83.5426 37.6962 84.2542 36.6898C81.6124 34.0017 79.6467 30.7338 78.5174 27.151H83.6693L88.2293 32.6997C89.5683 32.4341 90.4847 30.75 91.3514 27.1091ZM76.3398 3.50343H82.1047V19.1847H76.3398V3.50343ZM76.3398 0.729141H82.1047V2.36452H76.3398V0.729141ZM68.827 12.7695L65.7471 16.4104H63.2169L60.0948 12.7277L60.264 19.1847H54.4284V3.50343H60.0314L64.7111 8.15053L69.3978 3.50343H74.8526V19.1847H68.827V12.7695ZM65.3382 27.312C74.0422 29.1918 72.1183 38.2482 65.0844 39.3242H60.0174V42.7345L54.2384 42.6437V27.2279L64.4644 27.151C64.7674 27.2001 65.0563 27.2489 65.3382 27.312ZM60.0103 31.0296V35.5299C63.9429 35.6904 66.5716 35.2714 66.3531 32.9652C66.2334 31.3579 63.7951 30.8688 60.0103 31.0296ZM41.4958 21.323C39.1715 23.5521 36.0885 24.8363 32.8555 24.922V27.0183C32.9935 33.8368 28.8005 40.007 22.3757 42.4411C20.3994 43.1976 18.2989 43.584 16.1808 43.5801C12.4809 43.5801 5.65137 42.2803 1.35247 33.6222L1.31027 33.5313L1.26767 33.4335C0.293966 31.3184 -0.130034 28.9953 0.0346658 26.6759V26.5711V6.82277C0.0279672 4.90602 0.837366 3.07558 2.26397 1.78188C5.05877 -0.752304 9.39637 -0.56041 11.9523 2.21071C13.2466 0.814102 15.0712 0.0183254 16.9842 0.0163723C19.4275 0.0197902 21.6846 1.31044 22.9113 3.40553C24.7789 1.60976 27.7529 0.177017 32.2847 0.191055C32.9403 0.191055 33.6941 0.225967 34.399 0.288955H34.5045L34.6316 0.302749C40.9029 1.01247 45.515 6.46742 45.1258 12.7136C45.0216 15.9277 43.7297 18.9917 41.4958 21.323ZM34.11 3.73402C33.4618 3.65028 32.8485 3.65028 32.2777 3.65028C24.2574 3.65028 23.7007 8.92616 23.7007 8.92616V27.0952H20.3319V6.82973C20.3319 4.9966 18.8331 3.51051 16.9842 3.51051C16.9793 3.51051 16.9747 3.51027 16.9701 3.51027C15.1251 3.50661 13.6263 4.98634 13.6224 6.81581V27.0813H10.2255V6.81581C10.2255 4.98244 8.72667 3.49635 6.87777 3.49635C5.02887 3.49635 3.53007 4.98244 3.53007 6.81581V27.0813H3.49487C3.42457 28.7981 3.77007 30.5067 4.50277 32.0636C7.77977 38.6535 12.5935 40.093 16.1808 40.093C17.8351 40.0985 19.4764 39.8026 21.0227 39.2196C26.0912 37.3236 29.4174 32.4802 29.3389 27.1091V21.3579C30.0966 21.4501 30.8588 21.4967 31.6224 21.4977C41.6651 21.4977 41.6158 12.595 41.6158 12.595C41.6158 12.595 42.1937 4.95705 34.11 3.73402ZM32.6159 16.089C30.6698 16.089 29.0922 14.5246 29.0922 12.595C29.0922 10.6653 30.6698 9.10085 32.6159 9.10085C34.5622 9.10085 36.1398 10.6653 36.1398 12.595C36.1398 14.5246 34.5622 16.089 32.6159 16.089ZM77.7351 25.8862H71.9702V24.2511H77.7351V25.8862ZM77.7351 42.7067H71.9702V27.0254H77.7351V42.7067Z"
fill="#2365AF" />
</symbol>
</svg>

After

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

2
src/assets/js/axios.min.js vendored Normal file

File diff suppressed because one or more lines are too long

19
src/assets/js/jquery.mask.min.js vendored Normal file
View File

@ -0,0 +1,19 @@
// jQuery Mask Plugin v1.14.16
// github.com/igorescobar/jQuery-Mask-Plugin
var $jscomp=$jscomp||{};$jscomp.scope={};$jscomp.findInternal=function(a,n,f){a instanceof String&&(a=String(a));for(var p=a.length,k=0;k<p;k++){var b=a[k];if(n.call(f,b,k,a))return{i:k,v:b}}return{i:-1,v:void 0}};$jscomp.ASSUME_ES5=!1;$jscomp.ASSUME_NO_NATIVE_MAP=!1;$jscomp.ASSUME_NO_NATIVE_SET=!1;$jscomp.SIMPLE_FROUND_POLYFILL=!1;
$jscomp.defineProperty=$jscomp.ASSUME_ES5||"function"==typeof Object.defineProperties?Object.defineProperty:function(a,n,f){a!=Array.prototype&&a!=Object.prototype&&(a[n]=f.value)};$jscomp.getGlobal=function(a){return"undefined"!=typeof window&&window===a?a:"undefined"!=typeof global&&null!=global?global:a};$jscomp.global=$jscomp.getGlobal(this);
$jscomp.polyfill=function(a,n,f,p){if(n){f=$jscomp.global;a=a.split(".");for(p=0;p<a.length-1;p++){var k=a[p];k in f||(f[k]={});f=f[k]}a=a[a.length-1];p=f[a];n=n(p);n!=p&&null!=n&&$jscomp.defineProperty(f,a,{configurable:!0,writable:!0,value:n})}};$jscomp.polyfill("Array.prototype.find",function(a){return a?a:function(a,f){return $jscomp.findInternal(this,a,f).v}},"es6","es3");
(function(a,n,f){"function"===typeof define&&define.amd?define(["jquery"],a):"object"===typeof exports&&"undefined"===typeof Meteor?module.exports=a(require("jquery")):a(n||f)})(function(a){var n=function(b,d,e){var c={invalid:[],getCaret:function(){try{var a=0,r=b.get(0),h=document.selection,d=r.selectionStart;if(h&&-1===navigator.appVersion.indexOf("MSIE 10")){var e=h.createRange();e.moveStart("character",-c.val().length);a=e.text.length}else if(d||"0"===d)a=d;return a}catch(C){}},setCaret:function(a){try{if(b.is(":focus")){var c=
b.get(0);if(c.setSelectionRange)c.setSelectionRange(a,a);else{var g=c.createTextRange();g.collapse(!0);g.moveEnd("character",a);g.moveStart("character",a);g.select()}}}catch(B){}},events:function(){b.on("keydown.mask",function(a){b.data("mask-keycode",a.keyCode||a.which);b.data("mask-previus-value",b.val());b.data("mask-previus-caret-pos",c.getCaret());c.maskDigitPosMapOld=c.maskDigitPosMap}).on(a.jMaskGlobals.useInput?"input.mask":"keyup.mask",c.behaviour).on("paste.mask drop.mask",function(){setTimeout(function(){b.keydown().keyup()},
100)}).on("change.mask",function(){b.data("changed",!0)}).on("blur.mask",function(){f===c.val()||b.data("changed")||b.trigger("change");b.data("changed",!1)}).on("blur.mask",function(){f=c.val()}).on("focus.mask",function(b){!0===e.selectOnFocus&&a(b.target).select()}).on("focusout.mask",function(){e.clearIfNotMatch&&!k.test(c.val())&&c.val("")})},getRegexMask:function(){for(var a=[],b,c,e,t,f=0;f<d.length;f++)(b=l.translation[d.charAt(f)])?(c=b.pattern.toString().replace(/.{1}$|^.{1}/g,""),e=b.optional,
(b=b.recursive)?(a.push(d.charAt(f)),t={digit:d.charAt(f),pattern:c}):a.push(e||b?c+"?":c)):a.push(d.charAt(f).replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&"));a=a.join("");t&&(a=a.replace(new RegExp("("+t.digit+"(.*"+t.digit+")?)"),"($1)?").replace(new RegExp(t.digit,"g"),t.pattern));return new RegExp(a)},destroyEvents:function(){b.off("input keydown keyup paste drop blur focusout ".split(" ").join(".mask "))},val:function(a){var c=b.is("input")?"val":"text";if(0<arguments.length){if(b[c]()!==a)b[c](a);
c=b}else c=b[c]();return c},calculateCaretPosition:function(a){var d=c.getMasked(),h=c.getCaret();if(a!==d){var e=b.data("mask-previus-caret-pos")||0;d=d.length;var g=a.length,f=a=0,l=0,k=0,m;for(m=h;m<d&&c.maskDigitPosMap[m];m++)f++;for(m=h-1;0<=m&&c.maskDigitPosMap[m];m--)a++;for(m=h-1;0<=m;m--)c.maskDigitPosMap[m]&&l++;for(m=e-1;0<=m;m--)c.maskDigitPosMapOld[m]&&k++;h>g?h=10*d:e>=h&&e!==g?c.maskDigitPosMapOld[h]||(e=h,h=h-(k-l)-a,c.maskDigitPosMap[h]&&(h=e)):h>e&&(h=h+(l-k)+f)}return h},behaviour:function(d){d=
d||window.event;c.invalid=[];var e=b.data("mask-keycode");if(-1===a.inArray(e,l.byPassKeys)){e=c.getMasked();var h=c.getCaret(),g=b.data("mask-previus-value")||"";setTimeout(function(){c.setCaret(c.calculateCaretPosition(g))},a.jMaskGlobals.keyStrokeCompensation);c.val(e);c.setCaret(h);return c.callbacks(d)}},getMasked:function(a,b){var h=[],f=void 0===b?c.val():b+"",g=0,k=d.length,n=0,p=f.length,m=1,r="push",u=-1,w=0;b=[];if(e.reverse){r="unshift";m=-1;var x=0;g=k-1;n=p-1;var A=function(){return-1<
g&&-1<n}}else x=k-1,A=function(){return g<k&&n<p};for(var z;A();){var y=d.charAt(g),v=f.charAt(n),q=l.translation[y];if(q)v.match(q.pattern)?(h[r](v),q.recursive&&(-1===u?u=g:g===x&&g!==u&&(g=u-m),x===u&&(g-=m)),g+=m):v===z?(w--,z=void 0):q.optional?(g+=m,n-=m):q.fallback?(h[r](q.fallback),g+=m,n-=m):c.invalid.push({p:n,v:v,e:q.pattern}),n+=m;else{if(!a)h[r](y);v===y?(b.push(n),n+=m):(z=y,b.push(n+w),w++);g+=m}}a=d.charAt(x);k!==p+1||l.translation[a]||h.push(a);h=h.join("");c.mapMaskdigitPositions(h,
b,p);return h},mapMaskdigitPositions:function(a,b,d){a=e.reverse?a.length-d:0;c.maskDigitPosMap={};for(d=0;d<b.length;d++)c.maskDigitPosMap[b[d]+a]=1},callbacks:function(a){var g=c.val(),h=g!==f,k=[g,a,b,e],l=function(a,b,c){"function"===typeof e[a]&&b&&e[a].apply(this,c)};l("onChange",!0===h,k);l("onKeyPress",!0===h,k);l("onComplete",g.length===d.length,k);l("onInvalid",0<c.invalid.length,[g,a,b,c.invalid,e])}};b=a(b);var l=this,f=c.val(),k;d="function"===typeof d?d(c.val(),void 0,b,e):d;l.mask=
d;l.options=e;l.remove=function(){var a=c.getCaret();l.options.placeholder&&b.removeAttr("placeholder");b.data("mask-maxlength")&&b.removeAttr("maxlength");c.destroyEvents();c.val(l.getCleanVal());c.setCaret(a);return b};l.getCleanVal=function(){return c.getMasked(!0)};l.getMaskedVal=function(a){return c.getMasked(!1,a)};l.init=function(g){g=g||!1;e=e||{};l.clearIfNotMatch=a.jMaskGlobals.clearIfNotMatch;l.byPassKeys=a.jMaskGlobals.byPassKeys;l.translation=a.extend({},a.jMaskGlobals.translation,e.translation);
l=a.extend(!0,{},l,e);k=c.getRegexMask();if(g)c.events(),c.val(c.getMasked());else{e.placeholder&&b.attr("placeholder",e.placeholder);b.data("mask")&&b.attr("autocomplete","off");g=0;for(var f=!0;g<d.length;g++){var h=l.translation[d.charAt(g)];if(h&&h.recursive){f=!1;break}}f&&b.attr("maxlength",d.length).data("mask-maxlength",!0);c.destroyEvents();c.events();g=c.getCaret();c.val(c.getMasked());c.setCaret(g)}};l.init(!b.is("input"))};a.maskWatchers={};var f=function(){var b=a(this),d={},e=b.attr("data-mask");
b.attr("data-mask-reverse")&&(d.reverse=!0);b.attr("data-mask-clearifnotmatch")&&(d.clearIfNotMatch=!0);"true"===b.attr("data-mask-selectonfocus")&&(d.selectOnFocus=!0);if(p(b,e,d))return b.data("mask",new n(this,e,d))},p=function(b,d,e){e=e||{};var c=a(b).data("mask"),f=JSON.stringify;b=a(b).val()||a(b).text();try{return"function"===typeof d&&(d=d(b)),"object"!==typeof c||f(c.options)!==f(e)||c.mask!==d}catch(w){}},k=function(a){var b=document.createElement("div");a="on"+a;var e=a in b;e||(b.setAttribute(a,
"return;"),e="function"===typeof b[a]);return e};a.fn.mask=function(b,d){d=d||{};var e=this.selector,c=a.jMaskGlobals,f=c.watchInterval;c=d.watchInputs||c.watchInputs;var k=function(){if(p(this,b,d))return a(this).data("mask",new n(this,b,d))};a(this).each(k);e&&""!==e&&c&&(clearInterval(a.maskWatchers[e]),a.maskWatchers[e]=setInterval(function(){a(document).find(e).each(k)},f));return this};a.fn.masked=function(a){return this.data("mask").getMaskedVal(a)};a.fn.unmask=function(){clearInterval(a.maskWatchers[this.selector]);
delete a.maskWatchers[this.selector];return this.each(function(){var b=a(this).data("mask");b&&b.remove().removeData("mask")})};a.fn.cleanVal=function(){return this.data("mask").getCleanVal()};a.applyDataMask=function(b){b=b||a.jMaskGlobals.maskElements;(b instanceof a?b:a(b)).filter(a.jMaskGlobals.dataMaskAttr).each(f)};k={maskElements:"input,td,span,div",dataMaskAttr:"*[data-mask]",dataMask:!0,watchInterval:300,watchInputs:!0,keyStrokeCompensation:10,useInput:!/Chrome\/[2-4][0-9]|SamsungBrowser/.test(window.navigator.userAgent)&&
k("input"),watchDataMask:!1,byPassKeys:[9,16,17,18,36,37,38,39,40,91],translation:{0:{pattern:/\d/},9:{pattern:/\d/,optional:!0},"#":{pattern:/\d/,recursive:!0},A:{pattern:/[a-zA-Z0-9]/},S:{pattern:/[a-zA-Z]/}}};a.jMaskGlobals=a.jMaskGlobals||{};k=a.jMaskGlobals=a.extend(!0,{},k,a.jMaskGlobals);k.dataMask&&a.applyDataMask();setInterval(function(){a.jMaskGlobals.watchDataMask&&a.applyDataMask()},k.watchInterval)},window.jQuery,window.Zepto);

2292
src/assets/style/default.css Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,56 @@
/* fonts */
@font-face {
font-family: 'Roboto';
font-style: normal;
font-weight: 400;
src: url(../fonts/roboto-400.woff2) format('woff2');
}
@font-face {
font-family: 'Roboto';
font-style: normal;
font-weight: 500;
src: url(../fonts/roboto-500.woff2) format('woff2');
}
@font-face {
font-family: 'Roboto';
font-style: normal;
font-weight: 700;
src: url(../fonts/roboto-700.woff2) format('woff2');
}
@font-face {
font-family: 'Roboto';
font-style: normal;
font-weight: 900;
src: url(../fonts/roboto-900.woff2) format('woff2');
}
@font-face {
font-family: 'Roboto';
font-style: italic;
font-weight: 400;
src: url(../fonts/roboto-400-italic.woff2) format('woff2');
}
@font-face {
font-family: 'Roboto';
font-style: italic;
font-weight: 500;
src: url(../fonts/roboto-500-italic.woff2) format('woff2');
}
@font-face {
font-family: 'Roboto';
font-style: italic;
font-weight: 700;
src: url(../fonts/roboto-700-italic.woff2) format('woff2');
}
@font-face {
font-family: 'Roboto';
font-style: italic;
font-weight: 900;
src: url(../fonts/roboto-900-italic.woff2) format('woff2');
}

View File

@ -0,0 +1,95 @@
<template>
<section class="section-list">
<div class="section-header">
<i :class="'ico-c ico-section back-grad-' + iconBack">
<svg height="20"><use :href="icourl + '#' + icon"></use></svg>
</i>
<h1>
<span v-if="title !== undefined">{{ title }}</span>
<span class="section-header-count">{{ totalData }} {{ listText }}</span>
</h1>
<div class="section-header-buttons-c">
<icon-button
toRoute="/piyangolar/piyango-listesi"
icon="list"
iconClass="ico-section ico-section-header-btn" />
</div>
</div>
<div class="section-content">
<div class="dashboard-list-C">
<template v-for="row in tableData">
<template v-if="lineRoute !== undefined">
<router-link :to="lineRoute + row[lineRouteKey!]" class="dashboard-list-item">
<div>
<span>{{ row.baslik }}</span>
<br />
<span class="list-second-line" v-if="row[dateKey] !== null">
{{
dateStore.dateFormat({
date: row[dateKey],
pattern: 'yy-mm-dd-t'
})
}}
</span>
</div>
<div>{{ DateCalculate(row[dateKey]) }}</div>
</router-link>
</template>
<template v-else>
<div class="dashboard-list-item clickable" @click="OnClick($event, row)">
<div>
<span>{{ row.baslik }}</span>
<br />
<span class="list-second-line" v-if="row[dateKey] !== null">
{{
dateStore.dateFormat({
date: row[dateKey],
pattern: 'yy-mm-dd-t'
})
}}
</span>
</div>
<div>{{ DateCalculate(row[dateKey]) }}</div>
</div>
</template>
</template>
</div>
</div>
</section>
</template>
<script setup lang="ts">
import { ref } from 'vue'
import { useDateStore } from '@/stores/dateStore'
import icourl from '@/assets/images/icons.svg'
const dateStore = useDateStore()
const props = defineProps<{
tableData: Record<string, any>
lineFunction?: Function
title?: string
listText?: string
icon?: string
apiList?: string
lineRoute?: string
lineRouteKey?: string
dateKey: string
iconBack: string
total: number
}>()
const totalData = ref<number>(props.total)
const emit = defineEmits(['click'])
const DateCalculate = (date: string): string => {
const today: Date = new Date()
const dataDate: Date = new Date(date)
const diffTime: number = Math.abs(today.getTime() - dataDate.getTime())
const diffDays: number = Math.floor(diffTime / (1000 * 60 * 60 * 24))
return String(diffDays) + ' Gün'
}
const OnClick = (e: Event, row: object) => {
emit('click', row)
}
</script>

View File

@ -0,0 +1,48 @@
<template>
<div class="loading-w" v-if="dataStore.isLoading">
<div class="loading-text">Yükleniyor...Lütfen bekleyiniz</div>
<div class="loading-shadow"></div>
</div>
</template>
<script setup lang="ts">
import { useDataStore } from '@/stores/dataStore'
const dataStore = useDataStore()
</script>
<style lang="css" scoped>
.loading-w {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: 99999;
display: flex;
justify-content: center;
align-items: center;
pointer-events: all;
}
.loading-text {
position: absolute;
right: 0;
bottom:0;
width: auto;
border-radius: 8px 0 0 0;
background-color: rgba(0, 0, 0, 0.5);
padding: 12px 24px;
text-align: center;
justify-content: center;
color: rgb(255, 255, 255);
font-size: 20px;
font-size: 1em;
}
.loading-shadow {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: rgba(0, 0, 0, 0.05);
z-index: 9998;
pointer-events: none;
}
</style>

View File

@ -0,0 +1,96 @@
<template>
<template
v-if="
(itemData !== undefined && itemData?.to !== undefined && itemData?.to !== '') ||
routeTo !== undefined
">
<RouterLink
:to="goToRoute"
:class="[
itemData !== undefined && itemData.sub !== undefined && (itemData.showsub === undefined || itemData.showsub)
? 'menu-have-sub menu-sub-hover-d'
: ''
]">
<i
class="ico-c ico-menu-side"
v-if="
(itemData !== undefined &&
itemData?.ico !== undefined &&
itemData?.ico !== '') ||
icon !== undefined
">
<svg>
<use :href="icourl + '#' + (icon !== undefined ? icon : itemData?.ico)" />
</svg>
</i>
<span>
{{
title !== undefined
? title
: itemData !== undefined && itemData.title !== undefined
? itemData.title
: ''
}}
</span>
</RouterLink>
</template>
<div
v-else
:class="[
(itemData !== undefined && itemData.sub !== undefined) ||
((clickable !== undefined && clickable) || (itemData?.clickable !== undefined && itemData?.clickable))
? 'menu-have-sub menu-sub-hover-d'
: ''
]"
@click="OnClick">
<i
class="ico-c ico-menu-side"
v-if="
(itemData !== undefined && itemData?.ico !== undefined && itemData?.ico !== '') ||
icon !== undefined
">
<svg>
<use :href="icourl + '#' + (icon !== undefined ? icon : itemData?.ico)" />
</svg>
</i>
<span>
{{
title !== undefined
? title
: itemData !== undefined && itemData.title !== undefined
? itemData.title
: ''
}}
</span>
</div>
</template>
<script setup lang="ts">
import { computed } from 'vue'
import icourl from '@/assets/images/icons.svg'
interface NavItemObj {
[key: string]: any
title?: string
ico?: string
to?: string
clickable?: boolean
}
const props = defineProps<{
itemData?: NavItemObj
icon?: string
title?: string
routeTo?: string
clickable?: boolean
}>()
const goToRoute = computed<any>(() => {
return props.routeTo !== undefined ? props.routeTo : props.itemData?.to
})
const emit = defineEmits(['click'])
const OnClick = (e: Event) => {
emit('click', props.itemData)
}
</script>

View File

@ -0,0 +1,52 @@
<template>
<nav>
<ul>
<template v-for="(nav, i) in menuData">
<li
@mouseover="OpenMenu(i, 'd')"
@mouseleave="CloseMenu"
v-if="nav.show === undefined || nav.show">
<nav-item :itemData="nav" @click="OpenMenu(i, 'm')" />
<template
v-if="nav.sub !== undefined && (nav.showsub === undefined || nav.showsub)">
<nav
class="menu-sub menu-side-sub menu-sub-left"
v-if="openedSub === i"
@click="OpenMenu(i, 'm')">
<ul>
<template v-for="(sub, j) in nav.sub">
<li v-if="sub.show === undefined || sub.show">
<nav-item :itemData="sub" />
</li>
</template>
</ul>
</nav>
</template>
</li>
</template>
</ul>
</nav>
</template>
<script setup lang="ts">
import { ref } from 'vue'
import NavItem from '@/components/NavItem.vue'
interface NavObj {
[key: string]: any
sub?: Record<string, any>
}
const props = defineProps<{
menuData: NavObj[]
}>()
const openedSub = ref<number | null>(null)
const OpenMenu = (i: number, d: string) => {
if (d === 'd' && document.body.offsetWidth >= 992) openedSub.value = i
if (d === 'm' && document.body.offsetWidth < 992) openedSub.value = i
}
const CloseMenu = () => {
openedSub.value = -1
}
</script>

View File

@ -0,0 +1,59 @@
<template>
<div
:class="[
'panel-wrapper',
'panel-right',
localShow ? 'showme' : '',
$slots.footerButton ? 'panel-have-footer' : '',
wide ? 'panel-wide' : '',
full ? 'panel-full' : ''
]">
<div class="panel-header">
<h3>{{ panelTitle }}</h3>
<span class="panel-close panel-close-btn" @click="closePanel"></span>
</div>
<div class="panel-content">
<slot name="panelContent"></slot>
</div>
<div class="panel-footer" v-if="$slots.footerButton">
<slot name="footerButton"></slot>
<button class="button-c button-cancel panel-close" @click="closePanel">
Vazgeç
</button>
</div>
</div>
<div :class="['menu-side-shadow', localShow ? 'showme' : '']" @click="closePanel"></div>
</template>
<script setup lang="ts">
import { ref, onMounted } from 'vue'
import { useGlobalStore } from '@/stores/globalStore'
interface Props {
panelTitle: string
modelValue: boolean
wide?: boolean
full?: boolean
}
const props = withDefaults(defineProps<Props>(), {
wide: false,
full: false
})
const emit = defineEmits(['update:modelValue'])
const globalStore = useGlobalStore()
const localShow = ref<Boolean>(false)
const closePanel = () => {
localShow.value = false
setTimeout(() => {
emit('update:modelValue', false)
}, globalStore.animateTime)
}
onMounted(() => {
setTimeout(() => {
localShow.value = props.modelValue
}, 10)
})
</script>

View File

@ -0,0 +1,17 @@
<template>
<div class="breadcrumb-wrapper">
<icon-button
@click="$router.go(-1)"
icon="arrow"
classList="breadcrumbs-back breadcrumb-link" />
<div class="breadcrumbs-list">
<icon-button toRoute="/" icon="dashboard" classList="breadcrumbs-dashboard" />
<span>{{ currentPageText }}</span>
</div>
</div>
</template>
<script setup lang="ts">
const props = defineProps<{
currentPageText: string
}>()
</script>

View File

@ -0,0 +1,225 @@
<template>
<div class="list-wrapper">
<table class="table-border table-colored table-list">
<thead>
<tr>
<th class="table-head-row-number" v-if="rowNumber">
<div class="table-head-content">Sıra No</div>
</th>
<template v-for="(headCell, h) in tableHeader">
<th :style="headCell.style || ''">
<div
:class="[
'table-head-content',
headCell.sort !== undefined && headCell.sort ? 'clickable' : ''
]"
@click="SortColumn(headCell)">
<span>{{ headCell.title }}</span>
<template
v-if="
headCell.sort !== undefined && headCell.sort && tableData.length > 1
">
<i
class="ico-c ico-sort"
v-if="
localSort?.sortOrder === '' ||
headCell.name !== localSort?.sortColumn
">
<svg>
<use href="@/assets/images/icons.svg#arrowsortable" />
</svg>
</i>
<i
:class="[
'ico-c',
'ico-sort',
localSort?.sortOrder === 'asc' ? 'order-asc' : ''
]"
v-if="
headCell.name === localSort?.sortColumn &&
localSort?.sortOrder !== ''
">
<svg>
<use href="@/assets/images/icons.svg#arrowline" />
</svg>
</i>
</template>
</div>
</th>
</template>
</tr>
</thead>
<tbody>
<tr v-if="tableData.length === 0 && !isPreview">
<td :colspan="rowNumber ? tableHeader.length + 1 : tableHeader.length">
Veri bulunamadı
</td>
</tr>
<tr
v-else
v-for="(dataRow, i) in tableData"
@click="LocalRowAction(dataRow)"
:class="[rowAction !== undefined && rowAction !== '' ? 'clickable' : '']">
<td v-if="rowNumber">
{{
showPagination && localPagination.pageNumber !== undefined
? (Number(localPagination.pageNumber) - 1) *
Number(localPagination.pageSize) +
i +
1
: i + 1
}}
</td>
<slot :name="'dataRow' + i" :rowData="dataRow" :rowIndex="i">
<template v-for="(dataCell, j) in tableHeader">
<td v-if="dataCell.computeHtml === undefined">
<slot
:name="'dataCell' + j"
:cellData="CellData(dataRow, dataCell.name)"
:cellIndex="j">
{{
dataCell.compute !== undefined
? dataCell.compute(dataRow)
: dataRow[dataCell.name]
}}
</slot>
</td>
<td v-else v-html="dataCell.computeHtml(dataRow)"></td>
</template>
</slot>
</tr>
<template
v-if="
localTotalValues !== undefined &&
Object.keys(localTotalValues).length > 0 &&
tableData.length > 0
">
<tr>
<td :colspan="totalValuesSpanLength" class="table-cell-align-right">
<strong>TOPLAM:</strong>
</td>
<template v-for="(val, i) in tableHeader">
<td v-if="localTotalValues[val.name] !== undefined">
{{
val.price
? globalStore.toTrLocale(localTotalValues[val.name])
: localTotalValues[val.name]
}}
</td>
</template>
</tr>
</template>
</tbody>
</table>
</div>
<data-table-pagination
v-if="pagination !== undefined && showPagination && !isPreview"
v-model:pagination="localPagination" />
</template>
<script setup lang="ts">
import { ref, reactive, computed, watch } from 'vue'
import type { Ref } from 'vue'
import { useGlobalStore } from '@/stores/globalStore'
const globalStore = useGlobalStore()
interface ITableHead {
[key: string]: any
title: string
name: string
compute?: Function
sort?: boolean
computeHtml?: Function
}
interface IPagination {
[key: string]: any
pageNumber?: number
pageSize: number
totalRecords: number
}
interface ISort {
[key: string]: any
sortColumn?: string
sortOrder?: string
}
export interface Props {
tableHeader: ITableHead[]
tableData: Record<string, any>
rowAction?: Function | string
pagination?: IPagination
sortData?: ISort
rowNumber?: boolean
totalValues?: Record<string, any>
isPreview?: boolean
}
const props = withDefaults(defineProps<Props>(), {
tableData: () => [],
rowNumber: false,
isPreview: false
})
const emit = defineEmits(['update:sortData', 'update:pagination'])
const localSort: Ref<ISort> = ref(props.sortData as ISort)
const localPagination: Ref<IPagination> = ref(props.pagination as IPagination)
const localTotalValues = reactive<Record<string, any>>(
props.totalValues as Record<string, any>
)
const totalValuesSpanLength = ref<number>(0)
if (localTotalValues !== undefined) {
let totalValuesLength = Object.keys(localTotalValues).length
let headerLength: number =
props.rowNumber !== undefined
? props.tableHeader.length + 1
: props.tableHeader.length
totalValuesSpanLength.value = headerLength - totalValuesLength
}
const showPagination = computed<boolean>(() => {
if (props.pagination !== undefined) {
if (Math.ceil(localPagination.value.totalRecords / globalStore.perPage) > 1)
return true
else return false
} else {
return false
}
})
const LocalRowAction = (d: Record<string, any>) => {
if (props.rowAction !== undefined) {
(props.rowAction! as Function)(d)
}
}
const SortColumn = (d: Record<string, any>) => {
if (d.sort && props.tableData.length > 1) {
let order = ''
if (localSort.value.sortColumn === d.name) {
if (localSort.value.sortOrder === '') order = 'desc'
if (localSort.value.sortOrder === 'desc') order = 'asc'
if (localSort.value.sortOrder === 'asc') {
order = ''
delete localSort.value.sortColumn
}
localSort.value.sortOrder = order
} else {
localSort.value.sortColumn = d.name
localSort.value.sortOrder = 'desc'
}
emit('update:sortData', localSort.value)
}
}
const CellData = (d: Record<string, any>, key: string): any => {
if (d[key] === null) return d
else return d[key]
}
watch(
() => localPagination,
() => {
emit('update:pagination', localPagination.value)
},
{ deep: true }
)
</script>

View File

@ -0,0 +1,88 @@
<template>
<div class="list-paging-wrapper">
<div class="pagination-content">
<icon-button
classList="pagination-nav pagination-nav-prev"
@click="changePage('<')"
icon="arrow" />
<div class="pagination-input">
<input
type="text"
class="pagination-current-page"
:value="pageNumber"
@keydown="validationStore.allowNumbersWithKeys"
@keyup="InputPageControl($event)"
@focus="PageNumberFocus($event)"
min="1"
:max="totalPage()" />
</div>
<div class="pagination-total-page">
/
<span>{{ totalPage() }}</span>
</div>
<div class="button-c" @click="getPage">Git</div>
<icon-button
classList="pagination-nav pagination-nav-next"
@click="changePage('>')"
icon="arrow" />
</div>
</div>
</template>
<script setup lang="ts">
import { ref, computed } from 'vue'
import type { Ref } from 'vue'
import { useGlobalStore } from '@/stores/globalStore'
import { useValidationStore } from '@/stores/validationStore'
const globalStore = useGlobalStore()
const validationStore = useValidationStore()
interface IPagination {
pageNumber: number
pageSize: number
totalRecords: number
}
export interface Props {
pagination: IPagination
}
const props = withDefaults(defineProps<Props>(), {
})
const emit = defineEmits(['update:pagination'])
const localPagination: Ref<IPagination> = ref(props.pagination)
const pageNumber: Ref<number> = ref(1)
const totalPage = (): number => {
return Math.ceil(localPagination.value.totalRecords / globalStore.perPage)
}
const changePage = (v: string) => {
if (v === '<') {
if (Number(pageNumber.value) > 1) pageNumber.value--
} else {
if (Number(pageNumber.value) < totalPage()) pageNumber.value++
}
localPagination.value.pageNumber = pageNumber.value
emit('update:pagination', localPagination.value)
}
const InputPageControl = (e: Event) => {
if (Number((e.target as HTMLInputElement).value) < 1)
(e.target as HTMLInputElement).value = '1'
if (Number((e.target as HTMLInputElement).value) > totalPage())
(e.target as HTMLInputElement).value = String(totalPage())
pageNumber.value = Number((e.target as HTMLInputElement).value)
if((e as KeyboardEvent).key === 'Enter') getPage()
}
const PageNumberFocus = (e: Event) => {
;(e.target as HTMLInputElement).select()
}
const getPage = () => {
localPagination.value.pageNumber = pageNumber.value
emit('update:pagination', localPagination.value)
}
</script>

View File

@ -0,0 +1,136 @@
<template>
<teleport to="body">
<div class="dialog-w">
<span class="dialog-close" @click="CloseDialog"></span>
<div class="dialog-c">
<div
class="dialog-header"
v-if="localData.title !== undefined && localData.title !== ''">
<h3>{{ localData.title }}</h3>
</div>
<div
class="dialog-content"
v-if="localData.content !== undefined && localData.content !== ''">
{{ localData.content }}
</div>
<div class="dialog-footer">
<template
v-if="localData.buttons !== undefined && localData.buttons.length > 0"
v-for="(button, i) in dialogData.buttons">
<button
:class="['button-c', 'button-' + button.type]"
@click="button.function(id, button.data)">
{{ button.label }}
</button>
</template>
<button
v-if="localData.showClose"
class="button-c button-cancel"
@click="localData.closeFunction">
{{ localData.closeText }}
</button>
</div>
</div>
<div class="dialog-shadow" @click="CloseDialog"></div>
</div>
</teleport>
</template>
<script setup lang="ts">
import { onBeforeMount, reactive } from 'vue'
import { useDialogStore } from './dialogStore'
const dialogStore = useDialogStore()
export interface Props {
id: number
dialogData: Record<string, any>
}
const props = withDefaults(defineProps<Props>(), {})
const localData = reactive({
title: '',
content: '',
showClose: true,
closeText: 'Kapat',
closeFunction: () => {
CloseDialog()
},
buttons: []
})
const CreateData = () => {
Object.assign(localData, props.dialogData)
}
const CloseDialog = () => {
delete dialogStore.dialogs[props.id]
}
onBeforeMount(() => {
CreateData()
})
</script>
<style scoped>
.dialog-w {
display: flex;
justify-content: center;
align-items: center;
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: 9999;
}
.dialog-shadow {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: rgba(0, 0, 0, 0.5);
z-index: 1;
}
.dialog-c {
display: flex;
flex-direction: column;
width: 90%;
max-width: 480px;
background-color: #fff;
border-radius: 8px;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
z-index: 9;
position: relative;
padding: 24px;
}
.dialog-header {
margin-bottom: 16px;
}
.dialog-content {
margin-bottom: 16px;
}
.dialog-footer {
display: flex;
}
.dialog-close {
display: flex;
justify-content: center;
align-items: center;
position: absolute;
top: 24px;
right: 24px;
z-index: 9;
cursor: pointer;
}
.dialog-close::before,
.dialog-close::after {
content: '';
flex-direction: block;
width: 32px;
height: 2px;
background-color: #fff;
position: absolute;
transform: rotate(45deg);
}
.dialog-close::after {
transform: rotate(-45deg);
}
</style>

View File

@ -0,0 +1,12 @@
<template>
<template v-if="Object.keys(dialogStore.dialogs).length > 0">
<template v-for="(dialog, i) in dialogStore.dialogs">
<dialog-item :id="dialog.id" :dialogData="dialog.data" />
</template>
</template>
</template>
<script setup lang="ts">
import DialogItem from './DialogItem.vue'
import { useDialogStore } from './dialogStore'
const dialogStore = useDialogStore()
</script>

View File

@ -0,0 +1,103 @@
<template>
<template v-if="!onlyPreview">
<div :class="['file-item']">
<div
class="file-item-title"
v-if="localData[title as string] !== undefined && localData[title as string] !== ''">
{{ localData[title as string] }}
</div>
<div class="file-item-file-c">
<a :href="localFilePath" target="_blank" class="file-item-file clickable">
<div :class="['file-item-preview form-item-picture small-picture']">
<div class="image-c" v-if="isPicture">
<img :src="localFilePath" />
</div>
<div v-else>{{ fileType.toLocaleUpperCase() }}</div>
</div>
<div class="file-item-name">
{{ fileName }}
</div>
</a>
<i
class="ico-c ico-section ico-section-header-btn ico-replace"
@click="OnClick"
v-if="editable">
<svg><use href="/src/assets/images/icons.svg#replace"></use></svg>
</i>
</div>
</div>
</template>
<template v-else>
<div class="form-item-picture only-image clickable">
<a :href="localFilePath" target="_blank">
<div class="image-c" v-if="isPicture">
<img :src="localFilePath" />
</div>
<div v-else>{{ fileType.toLocaleUpperCase() }}</div>
</a>
<i
class="ico-c ico-section ico-section-header-btn ico-replace"
@click="OnClick"
v-if="editable">
<svg><use href="/src/assets/images/icons.svg#replace"></use></svg>
</i>
</div>
</template>
</template>
<script setup lang="ts">
import { ref, reactive, watch } from 'vue'
import axios from 'axios'
import { useGlobalStore } from '@/stores/globalStore'
const globalStore = useGlobalStore()
export interface Props {
data: Record<string, any>
onlyPreview?: boolean
filePath: string | null | undefined
title?: string
editable?: boolean
usePath?: boolean
}
const props = withDefaults(defineProps<Props>(), {
onlyPreview: false,
editable: true,
usePath: false
})
const emit = defineEmits(['click'])
const localData = reactive<Record<string, any>>(props.data)
const localFilePath = ref<string>('')
const fileType = ref<string>('')
const fileName = ref<string>('')
const isPicture = ref<boolean>(true)
if (props.filePath !== undefined && props.filePath !== null) {
localFilePath.value = props.usePath
? props.filePath as string
: (axios.defaults.baseURL as string + props.filePath as string) as string
fileType.value = globalStore.FileType(localFilePath.value)
fileName.value = globalStore.FileName(localFilePath.value)
isPicture.value = globalStore.IsImage(localFilePath.value)
}
const OnClick = () => {
let d = {
fileType: fileType.value,
fileName: fileName.value
}
Object.assign(localData, d)
emit('click', localData)
}
watch(
() => props.filePath,
() => {
localFilePath.value = props.usePath
? props.filePath as string
: (axios.defaults.baseURL as string + props.filePath as string) as string
}
)
</script>

View File

@ -0,0 +1,125 @@
<template>
<slot name="input">
<template v-if="listData !== undefined">
<div :class="['form-item', half ? 'form-item-half' : '', elclass || '']">
<span class="form-item-title" v-if="title !== undefined && title !== ''">
{{ title }}
<i v-if="required" class="form-item-alert">*</i>
</span>
<label :class="['label-radio', disabled ? 'disabled' : '']" v-for="(item, i) in listData">
<input
type="checkbox"
v-model="localValue"
:value="item[listVal!]"
:disabled="disabled"
:checked="item[listVal!] === localValue"
@click="OnClick"
@change="OnChange($event)"
:class="[
invalidText !== undefined && invalidText !== '' ? 'invalid' : '',
iclass || ''
]" />
<slot name="radiotext" :itemData="item">
<slot :name="'checktext' + i">
<span>{{ item[listText!] }}</span>
</slot>
</slot>
</label>
</div>
</template>
<template v-else>
<label :class="['label-radio', disabled ? 'disabled' : '']">
<input
type="checkbox"
v-model="localValue"
:value="val"
:disabled="disabled"
@click="OnClick"
@change="OnChange"
:class="[
invalidText !== undefined && invalidText !== '' ? 'invalid' : '',
iclass || ''
]" />
<slot name="checktext">
<span>{{ label }}</span>
</slot>
</label>
</template>
<span
class="form-item-alert"
v-if="InvalidMessages.length > 0 && InvalidMessages !== ''">
{{ InvalidMessages }}
</span>
<span
class="form-item-description"
v-if="description !== undefined && description !== ''">
{{ description }}
</span>
</slot>
</template>
<script setup lang="ts">
import { ref, reactive, computed, watch } from 'vue'
interface CheckObj {
[key: string]: any
text: string
}
export interface Props {
listData?: CheckObj[]
listText?: string
listVal?: string
val?: number | string | boolean
label?: string
disabled?: boolean
modelValue: (string | number)[] | boolean | string | number | null
half?: boolean
title?: string
invalidText?: string
description?: string
required?: boolean
iclass?: string
elclass?: string
}
const props = withDefaults(defineProps<Props>(), {
disabled: false,
half: false,
required: false
})
const emit = defineEmits(['update:modelValue', 'change', 'click'])
const localValue = ref<(string | number)[] | boolean | null | string | number>(
props.modelValue
)
const InvalidMessageText = reactive<Record<string, any>>({})
const InvalidMessages = computed<string>(() => {
let text = ''
Object.keys(InvalidMessageText).forEach((k: string, i: number) => {
text += InvalidMessageText[k] + ', '
})
return text
})
const OnChange = (e: Event) => {
emit('update:modelValue', localValue.value)
emit('change', e)
}
const OnClick = (e: Event) => {
emit('click', e)
}
watch(
() => props.invalidText,
() => {
if (props.invalidText !== undefined && props.invalidText !== '') {
Object.assign(InvalidMessageText, {})
InvalidMessageText.invalid = props.invalidText
} else {
delete InvalidMessageText.invalid
}
}
)
</script>

View File

@ -0,0 +1,253 @@
<template>
<div :class="['form-item', half ? 'form-item-half' : '', elclass || '']">
<span class="form-item-title" v-if="title !== undefined && title !== ''">
{{ title }}
</span>
<slot name="input">
<label>
<span v-if="label !== undefined && label !== ''">
{{ label }}
<i v-if="required" class="form-item-alert">*</i>
</span>
<input
:value="localValue"
:type="type"
:placeholder="placeholder"
:disabled="disabled"
:min="localMin"
:max="localMax"
@click="OnClick"
@change="OnChange"
@focus="OnFocus"
@keydown="OnKeyDown"
@keyup="OnKeyUp"
:class="[
invalidText !== undefined && invalidText !== '' ? 'invalid' : '',
iclass || ''
]" />
<span
class="form-item-alert"
v-if="InvalidMessages.length > 0 && InvalidMessages !== ''">
{{ InvalidMessages }}
</span>
<span
class="form-item-description"
v-if="description !== undefined && description !== ''">
{{ description }}
</span>
</label>
</slot>
</div>
</template>
<script setup lang="ts">
import { ref, computed, watch, onBeforeMount } from 'vue'
import { useDateStore } from '@/stores/dateStore'
const dateStore = useDateStore()
export interface Props {
type?: string
label?: string
disabled?: boolean
modelValue: number | string | Date | null | undefined
half?: boolean
title?: string
invalidText?: string
description?: string
placeholder?: string
required?: boolean
iclass?: string
elclass?: string
modelKey?: string
min?: string | Date | null
max?: string | Date | null
}
const props = withDefaults(defineProps<Props>(), {
type: 'datetime-local',
disabled: false,
half: false,
required: false
})
const emit = defineEmits([
'update:modelValue',
'change',
'focus',
'click',
'keydown',
'keyup'
])
const localValue = ref<any>()
const localMin = ref<string>()
const localMax = ref<string>()
const SetMin = () => {
if (props.min !== undefined && props.min !== null) {
if (props.type === 'datetime-local') {
let dmin = new Date(props.min)
dmin.setHours(0, 0, 0, 0)
localMin.value = dateStore.dateFormat({
date: dmin,
pattern: 'yy-mm-dd-t',
splitTime: 'T',
splitDate: '-'
})
} else {
localMin.value = dateStore.dateFormat({
date: props.min,
pattern: 'yy-mm-dd',
splitDate: '-'
})
}
}
}
const SetMax = () => {
if (props.max !== undefined && props.max !== null) {
if (props.type === 'datetime-local') {
let dmax = new Date(props.max)
dmax.setHours(0, 0, 0, 0)
localMax.value = dateStore.dateFormat({
date: props.max,
pattern: 'yy-mm-dd-t',
splitTime: 'T',
splitDate: '-'
})
} else {
localMax.value = dateStore.dateFormat({
date: props.max,
pattern: 'yy-mm-dd',
splitDate: '-'
})
}
}
}
if (props.type === 'date') {
if (props.modelValue !== undefined && props.modelValue !== null) {
if ((props.modelValue as string).includes('T')) {
localValue.value = (props.modelValue as string).split('T')[0]
} else {
localValue.value = props.modelValue
}
}
} else {
localValue.value = props.modelValue
}
const InvalidMessageText = ref<Record<string,any>>({})
const InvalidMessages = computed<string>(() => {
let text = ''
Object.keys(InvalidMessageText.value).forEach((k: string, i: number) => {
text += InvalidMessageText.value[k] + ', '
})
return text
})
const OnChange = (e: Event) => {
let val = (e.target as HTMLInputElement).value
if (val !== undefined && val !== '') {
if (localMin.value !== undefined) {
if (val < localMin.value) {
let min: string
if (props.type === 'datetime-local') {
min = dateStore.dateFormat({
date: localMin.value,
pattern: 'dd-mm-yy-t'
})
} else {
min = dateStore.dateFormat({
date: localMin.value,
pattern: 'dd-mm-yy'
})
}
InvalidMessageText.value[
props.modelKey + 'Min'
] = `Girdiğiniz tarih ${min} tarihinden büyük olmalıdır.`
} else {
delete InvalidMessageText.value[props.modelKey + 'Min']
}
}
if (localMax.value !== undefined) {
if (val > localMax.value) {
let max: string
if (props.type === 'datetime-local') {
max = dateStore.dateFormat({
date: localMax.value,
pattern: 'dd-mm-yy-t'
})
} else {
max = dateStore.dateFormat({
date: localMax.value,
pattern: 'dd-mm-yy'
})
}
InvalidMessageText.value[
props.modelKey + 'Max'
] = `Girdiğiniz tarih ${max} tarihinden küçük olmalıdır.`
} else {
delete InvalidMessageText.value[props.modelKey + 'Max']
}
}
}
localValue.value = (e.target as HTMLInputElement).value
emit('update:modelValue', localValue.value)
emit('change', e)
}
const OnFocus = (e: Event) => {
emit('focus', e)
}
const OnClick = (e: Event) => {
emit('click', e)
}
const OnKeyDown = (e: Event) => {
localValue.value = (e.target as HTMLInputElement).value
emit('update:modelValue', localValue.value)
emit('keydown', e)
}
const OnKeyUp = (e: Event) => {
localValue.value = (e.target as HTMLInputElement).value
if (props.required) {
if (localValue.value !== undefined && localValue.value.length < 1) {
InvalidMessageText.value[props.modelKey + 'Empty'] = 'Bu alan boş bırakılamaz'
} else {
delete InvalidMessageText.value[props.modelKey + 'Empty']
}
}
emit('update:modelValue', localValue.value)
emit('keyup', e)
}
watch(
() => props.invalidText,
() => {
if (props.invalidText !== undefined && props.invalidText !== '') {
InvalidMessageText.value = {}
InvalidMessageText.value.invalid = props.invalidText
} else {
delete InvalidMessageText.value.invalid
}
}
)
watch(
() => props.min,
() => {
if (props.min !== undefined && props.min !== '') {
SetMin()
}
}
)
watch(
() => props.max,
() => {
if (props.max !== undefined && props.max !== '') {
SetMax()
}
}
)
onBeforeMount(() => {
SetMin()
SetMax()
})
</script>

View File

@ -0,0 +1,153 @@
<template>
<div :class="['form-item', half ? 'form-item-half' : '', elclass || '']">
<span class="form-item-title" v-if="title !== undefined && title !== ''">
{{ title }}
</span>
<slot name="input">
<label>
<span v-if="label !== undefined && label !== ''">
{{ label }}
<i v-if="required" class="form-item-alert">*</i>
</span>
<input
:value="modelValue"
:type="type"
:placeholder="placeholder"
:disabled="disabled"
@input="OnInput"
@click="OnClick"
@change="OnChange"
@focus="OnFocus"
@keydown="OnKeyDown"
@keyup="OnKeyUp"
:class="[
invalidText !== undefined && invalidText !== '' ? 'invalid' : '',
iclass || ''
]"
:min="min"
:max="max"
:minlength="minlength"
:maxlength="maxlength" />
<span
class="form-item-alert"
v-if="InvalidMessages.length > 0 && InvalidMessages !== ''">
{{ InvalidMessages }}
</span>
<span
class="form-item-description"
v-if="description !== undefined && description !== ''">
{{ description }}
</span>
</label>
</slot>
</div>
</template>
<script setup lang="ts">
import { ref, reactive, computed, watch } from 'vue'
import { useValidationStore } from '@/stores/validationStore'
const validationStore = useValidationStore()
export interface Props {
type?: string
label?: string
disabled?: boolean
modelValue: number | string | null | undefined
half?: boolean
title?: string
invalidText?: string
description?: string
placeholder?: string
required?: boolean
min?: string | number
max?: string | number
maxlength?: string | number
minlength?: string | number
iclass?: string
elclass?: string
modelKey?: string
}
const props = withDefaults(defineProps<Props>(), {
type: 'text',
disabled: false,
half: false,
required: false
})
const emit = defineEmits([
'update:modelValue',
'change',
'input',
'focus',
'click',
'keydown',
'keyup'
])
const localValue = ref<any>()
const InvalidMessageText = reactive<Record<string, any>>({})
const InvalidMessages = computed<string>(() => {
let text = ''
Object.keys(InvalidMessageText).forEach((k: string, i: number) => {
text += InvalidMessageText[k] + ', '
})
return text
})
const OnChange = (e: Event) => {
emit('update:modelValue', (e.target as HTMLInputElement).value)
emit('change', e)
}
const OnInput = (e: Event) => {
emit('update:modelValue', (e.target as HTMLInputElement).value)
emit('input', e)
}
const OnFocus = (e: Event) => {
emit('focus', e)
}
const OnClick = (e: Event) => {
emit('click', e)
}
const OnKeyDown = (e: Event) => {
emit('update:modelValue', (e.target as HTMLInputElement).value)
emit('keydown', e)
}
const OnKeyUp = (e: Event) => {
if (props.minlength !== undefined) {
if ((e.target as HTMLInputElement).value.length < Number(props.minlength)) {
InvalidMessageText.minlength = `Girdiğiniz bilgi en az ${props.minlength} karakter uzunluğunda olmalı`
} else {
delete InvalidMessageText.minlength
}
}
if (props.required) {
if ((e.target as HTMLInputElement).value.length < 1) {
InvalidMessageText[props.modelKey + 'Empty'] = 'Bu alan boş bırakılamaz'
} else {
delete InvalidMessageText[props.modelKey + 'Empty']
}
}
if (props.type === 'email') {
if (!validationStore.checkEmail((e.target as HTMLInputElement).value))
InvalidMessageText.validmail =
'Lütfen e-postayı doğru formatta giriniz. Örn: isim@alanadi.td'
else delete InvalidMessageText.validmail
}
emit('update:modelValue', (e.target as HTMLInputElement).value)
emit('keyup', e)
}
watch(
() => props.invalidText,
() => {
if (props.invalidText !== undefined && props.invalidText !== '') {
Object.assign(InvalidMessageText, {})
InvalidMessageText.invalid = props.invalidText
} else {
delete InvalidMessageText.invalid
}
}
)
</script>

View File

@ -0,0 +1,210 @@
<template>
<div :class="['form-item', half ? 'form-item-half' : '', elclass || '']">
<span class="form-item-title" v-if="title !== undefined && title !== ''">
{{ title }}
</span>
<slot name="input">
<label>
<span v-if="label !== undefined && label !== ''">
{{ label }}
<i v-if="required" class="form-item-alert">*</i>
</span>
<div :ref="'quillContainer' + rnd"></div>
<span
class="form-item-alert"
v-if="InvalidMessages.length > 0 && InvalidMessages !== ''">
{{ InvalidMessages }}
</span>
<span
class="form-item-description"
v-if="description !== undefined && description !== ''">
{{ description }}
</span>
</label>
</slot>
</div>
</template>
<script setup lang="ts">
import { ref, reactive, computed, onMounted, useTemplateRef, watch } from 'vue'
import Quill from 'quill'
import 'quill/dist/quill.snow.css'
declare const window: any
window.Quill = Quill
export interface Props {
label?: string
disabled?: boolean
modelValue: string
half?: boolean
title?: string
invalidText?: string
description?: string
placeholder?: string
required?: boolean
maxlength?: string
minlength?: string
iclass?: string
elclass?: string
modelKey?: string
}
const props = withDefaults(defineProps<Props>(), {
disabled: false,
half: false,
required: false,
placeholder: ''
})
const emit = defineEmits(['update:modelValue', 'change', 'text-change'])
const rnd = ref<number>(Number(Math.random() * 10000000))
const toolbar = ref<any[]>([
[{ font: [] }, { size: [] }],
['bold', 'italic', 'underline', 'strike'],
[{ color: [] }, { background: [] }],
[{ script: 'super' }, { script: 'sub' }],
[{ header: '1' }, { header: '2' }, 'blockquote'],
[{ list: 'ordered' }, { list: 'bullet' }, { indent: '-1' }, { indent: '+1' }],
[{ align: [] }],
['link', 'image', 'video'],
['clean']
])
const options = reactive<Record<string, any>>({
theme: 'snow',
modules: {
toolbar: toolbar.value,
imageResize: {
modules: ['Resize', 'DisplaySize', 'Toolbar']
}
},
placeholder: props.placeholder,
readOnly: false,
debug: false
})
const QuillImageResize = ref<any>()
const editor = useTemplateRef<any>('quillContainer' + rnd.value)
const quill = ref<Quill | null>(null)
const localValue = ref<string>(props.modelValue)
const InvalidMessageText = ref<Record<string, any>>({})
const InvalidMessages = computed(() => {
let text = ''
Object.keys(InvalidMessageText.value).forEach((k: string, i: number) => {
text += InvalidMessageText.value[k] + ', '
})
return text
})
const OnTextChange = (e: any) => {
if (props.minlength !== undefined) {
if (localValue.value.length < Number(props.minlength)) {
InvalidMessageText.value.minlength = `Girdiğiniz bilgi en az ${props.minlength} karakter uzunluğunda olmalı`
} else {
delete InvalidMessageText.value.minlength
}
}
if (quill.value !== null) {
localValue.value = quill.value!.container.querySelector('.ql-editor')!.innerHTML
}
emit('update:modelValue', localValue.value)
emit('change', e)
}
const InitializeEditor = async () => {
await setupQuillEditor()
SetContent()
RegisterEditorEventListeners()
}
const SetContent = () => {
if (props.modelValue) quill.value!.root.innerHTML = props.modelValue
}
const setupQuillEditor = async () => {
//let Parchment = Quill.import('parchment')
window.Quill.imports.parchment.Attributor.Style =
window.Quill.imports.parchment.StyleAttributor
//@ts-ignore
QuillImageResize.value = await import('quill-image-resize-module')
quill.value = new Quill(editor.value, options) as Quill
;(quill.value!.getModule('toolbar') as Record<
string,
any
>)!.container.addEventListener('mousedown', (e: Event) => {
e.preventDefault()
})
;(quill.value!.getModule('toolbar') as Record<
string,
any
>)!.container.addEventListener('click', (e: Event) => {
if ((e.target as HTMLElement).className !== 'ql-image') e.preventDefault()
})
}
const RegisterEditorEventListeners = () => {
quill.value!.on('text-change', OnTextChange)
quill.value!.on('editor-change', OnTextChange)
//image resize imaja tıklandığını anlamıyor.
quill.value!.root.addEventListener('mouseover', OnMouseOver, false)
ListenForEditorEvent('text-change')
}
const ListenForEditorEvent = (type: any) => {
quill.value!.on(type, (...args) => {
emit(type, ...args)
})
}
const OnMouseOver = (e: Event) => {
if (
(e.target as HTMLElement)!.firstChild &&
((e.target as HTMLElement)!.firstChild as HTMLElement)!.tagName &&
((e.target as HTMLElement)!.firstChild as HTMLElement)!.tagName.toUpperCase() ===
'IMG'
) {
;(e.target as HTMLElement)!.classList.add('remove-click-p')
;((e.target as HTMLElement)!.firstChild as HTMLElement)!.classList.add(
'add-click-img'
)
}
}
onMounted(async () => {
InitializeEditor()
})
watch(
() => props.invalidText,
() => {
if (props.invalidText !== undefined && props.invalidText !== '') {
InvalidMessageText.value.invalid = props.invalidText
} else {
delete InvalidMessageText.value.invalid
}
}
)
</script>
<style>
.ql-toolbar {
width: 100%;
}
.ql-container {
width: 100%;
min-height: 120px;
}
.remove-click-p {
pointer-events: none;
}
.add-click-img {
pointer-events: all;
}
</style>

View File

@ -0,0 +1,128 @@
<template>
<slot name="input">
<template v-if="listData !== undefined">
<div :class="['form-item', half ? 'form-item-half' : '', elclass || '']">
<span class="form-item-title" v-if="title !== undefined && title !== ''">
{{ title }}
<i v-if="required" class="form-item-alert">*</i>
</span>
<label
:class="['label-radio', disabled ? 'disabled' : '']"
v-for="(item, i) in listData">
<input
type="radio"
:name="'radio' + rnd"
v-model="localValue"
:value="item[listVal!]"
:disabled="disabled"
@click="OnClick"
@change="OnChange"
:class="[
invalidText !== undefined && invalidText !== '' ? 'invalid' : '',
iclass || ''
]" />
<slot name="radiotext" :itemData="item">
<slot :name="'radiotext' + i">
<span>{{ item[listText!] }}</span>
</slot>
</slot>
</label>
</div>
</template>
<template v-else>
<label :class="['label-radio', disabled ? 'disabled' : '']">
<input
type="radio"
:name="group"
v-model="localValue"
:value="val"
:disabled="disabled"
@click="OnClick"
@change="OnChange"
:class="[
invalidText !== undefined && invalidText !== '' ? 'invalid' : '',
iclass || ''
]" />
<slot name="radiotext">
<span>{{ label }}</span>
</slot>
</label>
</template>
<span
class="form-item-alert"
v-if="InvalidMessages.length > 0 && InvalidMessages !== ''">
{{ InvalidMessages }}
</span>
<span
class="form-item-description"
v-if="description !== undefined && description !== ''">
{{ description }}
</span>
</slot>
</template>
<script setup lang="ts">
import { ref, reactive, computed, watch } from 'vue'
interface RadioObj {
[key: string]: any
text: string
}
export interface Props {
listData?: RadioObj[]
listText?: string
listVal?: string
val?: number | string | boolean
group?: string
label?: string
disabled?: boolean
modelValue: string | number | boolean | null
half?: boolean
title?: string
invalidText?: string
description?: string
required?: boolean
iclass?: string
elclass?: string
}
const props = withDefaults(defineProps<Props>(), {
disabled: false,
half: false,
required: false
})
const emit = defineEmits(['update:modelValue', 'change', 'click'])
const localValue = ref<string | number | boolean | null>(props.modelValue)
const rnd = ref<number>(Number(Math.floor(Math.random() * 1000000000)))
const InvalidMessageText = reactive<Record<string, any>>({})
const InvalidMessages = computed<string>(() => {
let text = ''
Object.keys(InvalidMessageText).forEach((k: string, i: number) => {
text += InvalidMessageText[k] + ', '
})
return text
})
const OnChange = (e: Event) => {
emit('update:modelValue', localValue.value)
emit('change', e)
}
const OnClick = (e: Event) => {
emit('click', e)
}
watch(
() => props.invalidText,
() => {
if (props.invalidText !== undefined && props.invalidText !== '') {
Object.assign(InvalidMessageText, {})
InvalidMessageText.invalid = props.invalidText
} else {
delete InvalidMessageText.invalid
}
}
)
</script>

View File

@ -0,0 +1,393 @@
<template>
<div
:class="[
'form-item',
half ? 'form-item-half' : '',
elclass || '',
$slots.button ? 'form-item-wb' : ''
]"
:id="'formselect' + rnd">
<span class="form-item-title" v-if="title !== undefined && title !== ''">
{{ title }}
</span>
<slot name="input">
<label class="form-select-list-c">
<span v-if="label !== undefined && label !== ''">
{{ label }}
<i v-if="required" class="form-item-alert">*</i>
</span>
<div
tabindex="0"
:class="[
'form-select-activator',
invalidText !== undefined && invalidText !== '' ? 'invalid' : '',
iclass || '',
disabled ? 'disabled' : '',
disabledClass || ''
]"
v-if="!activated"
@click="OpenList">
<slot name="activator" :activatorData="selectedOption">
{{ activatorText }}
</slot>
<i
class="ico-c ico-close"
v-if="
clearable &&
localValue !== '' &&
localValue !== undefined &&
localValue !== null
"
@click="ClearSelection($event)">
<svg><use href="/src/assets/images/icons.svg#close"></use></svg>
</i>
<i class="ico-c">
<svg><use href="/src/assets/images/icons.svg#arrow"></use></svg>
</i>
</div>
<div class="form-select-input" v-if="activated">
<form-input v-model="q" placeholder="Listede arayın" />
</div>
<teleport to="body" v-if="activated">
<div class="form-select-list" :id="'selectlist' + rnd">
<i
class="ico-c ico-close select-close-selection"
@click="CloseListFromSelection">
<svg><use href="/src/assets/images/icons.svg#close"></use></svg>
</i>
<div class="form-select-list-item" v-if="selectList.length === 0">
<span>Sonuç Bulunamadı</span>
</div>
<template v-else>
<div
class="form-select-list-item"
v-if="multiple"
@click="MultipleSelectAll($event)">
<input
class="select-box-check"
type="checkbox"
v-model="multipleAllSelected" />
<span>{{ multipleText }}</span>
</div>
<template v-for="(item, i) in selectList">
<div
v-if="localView(item)"
:class="['form-select-list-item', isSelected(item) ? 'selected' : '']"
@click="updateVal($event, item)">
<input
v-if="multiple"
class="select-box-check"
type="checkbox"
:value="listVal !== undefined ? item[listVal] : item"
v-model="localValue" />
<slot name="option" :optionData="item">
<span>{{ listText !== undefined ? item[listText] : item }}</span>
</slot>
</div>
</template>
</template>
</div>
</teleport>
<span
class="form-item-alert"
v-if="InvalidMessages.length > 0 && InvalidMessages !== ''">
{{ InvalidMessages }}
</span>
<span
class="form-item-description"
v-if="description !== undefined && description !== ''">
{{ description }}
</span>
</label>
<div v-if="$slots.button" class="form-item-button"><slot name="button"></slot></div>
</slot>
</div>
</template>
<script setup lang="ts">
import { ref, reactive, computed, onMounted, watch } from 'vue'
import { useGlobalStore } from '@/stores/globalStore'
const globalStore = useGlobalStore()
export interface Props {
listData: Record<string, any>[]
listText?: string
listVal?: string
label?: string
disabled?: boolean
modelValue: string | number | number[] | string[] | null
half?: boolean
title?: string
invalidText?: string
description?: string
placeholder?: string
required?: boolean
iclass?: string
elclass?: string
clearable?: boolean
extraData?: any
multiple?: boolean
multipleText?: string
view?: Function
disabledClass?: string
}
const props = withDefaults(defineProps<Props>(), {
listData: () => [],
disabled: false,
half: false,
required: false,
clearable: false,
extraData: '',
multiple: false,
multipleText: 'Tümü'
})
const emit = defineEmits(['update:modelValue', 'change','clear'])
const activated = ref<Boolean>(false)
const multipleAllSelected = ref<boolean>(false)
const q = ref<string>('')
const rnd = ref<number>(Number(Math.floor(Math.random() * 1000000000)))
const localValue = ref<string | number | boolean | null | string[]>()
const selectedOption = ref<Record<string, any>>({})
if (props.multiple) {
if (props.modelValue === null || props.modelValue === undefined) {
localValue.value = [] as string[]
} else {
localValue.value = props.modelValue as string[]
}
} else {
localValue.value = props.modelValue as string
}
const localView = (data: Record<string, any>) => {
if (props.view !== undefined) {
if (props.extraData !== undefined) return props.view(data, props.extraData)
else return props.view(data, props)
} else {
return true
}
}
const localExtra = ref<any>(props.extraData)
const InvalidMessageText = reactive<Record<string, any>>({})
const InvalidMessages = computed<string>(() => {
let text = ''
Object.keys(InvalidMessageText).forEach((k: string, i: number) => {
text += InvalidMessageText[k] + ', '
})
return text
})
const activatorText = computed<any>(() => {
if (
localValue.value === '' ||
localValue.value === null ||
localValue.value === undefined
) {
return props.placeholder || 'Lütfen Seçim Yapınız'
} else {
if (props.multiple) {
if (multipleAllSelected.value) {
return props.multipleText
} else {
let textm = props.listData.filter((v: Record<string, any>) => {
let val = props.listVal !== undefined ? v[props.listVal] : v
return (localValue.value as string[]).includes(val)
})
if (textm !== undefined) {
if (props.listVal !== undefined) {
let listText = ''
textm.forEach((itm: Record<string, any>) => {
listText += itm[props.listText as string] + ', '
})
return listText.slice(0, -2)
} else {
return textm.toString()
}
} else {
return 'Lütfen Seçim Yapınız'
}
}
} else {
let text = props.listData.filter((v: Record<string, any>) => {
let val = props.listVal !== undefined ? v[props.listVal] : v
return localValue.value === val
})[0]
return text !== undefined
? props.listText !== undefined
? text[props.listText]
: text
: 'Lütfen Seçim Yapınız'
}
}
})
const selectList = computed<Record<string, any>[]>(() => {
if (q.value.length > 1) {
return props.listData.filter((v: Record<string, any>) => {
let val = props.listText !== undefined ? v[props.listText] : v
return globalStore.trToUpper(val).includes(globalStore.trToUpper(q.value))
})
} else {
return props.listData
}
})
const isSelected = (d: Record<string, any>): boolean => {
if (localValue.value !== null && localValue.value !== undefined) {
let val = props.listVal !== undefined ? d[props.listVal] : d
return props.multiple
? (localValue.value as string[]).includes(val)
: val === localValue.value
} else {
return false
}
}
const MultipleSelectAll = (e: Event) => {
if (props.multiple) {
if (multipleAllSelected.value) {
localValue.value = []
multipleAllSelected.value = false
} else {
props.listData.forEach((data: any, i: number) => {
if (props.listVal !== undefined)
(localValue.value as string[]).push(data[props.listVal])
else (localValue.value as string[]).push(data)
})
multipleAllSelected.value = true
}
let item: Record<string, any> = {}
emit('update:modelValue', localValue.value as string[])
emit('change', e, localValue.value, item, localExtra.value)
}
}
const ClearSelection = (e: Event) => {
e.stopPropagation()
if (typeof localValue.value === 'number') localValue.value = null
if (typeof localValue.value === 'string') localValue.value = ''
if (typeof localValue.value === 'boolean') localValue.value = false
let item: Record<string, any> = {}
selectedOption.value = {}
emit('update:modelValue', localValue.value)
emit('change', e, localValue.value, item, localExtra.value)
emit('clear', e, localValue.value)
}
const CloseListFromSelection = () => {
activated.value = false
document.removeEventListener('click', closeList)
}
const closeList = (e: Event) => {
let p = e.composedPath && e.composedPath()
var open = false
if (p) {
p.pop()
p.forEach((pv) => {
if (
(pv as HTMLElement).id !== '' &&
(pv as HTMLElement).id !== undefined &&
(pv as HTMLElement).id.includes(String(rnd.value))
)
open = true
})
}
if (!open) {
activated.value = false
document.removeEventListener('click', closeList)
}
}
const OpenList = (e: Event) => {
if (props.disabled) return
e.stopPropagation()
q.value = ''
activated.value = true
setTimeout(() => {
let actEl = document.querySelector('#formselect' + rnd.value) as HTMLElement
let el = document.querySelector('#selectlist' + rnd.value) as HTMLElement
let rcAct = actEl.getBoundingClientRect() as DOMRect
el.style.width = rcAct.width - 8 + 'px'
el.style.left = rcAct.left + 4 + 'px'
if (window.innerHeight - rcAct.bottom < 100) {
el.style.bottom = window.innerHeight - rcAct.top - 24 + 'px'
el.style.maxHeight = rcAct.top - 64 + 'px'
} else {
el.style.top = rcAct.bottom + 'px'
el.style.maxHeight = window.innerHeight - rcAct.bottom - 16 + 'px'
}
}, 5)
setTimeout(() => {
document.addEventListener('click', closeList)
}, 10)
}
const updateVal = (e: Event, item: Record<string, any>) => {
e.stopPropagation()
let val = props.listVal !== undefined ? item[props.listVal] : item
if (props.multiple) {
if ((localValue.value as string[]).indexOf(val) > -1)
(localValue.value as string[]).splice(
(localValue.value as string[]).indexOf(val),
1
)
else (localValue.value as string[]).push(val)
multipleAllSelected.value =
(localValue.value as string[]).length === props.listData.length
} else {
localValue.value = val
activated.value = false
document.removeEventListener('click', closeList)
}
selectedOption.value = item
emit('update:modelValue', localValue.value)
emit('change', e, localValue.value, item, localExtra.value)
}
const SetSelectedOption = () => {
selectedOption.value = props.listData.filter((v: Record<string, any>) => {
return v[props.listVal as string] === props.modelValue
})[0]
}
onMounted(() => {
if (props.multiple) {
multipleAllSelected.value =
(localValue.value as string[]).length === props.listData.length
}
SetSelectedOption()
})
watch(
() => props.invalidText,
() => {
if (props.invalidText !== undefined && props.invalidText !== '') {
Object.assign(InvalidMessageText, {})
InvalidMessageText.invalid = props.invalidText
} else {
delete InvalidMessageText.invalid
}
}
)
watch(
() => props.listData,
() => {
if (props.modelValue !== undefined) {
if (props.listData !== undefined) {
SetSelectedOption()
}
}
}
)
</script>

View File

@ -0,0 +1,185 @@
<template>
<div :class="['form-item', half ? 'form-item-half' : '', elclass || '']">
<span class="form-item-title" v-if="title !== undefined && title !== ''">
{{ title }}
</span>
<slot name="input">
<span v-if="label !== undefined && label !== ''" class="summer-label">
{{ label }}
<i v-if="required" class="form-item-alert">*</i>
</span>
<div :ref="'summerContainer' + rnd" class="summer-editor"></div>
<span
class="form-item-alert"
v-if="InvalidMessages.length > 0 && InvalidMessages !== ''">
{{ InvalidMessages }}
</span>
<span
class="form-item-description"
v-if="description !== undefined && description !== ''">
{{ description }}
</span>
</slot>
</div>
</template>
<script setup lang="ts">
import {
ref,
reactive,
computed,
onMounted,
useTemplateRef,
watch,
onBeforeUnmount
} from 'vue'
import $ from 'jquery'
import 'summernote/dist/summernote-lite.min.css'
import 'summernote/dist/summernote-lite.min.js'
//import SummernoteEditor from 'vue3-summernote-editor'
export interface Props {
label?: string
disabled?: boolean
modelValue: string
half?: boolean
title?: string
invalidText?: string
description?: string
placeholder?: string
required?: boolean
maxlength?: string
minlength?: string
iclass?: string
elclass?: string
modelKey?: string
}
const props = withDefaults(defineProps<Props>(), {
disabled: false,
half: false,
required: false,
placeholder: ''
})
const emit = defineEmits(['update:modelValue', 'change', 'text-change'])
const rnd = ref<number>(Number(Math.random() * 10000000))
const editorElement = useTemplateRef<any>('summerContainer' + rnd.value)
const editor = ref<any>(null)
const localValue = ref<string>(props.modelValue)
const InvalidMessageText = ref<Record<string, any>>({})
const InvalidMessages = computed(() => {
let text = ''
Object.keys(InvalidMessageText.value).forEach((k: string, i: number) => {
text += InvalidMessageText.value[k] + ', '
})
return text
})
const SetupEditor = async () => {
await InitializeEditor()
SetContent()
}
const InitializeEditor = async () => {
if (editorElement.value) {
editor.value = $(editorElement.value).summernote({
height: 300,
codeviewFilter: false,
codeviewIframeFilter: false,
toolbar: [
['style', ['style']],
[
'font',
[
'bold',
'italic',
'underline',
'strikethrough',
'superscript',
'subscript',
'clear'
]
],
['fontname', ['fontname']],
['color', ['color']],
['para', ['ul', 'ol', 'paragraph']],
['height', ['height']],
['table', ['table']],
['insert', ['link', 'picture', 'video']],
['view', ['fullscreen', 'codeview', 'undo', 'redo', 'help']]
],
callbacks: {
onChange: (content: any, e: any) => {
localValue.value = content
OnTextChange()
emit('update:modelValue', localValue.value)
emit('change', e)
},
onInit: () => {}
}
})
}
}
const SetContent = () => {
if (props.modelValue) $(editorElement.value).summernote('code', props.modelValue)
}
const OnTextChange = () => {
if (props.minlength !== undefined) {
if (localValue.value.length < Number(props.minlength)) {
InvalidMessageText.value.minlength = `Girdiğiniz bilgi en az ${props.minlength} karakter uzunluğunda olmalı`
} else {
delete InvalidMessageText.value.minlength
}
}
}
onMounted(async () => {
SetupEditor()
})
watch(
() => props.invalidText,
() => {
if (props.invalidText !== undefined && props.invalidText !== '') {
InvalidMessageText.value.invalid = props.invalidText
} else {
delete InvalidMessageText.value.invalid
}
}
)
</script>
<style>
.summer-label {
width: 100%;
}
.summer-editor {
width: 100%;
}
.note-editor {
width: 100%;
}
.note-editor.note-frame.fullscreen {
background-color: #fff;
}
.note-color.open .note-dropdown-menu {
display: flex;
}
.note-editor .note-toolbar .note-color-palette div .note-color-btn {
min-height: inherit;
}
.note-editable ul {
list-style-type: inherit;
list-style-image: inherit;
margin: inherit;
padding: inherit;
}
.note-editable ul li {
list-style-type: inherit;
list-style-image: inherit;
}
.note-editable ol li {
list-style-type: inherit;
list-style-image: inherit;
}
</style>

View File

@ -0,0 +1,133 @@
<template>
<div :class="['form-item', half ? 'form-item-half' : '', elclass || '']">
<span class="form-item-title" v-if="title !== undefined && title !== ''">
{{ title }}
</span>
<slot name="input">
<label>
<span v-if="label !== undefined && label !== ''">
{{ label }}
<i v-if="required" class="form-item-alert">*</i>
</span>
<textarea
:value="modelValue"
:rows="rows"
:placeholder="placeholder"
:disabled="disabled"
@input="OnInput"
@click="OnClick"
@change="OnChange"
@focus="OnFocus"
@keydown="OnKeyDown"
@keyup="OnKeyUp"
:class="[
invalidText !== undefined && invalidText !== '' ? 'invalid' : '',
iclass || ''
]"
:minlength="minlength"
:maxlength="maxlength"></textarea>
<span
class="form-item-alert"
v-if="InvalidMessages.length > 0 && InvalidMessages !== ''">
{{ InvalidMessages }}
</span>
<span
class="form-item-description"
v-if="description !== undefined && description !== ''">
{{ description }}
</span>
</label>
</slot>
</div>
</template>
<script setup lang="ts">
import { ref, computed, watch } from 'vue'
export interface Props {
label?: string
disabled?: boolean
modelValue: number | string | null | undefined
half?: boolean
title?: string
rows?: number
invalidText?: string
description?: string
placeholder?: string
required?: boolean
maxlength?: string
minlength?: string
iclass?: string
elclass?: string
modelKey?: string
}
const props = withDefaults(defineProps<Props>(), {
disabled: false,
half: false,
rows: 4,
required: false
})
const emit = defineEmits([
'update:modelValue',
'change',
'input',
'focus',
'click',
'keydown',
'keyup'
])
interface InvalidMessagesObj {
[key: string]: any
}
const InvalidMessageText = ref<InvalidMessagesObj>({})
const InvalidMessages = computed(() => {
let text = ''
Object.keys(InvalidMessageText.value).forEach((k: string, i: number) => {
text += InvalidMessageText.value[k] + ', '
})
return text
})
const OnChange = (e: Event) => {
emit('update:modelValue', (e.target as HTMLInputElement).value)
emit('change', e)
}
const OnInput = (e: Event) => {
emit('update:modelValue', (e.target as HTMLInputElement).value)
emit('input', e)
}
const OnFocus = (e: Event) => {
emit('focus', e)
}
const OnClick = (e: Event) => {
emit('focus', e)
}
const OnKeyDown = (e: Event) => {
emit('update:modelValue', (e.target as HTMLInputElement).value)
emit('keydown', e)
}
const OnKeyUp = (e: Event) => {
if (props.minlength !== undefined) {
if ((e.target as HTMLInputElement)?.value.length < Number(props.minlength)) {
InvalidMessageText.value.minlength = `Girdiğiniz bilgi en az ${props.minlength} karakter uzunluğunda olmalı`
} else {
delete InvalidMessageText.value.minlength
}
}
emit('update:modelValue', (e.target as HTMLInputElement).value)
emit('keyup', e)
}
watch(
() => props.invalidText,
() => {
if (props.invalidText !== undefined && props.invalidText !== '') {
InvalidMessageText.value = {}
InvalidMessageText.value.invalid = props.invalidText
} else {
delete InvalidMessageText.value.invalid
}
}
)
</script>

View File

@ -0,0 +1,42 @@
<template>
<div :class="[classList]">
<template v-if="toRoute === undefined">
<div class="ico-clickable" @click="OnClick">
<i :class="['ico-c', iconClass]">
<svg>
<use :href="icourl + '#' + icon" />
</svg>
</i>
</div>
</template>
<template v-else>
<router-link :to="toRoute">
<i :class="['ico-c', iconClass]">
<svg>
<use :href="icourl + '#' + icon" />
</svg>
</i>
</router-link>
</template>
</div>
</template>
<script setup lang="ts">
import icourl from '@/assets/images/icons.svg'
export interface Props {
icon: string
iconClass?: string
classList?: string
toRoute?: string
}
const props = withDefaults(defineProps<Props>(), {
iconClass: '',
classList: ''
})
const emit = defineEmits(['click'])
const OnClick = (e: Event) => {
emit('click', e)
}
</script>

View File

@ -0,0 +1,437 @@
<template>
<div
:class="[
page === 'list' ? 'section-header' : '',
page === 'form' ? 'form-part-title' : ''
]">
<i class="ico-c ico-section back-grad-title" v-if="icon !== undefined && icon !== ''">
<svg height="20">
<use :href="icourl + '#' + icon" />
</svg>
</i>
<h1 v-if="title !== undefined && title !== ''">
<span>{{ title }}</span>
<span class="section-header-count">{{ localTotalRecord }} {{ listText }}</span>
</h1>
<h4 v-if="formTitle !== undefined && formTitle !== ''">{{ formTitle }}</h4>
<div class="section-header-buttons-c collapsable" v-if="!isPreview">
<div class="header-extra-buttons-C"><slot name="extraButtons"></slot></div>
<div class="list-search-c" v-if="search">
<i
class="ico-c ico-section ico-section-header-btn btn-list-search menu-have-sub"
@click="OpenSearchForm($event)">
<svg>
<use href="@/assets/images/icons.svg#search" />
</svg>
</i>
<div
v-if="searchForm"
class="menu-sub menu-sub-top menu-sub-right menu-sub-mobile-fix section-header-search"
:style="searchFieldPos">
<div id="list-search-form">
<input
:id="'listsearch' + rnd"
type="text"
placeholder="Ara"
v-model="localQuery"
@keyup="SearchInputKeyUp" />
<button @click="SearchQuery">
<svg>
<use href="@/assets/images/icons.svg#search" />
</svg>
</button>
</div>
</div>
</div>
<div class="header-buttons-C">
<div class="menu-have-sub section-header-mobile-menu" @click="OpenMobileButtons">
<i class="ico-c ico-section ico-section-header-btn">
<svg>
<use href="@/assets/images/icons.svg#oplist" />
</svg>
</i>
</div>
<div
class="section-header-buttons menu-sub menu-sub-right menu-sub-top"
v-if="mobileButtons">
<icon-button
v-if="export"
classList="ico-section ico-section-header-btn"
@click="exportPanel = !exportPanel"
icon="export" />
<icon-button
v-if="filterable()"
classList="ico-section ico-section-header-btn"
@click="OpenFilterPanel"
icon="filter" />
<icon-button
v-if="addRoute !== undefined && addRoute !== ''"
classList="ico-section ico-section-header-btn"
:toRoute="addRoute"
icon="plus" />
<icon-button
v-else-if="addAction !== undefined && addAction !== ''"
classList="ico-section ico-section-header-btn"
@click="localAddAction"
icon="plus" />
</div>
</div>
</div>
</div>
<div
:class="[
page === 'list' ? 'section-content section-inner' : '',
page === 'form' ? 'form-part-content' : ''
]">
<div class="list-filter-wrapper" v-if="filters() || searched">
<h4>Filtreler ve Arama</h4>
<div class="list-filter-content">
<template v-if="localQuery !== ''">
<div class="list-filter-item" data-filter="durum-onaylanmis">
<strong>Arama:</strong>
<span>
{{ localQuery }}
</span>
<span class="list-filter-close" @click="RemoveSearch"></span>
</div>
</template>
<template v-for="(filter, k) in filterParams">
<div class="list-filter-item" data-filter="durum-onaylanmis">
<strong>{{ filter.title }}:</strong>
<span>
{{ filter.text || filter.val }} {{ filter.op === '=' ? '' : filter.op }}
</span>
<span class="list-filter-close" @click="RemoveFilterKey(k as string)"></span>
</div>
</template>
</div>
</div>
<slot name="datatable">
<data-table
:tableHeader="tableHeader"
:tableData="localTableData"
:rowAction="rowAction"
v-model:sortData="localSort"
v-model:pagination="localPagination"
:rowNumber="rowNumber"
:totalValues="localTotalValues"
:isPreview="isPreview" />
</slot>
</div>
<panel-wrapper v-if="filterPanel" v-model="filterPanel" :panel-title="'Filtreleme'">
<template #panelContent>
<panel-filter :filterHead="tableHeader" v-model:filterParams="localFilterParams" />
</template>
<template #footerButton>
<div class="button-c button-save" @click="FilterData">Filtrele</div>
</template>
</panel-wrapper>
<panel-wrapper v-if="exportPanel" v-model="exportPanel" :panel-title="'Dışa Aktar'">
<template #panelContent>
<panel-export v-model:selectedExport="selectedExport" />
</template>
</panel-wrapper>
</template>
<script setup lang="ts">
import { ref, reactive, onBeforeMount, watch, computed } from 'vue'
import axios from 'axios'
import { useGlobalStore } from '@/stores/globalStore'
const globalStore = useGlobalStore()
import { useDataStore } from '@/stores/dataStore'
const dataStore = useDataStore()
import icourl from '@/assets/images/icons.svg'
import PanelWrapper from '@/components/PanelWrapper.vue'
import PanelFilter from './PanelFilter.vue'
import PanelExport from './PanelExport.vue'
interface ITableHead {
[key: string]: any
title: string
name: string
compute?: Function
computeHtml?: Function
sort?: boolean
filter?: Record<string, any>
}
interface IPagination {
[key: string]: any
pageNumber?: number | string
pageSize: number | string
totalRecords: number | string
}
interface ISort {
[key: string]: any
sortColumn?: string
sortOrder?: string
}
export interface Props {
tableHeader: ITableHead[]
tableData?: Record<string, any>[]
pagination?: IPagination
rowAction?: Function | string
title?: string
formTitle?: string
listText?: string
icon?: string
apiList?: string
addRoute?: string
addAction?: Function | string
filterData?: Record<string, any>
sortData?: ISort
totalRecord?: string | number
query?: string
apiText?: string
page?: string
refresh?: boolean
export?: boolean
search?: boolean
rowNumber?: boolean
totalValues?: Record<string, any>
isPreview?: boolean
}
const props = withDefaults(defineProps<Props>(), {
tableData: () => [],
totalRecord: 0,
apiText: '',
page: 'list',
refresh: false,
export: true,
search: true,
rowNumber: false,
isPreview: false
})
const emit = defineEmits([
'click',
'update:tableData',
'update:pagination',
'update:sortData',
'update:query',
'update:refresh',
'update:totalRecord'
])
const rnd = ref<number>(Number(Math.floor(Math.random() * 1000000000)))
const filterPanel = ref<boolean>(false)
const exportPanel = ref<boolean>(false)
const searchForm = ref<boolean>(false)
const mobileButtons = ref<boolean>(false)
const selectedExport = ref<number | null>(null)
const searched = ref<boolean>(false)
const localSort = ref<ISort>({} as ISort)
const localPagination = ref<IPagination>({} as IPagination)
const localTotalValues = reactive<Record<string, any>>({})
const searchFieldPos = ref<string>('')
if (props.totalValues !== undefined) Object.assign(localTotalValues, props.totalValues)
if (props.pagination !== undefined)
Object.assign(localPagination.value, props.pagination)
const localTableData = ref<Record<string, any>[]>([])
if (props.tableData !== undefined) localTableData.value = props.tableData
const localQuery = ref<string>('')
const localTotalRecord = ref<string | number>(0)
if (props.totalRecord !== undefined) localTotalRecord.value = props.totalRecord
const localFilterParams = ref<Record<string, any>>({})
const filterParams = reactive<Record<string, any>>({})
const OpenFilterPanel = () => {
Object.assign(localFilterParams.value, filterParams)
filterPanel.value = true
}
const EqualObjects = (source: Record<string, any>, dest: Record<string, any>) => {
Object.keys(source).forEach((keys, is) => {
if (dest[keys] === undefined) delete source[keys]
})
}
const FilterData = async () => {
Object.assign(filterParams, localFilterParams.value)
EqualObjects(filterParams, localFilterParams.value)
setTimeout(async () => {
await GetLocalData()
filterPanel.value = false
}, 50)
}
const localAddAction = () => {
if (props.addAction !== undefined && props.addAction !== '')
(props.addAction as Function)()
}
const filterable = () => {
return props.tableHeader.filter((e) => e.hasOwnProperty('filter')).length > 0
}
const filters = (): boolean => {
return Object.keys(filterParams).length > 0
}
const RemoveFilterKey = (k: string) => {
delete localFilterParams.value[k]
delete filterParams[k]
GetLocalData()
}
const RemoveSearch = () => {
localQuery.value = ''
searched.value = false
GetLocalData()
}
const GetLocalData = async () => {
if (selectedExport.value !== null) {
const exportUrl =
axios.defaults.baseURL + dataStore.apiBase + props.apiList + '?isPdf=true'
const link = document.createElement('a')
link.href = exportUrl
document.body.appendChild(link)
link.dispatchEvent(
new MouseEvent('click', { bubbles: true, cancelable: true, view: window })
)
link.remove()
window.URL.revokeObjectURL(link.href)
selectedExport.value = null
exportPanel.value = false
} else {
let apiData: Record<string, any> = {
params: {
pageNumber: props.isPreview ? 0 : localPagination.value.pageNumber || 1,
pageSize: globalStore.perPage
}
}
if (localSort.value.sortColumn !== undefined) {
apiData.params.sortColumn = localSort.value.sortColumn
if (localSort.value.sortOrder !== undefined && localSort.value.sortOrder !== '')
apiData.params.sortOrder = localSort.value.sortOrder
}
if (localQuery.value !== '') {
apiData.params.searchString = localQuery.value
} else {
delete apiData.params.searchString
}
if (props.apiText !== undefined && props.apiText !== '')
apiData.text = props.apiText
var filterparam: Record<string, any> = {}
if (filters()) {
Object.keys(filterParams).forEach((f, k) => {
filterparam['Filters[' + f + ']'] = filterParams[f].op + filterParams[f].val
})
Object.assign(apiData.params, filterparam)
}
let dt = await dataStore.dataGet(props.apiList as string, apiData)
// buraya dikkat cekilis itiraz modulunde liste duzgun calışması için nullable kullanıldı
if (dt !== 'errorfalse') localTableData.value = dt.data ?? dt
else localTableData.value = []
localPagination.value.totalRecords = dt.totalRecords
localPagination.value.pageSize = dt.pageSize
localTotalRecord.value = dt.totalRecords || localTableData.value.length
if (props.pagination !== undefined) emit('update:pagination', localPagination.value)
if (props.totalRecord !== undefined)
emit('update:totalRecord', localTotalRecord.value)
if (props.totalValues !== undefined) {
Object.keys(props.totalValues).forEach((key, i) => {
localTotalValues[key] = dt[props.totalValues![key]]
})
}
emit('update:refresh', false)
}
}
const OpenMobileButtons = () => {
searchForm.value = false
mobileButtons.value = !mobileButtons.value
}
const OpenSearchForm = (e: Event) => {
searchFieldPos.value = ''
if (globalStore.screenWidth <= globalStore.breakPoints.tabletp) {
mobileButtons.value = false
let eltRect = (e.target as HTMLElement).getBoundingClientRect() as DOMRect
searchFieldPos.value = `top:${eltRect.top + eltRect.height}px;`
}
searchForm.value = !searchForm.value
if (searchForm.value) {
setTimeout(() => {
let el: HTMLInputElement = document.getElementById(
'listsearch' + rnd.value
) as HTMLInputElement
el.focus
el.select()
}, 50)
}
}
const SearchInputKeyUp = (e: KeyboardEvent) => {
if (e.key === 'Enter') SearchQuery()
}
const SearchQuery = () => {
if (props.apiList !== undefined) GetLocalData()
else emit('update:query', localQuery.value)
searchForm.value = false
searched.value = true
}
const Resize = () => {
searchForm.value = false
mobileButtons.value = false
}
onBeforeMount(() => {
if (globalStore.screenWidth >= globalStore.breakPoints.tabletp)
mobileButtons.value = true
if (props.apiList !== undefined) GetLocalData()
window.addEventListener('resize', Resize)
})
watch(
() => localSort.value,
() => {
GetLocalData()
},
{ deep: true }
)
watch(
() => localPagination.value.pageNumber,
() => {
GetLocalData()
}
)
watch(
() => props.refresh,
() => {
if (props.refresh) GetLocalData()
}
)
watch(
() => localQuery.value,
() => {
if (props.apiList !== undefined && localQuery.value.length === 0) GetLocalData()
else if (localQuery.value.length === 0) emit('update:query', localQuery.value)
}
)
watch(
() => selectedExport.value,
() => {
if (selectedExport.value !== null) GetLocalData()
}
)
</script>

View File

@ -0,0 +1,54 @@
<template>
<div class="panel-content panel-export-content">
<div class="panel-content-item">
<div class="button-c button-icon button-export" @click="SelectExport(1)">
<i class="ico-c">
<svg>
<use :href="icourl + '#pdf'"></use>
</svg>
</i>
<span class="panel-date">PDF</span>
</div>
</div>
<div class="panel-content-item" v-if="showExport">
<div class="button-c button-icon button-export" @click="SelectExport(2)">
<i class="ico-c">
<svg>
<use :href="icourl + '#xls'"></use>
</svg>
</i>
<span class="panel-date">Excell</span>
</div>
</div>
<div class="panel-content-item" v-if="showExport">
<div class="button-c button-icon button-export" @click="SelectExport(3)">
<i class="ico-c">
<svg>
<use :href="icourl + '#csv'"></use>
</svg>
</i>
<span class="panel-date">CSV</span>
</div>
</div>
</div>
</template>
<script setup lang="ts">
import { ref } from 'vue'
import icourl from '@/assets/images/icons.svg'
const props = defineProps<{
selectedExport?: number | null
}>()
const emit = defineEmits(['update:selectedExport'])
const selected = ref<number>(0)
const showExport = ref<boolean>(false)
const SelectExport = (exp: number) => {
selected.value = exp
emit('update:selectedExport', selected.value)
}
</script>

View File

@ -0,0 +1,123 @@
<template>
<template v-for="(filter, i) in filterHead">
<template v-if="filter.filter !== undefined">
<template v-if="filter.filter.type === 'datetime-local'">
<div class="panel-content-item">
<form-date
v-model="localFilterData[filter.name]"
:label="filter.title"
@change="UpdateFilter(filter)" />
<form-select
v-if="filter.filter.range !== undefined && filter.filter.range"
:listData="filterOperator"
v-model="localFilterData[filter.name + 'op']"
@change="UpdateFilter(filter)" />
</div>
</template>
<template v-if="filter.filter.type === 'date'">
<div class="panel-content-item">
<form-date
type="date"
v-model="localFilterData[filter.name]"
:label="filter.title"
@change="UpdateFilter(filter)" />
<form-select
v-if="filter.filter.range !== undefined && filter.filter.range"
:listData="filterOperator"
v-model="localFilterData[filter.name + 'op']"
@change="UpdateFilter(filter)" />
</div>
</template>
<template v-if="filter.filter.type === 'text'">
<div class="panel-content-item">
<form-input
v-model="localFilterData[filter.name]"
:label="filter.title"
@change="UpdateFilter(filter)" />
<form-select
v-if="filter.filter.range !== undefined && filter.filter.range"
:listData="filterOperator"
v-model="localFilterData[filter.name + 'op']"
@change="UpdateFilter(filter)" />
</div>
</template>
<template v-if="filter.filter.type === 'select'">
<div class="panel-content-item">
<form-select
:listData="filter.filter.data"
:listText="filter.filter.listText"
:listVal="filter.filter.listVal"
:extraData="filter"
:label="filter.title"
v-model="localFilterData[filter.filter.filterId || filter.name]"
@change="UpdateFilterSelect"
clearable />
</div>
</template>
</template>
</template>
</template>
<script setup lang="ts">
import { ref, reactive, onBeforeMount } from 'vue'
const props = defineProps<{
filterHead: Record<string, any>
filterParams: Record<string, any>
}>()
const emit = defineEmits(['update:filterParams'])
const localFilterData = reactive<Record<string, any>>({})
const localFilterParams = reactive<Record<string, any>>(
Object.assign(props.filterParams)
)
const filterOperator = ref<string[]>(['=', '<', '>'])
const createFilterData = () => {
props.filterHead.forEach((d: Record<string, any>) => {
if (d.filter !== undefined) {
let filterKey = d.filter.filterId || d.name
localFilterData[filterKey] = ''
localFilterData[filterKey + 'op'] = '='
}
})
Object.keys(localFilterParams).forEach((k, i) => {
localFilterData[k] = localFilterParams[k].val
localFilterData[k + 'op'] = localFilterParams[k].op
})
}
const UpdateFilter = (k: Record<string, any>) => {
let filterKey = k.filter.filterId || k.name
if (localFilterData[filterKey] !== '') {
localFilterParams[filterKey] = {}
localFilterParams[filterKey].val = localFilterData[filterKey]
localFilterParams[filterKey].op = localFilterData[filterKey + 'op']
localFilterParams[filterKey].title = k.title
} else delete localFilterParams[filterKey]
emit('update:filterParams', localFilterParams)
}
const UpdateFilterSelect = (
e: Event,
v: string,
d: Record<string, any>,
ext: Record<string, any>
) => {
let filterKey = ext.filter.filterId || ext.name
if (v !== '' && v !== null && localFilterData[filterKey] !== '') {
localFilterParams[filterKey] = {}
localFilterParams[filterKey].val = localFilterData[filterKey]
localFilterParams[filterKey].op = localFilterData[filterKey + 'op']
localFilterParams[filterKey].title = ext.title
localFilterParams[filterKey].text = d[ext.filter.listText]
} else {
delete localFilterParams[filterKey]
}
emit('update:filterParams', localFilterParams)
}
onBeforeMount(() => {
createFilterData()
})
</script>

View File

@ -0,0 +1,109 @@
<template>
<div class="tabs-buttons-c" :id="'tabnav' + rnd">
<template v-for="(tab, i) in tabList">
<div
:class="['tab-button', currentTab === i ? 'tab-selected' : '']"
@click="ChangeTab(i)"
:style="[i === 0 ? tabPosition : '']">
<slot :name="'tabname' + i">{{ tab.text }}</slot>
</div>
</template>
<div class="tab-nav-button tab-nav-button-prev" @click="ChangeTab('<')">
<i class="ico-c ico-tab-nav">
<svg width="8"><use href="/src/assets/images/icons.svg#arrow"></use></svg>
</i>
</div>
<div class="tab-nav-button tab-nav-button-next" @click="ChangeTab('>')">
<i class="ico-c ico-tab-nav">
<svg width="8"><use href="/src/assets/images/icons.svg#arrow"></use></svg>
</i>
</div>
</div>
<div class="tabs-contents-c" :id="'tabs' + rnd">
<template v-for="(tabc, j) in tabList">
<div
class="tab-content tab-animate"
:style="[j === 0 ? tabContentPosition : '', { width: tabWidth + 'px' }]">
<template v-if="currentTab === j">
<slot :name="tabc.id"></slot>
</template>
</div>
</template>
</div>
</template>
<script setup lang="ts">
import { ref, computed, onMounted, watch } from 'vue'
import { useGlobalStore } from '@/stores/globalStore'
const globalStore = useGlobalStore()
interface TabObj {
[key: string]: any
text: string
id: string
}
const props = defineProps<{
tabList: TabObj[]
}>()
const currentTab = ref<number>(0)
const rnd = ref<number>(Math.ceil(Number(Math.random() * 1000000000)))
const tabWidth = ref<number>(0)
const tabPosition = ref<string>('')
const tabContentPosition = computed<string>(() => {
var tabPos = ''
let pos = -(tabWidth.value * currentTab.value)
tabPos = `margin-left:${pos}px`
return tabPos
})
const CalculateNavPosition = () => {
tabPosition.value = ''
let screenWidth = document.body.offsetWidth
if (screenWidth <= 1024) {
let pos = -(tabWidth.value * currentTab.value - 50)
tabPosition.value = `margin-left:${pos}px`
}
}
const ChangeTab = (d: number | string) => {
if (d === '<') {
if (currentTab.value !== 0) {
currentTab.value--
}
} else if (d == '>') {
if (currentTab.value !== props.tabList.length - 1) {
currentTab.value++
}
} else {
currentTab.value = Number(d)
}
CalculateNavPosition()
}
const TabWidth = () => {
let screenWidth = document.body.offsetWidth
let tabel = document.getElementById('tabs' + rnd.value) as HTMLElement
if (screenWidth <= globalStore.breakPoints.tablet) {
tabWidth.value = screenWidth - 48
} else {
const menuSideW = document.querySelector('.menu-side-w')
let sideW = globalStore.sideMenu ? menuSideW!.getBoundingClientRect().width : 0
tabWidth.value = screenWidth - sideW - 48
}
}
const Resize = () => {
TabWidth()
CalculateNavPosition()
}
onMounted(() => {
TabWidth()
window.addEventListener('resize', Resize)
})
watch(
() => globalStore.sideMenu,
() => {
TabWidth()
}
)
</script>

View File

@ -0,0 +1,40 @@
<template>
<div :class="['page-toast-item', type !== undefined ? 'toast-item-' + type : '']">
<span class="toast-close-btn" @click="CloseToast"></span>
<span>{{ text }}</span>
</div>
</template>
<script setup lang="ts">
import { ref, onMounted } from 'vue'
import { useToastStore } from './toastStore'
const toastStore = useToastStore()
export interface Props {
id: number
text: string
type: string
timeout?: number
show?: boolean
}
const props = withDefaults(defineProps<Props>(), {
type: '',
timeout: 0,
show: false
})
const emit = defineEmits(['update:show'])
const localTimeout = ref<number>(props.timeout)
const CloseToast = () => {
delete toastStore.toasts[props.id]
}
onMounted(() => {
if (localTimeout.value === 0) localTimeout.value = toastStore.toastTimeout
if (localTimeout.value >= 0) {
setTimeout(() => {
CloseToast()
}, localTimeout.value)
}
})
</script>

View File

@ -0,0 +1,20 @@
<template>
<template v-if="Object.keys(toastStore.toasts).length > 0">
<teleport to="body">
<div class="page-toast-w">
<template v-for="(toast, i) in toastStore.toasts">
<toast-item
:type="toast.type"
:id="toast.id"
:timeout="toast.timeout"
:text="toast.text" />
</template>
</div>
</teleport>
</template>
</template>
<script setup lang="ts">
import ToastItem from './ToastItem.vue'
import { useToastStore } from './toastStore'
const toastStore = useToastStore()
</script>

View File

@ -0,0 +1,22 @@
import { defineStore } from 'pinia'
import { ref, reactive } from 'vue'
export const useDialogStore = defineStore('dialogStore', () => {
const dialogs = reactive<Record<string, any>>({})
const CreateDialog = (data: Record<string, any>) => {
const rnd: number = Number(Math.floor(Math.random() * 10000000000))
dialogs[rnd] = {} as Record<string, any>
dialogs[rnd].id = rnd
dialogs[rnd].data = data
}
const CloseDialog = (id: number) => {
delete dialogs[id]
}
return {
dialogs,
CreateDialog,
CloseDialog
}
})

View File

@ -0,0 +1,40 @@
import DataTable from './DataTable.vue'
import DataTablePagination from './DataTablePagination.vue'
import ListTableContent from './ListTableContent.vue'
import FormInput from './FormInput.vue'
import FormDate from './FormDate.vue'
import FormFile from './FormFile.vue'
import FormTextarea from './FormTextarea.vue'
import FormQuill from './FormQuill.vue'
import FormSummer from './FormSummer.vue'
import FormSelect from './FormSelect.vue'
import FormRadio from './FormRadio.vue'
import FormCheckbox from './FormCheckbox.vue'
import Tabs from './Tabs.vue'
import IconButton from './IconButton.vue'
import Breadcrumb from './Breadcrumb.vue'
import FileListItem from './FileListItem.vue'
import FormDisplay from './FormDisplay.vue'
import Toasts from './Toasts.vue'
import Dialogs from './Dialogs.vue'
export {
DataTable,
DataTablePagination,
ListTableContent,
FormInput,
FormDate,
FormFile,
FormTextarea,
FormQuill,
FormSummer,
FormSelect,
FormRadio,
FormCheckbox,
Tabs,
IconButton,
Breadcrumb,
FileListItem,
FormDisplay,
Toasts,
Dialogs
}

View File

@ -0,0 +1,23 @@
import { defineStore } from 'pinia'
import { ref, reactive } from 'vue'
export const useToastStore = defineStore('toastStore', () => {
const toastTimeout = ref<number>(5000)
const toasts = reactive<Record<string, any>>({})
const AddToast = (toast: string, type: string, timeout?: number) => {
const iTimeout: number = timeout || 0
const rnd: number = Number(Math.floor(Math.random() * 10000000000))
toasts[rnd] = {} as Record<string, any>
toasts[rnd].text = toast
toasts[rnd].timeout = iTimeout
toasts[rnd].id = rnd
toasts[rnd].type = type
}
return {
toastTimeout,
toasts,
AddToast
}
})

View File

@ -0,0 +1,81 @@
<template>
<div class="main-w" v-if="loaded">
<Header />
<SideMenu />
<main :style="[mainWrapperWidth]" :class="[globalStore.menuLoaded ? 'animate' : '']">
<slot />
</main>
<Footer />
<panel-wrapper
v-if="globalStore.notificationPanel"
v-model="globalStore.notificationPanel"
:panel-title="'Bildirimler'">
<template #panelContent>
<notification-content />
</template>
</panel-wrapper>
<toasts />
</div>
</template>
<script setup lang="ts">
import { ref, computed, onBeforeMount, onMounted } from 'vue'
import { useGlobalStore } from '@/stores/globalStore'
const globalStore = useGlobalStore()
import { useDataStore } from '@/stores/dataStore'
const dataStore = useDataStore()
import { useUsersStore } from '@/stores/usersStore'
const usersStore = useUsersStore()
import { usePageStore } from '@/stores/pageStore'
const pageStore = usePageStore()
import { useRoute } from 'vue-router'
const route = useRoute()
import Header from '@/layouts/admin-inc/Header.vue'
import SideMenu from '@/layouts/admin-inc/SideMenu.vue'
import Footer from '@/layouts/admin-inc/Footer.vue'
import PanelWrapper from '@/components/PanelWrapper.vue'
import NotificationContent from '@/views/contents/NotificationContent.vue'
const loaded = ref<boolean>(false)
const body = document.getElementById('app')
const mainWrapperWidth = computed(() => {
if (globalStore.screenWidth > globalStore.breakPoints.tablet) {
if (globalStore.sideMenu) {
return (
'padding-left:' +
Number(globalStore.sideMenuWidth + globalStore.mainPadding) +
'px'
)
} else {
return 'padding-left:' + globalStore.mainPadding + 'px'
}
} else {
return ''
}
})
const WrapperClass = () => {
if (body) {
if (route.name === 'Dashboard') body.setAttribute('class', 'main-page')
else body.setAttribute('class', 'main-w')
}
}
onBeforeMount(async () => {
usersStore.SetUserData()
if (!usersStore.isPanelUser && usersStore.userIsAuth && !pageStore.IsAuthPage()) {
let tip = await dataStore.dataGet('Auth/uyedurumkontrol/' + usersStore.userId)
if (tip !== 'errorfalse') {
usersStore.userApproveId = tip.userIslemtipi
}
}
loaded.value = true
})
onMounted(() => {
WrapperClass()
})
</script>

View File

@ -0,0 +1,11 @@
<template>
<div class="login-w">
<main>
<slot/>
</main>
</div>
</template>
<script setup lang="ts">
const body = document.getElementById('app')
if (body) body.setAttribute('class', 'login-page')
</script>

View File

@ -0,0 +1,3 @@
<template>
<footer></footer>
</template>

View File

@ -0,0 +1,41 @@
<template>
<header>
<div class="header-c">
<i class="ico-c ico-mobile-menu" @click="SideMenu">
<svg>
<use href="@/assets/images/icons.svg#mobilemenu" />
</svg>
</i>
<a href="/" class="logo-header">
<svg>
<use href="@/assets/images/mpi-logos.svg#mpilogo" />
</svg>
</a>
</div>
<div class="header-c">
<!--i
class="ico-c ico-notification badge-have panel-open"
data-panelopen="notification"
@click="OpenNotification">
<span class="badge-c badge-notification"></span>
<svg>
<use href="@/assets/images/icons.svg#notification" />
</svg>
</!--i-->
<profile-menu />
</div>
</header>
</template>
<script setup lang="ts">
import ProfileMenu from '@/layouts/admin-inc/ProfileMenu.vue'
import { useGlobalStore } from '@/stores/globalStore'
const globalStore = useGlobalStore()
const OpenNotification = () => {
globalStore.profileMenu = false
globalStore.notificationPanel = !globalStore.notificationPanel
}
const SideMenu = () => {
globalStore.sideMenu = !globalStore.sideMenu
}
</script>

View File

@ -0,0 +1,103 @@
<template>
<div class="header-profile">
<div class="b-menu-profile menu-have-sub" @click="ProfileMenu">
<div class="profile-photo-c">
<img
:src="
usersStore.profilePhoto !== '' && usersStore.profilePhoto !== null
? dataStore.siteBase + usersStore.profilePhoto
: profilePhoto
" />
</div>
</div>
<nav
id="profilemenu"
class="menu-header menu-sub menu-sub-top menu-profile"
v-if="globalStore.profileMenu">
<ul>
<li>
<div>
<span>Merhaba,</span>
<strong>{{ usersStore.userName }}</strong>
</div>
</li>
<li>
<RouterLink to="/profil" @click="globalStore.profileMenu = false">
<i class="ico-c ico-menu-profile">
<svg>
<use href="@/assets/images/icons.svg#profile"></use>
</svg>
</i>
Profil
</RouterLink>
</li>
<li>
<a href="#" @click="LogOut">
<i class="ico-c ico-menu-profile">
<svg>
<use href="@/assets/images/icons.svg#logout"></use>
</svg>
</i>
<span>Çıkış</span>
</a>
</li>
</ul>
</nav>
</div>
</template>
<script setup lang="ts">
import { onBeforeMount } from 'vue'
import profilePhoto from '@/assets/images/empty-user.png'
import { useGlobalStore } from '@/stores/globalStore'
const globalStore = useGlobalStore()
import { useDataStore } from '@/stores/dataStore'
const dataStore = useDataStore()
import { useUsersStore } from '@/stores/usersStore'
const usersStore = useUsersStore()
import router from '@/router'
const ProfileMenu = () => {
globalStore.notificationPanel = false
globalStore.profileMenu = !globalStore.profileMenu
setTimeout(() => {
document.addEventListener('click', closeProfileMenu)
}, 10)
}
const LogOut = async () => {
globalStore.profileMenu = false
const token = sessionStorage.getItem(usersStore.userStorageKeys.TOKEN)
if (token) {
let dt = await dataStore.dataPost('Auth/logout')
}
usersStore.ResetUserData()
router.push('/login')
}
const closeProfileMenu = (e: Event) => {
let p = e.composedPath && e.composedPath()
var open = false
if (p) {
p.pop()
p.forEach((pv) => {
if (
(pv as HTMLElement).id !== '' &&
(pv as HTMLElement).id !== undefined &&
(pv as HTMLElement).id.includes('profilemenu')
)
open = true
})
}
if (!open) {
globalStore.profileMenu = false
document.removeEventListener('click', closeProfileMenu)
}
}
onBeforeMount(async () => {
let dt = await dataStore.dataGet('AppUserResim/AppUserId/' + usersStore.userId)
if (dt !== 'errorfalse') {
usersStore.profilePhoto = dt.filePath
}
})
</script>

View File

@ -0,0 +1,174 @@
<template>
<div
:class="['menu-side-w', globalStore.menuLoaded ? 'animate' : '']"
:style="[sideMenuPosition]">
<nav-side :menuData="menuData" />
</div>
<div
class="menu-side-shadow"
:class="ShowSideMenuShadow"
@click="globalStore.sideMenu = false"></div>
</template>
<script setup lang="ts">
import { ref, reactive, onMounted, computed } from 'vue'
import NavSide from '@/components/NavSide.vue'
import { useGlobalStore } from '@/stores/globalStore'
const globalStore = useGlobalStore()
import { useUsersStore } from '@/stores/usersStore'
const usersStore = useUsersStore()
globalStore.screenWidth = window.screen.width
if (globalStore.screenWidth < globalStore.breakPoints.tablet)
globalStore.sideMenu = false
var ShowSideMenuShadow = computed(() => {
if (
globalStore.screenWidth < globalStore.breakPoints.tablet &&
globalStore.sideMenu
) {
return 'showme'
} else {
return ''
}
})
var sideMenuPosition = computed(() => {
if (globalStore.sideMenu) {
return 'left:0'
} else {
return 'left:-' + globalStore.sideMenuWidth + 'px'
}
})
const menuData = ref<Record<string, any>[]>([
{
title: 'Dashboard',
ico: 'dashboard',
desktop: 'hover',
mobile: 'click',
to: '/'
},
{
title: 'Piyangolar',
ico: 'draws',
show: !usersStore.isAccounting,
to: usersStore.isPanelUser ? '/piyangolar/piyango-listesi' : '',
showsub: !usersStore.isPanelUser,
sub: [
{
title: 'Yeni Piyango',
to: '/piyangolar/yeni-piyango',
show: usersStore.userApproveId === 4 && !usersStore.isPanelUser
},
{
title: 'Piyango Listesi',
to: '/piyangolar/piyango-listesi',
show: !usersStore.isPanelUser
}
]
},
{
title: 'Üyeler',
ico: 'customers',
show: usersStore.isPanelUser && !usersStore.isAccounting,
sub: [
{
title: 'Üye Listesi',
to: '/uyeler/uye-liste'
},
{
title: 'Üye Tipleri',
to: '/uyeler/uye-tipleri'
}
]
},
{
title: 'Kullanıcılar',
ico: 'users',
show: usersStore.isPanelUser,
sub: [
{
title: 'Yeni Kullanıcı',
to: '/kullanicilar/yeni-kullanici'
},
{
title: 'Kullanıcı Listesi',
to: '/kullanicilar/kullanici-liste'
},
{
title: 'Kullanıcı Rolleri',
to: '/kullanicilar/kullanici-roller'
},
{
title: 'Ayarlar',
to: '/kullanicilar/kullanici-ayarlari'
}
]
},
{
title: 'Site Yönetimi',
ico: 'sitemanagement',
show: usersStore.isPanelUser && !usersStore.isAccounting,
sub: [
{
title: 'Yeni Sayfa',
to: '/site-yonetimi/yeni-sayfa'
},
{
title: 'Sayfa Listesi',
to: '/site-yonetimi/sayfa-listesi'
},
{
title: 'Menü Yönetimi',
to: '/site-yonetimi/menu-listesi'
}
]
},
{
title: 'Muhasebe',
ico: 'accounting1',
show: usersStore.isPanelUser,
sub: [
{
title: 'Piyango Listesi',
to: '/muhasebe/piyango-listesi'
},
{
title: 'Ayarlar',
to: '/muhasebe/ayarlar'
}
]
},
{
title: 'Sistem Günlüğü',
ico: 'logs',
to: '/logs',
show: usersStore.isPanelUser && !usersStore.isAccounting
},
{
title: 'Profil',
ico: 'customers',
to: '/profil',
show: !usersStore.isPanelUser
}
])
const ResizeWindow = () => {
globalStore.screenWidth = window.screen.width
if (globalStore.screenWidth < globalStore.breakPoints.tablet)
globalStore.sideMenu = false
}
onMounted(() => {
const menuSideW = document.querySelector('.menu-side-w')
if (menuSideW) {
requestAnimationFrame(() => {
globalStore.sideMenuWidth = menuSideW.getBoundingClientRect().width
setTimeout(() => {
globalStore.menuLoaded = true
}, 100)
})
}
ResizeWindow()
window.addEventListener('resize', ResizeWindow)
})
</script>

40
src/main.ts Normal file
View File

@ -0,0 +1,40 @@
import '@/assets/style/default.css'
import '@/assets/style/fonts.css'
import axios from '@/init/axios-init'
import { createApp } from 'vue'
import { createPinia } from 'pinia'
import * as components from '@/components/global/'
import { PDFPlugin } from 'vue3-pdfmake'
import App from './App.vue'
import router from './router'
import $ from 'jquery'
declare global {
interface JQuery {
summernote(options?: any): JQuery;
summernote(method: string, ...params: any[]): JQuery;
}
}
window.$ = $
window.jQuery = $
const app = createApp(App)
const axiosInstance = axios.create({
withCredentials: true
})
app.config.globalProperties.$axios = { ...axiosInstance }
for (const key in components) {
const component = components[key as keyof typeof components]
app.component(key, component)
}
app.use(createPinia())
app.use(PDFPlugin)
app.use(router)
app.mount('#app')

View File

@ -0,0 +1,3 @@
import Profil from './profil'
export default [Profil]

View File

@ -0,0 +1,10 @@
import UyeProfil from '@/module/uyeler/views/UyeProfil.vue'
export default {
path: '/profil',
name: 'Profil',
component: UyeProfil,
meta: {
authRequired: true
}
}

View File

@ -0,0 +1,10 @@
import ForgotPassword from '@/module/auth/views/ForgotPassword.vue'
export default {
path: '/forgot-password',
name: 'ForgotPassword',
component: ForgotPassword,
meta: {
authpage: true
}
}

View File

@ -0,0 +1,11 @@
import Login from "@/module/auth/routes/login";
import Register from "@/module/auth/routes/register";
import ForgotPassword from "@/module/auth/routes/forgot-password";
export default [
Login,
Register,
ForgotPassword
]

View File

@ -0,0 +1,10 @@
import Login from '@/module/auth/views/Login.vue'
export default {
path: '/login',
name: 'Login',
component: Login,
meta: {
authpage: true
}
}

View File

@ -0,0 +1,10 @@
import Register from '@/module/auth/views/Register.vue'
export default {
path: '/register',
name: 'Register',
component: Register,
meta: {
authpage: true
}
}

View File

@ -0,0 +1,17 @@
import { defineStore } from 'pinia'
import { useDataStore } from '@/stores/dataStore'
import { useAuthStore } from '../stores/authStore'
export const useAppUserService = defineStore('appUserService', () => {
const dataStore = useDataStore()
const authStore = useAuthStore()
const GetAAuthRoleList = async () => {
if (authStore.rolesList.length === 0) {
let data = await dataStore.dataGet('Auth/rolelistesi')
authStore.rolesList = data
}
}
return {GetAAuthRoleList}
})

View File

@ -0,0 +1,17 @@
import { defineStore } from 'pinia'
import { useDataStore } from '@/stores/dataStore'
import { useAuthStore } from '../stores/authStore'
export const useAppService = defineStore('appService', () => {
const dataStore = useDataStore()
const authStore = useAuthStore()
const GetAAuthRoleList = async () => {
if (authStore.rolesList.length === 0) {
let data = await dataStore.dataGet('Auth/rolelistesi')
authStore.rolesList = data
}
}
return {GetAAuthRoleList}
})

View File

@ -0,0 +1,12 @@
import { defineStore } from 'pinia'
import { ref,reactive } from 'vue'
export const useAuthStore = defineStore('authStore', () => {
const loginData = reactive<Record<string, any>>({ username: '', password: '' })
const safeLoginData = reactive<Record<string, any>>({})
const rolesList = ref<Record<string, any>[]>([])
Object.assign(safeLoginData, loginData)
return { loginData, safeLoginData, rolesList }
})

View File

@ -0,0 +1,46 @@
import { defineStore } from 'pinia'
import { ref, reactive } from 'vue'
import { useAuthStore } from './authStore'
import { useValidationStore } from '@/stores/validationStore'
export const useAuthValidationStore = defineStore('authValidationStore', () => {
const authStore = useAuthStore()
const validationStore = useValidationStore()
const isFormValid = ref<boolean>(true)
const isLoginMessage = ref<boolean>(false)
const loginMessageType = ref<string>('success')
const loginMessage = ref<string>('')
const registerMessage = ref<string>('')
const invalidTexts = reactive<Record<string, any>>({})
const FormCheck = (): boolean => {
Object.assign(invalidTexts, {})
validationStore.IsFieldEmpty(
authStore.loginData,
invalidTexts,
'username',
'Kullanıcı adı alanını doldurmalısınız. Örn: isim@alanadi.td'
)
validationStore.IsFieldEmpty(
authStore.loginData,
invalidTexts,
'password',
'Lütfen şifrenizi giriniz.'
)
isFormValid.value = Object.keys(invalidTexts).length === 0
return isFormValid.value
}
return {
isFormValid,
invalidTexts,
isLoginMessage,
loginMessageType,
loginMessage,
registerMessage,
FormCheck
}
})

View File

@ -0,0 +1,75 @@
<template>
<GuestLayout>
<section class="section-login">
<div class="login-header">
<div class="logo-header">
<svg height="20">
<use href="@/assets/images/mpi-logos.svg#mpilogo" />
</svg>
</div>
<h1>Şifremi Unuttum</h1>
</div>
<div class="section-content">
<form id="sifremi-unuttum" @submit.prevent="SubmitForgetPassword">
<form-input
type="email"
modelKey="email"
v-model="forgetForm.email"
required
label="E-posta adresi"
placeholder="eposta@alanadi.com"
:invalidText="invalidTexts.email" />
<button class="button-c button-second button-login" type="submit">
Bilgileri Gönder
</button>
</form>
<div class="login-nav login-nav-back">
<RouterLink to="/login">&lt; Geri</RouterLink>
</div>
</div>
</section>
</GuestLayout>
</template>
<script setup lang="ts">
import { ref, reactive } from 'vue'
import GuestLayout from '@/layouts/GuestLayout.vue'
import { useDataStore } from '@/stores/dataStore'
import { useValidationStore } from '@/stores/validationStore'
const dataStore = useDataStore()
const validationStore = useValidationStore()
const invalidTexts = reactive<Record<string, any>>({})
const forgetForm = reactive<Record<string, any>>({
email: ''
})
const FormCheck = (): boolean => {
let check = true
if (validationStore.checkEmpty(forgetForm.email)) {
invalidTexts.email = 'Eposta alanı boş bırakılamaz.'
check = false
} else {
delete invalidTexts.email
if (!validationStore.checkEmail(forgetForm.email)) {
invalidTexts.email =
'Lütfen eposta adresinizi doğru formatta giriniz. Örn: isim@alanadi.td'
check = false
} else {
delete invalidTexts.email
}
}
return check
}
const SubmitForgetPassword = async () => {
if (FormCheck()) {
const forget = await dataStore.dataPost('Auth/forgetmypassword', {
params: { email: forgetForm.email }
})
}
}
</script>

View File

@ -0,0 +1,95 @@
<template>
<GuestLayout>
<section class="section-login">
<div class="login-header">
<div class="logo-header">
<svg height="20">
<use href="@/assets/images/mpi-logos.svg#mpilogo" />
</svg>
</div>
<h1>Giriş Yap</h1>
</div>
<div class="section-content">
<form action="#" id="login-form" @submit.prevent="Login">
<form-input
type="email"
modelKey="username"
v-model="authStore.loginData.username"
required
label="Kullanıcı Adı (e-posta adresi)"
placeholder="eposta@alanadi.com"
:invalidText="authValidationStore.invalidTexts.username" />
<form-input
type="password"
label="Şifre"
v-model="authStore.loginData.password"
required />
<div
:class="['form-inner-comment', authValidationStore.loginMessageType]"
v-if="authValidationStore.isLoginMessage">
<span>{{ authValidationStore.loginMessage }}</span>
</div>
<button class="button-c button-second button-login" type="submit">
Giriş Yap
</button>
</form>
<div class="login-nav">
<RouterLink to="/forgot-password">Şifremi Unuttum</RouterLink>
<RouterLink to="/register">Kaydol</RouterLink>
</div>
</div>
</section>
</GuestLayout>
</template>
<script setup lang="ts">
import { onBeforeMount, reactive, ref } from 'vue'
import { useUsersStore } from '@/stores/usersStore'
const usersStore = useUsersStore()
import { useDataStore } from '@/stores/dataStore'
const dataStore = useDataStore()
import { useAuthStore } from '../stores/authStore'
const authStore = useAuthStore()
import { useAuthValidationStore } from '../stores/authValidationStore'
const authValidationStore = useAuthValidationStore()
import router from '@/router'
import GuestLayout from '@/layouts/GuestLayout.vue'
const Login = async () => {
if (authValidationStore.FormCheck()) {
let login = await dataStore.dataPost('Auth/login', {
data: authStore.loginData
})
Object.assign(authStore.loginData, authStore.safeLoginData)
if (login !== 'errorfalse') {
await usersStore.SetUserSessionData(login)
await usersStore.SetUserData()
if (usersStore.isPanelUser) {
router.push('/')
} else {
if (usersStore.userStatus === 0 || usersStore.userStatus === null) {
router.push('/profil')
} else {
router.push('/')
}
}
} else {
authValidationStore.loginMessageType = 'alert'
authValidationStore.loginMessage =
'Kullanıcı adı veya şifrenizi yanlış girdiniz. Lütfen kontrol edip tekrar deneyiniz.'
authValidationStore.isLoginMessage = true
}
} else {
authValidationStore.isFormValid = true
}
}
onBeforeMount(() => {
if(usersStore.userIsAuth) router.push('/')
})
</script>

View File

@ -0,0 +1,427 @@
<template>
<GuestLayout>
<section class="section-login">
<div class="login-header">
<div class="logo-header">
<svg height="20">
<use href="@/assets/images/mpi-logos.svg#mpilogo" />
</svg>
</div>
<h1>Üye Ol</h1>
</div>
<div class="section-content">
<form id="uye-ol" @submit.prevent="handRegister">
<form-select
label="Kullanıcı Tipi"
:listData="globalDataStore.customerTips"
listText="baslik"
listVal="id"
v-model="uyeBilgileriStore.formData.basvuruTipId"
required
:invalidText="uyeBilgileriStore.invalidTexts.basvuruTipId"
@change="uyeBilgileriStore.ChangeKullaniciTipi" />
<form-input
type="email"
modelKey="email"
v-model="uyeBilgileriStore.formData.email"
required
label="E-posta adresi"
placeholder="eposta@alanadi.com"
:invalidText="uyeBilgileriStore.invalidTexts.email" />
<form-input
type="tel"
modelKey="telefonNumarasi"
v-model="uyeBilgileriStore.formData.telefonNumarasi"
required
label="Telefon Numarası"
placeholder="5554443322"
@keydown="validationStore.allowNumbersWithKeys"
maxlength="10"
minlength="10"
:invalidText="uyeBilgileriStore.invalidTexts.telefonNumarasi" />
<template v-if="uyeBilgileriStore.formData.basvuruTipId === 18">
<form-input
modelKey="gercekAdi"
v-model="uyeBilgileriStore.formData.gercekAdi"
required
label="Ad"
minlength="2"
:invalidText="uyeBilgileriStore.invalidTexts.gercekAdi"
@keydown="validationStore.allowLettersWithKeysExtra($event, /^[ ]*$/)" />
<form-input
modelKey="gercekSoyadi"
v-model="uyeBilgileriStore.formData.gercekSoyadi"
required
label="Soyadı"
minlength="2"
:invalidText="uyeBilgileriStore.invalidTexts.gercekSoyadi"
@keydown="validationStore.allowLettersWithKeysExtra($event, /^[ ]*$/)" />
<form-input
modelKey="gercekTCKN"
v-model="uyeBilgileriStore.formData.gercekTCKN"
required
label="TCKN"
@keydown="validationStore.allowNumbersWithKeys"
maxlength="11"
minlength="11"
:invalidText="uyeBilgileriStore.invalidTexts.gercekTCKN" />
<form-input
modelKey="gercekVergiDairesi"
v-model="uyeBilgileriStore.formData.gercekVergiDairesi"
required
label="Vergi Dairesi"
:invalidText="uyeBilgileriStore.invalidTexts.gercekVergiDairesi" />
<form-input
modelKey="gercekVergiNo"
v-model="uyeBilgileriStore.formData.gercekVergiNo"
required
label="Vergi No"
maxlength="11"
minlength="11"
:invalidText="uyeBilgileriStore.invalidTexts.gercekVergiNo"
@keydown="validationStore.allowNumbersWithKeys" />
<form-input
modelKey="gercekOdaKayitNo"
v-model="uyeBilgileriStore.formData.gercekOdaKayitNo"
required
label="Oda Kayıt No/ Ticaret Sicil No"
:invalidText="uyeBilgileriStore.invalidTexts.gercekOdaKayitNo"
@keydown="validationStore.allowNumbersWithKeys" />
<form-input
modelKey="gercekTicariUnvan"
v-model="uyeBilgileriStore.formData.gercekTicariUnvan"
label="Ticari Ünvan"
:invalidText="uyeBilgileriStore.invalidTexts.gercekTicariUnvan" />
</template>
<template v-if="uyeBilgileriStore.formData.basvuruTipId === 21">
<form-input
modelKey="tuzelUnvan"
v-model="uyeBilgileriStore.formData.tuzelUnvan"
required
label="Ünvan"
:invalidText="uyeBilgileriStore.invalidTexts.tuzelUnvan" />
<form-input
modelKey="tuzelVergiDairesi"
v-model="uyeBilgileriStore.formData.tuzelVergiDairesi"
required
label="Vergi Dairesi"
:invalidText="uyeBilgileriStore.invalidTexts.tuzelVergiDairesi" />
<form-input
modelKey="tuzelVergiNo"
v-model="uyeBilgileriStore.formData.tuzelVergiNo"
required
label="Vergi No"
maxlength="11"
minlength="10"
:invalidText="uyeBilgileriStore.invalidTexts.tuzelVergiNo"
@keydown="validationStore.allowNumbersWithKeys" />
<form-input
modelKey="tuzelSicilNo"
v-model="uyeBilgileriStore.formData.tuzelSicilNo"
required
label="Ticaret Sicil No"
:invalidText="uyeBilgileriStore.invalidTexts.tuzelSicilNo"
@keydown="validationStore.allowNumbersWithKeysExtra($event, /^[-]*$/)" />
</template>
<template v-if="uyeBilgileriStore.formData.basvuruTipId === 22">
<form-input
modelKey="dernekUnvan"
v-model="uyeBilgileriStore.formData.dernekUnvan"
required
label="Ünvan"
:invalidText="uyeBilgileriStore.invalidTexts.dernekUnvan" />
<form-input
modelKey="dernekVergiDairesi"
v-model="uyeBilgileriStore.formData.dernekVergiDairesi"
required
label="Vergi Dairesi"
:invalidText="uyeBilgileriStore.invalidTexts.dernekVergiDairesi" />
<form-input
modelKey="dernekVergiNo"
v-model="uyeBilgileriStore.formData.dernekVergiNo"
required
label="Vergi No"
maxlength="11"
minlength="10"
:invalidText="uyeBilgileriStore.invalidTexts.dernekVergiNo"
@keydown="validationStore.allowNumbersWithKeys" />
<form-input
modelKey="dernekSicilNo"
v-model="uyeBilgileriStore.formData.dernekSicilNo"
required
label="Sicil No"
:invalidText="uyeBilgileriStore.invalidTexts.dernekSicilNo"
@keydown="validationStore.allowNumbersWithKeysExtra($event, /^[-]*$/)" />
</template>
<template v-if="uyeBilgileriStore.formData.basvuruTipId === 23">
<form-input
modelKey="sirketUnvan"
v-model="uyeBilgileriStore.formData.sirketUnvan"
required
label="Ticari Ünvan"
:invalidText="uyeBilgileriStore.invalidTexts.sirketUnvan" />
<form-input
modelKey="sirketVergiDairesi"
v-model="uyeBilgileriStore.formData.sirketVergiDairesi"
required
label="Vergi Dairesi"
:invalidText="uyeBilgileriStore.invalidTexts.sirketVergiDairesi" />
<form-input
modelKey="sirketVergiNo"
v-model="uyeBilgileriStore.formData.sirketVergiNo"
required
label="Vergi No"
maxlength="11"
minlength="10"
:invalidText="uyeBilgileriStore.invalidTexts.sirketVergiNo"
@keydown="validationStore.allowNumbersWithKeys" />
<form-input
modelKey="sirketSicilNo"
v-model="uyeBilgileriStore.formData.sirketSicilNo"
required
label="Ticari Sicil No"
:invalidText="uyeBilgileriStore.invalidTexts.sirketSicilNo"
@keydown="validationStore.allowNumbersWithKeysExtra($event, /^[-]*$/)" />
<form-input
modelKey="sirketMersis"
v-model="uyeBilgileriStore.formData.sirketMersis"
label="Mersis No"
:invalidText="uyeBilgileriStore.invalidTexts.sirketMersis"
@keydown="validationStore.allowNumbersWithKeysExtra($event, /^[-]*$/)" />
</template>
<template v-if="uyeBilgileriStore.formData.basvuruTipId === 26">
<form-input
modelKey="kamuUnvan"
v-model="uyeBilgileriStore.formData.kamuUnvan"
required
label="Ünvan"
:invalidText="uyeBilgileriStore.invalidTexts.kamuUnvan" />
<form-input
modelKey="kamuVergiDairesi"
v-model="uyeBilgileriStore.formData.kamuVergiDairesi"
required
label="Vergi Dairesi"
:invalidText="uyeBilgileriStore.invalidTexts.kamuVergiDairesi" />
<form-input
modelKey="kamuVergiNo"
v-model="uyeBilgileriStore.formData.kamuVergiNo"
required
label="Vergi No"
maxlength="11"
minlength="10"
:invalidText="uyeBilgileriStore.invalidTexts.kamuVergiNo"
@keydown="validationStore.allowNumbersWithKeys" />
<form-input
modelKey="kamuSicilNo"
v-model="uyeBilgileriStore.formData.kamuSicilNo"
label="Ticaret Sicil No"
:invalidText="uyeBilgileriStore.invalidTexts.kamuSicilNo"
@keydown="validationStore.allowNumbersWithKeysExtra($event, /^[-]*$/)" />
</template>
<form-select
label="İl"
:listData="globalDataStore.ilList"
listText="ad"
listVal="id"
v-model="uyeBilgileriStore.formData.ilId"
required
:invalidText="uyeBilgileriStore.invalidTexts.ilId"
@change="ChangeIl" />
<form-select
label="İlçe"
:listData="uyeBilgileriStore.ilceList"
listText="ad"
listVal="id"
v-model="uyeBilgileriStore.formData.ilceId"
required
:invalidText="uyeBilgileriStore.invalidTexts.ilceId"
@change="ChangeIlce"
:disabled="ilceDisabled" />
<form-select
label="Mahalle"
:listData="uyeBilgileriStore.mahalleList"
listText="ad"
listVal="id"
v-model="uyeBilgileriStore.formData.mahalleId"
required
:invalidText="uyeBilgileriStore.invalidTexts.mahalleId"
:disabled="mahalleDisabled" />
<form-input
modelKey="postaKodu"
v-model="uyeBilgileriStore.formData.postaKodu"
label="Posta Kodu"
:invalidText="uyeBilgileriStore.invalidTexts.postaKodu"
maxlength="5"
minlength="5"
@keydown="validationStore.allowNumbersWithKeys" />
<form-textarea
modelKey="adres"
v-model="uyeBilgileriStore.formData.adres"
required
label="Adres"
minlength="4"
:invalidText="uyeBilgileriStore.invalidTexts.adres" />
<form-input
type="password"
modelKey="password"
v-model="uyeBilgileriStore.formData.password"
required
minlength="6"
label="Parola"
:invalidText="uyeBilgileriStore.invalidTexts.password" />
<form-input
type="password"
modelKey="confirmPassword"
v-model="uyeBilgileriStore.formData.confirmPassword"
required
minlength="6"
label="Parola Tekrar"
@keyup="PasswordCheck"
:invalidText="uyeBilgileriStore.invalidTexts.confirmPassword" />
<form-checkbox
:listData="kvkkCheck"
listText="label"
listVal="val"
v-model="uyeBilgileriStore.formData.kvkk"
:invalidText="uyeBilgileriStore.invalidTexts.kvkk">
<template #checktext0>
<span>
<a href="#">KVKK Şartlarını</a>
Kabul Ediyorum
</span>
</template>
</form-checkbox>
<form-checkbox
:listData="uyelikCheck"
listText="label"
listVal="val"
v-model="uyeBilgileriStore.formData.uyelikSozlesmesi"
:invalidText="uyeBilgileriStore.invalidTexts.uyelikSozlesmesi">
<template #checktext0>
<span>
<a href="#">Üyelik Sözleşmesi Şartlarını</a>
Kabul Ediyorum
</span>
</template>
</form-checkbox>
<button class="button-c button-second button-login" type="submit">
Kayıt Ol
</button>
</form>
<div class="login-nav login-nav-back">
<RouterLink to="/login">&lt; Geri</RouterLink>
</div>
</div>
</section>
</GuestLayout>
</template>
<script setup lang="ts">
import GuestLayout from '@/layouts/GuestLayout.vue'
import { ref, onBeforeMount, computed } from 'vue'
import { useDataStore } from '@/stores/dataStore'
const dataStore = useDataStore()
import { useGlobalDataStore } from '@/stores/globalDataStore'
const globalDataStore = useGlobalDataStore()
import { useValidationStore } from '@/stores/validationStore'
const validationStore = useValidationStore()
import { useUsersStore } from '@/stores/usersStore'
const usersStore = useUsersStore()
import { useAuthValidationStore } from '../stores/authValidationStore'
const authValidationStore = useAuthValidationStore()
import router from '@/router'
import { useUyeBilgileriStore } from '@/module/uyeler/stores/UyeBilgileriStore'
const uyeBilgileriStore = useUyeBilgileriStore()
uyeBilgileriStore.ResetStore()
interface IIl {
[key: string]: any
ad: string
id: number
}
const kvkkCheck = ref([
{
label: '',
val: 'kvkk'
}
])
const uyelikCheck = ref([
{
label: '',
val: 'uyelik'
}
])
const ilceDisabled = computed<boolean>(() => {
return uyeBilgileriStore.ilceList.length === 0
})
const mahalleDisabled = computed<boolean>(() => {
return uyeBilgileriStore.mahalleList.length === 0
})
const ChangeIl = (e: Event, v: string | number, d: Record<string, any>) => {
uyeBilgileriStore.formData.ilceId = ''
uyeBilgileriStore.ilceList = d.ilceler
}
const ChangeIlce = (e: Event, v: string | number, d: Record<string, any>) => {
uyeBilgileriStore.formData.mahalleId = ''
uyeBilgileriStore.mahalleList = d.mahalleler
}
const PasswordCheck = (e: KeyboardEvent) => {
if (
uyeBilgileriStore.formData.confirmPassword !== uyeBilgileriStore.formData.password
)
uyeBilgileriStore.invalidTexts.confirmPassword =
'Girdiğiniz değer Parola alanı ile aynı olmalıdır'
else delete uyeBilgileriStore.invalidTexts.confirmPassword
}
const handRegister = async () => {
if (uyeBilgileriStore.FormCheck()) {
const register: any = await dataStore.dataPost('Auth/register', {
data: uyeBilgileriStore.formData
})
if (register !== 'errorfalse') {
authValidationStore.registerMessage = register.message
authValidationStore.loginMessageType = 'success'
authValidationStore.loginMessage = 'Başarıyla kayıt oldunuz. Kullanıcı adı ve şifreniz ile giriş yapabilirsiniz.'
authValidationStore.isLoginMessage = true
router.push('/login')
}
} else {
uyeBilgileriStore.isFormValid = true
}
}
onBeforeMount(async () => {
await dataStore.GetCustomerTipList()
await dataStore.GetIlList()
})
</script>

View File

@ -0,0 +1,5 @@
import settings from "@/module/ayarlar/routes/settings";
export default [
settings
]

View File

@ -0,0 +1,10 @@
import Settings from "@/module/ayarlar/views/Settings.vue"
export default {
path: "/settings",
name: 'Settings',
component: Settings,
meta: {
authRequired: true
}
}

View File

View File

View File

@ -0,0 +1,9 @@
<template>
<AdminLayout>
<Breadcrumb current-page-text="Genel Ayarlar"/>
</AdminLayout>
</template>
<script setup lang="ts">
import AdminLayout from "@/layouts/AdminLayout.vue";
import {Breadcrumb} from "@/components/global";
</script>

View File

@ -0,0 +1,63 @@
<template>
<div class="form-content">
<div class="form-inner-content form-inner-content-left">
<form-piyango-bilgileri
v-if="piyangoStore.lotteryApprove === 0 || piyangoStore.lotteryApprove === 3" />
<form-piyango-bilgileri-display v-else />
<form-irtibat-bilgileri
v-if="piyangoStore.lotteryApprove === 0 || piyangoStore.lotteryApprove === 3" />
<form-irtibat-bilgileri-display v-else />
<template v-if="piyangoStore.isLotteryForCharity">
<form-piyango-yardim-amacli
v-if="piyangoStore.lotteryApprove === 0 || piyangoStore.lotteryApprove === 3" />
<form-piyango-yardim-amacli-display v-else />
</template>
</div>
<div class="form-inner-content form-inner-content-right">
<div
class="form-part"
v-if="
piyangoStore.lotteryData.amacpiyangoId !== 3 &&
piyangoStore.lotteryApprove !== 12
">
<form-piyango-mecra
v-if="piyangoStore.lotteryApprove === 0 || piyangoStore.lotteryApprove === 3" />
<form-piyango-mecra-display v-else />
</div>
<form-piyango-documents />
</div>
<div
class="form-inner-content"
v-if="
piyangoStore.lotteryData.amacpiyangoId !== 3 && piyangoStore.lotteryApprove !== 12
">
<form-piyango-pictures />
</div>
<div
class="form-inner-content"
v-if="
piyangoStore.lotteryData.amacpiyangoId !== 3 && piyangoStore.lotteryApprove !== 12
">
<form-piyango-ikramiye-listesi
v-if="piyangoStore.lotteryApprove === 0 || piyangoStore.lotteryApprove === 3" />
<form-piyango-ikramiye-listesi-display v-else />
</div>
</div>
</template>
<script setup lang="ts">
import FormPiyangoBilgileri from './form/FormPiyangoBilgileri.vue'
import FormPiyangoBilgileriDisplay from './display/FormPiyangoBilgileriDisplay.vue'
import FormPiyangoDocuments from './form/FormPiyangoDocuments.vue'
import FormPiyangoPictures from './form/FormPiyangoPictures.vue'
import FormIrtibatBilgileri from './form/FormPiyangoIrtibatBilgileri.vue'
import FormIrtibatBilgileriDisplay from './display/FormPiyangoIrtibatBilgileriDisplay.vue'
import FormPiyangoMecra from './form/FormPiyangoMecra.vue'
import FormPiyangoMecraDisplay from './display/FormPiyangoMecraDisplay.vue'
import FormPiyangoIkramiyeListesi from './form/FormPiyangoIkramiyeListesi.vue'
import FormPiyangoIkramiyeListesiDisplay from './display/FormPiyangoIkramiyeListesiDisplay.vue'
import FormPiyangoYardimAmacli from './form/FormPiyangoYardimAmacli.vue'
import FormPiyangoYardimAmacliDisplay from './display/FormPiyangoYardimAmacliDisplay.vue'
import { usePiyangoStore } from '../stores/piyangoStore'
const piyangoStore = usePiyangoStore()
</script>

View File

@ -0,0 +1,47 @@
<template>
<div class="form-content">
<div class="form-inner-content form-inner-content-left">
<form-piyango-bilgileri-display />
<form-piyango-irtibat-bilgileri-display />
<form-piyango-yardim-amacli-display v-if="piyangoStore.isLotteryForCharity" />
</div>
<div class="form-inner-content form-inner-content-right">
<div
class="form-part"
id="display-mecra"
v-if="
piyangoStore.lotteryData.amacpiyangoId !== 3 &&
piyangoStore.lotteryApprove !== 12
">
<form-piyango-mecra-display />
</div>
<form-piyango-documents-display />
</div>
<div
class="form-inner-content"
v-if="
piyangoStore.lotteryData.amacpiyangoId !== 3 && piyangoStore.lotteryApprove !== 12
">
<form-piyango-pictures-display />
</div>
<div
class="form-inner-content"
v-if="
piyangoStore.lotteryData.amacpiyangoId !== 3 && piyangoStore.lotteryApprove !== 12
">
<form-piyango-ikramiye-listesi-display />
</div>
</div>
</template>
<script setup lang="ts">
import FormPiyangoBilgileriDisplay from './display/FormPiyangoBilgileriDisplay.vue'
import FormPiyangoDocumentsDisplay from './display/FormPiyangoDocumentsDisplay.vue'
import FormPiyangoPicturesDisplay from './display/FormPiyangoPicturesDisplay.vue'
import FormPiyangoIrtibatBilgileriDisplay from './display/FormPiyangoIrtibatBilgileriDisplay.vue'
import FormPiyangoMecraDisplay from './display/FormPiyangoMecraDisplay.vue'
import FormPiyangoIkramiyeListesiDisplay from './display/FormPiyangoIkramiyeListesiDisplay.vue'
import FormPiyangoYardimAmacliDisplay from './display/FormPiyangoYardimAmacliDisplay.vue'
import { usePiyangoStore } from '../stores/piyangoStore'
const piyangoStore = usePiyangoStore()
</script>

View File

@ -0,0 +1,109 @@
<template>
<section class="section-list">
<list-table-content
title="İtiraz/Şikayet Listesi"
icon="draws"
:tableHeader="tableHeader"
:rowAction="EditItiraz"
listText="İkramiye"
:addAction="itirazAction()"
:apiList="'Itiraz/Cekilis/' + piyangoStore.selectedLottery"
apiText="İtiraz/Şikayet Listesi"
v-model:refresh="piyangoItirazStore.refreshList" />
</section>
<panel-wrapper
v-if="piyangoItirazStore.itirazPanel"
v-model="piyangoItirazStore.itirazPanel"
:panel-title="
piyangoItirazStore.isUpdate
? 'İtiraz/Şikayet Süreci Düzenle'
: 'İtiraz/Şikayet Süreci Ekle'
">
<template #panelContent>
<panel-piyango-itiraz />
</template>
<template #footerButton>
<div class="button-c button-save" @click="piyangoItirazService.SaveItiraz">
{{ piyangoItirazStore.isUpdate ? 'Kaydet' : 'Ekle' }}
</div>
</template>
</panel-wrapper>
</template>
<script setup lang="ts">
import { ref } from 'vue'
import { useUsersStore } from '@/stores/usersStore'
const usersStore = useUsersStore()
import { useGlobalStore } from '@/stores/globalStore'
const globalStore = useGlobalStore()
import { useDateStore } from '@/stores/dateStore'
const dateStore = useDateStore()
import { usePiyangoItirazStore } from '../stores/piyangoItirazStore'
const piyangoItirazStore = usePiyangoItirazStore()
import { usePiyangoItirazService } from '../service/piyangoItirazService'
const piyangoItirazService = usePiyangoItirazService()
import { usePiyangoStore } from '../stores/piyangoStore'
const piyangoStore = usePiyangoStore()
import PanelPiyangoItiraz from './panel/PanelPiyangoItiraz.vue'
import PanelWrapper from '@/components/PanelWrapper.vue'
const tableHeader = ref<Record<string, any>[]>([
{
name: 'itirazTarihi',
title: 'İtiraz Tarihi',
sort: true,
style: { width: '10%' },
compute: (v: Record<string, any>): string => {
return v.itirazTarihi === null
? ''
: dateStore.dateFormat({ pattern: 'dd-mm-yy', date: v.itirazTarihi })
}
},
{
name: 'itirazEden',
title: 'İtiraz Eden',
sort: true,
style: { width: '15%' }
},
{
name: 'aciklama',
title: 'Açıklama',
sort: true,
style: { width: '20%' }
},
{
name: 'durum',
title: 'Durum',
sort: true
},
{
name: 'surecTipiAdi',
title: 'Süreç Tipi',
sort: true
},
{
name: 'belgeUrl',
title: 'Belge',
computeHtml: (v: Record<string, any>) => {
if (v.belgeUrl !== null && v.belgeUrl !== undefined) {
return globalStore.TableCellDocument(v.belgeUrl)
}
}
}
])
const itirazAction = () => {
if (usersStore.isPanelUser) return NewItiraz as Function
else return ''
}
const NewItiraz = () => {
piyangoItirazStore.ResetForm()
piyangoItirazStore.itirazPanel = true
}
const EditItiraz = (d: Record<string, any>) => {
piyangoItirazStore.isUpdate = true
Object.assign(piyangoItirazStore.piyangoItirazForm, d)
piyangoItirazStore.itirazPanel = true
}
</script>

View File

@ -0,0 +1,40 @@
<template>
<section class="section-list">
<list-table-content
:tableHeader="tableHeader"
icon="draws"
title="Piyango Logları"
listText="Kayıt"
:apiList="'CekilisAtamaLog/Cekilis/' + piyangoStore.selectedLottery"
apiText="Piyango Logları" />
</section>
</template>
<script setup lang="ts">
import { ref } from 'vue'
import { useDateStore } from '@/stores/dateStore'
const dateStore = useDateStore()
import { usePiyangoStore } from '../stores/piyangoStore'
const piyangoStore = usePiyangoStore()
const tableHeader = ref<Record<string, any>[]>([
{
name: 'tarih',
title: 'İşlem Tarihi',
compute: (v: Record<string, any>): string => {
return dateStore.dateFormat({ date: v.tarih })
},
sort: true,
style: { width: '20%' }
},
{
name: 'islemiYapan',
title: 'İşlemi yapan',
sort: true
},
{
name: 'islem',
title: 'İşlem',
sort: true
}
])
</script>

View File

@ -0,0 +1,22 @@
<template>
<div class="form-content">
<div class="form-inner-content form-inner-content-left">
<form-piyango-onay />
</div>
<!--div class="form-inner-content form-inner-content-right">
<div class="form-part">
<form-piyango-onay-kisiler />
</div>
</!--div-->
<div class="form-inner-content">
<div class="form-part">
<form-piyango-onay-log />
</div>
</div>
</div>
</template>
<script setup lang="ts">
import FormPiyangoOnayLog from './form/FormPiyangoOnayLog.vue'
import FormPiyangoOnay from './form/FormPiyangoOnay.vue'
import FormPiyangoOnayKisiler from './form/FormPiyangoOnayKisiler.vue'
</script>

View File

@ -0,0 +1,24 @@
<template>
<div class="form-content">
<div
class="form-inner-content form-inner-content-left"
v-if="
piyangoStore.lotteryApprove === 0 ||
piyangoStore.lotteryApprove === 3
">
<form-piyango-user-onaya-gonder />
</div>
<div class="form-inner-content">
<div class="form-part">
<form-piyango-onay-log />
</div>
</div>
</div>
</template>
<script setup lang="ts">
import { usePiyangoStore } from '../stores/piyangoStore'
const piyangoStore = usePiyangoStore()
import FormPiyangoOnayLog from './form/FormPiyangoOnayLog.vue'
import FormPiyangoUserOnayaGonder from './form/FormPiyangoUserOnayaGonder.vue'
</script>

View File

@ -0,0 +1,16 @@
<template>
<div class="form-content">
<div class="form-inner-content">
<form-piyango-yetkilendirme />
</div>
<div class="form-inner-content">
<div class="form-part">
<form-piyango-yetkilendirme-log />
</div>
</div>
</div>
</template>
<script setup lang="ts">
import FormPiyangoYetkilendirmeLog from './form/FormPiyangoYetkilendirmeLog.vue'
import FormPiyangoYetkilendirme from './form/FormPiyangoYetkilendirme.vue'
</script>

View File

@ -0,0 +1,113 @@
<template>
<template v-if="piyangoStore.lotteryApprove === 0 && loaded">
<div class="form-inner-comment new-d">
Yeni Piyango Başvurusu.
<template v-if="!usersStore.isPanelUser">
<br />
<br />
Başvuru bedeli,
<strong>
{{ muhasebeSettingsStore.muhasebeSettingsForm.basvuruBedeli }} +KDV
</strong>
'dir.
<br />
İdaremizin {{ muhasebeSettingsStore.muhasebeSettingsForm.kurumBanka }} -
{{ muhasebeSettingsStore.muhasebeSettingsForm.kurumBankaSube }}
Şubesi nezdindeki
{{ muhasebeSettingsStore.muhasebeSettingsForm.kurumIBAN }} IBAN numaralı hesabına
<strong>"Başvuru Bedeli"</strong>
ıklamasıyla yatırılacaktır.
</template>
<template v-if="piyangoAmac === 2 && !usersStore.isPanelUser">
<br />
<br />
<strong>"Yardım Amaçlı Piyango Bilet Bilgileri"</strong>
bölümündeki bilgileri doldurmayı unutmayınız.
</template>
</div>
<div class="form-inner-comment alert-d" v-if="!usersStore.isPanelUser">
Bilgilerinizi güncelledikten sonra "Onay Durumu" tabından "Onaya Gönder"meyi
unutmayınız.
</div>
</template>
<div class="form-inner-comment waiting-d" v-if="piyangoStore.lotteryApprove === 1 && loaded">
Başvuru işleme alınmıştır.
</div>
<div class="form-inner-comment waiting-d" v-if="piyangoStore.lotteryApprove === 2">
Başvuru inceleniyor.
</div>
<template v-if="piyangoStore.lotteryApprove === 3">
<div class="form-inner-comment waiting-d">
Bilgi/belge eksik/yanlış, düzenleme bekleniyor.
</div>
<div class="form-inner-comment alert-d" v-if="!usersStore.isPanelUser">
Bilgilerinizi güncelledikten sonra "Onay Durumu" tabından "Onaya Gönder"meyi
unutmayınız.
</div>
</template>
<div class="form-inner-comment success-d" v-if="piyangoStore.lotteryApprove === 4">
Başvuru onaylanmıştır.
</div>
<div class="form-inner-comment alert-d" v-if="piyangoStore.lotteryApprove === 5">
Başvuru uygun görülmemiştir.
</div>
<div class="form-inner-comment waiting-d" v-if="piyangoStore.lotteryApprove === 7">
{{
usersStore.isPanelUser
? 'Üye piyango bilgilerinde değişiklik yapma talebinde bulunmuştur.'
: 'Değişiklik yapma telebinizin değerlendirilmesi bekleniyor.'
}}
</div>
<div class="form-inner-comment waiting-d" v-if="piyangoStore.lotteryApprove === 8">
Başvurunun incelenmesi bekleniyor.
</div>
<div class="form-inner-comment alert-d" v-if="piyangoStore.lotteryApprove === 9">
Başvuru izin öncesi iptal edilmiştir.
</div>
<div class="form-inner-comment success-d" v-if="piyangoStore.lotteryApprove === 10">
Kampanya olumlu sonuçlanmıştır.
</div>
<div class="form-inner-comment alert-d" v-if="piyangoStore.lotteryApprove === 11">
Başvuru izin sonrası iptal edilmiştir.
</div>
<div class="form-inner-comment waiting-d" v-if="piyangoStore.lotteryApprove === 12">
Başvuru kapsam dışıdır.
<template v-if="usersStore.isPanelUser">
<br />
Başvuru admin tarafından kapsam dışı olarak işaretlenmiştir.
</template>
</div>
<div class="form-inner-comment alert-d" v-if="piyangoStore.lotteryApprove === 11">
Kampanya için cezai işlem uygulanmıştır.
</div>
</template>
<script setup lang="ts">
import { ref,onBeforeMount } from 'vue'
import { useUsersStore } from '@/stores/usersStore'
const usersStore = useUsersStore()
import { usePiyangoStore } from '../../stores/piyangoStore'
const piyangoStore = usePiyangoStore()
import { useMuhasebeSettingsStore } from '@/module/muhasebe/store/muhasebeSettingsStore'
const muhasebeSettingsStore = useMuhasebeSettingsStore()
import { useMuhasebeSettingsService } from '@/module/muhasebe/service/muhasebeSettingsService'
const muhasebeSettingsService = useMuhasebeSettingsService()
const loaded = ref<boolean>(false)
const props = defineProps<{
piyangoAmac: number | null
}>()
onBeforeMount(async () => {
await muhasebeSettingsService.GetMuhasebeSettings()
loaded.value = true
})
</script>

View File

@ -0,0 +1,222 @@
<template>
<div class="form-part-content">
<lottery-states
:piyangoAmac="piyangoStore.lotteryData.amacpiyangoId"
v-if="!isPreview" />
<template
v-if="
usersStore.isPanelUser &&
((piyangoStore.lotteryData.basvurubedeldurum !== null &&
piyangoStore.lotteryData.basvurubedeldurum === true) ||
(piyangoStore.lotteryData.izinbedeldurum !== null &&
piyangoStore.lotteryData.izinbedeldurum === true))
">
<form-display
half
v-model="piyangoStore.lotteryData.basvuruBedelNo"
label="Başvuru Bedel No" />
<form-display
half
v-model="piyangoStore.lotteryData.izinBedelNo"
label="İzin Bedel No" />
</template>
<form-display
v-model="piyangoStore.lotteryData.baslik"
label="Piyango Başlığı"
:invalidText="piyangoValidationStore.invalidTexts.baslik" />
<form-display
label="Piyango Amacı"
v-model="piyangoStore.lotteryData.amacpiyango"
:invalidText="piyangoValidationStore.invalidTexts.amacpiyangoId" />
<form-display
v-if="piyangoStore.lotteryData.baglisirketId !== null"
label="Aracı Firma"
v-model="piyangoStore.araciUyeData.sirketUnvan">
<template #button v-if="usersStore.isPanelUser && !isPreview">
<router-link :to="piyangoStore.araciLink" class="button-c">
Aracı Üyeyi Kontrol Et
</router-link>
</template>
</form-display>
<form-display
v-if="usersStore.isPanelUser || !piyangoStore.customerApproved"
label="Piyangoyu Düzenleyen"
:modelText="piyangoStore.UyeName(piyangoStore.duzenleyenData)">
<template #button v-if="!isPreview && piyangoStore.duzenleyenLink !== null">
<router-link :to="piyangoStore.duzenleyenLink" class="button-c">
Üyeyi Kontrol Et
</router-link>
</template>
</form-display>
<div class="form-inner-comment waiting-d" v-if="!piyangoStore.customerApproved">
Yalnızca Onaylanmış Üyeler için piyango düzenlenebilir.
</div>
<template
v-if="
piyangoStore.lotteryData.amacpiyangoId !== 3 && piyangoStore.lotteryApprove !== 12
">
<form-display
v-if="
piyangoStore.lotteryData.kampsamIlStrList.length !==
globalDataStore.ilList.length
"
label="Kapsadığı Yerler"
v-model="piyangoStore.lotterySelectedProvience"
type="array"
:invalidText="piyangoValidationStore.invalidTexts.kapsamIl" />
<form-display
v-else
modelText="Türkiye Geneli"
label="Kapsadığı Yerler"
:invalidText="piyangoValidationStore.invalidTexts.kapsamIl" />
<template v-if="piyangoStore.lotteryData.amacpiyangoId !== 2">
<form-display
half
type="datetime"
v-model="piyangoStore.lotteryData.baslangicTarihi"
label="Kampanya Başlangıç Tarihi ve Saati"
:invalidText="piyangoValidationStore.invalidTexts.baslangicTarihi" />
<form-display
half
required
v-model="piyangoStore.lotteryData.bitisTarihi"
label="Kampanya Bitiş Tarihi ve Saati"
type="datetime"
:invalidText="piyangoValidationStore.invalidTexts.bitisTarihi" />
</template>
<form-display
v-if="piyangoStore.lotteryData.amacpiyangoId !== 2"
v-model="piyangoStore.lotteryData.cekilisSartveSekilleri"
label="Kampanya Katılma Şekil ve Şartları"
:invalidText="piyangoValidationStore.invalidTexts.cekilisSartveSekilleri" />
<form-display
half
type="datetime"
v-model="piyangoStore.lotteryData.cekilisTarihi"
label="Çekiliş Tarihi ve Saati"
:invalidText="piyangoValidationStore.invalidTexts.cekilisTarihi" />
<form-display
v-model="piyangoStore.lotteryData.adres"
:modelText="
piyangoStore.lotteryData.adres +
' ' +
piyangoStore.lotteryData.il +
' ' +
piyangoStore.lotteryData.ilce
"
label="Çekiliş Adresi" />
<form-display
label="Katılımcı Listesinin İçeriği ve Hazırlanma Şekli"
v-model="piyangoStore.lotteryData.katilimListesi"
v-if="piyangoStore.lotteryData.amacpiyangoId !== 2"
:invalidText="piyangoValidationStore.invalidTexts.katilimListesi" />
<form-display
v-if="piyangoStore.lotteryData.amacpiyangoId !== 2"
label="Katılım Listesi Teslim Yöntemi"
v-model="piyangoStore.lotteryData.katilimciListesiTeslimYontemi"
:invalidText="
piyangoValidationStore.invalidTexts.katilimciListesiTeslimYontemiId
" />
<form-display
label="Çekiliş Yöntemi"
v-model="piyangoStore.lotteryData.cekilisYontemi"
:invalidText="piyangoValidationStore.invalidTexts.cekilisYontemiId"
:messages="
piyangoStore.lotteryData.cekilisYontemiId === 1 ? FizikselMessage : []
" />
<form-display
type="date"
half
v-model="piyangoStore.lotteryData.ilantarihi"
label="İlan Tarihi"
:invalidText="piyangoValidationStore.invalidTexts.ilantarihi" />
<form-display
type="date"
v-if="piyangoStore.lotteryData.amacpiyangoId === 2"
half
v-model="piyangoStore.lotteryData.ilantarihi2"
label="2. İlan Tarihi"
:invalidText="piyangoValidationStore.invalidTexts.ilantarihi2" />
<form-display
type="date"
half
v-model="piyangoStore.lotteryData.asilSonBasvuruTarihi"
:invalidText="piyangoValidationStore.invalidTexts.asilSonBasvuruTarihi"
:label="
piyangoStore.lotteryData.amacpiyangoId === 2
? 'Talihlilerin Son Başvuru Tarihi'
: 'Asıl Talihli Son Başvuru Tarihi'
" />
<form-display
type="date"
half
v-model="piyangoStore.lotteryData.yedekSonBasvuruTarihi"
:invalidText="piyangoValidationStore.invalidTexts.yedekSonBasvuruTarihi"
label="Yedek Talihli Son Başvuru Tarihi"
v-if="piyangoStore.lotteryData.amacpiyangoId !== 2" />
<form-display
half
v-model="piyangoStore.lotteryData.ikramiyeTeslimTarihi"
:invalidText="piyangoValidationStore.invalidTexts.ikramiyeTeslimTarihi"
label="İkramiyelerin Son Teslim Tarihi"
type="date" />
<form-display
v-model="piyangoStore.lotteryData.ilanEdilecekGazete"
:invalidText="piyangoValidationStore.invalidTexts.ilanEdilecekGazete"
label="İlan Edilecek Gazete" />
<form-display
:modelText="dataHusular"
:invalidText="piyangoValidationStore.invalidTexts.digerHususlar"
label="Diğer Hususlar"
:messages="digerHususlar" />
</template>
</div>
</template>
<script setup lang="ts">
import { computed, onMounted } from 'vue'
import LotteryStates from '../content/LotteryStates.vue'
import { useUsersStore } from '@/stores/usersStore'
const usersStore = useUsersStore()
import { useGlobalDataStore } from '@/stores/globalDataStore'
const globalDataStore = useGlobalDataStore()
import { usePiyangoStore } from '../../stores/piyangoStore'
const piyangoStore = usePiyangoStore()
import { usePiyangoValidationStore } from '../../validation/piyangoValidationStore'
const piyangoValidationStore = usePiyangoValidationStore()
import { usePiyangoDataStore } from '../../stores/piyangoDataStore'
const piyangoDataStore = usePiyangoDataStore()
export interface Props {
isPreview?: boolean
}
const props = withDefaults(defineProps<Props>(), { isPreview: false })
const dataHusular = computed<string[]>(() => {
return piyangoStore.lotteryData.digerHususlar.split('\n')
})
const digerHususlar = computed<string[]>(() => {
let husus: string[] = piyangoStore.isLotteryForCharity
? piyangoDataStore.digerHusularYardimAmacliTexts
: piyangoDataStore.digerHusularTexts
return husus
})
const FizikselMessage = computed<string[]>(() => {
if (piyangoStore.lotteryData.amacpiyangoId === 2)
return piyangoDataStore.fizikselYardimMessage
else if (piyangoStore.lotteryData.cekilisYontemiId === 1)
return piyangoDataStore.fizikselTicariMessage
else return []
})
onMounted(() => {
setTimeout(() => {
piyangoValidationStore.FormCheck()
}, 100)
})
</script>

View File

@ -0,0 +1,31 @@
<template>
<div :class="['form-part']" id="display-bilgi">
<div class="form-part-title">
<h4>Aracı Firma Bilgileri</h4>
</div>
<div class="form-part-content">
<form-display v-model="piyangoStore.araciUyeData.sirketUnvan" label="Ünvan" />
<form-display half v-model="piyangoStore.araciUyeData.sirketVergiDairesi" label="Vergi Dairesi" />
<form-display half v-model="piyangoStore.araciUyeData.sirketVergiNo" label="Vergi No" />
<form-display half v-model="piyangoStore.araciUyeData.sirketSicilNo" label="Sicil No" />
<form-display half v-model="piyangoStore.araciUyeData.sirketMersis" label="Mersis No" />
<form-display v-model="piyangoStore.araciUyeData.adres" label="Adresi" />
</div>
</div>
</template>
<script setup lang="ts">
import { ref, reactive, onBeforeMount } from 'vue'
import { useDataStore } from '@/stores/dataStore'
const dataStore = useDataStore()
import { useGlobalStore } from '@/stores/globalStore'
const globalStore = useGlobalStore()
import { useUsersStore } from '@/stores/usersStore'
const usersStore = useUsersStore()
import { usePreviewStore } from '@/stores/previewStore'
const previewStore = usePreviewStore()
import { useGlobalDataStore } from '@/stores/globalDataStore'
const globalDataStore = useGlobalDataStore()
import { usePiyangoStore } from '../../stores/piyangoStore'
const piyangoStore = usePiyangoStore()
</script>

View File

@ -0,0 +1,140 @@
<template>
<div :class="['form-part']" id="display-bilgi">
<div class="form-part-title">
<h4>Piyango Bilgileri</h4>
<div class="form-part-title-buttons" v-if="!isPreview">
<button
@click="SendChangeRequest"
v-if="piyangoStore.lotteryApprove === 4 && !usersStore.isPanelUser && loaded">
Değişiklik Talebi Gönder
</button>
<button
@click="OpenPreviewPanel"
v-if="
piyangoStore.lotteryData.amacpiyangoId !== 3 &&
piyangoStore.lotteryApprove !== 12 &&
loaded
">
Önizleme
</button>
</div>
</div>
<piyango-bilgileri-display-content v-if="loaded" :isPreview="isPreview" />
</div>
<panel-wrapper
wide
v-if="previewPanel"
v-model="previewPanel"
panel-title="Piyango Bilgileri Önizleme">
<template #panelContent>
<panel-piyango-yardim-amacli-onizleme
v-model:id="previewId"
v-if="piyangoStore.lotteryData.amacpiyangoId === 2" />
<panel-piyango-onizleme v-model:id="previewId" v-else />
</template>
<template #footerButton>
<div class="button-c button-save" @click="DownloadPDF">PDF İndir</div>
<div class="button-c button-save" @click="PrintContent">Yazdır</div>
</template>
</panel-wrapper>
</template>
<script setup lang="ts">
import { ref, reactive, computed, onBeforeMount } from 'vue'
import { usePDF } from 'vue3-pdfmake'
import { useUsersStore } from '@/stores/usersStore'
const usersStore = useUsersStore()
export interface Props {
isPreview?: boolean
}
const props = withDefaults(defineProps<Props>(), { isPreview: false })
import PanelPiyangoOnizleme from '../panel/PanelPiyangoOnizleme.vue'
import PanelPiyangoYardimAmacliOnizleme from '../panel/PanelPiyangoYardimAmacliOnizleme.vue'
import PanelWrapper from '@/components/PanelWrapper.vue'
import PiyangoBilgileriDisplayContent from '../content/PiyangoBilgileriDisplayContent.vue'
import { useDataStore } from '@/stores/dataStore'
const dataStore = useDataStore()
import { usePreviewStore } from '@/stores/previewStore'
const previewStore = usePreviewStore()
import { usePiyangoStore } from '../../stores/piyangoStore'
const piyangoStore = usePiyangoStore()
import { usePiyangoOnayService } from '../../service/piyangoOnayService'
const piyangoOnayService = usePiyangoOnayService()
import { usePiyangoOnayStore } from '../../stores/piyangoOnayStore'
const piyangoOnayStore = usePiyangoOnayStore()
const loaded = ref<boolean>(false)
const previewPanel = ref<boolean>(false)
const previewId = ref<number>(0)
const GetData = async () => {
piyangoStore.ResetLotteryContent()
let data = await dataStore.dataGet(
'CekilisBilgi/Cekilis/' + piyangoStore.selectedLottery
)
if (data !== 'errorfalse') {
Object.assign(piyangoStore.lotteryData, data)
piyangoStore.lotterySelectedProvience =
piyangoStore.lotteryData.kampsamIlStrList.join(', ')
await GetDuzenleyen()
if (piyangoStore.lotteryData.baglisirketId !== null) await GetAraciUye()
piyangoStore.lotteryIlanTarihi = piyangoStore.lotteryData.ilantarihi
piyangoStore.lotteryCreationDate = piyangoStore.lotteryData.olusturmaTarihi
setTimeout(() => {
loaded.value = true
}, 30)
}
}
const GetDuzenleyen = async () => {
let data = await dataStore.dataGet(
'Auth/userbyuserid/' + piyangoStore.lotteryData.duzenleyenId
)
if (data !== 'errorfalse') {
Object.assign(piyangoStore.duzenleyenData, data)
piyangoStore.customerApproved = data.islemTipi === 4
}
}
const GetAraciUye = async () => {
let data = await dataStore.dataGet(
'Auth/userbyuserid/' + piyangoStore.lotteryData.baglisirketId
)
if (data !== 'errorfalse') {
Object.assign(piyangoStore.araciUyeData, data)
}
}
const OpenPreviewPanel = () => {
previewPanel.value = true
}
const pdfmake = usePDF()
const DownloadPDF = async () => {
var pdfData: string = document.querySelector('.pdf-content')?.outerHTML || ''
previewStore.CreatePdfFromHtml(pdfmake, pdfData)
}
const PrintContent = () => {
previewStore.PrintContent(previewId.value)
}
const SendChangeRequest = async () => {
piyangoOnayStore.piyangoOnayForm.onayDurumuIslemTipiId = 7
piyangoOnayStore.piyangoOnayForm.file = ''
piyangoOnayStore.piyangoOnayForm.aciklama = ''
await piyangoOnayService.SaveOnayDurum()
}
onBeforeMount(async () => {
await dataStore.GetIlList()
await GetData()
})
</script>

View File

@ -0,0 +1,40 @@
<template>
<div class="form-part">
<div class="form-part-title">
<h4>Gerekli Dokümanlar</h4>
</div>
<div class="form-part-content" v-if="piyangoDocumentStore.loaded">
<template v-if="piyangoDocumentStore.piyangoDocumentsList.length > 0">
<template v-for="(file, i) in piyangoDocumentStore.piyangoDocumentsList">
<file-list-item
:editable="false"
:data="file"
title="dokumanAdi"
:filePath="file.url" />
</template>
</template>
<template v-else>
<div class="form-inner-comment" v-if="usersStore.isPanelUser">
Eklenmiş dosya bulunamadı.
</div>
<div v-else>
Eklenmiş dosya bulunamadı. Üstteki butonu kullanarak dosya ekleyebilirsiniz.
</div>
</template>
</div>
</div>
</template>
<script setup lang="ts">
import { ref, onBeforeMount } from 'vue'
import { useUsersStore } from '@/stores/usersStore'
const usersStore = useUsersStore()
import { usePiyangoDocumentStore } from '../../stores/piyangoDocumentStore'
const piyangoDocumentStore = usePiyangoDocumentStore()
import { usePiyangoDocumentService } from '../../service/piyangoDocumentService'
const piyangoDocumentService = usePiyangoDocumentService()
onBeforeMount(async () => {
await piyangoDocumentService.GetDocumentList()
})
</script>

View File

@ -0,0 +1,94 @@
<template>
<div :class="['form-part']" id="display-bilgi">
<div class="form-part-title">
<h4>Piyangoyu Düzenleyen Bilgileri</h4>
</div>
<div class="form-part-content">
<template v-if="piyangoStore.duzenleyenData.basvuruTipId === 18">
<form-display half v-model="piyangoStore.duzenleyenData.gercekAdi" label="Ad" />
<form-display
half
v-model="piyangoStore.duzenleyenData.gercekSoyadi"
label="Soyadı" />
<form-display
half
v-model="piyangoStore.duzenleyenData.gercekTCKN"
label="TCKN" />
<form-display
half
v-model="piyangoStore.duzenleyenData.gercekVergiDairesi"
label="Vergi Dairesi" />
<form-display
half
v-model="piyangoStore.duzenleyenData.gercekVergiNo"
label="Vergi No" />
<form-display
half
v-model="piyangoStore.duzenleyenData.gercekOdaKayitNo"
label="Oda Kayıt No/ Ticaret Sicil No" />
<form-display
half
v-model="piyangoStore.duzenleyenData.gercekTicariUnvan"
label="Ticari Ünvan" />
</template>
<template v-if="piyangoStore.duzenleyenData.basvuruTipId === 21">
<form-display v-model="piyangoStore.duzenleyenData.tuzelUnvan" label="Ünvan" />
<form-display
half
v-model="piyangoStore.duzenleyenData.tuzelVergiDairesi"
label="Vergi Dairesi" />
<form-display
half
v-model="piyangoStore.duzenleyenData.tuzelVergiNo"
label="Vergi No" />
<form-display
half
v-model="piyangoStore.duzenleyenData.tuzelSicilNo"
label="Sicil No" />
<div class="form-item form-item-half"></div>
</template>
<template v-if="piyangoStore.duzenleyenData.basvuruTipId === 22">
<form-display v-model="piyangoStore.duzenleyenData.dernekUnvan" label="Ünvan" />
<form-display
half
v-model="piyangoStore.duzenleyenData.dernekVergiDairesi"
label="Vergi Dairesi" />
<form-display
half
v-model="piyangoStore.duzenleyenData.dernekVergiNo"
label="Vergi No" />
<form-display
half
v-model="piyangoStore.duzenleyenData.dernekSicilNo"
label="Sicil No" />
<div class="form-item form-item-half"></div>
</template>
<template v-if="piyangoStore.duzenleyenData.basvuruTipId === 26">
<form-display v-model="piyangoStore.duzenleyenData.kamuUnvan" label="Ünvan" />
<form-display
half
v-model="piyangoStore.duzenleyenData.kamuVergiDairesi"
label="Vergi Dairesi" />
<form-display
half
v-model="piyangoStore.duzenleyenData.kamuVergiNo"
label="Vergi No" />
<form-display
half
v-model="piyangoStore.duzenleyenData.kamuSicilNo"
label="Sicil No" />
<div class="form-item form-item-half"></div>
</template>
<form-display v-model="piyangoStore.duzenleyenData.adres" label="Adresi" />
</div>
</div>
</template>
<script setup lang="ts">
import { useGlobalDataStore } from '@/stores/globalDataStore'
const globalDataStore = useGlobalDataStore()
import { usePiyangoStore } from '../../stores/piyangoStore'
const piyangoStore = usePiyangoStore()
</script>

View File

@ -0,0 +1,116 @@
<template>
<div class="form-part section-list" id="display-ikramiye" v-if="!isPreview">
<list-table-content
v-if="piyangoIkramiyeStore.loaded"
title="İkramiye Listesi"
icon="draws"
:tableHeader="ikramiyeTableHeader"
listText="İkramiye"
addAction=""
:apiList="'Ikramiye/Cekilis/' + piyangoStore.selectedLottery"
rowNumber
:totalValues="piyangoIkramiyeStore.totalIkramiyeValues" />
</div>
<template v-else>
<list-table-content
v-if="piyangoIkramiyeStore.loaded"
formTitle="İkramiye Listesi"
:tableHeader="ikramiyeTableHeader"
listText="İkramiye"
addAction=""
:apiList="'Ikramiye/Cekilis/' + piyangoStore.selectedLottery"
rowNumber
:totalValues="piyangoIkramiyeStore.totalIkramiyeValues"
page="form"
:isPreview="isPreview" />
</template>
</template>
<script setup lang="ts">
import { ref, reactive, onBeforeMount, watch } from 'vue'
import { useGlobalStore } from '@/stores/globalStore'
const globalStore = useGlobalStore()
import { usePiyangoStore } from '../../stores/piyangoStore'
const piyangoStore = usePiyangoStore()
import { usePiyangoServices } from '../../service/piyangoServices'
const piyangoServices = usePiyangoServices()
import { usePiyangoIkramiyeStore } from '../../stores/piyangoIkramiyeStore'
const piyangoIkramiyeStore = usePiyangoIkramiyeStore()
import { usePiyangoIkramiyeService } from '../../service/piyangoIkramiyeService'
const piyangoIkramiyeService = usePiyangoIkramiyeService()
export interface Props {
isPreview?: boolean
}
const props = withDefaults(defineProps<Props>(), { isPreview: false })
const loaded = ref<boolean>(false)
const ikramiyeTableHeader = ref<Record<string, any>>([
{
name: 'cinsi',
title: 'Cinsi, Markası, Modeli',
computeHtml: (v: Record<string, any>): string => {
return `${v.cinsi}, ${v.marka}, ${v.model}`
},
style: { width: '20%' }
},
{
name: 'birimFiyat',
title: 'Birim Değeri (KDV+ÖTV Dahil)',
sort: true,
price: true,
computeHtml: (v: Record<string, any>): string => {
if (v.paraBirimi !== null)
return `${globalStore.toTrLocale(v.birimFiyat)} ${
v.paraBirimi.paraBirimiSembol
}`
else return globalStore.toTrLocale(v.birimFiyat)
},
style: { width: '10%' }
},
{
name: 'asilTalihliAdedi',
title: piyangoStore.isLotteryForCharity ? 'Talihli Adedi' : 'Asil Talihli Adedi',
sort: true
},
{
name: 'toplamDeger',
title: 'Toplam Değer',
sort: true,
price: true,
compute: (v: Record<string, any>): string => {
if (v.paraBirimi !== null)
return `${globalStore.toTrLocale(v.toplamDeger)} ${
v.paraBirimi.paraBirimiSembol
}`
else return globalStore.toTrLocale(v.toplamDeger)
}
}
])
const TableHeaderColumns = () =>{
if (!piyangoStore.isLotteryForCharity) {
ikramiyeTableHeader.value.push({
name: 'yedekTalihliAdedi',
title: 'Yedek Talihli Adedi',
sort: true
})
}
}
onBeforeMount(async () => {
piyangoIkramiyeStore.loaded = false
await piyangoServices.GetParaBirimleri()
TableHeaderColumns()
piyangoIkramiyeStore.loaded = true
})
watch(
() => piyangoStore.isLotteryForCharity,
() => {
TableHeaderColumns()
}
)
</script>

View File

@ -0,0 +1,54 @@
<template>
<div :class="['form-part']" id="display-irtibat">
<div class="form-part-title">
<h4>İrtibat Bilgileri</h4>
</div>
<div class="form-part-content" v-if="loaded">
<form-display
v-model="piyangoContactStore.contactData.adSoyad"
label="Adı ve Soyadı"
half />
<form-display v-model="piyangoContactStore.contactData.unvan" label="Ünvanı" half />
<form-display
half
v-model="piyangoContactStore.contactData.telefonNumarasi"
label="Telefon Numarası" />
<form-display
half
v-model="piyangoContactStore.contactData.faksNumarasi"
label="Faks Numarası" />
<form-display
half
v-model="piyangoContactStore.contactData.eposta"
label="E-posta adresi" />
</div>
</div>
</template>
<script setup lang="ts">
import { ref, onBeforeMount } from 'vue'
import { useDataStore } from '@/stores/dataStore'
const dataStore = useDataStore()
import { usePiyangoStore } from '../../stores/piyangoStore'
const piyangoStore = usePiyangoStore()
import { usePiyangoContactStore } from '../../stores/piyangoContactStore'
const piyangoContactStore = usePiyangoContactStore()
const loaded = ref<boolean>(false)
const GetData = async () => {
loaded.value = false
let dt = await dataStore.dataGet(
'IrtibatBilgi/GetIrtibatBilgiCekilis/' + piyangoStore.selectedLottery
)
if (dt !== 'errorfalse') {
Object.assign(piyangoContactStore.contactData, dt)
}
setTimeout(()=>{
loaded.value = true
},30)
}
onBeforeMount(async () => {
await GetData()
})
</script>

View File

@ -0,0 +1,29 @@
<template>
<list-table-content
:tableHeader="tableHeader"
formTitle="İlan Edilecek Diğer Mecralar"
listText="Mecra"
addAction=""
:apiList="'Mecra/Cekilis/' + piyangoStore.selectedLottery"
page="form"
:isPreview="isPreview" />
</template>
<script setup lang="ts">
import { ref } from 'vue'
import { usePiyangoStore } from '../../stores/piyangoStore'
const piyangoStore = usePiyangoStore()
export interface Props {
isPreview?: boolean
}
const props = withDefaults(defineProps<Props>(), { isPreview: false })
const tableHeader = ref<Record<string, any>>([
{
name: 'mecraAdi',
title: 'Mecra Adı',
sort: props.isPreview ? false : true
}
])
</script>

View File

@ -0,0 +1,39 @@
<template>
<div class="form-part">
<div class="form-part-title">
<h4>Piyango Resimleri</h4>
</div>
<div class="form-part-content">
<template v-for="(file, i) in fileList">
<file-list-item
:data="file"
onlyPreview
:editable="false"
:filePath="file.resimYolu" />
</template>
<div v-if="usersStore.isPanelUser && fileList.length === 0" class="form-inner-comment">
Eklenmiş resim bulunamadı.
</div>
</div>
</div>
</template>
<script setup lang="ts">
import { ref, onBeforeMount } from 'vue'
import { useDataStore } from '@/stores/dataStore'
const dataStore = useDataStore()
import { useUsersStore } from '@/stores/usersStore'
const usersStore = useUsersStore()
import { usePiyangoStore } from '../../stores/piyangoStore'
const piyangoStore = usePiyangoStore()
const fileList = ref<Record<string,any>[]>([])
const GetData = async () => {
let dt = await dataStore.dataGet('CekilisResim/Cekilis/' + piyangoStore.selectedLottery)
if (dt !== 'errorfalse') fileList.value.splice(0, fileList.value.length, ...dt.data)
}
onBeforeMount(async () => {
await GetData()
})
</script>

View File

@ -0,0 +1,102 @@
<template>
<div class="form-part form-title" v-if="usersStore.isPanelUser">
<div class="form-title-buttons">
<button
class="button-c button-save"
@click="piyangoTeminatService.SaveTeminatDurum"
:disabled="!piyangoTeminatValidationStore.formChanged">
Kaydet
</button>
<button
v-if="piyangoTeminatValidationStore.formChanged"
class="button-c button-cancel panel-close"
@click="piyangoTeminatStore.ResetFormData">
Vazgeç
</button>
</div>
</div>
<div :class="['form-part', piyangoTeminatValidationStore.formChanged ? 'changed' : '']"> <div
class="form-part-content"
v-if="piyangoTeminatStore.loaded">
<form-select
v-if="usersStore.isPanelUser"
label="İşlem"
:listData="piyangoDataStore.piyangoTeminatDurumlari"
listText="value"
listVal="id"
v-model="piyangoTeminatStore.piyangoTeminatFormData.state"
required
:invalidText="piyangoTeminatValidationStore.invalidTexts.state"
@change="OnKeyup" />
<form-display
v-model="piyangoTeminatStore.piyangoTeminatFormData.amount"
half
label="Tutarı" />
<form-display
v-model="piyangoTeminatStore.piyangoTeminatFormData.teminatParentTypeText"
half
label="Para Birimi" />
<form-display
label="Teminat Türü"
half
v-model="piyangoTeminatStore.piyangoTeminatFormData.teminantChildTypeText" />
<form-display
type="date"
half
v-model="piyangoTeminatStore.piyangoTeminatFormData.teminantDate"
label="Tarih" />
<form-display
v-model="piyangoTeminatStore.piyangoTeminatFormData.teminantNo"
half
label="No" />
<div class="form-item form-item-half"></div>
<form-display
v-model="piyangoTeminatStore.piyangoTeminatFormData.bankName"
half
label="Banka Adı" />
<form-display
v-model="piyangoTeminatStore.piyangoTeminatFormData.bankBranch"
half
label="Banka Şubesi" />
<!--form-display
label="İşlem"
v-model="piyangoTeminatStore.piyangoTeminatFormData.stateText" /-->
<file-list-item
title="Dosya"
:data="piyangoTeminatStore.piyangoTeminatFormData"
:editable="false"
:filePath="piyangoTeminatStore.piyangoTeminatFormData.teminantDocumentUrl"
:usePath="true"
:onlyPreview="true" />
<form-display
v-model="piyangoTeminatStore.piyangoTeminatFormData.description"
label="Açıklama" />
</div></div>
</template>
<script setup lang="ts">
import { usePiyangoTeminatStore } from '../../stores/piyangoTeminatStore'
const piyangoTeminatStore = usePiyangoTeminatStore()
import { useUsersStore } from '@/stores/usersStore'
const usersStore = useUsersStore()
import { usePiyangoDataStore } from '../../stores/piyangoDataStore'
const piyangoDataStore = usePiyangoDataStore()
import { usePiyangoTeminatValidationStore } from '../../validation/piyangoTeminatValidationStore'
const piyangoTeminatValidationStore = usePiyangoTeminatValidationStore()
import { usePiyangoTeminatService } from '../../service/piyangoTeminatService'
const piyangoTeminatService = usePiyangoTeminatService()
const OnKeyup = () => {
piyangoTeminatValidationStore.formChanged = true
}
</script>

View File

@ -0,0 +1,127 @@
<template>
<div :class="['form-part']" id="display-yardimamacli">
<div class="form-part-title">
<h4>Yardım Amaçlı Piyango Bilet Bilgileri</h4>
</div>
<div class="form-part-content" v-if="piyangoYardimAmacliStore.loaded">
<div class="list-wrapper">
<table
:class="[
'table-border table-colored table-list',
!piyangoYardimAmacliValidationStore.isFormValid ? 'invalid' : ''
]">
<thead>
<tr>
<th>
<div class="table-head-content">
<span></span>
</div>
</th>
<th>
<div class="table-head-content">
<span>Başlangıç Numarası</span>
</div>
</th>
<th>
<div class="table-head-content">
<span>Bitiş Numarası</span>
</div>
</th>
<th>
<div class="table-head-content">
<span>Basılacak Adet</span>
</div>
</th>
</tr>
</thead>
<tbody>
<template v-for="(rakam, i) in piyangoYardimAmacliStore.yardimAmacliRakamlar">
<tr
v-if="
piyangoYardimAmacliStore.piyangoYardimAmacliFormData[
rakam.prefix + 'RakamBaslangic'
] !== null &&
piyangoYardimAmacliStore.piyangoYardimAmacliFormData[
rakam.prefix + 'RakamBitis'
] !== null &&
piyangoYardimAmacliStore.piyangoYardimAmacliFormData[
rakam.prefix + 'RakamAdet'
] !== null
">
<td>{{ rakam.title }}</td>
<td>
<form-display
v-model="
piyangoYardimAmacliStore.piyangoYardimAmacliFormData[
rakam.prefix + 'RakamBaslangic'
]
" />
</td>
<td>
<form-display
v-model="
piyangoYardimAmacliStore.piyangoYardimAmacliFormData[
rakam.prefix + 'RakamBitis'
]
" />
</td>
<td>
<form-display
v-model="
piyangoYardimAmacliStore.piyangoYardimAmacliFormData[
rakam.prefix + 'RakamAdet'
]
" />
</td>
</tr>
</template>
<tr>
<td colspan="3" style="text-align:right"><strong>Toplam Basılacak Bilet:</strong></td>
<td>{{ globalStore.toTrLocale(piyangoYardimAmacliStore.toplamBilet) }}</td>
</tr>
</tbody>
</table>
<div
class="form-inner-comment alert-d"
v-if="!piyangoYardimAmacliValidationStore.isFormValid">
<template
v-for="msg in piyangoYardimAmacliValidationStore.biletInvalidMessages">
{{ msg }}
<br />
</template>
</div>
</div>
<div class="form-item"></div>
<form-display
v-model="piyangoYardimAmacliStore.piyangoYardimAmacliFormData.birimSatisFiyati"
label="Birim Satış Fiyatı (₺)" />
<form-display
v-model="piyangoYardimAmacliStore.piyangoYardimAmacliFormData.basimevi"
label="Basımevinin Adı" />
<form-display
v-model="piyangoYardimAmacliStore.piyangoYardimAmacliFormData.basimeviAdresi"
label="Basımevinin Adresi" />
</div>
</div>
</template>
<script setup lang="ts">
import { onBeforeMount } from 'vue'
import { useGlobalStore } from '@/stores/globalStore'
const globalStore = useGlobalStore()
import { usePiyangoYardimAmacliStore } from '../../stores/piyangoYardimAmacliStore'
const piyangoYardimAmacliStore = usePiyangoYardimAmacliStore()
import { usePiyangoYardimAmacliValidationStore } from '../../validation/piyangoYardimAmacliValidationStore'
const piyangoYardimAmacliValidationStore = usePiyangoYardimAmacliValidationStore()
import { usePiyangoYardimAmacliService } from '../../service/piyangoYardimAmacliService'
const piyangoYardimAmacliService = usePiyangoYardimAmacliService()
onBeforeMount(async () => {
await piyangoYardimAmacliService.GetYardimAmacliData()
piyangoYardimAmacliValidationStore.CheckBiletEmpty()
if (!piyangoYardimAmacliValidationStore.allBiletInvalid) {
piyangoYardimAmacliValidationStore.CheckBiletSatir()
}
})
</script>

View File

@ -0,0 +1,705 @@
<template>
<strong
style="
display: inline-block;
width: 100%;
font-size: 13pt;
margin-bottom: 12px;
text-align: center;
">
MİLLİ PİYANGO İDARESİ GENEL MÜDÜRLÜĞÜ
<br />
Bahisler ve Oyunlar Dairesi Başkanlığına
</strong>
<br />
<div style="display: inline-block; width: 100%; font-size: 10pt">
Şirketimizce/Kuruluşumuzca
<strong>{{ piyangoStore.lotteryData.amacpiyango }}</strong>
düzenlemek üzere, aşağıda belirtilen koşullarda piyango düzenlemek üzere gerekli iznin
verilmesi hususunda bilgilerinizi ve gereğini arz ederiz.
<br />
<br />
</div>
<strong style="font-size: 10pt; margin-bottom: 12px">
PİYANGO İLE İLGİLİ BİLGİLER
</strong>
<table
cellspacing="0"
class="table-no-line"
data-pdfmake="{'widths': [ '50%', '50%'],'layout':'pdfTableLayoutNoLine'}">
<tbody>
<tr>
<td colspan="2">
<strong style="font-size: 10pt; margin-bottom: 12px">
1- Piyangoyu Düzenleyenin
</strong>
</td>
</tr>
</tbody>
</table>
<template v-if="loaded">
<table
cellspacing="0"
data-pdfmake="{'widths': [ '50%', '50%'],'layout':'pdfTableLayout'}"
style="margin-bottom: 12px; font-size: 10pt">
<tbody>
<template v-if="piyangoStore.duzenleyenData.basvuruTipId === 18">
<tr>
<td colspan="2">
<strong>Adı/Soyadı:</strong>
{{
piyangoStore.duzenleyenData.unvan ||
piyangoStore.duzenleyenData.gercekAdi +
' ' +
piyangoStore.duzenleyenData.gercekSoyadi
}}
</td>
</tr>
<tr>
<td colspan="2">
<strong>Ticari Ünvanı:</strong>
{{
piyangoStore.duzenleyenData.unvan ||
piyangoStore.duzenleyenData.gercekTicariUnvan
}}
</td>
</tr>
</template>
<template v-if="piyangoStore.duzenleyenData.basvuruTipId === 21">
<tr>
<td colspan="2">
<strong>Ünvanı:</strong>
{{
piyangoStore.duzenleyenData.unvan ||
piyangoStore.duzenleyenData.tuzelUnvan
}}
</td>
</tr>
</template>
<template v-if="piyangoStore.duzenleyenData.basvuruTipId === 22">
<tr>
<td colspan="2">
<strong>Ünvanı:</strong>
{{
piyangoStore.duzenleyenData.unvan ||
piyangoStore.duzenleyenData.dernekUnvan
}}
</td>
</tr>
</template>
<template v-if="piyangoStore.duzenleyenData.basvuruTipId === 26">
<tr>
<td colspan="2">
<strong>Ünvanı:</strong>
{{
piyangoStore.duzenleyenData.unvan || piyangoStore.duzenleyenData.kamuUnvan
}}
</td>
</tr>
</template>
<tr>
<td colspan="2">
<strong>Adresi:</strong>
{{ piyangoStore.duzenleyenData.adres }}
</td>
</tr>
<template v-if="piyangoStore.duzenleyenData.basvuruTipId === 18">
<tr>
<td colspan="2">
<strong>Bağlı Bulunduğu Oda Kayıt No/ Ticaret Sicil No:</strong>
{{ piyangoStore.duzenleyenData.gercekOdaKayitNo }}
</td>
</tr>
<tr>
<td colspan="2">
<strong>Bağlı Bulunduğu Vergi Dairesi/Numarası:</strong>
{{ piyangoStore.duzenleyenData.gercekVergiDairesi }} /
{{ piyangoStore.duzenleyenData.gercekVergiNo }}
</td>
</tr>
<tr>
<td colspan="2">
<strong>TCKN:</strong>
{{ piyangoStore.duzenleyenData.gercekTCKN }}
</td>
</tr>
</template>
<template v-if="piyangoStore.duzenleyenData.basvuruTipId === 21">
<tr>
<td colspan="2">
<strong>Ticaret Sicil No:</strong>
{{ piyangoStore.duzenleyenData.tuzelSicilNo }}
</td>
</tr>
<tr>
<td colspan="2">
<strong>Bağlı Bulunduğu Vergi Dairesi/Numarası:</strong>
{{ piyangoStore.duzenleyenData.tuzelVergiDairesi }} /
{{ piyangoStore.duzenleyenData.tuzelVergiNo }}
</td>
</tr>
</template>
<template v-if="piyangoStore.duzenleyenData.basvuruTipId === 22">
<tr>
<td colspan="2">
<strong>Sicil No:</strong>
{{ piyangoStore.duzenleyenData.dernekSicilNo }}
</td>
</tr>
<tr>
<td colspan="2">
<strong>Bağlı Bulunduğu Vergi Dairesi/Numarası:</strong>
{{ piyangoStore.duzenleyenData.dernekVergiDairesi }} /
{{ piyangoStore.duzenleyenData.dernekVergiNo }}
</td>
</tr>
</template>
<template v-if="piyangoStore.duzenleyenData.basvuruTipId === 26">
<tr>
<td colspan="2">
<strong>Sicil No:</strong>
{{ piyangoStore.duzenleyenData.kamuSicilNo }}
</td>
</tr>
<tr>
<td colspan="2">
<strong>Bağlı Bulunduğu Vergi Dairesi/Numarası:</strong>
{{ piyangoStore.duzenleyenData.kamuVergiDairesi }} /
{{ piyangoStore.duzenleyenData.kamuVergiNo }}
</td>
</tr>
</template>
<tr>
<td colspan="2">
<strong>İrtibat Kurulacak Kişi Adı Soyadı:</strong>
{{ customerIrtibatStore.customerIrtibatForm.firstName }}
{{ customerIrtibatStore.customerIrtibatForm.lastName }}
</td>
</tr>
<tr>
<td colspan="2">
<strong>İrtibat Telefon Numarası:</strong>
{{ customerIrtibatStore.customerIrtibatForm.phone }}
</td>
</tr>
</tbody>
</table>
<template v-if="piyangoStore.lotteryData.baglisirketId !== null">
<table
cellspacing="0"
class="table-no-line"
data-pdfmake="{'widths': [ '50%', '50%'],'layout':'pdfTableLayoutNoLine'}"
style="font-size: 10pt">
<tbody>
<tr>
<td colspan="2">
<strong class="title" style="font-size: 10pt; margin-bottom: 12px">
Piyangoyu Yürütenin:
</strong>
</td>
</tr>
</tbody>
</table>
<table
cellspacing="0"
data-pdfmake="{'widths': [ '50%', '50%'],'layout':'pdfTableLayout'}"
style="font-size: 10pt">
<tbody>
<tr>
<td colspan="2">
<strong>Ünvanı:</strong>
{{ piyangoStore.araciUyeData.sirketUnvan }}
</td>
</tr>
<tr>
<td colspan="2">
<strong>Adresi:</strong>
{{ piyangoStore.araciUyeData.adres }}
</td>
</tr>
<tr>
<td colspan="2">
<strong>Bağlı Bulunduğu Vergi Dairesi/Numarası:</strong>
{{ piyangoStore.araciUyeData.sirketVergiDairesi }} /
{{ piyangoStore.araciUyeData.sirketVergiNo }}
</td>
</tr>
<tr>
<td colspan="2">
<strong>Ticaret Sicil No:</strong>
{{ piyangoStore.araciUyeData.sirketSicilNo }}
</td>
</tr>
</tbody>
</table>
</template>
<table
cellspacing="0"
class="table-no-line"
data-pdfmake="{'widths': [ '50%', '50%'],'layout':'pdfTableLayoutNoLine'}"
style="font-size: 10pt">
<tbody>
<tr>
<td colspan="2">
<strong class="title" style="font-size: 10pt; margin-bottom: 12px">
2- Kampanyanın:
</strong>
</td>
</tr>
</tbody>
</table>
<table
cellspacing="0"
data-pdfmake="{'widths': [ '50%', '50%'],'layout':'pdfTableLayout'}"
style="margin-bottom: 12px; font-size: 10pt">
<tbody>
<tr>
<td>
<strong>Kampanya Başlangıç Tarihi ve Saati:</strong>
<br />
{{
dateStore.dateFormat({
date: piyangoStore.lotteryData.baslangicTarihi,
pattern: 'dd-mm-yy-t'
})
}}
</td>
<td>
<strong>Kampanya Bitiş Tarihi ve Saati:</strong>
<br />
{{
dateStore.dateFormat({
date: piyangoStore.lotteryData.bitisTarihi,
pattern: 'dd-mm-yy-t'
})
}}
</td>
</tr>
<tr>
<td colspan="2">
<strong>Kapsadığı Yerler:</strong>
{{
piyangoStore.lotteryData.kampsamIlStrList.length ===
globalDataStore.ilList.length
? 'Türkiye Geneli'
: piyangoStore.lotterySelectedProvience
}}
</td>
</tr>
</tbody>
</table>
<table
cellspacing="0"
class="table-no-line"
data-pdfmake="{'widths': [ '50%', '50%'],'layout':'pdfTableLayoutNoLine'}"
style="font-size: 10pt">
<tbody>
<tr>
<td colspan="2">
<strong class="title" style="font-size: 10pt; margin-bottom: 12px">
3-Çekilişe katılma şekil ve şartları:
</strong>
</td>
</tr>
</tbody>
</table>
<table
cellspacing="0"
data-pdfmake="{'widths': [ '50%', '50%'],'layout':'pdfTableLayout'}"
style="margin-bottom: 12px; font-size: 10pt">
<tbody>
<tr>
<td colspan="2">
{{ piyangoStore.lotteryData.cekilisSartveSekilleri }}
</td>
</tr>
<tr>
<td colspan="2">
<strong>Katılımcı Listesinin İçeriği ve Hazırlanma Şekli:</strong>
{{ piyangoStore.lotteryData.katilimListesi }}
</td>
</tr>
</tbody>
</table>
<table
cellspacing="0"
class="table-no-line"
data-pdfmake="{'widths': [ '50%', '50%'],'layout':'pdfTableLayoutNoLine'}"
style="font-size: 10pt">
<tbody>
<tr>
<td colspan="2">
<strong class="title" style="font-size: 10pt; margin-bottom: 12px">
4-Çekilişin;
</strong>
</td>
</tr>
</tbody>
</table>
<table
cellspacing="0"
data-pdfmake="{'widths': [ '50%', '50%'],'layout':'pdfTableLayout'}"
style="margin-bottom: 12px; font-size: 10pt">
<tbody>
<tr>
<td colspan="2">
<strong>Tarihi ve saati:</strong>
{{
dateStore.dateFormat({
date: piyangoStore.lotteryData.cekilisTarihi,
pattern: 'dd-mm-yy-t'
})
}}
</td>
</tr>
<tr>
<td colspan="2">
<strong>ık adresi:</strong>
{{
piyangoStore.lotteryData.adres +
' ' +
piyangoStore.lotteryData.il +
' ' +
piyangoStore.lotteryData.ilce
}}
</td>
</tr>
<tr>
<td colspan="2">
<strong>Ne şekilde yapılacağı:</strong>
{{ piyangoStore.lotteryData.cekilisYontemi }}
<div
style="margin-top: 16px"
v-if="piyangoStore.lotteryData.cekilisYontemiId === 1">
<span v-for="txt in piyangoDataStore.fizikselTicariMessage">
{{ txt }}
<br />
</span>
</div>
</td>
</tr>
</tbody>
</table>
<table
cellspacing="0"
class="table-no-line"
data-pdfmake="{'widths': [ '50%', '50%'],'layout':'pdfTableLayoutNoLine'}"
style="font-size: 10pt">
<tbody>
<tr>
<td colspan="2">
<strong class="title" style="font-size: 10pt; margin-bottom: 12px">
5-Çekiliş sonuçlarının ilan edileceği gazetenin:
</strong>
</td>
</tr>
</tbody>
</table>
<table
cellspacing="0"
data-pdfmake="{'widths': [ '50%', '50%'],'layout':'pdfTableLayout'}"
style="margin-bottom: 12px; font-size: 10pt">
<tbody>
<tr>
<td colspan="2">
<strong>Adı:</strong>
{{ piyangoStore.lotteryData.ilanEdilecekGazete }}
</td>
</tr>
<tr>
<td>
<strong>Tarihi:</strong>
{{
dateStore.dateFormat({
date: piyangoStore.lotteryData.ilantarihi,
pattern: 'dd-mm-yy'
})
}}
</td>
<td></td>
</tr>
<tr v-if="piyangoMecraStore.piyangoAllMecraData.length > 0">
<td colspan="2">
Ayrıca, çekiliş sonuçları
<strong>
<template v-for="(mecra, i) in piyangoMecraStore.piyangoAllMecraData">
{{ mecra.mecraAdi
}}{{ i !== piyangoMecraStore.piyangoAllMecraData.length - 1 ? ', ' : '' }}
</template>
</strong>
{{
piyangoMecraStore.piyangoAllMecraData.length > 1
? 'mecralarında'
: 'mecrasında'
}}
ilan edilecektir.
</td>
</tr>
<tr>
<td colspan="2">
Çekilişten sonra asil ve yedek talihlilerin adreslerine aynı anda taahhütlü
posta kanalıyla tebligat yapılacaktır.
</td>
</tr>
</tbody>
</table>
<table
cellspacing="0"
data-pdfmake="{'widths': [ '50%', '50%'],'layout':'pdfTableLayout'}"
style="margin-bottom: 12px; font-size: 10pt">
<tbody>
<tr>
<td colspan="2">
<strong>6-Asil talihlilerin son başvuru tarihi:</strong>
{{
dateStore.dateFormat({
date: piyangoStore.lotteryData.asilSonBasvuruTarihi,
pattern: 'dd-mm-yy'
})
}}
</td>
</tr>
<tr>
<td colspan="2">
<strong>Yedek talihlilerin son başvuru tarihi:</strong>
{{
dateStore.dateFormat({
date: piyangoStore.lotteryData.yedekSonBasvuruTarihi,
pattern: 'dd-mm-yy'
})
}}
</td>
</tr>
<tr>
<td colspan="2">
<strong>İkramiyelerin son teslim edilme/kullanma tarihleri:</strong>
{{
dateStore.dateFormat({
date: piyangoStore.lotteryData.ikramiyeTeslimTarihi,
pattern: 'dd-mm-yy'
})
}}
</td>
</tr>
</tbody>
</table>
<table
cellspacing="0"
class="table-no-line"
data-pdfmake="{'widths': [ '50%', '50%'],'layout':'pdfTableLayoutNoLine'}"
style="font-size: 10pt">
<tbody>
<tr>
<td colspan="2">
<strong class="title" style="font-size: 10pt; margin-bottom: 12px">
7-Diğer hususlar:
</strong>
</td>
</tr>
</tbody>
</table>
<table
cellspacing="0"
data-pdfmake="{'widths': [ '50%', '50%'],'layout':'pdfTableLayout'}"
style="margin-bottom: 12px; font-size: 10pt">
<tbody>
<tr>
<td colspan="2">
<div>
<span v-for="txt in digerHususlar">
{{ txt }}
<br />
</span>
</div>
<div style="margin-top: 16px">
<span v-for="txt in piyangoDataStore.digerHusularTexts">
{{ txt }}
<br />
</span>
</div>
</td>
</tr>
</tbody>
</table>
<table
cellspacing="0"
class="table-no-line"
data-pdfmake="{'widths': [ '50%', '50%'],'layout':'pdfTableLayoutNoLine'}"
style="font-size: 10pt">
<tbody>
<tr>
<td colspan="2">
<strong class="title" style="font-size: 10pt; margin-bottom: 12px">
8-Piyangoya konu ikramiyeler:
</strong>
</td>
</tr>
</tbody>
</table>
<table
cellspacing="0"
data-pdfmake="{'widths': ['10%', '30%', '15%', '15%', '15%', '15%'],'layout': 'pdfTableLayout'}"
style="margin-bottom: 12px; font-size: 10pt"
v-if="piyangoIkramiyeStore.piyangoAllIkramiyeData.length > 0">
<tbody>
<tr>
<td><strong>Sıra No</strong></td>
<td><strong>Cinsi, Markası, Modeli</strong></td>
<td><strong>Birim Değeri (KDV+ÖTV Dahil)</strong></td>
<td>
<strong>Asil Talihli Adedi</strong>
</td>
<td><strong>Toplam Değer</strong></td>
<td><strong>Yedek Talihli Adedi</strong></td>
</tr>
<template v-for="(item, i) in piyangoIkramiyeStore.piyangoAllIkramiyeData">
<tr>
<td>{{ i + 1 }}</td>
<td>{{ `${item.cinsi}, ${item.marka}, ${item.model}` }}</td>
<td>
{{
item.paraBirimi !== null
? `${globalStore.toTrLocale(item.birimFiyat)} ${
item.paraBirimi.paraBirimiSembol
}`
: globalStore.toTrLocale(item.birimFiyat)
}}
</td>
<td>{{ item.asilTalihliAdedi }}</td>
<td>
{{
item.paraBirimi !== null
? `${globalStore.toTrLocale(item.toplamDeger)} ${
item.paraBirimi.paraBirimiSembol
}`
: globalStore.toTrLocale(item.toplamDeger)
}}
</td>
<td>
{{ item.yedekTalihliAdedi }}
</td>
</tr>
</template>
<tr>
<td colspan="3" style="text-align: right"><strong>TOPLAM:</strong></td>
<td>{{ piyangoIkramiyeStore.piyangoAllIkramiyeTotals.asilTalihliAdedi }}</td>
<td>
{{
`${globalStore.toTrLocale(
piyangoIkramiyeStore.piyangoAllIkramiyeTotals.toplamDeger
)} ${piyangoIkramiyeStore.piyangoAllIkramiyeParaBirimi}`
}}
</td>
<td>{{ piyangoIkramiyeStore.piyangoAllIkramiyeTotals.yedekTalihliAdedi }}</td>
</tr>
</tbody>
</table>
<table
cellspacing="0"
class="table-no-line"
data-pdfmake="{'widths': [ '50%', '30%','20%'],'layout':'pdfTableLayoutNoLine'}"
style="margin-bottom: 12px; font-size: 10pt">
<tbody>
<tr>
<td>
<strong>İrtibat Tel. No:</strong>
{{ piyangoContactStore.contactData.telefonNumarasi }}
</td>
<td></td>
<td>
Tarih:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/
</td>
</tr>
<tr>
<td>
<strong>İrtibat Faks No:</strong>
{{ piyangoContactStore.contactData.faksNumarasi }}
</td>
<td></td>
<td>İMZA/KAŞE</td>
</tr>
<tr>
<td>
<strong>İrtibat Kurulacak İlgilinin Adı/Soyadı:</strong>
{{ piyangoContactStore.contactData.adSoyad }}
</td>
<td></td>
<td></td>
</tr>
<tr>
<td></td>
<td></td>
<td></td>
</tr>
</tbody>
</table>
</template>
</template>
<script setup lang="ts">
import { ref, onBeforeMount, computed } from 'vue'
import { useGlobalStore } from '@/stores/globalStore'
const globalStore = useGlobalStore()
import { useDataStore } from '@/stores/dataStore'
const dataStore = useDataStore()
import { useGlobalDataStore } from '@/stores/globalDataStore'
const globalDataStore = useGlobalDataStore()
import { useDateStore } from '@/stores/dateStore'
const dateStore = useDateStore()
import { usePiyangoStore } from '../../stores/piyangoStore'
const piyangoStore = usePiyangoStore()
import { usePiyangoContactStore } from '../../stores/piyangoContactStore'
const piyangoContactStore = usePiyangoContactStore()
import { usePiyangoMecraStore } from '../../stores/piyangoMecraStore'
const piyangoMecraStore = usePiyangoMecraStore()
import { usePiyangoMecraService } from '../../service/piyangoMecraService'
const piyangoMecraService = usePiyangoMecraService()
import { usePiyangoIkramiyeStore } from '../../stores/piyangoIkramiyeStore'
const piyangoIkramiyeStore = usePiyangoIkramiyeStore()
import { usePiyangoIkramiyeService } from '../../service/piyangoIkramiyeService'
const piyangoIkramiyeService = usePiyangoIkramiyeService()
import { useCustomerIrtibatStore } from '@/module/uyeler/stores/customerIrtibatStore'
const customerIrtibatStore = useCustomerIrtibatStore()
import { useCustomerIrtibatService } from '@/module/uyeler/service/customerIrtibatService'
const customerIrtibatService = useCustomerIrtibatService()
import { usePiyangoDataStore } from '../../stores/piyangoDataStore'
const piyangoDataStore = usePiyangoDataStore()
const loaded = ref(false)
const digerHususlar = computed<string[]>(() => {
return piyangoStore.lotteryData.digerHususlar.split('\n')
})
onBeforeMount(async () => {
await piyangoMecraService.GetAllMecralar()
await customerIrtibatService.GetIrtibat(piyangoStore.duzenleyenData.id)
await piyangoIkramiyeService.GetAllIkramiyeler()
await dataStore.GetIlList()
setTimeout(() => {
loaded.value = true
}, 30)
})
</script>

View File

@ -0,0 +1,642 @@
<template>
<strong
style="
display: inline-block;
width: 100%;
font-size: 14pt;
margin-bottom: 12px;
text-align: center;
">
MİLLİ PİYANGO İDARESİ GENEL MÜDÜRLÜĞÜ
<br />
Bahisler ve Oyunlar Dairesi Başkanlığına
</strong>
<br />
<table
cellspacing="0"
class="table-no-line"
data-pdfmake="{'widths': [ '50%', '50%'],'layout':'pdfTableLayoutNoLine'}">
<tbody>
<tr>
<td colspan="2">
<strong style="font-size: 10pt; margin-bottom: 12px">
1- Piyangoyu Düzenleyenin:
</strong>
</td>
</tr>
</tbody>
</table>
<template v-if="loaded">
<table
cellspacing="0"
data-pdfmake="{'widths': [ '50%', '50%'],'layout':'pdfTableLayout'}"
style="margin-bottom: 12px; font-size: 10pt">
<tbody>
<template v-if="piyangoStore.duzenleyenData.basvuruTipId === 18">
<tr>
<td colspan="2">
<strong>Adı/Soyadı:</strong>
{{ piyangoStore.duzenleyenData.gercekAdi }}
{{ piyangoStore.duzenleyenData.gercekSoyadi }}
</td>
</tr>
<tr>
<td colspan="2">
<strong>Ticari Ünvanı:</strong>
{{ piyangoStore.duzenleyenData.gercekTicariUnvan }}
</td>
</tr>
</template>
<template v-if="piyangoStore.duzenleyenData.basvuruTipId === 21">
<tr>
<td colspan="2">
<strong>Ünvanı:</strong>
{{ piyangoStore.duzenleyenData.tuzelUnvan }}
</td>
</tr>
</template>
<template v-if="piyangoStore.duzenleyenData.basvuruTipId === 22">
<tr>
<td colspan="2">
<strong>Ünvanı:</strong>
{{ piyangoStore.duzenleyenData.dernekUnvan }}
</td>
</tr>
</template>
<template v-if="piyangoStore.duzenleyenData.basvuruTipId === 26">
<tr>
<td colspan="2">
<strong>Ünvanı:</strong>
{{ piyangoStore.duzenleyenData.kamuUnvan }}
</td>
</tr>
</template>
<tr>
<td colspan="2">
<strong>Adresi:</strong>
{{ piyangoStore.duzenleyenData.adres }}
</td>
</tr>
<template v-if="piyangoStore.duzenleyenData.basvuruTipId === 18">
<tr>
<td colspan="2">
<strong>Bağlı Bulunduğu Oda Kayıt No/ Ticaret Sicil No:</strong>
{{ piyangoStore.duzenleyenData.gercekOdaKayitNo }}
</td>
</tr>
<tr>
<td colspan="2">
<strong>Bağlı Bulunduğu Vergi Dairesi/Numarası:</strong>
{{ piyangoStore.duzenleyenData.gercekVergiDairesi }} /
{{ piyangoStore.duzenleyenData.gercekVergiNo }}
</td>
</tr>
<tr>
<td colspan="2">
<strong>TCKN:</strong>
{{ piyangoStore.duzenleyenData.gercekTCKN }}
</td>
</tr>
</template>
<template v-if="piyangoStore.duzenleyenData.basvuruTipId === 21">
<tr>
<td colspan="2">
<strong>Ticaret Sicil No:</strong>
{{ piyangoStore.duzenleyenData.tuzelSicilNo }}
</td>
</tr>
<tr>
<td colspan="2">
<strong>Bağlı Bulunduğu Vergi Dairesi/Numarası:</strong>
{{ piyangoStore.duzenleyenData.tuzelVergiDairesi }} /
{{ piyangoStore.duzenleyenData.tuzelVergiNo }}
</td>
</tr>
</template>
<template v-if="piyangoStore.duzenleyenData.basvuruTipId === 22">
<tr>
<td colspan="2">
<strong>Sicil No:</strong>
{{ piyangoStore.duzenleyenData.dernekSicilNo }}
</td>
</tr>
<tr>
<td colspan="2">
<strong>Bağlı Bulunduğu Vergi Dairesi/Numarası:</strong>
{{ piyangoStore.duzenleyenData.dernekVergiDairesi }} /
{{ piyangoStore.duzenleyenData.dernekVergiNo }}
</td>
</tr>
</template>
<template v-if="piyangoStore.duzenleyenData.basvuruTipId === 26">
<tr>
<td colspan="2">
<strong>Sicil No:</strong>
{{ piyangoStore.duzenleyenData.kamuSicilNo }}
</td>
</tr>
<tr>
<td colspan="2">
<strong>Bağlı Bulunduğu Vergi Dairesi/Numarası:</strong>
{{ piyangoStore.duzenleyenData.kamuVergiDairesi }} /
{{ piyangoStore.duzenleyenData.kamuVergiNo }}
</td>
</tr>
</template>
</tbody>
</table>
<table
cellspacing="0"
class="table-no-line"
data-pdfmake="{'widths': [ '50%', '50%'],'layout':'pdfTableLayoutNoLine'}"
style="font-size: 10pt">
<tbody>
<tr>
<td colspan="2">
<strong class="title" style="font-size: 10pt; margin-bottom: 12px">
2- Piyangonun Geçerli Olduğu Yerler:
</strong>
</td>
</tr>
</tbody>
</table>
<table
cellspacing="0"
data-pdfmake="{'widths': [ '50%', '50%'],'layout':'pdfTableLayout'}"
style="margin-bottom: 12px; font-size: 10pt">
<tbody>
<tr>
<td colspan="2">
{{
piyangoStore.lotteryData.kampsamIlStrList.length ===
globalDataStore.ilList.length
? 'Türkiye Geneli'
: piyangoStore.lotterySelectedProvience
}}
</td>
</tr>
</tbody>
</table>
<table
cellspacing="0"
class="table-no-line"
data-pdfmake="{'widths': [ '50%', '50%'],'layout':'pdfTableLayoutNoLine'}"
style="font-size: 10pt">
<tbody>
<tr>
<td colspan="2">
<strong class="title" style="font-size: 10pt; margin-bottom: 12px">
3- Basılacak Biletlerin:
</strong>
</td>
</tr>
</tbody>
</table>
<table
data-pdfmake="{'widths': [ '31%', '23%' , '23%' , '23%' ],'layout':'pdfTableLayout'}"
style="margin-bottom: 12px; font-size: 10pt">
<thead>
<tr>
<th></th>
<th>Başlangıç Numarası</th>
<th>Bitiş Numarası</th>
<th>Basılacak Adet</th>
</tr>
</thead>
<tbody>
<template v-for="(rakam, i) in piyangoYardimAmacliStore.yardimAmacliRakamlar">
<tr
v-if="
piyangoYardimAmacliStore.piyangoYardimAmacliFormData[
rakam.prefix + 'RakamBaslangic'
] !== null &&
piyangoYardimAmacliStore.piyangoYardimAmacliFormData[
rakam.prefix + 'RakamBitis'
] !== null &&
piyangoYardimAmacliStore.piyangoYardimAmacliFormData[
rakam.prefix + 'RakamAdet'
] !== null
">
<td>{{ rakam.title }}</td>
<td>
{{
globalStore.toTrLocale(
piyangoYardimAmacliStore.piyangoYardimAmacliFormData[
rakam.prefix + 'RakamBaslangic'
]
)
}}
</td>
<td>
{{
globalStore.toTrLocale(
piyangoYardimAmacliStore.piyangoYardimAmacliFormData[
rakam.prefix + 'RakamBitis'
]
)
}}
</td>
<td>
{{
globalStore.toTrLocale(
piyangoYardimAmacliStore.piyangoYardimAmacliFormData[
rakam.prefix + 'RakamAdet'
]
)
}}
</td>
</tr>
</template>
<tr>
<td colspan="3" style="text-align: right">
<strong>Toplam Basılacak Bilet:</strong>
</td>
<td>{{ globalStore.toTrLocale(piyangoYardimAmacliStore.toplamBilet) }}</td>
</tr>
<tr>
<td colspan="4">
<strong>Bilet Satış Fiyatı:</strong>
{{ piyangoYardimAmacliStore.piyangoYardimAmacliFormData.birimSatisFiyati }} ₺
</td>
</tr>
</tbody>
</table>
<table
cellspacing="0"
class="table-no-line"
data-pdfmake="{'widths': [ '50%', '50%'],'layout':'pdfTableLayoutNoLine'}"
style="font-size: 10pt">
<tbody>
<tr>
<td colspan="2">
<strong class="title" style="font-size: 10pt; margin-bottom: 12px">
4- Biletlerin Basımı
</strong>
</td>
</tr>
</tbody>
</table>
<table
data-pdfmake="{'widths': [ '50%', '50%' ],'layout':'pdfTableLayout'}"
style="margin-bottom: 12px; font-size: 10pt">
<tbody>
<tr>
<td colspan="2">
<strong>Basımevinin Adı:</strong>
{{ piyangoYardimAmacliStore.piyangoYardimAmacliFormData.basimevi }}
</td>
</tr>
<tr>
<td colspan="2">
<strong>Basımevinin Adresi:</strong>
{{ piyangoYardimAmacliStore.piyangoYardimAmacliFormData.basimeviAdresi }}
</td>
</tr>
</tbody>
</table>
<table
cellspacing="0"
class="table-no-line"
data-pdfmake="{'widths': [ '50%', '50%'],'layout':'pdfTableLayoutNoLine'}"
style="font-size: 10pt">
<tbody>
<tr>
<td colspan="2">
<strong class="title" style="font-size: 10pt; margin-bottom: 12px">
5- Çekiliş Tarih, Saati ve Adresi:
</strong>
</td>
</tr>
</tbody>
</table>
<table
cellspacing="0"
data-pdfmake="{'widths': [ '50%', '50%'],'layout':'pdfTableLayout'}"
style="margin-bottom: 12px; font-size: 10pt">
<tbody>
<tr>
<td colspan="2">
<strong>Tarihi ve saati:</strong>
{{
dateStore.dateFormat({
date: piyangoStore.lotteryData.cekilisTarihi,
pattern: 'dd-mm-yy-t'
})
}}
</td>
</tr>
<tr>
<td colspan="2">
<strong>Açık adresi:</strong>
{{
piyangoStore.lotteryData.adres +
' ' +
piyangoStore.lotteryData.il +
' ' +
piyangoStore.lotteryData.ilce
}}
</td>
</tr>
<tr>
<td colspan="2">
<strong>Ne şekilde yapılacağı:</strong>
{{ piyangoStore.lotteryData.cekilisYontemi }}
<div
style="margin-top: 16px"
v-if="piyangoStore.lotteryData.cekilisYontemiId === 1">
<span v-for="txt in piyangoDataStore.fizikselYardimMessage">
{{ txt }}
<br />
</span>
</div>
</td>
</tr>
</tbody>
</table>
<table
cellspacing="0"
class="table-no-line"
data-pdfmake="{'widths': [ '50%', '50%'],'layout':'pdfTableLayoutNoLine'}"
style="font-size: 10pt">
<tbody>
<tr>
<td colspan="2">
<strong class="title" style="font-size: 10pt; margin-bottom: 12px">
6- İkramiye Kazananların İlanı:
</strong>
</td>
</tr>
</tbody>
</table>
<table
cellspacing="0"
data-pdfmake="{'widths': [ '50%', '50%'],'layout':'pdfTableLayout'}"
style="margin-bottom: 12px; font-size: 10pt">
<tbody>
<tr>
<td colspan="2">
<strong>Adı:</strong>
{{ piyangoStore.lotteryData.ilanEdilecekGazete }}
</td>
</tr>
<tr>
<td>
<strong>Tarihi:</strong>
{{
dateStore.dateFormat({
date: piyangoStore.lotteryData.ilantarihi,
pattern: 'dd-mm-yy'
})
}}
</td>
<td>
<strong>2. İlan Tarihi:</strong>
{{
dateStore.dateFormat({
date: piyangoStore.lotteryData.ilantarihi2,
pattern: 'dd-mm-yy'
})
}}
</td>
</tr>
<tr v-if="piyangoMecraStore.piyangoAllMecraData.length > 0">
<td colspan="2">
Ayrıca, çekiliş sonuçları
<strong>
<template v-for="(mecra, i) in piyangoMecraStore.piyangoAllMecraData">
{{ mecra.mecraAdi
}}{{ i !== piyangoMecraStore.piyangoAllMecraData.length - 1 ? ', ' : '' }}
</template>
</strong>
{{
piyangoMecraStore.piyangoAllMecraData.length > 1
? 'mecralarında'
: 'mecrasında'
}}
ilan edilecektir.
</td>
</tr>
</tbody>
</table>
<table
cellspacing="0"
class="table-no-line"
data-pdfmake="{'widths': [ '50%', '50%'],'layout':'pdfTableLayoutNoLine'}"
style="font-size: 10pt">
<tbody>
<tr>
<td colspan="2">
<strong class="title" style="font-size: 10pt; margin-bottom: 12px">
7- Talihlilerin Başvuru Tarihi:
</strong>
</td>
</tr>
</tbody>
</table>
<table
cellspacing="0"
data-pdfmake="{'widths': [ '50%', '50%'],'layout':'pdfTableLayout'}"
style="margin-bottom: 12px; font-size: 10pt">
<tbody>
<tr>
<td colspan="2">
<strong>Talihlilerin son başvuru tarihi:</strong>
{{
dateStore.dateFormat({
date: piyangoStore.lotteryData.asilSonBasvuruTarihi,
pattern: 'dd-mm-yy'
})
}}
</td>
</tr>
<tr>
<td colspan="2">
<strong>İkramiyelerin son teslim tarihi:</strong>
{{
dateStore.dateFormat({
date: piyangoStore.lotteryData.ikramiyeTeslimTarihi,
pattern: 'dd-mm-yy'
})
}}
</td>
</tr>
</tbody>
</table>
<table
cellspacing="0"
class="table-no-line"
data-pdfmake="{'widths': [ '50%', '50%'],'layout':'pdfTableLayoutNoLine'}"
style="font-size: 10pt">
<tbody>
<tr>
<td colspan="2">
<strong class="title" style="font-size: 10pt; margin-bottom: 12px">
8- Diğer Hususlar:
</strong>
</td>
</tr>
</tbody>
</table>
<table
cellspacing="0"
data-pdfmake="{'widths': [ '50%', '50%'],'layout':'pdfTableLayout'}"
style="margin-bottom: 12px; font-size: 10pt">
<tbody>
<tr>
<td colspan="2">
<div>
<span v-for="txt in digerHususlar">
{{ txt }}
<br />
</span>
</div>
<div style="margin-top: 16px">
<span v-for="txt in piyangoDataStore.digerHusularYardimAmacliTexts">
{{ txt }}
<br />
</span>
</div>
</td>
</tr>
</tbody>
</table>
<table
cellspacing="0"
class="table-no-line"
data-pdfmake="{'widths': [ '50%', '50%'],'layout':'pdfTableLayoutNoLine'}"
style="font-size: 10pt">
<tbody>
<tr>
<td colspan="2">
<strong class="title" style="font-size: 10pt; margin-bottom: 12px">
9-Piyangoya Konu İkramiyeler:
</strong>
</td>
</tr>
</tbody>
</table>
<table
cellspacing="0"
data-pdfmake="{'widths': ['10%', '45%', '15%', '15%', '15%'],'layout': 'pdfTableLayout'}"
style="margin-bottom: 12px; font-size: 10pt"
v-if="piyangoIkramiyeStore.piyangoAllIkramiyeData.length > 0">
<thead>
<tr>
<th><strong>Sıra No</strong></th>
<th><strong>Cinsi, Markası, Modeli</strong></th>
<th><strong>Birim Değeri (KDV+ÖTV Dahil)</strong></th>
<th>
<strong>Talihli Adedi</strong>
</th>
<th><strong>Toplam Değer</strong></th>
</tr>
</thead>
<tbody>
<template v-for="(item, i) in piyangoIkramiyeStore.piyangoAllIkramiyeData">
<tr>
<td>{{ i + 1 }}</td>
<td>{{ `${item.cinsi}, ${item.marka}, ${item.model}` }}</td>
<td>
{{
item.paraBirimi !== null
? `${globalStore.toTrLocale(item.birimFiyat)} ${
item.paraBirimi.paraBirimiSembol
}`
: globalStore.toTrLocale(item.birimFiyat)
}}
</td>
<td>{{ item.asilTalihliAdedi }}</td>
<td>
{{
item.paraBirimi !== null
? `${globalStore.toTrLocale(item.toplamDeger)} ${
item.paraBirimi.paraBirimiSembol
}`
: globalStore.toTrLocale(item.toplamDeger)
}}
</td>
</tr>
</template>
<tr>
<td colspan="3" style="text-align: right"><strong>TOPLAM:</strong></td>
<td>{{ piyangoIkramiyeStore.piyangoAllIkramiyeTotals.asilTalihliAdedi }}</td>
<td>
{{
`${globalStore.toTrLocale(
piyangoIkramiyeStore.piyangoAllIkramiyeTotals.toplamDeger
)} ${piyangoIkramiyeStore.piyangoAllIkramiyeParaBirimi}`
}}
</td>
</tr>
</tbody>
</table>
</template>
</template>
<script setup lang="ts">
import { ref, onBeforeMount, computed } from 'vue'
import { useGlobalStore } from '@/stores/globalStore'
const globalStore = useGlobalStore()
import { useDataStore } from '@/stores/dataStore'
const dataStore = useDataStore()
import { useGlobalDataStore } from '@/stores/globalDataStore'
const globalDataStore = useGlobalDataStore()
import { useDateStore } from '@/stores/dateStore'
const dateStore = useDateStore()
import { usePiyangoStore } from '../../stores/piyangoStore'
const piyangoStore = usePiyangoStore()
import { usePiyangoContactStore } from '../../stores/piyangoContactStore'
const piyangoContactStore = usePiyangoContactStore()
import { usePiyangoMecraStore } from '../../stores/piyangoMecraStore'
const piyangoMecraStore = usePiyangoMecraStore()
import { usePiyangoMecraService } from '../../service/piyangoMecraService'
const piyangoMecraService = usePiyangoMecraService()
import { usePiyangoIkramiyeStore } from '../../stores/piyangoIkramiyeStore'
const piyangoIkramiyeStore = usePiyangoIkramiyeStore()
import { usePiyangoIkramiyeService } from '../../service/piyangoIkramiyeService'
const piyangoIkramiyeService = usePiyangoIkramiyeService()
import { useCustomerIrtibatStore } from '@/module/uyeler/stores/customerIrtibatStore'
const customerIrtibatStore = useCustomerIrtibatStore()
import { useCustomerIrtibatService } from '@/module/uyeler/service/customerIrtibatService'
const customerIrtibatService = useCustomerIrtibatService()
import { usePiyangoDataStore } from '../../stores/piyangoDataStore'
const piyangoDataStore = usePiyangoDataStore()
import { usePiyangoYardimAmacliStore } from '../../stores/piyangoYardimAmacliStore'
const piyangoYardimAmacliStore = usePiyangoYardimAmacliStore()
const loaded = ref(false)
const digerHususlar = computed<string[]>(() => {
return piyangoStore.lotteryData.digerHususlar.split('\n')
})
onBeforeMount(async () => {
await piyangoMecraService.GetAllMecralar()
await customerIrtibatService.GetIrtibat(piyangoStore.duzenleyenData.id)
await piyangoIkramiyeService.GetAllIkramiyeler()
await dataStore.GetIlList()
loaded.value = true
})
</script>

View File

@ -0,0 +1,645 @@
<template>
<div class="form-part form-title" v-if="piyangoStore.isNew">
<div class="form-title-buttons">
<div
class="button-c button-save"
@click="SaveData"
v-if="
!usersStore.isPanelUser &&
(!usersStore.isAraciFirma ||
(usersStore.isAraciFirma && piyangoStore.customerApproved))
">
Başvur
</div>
<router-link class="button-c button-cancel" to="/piyangolar/piyango-listesi">
Vazgeç
</router-link>
</div>
</div>
<div :class="['form-part', formChanged && !piyangoStore.isNew ? 'changed' : '']">
<div class="form-part-title">
<h4>Piyango Bilgileri</h4>
<div class="form-part-title-buttons" v-if="!usersStore.isPanelUser && !formChanged">
<button
@click="OpenPreviewPanel"
v-if="
piyangoStore.lotteryData.amacpiyangoId !== 3 && !piyangoStore.isNew && loaded
">
Önizleme
</button>
</div>
</div>
<div class="form-part-content" v-if="loaded">
<lottery-states :piyangoAmac="piyangoStore.lotteryData.amacpiyangoId" />
<form-input
modelKey="cekilisBaslik"
v-model="piyangoStore.lotteryData.baslik"
required
label="Piyango Başlığı"
placeholder="Piyango Başlığı"
:invalidText="piyangoValidationStore.invalidTexts.baslik"
@keyup="OnKeyup" />
<form-select
v-if="amacRefresh"
:disabled="usersStore.isVakifDernek || piyangoStore.subCustomerType === 22"
label="Piyango Amacı"
:listData="piyangoAmaclari"
listText="amacAdi"
listVal="id"
v-model="piyangoStore.lotteryData.amacpiyangoId"
required
:invalidText="piyangoValidationStore.invalidTexts.amacpiyangoId"
@change="OnAmacChange" />
<template v-if="usersStore.isAraciFirma">
<form-select
label="Piyangoyu Düzenleyen"
:listData="childUsers"
listText="username"
listVal="id"
v-model="piyangoStore.lotteryData.duzenleyenId"
required
:invalidText="piyangoValidationStore.invalidTexts.duzenleyenId"
@change="OnAraciFirmaChange">
<template #activator="data">
{{
data.activatorData !== undefined &&
piyangoValidationStore.invalidTexts.baglisirketId !== null
? data.activatorData.unvan + ' - ' + data.activatorData.basvuruTipi
: 'Lütfen Seçim Yapınız'
}}
</template>
<template #option="data">
{{ data.optionData.unvan + ' - ' + data.optionData.basvuruTipi }}
</template>
<template #button v-if="piyangoStore.lotteryData.duzenleyenId !== null">
<router-link
:to="
'/uyeler/detay/' +
piyangoStore.lotteryData.baglisirketId +
'/yetkili-uye/detay/' +
piyangoStore.lotteryData.duzenleyenId
"
class="button-c">
Üyeyi Kontrol Et
</router-link>
</template>
</form-select>
<div
class="flx flx-jc-sb flx-ai-c form-inner-comment waiting-d"
v-if="
piyangoStore.lotteryData.duzenleyenId !== null &&
!piyangoStore.customerApproved
">
Yalnızca Onaylanmış Üyeler için piyango düzenlenebilir.
</div>
</template>
<template
v-if="
piyangoStore.lotteryData.amacpiyangoId !== 3 &&
piyangoStore.lotteryApprove !== 12
">
<form-textarea
v-if="piyangoStore.lotteryData.amacpiyangoId !== 2"
v-model="piyangoStore.lotteryData.cekilisSartveSekilleri"
required
label="Kampanya Katılma Şekil ve Şartları"
:invalidText="piyangoValidationStore.invalidTexts.cekilisSartveSekilleri"
@keyup="OnKeyup" />
<form-select
label="Kapsadığı Yerler"
:listData="globalDataStore.ilList"
listText="ad"
listVal="id"
v-model="piyangoStore.lotteryData.kapsamIl"
required
:invalidText="piyangoValidationStore.invalidTexts.kapsamIl"
multiple
@change="OnKeyup"
multipleText="Türkiye Geneli" />
<template v-if="piyangoStore.lotteryData.amacpiyangoId !== 2">
<form-date
half
required
modelKey="baslangicTarihi"
v-model="piyangoStore.lotteryData.baslangicTarihi"
label="Kampanya Başlangıç Tarihi ve Saati"
:min="piyangoValidationStore.baslangicTarihiMin"
:invalidText="piyangoValidationStore.invalidTexts.baslangicTarihi"
@change="OnKeyupDate" />
<form-date
half
required
modelKey="bitisTarihi"
v-model="piyangoStore.lotteryData.bitisTarihi"
label="Kampanya Bitiş Tarihi ve Saati"
:invalidText="piyangoValidationStore.invalidTexts.bitisTarihi"
:min="piyangoValidationStore.kampanyaBitisMin"
:max="piyangoValidationStore.kampanyaBitisMax"
:disabled="piyangoValidationStore.kampanyaBitisDisabled"
@change="OnKeyup" />
</template>
<form-date
half
required
modelKey="cekilisTarihi"
v-model="piyangoStore.lotteryData.cekilisTarihi"
label="Çekiliş Tarihi ve Saati"
:invalidText="piyangoValidationStore.invalidTexts.cekilisTarihi"
:disabled="piyangoValidationStore.cekilisTarihiDisabled"
:min="piyangoValidationStore.cekilisTarihiMin"
@change="OnKeyup" />
<div
class="form-item form-item-half"
v-if="piyangoStore.lotteryData.amacpiyangoId === 2"></div>
<form-date
type="date"
half
required
modelKey="ilantarihi"
v-model="piyangoStore.lotteryData.ilantarihi"
label="İlan Tarihi"
:invalidText="piyangoValidationStore.invalidTexts.ilantarihi"
:disabled="piyangoValidationStore.ilanTarihiDisabled"
:min="piyangoValidationStore.ilanTarihiMin"
:max="piyangoValidationStore.ilanTarihiMax"
@change="OnKeyup" />
<form-date
type="date"
v-if="piyangoStore.lotteryData.amacpiyangoId === 2"
half
required
modelKey="ilantarihi2"
v-model="piyangoStore.lotteryData.ilantarihi2"
label="2. İlan Tarihi"
:invalidText="piyangoValidationStore.invalidTexts.ilantarihi2"
:disabled="piyangoValidationStore.ilanTarihi2Disabled"
:min="piyangoValidationStore.ilanTarihi2Min"
:max="piyangoValidationStore.ilanTarihi2Max"
@change="OnKeyup" />
<form-date
type="date"
half
required
modelKey="asilSonBasvuruTarihi"
v-model="piyangoStore.lotteryData.asilSonBasvuruTarihi"
:label="
piyangoStore.lotteryData.amacpiyangoId === 2
? 'Talihlilerin Son Başvuru Tarihi'
: 'Asıl Talihli Son Başvuru Tarihi'
"
:invalidText="piyangoValidationStore.invalidTexts.asilSonBasvuruTarihi"
:disabled="piyangoValidationStore.asilSonBasvuruDisabled"
:min="piyangoValidationStore.asilSonBasvuruMin"
:max="piyangoValidationStore.asilSonBasvuruMax"
@change="OnKeyup" />
<form-date
v-if="piyangoStore.lotteryData.amacpiyangoId !== 2"
type="date"
half
required
modelKey="yedekSonBasvuruTarihi"
v-model="piyangoStore.lotteryData.yedekSonBasvuruTarihi"
label="Yedek Talihli Son Başvuru Tarihi"
:invalidText="piyangoValidationStore.invalidTexts.yedekSonBasvuruTarihi"
:disabled="piyangoValidationStore.yedekSonBasvuruDisabled"
:min="piyangoValidationStore.yedekSonBasvuruMin"
:max="piyangoValidationStore.yedekSonBasvuruMax"
@change="OnKeyup" />
<form-date
half
required
type="date"
modelKey="ikramiyeTeslimTarihi"
v-model="piyangoStore.lotteryData.ikramiyeTeslimTarihi"
label="İkramiyelerin Son Teslim Tarihi"
:invalidText="piyangoValidationStore.invalidTexts.ikramiyeTeslimTarihi"
@change="OnKeyup"
:disabled="piyangoValidationStore.ikramiyeTeslimDisabled"
:min="piyangoValidationStore.ikramiyeTeslimMin"
:max="piyangoValidationStore.ikramiyeTeslimMax" />
<form-input
modelKey="ilanEdilecekGazete"
v-model="piyangoStore.lotteryData.ilanEdilecekGazete"
required
label="İlan Edilecek Gazete"
:invalidText="piyangoValidationStore.invalidTexts.ilanEdilecekGazete"
@keyup="OnKeyup" />
<form-select
label="Çekiliş Yapılacak İl"
half
:listData="globalDataStore.ilList"
listText="ad"
listVal="id"
v-model="piyangoStore.lotteryData.ilId"
required
:invalidText="piyangoValidationStore.invalidTexts.ilId"
@change="ChangeIl" />
<form-select
half
label="Çekiliş Yapılacak İlçe"
:listData="ilceList"
listText="ad"
listVal="id"
v-model="piyangoStore.lotteryData.ilceId"
required
:invalidText="piyangoValidationStore.invalidTexts.ilceId"
:disabled="ilceDisabled"
@change="OnKeyup" />
<form-textarea
v-model="piyangoStore.lotteryData.adres"
required
label="Çekiliş Adresi"
:invalidText="piyangoValidationStore.invalidTexts.adres"
@keyup="OnKeyup" />
<template v-if="!piyangoStore.CheckForYardimAmacli()">
<form-textarea
v-model="piyangoStore.lotteryData.katilimListesi"
required
label="Katılımcı Listesinin İçeriği ve Hazırlanma Şekli"
:invalidText="piyangoValidationStore.invalidTexts.katilimListesi"
@keyup="OnKeyup" />
<form-radio
:listData="piyangoDataStore.katilimciTeslimYontemi"
listVal="id"
listText="deger"
title="Katılım Listesi Teslim Yöntemi"
v-model="piyangoStore.lotteryData.katilimciListesiTeslimYontemiId"
:invalidText="
piyangoValidationStore.invalidTexts.katilimciListesiTeslimYontemiId
"
@change="OnKeyup" />
</template>
<div class="form-item">
<span class="form-item-title">Çekiliş Yöntemi</span>
<template v-for="(yontem, i) in piyangoDataStore.cekilisYontemi">
<form-radio
group="cekilisyontemi"
:val="yontem.id"
:label="yontem.deger"
title="Çekiliş Yöntemi"
v-model="piyangoStore.lotteryData.cekilisYontemiId"
:invalidText="piyangoValidationStore.invalidTexts.cekilisYontemiId"
@change="OnKeyup" />
</template>
</div>
<div class="form-item" v-if="piyangoStore.lotteryData.cekilisYontemiId === 1">
<ul>
<template v-if="piyangoStore.lotteryData.amacpiyangoId === 2">
<li v-for="txt in piyangoDataStore.fizikselYardimMessage">{{ txt }}</li>
</template>
<template v-if="piyangoStore.lotteryData.amacpiyangoId === 1">
<li v-for="txt in piyangoDataStore.fizikselTicariMessage">{{ txt }}</li>
</template>
</ul>
</div>
<form-textarea
v-model="piyangoStore.lotteryData.digerHususlar"
label="Diğer Hususlar"
@keyup="OnKeyup" />
<div class="form-item">
<ul>
<template v-if="piyangoStore.isLotteryForCharity">
<li v-for="txty in piyangoDataStore.digerHusularYardimAmacliTexts">
{{ txty }}
</li>
</template>
<template v-else>
<li v-for="txt in piyangoDataStore.digerHusularTexts">
{{ txt }}
</li>
</template>
</ul>
</div>
</template>
<div class="form-item" v-if="formChanged && !piyangoStore.isNew">
<button class="button-c button-save" @click="SaveData">Kaydet</button>
<button class="button-c button-cancel" @click="CancelSave">Vazgeç</button>
</div>
</div>
</div>
<div class="form-part form-title" v-if="piyangoStore.isNew">
<div class="form-title-buttons">
<div class="button-c button-save" @click="SaveData">Başvur</div>
<router-link class="button-c button-cancel" to="/piyangolar/piyango-listesi">
Vazgeç
</router-link>
</div>
</div>
<panel-wrapper
wide
v-if="previewPanel"
v-model="previewPanel"
panel-title="Piyango Bilgileri Önizleme">
<template #panelContent>
<panel-piyango-yardim-amacli-onizleme
v-model:id="previewId"
v-if="piyangoStore.lotteryData.amacpiyangoId === 2" />
<panel-piyango-onizleme v-model:id="previewId" v-else />
</template>
<template #footerButton>
<div class="button-c button-save" @click="DownloadPDF">PDF İndir</div>
<div class="button-c button-save" @click="PrintContent">Yazdır</div>
</template>
</panel-wrapper>
</template>
<script setup lang="ts">
import { ref, reactive, onBeforeMount, computed, nextTick } from 'vue'
import { usePDF } from 'vue3-pdfmake'
import PanelPiyangoOnizleme from '../panel/PanelPiyangoOnizleme.vue'
import PanelPiyangoYardimAmacliOnizleme from '../panel/PanelPiyangoYardimAmacliOnizleme.vue'
import PanelWrapper from '@/components/PanelWrapper.vue'
import LotteryStates from '../content/LotteryStates.vue'
import { useRoute } from 'vue-router'
const route = useRoute()
import { useDataStore } from '@/stores/dataStore'
const dataStore = useDataStore()
import { useUsersStore } from '@/stores/usersStore'
const usersStore = useUsersStore()
import { useGlobalDataStore } from '@/stores/globalDataStore'
const globalDataStore = useGlobalDataStore()
import { useValidationStore } from '@/stores/validationStore'
const validationStore = useValidationStore()
import { usePreviewStore } from '@/stores/previewStore'
const previewStore = usePreviewStore()
import { usePiyangoStore } from '../../stores/piyangoStore'
const piyangoStore = usePiyangoStore()
import { usePiyangoValidationStore } from '../../validation/piyangoValidationStore'
const piyangoValidationStore = usePiyangoValidationStore()
import { usePiyangoDataStore } from '../../stores/piyangoDataStore'
const piyangoDataStore = usePiyangoDataStore()
import { usePiyangoServices } from '../../service/piyangoServices'
const piyangoServices = usePiyangoServices()
import router from '@/router'
if (route.name === 'PiyangoDetay') piyangoStore.isNew = false
const loaded = ref<boolean>(false)
const formChanged = ref<boolean>(false)
const amacRefresh = ref<boolean>(false)
const previewPanel = ref<boolean>(false)
const previewId = ref<number>(0)
interface IIl {
[key: string]: any
ad: string
id: number
}
const childUsers = ref<Record<string, any>[]>([])
const ilceList = ref<IIl[]>([])
const piyangoAmaclariSafe = ref<Record<string, any>[]>([])
const piyangoAmaclari = ref<Record<string, any>[]>([])
const ilceDisabled = computed<boolean>(() => {
return piyangoStore.lotteryData.ilId === null || ilceList.value.length === 0
})
const ChangeIl = (e: Event, v: string | number, d: Record<string, any>) => {
piyangoStore.lotteryData.ilceId = ''
ilceList.value = d.ilceler
formChanged.value = true
}
const OnKeyup = () => {
formChanged.value = true
}
const OnAmacChange = (e: Event, d: any) => {
formChanged.value = true
piyangoStore.lotteryPurposeId = d
}
const OnKeyupDate = () => {
formChanged.value = true
piyangoValidationStore.dateChanged = true
}
const GetData = async () => {
piyangoStore.ResetLotteryContent()
let data = await dataStore.dataGet(
'CekilisBilgi/Cekilis/' + piyangoStore.selectedLottery
)
if (data !== 'errorfalse') {
Object.assign(piyangoStore.lotteryData, data)
if (
piyangoStore.lotteryData.ilceId !== undefined &&
piyangoStore.lotteryData.ilceId !== null &&
piyangoStore.lotteryData.ilceId !== ''
) {
let ilO = globalDataStore.ilList.filter((v: Record<string, any>) => {
return v.id === piyangoStore.lotteryData.ilId
})
if (ilO.length !== 0)
ilceList.value.splice(0, ilceList.value.length, ...(ilO[0]['ilceler'] as IIl[]))
}
if (piyangoStore.lotteryData.amacpiyangoId === 2) {
piyangoStore.subCustomerType = 22
piyangoAmaclari.value.splice(
0,
piyangoAmaclari.value.length,
...piyangoAmaclariSafe.value
)
piyangoStore.lotteryIlanTarihi = piyangoStore.lotteryData.ilantarihi
piyangoStore.lotteryCreationDate = piyangoStore.lotteryData.olusturmaTarihi
}
await SetAraciFirmaSelect()
if (piyangoStore.lotteryData.baglisirketId !== null) await GetAraciUye()
Object.assign(piyangoStore.safeLotteryData, piyangoStore.lotteryData)
setTimeout(() => {
loaded.value = true
}, 30)
}
}
const SaveData = async () => {
if (piyangoValidationStore.FormCheck()) {
let form: any
if (piyangoStore.CheckForYardimAmacli())
piyangoStore.lotteryData.katilimListesi = ''
if (piyangoStore.isNew) {
let inData = Object.assign({}, piyangoStore.lotteryData)
inData.amac = ''
delete inData.baslik
delete inData.duzenleyenId
delete inData.amacpiyangoId
delete inData.baglisirketId
form = await dataStore.dataPost('Cekilis/', {
data: {
baslik: piyangoStore.lotteryData.baslik,
duzenleyenId: piyangoStore.lotteryData.duzenleyenId,
amacpiyangoId: piyangoStore.lotteryData.amacpiyangoId,
baglisirketId: piyangoStore.lotteryData.baglisirketId,
cekilisBilgiler: [inData]
}
})
} else {
let inData = Object.assign({}, piyangoStore.lotteryData)
inData.amac = ''
form = await dataStore.dataPut('Cekilis/' + piyangoStore.selectedLottery, {
data: inData
})
}
if (form !== 'errorfalse') {
formChanged.value = false
piyangoValidationStore.dateChanged = false
loaded.value = false
if (piyangoStore.isNew) {
piyangoStore.selectedLottery = form.id
piyangoStore.lotteryApprove = 0
piyangoStore.isNew = false
piyangoStore.ResetLotteryData()
router.push('/piyangolar/detay/' + form.id)
} else {
GetData()
}
}
} else {
piyangoValidationStore.isFormValid = true
}
}
const CancelSave = () => {
Object.assign(piyangoStore.lotteryData, piyangoStore.safeLotteryData)
formChanged.value = false
}
const OnAraciFirmaChange = (e: Event, val: any, item: Record<string, any>) => {
piyangoStore.subCustomerType = item.basvuruTipId
piyangoStore.customerApproved = item.islemTipId === 4
Object.assign(piyangoStore.duzenleyenData, item)
AmacList()
formChanged.value = true
}
const RemoveAmac = () => {
let amacInd = piyangoAmaclari.value.findIndex((p) => p.id === 2)
if (amacInd >= 0) piyangoAmaclari.value.splice(amacInd, 1)
}
const GetDuzenleyen = (id: number) => {
var duzenleyen = childUsers.value.filter((p) => {
return p.id === id
})[0]
Object.assign(piyangoStore.duzenleyenData, duzenleyen)
}
const GetAraciUye = async () => {
let data = await dataStore.dataGet(
'Auth/userbyuserid/' + piyangoStore.lotteryData.duzenleyenId
)
if (data !== 'errorfalse') {
Object.assign(piyangoStore.araciUyeData, data)
}
}
const AmacList = () => {
amacRefresh.value = false
if (piyangoStore.CheckForYardimAmacli()) {
piyangoAmaclari.value.splice(
0,
piyangoAmaclari.value.length,
...piyangoAmaclariSafe.value
)
piyangoStore.lotteryData.amacpiyangoId = 2
} else {
RemoveAmac()
if (piyangoStore.lotteryData.amacpiyangoId === 2)
piyangoStore.lotteryData.amacpiyangoId = null
}
setTimeout(() => {
amacRefresh.value = true
}, 30)
}
const OpenPreviewPanel = () => {
previewPanel.value = true
}
const pdfmake = usePDF()
const DownloadPDF = async () => {
var pdfData: string = document.querySelector('.pdf-content')?.outerHTML || ''
previewStore.CreatePdfFromHtml(pdfmake, pdfData)
}
const PrintContent = () => {
previewStore.PrintContent(previewId.value)
}
const SetAraciFirmaSelect = async () => {
if (usersStore.isAraciFirma) {
let id = piyangoStore.isNew
? usersStore.userId
: piyangoStore.lotteryData.baglisirketId
let list = await dataStore.dataGet('Auth/userbyuserChildList/' + id)
childUsers.value = list.data
if (!piyangoStore.isNew) {
await GetDuzenleyen(piyangoStore.lotteryData.duzenleyenId)
piyangoStore.customerApproved = piyangoStore.duzenleyenData.islemTipi === 4
}
}
}
onBeforeMount(async () => {
if (route.name === 'PiyangoYeni') piyangoStore.isNew = true
await dataStore.GetIlList()
await piyangoServices.GetKatilimciTeslimYontemiList()
await piyangoServices.GetCekilisYontemiList()
await dataStore.GetCustomerTipList()
const amaclar = await dataStore.dataGet('PiyangoAmac')
piyangoAmaclari.value.splice(0, piyangoAmaclari.value.length, ...amaclar)
piyangoAmaclariSafe.value.splice(0, piyangoAmaclariSafe.value.length, ...amaclar)
AmacList()
if (piyangoStore.isNew) {
SetAraciFirmaSelect()
piyangoStore.ResetLotteryData()
piyangoStore.lotteryData.duzenleyenId = usersStore.isAraciFirma
? null
: usersStore.userId
piyangoStore.lotteryData.baglisirketId = usersStore.isAraciFirma
? usersStore.userId
: null
if (usersStore.isVakifDernek) piyangoStore.lotteryData.amacpiyangoId = 2
loaded.value = true
} else {
await GetData()
}
})
</script>

View File

@ -0,0 +1,123 @@
<template>
<div class="form-part">
<div class="form-part-title">
<h4>Gerekli Dokümanlar</h4>
<div class="form-part-title-buttons">
<icon-button
v-if="!usersStore.isPanelUser"
icon="plus"
class="ico-section ico-section-header-btn"
@click="AddNewDocument" />
</div>
</div>
<div class="form-part-content" v-if="piyangoDocumentStore.loaded">
<template v-if="piyangoDocumentStore.piyangoDocumentsList.length > 0">
<div
class="form-inner-comment waiting-d"
v-if="
piyangoDocumentStore.piyangoDocumentsList.length < 6 &&
piyangoStore.lotteryData.amacpiyangoId !== 3 &&
piyangoStore.lotteryApprove !== 12
">
Ön Kaydınız Kabul edilmiştir. Lütfen
<strong>imza sirküsü ve proforma faturayı</strong>
sisteme yükleyiniz.
</div>
<div
class="form-inner-comment waiting-d"
v-if="
piyangoStore.lotteryData.amacpiyangoId === 3 ||
piyangoStore.lotteryApprove === 12
">
Lütfen
<strong>imza sirkünüzü</strong>
sisteme yükleyiniz.
</div>
<template v-for="(file, i) in piyangoDocumentStore.piyangoDocumentsList">
<file-list-item
:data="file"
@click="EditDocument"
title="dokumanAdi"
:filePath="file.url"
:editable="piyangoStore.lotteryApprove === 3 || piyangoStore.lotteryApprove === 0" />
</template>
</template>
<template v-else>
<template
v-if="
!usersStore.isPanelUser &&
(piyangoStore.lotteryApprove === 0 || piyangoStore.lotteryApprove === 12) &&
piyangoDocumentStore.piyangoDocumentsList.length < 4
">
<div
class="form-inner-comment waiting-d"
v-if="
piyangoStore.lotteryData.amacpiyangoId === 3 ||
piyangoStore.lotteryApprove === 12
">
Lütfen
<strong>başvuru dilekçesi ve dekontunuzu</strong>
sisteme yükleyiniz.
</div>
<div class="form-inner-comment" v-else>
<span>
Eklenmiş dosya bulunamadı. Üstteki butonu kullanarak dosya ekleyebilirsiniz.
</span>
<div class="form-inner-comment waiting-d">
Piyango başvurusunun incelenebilmesi için piyangoyu düzenleyene ait
<strong>
Başvuru Dekontu, Vergi Levhası ve Başvuru bilgilerinin çıktısının
imzalanmış dökümanı
</strong>
sisteme yüklenmiş olmalıdır. Bilgilerinizi doldurduktan sonra Önizleme
butonuna tıklayarak formu indirebilirsiniz.
</div>
</div>
</template>
</template>
</div>
</div>
<panel-wrapper
v-if="piyangoDocumentStore.documentPanel"
v-model="piyangoDocumentStore.documentPanel"
:panel-title="piyangoDocumentStore.isUpdate ? 'Dokümanı Düzenle' : 'Doküman Ekle'">
<template #panelContent>
<panel-piyango-documents />
</template>
<template #footerButton>
<div class="button-c button-save" @click="piyangoDocumentService.SaveDocument">
{{ piyangoDocumentStore.isUpdate ? 'Kaydet' : 'Ekle' }}
</div>
</template>
</panel-wrapper>
</template>
<script setup lang="ts">
import { ref, onBeforeMount } from 'vue'
import PanelPiyangoDocuments from '../panel/PanelPiyangoDocument.vue'
import PanelWrapper from '@/components/PanelWrapper.vue'
import { useUsersStore } from '@/stores/usersStore'
const usersStore = useUsersStore()
import { usePiyangoStore } from '../../stores/piyangoStore'
const piyangoStore = usePiyangoStore()
import { usePiyangoDocumentStore } from '../../stores/piyangoDocumentStore'
const piyangoDocumentStore = usePiyangoDocumentStore()
import { usePiyangoDocumentService } from '../../service/piyangoDocumentService'
const piyangoDocumentService = usePiyangoDocumentService()
const AddNewDocument = () => {
piyangoDocumentStore.ResetForm()
piyangoDocumentStore.isUpdate = false
piyangoDocumentStore.documentPanel = true
}
const EditDocument = (d: object) => {
Object.assign(piyangoDocumentStore.piyangoDocumentForm, d)
piyangoDocumentStore.documentPanel = true
piyangoDocumentStore.isUpdate = true
}
onBeforeMount(async () => {
await piyangoDocumentService.GetDocumentList()
})
</script>

View File

@ -0,0 +1,138 @@
<template>
<div :class="['form-part', piyangoContactValidationStore.formChanged ? 'changed' : '']">
<div class="form-part-title">
<h4>İrtibat Bilgileri</h4>
<div class="form-part-title-buttons"></div>
</div>
<div class="form-part-content" v-if="loaded">
<form-input
v-model="piyangoContactStore.contactData.adSoyad"
label="Adı ve Soyadı"
half
modelKey="adSoyad"
required
minlength="2"
:invalidText="piyangoContactValidationStore.invalidTexts.adSoyad"
@keydown="validationStore.allowLettersWithKeysExtra($event, /^[ ]*$/)"
@keyup="OnKeyup" />
<form-input
v-model="piyangoContactStore.contactData.unvan"
label="Ünvanı"
half
modelKey="unvan"
required
minlength="2"
:invalidText="piyangoContactValidationStore.invalidTexts.unvan"
@keydown="validationStore.allowLettersWithKeysExtra($event, /^[ ]*$/)"
@keyup="OnKeyup" />
<form-input
half
v-model="piyangoContactStore.contactData.telefonNumarasi"
label="Telefon Numarası"
placeholder="Örn: 5555555555"
type="tel"
required
@keydown="validationStore.allowNumbersWithKeys"
maxlength="10"
minlength="10"
:invalidText="piyangoContactValidationStore.invalidTexts.telefonNumarasi"
modelKey="telefonNumarasi"
@keyup="OnKeyup" />
<form-input
half
v-model="piyangoContactStore.contactData.faksNumarasi"
label="Faks Numarası"
placeholder="Örn: 5555555555"
type="tel"
@keydown="validationStore.allowNumbersWithKeys"
maxlength="10"
minlength="10"
modelKey="faksNumarasi"
@keyup="OnKeyup" />
<form-input
half
v-model="piyangoContactStore.contactData.eposta"
label="E-posta adresi"
placeholder="Örn: adres@mail.com"
type="email"
:invalidText="piyangoContactValidationStore.invalidTexts.eposta"
modelKey="eposta" />
<div class="form-item" v-if="piyangoContactValidationStore.formChanged">
<button class="button-c button-save" @click="SaveData">Kaydet</button>
<button class="button-c button-cancel" @click="CancelSave">Vazgeç</button>
</div>
</div>
</div>
</template>
<script setup lang="ts">
import { ref, reactive, onBeforeMount } from 'vue'
import { useDataStore } from '@/stores/dataStore'
const dataStore = useDataStore()
import { useValidationStore } from '@/stores/validationStore'
const validationStore = useValidationStore()
import { usePiyangoStore } from '../../stores/piyangoStore'
const piyangoStore = usePiyangoStore()
import { usePiyangoContactStore } from '../../stores/piyangoContactStore'
const piyangoContactStore = usePiyangoContactStore()
import { usePiyangoContactValidationStore } from '../../validation/piyangoContactValidationStore'
const piyangoContactValidationStore = usePiyangoContactValidationStore()
const isNew = ref<boolean>(false)
const loaded = ref<boolean>(false)
const OnKeyup = () => {
piyangoContactValidationStore.formChanged = true
}
const GetData = async () => {
loaded.value = false
let dt = await dataStore.dataGet(
'IrtibatBilgi/GetIrtibatBilgiCekilis/' + piyangoStore.selectedLottery
)
piyangoContactStore.ResetFormData()
if (dt !== 'errorfalse') {
Object.assign(piyangoContactStore.contactData, dt)
Object.assign(piyangoContactStore.safeContactData, dt)
} else {
Object.assign(piyangoContactStore.contactData, piyangoContactStore.safeContactData)
isNew.value = true
}
setTimeout(() => {
loaded.value = true
}, 30)
}
const SaveData = async () => {
if (piyangoContactValidationStore.FormCheck()) {
let res: any
if (isNew.value) {
piyangoContactStore.contactData.cekilisId = piyangoStore.selectedLottery
res = await dataStore.dataPost('IrtibatBilgi', {
data: piyangoContactStore.contactData
})
} else {
res = await dataStore.dataPut(
'IrtibatBilgi/' + piyangoContactStore.contactData.id,
{
data: piyangoContactStore.contactData
}
)
}
if (res !== 'errorfalse') {
GetData()
piyangoContactValidationStore.formChanged = false
}
}
}
const CancelSave = () => {
Object.assign(piyangoContactStore.contactData, piyangoContactStore.safeContactData)
piyangoContactValidationStore.formChanged = false
}
onBeforeMount(async () => {
piyangoContactStore.ResetFormData()
await GetData()
})
</script>

View File

@ -0,0 +1,67 @@
<template>
<list-table-content
:tableHeader="tableHeader"
:rowAction="EditMecra"
formTitle="İlan Edilecek Diğer Mecralar"
listText="Mecra"
:addAction="AddActionFunction()"
:apiList="'Mecra/Cekilis/' + piyangoStore.selectedLottery"
apiText="Mecra Listesi"
page="form"
v-model:refresh="piyangoMecraStore.refreshList" />
<panel-wrapper
v-if="piyangoMecraStore.mecraPanel"
v-model="piyangoMecraStore.mecraPanel"
:panel-title="piyangoMecraStore.isUpdate ? 'Mecra Düzenle' : 'Mecra Ekle'">
<template #panelContent>
<panel-piyango-mecra />
</template>
<template #footerButton>
<div class="button-c button-save" @click="piyangoMecraService.SaveMecra">
{{ piyangoMecraStore.isUpdate ? 'Kaydet' : 'Ekle' }}
</div>
</template>
</panel-wrapper>
</template>
<script setup lang="ts">
import { ref } from 'vue'
import PanelPiyangoMecra from '../panel/PanelPiyangoMecra.vue'
import PanelWrapper from '@/components/PanelWrapper.vue'
import { useUsersStore } from '@/stores/usersStore'
const usersStore = useUsersStore()
import { usePiyangoStore } from '../../stores/piyangoStore'
const piyangoStore = usePiyangoStore()
import { usePiyangoMecraStore } from '../../stores/piyangoMecraStore'
const piyangoMecraStore = usePiyangoMecraStore()
import { usePiyangoMecraService } from '../../service/piyangoMecraService'
const piyangoMecraService = usePiyangoMecraService()
const tableHeader = ref<Record<string, any>>([
{
name: 'mecraAdi',
title: 'Mecra Adı',
sort: true
}
])
const AddActionFunction = (): any => {
if (usersStore.isPanelUser) {
return ''
} else {
return AddNewMecra as Function
}
}
const AddNewMecra = () => {
piyangoMecraStore.ResetForm()
piyangoMecraStore.isUpdate = false
piyangoMecraStore.mecraPanel = true
}
const EditMecra = (d: Record<string, any>) => {
Object.assign(piyangoMecraStore.piyangoMecraForm, d)
piyangoMecraStore.mecraPanel = true
piyangoMecraStore.isUpdate = true
}
</script>

View File

@ -0,0 +1,66 @@
<template>
<div class="form-part form-title">
<div class="form-title-buttons">
<div class="button-c button-save" @click="piyangoOnayService.SaveOnayDurum">
Kaydet
</div>
</div>
</div>
<div :class="['form-part', piyangoOnayValidationStore.formChanged ? 'changed' : '']">
<div class="form-part-title">
<h4>Onay Durumu</h4>
</div>
<div class="form-part-content" v-if="piyangoOnayStore.loaded">
<form-select
label="İşlem"
:listData="piyangoDataStore.piyangoOnayDurumlari"
listText="tipAdi"
listVal="islemId"
v-model="piyangoOnayStore.piyangoOnayForm.onayDurumuIslemTipiId"
required
:invalidText="piyangoOnayValidationStore.invalidTexts.onayDurumuIslemTipiId" />
<form-file
v-model="piyangoOnayStore.piyangoOnayForm.file"
elclass="panel-documents-item"
:invalidText="piyangoOnayValidationStore.invalidTexts.file" />
<form-textarea
v-model="piyangoOnayStore.piyangoOnayForm.aciklama"
:invalidText="piyangoOnayValidationStore.invalidTexts.aciklama"
label="Açıklama"
@keyup="OnKeyup" />
</div>
</div>
</template>
<script setup lang="ts">
import { ref, reactive, onBeforeMount } from 'vue'
import { useDataStore } from '@/stores/dataStore'
const dataStore = useDataStore()
import { useUsersStore } from '@/stores/usersStore'
const usersStore = useUsersStore()
import { useValidationStore } from '@/stores/validationStore'
const validationStore = useValidationStore()
import { usePiyangoStore } from '../../stores/piyangoStore'
const piyangoStore = usePiyangoStore()
import { usePiyangoOnayStore } from '../../stores/piyangoOnayStore'
const piyangoOnayStore = usePiyangoOnayStore()
import { usePiyangoOnayValidationStore } from '../../validation/piyangoOnayValidationStore'
const piyangoOnayValidationStore = usePiyangoOnayValidationStore()
import { usePiyangoOnayService } from '../../service/piyangoOnayService'
const piyangoOnayService = usePiyangoOnayService()
import { usePiyangoDataStore } from '../../stores/piyangoDataStore'
const piyangoDataStore = usePiyangoDataStore()
import { usePiyangoServices } from '../../service/piyangoServices'
const piyangoServices = usePiyangoServices()
const OnKeyup = () => {
piyangoOnayValidationStore.formChanged = true
}
onBeforeMount(async () => {
piyangoOnayStore.ResetForm()
await piyangoServices.GetPiyangoOnayDurumList()
piyangoDataStore.RemoveOnayDurumIncelemeBekleniyor()
piyangoOnayStore.loaded = true
})
</script>

Some files were not shown because too many files have changed in this diff Show More