8 Commits

Author SHA1 Message Date
678a96d76f dosyaları ayırarak kaydedildiğinde build hatası verenlerin ayrılması kaldırıldı 2025-10-24 20:09:48 +03:00
cb9d2f220f - build için dosyalar ayrı kaydedilecek şekilde düzenleme yapıldı
- gereksiz paketler package.json dan silindi
- Kullanılmayan quill dosyaları silindi
2025-10-24 12:03:32 +03:00
03689a01e3 - Filtreleme yapısı değiştirildi.
- Tarihler için başlangıç-bitiş aralığı seçilebielcek
- geri dönüldüğünde çıkan hatalar düzeltildi
- filtrede date olan alanlar için başlangıç-bitiş seçimi eklendi
- axios serializer eklendi. array ile verilen parametrelerde hata çıkıyordu
2025-10-24 10:24:05 +03:00
f31bd6ba9e Listablecontent 2025-10-17 09:48:18 +03:00
5fe3a36893 signalrService.ts 2025-10-06 11:58:09 +03:00
4dae2824fb piyangoDosyaKapamaStore.ts 2025-10-06 11:57:57 +03:00
6d4d0c8be9 PanelPiyangoDosyaKapamaIkramiye.vue 2025-10-06 11:57:36 +03:00
bf047e36f3 - Pasword alanları için şifreyi görüntüle-gizle özelliği 2025-10-06 11:29:39 +03:00
49 changed files with 593 additions and 756 deletions

23
Configs.ts Normal file
View File

@ -0,0 +1,23 @@
// build olurken bazı klasorlerin ayri script olarak kaydedilmesi
export const TEMPLATE_CHUNK_GROUPS: Record<string, (RegExp | string)[]> = {
store: [/\/src\/stores\//],
//lott: [/\/src\/module\/cekilisler\//],
//user: [/\/src\/module\/kullanicilar\//],
//cust: [/\/src\/module\/uyeler\//],
//acc: [/\/src\/module\/muhasebe\//],
//site: [/\/src\/module\/site-yonetimi\//],
//aut: [/\/src\/module\/auth\//]
}
// id -> group_name
export function SetTemplateGroup(id: string): string | undefined {
const cleanId = id.split('?')[0]
for (const [group, pats] of Object.entries(TEMPLATE_CHUNK_GROUPS)) {
if (
pats.some((p) => (typeof p === 'string' ? cleanId.includes(p) : p.test(cleanId)))
) {
return group
}
}
return undefined
}

View File

@ -21,8 +21,6 @@
"jquery": "^3.7.1",
"parchment": "^3.0.0",
"pinia": "^2.1.7",
"quill": "^2.0.3",
"quill-image-resize-module": "^3.0.0",
"summernote": "^0.9.1",
"uuid": "^11.1.0",
"vue": "^3.4.29",

Binary file not shown.

Binary file not shown.

17
public/web.config Normal file
View File

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="Handle History Mode and custom 404/500" stopProcessing="true">
<match url="(.*)" />
<conditions logicalGrouping="MatchAll">
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
</conditions>
<action type="Rewrite" url="/" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>

View File

@ -251,4 +251,14 @@
d="M14.3272 17.4867H5.66513C5.33609 17.4867 5.07048 17.7574 5.07048 18.0928C5.07048 18.4281 5.33609 18.6989 5.66513 18.6989H14.3232C14.6522 18.6989 14.9179 18.4281 14.9179 18.0928C14.9179 17.7574 14.6522 17.4867 14.3232 17.4867H14.3272Z"
/>
</symbol>
<symbol id="eyeclose" viewBox="0 0 59 22">
<path
d="M56.61,11.89l2.55-1.57L52.83.03l-2.55,1.57h0s-11.76,7.25-11.76,7.25c-.94.58-1.91,1.05-2.91,1.43l-2.61.74v.02c-2.43.5-4.94.45-7.36-.14l-1.2-.34c-1.28-.41-2.53-.98-3.72-1.71L7.68.82h0s-1.35-.82-1.35-.82L0,10.28l2.55,1.57,4.76-7.73,6.18,3.81-4.79,7.77,2.55,1.57,4.79-7.77,3.09,1.9c1.15.71,2.35,1.28,3.58,1.74l-2.48,8.78,2.89.82,2.48-8.76c1.32.27,2.66.41,4.01.41,1.41,0,2.82-.16,4.2-.46l2.46,8.7,2.89-.82-2.48-8.75c1.16-.44,2.3-.99,3.39-1.66l3.12-1.92,4.79,7.77,2.55-1.57-4.79-7.77,6.08-3.75,4.75,7.72Z" />
</symbol>
<symbol id="eye" viewBox="0 0 51 24">
<path
d="M25.59,24.58c-3.62,0-7.24-.99-10.47-2.98L0,12.29,15.11,2.98c6.46-3.98,14.48-3.98,20.94,0l15.11,9.31-15.11,9.31c-3.23,1.99-6.85,2.98-10.47,2.98ZM5.72,12.29l10.97,6.75c5.49,3.38,12.31,3.38,17.8,0l10.97-6.75-10.97-6.75c-5.49-3.38-12.31-3.38-17.8,0l-10.97,6.75Z" />
<path
d="M25.59,21.71c-5.19,0-9.42-4.23-9.42-9.42S20.39,2.87,25.59,2.87s9.42,4.23,9.42,9.42-4.23,9.42-9.42,9.42ZM25.59,5.87c-3.54,0-6.42,2.88-6.42,6.42s2.88,6.42,6.42,6.42,6.42-2.88,6.42-6.42-2.88-6.42-6.42-6.42Z" />
</symbol>
</svg>

Before

Width:  |  Height:  |  Size: 43 KiB

After

Width:  |  Height:  |  Size: 44 KiB

View File

@ -454,6 +454,7 @@ label {
flex-wrap: wrap;
width: 100%;
padding: 2px;
position: relative;
}
label>span {
@ -2161,7 +2162,7 @@ section {
}
.panel-wrapper {
max-width: 480px;
max-width: 600px;
}
.panel-wrapper.panel-wide {
@ -2174,7 +2175,7 @@ section {
}
.panel-wrapper.panel-right.showme {
left: calc(100% - 480px);
left: calc(100% - 600px);
}
.panel-wrapper.panel-right.panel-wide.showme {

View File

@ -71,6 +71,10 @@
if (Number(pageNumber.value) < totalPage()) pageNumber.value++
}
localPagination.value.pageNumber = pageNumber.value
IfRouteUsing()
emit('update:pagination', localPagination.value)
}
const IfRouteUsing = () => {
if (props.isUseRoute) {
router.push({
query: {
@ -79,16 +83,13 @@
}
})
}
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) => {
@ -96,6 +97,7 @@
}
const getPage = () => {
localPagination.value.pageNumber = pageNumber.value
IfRouteUsing()
emit('update:pagination', localPagination.value)
}
const SetPageNumber = () => {
@ -104,6 +106,8 @@
localPagination.value.pageNumber = pageNumber.value = Number(
route.query.pageNumber
)
} else {
localPagination.value.pageNumber = pageNumber.value = 1
}
}
}

