@bilfenyazilimekibi/bilpack 1.3.32 → 1.3.34

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -335,7 +335,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
335
335
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
336
336
 
337
337
  "use strict";
338
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./helpers */ \"./src/components/bf-form/helpers.js\");\n/* harmony import */ var _components_form_image__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./components/form-image */ \"./src/components/bf-form/components/form-image.vue\");\n/* harmony import */ var _components_preview_index__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./components/preview/index */ \"./src/components/bf-form/components/preview/index.vue\");\n\n\n\n\n// import { vMaska } from \"maska\"\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n name: \"bf-form\",\n props: {\n selectedFileName: {\n default: \"\",\n },\n deleteButton: {\n default: false,\n },\n saveButton: {\n default: true,\n },\n customClass: {\n default: \"\",\n },\n previewSettings: {\n default: () => {\n return {};\n },\n },\n formButtonContent: {\n default: () => {\n return {\n title: \"Kaydet\",\n hasIcon: false,\n iconTitle: {\n default: \"\",\n },\n };\n },\n },\n formDeleteButtonContent: {\n default: () => {\n return {\n title: \"Sil\",\n hasIcon: false,\n iconTitle: {\n default: \"\",\n },\n };\n },\n },\n settings: {\n default: {},\n },\n items: {\n default: {},\n },\n endpoint: {\n default: \"\",\n },\n editOptions: {\n default: null,\n },\n showSubmit: {\n default: true,\n },\n colorPresets: {\n default: () => [\n '#EF4444', '#F97316', '#F59E0B', '#84CC16', '#22C55E',\n '#14B8A6', '#06B6D4', '#3B82F6', '#6366F1', '#A855F7',\n '#EC4899', '#78716C', '#000000', '#FFFFFF',\n ],\n },\n hasCustomSubmitSlot: {\n default: false,\n },\n },\n components: {\n imageInput: _components_form_image__WEBPACK_IMPORTED_MODULE_0__[\"default\"],\n preview: _components_preview_index__WEBPACK_IMPORTED_MODULE_1__[\"default\"],\n },\n // directives: { maska: vMaska },\n data() {\n return {\n formGroups: [],\n formItems: {},\n formIsValid: false,\n startInit: false,\n editMode: false,\n loader: false,\n editForm: null,\n show: true,\n isReady: false,\n blankUrl: \"\",\n editData: {},\n maskPhone: \"(###) ### ## ##\",\n formPreviewSettings: {\n show: true,\n customize: false,\n submitText: \"Kaydet\",\n },\n\n formSettings: {\n title: \"\",\n module: \"\",\n confirmOnSave: false,\n postMode: \"object\",\n errorMsg: \"Bir hata meydana geldi\",\n successMsg: \"\",\n confirmText: \"\",\n resetItems: false,\n redirectUrl: null,\n },\n defaultKeys: [\n {\n key: \"valueMasked\",\n defaultVal: \"\",\n },\n {\n key: \"sabmitValueMask\",\n defaultVal: false,\n },\n {\n key: \"mask\",\n defaultVal: false,\n },\n {\n key: \"maskRaw\",\n defaultVal: true,\n },\n {\n key: \"disabled\",\n defaultVal: false,\n },\n {\n key: \"show\",\n defaultVal: true,\n },\n {\n key: \"col\",\n defaultVal: 12,\n },\n {\n key: \"colStyle\",\n defaultVal: \"\",\n },\n {\n key: \"style\",\n defaultVal: \"\",\n },\n {\n key: \"maxWidth\",\n defaultVal: \"100%\",\n },\n {\n key: \"type\",\n defaultVal: \"input\",\n },\n {\n key: \"value\",\n defaultVal: \"\",\n },\n // {\n // key: 'rules',\n // defaultVal: []\n // },\n {\n key: \"errors\",\n defaultVal: [],\n },\n {\n key: \"placeholder\",\n defaultVal: \"\",\n },\n {\n key: \"showCustomError\",\n defaultVal: false,\n },\n ],\n };\n },\n computed: {\n currentMask() {\n return (item) => {\n return typeof item.mask === \"function\" ? item.mask(item) : item.mask;\n };\n },\n },\n methods: {\n deepClone: (obj) => {\n if (obj === null || typeof obj !== \"object\") {\n return obj;\n }\n\n if (Array.isArray(obj)) {\n return obj.map((item) => deepClone(item));\n }\n\n const clone = {};\n for (let key in obj) {\n if (typeof obj[key] === \"object\" || typeof obj[key] === \"function\") {\n clone[key] = deepClone(obj[key]);\n } else {\n clone[key] = obj[key];\n }\n }\n return clone;\n },\n getComboboxItems(formItem) {\n // v-combobox için string array'e çevir\n if (formItem.options.items && Array.isArray(formItem.options.items)) {\n return formItem.options.items.map((item) => {\n if (typeof item === \"string\") {\n return item;\n } else if (typeof item === \"object\" && item.text) {\n return item.text;\n } else if (typeof item === \"object\" && item.value) {\n return item.value;\n }\n return String(item);\n });\n }\n return [];\n },\n addCustomValue(formItem) {\n // Custom değeri ekle\n if (formItem.searchText && formItem.searchText.trim()) {\n const customValue = formItem.searchText.trim();\n\n // Eğer multiple ise array'e ekle, değilse direkt ata\n if (formItem.options.multiple) {\n if (!formItem.value) formItem.value = [];\n if (!formItem.value.includes(customValue)) {\n formItem.value.push(customValue);\n }\n } else {\n formItem.value = customValue;\n }\n\n // Items listesine de ekle (tekrar eklenmemesi için)\n const items = this.getComboboxItems(formItem);\n if (!items.includes(customValue)) {\n formItem.options.items.push({\n text: customValue,\n value: customValue,\n });\n }\n\n // Search text'i temizle\n formItem.searchText = \"\";\n\n // Change event'ini tetikle\n this.changeItem(formItem);\n }\n },\n sanitizeHexColorInput(value) {\n const rawValue = (value || \"\").toUpperCase();\n const hasHash = rawValue.startsWith(\"#\");\n const alphaNumericOnly = rawValue.replace(/[^A-F0-9]/g, \"\").slice(0, 6);\n if (!alphaNumericOnly && !hasHash) return \"\";\n return `#${alphaNumericOnly}`;\n },\n normalizeHexColor(value) {\n const sanitizedValue = this.sanitizeHexColorInput(value);\n const colorBody = sanitizedValue.slice(1);\n if (colorBody.length === 3 || colorBody.length === 6) {\n return sanitizedValue;\n }\n return \"\";\n },\n isHexColorValid(value) {\n return /^#([A-F0-9]{3}|[A-F0-9]{6})$/.test((value || \"\").toUpperCase());\n },\n expandHexColor(value) {\n const normalizedValue = this.normalizeHexColor(value);\n if (!normalizedValue) return \"#000000\";\n const colorBody = normalizedValue.slice(1);\n if (colorBody.length === 3) {\n return `#${colorBody\n .split(\"\")\n .map((char) => `${char}${char}`)\n .join(\"\")}`;\n }\n return normalizedValue;\n },\n getColorPreviewColor(value) {\n if (!this.isHexColorValid(value)) return \"#E5E7EB\";\n return this.expandHexColor(value);\n },\n getColorPickerValue(value) {\n return this.expandHexColor(value);\n },\n formatColorTextValue(value) {\n return this.sanitizeHexColorInput(value);\n },\n onColorPickerChange(item, value) {\n item.value = this.expandHexColor(value);\n item.errors = [];\n this.changeItem(item);\n },\n onColorTextInput(item, value) {\n item.value = this.sanitizeHexColorInput(value);\n item.errors = [];\n this.changeItem(item);\n },\n onColorPresetSelect(item, preset) {\n item.value = preset.toUpperCase();\n item.errors = [];\n this.changeItem(item);\n this.$forceUpdate();\n },\n isLightColor(hex) {\n const color = (hex || '#000000').replace('#', '');\n const full = color.length === 3\n ? color.split('').map(c => c + c).join('')\n : color;\n const r = parseInt(full.substr(0, 2), 16);\n const g = parseInt(full.substr(2, 2), 16);\n const b = parseInt(full.substr(4, 2), 16);\n return (r * 299 + g * 587 + b * 114) / 1000 > 160;\n },\n onColorTextBlur(item) {\n const normalizedValue = this.normalizeHexColor(item.value);\n if (normalizedValue) {\n item.value = normalizedValue;\n } else if (item.value === \"#\") {\n item.value = \"\";\n }\n this.changeItem(item);\n },\n // checkbox inputların tümünün seçilip seçilmediğini kontrol ediyor\n getMultipleToggleValue(formItem) {\n if (formItem.value) {\n return (\n formItem.value.length ===\n formItem.options.items.map((x) => x[formItem.options.value]).length\n );\n }\n },\n // checkbox inputların tümünün seçilmesini sağlıyor\n toggleAllOptions(formItem) {\n formItem.value = this.getMultipleToggleValue(formItem)\n ? []\n : formItem.options.items.map((x) => x[formItem.options.value]);\n this.$forceUpdate();\n },\n deleteButtonClick() {\n this.$emit(\"onDeleteClickEmit\", \"\");\n },\n async init(mode = \"create\", initOptions = null) {\n const self = this;\n\n await self.setFormSettings(mode);\n self.startInit = true;\n self.editMode = mode === \"update\";\n\n // groups\n // self.formItems = self.setDefaultKeys(self.items, mode); // ---> with reference\n\n const initItems = { ...self.items };\n // const initItems = JSON.parse(JSON.stringify(self.items))\n const handledItems = await self.setFormGroups(initItems, mode);\n self.formGroups = handledItems.initGroupArray;\n self.formItems = self.setDefaultKeys(handledItems.allItems, mode); // ---> without reference\n self.formItems = self.setFunctionKeys(self.formItems);\n self\n .setInitOptions(initOptions)\n .then(() => {\n // self.$refs['imgInput' + item.name][0].init()\n this.$forceUpdate();\n self.initSelectData(self.editMode);\n\n setTimeout(() => {\n self.isReady = true;\n });\n setTimeout(() => self.initComponents());\n setTimeout(() => {\n if (self.formPreviewSettings.show)\n self.$refs.form_preview.setItems(self.formItems);\n // if (initOptions.callback !== undefined && (typeof initOptions.callback === 'function')) initOptions.callback(self.formItems)\n });\n })\n .catch((err) => {\n console.error(\"setInitOptions error\", err);\n });\n },\n async setFormGroups(initItems, mode) {\n const self = this;\n\n const allItems = {};\n const initGroupArray = [];\n\n const defaultGroup = {\n title: \"\",\n previewType: \"default\",\n items: [],\n };\n\n Object.keys(initItems).forEach((itemKey, itemIndex) => {\n if (itemKey.includes(\"form_group\")) {\n const prevType = initItems[itemKey].previewType;\n const title = initItems[itemKey].title;\n const formGroupItems = initItems[itemKey].items;\n const obj = {\n title: title !== undefined ? title : \"\",\n previewType: prevType !== undefined ? prevType : \"default\",\n // items: Object.keys(initItems[itemKey].items).map(x => x)\n items: Object.keys(initItems[itemKey].items)\n .filter(\n (x) =>\n formGroupItems[x].onlyMode === undefined ||\n formGroupItems[x].onlyMode === mode\n )\n .map((x) => x),\n };\n\n initGroupArray.push(obj);\n\n Object.keys(initItems[itemKey].items).forEach((val) => {\n allItems[val] = initItems[itemKey].items[val];\n // if sub group on development\n });\n } else {\n if (\n initItems[itemKey].onlyMode === undefined ||\n initItems[itemKey].onlyMode === mode\n )\n defaultGroup.items.push(itemKey);\n allItems[itemKey] = initItems[itemKey];\n\n if (defaultGroup.items.length !== 0) {\n const nextElement = Object.keys(initItems)[itemIndex + 1];\n if (\n nextElement === undefined ||\n nextElement.includes(\"form_group\")\n ) {\n initGroupArray.push(JSON.parse(JSON.stringify(defaultGroup)));\n defaultGroup.items = [];\n }\n }\n }\n });\n\n return { initGroupArray, allItems };\n },\n async setFormSettings(formMode) {\n const self = this;\n const formSettingsObj =\n self.settings[formMode] !== undefined\n ? self.settings[formMode]\n : self.settings;\n const formPreviewSettingsObj =\n self.previewSettings[formMode] !== undefined\n ? self.previewSettings[formMode]\n : self.previewSettings;\n self.formSettings = Object.assign(self.formSettings, formSettingsObj);\n self.formPreviewSettings = Object.assign(\n self.formPreviewSettings,\n formPreviewSettingsObj\n );\n self.$forceUpdate();\n },\n async updateFormSettings(type = \"form\", key, value) {\n const self = this;\n // type = formSettings, formPreviewSettings\n const settingsType =\n type === \"preview\" ? \"formPreviewSettings\" : \"formSettings\";\n self[settingsType][key] = value;\n self.$forceUpdate();\n },\n initComponents() {\n const self = this;\n Object.keys(self.formItems).forEach((itemKey) => {\n const item = self.formItems[itemKey];\n if (item.type === \"image\") self.$refs[\"imgInput\" + item.name][0].init();\n });\n },\n setInitOptions(initOptions) {\n const self = this;\n return new Promise((resolve, reject) => {\n if (initOptions !== null) {\n if (initOptions.defaultValues !== undefined) {\n // TODO try to to aciton with setValues(initOptions.defaultValues) and remove code bellow if it's success\n Object.keys(initOptions.defaultValues).forEach((itemKey) => {\n const defaultItemVal = initOptions.defaultValues[itemKey];\n const formItem = self.formItems[itemKey];\n if (formItem !== undefined) {\n formItem.value = defaultItemVal;\n if (formItem.type === \"color\") {\n formItem.value =\n self.normalizeHexColor(defaultItemVal) || \"#000000\";\n }\n if (formItem.mask) formItem.valueMasked = defaultItemVal;\n if (formItem.type === \"date\") {\n // formItem.dateTextField = defaultItemVal;\n formItem.dateTextField = self.dateToString(defaultItemVal);\n }\n }\n });\n\n setTimeout(() => {\n resolve();\n });\n }\n if (initOptions.fetch !== undefined) {\n const params =\n initOptions.fetch.params !== undefined\n ? initOptions.fetch.params\n : \"\";\n self.$axios\n .post(\n self.$axios.defaults.baseURL + initOptions.fetch.endpoint,\n params\n )\n .then((res) => {\n const result = res.data.data;\n const data = Array.isArray(result) ? result[0] : result;\n if (initOptions.setByKey !== undefined) {\n // country id null ise (daha önce ülke bölge seçilmediyse)\n if (data.countryId === null) {\n initOptions.setByKey.country = \"1\";\n }\n Object.keys(initOptions.setByKey).forEach((key) => {\n const addKeyVal = initOptions.setByKey[key];\n const formItem = self.formItems[key];\n\n if (formItem !== undefined) {\n if (\n formItem.type === \"select-relation\" ||\n (formItem.type === \"select-data\" &&\n formItem.options.multiple)\n ) {\n data[key] = (0,_helpers__WEBPACK_IMPORTED_MODULE_2__.arrayValToStr)(data[addKeyVal]);\n } else {\n data[key] = data[addKeyVal];\n }\n }\n });\n }\n\n this.$forceUpdate();\n\n self.setValues(data);\n self.editData = self.setEditData(data, initOptions);\n setTimeout(() => resolve());\n });\n }\n } else {\n resolve();\n }\n });\n },\n setEditData(fetchData, initOptions) {\n const includeOnPost = initOptions.setByKey;\n let includeData = {};\n if (includeOnPost !== undefined) {\n Object.keys(includeOnPost).forEach((key) => {\n const includeItemKey = includeOnPost[key];\n includeData[key] = fetchData[includeItemKey];\n });\n }\n return includeData;\n },\n setValues(values) {\n const self = this;\n\n Object.keys(values).forEach((valueKey) => {\n const item = self.formItems[valueKey];\n const value = values[valueKey];\n if (item !== undefined) {\n item.value = value;\n if (item.type === \"color\") {\n item.value = self.normalizeHexColor(value) || \"#000000\";\n }\n if (item.mask) item.valueMasked = value;\n\n if (item.options.replaceVal !== undefined) {\n item.options.replaceVal.forEach((setting) => {\n if (value === setting.detect) item.value = setting.to;\n });\n }\n\n if (item.type !== \"select-relation\" && item.type !== \"select-data\") {\n item.valueText = item.value;\n }\n\n if (item.type === \"date\") {\n // item.dateTextField = item.value\n item.dateTextField = self.dateToString(item.value);\n }\n }\n });\n\n this.$forceUpdate();\n },\n initSelectData(isEdit = false) {\n const self = this;\n\n Object.keys(self.formItems).forEach((itemKey) => {\n const item = self.formItems[itemKey];\n let status = true;\n if (item.type === \"select-data\" || item.type === \"select-relation\") {\n let params = \"\";\n if (item.type === \"select-relation\") {\n if (!item.options.start && !isEdit) status = false;\n // if (isEdit && (item.value === null || item.value === '')) status = false;\n if (\n isEdit &&\n !item.options.start &&\n (item.value === null || item.value === \"\")\n )\n status = false;\n params = self.setParams(item, item.options.params);\n } else {\n params =\n item.options.params !== undefined ? item.options.params : \"\";\n }\n\n if (status)\n self.fetchSelectItems(\n item,\n item.options.endpoint,\n params,\n item.value\n );\n }\n });\n },\n reInitSelect(name, params = \"\", value = null) {\n const self = this;\n const item = self.formItems[name];\n if (item !== undefined)\n self.fetchSelectItems(item, item.options.endpoint, params, value);\n },\n async fetchSelectItems(\n item,\n endpoint = null,\n params = \"\",\n setValue = null,\n selectedValue = null\n ) {\n const self = this;\n\n item.loader = true;\n\n // self.$axios.post(self.$axios.defaults.baseURL + initOptions.fetch.endpoint, params)\n\n // TODO bilems de nerde kullanıldı?\n // findIdEndingKey(obj) {\n // for (let key in obj) {\n // if (key.endsWith('id')) {\n // return key;\n // }\n // }\n // return null;\n // },\n // if (currentId) {\n // let idEndingKey = self.findIdEndingKey(params);\n // params[idEndingKey] = currentId\n // }\n\n let url = endpoint !== null ? endpoint : item.options.endpoint;\n if (url) {\n if (url.includes(\"...\")) {\n const baseUrl = self.$axios.defaults.baseURL.split(\"/bildash\")[0];\n url = baseUrl + url.split(\"...\")[1];\n }\n }\n\n const res = await self.$axios.post(url, params);\n if (res.data.status) {\n item.options.disabled = false;\n // Eğer gelen selectbox içerikleri tek bir endpoint içinde toplandı ise key'ine göre items alanını dolduruyoruz.\n if (item.options.contentType === \"all\") {\n const allCategories = res.data.data;\n item.options.items = allCategories.find(\n (x) => x.type === item.options.contentKey\n ).children;\n } else {\n item.options.items =\n item.filterBY !== undefined\n ? res.data.data.filter(\n (x) => x[item.filterBY.key] === item.filterBY.value\n )\n : res.data.data;\n }\n // if (setValue !== null || setValue !== \"\") self.setMultiSelectData(item, setValue);\n if (\n item.options.defaultOptions !== undefined &&\n Array.isArray(item.options.defaultOptions)\n ) {\n item.options.defaultOptions.forEach((val) =>\n item.options.items.unshift(val)\n );\n }\n if (item.type === \"select-relation\" || item.type === \"select-data\") {\n item.valueText = (0,_helpers__WEBPACK_IMPORTED_MODULE_2__.getSelectText)(item);\n }\n\n // Eğer sort değeri varsa sıralama yap\n if (item.options.sort) {\n self.applySortToItem(item);\n }\n\n item.loader = false;\n this.$forceUpdate();\n setTimeout(() => {\n self.$emit(\"onFetchSelect\", item, selectedValue);\n });\n }\n },\n updateElement(itemName, keyToChange, value) {\n const item = this.formItems[itemName];\n if (item) {\n const keys = keyToChange.split(\".\");\n let currentObj = item;\n\n for (let i = 0; i < keys.length - 1; i++) {\n const key = keys[i];\n if (!currentObj[key]) {\n currentObj[key] = {};\n }\n currentObj = currentObj[key];\n }\n\n const finalKey = keys[keys.length - 1];\n currentObj[finalKey] = value;\n\n this.$forceUpdate();\n } else {\n console.error(\n `Element couldn't be updated. No name key (${itemName}) available`\n );\n }\n },\n // setMultiSelectData(item, value) {\n // // ---> this function is about the multiselect-vue plugin. Not need anymore <---\n // if (item.value) {\n // if (item.value.includes('[') && item.value.includes(']')) {\n // // is array\n // const newArray = [];\n // JSON.parse(item.value).forEach(val => {\n // const findObj = item.options.items.find(x => x[item.options.value] === val);\n // if (findObj) newArray.push(findObj)\n // });\n //\n // item.options.model = newArray\n //\n // } else {\n // const findObj = item.options.items.find(x => x[item.options.value] === value);\n // item.options.model = findObj;\n // }\n // }\n // },\n setFunctionKeys(items) {\n const self = this;\n /*\n this function is need because on the preview functions we are using JSON.stringify\n After this the functions will be automatically null because stringify does not support functions\n */\n\n Object.keys(items).forEach((itemKey) => {\n const item = items[itemKey];\n const propsItem = self.items[itemKey];\n\n if (item.type === \"select-relation\" && propsItem !== undefined) {\n item.options.paramsCallback =\n propsItem.options.paramsCallback !== undefined\n ? propsItem.options.paramsCallback\n : null;\n }\n });\n\n return items;\n },\n setDefaultKeys(items, formMode) {\n const self = this;\n\n Object.keys(items).forEach((itemKey) => {\n const item = items[itemKey];\n\n if (item.valueText === undefined) item.valueText = \"\";\n\n if (item.onlyMode !== undefined && item.onlyMode !== formMode)\n delete items[itemKey];\n\n if (item.name === undefined) item.name = itemKey;\n\n if (item.nullable === undefined) item.nullable = true;\n\n self.defaultKeys.forEach((val) => {\n if (item[val.key] === undefined) item[val.key] = val.defaultVal;\n });\n\n if (item.rules === undefined) item.rules = [];\n\n if (item.required) item.rules.push((v) => !!v || \"Bu alan zorunludur!\");\n\n if (item.min !== undefined) {\n item.rules.push(\n (v) =>\n (v && v.length >= item.min) ||\n \"Bu alan minimum \" + item.min + \" karakter olabilir.\"\n );\n }\n\n if (item.max !== undefined) {\n item.rules.push(\n (v) =>\n (v || \"\").length <= item.max ||\n \"Bu alan maksimum \" + item.max + \" karakter olabilir.\"\n );\n }\n\n if (item.type === \"select\") {\n if (item.callback === undefined) item.callback = null;\n if (item.options.label === undefined) item.options.label = \"text\";\n if (item.options.value === undefined) item.options.value = \"value\";\n if (item.options.allowCustom === undefined)\n item.options.allowCustom = false;\n }\n\n // if (item.type === 'multiselect') {\n // if (item.callback === undefined) item.callback = null;\n // if (item.options.disabled === undefined) item.options.disabled = true;\n // if (item.options.addDynamic === undefined) item.options.addDynamic = null;\n // item.loader = true;\n // item.options.items = [];\n // item.options.model = null\n // }\n\n if (item.type === \"select-data\") {\n if (item.callback === undefined) item.callback = null;\n if (item.options.multiple === undefined)\n item.options.multiple = false;\n item.loader = true;\n item.options.items = [];\n // item.valueText = ''\n }\n\n if (item.type === \"select-relation\") {\n item.loader = false;\n item.options.items = [];\n if (item.options.start === undefined) item.options.start = false;\n if (item.options.target === undefined)\n item.options.target = { reset: [], activate: [] };\n if (item.options.disabled === undefined) item.options.disabled = true;\n if (item.options.addDynamic === undefined)\n item.options.addDynamic = null;\n // item.valueText = ''\n // if(!item.options.start) item.disabled = true\n // if (item.options.resetItems === undefined) item.options.resetItems = [];\n }\n\n if (item.type === \"date\" && item.dateMenu === undefined)\n item.dateMenu = false;\n if (item.type === \"date\" && item.dateTextField === undefined)\n item.dateTextField = \"\";\n\n if (item.type === \"color\") {\n if (item.value === undefined || item.value === \"\") {\n item.value = \"#000000\";\n } else {\n item.value = self.normalizeHexColor(item.value) || \"#000000\";\n }\n }\n\n if (item.type === \"image\") item.defaultVal = null;\n\n if (item.options === undefined) item.options = {};\n });\n\n return items;\n },\n getFormValue() {\n const self = this;\n const obj = {};\n Object.keys(self.formItems).forEach((itemKey) => {\n const item = self.formItems[itemKey];\n obj[item.name] = item.value;\n });\n return obj;\n },\n cleanSpaces(value) {\n return value.replace(/\\s+/g, \"\");\n },\n // form gönderilidiğinde çalışır\n async onSubmit() {\n const self = this;\n const result = self.checkForm();\n\n if (result.status) {\n // success\n // axios post\n\n const obj = self.editMode\n ? Object.assign(self.editData, result.obj)\n : result.obj;\n const text = self.editMode\n ? self.formSettings.module +\n \" güncellenecek, güncellemek istediğinize emin misiniz?\"\n : self.formSettings.module +\n \" eklenecek, eklemek istediğinize emin misiniz?\";\n\n let endpoint = \"\";\n\n if (typeof self.endpoint === \"object\") {\n endpoint = self.editMode\n ? self.endpoint.update\n : self.endpoint.create;\n } else if (typeof self.endpoint === \"string\") {\n endpoint = self.endpoint;\n }\n\n // const finalObj = {};\n // Object.keys(obj).forEach(itemKey => {\n // const item = self.formItems[itemKey];\n // if (item === undefined) return;\n // if (item.value === '' && item.nullable) return;\n // finalObj[itemKey] = obj[itemKey];\n // });\n Object.keys(obj).forEach((objKey) => {\n if (obj[objKey] === \"\") {\n obj[objKey] = null;\n }\n });\n let finalObj = obj;\n if (self.formSettings.postMode === \"formData\") {\n const formData = new FormData();\n Object.keys(obj).forEach((itemKey) => {\n if (obj[itemKey]) {\n formData.append(itemKey, obj[itemKey]);\n }\n });\n\n finalObj = formData;\n }\n\n if (self.formSettings.confirmOnSave) {\n const confirmText =\n self.formSettings.confirmText !== \"\"\n ? self.formSettings.confirmText\n : text;\n\n self.$refs[\"form_swal\"].confirm({\n onConfirm: async () => {\n await self.handleSave(endpoint, finalObj);\n },\n title: \"Emin misiniz?\",\n text: confirmText,\n });\n // await self.$store.dispatch('swall/setSwall', {\n // type: 'confirm',\n // options: {\n // onConfirm: async () => {\n // await self.handleSave(endpoint, finalObj)\n // },\n // title: 'Emin misiniz?',\n // text: confirmText,\n // }\n // })\n } else {\n await self.handleSave(endpoint, finalObj);\n }\n }\n },\n async handleSave(endpoint, params) {\n const self = this;\n self.loader = true;\n\n // errorMsg: '',\n // successMsg: '',\n try {\n const copyParams = params ? JSON.parse(JSON.stringify(params)) : {};\n const { data, status, message } = await self.$axios.$post(\n endpoint,\n params\n );\n if (status) {\n self.loader = false;\n if (self.formSettings.resetItems) {\n let items = Object.values(self.formItems);\n items.forEach((item, key) => {\n item.value = null;\n item.valueText = null;\n });\n }\n const successText = self.editMode\n ? self.formSettings.module + \" güncellendi.\"\n : self.formSettings.module + \" eklendi.\";\n if (self.formSettings.redirectUrl !== null) {\n self.$refs[\"form_swal\"].close();\n setTimeout(async () => {\n // await self.$router.push(self.formSettings.redirectUrl)\n const routeObj = {\n path: self.formSettings.redirectUrl,\n };\n if (self.formSettings.setQuery !== undefined)\n routeObj.query = self.formSettings.setQuery;\n await self.$router.push(routeObj);\n }, 300);\n } else {\n self.$refs[\"form_swal\"].success({\n title: \"İşlem tamamlandı!\",\n text: successText,\n });\n // await self.$store.dispatch('swall/setSwall', {\n // type: 'success',\n // options: {\n // title: 'İşlem tamamlandı!',\n // text: successText\n // }\n // })\n if (self.formSettings.resetItems) self.onReset();\n }\n // TODO handle if resData and bodyParams are type of FormData\n self.$emit(\"onSuccess\", {\n formItems: self.formItems,\n resData: data,\n bodyPrams: copyParams,\n });\n } else {\n self.loader = false;\n throw { message };\n }\n } catch (e) {\n const errText =\n e.message !== undefined ? e.message : self.formSettings.errorMsg;\n self.$refs[\"form_swal\"].error({\n title: \"Hata!\",\n text: errText,\n });\n // await self.$store.dispatch('swall/setSwall', {\n // type: 'error',\n // options: {\n // title: 'Hata!',\n // text: errText\n // }\n // })\n self.$emit(\"onError\");\n }\n },\n resetItems() {\n this.onReset();\n },\n // form elementlerini resetler\n onReset() {\n const self = this;\n\n Object.keys(self.formItems).forEach((itemKey) => {\n const item = self.formItems[itemKey];\n item.value = \"\";\n item.valueText = \"\";\n item.errors = [];\n if (item.mask) item.valueMasked = \"\";\n if (item.type === \"multiselect\") item.options.model = null;\n if (item.type === \"select-relation\") {\n if (!item.options.start) item.options.items = [];\n // item.options.model = null\n }\n });\n self.$refs.ref_form.resetValidation();\n\n if (self.$refs.form_preview)\n self.$refs.form_preview.setItems(self.formItems);\n\n self.$emit(\"resetAfter\");\n self.$forceUpdate();\n },\n validateRule(value, rules) {\n for (const rule of rules) {\n const validationResult = rule(value);\n if (validationResult !== true) {\n return { status: false, message: validationResult };\n }\n }\n return { status: true, message: \"\" };\n },\n checkForm() {\n const self = this;\n let status = self.$refs.ref_form.validate();\n const obj = {};\n\n Object.keys(self.formItems).forEach((itemKey) => {\n const item = self.formItems[itemKey];\n\n // image alanları için required kontrolü\n if (item.type === \"image\" && item.required) {\n if (!item.value) {\n item.errors = [{ msg: \"Bu alan zorunludur!\" }];\n status = false;\n } else {\n item.errors = [];\n }\n }\n\n // color alanları için validasyon (formda input olmadığı için)\n if (item.type === \"color\") {\n const val = item.value || \"\";\n const err = [];\n if (item.required && !val) err.push({ msg: \"Bu alan zorunludur!\" });\n if (val && !self.isHexColorValid(val))\n err.push({ msg: \"Renk formatı #RGB veya #RRGGBB olmalıdır.\" });\n const rulesValidation = self.validateRule(val, item.rules);\n if (!rulesValidation.status) err.push({ msg: rulesValidation.message });\n if (err.length > 0) status = false;\n item.errors = err;\n }\n\n // if (item.mask) {\n // //değere ait boşlukları sil, eğer değer null değilse\n // self.formItems[itemKey].value = this.cleanSpaces(self.formItems[itemKey].value);\n // self.formItems[itemKey].valueText = this.cleanSpaces(self.formItems[itemKey].valueText);\n // }\n\n if (item.mask) {\n const val =\n typeof item.value === \"string\" ? item.value.trim() : item.value;\n const err = [];\n if (item.required && !val) err.push(\"Bu alan zorunludur!\");\n const rulesValidation = self.validateRule(val, item.rules);\n if (!rulesValidation.status) err.push(rulesValidation.message);\n if (err.length > 0) status = false;\n item.errors = err;\n }\n\n if (item.type === \"custom\") {\n let checkStatus = self.checkCustomErrors(item);\n if (!checkStatus) status = false;\n }\n\n if (item.submitExclude) return;\n obj[item.name] = Array.isArray(item.value)\n ? JSON.stringify(item.value).replace(/\"/g, \"\")\n : item.value;\n });\n\n this.$forceUpdate();\n\n return {\n status: status,\n obj: obj,\n };\n },\n // maskelenmiş değeri maskelenmemiş hale çevirmek ve o şekilde göndermek için kullanılıyor.\n changeMaskedItem(maskedValue, item) {\n const self = this;\n const { mask, maskRaw } = item;\n\n const rawValue = maskedValue.replace(/\\D/g, \"\");\n item.value = maskRaw ? rawValue : maskedValue;\n self.$forceUpdate();\n // item.valueMasked = item\n self.changeItem(item);\n },\n // valueText değerini değişen değere eşitlemek için kullanılıyor.//\n // valueText değeri text olmayan bir değerin text karşılığına verdiğimiz değer oluyor. Örneğin value değeri '0' olan bir datanın value textDeğeri 'yapılmadı' olabilir //\n // onSingleSelect adında bir emiti çalıştırıyor. Bu emit değişen item değerini döndürüyor.\n changeItem(item, event) {\n const self = this;\n // if (item.rules !== null) self.checkCustomErrors(item);\n if (item.options.replaceVal !== undefined) {\n item.options.replaceVal.forEach((setting) => {\n if (item.value === setting.detect) {\n item.value = setting.to;\n }\n });\n }\n\n if (item.type === \"select-relation\" || item.type === \"select-data\") {\n item.valueText = (0,_helpers__WEBPACK_IMPORTED_MODULE_2__.getSelectText)(item);\n } else {\n item.valueText = item.value;\n }\n\n if (item.type === \"select-relation\") self.selectDataChange(item);\n self.$emit(\"onSingleSelect\", item, self.formItems);\n self.$forceUpdate();\n if (self.formPreviewSettings.show) {\n self.$refs.form_preview.setItems(self.formItems);\n }\n },\n checkCustomErrors(item) {\n const self = this;\n const errors = [];\n\n Object.keys(item).forEach((itenKey) => {\n const findCheckValue = item[itenKey]; // required, min, max etc.\n let value = item.value;\n\n if (value === null || value === undefined) value = \"\";\n\n if (Array.isArray(value)) {\n if (value.length === 0) value = \"\";\n } else {\n value = item.type === \"image\" ? value : value.trim();\n }\n\n switch (itenKey) {\n case \"required\":\n if (findCheckValue && value === \"\") {\n errors.push({\n show: true,\n key: \"thisFieldRequired\",\n msg: \"Bu alan zorunludur!\",\n val: \"\",\n });\n }\n break;\n case \"max\":\n if (value.length > findCheckValue) {\n errors.push({\n show: true,\n key: \"maxDynamic\",\n msg: `Bu alan maksimum ${findCheckValue} karakter olabilir.`,\n val: findCheckValue,\n });\n }\n break;\n case \"min\":\n if (value.length < findCheckValue) {\n errors.push({\n show: true,\n key: \"minDynamic\",\n msg: `Bu alan minimum ${findCheckValue} karakter olabilir.`,\n val: findCheckValue,\n });\n }\n break;\n case \"custom\":\n // TODO custom\n // if (!findCheckValue.func(value)) {\n // errors.push({\n // show: true,\n // msg: ruleValue.msg,\n // val: ruleValue\n // })\n // }\n\n break;\n default:\n // code block\n }\n });\n\n self.formItems[item.name].errors = errors;\n\n return !errors.length > 0;\n },\n selectDataChange(formItem) {\n // formItem.value = val !== null ? val[formItem.options.value] : null;\n //\n // if (formItem.multiple !== undefined && (formItem.multiple)) {\n // const multiVal = [];\n // val.forEach(item => {\n // multiVal.push(item[formItem.options.value])\n // });\n // formItem.value = JSON.stringify(multiVal);\n // }\n if (formItem.type === \"select-relation\")\n this.changeRelationSelect(formItem);\n this.$forceUpdate();\n this.$emit(\"onSelect\", formItem, this.formItems);\n },\n changeRelationSelect(formItem) {\n const self = this;\n\n const targetOptions = formItem.options.target;\n const selectedValue = formItem.value;\n\n targetOptions.reset.forEach((itemKey) => {\n const item = self.formItems[itemKey];\n if (item === undefined) {\n console.warn(\n \"warning: no target reset item on form items like -> \",\n itemKey\n );\n return;\n }\n item.value = \"\";\n item.options.items = [];\n if (\n item.options.withoutDisable !== undefined &&\n item.options.withoutDisable\n ) {\n item.options.disabled = false;\n } else {\n item.options.disabled = true;\n }\n });\n\n if (formItem.value !== \"\" && formItem.value !== null) {\n targetOptions.activate.forEach((itemKey) => {\n const item = self.formItems[itemKey];\n if (item === undefined) {\n console.warn(\n \"warning: no target activate item on form items like -> \",\n itemKey\n );\n return;\n }\n\n const params = self.setParams(item, item.options.params);\n\n self.fetchSelectItems(\n item,\n item.options.endpoint,\n params,\n null,\n selectedValue\n );\n });\n }\n },\n setParams(item, params) {\n const self = this;\n\n if (params === undefined) return \"\";\n\n let obj = {};\n\n Object.keys(params).forEach((val) => {\n const paramItem = params[val];\n if (params[val] !== null) {\n const findItem = self.formItems[paramItem];\n const itemVal = findItem ? findItem.value : null;\n obj[val] = itemVal;\n } else {\n obj[val] = null;\n }\n });\n\n if (\n item.options.paramsCallback !== null &&\n typeof item.options.paramsCallback === \"function\"\n ) {\n obj = item.options.paramsCallback(obj);\n }\n\n return obj;\n },\n // submitDynamicSelect(formItem) {\n // const self = this;\n // const refName = 'multiselect_' + formItem.name;\n // const val = self.$refs[refName][0].search;\n // const options = formItem.options.addDynamic;\n // const param = options.params !== undefined ? {[options.params]: val} : val;\n // self.$swal({\n // title: 'Emin misiniz?',\n // text: options.module + \" eklenecek, eklemek istediğinize emin misiniz?\",\n // type: 'warning',\n // showCancelButton: true,\n // confirmButtonColor: '#1dc722',\n // cancelButtonColor: '#d33',\n // confirmButtonText: 'Evet, ekle!',\n // cancelButtonText: 'Vazgeç'\n // }).then((result) => {\n // if (result.value) {\n // self.$axios.$post(this.$axios.defaults.baseURL + options.endpoint, param)\n // .then((data) => {\n // if (data.status) {\n // self.$swal('İşlem tamamlandı!', options.module + ' eklendi.', 'success')\n // let params\n // if (formItem.type === 'select-relation') {\n // params = self.setParams(formItem, formItem.options.params);\n // } else {\n // params = formItem.options.params !== undefined ? formItem.options.params : '';\n // }\n // self.fetchSelectItems(formItem, formItem.options.endpoint, params, formItem.value);\n // } else {\n // self.$swal('Hata!', '' + data.message + '', 'error');\n // }\n // })\n // .catch(err => {\n // self.$swal('Hata!', 'Bir hata meydana geldi', 'error')\n // })\n // }\n // })\n // },\n\n // bilgisayardan seçilen dosyanın inputa set edilmesini sağlıyor.\n // emit ismi: setFileVal, emit değeri: bilgisayardan seçilen dosya\n setFileVal(data) {\n this.formItems[data.name].value = data.file;\n this.$forceUpdate();\n this.$emit(\"setFileVal\", {\n file: data.file,\n });\n },\n autocompleteFilter(formItem, item, queryText, itemText) {\n let textOne;\n if (!isNaN(item[formItem.options.label])) {\n textOne = JSON.stringify(item[formItem.options.label]);\n } else {\n if (\n formItem.options.type === \"mergeInput\" ||\n Array.isArray(formItem.options.label)\n ) {\n for (let i = 0; i <= formItem.options.label.length; i++) {\n if (item[formItem.options.label[i]] !== undefined) {\n textOne +=\n \" \" +\n item[formItem.options.label[i]].toLocaleLowerCase(\"tr-TR\");\n }\n }\n } else {\n textOne = item[formItem.options.label].toLocaleLowerCase(\"tr-TR\");\n }\n }\n const searchText = queryText.toLocaleLowerCase(\"tr-TR\");\n return textOne.indexOf(searchText) > -1;\n },\n // seçilen input değerinin sonuna backend tarafından gelen 'mergeLabel' değrini eklemek için kullanılıyor.\n setItemText(item, formItem) {\n const formText = formItem.options.label;\n const mergeText = formItem.options.mergeLabel;\n if (Array.isArray(formText)) {\n let str = \"\";\n formText.forEach((val) => {\n str += item[val] !== undefined ? item[val] + \" \" : val + \" \";\n });\n return str.trim();\n } else {\n return mergeText\n ? item[formText] + \" \" + item[mergeText]\n : item[formText];\n }\n },\n // date input elementinde girilen tarih değerinin input üzerinde de değişmesini sağlar.\n // girilen değeri kullanıcıya \"DD-MM-YYYY\" formatında gösterir fakat bu değeri gönderirken \"YYYY-MM-DD\" formatında gönderir.\n parseDate(formItem, isPicker = false) {\n const self = this;\n if (isPicker) {\n formItem.dateMenu = false;\n // formItem.dateTextField = formItem.value\n formItem.dateTextField = self.dateToString(formItem.value);\n self.$forceUpdate();\n } else {\n const regex = /\\d{4}\\-(0[1-9]|1[012])\\-(0[1-9]|[12][0-9]|3[01])$/g;\n // const textField = formItem.dateTextField\n const textField = self.stringToDate(formItem.dateTextField);\n\n if (regex.test(textField)) {\n formItem.value = textField;\n } else {\n formItem.dateTextField = \"\";\n }\n }\n this.changeItem(formItem);\n this.$forceUpdate();\n },\n // date input elementinde \"YYYY-MM-DD\" olan formatı \"DD-MM-YYYY\" şeklinde değiştirir.\n dateToString(date) {\n try {\n const [year, month, day] = date.split(\"-\");\n return `${day}-${month}-${year}`;\n } catch (e) {\n return date;\n }\n },\n // date input elementinde \"DD-MM-YYYY\" olan formatı \"YYYY-MM-DD\" şeklinde değiştirir.\n stringToDate(stringDate) {\n try {\n const [day, month, year] = stringDate.split(\"-\");\n return `${year}-${month.padStart(2, \"0\")}-${day.padStart(2, \"0\")}`;\n } catch (e) {\n return stringDate;\n }\n },\n // Tek bir item için sorting işlemi\n applySortToItem(item) {\n const self = this;\n\n // Sort değeri kontrolü\n if (!item.options.sort) {\n return;\n }\n\n // Select tipinde olup items array'i var mı kontrol et\n if (\n (item.type === \"select\" ||\n item.type === \"select-data\" ||\n item.type === \"select-relation\") &&\n item.options &&\n item.options.items &&\n Array.isArray(item.options.items)\n ) {\n const items = item.options.items;\n const labelKey = item.options.label || \"text\";\n const valueKey = item.options.value || \"value\";\n const sortType = item.options.sort.toLowerCase();\n\n // Sıralama fonksiyonu\n items.sort((a, b) => {\n let aValue = a[labelKey] || a[valueKey] || \"\";\n let bValue = b[labelKey] || b[valueKey] || \"\";\n\n // String değerleri küçük harfe çevir (Türkçe karakter desteği)\n if (typeof aValue === \"string\")\n aValue = aValue.toLocaleLowerCase(\"tr-TR\");\n if (typeof bValue === \"string\")\n bValue = bValue.toLocaleLowerCase(\"tr-TR\");\n\n // Sıralama yönüne göre karşılaştır\n if (sortType === \"asc\") {\n return aValue > bValue ? 1 : aValue < bValue ? -1 : 0;\n } else if (sortType === \"desc\") {\n return aValue < bValue ? 1 : aValue > bValue ? -1 : 0;\n }\n\n return 0;\n });\n }\n },\n },\n});\n\n\n//# sourceURL=webpack://@bilfenyazilimekibi/bilpack/./src/components/bf-form/index.vue?./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options");
338
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./helpers */ \"./src/components/bf-form/helpers.js\");\n/* harmony import */ var _components_form_image__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./components/form-image */ \"./src/components/bf-form/components/form-image.vue\");\n/* harmony import */ var _components_preview_index__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./components/preview/index */ \"./src/components/bf-form/components/preview/index.vue\");\n\n\n\n\n// import { vMaska } from \"maska\"\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n name: \"bf-form\",\n props: {\n searchSort: {\n type: Boolean,\n default: false\n },\n selectedFileName: {\n default: \"\",\n },\n deleteButton: {\n default: false,\n },\n saveButton: {\n default: true,\n },\n customClass: {\n default: \"\",\n },\n previewSettings: {\n default: () => {\n return {};\n },\n },\n formButtonContent: {\n default: () => {\n return {\n title: \"Kaydet\",\n hasIcon: false,\n iconTitle: {\n default: \"\",\n },\n };\n },\n },\n formDeleteButtonContent: {\n default: () => {\n return {\n title: \"Sil\",\n hasIcon: false,\n iconTitle: {\n default: \"\",\n },\n };\n },\n },\n settings: {\n default: {},\n },\n items: {\n default: {},\n },\n endpoint: {\n default: \"\",\n },\n editOptions: {\n default: null,\n },\n showSubmit: {\n default: true,\n },\n colorPresets: {\n default: () => [\n '#EF4444', '#F97316', '#F59E0B', '#84CC16', '#22C55E',\n '#14B8A6', '#06B6D4', '#3B82F6', '#6366F1', '#A855F7',\n '#EC4899', '#78716C', '#000000', '#FFFFFF',\n ],\n },\n hasCustomSubmitSlot: {\n default: false,\n },\n },\n components: {\n imageInput: _components_form_image__WEBPACK_IMPORTED_MODULE_0__[\"default\"],\n preview: _components_preview_index__WEBPACK_IMPORTED_MODULE_1__[\"default\"],\n },\n // directives: { maska: vMaska },\n data() {\n return {\n formGroups: [],\n formItems: {},\n formIsValid: false,\n startInit: false,\n editMode: false,\n loader: false,\n editForm: null,\n show: true,\n isReady: false,\n blankUrl: \"\",\n editData: {},\n maskPhone: \"(###) ### ## ##\",\n formPreviewSettings: {\n show: true,\n customize: false,\n submitText: \"Kaydet\",\n },\n\n formSettings: {\n title: \"\",\n module: \"\",\n confirmOnSave: false,\n postMode: \"object\",\n errorMsg: \"Bir hata meydana geldi\",\n successMsg: \"\",\n confirmText: \"\",\n resetItems: false,\n redirectUrl: null,\n },\n defaultKeys: [\n {\n key: \"valueMasked\",\n defaultVal: \"\",\n },\n {\n key: \"sabmitValueMask\",\n defaultVal: false,\n },\n {\n key: \"mask\",\n defaultVal: false,\n },\n {\n key: \"maskRaw\",\n defaultVal: true,\n },\n {\n key: \"disabled\",\n defaultVal: false,\n },\n {\n key: \"show\",\n defaultVal: true,\n },\n {\n key: \"col\",\n defaultVal: 12,\n },\n {\n key: \"colStyle\",\n defaultVal: \"\",\n },\n {\n key: \"style\",\n defaultVal: \"\",\n },\n {\n key: \"maxWidth\",\n defaultVal: \"100%\",\n },\n {\n key: \"type\",\n defaultVal: \"input\",\n },\n {\n key: \"value\",\n defaultVal: \"\",\n },\n // {\n // key: 'rules',\n // defaultVal: []\n // },\n {\n key: \"errors\",\n defaultVal: [],\n },\n {\n key: \"placeholder\",\n defaultVal: \"\",\n },\n {\n key: \"showCustomError\",\n defaultVal: false,\n },\n ],\n };\n },\n computed: {\n currentMask() {\n return (item) => {\n return typeof item.mask === \"function\" ? item.mask(item) : item.mask;\n };\n },\n },\n methods: {\n deepClone: (obj) => {\n if (obj === null || typeof obj !== \"object\") {\n return obj;\n }\n\n if (Array.isArray(obj)) {\n return obj.map((item) => deepClone(item));\n }\n\n const clone = {};\n for (let key in obj) {\n if (typeof obj[key] === \"object\" || typeof obj[key] === \"function\") {\n clone[key] = deepClone(obj[key]);\n } else {\n clone[key] = obj[key];\n }\n }\n return clone;\n },\n getComboboxItems(formItem) {\n // v-combobox için string array'e çevir\n if (formItem.options.items && Array.isArray(formItem.options.items)) {\n return formItem.options.items.map((item) => {\n if (typeof item === \"string\") {\n return item;\n } else if (typeof item === \"object\" && item.text) {\n return item.text;\n } else if (typeof item === \"object\" && item.value) {\n return item.value;\n }\n return String(item);\n });\n }\n return [];\n },\n addCustomValue(formItem) {\n // Custom değeri ekle\n if (formItem.searchText && formItem.searchText.trim()) {\n const customValue = formItem.searchText.trim();\n\n // Eğer multiple ise array'e ekle, değilse direkt ata\n if (formItem.options.multiple) {\n if (!formItem.value) formItem.value = [];\n if (!formItem.value.includes(customValue)) {\n formItem.value.push(customValue);\n }\n } else {\n formItem.value = customValue;\n }\n\n // Items listesine de ekle (tekrar eklenmemesi için)\n const items = this.getComboboxItems(formItem);\n if (!items.includes(customValue)) {\n formItem.options.items.push({\n text: customValue,\n value: customValue,\n });\n }\n\n // Search text'i temizle\n formItem.searchText = \"\";\n\n // Change event'ini tetikle\n this.changeItem(formItem);\n }\n },\n sanitizeHexColorInput(value) {\n const rawValue = (value || \"\").toUpperCase();\n const hasHash = rawValue.startsWith(\"#\");\n const alphaNumericOnly = rawValue.replace(/[^A-F0-9]/g, \"\").slice(0, 6);\n if (!alphaNumericOnly && !hasHash) return \"\";\n return `#${alphaNumericOnly}`;\n },\n normalizeHexColor(value) {\n const sanitizedValue = this.sanitizeHexColorInput(value);\n const colorBody = sanitizedValue.slice(1);\n if (colorBody.length === 3 || colorBody.length === 6) {\n return sanitizedValue;\n }\n return \"\";\n },\n isHexColorValid(value) {\n return /^#([A-F0-9]{3}|[A-F0-9]{6})$/.test((value || \"\").toUpperCase());\n },\n expandHexColor(value) {\n const normalizedValue = this.normalizeHexColor(value);\n if (!normalizedValue) return \"#000000\";\n const colorBody = normalizedValue.slice(1);\n if (colorBody.length === 3) {\n return `#${colorBody\n .split(\"\")\n .map((char) => `${char}${char}`)\n .join(\"\")}`;\n }\n return normalizedValue;\n },\n getColorPreviewColor(value) {\n if (!this.isHexColorValid(value)) return \"#E5E7EB\";\n return this.expandHexColor(value);\n },\n getColorPickerValue(value) {\n return this.expandHexColor(value);\n },\n formatColorTextValue(value) {\n return this.sanitizeHexColorInput(value);\n },\n onColorPickerChange(item, value) {\n item.value = this.expandHexColor(value);\n item.errors = [];\n this.changeItem(item);\n },\n onColorTextInput(item, value) {\n item.value = this.sanitizeHexColorInput(value);\n item.errors = [];\n this.changeItem(item);\n },\n onColorPresetSelect(item, preset) {\n item.value = preset.toUpperCase();\n item.errors = [];\n this.changeItem(item);\n this.$forceUpdate();\n },\n isLightColor(hex) {\n const color = (hex || '#000000').replace('#', '');\n const full = color.length === 3\n ? color.split('').map(c => c + c).join('')\n : color;\n const r = parseInt(full.substr(0, 2), 16);\n const g = parseInt(full.substr(2, 2), 16);\n const b = parseInt(full.substr(4, 2), 16);\n return (r * 299 + g * 587 + b * 114) / 1000 > 160;\n },\n onColorTextBlur(item) {\n const normalizedValue = this.normalizeHexColor(item.value);\n if (normalizedValue) {\n item.value = normalizedValue;\n } else if (item.value === \"#\") {\n item.value = \"\";\n }\n this.changeItem(item);\n },\n // checkbox inputların tümünün seçilip seçilmediğini kontrol ediyor\n getMultipleToggleValue(formItem) {\n if (formItem.value) {\n return (\n formItem.value.length ===\n formItem.options.items.map((x) => x[formItem.options.value]).length\n );\n }\n },\n // checkbox inputların tümünün seçilmesini sağlıyor\n toggleAllOptions(formItem) {\n formItem.value = this.getMultipleToggleValue(formItem)\n ? []\n : formItem.options.items.map((x) => x[formItem.options.value]);\n this.$forceUpdate();\n },\n deleteButtonClick() {\n this.$emit(\"onDeleteClickEmit\", \"\");\n },\n async init(mode = \"create\", initOptions = null) {\n const self = this;\n\n await self.setFormSettings(mode);\n self.startInit = true;\n self.editMode = mode === \"update\";\n\n // groups\n // self.formItems = self.setDefaultKeys(self.items, mode); // ---> with reference\n\n const initItems = { ...self.items };\n // const initItems = JSON.parse(JSON.stringify(self.items))\n const handledItems = await self.setFormGroups(initItems, mode);\n self.formGroups = handledItems.initGroupArray;\n self.formItems = self.setDefaultKeys(handledItems.allItems, mode); // ---> without reference\n self.formItems = self.setFunctionKeys(self.formItems);\n self\n .setInitOptions(initOptions)\n .then(() => {\n // self.$refs['imgInput' + item.name][0].init()\n this.$forceUpdate();\n self.initSelectData(self.editMode);\n\n setTimeout(() => {\n self.isReady = true;\n });\n setTimeout(() => self.initComponents());\n setTimeout(() => {\n if (self.formPreviewSettings.show)\n self.$refs.form_preview.setItems(self.formItems);\n // if (initOptions.callback !== undefined && (typeof initOptions.callback === 'function')) initOptions.callback(self.formItems)\n });\n })\n .catch((err) => {\n console.error(\"setInitOptions error\", err);\n });\n },\n async setFormGroups(initItems, mode) {\n const self = this;\n\n const allItems = {};\n const initGroupArray = [];\n\n const defaultGroup = {\n title: \"\",\n previewType: \"default\",\n items: [],\n };\n\n Object.keys(initItems).forEach((itemKey, itemIndex) => {\n if (itemKey.includes(\"form_group\")) {\n const prevType = initItems[itemKey].previewType;\n const title = initItems[itemKey].title;\n const formGroupItems = initItems[itemKey].items;\n const obj = {\n title: title !== undefined ? title : \"\",\n previewType: prevType !== undefined ? prevType : \"default\",\n // items: Object.keys(initItems[itemKey].items).map(x => x)\n items: Object.keys(initItems[itemKey].items)\n .filter(\n (x) =>\n formGroupItems[x].onlyMode === undefined ||\n formGroupItems[x].onlyMode === mode\n )\n .map((x) => x),\n };\n\n initGroupArray.push(obj);\n\n Object.keys(initItems[itemKey].items).forEach((val) => {\n allItems[val] = initItems[itemKey].items[val];\n // if sub group on development\n });\n } else {\n if (\n initItems[itemKey].onlyMode === undefined ||\n initItems[itemKey].onlyMode === mode\n )\n defaultGroup.items.push(itemKey);\n allItems[itemKey] = initItems[itemKey];\n\n if (defaultGroup.items.length !== 0) {\n const nextElement = Object.keys(initItems)[itemIndex + 1];\n if (\n nextElement === undefined ||\n nextElement.includes(\"form_group\")\n ) {\n initGroupArray.push(JSON.parse(JSON.stringify(defaultGroup)));\n defaultGroup.items = [];\n }\n }\n }\n });\n\n return { initGroupArray, allItems };\n },\n async setFormSettings(formMode) {\n const self = this;\n const formSettingsObj =\n self.settings[formMode] !== undefined\n ? self.settings[formMode]\n : self.settings;\n const formPreviewSettingsObj =\n self.previewSettings[formMode] !== undefined\n ? self.previewSettings[formMode]\n : self.previewSettings;\n self.formSettings = Object.assign(self.formSettings, formSettingsObj);\n self.formPreviewSettings = Object.assign(\n self.formPreviewSettings,\n formPreviewSettingsObj\n );\n self.$forceUpdate();\n },\n async updateFormSettings(type = \"form\", key, value) {\n const self = this;\n // type = formSettings, formPreviewSettings\n const settingsType =\n type === \"preview\" ? \"formPreviewSettings\" : \"formSettings\";\n self[settingsType][key] = value;\n self.$forceUpdate();\n },\n initComponents() {\n const self = this;\n Object.keys(self.formItems).forEach((itemKey) => {\n const item = self.formItems[itemKey];\n if (item.type === \"image\") self.$refs[\"imgInput\" + item.name][0].init();\n });\n },\n setInitOptions(initOptions) {\n const self = this;\n return new Promise((resolve, reject) => {\n if (initOptions !== null) {\n if (initOptions.defaultValues !== undefined) {\n // TODO try to to aciton with setValues(initOptions.defaultValues) and remove code bellow if it's success\n Object.keys(initOptions.defaultValues).forEach((itemKey) => {\n const defaultItemVal = initOptions.defaultValues[itemKey];\n const formItem = self.formItems[itemKey];\n if (formItem !== undefined) {\n formItem.value = defaultItemVal;\n if (formItem.type === \"color\") {\n formItem.value =\n self.normalizeHexColor(defaultItemVal) || \"#000000\";\n }\n if (formItem.mask) formItem.valueMasked = defaultItemVal;\n if (formItem.type === \"date\") {\n // formItem.dateTextField = defaultItemVal;\n formItem.dateTextField = self.dateToString(defaultItemVal);\n }\n }\n });\n\n setTimeout(() => {\n resolve();\n });\n }\n if (initOptions.fetch !== undefined) {\n const params =\n initOptions.fetch.params !== undefined\n ? initOptions.fetch.params\n : \"\";\n self.$axios\n .post(\n self.$axios.defaults.baseURL + initOptions.fetch.endpoint,\n params\n )\n .then((res) => {\n const result = res.data.data;\n const data = Array.isArray(result) ? result[0] : result;\n if (initOptions.setByKey !== undefined) {\n // country id null ise (daha önce ülke bölge seçilmediyse)\n if (data.countryId === null) {\n initOptions.setByKey.country = \"1\";\n }\n Object.keys(initOptions.setByKey).forEach((key) => {\n const addKeyVal = initOptions.setByKey[key];\n const formItem = self.formItems[key];\n\n if (formItem !== undefined) {\n if (\n formItem.type === \"select-relation\" ||\n (formItem.type === \"select-data\" &&\n formItem.options.multiple)\n ) {\n data[key] = (0,_helpers__WEBPACK_IMPORTED_MODULE_2__.arrayValToStr)(data[addKeyVal]);\n } else {\n data[key] = data[addKeyVal];\n }\n }\n });\n }\n\n this.$forceUpdate();\n\n self.setValues(data);\n self.editData = self.setEditData(data, initOptions);\n setTimeout(() => resolve());\n });\n }\n } else {\n resolve();\n }\n });\n },\n setEditData(fetchData, initOptions) {\n const includeOnPost = initOptions.setByKey;\n let includeData = {};\n if (includeOnPost !== undefined) {\n Object.keys(includeOnPost).forEach((key) => {\n const includeItemKey = includeOnPost[key];\n includeData[key] = fetchData[includeItemKey];\n });\n }\n return includeData;\n },\n setValues(values) {\n const self = this;\n\n Object.keys(values).forEach((valueKey) => {\n const item = self.formItems[valueKey];\n const value = values[valueKey];\n if (item !== undefined) {\n item.value = value;\n if (item.type === \"color\") {\n item.value = self.normalizeHexColor(value) || \"#000000\";\n }\n if (item.mask) item.valueMasked = value;\n\n if (item.options.replaceVal !== undefined) {\n item.options.replaceVal.forEach((setting) => {\n if (value === setting.detect) item.value = setting.to;\n });\n }\n\n if (item.type !== \"select-relation\" && item.type !== \"select-data\") {\n item.valueText = item.value;\n }\n\n if (item.type === \"date\") {\n // item.dateTextField = item.value\n item.dateTextField = self.dateToString(item.value);\n }\n }\n });\n\n this.$forceUpdate();\n },\n initSelectData(isEdit = false) {\n const self = this;\n\n Object.keys(self.formItems).forEach((itemKey) => {\n const item = self.formItems[itemKey];\n let status = true;\n if (item.type === \"select-data\" || item.type === \"select-relation\") {\n let params = \"\";\n if (item.type === \"select-relation\") {\n if (!item.options.start && !isEdit) status = false;\n // if (isEdit && (item.value === null || item.value === '')) status = false;\n if (\n isEdit &&\n !item.options.start &&\n (item.value === null || item.value === \"\")\n )\n status = false;\n params = self.setParams(item, item.options.params);\n } else {\n params =\n item.options.params !== undefined ? item.options.params : \"\";\n }\n\n if (status)\n self.fetchSelectItems(\n item,\n item.options.endpoint,\n params,\n item.value\n );\n }\n });\n },\n reInitSelect(name, params = \"\", value = null) {\n const self = this;\n const item = self.formItems[name];\n if (item !== undefined)\n self.fetchSelectItems(item, item.options.endpoint, params, value);\n },\n async fetchSelectItems(\n item,\n endpoint = null,\n params = \"\",\n setValue = null,\n selectedValue = null\n ) {\n const self = this;\n\n item.loader = true;\n\n // self.$axios.post(self.$axios.defaults.baseURL + initOptions.fetch.endpoint, params)\n\n // TODO bilems de nerde kullanıldı?\n // findIdEndingKey(obj) {\n // for (let key in obj) {\n // if (key.endsWith('id')) {\n // return key;\n // }\n // }\n // return null;\n // },\n // if (currentId) {\n // let idEndingKey = self.findIdEndingKey(params);\n // params[idEndingKey] = currentId\n // }\n\n let url = endpoint !== null ? endpoint : item.options.endpoint;\n if (url) {\n if (url.includes(\"...\")) {\n const baseUrl = self.$axios.defaults.baseURL.split(\"/bildash\")[0];\n url = baseUrl + url.split(\"...\")[1];\n }\n }\n\n const res = await self.$axios.post(url, params);\n if (res.data.status) {\n item.options.disabled = false;\n // Eğer gelen selectbox içerikleri tek bir endpoint içinde toplandı ise key'ine göre items alanını dolduruyoruz.\n if (item.options.contentType === \"all\") {\n const allCategories = res.data.data;\n item.options.items = allCategories.find(\n (x) => x.type === item.options.contentKey\n ).children;\n } else {\n item.options.items =\n item.filterBY !== undefined\n ? res.data.data.filter(\n (x) => x[item.filterBY.key] === item.filterBY.value\n )\n : res.data.data;\n }\n // if (setValue !== null || setValue !== \"\") self.setMultiSelectData(item, setValue);\n if (\n item.options.defaultOptions !== undefined &&\n Array.isArray(item.options.defaultOptions)\n ) {\n item.options.defaultOptions.forEach((val) =>\n item.options.items.unshift(val)\n );\n }\n if (item.type === \"select-relation\" || item.type === \"select-data\") {\n item.valueText = (0,_helpers__WEBPACK_IMPORTED_MODULE_2__.getSelectText)(item);\n }\n\n // Eğer sort değeri varsa sıralama yap\n if (item.options.sort) {\n self.applySortToItem(item);\n }\n\n item.loader = false;\n this.$forceUpdate();\n setTimeout(() => {\n self.$emit(\"onFetchSelect\", item, selectedValue);\n });\n }\n },\n updateElement(itemName, keyToChange, value) {\n const item = this.formItems[itemName];\n if (item) {\n const keys = keyToChange.split(\".\");\n let currentObj = item;\n\n for (let i = 0; i < keys.length - 1; i++) {\n const key = keys[i];\n if (!currentObj[key]) {\n currentObj[key] = {};\n }\n currentObj = currentObj[key];\n }\n\n const finalKey = keys[keys.length - 1];\n currentObj[finalKey] = value;\n\n this.$forceUpdate();\n } else {\n console.error(\n `Element couldn't be updated. No name key (${itemName}) available`\n );\n }\n },\n // setMultiSelectData(item, value) {\n // // ---> this function is about the multiselect-vue plugin. Not need anymore <---\n // if (item.value) {\n // if (item.value.includes('[') && item.value.includes(']')) {\n // // is array\n // const newArray = [];\n // JSON.parse(item.value).forEach(val => {\n // const findObj = item.options.items.find(x => x[item.options.value] === val);\n // if (findObj) newArray.push(findObj)\n // });\n //\n // item.options.model = newArray\n //\n // } else {\n // const findObj = item.options.items.find(x => x[item.options.value] === value);\n // item.options.model = findObj;\n // }\n // }\n // },\n setFunctionKeys(items) {\n const self = this;\n /*\n this function is need because on the preview functions we are using JSON.stringify\n After this the functions will be automatically null because stringify does not support functions\n */\n\n Object.keys(items).forEach((itemKey) => {\n const item = items[itemKey];\n const propsItem = self.items[itemKey];\n\n if (item.type === \"select-relation\" && propsItem !== undefined) {\n item.options.paramsCallback =\n propsItem.options.paramsCallback !== undefined\n ? propsItem.options.paramsCallback\n : null;\n }\n });\n\n return items;\n },\n setDefaultKeys(items, formMode) {\n const self = this;\n\n Object.keys(items).forEach((itemKey) => {\n const item = items[itemKey];\n\n if (item.valueText === undefined) item.valueText = \"\";\n\n if (item.onlyMode !== undefined && item.onlyMode !== formMode)\n delete items[itemKey];\n\n if (item.name === undefined) item.name = itemKey;\n\n if (item.nullable === undefined) item.nullable = true;\n\n self.defaultKeys.forEach((val) => {\n if (item[val.key] === undefined) item[val.key] = val.defaultVal;\n });\n\n if (item.rules === undefined) item.rules = [];\n\n if (item.required) item.rules.push((v) => !!v || \"Bu alan zorunludur!\");\n\n if (item.min !== undefined) {\n item.rules.push(\n (v) =>\n (v && v.length >= item.min) ||\n \"Bu alan minimum \" + item.min + \" karakter olabilir.\"\n );\n }\n\n if (item.max !== undefined) {\n item.rules.push(\n (v) =>\n (v || \"\").length <= item.max ||\n \"Bu alan maksimum \" + item.max + \" karakter olabilir.\"\n );\n }\n\n if (item.type === \"select\") {\n if (item.callback === undefined) item.callback = null;\n if (item.options.label === undefined) item.options.label = \"text\";\n if (item.options.value === undefined) item.options.value = \"value\";\n if (item.options.allowCustom === undefined)\n item.options.allowCustom = false;\n }\n\n // if (item.type === 'multiselect') {\n // if (item.callback === undefined) item.callback = null;\n // if (item.options.disabled === undefined) item.options.disabled = true;\n // if (item.options.addDynamic === undefined) item.options.addDynamic = null;\n // item.loader = true;\n // item.options.items = [];\n // item.options.model = null\n // }\n\n if (item.type === \"select-data\") {\n if (item.callback === undefined) item.callback = null;\n if (item.options.multiple === undefined)\n item.options.multiple = false;\n item.loader = true;\n item.options.items = [];\n // item.valueText = ''\n }\n\n if (item.type === \"select-relation\") {\n item.loader = false;\n item.options.items = [];\n if (item.options.start === undefined) item.options.start = false;\n if (item.options.target === undefined)\n item.options.target = { reset: [], activate: [] };\n if (item.options.disabled === undefined) item.options.disabled = true;\n if (item.options.addDynamic === undefined)\n item.options.addDynamic = null;\n // item.valueText = ''\n // if(!item.options.start) item.disabled = true\n // if (item.options.resetItems === undefined) item.options.resetItems = [];\n }\n\n if (item.type === \"date\" && item.dateMenu === undefined)\n item.dateMenu = false;\n if (item.type === \"date\" && item.dateTextField === undefined)\n item.dateTextField = \"\";\n\n if (item.type === \"color\") {\n if (item.value === undefined || item.value === \"\") {\n item.value = \"#000000\";\n } else {\n item.value = self.normalizeHexColor(item.value) || \"#000000\";\n }\n }\n\n if (item.type === \"image\") item.defaultVal = null;\n\n if (item.options === undefined) item.options = {};\n });\n\n return items;\n },\n getFormValue() {\n const self = this;\n const obj = {};\n Object.keys(self.formItems).forEach((itemKey) => {\n const item = self.formItems[itemKey];\n obj[item.name] = item.value;\n });\n return obj;\n },\n cleanSpaces(value) {\n return value.replace(/\\s+/g, \"\");\n },\n // form gönderilidiğinde çalışır\n async onSubmit() {\n const self = this;\n const result = self.checkForm();\n\n if (result.status) {\n // success\n // axios post\n\n const obj = self.editMode\n ? Object.assign(self.editData, result.obj)\n : result.obj;\n const text = self.editMode\n ? self.formSettings.module +\n \" güncellenecek, güncellemek istediğinize emin misiniz?\"\n : self.formSettings.module +\n \" eklenecek, eklemek istediğinize emin misiniz?\";\n\n let endpoint = \"\";\n\n if (typeof self.endpoint === \"object\") {\n endpoint = self.editMode\n ? self.endpoint.update\n : self.endpoint.create;\n } else if (typeof self.endpoint === \"string\") {\n endpoint = self.endpoint;\n }\n\n // const finalObj = {};\n // Object.keys(obj).forEach(itemKey => {\n // const item = self.formItems[itemKey];\n // if (item === undefined) return;\n // if (item.value === '' && item.nullable) return;\n // finalObj[itemKey] = obj[itemKey];\n // });\n Object.keys(obj).forEach((objKey) => {\n if (obj[objKey] === \"\") {\n obj[objKey] = null;\n }\n });\n let finalObj = obj;\n if (self.formSettings.postMode === \"formData\") {\n const formData = new FormData();\n Object.keys(obj).forEach((itemKey) => {\n if (obj[itemKey]) {\n formData.append(itemKey, obj[itemKey]);\n }\n });\n\n finalObj = formData;\n }\n\n if (self.formSettings.confirmOnSave) {\n const confirmText =\n self.formSettings.confirmText !== \"\"\n ? self.formSettings.confirmText\n : text;\n\n self.$refs[\"form_swal\"].confirm({\n onConfirm: async () => {\n await self.handleSave(endpoint, finalObj);\n },\n title: \"Emin misiniz?\",\n text: confirmText,\n });\n // await self.$store.dispatch('swall/setSwall', {\n // type: 'confirm',\n // options: {\n // onConfirm: async () => {\n // await self.handleSave(endpoint, finalObj)\n // },\n // title: 'Emin misiniz?',\n // text: confirmText,\n // }\n // })\n } else {\n await self.handleSave(endpoint, finalObj);\n }\n }\n },\n async handleSave(endpoint, params) {\n const self = this;\n self.loader = true;\n\n // errorMsg: '',\n // successMsg: '',\n try {\n const copyParams = params ? JSON.parse(JSON.stringify(params)) : {};\n const { data, status, message } = await self.$axios.$post(\n endpoint,\n params\n );\n if (status) {\n self.loader = false;\n if (self.formSettings.resetItems) {\n let items = Object.values(self.formItems);\n items.forEach((item, key) => {\n item.value = null;\n item.valueText = null;\n });\n }\n const successText = self.editMode\n ? self.formSettings.module + \" güncellendi.\"\n : self.formSettings.module + \" eklendi.\";\n if (self.formSettings.redirectUrl !== null) {\n self.$refs[\"form_swal\"].close();\n setTimeout(async () => {\n // await self.$router.push(self.formSettings.redirectUrl)\n const routeObj = {\n path: self.formSettings.redirectUrl,\n };\n if (self.formSettings.setQuery !== undefined)\n routeObj.query = self.formSettings.setQuery;\n await self.$router.push(routeObj);\n }, 300);\n } else {\n self.$refs[\"form_swal\"].success({\n title: \"İşlem tamamlandı!\",\n text: successText,\n });\n // await self.$store.dispatch('swall/setSwall', {\n // type: 'success',\n // options: {\n // title: 'İşlem tamamlandı!',\n // text: successText\n // }\n // })\n if (self.formSettings.resetItems) self.onReset();\n }\n // TODO handle if resData and bodyParams are type of FormData\n self.$emit(\"onSuccess\", {\n formItems: self.formItems,\n resData: data,\n bodyPrams: copyParams,\n });\n } else {\n self.loader = false;\n throw { message };\n }\n } catch (e) {\n const errText =\n e.message !== undefined ? e.message : self.formSettings.errorMsg;\n self.$refs[\"form_swal\"].error({\n title: \"Hata!\",\n text: errText,\n });\n // await self.$store.dispatch('swall/setSwall', {\n // type: 'error',\n // options: {\n // title: 'Hata!',\n // text: errText\n // }\n // })\n self.$emit(\"onError\");\n }\n },\n resetItems() {\n this.onReset();\n },\n // form elementlerini resetler\n onReset() {\n const self = this;\n\n Object.keys(self.formItems).forEach((itemKey) => {\n const item = self.formItems[itemKey];\n item.value = \"\";\n item.valueText = \"\";\n item.errors = [];\n if (item.mask) item.valueMasked = \"\";\n if (item.type === \"multiselect\") item.options.model = null;\n if (item.type === \"select-relation\") {\n if (!item.options.start) item.options.items = [];\n // item.options.model = null\n }\n });\n self.$refs.ref_form.resetValidation();\n\n if (self.$refs.form_preview)\n self.$refs.form_preview.setItems(self.formItems);\n\n self.$emit(\"resetAfter\");\n self.$forceUpdate();\n },\n validateRule(value, rules) {\n for (const rule of rules) {\n const validationResult = rule(value);\n if (validationResult !== true) {\n return { status: false, message: validationResult };\n }\n }\n return { status: true, message: \"\" };\n },\n checkForm() {\n const self = this;\n let status = self.$refs.ref_form.validate();\n const obj = {};\n\n Object.keys(self.formItems).forEach((itemKey) => {\n const item = self.formItems[itemKey];\n\n // image alanları için required kontrolü\n if (item.type === \"image\" && item.required) {\n if (!item.value) {\n item.errors = [{ msg: \"Bu alan zorunludur!\" }];\n status = false;\n } else {\n item.errors = [];\n }\n }\n\n // color alanları için validasyon (formda input olmadığı için)\n if (item.type === \"color\") {\n const val = item.value || \"\";\n const err = [];\n if (item.required && !val) err.push({ msg: \"Bu alan zorunludur!\" });\n if (val && !self.isHexColorValid(val))\n err.push({ msg: \"Renk formatı #RGB veya #RRGGBB olmalıdır.\" });\n const rulesValidation = self.validateRule(val, item.rules);\n if (!rulesValidation.status) err.push({ msg: rulesValidation.message });\n if (err.length > 0) status = false;\n item.errors = err;\n }\n\n // if (item.mask) {\n // //değere ait boşlukları sil, eğer değer null değilse\n // self.formItems[itemKey].value = this.cleanSpaces(self.formItems[itemKey].value);\n // self.formItems[itemKey].valueText = this.cleanSpaces(self.formItems[itemKey].valueText);\n // }\n\n if (item.mask) {\n const val =\n typeof item.value === \"string\" ? item.value.trim() : item.value;\n const err = [];\n if (item.required && !val) err.push(\"Bu alan zorunludur!\");\n const rulesValidation = self.validateRule(val, item.rules);\n if (!rulesValidation.status) err.push(rulesValidation.message);\n if (err.length > 0) status = false;\n item.errors = err;\n }\n\n if (item.type === \"custom\") {\n let checkStatus = self.checkCustomErrors(item);\n if (!checkStatus) status = false;\n }\n\n if (item.submitExclude) return;\n obj[item.name] = Array.isArray(item.value)\n ? JSON.stringify(item.value).replace(/\"/g, \"\")\n : item.value;\n });\n\n this.$forceUpdate();\n\n return {\n status: status,\n obj: obj,\n };\n },\n // maskelenmiş değeri maskelenmemiş hale çevirmek ve o şekilde göndermek için kullanılıyor.\n changeMaskedItem(maskedValue, item) {\n const self = this;\n const { mask, maskRaw } = item;\n\n const rawValue = maskedValue.replace(/\\D/g, \"\");\n item.value = maskRaw ? rawValue : maskedValue;\n self.$forceUpdate();\n // item.valueMasked = item\n self.changeItem(item);\n },\n // valueText değerini değişen değere eşitlemek için kullanılıyor.//\n // valueText değeri text olmayan bir değerin text karşılığına verdiğimiz değer oluyor. Örneğin value değeri '0' olan bir datanın value textDeğeri 'yapılmadı' olabilir //\n // onSingleSelect adında bir emiti çalıştırıyor. Bu emit değişen item değerini döndürüyor.\n changeItem(item, event) {\n const self = this;\n // if (item.rules !== null) self.checkCustomErrors(item);\n if (item.options.replaceVal !== undefined) {\n item.options.replaceVal.forEach((setting) => {\n if (item.value === setting.detect) {\n item.value = setting.to;\n }\n });\n }\n\n if (item.type === \"select-relation\" || item.type === \"select-data\") {\n item.valueText = (0,_helpers__WEBPACK_IMPORTED_MODULE_2__.getSelectText)(item);\n } else {\n item.valueText = item.value;\n }\n\n if (item.type === \"select-relation\") self.selectDataChange(item);\n self.$emit(\"onSingleSelect\", item, self.formItems);\n self.$forceUpdate();\n if (self.formPreviewSettings.show) {\n self.$refs.form_preview.setItems(self.formItems);\n }\n },\n checkCustomErrors(item) {\n const self = this;\n const errors = [];\n\n Object.keys(item).forEach((itenKey) => {\n const findCheckValue = item[itenKey]; // required, min, max etc.\n let value = item.value;\n\n if (value === null || value === undefined) value = \"\";\n\n if (Array.isArray(value)) {\n if (value.length === 0) value = \"\";\n } else {\n value = item.type === \"image\" ? value : value.trim();\n }\n\n switch (itenKey) {\n case \"required\":\n if (findCheckValue && value === \"\") {\n errors.push({\n show: true,\n key: \"thisFieldRequired\",\n msg: \"Bu alan zorunludur!\",\n val: \"\",\n });\n }\n break;\n case \"max\":\n if (value.length > findCheckValue) {\n errors.push({\n show: true,\n key: \"maxDynamic\",\n msg: `Bu alan maksimum ${findCheckValue} karakter olabilir.`,\n val: findCheckValue,\n });\n }\n break;\n case \"min\":\n if (value.length < findCheckValue) {\n errors.push({\n show: true,\n key: \"minDynamic\",\n msg: `Bu alan minimum ${findCheckValue} karakter olabilir.`,\n val: findCheckValue,\n });\n }\n break;\n case \"custom\":\n // TODO custom\n // if (!findCheckValue.func(value)) {\n // errors.push({\n // show: true,\n // msg: ruleValue.msg,\n // val: ruleValue\n // })\n // }\n\n break;\n default:\n // code block\n }\n });\n\n self.formItems[item.name].errors = errors;\n\n return !errors.length > 0;\n },\n selectDataChange(formItem) {\n // formItem.value = val !== null ? val[formItem.options.value] : null;\n //\n // if (formItem.multiple !== undefined && (formItem.multiple)) {\n // const multiVal = [];\n // val.forEach(item => {\n // multiVal.push(item[formItem.options.value])\n // });\n // formItem.value = JSON.stringify(multiVal);\n // }\n if (formItem.type === \"select-relation\")\n this.changeRelationSelect(formItem);\n this.$forceUpdate();\n this.$emit(\"onSelect\", formItem, this.formItems);\n },\n changeRelationSelect(formItem) {\n const self = this;\n\n const targetOptions = formItem.options.target;\n const selectedValue = formItem.value;\n\n targetOptions.reset.forEach((itemKey) => {\n const item = self.formItems[itemKey];\n if (item === undefined) {\n console.warn(\n \"warning: no target reset item on form items like -> \",\n itemKey\n );\n return;\n }\n item.value = \"\";\n item.options.items = [];\n if (\n item.options.withoutDisable !== undefined &&\n item.options.withoutDisable\n ) {\n item.options.disabled = false;\n } else {\n item.options.disabled = true;\n }\n });\n\n if (formItem.value !== \"\" && formItem.value !== null) {\n targetOptions.activate.forEach((itemKey) => {\n const item = self.formItems[itemKey];\n if (item === undefined) {\n console.warn(\n \"warning: no target activate item on form items like -> \",\n itemKey\n );\n return;\n }\n\n const params = self.setParams(item, item.options.params);\n\n self.fetchSelectItems(\n item,\n item.options.endpoint,\n params,\n null,\n selectedValue\n );\n });\n }\n },\n setParams(item, params) {\n const self = this;\n\n if (params === undefined) return \"\";\n\n let obj = {};\n\n Object.keys(params).forEach((val) => {\n const paramItem = params[val];\n if (params[val] !== null) {\n const findItem = self.formItems[paramItem];\n const itemVal = findItem ? findItem.value : null;\n obj[val] = itemVal;\n } else {\n obj[val] = null;\n }\n });\n\n if (\n item.options.paramsCallback !== null &&\n typeof item.options.paramsCallback === \"function\"\n ) {\n obj = item.options.paramsCallback(obj);\n }\n\n return obj;\n },\n // submitDynamicSelect(formItem) {\n // const self = this;\n // const refName = 'multiselect_' + formItem.name;\n // const val = self.$refs[refName][0].search;\n // const options = formItem.options.addDynamic;\n // const param = options.params !== undefined ? {[options.params]: val} : val;\n // self.$swal({\n // title: 'Emin misiniz?',\n // text: options.module + \" eklenecek, eklemek istediğinize emin misiniz?\",\n // type: 'warning',\n // showCancelButton: true,\n // confirmButtonColor: '#1dc722',\n // cancelButtonColor: '#d33',\n // confirmButtonText: 'Evet, ekle!',\n // cancelButtonText: 'Vazgeç'\n // }).then((result) => {\n // if (result.value) {\n // self.$axios.$post(this.$axios.defaults.baseURL + options.endpoint, param)\n // .then((data) => {\n // if (data.status) {\n // self.$swal('İşlem tamamlandı!', options.module + ' eklendi.', 'success')\n // let params\n // if (formItem.type === 'select-relation') {\n // params = self.setParams(formItem, formItem.options.params);\n // } else {\n // params = formItem.options.params !== undefined ? formItem.options.params : '';\n // }\n // self.fetchSelectItems(formItem, formItem.options.endpoint, params, formItem.value);\n // } else {\n // self.$swal('Hata!', '' + data.message + '', 'error');\n // }\n // })\n // .catch(err => {\n // self.$swal('Hata!', 'Bir hata meydana geldi', 'error')\n // })\n // }\n // })\n // },\n\n // bilgisayardan seçilen dosyanın inputa set edilmesini sağlıyor.\n // emit ismi: setFileVal, emit değeri: bilgisayardan seçilen dosya\n setFileVal(data) {\n this.formItems[data.name].value = data.file;\n this.$forceUpdate();\n this.$emit(\"setFileVal\", {\n file: data.file,\n });\n },\n autocompleteFilter(formItem, item, queryText, itemText) {\n let textOne;\n if (!isNaN(item[formItem.options.label])) {\n textOne = JSON.stringify(item[formItem.options.label]);\n } else {\n if (\n formItem.options.type === \"mergeInput\" ||\n Array.isArray(formItem.options.label)\n ) {\n for (let i = 0; i <= formItem.options.label.length; i++) {\n if (item[formItem.options.label[i]] !== undefined) {\n textOne +=\n \" \" +\n item[formItem.options.label[i]].toLocaleLowerCase(\"tr-TR\");\n }\n }\n } else {\n textOne = item[formItem.options.label].toLocaleLowerCase(\"tr-TR\");\n }\n }\n const searchText = queryText.toLocaleLowerCase(\"tr-TR\");\n\n return this.searchSort ? textOne.startsWith(searchText) : textOne.indexOf(searchText) > -1 ;\n },\n // seçilen input değerinin sonuna backend tarafından gelen 'mergeLabel' değrini eklemek için kullanılıyor.\n setItemText(item, formItem) {\n const formText = formItem.options.label;\n const mergeText = formItem.options.mergeLabel;\n if (Array.isArray(formText)) {\n let str = \"\";\n formText.forEach((val) => {\n str += item[val] !== undefined ? item[val] + \" \" : val + \" \";\n });\n return str.trim();\n } else {\n return mergeText\n ? item[formText] + \" \" + item[mergeText]\n : item[formText];\n }\n },\n // date input elementinde girilen tarih değerinin input üzerinde de değişmesini sağlar.\n // girilen değeri kullanıcıya \"DD-MM-YYYY\" formatında gösterir fakat bu değeri gönderirken \"YYYY-MM-DD\" formatında gönderir.\n parseDate(formItem, isPicker = false) {\n const self = this;\n if (isPicker) {\n formItem.dateMenu = false;\n // formItem.dateTextField = formItem.value\n formItem.dateTextField = self.dateToString(formItem.value);\n self.$forceUpdate();\n } else {\n const regex = /\\d{4}\\-(0[1-9]|1[012])\\-(0[1-9]|[12][0-9]|3[01])$/g;\n // const textField = formItem.dateTextField\n const textField = self.stringToDate(formItem.dateTextField);\n\n if (regex.test(textField)) {\n formItem.value = textField;\n } else {\n formItem.dateTextField = \"\";\n }\n }\n this.changeItem(formItem);\n this.$forceUpdate();\n },\n // date input elementinde \"YYYY-MM-DD\" olan formatı \"DD-MM-YYYY\" şeklinde değiştirir.\n dateToString(date) {\n try {\n const [year, month, day] = date.split(\"-\");\n return `${day}-${month}-${year}`;\n } catch (e) {\n return date;\n }\n },\n // date input elementinde \"DD-MM-YYYY\" olan formatı \"YYYY-MM-DD\" şeklinde değiştirir.\n stringToDate(stringDate) {\n try {\n const [day, month, year] = stringDate.split(\"-\");\n return `${year}-${month.padStart(2, \"0\")}-${day.padStart(2, \"0\")}`;\n } catch (e) {\n return stringDate;\n }\n },\n // Tek bir item için sorting işlemi\n applySortToItem(item) {\n const self = this;\n\n // Sort değeri kontrolü\n if (!item.options.sort) {\n return;\n }\n\n // Select tipinde olup items array'i var mı kontrol et\n if (\n (item.type === \"select\" ||\n item.type === \"select-data\" ||\n item.type === \"select-relation\") &&\n item.options &&\n item.options.items &&\n Array.isArray(item.options.items)\n ) {\n const items = item.options.items;\n const labelKey = item.options.label || \"text\";\n const valueKey = item.options.value || \"value\";\n const sortType = item.options.sort.toLowerCase();\n\n // Sıralama fonksiyonu\n items.sort((a, b) => {\n let aValue = a[labelKey] || a[valueKey] || \"\";\n let bValue = b[labelKey] || b[valueKey] || \"\";\n\n // String değerleri küçük harfe çevir (Türkçe karakter desteği)\n if (typeof aValue === \"string\")\n aValue = aValue.toLocaleLowerCase(\"tr-TR\");\n if (typeof bValue === \"string\")\n bValue = bValue.toLocaleLowerCase(\"tr-TR\");\n\n // Sıralama yönüne göre karşılaştır\n if (sortType === \"asc\") {\n return aValue > bValue ? 1 : aValue < bValue ? -1 : 0;\n } else if (sortType === \"desc\") {\n return aValue < bValue ? 1 : aValue > bValue ? -1 : 0;\n }\n\n return 0;\n });\n }\n },\n },\n});\n\n\n//# sourceURL=webpack://@bilfenyazilimekibi/bilpack/./src/components/bf-form/index.vue?./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options");
339
339
 
