Compare commits
8 Commits
sifremi-si
...
678a96d76f
| Author | SHA1 | Date | |
|---|---|---|---|
| 678a96d76f | |||
| cb9d2f220f | |||
| 03689a01e3 | |||
| f31bd6ba9e | |||
| 5fe3a36893 | |||
| 4dae2824fb | |||
| 6d4d0c8be9 | |||
| bf047e36f3 |
23
Configs.ts
Normal file
23
Configs.ts
Normal 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
|
||||
}
|
||||
@ -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",
|
||||
|
||||
BIN
public/docs/KVKK_Sartlari.docx
Normal file
BIN
public/docs/KVKK_Sartlari.docx
Normal file
Binary file not shown.
BIN
public/docs/cekilisevi.gov.tr_Uyelik_Sozlesmesi.docx
Normal file
BIN
public/docs/cekilisevi.gov.tr_Uyelik_Sozlesmesi.docx
Normal file
Binary file not shown.
17
public/web.config
Normal file
17
public/web.config
Normal 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>
|
||||
@ -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 |
@ -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 {
|
||||
|
||||
@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -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>
|
||||
|
||||
@ -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>
|
||||
@ -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,14 +97,21 @@
|
||||
<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 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(index, filterIndex)"></span>
|
||||
</div>
|
||||
</template>
|
||||
</template>
|
||||
</div>
|
||||
</div>
|
||||
@ -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]
|
||||
})
|
||||
Object.assign(filterParams, localFilterParams.value)
|
||||
EqualObjects(filterParams, localFilterParams.value)
|
||||
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 = []
|
||||
|
||||
if (props.isUseRoute) {
|
||||
Object.keys(route.query).forEach((k) => {
|
||||
if (k.includes('Filters[')) delete route.query[k]
|
||||
})
|
||||
const q = {
|
||||
query: {
|
||||
...route.query
|
||||
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.keys(filterParams).forEach((f, k) => {
|
||||
q.query['Filters[' + f + ']'] = filterParams[f].op + filterParams[f].val
|
||||
})
|
||||
}
|
||||
|
||||
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) {
|
||||
const newQuery: Record<string, any> = {
|
||||
...route.query
|
||||
}
|
||||
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,
|
||||
() => {
|
||||
|
||||
@ -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'">
|
||||
<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] as number"
|
||||
@change="UpdateFilterSelect"
|
||||
clearable />
|
||||
</div>
|
||||
</template>
|
||||
<template v-for="(filter, i) in localFilterParams">
|
||||
<template v-if="filter.type === 'datetime-local'">
|
||||
<div class="panel-content-item">
|
||||
<form-date
|
||||
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.range !== undefined && filter.range"
|
||||
:listData="filterOperator"
|
||||
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.type === 'date'">
|
||||
<div class="panel-content-item">
|
||||
<form-date
|
||||
type="date"
|
||||
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.range !== undefined && filter.range"
|
||||
:listData="filterOperator"
|
||||
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.type === 'text'">
|
||||
<div class="panel-content-item">
|
||||
<form-input
|
||||
v-model="filter.values[0].val"
|
||||
:label="filter.title"
|
||||
@change="UpdateFilter(filter, 0)" />
|
||||
<form-select
|
||||
v-if="filter.range !== undefined && filter.range"
|
||||
:listData="filterOperator"
|
||||
v-model="filter.values[0].op"
|
||||
@change="UpdateFilter(filter, 0)"
|
||||
label="Operator" />
|
||||
</div>
|
||||
</template>
|
||||
<template v-if="filter.type === 'select'">
|
||||
<div class="panel-content-item">
|
||||
<form-select
|
||||
: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="filter.values[0].val"
|
||||
@change="UpdateFilterSelect"
|
||||
clearable />
|
||||
</div>
|
||||
</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>
|
||||
|
||||
@ -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,8 +85,10 @@
|
||||
currentTab.value = Number(d)
|
||||
}
|
||||
if (props.isUseRoute) {
|
||||
router.push({
|
||||
params: { ...route.params, tabid: props.tabList[currentTab.value].id }
|
||||
nextTick(() => {
|
||||
router.push({
|
||||
params: { ...route.params, tabid: props.tabList[currentTab.value].id }
|
||||
})
|
||||
})
|
||||
}
|
||||
CalculateNavPosition()
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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
|
||||
|
||||
@ -59,7 +59,7 @@
|
||||
sort: true,
|
||||
filter: {
|
||||
type: 'date',
|
||||
range: true
|
||||
between: true
|
||||
}
|
||||
},
|
||||
{
|
||||
|
||||
@ -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%' }
|
||||
|
||||
@ -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)
|
||||
`
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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))
|
||||
|
||||
@ -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
|
||||
})
|
||||
|
||||
@ -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>>({})
|
||||
|
||||
@ -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">
|
||||
@ -17,14 +17,13 @@
|
||||
listText="Piyango"
|
||||
:addRoute="addApiControl"
|
||||
:apiList="apiList"
|
||||
apiText="Piyango Listesi"
|
||||
isUseRoute/>
|
||||
apiText="Piyango Listesi"
|
||||
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>
|
||||
|
||||
@ -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
|
||||
}
|
||||
},
|
||||
{
|
||||
|
||||
@ -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
|
||||
)
|
||||
|
||||
@ -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
|
||||
}
|
||||
}
|
||||
)
|
||||
|
||||
@ -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 () => {
|
||||
|
||||
@ -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
|
||||
}
|
||||
},
|
||||
{
|
||||
|
||||
@ -66,7 +66,7 @@
|
||||
},
|
||||
filter: {
|
||||
type: 'date',
|
||||
range: true
|
||||
between: true
|
||||
},
|
||||
style: { width: '10%' }
|
||||
},
|
||||
|
||||
@ -51,7 +51,7 @@
|
||||
sort: true,
|
||||
filter: {
|
||||
type: 'date',
|
||||
range: true
|
||||
between: true
|
||||
},
|
||||
style:{width:'15%'}
|
||||
},
|
||||
|
||||
@ -63,7 +63,7 @@
|
||||
},
|
||||
filter: {
|
||||
type: 'date',
|
||||
range: true
|
||||
between: true
|
||||
},
|
||||
style: { width: '10%' }
|
||||
},
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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'
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user