View File

@ -11,7 +11,7 @@
</span>
<input
:value="modelValue"
:type="type"
:type="inputType"
:placeholder="placeholder"
:disabled="disabled"
@input="OnInput"
@ -22,12 +22,24 @@
@keyup="OnKeyUp"
:class="[
invalidText !== undefined && invalidText !== '' ? 'invalid' : '',
iclass || ''
iclass || '',
isPasswordVisible || props.type === 'password' ? 'password-visible' : ''
]"
:min="min"
:max="max"
:minlength="minlength"
:maxlength="maxlength" />
<i
class="ico-c ico-password-visible"
v-if="props.type === 'password'"
@click="PasswordVisibleToggle">
<svg>
<use
:href="
'/src/assets/images/icons.svg#' + (isPasswordVisible ? 'eye' : 'eyeclose')
"></use>
</svg>
</i>
<span
class="form-item-alert"
v-if="InvalidMessages.length > 0 && InvalidMessages !== ''">
@ -82,9 +94,18 @@
'keydown',
'keyup'
])
const localValue = ref<any>()
const isPasswordVisible = ref<boolean>(false)
const InvalidMessageText = reactive<Record<string, any>>({})
const inputType = computed(() => {
if (props.type !== 'password') {
return props.type
} else {
if (isPasswordVisible.value) return 'text'
else return 'password'
}
})
const InvalidMessages = computed<string>(() => {
let text = ''
Object.keys(InvalidMessageText).forEach((k: string, i: number) => {
@ -138,7 +159,9 @@
emit('update:modelValue', (e.target as HTMLInputElement).value)
emit('keyup', e)
}
const PasswordVisibleToggle = () => {
if (props.type === 'password') isPasswordVisible.value = !isPasswordVisible.value
}
watch(
() => props.invalidText,
() => {
@ -151,3 +174,16 @@
}
)
</script>
<style scoped>
.ico-password-visible {
position: absolute;
right: 8px;
top: 32px;
min-width: 32px;
min-height: 32px;
cursor: pointer;
}
.password-visible {
padding: 8px 40px 8px 8px;
}
</style>

View File

@ -1,210 +0,0 @@
<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

@ -61,7 +61,7 @@
@click="exportPanel = !exportPanel"
icon="export" />
<icon-button
v-if="filterable()"
v-if="filterable"
classList="ico-section ico-section-header-btn"
@click="OpenFilterPanel"
icon="filter" />
@ -85,7 +85,7 @@
page === 'list' ? 'section-content section-inner' : '',
page === 'form' ? 'form-part-content' : ''
]">
<div class="list-filter-wrapper" v-if="filters() || searched">
<div class="list-filter-wrapper" v-if="haveFilter || searched">
<h4>Filtreler ve Arama</h4>
<div class="list-filter-content">
<template v-if="localQuery !== ''">
@ -97,15 +97,22 @@
<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>
<template v-for="(filterA, index) in filterParams" :key="index">
<template v-for="(filter, filterIndex) in filterA.values" :key="filterIndex">
<div
class="list-filter-item"
data-filter="durum-onaylanmis"
v-if="filterA.filter && (filter.text !== '' || filter.val !== '')">
<strong>{{ filterA.title }}:</strong>
<span>
{{ filter.text || filter.val }} {{ filter.op === '=' ? '' : filter.op }}
</span>
<span class="list-filter-close" @click="RemoveFilterKey(k as string)"></span>
<span
class="list-filter-close"
@click="RemoveFilterKey(index, filterIndex)"></span>
</div>
</template>
</template>
</div>
</div>
<slot name="datatable">
@ -127,10 +134,7 @@
<panel-wrapper v-if="filterPanel" v-model="filterPanel" :panel-title="'Filtreleme'">
<template #panelContent>
<panel-filter
:filterHead="tableHeader"
v-model:filterParams="localFilterParams"
:isUseRoute="isUseRoute" />
<panel-filter :filterHead="tableHeader" :filterParams="localFilterParams" />
</template>
<template #footerButton>
<div class="button-c button-save" @click="FilterData">Filtrele</div>
@ -260,11 +264,10 @@
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 localFilterParams = ref<Record<string, any>[]>([])
const filterParams = ref<Record<string, any>[]>([])
const OpenFilterPanel = () => {
Object.assign(localFilterParams.value, filterParams)
filterPanel.value = true
}
@ -273,28 +276,74 @@
if (dest[keys] === undefined) delete source[keys]
})
}
const CreateFilterData = () => {
props.tableHeader.forEach((d: Record<string, any>, ind: number) => {
if (d.filter !== undefined) {
const filterKey = d.filter.filterId || d.name
const filterItem: Record<string, any> = {}
const firstVal: Record<string, any> = {}
const secondVal: Record<string, any> = {}
const FilterData = async () => {
Object.keys(filterParams).forEach((k) => {
delete filterParams[k]
filterItem.title = d.title
filterItem.type = d.filter.type
filterItem.between = d.filter.between || false
filterItem.range = d.filter.range || false
filterItem.key = filterKey
filterItem.filter = false
filterItem.hIndex = ind
filterItem.values = []
const opKey =
d.filter.type === 'date'
? d.filter.between !== undefined && d.filter.between
? '>'
: '='
: '='
firstVal.op = opKey
firstVal.val = ''
firstVal.text = ''
filterItem.values.push(firstVal)
if (d.filter.between !== undefined && d.filter.between) {
secondVal.op = '<'
secondVal.val = ''
secondVal.text = ''
filterItem.values.push(secondVal)
}
localFilterParams.value.push(filterItem)
}
})
Object.assign(filterParams, localFilterParams.value)
EqualObjects(filterParams, localFilterParams.value)
}
const AddParamsToObject = (obj: Record<string, any>) => {
filterParams.value.forEach((filter, index) => {
if (filter.filter) {
const key = 'Filters[' + filter.key + ']'
if (obj[key] === undefined) obj[key] = [] as string[]
filter.values.forEach((val: Record<string, any>, vIndex: number) => {
if (val.val !== '') {
;(obj[key] as string[]).push(val.op + val.val)
}
})
}
})
}
const ResetFilterQueries = async () => {
if (props.isUseRoute) {
Object.keys(route.query).forEach((k) => {
if (k.includes('Filters[')) delete route.query[k]
})
const q = {
query: {
const newQuery: Record<string, any> = {
...route.query
}
}
Object.keys(filterParams).forEach((f, k) => {
q.query['Filters[' + f + ']'] = filterParams[f].op + filterParams[f].val
Object.keys(newQuery).forEach((q) => {
if (q.includes('Filters[')) delete newQuery[q]
})
router.push(q)
await router.replace({ query: newQuery })
AddParamsToObject(newQuery)
await router.push({ query: newQuery })
}
}
const FilterData = async () => {
filterParams.value = JSON.parse(JSON.stringify(localFilterParams.value))
ResetFilterQueries()
setTimeout(async () => {
await GetLocalData()
filterPanel.value = false
@ -306,23 +355,32 @@
(props.addAction as Function)()
}
const filterable = () => {
return props.tableHeader.filter((e) => e.hasOwnProperty('filter')).length > 0
}
const filterable = computed(() =>
props.tableHeader.some((obj: Record<string, any>) => obj.filter !== undefined)
)
const filters = (): boolean => {
return Object.keys(filterParams).length > 0
}
const haveFilter = computed(() =>
filterParams.value.some((obj: Record<string, any>) => obj.filter)
)
const RemoveFilterKey = (k: string) => {
delete localFilterParams.value[k]
delete filterParams[k]
const RemoveFilterKey = (index: number, fIndex: number) => {
const query: Record<string, any> = { ...route.query }
Object.keys(query).forEach((q) => {
if (q.includes(k)) delete query[q]
})
router.push({ query: query })
GetLocalData()
filterParams.value[index].values[fIndex].val = ''
filterParams.value[index].values[fIndex].text = ''
const allEmpty: boolean = filterParams.value[index].values.every(
(obj: Record<string, any>) => obj.val === ''
)
if (allEmpty) filterParams.value[index].filter = false
localFilterParams.value = JSON.parse(JSON.stringify(filterParams.value))
ResetFilterQueries()
setTimeout(async () => {
await GetLocalData()
filterPanel.value = false
}, 50)
}
const RemoveSearch = () => {
localQuery.value = ''
@ -396,52 +454,60 @@
const RouteFilterControl = () => {
if (props.isUseRoute) {
const q = { ...route.query }
localFilterParams.value = {}
Object.keys(filterParams).forEach((k) => {
delete filterParams[k]
})
filterChanging.value = true
if (Object.keys(route.query).length > 0) {
Object.keys(route.query).forEach((key) => {
if (key.includes('Filters[')) {
const newKey = key.match(/(?<=\[)[^\]]+(?=\])/)![0]
filterParams[newKey] = {}
localFilterParams.value[newKey] = {}
filterParams[newKey].op = (route.query[key]! as string).charAt(0)
localFilterParams.value[newKey].op = (route.query[key]! as string).charAt(0)
localFilterParams.value.forEach((filter: Record<string, any>) => {
if (filter.key === newKey) {
if (!filter.filter) {
const isArray = Array.isArray(route.query[key])
if (isArray) {
;(route.query[key]! as string[]).forEach((val, ind) => {
filter.values[ind].op = (route.query[key]! as string[])[ind].charAt(
0
)
filter.values[ind].val = (route.query[key]! as string[])[ind].slice(
1
)
if (filter.type === 'select') {
const forText = props.tableHeader[
filter.hIndex
].filter!.data.find(
(o: Record<string, any>) =>
String(
o[props.tableHeader[filter.hIndex].filter!.listVal]
) === String(filter.values[ind].val)
)
filter.values[ind].text =
forText[props.tableHeader[filter.hIndex].filter!.listText]
}
})
} else {
filter.values[0].op = (route.query[key] as string).charAt(0)
filter.values[0].val = (route.query[key] as string).slice(1)
filterParams[newKey].val = (route.query[key]! as string).slice(1)
localFilterParams.value[newKey].val = (route.query[key]! as string).slice(1)
if (filter.type === 'select') {
const forText = props.tableHeader[filter.hIndex].filter!.data.find(
(o: Record<string, any>) =>
String(o[props.tableHeader[filter.hIndex].filter!.listVal]) ===
String(filter.values[0].val)
)
filter.values[0].text =
forText[props.tableHeader[filter.hIndex].filter!.listText]
}
}
filter.filter = true
}
}
})
}
})
props.tableHeader.forEach((head: Record<string, any>) => {
if (head.filter !== undefined) {
Object.keys(filterParams).forEach((key) => {
if (
(head.filter.filterId !== undefined && key === head.filter.filterId) ||
key === head.name
) {
filterParams[key].title = head.title
localFilterParams.value[key].title = head.title
if (
head.filter.type === 'select' &&
head.filter.data !== undefined &&
head.filter.data.length > 0
) {
const forText = head.filter.data.find((o: Record<string, any>) => {
return String(o[head.filter.listVal]) === String(filterParams[key].val)
})
filterParams[key].text = forText[head.filter.listText]
localFilterParams.value[key].text = forText[head.filter.listText]
filterParams.value = JSON.parse(JSON.stringify(localFilterParams.value))
}
}
})
}
})
nextTick(() => {
filterChanging.value = false
})
@ -468,9 +534,28 @@
fileName = 'export.xlsx'
}
// Export için parametreleri hazırla
let exportParams: Record<string, any> = {}
// Sıralama parametrelerini ekle
if (localSort.value.sortColumn !== undefined) {
exportParams.sortColumn = localSort.value.sortColumn
if (localSort.value.sortOrder !== undefined && localSort.value.sortOrder !== '')
exportParams.sortOrder = localSort.value.sortOrder
}
// Arama parametresini ekle
if (localQuery.value !== '') {
exportParams.searchString = localQuery.value
}
// Filtre parametrelerini ekle
if (haveFilter.value) AddParamsToObject(exportParams)
// Axios ile dosya indirme - interceptor otomatik olarak token ekleyecek
try {
const response = await axios.get(exportUrl, {
params: exportParams,
responseType: 'blob'
})
@ -515,10 +600,8 @@
var filterparam: Record<string, any> = {}
if (filters()) {
Object.keys(filterParams).forEach((f, k) => {
filterparam['Filters[' + f + ']'] = filterParams[f].op + filterParams[f].val
})
if (haveFilter.value) {
AddParamsToObject(filterparam)
Object.assign(apiData.params, filterparam)
}
let dt = await dataStore.dataGet(props.apiList as string, apiData)
@ -564,7 +647,7 @@
let el: HTMLInputElement = document.getElementById(
'listsearch' + rnd.value
) as HTMLInputElement
el.focus
el.focus()
el.select()
}, 50)
}
@ -591,41 +674,17 @@
mobileButtons.value = false
}
// Filtre başlığını almak için yardımcı fonksiyon
const getFilterTitle = (key: string): string => {
const filterTitles: Record<string, string> = {
'durumId': 'Durum',
'piyangoAmacId': 'Piyango Amacı',
'cekilisYontemiId': 'Çekiliş Yöntemi'
}
return filterTitles[key] || key
}
onBeforeMount(() => {
if (globalStore.screenWidth >= globalStore.breakPoints.tabletp)
mobileButtons.value = true
CreateFilterData()
RoutePageControl()
RouteSortControl()
RouteSearchControl()
RouteFilterControl()
// URL query parametrelerini kontrol et ve filtreleri uygula (ilk istekten önce)
if (Object.keys(route.query).length > 0) {
Object.keys(route.query).forEach(key => {
const value = route.query[key]
if (value && typeof value === 'string') {
// Filtre parametresini filterParams'a ekle
filterParams[key] = {
val: value,
op: '=',
title: getFilterTitle(key)
}
}
})
}
if (props.apiList !== undefined) GetLocalData()
window.addEventListener('resize', Resize)
})
@ -655,14 +714,6 @@
}
}
)
watch(
() => localPagination.value.pageNumber,
() => {
if (!pageNumberChanging.value) {
GetLocalData()
}
}
)
watch(
() => props.refresh,
() => {

View File

@ -1,107 +1,104 @@
<template>
<template v-for="(filter, i) in filterHead">
<template v-if="filter.filter !== undefined">
<template v-if="filter.filter.type === 'datetime-local'">
<template v-for="(filter, i) in localFilterParams">
<template v-if="filter.type === 'datetime-local'">
<div class="panel-content-item">
<form-date
v-model="localFilterData[filter.name]"
:label="filter.title"
@change="UpdateFilter(filter)" />
v-model="filter.values[0].val"
:label="
filter.title +
(filter.between !== undefined && filter.between ? ' (Başlangıç)' : '')
"
@change="UpdateFilter(filter, 0)" />
<form-select
v-if="filter.filter.range !== undefined && filter.filter.range"
v-if="filter.range !== undefined && filter.range"
:listData="filterOperator"
v-model="localFilterData[filter.name + 'op']"
@change="UpdateFilter(filter)" />
v-model="filter.values[0].op"
@change="UpdateFilter(filter, 0)"
label="Operator" />
<form-date
v-if="filter.between !== undefined && filter.between"
v-model="filter.values[1].val"
:label="
filter.title +
(filter.between !== undefined && filter.between ? ' (Bitiş)' : '')
"
@change="UpdateFilter(filter, 1)" />
</div>
</template>
<template v-if="filter.filter.type === 'date'">
<template v-if="filter.type === 'date'">
<div class="panel-content-item">
<form-date
type="date"
v-model="localFilterData[filter.name]"
:label="filter.title"
@change="UpdateFilter(filter)" />
v-model="filter.values[0].val"
:label="
filter.title +
(filter.between !== undefined && filter.between ? ' (Başlangıç)' : '')
"
@change="UpdateFilter(filter, 0)" />
<form-select
v-if="filter.filter.range !== undefined && filter.filter.range"
v-if="filter.range !== undefined && filter.range"
:listData="filterOperator"
v-model="localFilterData[filter.name + 'op']"
@change="UpdateFilter(filter)" />
v-model="filter.values[0].op"
@change="UpdateFilter(filter, 0)"
label="Operator" />
<form-date
v-if="filter.between !== undefined && filter.between"
type="date"
v-model="filter.values[1].val"
:label="
filter.title +
(filter.between !== undefined && filter.between ? ' (Bitiş)' : '')
"
@change="UpdateFilter(filter, 1)" />
</div>
</template>
<template v-if="filter.filter.type === 'text'">
<template v-if="filter.type === 'text'">
<div class="panel-content-item">
<form-input
v-model="localFilterData[filter.name]"
v-model="filter.values[0].val"
:label="filter.title"
@change="UpdateFilter(filter)" />
@change="UpdateFilter(filter, 0)" />
<form-select
v-if="filter.filter.range !== undefined && filter.filter.range"
v-if="filter.range !== undefined && filter.range"
:listData="filterOperator"
v-model="localFilterData[filter.name + 'op']"
@change="UpdateFilter(filter)" />
v-model="filter.values[0].op"
@change="UpdateFilter(filter, 0)"
label="Operator" />
</div>
</template>
<template v-if="filter.filter.type === 'select'">
<template v-if="filter.type === 'select'">
<div class="panel-content-item">
<form-select
:listData="filter.filter.data"
:listText="filter.filter.listText"
:listVal="filter.filter.listVal"
:extraData="filter"
:listData="filterHead[filter.hIndex].filter.data"
:listText="filterHead[filter.hIndex].filter.listText"
:listVal="filterHead[filter.hIndex].filter.listVal"
:extraData="{ f: filter, k: filterHead[filter.hIndex].filter.listText }"
:label="filter.title"
v-model="localFilterData[filter.filter.filterId || filter.name] as number"
v-model="filter.values[0].val"
@change="UpdateFilterSelect"
clearable />
</div>
</template>
</template>
</template>
</template>
<script setup lang="ts">
import { ref, reactive, onBeforeMount, nextTick } from 'vue'
import { useRouter, useRoute } from 'vue-router'
const router = useRouter()
const route = useRoute()
import { ref } from 'vue'
const props = defineProps<{
filterHead: Record<string, any>
filterParams: Record<string, any>
isUseRoute?: boolean
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 localFilterParams = ref<Record<string, any>[]>(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 UpdateFilter = (filter: Record<string, any>, index: number) => {
const allEmpty: boolean = filter.values.every(
(obj: Record<string, any>) => obj.val === ''
)
if (filter.values[index].val === '') filter.values[index].text = ''
filter.filter = !allEmpty
}
const UpdateFilterSelect = (
e: Event,
@ -109,20 +106,13 @@
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]
if (v !== '' && v !== null) {
ext.f.values[0].val = v
ext.f.values[0].text = d[ext.k]
ext.f.filter = true
} else {
delete localFilterParams[filterKey]
ext.f.filter = false
ext.f.values[0].text = ''
}
emit('update:filterParams', localFilterParams)
}
onBeforeMount(() => {
createFilterData()
})
</script>

View File

@ -32,7 +32,7 @@
</div>
</template>
<script setup lang="ts">
import { ref, computed, onMounted, onBeforeMount, watch } from 'vue'
import { ref, computed, onMounted, onBeforeMount, watch, nextTick } from 'vue'
import { useGlobalStore } from '@/stores/globalStore'
const globalStore = useGlobalStore()
import { useRouter, useRoute } from 'vue-router'
@ -85,9 +85,11 @@
currentTab.value = Number(d)
}
if (props.isUseRoute) {
nextTick(() => {
router.push({
params: { ...route.params, tabid: props.tabList[currentTab.value].id }
})
})
}
CalculateNavPosition()
}

View File

@ -5,7 +5,6 @@ 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'
@ -25,7 +24,6 @@ export {
FormDate,
FormFile,
FormTextarea,
FormQuill,
FormSummer,
FormSelect,
FormRadio,

View File

@ -5,6 +5,23 @@ import router from '@/router'
axios.defaults.baseURL = import.meta.env.VITE_API_URL
//axios.defaults.timeout = 2000;
axios.defaults.headers['Content-Type'] = 'application/json; charset=utf-8'
//Filtrelerde aynı key birden fazla parametre array ile eklendiğinde url oluştururken [] ekleyerek oluşturmasını engellemek için serializer eklendi
axios.defaults.paramsSerializer = (params) => {
const queryParts: string[] = []
for (const key in params) {
const value = params[key]
if (Array.isArray(value)) {
value.forEach((v) => {
queryParts.push(`${key}=${encodeURIComponent(v)}`)
})
} else if (value !== undefined && value !== null) {
queryParts.push(`${key}=${encodeURIComponent(value)}`)
}
}
return queryParts.join('&')
}
import { useDataStore } from '@/stores/dataStore'
// İstek Öncesinde Çalışacak Bir Fonksiyon
@ -48,7 +65,7 @@ axios.interceptors.response.use(
const token = sessionStorage.getItem(usersStore.userStorageKeys.TOKEN)
if (token !== undefined) {
usersStore.ResetUserData()
router.push('/giris')
router.push('/login')
}
}
return Promise.reject(error)

View File

@ -71,7 +71,7 @@
let dt = await dataStore.dataPost('Auth/logout')
}
usersStore.ResetUserData()
router.push('/giris')
router.push('/login')
}
const closeProfileMenu = (e: Event) => {

View File

@ -1,7 +1,7 @@
import ForgotPassword from '@/module/auth/views/ForgotPassword.vue'
export default {
path: '/sifremi-unuttum',
path: '/forgot-password',
name: 'ForgotPassword',
component: ForgotPassword,
meta: {

View File

@ -1,6 +1,11 @@
import Login from '@/module/auth/routes/login'
import Register from '@/module/auth/routes/register'
import ForgotPassword from '@/module/auth/routes/forgot-password'
import ResetPassword from '@/module/auth/routes/reset-password'
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
]
export default [Login, Register, ForgotPassword, ResetPassword]

View File

@ -1,7 +1,7 @@
import Login from '@/module/auth/views/Login.vue'
export default {
path: '/giris',
path: '/login',
name: 'Login',
component: Login,
meta: {

View File

@ -1,7 +1,7 @@
import Register from '@/module/auth/views/Register.vue'
export default {
path: '/kayit-ol',
path: '/register',
name: 'Register',
component: Register,
meta: {

View File

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

View File

@ -1,59 +1,17 @@
import { defineStore } from 'pinia'
import { useDataStore } from '@/stores/dataStore'
import { useAuthStore } from '../stores/authStore'
import { useAuthValidationStore } from '../validation/authValidationStore'
import { useUsersStore } from '@/stores/usersStore'
import router from '@/router'
export const useAuthService = defineStore('authService', () => {
export const useAppService = defineStore('appService', () => {
const dataStore = useDataStore()
const authStore = useAuthStore()
const authValidationStore = useAuthValidationStore()
const usersStore = useUsersStore()
const Login = async () => {
if (authValidationStore.LoginFormCheck()) {
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.isLoginFormValid = true
const GetAAuthRoleList = async () => {
if (authStore.rolesList.length === 0) {
let data = await dataStore.dataGet('Auth/rolelistesi')
authStore.rolesList = data
}
}
const ResetPassword = async () => {
if (authValidationStore.ResetPasswordFormCheck()) {
let dt: any
dt = await dataStore.dataPost('ResetPassword', {
data: authStore.resetPasswordForm
})
if (dt !== 'errorfalse') {
}
} else {
authValidationStore.isResetPasswordFormValid = true
}
}
return { Login, ResetPassword }
return {GetAAuthRoleList}
})

View File

@ -1,19 +1,12 @@
import { defineStore } from 'pinia'
import { ref, reactive } from 'vue'
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>[]>([])
const resetCheckData = ref<string>('')
const resetPasswordForm = reactive<Record<string, any>>({
newPassword: '',
newPasswordRepeat: '',
check: ''
})
Object.assign(safeLoginData, loginData)
return { loginData, safeLoginData, rolesList, resetPasswordForm, resetCheckData }
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

@ -1,89 +0,0 @@
import { defineStore } from 'pinia'
import { ref, reactive } from 'vue'
import { useValidationStore } from '@/stores/validationStore'
import { useAuthStore } from '../stores/authStore'
export const useAuthValidationStore = defineStore('authValidationStore', () => {
const validationStore = useValidationStore()
const authStore = useAuthStore()
const isLoginMessage = ref<boolean>(false)
const loginMessageType = ref<string>('success')
const loginMessage = ref<string>('')
const registerMessage = ref<string>('')
const loginInvalidTexts = reactive<Record<string, any>>({})
const isLoginFormValid = ref<boolean>(true)
const resetPasswordFormChanged = ref<boolean>(false)
const isResetPasswordFormValid = ref<boolean>(true)
const resetPasswordInvalidTexts = reactive<Record<string, any>>({})
const LoginFormCheck = (): boolean => {
Object.assign(loginInvalidTexts, {})
validationStore.IsFieldEmpty(
authStore.loginData,
loginInvalidTexts,
'username',
'Kullanıcı adı alanını doldurmalısınız. Örn: isim@alanadi.td'
)
validationStore.IsFieldEmpty(
authStore.loginData,
loginInvalidTexts,
'password',
'Lütfen şifrenizi giriniz.'
)
isLoginFormValid.value = Object.keys(loginInvalidTexts).length === 0
return isLoginFormValid.value
}
const ResetPasswordFormCheck = (): boolean => {
Object.assign(resetPasswordInvalidTexts, {})
validationStore.IsFieldEmpty(
authStore.resetPasswordForm,
resetPasswordInvalidTexts,
'newPassword',
'Lütfen yeni şifrenizi giriniz.'
)
validationStore.IsFieldEmpty(
authStore.resetPasswordForm,
resetPasswordInvalidTexts,
'newPasswordRepeat',
'Lütfen yeni şifrenizi tekrar giriniz.'
)
if (
!validationStore.checkEmpty(authStore.resetPasswordForm.newPassword) &&
!validationStore.checkEmpty(authStore.resetPasswordForm.newPasswordRepeat)
) {
if (
authStore.resetPasswordForm.newPassword !==
authStore.resetPasswordForm.newPasswordRepeat
) {
isResetPasswordFormValid.value = false
resetPasswordInvalidTexts.newPasswordRepeat =
'Şifrenizi tekrar doğru girdiğinizden emin olunuz.'
}
}
isResetPasswordFormValid.value = Object.keys(resetPasswordInvalidTexts).length === 0
return isResetPasswordFormValid.value
}
return {
isLoginMessage,
loginMessageType,
loginMessage,
loginInvalidTexts,
registerMessage,
isLoginFormValid,
resetPasswordFormChanged,
isResetPasswordFormValid,
resetPasswordInvalidTexts,
LoginFormCheck,
ResetPasswordFormCheck
}
})

View File

@ -24,7 +24,7 @@
</button>
</form>
<div class="login-nav login-nav-back">
<RouterLink to="/giris">&lt; Geri</RouterLink>
<RouterLink to="/login">&lt; Geri</RouterLink>
</div>
</div>
</section>

View File

@ -3,12 +3,14 @@
<section class="section-login">
<div class="login-header">
<div class="logo-header">
<img src="@/assets/images/cekilisevi-logo-n.png" alt="MPI Çekiliş Evi" />
<img
src="@/assets/images/cekilisevi-logo-n.png"
alt="MPI Çekiliş Evi"/>
</div>
<h1>Giriş Yap</h1>
</div>
<div class="section-content">
<form action="#" id="login-form" @submit.prevent="authService.Login">
<form action="#" id="login-form" @submit.prevent="Login">
<form-input
type="email"
modelKey="username"
@ -16,11 +18,12 @@
required
label="Kullanıcı Adı (e-posta adresi)"
placeholder="eposta@alanadi.com"
:invalidText="authValidationStore.loginInvalidTexts.username" />
:invalidText="authValidationStore.invalidTexts.username" />
<form-input
type="password"
label="Şifre"
v-model="authStore.loginData.password"
required />
@ -29,38 +32,64 @@
v-if="authValidationStore.isLoginMessage">
<span>{{ authValidationStore.loginMessage }}</span>
</div>
<button
class="button-c button-second button-login"
type="submit"
@submit="authService.Login"
@click="authService.Login">
<button class="button-c button-second button-login" type="submit">
Giriş Yap
</button>
</form>
<div class="login-nav">
<RouterLink to="/sifremi-unuttum">Şifremi Unuttum</RouterLink>
<RouterLink to="/kayit-ol">Kayıt Ol</RouterLink>
<RouterLink to="/forgot-password">Şifremi Unuttum</RouterLink>
<RouterLink to="/register">Kaydol</RouterLink>
</div>
</div>
</section>
</GuestLayout>
</template>
<script setup lang="ts">
import { onBeforeMount } from 'vue'
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 '../validation/authValidationStore'
import { useAuthValidationStore } from '../stores/authValidationStore'
const authValidationStore = useAuthValidationStore()
import { useAuthService } from '../services/authService'
const authService = useAuthService()
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('/')
if(usersStore.userIsAuth) router.push('/')
})
</script>

View File

@ -339,7 +339,7 @@
</button>
</form>
<div class="login-nav login-nav-back">
<RouterLink to="/giris">&lt; Geri</RouterLink>
<RouterLink to="/login">&lt; Geri</RouterLink>
</div>
</div>
</section>
@ -355,7 +355,7 @@
const globalDataStore = useGlobalDataStore()
import { useValidationStore } from '@/stores/validationStore'
const validationStore = useValidationStore()
import { useAuthValidationStore } from '../validation/authValidationStore'
import { useAuthValidationStore } from '../stores/authValidationStore'
const authValidationStore = useAuthValidationStore()
import router from '@/router'
@ -413,7 +413,7 @@
'Başarıyla kayıt oldunuz. Kullanıcı adı ve şifreniz ile giriş yapabilirsiniz.'
authValidationStore.isLoginMessage = true
router.push('/giris')
router.push('/login')
}
} else {
uyeBilgileriStore.isFormValid = true

View File

@ -1,62 +0,0 @@
<template>
<GuestLayout>
<section class="section-login">
<div class="login-header">
<div class="logo-header">
<img src="@/assets/images/cekilisevi-logo-n.png" alt="MPI Çekiliş Evi" />
</div>
<h1>Şifremi Sıfırla</h1>
</div>
<div class="section-content">
<form id="sifremi-unuttum" @submit.prevent="authService.ResetPassword">
<form-input
type="password"
modelKey="newPassword"
v-model="authStore.resetPasswordForm.newPassword"
required
label="Yeni Şifre"
placeholder="Yeni Şifre"
:invalidText="authValidationStore.resetPasswordInvalidTexts.newPassword" />
<form-input
type="password"
modelKey="newPasswordRepeat"
v-model="authStore.resetPasswordForm.newPasswordRepeat"
required
label="Yeni Şifre Tekrar"
placeholder="Yeni Şifre Tekrar"
:invalidText="
authValidationStore.resetPasswordInvalidTexts.newPasswordRepeat
" />
<button
class="button-c button-second button-login"
type="submit"
@submit="authService.ResetPassword"
@click="authService.ResetPassword">
Şifremi Sıfırla
</button>
</form>
<div class="login-nav login-nav-back">
<RouterLink to="/giris">&lt; Geri</RouterLink>
</div>
</div>
</section>
</GuestLayout>
</template>
<script setup lang="ts">
import { onMounted } from 'vue'
import GuestLayout from '@/layouts/GuestLayout.vue'
import { useAuthStore } from '../stores/authStore'
const authStore = useAuthStore()
import { useAuthService } from '../services/authService'
const authService = useAuthService()
import { useAuthValidationStore } from '../validation/authValidationStore'
const authValidationStore = useAuthValidationStore()
import { useRoute, useRouter } from 'vue-router'
const route = useRoute()
const router = useRouter()
onMounted(() => {
if (route.query && route.query.check !== undefined)
authStore.resetCheckData = route.query.check as string
else router.push('/giris')
})
</script>

View File

@ -59,7 +59,7 @@
sort: true,
filter: {
type: 'date',
range: true
between: true
}
},
{

View File

@ -32,11 +32,11 @@
sort: true,
filter: {
type: 'date',
range: true
between: true
}
},
{
name: 'islemYapanKullanici.email',
name: 'islemYapanKullanici',
title: 'Kişi',
sort: true,
style: { width: '20%' }

View File

@ -108,6 +108,9 @@
}
const OnIkramiyeChanged = (e: Event, val: any, item: Record<string, any>) => {
piyangoDosyaKapamaStore.dosyaKapamaIkramiyeData.ikramiyeId = item.id
piyangoDosyaKapamaStore.dosyaKapamaIkramiyeData.tahhutEdilenIkramiye = `
${item.cinsi}, ${item.marka}, ${item.model}, (${item.asilTalihliAdedi} adet)
`

View File

@ -62,7 +62,6 @@ export const usePiyangoKatilimciService = defineStore('piyangoKatilimciService',
const KatilimciFileUpload = async () => {
if (piyangoKatilimciValidationStore.FileFormCheck()) {
console.log('Katilimci File Upload')
const formData = new FormData()
formData.append('excelFile', piyangoKatilimciStore.piyangoKatilimciFileFormData.excelFile)
let dt: any

View File

@ -66,10 +66,7 @@ export const usePiyangoOnayService = defineStore('piyangoOnayService', () => {
piyangoOnayStore.piyangoPanelOnayForm.izinTarihi = ''
piyangoOnayStore.piyangoPanelOnayForm.izinAciklamasi = ''
}
dataForm.append(
'onayDurumuIslemTipiId',
piyangoOnayStore.piyangoOnayForm.onayDurumuIslemTipiId
)
dataForm.append('onayDurumuIslemTipiId', piyangoOnayStore.piyangoPanelOnayForm.onayDurumuIslemTipiId)
dataForm.append('id', piyangoOnayStore.piyangoPanelOnayForm.id)
dataForm.append('onayCekilisId', String(piyangoStore.selectedLottery))
dataForm.append('kisiId', String(usersStore.userId))

View File

@ -12,7 +12,7 @@ export const connectToHub = async () => {
connection = new signalR.HubConnectionBuilder()
.withUrl(import.meta.env.VITE_SOCKET_URL, {
withCredentials: true,
withCredentials: false,
skipNegotiation: true, // WebSocket kullanırken negotiation atlanabilir
transport: signalR.HttpTransportType.WebSockets
})

View File

@ -2,10 +2,13 @@ import { defineStore } from 'pinia'
import { ref, reactive } from 'vue'
import { useGlobalStore } from '@/stores/globalStore'
import { usePiyangoStore } from './piyangoStore'
import { useUsersStore } from '@/stores/usersStore'
export const usePiyangoDosyaKapamaStore = defineStore('piyangoDosyaKapamaStore', () => {
const globalStore = useGlobalStore()
const piyangoStore = usePiyangoStore()
const usersStore = useUsersStore()
const baseDosyaKapamaData = reactive<Record<string, any>>({
katilimSekli: '',
@ -49,6 +52,8 @@ export const usePiyangoDosyaKapamaStore = defineStore('piyangoDosyaKapamaStore',
teslimEdilenIkramiye: '',
alinmayanIkramiye: '',
aciklama: '',
duzenleyenId: usersStore.userId,
ikramiyeId:'',
cekilisId: piyangoStore.selectedLottery
})
const dosyaKapamaData = reactive<Record<string, any>>({})

View File

@ -1,6 +1,6 @@
<template>
<AdminLayout>
<Breadcrumb currentPageText="Piyango Listesi" go="/"/>
<Breadcrumb currentPageText="Piyango Listesi" go="/" />
<div
class="form-inner-comment waiting-d"
v-if="!usersStore.isPanelUser && usersStore.userApproveId !== 4">
@ -18,13 +18,12 @@
:addRoute="addApiControl"
:apiList="apiList"
apiText="Piyango Listesi"
isUseRoute/>
isUseRoute />
</section>
</AdminLayout>
</template>
<script setup lang="ts">
import { ref, computed, onBeforeMount, onMounted } from 'vue'
import { useRoute } from 'vue-router'
import { ref, computed, onBeforeMount } from 'vue'
import AdminLayout from '@/layouts/AdminLayout.vue'
import { useDateStore } from '@/stores/dateStore'
@ -40,7 +39,6 @@
const piyangoServices = usePiyangoServices()
import router from '@/router'
const route = useRoute()
const loaded = ref<boolean>(false)
const apiList = ref<string>('')
@ -77,7 +75,6 @@
style: { width: '10%' }
})
if (usersStore.isAraciFirma || usersStore.isPanelUser) {
header.push({ name: 'duzenleyen', title: 'Düzenleyen' })
}
@ -110,7 +107,7 @@
sort: true,
filter: {
type: 'date',
range: true
between: true
}
}
)
@ -120,13 +117,13 @@
name: 'cekilisTarihi',
title: 'Çekiliş Tarihi',
compute: (v: Record<string, any>): string => {
if(v.piyangoAmacId === 3) return ''
if (v.piyangoAmacId === 3) return ''
else return dateStore.dateFormat({ date: v.cekilisTarihi })
},
sort: true,
filter: {
type: 'date',
range: true
between: true
}
})
}
@ -142,7 +139,7 @@
sort: true,
filter: {
type: 'date',
range: true
between: true
}
},
{
@ -155,7 +152,7 @@
sort: true,
filter: {
type: 'date',
range: true
between: true
}
}
)
@ -233,7 +230,7 @@
// tablodan herhangi bir satır tıklayınca çalısır
const OpenPiyango = (row: any) => {
router.push('detay/' + row.id+'/piyango-bilgileri')
router.push('detay/' + row.id + '/piyango-bilgileri')
}
onBeforeMount(async () => {
@ -243,13 +240,4 @@
loaded.value = true
})
onMounted(() => {
// URL query parametrelerini kontrol et ve filtreleri uygula
if (route.query.durumId) {
// Filtre parametresini ListTableContent bileşenine iletmek için
// Bu parametre otomatik olarak ListTableContent tarafından işlenecek
console.log('Durum filtresi uygulanıyor:', route.query.durumId)
}
})
</script>

View File

@ -78,7 +78,7 @@
sort: true,
filter: {
type: 'date',
range: true
between: true
}
},
{
@ -90,7 +90,7 @@
sort: true,
filter: {
type: 'date',
range: true
between: true
}
},
{
@ -102,7 +102,7 @@
sort: true,
filter: {
type: 'date',
range: true
between: true
}
},
{
@ -114,7 +114,7 @@
sort: true,
filter: {
type: 'date',
range: true
between: true
}
},
{

View File

@ -217,7 +217,6 @@
}
}
const GetIkramiyeTotalValues = async () => {
console.log(piyangoStore, 'piyangoStore')
let data = await dataStore.dataGet('Ikramiye/Cekilis/' + piyangoStore.selectedLottery +'?pageNumber=0')
//todo:page 0
if (data !== 'errorfalse') {
@ -281,7 +280,6 @@
})
}
const BasvuruBedeliMuhasebelestir = async () => {
console.log('basvuru bedeli muhasebelestir')
let data = await dataStore.dataGet(
'MuhasebeSettings/BasvuruBedeli/' + piyangoStore.selectedLottery
)

View File

@ -88,7 +88,7 @@
sort: true,
filter: {
type: 'date',
range: true
between: true
}
}
)
@ -103,7 +103,7 @@
sort: true,
filter: {
type: 'date',
range: true
between: true
}
})
}
@ -119,7 +119,7 @@
sort: true,
filter: {
type: 'date',
range: true
between: true
}
},
{
@ -132,7 +132,7 @@
sort: true,
filter: {
type: 'date',
range: true
between: true
}
}
)

View File

@ -153,10 +153,7 @@
}
const loadSliders = async () => {
const data = await dataStore.dataGet('Slider')
console.log('apidata', data)
sliders.value = data
console.log(sliders.value)
}
const save = async () => {

View File

@ -86,7 +86,7 @@
sort: true,
filter: {
type: 'date',
range: true
between: true
}
},
{
@ -98,7 +98,7 @@
sort: true,
filter: {
type: 'date',
range: true
between: true
}
},
{
@ -110,7 +110,7 @@
sort: true,
filter: {
type: 'date',
range: true
between: true
}
},
{
@ -122,7 +122,7 @@
sort: true,
filter: {
type: 'date',
range: true
between: true
}
},
{

View File

@ -66,7 +66,7 @@
},
filter: {
type: 'date',
range: true
between: true
},
style: { width: '10%' }
},

View File

@ -51,7 +51,7 @@
sort: true,
filter: {
type: 'date',
range: true
between: true
},
style:{width:'15%'}
},