340
340
  /***/ }),
341
341
 
@@ -731,7 +731,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
731
731
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
732
732
 
733
733
  "use strict";
734
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var vue_advanced_cropper__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue-advanced-cropper */ \"./node_modules/vue-advanced-cropper/dist/index.es.js\");\n/* harmony import */ var vue_advanced_cropper_dist_style_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vue-advanced-cropper/dist/style.css */ \"./node_modules/vue-advanced-cropper/dist/style.css\");\n/* harmony import */ var _dev_project_settings__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../../dev/project.settings */ \"./dev/project.settings.js\");\n\n\n\n\n\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n components: { Cropper: vue_advanced_cropper__WEBPACK_IMPORTED_MODULE_0__.Cropper },\n\n props: {\n isSingleSelect: {\n default: false,\n },\n bottomScroll: {\n default: true,\n },\n topScroll: {\n type: Boolean,\n default: false\n },\n customSwitch: {\n default: false,\n },\n cropImg: {\n default: false,\n },\n imgChangeApi: {\n default: \"\",\n },\n isImageChange: {\n default: false,\n },\n coloredRows: {\n default: () => [],\n },\n schoolNameTooltip: {\n default: false,\n },\n queryPrefix: {\n default: null,\n },\n queryCallback: {\n default: null,\n },\n isClickableColumn: {\n default: false,\n },\n withoutActions: {\n default: false,\n },\n hasActivePassive: {\n default: false,\n },\n isExpandable: {\n default: false,\n },\n isSelectable: {\n default: false,\n },\n filterRange: {\n default: false,\n },\n pagination: {\n default: true,\n },\n searchableList: {\n default: true,\n },\n customizeActions: {\n default: false,\n },\n colorColumns: {\n default: false,\n },\n stickyColumns: {\n type: Array,\n default: () => [],\n },\n multiSelectSettings: {\n default: () => ({\n action: false,\n }),\n },\n isImage: {\n default: false,\n },\n // perPage: {\n // default: 10\n // },\n isAllItems: {\n default: false\n },\n filterPerPage: {\n default: true,\n },\n isTopArea: {\n default: true,\n },\n headers: {\n default: () => [],\n },\n colorChangeItems: {\n default: () => [],\n },\n noDataTitle: {\n default: () => [],\n },\n filterFields: {\n default: () => [],\n },\n // hiddenColumns: {\n // default: () => []\n // },\n apiUrl: {\n type: String,\n default: null,\n },\n viewConditionFunction: {\n type: Function,\n },\n queryJsonProps: {\n type: Object,\n default: () => ({\n limit: { start: 0, stop: 100 },\n order: [{ columnName: \"id\", type: \"desc\" }],\n columns: null,\n }),\n },\n customParams: {\n default: null,\n },\n tableTitle: {\n default: true,\n },\n tabs: {\n default: () => ({ visible: false }),\n },\n isColumnFilter: {\n default: false,\n },\n isColumnDownload: {\n default: false,\n },\n isRemoveEmptyForExcel: {\n default: false,\n },\n downloadButtonText: {\n default: () => ({\n title: \"İndir\",\n color: \"#ffff\",\n }),\n },\n isAddButtonOptions: {\n default: null,\n },\n title: {\n type: String,\n },\n info: {\n default: true,\n },\n deleteOptions: {\n default: null,\n },\n updateOptions: {\n default: null,\n },\n initAuto: {\n default: true,\n },\n newItem: {\n default: false,\n },\n loading: {\n default: false,\n },\n switchKey: {\n default: \"\",\n },\n isFirstRun: {\n default: true,\n },\n },\n data() {\n return {\n imgFileLoader: false,\n cropDialog: false,\n currentImgSelectedItem: null,\n currentImgChangeType: \"Student\",\n aspectRatio: false,\n stencilProps: {\n movable: true,\n resizable: true,\n handlers: { corners: true },\n round: true,\n },\n cropShape: \"rectangle-stencil\",\n selectedImage: null,\n croppedImage: null,\n generalSettings: _dev_project_settings__WEBPACK_IMPORTED_MODULE_2__.generalSettings,\n tab: 0,\n isDownloadFilter: false,\n columnIsActive: false,\n isMobile: null,\n perPage: 10,\n excelOptions: {\n active: true,\n json_data: [],\n json_fields: {},\n excelFileName: \"\",\n json_meta: [\n [\n {\n key: \"charset\",\n value: \"utf-8\",\n },\n ],\n ],\n },\n deleteItem: null,\n options: {},\n sortBy: \"fat\",\n sortDesc: false,\n search: \"\",\n page: 1,\n pageCount: 0,\n skeletonLoader: true,\n mainLoader: true,\n queryJson: null,\n items: [],\n // perPageItems: [5, 10, 15, 20, 25],\n perPageItems: [],\n week: 10,\n weekItems: [5, 10, 15],\n currentPageNumber: 0,\n sortType: \"desc\",\n columnName: \"\",\n filterColumns: \"\",\n totalCount: \"\",\n listItemSelected: [],\n expanded: [],\n selectedHeaders: [],\n copyHeaders: [],\n checkBoxDisabled: false,\n switchKeyData: \"\",\n isDisabled: false,\n // Dinamik olarak oluşturulan hex renk sınıflarını izlemek için\n createdRowColorClasses: new Set(),\n };\n },\n watch: {\n totalCount(val) {\n if (this.isAllItems) {\n this.perPage = val\n }\n },\n cropDialog(val) {\n if (!val) {\n this.selectedImage = null;\n this.croppedImage = null;\n }\n },\n options: {\n handler() {\n this.fetchData();\n },\n deep: true,\n },\n tab(value) {\n // // query json tamamen güncelleyerek işlem yap\n\n // if (this.tabs.type === 'query') {\n //\n // let prefix = {}\n // prefix = {\n // \"columns\": column !== null ? { [column]: { \"value1\": val, \"operator\": \"like\" } } : null\n // }\n // this.queryPrefix = JSON.stringify(prefix)\n //\n // // let queryObj = {}\n // // queryObj = {\n // // \"limit\": { \"start\": 0, \"stop\": 10 },\n // // \"order\": [{ \"columnName\": \"id\", \"type\": \"desc\" }],\n // // \"columns\": column !== null ? { [column]: { \"value1\": val, \"operator\": \"like\" } } : null\n // // }\n //\n // setTimeout(() => this.fetchData())\n // // let queryObj = {}\n // // if (type === 'error') {\n //\n // // } else if (type === 'success') {\n // // queryObj = {\n // // \"limit\": { \"start\": -1, \"stop\": -1 },\n // // \"order\": [{ \"columnName\": \"id\", \"type\": \"desc\" }],\n // // \"columns\": { \"studentData\": { \"value1\": \"1\", \"operator\": \"like\" } }\n // // }\n // // } else {\n // // queryObj = {\n // // \"limit\": { \"start\": -1, \"stop\": -1 },\n // // \"order\": [{ \"columnName\": \"id\", \"type\": \"desc\" }],\n // // \"columns\": null\n // // }\n // // }\n\n // queryJson ile search işlemi yap\n\n // let column = this.tabs.content[value].column\n // let val = this.tabs.content[value].value\n\n this.showHeaders.forEach((item, index) => {\n // : Todo geçici çözüm. Bu alan düzenlencek\n if (item.value === \"studentData\") {\n if (this.tabs.content[value].key === \"success\") {\n this.showHeaders.find((x) => x.value === \"studentData\").searchValue = \"1\";\n } else if (this.tabs.content[value].key === \"error\") {\n this.showHeaders.find((x) => x.value === \"studentData\").searchValue = \"0\";\n } else {\n this.showHeaders.find((x) => x.value === \"studentData\").searchValue = \"\";\n }\n }\n\n if (item.value === this.tabs.content[value].key) {\n this.showHeaders[index].searchValue = this.tabs.content[value].value;\n }\n });\n setTimeout(() => this.searchData());\n\n // this.fetchData()\n },\n page(value) {\n if (value > 0) {\n let startVal = this.page === 1 ? 0 : this.perPage * (value - 1);\n this.queryJson.limit.start = startVal;\n this.queryJson.limit.stop = this.perPage;\n this.fetchData();\n }\n },\n perPage(value) {\n const self = this;\n this.queryJson.limit.stop = value;\n setTimeout(() => {\n self.perPage = value;\n });\n this.fetchData();\n },\n selectedHeaders: {\n handler() {\n this.initExcel();\n },\n deep: true,\n },\n expanded(value) {\n this.$emit(\"expandAction\", value);\n },\n listItemSelected(value) {\n const self = this;\n self.$emit(\"listItemSelected\", value);\n },\n items(val) {\n const self = this;\n // eğer listedeki itemslar değişirse excel listesini init etmek için // \n self.initExcel()\n }\n },\n created() {\n\n this.queryJsonProps.limit.stop = this.perPage;\n // this.queryJsonProps.order.type = 'desc';\n\n // this.queryJson = this.queryJsonProps;\n this.queryJson = JSON.parse(JSON.stringify(this.queryJsonProps));\n\n this.selectedHeaders = this.headers;\n this.selectedHeaders.forEach((header, index) => {\n header.searchValue = \"\";\n header.selected = true;\n this.copyHeaders.push(header);\n });\n },\n mounted() {\n if (this.initAuto) {\n this.initExcel();\n if (this.apiUrl !== null) {\n this.hasActivePassive ? this.setActivePassive(\"active\") : this.fetchData();\n }\n this.dataSelectInit();\n }\n\n // Sticky kolonları ayarla\n if (this.stickyColumns.length > 0) {\n this.$nextTick(() => {\n setTimeout(() => {\n this.setupStickyColumns();\n }, 500);\n });\n }\n this.setupScrollSync();\n },\n updated() {\n // Tablo güncellendiğinde sticky kolonları tekrar ayarla\n if (this.stickyColumns.length > 0) {\n this.$nextTick(() => {\n this.setupStickyColumns();\n });\n }\n this.checkForHorizontalScroll();\n },\n beforeDestroy() {\n const table = this.$refs.dataTable;\n if (table) {\n const wrapper = table.$el.querySelector(\".v-data-table__wrapper\");\n if (wrapper) {\n wrapper.removeEventListener(\"scroll\", this.handleMainTableScroll);\n }\n }\n },\n methods: {\n checkboxIsDisabled(val) {\n const self = this;\n if (val == 'true') {\n self.isDisabled = true\n } else {\n self.isDisabled = false\n }\n },\n findAutoSelectItems(keyValue) {\n const self = this;\n let resultArray = [];\n\n self.items.forEach((item) => {\n if (item.hasOwnProperty(keyValue)) {\n // Eğer bu değer daha önce array'e eklenmemişse ekle\n if (!resultArray.includes(item[keyValue])) {\n const searchObject = {\n name: item[keyValue],\n val: item[keyValue],\n };\n resultArray.push(searchObject);\n }\n }\n });\n return resultArray;\n },\n async onFileSelected(event, item) {\n const file = event.target.files[0];\n\n if (this.cropImg) {\n if (file) {\n this.selectedImage = URL.createObjectURL(file);\n setTimeout(() => (this.cropDialog = true));\n }\n } else {\n this.saveImage(file);\n }\n },\n async saveImage(file, fileName = null) {\n try {\n if (file) {\n this.imgFileLoader = true;\n // this.selectedImage = URL.createObjectURL(file);\n const formData = new FormData();\n formData.append(\"studentId\", this.currentImgSelectedItem.studentId);\n formData.append(\"type\", this.currentImgChangeType);\n if (fileName) {\n formData.append(\"image\", file, `${fileName}`);\n } else {\n formData.append(\"image\", file);\n }\n\n const { status, message } = await this.$axios.post(this.imgChangeApi, formData);\n\n if (status) {\n this.fetchData();\n this.$refs.fileInput.value = null;\n this.currentImgSelectedItem = null;\n this.cropDialog = false;\n this.currentImgSelectedItem = null;\n } else {\n this.$refs.tableAlert.error(message);\n }\n }\n } catch (e) {\n console.error(\"Error updating image:\", e);\n const msg = e.message ? e.message : \"Bir Hata Oluştu!\";\n this.$refs.tableAlert.error(msg);\n } finally {\n this.imgFileLoader = false;\n }\n },\n createCircularCanvas(canvas) {\n const size = Math.min(canvas.width, canvas.height);\n const circularCanvas = document.createElement(\"canvas\");\n circularCanvas.width = size;\n circularCanvas.height = size;\n\n const ctx = circularCanvas.getContext(\"2d\");\n\n ctx.beginPath();\n ctx.arc(size / 2, size / 2, size / 2, 0, Math.PI * 2);\n ctx.clip();\n\n ctx.drawImage(\n canvas,\n (canvas.width - size) / 2,\n (canvas.height - size) / 2,\n size,\n size,\n 0,\n 0,\n size,\n size\n );\n\n return circularCanvas;\n },\n cropImage() {\n const { canvas } = this.$refs.cropper.getResult();\n\n const finalCanvas =\n this.cropShape === \"circle-stencil\" ? this.createCircularCanvas(canvas) : canvas;\n\n finalCanvas.toBlob((imageBlob) => {\n const fileType = imageBlob.type.split(\"/\")[1];\n this.saveImage(imageBlob, `${imageBlob.size}.${fileType}`);\n }, \"image/jpeg\");\n },\n imageChange(item, type = \"Student\") {\n if (!this.isImageChange) return;\n this.currentImgSelectedItem = item;\n this.currentImgChangeType = type;\n this.$refs.fileInput.click();\n },\n formatDate(date) {\n if (!date) return null;\n const d = new Date(date);\n const day = String(d.getDate()).padStart(2, \"0\");\n const month = String(d.getMonth() + 1).padStart(2, \"0\");\n const year = d.getFullYear();\n return `${day}-${month}-${year}`;\n },\n parseDate(date) {\n if (!date) return null;\n const [day, month, year] = date.split(\"-\");\n return new Date(year, month - 1, day).toISOString().substr(0, 10);\n },\n // istenilen row'un backgrounduna renk vermek için kullanılan function\n itemRowBackground(item) {\n const self = this;\n let coloredName = \"\";\n\n // Yeni kurallar: coloredRowValue bir ifade olabilir: \"{a}+{b}\"\n // Eski kurallar: direkt değer eşitliği\n self.coloredRows.map((rule) => {\n const leftRaw = item[rule.coloredRowKey];\n const rightRaw = rule.coloredRowValue;\n\n const leftVal = (typeof leftRaw === \"number\")\n ? leftRaw\n : (typeof leftRaw === \"string\" && leftRaw.trim() !== \"\" && !isNaN(Number(leftRaw)))\n ? Number(leftRaw)\n : leftRaw;\n\n const rightVal =\n typeof rightRaw === \"string\" && rightRaw.includes(\"{\")\n ? self.evaluateExpression(rightRaw, item)\n : ((typeof rightRaw === \"number\")\n ? rightRaw\n : (typeof rightRaw === \"string\" && rightRaw.trim() !== \"\" && !isNaN(Number(rightRaw)))\n ? Number(rightRaw)\n : rightRaw);\n\n let isEqual;\n if (typeof leftVal === \"number\" && typeof rightVal === \"number\") {\n isEqual = leftVal === rightVal;\n } else {\n isEqual = String(leftVal) === String(rightVal);\n }\n\n const condition = rule.equalValue ? isEqual : !isEqual;\n if (condition) {\n const cls = self.getRowClassForColor(rule.coloredRowColor);\n if (cls) coloredName = cls;\n }\n });\n\n return coloredName;\n },\n\n // \"{a}+{b}-{c}\" gibi ifadeleri değerlendirir (yalnızca 0-9, + - * / ( ) ve nokta)\n evaluateExpression(expr, item) {\n try {\n let replaced = expr.replace(/\\{([^}]+)\\}/g, (match, key) => {\n const val = item[key.trim()];\n const num = (typeof val === \"number\") ? val : Number(val);\n return isNaN(num) ? 0 : num;\n });\n // Güvenlik: sadece izinli karakterler\n if (/^[0-9+\\-*/().\\s]+$/.test(replaced) === false) return 0;\n // eslint-disable-next-line no-new-func\n const fn = new Function(`return (${replaced});`);\n const result = fn();\n return typeof result === \"number\" && isFinite(result) ? result : 0;\n } catch (e) {\n return 0;\n }\n },\n\n // Renk adına göre sınıf döndürür. Hex verilirse dinamik sınıf üretir.\n getRowClassForColor(color) {\n if (typeof color !== \"string\") return \"\";\n const lower = color.toLowerCase();\n const named = [\"red\", \"blue\", \"white\", \"yellow\", \"green\"];\n if (named.includes(lower)) return `table-${lower}`;\n\n // Hex renk desteği\n if (color.startsWith(\"#\") && (color.length === 7 || color.length === 4)) {\n const sanitized = color.replace('#', '').toUpperCase();\n const className = `table-hex-${sanitized}`;\n if (!this.createdRowColorClasses.has(className)) {\n this.injectRowColorStyle(className, color);\n this.createdRowColorClasses.add(className);\n }\n return className;\n }\n\n // Diğer geçerli css renkleri için de dinamik sınıf oluşturmayı deneyelim\n const className = `table-color-${btoa(unescape(encodeURIComponent(color))).replace(/=/g, '')}`;\n if (!this.createdRowColorClasses.has(className)) {\n this.injectRowColorStyle(className, color);\n this.createdRowColorClasses.add(className);\n }\n return className;\n },\n\n // Verilen sınıf adı için style tag inject eder\n injectRowColorStyle(className, color) {\n const style = document.createElement('style');\n style.type = 'text/css';\n style.textContent = `.v-application .${className} .text-start { background-color: ${color} !important; }`;\n document.head.appendChild(style);\n },\n openModal(item, name) {\n this.$emit(\"openModal\", item, name);\n },\n changeDateInput(item) {\n this.$emit(\"changeDateInput\", item);\n // Tarih seçimi yapıldığı zaman o öğrencinin checkboxını true yapmak için\n const exists = this.listItemSelected.some(\n (student) => student.studentClassroomId === item.studentClassroomId\n );\n if (!exists) {\n this.listItemSelected.push(item);\n }\n },\n changeInput(item, date) {\n item.vaccineDate = date;\n this.$emit(\"changeInput\", item);\n },\n getImage(type) {\n if (type === \"no-result\") {\n return this.$bilpack.settings.images.table.noResult;\n } else {\n return this.$bilpack.settings.images.noData;\n }\n },\n switchAction(item) {\n this.$emit(\"switchAction\", item);\n },\n onResize() {\n if (window.innerWidth < 769) this.isMobile = true;\n else this.isMobile = false;\n },\n selectFilter(item) {\n const self = this;\n if (item.selected) {\n self.copyHeaders.push(item)\n } else {\n self.copyHeaders = self.copyHeaders.filter(val => val.value !== item.value)\n }\n if (self.headers.some(item => item.value === \"action\")) {\n if (self.copyHeaders.length === 2) {\n self.checkboxIsDisabled('true')\n }\n else {\n self.checkboxIsDisabled('false')\n }\n\n } else {\n if (self.copyHeaders.length === 1) {\n self.checkboxIsDisabled('true')\n } else {\n self.checkboxIsDisabled('false')\n }\n }\n this.$nextTick(() => {\n setTimeout(() => {\n this.setupScrollSync();\n }, 100);\n });\n // filter input her değiştiğinde excel listesini init ediyoruz //\n setTimeout(() => {\n self.initExcel()\n })\n },\n setActivePassive(method) {\n const self = this;\n\n if (self.queryJson.columns === null) {\n self.queryJson.columns = {\n status: {\n value1: method === \"active\" ? \"1\" : \"0\",\n operator: \"equal\",\n },\n };\n } else {\n if (typeof self.queryJson.columns === \"object\") {\n self.queryJson.columns.status = {\n value1: method === \"active\" ? \"1\" : \"0\",\n operator: \"equal\",\n };\n }\n }\n\n self.queryJson.limit.start = \"0\";\n\n self.columnIsActive = method === \"active\";\n\n self.fetchData();\n },\n filterHandle(headers) {\n headers.forEach((val, key) => {\n if (val.value === \"action\") {\n headers.splice(key, 1);\n }\n });\n return headers;\n },\n initExcel() {\n const self = this;\n self.excelOptions.json_fields = {};\n // isRemoveEmptyForExcel değerine göre filtrelenmiş listeyi ya da başlangıçtaki listeyi eşitliyoruz // \n const excelListItems = self.isRemoveEmptyForExcel ? self.copyHeaders : self.selectedHeaders;\n\n // excel çıktısındaki listede eğer filterFields propsunun key değerlerinin hiçbiri yok ise o öğrenciyi listeden çıkarmak için //\n const activeHealthFields = self.filterFields.filter(item => self.copyHeaders.some(h => h.value === item && h.selected)).map(item => item);\n const filteredStudents = activeHealthFields.length > 0 ? self.items.filter(student => {\n // filter içindeki alanlardan en az biri dolu mu?\n const hasAnyValue = activeHealthFields.some(key => {\n const val = student[key];\n return val !== null && val !== \"\" && val !== undefined;\n });\n return hasAnyValue; // dolu varsa öğrenci listede kalır\n }) : self.convertAlternateValues(self.items, self.copyHeaders);\n self.excelOptions.json_data = filteredStudents\n\n // Not: `download-excel` `fields` prop'u obje bekliyor. Obje key'leri (kolon başlıkları)\n // aynı olursa üstüne yazıldığı için bazı sütunlar Excel'de eksik görünebilir.\n // Bu yüzden başlıkları unique hale getiriyoruz.\n const usedTitles = new Map();\n excelListItems.forEach((header) => {\n if (!header || header.value === \"action\") return;\n\n const rawTitle = (header.text ?? header.value ?? \"\").toString().trim();\n const baseTitle = rawTitle.length > 0 ? rawTitle : (header.value ?? \"\").toString();\n if (!baseTitle) return;\n\n const seenCount = usedTitles.get(baseTitle) ?? 0;\n usedTitles.set(baseTitle, seenCount + 1);\n const uniqueTitle = seenCount === 0 ? baseTitle : `${baseTitle} (${seenCount + 1})`;\n\n self.excelOptions.json_fields[uniqueTitle] = header.value;\n });\n\n self.excelOptions.excelFileName =\n self.title !== undefined ? self.title : \"Excel Listesi\";\n },\n dataSelectInit() {\n const self = this;\n self.headers.forEach((item) => {\n if (\n item.searchOptions !== undefined &&\n item.searchOptions.type === \"select-data\"\n ) {\n // item.loader = true;\n if (item.searchOptions.endpoint !== \"\") {\n item.searchOptions.selectItems = [];\n self.$axios.get(item.searchOptions.endpoint).then((res) => {\n item.searchOptions.selectItems = res.data.data;\n });\n }\n }\n });\n },\n openDeleteConfirm(item) {\n this.$emit(\"deleteItem\", item);\n const self = this;\n self.deleteItem = item;\n if (self.deleteOptions.confirmText !== undefined) {\n this.$refs.tableAlert.confirm({\n text: self.deleteOptions.confirmText,\n });\n } else {\n this.$refs.tableAlert.confirm();\n }\n },\n deleteTableItem() {\n const self = this;\n const obj = {};\n\n self.deleteOptions.postParams.forEach((val) => {\n obj[val.param] = this.isSelectable\n ? JSON.stringify([this.deleteItem[val.value]]).replace(/\"/g, \"\")\n : this.deleteItem[val.value];\n });\n\n if (self.deleteOptions.customPostParams !== undefined) {\n self.deleteOptions.customPostParams.forEach((val) => {\n obj[val.param] = val.value;\n });\n }\n\n setTimeout(() => {\n self.$axios.post(self.deleteOptions.endpoint, obj).then((res) => {\n if (res.data.status) {\n self.$refs.tableAlert.success();\n self.fetchData();\n\n this.$emit(\"deleteAfterFunction\");\n } else {\n let text =\n res.data.message !== undefined ? res.data.message : \"Bir hata oluştu\";\n self.$refs.tableAlert.error({\n text: text,\n });\n }\n });\n });\n },\n searchData(customSearchValue) {\n let columns = {};\n\n if (this.queryPrefix !== null) {\n if (this.queryPrefix.columns !== undefined)\n columns = JSON.parse(JSON.stringify(this.queryPrefix.columns));\n }\n this.headers.forEach((value, key) => {\n if (value.searchValue) {\n let pushObject = {\n value1: value.searchValue,\n operator: value.operator,\n };\n customSearchValue\n ? customSearchValue?.length > 0\n ? (columns[customSearchValue] = pushObject)\n : (columns[value.value] = pushObject)\n : (columns[value.value] = pushObject);\n }\n });\n this.queryJson.columns = columns;\n this.$forceUpdate();\n this.page = 1;\n this.fetchData();\n },\n // searchData() {\n // let columns = {};\n // this.headers.forEach((value, key) => {\n // // todo: Bu alan tekrar düzenlenecek.\n // if (value.searchValue) {\n // if (value.value === 'preRegistrationStatus' && value.searchValue === '4') {\n // let pushObject = {\"value1\": 'true', \"operator\": value.operator}\n // columns['registrationStatus'] = pushObject\n // } else {\n // let pushObject = {\"value1\": value.searchValue, \"operator\": value.operator}\n // columns[value.value] = pushObject\n // }\n // }\n // })\n //\n // this.queryJson.columns = columns\n // this.page = 1;\n //\n // this.fetchData();\n // },\n customSorting(sortBy, sortDesc) {\n let sort = sortBy?.length === 0 ? \"id\" : sortBy[0];\n let desc = sortDesc;\n this.queryJson.order.forEach((value, key) => {\n if (value.columnName !== sort || value.type !== desc) {\n // this.page = 1;\n // if (value.columnName === 'FIELD(school,\\'GENEL\\')') {\n //\n // } else {\n // this.page = 1;\n // }\n }\n this.queryJson.order.type = desc;\n console.log(this.queryJson);\n if (value.columnName !== \"id\") sort = value.columnName;\n });\n // if (this.queryJson.order.columnName !== sort || this.queryJson.order.type !== desc) this.page = 1;\n this.queryJson.order = [];\n this.queryJson.order.push({\n columnName: sort,\n type: desc,\n });\n },\n resetAndFetch() {\n const self = this;\n self.showHeaders.forEach((item) => {\n item.searchValue = \"\";\n });\n self.queryJson = JSON.stringify(this.queryJsonProps);\n self.fetchData();\n },\n checkListItems() {\n try {\n const localSelectedItem = JSON.parse(localStorage.getItem(\"selectData\"));\n if (localSelectedItem) {\n this.listItemSelected = localSelectedItem;\n } else {\n this.listItemSelected = [];\n }\n } catch (error) {\n this.listItemSelected = [];\n }\n },\n fetchData(customQueryJson = null, refreshQuery = false) {\n const self = this;\n self.mainLoader = true;\n self.checkListItems();\n const { sortBy, sortDesc, page, itemsPerPage } = this.options;\n\n this.customSorting(sortBy, this.queryJsonProps.order[0].type);\n\n setTimeout(async () => {\n let queryJsonString =\n customQueryJson !== null ? customQueryJson : JSON.stringify(this.queryJson);\n\n let params = {\n queryJson: queryJsonString,\n };\n\n if (self.customParams !== null) Object.assign(params, self.customParams);\n\n if (self.queryCallback !== null && typeof self.queryCallback === \"function\") {\n params = await self.queryCallback(params);\n }\n // İstek atılmadan önce dışarıya event gönderiyoruz\n this.$emit('beforeRequest', {\n queryJsonProps: this.queryJson,\n timestamp: new Date().toLocaleString()\n });\n\n self.$axios.post(self.apiUrl, params).then((res) => {\n if (res.data.data.result !== undefined) {\n self.totalCount = res.data.data.totalCount;\n if (res.data.status) {\n self.initPerPageItems(this.totalCount);\n self.pageCount = Math.ceil(res.data.data.filterCount / self.perPage);\n self.items = res.data.data.result;\n self.items.map((val, index) => {\n if (val.createdAt) {\n const dateString = val.createdAt;\n const dateParts = dateString.split(\" \")[0].split(\"-\");\n const formattedDate = `${dateParts[1]}-${dateParts[2]}-${dateParts[0]}`;\n self.items[index].createdAt = formattedDate;\n self.items[index].fullSchollName = val.schoolNames;\n if (val.schoolNames) {\n if (val.schoolNames.includes(\",\")) {\n const arraySchoolName = val.schoolNames.split(\",\");\n self.items[index].schoolNames =\n arraySchoolName[0] + \"... +\" + (arraySchoolName?.length - 1);\n }\n }\n }\n });\n self.dateHandle(self.items, self.showHeaders);\n self.itemsCallback(self.items, self.showHeaders);\n self.items.map((val, index) => {\n if (val.registerPercentage) {\n self.items[index].registerPercentage = val.registerPercentage.replace(/\\./g, \",\");\n }\n });\n\n // Tablo gösterimi için değerleri dönüştür\n self.convertTableValues(self.items, self.headers);\n\n // Excel için ayrı bir veri seti oluştur ve dönüştür\n const excelItems = self.convertAlternateValues(self.items, self.headers);\n self.excelOptions.json_data = excelItems;\n\n self.$emit(\"onFetch\", self.items);\n\n if (self.stickyColumns.length > 0) {\n self.$nextTick(() => {\n setTimeout(() => {\n self.setupStickyColumns();\n }, 100);\n });\n }\n }\n }\n self.mainLoader = false;\n self.skeletonLoader = false;\n\n this.$nextTick(() => {\n setTimeout(() => {\n this.setupScrollSync();\n }, 100);\n });\n });\n });\n },\n itemsCallback(items, headers) {\n const self = this;\n const callbacks = headers.filter((x) => x.callback);\n if (callbacks) {\n callbacks.forEach((x) => {\n items.forEach((i, index) => {\n const fetchVal = i[x.value];\n if (fetchVal !== undefined && typeof x.callback === \"function\") {\n self.items[index][x.value] = x.callback(fetchVal);\n }\n });\n });\n }\n },\n dateHandle(items, headers) {\n let dateItems = [];\n headers.forEach((headerItem, index) => {\n if (headerItem.searchOptions !== undefined) {\n if (headerItem.searchOptions.type === \"date\") {\n dateItems.push(headerItem.value);\n }\n }\n });\n this.items.forEach((item, index) => {\n dateItems.forEach((val) => {\n if (item[val] !== null) {\n item[val] = this.convertDate(item[val]);\n }\n });\n });\n },\n convertDate(inputDate) {\n const dateObj = new Date(inputDate);\n const year = dateObj.getFullYear();\n const month = String(dateObj.getMonth() + 1).padStart(2, \"0\");\n const day = String(dateObj.getDate()).padStart(2, \"0\");\n return `${day}.${month}.${year}`;\n },\n initPerPageItems(totalCount = 0) {\n const self = this;\n let array = [];\n const defaultItems = [5, 10, 15, 20, 25];\n\n defaultItems.forEach((numb) =>\n totalCount > numb ? array.push({ text: numb, value: numb }) : \"\"\n );\n array.push({\n text: \"Tümü\",\n value: totalCount,\n });\n\n self.perPageItems = array;\n },\n getColor(item, name) {\n if (name === \"repetition\") {\n return item === \"1\" ? \"#DCFCE7\" : \"#FEE2E2\";\n }\n if (name === \"transfer\") {\n if (item === \"0\") return \"#FEE2E2\";\n else if (item === \"1\") return \"#DBEAFE\";\n else if (item === \"2\") return \"#DCFCE7\";\n else if (item === \"3\") return \"#FEE2E2\";\n else if (item === \"4\") return \"#DBEAFE\";\n }\n if (name === \"register\") {\n if (item === \"0\") return \"#DBEAFE\";\n else if (item === \"1\") return \"#DBEAFE\";\n else if (item === \"2\") return \"#DCFCE7\";\n }\n if (name === \"payment\" || name === \"working\") {\n return item === \"1\" ? \"#DCFCE7\" : \"#FEE2E2\";\n }\n if (name === \"leaving\") {\n return item === \"1\" ? \"#FEE2E2\" : \"#DBEAFE\";\n }\n if (name === \"graduated\") {\n return item === \"1\" ? \"#DCFCE7\" : \"#DBEAFE\";\n }\n if (name === \"registrationStatus\") {\n if (item === \"0\") return \"#DCFCE7\";\n else if (item === \"1\") return \"#DBEAFE\";\n else if (item === \"2\") return \"#DCFCE7\";\n else if (item === \"3\") return \"#FEE2E2\";\n else if (item === \"4\") return \"#DCFCE7\";\n }\n if (name === \"lastBranch\") {\n if (item === \"ÖNKAYIT\") return \"#DBEAFE\";\n else if (item === \"NAKİL\") return \"#DCFCE7\";\n else if (item === \"KAYITYENİLEME\") return \"#FEE2E2\";\n }\n if (name === \"announcementProcess\") {\n if (item === \"Güncel\") return \"#DCFCE7\";\n else if (item === \"Geçmiş\") return \"#D9D9D9\";\n else if (item === \"Beklemede\") return \"#FEE2E2\";\n }\n if (name === \"topicStatus\") {\n if (item === \"0\") return \"#DC2626\";\n else if (item === \"1\") return \"#16A34A\";\n }\n if (name === \"unitStatus\") {\n if (item === \"0\") return \"#DC2626\";\n else if (item === \"1\") return \"#16A34A\";\n }\n if (name === \"preRegistrationStatus\") {\n if (item === \"0\") return \"#DBEAFE\";\n else if (item === \"1\") return \"#DCFCE7\";\n else if (item === \"2\") return \"#FEE2E2\";\n else if (item === \"3\") return \"#FEE2E2\";\n else if (item === \"4\") return \"#DCFCE7\";\n }\n if (name === \"registerButton\") {\n return item === \"true\" ? \"#DCFCE7\" : \"#DBEAFE\";\n }\n },\n getTextColor(item, name) {\n if (name === \"repetition\") {\n return item === \"1\" ? \"#16A34A\" : \"#DC2626\";\n }\n if (name === \"transfer\") {\n if (item === \"0\") return \"#DC2626\";\n else if (item === \"1\") return \"#2563EB\";\n else if (item === \"2\") return \"#16A34A\";\n else if (item === \"3\") return \"#DC2626\";\n else if (item === \"4\") return \"#2563EB\";\n }\n if (name === \"register\") {\n if (item === \"0\") return \"#2563EB\";\n else if (item === \"1\") return \"#2563EB\";\n else if (item === \"2\") return \"#16A34A\";\n }\n if (name === \"payment\" || name === \"working\") {\n return item === \"1\" ? \"#16A34A\" : \"#DC2626\";\n }\n if (name === \"leaving\") {\n return item === \"1\" ? \"#DC2626\" : \"#2563EB\";\n }\n if (name === \"graduated\") {\n return item === \"1\" ? \"#16A34A\" : \"#2563EB\";\n }\n if (name === \"lastBranch\") {\n if (item === \"ÖNKAYIT\") return \"#2563EB\";\n else if (item === \"NAKİL\") return \"#16A34A\";\n else if (item === \"KAYITYENİLEME\") return \"#DC2626\";\n }\n if (name === \"registrationStatus\") {\n if (item === \"0\") return \"#16A34A\";\n else if (item === \"1\") return \"#2563EB\";\n else if (item === \"2\") return \"#16A34A\";\n }\n if (name === \"announcementProcess\") {\n if (item === \"Güncel\") return \"#00D095\";\n else if (item === \"Beklemede\") return \"#FE550D\";\n else if (item === \"Geçmiş\") return \"#464646\";\n }\n if (name === \"preRegistrationStatus\") {\n if (item === \"0\") return \"#2563EB\";\n else if (item === \"1\") return \"#16A34A\";\n else if (item === \"2\") return \"#DC2626\";\n else if (item === \"3\") return \"#DC2626\";\n else if (item === \"4\") return \"#16A34A\";\n }\n if (name === \"registerButton\") {\n return item === \"true\" ? \"#16A34A\" : \"#2563EB\";\n }\n },\n clickNewItem() {\n this.$emit(\"clickNewItem\");\n },\n clickMultiSelectAction(clickItem) {\n this.$emit(\"clickMultiSelectAction\", this.listItemSelected, clickItem);\n },\n stringToCode(str, name, value, selfItem) {\n const func = new Function(\"item\", `return ${str}`);\n const item = { [name]: value };\n return func(item);\n },\n setupStickyColumns() {\n const table = document.querySelector(\"#v-data-table\");\n if (!table) return;\n\n const headerCells = table.querySelectorAll(\"thead th\");\n const rows = table.querySelectorAll(\"tbody tr\");\n\n // Önce tüm sticky stilleri temizle\n headerCells.forEach((cell) => {\n cell.style.position = \"\";\n cell.style.left = \"\";\n cell.style.zIndex = \"\";\n cell.style.backgroundColor = \"\";\n cell.style.boxShadow = \"\";\n });\n\n rows.forEach((row) => {\n const cells = row.querySelectorAll(\"td\");\n cells.forEach((cell) => {\n cell.style.position = \"\";\n cell.style.left = \"\";\n cell.style.zIndex = \"\";\n cell.style.backgroundColor = \"\";\n cell.style.boxShadow = \"\";\n });\n });\n\n // Sticky kolonları ayarla\n let leftOffset = 0;\n\n this.stickyColumns.forEach((columnValue, index) => {\n // Header hücresini bul\n const headerIndex = this.showHeaders.findIndex(\n (header) => header.value === columnValue\n );\n if (headerIndex === -1) return;\n\n const headerCell = headerCells[headerIndex];\n if (!headerCell) return;\n\n // Sticky stil uygula\n headerCell.style.position = \"sticky\";\n headerCell.style.left = leftOffset + \"px\";\n headerCell.style.zIndex = \"2\";\n headerCell.style.backgroundColor = \"white\";\n headerCell.style.boxShadow = \"2px 0 5px rgba(0,0,0,0.1)\";\n\n // Tüm satırlar için aynı işlemi yap\n rows.forEach((row) => {\n const cells = row.querySelectorAll(\"td\");\n if (cells.length > headerIndex) {\n const cell = cells[headerIndex];\n cell.style.position = \"sticky\";\n cell.style.left = leftOffset + \"px\";\n cell.style.zIndex = \"1\";\n cell.style.backgroundColor = \"white\";\n cell.style.boxShadow = \"2px 0 5px rgba(0,0,0,0.1)\";\n }\n });\n\n // Bir sonraki kolon için offset güncelle\n leftOffset += headerCell.offsetWidth;\n });\n },\n checkForHorizontalScroll() {\n const table = this.$refs.dataTable;\n if (table) {\n const wrapper = table.$el.querySelector(\".v-data-table__wrapper\");\n if (this.bottomScroll) {\n wrapper.classList.add(\"active\");\n }\n this.hasHorizontalScroll = wrapper.scrollWidth > wrapper.clientWidth;\n }\n },\n handleTopScroll(e) {\n const table = this.$refs.dataTable.$el.querySelector(\".v-data-table__wrapper\");\n table.scrollLeft = e.target.scrollLeft;\n },\n handleMainTableScroll(e) {\n const topScrollBar = this.$refs.topScrollBar;\n if (topScrollBar) {\n topScrollBar.scrollLeft = e.target.scrollLeft;\n }\n },\n setupScrollSync() {\n this.$nextTick(() => {\n const table = this.$refs.dataTable;\n if (table) {\n const wrapper = table.$el.querySelector(\".v-data-table__wrapper\");\n if (wrapper) {\n const topScrollBar = this.$refs.topScrollBar;\n if (topScrollBar) {\n // Clear existing content\n topScrollBar.innerHTML = \"\";\n // Create and append the spacer div with exact width\n const spacerDiv = document.createElement(\"div\");\n spacerDiv.style.width = `${wrapper.scrollWidth}px`;\n spacerDiv.style.height = \"1px\";\n spacerDiv.style.minWidth = `${wrapper.scrollWidth + 120}px`; // Add min-width to ensure full width\n topScrollBar.appendChild(spacerDiv);\n\n // Set the wrapper width to match the table\n topScrollBar.style.width = `${wrapper.clientWidth + 100}px`;\n }\n wrapper.addEventListener(\"scroll\", this.handleMainTableScroll);\n }\n }\n });\n },\n isScrollable() {\n return this.hasHorizontalScroll\n },\n convertAlternateValues(items, headers) {\n const tempItems = JSON.parse(JSON.stringify(items));\n headers.forEach(header => {\n if (header.alternateValues && header.alternateValues.length > 0) {\n tempItems.forEach(item => {\n if (item[header.value]) {\n // Excel için özel sembol dönüşümü yapılacaksa\n if (header.excelSymbols) {\n const values = item[header.value].split(',');\n const convertedValues = values.map(val => {\n const found = header.alternateValues.find(av => av.key === val.trim());\n if (found && header.excelSymbols[found.key]) {\n const symbol = header.excelSymbols[found.key];\n // Excel XML formatında stil tanımlaması\n return `<html><font size=\"10\" color=\"${symbol.color}\">${symbol.char}</font></html>`;\n }\n return found ? found.value : val.trim();\n });\n item[header.value] = convertedValues.join(' ');\n } else {\n // Normal metin dönüşümü\n const values = item[header.value].split(',');\n const convertedValues = values.map(val => {\n const found = header.alternateValues.find(av => av.key === val.trim());\n return found ? found.value : val.trim();\n });\n item[header.value] = convertedValues.join(', ');\n }\n }\n });\n }\n });\n return tempItems;\n },\n\n convertTableValues(items, headers) {\n headers.forEach(header => {\n if (header.alternateValues && header.alternateValues.length > 0) {\n items.forEach(item => {\n // Risk dereceleri ve diğer tekil değerler için\n if (item[header.value] && !item[header.value].includes(',')) {\n const found = header.alternateValues.find(av => av.key === item[header.value]);\n if (found) {\n item[header.value] = found.value;\n }\n }\n });\n }\n });\n },\n },\n computed: {\n changedDate() {\n return (date) => {\n return this.formatDate(date);\n };\n },\n showHeaders() {\n return this.headers.filter((item) => this.copyHeaders.includes(item));\n },\n headerTemplates() {\n return this.headers.filter((x) => x.custom);\n },\n // visibleHeaders() {\n // return this.showHeaders.filter(header => !this.hiddenColumns.includes(header.value));\n // },\n // visibleColumns() {\n // return this.showHeaders.map(header => header.value).filter(column => !this.hiddenColumns.includes(column));\n // }\n\n },\n});\n\n\n//# sourceURL=webpack://@bilfenyazilimekibi/bilpack/./src/components/bf-table/index.vue?./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options");
734
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var vue_advanced_cropper__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue-advanced-cropper */ \"./node_modules/vue-advanced-cropper/dist/index.es.js\");\n/* harmony import */ var vue_advanced_cropper_dist_style_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vue-advanced-cropper/dist/style.css */ \"./node_modules/vue-advanced-cropper/dist/style.css\");\n/* harmony import */ var _dev_project_settings__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../../dev/project.settings */ \"./dev/project.settings.js\");\n\n\n\n\n\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n components: { Cropper: vue_advanced_cropper__WEBPACK_IMPORTED_MODULE_0__.Cropper },\n\n props: {\n isSingleSelect: {\n default: false,\n },\n bottomScroll: {\n default: true,\n },\n topScroll: {\n type: Boolean,\n default: false\n },\n customSwitch: {\n default: false,\n },\n cropImg: {\n default: false,\n },\n imgChangeApi: {\n default: \"\",\n },\n isImageChange: {\n default: false,\n },\n coloredRows: {\n default: () => [],\n },\n schoolNameTooltip: {\n default: false,\n },\n queryPrefix: {\n default: null,\n },\n queryCallback: {\n default: null,\n },\n isClickableColumn: {\n default: false,\n },\n withoutActions: {\n default: false,\n },\n hasActivePassive: {\n default: false,\n },\n isExpandable: {\n default: false,\n },\n isSelectable: {\n default: false,\n },\n filterRange: {\n default: false,\n },\n pagination: {\n default: true,\n },\n searchableList: {\n default: true,\n },\n customizeActions: {\n default: false,\n },\n colorColumns: {\n default: false,\n },\n stickyColumns: {\n type: Array,\n default: () => [],\n },\n multiSelectSettings: {\n default: () => ({\n action: false,\n }),\n },\n isImage: {\n default: false,\n },\n // perPage: {\n // default: 10\n // },\n isAllItems: {\n default: false\n },\n filterPerPage: {\n default: true,\n },\n isTopArea: {\n default: true,\n },\n headers: {\n default: () => [],\n },\n colorChangeItems: {\n default: () => [],\n },\n noDataTitle: {\n default: () => [],\n },\n filterFields: {\n default: () => [],\n },\n // hiddenColumns: {\n // default: () => []\n // },\n apiUrl: {\n type: String,\n default: null,\n },\n viewConditionFunction: {\n type: Function,\n },\n queryJsonProps: {\n type: Object,\n default: () => ({\n limit: { start: 0, stop: 100 },\n order: [{ columnName: \"id\", type: \"desc\" }],\n columns: null,\n }),\n },\n customParams: {\n default: null,\n },\n tableTitle: {\n default: true,\n },\n tabs: {\n default: () => ({ visible: false }),\n },\n isColumnFilter: {\n default: false,\n },\n isColumnDownload: {\n default: false,\n },\n isRemoveEmptyForExcel: {\n default: false,\n },\n downloadButtonText: {\n default: () => ({\n title: \"İndir\",\n color: \"#ffff\",\n }),\n },\n isAddButtonOptions: {\n default: null,\n },\n title: {\n type: String,\n },\n info: {\n default: true,\n },\n deleteOptions: {\n default: null,\n },\n updateOptions: {\n default: null,\n },\n initAuto: {\n default: true,\n },\n newItem: {\n default: false,\n },\n loading: {\n default: false,\n },\n switchKey: {\n default: \"\",\n },\n isFirstRun: {\n default: true,\n },\n },\n data() {\n return {\n imgFileLoader: false,\n cropDialog: false,\n currentImgSelectedItem: null,\n currentImgChangeType: \"Student\",\n aspectRatio: false,\n stencilProps: {\n movable: true,\n resizable: true,\n handlers: { corners: true },\n round: true,\n },\n cropShape: \"rectangle-stencil\",\n selectedImage: null,\n croppedImage: null,\n generalSettings: _dev_project_settings__WEBPACK_IMPORTED_MODULE_2__.generalSettings,\n tab: 0,\n isDownloadFilter: false,\n columnIsActive: false,\n isMobile: null,\n perPage: 10,\n excelOptions: {\n active: true,\n json_data: [],\n json_fields: {},\n excelFileName: \"\",\n json_meta: [\n [\n {\n key: \"charset\",\n value: \"utf-8\",\n },\n ],\n ],\n },\n deleteItem: null,\n options: {},\n sortBy: \"fat\",\n sortDesc: false,\n search: \"\",\n page: 1,\n pageCount: 0,\n skeletonLoader: true,\n mainLoader: true,\n queryJson: null,\n items: [],\n // perPageItems: [5, 10, 15, 20, 25],\n perPageItems: [],\n week: 10,\n weekItems: [5, 10, 15],\n currentPageNumber: 0,\n sortType: \"desc\",\n columnName: \"\",\n filterColumns: \"\",\n totalCount: \"\",\n listItemSelected: [],\n expanded: [],\n selectedHeaders: [],\n copyHeaders: [],\n checkBoxDisabled: false,\n switchKeyData: \"\",\n isDisabled: false,\n // Dinamik olarak oluşturulan hex renk sınıflarını izlemek için\n createdRowColorClasses: new Set(),\n };\n },\n watch: {\n totalCount(val) {\n if (this.isAllItems) {\n this.perPage = val\n }\n },\n cropDialog(val) {\n if (!val) {\n this.selectedImage = null;\n this.croppedImage = null;\n }\n },\n options: {\n handler() {\n this.fetchData();\n },\n deep: true,\n },\n tab(value) {\n // // query json tamamen güncelleyerek işlem yap\n\n // if (this.tabs.type === 'query') {\n //\n // let prefix = {}\n // prefix = {\n // \"columns\": column !== null ? { [column]: { \"value1\": val, \"operator\": \"like\" } } : null\n // }\n // this.queryPrefix = JSON.stringify(prefix)\n //\n // // let queryObj = {}\n // // queryObj = {\n // // \"limit\": { \"start\": 0, \"stop\": 10 },\n // // \"order\": [{ \"columnName\": \"id\", \"type\": \"desc\" }],\n // // \"columns\": column !== null ? { [column]: { \"value1\": val, \"operator\": \"like\" } } : null\n // // }\n //\n // setTimeout(() => this.fetchData())\n // // let queryObj = {}\n // // if (type === 'error') {\n //\n // // } else if (type === 'success') {\n // // queryObj = {\n // // \"limit\": { \"start\": -1, \"stop\": -1 },\n // // \"order\": [{ \"columnName\": \"id\", \"type\": \"desc\" }],\n // // \"columns\": { \"studentData\": { \"value1\": \"1\", \"operator\": \"like\" } }\n // // }\n // // } else {\n // // queryObj = {\n // // \"limit\": { \"start\": -1, \"stop\": -1 },\n // // \"order\": [{ \"columnName\": \"id\", \"type\": \"desc\" }],\n // // \"columns\": null\n // // }\n // // }\n\n // queryJson ile search işlemi yap\n\n // let column = this.tabs.content[value].column\n // let val = this.tabs.content[value].value\n\n this.showHeaders.forEach((item, index) => {\n // : Todo geçici çözüm. Bu alan düzenlencek\n if (item.value === \"studentData\") {\n if (this.tabs.content[value].key === \"success\") {\n this.showHeaders.find((x) => x.value === \"studentData\").searchValue = \"1\";\n } else if (this.tabs.content[value].key === \"error\") {\n this.showHeaders.find((x) => x.value === \"studentData\").searchValue = \"0\";\n } else {\n this.showHeaders.find((x) => x.value === \"studentData\").searchValue = \"\";\n }\n }\n\n if (item.value === this.tabs.content[value].key) {\n this.showHeaders[index].searchValue = this.tabs.content[value].value;\n }\n });\n setTimeout(() => this.searchData());\n\n // this.fetchData()\n },\n page(value) {\n if (value > 0) {\n let startVal = this.page === 1 ? 0 : this.perPage * (value - 1);\n this.queryJson.limit.start = startVal;\n this.queryJson.limit.stop = this.perPage;\n this.fetchData();\n }\n },\n perPage(value) {\n const self = this;\n this.queryJson.limit.stop = value;\n setTimeout(() => {\n self.perPage = value;\n });\n this.fetchData();\n },\n selectedHeaders: {\n handler() {\n this.initExcel();\n },\n deep: true,\n },\n expanded(value) {\n this.$emit(\"expandAction\", value);\n },\n listItemSelected(value) {\n const self = this;\n self.$emit(\"listItemSelected\", value);\n },\n items(val) {\n const self = this;\n // eğer listedeki itemslar değişirse excel listesini init etmek için // \n self.initExcel()\n }\n },\n created() {\n\n this.queryJsonProps.limit.stop = this.perPage;\n // this.queryJsonProps.order.type = 'desc';\n\n // this.queryJson = this.queryJsonProps;\n this.queryJson = JSON.parse(JSON.stringify(this.queryJsonProps));\n\n this.selectedHeaders = this.headers;\n this.selectedHeaders.forEach((header, index) => {\n header.searchValue = \"\";\n header.selected = true;\n this.copyHeaders.push(header);\n });\n },\n mounted() {\n if (this.initAuto) {\n this.initExcel();\n if (this.apiUrl !== null) {\n this.hasActivePassive ? this.setActivePassive(\"active\") : this.fetchData();\n }\n this.dataSelectInit();\n }\n\n // Sticky kolonları ayarla\n if (this.stickyColumns.length > 0) {\n this.$nextTick(() => {\n setTimeout(() => {\n this.setupStickyColumns();\n }, 500);\n });\n }\n this.setupScrollSync();\n },\n updated() {\n // Tablo güncellendiğinde sticky kolonları tekrar ayarla\n if (this.stickyColumns.length > 0) {\n this.$nextTick(() => {\n this.setupStickyColumns();\n });\n }\n this.checkForHorizontalScroll();\n },\n beforeDestroy() {\n const table = this.$refs.dataTable;\n if (table) {\n const wrapper = table.$el.querySelector(\".v-data-table__wrapper\");\n if (wrapper) {\n wrapper.removeEventListener(\"scroll\", this.handleMainTableScroll);\n }\n }\n },\n methods: {\n checkboxIsDisabled(val) {\n const self = this;\n if (val == 'true') {\n self.isDisabled = true\n } else {\n self.isDisabled = false\n }\n },\n findAutoSelectItems(keyValue) {\n const self = this;\n let resultArray = [];\n\n self.items.forEach((item) => {\n if (item.hasOwnProperty(keyValue)) {\n // Eğer bu değer daha önce array'e eklenmemişse ekle\n if (!resultArray.includes(item[keyValue])) {\n const searchObject = {\n name: item[keyValue],\n val: item[keyValue],\n };\n resultArray.push(searchObject);\n }\n }\n });\n return resultArray;\n },\n async onFileSelected(event, item) {\n const file = event.target.files[0];\n\n if (this.cropImg) {\n if (file) {\n this.selectedImage = URL.createObjectURL(file);\n setTimeout(() => (this.cropDialog = true));\n }\n } else {\n this.saveImage(file);\n }\n },\n async saveImage(file, fileName = null) {\n try {\n if (file) {\n this.imgFileLoader = true;\n // this.selectedImage = URL.createObjectURL(file);\n const formData = new FormData();\n formData.append(\"studentId\", this.currentImgSelectedItem.studentId);\n formData.append(\"type\", this.currentImgChangeType);\n if (fileName) {\n formData.append(\"image\", file, `${fileName}`);\n } else {\n formData.append(\"image\", file);\n }\n\n const { status, message } = await this.$axios.post(this.imgChangeApi, formData);\n\n if (status) {\n this.fetchData();\n this.$refs.fileInput.value = null;\n this.currentImgSelectedItem = null;\n this.cropDialog = false;\n this.currentImgSelectedItem = null;\n } else {\n this.$refs.tableAlert.error(message);\n }\n }\n } catch (e) {\n console.error(\"Error updating image:\", e);\n const msg = e.message ? e.message : \"Bir Hata Oluştu!\";\n this.$refs.tableAlert.error(msg);\n } finally {\n this.imgFileLoader = false;\n }\n },\n createCircularCanvas(canvas) {\n const size = Math.min(canvas.width, canvas.height);\n const circularCanvas = document.createElement(\"canvas\");\n circularCanvas.width = size;\n circularCanvas.height = size;\n\n const ctx = circularCanvas.getContext(\"2d\");\n\n ctx.beginPath();\n ctx.arc(size / 2, size / 2, size / 2, 0, Math.PI * 2);\n ctx.clip();\n\n ctx.drawImage(\n canvas,\n (canvas.width - size) / 2,\n (canvas.height - size) / 2,\n size,\n size,\n 0,\n 0,\n size,\n size\n );\n\n return circularCanvas;\n },\n cropImage() {\n const { canvas } = this.$refs.cropper.getResult();\n\n const finalCanvas =\n this.cropShape === \"circle-stencil\" ? this.createCircularCanvas(canvas) : canvas;\n\n finalCanvas.toBlob((imageBlob) => {\n const fileType = imageBlob.type.split(\"/\")[1];\n this.saveImage(imageBlob, `${imageBlob.size}.${fileType}`);\n }, \"image/jpeg\");\n },\n imageChange(item, type = \"Student\") {\n if (!this.isImageChange) return;\n this.currentImgSelectedItem = item;\n this.currentImgChangeType = type;\n this.$refs.fileInput.click();\n },\n formatDate(date) {\n if (!date) return null;\n const d = new Date(date);\n const day = String(d.getDate()).padStart(2, \"0\");\n const month = String(d.getMonth() + 1).padStart(2, \"0\");\n const year = d.getFullYear();\n return `${day}-${month}-${year}`;\n },\n parseDate(date) {\n if (!date) return null;\n const [day, month, year] = date.split(\"-\");\n return new Date(year, month - 1, day).toISOString().substr(0, 10);\n },\n // istenilen row'un backgrounduna renk vermek için kullanılan function\n itemRowBackground(item) {\n const self = this;\n let coloredName = \"\";\n\n // Yeni kurallar: coloredRowValue bir ifade olabilir: \"{a}+{b}\"\n // Eski kurallar: direkt değer eşitliği\n self.coloredRows.map((rule) => {\n const leftRaw = item[rule.coloredRowKey];\n const rightRaw = rule.coloredRowValue;\n\n const leftVal = (typeof leftRaw === \"number\")\n ? leftRaw\n : (typeof leftRaw === \"string\" && leftRaw.trim() !== \"\" && !isNaN(Number(leftRaw)))\n ? Number(leftRaw)\n : leftRaw;\n\n const rightVal =\n typeof rightRaw === \"string\" && rightRaw.includes(\"{\")\n ? self.evaluateExpression(rightRaw, item)\n : ((typeof rightRaw === \"number\")\n ? rightRaw\n : (typeof rightRaw === \"string\" && rightRaw.trim() !== \"\" && !isNaN(Number(rightRaw)))\n ? Number(rightRaw)\n : rightRaw);\n\n let isEqual;\n if (typeof leftVal === \"number\" && typeof rightVal === \"number\") {\n isEqual = leftVal === rightVal;\n } else {\n isEqual = String(leftVal) === String(rightVal);\n }\n\n const condition = rule.equalValue ? isEqual : !isEqual;\n if (condition) {\n const cls = self.getRowClassForColor(rule.coloredRowColor);\n if (cls) coloredName = cls;\n }\n });\n\n return coloredName;\n },\n\n // \"{a}+{b}-{c}\" gibi ifadeleri değerlendirir (yalnızca 0-9, + - * / ( ) ve nokta)\n evaluateExpression(expr, item) {\n try {\n let replaced = expr.replace(/\\{([^}]+)\\}/g, (match, key) => {\n const val = item[key.trim()];\n const num = (typeof val === \"number\") ? val : Number(val);\n return isNaN(num) ? 0 : num;\n });\n // Güvenlik: sadece izinli karakterler\n if (/^[0-9+\\-*/().\\s]+$/.test(replaced) === false) return 0;\n // eslint-disable-next-line no-new-func\n const fn = new Function(`return (${replaced});`);\n const result = fn();\n return typeof result === \"number\" && isFinite(result) ? result : 0;\n } catch (e) {\n return 0;\n }\n },\n\n // Renk adına göre sınıf döndürür. Hex verilirse dinamik sınıf üretir.\n getRowClassForColor(color) {\n if (typeof color !== \"string\") return \"\";\n const lower = color.toLowerCase();\n const named = [\"red\", \"blue\", \"white\", \"yellow\", \"green\"];\n if (named.includes(lower)) return `table-${lower}`;\n\n // Hex renk desteği\n if (color.startsWith(\"#\") && (color.length === 7 || color.length === 4)) {\n const sanitized = color.replace('#', '').toUpperCase();\n const className = `table-hex-${sanitized}`;\n if (!this.createdRowColorClasses.has(className)) {\n this.injectRowColorStyle(className, color);\n this.createdRowColorClasses.add(className);\n }\n return className;\n }\n\n // Diğer geçerli css renkleri için de dinamik sınıf oluşturmayı deneyelim\n const className = `table-color-${btoa(unescape(encodeURIComponent(color))).replace(/=/g, '')}`;\n if (!this.createdRowColorClasses.has(className)) {\n this.injectRowColorStyle(className, color);\n this.createdRowColorClasses.add(className);\n }\n return className;\n },\n\n // Verilen sınıf adı için style tag inject eder\n injectRowColorStyle(className, color) {\n const style = document.createElement('style');\n style.type = 'text/css';\n style.textContent = `.v-application .${className} .text-start { background-color: ${color} !important; }`;\n document.head.appendChild(style);\n },\n openModal(item, name) {\n this.$emit(\"openModal\", item, name);\n },\n changeDateInput(item) {\n this.$emit(\"changeDateInput\", item);\n // Tarih seçimi yapıldığı zaman o öğrencinin checkboxını true yapmak için\n const exists = this.listItemSelected.some(\n (student) => student.studentClassroomId === item.studentClassroomId\n );\n if (!exists) {\n this.listItemSelected.push(item);\n }\n },\n changeInput(item, date) {\n item.vaccineDate = date;\n this.$emit(\"changeInput\", item);\n },\n getImage(type) {\n if (type === \"no-result\") {\n return this.$bilpack.settings.images.table.noResult;\n } else {\n return this.$bilpack.settings.images.noData;\n }\n },\n switchAction(item) {\n this.$emit(\"switchAction\", item);\n },\n onResize() {\n if (window.innerWidth < 769) this.isMobile = true;\n else this.isMobile = false;\n },\n selectFilter(item) {\n const self = this;\n if (item.selected) {\n self.copyHeaders.push(item)\n } else {\n self.copyHeaders = self.copyHeaders.filter(val => val.value !== item.value)\n }\n if (self.headers.some(item => item.value === \"action\")) {\n if (self.copyHeaders.length === 2) {\n self.checkboxIsDisabled('true')\n }\n else {\n self.checkboxIsDisabled('false')\n }\n\n } else {\n if (self.copyHeaders.length === 1) {\n self.checkboxIsDisabled('true')\n } else {\n self.checkboxIsDisabled('false')\n }\n }\n this.$nextTick(() => {\n setTimeout(() => {\n this.setupScrollSync();\n }, 100);\n });\n // filter input her değiştiğinde excel listesini init ediyoruz //\n setTimeout(() => {\n self.initExcel()\n })\n },\n setActivePassive(method) {\n const self = this;\n\n if (self.queryJson.columns === null) {\n self.queryJson.columns = {\n status: {\n value1: method === \"active\" ? \"1\" : \"0\",\n operator: \"equal\",\n },\n };\n } else {\n if (typeof self.queryJson.columns === \"object\") {\n self.queryJson.columns.status = {\n value1: method === \"active\" ? \"1\" : \"0\",\n operator: \"equal\",\n };\n }\n }\n\n self.queryJson.limit.start = \"0\";\n\n self.columnIsActive = method === \"active\";\n\n self.fetchData();\n },\n filterHandle(headers) {\n headers.forEach((val, key) => {\n if (val.value === \"action\") {\n headers.splice(key, 1);\n }\n });\n return headers;\n },\n initExcel() {\n const self = this;\n self.excelOptions.json_fields = {};\n // isRemoveEmptyForExcel değerine göre filtrelenmiş listeyi ya da başlangıçtaki listeyi eşitliyoruz // \n const excelListItems = self.isRemoveEmptyForExcel ? self.copyHeaders : self.selectedHeaders;\n\n // excel çıktısındaki listede eğer filterFields propsunun key değerlerinin hiçbiri yok ise o öğrenciyi listeden çıkarmak için //\n const activeHealthFields = self.filterFields.filter(item => self.copyHeaders.some(h => h.value === item && h.selected)).map(item => item);\n const filteredStudents = activeHealthFields.length > 0 ? self.items.filter(student => {\n // filter içindeki alanlardan en az biri dolu mu?\n const hasAnyValue = activeHealthFields.some(key => {\n const val = student[key];\n return val !== null && val !== \"\" && val !== undefined;\n });\n return hasAnyValue; // dolu varsa öğrenci listede kalır\n }) : self.convertAlternateValues(self.items, self.copyHeaders);\n self.excelOptions.json_data = filteredStudents\n\n // Not: `download-excel` `fields` prop'u obje bekliyor. Obje key'leri (kolon başlıkları)\n // aynı olursa üstüne yazıldığı için bazı sütunlar Excel'de eksik görünebilir.\n // Bu yüzden başlıkları unique hale getiriyoruz.\n const usedTitles = new Map();\n excelListItems.forEach((header) => {\n if (!header || header.value === \"action\") return;\n\n const rawTitle = (header.text ?? header.value ?? \"\").toString().trim();\n const baseTitle = rawTitle.length > 0 ? rawTitle : (header.value ?? \"\").toString();\n if (!baseTitle) return;\n\n const seenCount = usedTitles.get(baseTitle) ?? 0;\n usedTitles.set(baseTitle, seenCount + 1);\n const uniqueTitle = seenCount === 0 ? baseTitle : `${baseTitle} (${seenCount + 1})`;\n\n self.excelOptions.json_fields[uniqueTitle] = header.value;\n });\n\n self.excelOptions.excelFileName =\n self.title !== undefined ? self.title : \"Excel Listesi\";\n },\n dataSelectInit() {\n const self = this;\n self.headers.forEach((item) => {\n if (\n item.searchOptions !== undefined &&\n item.searchOptions.type === \"select-data\"\n ) {\n // item.loader = true;\n if (item.searchOptions.endpoint !== \"\") {\n item.searchOptions.selectItems = [];\n self.$axios.get(item.searchOptions.endpoint).then((res) => {\n item.searchOptions.selectItems = res.data.data;\n });\n }\n }\n });\n },\n openDeleteConfirm(item) {\n this.$emit(\"deleteItem\", item);\n const self = this;\n self.deleteItem = item;\n if (self.deleteOptions.confirmText !== undefined) {\n this.$refs.tableAlert.confirm({\n text: self.deleteOptions.confirmText,\n });\n } else {\n this.$refs.tableAlert.confirm();\n }\n },\n deleteTableItem() {\n const self = this;\n const obj = {};\n\n self.deleteOptions.postParams.forEach((val) => {\n obj[val.param] = this.isSelectable\n ? JSON.stringify([this.deleteItem[val.value]]).replace(/\"/g, \"\")\n : this.deleteItem[val.value];\n });\n\n if (self.deleteOptions.customPostParams !== undefined) {\n self.deleteOptions.customPostParams.forEach((val) => {\n obj[val.param] = val.value;\n });\n }\n\n setTimeout(() => {\n self.$axios.post(self.deleteOptions.endpoint, obj).then((res) => {\n if (res.data.status) {\n self.$refs.tableAlert.success();\n self.fetchData();\n\n this.$emit(\"deleteAfterFunction\");\n } else {\n let text =\n res.data.message !== undefined ? res.data.message : \"Bir hata oluştu\";\n self.$refs.tableAlert.error({\n text: text,\n });\n }\n });\n });\n },\n searchData(customSearchValue) {\n let columns = {};\n\n if (this.queryPrefix !== null) {\n if (this.queryPrefix.columns !== undefined)\n columns = JSON.parse(JSON.stringify(this.queryPrefix.columns));\n }\n this.headers.forEach((value, key) => {\n if (value.searchValue) {\n let pushObject = {\n value1: value.searchValue,\n operator: value.operator,\n };\n customSearchValue\n ? customSearchValue?.length > 0\n ? (columns[customSearchValue] = pushObject)\n : (columns[value.value] = pushObject)\n : (columns[value.value] = pushObject);\n }\n });\n this.queryJson.columns = columns;\n this.$forceUpdate();\n this.page = 1;\n this.fetchData();\n },\n // searchData() {\n // let columns = {};\n // this.headers.forEach((value, key) => {\n // // todo: Bu alan tekrar düzenlenecek.\n // if (value.searchValue) {\n // if (value.value === 'preRegistrationStatus' && value.searchValue === '4') {\n // let pushObject = {\"value1\": 'true', \"operator\": value.operator}\n // columns['registrationStatus'] = pushObject\n // } else {\n // let pushObject = {\"value1\": value.searchValue, \"operator\": value.operator}\n // columns[value.value] = pushObject\n // }\n // }\n // })\n //\n // this.queryJson.columns = columns\n // this.page = 1;\n //\n // this.fetchData();\n // },\n customSorting(sortBy, sortDesc) {\n const sort = sortBy?.length === 0 ? \"id\" : sortBy[0];\n // v-data-table sortDesc: true = azalan, false = artan -> backend 'desc' | 'asc'\n // sortDesc array olarak gelir (örn: [true] veya [false]), ilk elemanı alıyoruz\n const descValue = Array.isArray(sortDesc) ? sortDesc[0] : sortDesc;\n const desc = typeof descValue === \"boolean\" ? (descValue ? \"desc\" : \"asc\") : (descValue || \"desc\");\n this.queryJson.order = [{\n columnName: sort,\n type: desc,\n }];\n },\n resetAndFetch() {\n const self = this;\n self.showHeaders.forEach((item) => {\n item.searchValue = \"\";\n });\n self.queryJson = JSON.stringify(this.queryJsonProps);\n self.fetchData();\n },\n checkListItems() {\n try {\n const localSelectedItem = JSON.parse(localStorage.getItem(\"selectData\"));\n if (localSelectedItem) {\n this.listItemSelected = localSelectedItem;\n } else {\n this.listItemSelected = [];\n }\n } catch (error) {\n this.listItemSelected = [];\n }\n },\n fetchData(customQueryJson = null, refreshQuery = false) {\n const self = this;\n self.mainLoader = true;\n self.checkListItems();\n const { sortBy, sortDesc, page, itemsPerPage } = this.options;\n\n this.customSorting(sortBy, sortDesc);\n\n setTimeout(async () => {\n let queryJsonString =\n customQueryJson !== null ? customQueryJson : JSON.stringify(this.queryJson);\n\n let params = {\n queryJson: queryJsonString,\n };\n\n if (self.customParams !== null) Object.assign(params, self.customParams);\n\n if (self.queryCallback !== null && typeof self.queryCallback === \"function\") {\n params = await self.queryCallback(params);\n }\n // İstek atılmadan önce dışarıya event gönderiyoruz\n this.$emit('beforeRequest', {\n queryJsonProps: this.queryJson,\n timestamp: new Date().toLocaleString()\n });\n\n self.$axios.post(self.apiUrl, params).then((res) => {\n if (res.data.data.result !== undefined) {\n self.totalCount = res.data.data.totalCount;\n if (res.data.status) {\n self.initPerPageItems(this.totalCount);\n self.pageCount = Math.ceil(res.data.data.filterCount / self.perPage);\n self.items = res.data.data.result;\n self.items.map((val, index) => {\n if (val.createdAt) {\n const dateString = val.createdAt;\n const dateParts = dateString.split(\" \")[0].split(\"-\");\n const formattedDate = `${dateParts[1]}-${dateParts[2]}-${dateParts[0]}`;\n self.items[index].createdAt = formattedDate;\n self.items[index].fullSchollName = val.schoolNames;\n if (val.schoolNames) {\n if (val.schoolNames.includes(\",\")) {\n const arraySchoolName = val.schoolNames.split(\",\");\n self.items[index].schoolNames =\n arraySchoolName[0] + \"... +\" + (arraySchoolName?.length - 1);\n }\n }\n }\n });\n self.dateHandle(self.items, self.showHeaders);\n self.itemsCallback(self.items, self.showHeaders);\n self.items.map((val, index) => {\n if (val.registerPercentage) {\n self.items[index].registerPercentage = val.registerPercentage.replace(/\\./g, \",\");\n }\n });\n\n // Tablo gösterimi için değerleri dönüştür\n self.convertTableValues(self.items, self.headers);\n\n // Excel için ayrı bir veri seti oluştur ve dönüştür\n const excelItems = self.convertAlternateValues(self.items, self.headers);\n self.excelOptions.json_data = excelItems;\n\n self.$emit(\"onFetch\", self.items);\n\n if (self.stickyColumns.length > 0) {\n self.$nextTick(() => {\n setTimeout(() => {\n self.setupStickyColumns();\n }, 100);\n });\n }\n }\n }\n self.mainLoader = false;\n self.skeletonLoader = false;\n\n this.$nextTick(() => {\n setTimeout(() => {\n this.setupScrollSync();\n }, 100);\n });\n });\n });\n },\n itemsCallback(items, headers) {\n const self = this;\n const callbacks = headers.filter((x) => x.callback);\n if (callbacks) {\n callbacks.forEach((x) => {\n items.forEach((i, index) => {\n const fetchVal = i[x.value];\n if (fetchVal !== undefined && typeof x.callback === \"function\") {\n self.items[index][x.value] = x.callback(fetchVal);\n }\n });\n });\n }\n },\n dateHandle(items, headers) {\n let dateItems = [];\n headers.forEach((headerItem, index) => {\n if (headerItem.searchOptions !== undefined) {\n if (headerItem.searchOptions.type === \"date\") {\n dateItems.push(headerItem.value);\n }\n }\n });\n this.items.forEach((item, index) => {\n dateItems.forEach((val) => {\n if (item[val] !== null) {\n item[val] = this.convertDate(item[val]);\n }\n });\n });\n },\n convertDate(inputDate) {\n const dateObj = new Date(inputDate);\n const year = dateObj.getFullYear();\n const month = String(dateObj.getMonth() + 1).padStart(2, \"0\");\n const day = String(dateObj.getDate()).padStart(2, \"0\");\n return `${day}.${month}.${year}`;\n },\n initPerPageItems(totalCount = 0) {\n const self = this;\n let array = [];\n const defaultItems = [5, 10, 15, 20, 25];\n\n defaultItems.forEach((numb) =>\n totalCount > numb ? array.push({ text: numb, value: numb }) : \"\"\n );\n array.push({\n text: \"Tümü\",\n value: totalCount,\n });\n\n self.perPageItems = array;\n },\n getColor(item, name) {\n if (name === \"repetition\") {\n return item === \"1\" ? \"#DCFCE7\" : \"#FEE2E2\";\n }\n if (name === \"transfer\") {\n if (item === \"0\") return \"#FEE2E2\";\n else if (item === \"1\") return \"#DBEAFE\";\n else if (item === \"2\") return \"#DCFCE7\";\n else if (item === \"3\") return \"#FEE2E2\";\n else if (item === \"4\") return \"#DBEAFE\";\n }\n if (name === \"register\") {\n if (item === \"0\") return \"#DBEAFE\";\n else if (item === \"1\") return \"#DBEAFE\";\n else if (item === \"2\") return \"#DCFCE7\";\n }\n if (name === \"payment\" || name === \"working\") {\n return item === \"1\" ? \"#DCFCE7\" : \"#FEE2E2\";\n }\n if (name === \"leaving\") {\n return item === \"1\" ? \"#FEE2E2\" : \"#DBEAFE\";\n }\n if (name === \"graduated\") {\n return item === \"1\" ? \"#DCFCE7\" : \"#DBEAFE\";\n }\n if (name === \"registrationStatus\") {\n if (item === \"0\") return \"#DCFCE7\";\n else if (item === \"1\") return \"#DBEAFE\";\n else if (item === \"2\") return \"#DCFCE7\";\n else if (item === \"3\") return \"#FEE2E2\";\n else if (item === \"4\") return \"#DCFCE7\";\n }\n if (name === \"lastBranch\") {\n if (item === \"ÖNKAYIT\") return \"#DBEAFE\";\n else if (item === \"NAKİL\") return \"#DCFCE7\";\n else if (item === \"KAYITYENİLEME\") return \"#FEE2E2\";\n }\n if (name === \"announcementProcess\") {\n if (item === \"Güncel\") return \"#DCFCE7\";\n else if (item === \"Geçmiş\") return \"#D9D9D9\";\n else if (item === \"Beklemede\") return \"#FEE2E2\";\n }\n if (name === \"topicStatus\") {\n if (item === \"0\") return \"#DC2626\";\n else if (item === \"1\") return \"#16A34A\";\n }\n if (name === \"unitStatus\") {\n if (item === \"0\") return \"#DC2626\";\n else if (item === \"1\") return \"#16A34A\";\n }\n if (name === \"preRegistrationStatus\") {\n if (item === \"0\") return \"#DBEAFE\";\n else if (item === \"1\") return \"#DCFCE7\";\n else if (item === \"2\") return \"#FEE2E2\";\n else if (item === \"3\") return \"#FEE2E2\";\n else if (item === \"4\") return \"#DCFCE7\";\n }\n if (name === \"registerButton\") {\n return item === \"true\" ? \"#DCFCE7\" : \"#DBEAFE\";\n }\n },\n getTextColor(item, name) {\n if (name === \"repetition\") {\n return item === \"1\" ? \"#16A34A\" : \"#DC2626\";\n }\n if (name === \"transfer\") {\n if (item === \"0\") return \"#DC2626\";\n else if (item === \"1\") return \"#2563EB\";\n else if (item === \"2\") return \"#16A34A\";\n else if (item === \"3\") return \"#DC2626\";\n else if (item === \"4\") return \"#2563EB\";\n }\n if (name === \"register\") {\n if (item === \"0\") return \"#2563EB\";\n else if (item === \"1\") return \"#2563EB\";\n else if (item === \"2\") return \"#16A34A\";\n }\n if (name === \"payment\" || name === \"working\") {\n return item === \"1\" ? \"#16A34A\" : \"#DC2626\";\n }\n if (name === \"leaving\") {\n return item === \"1\" ? \"#DC2626\" : \"#2563EB\";\n }\n if (name === \"graduated\") {\n return item === \"1\" ? \"#16A34A\" : \"#2563EB\";\n }\n if (name === \"lastBranch\") {\n if (item === \"ÖNKAYIT\") return \"#2563EB\";\n else if (item === \"NAKİL\") return \"#16A34A\";\n else if (item === \"KAYITYENİLEME\") return \"#DC2626\";\n }\n if (name === \"registrationStatus\") {\n if (item === \"0\") return \"#16A34A\";\n else if (item === \"1\") return \"#2563EB\";\n else if (item === \"2\") return \"#16A34A\";\n }\n if (name === \"announcementProcess\") {\n if (item === \"Güncel\") return \"#00D095\";\n else if (item === \"Beklemede\") return \"#FE550D\";\n else if (item === \"Geçmiş\") return \"#464646\";\n }\n if (name === \"preRegistrationStatus\") {\n if (item === \"0\") return \"#2563EB\";\n else if (item === \"1\") return \"#16A34A\";\n else if (item === \"2\") return \"#DC2626\";\n else if (item === \"3\") return \"#DC2626\";\n else if (item === \"4\") return \"#16A34A\";\n }\n if (name === \"registerButton\") {\n return item === \"true\" ? \"#16A34A\" : \"#2563EB\";\n }\n },\n clickNewItem() {\n this.$emit(\"clickNewItem\");\n },\n clickMultiSelectAction(clickItem) {\n this.$emit(\"clickMultiSelectAction\", this.listItemSelected, clickItem);\n },\n stringToCode(str, name, value, selfItem) {\n const func = new Function(\"item\", `return ${str}`);\n const item = { [name]: value };\n return func(item);\n },\n setupStickyColumns() {\n const table = document.querySelector(\"#v-data-table\");\n if (!table) return;\n\n const headerCells = table.querySelectorAll(\"thead th\");\n const rows = table.querySelectorAll(\"tbody tr\");\n\n // Önce tüm sticky stilleri temizle\n headerCells.forEach((cell) => {\n cell.style.position = \"\";\n cell.style.left = \"\";\n cell.style.zIndex = \"\";\n cell.style.backgroundColor = \"\";\n cell.style.boxShadow = \"\";\n });\n\n rows.forEach((row) => {\n const cells = row.querySelectorAll(\"td\");\n cells.forEach((cell) => {\n cell.style.position = \"\";\n cell.style.left = \"\";\n cell.style.zIndex = \"\";\n cell.style.backgroundColor = \"\";\n cell.style.boxShadow = \"\";\n });\n });\n\n // Sticky kolonları ayarla\n let leftOffset = 0;\n\n this.stickyColumns.forEach((columnValue, index) => {\n // Header hücresini bul\n const headerIndex = this.showHeaders.findIndex(\n (header) => header.value === columnValue\n );\n if (headerIndex === -1) return;\n\n const headerCell = headerCells[headerIndex];\n if (!headerCell) return;\n\n // Sticky stil uygula\n headerCell.style.position = \"sticky\";\n headerCell.style.left = leftOffset + \"px\";\n headerCell.style.zIndex = \"2\";\n headerCell.style.backgroundColor = \"white\";\n headerCell.style.boxShadow = \"2px 0 5px rgba(0,0,0,0.1)\";\n\n // Tüm satırlar için aynı işlemi yap\n rows.forEach((row) => {\n const cells = row.querySelectorAll(\"td\");\n if (cells.length > headerIndex) {\n const cell = cells[headerIndex];\n cell.style.position = \"sticky\";\n cell.style.left = leftOffset + \"px\";\n cell.style.zIndex = \"1\";\n cell.style.backgroundColor = \"white\";\n cell.style.boxShadow = \"2px 0 5px rgba(0,0,0,0.1)\";\n }\n });\n\n // Bir sonraki kolon için offset güncelle\n leftOffset += headerCell.offsetWidth;\n });\n },\n checkForHorizontalScroll() {\n const table = this.$refs.dataTable;\n if (table) {\n const wrapper = table.$el.querySelector(\".v-data-table__wrapper\");\n if (this.bottomScroll) {\n wrapper.classList.add(\"active\");\n }\n this.hasHorizontalScroll = wrapper.scrollWidth > wrapper.clientWidth;\n }\n },\n handleTopScroll(e) {\n const table = this.$refs.dataTable.$el.querySelector(\".v-data-table__wrapper\");\n table.scrollLeft = e.target.scrollLeft;\n },\n handleMainTableScroll(e) {\n const topScrollBar = this.$refs.topScrollBar;\n if (topScrollBar) {\n topScrollBar.scrollLeft = e.target.scrollLeft;\n }\n },\n setupScrollSync() {\n this.$nextTick(() => {\n const table = this.$refs.dataTable;\n if (table) {\n const wrapper = table.$el.querySelector(\".v-data-table__wrapper\");\n if (wrapper) {\n const topScrollBar = this.$refs.topScrollBar;\n if (topScrollBar) {\n // Clear existing content\n topScrollBar.innerHTML = \"\";\n // Create and append the spacer div with exact width\n const spacerDiv = document.createElement(\"div\");\n spacerDiv.style.width = `${wrapper.scrollWidth}px`;\n spacerDiv.style.height = \"1px\";\n spacerDiv.style.minWidth = `${wrapper.scrollWidth + 120}px`; // Add min-width to ensure full width\n topScrollBar.appendChild(spacerDiv);\n\n // Set the wrapper width to match the table\n topScrollBar.style.width = `${wrapper.clientWidth + 100}px`;\n }\n wrapper.addEventListener(\"scroll\", this.handleMainTableScroll);\n }\n }\n });\n },\n isScrollable() {\n return this.hasHorizontalScroll\n },\n convertAlternateValues(items, headers) {\n const tempItems = JSON.parse(JSON.stringify(items));\n headers.forEach(header => {\n if (header.alternateValues && header.alternateValues.length > 0) {\n tempItems.forEach(item => {\n if (item[header.value]) {\n // Excel için özel sembol dönüşümü yapılacaksa\n if (header.excelSymbols) {\n const values = item[header.value].split(',');\n const convertedValues = values.map(val => {\n const found = header.alternateValues.find(av => av.key === val.trim());\n if (found && header.excelSymbols[found.key]) {\n const symbol = header.excelSymbols[found.key];\n // Excel XML formatında stil tanımlaması\n return `<html><font size=\"10\" color=\"${symbol.color}\">${symbol.char}</font></html>`;\n }\n return found ? found.value : val.trim();\n });\n item[header.value] = convertedValues.join(' ');\n } else {\n // Normal metin dönüşümü\n const values = item[header.value].split(',');\n const convertedValues = values.map(val => {\n const found = header.alternateValues.find(av => av.key === val.trim());\n return found ? found.value : val.trim();\n });\n item[header.value] = convertedValues.join(', ');\n }\n }\n });\n }\n });\n return tempItems;\n },\n\n convertTableValues(items, headers) {\n headers.forEach(header => {\n if (header.alternateValues && header.alternateValues.length > 0) {\n items.forEach(item => {\n // Risk dereceleri ve diğer tekil değerler için\n if (item[header.value] && !item[header.value].includes(',')) {\n const found = header.alternateValues.find(av => av.key === item[header.value]);\n if (found) {\n item[header.value] = found.value;\n }\n }\n });\n }\n });\n },\n },\n computed: {\n changedDate() {\n return (date) => {\n return this.formatDate(date);\n };\n },\n showHeaders() {\n return this.headers.filter((item) => this.copyHeaders.includes(item));\n },\n headerTemplates() {\n return this.headers.filter((x) => x.custom);\n },\n // visibleHeaders() {\n // return this.showHeaders.filter(header => !this.hiddenColumns.includes(header.value));\n // },\n // visibleColumns() {\n // return this.showHeaders.map(header => header.value).filter(column => !this.hiddenColumns.includes(column));\n // }\n\n },\n});\n\n\n//# sourceURL=webpack://@bilfenyazilimekibi/bilpack/./src/components/bf-table/index.vue?./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options");
735
735
 
736
736
  /***/ }),
737
737