View File

@ -63,7 +63,7 @@
},
filter: {
type: 'date',
range: true
between: true
},
style: { width: '10%' }
},

View File

@ -39,7 +39,7 @@ router.beforeEach((to, from) => {
const usersStore = useUsersStore()
if (to.meta.authRequired && !usersStore.userIsAuth && from.name !== 'Login') {
router.push('/giris')
router.push('/login')
}
})

View File

@ -1,6 +1,6 @@
{
"extends": "@vue/tsconfig/tsconfig.dom.json",
"include": ["env.d.ts", "src/**/*", "src/**/*.vue"],
"include": ["env.d.ts", "src/**/*", "src/**/*.vue", "Configs.ts"],
"exclude": ["src/**/__tests__/*"],
"compilerOptions": {
"composite": true,

View File

@ -1,11 +1,12 @@
{
"extends": "@tsconfig/node20/tsconfig.json",
"extends": "./tsconfig.json",
"include": [
"vite.config.*",
"vitest.config.*",
"cypress.config.*",
"nightwatch.conf.*",
"playwright.config.*"
"playwright.config.*",
"Configs.ts"
],
"compilerOptions": {
"composite": true,

View File

@ -3,6 +3,7 @@ import { fileURLToPath, URL } from 'node:url'
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import vueJsx from '@vitejs/plugin-vue-jsx'
import { SetTemplateGroup } from './Configs.js'
// https://vitejs.dev/config/
export default defineConfig({
@ -23,5 +24,46 @@ export default defineConfig({
},
esbuild: {
drop: process.env.NODE_ENV === 'production' ? ['console', 'debugger'] : []
},
build: {
rollupOptions: {
output: {
manualChunks(id) {
if (id.includes('/src/')) {
const group = SetTemplateGroup(id)
if (group) return `grp_${group}` // group files
}
// jquery files
if (id.includes('node_modules/jquery')) return 'ven_jquery'
if (id.includes('node_modules/summernote')) return 'ven_summer'
if (id.includes('node_modules/pdfmake')) return 'ven_pdfmake'
if (id.includes('node_modules/html-to-pdfmake')) return 'ven_pdfmake'
if (id.includes('node_modules/vue3-pdfmake')) return 'ven_pdfmake'
// other node_modules files
if (id.includes('node_modules')) return 'vendor'
},
assetFileNames: (assetInfo) => {
const name = assetInfo.names?.[0] || assetInfo.name || ''
if (name.endsWith('.css')) {
return 'static/css/[name]-[hash][extname]'
}
if (/\.(png|jpe?g|svg|gif|webp|ico)$/i.test(name)) {
return 'static/images/[name]-[hash][extname]'
}
if (/\.(ttf|woff2?|eot|otf)$/i.test(name)) {
return 'static/fonts/[name]-[hash][extname]'
}
return 'static/[name]-[hash][extname]'
},
chunkFileNames: (chunkInfo) => {
if (chunkInfo.name?.startsWith('grp_')) return 'static/js/[name]-[hash].js'
return 'static/js/[name]-[hash].js'
},
entryFileNames: 'static/js/[name]-[hash].js'
}
}
}
})