{"version":3,"names":[],"mappings":"","sources":["core.js"],"sourcesContent":["document.documentElement.setAttribute(\"data-browser\", navigator.userAgent);\r\n\r\nconst tooltipOtions = {\r\n delay: {\r\n show: 1000,\r\n hide: 50\r\n },\r\n title: undefined,\r\n template: undefined,\r\n trigger: 'hover',\r\n boundary: 'window',\r\n selector: '[data-toggle=\"tooltip\"], [data-toggle-second=\"tooltip\"]',\r\n sanitize: true, //remove inline css,\r\n container: false,\r\n html: false\r\n}\r\n$(function () {\r\n $(tooltipOtions.selector).tooltip({\r\n delay: {\r\n show: tooltipOtions.delay.show,\r\n hide: tooltipOtions.delay.hide\r\n },\r\n boundary: tooltipOtions.boundary,\r\n trigger: tooltipOtions.trigger\r\n })\r\n})\r\n$(document).on('click', () => $('.tooltip.show').tooltip('hide'))\r\n\r\n////////////////////////////\r\n// D, T, Color Picker //\r\n////////////////////////////\r\n$(function () {\r\n pickers.init()\r\n $.datetimepicker.setLocale(__language)\r\n})\r\nvar pickers = {\r\n init: function (container) {\r\n let $c = null\r\n\r\n if (container != undefined && (container.hasClass('datepicker') || container.hasClass('timepicker') || container.hasClass('datetimepicker') || container.hasClass('kdr-color-picker'))) {\r\n $c = $(container).parent()\r\n }\r\n else if (container != undefined && container.length != 0) {\r\n $c = $(container)\r\n } else {\r\n $c = $('body')\r\n }\r\n\r\n $c.find('.datepicker, .timepicker, .datetimepicker, .kdr-color-picker').each(function () {\r\n pickers.initSingle.basedOnClass($(this))\r\n })\r\n },\r\n isInited($item) {\r\n return $item.data('isPickerInitiated') === true\r\n },\r\n initSingle: {\r\n basedOnClass($item) {\r\n if ($item.hasClass('datepicker')) this.datePicker($item);\r\n else if ($item.hasClass('timepicker')) this.timePicker($item)\r\n else if ($item.hasClass('datetimepicker')) this.datetimePicker($item)\r\n else if ($item.hasClass('kdr-color-picker')) this.colorPicker($item)\r\n },\r\n datePicker($item) {\r\n if (pickers.isInited($item)) { //not init more then one time\r\n return\r\n }\r\n\r\n let props = pickers.getDefaultProps($item)\r\n $item.data('oldValue', $item.val())\r\n\r\n function setMinMaxDate($ct, $i) {\r\n if ($i.hasClass('datepicker-from')) {\r\n let $dtp = $i.closest('.datepicker-from-to').find('.datepicker-to')\r\n $dtp.datetimepicker('setOptions', { minDate: $ct })\r\n $dtp.blur()\r\n }\r\n else if ($i.hasClass('datepicker-to')) {\r\n let $dtf = $i.closest('.datepicker-from-to').find('.datepicker-from')\r\n\r\n $dtf.datetimepicker('setOptions', { maxDate: $ct })\r\n $dtf.blur()\r\n }\r\n\r\n }\r\n\r\n $item.datetimepicker({\r\n timepicker: false,\r\n format: props.dateFormat,\r\n formatDate: props.dateFormat,\r\n weeks: true,\r\n mask: true,\r\n validateOnBlur: true,\r\n fixed: false,\r\n lazyInit: props.IsLazyLoading,\r\n parentID: props.Parent,\r\n className: props.Classes,\r\n isPermanentAtInit: props.IsPermanent,\r\n permanentButton: props.IsAllowPermanent,\r\n permanentButtonTarget: $item,\r\n permanentButtonText: props.PermanentButtonText,\r\n\r\n isFromBeginningButton: props.IsAllowFromBeginning,\r\n isFromBeginningAtInit: props.IsFromBeginning,\r\n fromBeginningButtonTarget: $item,\r\n fromBeginningButtonText: props.BeginningButtonText,\r\n\r\n minDate: props.minDate,\r\n maxDate: props.maxDate,\r\n onChangeDateTime: function ($ct, $i) {\r\n\r\n $i.trigger({\r\n type: 'kdr',\r\n namespace: 'checkedValueCorrectness',\r\n hasInvalidValue: undefined,\r\n newValue: $ct\r\n })\r\n },\r\n onSelectDate: function ($ct, $i) {\r\n setMinMaxDate($ct, $i)\r\n\r\n $i.trigger({\r\n type: 'kdr',\r\n namespace: 'checkedValueCorrectness',\r\n hasInvalidValue: undefined,\r\n newValue: $ct\r\n })\r\n },\r\n onSelectPermanentDate: function ($ct, $i) {\r\n setMinMaxDate($ct, $i)\r\n\r\n $i.trigger({\r\n type: 'kdr',\r\n namespace: 'checkedValueCorrectness',\r\n hasInvalidValue: undefined,\r\n newValue: $ct\r\n })\r\n },\r\n onAfterInit: function () {\r\n if (props.IsPermanent || props.IsFromBeginning) {\r\n $item.val(null)\r\n }\r\n },\r\n })\r\n $item.data('isPickerInitiated', true)\r\n },\r\n timePicker($item) {\r\n\r\n if (pickers.isInited($item)) { //not init more then one time\r\n return\r\n }\r\n\r\n\r\n let props = pickers.getDefaultProps($item)\r\n $item.data('oldValue', $item.val())\r\n\r\n $item.datetimepicker({\r\n datepicker: false,\r\n format: props.timeFormat,\r\n formatTime: props.timeFormat,\r\n mask: true,\r\n fixed: false,\r\n validateOnBlur: true,\r\n lazyInit: props.IsLazyLoading,\r\n parentID: props.Parent,\r\n className: props.Classes,\r\n isPermanentAtInit: props.IsPermanent,\r\n permanentButton: props.IsAllowPermanent,\r\n permanentButtonTarget: $item,\r\n permanentButtonText: props.PermanentButtonText,\r\n onAfterInit: function () {\r\n if (props.IsPermanent) {\r\n $item.val(null)\r\n }\r\n }\r\n })\r\n\r\n $item.data('isPickerInitiated', true)\r\n },\r\n datetimePicker($item) {\r\n\r\n if (pickers.isInited($item)) { //not init more then one time\r\n return\r\n }\r\n\r\n let props = pickers.getDefaultProps($item)\r\n $item.data('oldValue', $item.val())\r\n\r\n $item.datetimepicker({\r\n format: props.dateFormat + ' ' + props.timeFormat,\r\n formatDate: props.dateFormat,\r\n formatTime: props.timeFormat,\r\n weeks: true,\r\n mask: true,\r\n validateOnBlur: true,\r\n lazyInit: props.IsLazyLoading,\r\n parentID: props.Parent,\r\n className: props.Classes,\r\n\r\n fixed: false,\r\n\r\n isPermanentAtInit: props.IsPermanent,\r\n permanentButton: props.IsAllowPermanent,\r\n permanentButtonTarget: $item,\r\n permanentButtonText: props.PermanentButtonText,\r\n\r\n isFromBeginningButton: props.IsAllowFromBeginning,\r\n isFromBeginningAtInit: props.IsFromBeginning,\r\n fromBeginningButtonTarget: $item,\r\n fromBeginningButtonText: props.BeginningButtonText,\r\n\r\n onAfterInit: function () {\r\n if (props.IsPermanent) {\r\n $item.val(null)\r\n }\r\n }\r\n })\r\n\r\n $item.data('isPickerInitiated', true)\r\n },\r\n colorPicker($item) {\r\n pickers.color.init($item)\r\n }\r\n },\r\n show: function (pickerInput) {\r\n $(pickerInput).focus()\r\n },\r\n /**\r\n * Returns default properties for datetimepicker init\r\n * @param {any} input \r\n */\r\n getDefaultProps: function (input) {\r\n let $i = $(input)\r\n\r\n\r\n let isAPer = $i.hasClass('allow-date-permanent')\r\n let isPer = $i.hasClass('is-permanent')\r\n\r\n let isABeg = $i.hasClass('allow-date-beginning')\r\n let isBeg = $i.hasClass('is-from-beginning')\r\n\r\n let isPermanentDate = $i.closest('.datepicker-from-to').length > 0\r\n\r\n let minDate = textHelper.isNullOrEmpty($i.data('min-date')) ? false : $i.data('min-date')\r\n let maxDate = textHelper.isNullOrEmpty($i.data('max-date')) ? false : $i.data('max-date')\r\n\r\n function notOverflowHiddenParent($item) {\r\n let $x;\r\n let $p = $item.parent()\r\n if ($p.css('overflow') != 'hidden') {\r\n $x = notOverflowHiddenParent($p)\r\n } else {\r\n $x = $p\r\n }\r\n return $x;\r\n }\r\n\r\n let $parent;\r\n if ($i.closest('.kdr-grid-scroll-horizontal').length != 0) {\r\n $parent = $i.closest('.kdr-grid')\r\n } else if ($i.closest('.modal-content').length != 0) {\r\n $parent = $i.closest('.modal-content')\r\n } else {\r\n $parent = $('body')\r\n }\r\n return {\r\n Parent: $parent,//notOverflowHiddenParent($i),//\r\n IsAllowPermanent: isAPer,\r\n IsPermanent: isPer,\r\n IsAllowFromBeginning: isABeg,\r\n IsFromBeginning: isBeg,\r\n IsLazyLoading: !((isAPer && isPer) || (isBeg && isABeg) || isPermanentDate),\r\n PermanentButtonText: $i.data('permanentButtonText'),\r\n BeginningButtonText: $i.data('beginningButtonText'),\r\n Classes: 'dtp',\r\n dateFormat: __dateFormat,\r\n timeFormat: $i.hasClass('time-hm') ? __timeHMFormat : __timeFormat,\r\n minDate: minDate,\r\n maxDate: maxDate\r\n }\r\n },\r\n color: {\r\n getValueInput($elementInsidePicker) {\r\n let $valueInput\r\n let isPickerBox = $elementInsidePicker.hasClass('kdr-color-picker-box')\r\n let isInPickerBox = $elementInsidePicker.closest('.kdr-color-picker-box').length > 0\r\n\r\n if (isPickerBox || isInPickerBox) {\r\n if (isInPickerBox) {\r\n $elementInsidePicker = $elementInsidePicker.closest('.kdr-color-picker-box')\r\n }\r\n\r\n let controlId = $elementInsidePicker.data('for')\r\n $valueInput = $('.kdr-color-picker[data-id=\"' + controlId + '\"]').find('.kdr-color-picker-value')\r\n } else {\r\n $valueInput = $elementInsidePicker.closest('.kdr-color-picker').find('.kdr-color-picker-value')\r\n }\r\n\r\n return $valueInput\r\n },\r\n setColor($valueInput, hexColor) {\r\n $valueInput.css({\r\n 'background-color': hexColor,\r\n 'color': hexColor\r\n }).val(hexColor)\r\n },\r\n getSelectBox($elementInsidePicker) {\r\n let $box\r\n let isPickerBox = $elementInsidePicker.hasClass('kdr-color-picker-box')\r\n let isInPickerBox = $elementInsidePicker.closest('.kdr-color-picker-box').length > 0\r\n let isInPicker = $elementInsidePicker.closest('.kdr-color-picker')\r\n\r\n if (isPickerBox) {\r\n $box = $elementInsidePicker\r\n }\r\n else if (isInPickerBox) {\r\n $box = $elementInsidePicker.closest('.kdr-color-picker-box')\r\n }\r\n else if (isInPicker) {\r\n let controlId = pickers.color.getControl($elementInsidePicker).data('id')\r\n $box = $('.kdr-color-picker-box[data-for=\"' + controlId + '\"]')\r\n }\r\n\r\n return $box\r\n },\r\n getControl($elementInsidePicker) {\r\n return $elementInsidePicker.closest('.kdr-color-picker')\r\n },\r\n init($control) {\r\n if ($control.attr('disabled') == 'disabled') {\r\n return\r\n }\r\n\r\n let newId = uid.getNew()\r\n let $box = $control.find('.kdr-color-picker-box')\r\n $control.attr('data-id', newId)\r\n\r\n let $modal = $control.closest('.modal')\r\n if ($modal.length > 0) {\r\n let modalZIndex = $modal.css('z-index')\r\n let targetZIndex = modalZIndex + 10\r\n $box.css({ 'z-index': targetZIndex })\r\n }\r\n $box.attr('data-for', newId)\r\n },\r\n toggleBoxVisibility($toggler) {\r\n if (pickers.color.getControl($toggler).attr('disabled') == 'disabled') {\r\n return\r\n }\r\n let $selectBox = pickers.color.getSelectBox($toggler)\r\n\r\n if ($selectBox.is(':visible')) {\r\n $selectBox.slideUp(125)\r\n } else {\r\n $selectBox.slideDown(125)\r\n\r\n $(document).one('mousedown', function () {\r\n pickers.color.toggleBoxVisibility($selectBox)\r\n })\r\n }\r\n },\r\n getHEXColorFromCell($cell) {\r\n let rgbColor = $cell.css('background-color')\r\n return convert.bgRgbToHex(rgbColor)\r\n },\r\n }\r\n\r\n}\r\n\r\n$(document).on('click', '.show-picker', function () {\r\n let $picker = $(this).closest('.input-group').find('[class~=\"datepicker\"], [class~=\"timepicker\"], [class~=\"datetimepicker\"]')\r\n pickers.show($picker)\r\n})\r\n$(document).on('mouseup', '.dtp.hide-days .xdsoft_today_button', function () {\r\n $(this).dblclick()\r\n})\r\n\r\n$(document).on('click', '.kdr-color-picker-toggle', function () {\r\n pickers.color.toggleBoxVisibility($(this))\r\n})\r\n\r\n$(document).on('click mousedown', '.kdr-color-picker-cell', function () {\r\n let $cell = $(this)\r\n let $valueInput = pickers.color.getValueInput($cell)\r\n let hexColor = pickers.color.getHEXColorFromCell($cell)\r\n\r\n pickers.color.setColor($valueInput, hexColor)\r\n})\r\n\r\n$(document).on('paste keypress keyup blur', '.kdr-color-picker-value', function (e) {\r\n //validacja kiedys byc moze \r\n //const regex = /^#(([a-fA-F]){0,6}|(\\d{0,6}+))$/;\r\n const regex = /^#(([\\da-fA-F]{3}){1,2}|([\\da-fA-F]{4}){1,2})$/;\r\n let $input = $(this)\r\n let val = $input.val()\r\n\r\n if (regex.test(val)) {\r\n let hexColor = convert.bgRgbToHex(val)\r\n let $valInput = pickers.color.getValueInput($input)\r\n\r\n pickers.color.setColor($valInput, hexColor)\r\n }\r\n})\r\n\r\n///////////////////////////////////////////\r\n// JQ EXTEND //\r\n///////////////////////////////////////////\r\n\r\nconst convert = {\r\n componentToHex(c) {\r\n var hex = c.toString(16);\r\n return hex.length == 1 ? \"0\" + hex : hex\r\n },\r\n rgbToHex(r, g, b) {\r\n return \"#\" + componentToHex(r) + componentToHex(g) + componentToHex(b)\r\n },\r\n hexToRgb(hex) {\r\n var result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\r\n return result ? {\r\n r: parseInt(result[1], 16),\r\n g: parseInt(result[2], 16),\r\n b: parseInt(result[3], 16)\r\n } : null;\r\n },\r\n hexToRgbString(hex) {\r\n let r = convert.hexToRgb(hex)\r\n return `rgb(${r.r},${r.g},${r.b})`\r\n },\r\n bgRgbToHex(fullRgb) {\r\n var rgb = fullRgb.replace(/\\s/g, '').match(/^rgba?\\((\\d+),(\\d+),(\\d+)/i)\r\n return (rgb && rgb.length === 4) ? \"#\" +\r\n (\"0\" + parseInt(rgb[1], 10).toString(16)).slice(-2) +\r\n (\"0\" + parseInt(rgb[2], 10).toString(16)).slice(-2) +\r\n (\"0\" + parseInt(rgb[3], 10).toString(16)).slice(-2) : fullRgb;\r\n },\r\n bytesToUserReadableString(bytes) {\r\n if (bytes >= (1024 ** 3)) {\r\n return (bytes / (1024 ** 3)).toFixed(2) + \" GiB\";\r\n } else if (bytes >= (1024 ** 2)) {\r\n return (bytes / (1024 ** 2)).toFixed(2) + \" MiB\";\r\n } else if (bytes >= 1024) {\r\n return (bytes / 1024).toFixed(2) + \" KiB\";\r\n } else {\r\n return bytes + \" B\";\r\n }\r\n },\r\n stringToBoolean(c) {\r\n switch (c?.toString().toLowerCase()?.trim()) {\r\n case \"true\":\r\n case \"yes\":\r\n case \"1\":\r\n return true;\r\n\r\n case \"false\":\r\n case \"no\":\r\n case \"0\":\r\n case null:\r\n case undefined:\r\n return false;\r\n\r\n default:\r\n try {\r\n return JSON.parse(c)\r\n } catch {\r\n return c.length > 0\r\n }\r\n }\r\n },\r\n toJqueryObject(o) {\r\n return o instanceof $ ? o : $(o)\r\n }\r\n}\r\n\r\nconst checkColor = {\r\n luma(rgb) {\r\n switch ((rgb || \"\").replace(/\\s+/g, '').toLowerCase()) {\r\n case \"transparent\":\r\n case \"\":\r\n case \"rgba(0,0,0,0)\":\r\n return 0;\r\n default: {\r\n let match = /\\((\\d+).*?(\\d+).*?(\\d+)\\)/.exec(rgb)\r\n var r = parseInt(match[1], 10)\r\n var g = parseInt(match[2], 10)\r\n var b = parseInt(match[3], 10)\r\n\r\n var luma = 0.2126 * r + 0.7152 * g + 0.0722 * b; // Rec. 709\r\n\r\n return luma\r\n }\r\n }\r\n },\r\n isDark(rgb) {\r\n return checkColor.luma(rgb) < 128\r\n },\r\n isBlack(rgb) {\r\n return checkColor.luma(rgb) < 40\r\n },\r\n name(hexColor) {\r\n //https://stackoverflow.com/questions/64137102/how-would-u-be-able-to-tell-if-a-color-is-red-or-blue-tinted-javascript\r\n const clrLkp = [[\"red\", 0], [\"vermilion\", 15], [\"brown\", 20], [\"orange\", 30], [\"safran\", 45], [\"yellow\", 60], [\"light green yellow\", 75], [\"green yellow\", 90], [\"limett\", 105], [\"dark green\", 120], [\"green\", 120], [\"light blue-green\", 135], [\"blue green\", 150], [\"green cyan\", 165], [\"cyan\", 180], [\"blaucyan\", 195], [\"green blue\", 210], [\"light green blue\", 225], [\"blue\", 240], [\"indigo\", 255], [\"violet\", 270], [\"blue magenta\", 285], [\"magenta\", 300], [\"red magenta\", 315], [\"blue red\", 330], [\"light blue red\", 345]].reverse()\r\n\r\n function _rgb2hsv(r, g, b) {\r\n let v = Math.max(r, g, b), n = v - Math.min(r, g, b);\r\n let h = n && ((v == r) ? (g - b) / n : ((v == g) ? 2 + (b - r) / n : 4 + (r - g) / n));\r\n return [60 * (h < 0 ? h + 6 : h), v && n / v, v];\r\n }\r\n\r\n const _hex2rgb = hex => {\r\n const parts = hex.slice(1).match(/../g);\r\n if (!parts || parts.length < 3) throw new Error('Invalid hex value');\r\n const dec = parts.map(p => parseInt(p, 16));\r\n return dec;\r\n }\r\n\r\n const _hsv2name = (h, s, v) => clrLkp.find(([clr, val]) => h >= val)[0];\r\n const _hex2name = hex => [_hex2rgb, _rgb2hsv, _hsv2name].reduce((a, v) => v(...[a].flat()), hex);\r\n\r\n function _isGray(hex) {\r\n let h = hex.slice(1)\r\n let g = h.length == 3 ? h : h.match(/.{1,2}/g)\r\n return (g[0] == g[1] && g[1] == g[2])\r\n }\r\n\r\n return checkColor.isBlack(convert.hexToRgbString(hexColor)) ? 'black' :\r\n _isGray(hexColor) ? \"gray\" :\r\n _hex2name(hexColor)\r\n }\r\n}\r\n\r\nconst compare = {\r\n /* \r\n * True => Takie same\r\n * False => Sa rozne\r\n */\r\n arraysAreEqual(a0, a1) {\r\n //if (($.isArray(a0) && $.isArray(a1)) == false) {\r\n // throw \"compare.arraysAreEqual You need to pass two arrays!\"\r\n //}\r\n\r\n if (a0.length != a1.length) {\r\n return false\r\n } else {\r\n let diffrentItems = $(a0).not(a1).get().length + $(a1).not(a0).get().length\r\n return diffrentItems == 0\r\n }\r\n }\r\n}\r\n\r\n\r\n\r\n/** EXPERIMENTAL\r\n * Get/Set value from inputs, extended for \r\n * datetimepicker with permanent property,\r\n * dropdownlist w[/o] multiselect\r\n * tristate checkboxes. */\r\n$.fn.valExtended = function (value, fireEventsP = false, selectMDDLItemsAsyncP = true) {\r\n let $t = this\r\n let elementToReturn = null\r\n const datePermanent = '9999-01-01'\r\n let hasInvalidValue = false\r\n\r\n /** Set value */\r\n if (value != undefined) {\r\n if ($t.hasClass('kdr-dropdown-w-search-item_selected')) {\r\n let $items = []\r\n let $dropdownMenu = $t.data('bs.dropdown')?._menu ?? document.getElementById($t.attr('data-target'))\r\n if (!($dropdownMenu instanceof jQuery)) {\r\n $dropdownMenu = $($dropdownMenu)\r\n }\r\n if (value === '' || value == null) {\r\n //wylaczanie wszystkich wybraych elementow\r\n let values = $t.data('value')\r\n\r\n if (values.length > 0) {\r\n for (var i = 0; i < values.length; i++) {\r\n $items.push($dropdownMenu.find('.kdr-dropdown-w-search-item[data-value=\"' + values[i] + '\"]'))\r\n }\r\n }\r\n }\r\n else if (Array.isArray(value)) {\r\n for (var i = 0; i < value.length; i++) {\r\n $items.push($dropdownMenu.find('.kdr-dropdown-w-search-item[data-value=\"' + value[i] + '\"]'))\r\n }\r\n }\r\n else if (value instanceof jQuery && value.hasClass('kdr-dropdown-w-search-item')) {\r\n $items = value\r\n }\r\n else {\r\n $items = $dropdownMenu.find('.kdr-dropdown-w-search-item[data-value=\"' + value + '\"]')\r\n }\r\n kdrDropdown.selectItems($t, $items, fireEventsP, selectMDDLItemsAsyncP, () => {\r\n $t.trigger({\r\n type: disabler.events.disabler\r\n })\r\n })\r\n }\r\n else if ($t.attr(\"type\") == \"checkbox\") { //fixme pomyslec jak uwspolnic z tristateCheckbox.changeState($cb)\r\n let v = convert.stringToBoolean(value)\r\n $t.prop('checked', v)\r\n\r\n if (fireEventsP) {\r\n $t.trigger('change')\r\n }\r\n }\r\n else if ($t.attr(\"type\") == \"radio\") {\r\n let v = $t.attr(\"value\") == value\r\n $t.prop('checked', v).change()\r\n }\r\n else if ($t.hasClass('datepicker') || $t.hasClass('allow-date-permanent')) {\r\n\r\n if ($t.hasClass('allow-date-permanent') && (value == datePermanent || value == $t.data('permanentButtonText'))) {\r\n $t.data('isPermanent', true)\r\n .attr('placeholder', $t.data('permanentButtonText'))\r\n .val('')\r\n value = ''\r\n }\r\n else {\r\n $t.data('isPermanent', false)\r\n .removeClass('is-permanent')\r\n .attr('placeholder', null)\r\n let v, m;\r\n const based = /(\\d{4})-(\\d{1,2})-(\\d{1,2})/\r\n const pol = /(\\d{1,2})\\.(\\d{1,2})\\.(\\d{4})/\r\n const murica = /(\\d{1,2})\\/(\\d{1,2})\\/(\\d{4})/\r\n\r\n if ((m = based.exec(value)) !== null) {\r\n v = m[0]\r\n }\r\n else if ((m = pol.exec(value)) !== null) {\r\n v = `${m[3]}-${m[2]}-${m[1]}`\r\n }\r\n else if ((m = murica.exec(value)) !== null) {\r\n v = `${m[3]}-${m[1]}-${m[2]}`\r\n } else {\r\n hasInvalidValue = true\r\n v = value\r\n }\r\n\r\n $t.val(v)\r\n value = v\r\n }\r\n }\r\n else if ($t.hasClass('kdr-language')) {\r\n let langCode = $t.closest('[data-language]').data('language')\r\n $t.val(value[langCode])\r\n }\r\n else if ($t.hasClass('kdr-ddl-custom')) {\r\n selectableDropdown.selectValuesWPurge($t, value)\r\n }\r\n else if ($t.hasClass('kdr-grid-input-tinymc-wrapper')) {\r\n setTimeout(() => { tinyMCE.get($t.prop('id')).setContent(value) }, \"1000\");\r\n }\r\n else if ($t.hasClass('kdr-color-picker-value')) {\r\n pickers.color.setColor($t, value)\r\n }\r\n else if ($t.hasClass('html-editor') && $t.hasClass('mce-content-body')) {\r\n tinymce.get($t.prop('id')).setContent(value)\r\n }\r\n else {\r\n $t.val(value)\r\n }\r\n\r\n\r\n $t.data('valueIsInvalid', hasInvalidValue)\r\n .trigger({\r\n type: 'kdr',\r\n namespace: 'checkedValueCorrectness',\r\n hasInvalidValue: hasInvalidValue,\r\n newValue: value\r\n })\r\n\r\n\r\n if (!$t.hasClass('kdr-dropdown-w-search-item_selected')) {\r\n $t.trigger({\r\n type: disabler.events.disabler\r\n })\r\n }\r\n\r\n elementToReturn = $t\r\n }\r\n /** Get value */\r\n else {\r\n if ($t.hasClass('allow-date-permanent') && $t.data('isPermanent') === true) {\r\n elementToReturn = datePermanent\r\n }\r\n else if ($t.hasClass('allow-date-beginning') && $t.data('isFromBeginning') === true) {\r\n elementToReturn = '1900-01-01'\r\n }\r\n else if ($t.hasClass('datepicker') && $t.val().includes(\"_\")) {\r\n return null;\r\n }\r\n else if ($t.hasClass('kdr-dropdown-w-search-item_selected')) {\r\n elementToReturn = $t.data('value')\r\n }\r\n else if ($t.attr(\"type\") == \"checkbox\") {\r\n if ($t.prop('indeterminate')) {\r\n elementToReturn = 'indeterminate'\r\n } else {\r\n elementToReturn = $t.prop('checked')\r\n }\r\n }\r\n else if ($t.hasClass('kdr-grid-files')) {\r\n elementToReturn = $t.find('.grid-file-input').data('selectedFiles')\r\n }\r\n else if ($t.hasClass('kdr-ddl-custom')) {\r\n elementToReturn = selectableDropdown.getSelectedValues($t)\r\n }\r\n else if ($t.hasClass('kdr-frax-single-select')) {\r\n //elementToReturn = $t.jstree(\"get_selected\")[0]\r\n elementToReturn = $t.jstree(\"get_selected_node\").find('.jstree-clicked').data('value') ?? $t.jstree(\"get_selected\")[0]\r\n }\r\n else if ($t.hasClass('radio-buttons-wrapper')) {\r\n let $radio = $t.find('.kdr-custom-radio:checked')\r\n elementToReturn = $radio.length == 1 ? parseInt($radio.val(), 10) : ''\r\n }\r\n else if ($t.hasClass('kdr-frax-multi-select')) {\r\n elementToReturn = $t.jstree(\"get_checked\")\r\n }\r\n else if ($t.hasClass('kdr-frax-dropdown-button')) {\r\n let dropdownId = $t.data('target')\r\n let $tree = $('#' + dropdownId).find('.kdr-frax--tree')\r\n\r\n elementToReturn = $tree.valExtended()\r\n }\r\n else if ($t.hasClass('kdr-frax-folder')) {\r\n elementToReturn = fraxFolder.getSelectedNodeValue($t)\r\n }\r\n else if ($t.hasClass('html-editor') && $t.hasClass('mce-content-body')) {\r\n elementToReturn = tinymce.get($t.prop('id')).getContent()\r\n }\r\n else if ($t != undefined && $t.val() != null && $t.val() != undefined && $t.val() != null) {\r\n elementToReturn = $t.val().trim()\r\n }\r\n }\r\n\r\n return elementToReturn\r\n}\r\n$.fn.checkNumericInputValueCorrectnes = function (value) {\r\n let $this = this\r\n\r\n let regex;\r\n\r\n let groupSeparator = $this.data('groupSeparator')\r\n if (groupSeparator == ' ') {\r\n groupSeparator = ' '\r\n\r\n }\r\n if ($this.data('numericType') == 'decimal') {\r\n let decimalSeparator = $this.data('decimalSeparator')\r\n regex = new RegExp(`^-?\\\\d*[${decimalSeparator}]?\\\\d*$`)\r\n\r\n } else {\r\n regex = /^-?[0-9]*$/\r\n }\r\n\r\n return regex.test(value);\r\n}\r\n$.fn.inputFilter = function (inputFilter) {\r\n return this.on(\"input keydown keyup blur drop paste\", function (e) {\r\n if (inputFilter(this.value)) {\r\n this.oldValue = this.value;\r\n this.oldSelectionStart = this.selectionStart;\r\n this.oldSelectionEnd = this.selectionEnd;\r\n } else if (this.hasOwnProperty(\"oldValue\")) {\r\n this.value = this.oldValue;\r\n this.setSelectionRange(this.oldSelectionStart, this.oldSelectionEnd);\r\n } else {\r\n this.value = \"\";\r\n }\r\n });\r\n}\r\n$.fn.getPositionInViewport = function () {\r\n let $this = $(this)\r\n if ($this.length > 0) {\r\n\r\n let elementTop = $this.offset().top\r\n let elementBottom = elementTop + $this.outerHeight()\r\n let elementLeft = $this.offset().left\r\n let elementRight = elementLeft + $this.outerWidth()\r\n\r\n return {\r\n top: elementTop,\r\n bottom: elementBottom,\r\n left: elementLeft,\r\n right: elementRight\r\n }\r\n } else {\r\n return {\r\n top: undefined,\r\n bottom: undefined,\r\n left: undefined,\r\n right: undefined\r\n }\r\n }\r\n}\r\n$.fn.isInViewport = function () {\r\n let thisPosition = $(this).getPositionInViewport()\r\n let viewportPosition = getViewportPosition()\r\n\r\n return {\r\n top: thisPosition.top > viewportPosition.top,\r\n bottom: thisPosition.bottom < viewportPosition.bottom,\r\n left: thisPosition.left > viewportPosition.left,\r\n right: thisPosition.right < viewportPosition.right\r\n }\r\n}\r\n$.fn.appendToWithIndex = function (to, index) {\r\n if (!to instanceof jQuery) {\r\n to = $(to);\r\n };\r\n if (index === 0) {\r\n this.prependTo(to)\r\n } else {\r\n this.insertAfter(to.children().eq(index - 1));\r\n }\r\n}\r\n$.fn.existOnDOMP = function () {\r\n return $(this).prop('isConnected') ?? false\r\n}\r\n$.fn.reverse = [].reverse\r\n\r\n$.fn.getScrollBarWidth = function () {\r\n let width = $(this).prop('offsetWidth') - $(this).prop('clientWidth')\r\n return 1 == width ? 0 : width\r\n}\r\nfunction getViewportPosition() {\r\n let $window = $(window)\r\n let viewportTop = $window.scrollTop()\r\n let viewportBottom = viewportTop + $window.height();\r\n let viewportLeft = $window.scrollLeft()\r\n let viewportRight = viewportLeft + + $window.width()\r\n\r\n return {\r\n top: viewportTop,\r\n bottom: viewportBottom,\r\n left: viewportLeft,\r\n right: viewportRight,\r\n }\r\n}\r\nfunction isNullOrUndefined(element) { return (element == undefined || element == null) }\r\nconst textHelper = {\r\n copyTextToClipboard(text) {\r\n text = text.trim()\r\n\r\n\r\n if (navigator.clipboard && window.isSecureContext) {\r\n return navigator.clipboard.writeText(text);\r\n } else {\r\n let $input = $(\"\").css('opacity', 0);\r\n $input.val(text);\r\n $('body').append($input);\r\n $input.focus().select();\r\n\r\n return new Promise((res, rej) => {\r\n document.execCommand('copy') ? res() : rej();\r\n $input.remove();\r\n });\r\n }\r\n },\r\n copyHtmlToClipboard(text) {\r\n const originalText = text.replace(/<[^>]*>/g, '');\r\n const boldText = text;\r\n const blobHtml = new Blob([boldText], { type: \"text/html\" });\r\n const blobText = new Blob([originalText], { type: \"text/plain\" });\r\n const data = [new ClipboardItem({\r\n [\"text/plain\"]: blobText,\r\n [\"text/html\"]: blobHtml,\r\n })];\r\n\r\n return new Promise((res, rej) => {\r\n navigator.clipboard.write(data) ? res() : rej();\r\n });\r\n\r\n },\r\n format(text, ...args) {\r\n if (text == undefined || text.length == 0 || args.length == 0) {\r\n return text\r\n }\r\n var s = text,\r\n i = args.length;\r\n\r\n while (i--) {\r\n s = s.replace(new RegExp('\\\\{' + i + '\\\\}', 'gm'), args[i]);\r\n }\r\n return s;\r\n },\r\n isNullOrEmpty(text) {\r\n let t = text;\r\n\r\n if (typeof (t) == 'string') {\r\n t = t.trim()\r\n }\r\n\r\n switch (t) {\r\n case \"\":\r\n case \"0\":\r\n case null:\r\n case false:\r\n case undefined:\r\n case typeof this === 'undefined':\r\n return true;\r\n case 0:\r\n default: return false;\r\n }\r\n },\r\n escapeCharacters(text) {\r\n return text?.replace(/([ #;&,.+*~\\':\"!^$[\\]()=>|\\/@])/g, '\\\\$1') ?? undefined\r\n },\r\n countCharactersAndDisplay($input) {\r\n let $charCounter = $input.data('charCounter')\r\n let $charCounterValue = $input.data('charCounterValue')\r\n let maxLength = $input.data('charCounterMax')\r\n\r\n if ($charCounter == undefined || $charCounter.length == 0) {\r\n $charCounter = $input.closest('td').find('.char-counter')\r\n $charCounterValue = $charCounter.find('.char-counter-current-value')\r\n\r\n $input.data('charCounter', $charCounter)\r\n $input.data('charCounterValue', $charCounterValue)\r\n\r\n if ($charCounter.data('max') != undefined) {\r\n maxLength = $charCounter.data('max')\r\n $input.data('charCounterMax', maxLength)\r\n }\r\n }\r\n\r\n let valueLength = $input.val().trim().length\r\n $charCounterValue.text(valueLength)\r\n\r\n if (maxLength != undefined && maxLength != '') {\r\n if (valueLength > maxLength) {\r\n $charCounter.addClass('text-danger')\r\n } else {\r\n $charCounter.removeClass('text-danger')\r\n }\r\n }\r\n }\r\n}\r\nconst tooltipHelper = {\r\n init($container, options = tooltipOtions) {\r\n return tooltipHelper.initOnItem($container.find(options.selector ?? tooltipOtions.selector))\r\n },\r\n initOnItem($item, options = tooltipOtions) {\r\n let opt = {\r\n delay: {\r\n show: options.delay?.show ?? tooltipOtions.delay.show,\r\n hide: options.delay?.hide ?? tooltipOtions.delay.hide\r\n },\r\n container: options.container ?? tooltipOtions.container,\r\n sanitize: options.sanitize ?? tooltipOtions.sanitize,\r\n boundary: options.boundary ?? tooltipOtions.boundary,\r\n trigger: options.trigger ?? tooltipOtions.trigger,\r\n html: options.html ?? tooltipOtions.html\r\n };\r\n if (options.template != undefined) opt['template'] = options.template\r\n if (options.title != undefined) opt['title'] = options.title\r\n\r\n\r\n $item.tooltip(opt)\r\n return $item\r\n },\r\n removeFromItem($item) {\r\n $item.tooltip('dispose')\r\n return $item\r\n }\r\n}\r\nconst arrayHelper = {\r\n /**\r\n * Remove duplicates from array.\r\n * @param {any} arr Array from wher should remove duplicates.\r\n * @returns new array without duplicates\r\n */\r\n unique(arr) {\r\n var r = []\r\n $.each(arr, (i, e) => {\r\n if ($.inArray(e, r) == -1) r.push(e)\r\n })\r\n return r\r\n },\r\n /**\r\n * Sorting array ascending and returns new set.\r\n * @param {any} arr Array to sort\r\n * @param {any} asc DEFAULT true, if TRUE then it's sorting ascending, if FALSE then descending\r\n * @returns new sorted array\r\n */\r\n sortNumbers(arr, asc = true) {\r\n let r = arr\r\n return r.sort((a, b) => asc ? a - b : a + b)\r\n },\r\n /**\r\n *\r\n * @param {array} array\r\n * @param {any} keyOrIterator\r\n * @returns {array}\r\n */\r\n groupBy(array, keyOrIterator) {\r\n var iterator, key;\r\n\r\n // use the function passed in, or create one\r\n if (typeof keyOrIterator !== 'function') {\r\n key = String(keyOrIterator);\r\n iterator = function (item) { return item[key]; };\r\n } else {\r\n iterator = keyOrIterator;\r\n }\r\n\r\n return array.reduce(function (memo, item) {\r\n var key = iterator(item);\r\n memo[key] = memo[key] || [];\r\n memo[key].push(item);\r\n return memo;\r\n }, {});\r\n }\r\n}\r\nconst imageHelper = {\r\n setImageOnInputChangedSelected(event, $input, callback) {\r\n let $targetDiv = $($input.data('target'))\r\n var selectedFile = event.target.files[0];\r\n\r\n if (selectedFile != undefined && selectedFile.type.includes('image') === true) {\r\n $targetDiv[0].title = selectedFile.name;\r\n\r\n var reader = new FileReader();\r\n reader.onload = function (event) {\r\n $targetDiv[0].src = event.target.result;\r\n loading.hide($targetDiv)\r\n\r\n callback && callback($targetDiv)\r\n };\r\n loading.show($targetDiv)\r\n reader.readAsDataURL(selectedFile);\r\n }\r\n }\r\n\r\n}\r\nconst fileDownloadHelper = {\r\n download(link, beforeSend, callback, previewP) {\r\n\r\n var request = new XMLHttpRequest();\r\n request.responseType = 'blob';\r\n request.open('GET', link);\r\n request.addEventListener('load', function () {\r\n let isSuccess = request.response.type == 'application/octet-stream'\r\n if (isSuccess) {\r\n let fileName = request.getResponseHeader('Content-Disposition').match(`filename=(.*);`)[1].replace(`\"`, '').replace(`\"`, '');\r\n controls.parseDownloadFileResponse(request.response, null, request, true, previewP)\r\n callback(isSuccess, request.response, fileName);\r\n } else {\r\n modal.getModal.danger(__l.Error, __l.SomethingWentWrong, true)\r\n callback(isSuccess);\r\n }\r\n });\r\n\r\n beforeSend && beforeSend()\r\n request.send();\r\n }\r\n}\r\n\r\n$(document).on('keyup', '.kdr-grid textarea, .auto-adjust-height', function (e) {\r\n let $this = $(this)\r\n let isEmpty = 0 == $this.val().length\r\n if (e.keyCode != 13 || ($this.closest('.kdr-grid').length > 0 && isEmpty)) {\r\n return false\r\n } else {\r\n $this.css({\r\n 'height': 'auto',\r\n //'overflow-y': 'hidden'\r\n }).height($this.scrollHeight)\r\n }\r\n})\r\n$(document).on('click', '.copy-text[data-copy-from]', function () {\r\n let text = $($(this).data('copyFrom')).text()\r\n textHelper.copyTextToClipboard(text)\r\n .then(() => toastr.info(text, __l.CopiedTextToClipboard))\r\n .catch(() => toastr.error(text, __l.ErrorCannotCopy));\r\n})\r\n$(document).on('click', '.copy-text:not([data-copy-from])', function () {\r\n let text = $(this).text()\r\n textHelper.copyTextToClipboard(text)\r\n .then(() => toastr.info(text, __l.CopiedTextToClipboard))\r\n .catch(() => toastr.error(text, __l.ErrorCannotCopy));\r\n})\r\n\r\n\r\n////////////////////////////////\r\n// Tristate Checkbox //\r\n////////////////////////////////\r\n\r\nvar tristateCheckbox = {\r\n /**\r\n * \r\n * @param {any} $container Non required\r\n */\r\n init: function (container) {\r\n let $this = $(container)\r\n\r\n if (!$this || $this.length == 0) {\r\n $this = $(document)\r\n }\r\n\r\n $this.find('.checkbox-tristate-input').each(function (i, e) {\r\n let $cb = $(e)\r\n let state = $cb.data('value')\r\n if (typeof (state) === \"boolean\") {\r\n $cb.prop('indeterminate', false)\r\n $cb.prop('checked', state)\r\n } else {\r\n $cb.prop('indeterminate', true)\r\n }\r\n })\r\n },\r\n changeTwoState: function ($checkbox) {\r\n let isChecked = $checkbox.prop('checked')\r\n\r\n tristateCheckbox.setIndeterminate($checkbox, false)\r\n $checkbox.prop('checked', !isChecked)\r\n\r\n $checkbox.change()\r\n return $checkbox\r\n },\r\n changeThreeState: function ($checkbox) {\r\n let isChecked = $checkbox.prop('checked')\r\n let isIndeterminate = $checkbox.prop('indeterminate')\r\n\r\n if (isIndeterminate) {\r\n $checkbox.prop('indeterminate', false)\r\n .prop('checked', true)\r\n } else {\r\n if (isChecked) {\r\n $checkbox.prop('checked', false)\r\n } else {\r\n $checkbox.prop('indeterminate', true)\r\n }\r\n }\r\n\r\n $checkbox.change()\r\n return $checkbox\r\n },\r\n setIndeterminate: function ($checkbox, state = true) {\r\n $checkbox.prop('indeterminate', state)\r\n return $checkbox\r\n }\r\n}\r\n\r\n$(document).on('click', '.checkbox-tristate-label-toggle-three-state', function (e) {\r\n e.preventDefault()\r\n e.stopPropagation()\r\n\r\n let $this = $(this)\r\n let $cb = $('#' + $this.attr('for'))\r\n\r\n tristateCheckbox.changeThreeState($cb)\r\n})\r\n\r\n\r\n$(document).on('click', '.checkbox-tristate-label-toggle-two-state', function (e) {\r\n e.preventDefault()\r\n e.stopPropagation()\r\n\r\n let $this = $(this)\r\n let $cb = $('#' + $this.attr('for'))\r\n\r\n tristateCheckbox.changeTwoState($cb)\r\n})\r\n\r\n$(function () {\r\n tristateCheckbox.init()\r\n})\r\n\r\n\r\n/* \r\n * Enabling checkbox based on source checkbox\r\n */\r\nvar disabler = {\r\n events: {\r\n disabler: 'disabler',\r\n ended: 'disabler-ended'\r\n },\r\n triggerEvent($items, event) {\r\n $items && $items.each((i, e) => {\r\n $(e).trigger({\r\n type: event\r\n })\r\n })\r\n },\r\n changeVisibility($element, isToShow, callback) {\r\n if ($element.hasClass('hiddable-dt')) {\r\n let $itemToHide = $element.closest('tr, .item-to-hide')\r\n\r\n if (isToShow) {\r\n $itemToHide.fadeIn(150, callback)\r\n }\r\n else if ($element.data('isHiddableInitied') === true) {\r\n $itemToHide.fadeOut(150, callback)\r\n } else {\r\n $element.data('isHiddableInitied', true)\r\n $itemToHide.hide()\r\n }\r\n }\r\n },\r\n manageTooltip($items) {\r\n $items.each((i, e) => {\r\n let $item = $(e)\r\n\r\n if ($item.hasClass('tooltip-if-disabled')) {\r\n let $tooltipParent;\r\n\r\n if ($item.closest('.custom-checkbox').length > 0) {\r\n $tooltipParent = $item.closest('.custom-checkbox')\r\n } else if ($item.hasClass('kdr-dropdown-w-search-item_selected')) {\r\n $tooltipParent = $item.closest('.kdr-dropdown-tooltip')\r\n }\r\n\r\n if ($item.attr('disabled') == 'disabled') {\r\n $tooltipParent.tooltip({\r\n delay: {\r\n show: tooltipOtions.delay.show,\r\n hide: tooltipOtions.delay.hide\r\n },\r\n boundary: tooltipOtions.boundary,\r\n trigger: tooltipOtions.trigger\r\n })\r\n }\r\n else {\r\n $tooltipParent.tooltip('dispose')\r\n }\r\n }\r\n })\r\n },\r\n checkChildrens($items) {\r\n $items.filter((i, e) => $(e).prop('class').includes('ds')).trigger('disabler')\r\n },\r\n disableBasedOnCheckbox($cb, triggerEvent = true) {\r\n let cbMasterState = $cb.is(\":checked\")\r\n let dsPattern = /ds-(\\S+)/i\r\n\r\n let groupIndex = $cb.attr('class').match(dsPattern)[1]\r\n let $targets = $('[class*=\"dt-' + groupIndex + '\"]')\r\n\r\n $targets.each(function () {\r\n let $t = $(this)\r\n let stateToSet;\r\n\r\n let andGroups = $t.attr('class').match(/dt-([^-(m+)ddl]\\S*)/ig)\r\n let orGroups = $t.attr('class').match(/(?:dt\\-([A-Za-z0-9\\-]+)(?=\\/)|\\/dt\\-([A-Za-z0-9\\-]+))/ig)\r\n let ddlGroups = $t.attr('class').match(/dt-ddl-(\\S+)/ig)\r\n let orIds = []\r\n\r\n if (isNullOrUndefined(andGroups)) andGroups = [];\r\n if (isNullOrUndefined(orGroups)) orGroups = [];\r\n if (isNullOrUndefined(ddlGroups)) ddlGroups = [];\r\n\r\n\r\n if (orGroups != null && orGroups.length > 0) {\r\n $(orGroups).each((i, e) => {\r\n let m = $(e.match(/dt-(\\S+)[^\\/]?/i)).last()\r\n if (m != undefined && m != null) {\r\n orIds.push(m[0])\r\n }\r\n })\r\n }\r\n\r\n\r\n if (andGroups.length > 0 && cbMasterState && orIds.length == 0) {//'and' mode\r\n let isAllChecked = true\r\n $(andGroups).each(function () {\r\n let index = this.match(/dt-(\\S+)/i)[1]\r\n if (!$('.ds-' + index).is(':checked')) {\r\n isAllChecked = false\r\n return false\r\n }\r\n })\r\n stateToSet = isAllChecked\r\n }\r\n else if (orIds.length > 0) { //'or' mode\r\n $(orIds).each(function () {\r\n let isChecked = $('.ds-' + this + '').is(':checked')\r\n if (isChecked) {\r\n stateToSet = true\r\n return false\r\n }\r\n })\r\n }\r\n else {\r\n stateToSet = cbMasterState\r\n }\r\n\r\n\r\n if (stateToSet) {\r\n $t.removeAttr('disabled')\r\n } else {\r\n $t.attr('disabled', 'disabled')\r\n\r\n if ($t.hasClass('kdr-dropdown-w-search-item_selected') == true && $t.closest('.kdr-dropdown-w-search_multi').length > 0) {\r\n kdrDropdown.clearDropdown($t.parent())\r\n } else {\r\n $t.valExtended('')\r\n }\r\n }\r\n\r\n\r\n if (ddlGroups != null && ddlGroups.length > 0 && cbMasterState === true) {\r\n $(ddlGroups).each((x, i) => {\r\n $('.' + i.replace('dt', 'ds')).trigger('disabler')\r\n })\r\n } else {\r\n disabler.changeVisibility($t, stateToSet)\r\n\r\n $t.each((x, i) => {\r\n let $i = $(i)\r\n if ($i.closest('.kdr-dropdown-w-search').length > 0) {\r\n $i.trigger('disabler')\r\n }\r\n })\r\n\r\n }\r\n\r\n disabler.checkChildrens($targets)\r\n disabler.manageTooltip($t)\r\n if (triggerEvent) {\r\n disabler.triggerEvent($t, disabler.events.ended)\r\n }\r\n })\r\n },\r\n disableBasedOnDDL($ddl, triggerEvent = true) {\r\n let dsPattern = /ds-ddl-(\\S+)/i\r\n\r\n let groupIndex = $ddl.attr('class').match(dsPattern)[1]\r\n\r\n let $targets = $('[class*=\"dt-ddl-' + groupIndex + '\"]')\r\n let selectedItemIndex = $ddl.valExtended()\r\n let isEnablerSelected = false\r\n\r\n if (($ddl[0].hasAttribute('disabled') && ($ddl.attr('disabled') == 'disabled' || $ddl.attr('disabled') == 'true')) == false) {\r\n let $menu = $('#' + $ddl.data('target'))\r\n isEnablerSelected = $menu.find(`.kdr-dropdown-w-search-item[data-value=\"${selectedItemIndex}\"] [class*=\"da-ddl-${groupIndex}\"]`).length > 0\r\n }\r\n\r\n if (isEnablerSelected) {\r\n $targets.removeAttr('disabled')\r\n } else {\r\n $targets.attr('disabled', 'disabled')\r\n\r\n $targets.filter((i, e) => $(e).closest('.kdr-dropdown-w-search_multi').length > 0).each((i, e) => {\r\n kdrDropdown.clearDropdown($(e).closest('.kdr-dropdown-w-search'))\r\n })\r\n\r\n $targets.filter((i, e) => $(e).closest('.kdr-dropdown-w-search_multi').length == 0)\r\n .valExtended(0)\r\n\r\n $targets.filter((i, e) => $(e).closest('.custom-checkbox').length > 0)\r\n .valExtended(false)\r\n }\r\n\r\n\r\n disabler.checkChildrens($targets)\r\n disabler.changeVisibility($targets, isEnablerSelected)\r\n disabler.manageTooltip($targets)\r\n if (triggerEvent) {\r\n disabler.triggerEvent($targets, disabler.events.ended)\r\n }\r\n },\r\n disableBasedOnMDDL($mddl, triggerEvent = true) {\r\n let dsPattern = /ds-mddl-(\\S+)/i\r\n\r\n let groupIndex = $mddl.attr('class').match(dsPattern)[1]\r\n\r\n let $targets = $('[class*=\"dt-mddl-' + groupIndex + '\"]')\r\n let isEnablerSelected =\r\n $mddl\r\n .valExtended()\r\n .some(x => $mddl.closest('.kdr-dropdown-w-search').find(`.kdr-dropdown-w-search-item[data-value=\"${x}\"] [class*=\"da-mddl-${groupIndex}\"]`).length > 0)\r\n if (isEnablerSelected) {\r\n $targets.removeAttr('disabled')\r\n } else {\r\n $targets.attr('disabled', 'disabled').valExtended([])\r\n\r\n $targets.filter((i, e) => $(e).closest('.custom-checkbox').length > 0)\r\n .valExtended(false)\r\n }\r\n\r\n disabler.checkChildrens($targets)\r\n disabler.changeVisibility($targets, isEnablerSelected)\r\n disabler.manageTooltip($targets)\r\n if (triggerEvent) {\r\n disabler.triggerEvent($targets, disabler.events.ended)\r\n }\r\n },\r\n disableBasedOnRDDL($rddl, triggerEvent = true) {\r\n let dsPattern = /ds-rddl(?:-(\\w+)){1}?(?:-(\\S+))?/i;\r\n let groupIndex = $rddl.attr('class').match(dsPattern)[1]\r\n let isPerIndexStyle = $rddl.attr('class').match(dsPattern)[2] != undefined\r\n let $targets = $('[class*=\"dt-rddl-' + groupIndex + '\"]'),\r\n $targetsToEnable = $(),\r\n $targetsToDisable = $()\r\n\r\n if (isPerIndexStyle === true) {\r\n let selectedIndex = $rddl.find('.kdr-custom-radio:checked').closest('.custom-radio').index()\r\n\r\n $targetsToEnable = $targets.filter((i, e) => $(e).hasClass(`dt-rddl-${groupIndex}-${selectedIndex}`))\r\n $targetsToDisable = $targets.filter((i, e) => !$(e).hasClass(`dt-rddl-${groupIndex}-${selectedIndex}`))\r\n } else {\r\n //all items style\r\n if ($rddl.find(`[class*=\"da-rddl-${groupIndex}\"]`).length != 0) {\r\n $targetsToEnable = $targets.filter((i, e) => $(e).hasClass(`dt-rddl-${groupIndex}`))\r\n } else {\r\n $targetsToDisable = $targets.filter((i, e) => $(e).hasClass(`dt-rddl-${groupIndex}`))\r\n }\r\n }\r\n\r\n\r\n $targetsToEnable.removeAttr('disabled')\r\n $targetsToDisable.attr('disabled', 'disabled').valExtended('')\r\n\r\n disabler.checkChildrens($targets)\r\n disabler.changeVisibility($targetsToDisable, false, () => disabler.changeVisibility($targetsToEnable, true))\r\n disabler.manageTooltip($targetsToDisable)\r\n\r\n if (triggerEvent) {\r\n disabler.triggerEvent($targets, disabler.events.ended)\r\n }\r\n },\r\n}\r\n\r\n$(document).on(`change ${disabler.events.disabler}`, '.kdr-grid-input[class*=\"ds-\"][type=\"checkbox\"]', function () {\r\n disabler.disableBasedOnCheckbox($(this))\r\n})\r\n$(document).on(`change ${disabler.events.disabler}`, '[class*=\"ds-ddl-\"]', function () {\r\n disabler.disableBasedOnDDL($(this))\r\n})\r\n$(document).on(`change ${disabler.events.disabler}`, '[class*=\"ds-mddl-\"]', function () {\r\n disabler.disableBasedOnMDDL($(this))\r\n})\r\n$(document).on(`change ${disabler.events.disabler}`, '.radio-buttons-wrapper[class*=\"ds-rddl-\"]', function () {\r\n disabler.disableBasedOnRDDL($(this))\r\n})\r\n\r\n//////////////////////////////////\r\n// Multi dropdown menu //\r\n//////////////////////////////////\r\n$(document)\r\n .on('click', 'div.dropdown-menu [data-toggle=\"kdr-mddm\"]', function (event) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n // chowanie wczesniej odpalonych list \r\n if (!$(this).next().hasClass('show')) {\r\n $(this).parents('.dropdown-menu').first().find('.show').removeClass(\"show\");\r\n }\r\n\r\n // zamykanie siostrzanych dropdown list \r\n $(this).siblings().toggleClass(\"show\");\r\n\r\n // auto zwijanie ddl do poczatku po jej zamknieciu \r\n $(this).parents('div.dropdown.show').on('hidden.bs.dropdown', function () {\r\n $('.dropdown-submenu .show').removeClass(\"show\")\r\n });\r\n\r\n $(this).siblings('div.dropdown-menu').trigger('classChangedTrigger')\r\n })\r\n .on('classChangedTrigger', 'div.dropdown-menu', function () {\r\n var bounding = this.getBoundingClientRect();\r\n\r\n if (bounding.right > $(window).width()) {\r\n $(this).addClass('dropdown-submenu-left')\r\n\r\n var reBounding = this.getBoundingClientRect();\r\n if (reBounding.right > $(window).width()) {\r\n $(this).attr('style', 'left: -200% !important')\r\n }\r\n }\r\n\r\n })\r\n .on('show.bs.dropdown', '#TopMenu .kdr-control-mddm-btn .dropdown', function () {\r\n $(this).find('.dropdown-menu').trigger('classChangedTrigger')\r\n })\r\n .on('shown.bs.dropdown', '#TopMenu .kdr-control-mddm-btn .dropdown', function () {\r\n $(this).find('.dropdown-menu').trigger('classChangedTrigger')\r\n })\r\n\r\n$(document).on('show.bs.dropdown', '.kdr-control-mddm-btn', function (e) {\r\n let $dropdownMenu = $($(e.relatedTarget).data('bs.dropdown')._menu)\r\n\r\n kdrDropdown.updatePosition($dropdownMenu)\r\n})\r\n$(document).on('show.bs.dropdown', '.kdr-control-mddm-btn', function (e) {\r\n let $dropdownMenu = $($(e.relatedTarget).data('bs.dropdown')._menu)\r\n\r\n kdrDropdown.updatePosition($dropdownMenu)\r\n})\r\n//////////////////\r\n// Tilemenu //\r\n//////////////////\r\n$(function () {\r\n\r\n //$('.tilemenu-link').mouseenter(function () {\r\n // $(this).find('.tilemenu-link-body > svg, .tilemenu-link-id').slideUp(100)\r\n //})\r\n //$('.tilemenu-link').mouseleave(function () {\r\n // $(this).find('.tilemenu-link-body > svg, .tilemenu-link-id').slideDown(100)\r\n //})\r\n $('.tilemenu-link a').click(function () {\r\n loading.show($(this).parent())\r\n })\r\n\r\n $('.kdr-tilemenu-expand-all').click(function () {\r\n tilemenu.expandRows()\r\n })\r\n\r\n $('.kdr-tilemenu-fold-all').click(function () {\r\n tilemenu.collapseRows()\r\n })\r\n\r\n ///search for raports matching user \r\n $('.kdr-tilemenu-search-input')\r\n .change(function () {\r\n tilemenu.searchItems()\r\n tilemenu.expandRows()\r\n })\r\n .keyup(function () { $('.kdr-tilemenu-search-input').change() })\r\n\r\n $('.kdr-tilemenu-search-erase').click(function () {\r\n if ($('.kdr-tilemenu-search-input').val().length != '0') {\r\n $('.kdr-tilemenu-search-input').val(null);\r\n\r\n tilemenu.searchItems()\r\n //tilemenu.collapseRows()\r\n }\r\n })\r\n $(document).on('shown.bs.collapse', '.modal .tilemenu-row > .collapse', function () {\r\n tilemenu.scrollView($(this))\r\n })\r\n})\r\n\r\nvar tilemenu = {\r\n collapseRows() {\r\n $('.tilemenu-row .collapse').each(function () {\r\n $(this).collapse('hide')\r\n $(this).attr('data-parent', \"#tilemenu-collapse\")\r\n })\r\n },\r\n expandRows() {\r\n $('.tilemenu-row .collapse').each(function () {\r\n $(this).removeAttr('data-parent')\r\n $(this).collapse('show')\r\n })\r\n },\r\n searchItems() {\r\n let searchValues = $('.kdr-tilemenu-search-input').val().toLowerCase().split(',')\r\n $('.tilemenu-link').each(function () {\r\n\r\n let $link = $(this)\r\n let isInSearchValueP = $link.find(\".tilemenu-link-title, .tilemenu-title-number\").toArray().some(x => {\r\n let $item = $(x)\r\n let text = $item.text().toLowerCase()\r\n\r\n return ((searchValues.length == 1 && textHelper.isNullOrEmpty(searchValues[0]?.trim() ?? '')) || searchValues.some(y => textHelper.isNullOrEmpty(y) ? false : text.includes(y.trim())))\r\n })\r\n\r\n if (isInSearchValueP) {\r\n $link.removeClass('hide')\r\n } else {\r\n $link.addClass('hide')\r\n }\r\n })\r\n\r\n tilemenu.toggleRows()\r\n },\r\n toggleRows() {\r\n $('.tilemenu-row-body').each(function (i) {\r\n let allChildrensCount = $(this).find('.tilemenu-link').length\r\n let hiddenChildrensCount = $(this).find('.tilemenu-link.hide').length\r\n\r\n if (hiddenChildrensCount == allChildrensCount) {\r\n $(this).closest('.tilemenu-row').addClass('hide')\r\n } else {\r\n $(this).closest('.tilemenu-row').removeClass('hide')\r\n }\r\n })\r\n },\r\n scrollView($element) {\r\n $element.closest('.modal').animate({ scrollTop: $element.position().top }, 250)\r\n },\r\n\r\n hideTooltip(tileMenuA) {\r\n //deb(tileMenuA)\r\n let tId = $(tileMenuA).attr('aria-describedby')\r\n //deb(tID)\r\n $('#' + tId).tooltip('dispose')\r\n }\r\n}\r\n\r\n//////////////////\r\n// UID //\r\n//////////////////\r\n/**https://www.ietf.org/rfc/rfc4122.txt */\r\nlet uid = {\r\n getNew: function () {\r\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {\r\n var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);\r\n return v.toString(16);\r\n });\r\n }\r\n}\r\n\r\n///////////////////////\r\n// OUTCLICK //\r\n///////////////////////\r\n$(document).on('click', '.blur', function () {\r\n $(this).blur()\r\n})\r\n\r\n\r\n/*************/\r\n/* Grid */\r\n/*************/\r\n\r\nconst gridActions = {\r\n ADD: 0,\r\n UPDATE: 1,\r\n REMOVE: 2,\r\n QUICKFILTER: 3,\r\n CUSTOMONE: 4\r\n};\r\n\r\nconst fraxActions = {\r\n ADD: 0,\r\n REMOVE: 2,\r\n RENAME: 5\r\n};\r\n\r\nconst gridEvents = {\r\n BEFORE_RENDER: 'grid-before-render',\r\n BEFORE_UI_INIT: 'grid-before-ui-init',\r\n AFTER_RENDER: 'grid-after-render',\r\n AFTER_UI_INIT: 'grid-after-ui-init',\r\n AFTER_FILTER: 'grid-after-filter',\r\n EXPORT_START: 'grid-export-start',\r\n EXPORT_COMPLET: 'grid-export-complete',\r\n AFTER_RENDER_W_INPUTS: 'grid-after-render-with-inputs',\r\n AFTER_MAGIC_ERROR: 'grid-after-magic-error',\r\n AFTER_CHECK_ALL_CHECKBOXES: 'grid-after-check-all-checkboxes',\r\n}\r\n\r\nconst fraxEvents = {\r\n SELECTED: 'frax-selected',\r\n DESELECTED: 'frax-deselected',\r\n CHANGED: 'frax-changed',\r\n}\r\n\r\nconst controlEvents = {\r\n ACT: 'kdr-control-act',\r\n AFTER_RENDER: 'kdr-control-after-render',\r\n AFTER_UI_INIT: 'kdr-control-ui-init',\r\n AFTER_FILTER: 'kdr-control-ui-init',\r\n BEFORE_RENDER: 'kdr-control-before-render',\r\n BEFORE_PARSE_COMMAND: 'kdr-control-before-parse-command'\r\n}\r\n\r\nconst controlActions = {\r\n ACT: 1\r\n}\r\n///fixme uogolnie na kdrControlResponseCodes\r\nconst gridResponseCodes = {\r\n SUCCESS: 0,\r\n INFO: 1,\r\n WARNING: 2,\r\n ERROR: 3\r\n}\r\n\r\nconst gridActResponseShowTypes = {\r\n MODAL: 0,\r\n TOAST: 1,\r\n INNER: 2\r\n}\r\n\r\nconst relationActionTypes = {\r\n NONE: 0,\r\n RENDER: 1,\r\n FILTER: 2\r\n}\r\n\r\nconst nullIf = function (value, expression) {\r\n if (value == expression) {\r\n return null;\r\n } else {\r\n return value;\r\n }\r\n}\r\n\r\nconst controls = {\r\n getArgs: function (inputs, args) {\r\n for (var i = 0; i < inputs.length; i++) {\r\n let $i = inputs[i]\r\n if (!($i instanceof jQuery)) {\r\n $i = $($i)\r\n }\r\n\r\n let di = $i.attr(\"data-index\").toString()\r\n\r\n if ($i.hasClass('kdr-grid-input-tinymc-wrapper')) {\r\n let $editor = tinyMCE.get($i.prop('id'))\r\n let t0 = $editor.getContent()\r\n let isHideToolbar = $i.hasClass('tinymce-hide-toolbar')\r\n\r\n if ($i.hasClass('regex-mail-marker')) {\r\n const regex = /.*?<\\/span>/gi;\r\n let m = null\r\n let t = t0 /* 20211203 niech to sie dzieje w sqlu, zeby zapewnic konsystencje miedzy tym co wyszlo a tym co przyszlo (tlumaczenia) -dkowalski */\r\n /* js'ie jak juz**/\r\n while ((m = regex.exec(t0)) !== null) {\r\n // This is necessary to avoid infinite loops with zero-width matches\r\n if (m.index === regex.lastIndex) {\r\n regex.lastIndex++;\r\n }\r\n\r\n t = t.replace(m[0], m[1])\r\n }\r\n\r\n t0 = t\r\n }\r\n\r\n t0 = t0.replace('', '').replace('', '')\r\n if (isHideToolbar === true) {\r\n t0 = t0.replace(/<\\/?[^>]+(>|$)/g, \"\");///potentially danger\r\n }\r\n\r\n /*args[di] = text*/\r\n if ($i.hasClass('kdr-language')) {\r\n let l = $($i.closest('[data-language]')).data('language')\r\n if (args[di] == undefined) {\r\n args[di] = {}\r\n }\r\n args[di][l] = t0\r\n } else {\r\n args[di] = t0\r\n }//\r\n }\r\n else if ($i.hasClass('checkbox-tristate-input')) {\r\n args[di] = nullIf($i.valExtended(), 'indeterminate')\r\n }\r\n else if ($i.hasClass('kdr-language')) {\r\n let l = $($i.closest('[data-language]')).data('language')\r\n if (args[di] == undefined) {\r\n args[di] = {}\r\n }\r\n args[di][l] = $i.valExtended()\r\n }\r\n else if ($i.hasClass('kdr-grid-input-file-list')) {\r\n //clyson potem jesli wiesz jak mozesz dac to od extended value - nie wiem radeon\r\n args[di] = $i.find('.kdr-grid-file-item').map(function (index, item) { return $(item).data('index') }).toArray()\r\n }\r\n else if ($i.hasClass('nav-link')) {\r\n args[di] = $i.data('value')\r\n }\r\n else if ($i.hasClass('kdr-kanban')) {\r\n args[di] = $i.find('.kanban-task.kanbanSelected').data('index')\r\n }\r\n else {\r\n args[di] = $i.valExtended()\r\n }\r\n }\r\n },\r\n setArgs: function (inputs, args, asyncDDLP = true) {\r\n inputs.each(function (a, b) {\r\n let $input = $(b)\r\n let di = $input.attr(\"data-index\").toString()\r\n $input.valExtended(args[di], undefined, asyncDDLP)\r\n })\r\n },\r\n getMaxUploadSize: function ($control) {\r\n return $control.data('maxUploadSize')\r\n },\r\n getInfo: function (control) {\r\n //return control.find(\".kdr-info\").val()\r\n let id = control.prop('id')\r\n return $(`#${id}-info`).val()\r\n //return control.find(\".kdr-info\").last().val()\r\n },\r\n setInfo: function (control, info) {\r\n //console.log(info)\r\n let id = control.prop('id')\r\n return $(`#${id}-info`).val(info)\r\n //return control.find(\".kdr-info\").val(info)\r\n },\r\n /**\r\n * Provides refresh grid control by passing here control as object or controlID as string without hash\r\n * |Automated controls.render|\r\n * @param {any} control\r\n * @param {any} endpoint\r\n * @param {any} controlId\r\n * @param {any} $loadingTarget\r\n * @param {any} clearP -- czyszczenie filtrow\r\n */\r\n refresh: function (control = null, controlId = null, $loadingTarget = null, endpoint = null, clearP = false, successCallback = null, clearCheckboxesP = false) {\r\n let $control = null\r\n\r\n if (control != null) {\r\n $control = convert.toJqueryObject(control)\r\n } else if (controlId != null) {\r\n $control = $('#' + controlId)\r\n } else {\r\n throw 'controls.refresh - You need to pass at least one selector'\r\n return\r\n }\r\n\r\n if (endpoint == null) {\r\n endpoint = controls.getEndpoint($control)\r\n }\r\n\r\n controls.render(endpoint, $control, controls.getInfo($control), $loadingTarget, successCallback, null, clearP, clearCheckboxesP)\r\n },\r\n render: function (endpoint, control, info, $loadingTarget = null, successCallback = null, selectP = false, clearP = false, clearCheckboxesP = false) {\r\n let $control = convert.toJqueryObject(control)\r\n let contentClassesString = '.kdr-kanban-content, .kdr-grid-content, .kdr-tile-selection-content'\r\n\r\n if ($loadingTarget == undefined || $loadingTarget.length == 0 || $loadingTarget == null) {\r\n if ($control.closest('.modal-content').length > 0) {\r\n $loadingTarget = $control.closest('.modal-content')\r\n }\r\n else if ($(control).closest('.tilemenu-row').length > 0) {\r\n $loadingTarget = $control.closest('.tilemenu-row')\r\n } else {\r\n $loadingTarget = $control\r\n }\r\n }\r\n\r\n let $controlId = $(control).attr('Id')\r\n\r\n var $elementOriginal = $('#' + $controlId);\r\n var $contentOriginal = $elementOriginal.find(contentClassesString);\r\n\r\n var scrollLeft = $contentOriginal.scrollLeft();\r\n var scrollTop = $contentOriginal.scrollTop();\r\n\r\n\r\n $.ajax({\r\n type: \"POST\",\r\n url: __root + endpoint,\r\n datatype: \"json\",\r\n traditional: true,\r\n data: {\r\n \"info\": info,\r\n \"selectP\": selectP,\r\n \"clearP\": clearP,\r\n \"clearCheckboxesP\": clearCheckboxesP\r\n },\r\n success: function (response) {\r\n //let $r = $(response)\r\n //control.replaceWith($r)\r\n $control.replaceWith(response)\r\n\r\n let controlId = $control.attr(\"id\")\r\n successCallback && successCallback(controls.getControl(controlId))\r\n },\r\n error: function (r) {\r\n //toastr.error(\"Something went wrong, try again later.\", \"Ups...\")\r\n console.error(\"Something went wrong, try again later.\")\r\n console.error($control.prop('id'))\r\n console.error(r)\r\n },\r\n beforeSend: function () {\r\n loading.show($loadingTarget)\r\n },\r\n complete: () => {\r\n //isAjaxComplete = true\r\n var $element = $('#' + $controlId);\r\n var $content = $element.find(contentClassesString);\r\n $content.scrollLeft(scrollLeft).scrollTop(scrollTop);\r\n\r\n\r\n loading.hide($loadingTarget)\r\n },\r\n })\r\n },\r\n refreshWithInputs: function (control = null, controlId = null, $loadingTarget = null, endpoint = null, clearP = false, successCallback = null, newValue = null) {\r\n let $control = null\r\n\r\n if (control != null && control.length != 0) {\r\n $control = $(control)\r\n } else if (controlId != null) {\r\n $control = $('#' + controlId)\r\n } else {\r\n throw 'controls.refreshWithInputs - You need to pass at least one selector'\r\n return\r\n }\r\n\r\n if (endpoint == null) {\r\n endpoint = controls.getEndpoint($control)\r\n }\r\n\r\n controls.renderWithInputs(endpoint, $control, controls.getInfo($control), $loadingTarget, successCallback, null, clearP, newValue)\r\n },\r\n clearPayload: function ($control) {\r\n $.ajax({\r\n type: \"POST\",\r\n url: window.location.origin + __root + 'Grid/ClearPayload',\r\n datatype: \"json\",\r\n traditional: true,\r\n data: {\r\n info: controls.getInfo($control)\r\n },\r\n success: function (response) {\r\n if (3 != response.code) {\r\n controls.setInfo($control, response.info)\r\n controls.refresh($control)\r\n } else {\r\n modal.getModal.danger(\"~{Error}\", response.message, true)\r\n }\r\n },\r\n })\r\n },\r\n renderWithInputs: function (endpoint, control, info, $loadingTarget = null, successCallback = null, selectP = false, clearP = false, newValue = null) {\r\n let dargs = {}\r\n let gridId = control.attr(\"id\")\r\n\r\n let modalP = control.find(\".kdr-grid-modal-item-update\").length > 0\r\n\r\n function _replaceNewValue(index, nv, $inputs) {\r\n\r\n if (nv != null && nv.value != null && nv.itemOrdinal == $inputs.closest(\"td[data-item-ordinal]\").data(\"itemOrdinal\")) {\r\n if (Array.isArray(dargs[index].args[nv.index])) {\r\n dargs[index].args[nv.index].push(nv.value)\r\n } else {\r\n dargs[index].args[nv.index] = nv.value\r\n }\r\n }\r\n }\r\n\r\n if (modalP) {\r\n let modalSelector = \"#copied-grid-edit-modal-\" + gridId + \", #copied-grid-add-modal-\" + gridId\r\n $(modalSelector).find(\".kdr-grid-item-update, .kdr-grid-item-insert, .kdr-grid-item-insert\").each(function (index, item) {\r\n let $item = $(item)\r\n let inputs = $item.find(\".kdr-grid-input\")\r\n let $inputs = $(inputs)\r\n\r\n dargs[index] = {\r\n index: $item.closest(\".modal\").data(\"row-id\"),\r\n args: []\r\n }\r\n controls.getArgs(inputs, dargs[index].args)\r\n $inputs.each(function (i, e) {\r\n let i7 = $(e).data(\"index\")\r\n if ($(e).hasClass('kdr-dropdown-w-search-item_selected')) {\r\n if (Array.isArray(dargs[index].args[i7])) {\r\n $(dargs[index].args[i7]).each(function (ii, ee) {\r\n dargs[index].args[i7][ii] = $(e).closest(\".dropdown\").find(\".kdr-dropdown-w-search-item[data-value=\" + ee + \"]\").text().trim()\r\n })\r\n }\r\n else {\r\n dargs[index].args[i7] = $(e).closest(\".dropdown\").find(\".kdr-dropdown-w-search-item[data-value=\" + dargs[index].args[i7] + \"]\").text().trim()\r\n }\r\n } else if ($(e).hasClass('kdr-grid-input-file-list')) {\r\n let $input = $(e).siblings('.kdr-grid-files-input')\r\n\r\n dargs[index].args[i7] = controls.fileControl.getFiles($input)\r\n }\r\n })\r\n\r\n _replaceNewValue(index, newValue, $inputs)\r\n\r\n if ($loadingTarget == undefined || $loadingTarget.length == 0 || $loadingTarget == null) {\r\n if ($(control).closest('.modal-content').length > 0) {\r\n $loadingTarget = $(control).closest('.modal-content')\r\n }\r\n else if ($(control).closest('.tilemenu-row').length > 0) {\r\n $loadingTarget = $(control).closest('.tilemenu-row')\r\n } else {\r\n $loadingTarget = $(control)\r\n }\r\n }\r\n\r\n })\r\n\r\n\r\n controls.render(endpoint, control, info, $loadingTarget, function (hehe) {\r\n let idx = dargs[0].index\r\n gridId = hehe.attr('id')\r\n\r\n ReplaceDisplayedEditRow(idx, gridId)\r\n ReplaceDisplayedInsertRow(gridId)\r\n\r\n $(modalSelector).find(\".kdr-grid-item-update, .kdr-grid-item-insert, .kdr-grid-item-insert\").each(function (index, item) {\r\n let $item = $(item)\r\n\r\n let inputs = $item.find(\".kdr-grid-input\")\r\n $(inputs).each(function (i, e) {\r\n let i7 = $(e).data(\"index\")\r\n if ($(e).hasClass('kdr-dropdown-w-search-item_selected')) {\r\n if (Array.isArray(dargs[index].args[i7])) {\r\n $(dargs[index].args[i7]).each(function (ii, ee) {\r\n let a = $(e).closest(\".dropdown\").find(\".kdr-dropdown-w-search-item\").filter(function () { return $(this).find(\".kdr-dropdown-w-search-item-text\").text().trim() == ee })\r\n if (a != undefined) {\r\n let valueToRemove = $(a).data(\"value\");\r\n if ($(e).data(\"value\").indexOf(valueToRemove) !== -1) {\r\n dargs[index].args[i7][ii] = undefined;\r\n } else {\r\n dargs[index].args[i7][ii] = valueToRemove;\r\n }\r\n }\r\n })\r\n } else {\r\n let a = $(e).closest(\".dropdown\").find(\".kdr-dropdown-w-search-item\").filter(function () { return $(this).find(\".kdr-dropdown-w-search-item-text\").text().trim() == dargs[index].args[i7] })\r\n if (a != undefined) {\r\n dargs[index].args[i7] = $(a).data(\"value\")\r\n }\r\n }\r\n } else if ($(e).hasClass('kdr-grid-input-file-list')) {\r\n let $input = $(e).siblings('.kdr-grid-files-input')\r\n controls.fileControl.setFiles($input, $(dargs[index].args[i7]))\r\n controls.fileControl.refreshUI($input)\r\n }\r\n })\r\n controls.setArgs(inputs, dargs[index].args, false)\r\n })\r\n\r\n successCallback && successCallback(hehe)\r\n controls.onGridAfterRenderWInputs(hehe)\r\n }, selectP, clearP)\r\n\r\n }\r\n else {\r\n let editAllP = control.find(\".kdr-grid-save-all:visible\").length > 0\r\n\r\n control.find(\".kdr-grid-item-update, .kdr-filters-groups, .kdr-grid-item-insert\").each(function (index, item) {\r\n let $item = $(item)\r\n let inputs = $item.find(\".kdr-grid-input, .kdr-filters-input\")\r\n let $inputs = $(inputs)\r\n\r\n dargs[index] = {\r\n editp: $item.is(\":visible\"),\r\n args: []\r\n }\r\n controls.getArgs(inputs, dargs[index].args)\r\n\r\n $inputs.each(function (i, e) {\r\n let i7 = $(e).data(\"index\")\r\n if ($(e).hasClass('kdr-dropdown-w-search-item_selected')) {\r\n if (Array.isArray(dargs[index].args[i7])) {\r\n $(dargs[index].args[i7]).each(function (ii, ee) {\r\n dargs[index].args[i7][ii] = $(e).closest(\".dropdown\").find(\".kdr-dropdown-w-search-item[data-value=\" + ee + \"]\").text().trim()\r\n })\r\n }\r\n else {\r\n dargs[index].args[i7] = $(e).closest(\".dropdown\").find(\".kdr-dropdown-w-search-item[data-value=\" + dargs[index].args[i7] + \"]\").text().trim()\r\n }\r\n } else if ($(e).hasClass('kdr-grid-input-file-list')) {\r\n let $input = $(e).siblings('.kdr-grid-files-input')\r\n\r\n dargs[index].args[i7] = controls.fileControl.getFiles($input)\r\n }\r\n })\r\n\r\n _replaceNewValue(index, newValue, $inputs)\r\n\r\n\r\n\r\n })\r\n\r\n controls.render(endpoint, control, info, $loadingTarget, function (hehe) {\r\n\r\n hehe.find(\".kdr-grid-item-update, .kdr-filters-groups, .kdr-grid-item-insert\").each(function (index, item) {\r\n let $item = $(item)\r\n if (dargs[index] != undefined && dargs[index].editp) {\r\n let index = $item.index() - 1\r\n if (index >= 0) {\r\n let $select = $($item.parent().children().get(index))\r\n $item.addClass('show').show()\r\n $select.removeClass('show').hide()\r\n }\r\n }\r\n let inputs = $item.find(\".kdr-grid-input, .kdr-filters-input\")\r\n $(inputs).each(function (i, e) {\r\n let i7 = $(e).data(\"index\")\r\n if ($(e).hasClass('kdr-dropdown-w-search-item_selected')) {\r\n if (Array.isArray(dargs[index].args[i7])) {\r\n $(dargs[index].args[i7]).each(function (ii, ee) {\r\n let a = $(e).closest(\".dropdown\").find(\".kdr-dropdown-w-search-item\").filter(function () { return $(this).find(\".kdr-dropdown-w-search-item-text\").text().trim() == ee })\r\n if (a != undefined) {\r\n let valueToRemove = $(a).data(\"value\");\r\n if ($(e).data(\"value\").indexOf(valueToRemove) !== -1) {\r\n dargs[index].args[i7][ii] = undefined;\r\n } else {\r\n dargs[index].args[i7][ii] = valueToRemove;\r\n }\r\n }\r\n })\r\n } else {\r\n let a = $(e).closest(\".dropdown\").find(\".kdr-dropdown-w-search-item\").filter(function () { return $(this).find(\".kdr-dropdown-w-search-item-text\").text().trim() == dargs[index].args[i7] })\r\n if (a != undefined) {\r\n dargs[index].args[i7] = $(a).data(\"value\")\r\n }\r\n }\r\n } else if ($(e).hasClass('kdr-grid-input-file-list')) {\r\n let $input = $(e).siblings('.kdr-grid-files-input')\r\n controls.fileControl.setFiles($input, $(dargs[index].args[i7]))\r\n controls.fileControl.refreshUI($input)\r\n }\r\n })\r\n if (dargs[index] != undefined) {\r\n controls.setArgs(inputs, dargs[index].args, false)\r\n }\r\n })\r\n\r\n if (editAllP) {\r\n hehe.find(\".kdr-grid-cancel-all\").show().addClass('show')\r\n hehe.find(\".kdr-grid-save-all\").show().addClass('show')\r\n hehe.find(\".kdr-grid-edit-all\").hide().removeClass('show')\r\n }\r\n\r\n successCallback && successCallback(hehe)\r\n controls.onGridAfterRenderWInputs(hehe)\r\n }, selectP, clearP)\r\n }\r\n },\r\n magic: function (endpoint, control, response, $loadingTarget = null, renderOnError = false, selectP = false, successCallback = null) {\r\n\r\n if (response.info != null && (response.renderP != null ? response.renderP : (response.code != gridResponseCodes.ERROR || renderOnError))) {\r\n if ($(control).hasClass('kdr-control-rerender-w-inputs')) {\r\n controls.renderWithInputs(endpoint, control, response.info, $loadingTarget, successCallback, selectP)\r\n } else {\r\n controls.render(endpoint, control, response.info, $loadingTarget, successCallback, selectP)\r\n }\r\n }\r\n\r\n if (response.code == gridResponseCodes.ERROR && response.args.length > 0) {\r\n $(control).data('mask', response.args[0])\r\n }\r\n\r\n let messageLabelId = 'message-control-' + control.attr('id')\r\n $(control).find('#' + messageLabelId).remove()\r\n let isErrorShown = false\r\n\r\n if (response.message != null && response.message.length != null) {\r\n let switchOn;\r\n if (response.args[1] != undefined) {\r\n switchOn = parseInt(response.args[1])\r\n } else {\r\n switchOn = control.data('responseShowType')\r\n }\r\n\r\n switch (switchOn) {\r\n case gridActResponseShowTypes.INNER:\r\n let styleClasses = 'd-block mb-1 font-weight-bold'\r\n\r\n switch (response.code) {\r\n case gridResponseCodes.SUCCESS:\r\n styleClasses += ' kdr-grid-message-success text-success'\r\n break\r\n case gridResponseCodes.WARNING:\r\n styleClasses += ' kdr-grid-message-warning text-warning'\r\n break\r\n case gridResponseCodes.ERROR:\r\n styleClasses += ' kdr-grid-message-error text-danger'\r\n break\r\n case gridResponseCodes.INFO:\r\n default:\r\n styleClasses += ' kdr-grid-message-info text-info'\r\n break\r\n }\r\n\r\n $('', {\r\n id: messageLabelId,\r\n class: styleClasses,\r\n html: response.message,\r\n style: 'white-space: preserve-breaks;'\r\n }).prependTo(control)\r\n break\r\n case gridActResponseShowTypes.TOAST:\r\n\r\n switch (response.code) {\r\n case gridResponseCodes.SUCCESS:\r\n toastr.success(response.message)\r\n break\r\n case gridResponseCodes.WARNING:\r\n toastr.warning(response.message)\r\n break\r\n case gridResponseCodes.ERROR:\r\n toastr.error(response.message)\r\n break\r\n case gridResponseCodes.INFO:\r\n default:\r\n toastr.info(response.message)\r\n break\r\n }\r\n\r\n break\r\n case gridActResponseShowTypes.MODAL:\r\n default:\r\n let customValues = response.args[2]?.split(';') ?? []\r\n let customTitle\r\n let customHeaderClass = customValues[1]\r\n\r\n\r\n switch (response.code) {\r\n case gridResponseCodes.SUCCESS:\r\n customTitle = customValues[0] ?? \"~{Success}\"\r\n modal.getModal.default(customTitle, response.message, true, null, null, null, null, null, $loadingTarget)\r\n break\r\n case gridResponseCodes.WARNING:\r\n customTitle = customValues[0] ?? \"~{Warning}\"\r\n modal.getModal.warning(customTitle, response.message, true, null, null, null, null, null, $loadingTarget)\r\n break\r\n case gridResponseCodes.ERROR:\r\n customTitle = customValues[0] ?? \"~{Error}\"\r\n modal.getModal.danger(customTitle, response.message, true, null, null, null, null, null, $loadingTarget)\r\n break\r\n case gridResponseCodes.INFO:\r\n default:\r\n customTitle = customValues[0] ?? \"~{Info}\"\r\n modal.getModal.info(customTitle, response.message, true, null, null, null, null, null, $loadingTarget)\r\n break\r\n }\r\n break\r\n }\r\n\r\n isErrorShown = true\r\n }\r\n\r\n $(control).data('hasError', isErrorShown)\r\n controls.onGridAfterMagicError($(control), response.code, null, response.info, response.returnValue, isErrorShown); //fixme wstawic akcje z jakiegos piekla\r\n },\r\n onGridBeforeUIInit(grid) {\r\n grid.trigger({\r\n type: gridEvents.BEFORE_UI_INIT,\r\n })\r\n },\r\n onGridBeforeRender(grid, code, actionType, info = null, returnValue = null, isErrorShown) {\r\n grid.trigger({\r\n type: gridEvents.BEFORE_RENDER,\r\n code: code,\r\n actionType: actionType,\r\n info: info,\r\n returnValue: returnValue,\r\n isErrorShown: isErrorShown\r\n });\r\n },\r\n onGridAfterRender(grid, code, actionType) {\r\n grid.trigger({\r\n type: gridEvents.AFTER_RENDER,\r\n code: code,\r\n actionType: actionType\r\n });\r\n },\r\n onGridAfterUiInit($grid) {\r\n $grid.trigger({\r\n type: gridEvents.AFTER_UI_INIT,\r\n });\r\n },\r\n onGridAfterFilter(grid) {\r\n grid.trigger({\r\n type: gridEvents.AFTER_FILTER,\r\n });\r\n },\r\n onGridAfterRenderWInputs($grid) {\r\n $grid.trigger({\r\n type: gridEvents.AFTER_RENDER_W_INPUTS,\r\n });\r\n },\r\n onGridAfterMagicError($grid, code, actionType, info = null, returnValue = null, isErrorShown = false) {\r\n $grid.trigger({\r\n type: gridEvents.AFTER_MAGIC_ERROR,\r\n code: code,\r\n actionType: actionType,\r\n info: info,\r\n returnValue: returnValue,\r\n isErrorShown: isErrorShown\r\n });\r\n },\r\n onGridAfterCheckAllCheckboxes($grid, columnIndex, checkedP) {\r\n $grid.trigger({\r\n type: gridEvents.AFTER_CHECK_ALL_CHECKBOXES,\r\n columnIndex: columnIndex,\r\n checkedP: checkedP\r\n });\r\n },\r\n onControlBeforeRender($control, code, actionType, info = null) {\r\n $control.trigger({\r\n type: controlEvents.BEFORE_RENDER,\r\n code: code,\r\n actionType: actionType,\r\n info: info,\r\n });\r\n },\r\n onControlAfterRender($control, code, options) {\r\n $control.trigger({\r\n type: controlEvents.AFTER_RENDER,\r\n code: code,\r\n options: options\r\n });\r\n },\r\n onControlAfterUIInit($control, code) {\r\n $control.trigger({\r\n type: controlEvents.AFTER_UI_INIT,\r\n code: code,\r\n });\r\n },\r\n saveData(fileName, blob) {\r\n let a = document.createElement(\"a\")\r\n document.body.appendChild(a);\r\n $(a).css('display', 'none')\r\n\r\n\r\n if (window.navigator && window.navigator.msSaveOrOpenBlob) {\r\n navigator.msSaveBlob(blob, fileName);\r\n }\r\n else {\r\n let url = window.URL.createObjectURL(blob);\r\n a.href = url;\r\n a.download = fileName;\r\n a.click();\r\n window.URL.revokeObjectURL(url);\r\n }\r\n\r\n document.body.removeChild(a);\r\n },\r\n s2ab(s) {\r\n var buf = new ArrayBuffer(s.length);\r\n var view = new Uint8Array(buf);\r\n for (var i = 0; i != s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF;\r\n return buf;\r\n },\r\n fileControl: {\r\n refreshUI($input) {\r\n let $files = $($input.prop('files'))\r\n let filesCount = () => $files.length\r\n let $previousFiles = controls.fileControl.getFiles($input) //$($input.data('selectedFiles'))\r\n\r\n let $label = $('.kdr-grid-files-input-label[for=\"' + $input.prop('id') + '\"]')\r\n let $selectedFilesTable = $label.find('.selected-files-table')\r\n let $selectedFileTemplate = $selectedFilesTable.find('.selected-files-table-row-template')\r\n\r\n function setFiles($f) {\r\n controls.fileControl.setFiles($input, $f)\r\n }\r\n function setSelectedFilesType() {\r\n let type;\r\n if (filesCount() == 0) {\r\n type = 'none'\r\n } else if (filesCount() == 1) {\r\n type = 'single'\r\n } else {\r\n type = 'multiple'\r\n }\r\n\r\n $label.find('.selected-files, .selected-files-table').attr('type', type)\r\n }\r\n function setSelectedFilesSize() {\r\n let totalFilesSize = 0\r\n $($files).each((i, e) => {\r\n totalFilesSize += e.size\r\n });\r\n\r\n let userReadableSize = convert.bytesToUserReadableString(totalFilesSize)\r\n $label.find('.selected-files-size-value').text(userReadableSize)\r\n }\r\n\r\n function renderSelectedFile(file) {\r\n let $row = $($selectedFileTemplate.clone().detach())\r\n let splittedFileName = file.name.split('.')\r\n let fileExt = splittedFileName.pop()\r\n\r\n $row.find('.selected-file-name').text(splittedFileName.join(''))\r\n $row.find('.selected-file-ext').text(fileExt)\r\n $row.find('.selected-file-size').text(convert.bytesToUserReadableString(file.size))\r\n $row.removeClass('selected-files-table-row-template')\r\n\r\n $row.find('.selected-file-remove').on('click', () => {\r\n let $newListOfFiles = $files.filter(function (i, e) {\r\n return e.id != file.id;\r\n });\r\n\r\n setFiles($newListOfFiles)\r\n $files = $newListOfFiles\r\n\r\n setSelectedFilesSize()\r\n setSelectedFilesType()\r\n\r\n $row.remove()\r\n })\r\n\r\n $selectedFilesTable.append($row)\r\n }\r\n\r\n /* SEQUENTIAL ADDING FILES TO INPUT(PROVIDES MULTIPLE INPUT) */\r\n $files.each((i, e) => e.id = uid.getNew())\r\n if ($previousFiles) {\r\n $previousFiles.each(function (i) { $files.push($previousFiles[i]) })\r\n }\r\n setFiles($files)\r\n\r\n\r\n $selectedFilesTable.find('> *:not(.selected-files-table-row-template)').remove()\r\n\r\n $files.each((i, e) => {\r\n renderSelectedFile(e)\r\n });\r\n\r\n setSelectedFilesSize()\r\n setSelectedFilesType()\r\n },\r\n setFiles($input, $files) {\r\n const dataTransfer = new DataTransfer();\r\n\r\n $files.each((i, e) => dataTransfer.items.add(e))\r\n\r\n $input.data('selectedFiles', $files)\r\n\r\n },\r\n getFiles($input) {\r\n return $($input.data('selectedFiles'))\r\n }\r\n },\r\n getFiles(controlId) {\r\n let filesList = []\r\n let $filesInputs =\r\n $('#' + controlId + ' .kdr-grid-item-update.show .kdr-grid-files-input,' +\r\n '#' + controlId + ' .kdr-grid-item-update .kdr-grid-files-input,' +\r\n '#' + controlId + ' .kdr-grid-key-value .kdr-grid-item-update .kdr-grid-files-input,' +\r\n '#' + controlId + '.kdr-grid-flip .kdr-grid-files-input,' +\r\n '#copied-grid-edit-modal-' + controlId + '.kdr-grid-modal-item-update.show .kdr-grid-files-input,' +\r\n '#copied-grid-add-modal-' + controlId + '.kdr-grid-item-insert .kdr-grid-files-input')\r\n\r\n //take all files\r\n $filesInputs.each(function (index) {\r\n let $input = $filesInputs.eq(index)\r\n\r\n //let fl = $input.data('selectedFiles')\r\n //let fl = $input.prop('files')\r\n let fl = controls.fileControl.getFiles($input)// jak ktos to bedzie zmienial to niech powie dlaczego CL\r\n\r\n if (!fl) {\r\n fl = [];\r\n }\r\n\r\n for (let i = 0; i < fl.length; i++) {\r\n filesList.push({ index: $input.data('index'), file: fl[i] })\r\n }\r\n })\r\n\r\n return filesList\r\n },\r\n getMultipleFiles(controlId) {\r\n let filesList = []\r\n\r\n //take all files\r\n $('#' + controlId + ' .kdr-grid-item-update td').each(function () {\r\n let $td = $(this)\r\n $td.find('.kdr-grid-files-input').each(function () {\r\n let $input = $(this)\r\n //let fl = $input.prop('files')\r\n let fl = controls.fileControl.getFiles($input)// jak ktos to bedzie zmienial to niech powie dlaczego CL\r\n\r\n if (!fl) {\r\n fl = [];\r\n }\r\n\r\n for (let i = 0; i < fl.length; i++) {\r\n filesList.push({ row: $td.data('rowIndex'), index: $input.data('index'), file: fl[i] })\r\n }\r\n })\r\n })\r\n\r\n return filesList\r\n },\r\n appendFilesToFormData(formData, files, $control, checkForControlUploadLimit = true, multiMode = false) {\r\n if (files != undefined && files.length > 0) {\r\n let maxUploadSize = controls.getMaxUploadSize($control)\r\n let totalFilesSize = files.map((x, y) => x.file.size).reduce(function (p, c, i, a) {\r\n return p + c;\r\n });\r\n\r\n if (checkForControlUploadLimit === true && maxUploadSize != undefined && totalFilesSize > maxUploadSize) {\r\n let maxUploadUserReadable = convert.bytesToUserReadableString(maxUploadSize)\r\n modal.getModal.warning(\"~{Warning}\",\r\n `~{Limit for single upload of newly added files is: !{${maxUploadUserReadable}}}.\\n\\t~{Remove some new files and try again.}`)\r\n return false\r\n }\r\n\r\n for (let i = 0; i < files.length; i++) {\r\n formData.append(true == multiMode ? files[i].row + '|' + files[i].index : files[i].index, files[i].file, files[i].file.name)\r\n }\r\n }\r\n },\r\n /**\r\n * Displaying selected items by kdr-grid-files selector under the selector as kafle\r\n * @param {any} $input File input\r\n */\r\n renderSelectedItems($input) {\r\n let $this = $input\r\n let files = $this.prop('files')\r\n let $files = $(files)\r\n let isMultiple = $this.attr('multiple') ? true : false\r\n let $template = isMultiple\r\n ? $this.closest('.kdr-grid-files').find('.template .kdr-grid-files-file').clone().detach()\r\n : $this.closest('.kdr-grid-files').find('.template .kdr-grid-single-file').clone().detach()\r\n let readyTemplates = []\r\n let previousFiles = $this.data('selectedFiles')\r\n let allFiles = []\r\n let $progessBar = $this.closest('.kdr-grid-files').find('.kdr-grid-files-weight_bar')\r\n let maxFilesWeight = $progessBar.attr('aria-valuemax')\r\n let filesWeight = 0\r\n let displayfilesWeight = ''\r\n\r\n /*If signle mode ten remove files from view*/\r\n if (isMultiple == false) {\r\n $this.closest('.kdr-grid-files').find('.kdr-grid-files-list').html('')\r\n }\r\n\r\n /*RENDERING FILES*/\r\n $files.each(function (index) {\r\n let $thisTemplate = $template.clone()\r\n let $item = $files[index]\r\n let displayName = $item.name\r\n let displaySize = convert.bytesToUserReadableString($item.size)\r\n if (isMultiple && displayName.length > 30) {\r\n displayName = $item.name.substring(0, 30) + '...'\r\n }\r\n\r\n $item.id = uid.getNew()\r\n\r\n $thisTemplate.find('.file-name_label')[0].innerHTML = displayName\r\n if (isMultiple) {\r\n $thisTemplate.find('.file-size_label')[0].innerHTML = '(' + displaySize + ')'\r\n }\r\n $thisTemplate.find('.file-id').val($item.id)\r\n\r\n readyTemplates.push($thisTemplate)\r\n\r\n allFiles.push($item)\r\n })\r\n $this.closest('.kdr-grid-files').find('.kdr-grid-files-list').append(readyTemplates)\r\n\r\n /*SEQUENTIAL ADDING FILES TO INPUT(PROVIDES MULTIPLE INPUT)*/\r\n if (previousFiles) {\r\n $(previousFiles).each(function (index) { allFiles.push(previousFiles[index]) })\r\n }\r\n $this.data('selectedFiles', allFiles)\r\n\r\n /*SETTING PROGRESS OF FILES WEIGHT*/\r\n $(allFiles).each(function (index, element) {\r\n filesWeight += element.size\r\n })\r\n\r\n $this.closest('.kdr-grid-files').find('.kdr-grid-files-weight_info-value').text(convert.bytesToUserReadableString(filesWeight))\r\n\r\n let progressBarWidth = parseInt(((filesWeight / maxFilesWeight) * 100) + 0.5, 10)\r\n\r\n if (progressBarWidth > 100) {\r\n progressBarWidth = 100\r\n $progessBar.addClass('bg-danger')\r\n } else {\r\n $progessBar.removeClass('bg-danger')\r\n }\r\n\r\n $progessBar.css('width', progressBarWidth + '%')\r\n $this.val('')\r\n\r\n /*DISABLING/ENABLING INPUT*/\r\n //if (!isMultiple && allFiles.length >= 1) {\r\n // $this.attr('disabled', true)\r\n // $this.parent().attr('disabled', true)\r\n //} else {\r\n // $this.attr('disabled', false)\r\n // $this.parent().removeAttr('disabled', true)\r\n //}\r\n\r\n if (filesWeight > $this.attr('max-weight')) {\r\n let error = \"\"\r\n\r\n if (allFiles.length > 1) {\r\n error = \"Files size is too big.\"\r\n } else {\r\n error = \"File size is too big.\"\r\n }\r\n\r\n modal.getModal.danger(\"~{Error}\", r, true)\r\n }\r\n },\r\n /**\r\n * Returns $control from document \r\n * @param {any} controlId Grid ID\r\n * @param {any} $element Element in modal if grid is displaying in grid, \r\n * better base on control id if theres more then one grid on modal.\r\n */\r\n getControl(controlId = undefined, $element = undefined) {\r\n if (controlId != undefined && controlId != null && controlId.length > 0) {\r\n return $('#' + controlId)\r\n } else if ($element != undefined && $element != null) {\r\n\r\n let $g = $element.closest('.kdr-grid')\r\n let $modal = $element.closest('.modal')\r\n\r\n //let $grid = $element.closest('.modal').find('.kdr-grid') //to jest straszne\r\n\r\n if ($g.length > 0) {\r\n return $g\r\n }\r\n else if ($modal.length > 0) {\r\n return $modal.find('.kdr-grid') //to jest okropne\r\n } else {\r\n throw 'controls.getControl - Cannot find grid.'\r\n }\r\n } else {\r\n throw 'controls.getControl - You need to pass at least one selector.'\r\n }\r\n },\r\n organizeElementListsInTinyMCE($content) {\r\n let $clonedContent = $content.clone()\r\n let $elementsList = $clonedContent.find('.marker-section')\r\n if ($elementsList.length > 0) {\r\n for (var i = 0; i < $elementsList.length; i++) {\r\n let $element = $elementsList.eq(i)\r\n let isOdd = i & 1\r\n $element.addClass(isOdd ? \"marker-section-stop\" : \"marker-section-start\")\r\n $element.removeClass(!isOdd ? \"marker-section-stop\" : \"marker-section-start\")\r\n }\r\n\r\n let htmlContent = $('
').append($clonedContent).prop('innerHTML')\r\n return htmlContent\r\n } else\r\n return null\r\n },\r\n organizeElementListsInTinyMCE($content) {\r\n let $clonedContent = $content.clone()\r\n let $elementsList = $clonedContent.find('.marker-section')\r\n if ($elementsList.length > 0) {\r\n for (var i = 0; i < $elementsList.length; i++) {\r\n let $element = $elementsList.eq(i)\r\n let isOdd = i & 1\r\n $element.addClass(isOdd ? \"marker-section-stop\" : \"marker-section-start\")\r\n $element.removeClass(!isOdd ? \"marker-section-stop\" : \"marker-section-start\")\r\n }\r\n\r\n let htmlContent = $('
').append($clonedContent).prop('innerHTML')\r\n return htmlContent\r\n } else\r\n return null\r\n },\r\n prepareTinyMCE(control) {\r\n let $control = $(control)\r\n\r\n\r\n $control.find('[id*=\"kdr-grid-editor\"]').each(function (i, e) {\r\n let $editor = $(e)\r\n let id = $editor.prop('id')\r\n let isHideToolbar = $editor.hasClass('tinymce-hide-toolbar')\r\n let isSmollStartHeight = $editor.hasClass('tinymce-smoll-height')\r\n let arePrimitiveMenuOptions = $editor.hasClass('tinymce-primitive-toolbar')\r\n\r\n let height = isHideToolbar\r\n ? parseInt($editor.css('line-height')) + parseInt($editor.css('font-size'))\r\n : isSmollStartHeight\r\n ? '8rem'\r\n : Math.round(window.outerHeight * 0.35)\r\n\r\n if (height == 0) {\r\n height = 400\r\n }\r\n\r\n let additionalCss = isHideToolbar ? `body { min-height: ${height}; max-height: ${height}; overflow-y: hidden}`\r\n /*: arePrimitiveMenuOptions ? `:root {font-size: ${thisFontSize} !important; }`*/\r\n : '';\r\n\r\n additionalCss += 'html body {min-height: auto; overflow: auto !important;}'\r\n\r\n let isPDFEditor = $editor.hasClass('tinymce-pdf')\r\n let variablePlugins = isPDFEditor ? 'ruler' : ''\r\n\r\n let thisFontSize = Math.round($editor.css('font-size').replace('px', '')) /*+ 1*/ /*+ 'px'*/\r\n let fontSizesNumbers = [4, 6, 8, 10, 12, 14, 16, 18, 24, 36, thisFontSize]\r\n fontSizesNumbers = arrayHelper.unique(fontSizesNumbers)\r\n fontSizesNumbers = arrayHelper.sortNumbers(fontSizesNumbers)\r\n\r\n let fontSizes = isHideToolbar ? thisFontSize + 'px' : fontSizesNumbers.map(x => x + (isPDFEditor ? 'pt' : 'px')).join(' ')\r\n\r\n tinyMCE.execCommand(\"mceRemoveEditor\", true, id)\r\n\r\n let $content = $($.parseHTML($editor.valExtended()))\r\n let htmlContent = controls.organizeElementListsInTinyMCE($content)\r\n if (htmlContent != null) {\r\n $editor.val(htmlContent)\r\n }\r\n\r\n tinymce.init({\r\n menubar: !(isHideToolbar || arePrimitiveMenuOptions),\r\n statusbar: false,\r\n selector: '#' + id,\r\n paste_data_images: true,\r\n paste_as_text: false,\r\n height: height,\r\n body_class: `editor-content dropzone ${isHideToolbar ? 'goddamn' : ''}`,\r\n plugins: [\r\n 'advlist autolink lists link image charmap print preview anchor',\r\n 'searchreplace visualblocks code noneditable',\r\n 'insertdatetime media table paste emoticons media',\r\n variablePlugins\r\n ],\r\n ruler: isPDFEditor,\r\n relative_urls: false,\r\n remove_script_host: false,\r\n convert_urls: false,\r\n toolbar: isHideToolbar\r\n ? false : arePrimitiveMenuOptions\r\n ? `forecolor backcolor | fontsizeselect | bold italic underline strikethrough | bullist numlist | code`\r\n : `insertfile undo redo | fontsizeselect | fontselect\r\n | styleselect | forecolor backcolor | bold italic\r\n | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent\r\n | link image | media ${isPDFEditor ? '| ruler' : ''}`,\r\n forced_root_block: '',\r\n content_css: [\r\n __root + 'core/css/core.min.css?v=' + uid.getNew(),\r\n __root + 'app/css/site.min.css?v=' + uid.getNew(),\r\n __root + `app/css/theme.${__themeName}.css?v=` + uid.getNew(),\r\n ],\r\n content_style: `${additionalCss} body {font-family: ${$('body').css('font-family')}; font-size: ${thisFontSize}${isPDFEditor ? 'pt' : 'px'}; }`,\r\n fontsize_formats: fontSizes,\r\n extended_valid_elements: 'marker,b/strong,i/em',\r\n force_p_newlines: false,\r\n file_picker_types: 'image',\r\n automatic_uploads: true,\r\n file_picker_callback: function (cb, value, meta) {\r\n var input = document.createElement('input');\r\n input.setAttribute('type', 'file');\r\n input.setAttribute('accept', 'image/*');\r\n\r\n input.onchange = function () {\r\n var file = this.files[0];\r\n\r\n var reader = new FileReader();\r\n reader.onload = function () {\r\n var id = 'blobid' + (new Date()).getTime();\r\n var blobCache = tinyMCE.activeEditor.editorUpload.blobCache;\r\n var base64 = reader.result.split(',')[1];\r\n var blobInfo = blobCache.create(id, file, base64);\r\n blobCache.add(blobInfo);\r\n\r\n cb(blobInfo.blobUri(), { title: file.name });\r\n };\r\n reader.readAsDataURL(file);\r\n };\r\n\r\n input.click();\r\n },\r\n\r\n entity_encoding: \"raw\",\r\n // Tells Tinymce to treat any content with [] around it as noneditable\r\n noneditable_regexp: [/\\[[^\\[\\]]*\\]/g],\r\n paste_preprocess: function (plugin, args) {\r\n var clipboardData = args.content;\r\n\r\n // Sprawdzanie, czy wklejane dane są linkiem\r\n if (/^https?:\\/\\/\\S+$/.test(clipboardData)) {\r\n // Jeśli dane to link, wstaw go jako aktywny link HTML\r\n args.content = '' + clipboardData + '';\r\n }\r\n },\r\n setup: function (editor) {\r\n var $ = tinymce.dom.DomQuery;\r\n var nonEditableClass = editor.getParam('noneditable_noneditable_class', 'mceNonEditable');\r\n // Register a event before certain commands run that will turn contenteditable off temporarilly on noneditable fields\r\n editor.on('BeforeExecCommand', function (e) {\r\n // The commands we want to permit formatting noneditable items for\r\n var textFormatCommands = [\r\n 'mceToggleFormat',\r\n 'mceApplyTextcolor',\r\n 'mceRemoveTextcolor',\r\n ];\r\n if (textFormatCommands.indexOf(e.command) !== -1) {\r\n $(editor.getBody()).find('.' + nonEditableClass).attr('contenteditable', null);\r\n }\r\n });\r\n editor.on('ExecCommand', function (e) {\r\n if (e.command != 'mceRulerRecalculate') {\r\n\r\n let $currentBody = $(editor.getBody())\r\n\r\n $currentBody.find('.' + nonEditableClass).attr('contenteditable', false);\r\n let htmlContent = controls.organizeElementListsInTinyMCE($currentBody)\r\n if (htmlContent != null) {\r\n editor.setContent(htmlContent)\r\n }\r\n }\r\n });\r\n let args = [];\r\n let lang = $editor.closest('.tiny-mce-container').data('language')\r\n let editorIndex = $editor.data('index')\r\n editor.on('input change', function () {\r\n controls.getArgs([$editor], args)\r\n let v = lang == undefined ? args[editorIndex] : args[editorIndex][lang]\r\n $editor.val(v).trigger('input')\r\n })\r\n },\r\n init_instance_callback: function (editor) {\r\n /* \r\n The following two hacks fix some weirdness with the way the textcolor\r\n plugin works - namely, it was attemping to apply color and background-color\r\n directly on the element that had the noneditable css class on it instead of putting\r\n a span around it as underline does.\r\n */\r\n editor.formatter.get('forecolor')[0].exact = true;\r\n editor.formatter.get('hilitecolor')[0].exact = true;\r\n }\r\n })\r\n $(document).off('focusin.modal')\r\n })\r\n },\r\n getInputs($control) {\r\n if ($control.hasClass('kdr-frax-self-existing')) {\r\n return $control.find('.kdr-frax--tree')\r\n } else if ($control.hasClass('kdr-filters-tabs')) {\r\n return $control.find('a.active')\r\n } else if ($control.hasClass(\"kdr-kanban\") || $control.hasClass('kdr-frax-folder')) {\r\n return $control\r\n } else {\r\n return $control.find(\".kdr-filters-input\")\r\n }\r\n },\r\n getCommands($control) {\r\n return JSON.parse($control.find('.kdr-commands').eq(0).val())\r\n },\r\n getEndpoint($control) {\r\n if ($control.hasClass(\"kdr-filters\")) {\r\n return 'Filters/Render';\r\n } else if ($control.hasClass(\"kdr-frax\") || $control.hasClass(\"kdr-frax-folder\")) {\r\n return 'Frax/Render';\r\n } else if ($control.hasClass(\"kdr-filters-tabs\")) {\r\n return 'Filters/RenderTabs';\r\n } else if ($control.hasClass(\"kdr-matrix\")) {\r\n return 'kdr-matrix';\r\n } else if ($control.hasClass(\"kdr-kanban\")) {\r\n return 'Kanban/Render';\r\n } else if ($control.hasClass(\"kdr-incell\")) {\r\n return 'InCell/Render';\r\n } else if ($control.hasClass(\"kdr-tile-selection\")) {\r\n return 'TileSelectionList/Render';\r\n } else if ($control.hasClass(\"kdr-fancy-tile\")) {\r\n return 'FancyTile/Render';\r\n } else {\r\n return 'Grid/Render';\r\n }\r\n },\r\n relationActions: {\r\n 0: function (command, callback) {\r\n if (callback != null) {\r\n callback()\r\n }\r\n },\r\n 1: function (command, callback) {\r\n let $target = $('#' + command.Target)\r\n //let endpoint = $target.hasClass(\"kdr-filters\") ? 'Filters/Render' : 'Grid/Render'; //fixme do metody jakies\r\n let endpoint = controls.getEndpoint($target);\r\n\r\n //Plomba cygana burego\r\n if (endpoint == 'kdr-matrix') { //no nie wiem troche plomba ale z zdrugiej strony matrycy nie mozna po prostu zrobic render wiec taki mały kompromis chlip chlip. czyli mamy czeski remis kiedy turek próbuje okrasc cygana niby z czego?\r\n $target.trigger({\r\n type: \"MATRIX_UPDATE\",\r\n clearLeftFiltersP: true\r\n });\r\n } else {\r\n controls.render(endpoint, $target, controls.getInfo($target), undefined, callback)\r\n }\r\n },\r\n 2: function (command, callback) {\r\n let $filter = $('#' + command.Source)\r\n let $target = $('#' + command.Target)\r\n let $t = [] //$.merge($filter, $target)\r\n\r\n\r\n function addLoadingElement($element) {\r\n let $elementToAdd = null\r\n\r\n if ($element.closest('.modal-content').length > 0) {\r\n $elementToAdd = $element.closest('.modal-content')\r\n }\r\n else if ($element.closest('.tilemenu-row').length > 0) {\r\n $elementToAdd = $element.closest('.tilemenu-row')\r\n } else {\r\n $elementToAdd = $element\r\n }\r\n\r\n $t = $.merge($t, $elementToAdd)\r\n }\r\n\r\n addLoadingElement($filter)\r\n addLoadingElement($target)\r\n $t = $.unique($t)\r\n\r\n //let inputs = $filter.find(\".kdr-filters-input\")\r\n let inputs = controls.getInputs($filter)\r\n let args = {}\r\n controls.getArgs(inputs, args)\r\n\r\n $.ajax({\r\n type: \"POST\",\r\n url: __root + \"Filters/Change\",\r\n datatype: \"json\",\r\n traditional: true,\r\n data: {\r\n \"info\": controls.getInfo($filter),\r\n \"args\": JSON.stringify(args)\r\n },\r\n success: function (response) {\r\n controls.setInfo($filter, response.info)\r\n\r\n $.ajax({\r\n type: \"POST\",\r\n url: __root + \"Filters/AdvancedFilter\",\r\n datatype: \"json\",\r\n traditional: true,\r\n data: {\r\n \"control\": controls.getInfo($target), // $target.find(\".kdr-info\").val(),\r\n \"filters\": controls.getInfo($filter), // $filter.find(\".kdr-info\").val(),\r\n \"args\": JSON.stringify(args)\r\n },\r\n success: function (response) {\r\n controls.setInfo($target, response.info)\r\n controls.onGridAfterFilter($target)\r\n\r\n if (callback != null) {\r\n callback()\r\n }\r\n },\r\n beforeSend: function () {\r\n loading.show($t)\r\n },\r\n complete: function () {\r\n loading.hide($t)\r\n }\r\n })\r\n },\r\n beforeSend: function () {\r\n loading.show($t)\r\n },\r\n complete: function () {\r\n loading.hide($t)\r\n }\r\n })\r\n },\r\n 4: function (command, callback) {\r\n let $target = $('#' + command.Target)\r\n let endpoint = controls.getEndpoint($target);\r\n\r\n controls.renderWithInputs(endpoint, $target, controls.getInfo($target), undefined, callback)\r\n },\r\n },\r\n parseCommands(commands) {\r\n\r\n let command = commands[0]\r\n if (command == undefined) {\r\n return;\r\n }\r\n\r\n $('#' + command.Source).trigger(controlEvents.BEFORE_PARSE_COMMAND)\r\n\r\n //console.log(`Starting action: ${command.Action}:\\r\\nTarget: ${command.Target}`)\r\n controls.relationActions[command.Action](command, function () {\r\n //console.log(`Ended action: ${command.Action}:\\r\\nTarget: ${command.Target}`)\r\n let cmds = commands.slice(1);\r\n controls.parseCommands(cmds)\r\n })\r\n\r\n },\r\n invokeCommands($control) {\r\n let commands = controls.getCommands($control)\r\n\r\n controls.parseCommands(commands)\r\n },\r\n legacyFilter($control, $filter, args) {\r\n\r\n $.ajax({\r\n type: \"POST\",\r\n url: __root + \"Filters/Filter\",\r\n datatype: \"json\",\r\n traditional: true,\r\n data: {\r\n \"control\": controls.getInfo($control),\r\n \"filters\": controls.getInfo($filter),\r\n \"args\": JSON.stringify(args)\r\n },\r\n success: function (response) {\r\n controls.magic(\"Grid/Render\", $control, response)\r\n },\r\n beforeSend: function () {\r\n loading.show($controls)\r\n },\r\n complete: function () {\r\n loading.hide($control)\r\n }\r\n })\r\n },\r\n tabFilter($that) {\r\n let $tabs = $that.closest(\".kdr-filters-tabs\")\r\n\r\n controls.invokeCommands($tabs)\r\n\r\n let inputs = controls.getInputs($tabs)\r\n let $loadingTarget = $that.closest('.tilemenu-row')\r\n\r\n if (0 === $loadingTarget.length) {\r\n $loadingTarget = $tabs\r\n }\r\n\r\n controls.filtersChange($tabs, (r) => controls.magic(\"Filters/RenderTabs\", $tabs, r, $loadingTarget))\r\n },\r\n filter($that) {\r\n let $filters = $that.closest(\".kdr-filters\")\r\n //$filters = $that.closest(\".kdr-filters\")\r\n\r\n controls.filtersChange($filters, (response) => {\r\n let filtersId = '#' + $filters.prop('id')\r\n $(document).one(gridEvents.AFTER_RENDER, filtersId, function () {\r\n controls.invokeCommands($filters)\r\n })\r\n\r\n controls.magic(\"Filters/Render\", $filters, response)\r\n })\r\n },\r\n filterKanban($that, showLoadingOnInitiator = false) {\r\n let $filters = $that.closest(\".kdr-kanban\")\r\n let scrollX = $('.kdr-kanban-content')[0].scrollTop\r\n let scrollY = $('.kdr-kanban-content')[0].scrollLeft\r\n\r\n controls.filtersChange($filters, (response) => {\r\n\r\n controls.getInfo($filters)\r\n controls.setInfo($filters, response.info)\r\n\r\n $filters.trigger('kanban-end-rendered')\r\n })\r\n },\r\n filtersClick() {\r\n let $filters = $('#project-filters')\r\n\r\n if ($filters.length > 0) {\r\n controls.refresh($filters)\r\n let $filterBtn = $('#project-filters').find('.kdr-filters-btn').click()\r\n }\r\n },\r\n filtersChange($filtersContainer, callbackOnSuccess, $loadingTarget) {\r\n\r\n if ($filtersContainer.hasClass('kdr-filters') === false &&\r\n $filtersContainer.hasClass('kdr-filters-tabs') === false &&\r\n $filtersContainer.hasClass('kdr-frax') === false &&\r\n $filtersContainer.hasClass('kdr-frax-folder') === false &&\r\n $filtersContainer.hasClass('kdr-kanban') === false) {\r\n $filtersContainer = $filtersContainer.closest(\".kdr-filters\")\r\n }\r\n\r\n if ($loadingTarget == undefined) {\r\n $loadingTarget = $filtersContainer\r\n }\r\n\r\n let inputs = controls.getInputs($filtersContainer)\r\n let args = {}\r\n controls.getArgs(inputs, args)\r\n\r\n $.ajax({\r\n type: \"POST\",\r\n url: __root + \"Filters/Change\",\r\n datatype: \"json\",\r\n traditional: true,\r\n data: {\r\n \"info\": controls.getInfo($filtersContainer),\r\n \"args\": JSON.stringify(args)\r\n },\r\n success: function (response) {\r\n callbackOnSuccess && callbackOnSuccess(response)\r\n },\r\n beforeSend: function () {\r\n loading.show($loadingTarget)\r\n },\r\n complete: function () {\r\n loading.hide($loadingTarget)\r\n }\r\n })\r\n },\r\n clear($this) {\r\n let $filters = $this.closest(\".kdr-filters\")\r\n\r\n\r\n let info = controls.getInfo($filters)//$filters.find(\".kdr-info\").val()\r\n\r\n $.ajax({\r\n type: \"POST\",\r\n url: __root + \"Filters/Render\",\r\n datatype: \"json\",\r\n traditional: true,\r\n data: {\r\n \"info\": info,\r\n \"clearP\": true\r\n },\r\n success: function (response) {\r\n let $r = $(response)\r\n $filters.replaceWith($r)\r\n //let inputs = $r.find(\".kdr-filters-input\")\r\n\r\n let id = \"#\" + $r.attr(\"data-control-id\")\r\n if (id != '#') {\r\n let control = $(id)\r\n let inputs = controls.getInputs($r)\r\n let args = {}\r\n controls.getArgs(inputs, args)\r\n\r\n $.ajax({\r\n type: \"POST\",\r\n url: __root + \"Filters/Filter\",\r\n datatype: \"json\",\r\n traditional: true,\r\n data: {\r\n \"control\": controls.getInfo(control),// control.find(\".kdr-info\").val(),\r\n \"filters\": controls.getInfo($r),// $r.find(\".kdr-info\").val(),\r\n \"args\": JSON.stringify(args)\r\n },\r\n success: function (response) {\r\n controls.magic(\"Grid/Render\", control, response, $filters)\r\n }\r\n })\r\n } else {\r\n controls.invokeCommands($r)\r\n }\r\n },\r\n beforeSend: function () {\r\n loading.show($filters)\r\n },\r\n complete: function () {\r\n loading.hide($filters)\r\n },\r\n })\r\n },\r\n parseDownloadFileResponse(response, textStatus, request, getMimeTypeFromRequestP = true, previewP) {\r\n let mimeType = getMimeTypeFromRequestP ? (request.getResponseHeader('content-type') ?? 'application/octetstream') : 'application/octetstream'\r\n\r\n let blob = new Blob([response], { type: mimeType });\r\n let fileName = request.getResponseHeader('Content-Disposition').match(`filename=(.*);`)[1].replace(`\"`, '').replace(`\"`, '');\r\n let url = window.URL || window.webkitURL;\r\n\r\n var a = $(\"\");\r\n if (previewP) {\r\n a.attr(\"target\", \"_blank\")\r\n }\r\n else {\r\n a.attr(\"download\", fileName);\r\n }\r\n a.attr(\"href\", url.createObjectURL(blob));\r\n $(\"body\").append(a);\r\n a[0].click();\r\n /*$(\"body\").remove(a);*/\r\n },\r\n downloadGridFile(info, magic, columnIndex, itemIndex, $loadingTarget = null, previewP) {\r\n $.ajax({\r\n type: \"POST\",\r\n url: window.location.origin + __root + 'Grid/GridDownLoadFile',\r\n xhr: function () {\r\n var xhr = new XMLHttpRequest();\r\n xhr.onreadystatechange = function () {\r\n if (xhr.readyState == 2) {\r\n if (xhr.status == 500) {\r\n xhr.responseType = \"text\";\r\n } else {\r\n xhr.responseType = \"blob\";\r\n }\r\n }\r\n };\r\n return xhr;\r\n },\r\n traditional: true,\r\n data: {\r\n info: info,\r\n magic: magic,\r\n columnIndex: columnIndex,\r\n itemIndex: itemIndex,\r\n },\r\n success: function (response, textStatus, request) {\r\n controls.parseDownloadFileResponse(response, textStatus, request, true, previewP)\r\n },\r\n error: function (response) {\r\n if (3 == response.responseJSON.code) {\r\n modal.getModal.danger(\"~{Error}\", response.responseJSON.message, true, null, null, null, null, null, $loadingTarget)\r\n } else {\r\n modal.getModal.danger(response.responseJSON.status, response.statusText, true)\r\n }\r\n },\r\n beforeSend: () => $loadingTarget && loading.show($loadingTarget),\r\n complete: () => $loadingTarget && loading.hide($loadingTarget)\r\n })\r\n },\r\n getLinkGridFile(info, magic, columnIndex, itemIndex, $loadingTarget = null, callback) {\r\n $.ajax({\r\n type: \"POST\",\r\n url: __root + \"Grid/GridGetLinkFile\",\r\n datatype: \"json\",\r\n traditional: true,\r\n data: {\r\n info: info,\r\n magic: magic,\r\n columnIndex: columnIndex,\r\n itemIndex: itemIndex,\r\n },\r\n success: function (response) {\r\n if (response.code == gridResponseCodes.SUCCESS) {\r\n callback && callback(response.message)\r\n }\r\n else {\r\n modal.getModal.danger(\"~{Error}\", response.message, true)\r\n }\r\n },\r\n beforeSend: function () { loading.show($loadingTarget) },\r\n complete: function () { loading.hide($loadingTarget) }\r\n })\r\n },\r\n downloadGridAllFiles(info, magic, columnIndex, $loadingTarget = null) {\r\n $.ajax({\r\n type: \"POST\",\r\n url: window.location.origin + __root + 'Grid/GridDownLoadAllFiles',\r\n xhr: function () {\r\n var xhr = new XMLHttpRequest();\r\n xhr.onreadystatechange = function () {\r\n if (xhr.readyState == 2) {\r\n if (xhr.status == 500) {\r\n xhr.responseType = \"text\";\r\n } else {\r\n xhr.responseType = \"blob\";\r\n }\r\n }\r\n };\r\n return xhr;\r\n },\r\n traditional: true,\r\n data: {\r\n info: info,\r\n magic: magic,\r\n columnIndex: columnIndex,\r\n },\r\n success: function (response, textStatus, request) {\r\n controls.parseDownloadFileResponse(response, textStatus, request, false)\r\n },\r\n error: function (response) {\r\n if (3 == response.responseJSON.code) {\r\n modal.getModal.danger(\"~{Error}\", response.responseJSON.message, true, null, null, null, null, null, $loadingTarget)\r\n } else {\r\n modal.getModal.danger(response.responseJSON.status, response.statusText, true)\r\n }\r\n },\r\n beforeSend: () => $loadingTarget && loading.show($loadingTarget),\r\n complete: () => $loadingTarget && loading.hide($loadingTarget)\r\n })\r\n },\r\n recalculateGridTableHeaderOffets($grid) {\r\n $grid.find('thead tr').each((i, e) => {\r\n let topMenuHeight = 0\r\n let prevsHeight = 0\r\n\r\n $(e).prevUntil().each((x, d) => prevsHeight += $(d).outerHeight(true))\r\n\r\n if ($grid.closest('.modal').length != 0 || $grid.find('.kdr-grid-scroll-horizontal').length != 0 || $grid.hasClass('kdr-grid-fullscreen')) {\r\n topMenuHeight == 0\r\n }\r\n else {\r\n $('.content-header > :not([id^=\"info\"])').each((x, d) => topMenuHeight += $(d).outerHeight())\r\n }\r\n\r\n let totalHeight = prevsHeight + topMenuHeight\r\n $(e).find('th').css('top', totalHeight)\r\n })\r\n },\r\n /**\r\n * \r\n * @param {any} $grid target control\r\n * @param {any} callback without argument\r\n */\r\n lockCheckboxes($grid, callback) {\r\n let payload\r\n if ($grid.hasClass('kdr-grid-modal')) {\r\n payload = $grid.find(\".kdr-grid-item-select .kdr-grid-checkbox-list\").map((a, b) => { return { columnIndex: $(b).data(\"index\"), state: $(b).valExtended(), magic: $(b).data(\"action\") } })\r\n } else if ($grid.find('.kdr-grid-item-update .kdr-grid-checkbox-list').length > 0) {\r\n payload = $grid.find(\".kdr-grid-item-update .kdr-grid-checkbox-list\").map((a, b) => { return { columnIndex: $(b).data(\"index\"), state: $(b).valExtended(), magic: $(b).closest(\"tr\").find(\".kdr-grid-checkbox-list-action\").data(\"action\") } })\r\n } else {\r\n ///grid bez updata ale z checkboxami\r\n payload = $grid.find(\".kdr-grid-item-select .kdr-grid-checkbox-list\").map((a, b) => { return { columnIndex: $(b).data(\"index\"), state: $(b).valExtended(), magic: $(b).closest(\"tr\").find(\".kdr-grid-checkbox-list-action\").data(\"action\") } })\r\n }\r\n\r\n\r\n let formData = new FormData();\r\n formData.append('info', controls.getInfo($grid))\r\n formData.append('payload', JSON.stringify(payload.toArray()))\r\n\r\n $.ajax({\r\n type: \"POST\",\r\n url: __root + \"Grid/LockCheckboxes\",\r\n datatype: \"json\",\r\n traditional: true,\r\n contentType: false,\r\n processData: false,\r\n data: formData,\r\n success: function (response) {\r\n if (response.code == gridResponseCodes.SUCCESS) {\r\n controls.setInfo($grid, response.info)\r\n callback && callback()\r\n }\r\n else {\r\n modal.getModal.danger(\"~{Error}\", response.message, true)\r\n }\r\n }//,\r\n //beforeSend: function () { showLoading() },\r\n //complete: function () { loading.hide($loadingTarget) }\r\n })\r\n },\r\n toggleCheckboxFilter($grid, selectedCheckboxColumnMagic, callback) {\r\n $.ajax({\r\n type: \"POST\",\r\n url: window.location.origin + __root + 'Grid/ToggleCheckboxFilter',\r\n datatype: \"json\",\r\n traditional: true,\r\n data: {\r\n info: controls.getInfo($grid),\r\n columnMagic: selectedCheckboxColumnMagic\r\n },\r\n success: function (response) {\r\n if (3 != response.code) {\r\n controls.setInfo($grid, response.info)\r\n callback && callback()\r\n } else {\r\n modal.getModal.danger(\"~{Error}\", response.message, true)\r\n }\r\n },\r\n })\r\n },\r\n toggleGridFullscreen($grid) {\r\n function _findRelativeParents($item, parents = []) {\r\n let $p = $item.parent()\r\n\r\n if ($p.is('body')) {\r\n return parents;\r\n } else {\r\n if ($p.css('position') == 'relative') {\r\n parents.push($p)\r\n }\r\n return $(_findRelativeParents($p, parents))\r\n }\r\n }\r\n let $btn = $grid.find('.kdr-grid-toggle-fullscreen')\r\n let currentState = $btn.data('state')\r\n\r\n $.ajax({\r\n type: \"POST\",\r\n url: __root + 'Grid/ToggleGridFullscreen',\r\n datatype: \"json\",\r\n traditional: true,\r\n data: {\r\n \"info\": controls.getInfo($grid),\r\n \"stateP\": currentState,\r\n },\r\n success: function (response) {\r\n if (response.code == gridResponseCodes.SUCCESS) {\r\n let newState = response.args[0]\r\n controls.setInfo($grid, response.info)\r\n\r\n $btn.data('state', newState)\r\n $grid.toggleClass('kdr-grid-fullscreen')\r\n $grid.find('.kdr-grid-content').toggleClass('kdr-grid-scroll-horizontal')\r\n $btn.find('.maximize-container, .minimize-container').toggle()\r\n\r\n let isMaximizing = newState\r\n let $b = $('body')\r\n let bStyles = $b.attr('style')?.split(';') ?? []\r\n let style = 'overflow: clip !important'\r\n\r\n if (JSON.parse(isMaximizing.toLowerCase())) {\r\n let $firstLineParent = $grid.parent()\r\n $('
')\r\n .data('gridFirstLineParent', $firstLineParent)\r\n .addClass('kdr-grid-fullscreen-container')\r\n .css('top', window.scrollY)\r\n .css('z-index', modal.getFirstHighestUsableZIndex())\r\n .data('DOMItemIndex', $grid.index())\r\n .append($grid)\r\n .appendTo($b)\r\n\r\n bStyles.push(style)\r\n\r\n } else if ($grid.closest('.kdr-grid-fullscreen-container').length > 0 && JSON.parse(isMaximizing.toLowerCase()) == false) {\r\n let $containerParent = $grid.closest('.kdr-grid-fullscreen-container')\r\n let $primaryParent = $containerParent.data('gridFirstLineParent')\r\n\r\n $grid.appendToWithIndex($primaryParent, $containerParent.data('DOMItemIndex'))\r\n $containerParent.remove()\r\n\r\n bStyles.pop(style)\r\n }\r\n\r\n $b.attr('style', bStyles.join(';'))\r\n\r\n controls.recalculateGridTableHeaderOffets($grid)\r\n } else {\r\n toastr[toastrTypes[response.code]](response.message)\r\n }\r\n },\r\n beforeSend: function () {\r\n loading.show($grid)\r\n },\r\n complete: () => {\r\n loading.hide($grid)\r\n }\r\n })\r\n },\r\n initTableColumnResizer($headers, resizedCallback) {\r\n function _createResizableColumn(header, resizer) {\r\n // Track the current position of mouse\r\n let x = 0;\r\n let w = 0;\r\n\r\n\r\n let previousWidth;\r\n\r\n const saveChanges = function () {\r\n if (previousWidth !== parseInt($(header).css('width'))) {\r\n resizedCallback && resizedCallback(header)\r\n }\r\n }\r\n\r\n const mouseDownHandler = function (e) {\r\n // Get the current mouse position\r\n x = e.clientX;\r\n\r\n // Calculate the current width of column\r\n const styles = window.getComputedStyle(header);\r\n w = parseInt(styles.width, 10);\r\n previousWidth = w\r\n\r\n // Attach listeners for document's events\r\n document.addEventListener('mousemove', mouseMoveHandler);\r\n document.addEventListener('mouseup', mouseUpHandler);\r\n };\r\n\r\n const mouseMoveHandler = function (e) {\r\n // Determine how far the mouse has been moved\r\n const dx = e.clientX - x;\r\n let widthToSet = `${w + dx}px`\r\n\r\n // Update the width of column\r\n $(header).css('width', widthToSet)\r\n $(header).css('min-width', widthToSet)\r\n };\r\n\r\n // Reset width on double click\r\n const dblMouseClick = function (e) {\r\n $(header).css('width', '')\r\n $(header).css('min-width', '')\r\n previousWidth = -1\r\n saveChanges()\r\n }\r\n\r\n\r\n\r\n // When user releases the mouse, remove the existing event listeners\r\n const mouseUpHandler = function () {\r\n document.removeEventListener('mousemove', mouseMoveHandler);\r\n document.removeEventListener('mouseup', mouseUpHandler);\r\n saveChanges()\r\n };\r\n\r\n resizer.addEventListener('mousedown', mouseDownHandler);\r\n resizer.addEventListener('dblclick', dblMouseClick);\r\n }\r\n $headers.each((i, e) => {\r\n const resizer = document.createElement('div');\r\n resizer.classList.add('resizer');\r\n $(e).append(resizer)\r\n _createResizableColumn(e, resizer);\r\n })\r\n },\r\n grid: {\r\n initUI($grid) {\r\n let $gridTable = $grid.find('.table.kdr-grid-table, .table.kdr-grid-modal')\r\n loading.show($grid)\r\n\r\n controls.onGridBeforeUIInit($grid)\r\n\r\n let $gridScrollContainer = $grid.find('.kdr-grid-scroll-horizontal')\r\n let mcCount = $grid.find('.kdr-grid-input-tinymc-wrapper').length\r\n if (mcCount > 0 && !$grid.hasClass('kdr-grid-modal')) {\r\n controls.prepareTinyMCE($grid)\r\n //console.log('test')\r\n }\r\n\r\n let $tinymceContentViews = $grid.find('.kdr-tinymce-content-view')\r\n if ($tinymceContentViews.length > 0) {\r\n for (var i = 0; i < $tinymceContentViews.length; i++) {\r\n let $view = $tinymceContentViews.eq(i)\r\n let $innerHtml = $($.parseHTML($view.prop('innerHTML')))\r\n let orgranizedHTML = controls.organizeElementListsInTinyMCE($innerHtml)\r\n if (orgranizedHTML != null) {\r\n $view.html($.parseHTML(orgranizedHTML))\r\n }\r\n }\r\n }\r\n\r\n tristateCheckbox.init($grid)\r\n pickers.init($grid)\r\n\r\n $grid.find(tooltipOtions.selector).tooltip({\r\n delay: {\r\n show: tooltipOtions.delay.show,\r\n hide: tooltipOtions.delay.hide\r\n },\r\n boundary: tooltipOtions.boundary,\r\n trigger: tooltipOtions.trigger\r\n })\r\n\r\n $(tooltipOtions.selector).tooltip('hide')\r\n\r\n let gridTableLeftBorderWidth = Math.ceil(parseFloat($gridTable.css('border-left-width')))\r\n let gridTableRightBorderWidth = Math.ceil(parseFloat($gridTable.css('border-right-width')))\r\n function stAutoActivate() {\r\n function _addRmvCls($item, isAdd, isLastElement, isFirstElement) {\r\n if (isAdd) {\r\n $item.addClass('st-auto-active')\r\n } else {\r\n $item.removeClass('st-auto-active')\r\n }\r\n\r\n if (isLastElement && isAdd) {\r\n $item.addClass('st-auto-left-last')\r\n } else {\r\n $item.removeClass('st-auto-left-last')\r\n }\r\n\r\n if (isFirstElement) {\r\n $item.addClass('st-auto-right-first')\r\n } else {\r\n $item.removeClass('st-auto-right-first')\r\n }\r\n }\r\n\r\n\r\n let $firstTr = $grid.find('thead tr').eq(0)\r\n $grid.find('tr').each(function (j, f) {\r\n let $currentTr = $(f)\r\n let $leftItems = $currentTr.find('.st-auto-left')\r\n let $rightItems = $currentTr.find('.st-auto-right')\r\n\r\n $leftItems.each(function () {\r\n let $item = $(this)\r\n let y = parseInt($item.css('left'))\r\n let x = Math.ceil($item.getPositionInViewport().left\r\n - $grid.getPositionInViewport().left\r\n - gridTableLeftBorderWidth\r\n - parseFloat($item.css('border-left-width')))\r\n\r\n let z = y > x && $gridScrollContainer.scrollLeft() != 0\r\n let isLastActiveItem //= $leftItemsActive.last()[0] === $item[0]\r\n\r\n let $parentTh = $firstTr.find(`[data-column-magic=\"${$item.data(\"columnMagic\")}\"]`)\r\n isLastActiveItem = $parentTh.index() == $firstTr.find('.st-auto-left.st-auto-active').last().index()\r\n\r\n _addRmvCls($item, z, isLastActiveItem, false)\r\n })\r\n\r\n $rightItems.each((i, e) => {\r\n let $item = $(e)\r\n let y = parseInt($item.css('right'))\r\n let x = Math.ceil($grid.getPositionInViewport().right\r\n - $item.getPositionInViewport().right\r\n - gridTableRightBorderWidth\r\n - $gridScrollContainer.getScrollBarWidth()\r\n - parseFloat($item.css('border-right-width')))\r\n\r\n let z = false;\r\n\r\n if ($grid.width() < $gridTable.outerWidth() - $gridScrollContainer.scrollLeft() && (y >= x)) {\r\n z = true\r\n }\r\n\r\n let isFirstIActiveItem;\r\n\r\n let $parentTh = $firstTr.find(`[data-column-magic=\"${$item.data(\"columnMagic\")}\"]`)\r\n isFirstIActiveItem = $parentTh.index() == $firstTr.find('.st-auto-right.st-auto-active').first().index()\r\n\r\n _addRmvCls($item, z, false, isFirstIActiveItem)\r\n })\r\n\r\n })\r\n }\r\n\r\n function initStickedColumnsOffset() {\r\n\r\n let $spacedColumns = [];\r\n function _getSpacing($arrayOfItems, itemIndex, rowIndex, isThead, position) {\r\n let spacing = 0 //= $previousCell.outerWidth() + parseInt($previousCell.css('left'))\r\n if (itemIndex == 0 && rowIndex == 0) {\r\n spacing = 0\r\n } else {\r\n function __calculate() {\r\n for (j = itemIndex - 1; j >= 0; --j) {\r\n let $item = $arrayOfItems.eq(j)\r\n spacing += Math.ceil($item.outerWidth()) - 1 //Ceil is for chrome compatibility with Firefox\r\n }\r\n }\r\n function __getDistance($element, $item, p = position) {\r\n let d;\r\n if (p == 'right') {\r\n d = $element.getPositionInViewport()[p] - $item.getPositionInViewport()[p]\r\n } else {\r\n d = $item.getPositionInViewport()[p] - $element.getPositionInViewport()[p]\r\n }\r\n return d\r\n }\r\n\r\n if (isThead) {\r\n if (rowIndex == 0) {\r\n __calculate()\r\n } else {\r\n if (itemIndex == 0) {\r\n\r\n let el = {\r\n $element: null,\r\n distance: 0,\r\n offset: 0\r\n }\r\n\r\n $($spacedColumns[rowIndex - 1]).filter((a, b) => b.$item.hasClass(`st-auto-${position}`)).each((i, e) => {\r\n let $e = e.$item\r\n let distance = __getDistance($e, $arrayOfItems.eq(itemIndex));\r\n\r\n if (i == 0 && distance >= 0) {\r\n el.$element = $e\r\n el.distance = distance\r\n el.offset = e.offset\r\n } else if ((distance >= 0 && distance <= el.distance) || (el.$element == null && (distance > -1))) {\r\n el.$element = $e\r\n el.distance = distance\r\n el.offset = e.offset\r\n\r\n if (distance == 0) {\r\n return false\r\n }\r\n }\r\n })\r\n\r\n let offset = el.$element == null ? el.distance : parseInt(el.offset)\r\n spacing += offset\r\n\r\n if (position == 'left') {\r\n if (el.$element != null && __getDistance(el.$element, $arrayOfItems.eq(itemIndex), 'left') != 0) {\r\n spacing += el.$element.outerWidth()\r\n }\r\n } else {\r\n if (el.$element != null && __getDistance(el.$element, $arrayOfItems.eq(itemIndex), 'right') > 0) {\r\n spacing += el.$element.outerWidth()\r\n }\r\n }\r\n } else {\r\n let $item = $arrayOfItems.eq(itemIndex - 1)\r\n\r\n let col = $(columnsToSetOffset).map(function (x, y) {\r\n if (y.$item[0] == $item[0]) {\r\n return y\r\n }\r\n })[0]\r\n\r\n spacing += col.offset\r\n spacing += $item.outerWidth()\r\n }\r\n }\r\n } else {\r\n __calculate()\r\n }\r\n }\r\n return spacing\r\n }\r\n\r\n function _isThead($item) {\r\n return $item.closest('thead').length > 0\r\n }\r\n function _manageCell($item, index, rowIndex, $items) {\r\n let isThead = _isThead($item)\r\n let isLeft = $item.hasClass('st-auto-left')\r\n let side = isLeft ? 'left' : 'right'\r\n let offset = _getSpacing($items, index, rowIndex, isThead, side)\r\n\r\n columnsToSetOffset.push({\r\n $item: $item,\r\n position: side,\r\n offset: offset\r\n })\r\n\r\n if (isThead) {\r\n if ($spacedColumns[rowIndex] == undefined) {\r\n $spacedColumns[rowIndex] = []\r\n }\r\n $spacedColumns[rowIndex].push({\r\n $item: $item,\r\n offset: offset\r\n })\r\n }\r\n }\r\n\r\n let columnsToSetOffset = []\r\n\r\n $grid.find('.kdr-grid-layout > thead, .kdr-grid-layout > tbody, .kdr-grid-layout > tfoot')\r\n .find('> tr.kdr-grid-item-select, > tr.kdr-grid-item-update, > tr.kdr-grid-item-insert, > tr.kdr-grid-footer, > tr.kdr-grid-header-row')\r\n .each((rowIndex, e) => {\r\n let $stAutoLeftItems = $(e).find('.st-auto-left')\r\n let $stAutoRightItems = $(e).find('.st-auto-right').reverse()\r\n\r\n $stAutoLeftItems.each((j, f) => {\r\n _manageCell($(f), j, rowIndex, $stAutoLeftItems)\r\n })\r\n $stAutoRightItems.each((j, f) => {\r\n _manageCell($(f), j, rowIndex, $stAutoRightItems)\r\n })\r\n })\r\n $(columnsToSetOffset).each((i, e) => {\r\n e.$item.css(e.position, e.offset)\r\n })\r\n\r\n controls.recalculateGridTableHeaderOffets($grid)\r\n }\r\n function checkQuickFiltersWidth() {\r\n let $qfi = $grid.find('.kdr-grid-quick-filters-inputs')\r\n if ($qfi.length != 0) {\r\n function perform(i1) {\r\n let isAnyUnder = $qfi.find('.input-group').toArray().some(e => $(e).getPositionInViewport().top > i1)\r\n\r\n if (isAnyUnder) {\r\n $qfi.closest('.kdr-grid-quick-filters')\r\n .find('.kdr-grid-quick-filters-toggle')\r\n .addClass('toggle-expanded-by-inner')\r\n .find('.shaker')\r\n .show()\r\n } else {\r\n $qfi.closest('.kdr-grid-quick-filters')\r\n .find('.kdr-grid-quick-filters-toggle')\r\n .removeClass('toggle-expanded-by-inner')\r\n .find('.shaker')\r\n .hide()\r\n }\r\n }\r\n\r\n let qfiBottomEdge = $qfi.getPositionInViewport().bottom\r\n\r\n if ($qfi.hasClass('expanded')) {\r\n $qfi.find('.kdr-grid-quick-filters-toggle').one(expander.events.EXPANDED, () => perform(qfiBottomEdge))\r\n $qfi.closest('.kdr-grid-quick-filters').find('.kdr-grid-quick-filters-toggle').click()\r\n } else {\r\n perform(qfiBottomEdge)\r\n }\r\n }\r\n }\r\n function checkHairWidth() {\r\n let getItemsWidth = ($items) => {\r\n let hairChildrensWidth = 0\r\n $items.each((i, e) => {\r\n hairChildrensWidth += $(e).outerWidth(true)\r\n })\r\n\r\n return hairChildrensWidth\r\n }\r\n\r\n let $hair = $grid.find('.kdr-grid-hair')\r\n let hairAdditionClass = 'flex-wrap'\r\n\r\n let hairWidth = $hair.outerWidth()\r\n\r\n let hairChildrensWidth = getItemsWidth($hair.children())\r\n let diffrenceInWidth = hairChildrensWidth - hairWidth\r\n\r\n if ($hair.hasClass(hairAdditionClass) == false && (hairChildrensWidth > hairWidth && (diffrenceInWidth < -1 || diffrenceInWidth > 1))) {\r\n $hair.addClass(hairAdditionClass)\r\n } else {\r\n let $clonedHair = $hair.clone().css({ 'opacity': '0', 'position': 'absolute' }).removeClass('flex-wrap').appendTo($hair.parent())\r\n\r\n if (getItemsWidth($clonedHair.children()) <= hairWidth) {\r\n $hair.removeClass(hairAdditionClass)\r\n }\r\n\r\n $clonedHair.remove()\r\n }\r\n }\r\n function initQuickFilters() {\r\n let $qFs = $grid.find('.kdr-grid-quick-filters')\r\n let $qFi = $qFs.find('.input-group')\r\n if ($qFi.length > 0) {\r\n $qFi.each((i, e) => {\r\n let $input = $(e).find('.kdr-grid-quick-filter')\r\n let placeholderText = ''\r\n let innerWidth = 0\r\n if ($input.hasClass('kdr-dropdown-w-search-item_selected')) {\r\n let $inner = $input.find('.kdr-dropdown-w-search-placeholder_text')\r\n placeholderText = $inner.text().trim()\r\n innerWidth = $inner.innerWidth()\r\n } else {\r\n placeholderText = $input.attr('placeholder')\r\n innerWidth = $input.innerWidth()\r\n }\r\n\r\n let $copiedInput = $('')\r\n $copiedInput\r\n .text(placeholderText)\r\n .css({\r\n 'font-size': $input.css('font-size'),\r\n 'position': 'absolute',\r\n 'opacity': '0',\r\n 'top': '-1000',\r\n 'left': '-1000'\r\n })\r\n .appendTo('body')\r\n\r\n if (placeholderText != undefined && ($copiedInput.width() > innerWidth || $input.valExtended().length > 0)) {\r\n $input.tooltip({\r\n title: placeholderText,\r\n delay: {\r\n show: tooltipOtions.delay.show,\r\n hide: tooltipOtions.delay.hide\r\n },\r\n boundary: tooltipOtions.boundary,\r\n trigger: tooltipOtions.trigger\r\n })\r\n }\r\n $copiedInput.remove()\r\n })\r\n\r\n $qFs.find('.kdr-grid-quick-filters-toggle').on(expander.events.EXPANDED, function (event) {\r\n if (event.isExpanded) {\r\n $qFs.addClass('kdr-grid-quick-filters-opened')\r\n } else {\r\n $qFs.removeClass('kdr-grid-quick-filters-opened')\r\n }\r\n })\r\n }\r\n }\r\n function manageResponsiveness() {\r\n if ($grid.is(\":visible\")) {\r\n checkQuickFiltersWidth()\r\n checkHairWidth()\r\n initStickedColumnsOffset()\r\n stAutoActivate()\r\n }\r\n }\r\n\r\n function initResizer($table) {\r\n function _callback(col) {\r\n initStickedColumnsOffset()\r\n userColumns.saveColumnsInGrid($grid, col)\r\n }\r\n\r\n let $cols = $table.find('th[data-header-last-p=\"1\"]')\r\n controls.initTableColumnResizer($cols, _callback)\r\n }\r\n\r\n $('.toggle-expanded-by-inner').click(function () {\r\n $(this).toggleClass(\"toggle-expanded-by-inner-opened\");\r\n });\r\n\r\n if ($(\".section-content .line-clamb\")[0] != undefined) {\r\n let $x = $(\".section-content .line-clamb\");\r\n\r\n if ($x[0].scrollHeight > $x[0].offsetHeight) {\r\n $('.toggle-expanded-by-inner').show()\r\n }\r\n }\r\n\r\n function initDsDt() {\r\n $grid.find(\r\n '.kdr-grid-item-select [class*=\"ds-\"],' +\r\n '.kdr-grid-item-select [class*=\"dt-\"]').removeClass(function (index, item) {\r\n return (item.match(/dt-\\S+|ds-\\S+/g) || []).join(' ');\r\n });\r\n\r\n if ($grid.hasClass('dst-override-key-for-row')) {\r\n function replaceCls($item, $oldClass, dataRowIndex, dataColInde) {\r\n let cls = $item.attr('class')\r\n cls = cls.replace($oldClass, $oldClass + `-${dataRowIndex}${dataColInde}`)\r\n $item.attr('class', cls)\r\n return $item\r\n }\r\n\r\n $grid.find('[class*=\"ds-\"]').each((i, e) => {\r\n let $row = $(e).closest('.kdr-grid-item-update, .kdr-grid-item-insert')\r\n let rMatches = $(e).attr('class').match(/ds-(\\S+)/i)\r\n let groupIndex = rMatches[1]\r\n let $rowIndexHolder = $(e).closest('[data-row-index]') //przewaznie bedzie to \r\n let rowIndex = $rowIndexHolder.data('rowIndex')\r\n let colIndex = $rowIndexHolder.find('.kdr-grid-input[data-index]').data('index')\r\n\r\n replaceCls($(e), rMatches[0], rowIndex, colIndex)\r\n\r\n $row.find('[class*=\"dt-' + groupIndex + '\"], [class*=\"da-' + groupIndex + '\"]').each((j, f) => {\r\n let classes = $(f).attr('class')\r\n let regexMatches = classes.match(/(?:dt|da)-(\\S+)/i)\r\n\r\n replaceCls($(f), regexMatches[0], rowIndex, colIndex)\r\n })\r\n })\r\n }\r\n\r\n $grid.find('tr:not(.kdr-item-select) .kdr-grid-input[class*=\"ds\"]').trigger('disabler')\r\n }\r\n\r\n let $tabsObjects = $grid.parents('[id^=\"tabs\"]')\r\n if ($tabsObjects.length != 0) {\r\n let dataKey = `gridinit.initedGridTabsParent.${$grid.attr('id')}`\r\n\r\n $grid.parents('.tab-pane').map((i, e) => e.id).each((i, e) => {\r\n let $tab = $('[data-toggle=\"tab\"][href=\"#' + e + '\"]')\r\n if ($tab.data(dataKey) !== true) {\r\n\r\n $tab.on('shown.bs.tab', function () {\r\n manageResponsiveness()\r\n })\r\n\r\n $tab.data(dataKey, true)\r\n }\r\n })\r\n }\r\n\r\n let $expandableObjects = $grid.parents('.tilemenu-row')\r\n if ($expandableObjects.length != 0) {\r\n let dataKey = `gridinit.initedGridCollapseParent.${$grid.attr('id')}`\r\n let collapsePanelId = $expandableObjects.find('.tilemenu-row-header').data('target')\r\n let $eventCatchers = $expandableObjects.find(collapsePanelId).filter(function () { return $(this).data(dataKey) !== true })\r\n\r\n $eventCatchers.on('shown.bs.collapse', function () {\r\n manageResponsiveness()\r\n })\r\n $eventCatchers.data(dataKey, true)\r\n }\r\n\r\n let $carouselParent = $grid.parents('.carousel')\r\n if ($carouselParent.length != 0) {\r\n $carouselParent.on('slid.bs.carousel', manageResponsiveness)\r\n }\r\n\r\n $(window).bind('resize', false, function () {\r\n manageResponsiveness()\r\n })\r\n\r\n $gridScrollContainer.on('scroll', false, function () {\r\n stAutoActivate()\r\n })\r\n\r\n initQuickFilters()\r\n manageResponsiveness()\r\n\r\n\r\n if ($grid.hasClass('kdr-grid-flip')) {\r\n let $table = $grid.find('.kdr-grid-layout')\r\n\r\n let newrows = []\r\n\r\n //$table.find(\"tr\").each(function () {\r\n // var i = 0;\r\n // $(this).find(\"td,th\").each(function () {\r\n // i++;\r\n // if (newrows[i] === undefined) {\r\n // newrows[i] = $(\"\")\r\n // }\r\n\r\n // newrows[i].append($(this))\r\n // });\r\n //});\r\n\r\n let $trs = $table.find(\"tr\")\r\n for (var i = 0; i < $trs.length; i++) {\r\n let $tr = $trs.eq(i)\r\n\r\n $tr.find(\"td,th\").each((j,e) => {\r\n if (newrows[j] === undefined) {\r\n newrows[j] = $(\"\").addClass('kdr-grid-item-update d-table-row') //fixme \r\n }\r\n\r\n newrows[j].append($(e))\r\n })\r\n }\r\n\r\n\r\n $table.find(\"tr\").remove()\r\n $.each(newrows, function () {\r\n $table.append(this)\r\n });\r\n\r\n $table.fadeOut(0)\r\n $grid.removeClass('hidden')\r\n $table.fadeIn(500)\r\n }\r\n\r\n if ($gridTable.length > 0) {\r\n initResizer($gridTable)\r\n }\r\n\r\n initDsDt()\r\n\r\n loading.hide($grid)\r\n\r\n let gridId = $grid.prop('id')\r\n $('.kdr-commands[value*=\"' + gridId + '\"]').each((i, tbc) => {\r\n let $tbc = $(tbc)\r\n JSON.parse($tbc.valExtended())\r\n .filter(x => x.Target == gridId && x.CountTargetElementsP === true && (x.Action == 1 || x.Action == 4))\r\n .forEach(comm => {\r\n\r\n let $tabFilter = $(`#${comm.Root}`)\r\n if ($tabFilter.length > 0) {\r\n let args = []\r\n\r\n $tabFilter.find('.kdr-filters-tabs-filter-new-order').each((i, e) => {\r\n args.push({\r\n index: $(e).data('index'),\r\n value: $(e).data('value'),\r\n item: $(e)\r\n })\r\n })\r\n\r\n function _gridStillExistsOnDOMP() {\r\n //let b = $grid.closest('html').length != 0;\r\n //console.info(b ? `${$grid.prop('id')} is alive` : `${$grid.prop('id')} is dead`)\r\n return $grid.existOnDOMP()\r\n }\r\n\r\n $(args).each((i, e) => {\r\n let arg = {}\r\n arg[e.index] = e.value\r\n let $loadingIndicator = e.item.find('.tab-filter-items-count')\r\n setTimeout(() => {\r\n if (_gridStillExistsOnDOMP() === true) {\r\n $.ajax({\r\n type: \"POST\",\r\n url: __root + \"Filters/Change\",\r\n datatype: \"json\",\r\n traditional: true,\r\n data: {\r\n \"info\": controls.getInfo($tabFilter),// $tabFilter.find(\".kdr-info\").val(),\r\n \"args\": JSON.stringify(arg)\r\n },\r\n success: function (response) {\r\n if (_gridStillExistsOnDOMP() === true) {\r\n $.ajax({\r\n type: \"POST\",\r\n url: __root + \"Filters/AdvancedFilter\",\r\n datatype: \"json\",\r\n traditional: true,\r\n data: {\r\n 'control': controls.getInfo($grid),\r\n 'filters': response.info,\r\n 'clearQFP': e.item.hasClass('active') === false\r\n },\r\n success: function (response2) {\r\n if (_gridStillExistsOnDOMP()) {\r\n $.ajax({\r\n type: \"POST\",\r\n url: __root + \"Grid/GetGridElementsCount\",\r\n datatype: \"json\",\r\n traditional: true,\r\n data: {\r\n \"info\": response2.info\r\n },\r\n success: function (response3) {\r\n if (_gridStillExistsOnDOMP() === true) {\r\n if (response.code == gridResponseCodes.SUCCESS) {\r\n $(e.item).trigger({\r\n type: 'setItemsCount',\r\n count: response3.message\r\n })\r\n }\r\n }\r\n },\r\n beforeSend: () => loading.show($loadingIndicator),\r\n complete: () => loading.hide($loadingIndicator)\r\n })\r\n }\r\n },\r\n beforeSend: () => loading.show($loadingIndicator),\r\n complete: () => loading.hide($loadingIndicator)\r\n })\r\n }\r\n },\r\n beforeSend: () => loading.show($loadingIndicator),\r\n complete: () => loading.hide($loadingIndicator)\r\n })\r\n }\r\n }, 1)\r\n })\r\n }\r\n })\r\n })\r\n\r\n controls.onGridAfterUiInit($grid)\r\n\r\n }\r\n },\r\n incell: {\r\n classes: {\r\n mainContainer: 'kdr-incell',\r\n cell: 'kdr-incell-item-cell',\r\n cellClicked: 'kdr-incell-item-cell-clicked',\r\n cellFocused: 'kdr-incell-item-cell-focused',\r\n cellEditable: 'kdr-incell-item-cell-editable',\r\n cellSelected: 'ui-selected',\r\n itemRow: 'kdr-incell-item-row',\r\n cellError: 'kdr-incell-item-cell-has-errors'\r\n },\r\n moveDirections: {\r\n top: 38,\r\n bottom: 40,\r\n left: 37,\r\n right: 39\r\n },\r\n constantsValues: {\r\n pageHeaderHeight: 0\r\n },\r\n events: {\r\n clickedCell: 'kdr-incell-cell-clicked',\r\n outClickedCell: 'kdr-incell-cell-out-clicked'\r\n },\r\n /**\r\n * Inits complete UI, events etc. on control, e.g. datepickers, resizers, etc.\r\n * @param {any} $incell control\r\n */\r\n init($incell, options) {\r\n try {\r\n controls.incell.initData($incell, options)\r\n controls.incell.initResizer($incell)\r\n controls.incell.initButtons($incell)\r\n controls.incell.initMovement($incell)\r\n controls.incell.initSelectableCells($incell)\r\n controls.incell.initCopyPasteCellsValue($incell)\r\n controls.incell.initInputsBehavior($incell)\r\n if (options.modules.htmlEditorP === true) controls.incell.initTinyMceEditor($incell)\r\n\r\n\r\n this.constantsValues.pageHeaderHeight = $('.content-header').outerHeight()\r\n\r\n controls.onControlAfterUIInit($incell, gridResponseCodes.SUCCESS)\r\n } catch (eggog) {\r\n controls.onControlAfterUIInit($incell, gridResponseCodes.ERROR)\r\n console.info('An error occured on incell: ' + $incell.prop('id'))\r\n console.error(eggog)\r\n }\r\n },\r\n initData($incell, options) {\r\n let $rows = []\r\n let $allCells = []\r\n let $modals = []\r\n\r\n let $headers = $incell.find('thead .kdr-incell-column-header[data-header-last-p=\"1\"]')\r\n let headers = {}\r\n\r\n for (var i = 0; i < $headers.length; i++) {\r\n let $h = $headers.eq(i)\r\n let id = $h.data('columnId')\r\n $h.data().warningSign = $h.find('.kdr-incell-column-header-warning')\r\n headers[id] = $h\r\n }\r\n\r\n $rows = $incell.find('.' + controls.incell.classes.itemRow)\r\n for (var rowIndex = 0; rowIndex < $rows.length; rowIndex++) {\r\n let $row = $rows.eq(rowIndex)\r\n let $cells = $row.find('.' + controls.incell.classes.cell)\r\n $allCells[rowIndex] = []\r\n\r\n $row.data().warningSign = $row.find('.kdr-incell-row-warning')\r\n let colsCount = $cells.length\r\n for (var colIndex = 0; colIndex < colsCount; colIndex++) {\r\n let $cell = $cells.eq(colIndex)\r\n controls.incell.initCellData($cell)\r\n controls.incell.setCellCords($cell, rowIndex, colIndex)\r\n\r\n $allCells[rowIndex].push($cell)\r\n }\r\n }\r\n\r\n if (options?.texts != undefined) {\r\n $incell.data('texts', options?.texts)\r\n }\r\n\r\n $modals['saveDraftModal'] = $incell.find('.kdr-incell-save-draft-modal')\r\n $modals['loadDraftModal'] = $incell.find('.kdr-incell-load-draft-modal')\r\n\r\n\r\n $incell.data('options', options)\r\n $incell.data('rows', $rows)\r\n $incell.data('cells', $allCells)\r\n $incell.data('headers', headers)\r\n $incell.data('modals', $modals)\r\n },\r\n initCellData($cell) {\r\n let $input = $cell.find('.kdr-incell-input')\r\n $cell.data('editableP', $cell.hasClass(controls.incell.classes.cellEditable))\r\n .data('input', $input)\r\n $input.data('cell', $cell)\r\n\r\n return $cell\r\n },\r\n initResizer($incell) {\r\n let $cols = $incell.find('thead .kdr-incell-column-header[data-header-last-p=\"1\"]')\r\n controls.initTableColumnResizer($cols, null)\r\n },\r\n initButtons($incell) {\r\n function toggleRowRemoved($btn, stateP) {\r\n controls.incell.actions.toggleRowRemoved($incell, $btn.closest('.' + controls.incell.classes.itemRow), $btn, stateP)\r\n }\r\n\r\n $incell\r\n .on('click', '.kdr-incell-item-remove', function () {\r\n toggleRowRemoved($(this), true)\r\n })\r\n .on('click', '.kdr-incell-item-remove-undo', function () {\r\n toggleRowRemoved($(this), false)\r\n })\r\n .on('click', '.kdr-incell-item-add', function () {\r\n controls.incell.actions.addRows($incell, $(this).data('newItemsCount'))\r\n })\r\n },\r\n initSelectableCells($incell) {\r\n function _deselectCells($items) {\r\n $items\r\n .removeClass(controls.incell.classes.cellClicked)\r\n .removeClass(controls.incell.classes.cellSelected)\r\n\r\n for (let i = 0; i < $items.length; i++) {\r\n let $input = $items.eq(i).data('input')\r\n _manageDropdownInput($input, false)\r\n }\r\n\r\n }\r\n function _findSelectedCells() { return $incell.find(`.${controls.incell.classes.cellSelected},.${controls.incell.classes.cellClicked}`) }\r\n function _focusDummyInput() { $incell.find('.copy-paste-input')[0].focus() }\r\n function _manageDropdownInput($input, shouldShowP) {\r\n if ($input != undefined && $input.length != 0) {\r\n let hasClass = $input.hasClass('kdr-dropdown-w-search-item_selected')\r\n if (hasClass && shouldShowP) {\r\n $input.attr('data-toggle', 'dropdown')\r\n } else if (hasClass && !shouldShowP) {\r\n $input.removeAttr('data-toggle')\r\n $input.dropdown('hide')\r\n }\r\n }\r\n }\r\n\r\n $incell.find('.kdr-incell-table-layout tbody').selectable({\r\n distance: 10,\r\n filter: '.' + controls.incell.classes.cell,\r\n cancel: ':focus',\r\n start: function () {\r\n $incell.find(`.${controls.incell.classes.cellClicked}`).removeClass(controls.incell.classes.cellClicked)\r\n },\r\n stop: function () {\r\n _focusDummyInput()\r\n $incell.find(`.${controls.incell.classes.cellSelected}:first`).addClass(controls.incell.classes.cellClicked)\r\n }\r\n })\r\n\r\n $incell\r\n .on('mousedown', `.${controls.incell.classes.cell}`, function (e) {\r\n let $input = $(this).data().input\r\n\r\n _manageDropdownInput($input, true)\r\n\r\n if ($input.is(':checkbox') == false && $input.is(':focus') == false && e.which != 2) {\r\n e.preventDefault()\r\n }\r\n })\r\n .on('focus', `.${controls.incell.classes.cell} .kdr-incell-input`, function () {\r\n let $input = $(this)\r\n _manageDropdownInput($input, true)\r\n let $cell = $input.closest('.kdr-incell-item-cell')\r\n if ($cell.hasClass(controls.incell.classes.cellClicked) == false) {\r\n _deselectCells(_findSelectedCells())\r\n $cell.addClass(controls.incell.classes.cellClicked)\r\n }\r\n })\r\n .on('click', `.${controls.incell.classes.cell}`, function () {\r\n _deselectCells(_findSelectedCells())\r\n let $this = $(this)\r\n $this.addClass(controls.incell.classes.cellClicked)\r\n _manageDropdownInput($this.data('input'), true)\r\n\r\n if ($this.hasClass(controls.incell.classes.cellEditable) == false) {\r\n _focusDummyInput()\r\n }\r\n })\r\n .on('click', `.${controls.incell.classes.cellEditable}`, function (e) {\r\n let $cell = $(this)\r\n let $input = $cell.data().input\r\n let input = $input[0]\r\n\r\n if (e.detail == 1 && $input.is(':focus') == false) {\r\n if (e.target.className.includes('datepicker')) {\r\n input.focus()\r\n } else {\r\n _focusDummyInput()\r\n }\r\n }\r\n\r\n if (e.detail >= 2 && $input.is(':focus') == false) {\r\n _manageDropdownInput($input.data('input'), true)\r\n\r\n input.focus()\r\n if (input.type == 'text' || input.type == 'textarea') {\r\n input.setSelectionRange(input.value.length, input.value.length)\r\n }\r\n\r\n }\r\n if (e.detail >= 3 && (input.type == 'text' || text.type == 'textarea')) {\r\n if (input.type == 'text' || text.type == 'textarea') {\r\n input.select()\r\n }\r\n }\r\n })\r\n .on('keydown', `.${controls.incell.classes.cell} .kdr-incell-input`, function (e) {\r\n if (e.keyCode == 13) {\r\n if (e.target == document.activeElement && e.target.classList.contains('html-editor')) {\r\n if (e.ctrlKey == false) {\r\n e.preventDefault()\r\n tinymce.get(e.target.id).undoManager.undo()\r\n _focusDummyInput()\r\n }\r\n } else {\r\n _focusDummyInput()\r\n }\r\n }\r\n })\r\n .on(controls.incell.events.clickedCell, `.${controls.incell.classes.cell}`, function () {\r\n _manageDropdownInput($(this).data('input'), true)\r\n })\r\n .on(controls.incell.events.outClickedCell, `.${controls.incell.classes.cell}`, function () {\r\n _manageDropdownInput($(this).data('input'), false)\r\n })\r\n .on('keydown', function (e) {\r\n let $selectedCell = $incell.find('.' + controls.incell.classes.cellClicked)\r\n if ($selectedCell.data().input.is(':focus') == false && e.keyCode == 65 && e.ctrlKey === true) { //ctrl + a\r\n let cells = $incell.data().cells\r\n for (var i = 0; i < cells.length; i++) {\r\n let cols = cells[i]\r\n for (var j = 0; j < cols.length; j++) {\r\n cols[j].addClass(controls.incell.classes.cellSelected)\r\n }\r\n }\r\n _focusDummyInput()\r\n } else if ([37, 38, 39, 40, 9, 13, 8, 46].some((x) => x == e.keyCode) == false //focusowanie inputa\r\n && e.ctrlKey === false\r\n && e.shiftKey == false\r\n && ($input = $selectedCell.data().input) != undefined && $input.length > 0\r\n && ($input[0].type == 'textarea' || $input[0].type == 'text' || $input.hasClass('html-editor'))\r\n && $input.is(':focus') == false) {\r\n let input = $input[0]\r\n input.focus()\r\n\r\n if (input.type == 'text' || input.type == 'textarea' || $input.hasClass('html-editor')) {\r\n input.setSelectionRange(input.value.length, input.value.length)\r\n }\r\n } else if (e.keyCode == 32 && (($input = $selectedCell.data().input) != undefined && $input.length > 0)) {\r\n if ($input.is(':checkbox')) {\r\n $input.valExtended(!$input.valExtended())\r\n } else if ($input.hasClass('kdr-dropdown-w-search-item_selected')) {\r\n $input.click()\r\n }\r\n } else if (e.keyCode == 27) {\r\n _focusDummyInput()\r\n }\r\n })\r\n .on('hide.bs.dropdown', function () {\r\n _focusDummyInput()\r\n })\r\n .on(controls.incell.events.clickedCell, `.${controls.incell.classes.cell}`, function () {\r\n _manageDropdownInput($(this).data('input'), true)\r\n })\r\n .on(controls.incell.events.outClickedCell, `.${controls.incell.classes.cell}`, function () {\r\n _manageDropdownInput($(this).data('input'), false)\r\n })\r\n\r\n\r\n $(document).on('click', function (e) {\r\n if ($incell.existOnDOMP()) {\r\n let $parent = $(e.target).closest('.kdr-incell')\r\n if ($parent[0] != $incell[0]) {\r\n _deselectCells(_findSelectedCells())\r\n }\r\n } else {\r\n $(document).off(e)\r\n }\r\n })\r\n },\r\n initMovement($incell) {\r\n $incell\r\n .on('keyup', function (e) {\r\n if (e.keyCode === 16) {\r\n $incell.data('multiSelectingStartCords', null)\r\n }\r\n })\r\n .on('keydown', function (e) {\r\n if (e.keyCode === 16) {\r\n let $selectedCell = $incell.find(`.${controls.incell.classes.cellClicked}`)\r\n let $cellInput = $selectedCell.data('input')\r\n if ($cellInput == undefined || $cellInput.length == 0 || $cellInput[0] !== document.activeElement) {\r\n let cords = controls.incell.getCellCords($selectedCell)\r\n $incell.data('multiSelectingStartCords', cords)\r\n $incell.find(`.${controls.incell.classes.cellSelected}`).removeClass(controls.incell.classes.cellSelected)\r\n }\r\n }\r\n\r\n if ([37, 38, 39, 40, 9, 13].some((x) => x == e.keyCode)) {\r\n let directionX;\r\n let directionY;\r\n\r\n let $selectedCell = $incell.find(`.${controls.incell.classes.cellClicked}`)\r\n let $cellInput = $selectedCell.data('input')\r\n if ($cellInput == undefined\r\n || $cellInput.length == 0\r\n || ($cellInput[0] !== document.activeElement\r\n && !document.activeElement.className.includes('kdr-dropdown-w-search'))\r\n ) {\r\n let $rowsCells = $incell.data('cells');\r\n let targetCords = controls.incell.getCellCords($selectedCell)\r\n\r\n if (e.ctrlKey == false) {\r\n controls.incell.moveDirections.left\r\n if ([37, 39].some((x) => x == e.keyCode)) directionX = e.keyCode\r\n else if ([38, 40].some((x) => x == e.keyCode)) directionY = e.keyCode\r\n else if (e.shiftKey == true && e.keyCode == 9) directionX = controls.incell.moveDirections.left\r\n else if (e.shiftKey == false && e.keyCode == 9) directionX = controls.incell.moveDirections.right\r\n else if (e.shiftKey == true && e.keyCode == 13) directionY = controls.incell.moveDirections.top\r\n else if (e.shiftKey == false && e.keyCode == 13) directionY = controls.incell.moveDirections.bottom\r\n\r\n\r\n switch (directionX) {\r\n case controls.incell.moveDirections.left: targetCords.col--; break;\r\n case controls.incell.moveDirections.right: targetCords.col++; break;\r\n default: break\r\n }\r\n\r\n switch (directionY) {\r\n case controls.incell.moveDirections.top: targetCords.row--; break;\r\n case controls.incell.moveDirections.bottom: targetCords.row++; break;\r\n default: break\r\n }\r\n\r\n if (targetCords.row < 0 || targetCords.row == $rowsCells.length\r\n || targetCords.col < 0 || targetCords.col == $rowsCells[0].length) {\r\n if (e.keyCode == 9) { //if tab then jump to prev/next row\r\n if (e.shiftKey) {\r\n targetCords.col = $rowsCells[--targetCords.row].length - 1\r\n directionX = controls.incell.moveDirections.right\r\n directionY = controls.incell.moveDirections.top\r\n } else {\r\n targetCords.row++\r\n\r\n if (targetCords.row < $rowsCells.length) {\r\n targetCords.col = 0\r\n directionX = controls.incell.moveDirections.left\r\n directionY = controls.incell.moveDirections.bottom\r\n } else {\r\n return false\r\n }\r\n }\r\n } else {\r\n return e\r\n }\r\n }\r\n } else { //jumping with ctrl\r\n function checkIfCellHasAnyValue($cell) {\r\n let hasValue = false\r\n\r\n let hasText = textHelper.isNullOrEmpty($cell.text()) == false\r\n if (hasText) {\r\n hasValue = true\r\n }\r\n else if (($input = $cell.data('input')) != undefined && $input.length > 0) {\r\n let v = $input.valExtended()\r\n\r\n hasValue = v != undefined &&\r\n (\r\n !textHelper.isNullOrEmpty(v)\r\n || $input.is(':checkbox')\r\n || parseInt(v) == 0\r\n )\r\n }\r\n\r\n return hasValue\r\n }\r\n\r\n function findCellInRow({ seekToFront = true }) {\r\n\r\n if ((seekToFront && targetCords.col < $rowsCells[targetCords.row].length - 1) || (!seekToFront && targetCords.col > 0)) {\r\n let incrementValue = seekToFront ? 1 : -1\r\n let nextToStartHasValue = checkIfCellHasAnyValue($rowsCells[targetCords.row][targetCords.col + incrementValue])\r\n\r\n for (var i = targetCords.col; i < $rowsCells[targetCords.row].length; (seekToFront ? i++ : i--)) {\r\n if ((!seekToFront && i == 0) || (seekToFront && i == $rowsCells[targetCords.row].length - 1)) {\r\n targetCords.col = i\r\n return\r\n }\r\n\r\n\r\n let nextHasValue = checkIfCellHasAnyValue($rowsCells[targetCords.row][i + incrementValue])\r\n //szukaj mi kolejnej ktora ma wartosc nastepujaca po pustce\r\n if (nextToStartHasValue == false && nextHasValue == true) {\r\n targetCords.col = i + incrementValue\r\n return\r\n }\r\n //szuka mi kolejnej ktora jest przed pustka\r\n else if (nextToStartHasValue == true && nextHasValue == false) {\r\n targetCords.col = i\r\n return\r\n }\r\n }\r\n }\r\n }\r\n\r\n function findCellInColumn({ seekToBottom = true }) {\r\n if ((seekToBottom && targetCords.row < $rowsCells.length - 1) || (!seekToBottom && targetCords.row > 0)) {\r\n\r\n let incrementValue = seekToBottom ? 1 : -1\r\n let nextToStartHasValue = checkIfCellHasAnyValue($rowsCells[targetCords.row + incrementValue][targetCords.col])\r\n\r\n\r\n for (var i = targetCords.row; i < $rowsCells.length; (seekToBottom ? i++ : i--)) {\r\n if ((!seekToBottom && i == 0) || (seekToBottom && i == $rowsCells.length - 1)) {\r\n targetCords.row = i\r\n return\r\n }\r\n\r\n\r\n let nextHasValue = checkIfCellHasAnyValue($rowsCells[i + incrementValue][targetCords.col])\r\n //szukaj mi kolejnej ktora ma wartosc nastepujaca po pustce\r\n if (nextToStartHasValue == false && nextHasValue == true) {\r\n targetCords.row = i + incrementValue\r\n return\r\n }\r\n //szuka mi kolejnej ktora jest przed pustka\r\n else if (nextToStartHasValue == true && nextHasValue == false) {\r\n targetCords.row = i\r\n return\r\n }\r\n }\r\n }\r\n }\r\n\r\n switch (e.keyCode) {\r\n case controls.incell.moveDirections.left: { //left\r\n findCellInRow({ seekToFront: false })\r\n directionX = controls.incell.moveDirections.left\r\n break\r\n }\r\n case controls.incell.moveDirections.right: { //right\r\n findCellInRow({ seekToFront: true })\r\n directionX = controls.incell.moveDirections.right\r\n break\r\n }\r\n case controls.incell.moveDirections.top: { //top\r\n findCellInColumn({ seekToBottom: false })\r\n directionY = controls.incell.moveDirections.top\r\n break\r\n }\r\n case controls.incell.moveDirections.bottom: { //bottom\r\n findCellInColumn({ seekToBottom: true })\r\n directionY = controls.incell.moveDirections.bottom\r\n break\r\n }\r\n default: break\r\n }\r\n }\r\n\r\n if (e.keyCode === 9) {\r\n e.preventDefault()\r\n }\r\n $incell.find(`.${controls.incell.classes.cellSelected}`).removeClass(controls.incell.classes.cellSelected)\r\n\r\n let $targetCell = $rowsCells[targetCords.row][targetCords.col]\r\n\r\n $selectedCell.removeClass(controls.incell.classes.cellClicked).trigger(controls.incell.events.outClickedCell)\r\n $targetCell.addClass(controls.incell.classes.cellClicked).trigger(controls.incell.events.clickedCell)\r\n\r\n let multiSelectingStartCords = $incell.data('multiSelectingStartCords')\r\n\r\n if (multiSelectingStartCords && (e.keyCode != 9 && e.keyCode != 13)) {\r\n\r\n for (var rowIndex = 0; rowIndex < $rowsCells.length; rowIndex++) {\r\n let $rowCells = $rowsCells[rowIndex]\r\n if ((rowIndex <= multiSelectingStartCords.row && rowIndex >= targetCords.row)\r\n ||\r\n (rowIndex <= targetCords.row && rowIndex >= multiSelectingStartCords.row)) {\r\n\r\n for (var cellIndex = 0; cellIndex < $rowCells.length; cellIndex++) {\r\n\r\n if ((cellIndex <= multiSelectingStartCords.col && cellIndex >= targetCords.col)\r\n ||\r\n (cellIndex <= targetCords.col && cellIndex >= multiSelectingStartCords.col)) {\r\n\r\n $rowsCells[rowIndex][cellIndex].addClass(controls.incell.classes.cellSelected)\r\n }\r\n }\r\n }\r\n }\r\n }\r\n controls.incell.scrollViewToCell($targetCell, directionX, directionY)\r\n }\r\n }\r\n })\r\n },\r\n initCopyPasteCellsValue($incell) {\r\n var hiddenInput = $incell.find(\".copy-paste-input\");\r\n\r\n function focusHiddenArea() {\r\n // In order to ensure that the browser will fire clipboard events, we always need to have something selected\r\n hiddenInput.val(' ');\r\n hiddenInput.focus().select();\r\n };\r\n\r\n function getCell(rowIndex, colIndex) {\r\n let $rowCells = $incell.data().cells[rowIndex]\r\n let $cell;\r\n if ($rowCells != undefined) {\r\n $cell = $rowCells[colIndex]\r\n }\r\n return {\r\n existP: $cell != undefined && $cell.length != 0,\r\n $cell: $cell\r\n }\r\n }\r\n\r\n function setCellValue($cell, value) {\r\n controls.incell.setCellValue($cell, value)\r\n }\r\n\r\n\r\n function addMissingRows(selectedCellRowIndex, rowsToPasteCount) {\r\n let currentIncellRows = $incell.data().rows.length - 1\r\n let potentialMaxIndex = selectedCellRowIndex + rowsToPasteCount\r\n\r\n if (currentIncellRows < potentialMaxIndex) {\r\n controls.incell.actions.addRows($incell, potentialMaxIndex - currentIncellRows)\r\n }\r\n }\r\n\r\n function interpTablePaste(tables) {\r\n let cordsOfSelectedIndices = controls.incell.getSelectedCellsCords($incell)\r\n\r\n function _addCellToView($col, cellInfo) {\r\n if (cellInfo.existP) {\r\n let value\r\n if (cellInfo.$cell.hasClass('kdr-incell-text-html') === false) {\r\n value = $col.text()?.trim() ?? ''\r\n } else {\r\n value = $col[0].innerHTML\r\n }\r\n setCellValue(\r\n cellInfo.$cell,\r\n value)\r\n }\r\n }\r\n function _iterateColumns($columns, targetRowIndex) {\r\n for (let colIndex = 0; colIndex < $columns.length; colIndex++) {\r\n let $col = $columns.eq(colIndex)\r\n let cellInfo = getCell(targetRowIndex, cordsOfSelectedIndices.startColIndex + colIndex)\r\n _addCellToView($col, cellInfo)\r\n }\r\n }\r\n let rowsToPasteCount = 0;\r\n let tablesRows = []\r\n for (let tableIndex = 0; tableIndex < tables.length; tableIndex++) {\r\n let $rows = $(tables[tableIndex]).find('tbody tr')\r\n tablesRows[tableIndex] = $rows\r\n rowsToPasteCount += $rows.length\r\n }\r\n addMissingRows(cordsOfSelectedIndices.startRowIndex, rowsToPasteCount)\r\n\r\n\r\n\r\n for (let tableIndex = 0, tableRowIndex = 0; tableIndex < tables.length; tableIndex++) {\r\n\r\n let $rows = tablesRows[tableIndex]\r\n\r\n if (tables.length == 1 && $rows.length == 1) {\r\n let $columns = $rows.eq(0).find('td')\r\n let selectedRowsCount = (cordsOfSelectedIndices.endRowIndex - cordsOfSelectedIndices.startRowIndex) + 1\r\n\r\n for (var selectedRowIndex = 0; selectedRowIndex < selectedRowsCount; selectedRowIndex++) {\r\n let targetRowIndex = cordsOfSelectedIndices.startRowIndex + selectedRowIndex\r\n\r\n if ($incell.data('rows').eq(targetRowIndex).data('deletedP') !== true) {\r\n _iterateColumns($columns, targetRowIndex)\r\n }\r\n }\r\n } else {\r\n for (let rowIndex = 0; rowIndex < $rows.length; rowIndex++, tableRowIndex++) {\r\n let targetRowIndex = cordsOfSelectedIndices.startRowIndex + tableRowIndex\r\n let $targetRow = $incell.data('rows').eq(targetRowIndex);\r\n\r\n if ($targetRow.data('deletedP') !== true) {\r\n let $columns = $rows.eq(rowIndex).find('td')\r\n _iterateColumns($columns, targetRowIndex)\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n function interpPlainPaste(paste) {\r\n if (textHelper.isNullOrEmpty(paste) === false) {\r\n let cordsOfSelectedIndices = controls.incell.getSelectedCellsCords($incell)\r\n\r\n let rows = paste.split('\\n')\r\n if (rows.length == 1) {\r\n let cols = rows[0].split('\\t')\r\n let selectedRowsCount = (cordsOfSelectedIndices.endRowIndex - cordsOfSelectedIndices.startRowIndex) + 1\r\n for (var selectedRowIndex = 0; selectedRowIndex < selectedRowsCount; selectedRowIndex++) {\r\n for (var colIndex = 0; colIndex < cols.length; colIndex++) {\r\n let cellInfo = getCell(cordsOfSelectedIndices.startRowIndex + selectedRowIndex, cordsOfSelectedIndices.startColIndex + colIndex)\r\n if (cellInfo.existP) {\r\n setCellValue(cellInfo.$cell,\r\n cols[colIndex])\r\n }\r\n }\r\n }\r\n } else {\r\n let rowsToPasteCount = rows.length;\r\n addMissingRows(cordsOfSelectedIndices.startRowIndex, rowsToPasteCount)\r\n\r\n for (let rowIndex = 0; rowIndex < rowsToPasteCount; rowIndex++) {\r\n let cols = rows[rowIndex].split('\\t')\r\n let targetRowIndex = cordsOfSelectedIndices.startRowIndex + rowIndex\r\n let $targetRow = $incell.data('rows').eq(targetRowIndex)\r\n\r\n if ($targetRow.data('deletedP') !== true) {\r\n for (var colIndex = 0; colIndex < cols.length; colIndex++) {\r\n let cellInfo = getCell(targetRowIndex, cordsOfSelectedIndices.startColIndex + colIndex)\r\n if (cellInfo.existP) {\r\n setCellValue(cellInfo.$cell,\r\n cols[colIndex])\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n hiddenInput.on('input', function (e) {\r\n var value = hiddenInput.val(' ');\r\n focusHiddenArea()\r\n });\r\n\r\n $incell[0].addEventListener('paste', function (e) {\r\n loading.show($incell)\r\n\r\n let clipboardData = e.clipboardData;\r\n let plain = clipboardData.getData('text/plain')\r\n let html = clipboardData.getData('text/html')\r\n controls.incell.setPastingValues($incell, true)\r\n setTimeout(() => {\r\n\r\n if (textHelper.isNullOrEmpty(html) === false) {\r\n let $html = $(html)\r\n let tables = $()\r\n for (let i = 0; i < $html.length; i++) {\r\n let $i = $html.eq(i)\r\n\r\n if ($i.is('table')) {\r\n tables = $.merge(tables, $i)\r\n }\r\n\r\n\r\n let $childTable = $i.find('table')\r\n if ($childTable.length > 0) {\r\n tables = $.merge(tables, $childTable)\r\n }\r\n }\r\n\r\n if (tables && tables.length > 0) {\r\n try {\r\n interpTablePaste(tables)\r\n } catch (exception) {\r\n console.log(exception)\r\n\r\n interpPlainPaste(plain)\r\n }\r\n } else {\r\n interpPlainPaste(plain)\r\n }\r\n } else {\r\n interpPlainPaste(plain)\r\n }\r\n\r\n loading.hide($incell)\r\n controls.incell.setPastingValues($incell, false)\r\n controls.incell.toggleAllColumnsWarnings($incell)\r\n controls.incell.toggleAllRowsWarnings($incell)\r\n }, 10)\r\n })\r\n\r\n $incell[0].addEventListener('copy', function (e) {\r\n let $s = $incell.find('.kdr-incell-item-cell-clicked, .ui-selected')\r\n\r\n if ($s.length > 0) {\r\n e.preventDefault()\r\n let clipboardData = e.clipboardData;\r\n let texts = []\r\n let plainTextData = '';\r\n let $htmlData = $('
')\r\n\r\n for (var i = 0, c = 0; i < $s.length; i++) {\r\n let closestRowIndex = $s.eq(i).closest('.kdr-incell-item-row').index()\r\n let $textHolder = $s.eq(i).find('.kdr-incell-input, .kdr-incell-text')\r\n let tdTextContent\r\n let $tdHtmlContent = $('')\r\n\r\n if (!texts[closestRowIndex]) {\r\n texts[closestRowIndex] = []\r\n c = 0\r\n let $tr = $('')\r\n $tr.append($tdHtmlContent)\r\n $htmlData.append($tr)\r\n } else {\r\n $htmlData.find('tr:last-of-type').append($tdHtmlContent)\r\n }\r\n\r\n if ($textHolder.hasClass('kdr-incell-input')) {\r\n let v = $textHolder.valExtended();\r\n if ($textHolder.is(':checkbox')) {\r\n tdTextContent = v ? 1 : 0\r\n }\r\n else if ($textHolder.hasClass('kdr-dropdown-w-search-item_selected')) {\r\n tdTextContent = kdrDropdown.getItemName($textHolder, v)\r\n }\r\n else {\r\n tdTextContent = v\r\n }\r\n }\r\n else if ($textHolder.hasClass('kdr-incell-text-html')) {\r\n tdTextContent = $textHolder.text()\r\n $tdHtmlContent.html($textHolder[0].outerHTML)\r\n }\r\n else if ($textHolder.hasClass('kdr-incell-text')) {\r\n tdTextContent = $textHolder.text()\r\n }\r\n\r\n if (tdTextContent && typeof (tdTextContent) === 'string') {\r\n tdTextContent = tdTextContent.trim()\r\n tdTextContent = tdTextContent.replace(/\\t/g, ' ')\r\n }\r\n\r\n if (!$textHolder.hasClass('kdr-incell-text-html')) {\r\n $tdHtmlContent.html(tdTextContent)\r\n }\r\n\r\n texts[closestRowIndex][c] = tdTextContent\r\n\r\n plainTextData += (c++ == 0 && i != 0 ? '\\r\\n' : (i != 0 ? '\\t' : '')) + tdTextContent\r\n }\r\n\r\n clipboardData.setData('text/plain', plainTextData);\r\n clipboardData.setData('text/html', $htmlData.appendTo('').appendTo('')[0].outerHTML);//bjutiful O_O\r\n }\r\n })\r\n },\r\n initInputsBehavior($incell) {\r\n let cellsWithErrors = []\r\n $incell.data('cellsWErrors', cellsWithErrors)\r\n\r\n $incell\r\n .on('kdr.checkedValueCorrectness', '.kdr-incell-item-row .kdr-incell-input', function (e) {\r\n let $input = $(this)\r\n let $cell = $input.data().cell\r\n cellsWithErrors = $incell.data().cellsWErrors\r\n if ((e.hasInvalidValue === true && !textHelper.isNullOrEmpty(e.newValue))\r\n ||\r\n (textHelper.isNullOrEmpty(e.newValue) && $cell.data().requiredP == true)\r\n ) {\r\n cellsWithErrors = controls.incell.addCellToErroredCells($cell, cellsWithErrors)\r\n } else {\r\n cellsWithErrors = controls.incell.removeCellFromErroredCells($cell, cellsWithErrors)\r\n }\r\n $incell.data('cellsWErrors', cellsWithErrors)\r\n\r\n controls.incell.actions.toggleColumnWarnings($incell, $cell.data('columnId'))\r\n controls.incell.actions.toggleRowWarnings($incell, $cell.data('cordRow'))\r\n })\r\n .on('change', 'textarea.kdr-incell-input', function () {\r\n let $input = $(this)\r\n let $cell = $input.data().cell\r\n cellsWithErrors = $incell.data().cellsWErrors\r\n\r\n if (textHelper.isNullOrEmpty($input.valExtended()) && $cell.data().requiredP == true) {\r\n cellsWithErrors = controls.incell.addCellToErroredCells($cell, cellsWithErrors)\r\n } else {\r\n cellsWithErrors = controls.incell.removeCellFromErroredCells($cell, cellsWithErrors)\r\n }\r\n\r\n $incell.data('cellsWErrors', cellsWithErrors)\r\n\r\n controls.incell.actions.toggleColumnWarnings($incell, $cell.data('columnId'))\r\n controls.incell.actions.toggleRowWarnings($incell, $cell.data('cordRow'))\r\n })\r\n .on('keydown', function (e) {\r\n if (e.keyCode == 8 || e.keyCode == 46) {\r\n let $selectedCells = $incell.find('.' + controls.incell.classes.cellClicked)\r\n for (var i = 0; i < $selectedCells.length; i++) {\r\n let $cell = $selectedCells.eq(i)\r\n let $input = $cell.data().input\r\n if ($input.hasClass('kdr-dropdown-w-search-input')) {\r\n $input.data('value', null)\r\n $input.find('.item_selected-text').text('')\r\n\r\n $input.trigger({\r\n type: 'kdr',\r\n namespace: 'checkedValueCorrectness',\r\n newValue: null\r\n })\r\n }\r\n else if ($input[0] != document.activeElement) {\r\n controls.incell.setCellValue($cell, '')\r\n }\r\n }\r\n }\r\n })\r\n .on('focus', '.kdr-incell-input.datepicker', function (e) {\r\n let $p = $(this)\r\n if (pickers.isInited($p) !== true) {\r\n pickers.initSingle.basedOnClass($p)\r\n pickers.show($p)\r\n }\r\n })\r\n },\r\n initTinyMceEditor($incell) {\r\n $incell\r\n .on('focus', '.kdr-incell-input.html-editor:not(.mce-content-body)', function () {\r\n let $input = $(this)\r\n\r\n let thisFontSize = $input.css('font-size').replace('px', '')\r\n let fontSizesNumbers = [4, 6, 8, 10, 12, 14, 16, 18, 24, 36, thisFontSize]\r\n fontSizesNumbers = arrayHelper.unique(fontSizesNumbers)\r\n fontSizesNumbers = arrayHelper.sortNumbers(fontSizesNumbers)\r\n\r\n tinymce.init({\r\n target: $input[0],\r\n inline: true,\r\n menubar: false,\r\n plugins: ['code paste'],\r\n toolbar: 'undo redo | fontsizeselect | fontselect | forecolor backcolor | bold italic | bullist numlist | code',\r\n extended_valid_elements: 'marker,b/strong,i/em',\r\n force_p_newlines: false,\r\n entity_encoding: \"raw\",\r\n fontsize_formats: fontSizesNumbers.map(x => x + 'px').join(' '),\r\n\r\n });\r\n })\r\n .on('focusout', '.kdr-incell-input.html-editor.mce-content-body', function (e) {\r\n if (this.kdr == undefined || this.kdr.initedTinyMceFIX !== true) {\r\n\r\n let $target = $(e.relatedTarget)\r\n let inputId = this.attributes.id?.value ?? ''\r\n let editor = tinymce.get(inputId)?.editorContainer\r\n let $targetClosestTinyMceMenu = $target.closest('.tox-tinymce.tox-tinymce-inline')\r\n let $targetClosestHtmlEditor = $target.closest('.kdr-incell-input.html-editor')\r\n\r\n\r\n if (e.relatedTarget == null ||\r\n (\r\n e.relatedTarget != this &&\r\n e.relatedTarget != editor &&\r\n ($targetClosestTinyMceMenu.length == 0 || $targetClosestTinyMceMenu[0] != editor) &&\r\n ($targetClosestHtmlEditor.length == 0 || $targetClosestHtmlEditor[0] != this)\r\n )\r\n ) {\r\n editor.style.display = 'none'\r\n if (this.kdr == undefined) this.kdr = {}\r\n this.kdr.initedTinyMceFIX = true\r\n }\r\n }\r\n })\r\n },\r\n getSelectedCellsCords($incell) {\r\n let $selectedCells = $incell.find('.' + controls.incell.classes.cellSelected + ', .' + controls.incell.classes.cellClicked)\r\n function getIndices($item) {\r\n return {\r\n rowIndex: $item.closest('.' + controls.incell.classes.itemRow).index(),\r\n colIndex: $item.index() - 1 //minus first TH which has rowNumber FIXME\r\n }\r\n }\r\n\r\n let startIndices = getIndices($selectedCells.first())\r\n let endIndices = getIndices($selectedCells.last())\r\n\r\n return {\r\n startRowIndex: startIndices.rowIndex,\r\n startColIndex: startIndices.colIndex,\r\n endRowIndex: endIndices.rowIndex,\r\n endColIndex: endIndices.colIndex\r\n }\r\n },\r\n getCellCords($cell) {\r\n return {\r\n row: $cell.data('cordRow'),\r\n col: $cell.data('cordCol'),\r\n }\r\n },\r\n setCellCords($cell, row, col) {\r\n $cell.data('cordRow', row)\r\n $cell.data('cordCol', col)\r\n return $cell\r\n },\r\n //sets value in cell if cell is editable\r\n setCellValue($cell, value) {\r\n if ($cell.data('editableP') === true) {\r\n let $input = $cell.data().input\r\n let cellClasses = $input.prop('class')\r\n if (cellClasses.includes('datepicker')) {\r\n $input.valExtended(value) //jest robiona konwersja z 3 popularnych formatow dat na ten \"wlasciwy\", jak jest zla to jest zmieniana wartosc data('valueIsInvalid')\r\n }\r\n else if (cellClasses.includes('kdr-numeric')) {\r\n let isValueValid = $input.checkNumericInputValueCorrectnes(value)\r\n\r\n $input\r\n .valExtended(value)\r\n .data('valueIsInvalid', !isValueValid)\r\n .trigger({\r\n type: 'kdr',\r\n namespace: 'checkedValueCorrectness',\r\n hasInvalidValue: !isValueValid,\r\n newValue: value\r\n })\r\n }\r\n else if (cellClasses.includes('kdr-dropdown-w-search-input')) {\r\n let $menu = $input.parent().parent().parent().data().dropdownMenu ?? $('#' + $input.data('target'))\r\n let $foundItem = $()\r\n\r\n if (value != null) {\r\n $foundItem = $menu.find('.kdr-dropdown-w-search-item-text').filter(function () {\r\n return this.textContent.toLowerCase().trim() === (value?.toString().toLowerCase().trim() ?? \"\")\r\n })\r\n }\r\n let hasInvalidValue = false;\r\n if ($foundItem.length >= 1) { //dziwne bedzie jezeli w jednej ddl beda dwa elementy o tej samej nazwie...\r\n $input.valExtended($foundItem.parent())\r\n } else {\r\n $input.data('value', null)\r\n $input.find('.item_selected-text').text(value)\r\n hasInvalidValue = true\r\n }\r\n $input.data('valueIsInvalid', hasInvalidValue)\r\n .trigger({\r\n type: 'kdr',\r\n namespace: 'checkedValueCorrectness',\r\n hasInvalidValue: hasInvalidValue,\r\n newValue: value\r\n })\r\n\r\n }\r\n else if (cellClasses.includes('kdr-custom-checkbox')) {\r\n $input.valExtended(value) //wszystko co nie jest zerem|undefined|nullem|empty stringiem, jest na true, nie mozna ustawic zlej wartosci (musialo by to poskutowac zmiana checkboxa na inny input a to jest chore!)\r\n }\r\n else if (cellClasses.includes('html-editor') && !cellClasses.includes('mce-content-body')) {\r\n $input.html(value)\r\n }\r\n else {\r\n $input.valExtended(value) //wszystko jest poprawne, nie mozna ustawic zlej wartosci\r\n }\r\n }\r\n },\r\n /**\r\n * If messege is not null or empty it's adding tooltip with message, and adding cell to dictionaru\r\n * otherwise it's deleting tooltip with message\r\n * @param {jQuery.object} $cell\r\n * @param {Array<$>} cellWErrors\r\n * @param {string} errorMessage\r\n * @returns Edited @param cellWErrors\r\n */\r\n addCellToErroredCells($cell, cellsWithErrors, errorMessage) {\r\n if ($cell.data().editableP === true) {\r\n $cell.addClass(controls.incell.classes.cellError)\r\n\r\n if (cellsWithErrors.indexOf($cell) == -1) {\r\n cellsWithErrors.push($cell)\r\n }\r\n\r\n let errorMessageP = !textHelper.isNullOrEmpty(errorMessage)\r\n if (!errorMessageP) {\r\n if ($cell.data('bs.tooltip') != undefined) {\r\n tooltipHelper.removeFromItem($cell)\r\n }\r\n } else if (errorMessageP) {\r\n tooltipHelper.initOnItem($cell, { title: errorMessage, delay: { show: 25, hide: 25 } })\r\n }\r\n }\r\n\r\n return cellsWithErrors\r\n },\r\n /**\r\n * Deleting tooltip with message, and item from cellsWErrors\r\n * @param {jQuery.object} $cell\r\n * @param {Array<$>} cellWErrors\r\n * @returns Edited @param cellWErrors\r\n */\r\n removeCellFromErroredCells($cell, cellsWithErrors) {\r\n if ($cell.data().editableP === true) {\r\n $cell.removeClass(controls.incell.classes.cellError)\r\n cellsWithErrors = cellsWithErrors.filter(x => x != $cell)\r\n\r\n if ($cell.data('bs.tooltip') != undefined) {\r\n tooltipHelper.removeFromItem($cell)\r\n }\r\n }\r\n\r\n return cellsWithErrors\r\n },\r\n /**\r\n * Smooth scrolling view to selected cell.\r\n * @param {any} $targetCell\r\n * @param {controls.incell.moveDirections} directionX\r\n */\r\n scrollViewToCell($targetCell, directionX, directionY) {\r\n let pageHeaderHeight = this.constantsValues.pageHeaderHeight\r\n let pos = $targetCell.getPositionInViewport()\r\n let vpp = getViewportPosition()\r\n const offset = 100\r\n let scrollOptions = {\r\n left: window.scrollX,\r\n top: window.scrollY,\r\n behavior: 'instant'\r\n }\r\n\r\n if (directionX == this.moveDirections.left && pos.left < vpp.left + offset) { //going left\r\n scrollOptions.left = window.scrollX - (vpp.left - pos.left) - offset\r\n }\r\n else if (directionX == this.moveDirections.right && pos.left + offset > vpp.right) { //going right\r\n scrollOptions.left = window.scrollX + (pos.left - vpp.right) + offset\r\n }\r\n\r\n if (directionY == this.moveDirections.top && pos.top < vpp.top + pageHeaderHeight + offset) { //going top\r\n scrollOptions.top = window.scrollY - vpp.top + pos.top - offset\r\n }\r\n else if (directionY == this.moveDirections.bottom && pos.top + offset > vpp.bottom) { //going bottom\r\n scrollOptions.top = window.scrollY + (pos.top - vpp.bottom) + offset\r\n }\r\n },\r\n checkIfIncellHaveErrors($incell) {\r\n let $rows = $incell.data('rows')\r\n\r\n for (var i = 0; i < $rows.length; i++) {\r\n let $r = $rows.eq(i)\r\n if ($r.hasClass('kdr-incell-item-row-added') && $r.data().markedToDeleteP !== true) {\r\n let $cells = $incell.data().cells[i]\r\n let isAnyWithValueP = false\r\n\r\n for (var j = 0; j < $cells.length; j++) {\r\n let $cell = $cells[j]\r\n let input = $cell.data().input\r\n let v = input.valExtended()\r\n if (input.hasClass('kdr-numeric')) {\r\n isAnyWithValueP |= v != undefined && v != null && v != ''\r\n } else if (!input.hasClass('kdr-custom-checkbox')) {\r\n isAnyWithValueP |= !textHelper.isNullOrEmpty(v)\r\n }\r\n }\r\n\r\n if (isAnyWithValueP == true) {\r\n for (var j = 0; j < $cells.length; j++) {\r\n let $cell = $cells[j]\r\n let input = $cell.data().input\r\n let v;\r\n if (input.hasClass('kdr-dropdown-w-search-input')) {\r\n let x = input.valExtended()\r\n v = kdrDropdown.getItemName(input, x)\r\n } else {\r\n v = input.valExtended()\r\n }\r\n controls.incell.setCellValue($cell, v)\r\n }\r\n } else {\r\n let cellsWithErrors = $incell.data().cellsWErrors\r\n for (var j = 0; j < $cells.length; j++) {\r\n let $cell = $cells[j]\r\n\r\n cellsWithErrors = controls.incell.removeCellFromErroredCells($cell, cellsWithErrors)\r\n $incell.data('cellsWErrors', cellsWithErrors)\r\n }\r\n }\r\n }\r\n }\r\n\r\n let $cellsWithErrors = $incell.data('cellsWErrors')\r\n return $cellsWithErrors.length > 0 ?? false\r\n },\r\n sortCellsByRow($cells) {\r\n return $cells.sort(function (a, b) {\r\n let aRow = controls.incell.getCellCords(a).row\r\n let bRow = controls.incell.getCellCords(b).row\r\n if (aRow == bRow) return 0\r\n return aRow > bRow ? 1 : -1\r\n });\r\n },\r\n setPastingValues($incell, state) {\r\n $incell.data('pastingValues', state)\r\n },\r\n isPastingValues($incell) {\r\n return $incell.data('pastingValues') === true\r\n },\r\n toggleAllColumnsWarnings($incell) {\r\n let headers = $incell.data().headers\r\n for (var id in headers) {\r\n controls.incell.actions.toggleColumnWarnings($incell, id)\r\n }\r\n },\r\n toggleAllRowsWarnings($incell) {\r\n let $cellsWithErrors = $incell.data('cellsWErrors')\r\n\r\n for (var rowIndex in arrayHelper.groupBy($cellsWithErrors, (x) => x.data('cordRow'))) {\r\n if (rowIndex != 'undefined') {\r\n controls.incell.actions.toggleRowWarnings($incell, rowIndex)\r\n }\r\n }\r\n },\r\n cancelEditing($incell) {\r\n modal.getModalAjax({\r\n type: modal.ajaxModalType.warning,\r\n title: '~{Attention!}',\r\n message: '~{All unsaved changes will be lost, are you sure you want to close the page?}',\r\n actionBtnText: '~{Yes}',\r\n cancelBtnText: '~{No}',\r\n actionBtnClasses: 'btn-success',\r\n actionBtnCallback: () => {\r\n if (window.history.length <= 2) {\r\n window.location = $incell.data('options').backLink\r\n } else {\r\n site.goBack()\r\n }\r\n }\r\n })\r\n },\r\n watchRelations(oldIncellId, newIncellId, enableWatcherP = false) {\r\n function _swapIdsInCommands($input) {\r\n let oldValue = $input.val()\r\n $input.val(oldValue.replaceAll(oldIncellId, newIncellId))\r\n }\r\n\r\n if (enableWatcherP == true) {\r\n $(document).on(gridEvents.AFTER_RENDER + ' ' + controlEvents.BEFORE_PARSE_COMMAND, '.kdr-grid, .kdr-filters, .kdr-control', function () {\r\n $control = convert.toJqueryObject(this)\r\n let $commands = $control.find('.kdr-commands')\r\n if ($commands.length > 0) {\r\n _swapIdsInCommands($commands)\r\n }\r\n })\r\n\r\n }\r\n\r\n $('.kdr-commands').each((i, e) => _swapIdsInCommands(convert.toJqueryObject(e)))\r\n },\r\n actions: {\r\n /**\r\n * returns $incell\r\n * @param {any} $incell\r\n * @param {any} $row\r\n * @param {any} $btn\r\n * @param {any} showAsDeletedP\r\n * @returns @param $incell\r\n */\r\n toggleRowRemoved($incell, $row, $btn, showAsDeletedP) {\r\n $btn.hide()\r\n $btn.siblings('.kdr-incell-item-remove, .kdr-incell-item-remove-undo').show()\r\n $row.data('deletedP', showAsDeletedP)\r\n\r\n let rowIndex = $row.index()\r\n let rowCells = $incell.data()?.cells[rowIndex]\r\n\r\n if (showAsDeletedP) {\r\n $row.addClass('kdr-incell-item-row-deleted')\r\n $row.data('markedToDeleteP', true)\r\n\r\n $row.on('show.bs.tooltip', function () {\r\n $row.tooltip('update')\r\n })\r\n\r\n tooltipHelper.initOnItem($row, {\r\n title: $incell.data('texts').removedRow,\r\n delay: {\r\n show: 125\r\n },\r\n trigger: 'manual',\r\n template: '
'\r\n })\r\n\r\n $row.on('mouseenter', function () {\r\n $row.tooltip('show')\r\n }).on('mouseleave', function (e) {\r\n if ($row.data('bs.tooltip').tip != e.relatedTarget && $(e.relatedTarget).closest('#' + $row.data('bs.tooltip').tip.id).length == 0) {\r\n $row.tooltip('hide')\r\n }\r\n })\r\n\r\n\r\n\r\n let cellsWithErrors = $incell.data().cellsWErrors\r\n for (var i = 0; i < rowCells.length; i++) {\r\n rowCells[i].data()?.input?.attr('disabled', 'disabled')\r\n\r\n if ($row.hasClass('kdr-incell-item-row-added')) {\r\n cellsWithErrors = controls.incell.removeCellFromErroredCells(rowCells[i], cellsWithErrors)\r\n }\r\n }\r\n $incell.data('cellsWErrors', cellsWithErrors)\r\n\r\n } else {\r\n $row.removeClass('kdr-incell-item-row-deleted')\r\n $row.data('markedToDeleteP', false)\r\n tooltipHelper.removeFromItem($row)\r\n\r\n for (var i = 0; i < rowCells.length; i++) {\r\n rowCells[i].data()?.input?.removeAttr('disabled')\r\n }\r\n }\r\n return $incell\r\n },\r\n /**\r\n * adding rows to incell, returns $incell\r\n * @param {any} $incell\r\n * @param {any} count\r\n * @returns $incell\r\n */\r\n addRows($incell, count) {\r\n let $rowTemplate = $incell.find('.kdr-incell-item-row-template')\r\n loading.show($incell)\r\n\r\n for (var i = 0; i < count; i++) {\r\n let $lastRow = $incell.data('rows').last()\r\n let lastRowOrdinal = ($lastRow.data('itemRowNumber') ?? 0)\r\n\r\n let newRowOrdinal = lastRowOrdinal + 1\r\n let $newRow = $rowTemplate.clone().data('itemRowNumber', newRowOrdinal)\r\n $newRow.find('.kdr-incell-item-row-number-value').text(newRowOrdinal)\r\n $newRow.data().warningSign = $newRow.find('.kdr-incell-row-warning')\r\n\r\n if ($lastRow.length > 0) {\r\n $newRow.insertAfter($lastRow)\r\n } else {\r\n $incell.find('.kdr-incell-table-layout tbody').prepend($newRow)\r\n }\r\n\r\n $newRow.removeClass('kdr-incell-item-row-template')\r\n .addClass('kdr-incell-item-row kdr-incell-item-row-added')\r\n .show()\r\n\r\n $incell\r\n .data('rows', $incell.data('rows').add($newRow))\r\n .data('cells')[lastRowOrdinal] = $newRow.find('.kdr-incell-item-cell').map((i, e) => {\r\n let $cell = $(e)\r\n controls.incell.initCellData($cell)\r\n controls.incell.setCellCords($cell, lastRowOrdinal, i)\r\n\r\n if ($cell.data().input.hasClass('custom-control-input')) {\r\n let newId = uid.getNew()\r\n $cell.data().input.attr('id', newId)\r\n $cell.data().input.next().attr('for', newId)\r\n }\r\n\r\n return $cell\r\n }).toArray()\r\n }\r\n\r\n loading.hide($incell)\r\n return $incell\r\n },\r\n refreshWithInputs($incell) {\r\n let oldValues = []\r\n let cells = $incell.data('cells')\r\n let rows = $incell.data('rows')\r\n let addedRowsCount = 0;\r\n for (var i = 0; i < cells.length; i++) {\r\n addedRowsCount += rows.eq(i).hasClass('kdr-incell-item-row-added') ? 1 : 0\r\n\r\n for (var j = 0; j < cells[i].length; j++) {\r\n let $cell = cells[i][j]\r\n let $input = $cell.data('input')\r\n\r\n if (oldValues[i] == undefined) {\r\n oldValues[i] = []\r\n }\r\n\r\n oldValues[i][j] = $input.valExtended()\r\n }\r\n }\r\n controls.render(controls.getEndpoint($incell), $incell, controls.getInfo($incell), $incell, function ($rerenderedIncell) {\r\n loading.show($rerenderedIncell)\r\n\r\n controls.incell.actions.addRows($rerenderedIncell, addedRowsCount)\r\n let newCells = $rerenderedIncell.data('cells')\r\n\r\n for (var i = 0; i < cells.length; i++) {\r\n for (var j = 0; j < cells[i].length; j++) {\r\n let $input = newCells[i][j].data('input')\r\n $input.valExtended(oldValues[i][j])\r\n }\r\n }\r\n\r\n loading.hide($rerenderedIncell)\r\n })\r\n },\r\n magic: function (endpoint, control, response, $loadingTarget = null, renderOnError = false, selectP = false) {\r\n let $control = convert.toJqueryObject(control)\r\n\r\n if (response.info != null && (response.renderP != null ? response.renderP : (response.code != gridResponseCodes.ERROR || renderOnError))) {\r\n if ($control.hasClass('kdr-control-rerender-w-inputs')) {\r\n controls.renderWithInputs(endpoint, $control, response.info, $loadingTarget, null, selectP)\r\n } else {\r\n controls.render(endpoint, $control, response.info, $loadingTarget, null, selectP)\r\n }\r\n }\r\n\r\n if (response.message != null && response.message.length != null) {\r\n switch (response.code) {\r\n case gridResponseCodes.SUCCESS:\r\n modal.getModal.success(\"~{Success}\", response.message, true, null, null, null, null, null, $loadingTarget)\r\n break\r\n case gridResponseCodes.WARNING:\r\n modal.getModal.warning(\"~{Warning}\", response.message, true, null, null, null, null, null, $loadingTarget)\r\n break\r\n case gridResponseCodes.ERROR:\r\n modal.getModal.danger(\"~{Error}\", response.message, true, null, null, null, null, null, $loadingTarget)\r\n break\r\n case gridResponseCodes.INFO:\r\n default:\r\n modal.getModal.info(\"Info\", response.message, true, null, null, null, null, null, $loadingTarget)\r\n break\r\n }\r\n }\r\n if (response.returnValue != undefined && response.returnValue != null) {\r\n let returnedCells = JSON.parse(response.returnValue)\r\n\r\n let cells = $control.data().cells\r\n let rows = $control.data().rows\r\n\r\n let erroredCells = $control.data().cellsWErrors\r\n let newRowsCount = 0\r\n\r\n for (var x in arrayHelper.groupBy(returnedCells, 'rowIndex')) {\r\n if (x != 'undefined') {\r\n newRowsCount++;\r\n }\r\n }\r\n\r\n controls.incell.actions.addRows($control, newRowsCount)\r\n\r\n for (var i = 0; i < returnedCells.length; i++) {\r\n let returnedCell = returnedCells[i]\r\n let rowIndex;\r\n if (returnedCell.rowIndex != null) {\r\n rowIndex = returnedCell.rowIndex - 1\r\n } else if (returnedCell.rowId != null) {\r\n rowIndex = rows.map((x) => {\r\n let r = rows.eq(x)\r\n let isOk = r.data('itemRowId') == returnedCell.rowId\r\n if (isOk) {\r\n return r;\r\n }\r\n })[0]?.data('itemRowNumber') - 1 ?? -1\r\n }\r\n\r\n let $cell = cells[rowIndex].filter(x => x.data('columnId') == returnedCell.colId)[0]\r\n\r\n if (returnedCell.message) {\r\n controls.incell.addCellToErroredCells($cell, erroredCells, returnedCell.message)\r\n }\r\n\r\n if (returnedCell.changeValueP === true) {\r\n controls.incell.setCellValue($cell, returnedCell.value ?? '')\r\n }\r\n }\r\n\r\n $control.data('cellsWErrors', erroredCells)\r\n }\r\n\r\n controls.incell.toggleAllColumnsWarnings($control)\r\n controls.incell.toggleAllRowsWarnings($control)\r\n\r\n controls.onGridAfterMagicError($control, response.code, null, response.info, response.returnValue, true); //fixme zmienic na onControlAfterMagicError\r\n },\r\n bulkAct($incell, operationMagic) {\r\n if (controls.incell.checkIfIncellHaveErrors($incell)) {\r\n controls.incell.actions.showModalWithCellsError($incell)\r\n } else {\r\n try {\r\n loading.show($incell)\r\n\r\n let rows = $incell.data('rows')\r\n let cells = $incell.data('cells')\r\n let payload = []\r\n\r\n for (var i = 0; i < rows.length; i++) {\r\n let $row = rows.eq(i)\r\n let markedToDeleteP = $row.data('markedToDeleteP') ?? false\r\n let isInsertRow = $row.hasClass('kdr-incell-item-row-added')\r\n\r\n if (!(markedToDeleteP === true && isInsertRow)) {\r\n let magic = ''\r\n\r\n let rowArgs = {}\r\n\r\n let inputs = []\r\n if (isInsertRow === true) {\r\n magic = $row.data('operationInsert')\r\n } else if (markedToDeleteP === true) {\r\n magic = $row.data('operationDelete')\r\n } else {\r\n magic = $row.data('operationUpdate')\r\n }\r\n\r\n let isAnyArgWithValue = false\r\n\r\n if (markedToDeleteP === false) {\r\n for (var j = 0; j < cells[i].length; j++) {\r\n let $input = cells[i][j].data().input\r\n if ($input != undefined && $input.length == 1) {\r\n inputs.push($input)\r\n\r\n if (isInsertRow === true) {\r\n let v = $input.valExtended()\r\n if ($input.hasClass('kdr-numeric')) {\r\n isAnyArgWithValue |= v != undefined && v != null\r\n } else if (!$input.hasClass('kdr-custom-checkbox')) {\r\n isAnyArgWithValue |= !textHelper.isNullOrEmpty(v)\r\n }\r\n }\r\n }\r\n }\r\n\r\n\r\n\r\n controls.getArgs(inputs, rowArgs)\r\n\r\n }\r\n if (!isInsertRow || (isInsertRow && isAnyArgWithValue)) {\r\n payload.push(\r\n {\r\n magic: magic,\r\n args: rowArgs\r\n })\r\n }\r\n }\r\n }\r\n\r\n\r\n let formData = new FormData();\r\n formData.append('info', $incell.incell().getInfo())\r\n formData.append('magic', operationMagic)\r\n formData.append('payload', JSON.stringify(payload))\r\n\r\n $.ajax({\r\n type: \"POST\",\r\n url: __root + \"InCell/BulkAct\",\r\n datatype: \"json\",\r\n traditional: true,\r\n contentType: false,\r\n processData: false,\r\n data: formData,\r\n success: function (response) {\r\n controls.onControlBeforeRender($incell, response.code, controlActions.ACT, response.info);\r\n controls.incell.actions.magic(controls.getEndpoint($incell), $incell, response)\r\n },\r\n error: function (response) {\r\n toastr.error(__l.SomethingWentWrong, __l.Error)\r\n console.error(response)\r\n },\r\n beforeSend: function () { loading.show($incell) },\r\n complete: function () { loading.hide($incell) }\r\n })\r\n\r\n } catch (exception) {\r\n toastr.error(__l.SomethingWentWrong, __l.Error)\r\n console.error(exception)\r\n } finally {\r\n loading.hide($incell)\r\n }\r\n }\r\n },\r\n showModalWithCellsError($incell) {\r\n let $cellsWithErrors = $incell.data('cellsWErrors')\r\n\r\n let $orderedCellsWithError = controls.incell.sortCellsByRow($cellsWithErrors)\r\n\r\n let incellTexts = $incell.data('texts')\r\n if ($orderedCellsWithError.length > 0) {\r\n let errorsString = incellTexts.errorsInCellsMustBeFixed\r\n\r\n modal.getModal.danger(incellTexts.cannotSaveData, errorsString, true)\r\n }\r\n },\r\n toggleColumnWarnings($incell, columnId) {\r\n if (controls.incell.isPastingValues($incell) === false) {\r\n let $cellsWithErrors = $incell.data('cellsWErrors').filter((x) => x.data('columnId') == columnId)\r\n let $columnHeaderWarningContainer = $incell.data().headers[columnId].data().warningSign\r\n\r\n if ($cellsWithErrors.length == 0) {\r\n $columnHeaderWarningContainer.fadeOut()\r\n }\r\n else if ($cellsWithErrors.length >= 0) {\r\n\r\n let incellTexts = $incell.data('texts')\r\n let tooltipText = incellTexts.rowsWithInappropriateValues\r\n let $orderedCellsWithError = controls.incell.sortCellsByRow($cellsWithErrors)\r\n\r\n for (var i = 0; i < $orderedCellsWithError.length; i++) {\r\n tooltipText += `
${incellTexts.row} ${$orderedCellsWithError[i].data().cordRow + 1}`\r\n }\r\n\r\n $columnHeaderWarningContainer.tooltip('dispose')\r\n tooltipHelper.initOnItem($columnHeaderWarningContainer, {\r\n title: tooltipText,\r\n html: true\r\n })\r\n\r\n $columnHeaderWarningContainer.fadeIn()\r\n }\r\n }\r\n },\r\n toggleRowWarnings($incell, rowIndex) {\r\n if (controls.incell.isPastingValues($incell) === false) {\r\n let $cellsWithErrors = $incell.data('cellsWErrors').filter((x) => x.data('cordRow') == rowIndex)\r\n let $rowWarningContainer = $incell.data().rows.eq(rowIndex).data().warningSign\r\n\r\n if ($cellsWithErrors.length == 0) {\r\n $rowWarningContainer.fadeOut()\r\n } else {\r\n let incellTexts = $incell.data('texts')\r\n let tooltipText = incellTexts.colsWithInappropriateValues\r\n\r\n let $orderedCellsWithError = $cellsWithErrors //controls.incell.sortCellsByRow($cellsWithErrors)\r\n\r\n for (var i = 0; i < $orderedCellsWithError.length; i++) {\r\n let columnName = $incell.data().headers[$orderedCellsWithError[i].data().columnId].text().trim()\r\n tooltipText += `
${columnName}`\r\n }\r\n\r\n $rowWarningContainer.tooltip('dispose')\r\n tooltipHelper.initOnItem($rowWarningContainer, {\r\n title: tooltipText,\r\n html: true\r\n })\r\n\r\n $rowWarningContainer.fadeIn()\r\n }\r\n }\r\n },\r\n openSaveDraftModal($incell) {\r\n let $newModal = modalHelper.addModalToBody($incell.data().modals['saveDraftModal'])\r\n $newModal.data('incell', $incell)\r\n },\r\n openLoadDraftModal($incell) {\r\n let $newModal = modalHelper.addModalToBody($incell.data().modals['loadDraftModal'])\r\n $newModal.data('incell', $incell)\r\n },\r\n saveDraft($incell, operationMagic, draftVersionName) {\r\n try {\r\n loading.show($incell)\r\n\r\n let rows = $incell.data('rows')\r\n let cells = $incell.data('cells')\r\n let payload = []\r\n\r\n for (var i = 0; i < rows.length; i++) {\r\n let $row = rows.eq(i)\r\n let markedToDeleteP = $row.data('markedToDeleteP') ?? false\r\n let isInsertRow = $row.hasClass('kdr-incell-item-row-added')\r\n\r\n if (!(markedToDeleteP === true && isInsertRow)) {\r\n let magic = ''\r\n\r\n let rowArgs = {}\r\n let rawArgs = {}\r\n\r\n let inputs = []\r\n if (isInsertRow === true) {\r\n magic = $row.data('operationInsert')\r\n } else if (markedToDeleteP === true) {\r\n magic = $row.data('operationDelete')\r\n } else {\r\n magic = $row.data('operationUpdate')\r\n }\r\n\r\n let isAnyArgWithValue = false\r\n\r\n for (var j = 0; j < cells[i].length; j++) {\r\n let $input = cells[i][j].data().input\r\n if ($input != undefined && $input.length == 1) {\r\n inputs.push($input)\r\n\r\n if (isInsertRow === true) {\r\n let v = $input.valExtended()\r\n if ($input.hasClass('kdr-numeric')) {\r\n isAnyArgWithValue |= v != undefined && v != null\r\n } else if (!$input.hasClass('kdr-custom-checkbox')) {\r\n isAnyArgWithValue |= !textHelper.isNullOrEmpty(v)\r\n }\r\n }\r\n\r\n if ($input.hasClass('kdr-dropdown-w-search-input')) {\r\n rawArgs[$input.data('index')] = $input.text()?.trim()\r\n }\r\n }\r\n }\r\n\r\n controls.getArgs(inputs, rowArgs)\r\n\r\n if (!isInsertRow || (isInsertRow && isAnyArgWithValue)) {\r\n payload.push(\r\n {\r\n magic: magic,\r\n args: rowArgs,\r\n rawArgs: rawArgs\r\n })\r\n }\r\n }\r\n }\r\n\r\n\r\n let formData = new FormData();\r\n formData.append('info', $incell.incell().getInfo())\r\n formData.append('magic', operationMagic)\r\n formData.append('payload', JSON.stringify(payload))\r\n formData.append('draftVersionName', draftVersionName)\r\n\r\n $.ajax({\r\n type: \"POST\",\r\n url: __root + \"InCell/BulkAct\",\r\n datatype: \"json\",\r\n traditional: true,\r\n contentType: false,\r\n processData: false,\r\n data: formData,\r\n success: function (response) {\r\n controls.onControlBeforeRender($incell, response.code, controlActions.ACT, response.info);\r\n\r\n if (response.message != null && response.message.length != null) {\r\n switch (response.code) {\r\n case gridResponseCodes.SUCCESS:\r\n modal.getModal.success(\"~{Success}\", response.message, true)\r\n break\r\n case gridResponseCodes.WARNING:\r\n modal.getModal.warning(\"~{Warning}\", response.message, true)\r\n break\r\n case gridResponseCodes.ERROR:\r\n modal.getModal.danger(\"~{Error}\", response.message, true)\r\n break\r\n case gridResponseCodes.INFO:\r\n default:\r\n modal.getModal.info(\"Info\", response.message, true)\r\n break\r\n }\r\n }\r\n\r\n controls.refresh($incell.data().modals['loadDraftModal'].find('.kdr-grid'))\r\n\r\n if (response.code != gridResponseCodes.ERROR) {\r\n controls.setInfo($incell, response.info)\r\n modalHelper.removeModalFromBody($('.kdr-incell-save-draft-modal.show'))\r\n }\r\n },\r\n error: function (response) {\r\n toastr.error(__l.SomethingWentWrong, __l.Error)\r\n console.error(response)\r\n },\r\n beforeSend: function () { loading.show($incell) },\r\n complete: function () { loading.hide($incell) }\r\n })\r\n\r\n } catch (exception) {\r\n toastr.error(__l.SomethingWentWrong, __l.Error)\r\n console.error(exception)\r\n } finally {\r\n loading.hide($incell)\r\n }\r\n },\r\n loadDraft($incell, draftMagic, $loadingTarget) {\r\n try {\r\n loading.show($loadingTarget)\r\n\r\n controls.refresh(\r\n $incell,\r\n null,\r\n null,\r\n null,\r\n null,\r\n ($refreshedControl) => {\r\n try {\r\n loading.show($loadingTarget)\r\n\r\n $.ajax({\r\n type: \"POST\",\r\n url: __root + \"InCell/GetDraft\",\r\n datatype: \"json\",\r\n traditional: true,\r\n data: {\r\n \"info\": controls.getInfo($refreshedControl),\r\n \"magic\": draftMagic\r\n },\r\n success: function (response) {\r\n if (response.code != gridResponseCodes.ERROR) {\r\n controls.setInfo($refreshedControl, response.info)\r\n modalHelper.removeModalFromBody($('.kdr-incell-load-draft-modal.show'))\r\n }\r\n\r\n controls.incell.actions.magic(controls.getEndpoint($refreshedControl), $refreshedControl, response)\r\n },\r\n error: function (response) {\r\n toastr.error(__l.SomethingWentWrong, __l.Error)\r\n console.error(response)\r\n },\r\n beforeSend: function () { loading.show($refreshedControl) },\r\n complete: function () { loading.hide($refreshedControl) }\r\n })\r\n\r\n } catch (exception) {\r\n toastr.error(__l.SomethingWentWrong, __l.Error)\r\n console.error(exception)\r\n } finally {\r\n loading.hide($loadingTarget)\r\n }\r\n\r\n })\r\n } catch (exception) {\r\n toastr.error(__l.SomethingWentWrong, __l.Error)\r\n console.error(exception)\r\n } finally {\r\n loading.hide($loadingTarget)\r\n }\r\n }\r\n }\r\n },\r\n filters: {\r\n initUI($filter) {\r\n let $input = $filter.find('[class*=\"ds-ddl-\"]')\r\n\r\n $input.each(function () {\r\n disabler.disableBasedOnDDL($(this));\r\n });\r\n }\r\n }\r\n}\r\n\r\n//grid actions on click on buttons etc\r\n$(function () {\r\n $(document).on('click', '.kdr-grid-change-language', function () {\r\n let $this = $(this)\r\n if ($this.closest('.btn-group').data('changingP') === true) {\r\n return false\r\n }\r\n else {\r\n $this.closest('.btn-group').data('changingP', true)\r\n }\r\n let languageCode = $this.data('language')\r\n let rowIndex = $this.data('rowIndex')\r\n $this.siblings().removeClass('language-active')\r\n $this.addClass('language-active')\r\n $this.closest('td,.modal-body,.kdr-grid').find('td[data-language]' + ((rowIndex != -1) ? '[data-row-index=' + rowIndex + ']' : '') + ':not([data-language=' + languageCode + '])').hide()\r\n $this.closest('td,.modal-body,.kdr-grid').find('td[data-language=' + languageCode + ']' + ((rowIndex != -1) ? '[data-row-index=' + rowIndex + ']' : '')).show()\r\n $this.closest('.btn-group').data('changingP', false)\r\n })\r\n\r\n $(document).on(\"click\", \".kdr-grid-sort\", function () {\r\n let $this = $(this)\r\n /*let $thisParent = $this.closest('th')*/\r\n let $grid = $this.closest(\".kdr-grid\")\r\n let index = $this.data(\"index\")\r\n let ascendingP = ($this.data(\"sort\") == \"ASC\") ? true : false\r\n let gridId = \"#\" + $grid.attr(\"id\")\r\n\r\n let func = function () {\r\n $grid = $(gridId)\r\n $.ajax({\r\n type: \"POST\",\r\n url: __root + \"Grid/Sort\",\r\n datatype: \"json\",\r\n traditional: true,\r\n data: {\r\n \"info\": controls.getInfo($grid),\r\n \"index\": index,\r\n \"ascendingP\": ascendingP\r\n },\r\n success: function (response) {\r\n $grid = $(gridId)\r\n controls.magic(\"Grid/Render\", $grid, response, $grid /*$thisParent*/)\r\n }\r\n })\r\n }\r\n\r\n let func2 = function (callback) {\r\n if ($grid.hasClass('kdr-grid-lock-checkboxes')) {\r\n controls.lockCheckboxes($grid, callback)\r\n }\r\n else {\r\n callback && callback()\r\n }\r\n }\r\n\r\n if ($grid.hasClass('kdr-grid-save-all-on-sort-change')) {\r\n func2(function () {\r\n $(document).one(gridEvents.BEFORE_RENDER, gridId, function (event) {\r\n if (event.code == gridResponseCodes.SUCCESS) {\r\n $(document).one(gridEvents.AFTER_RENDER, gridId, func)\r\n }\r\n })\r\n $grid.find('.kdr-grid-save-all').click()\r\n })\r\n\r\n } else {\r\n func2(func)\r\n }\r\n })\r\n\r\n $(document).on(\"click\", \".kdr-grid-page\", function () {\r\n let that = $(this)\r\n //\"\"let $thisParent = that.closest('.page-item')\r\n let $grid = that.closest(\".kdr-grid\")\r\n let page = that.attr(\"data-page\")\r\n let gridId = \"#\" + $grid.attr(\"id\")\r\n\r\n let func = function () {\r\n $grid = $(gridId)\r\n $.ajax({\r\n type: \"POST\",\r\n url: __root + \"Grid/Page\",\r\n datatype: \"json\",\r\n traditional: true,\r\n data: {\r\n \"info\": controls.getInfo($grid),\r\n \"page\": page\r\n //\"page\": that.attr(\"data-page\")\r\n },\r\n success: function (response) {\r\n $grid = $(gridId)\r\n controls.magic(\"Grid/Render\", $grid, response, $grid /*$thisParent*/)\r\n //controls.onGridAfterRender(grid, undefined, undefined)\r\n }\r\n })\r\n }\r\n\r\n let func2 = function (callback) {\r\n if ($grid.hasClass('kdr-grid-lock-checkboxes')) {\r\n controls.lockCheckboxes($grid, callback)\r\n }\r\n else {\r\n callback && callback()\r\n }\r\n }\r\n\r\n if ($grid.hasClass('kdr-grid-save-all-on-page-change')) {\r\n func2(function () {\r\n $(document).one(gridEvents.BEFORE_RENDER, gridId, function (event) {\r\n if (event.code == gridResponseCodes.SUCCESS) {\r\n $(document).one(gridEvents.AFTER_RENDER, gridId, func)\r\n }\r\n })\r\n\r\n $grid.find('.kdr-grid-save-all').click()\r\n })\r\n } else {\r\n func2(func)\r\n }\r\n })\r\n\r\n $(document).on('focus', '.page-link #page-number', function () {\r\n this.select()\r\n })\r\n\r\n $(document).on(\"change\", \".page-link #page-number\", function (event) {\r\n let that = $(this)\r\n let grid = that.closest(\".kdr-grid\")\r\n let $loadingIndicator = that.closest('.page-link')\r\n\r\n function func() {\r\n $.ajax({\r\n type: \"POST\",\r\n url: __root + \"Grid/Page\",\r\n datatype: \"json\",\r\n traditional: true,\r\n data: {\r\n \"info\": controls.getInfo(grid),\r\n \"page\": that.val() - 1\r\n },\r\n success: function (response) {\r\n controls.magic(\"Grid/Render\", grid, response, grid)\r\n //controls.onGridAfterRender(grid, undefined, undefined)\r\n },\r\n beforeSend: function () { loading.show($loadingIndicator) },\r\n complete: function () { loading.hide($loadingIndicator) },\r\n })\r\n }\r\n\r\n if ($grid.hasClass('kdr-grid-lock-checkboxes')) {\r\n controls.lockCheckboxes(grid, func)\r\n }\r\n else {\r\n func()\r\n }\r\n })\r\n $(document).on(\"click\", \".kdr-grid-all-letters\", function () {\r\n $(this).closest('.pagination').find('.page-item.active .kdr-grid-letter').click()\r\n })\r\n $(document).on(\"click\", \".kdr-grid-letter\", function () {\r\n let that = $(this)\r\n let $thisParent = that.closest('.page-item')\r\n let grid = that.closest(\".kdr-grid\")\r\n\r\n function func() {\r\n $.ajax({\r\n type: \"POST\",\r\n url: __root + \"Grid/Letter\",\r\n datatype: \"json\",\r\n traditional: true,\r\n data: {\r\n \"info\": controls.getInfo(grid),\r\n \"letter\": that.attr(\"data-letter\")\r\n },\r\n success: function (response) {\r\n controls.magic(\"Grid/Render\", grid, response, $thisParent)\r\n }\r\n })\r\n }\r\n\r\n if (grid.hasClass('kdr-grid-lock-checkboxes')) {\r\n controls.lockCheckboxes(grid, func)\r\n }\r\n else {\r\n func()\r\n }\r\n })\r\n\r\n ///Zezwala tylko na wprowadzanie wartosci liczbowych\r\n $(document).on(\"input keydown keyup blur drop paste\", \".kdr-grid-numeric, .kdr-numeric\", function (event) {\r\n let $this = $(this)\r\n\r\n if ($this.data('numericInputValidatiorOn') !== true) {\r\n let regex;\r\n\r\n let groupSeparator = $this.data('groupSeparator')\r\n if (groupSeparator == ' ') {\r\n groupSeparator = ' '\r\n\r\n }\r\n if ($this.data('numericType') == 'decimal') {\r\n let decimalSeparator = $this.data('decimalSeparator')\r\n regex = new RegExp(`^-?\\\\d*[${decimalSeparator}]?\\\\d*$`)\r\n } else {\r\n regex = /^-?[0-9]*$/\r\n }\r\n\r\n $this.inputFilter(function (value) {\r\n let isValueValid = regex.test(value)\r\n\r\n $this.data('valueIsInvalid', !isValueValid)\r\n .trigger({\r\n type: 'kdr',\r\n namespace: 'checkedValueCorrectness',\r\n hasInvalidValue: !isValueValid,\r\n newValue: value\r\n })\r\n\r\n return isValueValid;\r\n });\r\n\r\n $this.data('numericInputValidatiorOn', true)\r\n }\r\n })\r\n\r\n $(document).on(\"keydown\", \".kdr-filter-numeric\", function (event) {\r\n let legalKeys = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'Backspace', 'ArrowLeft', 'ArrowRight', 'Delete']\r\n\r\n if (!legalKeys.some(x => x == event.originalEvent.key)) {\r\n event.preventDefault();\r\n }\r\n })\r\n\r\n $(document).on(\"click\", \".kdr-grid-items\", function () {\r\n let that = $(this)\r\n let grid = that.closest(\".kdr-grid\")\r\n let $loadingIndicator = grid\r\n //$loadingIndicator.push(that.closest('.pagination-dropdown'))\r\n\r\n function func() {\r\n $.ajax({\r\n type: \"POST\",\r\n url: __root + \"Grid/Items\",\r\n datatype: \"json\",\r\n traditional: true,\r\n data: {\r\n \"info\": controls.getInfo(grid),\r\n \"items\": that.data(\"value\")\r\n },\r\n success: function (response) {\r\n controls.magic(\"Grid/Render\", grid, response, $loadingIndicator)\r\n }\r\n })\r\n }\r\n\r\n if (grid.hasClass('kdr-grid-lock-checkboxes')) {\r\n controls.lockCheckboxes(grid, func)\r\n }\r\n else {\r\n func()\r\n }\r\n })\r\n\r\n $(document).on(\"click\", \".kdr-grid-toggle-checkbox-filter\", function () {\r\n let $this = $(this)\r\n let $grid = $this.closest(\".kdr-grid\")\r\n let columnMagic = $this.closest('td').data('columnMagic')\r\n controls.lockCheckboxes($grid, function () {\r\n controls.toggleCheckboxFilter($grid, columnMagic, function () {\r\n controls.refresh($grid)\r\n })\r\n })\r\n })\r\n\r\n $(document).on(\"click\", \".kdr-grid-edit\", function () {\r\n let $gridEditButton = $(this)\r\n let $table = $gridEditButton.closest(\".kdr-grid-layout\")\r\n let visibleUpdateItemsCount = $table.find('.kdr-grid-item-update:visible').length\r\n\r\n if (visibleUpdateItemsCount > 0) {\r\n modal.getModal.warning(\"~{Warning}\", \"~{Finish the previous edition.}\", true)\r\n return\r\n } else {\r\n let $selectRow = $gridEditButton.closest(\".kdr-grid-item-select\")\r\n let $langRow = $gridEditButton.closest(\".kdr-grid\").find(\".kdr-grid-change-language-list\")\r\n let $parent = $selectRow.parent()\r\n let $updateRow = $($parent.children().get($selectRow.index() + 1))\r\n\r\n $selectRow.addClass('hide')//.hide()\r\n $updateRow.addClass('show')//.show()\r\n $langRow.removeClass('hide')\r\n\r\n $table.find('.kdr-grid-move-wrapper').hide()\r\n }\r\n })\r\n\r\n $(document).on(\"click\", \".kdr-grid-cancel\", function () {\r\n let that = $(this)\r\n let table = that.closest(\".kdr-grid-layout\")\r\n let update = that.closest(\".kdr-grid-item-update\")\r\n let lang = that.closest(\".kdr-grid\").find(\".kdr-grid-change-language-list\")\r\n let parent = update.parent()\r\n let select = $(parent.children().get(update.index() - 1))\r\n\r\n select.removeClass('hide')\r\n update.removeClass('show')\r\n lang.addClass('hide')\r\n\r\n table.find('.kdr-grid-move-wrapper').show()\r\n })\r\n\r\n $(document).on(\"click\", \".kdr-grid-edit-all\", function () {\r\n let that = $(this)\r\n let table = that.closest(\".kdr-grid\")\r\n table.find(\".kdr-grid-item-select\").addClass('hide')\r\n table.find(\".kdr-grid-item-update\").addClass('show')\r\n table.find(\".kdr-grid-cancel-all\").show().addClass('show') //baghdad\r\n table.find(\".kdr-grid-save-all\").show().addClass('show')\r\n that.hide()\r\n })\r\n\r\n $(document).on(\"click\", \".kdr-grid-cancel-all\", function () {\r\n let that = $(this)\r\n let table = that.closest(\".kdr-grid\")\r\n\r\n table.find(\".kdr-grid-item-select\").removeClass('hide')\r\n table.find(\".kdr-grid-item-update\").removeClass('show')\r\n table.find(\".kdr-grid-edit-all\").show().addClass('show') //baghdad\r\n table.find(\".kdr-grid-save-all\").hide().removeClass('show')\r\n that.hide().removeClass('show')\r\n })\r\n\r\n $(document).on(\"click\", \".kdr-grid-save\", function () {\r\n let $this = $(this)\r\n let $grid = $this.closest(\".kdr-grid\")\r\n let gridId = $grid.attr('id')\r\n let inputs;\r\n\r\n let files = controls.getFiles(gridId)\r\n let progressText = files != undefined && files.length > 0 ? __l.Sending : undefined\r\n\r\n let ordinal = $this.closest(\"td\").data(\"itemOrdinal\")\r\n\r\n if (ordinal != null) {\r\n inputs = $grid.find('td[data-item-ordinal=\"' + ordinal + '\"] .kdr-grid-input')\r\n }\r\n else {\r\n ordinal = $this.closest(\"div.oridinal-class\").attr('data-item-ordinal')\r\n inputs = $grid.find('div[data-item-ordinal=\"' + ordinal + '\"] .kdr-grid-input');\r\n }\r\n /*console.log(ordinal)*/\r\n\r\n if (inputs.length === 0) {\r\n ordinal = $this.closest(\".oridinal-class\").data(\"itemOrdinal\");\r\n inputs = $grid.find('.oridinal-class[data-item-ordinal=\"' + ordinal + '\"] .kdr-grid-input');\r\n }\r\n\r\n let args = {}\r\n controls.getArgs(inputs, args)\r\n\r\n let formData = new FormData();\r\n formData.append('info', controls.getInfo($grid))\r\n formData.append('magic', $this.attr(\"data-action\"))\r\n formData.append('args', JSON.stringify(args))\r\n if (controls.appendFilesToFormData(formData, files, $grid) === false) {\r\n return false\r\n }\r\n\r\n let $loadingTarget = null\r\n if ($grid.closest('.modal').length == 0) {\r\n $loadingTarget = $grid\r\n } else {\r\n $loadingTarget = $grid.closest('.modal-content')\r\n }\r\n\r\n\r\n $.ajax({\r\n type: \"POST\",\r\n url: __root + \"Grid/Act\",\r\n datatype: \"json\",\r\n traditional: true,\r\n contentType: false,\r\n processData: false,\r\n data: formData,\r\n success: function (response) {\r\n controls.onGridBeforeRender($grid, response.code, gridActions.UPDATE, response.info, response.returnValue);\r\n controls.magic(\"Grid/Render\", $grid, response, $loadingTarget)\r\n },\r\n beforeSend: function () { loading.show($loadingTarget, undefined, undefined, progressText) },\r\n complete: function () {\r\n loading.hide($loadingTarget);\r\n },\r\n xhr: function () {\r\n var xhr = new window.XMLHttpRequest();\r\n if (files != undefined && files.length > 0) {\r\n let $progressTextOnDOM = $loadingTarget.find('.waitMe .waitMe_text')\r\n\r\n $loadingTarget.find('.waitMe .waitMe_text').text(__l.Sending)\r\n\r\n xhr.upload.addEventListener(\"progress\", function (evt) {\r\n if (evt.lengthComputable) {\r\n $progressTextOnDOM = $loadingTarget.find('.waitMe .waitMe_text')\r\n\r\n let percentComplete = parseInt(evt.loaded / evt.total * 100)\r\n let newText = __l.SendingWithValue.replace('{0}', percentComplete + '%')\r\n $progressTextOnDOM.text(newText)\r\n\r\n if (percentComplete >= 100) {\r\n setTimeout(() => {\r\n if ($progressTextOnDOM.length > 0) {\r\n $progressTextOnDOM.text(__l.Computing)\r\n }\r\n }, 1000)\r\n }\r\n }\r\n }, false);\r\n\r\n }\r\n // nie wynerwiac\r\n //xhr.addEventListener(\"progress\", function (evt) {\r\n // if (evt.lengthComputable) {\r\n // var percentComplete = evt.loaded / evt.total;\r\n // //Do something with download progress\r\n // }\r\n //}, false);\r\n\r\n return xhr;\r\n },\r\n })\r\n })\r\n\r\n let eraserClicked = false;\r\n\r\n $(document).on(\"click\", \".kdr-grid-quick-filter-clear\", function () {\r\n let $inputGroup = $(this).closest('.input-group')\r\n let $input = $inputGroup.find('.kdr-grid-quick-filter')\r\n let val = $input.valExtended()\r\n\r\n if (val.length > 0 && val != '') {\r\n $input.valExtended('')\r\n $inputGroup.parent().find('.kdr-grid-quick-filter-action').click()\r\n }\r\n eraserClicked = true;\r\n })\r\n\r\n $(document).on(\"click\", \".kdr-grid-quick-filters-clear-all\", function () {\r\n let $btn = $(this)\r\n\r\n let $grid = $btn.closest(\".kdr-grid\")\r\n let gridInfo = controls.getInfo($grid)\r\n\r\n $.ajax({\r\n type: \"POST\",\r\n url: __root + \"Grid/QuickFiltersClearAll\",\r\n datatype: \"json\",\r\n traditional: true,\r\n data: {\r\n \"info\": gridInfo\r\n },\r\n success: function (response) {\r\n controls.onGridBeforeRender($grid, response.code, gridActions.QUICKFILTER);\r\n controls.magic(\"Grid/Render\", $grid, response)\r\n },\r\n beforeSend: () => loading.show($btn),\r\n complete: () => loading.hide($btn)\r\n\r\n })\r\n })\r\n\r\n $(document).on(\"change\", \".kdr-grid-quick-filter\", function (e) {\r\n let $qf = $(this)\r\n setTimeout(() => {\r\n if (!eraserClicked\r\n && ($qf.valExtended() != $qf.data('oldValue'))\r\n && $qf.closest('.kdr-grid-quick-filters-inputs').find('*:active').length == 0\r\n ) {\r\n $(this).closest('.kdr-grid-quick-filters').find('.kdr-grid-quick-filter-action').click()\r\n };\r\n }, 0)\r\n })\r\n\r\n $(document).on(\"keypress\", \".kdr-grid-quick-filter\", function (e) {\r\n if (e.keyCode == 13) {\r\n $(this).closest('.kdr-grid-quick-filters').find('.kdr-grid-quick-filter-action').click()\r\n }\r\n })\r\n\r\n\r\n $(document).on(\"click\", \".kdr-grid-quick-filter-action\", function () {\r\n let $this = $(this)\r\n let $grid = $this.closest(\".kdr-grid\")\r\n\r\n let item = $this.closest(\".kdr-grid-quick-filters\")\r\n let $inputs = item.find(\".kdr-grid-quick-filter\")\r\n\r\n let gridId = \"#\" + $grid.attr(\"id\")\r\n\r\n let args = {}\r\n controls.getArgs($inputs, args)\r\n\r\n let formData = new FormData();\r\n formData.append('quickFilters', JSON.stringify(args))\r\n\r\n let func2 = function (callback) {\r\n if ($grid.hasClass('kdr-grid-lock-checkboxes')) {\r\n controls.lockCheckboxes($grid, callback)\r\n }\r\n else {\r\n callback && callback()\r\n }\r\n }\r\n\r\n let func = function () {\r\n $grid = $(gridId)\r\n formData.append('info', controls.getInfo($grid))\r\n $.ajax({\r\n type: \"POST\",\r\n url: __root + \"Grid/QuickFilter\",\r\n datatype: \"json\",\r\n traditional: true,\r\n contentType: false,\r\n processData: false,\r\n data: formData,\r\n success: function (response) {\r\n controls.onGridBeforeRender($grid, response.code, gridActions.QUICKFILTER);\r\n controls.magic(\"Grid/Render\", $grid, response)\r\n },\r\n beforeSend: function () { loading.show($grid) },\r\n complete: function () { loading.hide($grid); eraserClicked = false }\r\n })\r\n }\r\n\r\n let $saveAll = $grid.find('.kdr-grid-save-all')\r\n\r\n if ($grid.hasClass('kdr-grid-save-all-on-quick-filter-change') && $saveAll.length > 0) {\r\n func2(function () {\r\n $(document).one(gridEvents.BEFORE_RENDER, gridId, function (event) {\r\n if (event.code == gridResponseCodes.SUCCESS) {\r\n $(document).one(gridEvents.AFTER_RENDER, gridId, func)\r\n }\r\n })\r\n\r\n $saveAll.click()\r\n })\r\n } else {\r\n func2(func)\r\n }\r\n })\r\n\r\n $(document).on(\"click\", \".kdr-grid-move\", function () {\r\n let $this = $(this)\r\n let grid = $this.closest(\".kdr-grid\")\r\n\r\n $.ajax({\r\n type: \"POST\",\r\n url: __root + \"Grid/Act\",\r\n datatype: \"json\",\r\n traditional: true,\r\n data: {\r\n \"info\": controls.getInfo(grid),\r\n \"magic\": $this.attr(\"data-action\"),\r\n \"args\": null\r\n },\r\n success: function (response) {\r\n controls.onGridBeforeRender(grid, response.code, gridActions.REMOVE);\r\n controls.magic(\"Grid/Render\", grid, response, grid)\r\n },\r\n beforeSend: function () {\r\n loading.show($this)\r\n },\r\n complete: function () {\r\n loading.hide($this)\r\n }\r\n })\r\n })\r\n\r\n $(document).on(\"click\", \".kdr-grid-remove\", function () {\r\n let $this = $(this)\r\n let $grid = $this.closest(\".kdr-grid\")\r\n let $modal = $grid.find(\".kdr-grid-delete-modal\").clone().detach()\r\n let mId = $modal.prop('id') + 'clonedDetached'\r\n let $loadingTarget = $grid.closest('.modal').length > 0 ? $grid.closest('.modal-content') : $grid\r\n\r\n let op = \"Update\"\r\n let actions = $grid.find(\".kdr-grid-save-action[data-operation-type=\" + op + \"]\")\r\n let payload = []\r\n actions.each(function (a, b) {\r\n let c = $(b)\r\n let item = c.closest(\".kdr-grid-item-update\")\r\n //let inputs = item.children().children(\".kdr-grid-input\")\r\n let inputs = item.find(\".kdr-grid-input\")\r\n let args = {}\r\n controls.getArgs(inputs, args)\r\n payload.push(\r\n {\r\n magic: c.attr(\"data-action\"),\r\n args: args\r\n })\r\n })\r\n\r\n $modal.prop('id', mId)\r\n $('body').append($modal)\r\n\r\n modal.prepareModal(mId);\r\n\r\n $modal.on('hidden.bs.modal', function () {\r\n $modal.remove()\r\n })\r\n\r\n $modal.find(\".kdr-grid-remove-confirm\").click(function () {\r\n $modal.modal(\"hide\")\r\n $.ajax({\r\n type: \"POST\",\r\n url: __root + \"Grid/Act\",\r\n datatype: \"json\",\r\n traditional: true,\r\n data: {\r\n \"info\": controls.getInfo($grid),\r\n \"magic\": $this.attr(\"data-action\"),\r\n \"args\": null,\r\n \"payload\": JSON.stringify(payload)\r\n },\r\n success: function (response) {\r\n controls.onGridBeforeRender($grid, response.code, gridActions.REMOVE, response.info, response.returnValue);\r\n controls.magic(\"Grid/Render\", $grid, response, $loadingTarget)\r\n $modal.modal(\"hide\")\r\n },\r\n beforeSend: function () { loading.show($loadingTarget) },\r\n complete: function () { loading.hide($loadingTarget) }\r\n })\r\n })\r\n $modal.modal(\"show\")\r\n })\r\n\r\n $(document).on(\"click\", \".kdr-grid-custom-one\", function () {\r\n\r\n let that = $(this)\r\n let grid = that.closest(\".kdr-grid\")\r\n let gridId = grid.prop('id')\r\n\r\n //let $modal = grid.find(\".kdr-grid-delete-modal\").clone().detach()\r\n //let mId = $modal.prop('id') + 'clonedDetached'\r\n\r\n //let op = that.attr(\"data-operation-type\")\r\n let op = \"Update\"\r\n let actions = $(grid).find(\".kdr-grid-save-action[data-operation-type=\" + op + \"]\")\r\n let payload = []\r\n actions.each(function (a, b) {\r\n let c = $(b)\r\n let item = c.closest(\".kdr-grid-item-update\")\r\n //let inputs = item.children().children(\".kdr-grid-input\")\r\n let inputs = item.find(\".kdr-grid-input\")\r\n let args = {}\r\n controls.getArgs(inputs, args)\r\n payload.push(\r\n {\r\n magic: c.attr(\"data-action\"),\r\n args: args\r\n })\r\n })\r\n\r\n let $loadingTargets = null\r\n if (grid.closest('.modal').length == 0) {\r\n $loadingTargets = grid\r\n } else {\r\n $loadingTargets = grid.closest('.modal-content')\r\n }\r\n\r\n let func = function () {\r\n $.ajax({\r\n type: \"POST\",\r\n url: __root + \"Grid/BulkAct\",\r\n datatype: \"json\",\r\n traditional: true,\r\n data: {\r\n \"info\": controls.getInfo(grid),\r\n \"payload\": JSON.stringify(payload),\r\n \"magic\": that.attr(\"data-action\")\r\n },\r\n success: function (response) {\r\n //$modal.modal(\"hide\")\r\n grid = $('#' + gridId)\r\n\r\n controls.onGridBeforeRender(grid, response.code, gridActions.CUSTOMONE, response.info, response.returnValue);\r\n controls.magic(\"Grid/Render\", grid, response)\r\n },\r\n beforeSend: function () { loading.show($loadingTargets) },\r\n complete: function () { loading.hide($loadingTargets) }\r\n })\r\n }\r\n\r\n if (grid.hasClass('kdr-grid-lock-checkboxes')) {\r\n controls.lockCheckboxes(grid, func)\r\n }\r\n else {\r\n func()\r\n }\r\n })\r\n\r\n $(document).on(\"click\", \".kdr-grid-add\", function () {\r\n let that = $(this)\r\n let grid = that.closest(\".kdr-grid\")\r\n let gridId = grid.attr('id')\r\n let files = controls.getFiles(gridId)\r\n let item = that.closest(\".kdr-grid-item-insert\")\r\n\r\n let inputs = item.find(\".kdr-grid-input\")\r\n let args = {}\r\n controls.getArgs(inputs, args)\r\n\r\n let formData = new FormData();\r\n formData.append('info', controls.getInfo(grid))\r\n formData.append('magic', that.attr(\"data-action\"))\r\n formData.append('args', JSON.stringify(args))\r\n if (controls.appendFilesToFormData(formData, files, grid) === false) {\r\n return false\r\n }\r\n\r\n\r\n let $loadingTargets = null\r\n if (grid.closest('.modal').length == 0) {\r\n $loadingTargets = grid\r\n } else {\r\n $loadingTargets = grid.closest('.modal-content')\r\n }\r\n\r\n $.ajax({\r\n type: \"POST\",\r\n url: __root + \"Grid/Act\",\r\n datatype: \"json\",\r\n traditional: true,\r\n contentType: false,\r\n processData: false,\r\n //data: {\r\n // \"info\": controls.getInfo(grid),\r\n // \"magic\": that.attr(\"data-action\"),\r\n // \"args\": JSON.stringify(args),\r\n // \"files\": files\r\n //},\r\n data: formData,\r\n success: function (response) {\r\n controls.onGridBeforeRender(grid, response.code, gridActions.ADD, response.info, response.returnValue);\r\n loading.hide($loadingTargets)\r\n controls.magic(\"Grid/Render\", grid, response, $loadingTargets);\r\n //controls.onGridAfterRender(grid, response.code, gridActions.ADD);\r\n },\r\n beforeSend: function () { loading.show($loadingTargets); if ($loadingTargets != undefined && $loadingTargets != null) $loadingTargets.attr('disabled', 'disabled') },\r\n complete: function () { loading.hide($loadingTargets); if ($loadingTargets != undefined && $loadingTargets != null) $loadingTargets.removeAttr('disabled') }\r\n })\r\n })\r\n\r\n $(document).on('click', '.kdr-grid-item-insert-show', function () {\r\n let $this = $(this)\r\n let $gkv = $this.closest('.kdr-grid-key-value')\r\n $gkv.find('.kdr-grid-item-select').addClass('hide')\r\n $gkv.find('.kdr-grid-item-insert').removeClass('hide')\r\n })\r\n\r\n $(document).on('click', '.kdr-grid-item-update-show', function () {\r\n let $this = $(this)\r\n let $gkv = $this.closest('.kdr-grid-key-value')\r\n $gkv.find('.kdr-grid-item-select').removeClass('hide')\r\n $gkv.find('.kdr-grid-item-insert').addClass('hide')\r\n })\r\n\r\n $(document).on(\"click\", \".kdr-grid-save-all\", function () {\r\n //deb('save-all') \r\n let that = $(this)\r\n let grid = that.closest(\".kdr-grid\")\r\n let gridId = grid.attr('id')\r\n let files = controls.getMultipleFiles(gridId)\r\n let op = that.attr(\"data-operation-type\")\r\n let actions = $(grid).find(\".kdr-grid-save-action[data-operation-type=\" + op + \"]\")\r\n let payload = []\r\n actions.each(function (a, b) {\r\n let c = $(b)\r\n let item = c.closest(\".kdr-grid-item-update\")\r\n //let inputs = item.children().children(\".kdr-grid-input\")\r\n let inputs = item.find(\".kdr-grid-input\")\r\n let args = {}\r\n controls.getArgs(inputs, args)\r\n payload.push(\r\n {\r\n magic: c.attr(\"data-action\"),\r\n args: args\r\n })\r\n })\r\n\r\n let showLoading = () => { }\r\n\r\n let $loadingTarget;\r\n\r\n if (!grid.hasClass('not-loadable-on-save-all')) {\r\n $loadingTarget = grid.closest('.modal').length == 0 ? grid : grid.closest('.modal .modal-content')\r\n showLoading = () => {\r\n loading.show($loadingTarget)\r\n }\r\n }\r\n\r\n let func2 = function (callback) {\r\n if (grid.hasClass('kdr-grid-lock-checkboxes')) {\r\n controls.lockCheckboxes(grid, callback)\r\n }\r\n else {\r\n callback && callback()\r\n }\r\n }\r\n\r\n let func = function () {\r\n let formData = new FormData();\r\n formData.append('info', controls.getInfo(grid))\r\n formData.append('magic', that.attr(\"data-action\"))\r\n formData.append('payload', JSON.stringify(payload))\r\n if (controls.appendFilesToFormData(formData, files, grid, true, true) === false) {\r\n return false\r\n }\r\n\r\n $.ajax({\r\n type: \"POST\",\r\n url: __root + \"Grid/BulkAct\",\r\n datatype: \"json\",\r\n traditional: true,\r\n contentType: false,\r\n processData: false,\r\n data: formData,\r\n success: function (response) {\r\n controls.onGridBeforeRender(grid, response.code, gridActions.UPDATE, response.info, response.returnValue);\r\n controls.magic(\"Grid/Render\", grid, response)\r\n },\r\n beforeSend: function () { showLoading() },\r\n complete: function () { loading.hide($loadingTarget) }\r\n })\r\n }\r\n\r\n func2(func)\r\n })\r\n\r\n $(document).on(\"change\", \".kdr-grid-checkbox-list\", function () {\r\n let $this = $(this)\r\n let checkedP = $this.valExtended()\r\n let colIndex = parseInt($this.data(\"index\")) //+ (rowNumberP ? 1 : 0)\r\n let gridItemsCount = parseInt($this.closest('.kdr-grid').find('.items-count-value').data('value'))\r\n let $allCheckboxesCB = $this.closest('.kdr-grid').find('.kdr-grid-lock-all-checkboxes[data-index=\"' + colIndex + '\"]')\r\n let $span = $this.closest(\".kdr-grid\").find(\".kdr-grid-footer td[data-index='\" + colIndex + \"'] .kdr-grid-numeric\")\r\n //let $span = $this.closest(\".kdr-grid\").find('.kdr-grid-footer td[data-index=\"' + colIndex + '\"] .kdr-grid-toggle-checkbox-filter')\r\n let number = parseInt($span.text())\r\n number += checkedP ? 1 : -1\r\n $span.text(number)\r\n\r\n //tutaj ma robic tego gornego?\r\n\r\n $allCheckboxesCB.valExtended(number === gridItemsCount)\r\n })\r\n\r\n $(document).on(\"change\", \".kdr-grid-lock-all-checkboxes\", function () {\r\n //deb('save-all') \r\n let $checkbox = $(this)\r\n let $grid = $checkbox.closest(\".kdr-grid\")\r\n //let payload = $grid.find(\".kdr-grid-item-update .kdr-grid-checkbox-list\").map((a, b) => { return { columnIndex: $(b).data(\"index\"), state: $(b).valExtended(), magic: $(b).closest(\"tr\").find(\".kdr-grid-checkbox-list-action\").data(\"action\") } })\r\n let uncheckOtherColumnsP = $grid.hasClass('kdr-grid-lock-all-checkboxes-uncheck-other-columns')\r\n\r\n let formData = new FormData();\r\n let colIndex = $checkbox.data(\"index\")\r\n let checkedP = $checkbox.valExtended()\r\n\r\n formData.append('info', controls.getInfo($grid))\r\n formData.append('checkedP', checkedP)\r\n formData.append('index', colIndex)\r\n formData.append('uncheckOtherColumnsP', uncheckOtherColumnsP)\r\n\r\n $.ajax({\r\n type: \"POST\",\r\n url: __root + \"Grid/LockAllCheckboxes\",\r\n datatype: \"json\",\r\n traditional: true,\r\n contentType: false,\r\n processData: false,\r\n data: formData,\r\n success: function (response) {\r\n /*controls.onGridBeforeRender(grid, response.code, gridActions., response.info, response.returnValue)*/\r\n controls.setInfo($grid, response.info)\r\n\r\n controls.magic(\"Grid/Render\", $grid, response, undefined, undefined, undefined,\r\n ($g) => {\r\n controls.onGridAfterCheckAllCheckboxes($g, colIndex, checkedP)\r\n })\r\n },\r\n beforeSend: function () { loading.show($grid) },\r\n complete: function () { loading.hide($grid) }\r\n })\r\n })\r\n\r\n $(document).on(\"click\", \".tilemenu-row-header\", function () {\r\n\r\n if ($(this).closest('.filter-tilemenu-toggle').length > 0) {\r\n\r\n let $control = $(this).closest('.kdr-filters');\r\n let $info = controls.getInfo($control);\r\n\r\n $.ajax({\r\n type: \"POST\",\r\n url: __root + \"Filters/FilterOpenned\",\r\n datatype: \"json\",\r\n traditional: true,\r\n data: {\r\n \"filters\": $info\r\n },\r\n success: function (response) {\r\n controls.setInfo($control, response.info)\r\n }\r\n })\r\n }\r\n })\r\n\r\n\r\n $(document).on(\"click\", \".kdr-filters-filter:not(.ignore)\", function () {\r\n let that = $(this)\r\n let $filters = that.closest(\".kdr-filters\")\r\n //let inputs = filters.find(\".kdr-filters-input\")\r\n let inputs = controls.getInputs($filters)\r\n let control = $(\"#\" + $filters.attr(\"data-control-id\"))\r\n\r\n let $loadingIndicator = control.closest('.modal-content').length != 0 ? control.closest('.modal-content') : control\r\n\r\n let args = {}\r\n controls.getArgs(inputs, args)\r\n\r\n\r\n $.ajax({\r\n type: \"POST\",\r\n url: __root + \"Filters/Change\",\r\n datatype: \"json\",\r\n traditional: true,\r\n data: {\r\n \"info\": controls.getInfo($filters),// $filters.find(\".kdr-info\").val(),\r\n \"args\": JSON.stringify(args)\r\n },\r\n success: function (response) {\r\n controls.magic(\"Filters/Render\", $filters, response, control)\r\n\r\n $.ajax({\r\n type: \"POST\",\r\n url: __root + \"Filters/Filter\",\r\n datatype: \"json\",\r\n traditional: true,\r\n data: {\r\n \"control\": controls.getInfo(control),// control.find(\".kdr-info\").val(),\r\n \"filters\": controls.getInfo($filters),// $filters.find(\".kdr-info\").val(),\r\n \"args\": JSON.stringify(args)\r\n },\r\n success: function (response) {\r\n controls.magic(\"Grid/Render\", control, response, $loadingIndicator)\r\n },\r\n beforeSend: function () {\r\n loading.show($loadingIndicator)\r\n },\r\n complete: function () {\r\n loading.hide(control)\r\n }\r\n })\r\n },\r\n beforeSend: function () {\r\n loading.show($loadingIndicator)\r\n },\r\n complete: function () {\r\n loading.hide($loadingIndicator)\r\n }\r\n })\r\n })\r\n\r\n $(document).on('click', '.kdr-filters-clear:not(.ignore)', function () {\r\n let $this = $(this)\r\n\r\n controls.clear($this)\r\n })\r\n\r\n $(document).on(\"click\", \".kdr-filters-new-order-filter:not(.ignore)\", function () {\r\n let $that = $(this)\r\n\r\n controls.filter($that)\r\n })\r\n\r\n $(document).on(\"change\", \".kdr-filters:not(.ignore) .kdr-filters-change.auto-refresh, .kdr-filters:not(.ignore) .kdr-filters-input.auto-refresh\", function (e) {\r\n let $that = $(this)\r\n let $filters = $that.closest(\".kdr-filters\")\r\n //let $inputs = $filters.find(\".kdr-filters-input\")\r\n let $inputs = controls.getInputs($filters)\r\n\r\n let args = {}\r\n controls.getArgs($inputs, args)\r\n\r\n $.ajax({\r\n type: \"POST\",\r\n url: __root + \"Filters/Change\",\r\n datatype: \"json\",\r\n traditional: true,\r\n data: {\r\n \"info\": controls.getInfo($filters), //$filters.find(\".kdr-info\").val(),\r\n \"args\": JSON.stringify(args)\r\n },\r\n success: function (response) {\r\n let id = $filters.attr(\"data-control-id\")\r\n let $loadingIndicator = $filters.closest('.modal-content').length > 0 ? $filters.closest('.modal-content') : $filters\r\n\r\n if (id != '') { // filtrowanie po staremu\r\n controls.magic(\"Filters/Render\", $filters, response)\r\n\r\n args = {}\r\n controls.getArgs($inputs, args)\r\n let $control = $(\"#\" + id)\r\n\r\n $.ajax({\r\n type: \"POST\",\r\n url: __root + \"Filters/Filter\",\r\n datatype: \"json\",\r\n traditional: true,\r\n data: {\r\n \"control\": controls.getInfo($control),//$control.find(\".kdr-info\").val(),\r\n \"filters\": controls.getInfo($filters),// $filters.find(\".kdr-info\").val(),\r\n \"args\": JSON.stringify(args)\r\n },\r\n success: function (response) {\r\n controls.magic(\"Grid/Render\", $control, response)\r\n },\r\n beforeSend: function () {\r\n loading.show($loadingIndicator)\r\n },\r\n complete: function () {\r\n loading.hide($loadingIndicator)\r\n }\r\n })\r\n\r\n } else if ('' == id && response.coode != 3) {\r\n let filtersId = '#' + $filters.prop('id')\r\n $(document).one(gridEvents.AFTER_RENDER, filtersId, function () {\r\n controls.invokeCommands($(this))\r\n })\r\n\r\n controls.render(\"Filters/Render\", $filters, response.info, $filters)\r\n }\r\n },\r\n beforeSend: () => loading.show($filters),\r\n complete: () => loading.hide($filters)\r\n })\r\n })\r\n\r\n $(document).on(\"keyup\", \".kdr-filters-input\", function (e) {\r\n if (e.keyCode !== 13) {\r\n return\r\n } else {\r\n let that = $(this)\r\n let filters = that.closest(\".kdr-filters\")\r\n\r\n filters.find('.kdr-filters-filter, .kdr-filters-new-order-filter').click()\r\n }\r\n })\r\n\r\n $(document).on('click', '.kdr-filters-tabs-filter-new-order', function () {\r\n let $that = $(this)\r\n\r\n controls.tabFilter($that)\r\n\r\n var list1 = document.getElementsByClassName(\"leader-line\");\r\n var temp = list1.length\r\n\r\n if (temp > 0) {\r\n for (i = 0; i < temp; i++) {\r\n list1[0].remove();\r\n }\r\n\r\n }\r\n });\r\n\r\n $(document).on(\"click\", \".kdr-filters-tabs-filter\", function () {\r\n let that = $(this)\r\n let tabs = that.closest(\".kdr-filters-tabs\")\r\n\r\n let args = {}\r\n let controlType;\r\n let magicRelations = [];\r\n args[tabs.attr(\"data-index\")] = that.attr(\"data-value\")\r\n if (magic_relations) {\r\n magicRelations = magic_relations.filter(function (el) {\r\n if (el.source == tabs[0].id)\r\n return true;\r\n });\r\n }\r\n if (magic_relations && magicRelations) {\r\n for (let i = 0; i < magicRelations.length; i++) {\r\n let el = magicRelations[i];\r\n let control = $(\"#\" + el.target);\r\n if (control.hasClass('kdr-grid')) controlType = 'Grid';\r\n else if (control.hasClass('kdr-frax')) controlType = 'Frax';\r\n loading.show(control);\r\n $.ajax({\r\n type: \"POST\",\r\n url: __root + \"Filters/Filter\",\r\n datatype: \"json\",\r\n traditional: true,\r\n data: {\r\n \"control\": controls.getInfo(control),// control.find(\".kdr-info\").val(),\r\n \"args\": JSON.stringify(args)\r\n },\r\n success: function (response) {\r\n controls.magic(controlType + \"/Render\", control, response)\r\n },\r\n beforeSend: function () {\r\n loading.show(tabs)\r\n },\r\n complete: function () {\r\n loading.hide(tabs)\r\n }\r\n })\r\n }\r\n }\r\n else {\r\n let control = $(\"#\" + tabs.attr(\"data-control-id\"));\r\n if (control.hasClass('kdr-grid')) controlType = 'Grid';\r\n else if (control.hasClass('kdr-frax')) controlType = 'Frax';\r\n\r\n $.ajax({\r\n type: \"POST\",\r\n url: __root + \"Filters/Filter\",\r\n datatype: \"json\",\r\n traditional: true,\r\n data: {\r\n \"control\": controls.getInfo(control),// control.find(\".kdr-info\").val(),\r\n \"args\": JSON.stringify(args)\r\n },\r\n success: function (response) {\r\n controls.magic(controlType + \"/Render\", control, response)\r\n },\r\n beforeSend: function () {\r\n loading.show(tabs)\r\n },\r\n complete: function () {\r\n loading.hide(tabs, 150)\r\n }\r\n })\r\n }\r\n })\r\n\r\n $(document).on(\"change\", \".kdr-filters .kdr-filters-change:not(.auto-refresh)\", function () {\r\n let that = $(this)\r\n let filters = that.closest(\".kdr-filters\")\r\n //let inputs = filters.find(\".kdr-filters-input\")\r\n let inputs = controls.getInputs(filters)\r\n\r\n let args = {}\r\n controls.getArgs(inputs, args)\r\n\r\n $.ajax({\r\n type: \"POST\",\r\n url: __root + \"Filters/Change\",\r\n datatype: \"json\",\r\n traditional: true,\r\n data: {\r\n \"info\": controls.getInfo(filters),// filters.find(\".kdr-info\").val(),\r\n \"args\": JSON.stringify(args)\r\n },\r\n success: function (response) {\r\n controls.magic(\"Filters/Render\", filters, response)\r\n },\r\n beforeSend: function () {\r\n loading.show(that)\r\n },\r\n complete: function () {\r\n loading.hide(that)\r\n }\r\n })\r\n })\r\n\r\n //$(document).on(\"click\", \".kdr-filters .kdr-frax-dropdown .jstree-anchor:not(.jstree-disabled)\", function () {\r\n // let $this = $(this)\r\n // let $filters = $this.closest(\".kdr-filters\")\r\n // let $inputs = controls.getInputs($filters);\r\n // let $fraxDropdown = $this.closest('.kdr-frax-dropdown')\r\n // $fraxDropdown.find('.dropdown-menu').removeClass('show')\r\n\r\n // let args = {}\r\n // controls.getArgs($inputs, args)\r\n\r\n // $.ajax({\r\n // type: \"POST\",\r\n // url: __root + \"Filters/Change\",\r\n // datatype: \"json\",\r\n // traditional: true,\r\n // data: {\r\n // \"info\": controls.getInfo($filters),\r\n // \"args\": JSON.stringify(args)\r\n // },\r\n // success: function (response) {\r\n\r\n // if ($this.closest('.kdr-frax-filter').hasClass('auto-refresh')) {\r\n // let id = $filters.attr(\"data-control-id\")\r\n\r\n // if (id != '') { // filtrowanie po staremu\r\n // controls.magic(\"Filters/Render\", $filters, response)\r\n\r\n // args = {}\r\n // controls.getArgs($inputs, args)\r\n // let $control = $(\"#\" + id)\r\n // controls.legacyFilter($control, $filters, args)\r\n // } else if ('' == id && response.coode != 3) {\r\n // controls.render(\"Filters/Render\", $filters, response.info, $filters, function () {\r\n // controls.invokeCommands($filters)\r\n // })\r\n // }\r\n\r\n // } else {\r\n // controls.magic(\"Filters/Render\", $filters, response)\r\n // }\r\n // },\r\n // beforeSend: function () {\r\n // loading.show($fraxDropdown.find('.dropdown-toggle'))\r\n // },\r\n // complete: function () {\r\n // loading.hide($fraxDropdown.find('.dropdown-toggle'))\r\n // }\r\n // })\r\n //})\r\n\r\n $(document).on(\"click\", \".kdr-grid-s\", function () {\r\n let $that = $(this)\r\n let $grid = $that.closest(\".kdr-grid\")\r\n\r\n let args = {}\r\n args[$that.data('index')] = $that.data('value')\r\n\r\n $.ajax({\r\n type: \"POST\",\r\n url: __root + \"Filters/Change\",\r\n datatype: \"json\",\r\n traditional: true,\r\n data: {\r\n \"info\": controls.getInfo($grid),\r\n \"args\": JSON.stringify(args)\r\n },\r\n success: function (response) {\r\n\r\n if (3 != response.code) {\r\n controls.setInfo($grid, response.info)\r\n controls.invokeCommands($grid)\r\n controls.magic(\"Grid/Render\", $grid, response, $grid, false, true)\r\n }\r\n }\r\n })\r\n })\r\n\r\n\r\n //FRAX FILTER\r\n $(document).on(\"click\", \".kdr-frax--container-content\", function (e) {\r\n e.stopPropagation()\r\n })\r\n\r\n $(document).on(\"click\", \".kdr-grid-gridSettings\", function () {\r\n let $settingsButton = $(this)\r\n let controlId = $settingsButton.data('control-id')//.closest('.kdr-grid-export').find('.kdr-grid-export-info').val()\r\n\r\n let $grid = controls.getControl(controlId)\r\n var body = $(\"body\");\r\n let gridId = $grid.attr('id');\r\n\r\n let modalId = gridId + \"-user-columns\"\r\n var $modal = body.find(\"#\" + modalId).clone().detach()\r\n $modal.attr('id', modalId + 'copied')\r\n\r\n userColumns.init($modal, $grid)\r\n\r\n modalHelper.addModalToBody($modal, $settingsButton)\r\n\r\n $modal.on('hidden.bs.modal', function () {\r\n modalHelper.removeModalFromBody($(this))\r\n })\r\n })\r\n\r\n $(document).on(\"click\", \".kdr-grid-export-link\", function () {\r\n let that = $(this);\r\n\r\n modalHelper.getModal('Grid/GridExportModal', { filename: that.attr('data-file-name') }, $(this), function ($modal) {\r\n $modal.on('hidden.bs.modal', function (event) {\r\n $modal.remove()\r\n })\r\n\r\n $modal.on('click', '#grid-export-button-modal', function () {\r\n //let gridExport = that.closest(\".kdr-grid-export\");\r\n let gridId = that.data('controlId')// $(gridExport).find('.kdr-grid-export-info').eq(0).val();\r\n\r\n let grid = $('#' + gridId)\r\n let $loadingTarget = /*[gridExport, */$modal.find('.modal-content')/*]*/\r\n\r\n /*pobieranie mnie filtrujacych filtrow do exportu*/\r\n let infoFilters = []\r\n let $filters = $('[data-control-id=\"' + gridId + '\"]')\r\n let $kdrFilter = grid.find('.kdr-my-filters')\r\n\r\n if ($filters.length > 0) {\r\n $filters.each(function (index, value) {\r\n infoFilters.push(controls.getInfo($(value)))\r\n })\r\n }\r\n else if ($kdrFilter.length > 0) {\r\n let ids = JSON.parse($kdrFilter.val())\r\n\r\n $.each(ids, (function (index, value) {\r\n infoFilters.push(controls.getInfo($('#' + value)))\r\n }))\r\n }\r\n\r\n $.ajax({\r\n type: \"POST\",\r\n url: __root + \"Grid/GridExport\",\r\n datatype: \"json\",\r\n traditional: true,\r\n data: {\r\n \"info\": controls.getInfo(grid),\r\n \"exportType\": that.attr('data-action'),\r\n \"fileName\": $modal.find('#grid-export-file-name').val(),\r\n \"title\": that.attr('data-title'),\r\n \"infoFilters\": infoFilters\r\n },\r\n success: function (response) {\r\n if (response.code != gridResponseCodes.SUCCESS) {\r\n //toastr['error'](response.message);\r\n modal.getModal.danger(\"~{Error}\", response.message, true)\r\n return;\r\n }\r\n\r\n $modal.modal('hide')\r\n let result = JSON.parse(response.args[0]);\r\n let bin = atob(result.Result);\r\n let bufferArray = controls.s2ab(bin);\r\n let blob = new Blob([bufferArray], { type: 'application/octet-stream' })\r\n controls.saveData(result.FileName, blob)\r\n },\r\n beforeSend: function () {\r\n grid.trigger(gridEvents.EXPORT_START)\r\n loading.show($loadingTarget)\r\n },\r\n complete: function () {\r\n grid.trigger(gridEvents.EXPORT_COMPLET)\r\n loading.hide($loadingTarget)\r\n }\r\n })\r\n })\r\n })\r\n })\r\n\r\n //external buttons for grid\r\n $(document)//FIXME Mozna by bylo zrobic jedna funkcje dla wszystkich przyciskow\r\n .on('click', '.kdr-grid-remove-ext', function (e) {\r\n let $this = $(this)\r\n let controlId = $this.attr('control-id')\r\n let $control = controls.getControl(controlId, $this) //$this is passed for back compatiblity\r\n\r\n $control.find('.kdr-grid-remove').first().click()\r\n })\r\n .on('click', '.kdr-grid-add-ext', function () {\r\n let $this = $(this)\r\n let controlId = $this.attr('control-id')\r\n let $control = controls.getControl(controlId, $this) //$this is passed for back compatiblity\r\n\r\n $control.find('.kdr-grid-add').click()\r\n })\r\n .on('click', '.kdr-grid-edit-ext', function () {\r\n let $this = $(this)\r\n let controlId = $this.attr('control-id')\r\n let $control = controls.getControl(controlId, $this) //$this is passed for back compatiblity\r\n let dataRowIndex = $this.closest('[data-row-index]')?.data('rowIndex')\r\n let $editButton;\r\n\r\n $editButton = $control.find('.kdr-grid-edit, .kdr-grid-modal-edit').eq(dataRowIndex ?? 0)\r\n\r\n $editButton.click()\r\n\r\n if ($this.hasClass('not-hide') == false) {\r\n $($this, ' .kdr-grid-remove-ext[control-id=' + controlId + ']').hide()\r\n $('.kdr-grid-save-ext[control-id=' + controlId + '], .kdr-grid-cancel-ext[control-id=' + controlId + ']').show()\r\n }\r\n })\r\n .on('click', '.kdr-grid-save-ext', function () {\r\n let $this = $(this)\r\n let controlId = $this.attr('control-id')\r\n let $control = controls.getControl(controlId, $this) //$this is passed for back compatiblity\r\n $control.find('.kdr-grid-save').click()\r\n\r\n $control.one(gridEvents.BEFORE_RENDER, function (event) {\r\n if (event.code == gridResponseCodes.SUCCESS && event.actionType == gridActions.UPDATE) {\r\n if ($this.hasClass('not-hide') == false) {\r\n $this.not('.show-only-update-view-p').hide() //save all ext\r\n $('.kdr-grid-cancel-ext[control-id=' + controlId + ']').hide()\r\n $('.kdr-grid-edit-ext[control-id=' + controlId + '], .kdr-grid-remove-ext[control-id=' + controlId + ']').show()\r\n }\r\n }\r\n })\r\n })\r\n .on('click', '.kdr-grid-cancel-ext', function () {\r\n let $this = $(this)\r\n let controlId = $this.attr('control-Id')\r\n let $control = controls.getControl(controlId, $this)\r\n $control.find('.kdr-grid-cancel').click()\r\n\r\n $this.hide()\r\n $('.kdr-grid-save-ext[control-id=' + controlId + ']').hide()\r\n $('.kdr-grid-edit-ext[control-id=' + controlId + '], .kdr-grid-add-ext[control-id=' + controlId + ']').show()\r\n\r\n })\r\n .on('click', '.kdr-grid-item-insert-show-ext', function () {\r\n let $this = $(this)\r\n let controlId = $this.attr('control-Id')\r\n let $control = controls.getControl(controlId, $this)\r\n $control.find('.kdr-grid-item-insert-show').click()\r\n\r\n $('.kdr-grid-remove-ext[control-id=' + controlId + '], .kdr-grid-add-ext[control-id=' + controlId + ']').show()\r\n $this.hide()\r\n\r\n })\r\n .on('click', '.kdr-grid-item-update-show-ext', function () {\r\n let $this = $(this)\r\n let controlId = $this.attr('control-Id')\r\n let $control = controls.getControl(controlId, $this)\r\n $control.find('.kdr-grid-save').click()\r\n\r\n $control.one(gridEvents.BEFORE_RENDER, function (event) {\r\n if (event.code == gridResponseCodes.SUCCESS && event.actionType == gridActions.UPDATE) {\r\n $('.kdr-grid-edit-ext[control-id=' + controlId + '], .kdr-grid-remove-ext[control-id=' + controlId + ']').show()\r\n $this.hide() //save all ext\r\n }\r\n })\r\n })\r\n .on('click', '.kdr-grid-custom-one-ext', function () {\r\n let gridId = $(this).attr('control-id')\r\n let $control = controls.getControl(gridId)\r\n let $loadingTargets = $('.btn[control-id=' + gridId + ']')\r\n loading.show($loadingTargets)\r\n\r\n $control.one(gridEvents.BEFORE_RENDER, function () {\r\n loading.hide($loadingTargets)\r\n })\r\n\r\n $control.find('.kdr-grid-custom-one').first().click()\r\n })\r\n .on('click', '.kdr-frax-remove-confirm-ext', function () {\r\n let fraxId = $(this).attr('control-id')\r\n let $frax = controls.getControl(fraxId)\r\n let $loadingTargets = $('.btn[control-id=' + fraxId + ']')\r\n loading.show($loadingTargets)\r\n\r\n $frax.one(gridEvents.BEFORE_RENDER, function () {\r\n loading.hide($loadingTargets)\r\n })\r\n\r\n let $that = $frax.find('.kdr-frax-act-remove')\r\n\r\n let args = { selected: $frax.find('.kdr-frax--tree').jstree().get_selected() }\r\n\r\n $.ajax({\r\n type: \"POST\",\r\n url: __root + \"Frax/Act\",\r\n datatype: \"json\",\r\n traditional: true,\r\n data: {\r\n \"info\": controls.getInfo($frax),\r\n \"magic\": $that.attr(\"data-magic\"),\r\n \"args\": JSON.stringify(args)\r\n },\r\n success: function (response) {\r\n controls.onGridBeforeRender($frax, response.code, fraxActions.REMOVE, response.info, response.returnValue)\r\n controls.magic(controls.getEndpoint($frax), $frax, response, $loadingTargets);\r\n },\r\n beforeSend: function () { loading.show($loadingTargets); if ($loadingTargets != undefined && $loadingTargets != null) $loadingTargets.attr('disabled', 'disabled') },\r\n complete: function () { loading.hide($loadingTargets); if ($loadingTargets != undefined && $loadingTargets != null) $loadingTargets.removeAttr('disabled') }\r\n })\r\n })\r\n .on('click', '.kdr-grid-cancel-all-ext', function () {\r\n let $this = $(this)\r\n let controlId = $this.attr('control-Id')\r\n let $control = controls.getControl(controlId, $this)\r\n let $itemsToSlide = $control.find('.kdr-grid-custom-btns, .pagination-wrapper, .kdr-grid-export')\r\n\r\n $control.find('.kdr-grid-cancel-all').click()\r\n\r\n $this.hide()\r\n $itemsToSlide.slideDown(150)\r\n $('.kdr-grid-save-all-ext[control-id=' + controlId + ']').hide()\r\n $('.kdr-grid-edit-all-ext[control-id=' + controlId + ']').show()\r\n })\r\n .on('click', '.kdr-grid-edit-all-ext', function () {\r\n let $this = $(this)\r\n let controlId = $this.attr('control-id')\r\n let $control = controls.getControl(controlId, $this)\r\n $control.find('.kdr-grid-edit-all').click()\r\n let $itemsToSlide = $control.find('.kdr-grid-custom-btns, .pagination-wrapper, .kdr-grid-export')\r\n\r\n $this.hide()\r\n $itemsToSlide.slideUp(150)\r\n $('.kdr-grid-save-all-ext[control-id=' + controlId + ']' + ', .kdr-grid-cancel-all-ext[control-id=' + controlId + ']').show()\r\n })\r\n .on('click', '.kdr-grid-save-all-ext', function () {\r\n let $this = $(this)\r\n let controlId = $this.attr('control-id')\r\n let $control = controls.getControl(controlId, $this)\r\n let $loadingTarget = $this.closest('.modal').length > 0 ? $this.closest('.modal-content') : $('.btn[control-id=' + controlId + ']')\r\n\r\n loading.show($loadingTarget)\r\n $control.find('.kdr-grid-save-all').first().click()\r\n\r\n $control.one(gridEvents.BEFORE_RENDER, function (event) {\r\n loading.hide($loadingTarget)\r\n if (event.code == gridResponseCodes.SUCCESS && event.actionType == gridActions.UPDATE) {\r\n $('.kdr-grid-edit-all-ext[control-id=' + controlId + ']').show()\r\n\r\n if ($this.hasClass('not-hide') == false) {\r\n $this.hide()\r\n $('.kdr-grid-cancel-all-ext[control-id=' + controlId + ']').hide()\r\n }\r\n } else {\r\n $('.kdr-grid-edit-all-ext[control-id=' + controlId + ']').click()\r\n }\r\n })\r\n })\r\n .on('click', '.kdr-grid-clear-all-inputs', function (e) {\r\n let controlId = $(this).attr('control-id')\r\n let $grid = controls.getControl(controlId)\r\n $grid.find('.kdr-grid-input:visible').valExtended('')\r\n })\r\n\r\n .on('click', '.kdr-grid-save-modal, .kdr-grid-add-modal', function (e) {\r\n let $btn = $(this)\r\n\r\n if ($btn.attr('disabled') == 'disabled') {\r\n return false\r\n } else {\r\n $btn.attr('disabled', 'disabled')\r\n }\r\n\r\n let gridAction = $btn.hasClass('kdr-grid-save-modal') ? gridActions.UPDATE : gridActions.ADD\r\n let $modal = $btn.closest('.modal')\r\n let controlId = $btn.attr('control-id')\r\n let $control = controls.getControl(controlId)\r\n\r\n let $loadingIndicator = $btn.closest('.modal-content')\r\n\r\n\r\n let files = controls.getFiles(controlId)\r\n let inputs = $modal.find(\".kdr-grid-input\")\r\n let args = {}\r\n controls.getArgs(inputs, args)\r\n\r\n let formData = new FormData();\r\n formData.append('info', controls.getInfo($control))\r\n formData.append('magic', $btn.attr(\"data-action\"))\r\n formData.append('args', JSON.stringify(args))\r\n\r\n if (controls.appendFilesToFormData(formData, files, $control) === false) {\r\n return false\r\n }\r\n\r\n let $loadingTargets = $('[class*=\"kdr-grid-save-modal\"][control-id=\"' + controlId + '\"]')\r\n $loadingTargets.push($control.find('.table'))\r\n\r\n $.ajax({\r\n type: \"POST\",\r\n url: __root + \"Grid/Act\",\r\n datatype: \"json\",\r\n traditional: true,\r\n contentType: false,\r\n processData: false,\r\n data: formData,\r\n success: function (response) {\r\n controls.onGridBeforeRender($control, response.code, gridAction, response.info, response.returnValue);\r\n controls.magic(\"Grid/Render\", $control, response, $loadingTargets)\r\n\r\n if (response.code == gridResponseCodes.SUCCESS) {\r\n $modal.modal('hide')\r\n $modal.remove()\r\n }\r\n },\r\n beforeSend: function () {\r\n loading.show($loadingIndicator)\r\n },\r\n complete: function () {\r\n loading.hide($loadingIndicator)\r\n\r\n $btn.removeAttr('disabled')\r\n }\r\n })\r\n })\r\n\r\n $(document).on('click', '.kdr-grid-perform-all-custom-ones', function () {\r\n let $btn = $(this)\r\n let $container = $($btn.data('container'))\r\n let $loading = $container.closest('.modal-content')\r\n loading.show($loading)\r\n let $customOnesBtns = $container.find('.kdr-grid-custom-one')\r\n\r\n let endedAjaxs = 0\r\n let successCount = 0\r\n\r\n for (let i = 0; i < $customOnesBtns.length; i++) {\r\n\r\n let $customOneBtn = $customOnesBtns.eq(i)\r\n let $grid = $customOneBtn.closest('.kdr-grid')\r\n let gridId = $grid.prop('id')\r\n\r\n $grid.addClass('.not-loadable')\r\n\r\n $grid.off(gridEvents.BEFORE_RENDER + '.PERFORM_ALL_CUSTOM_ONES')\r\n .on(gridEvents.BEFORE_RENDER + '.PERFORM_ALL_CUSTOM_ONES', function (response) {\r\n endedAjaxs++\r\n\r\n if (response.code == gridResponseCodes.SUCCESS) {\r\n successCount++\r\n }\r\n\r\n //console.log(`Ended count: ${endedAjaxs}`)\r\n //console.log($grid)\r\n\r\n if (endedAjaxs == $customOnesBtns.length) {\r\n console.log(`Ended All and performing trigger`)\r\n loading.hide($loading)\r\n\r\n $btn.trigger({\r\n type: 'done',\r\n isSuccess: endedAjaxs == successCount\r\n })\r\n }\r\n })\r\n\r\n //console.log(`Sended: ${i}`)\r\n //console.log($customOneBtn)\r\n //console.log($grid)\r\n\r\n $customOneBtn.click()\r\n }\r\n\r\n })\r\n\r\n $(document).on('click', '.kdr-grid-perform-all-custom-ones-refresh', function () {\r\n let $btn = $(this)\r\n let $container = $($btn.data('container'))\r\n loading.show()\r\n let $customOnesBtns = $container.find('.kdr-grid-custom-one')\r\n\r\n\r\n let $control = controls.getControl($btn.attr('data-refresh-target'))\r\n\r\n let endedAjaxs = 0\r\n let successCount = 0\r\n $customOnesBtns.each(function (i, e) {\r\n let $customOneBtn = $(e)\r\n let $grid = $customOneBtn.closest('.kdr-grid')\r\n $grid.addClass('.not-loadable')\r\n\r\n $grid.one(gridEvents.BEFORE_RENDER, function (response) {\r\n endedAjaxs++\r\n if (response.code == gridResponseCodes.SUCCESS) {\r\n successCount++\r\n }\r\n\r\n if (endedAjaxs == $customOnesBtns.length/* - 1*/) {\r\n loading.hide()\r\n\r\n if ($control.length > 1) {\r\n $control.each(function (i, e) {\r\n controls.refresh($(e), null, null, null)\r\n })\r\n }\r\n else {\r\n controls.refresh($control, null, null, null)\r\n }\r\n\r\n //$btn.trigger('done')\r\n $btn.trigger({\r\n type: 'done',\r\n isSuccess: endedAjaxs == successCount\r\n })\r\n }\r\n })\r\n\r\n $customOneBtn.click()\r\n })\r\n })\r\n\r\n $(document).on('click', '.kdr-grid-perform-all-save-all-ext', function () {\r\n let $btn = $(this)\r\n let $container = $($btn.data('container'))\r\n loading.show()\r\n let $customOnesBtns = $container.find('.kdr-grid-save-all')\r\n\r\n let endedAjaxs = 0\r\n let successCount = 0\r\n $customOnesBtns.each(function (i, e) {\r\n let $customOneBtn = $(e)\r\n let $grid = $customOneBtn.closest('.kdr-grid')\r\n $grid.addClass('.not-loadable')\r\n\r\n $grid.one(gridEvents.BEFORE_RENDER, function (response) {\r\n endedAjaxs++\r\n if (response.code == gridResponseCodes.SUCCESS) {\r\n successCount++\r\n }\r\n\r\n if (endedAjaxs == $customOnesBtns.length/* - 1*/) {\r\n loading.hide()\r\n //$btn.trigger('done')\r\n $btn.trigger({\r\n type: 'done',\r\n isSuccess: endedAjaxs == successCount\r\n })\r\n }\r\n })\r\n\r\n $customOneBtn.click()\r\n })\r\n })\r\n\r\n $(document).on('click', '.kdr-grid-perform-total-all-save-all-ext', function () {\r\n let $btn = $(this)\r\n let $container = $btn.closest('.modal-content')\r\n loading.show()\r\n let $saveOnesBtns = $container.find('.kdr-grid-save-all, .kdr-grid-save')\r\n\r\n let endedAjaxs = 0\r\n let successCount = 0\r\n $saveOnesBtns.each(function (i, e) {\r\n let $saveOneBtn = $(e)\r\n let $grid = $saveOneBtn.closest('.kdr-grid')\r\n $grid.addClass('.not-loadable')\r\n\r\n $grid.one(gridEvents.BEFORE_RENDER, function (response) {\r\n endedAjaxs++\r\n if (response.code == gridResponseCodes.SUCCESS) {\r\n successCount++\r\n }\r\n\r\n if (endedAjaxs == $saveOnesBtns.length/* - 1*/) {\r\n loading.hide()\r\n //$btn.trigger('done')\r\n $btn.trigger({\r\n type: 'all-grid-are-saved',\r\n isSuccess: endedAjaxs == successCount\r\n })\r\n }\r\n })\r\n\r\n $saveOneBtn.click()\r\n })\r\n })\r\n\r\n $(document).on('change', '.kdr-grid-files-picker .grid-file-input', function () {\r\n controls.renderSelectedItems($(this))\r\n })\r\n\r\n $(document).on(\"click\", \".kdr-grid-files-remove\", function () {\r\n let $this = $(this)\r\n let $fileContainer = $this.closest('.kdr-grid-files-file')\r\n let key = $fileContainer.find('.file-id').val()\r\n let $input = $this.closest('.kdr-grid-files').find('.grid-file-input')\r\n let selectedFiles = $input.data('selectedFiles')\r\n\r\n let droppedFiles = selectedFiles.filter(function (item) {\r\n return item.id != key;\r\n });\r\n\r\n $input.data('selectedFiles', droppedFiles)\r\n $fileContainer.remove()\r\n controls.renderSelectedItems($input)\r\n })\r\n\r\n $(document).on(\"click\", \".kdr-grid-table .kdr-grid-edit, .kdr-grid-table .kdr-grid-cancel\", function () {\r\n controls.recalculateGridTableHeaderOffets($(this).closest('.kdr-grid'))\r\n })\r\n\r\n $(document)\r\n .on('change', '.kdr-custom-radio', function () {\r\n let $radioInput = $(this)\r\n let groupName = $radioInput.attr('name')\r\n //let $radioContainer = $radioInput.closest('.custom-radio')\r\n let $unchecker = $radioInput.next()\r\n //$radioContainer.append($unchecker)\r\n $(`.kdr-custom-radio[name=\"${groupName}\"] + .radio-buttons-unchecker`).hide()\r\n $unchecker.fadeIn(125)\r\n\r\n })\r\n .on('click', '.radio-buttons-unchecker', function () {\r\n let $unchecker = $(this)\r\n $unchecker.closest('.radio-buttons-wrapper').find('.kdr-custom-radio:checked').prop('checked', false)\r\n $unchecker\r\n .fadeOut(125)\r\n .tooltip('hide')\r\n })\r\n\r\n $(document).on('click', '.kdr-grid-toggle-fullscreen', function () {\r\n let $btn = $(this)\r\n let $grid = controls.getControl(null, $btn)\r\n controls.toggleGridFullscreen($grid)\r\n })\r\n\r\n $(document).on('click', '.kdr-grid-fullscreen', function (e) {\r\n if ($(e.target).hasClass('kdr-grid-fullscreen')) {\r\n controls.toggleGridFullscreen($(this))\r\n }\r\n })\r\n //$(document).on('keyup', function (e) {\r\n // if ($('.kdr-grid-fullscreen').length > 0 && e.keyCode == 27) {\r\n // controls.toggleGridFullscreen($('.kdr-grid-fullscreen').last())\r\n // }\r\n //})\r\n\r\n const _refreshSubrowsEvent = 'kdr-refresh-subrow-group'\r\n const _rowsStateDataAttr = 'data-subrows-are-visible'\r\n\r\n $(document).on('click', '.subrows-container .toggle-subrows', function () {\r\n let $btn = $(this)\r\n let $row = $btn.closest('.subrow-toggling-container')\r\n let subRowId = $row.data('subrowId')\r\n let rowsAreHiddenP = !(convert.stringToBoolean($btn.attr(_rowsStateDataAttr)) ?? true)\r\n\r\n //$(`.kdr-grid-item-select[data-hook-id=\"${subRowId}\"]`).attr('data-hidden-row-p', rowsAreHiddenP.toString().toLowerCase())\r\n\r\n ///sync state with hidden toggler with same id, eg. kdr-grid-item-select/update,\r\n $(`[data-subrow-id=\"${subRowId}\"] .toggle-subrows`).attr(_rowsStateDataAttr, rowsAreHiddenP)\r\n\r\n //$btn.find('.toggle-subsrows-icon').toggle()\r\n $row.closest('.subrows-container').find('.toggle-subrows').each((i, e) => $(e).trigger(_refreshSubrowsEvent))\r\n })\r\n\r\n $(document).on(_refreshSubrowsEvent, '.subrows-container .toggle-subrows', function () {\r\n let $toggler = $(this)\r\n let $row = $toggler.closest('.subrow-toggling-container')\r\n let hookId = $row.data('hookId')\r\n let hookState = $(`[data-subrow-id=\"${hookId}\"]`).length != 0 ? $(`[data-subrow-id=\"${hookId}\"]`).is(':visible') : true\r\n\r\n\r\n if (hookState === true) {\r\n let togglerState = false\r\n let rowsState = convert.stringToBoolean($toggler.attr(_rowsStateDataAttr))\r\n let thisSubrowid = $row.attr('data-subrow-id')\r\n\r\n ///sync state with hidden toggler with same id, eg. kdr-grid-item-select/update,\r\n $(`[data-subrow-id=\"${thisSubrowid}\"] .toggle-subrows`).each((i, e) => {\r\n togglerState = !!(togglerState | $(e).is(':visible'))\r\n })\r\n\r\n\r\n let subRowId = $toggler.closest('.subrow-toggling-container').data('subrowId')\r\n let $rows = $(`.subrow-toggling-container[data-hook-id=\"${subRowId}\"]`)\r\n\r\n if (togglerState === true && rowsState === true) {\r\n $rows.attr('data-hidden-row-p', false)\r\n } else if (togglerState === false && rowsState === true) {\r\n $rows.attr('data-hidden-row-p', true)\r\n } else if (togglerState === true && rowsState == false) {\r\n $rows.attr('data-hidden-row-p', true)\r\n } else if (togglerState === false && rowsState == false) {\r\n $rows.attr('data-hidden-row-p', true)\r\n }\r\n } else {\r\n let subRowId = $toggler.closest('.subrow-toggling-container').data('subrowId')\r\n $(`.subrow-toggling-container[data-hook-id=\"${subRowId}\"]`).attr('data-hidden-row-p', true)\r\n $(`.subrow-toggling-container[data-subrow-id=\"${subRowId}\"]`).attr('data-hidden-row-p', true)\r\n }\r\n })\r\n\r\n $(document).on('input', '.kdr-grid-layout .kdr-grid-input.count-characters', function () {\r\n $t = $(this)\r\n textHelper.countCharactersAndDisplay($t)\r\n })\r\n\r\n})\r\n//Initiate grid content / grid init\r\n$(document).on(gridEvents.AFTER_RENDER, '.kdr-grid', function () {\r\n let $grid = $(this)\r\n controls.grid.initUI($grid)\r\n})\r\n\r\n$(document).on(gridEvents.AFTER_RENDER, '.kdr-filters', function () {\r\n let $filter = $(this)\r\n controls.filters.initUI($filter)\r\n})\r\n\r\n$(document).on('click', '.kdr-grid-generic-modal:not([data-href=\"\"]):not([disabled=\"disabled\"]):not(.not-modal-just-normal-link):not(.not-modal-just-normal-button, .new-grid-not-modal-just-normal-link)', function () {\r\n let $btn = $(this)\r\n\r\n modalHelper.getModal($btn.data('href'), { p: $btn.data('p') }, $btn)\r\n})\r\n\r\n$(document).on('mousedown', '.kdr-grid-generic-modal.not-modal-just-normal-link:not([data-href=\"\"]):not([disabled=\"disabled\"])', function (e) {\r\n let $btn = $(this)\r\n if ($btn.attr('href').includes('#')) {\r\n let realLink = `${__root}${$btn.data('href')}?p=${$btn.data('p')}`\r\n $btn.attr('href', realLink)\r\n }\r\n})\r\n\r\nconst toastrTypes = [\"success\", \"info\", \"warning\", \"error\"] //FIXME: nerwnac to gdzie indziej moze\r\n\r\n\r\n$(document).on('click', '.kdr-grid-generic-download:not([data-href=\"\"]):not([disabled=\"disabled\"]):not(.kdr-grid-generic-modal)', function () {\r\n let $btn = $(this)\r\n window.open(`${window.location.origin}${__root}/${$btn.data(\"href\")}?p=${$btn.data(\"p\")}`, \"_top\")\r\n})\r\n\r\n$(document).on('click', '.kdr-grid-generic-action:not([data-href=\"\"]):not([disabled=\"disabled\"]):not(.kdr-grid-generic-modal):not(.kdr-grid-generic-download)', function () {\r\n let $btn = $(this)\r\n $.ajax({\r\n type: \"POST\",\r\n url: __root + $btn.data(\"href\"),\r\n datatype: \"json\",\r\n traditional: true,\r\n data: {\r\n \"p\": $btn.data(\"p\")\r\n },\r\n success: function (response) {\r\n if (response != undefined && response.code != undefined) {\r\n toastr[toastrTypes[response.code]](response.message)\r\n }\r\n },\r\n error: function (r) {\r\n toastr.error(r.statusText, r.status)\r\n },\r\n beforeSend: function () {\r\n loading.show($btn)\r\n },\r\n complete: function () {\r\n loading.hide($btn)\r\n }\r\n });\r\n})\r\n\r\nvar userColumns = {\r\n init($ucModal, $grid) {\r\n $ucModal.on('shown.bs.modal', function () {\r\n $(this).find('#kdr-grid-user-columns-manager-sortable').sortable()\r\n $(this).find('.user-column-container').find('.user-column-is-active, .user-column-radio, label.btn, label.custom-control-label, .user-column[data-cb-selector-id]').each(function () {\r\n let $item = $(this)\r\n\r\n if ($item.is('input') || $item.hasClass('custom-control-input') || $item.hasClass('user-column-radio')) {\r\n $item.prop('id', $item.prop('id') + 'cp')\r\n $item.prop('name', $item.prop('name') + 'cp')\r\n } else if ($item.hasClass('user-column')) {\r\n $item.data('cbSelectorId', $item.data('cbSelectorId') + 'cp')\r\n } else {\r\n $item.attr('for', $item.attr('for') + 'cp')\r\n }\r\n })\r\n })\r\n $ucModal.find('.user-column-radio').on('change', function () {\r\n let $radio = $(this)\r\n let $radioGroup = $(`[name=\"${$radio.prop('name')}\"]`)\r\n $radioGroup.each((i, e) => {\r\n let $r = $(e)\r\n let $button = $r.parent()\r\n if ($r.is(':checked')) {\r\n $button.addClass('btn-primary')\r\n $button.removeClass('btn-default')\r\n } else {\r\n $button.removeClass('btn-primary')\r\n $button.addClass('btn-default')\r\n }\r\n })\r\n })\r\n $ucModal.find('.kdr-grid-set-user-columns, .kdr-grid-restore-user-columns').click(function () {\r\n let $btn = $(this)\r\n let $modalContent = $btn.closest('.modal-content')\r\n let $userColumnContainersParent = $modalContent.find('.kdr-grid-user-columns-manager')\r\n let isProfileActive = $btn.hasClass('kdr-grid-set-user-columns')\r\n function _callback(response) {\r\n $grid.trigger({\r\n type: 'KDR_GRID_GRIDSETTINGS_AC',\r\n code: response.code\r\n });\r\n\r\n if (response.code == gridResponseCodes.SUCCESS) {\r\n setTimeout(() => controls.refresh($grid), 0)\r\n modalHelper.removeModalFromBody($ucModal)\r\n }\r\n }\r\n\r\n userColumns.saveColumns($grid, userColumns.getColumns($userColumnContainersParent), isProfileActive, $modalContent, _callback)\r\n })\r\n },\r\n getColumns($userColumnContainersParent) {\r\n function _getNewColumnList($mainContainer) {\r\n function __getSnap($container) {\r\n let val = $container.find('.column-lock-selector:first .user-column-radio:checked').valExtended()\r\n return val\r\n }\r\n function __getColumnHeaderWidth(columnMagic) {\r\n let $th = $(`th[data-column-magic=\"${textHelper.escapeCharacters(columnMagic)}\"]`)\r\n let style = $th.attr('style')\r\n let settedWidthP = style && style.includes('width') && style.includes('min-width')\r\n if (settedWidthP === false) {\r\n return null\r\n } else {\r\n return parseInt($th.css('width'))\r\n }\r\n }\r\n function __addColumn(columnName, isActive, snap, columnHeaderWidth) {\r\n columns.push({\r\n columnName: columnName,\r\n isActive: isActive,\r\n snap: snap,\r\n columnHeaderWidth: columnHeaderWidth\r\n })\r\n }\r\n\r\n let columns = []\r\n\r\n $mainContainer.find('.user-column-container').each((i, e) => {\r\n let $container = $(e)\r\n let $mainColumnContainer = $container.find('.user-column')\r\n let isActiveMainColumn = $(`#${$mainColumnContainer.data('cbSelectorId')}`).valExtended()\r\n let columnName = $mainColumnContainer.prop('id')\r\n let columnMagic = $mainColumnContainer.data('columnMagic')\r\n\r\n __addColumn(columnName, isActiveMainColumn, __getSnap($container), __getColumnHeaderWidth(columnMagic))\r\n\r\n $container.find('.user-subcolumn').each((j, f) => {\r\n let $subcolumn = $(f)\r\n let subcolumnMagic = $subcolumn.data('columnMagic')\r\n\r\n __addColumn($subcolumn.prop('id'), isActiveMainColumn, __getSnap($subcolumn), __getColumnHeaderWidth(subcolumnMagic))\r\n })\r\n })\r\n\r\n return columns\r\n }\r\n\r\n return _getNewColumnList($userColumnContainersParent)\r\n },\r\n saveColumnsInGrid($grid, $loadingIndicator, _callback) {\r\n let gridId = $grid.prop('id')\r\n let $ucModal = $(`#${gridId}-user-columns`)\r\n let $userColumnContainersParent = $ucModal.find('.kdr-grid-user-columns-manager')\r\n let isProfileActive = $ucModal.find('.kdr-grid-set-user-columns').length != 0\r\n\r\n userColumns.saveColumns($grid, userColumns.getColumns($userColumnContainersParent), isProfileActive, $loadingIndicator, _callback)\r\n },\r\n saveColumns($grid, columns, isProfileActive, $loadingIndicator, callback) {\r\n $.ajax({\r\n type: \"POST\",\r\n url: __root + \"Grid/SetUserColumns\",\r\n datatype: \"json\",\r\n traditional: true,\r\n data: {\r\n info: controls.getInfo($grid),\r\n columns: JSON.stringify(columns),\r\n IsActive: isProfileActive,\r\n },\r\n success: function (response) {\r\n callback && callback(response)\r\n\r\n if (response.code != gridResponseCodes.SUCCESS) {\r\n modal.getModalAjax({\r\n type: response.code,\r\n title: \"~{Error}\",\r\n message: response.message,\r\n isCloseButton: true\r\n })\r\n }\r\n },\r\n beforeSend: () => $loadingIndicator && loading.show($loadingIndicator),\r\n complete: () => $loadingIndicator && loading.hide($loadingIndicator)\r\n })\r\n }\r\n}\r\n\r\nfunction ReplaceEditRow(index, controlId) {\r\n let $grid = $('#' + controlId)\r\n let modalId = \"grid-edit-modal-\" + controlId\r\n var $body = $grid.find(\"#edit-container-\" + index);\r\n var $footer = $grid.find(\"#footer-container-\" + index);\r\n\r\n var $modalBody = $grid.find(\"#grid-modal-edit-container\");\r\n var $modalFooter = $grid.find(\"#grid-modal-footer-container\");\r\n\r\n $modalBody.html($body.html());\r\n $modalFooter.html($footer.html());\r\n\r\n let $clonedModal = $('#' + modalId).clone().appendTo('body')\r\n $clonedModal.attr('id', 'copied-' + modalId)\r\n\r\n $clonedModal.find('.custom-control .custom-control-input').each(function (i, e) { $(e).attr('id', 'cp' + $(e).attr('id')) }) //fixme uwspolnic\r\n $clonedModal.find('.custom-control .custom-control-label').each(function (i, e) { $(e).attr('for', 'cp' + $(e).attr('for')) })\r\n $clonedModal.find('.kdr-grid-files-input').each((i, e) => { $(e).attr('id', 'cp' + $(e).attr('id')) })\r\n $clonedModal.find('.kdr-grid-files-input-label').each((i, e) => { $(e).attr('for', 'cp' + $(e).attr('for')) })\r\n $clonedModal.find('[id^=\"kdr-grid-editor-\"]').each((i, e) => { $(e).attr('id', 'cp' + $(e).attr('id')) })\r\n\r\n $clonedModal.find('[class*=\"ds-\"], [class*=\"dt-\"], [class*=\"da-\"]').each((i, e) => {\r\n let $e = $(e)\r\n let cls = $($e[0].classList)\r\n cls.each((ii, ee) => {\r\n if (/ds-/i.test(ee) || /dt-/i.test(ee) || /da-/i.test(ee)) {\r\n cls[ii] = ee + \"cp\"\r\n }\r\n })\r\n let c = Array.from(cls).join(\" \")\r\n $e.prop(\"class\", c)\r\n })\r\n\r\n $clonedModal.find('.kdr-dropdown-w-search-item_selected').each((i, e) => {\r\n let $btn = $(e)\r\n let oldDdlId = $btn.data('target')\r\n let newDdlId = 'cp' + oldDdlId\r\n $btn.data('target', newDdlId).attr('data-target', newDdlId)\r\n $clonedModal.find('#' + oldDdlId).attr('id', newDdlId)\r\n })\r\n\r\n $clonedModal.data('row-id', index)\r\n\r\n pickers.init($clonedModal)\r\n controls.prepareTinyMCE($clonedModal)\r\n\r\n modal.prepareModal('copied-' + modalId, undefined, undefined, controlId)\r\n\r\n}\r\n\r\nfunction ReplaceDisplayedEditRow(index, controlId) {\r\n let $grid = $('#' + controlId)\r\n let modalId = \"grid-edit-modal-\" + controlId\r\n var $body = $grid.find(\"#edit-container-\" + index);\r\n var $footer = $grid.find(\"#footer-container-\" + index);\r\n\r\n var $modalBody = $grid.find(\"#grid-modal-edit-container\");\r\n var $modalFooter = $grid.find(\"#grid-modal-footer-container\");\r\n\r\n $modalBody.html($body.html());\r\n $modalFooter.html($footer.html());\r\n\r\n let $m = $('#' + modalId)\r\n let $oldClonedModal = $('#copied-' + modalId)\r\n\r\n $oldClonedModal.html($m.html())\r\n $oldClonedModal.find('.custom-control .custom-control-input').each(function (i, e) { $(e).attr('id', 'cp' + $(e).attr('id')) }) //fixme uwspolnic\r\n $oldClonedModal.find('.custom-control .custom-control-label').each(function (i, e) { $(e).attr('for', 'cp' + $(e).attr('for')) })\r\n $oldClonedModal.find('.kdr-grid-files-input').each((i, e) => { $(e).attr('id', 'cp' + $(e).attr('id')) })\r\n $oldClonedModal.find('.kdr-grid-files-input-label').each((i, e) => { $(e).attr('for', 'cp' + $(e).attr('for')) })\r\n $oldClonedModal.find('[id^=\"kdr-grid-editor-\"]').each((i, e) => { $(e).attr('id', 'cp' + $(e).attr('id')) })\r\n\r\n $oldClonedModal.find('[class*=\"ds-\"], [class*=\"dt-\"], [class*=\"da-\"]').each((i, e) => {\r\n let $e = $(e)\r\n let cls = $($e[0].classList)\r\n cls.each((ii, ee) => {\r\n if (/ds-/i.test(ee) || /dt-/i.test(ee) || /da-/i.test(ee)) {\r\n cls[ii] = ee + \"cp\"\r\n }\r\n })\r\n let c = Array.from(cls).join(\" \")\r\n $e.prop(\"class\", c)\r\n })\r\n\r\n\r\n $oldClonedModal.find('.kdr-dropdown-w-search-item_selected').each((i, e) => {\r\n let $btn = $(e)\r\n let oldDdlId = $btn.data('target')\r\n let newDdlId = 'cp' + oldDdlId\r\n $btn.data('target', newDdlId).attr('data-target', newDdlId)\r\n $oldClonedModal.find('#' + oldDdlId).attr('id', newDdlId)\r\n })\r\n\r\n $oldClonedModal.data('row-id', index)\r\n $oldClonedModal.attr('for', controlId)\r\n\r\n pickers.init($oldClonedModal)\r\n controls.prepareTinyMCE($oldClonedModal)\r\n}\r\n\r\nfunction ReplaceInsertRow(controlId) {\r\n let $modal = $('#' + 'add-modal-' + controlId)\r\n\r\n let $clonedModal = $modal.clone().appendTo('body')\r\n let newId = 'copied-grid-add-modal-' + controlId\r\n $clonedModal.attr('id', newId)\r\n\r\n $clonedModal.find('.custom-control .custom-control-input').each(function (i, e) { $(e).attr('id', 'cp' + $(e).attr('id')) }) //fixme uwspolnic\r\n $clonedModal.find('.custom-control .custom-control-label').each(function (i, e) { $(e).attr('for', 'cp' + $(e).attr('for')) })\r\n $clonedModal.find('.kdr-grid-files-input').each((i, e) => { $(e).attr('id', 'cp' + $(e).attr('id')) })\r\n $clonedModal.find('.kdr-grid-files-input-label').each((i, e) => { $(e).attr('for', 'cp' + $(e).attr('for')) })\r\n $clonedModal.find('[id^=\"kdr-grid-editor-\"]').each((i, e) => { $(e).attr('id', 'cp' + $(e).attr('id')) })\r\n\r\n $clonedModal.find('[class*=\"ds-\"], [class*=\"dt-\"], [class*=\"da-\"]').each((i, e) => {\r\n let $e = $(e)\r\n let cls = $($e[0].classList)\r\n cls.each((ii, ee) => {\r\n if (/ds-/i.test(ee) || /dt-/i.test(ee) || /da-/i.test(ee)) {\r\n cls[ii] = ee + \"cp\"\r\n }\r\n })\r\n let c = Array.from(cls).join(\" \")\r\n $e.prop(\"class\", c)\r\n })\r\n\r\n $clonedModal.find('.kdr-dropdown-w-search-item_selected').each((i, e) => {\r\n let $btn = $(e)\r\n let oldDdlId = $btn.data('target')\r\n let newDdlId = 'cp' + oldDdlId\r\n $btn.data('target', newDdlId).attr('data-target', newDdlId)\r\n $clonedModal.find('#' + oldDdlId).attr('id', newDdlId)\r\n })\r\n\r\n pickers.init($clonedModal)\r\n controls.prepareTinyMCE($clonedModal)\r\n modal.prepareModal(newId, undefined, undefined, controlId)\r\n}\r\n\r\nfunction ReplaceDisplayedInsertRow(controlId) {\r\n let $modal = $('#' + 'add-modal-' + controlId)\r\n let modalId = $modal.attr('id')\r\n let $oldClonedModal = $('#copied-grid-' + modalId)\r\n\r\n $oldClonedModal.html($modal.html())\r\n $oldClonedModal.find('.custom-control .custom-control-input').each(function (i, e) { $(e).attr('id', 'cp' + $(e).attr('id')) }) //fixme uwspolnic\r\n $oldClonedModal.find('.custom-control .custom-control-label').each(function (i, e) { $(e).attr('for', 'cp' + $(e).attr('for')) })\r\n $oldClonedModal.find('.kdr-grid-files-input').each((i, e) => { $(e).attr('id', 'cp' + $(e).attr('id')) })\r\n $oldClonedModal.find('.kdr-grid-files-input-label').each((i, e) => { $(e).attr('for', 'cp' + $(e).attr('for')) })\r\n $oldClonedModal.find('[id^=\"kdr-grid-editor-\"]').each((i, e) => { $(e).attr('id', 'cp' + $(e).attr('id')) })\r\n\r\n $oldClonedModal.find('[class*=\"ds-\"], [class*=\"dt-\"], [class*=\"da-\"]').each((i, e) => {\r\n let $e = $(e)\r\n let cls = $($e[0].classList)\r\n cls.each((ii, ee) => {\r\n if (/ds-/i.test(ee) || /dt-/i.test(ee) || /da-/i.test(ee)) {\r\n cls[ii] = ee + \"cp\"\r\n }\r\n })\r\n let c = Array.from(cls).join(\" \")\r\n $e.prop(\"class\", c)\r\n })\r\n\r\n $oldClonedModal.find('.kdr-dropdown-w-search-item_selected').each((i, e) => {\r\n let $btn = $(e)\r\n let oldDdlId = $btn.data('target')\r\n let newDdlId = 'cp' + oldDdlId\r\n $btn.data('target', newDdlId).attr('data-target', newDdlId)\r\n $oldClonedModal.find('#' + oldDdlId).attr('id', newDdlId)\r\n })\r\n\r\n $oldClonedModal.attr('for', controlId)\r\n\r\n pickers.init($oldClonedModal)\r\n controls.prepareTinyMCE($oldClonedModal)\r\n}\r\n\r\n$(document).on('click', '.modal[id^=\"copied\"] [data-dismiss=\"modal\"]', function (e) {\r\n e.preventDefault()\r\n e.stopPropagation()\r\n $(this).closest('.modal').modal('hide')\r\n $(this).closest('.modal').remove()\r\n})\r\n\r\n$(document).on('click', '.on-click-select', function (e) {\r\n $(this).closest('tr').find('.kdr-grid-s').click()\r\n})\r\n\r\n$(document).on('click', '.on-input-save-click', function () {\r\n $(this).closest('tr').find('.kdr-grid-save').click()\r\n})\r\n\r\n$(document).on('change', '.on-input-change-save-all', function () {\r\n $(this).closest('.kdr-grid').find('.kdr-grid-save-all').click()\r\n})\r\n\r\n$(document).on('change', '.on-input-change-custom-one', function () {\r\n $(this).closest('.kdr-grid').find('.kdr-grid-custom-one').click()\r\n})\r\n\r\n$(document).on('change', '.on-input-change-save', function () {\r\n $(this).closest('.kdr-grid').find('.kdr-grid-save').click()\r\n})\r\n\r\n$(document).on('click', '.on-input-save-click-ab', function () {\r\n $(this).closest('.kdr-grid').find('.kdr-grid-save').click()\r\n})\r\n\r\n$(document).on('click', '.on-input-save-click', function () {\r\n $(this).closest('tr').find('.kdr-grid-save').click()\r\n})\r\n\r\n$(document).on('click', '.get-insert-modal', function () {\r\n let $btn = $(this)\r\n let endPoint = $btn.data('link')\r\n let $control = $btn.closest(\".kdr-control\")\r\n let gridId = $control.attr(\"id\")\r\n let $modal = $btn.closest('.modal')\r\n\r\n if (gridId == undefined && $modal.length > 0) {\r\n let modalId = $modal.attr('id')\r\n let regexPattern = /(^copied-[^\\s]*-modal-)/i\r\n\r\n if (regexPattern.test(modalId)) {\r\n gridId = modalId.replace(regexPattern, '')\r\n }\r\n }\r\n\r\n if ($control == null || $control.length == 0) {\r\n $control = $('#' + gridId)\r\n }\r\n\r\n if ($control.length == 0 && gridId.length == 0) {\r\n throw console.error(\"DDL+ .get-insert-modal: Grid - not found\")\r\n }\r\n\r\n let data = null\r\n if ($btn.data(\"withInfoP\") === true) {\r\n data = { info: controls.getInfo($btn.closest(\".kdr-filters\")) }\r\n }\r\n let $loadingIndicator = $btn.closest('.modal').find('.modal-content')\r\n\r\n let $ddl = $btn.closest('.kdr-dropdown-w-search-menu')\r\n let $btnToggler = $ddl.data().toggler ?? $ddl.find('.kdr-dropdown-w-search-item_selected')\r\n let btnTogglerP = $btnToggler != undefined && $btnToggler.length == 1\r\n let $btnTDParent = true === btnTogglerP ? $btnToggler.closest('td') : $btn.closest(\"td\");\r\n let $btnTDOrdinalParent = true === btnTogglerP ? $btnToggler.closest('td[data-item-ordinal]') : $btn.closest(\"td[data-item-ordinal]\");\r\n\r\n modalHelper.getModal(endPoint, data, $loadingIndicator, function ($mmodal) {\r\n let returnValue = null\r\n\r\n $mmodal.find(\".kdr-grid\").on(gridEvents.BEFORE_RENDER, function (response) { returnValue = response.returnValue })\r\n\r\n $mmodal.one(\"hide.bs.modal\", function () {\r\n let lambdas = $._data($control[0], \"events\")\r\n\r\n controls.refreshWithInputs(\r\n $control,\r\n gridId,\r\n undefined,\r\n controls.getEndpoint($control),\r\n null,\r\n function ($hehe) {\r\n if (lambdas != undefined) {\r\n $._data($hehe[0], \"events\", lambdas)\r\n }\r\n\r\n if ($hehe.eq(0).hasClass('kdr-filters')) {\r\n $hehe.eq(0).one(gridEvents.AFTER_RENDER_W_INPUTS, function () {\r\n controls.invokeCommands($(this))\r\n })\r\n }\r\n },\r\n {\r\n index: $btnTDParent.find(\".kdr-grid-input, .kdr-filters-input\").data(\"index\"),\r\n itemOrdinal: $btnTDOrdinalParent.closest(\"td[data-item-ordinal]\").data(\"itemOrdinal\"),\r\n value: returnValue\r\n }\r\n )\r\n })\r\n })\r\n})\r\n\r\n$(document).on('click', '.kdr-grid-files-list .kdr-grid-file-item-download, .kdr-grid-input-file-list .kdr-grid-file-item-download', function () {\r\n let $downloadButton = $(this)\r\n let $fileItem = $downloadButton.closest('.kdr-grid-file-item');\r\n let $cointainer = $fileItem.closest('.kdr-grid-files-list , .kdr-grid-input-file-list')\r\n let $grid = $fileItem.closest('.kdr-grid').length == 0 ? controls.getControl($fileItem.closest('.modal').attr('for')) : $fileItem.closest('.kdr-grid')\r\n\r\n controls.downloadGridFile(controls.getInfo($grid), $cointainer.data('action'), $cointainer.data('index'), $fileItem.data('index'), $fileItem, false)\r\n})\r\n\r\n$(document).on('click', '.kdr-grid-files-list .kdr-grid-files-download-all', function () {\r\n let $downloadButton = $(this)\r\n let $cointainer = $downloadButton.closest('.kdr-grid-files-list')\r\n let $grid = $downloadButton.closest('.kdr-grid')\r\n let $td = $downloadButton.closest('td')\r\n controls.downloadGridAllFiles(controls.getInfo($grid), $cointainer.data('action'), $cointainer.data('index'), $td)\r\n})\r\n\r\n$(document).on('change', '.kdr-grid-files-input', function () {\r\n let $input = $(this)\r\n controls.fileControl.refreshUI($input)\r\n})\r\n\r\n$(document).on('mouseenter', '.kdr-grid-file-tooltip', function () {\r\n let $fileItem = $(this)\r\n if ($fileItem.data('tooltiptInitiated') === true) {\r\n return false\r\n }\r\n\r\n let $grid = $fileItem.closest('.kdr-grid').length == 0 ? controls.getControl($fileItem.closest('.modal').attr('for')) : $fileItem.closest('.kdr-grid')\r\n let info = controls.getInfo($grid)\r\n let magic = $fileItem.closest('.kdr-grid-files-list , .kdr-grid-input-file-list').data('action')\r\n let fileIndex = $fileItem.closest('.kdr-grid-file-item').data('index')\r\n let columnIndex = $fileItem.closest('.kdr-grid-files-list , .kdr-grid-input-file-list').data('index')\r\n\r\n $.ajax({\r\n type: \"POST\",\r\n url: __root + 'Grid/GetFileInfo',\r\n datatype: \"json\",\r\n traditional: true,\r\n data: {\r\n info: info,\r\n magic: magic,\r\n columnIndex: columnIndex,\r\n itemIndex: fileIndex\r\n },\r\n success: function (response) {\r\n if (response.code == gridResponseCodes.SUCCESS) {\r\n let creationDate = response.args[0]\r\n let filesize = response.args[1]\r\n\r\n let tooltipText = textHelper.format(\r\n $fileItem.data('titleTemplate'),\r\n filesize,\r\n creationDate)\r\n $fileItem\r\n .attr('data-original-title', tooltipText)\r\n .removeAttr('data-title-template')\r\n $fileItem.data('tooltiptInitiated', true)\r\n\r\n if ($fileItem.is(':hover')) {\r\n $fileItem.tooltip('show')\r\n }\r\n }\r\n },\r\n beforeSend: () => {\r\n $fileItem.find('> .btn').css('cursor', 'progress')\r\n },\r\n complete: () => {\r\n $fileItem.find('> .btn').css('cursor', '')\r\n }\r\n })\r\n})\r\n\r\n$(document).on('setItemsCount', '.kdr-filters-tabs .nav-link', function (e) {\r\n let $item = $(this)\r\n let $container = $item.find('.tab-filter-items-count')\r\n let $itemCounter = $container.find('.tab-filter-items-count-value')\r\n if (e.count == undefined || e.count == null || e.count === -1) {\r\n $container.hide()\r\n } else if ($itemCounter.prop('Counter') != e.count) {\r\n $container.fadeIn(50)\r\n\r\n $itemCounter.prop('Counter', 0).animate(\r\n {\r\n Counter: e.count\r\n },\r\n {\r\n duration: 1500,\r\n easing: 'swing',\r\n step: function (now) {\r\n $(this).text(Math.ceil(now));\r\n }\r\n });\r\n }\r\n})\r\n\r\n\r\n/***************/\r\n/* InCell */\r\n/***************/\r\n$(document).on(controlEvents.AFTER_RENDER, '.kdr-incell', function (e) {\r\n let $incell = $(this)\r\n controls.incell.init($incell, e.options)\r\n})\r\n$.fn.incell = function () {\r\n if (this.hasClass('kdr-incell')) {\r\n let $control = this\r\n let functions = {\r\n getInfo() {\r\n return controls.getInfo($control)\r\n },\r\n setInfo(info) {\r\n return controls.setInfo($control, info)\r\n },\r\n refreshWithInputs() {\r\n return controls.incell.actions.refreshWithInputs($control)\r\n },\r\n bulkAct(operationMagic) {\r\n return controls.incell.actions.bulkAct($control, operationMagic)\r\n },\r\n getSelectedCell() {\r\n return controls.incell.getSelectedCellsCords($control)\r\n },\r\n cancelEditing() {\r\n return controls.incell.cancelEditing($control)\r\n },\r\n openSaveDraftModal() {\r\n return controls.incell.actions.openSaveDraftModal($control)\r\n },\r\n openLoadDraftModal() {\r\n return controls.incell.actions.openLoadDraftModal($control)\r\n },\r\n saveDraft(operationMagic, options = { gridNameId: null, name: null }) {\r\n let eggog = \"Give name for draft version or grid which will give it back in return value!\";\r\n if (textHelper.isNullOrEmpty(options.name) === false) {\r\n return controls.incell.actions.saveDraft($control, operationMagic, options.name)\r\n } else if (textHelper.isNullOrEmpty(options.gridNameId) === false) {\r\n let $grid = controls.getControl(options.gridNameId)\r\n if ($grid.length == 0) {\r\n throw (eggog)\r\n return $control\r\n } else {\r\n let $modal = $grid.closest('.modal')\r\n $grid.one(gridEvents.BEFORE_RENDER + '.incell', function (response) {\r\n if (response.code == gridResponseCodes.SUCCESS) {\r\n modalHelper.removeModalFromBody($modal)\r\n return controls.incell.actions.saveDraft($control, operationMagic, response.returnValue)\r\n }\r\n })\r\n $grid.find('.kdr-grid-save').click()\r\n }\r\n } else {\r\n throw (eggog)\r\n }\r\n },\r\n loadDraft(draftVersionMagic, $loadingTarget) {\r\n return controls.incell.actions.loadDraft($control, draftVersionMagic, $loadingTarget)\r\n }\r\n }\r\n return functions\r\n }\r\n}\r\n\r\n\r\n$(document).on('click', '.kdr-incell-load-draft-by-button', function () {\r\n let $btn = $(this)\r\n let $modal = $btn.closest('.modal')\r\n let $incell = $modal.data('incell')\r\n\r\n $incell.incell().loadDraft($btn.attr('p'), $btn.closest('.modal-content'))\r\n})\r\n\r\n\r\n/****************/\r\n/* MapoCRUD */\r\n/****************/\r\nvar mapoCRUD = {\r\n events: {\r\n changed: 'mapoCRUD-changed-all-inputs'\r\n },\r\n changeValue: function ($input) {\r\n let val;\r\n let isDDL = $input.hasClass('kdr-dropdown-w-search-item_selected')\r\n let isMDDL = $input.closest('.kdr-dropdown-w-search_multi').length > 0\r\n if (isDDL) {\r\n if (isMDDL) {\r\n val = []\r\n\r\n $($input.valExtended()).each((i, e) => {\r\n let x = $input.closest('.kdr-dropdown-w-search_multi')\r\n .find('.kdr-dropdown-w-search-item[data-value=\"' + e + '\"]')\r\n .attr('title').trim()\r\n val.push(x)\r\n })\r\n\r\n } else {\r\n val = $input.text().trim()\r\n }\r\n } else {\r\n val = $input.valExtended()\r\n }\r\n\r\n\r\n let $parent = null\r\n if ($input.closest('.modal').length > 0) {\r\n $parent = $input.closest('.modal')\r\n } else {\r\n $parent = $(document)\r\n }\r\n\r\n let pattern = /si-([\\dA-Za-z-]+)/i\r\n let id = $input.attr('class').match(pattern)[1]\r\n let targets = []//\r\n if ($input.hasClass(\"kdr-grid-checkbox-list\")) {\r\n targets = $parent.find('.ti-' + id)\r\n }\r\n else if ($input.attr('type') != 'radio') {\r\n targets = $parent.find('.kdr-grid-item-update .ti-' + id)\r\n } else {\r\n targets = $parent.find('.kdr-grid-item-update .ti-' + id + '[value=\"' + val + '\"]')\r\n }\r\n\r\n\r\n /* SEKCJA KOWALSKIEGO */\r\n let transformFunctionPattern = /transform-function-([\\dA-Za-z-]+)/i\r\n let transformFunctionMatch = $input.attr('class').match(transformFunctionPattern)\r\n let transformFunction = (a) => { return a; }\r\n if (transformFunctionMatch != null) {\r\n let functionName = transformFunctionMatch[1]\r\n transformFunction = window[functionName]\r\n }\r\n /* /SEKCJA KOWALSKIEGO */\r\n\r\n for (var i = 0; i < targets.length; i++) {\r\n let $target = $(targets[i])\r\n\r\n if ($target.attr('disabled') == 'disabled' && !$target.hasClass('even-disabled-ti')) {\r\n continue\r\n }\r\n\r\n let valueToSet;\r\n\r\n if (isDDL && !isMDDL) {\r\n valueToSet = $target.closest('.kdr-dropdown-w-search').find('.kdr-dropdown-w-search-item:contains(\"' + val + '\")').data('value')\r\n if (valueToSet == undefined) {\r\n continue\r\n }\r\n } else if (isMDDL) {\r\n $(val).each((i, e) => {\r\n let x = $target.closest('.kdr-dropdown-w-search')\r\n .find('.kdr-dropdown-w-search-item-text:contains(\"' + e + '\")')\r\n .closest('.kdr-dropdown-w-search-item')\r\n .data('value')\r\n if (x != undefined) {\r\n if (valueToSet == undefined) {\r\n valueToSet = []\r\n }\r\n\r\n kdrDropdown.clearDropdown($target.closest('.kdr-dropdown-w-search'))\r\n valueToSet.push(x)\r\n }\r\n })\r\n\r\n } else {\r\n valueToSet = transformFunction(val)\r\n }\r\n\r\n $target.valExtended(valueToSet, undefined, false)\r\n disabler.checkChildrens($target)\r\n\r\n if (i == targets.length - 1) {\r\n $parent.trigger({\r\n type: mapoCRUD.events.changed,\r\n input: $input\r\n })\r\n }\r\n }\r\n return targets\r\n }\r\n}\r\n\r\n//PRE mapoCRUD\r\n$(document).on('input change', '.kdr-grid .s:not([disabled=\"disabled\"]):not(.kdr-custom-radio):not(.s-w-change)', function (e) {\r\n mapoCRUD.changeValue($(this))\r\n})\r\n\r\n$(document).on('input change', '.kdr-grid .s-w-change.s:not([disabled=\"disabled\"]):not(.kdr-custom-radio)', function (e) {\r\n let $t = $(this)\r\n\r\n if (e.type == 'input' && $t.attr('type') == 'checkbox') { //fixme sprawidzc czemu to sie odpala na CB\r\n console.error('this shouldn\\'t happen')\r\n console.log(this)\r\n console.log(e)\r\n return false\r\n }\r\n\r\n let $targets = mapoCRUD.changeValue($t)\r\n $targets.each((i, e) => $(e).change())\r\n})\r\n\r\n$(document).on('click', '.kdr-grid .kdr-custom-radio.s:not([disabled=\"disabled\"])', function () {\r\n mapoCRUD.changeValue($(this))\r\n})\r\n/**************/\r\n/* Mockup */\r\n/**************/\r\n\r\nvar cnt = 0;\r\n\r\nvar kdrMockup = {\r\n prepare: function (id) {\r\n this.showEdit(id, null);\r\n },\r\n initMCE: function (id) {\r\n tinyMCE.init({\r\n selector: id,\r\n paste_data_images: true,\r\n height: 900,\r\n //,\r\n //themes: 'modern',\r\n //height: 200\r\n\r\n body_class: 'editor-content',\r\n //width: 'auto',\r\n //language: 'pl',\r\n //content_css: \"../Portal/Styles/editor.css\",\r\n plugins: [\r\n 'advlist autolink lists link image charmap print preview anchor',\r\n 'searchreplace visualblocks code',\r\n 'insertdatetime media table contextmenu paste code emoticons textcolor colorpicker'\r\n ],\r\n convert_urls: false,\r\n toolbar: 'insertfile undo redo | fontselect fontsizeselect forecolor backcolor | paste | bold italic | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | link image | imgupload',\r\n setup: function (editor) {\r\n\r\n editor.on('init', function (editor) {\r\n editor.target.editorCommands.execCommand(\"fontName\", false, \"sans-serif\");\r\n editor.target.editorCommands.execCommand(\"fontSize\", false, \"14px\");\r\n });\r\n }\r\n });\r\n },\r\n showEdit: function (id, edit) {\r\n console.log(\"showEdit: \" + id + \" \" + edit + \" \" + cnt++);\r\n\r\n let start = edit == null;\r\n if (start) edit = false;\r\n\r\n let $m = $(id);\r\n let eid = id + \"-editor\";\r\n\r\n let $btEdit = $m.find(\"#mockup-bt-edit\");\r\n let $btSave = $m.find(\"#mockup-bt-save\");\r\n let $btCancel = $m.find(\"#mockup-bt-cancel\");\r\n let $btDelete = $m.find(\"#mockup-bt-delete\");\r\n let $text = $m.find(\"#mockup-text\");\r\n var $selectVer = $m.find(\"#mockup-ver\");\r\n let $editor = $m.find(eid);\r\n\r\n $btEdit.toggle(!edit);\r\n $btSave.toggle(edit);\r\n $btCancel.toggle(edit);\r\n $btDelete.toggle(edit);\r\n $text.toggle(!edit);\r\n\r\n if (edit) {\r\n $editor.show();\r\n kdrMockup.initMCE(eid);\r\n $selectVer.prop('disabled', 'disabled');\r\n } else {\r\n tinymce.remove(eid);\r\n $editor.hide(); //toggle dont work\r\n $selectVer.prop('disabled', false);\r\n }\r\n\r\n if (start) {\r\n $btEdit.on(\"click\", function () { kdrMockup.showEdit(id, true) });\r\n $btCancel.on(\"click\", function () { kdrMockup.showEdit(id, false) });\r\n $btDelete.on(\"click\", function () {\r\n let text = tinyMCE.get(eid.substring(1)).getContent();\r\n $.ajax({\r\n type: \"POST\",\r\n url: __root + \"Mockup/Delete\",\r\n datatype: \"json\",\r\n traditional: true,\r\n data: {\r\n \"id\": id\r\n },\r\n success: function (response) {\r\n $text.html(text);\r\n kdrMockup.showEdit(id, false)\r\n },\r\n error: function (request, status, error) {\r\n $text.html(request.responseText);\r\n /*console.log(request.responseText);*/\r\n }\r\n });\r\n });\r\n $btSave.on(\"click\", function () {\r\n let text = tinyMCE.get(eid.substring(1)).getContent();\r\n $.ajax({\r\n type: \"POST\",\r\n url: __root + \"Mockup/Save\",\r\n datatype: \"json\",\r\n traditional: true,\r\n data: {\r\n \"id\": id,\r\n \"text\": text\r\n },\r\n success: function (response) {\r\n $text.html(text);\r\n kdrMockup.showEdit(id, false)\r\n },\r\n error: function (request, status, error) {\r\n $text.html(request.responseText);\r\n /*console.log(request.responseText);*/\r\n }\r\n });\r\n });\r\n $selectVer.on('change', function () {\r\n let selectedValue = $(this).val()\r\n\r\n //console.log('-----' + selectedValue);\r\n\r\n $.ajax({\r\n type: \"POST\",\r\n url: __root + \"Mockup/GetVersion\",\r\n datatype: 'json',\r\n traditional: true,\r\n data: {\r\n \"id\": id,\r\n \"_id\": selectedValue\r\n },\r\n success: function (response) {\r\n //console.log('1 ' + response.info);\r\n\r\n $text.html(response.info);\r\n $editor.val(response.info);\r\n },\r\n error: function (request, status, error) {\r\n $text.html(request.responseText);\r\n\r\n //console.log('2 ' + request.responseText);\r\n }\r\n });\r\n });\r\n }\r\n }\r\n}\r\n\r\n\r\n\r\n/*----- Start Form - InfoBox -----*/\r\nfunction UpdateInfoBox(id, showall, paId, cnt1Id, cnt2Id) {\r\n\r\n //console.log(id + ', ' + showall + ', ' + paId + ', ' + cnt1Id + ', ' + cnt2Id);\r\n\r\n $.ajax({\r\n type: \"POST\",\r\n url: __root + \"InfoBoard/GetInfoBoxContent\",\r\n datatype: \"json\",\r\n traditional: true,\r\n data: {\r\n \"id\": id,\r\n \"all\": showall,\r\n \"cntId1\": cnt1Id,\r\n \"cntId2\": cnt2Id\r\n },\r\n success: function (data) {\r\n\r\n //console.log(data);\r\n\r\n if (!showall && data.html1 == null && data.html2 == null) {\r\n\r\n //console.log('-- hide');\r\n\r\n //var cnt = document.getElementById(paId);\r\n //cnt.style = \"display: none;\";\r\n $('#' + paId).animate({ width: '0px' }, 500).hide(200, function () {\r\n //resize();\r\n });\r\n } else {\r\n\r\n //console.log('-- show');\r\n\r\n var cnt1 = document.getElementById(cnt1Id);\r\n if (cnt1 != null) cnt1.innerHTML = data.html1;\r\n var cnt2 = document.getElementById(cnt2Id);\r\n if (cnt2 != null) cnt2.innerHTML = data.html2;\r\n\r\n //if (cnt1 != null) console.log(cnt1.innerHTML);\r\n //console.log('5------------');\r\n //if (cnt2 != null) console.log(cnt2.innerHTML);\r\n //console.log('6------------');\r\n\r\n var fn = \"iboxPrepare_\" + data.id;\r\n eval(\"if (typeof \" + fn + \" === 'function') \" + fn + \"();\");\r\n }\r\n\r\n //$text.html(text);\r\n //kdrMockup.showEdit(id, false)\r\n },\r\n error: function (request, status, error) {\r\n //$text.html(request.responseText);\r\n //console.log(request.responseText);\r\n }\r\n });\r\n}\r\n\r\n$(document).on(\"click\", \" .get-tiles-management-modal\", function () {\r\n modalHelper.getModal('Employee/SqlBoxesManagementModal', { mode: $(this).data(\"mode\") })\r\n})\r\n\r\n$(document).on(gridEvents.BEFORE_RENDER, \"#boxes-management-grid\", function (event) {\r\n if (event.code == gridResponseCodes.SUCCESS && event.actionType == gridActions.UPDATE) {\r\n window.location.reload()\r\n }\r\n})\r\n\r\n////////////////////////////\r\n// Language selector //\r\n////////////////////////////\r\n$(function () {\r\n $('a.language-selector').click(function () {\r\n $.ajax({\r\n type: \"GET\",\r\n url: __root + 'Account/SetLanguage?langID=' + $(this).data('value'),\r\n processData: false,\r\n contentType: \"application/json\",\r\n dataType: 'json',\r\n success: function (response) {\r\n switch (response.statusCode) {\r\n case 200:\r\n location.reload()\r\n break;\r\n case 400:\r\n ShowErrors(response.value)\r\n break\r\n }\r\n }\r\n });\r\n })\r\n})\r\n\r\n//////////////////\r\n// Loading //\r\n//////////////////\r\n/**\r\n * It is managing loading indicator on specific element.\r\n * */\r\nvar loading = {\r\n keys: {\r\n loadingDataKey: 'loadingCounter'\r\n },\r\n /**\r\n * heh1\r\n * @param {any} selector If selector is undefined then loading will be added to body else it will be added to selected.\r\n * If selector !undefined then you can pass action what will be done after hide loading.\r\n * @param {any} callback Returns loadingId\r\n * @param {any} timeout Timeout is for delay show, expressed in miliseconds.\r\n */\r\n show(selector, callback, timeout = 0, progressText) {\r\n if (callback == undefined) {\r\n callback = null\r\n }\r\n\r\n if (selector == undefined || selector == null) {\r\n selector = $('body')\r\n }\r\n\r\n function f() {\r\n function manageLoadingIds($target) {\r\n\r\n let lc = $target.data(loading.keys.loadingDataKey)\r\n\r\n if (lc == undefined) {\r\n lc = 1\r\n } else {\r\n lc = parseInt(lc)\r\n if (lc < 0) {\r\n lc = 1\r\n } else {\r\n ++lc\r\n }\r\n }\r\n\r\n //$target.data(loading.keys.loadingDataKey, loadingIds)\r\n $target.data(loading.keys.loadingDataKey, lc)\r\n return lc == 1;\r\n }\r\n\r\n $target = convert.toJqueryObject(selector)\r\n\r\n for (var i = 0; i < $target.length; i++) {\r\n let $t = $target.eq(i)\r\n\r\n if (!$t.hasClass('not-loadable') && $t.is(':visible')) {\r\n\r\n if (manageLoadingIds($t)) {\r\n $t\r\n .attr('disabled', 'disabled')\r\n .waitMe({\r\n effect: 'win8',\r\n bg: 'rgba(0, 0, 0, 0.25)',\r\n color: '#000',\r\n maxSize: '',\r\n waitTime: -1,\r\n text: progressText,\r\n textPos: 'vertical',\r\n fontSize: '',\r\n source: ''\r\n })\r\n }\r\n }\r\n\r\n }\r\n\r\n\r\n //$('.tooltip.show').tooltip('hide')\r\n callback && callback()\r\n }\r\n\r\n if (timeout == 0) {\r\n f()\r\n } else {\r\n setTimeout(f, timeout)\r\n }\r\n },\r\n hide(selector, timeout = 0) {\r\n\r\n if (selector == undefined || selector == null) {\r\n selector = $('body')\r\n }\r\n\r\n function canCloseLoading($target) {\r\n let loadingCounter = $target.data(loading.keys.loadingDataKey)\r\n\r\n if (loadingCounter != undefined) {\r\n let lc = parseInt(loadingCounter)\r\n --lc\r\n $target.data(loading.keys.loadingDataKey, lc)\r\n\r\n return lc == 0\r\n } else {\r\n return !$target.hasClass('not-loadable')\r\n }\r\n }\r\n\r\n let f = () => {\r\n let $target = convert.toJqueryObject(selector)\r\n\r\n for (var i = 0; i < $target.length; i++) {\r\n let $t = $target.eq(i)\r\n if (canCloseLoading($t)) {\r\n $t\r\n .removeAttr('disabled')\r\n .waitMe(\"hide\")\r\n }\r\n }\r\n };\r\n\r\n if (timeout == 0) {\r\n f()\r\n } else {\r\n setTimeout(f, timeout)\r\n }\r\n }\r\n}\r\n\r\n/**************/\r\n/* Modal */\r\n/**************/\r\nvar modal = {\r\n getFirstHighestUsableZIndex() {\r\n return 1040 + (10 * $('.modal:visible, .kdr-grid-fullscreen-container:visible').length)\r\n },\r\n /**\r\n * Przygotowuje modal do wyswietlenia go na stronie, ogarnia backdrop itd.\r\n * @param {any} id Identyfikator modala\r\n * @param {any} options Dodatkowe opcje bootstrapowe\r\n * @param {any} removeP Mowi czy po zamknieciu modala, modal ma byc usuniety ze strony\r\n * @param {any} modalForAttribute Okresla dla jakiego elementu jest odpalony modal w attrybucie 'for'\r\n */\r\n prepareModal(id, options, removeP = true, modalForAttribute = undefined) {\r\n if (id == undefined || id == '' || id == null || id.length == 0) {\r\n throw 'core => modal.prepareModal - Id cannot be empty or undefined etc.'\r\n return\r\n }\r\n\r\n let $newModal = $('#' + id)\r\n\r\n if ($newModal.is(':visible')) {\r\n return\r\n } else {\r\n let $modals = $('.modal:visible');\r\n $('.modal-backdrop').css('opacity', 0.1);\r\n var zIndex = modal.getFirstHighestUsableZIndex()\r\n\r\n $newModal.modal(options);\r\n let $modalBackdrop = $('.modal-backdrop').not('.modal-stack')\r\n\r\n let $previousModal = $modals.last()\r\n let h = $modals.length > 0 ? $previousModal.find('.modal-header').css('height') : 0\r\n let pt = $modals.length > 0 ? $previousModal.find('.modal-dialog').css('padding-top') : 0\r\n\r\n $modalBackdrop.css('z-index', zIndex - 1)\r\n .attr('id', id + 'back')\r\n .addClass('modal-stack')\r\n .insertBefore($newModal)\r\n\r\n $newModal\r\n .on('hidden.bs.modal', function () {\r\n if (removeP) {\r\n $newModal.remove()\r\n }\r\n })\r\n .on('shown.bs.modal', () => $(document).off('focusin.modal'))\r\n .css('z-index', zIndex)\r\n .find('.modal-dialog').css('padding-top', `calc((${h} + ${pt})/2)`)\r\n .find('.modal-content').addClass('draggable')\r\n .find('.modal-header').addClass('draggable-handle');\r\n }\r\n\r\n //$newModal.find('.kdr-grid').on(gridEvents.AFTER_UI_INIT, () => {\r\n // $newModal.find('.kdr-grid-input[class*=\"ds\"]').trigger('disabler')\r\n //})\r\n\r\n $newModal.find(tooltipOtions.selector).tooltip({\r\n delay: {\r\n show: tooltipOtions.delay.show,\r\n hide: tooltipOtions.delay.hide\r\n },\r\n boundary: tooltipOtions.boundary,\r\n trigger: tooltipOtions.trigger\r\n })\r\n\r\n if (modalForAttribute != undefined) {\r\n $newModal.attr('for', modalForAttribute)\r\n }\r\n\r\n return $newModal\r\n },\r\n ajaxModalType: {\r\n default: 0,\r\n info: 1,\r\n warning: 2,\r\n danger: 3,\r\n success: 4,\r\n },\r\n getModal: {\r\n default(title = null, message = null, isCloseButton = null, cancelBtnText = null, cancelBtnClasses = null, actionBtnText = null, actionBtnClasses = null, actionBtnCallback = null, $loadingTarget = null, onModalCloseCallback = null, cancelBtnCallback = null, onModalShowCallback = null) {\r\n modal.getModalAjax({\r\n type: modal.ajaxModalType.default,\r\n title: title,\r\n message: message,\r\n isCloseButton: isCloseButton,\r\n cancelBtnText: cancelBtnText,\r\n cancelBtnClasses: cancelBtnClasses,\r\n cancelBtnCallback: cancelBtnCallback,\r\n actionBtnText: actionBtnText,\r\n actionBtnClasses: actionBtnClasses,\r\n actionBtnCallback: actionBtnCallback,\r\n $loadingTarget: $loadingTarget,\r\n onModalShowCallback: onModalShowCallback,\r\n onModalCloseCallback: onModalCloseCallback\r\n })\r\n },\r\n info(title = null, message = null, isCloseButton = null, cancelBtnText = null, cancelBtnClasses = null, actionBtnText = null, actionBtnClasses = null, actionBtnCallback = null, $loadingTarget = null, onModalCloseCallback = null, cancelBtnCallback = null, onModalShowCallback = null) {\r\n modal.getModalAjax({\r\n type: modal.ajaxModalType.info,\r\n title: title,\r\n message: message,\r\n isCloseButton: isCloseButton,\r\n cancelBtnText: cancelBtnText,\r\n cancelBtnClasses: cancelBtnClasses,\r\n cancelBtnCallback: cancelBtnCallback,\r\n actionBtnText: actionBtnText,\r\n actionBtnClasses: actionBtnClasses,\r\n actionBtnCallback: actionBtnCallback,\r\n $loadingTarget: $loadingTarget,\r\n onModalShowCallback: onModalShowCallback,\r\n onModalCloseCallback: onModalCloseCallback\r\n })\r\n },\r\n warning(title = null, message = null, isCloseButton = null, cancelBtnText = null, cancelBtnClasses = null, actionBtnText = null, actionBtnClasses = null, actionBtnCallback = null, $loadingTarget = null, onModalCloseCallback = null, cancelBtnCallback = null, onModalShowCallback = null) {\r\n modal.getModalAjax({\r\n type: modal.ajaxModalType.warning,\r\n title: title,\r\n message: message,\r\n isCloseButton: isCloseButton,\r\n cancelBtnText: cancelBtnText,\r\n cancelBtnClasses: cancelBtnClasses,\r\n cancelBtnCallback: cancelBtnCallback,\r\n actionBtnText: actionBtnText,\r\n actionBtnClasses: actionBtnClasses,\r\n actionBtnCallback: actionBtnCallback,\r\n $loadingTarget: $loadingTarget,\r\n onModalShowCallback: onModalShowCallback,\r\n onModalCloseCallback: onModalCloseCallback\r\n })\r\n },\r\n danger(title = null, message = null, isCloseButton = null, cancelBtnText = null, cancelBtnClasses = null, actionBtnText = null, actionBtnClasses = null, actionBtnCallback = null, $loadingTarget = null, onModalCloseCallback = null, cancelBtnCallback = null, onModalShowCallback = null) {\r\n modal.getModalAjax({\r\n type: modal.ajaxModalType.danger,\r\n title: title,\r\n message: message,\r\n isCloseButton: isCloseButton,\r\n cancelBtnText: cancelBtnText,\r\n cancelBtnClasses: cancelBtnClasses,\r\n cancelBtnCallback: cancelBtnCallback,\r\n actionBtnText: actionBtnText,\r\n actionBtnClasses: actionBtnClasses,\r\n actionBtnCallback: actionBtnCallback,\r\n $loadingTarget: $loadingTarget,\r\n onModalShowCallback: onModalShowCallback,\r\n onModalCloseCallback: onModalCloseCallback\r\n })\r\n },\r\n success(title = null, message = null, isCloseButton = null, cancelBtnText = null, cancelBtnClasses = null, actionBtnText = null, actionBtnClasses = null, actionBtnCallback = null, $loadingTarget = null, onModalCloseCallback = null, cancelBtnCallback = null, onModalShowCallback = null) {\r\n modal.getModalAjax({\r\n type: modal.ajaxModalType.success,\r\n title: title,\r\n message: message,\r\n isCloseButton: isCloseButton,\r\n cancelBtnText: cancelBtnText,\r\n cancelBtnClasses: cancelBtnClasses,\r\n cancelBtnCallback: cancelBtnCallback,\r\n actionBtnText: actionBtnText,\r\n actionBtnClasses: actionBtnClasses,\r\n actionBtnCallback: actionBtnCallback,\r\n $loadingTarget: $loadingTarget,\r\n onModalShowCallback: onModalShowCallback,\r\n onModalCloseCallback: onModalCloseCallback\r\n })\r\n }\r\n },\r\n /**\r\n * Create modal on server side and return to current view and display it.\r\n * Text must be in L.t format.\r\n * @param type Modal type, default: 0.\r\n * @param title Modal title.\r\n * @param message Message for user.\r\n * @param isCloseButton Tell if server should render close button on right top side.\r\n * @param cancelBtnText Text for the white button which is closing modal. Default is \"OK\".\r\n * @param cancelBtnClasses Additional classes for white button.\r\n * @param actionBtnText Text for blue button, if it`s null then it wont be rednered.\r\n * @param actionBtnClasses Additonal classes for the blue button.\r\n * @param actionBtnCallback Additional callback pinned 'onClick' on blue button. Callback returns modal.\r\n * @param $loadingTarget Items to show loading on them.\r\n */\r\n getModalAjax(options = { type: null, title: null, message: null, isCloseButton: null, cancelBtnText: null, cancelBtnClasses: null, actionBtnText: null, actionBtnClasses: null, actionBtnCallback: null, $loadingTarget: null, onModalCloseCallback: null, cancelBtnCallback: null, onModalShowCallback: null }) {\r\n $.ajax({\r\n type: \"POST\",\r\n url: __root + \"Modal/GetAjaxModal\",\r\n traditional: true,\r\n datatype: \"html\",\r\n data: {\r\n Type: options.type,\r\n Title: options.title,\r\n Message: options.message,\r\n IsCloseButton: options.isCloseButton,\r\n actionBtnText: options.actionBtnText,\r\n actionBtnClasses: options.actionBtnClasses,\r\n cancelBtnText: options.cancelBtnText,\r\n cancelBtnClasses: options.cancelBtnClasses\r\n },\r\n success: function (response) {\r\n let $modal = $($.parseHTML(response)[1])\r\n $('body').append($modal)\r\n\r\n options.onModalShowCallback && $modal.on('show.bs.modal', options.onModalShowCallback($modal))\r\n options.onModalCloseCallback && $modal.on('hidden.bs.modal', options.onModalCloseCallback($modal))\r\n\r\n if ($modal.hasClass('modal')) {\r\n let mId = $modal.attr('id')\r\n modal.prepareModal(mId, { keyboard: false, backdrop: 'static' });\r\n\r\n if (options.actionBtnText != null && options.actionBtnCallback) {\r\n $modal.find('.modal-ajax-btn_action').on('click', function () {\r\n options.actionBtnCallback && options.actionBtnCallback($modal)\r\n })\r\n }\r\n options.cancelBtnCallback && $modal.find('.modal-ajax-btn_cancel').on('click', function () {\r\n options.cancelBtnCallback($modal)\r\n })\r\n }\r\n },\r\n beforeSend: function () {\r\n loading.show(options.$loadingTarget)\r\n },\r\n complete: function () {\r\n loading.hide(options.$loadingTarget)\r\n loading.hide($('.kdr-grid-on-failed-hide-loading'))\r\n }\r\n })\r\n },\r\n hideClosest(button) {\r\n $(button).closest('.modal').modal('toggle')\r\n }\r\n}\r\n\r\nvar modalHelper = {\r\n addModalToBody(html, $loadingIndicator) {\r\n $('.modal.disposable-modal:not(.show)').remove()\r\n $loadingIndicator && loading.show($loadingIndicator)\r\n let $modal\r\n\r\n try {\r\n $modal = $(html);\r\n let id = $modal.attr('id');\r\n $modal.addClass('disposable-modal');\r\n $('body').append($modal);\r\n modal.prepareModal(id, { keyboard: false, backdrop: 'static' });\r\n\r\n //let $subtitle = $modal.find('.modal-subtitle-text');\r\n let $titleContainer = $modal.find('.modal-title');\r\n\r\n if ($titleContainer[0].scrollWidth > $titleContainer[0].offsetWidth) {\r\n $titleContainer.attr('data-original-title', $titleContainer[0].innerHTML);\r\n }\r\n\r\n tooltipHelper.init($modal, { html: true })\r\n pickers.init($modal);\r\n\r\n } catch (exception) {\r\n console.error(\"modalHelper.addModalToBody\")\r\n console.error(exception)\r\n toastr.error(\"Something went wrong, try again later.\", \"Ups...\")\r\n }\r\n $loadingIndicator && loading.hide($loadingIndicator)\r\n\r\n return $modal;\r\n },\r\n getModal(endpoint, data, $loadingTarget, successCallback) {\r\n\r\n $.ajax({\r\n type: \"POST\",\r\n url: window.location.origin + __root + endpoint,\r\n datatype: \"json\",\r\n traditional: true,\r\n data: data,\r\n success: function (response) {\r\n if (response.code == gridResponseCodes.WARNING) {\r\n modal.getModal.warning(\"~{Warning}\", response.message, true)\r\n } else if (response.code == gridResponseCodes.INFO) {\r\n modal.getModal.info(\"~{Info}\", response.message, true)\r\n } else if (response.code == gridResponseCodes.ERROR) {\r\n modal.getModal.danger(\"~{Error}\", response.message, true)\r\n } else {\r\n\r\n let $modal\r\n if (!(undefined == response || null == response || response == '')) {\r\n $modal = modalHelper.addModalToBody(response)\r\n }\r\n\r\n successCallback && successCallback($modal)\r\n }\r\n },\r\n error: function (response) {\r\n modal.getModal.danger(response.status, response.statusText, true)\r\n },\r\n beforeSend: function () {\r\n $loadingTarget && loading.show($loadingTarget)\r\n },\r\n complete: function () {\r\n $loadingTarget && loading.hide($loadingTarget)\r\n }\r\n })\r\n },\r\n removeModalFromBody($modal) {\r\n $modal.modal('hide')\r\n $modal.remove()\r\n }\r\n}\r\n\r\n$(function () {\r\n $(document).on('click', '.kdr-grid-on-success-close-modal', function () {\r\n let $this = $(this)\r\n let controlId = $this.attr('control-id')\r\n let $m = $this.closest('.modal')\r\n let removeP = !$this.hasClass('kdr-grid-on-success-close-modal-do-not-remove')\r\n\r\n if (!$this.hasClass('kdr-grid-perform-all-custom-ones') && !$this.hasClass('kdr-grid-perform-all-custom-ones-refresh') && !$this.hasClass('kdr-grid-perform-all-save-all-ext')) {\r\n let $control = controls.getControl(controlId)\r\n loading.show($this)\r\n $control.one(gridEvents.BEFORE_RENDER, function (event) {\r\n loading.hide($this)\r\n\r\n if (event.code == gridResponseCodes.SUCCESS) {\r\n if (removeP) {\r\n modalHelper.removeModalFromBody($m)\r\n }\r\n else {\r\n $m.modal('hide')\r\n }\r\n }\r\n })\r\n } else {\r\n $this.one('done', function (response) {\r\n if (response.isSuccess) {\r\n if (removeP) {\r\n modalHelper.removeModalFromBody($m)\r\n }\r\n else {\r\n $m.modal('hide')\r\n }\r\n }\r\n })\r\n }\r\n })\r\n\r\n $(document).on('click', '.kdr-grid-on-success-refresh', function () {\r\n let $this = $(this)\r\n let $control = controls.getControl($this.attr('control-id'))\r\n let $refreshTargets = $($this.data('refreshTarget'))\r\n\r\n let endpoint = $this.data('refreshEndpoint')\r\n\r\n $control.one(gridEvents.BEFORE_RENDER, function (event) {\r\n if (event.code == gridResponseCodes.SUCCESS) {\r\n $refreshTargets.each(function () {\r\n controls.refresh($(this), null, null, endpoint)\r\n })\r\n }\r\n })\r\n })\r\n\r\n $(document).on('click', '.kdr-grid-on-success-refresh-with-inputs', function () {\r\n let $this = $(this)\r\n let $control = controls.getControl($this.attr('control-id'))\r\n let $refreshTargets = $($this.data('refreshTarget'))\r\n\r\n let endpoint = $this.data('refreshEndpoint')\r\n\r\n $control.one(gridEvents.BEFORE_RENDER, function (event) {\r\n if (event.code == gridResponseCodes.SUCCESS) {\r\n $refreshTargets.each(function () {\r\n controls.refreshWithInputs($(this), null, null, endpoint)\r\n })\r\n }\r\n })\r\n })\r\n\r\n $(document).on('click', '.kdr-grid-on-success-refresh-with-clear-checkboxes', function () {\r\n let $this = $(this)\r\n let $control = controls.getControl($this.attr('control-id'))\r\n let $refreshTargets = $($this.data('refreshTarget'))\r\n\r\n let endpoint = $this.data('refreshEndpoint')\r\n\r\n $control.one(gridEvents.BEFORE_RENDER, function (event) {\r\n if (event.code == gridResponseCodes.SUCCESS) {\r\n $refreshTargets.each(function () {\r\n controls.refresh($(this), null, null, endpoint, null, null, true)\r\n })\r\n }\r\n })\r\n })\r\n\r\n $(document).on('click', '.kdr-grid-on-success-return-site', function () {\r\n let $this = $(this)\r\n let controlId = $this.attr('control-id')\r\n let $control = controls.getControl(controlId)\r\n loading.show($this)\r\n\r\n $control.one(gridEvents.BEFORE_RENDER, function (event) {\r\n loading.hide($this)\r\n\r\n if (event.code == gridResponseCodes.SUCCESS) {\r\n site.goBack()\r\n }\r\n })\r\n })\r\n\r\n $(document).on('click', '.hide-closest-modal', function () {\r\n modal.hideClosest(this)\r\n })\r\n\r\n $(document).on('hidden.bs.modal', '.modal', function () {\r\n $('.modal:visible').length && $(document.body).addClass('modal-open');\r\n $('.modal-backdrop').last().css('opacity', 0.5);\r\n });\r\n})\r\n\r\n$(document).on('click', '.warning-on-cancel', function () {\r\n let $this = $(this)\r\n let $mainModal = $this.closest('.modal')\r\n modal.getModal.warning('~{Warning}', '~{Are you sure you want to cancel? Your changes will not be saved.}', true, '~{Close}', null, '~{Confirm}', null, function ($modal) {\r\n $modal.modal('hide')\r\n $mainModal.modal('hide')\r\n }, $this)\r\n\r\n})\r\n\r\n/////////////////////////////\r\n// Selectable dropdown //\r\n/////////////////////////////\r\nvar selectableDropdown = {\r\n getSelectedValues($kdrDdlCustom) {\r\n let v = $kdrDdlCustom.data('selectedValues')\r\n return (undefined == v || null == v) ? [] : v\r\n },\r\n /**\r\n * Setting data of selected value, based od rendered items.\r\n * @param {any} $kdrDdlCustom\r\n * @param {any} callback\r\n */\r\n setSelectedValues($kdrDdlCustom, callback) {\r\n let selectedValues = []\r\n\r\n $kdrDdlCustom.find('.kdr-ddl-custom-item').each(function (i, e) {\r\n let value = $(e).data('value')\r\n if (value != undefined && value !== '') {\r\n selectedValues.push(value)\r\n }\r\n })\r\n\r\n //$this.data({ selectedValues: selectedValues })\r\n $kdrDdlCustom.data('selectedValues', selectedValues)\r\n\r\n callback && callback()\r\n },\r\n /**\r\n * Rendering new item(s) \r\n * @param {any} $kdrDdlCustom\r\n * @param {any} value single value or array of values\r\n */\r\n renderNewItem($kdrDdlCustom, value) {\r\n if ($.isArray(value)) {\r\n $(value).each((a, b) => selectableDropdown.renderNewItem($kdrDdlCustom, b))\r\n } else {\r\n\r\n let $selectedItem = $kdrDdlCustom.find('.kdr-dropdown-w-search-item[data-value=\"' + value + '\"]')\r\n let selectedItemTitile = $selectedItem.find('.kdr-dropdown-w-search-item-text').text()\r\n\r\n let $copiedTr = $kdrDdlCustom\r\n .find('.kdr-ddl-custom-tr-pattern')\r\n .clone()\r\n .detach()\r\n\r\n $copiedTr.find('.kdr-ddl-custom-item')\r\n .text(selectedItemTitile)\r\n .data('value', value)\r\n\r\n $copiedTr.find(tooltipOtions.selector).tooltip({\r\n delay: {\r\n show: tooltipOtions.delay.show,\r\n hide: tooltipOtions.delay.hide\r\n },\r\n boundary: tooltipOtions.boundary,\r\n trigger: tooltipOtions.trigger,\r\n })\r\n\r\n $copiedTr\r\n .insertBefore($selectedItem.closest('.kdr-ddl-custom-tr-select'))\r\n .removeClass('hide')\r\n .removeClass('kdr-ddl-custom-tr-pattern')\r\n .addClass('kdr-ddl-custom-tr')\r\n }\r\n },\r\n /**\r\n * Rendering and setting up new array of selected values.\r\n * @param {any} $kdrDdlCustom\r\n * @param {any} values\r\n */\r\n selectValuesWPurge($kdrDdlCustom, values) {\r\n selectableDropdown.removeAllItems($kdrDdlCustom)\r\n selectableDropdown.renderNewItem($kdrDdlCustom, values)\r\n selectableDropdown.setSelectedValues($kdrDdlCustom)\r\n },\r\n /**\r\n * Removing all selected items and setting up selected values to empty array.\r\n * @param {any} $kdrDdlCustom\r\n */\r\n removeAllItems($kdrDdlCustom) {\r\n $kdrDdlCustom.find('.kdr-ddl-custom-tr').remove()\r\n selectableDropdown.setSelectedValues($kdrDdlCustom)\r\n },\r\n}\r\n\r\n$(function () {\r\n\r\n $(document).on('collectItems', '.kdr-ddl-custom.table', function (e, callback) {\r\n selectableDropdown.setSelectedValues($(this), callback)\r\n })\r\n\r\n $(document).on('addItem', '.kdr-ddl-custom-select', function () {\r\n let $this = $(this)\r\n let $selectedItem = $this\r\n let selectedItemValue = $selectedItem.data('value')\r\n if (selectedItemValue != undefined && selectedItemValue != null && selectedItemValue !== '') {\r\n\r\n let $kdrDdlCustom = $this.closest('.kdr-ddl-custom')\r\n let maxItemsToSelect = $kdrDdlCustom.data('maxitemstoselect')\r\n let selectedValues = $kdrDdlCustom.data('selectedValues')\r\n let isAllowedMultiSelection = $kdrDdlCustom.data('isallowedmultiselection')\r\n\r\n if (selectedValues == undefined) {\r\n $kdrDdlCustom.trigger('collectItems')\r\n $this.trigger('addItem')\r\n return\r\n }\r\n\r\n //validation START\r\n if (maxItemsToSelect != undefined && selectedValues != undefined && selectedValues.length >= maxItemsToSelect) {\r\n modal.getModal.danger(\"~{Error}\", \"~{You can select only !{\" + maxItemsToSelect + \"} items.}\", true)\r\n\r\n return\r\n }\r\n else if (isAllowedMultiSelection != undefined\r\n && !$.parseJSON(isAllowedMultiSelection.toLowerCase())\r\n && selectedValues.some(function (x) { return x == selectedItemValue })) {\r\n\r\n modal.getModal.danger(\"~{Error}\", \"~{You can select this item only once.}\", true)\r\n\r\n return\r\n }\r\n //validation END\r\n\r\n selectableDropdown.renderNewItem($kdrDdlCustom, selectedItemValue)\r\n\r\n\r\n $this.closest('.kdr-ddl-custom.table').trigger('collectItems')\r\n }\r\n })\r\n\r\n //$(document).on('click', '.kdr-ddl-custom-select option', function (e) {\r\n // $(this).closest('.kdr-ddl-custom-select').change()\r\n //})\r\n\r\n $(document).on('change', '.kdr-ddl-custom-select', function () {\r\n $(this).closest('.kdr-ddl-custom-select').trigger('addItem')\r\n })\r\n\r\n $(document).on('click', '.kdr-ddl-custom-btn-delete', function () {\r\n let $clearParent = $(this).closest('.clear-parent-ddl');\r\n if ($clearParent.length) {\r\n let $selectedRow = $clearParent.find('.kdr-ddl-custom-tr-select');\r\n if ($selectedRow.length) {\r\n let $menu = $selectedRow.find('.kdr-dropdown-w-search-menu');\r\n if ($menu.length) {\r\n let $item = $menu.find('.kdr-dropdown-w-search-item[tabindex=\"1\"]');\r\n if ($item.length) {\r\n $item.click()\r\n }\r\n }\r\n }\r\n }\r\n\r\n let $table = $(this).closest('.kdr-ddl-custom.table')\r\n $(this).tooltip('hide')\r\n $(this).closest('tr').remove()\r\n $table.trigger('collectItems')\r\n\r\n })\r\n\r\n $(document).on('click', '.kdr-ddl-custom-btn-m-up', function () {\r\n let $tr = $(this).closest('.kdr-ddl-custom-tr')\r\n\r\n $tr.addClass('moving')\r\n $tr.find(tooltipOtions.selector).tooltip('hide')\r\n $tr.prev('tr').insertAfter($tr)\r\n\r\n $(this).blur()\r\n $(this).closest('.kdr-ddl-custom.table').trigger('collectItems')\r\n setTimeout(function () { $tr.removeClass('moving') }, 250)\r\n })\r\n\r\n $(document).on('click', '.kdr-ddl-custom-btn-m-down', function () {\r\n let $tr = $(this).closest('.kdr-ddl-custom-tr')\r\n\r\n $tr.addClass('moving')\r\n $tr.find(tooltipOtions.selector).tooltip('hide')\r\n $tr.next('tr').not('.kdr-ddl-custom-tr-select').insertBefore($tr)\r\n\r\n $(this).blur()\r\n $(this).closest('.kdr-ddl-custom.table').trigger('collectItems')\r\n setTimeout(function () { $tr.removeClass('moving') }, 250)\r\n })\r\n})\r\n\r\n///////////////////////\r\n// Layout colors //\r\n///////////////////////\r\nlet theme = {\r\n set: function (index, info) {\r\n $.ajax({\r\n type: \"POST\",\r\n url: __root + \"Account/SetTheme\",\r\n traditional: true,\r\n data: {\r\n \"info\": info,\r\n \"index\": parseInt(index, 10)\r\n },\r\n success: function (response) {\r\n if (response.code == gridResponseCodes.SUCCESS) {\r\n location.reload(true)\r\n }\r\n else {\r\n //toastr.error(response.message)\r\n modal.getModal.danger(\"~{Error}\", response.info, true)\r\n }\r\n },\r\n beforeSend: loading.show(),\r\n complete: loading.hide()\r\n })\r\n }\r\n}\r\n\r\n$(function () {\r\n $(document).on('click', '.set-theme', function () {\r\n let $this = $(this)\r\n let id = $this.data('value')\r\n let info = $this.closest('.dropdown-menu').find('#ThemeInfo').data('info')\r\n theme.set(id, info)\r\n })\r\n})\r\n\r\n$(function () {\r\n $(document).on('click', '.set-theme-myaccount', function () {\r\n let $this = $(this)\r\n let id = $this.data('value')\r\n let info = $this.closest('.user-qualification-panel-grid').find('#ThemeInfo').data('info')\r\n theme.set(id, info)\r\n })\r\n})\r\n\r\n//////////////////////////////////\r\n// Company Selector //\r\n//////////////////////////////////\r\nvar company = {\r\n set: function (index, info) {\r\n $.ajax({\r\n type: \"POST\",\r\n url: __root + \"Account/SetCompany\",\r\n traditional: true,\r\n data: {\r\n \"info\": info,\r\n \"index\": parseInt(index, 10)\r\n },\r\n success: function (response) {\r\n if (response.code == gridResponseCodes.SUCCESS) {\r\n location = __root\r\n } else {\r\n modal.getModal.danger(\"~{Error}\", response.info, true)\r\n }\r\n },\r\n beforeSend: loading.show(),\r\n complete: loading.hide()\r\n })\r\n }\r\n}\r\n\r\n$(function () {\r\n $(document).on('click', '.company-selector', function (event) {\r\n let $this = $(this)\r\n\r\n if ($this.hasClass('company-incompatible') && event.ctrlKey !== true) {\r\n return 0\r\n }\r\n\r\n let id = $this.data('value')\r\n let info = $this.closest('.dropdown-menu').find('#CompanyInfo').data('info')\r\n company.set(id, info)\r\n })\r\n})\r\n\r\n///////////////////////\r\n// Console log //\r\n///////////////////////\r\n/**\r\n * Handy form for debuging with console.log.\r\n*/\r\nvar deb = function (item) {\r\n console.log(item)\r\n}\r\n\r\n///////////////////////\r\n// Konami code //\r\n///////////////////////\r\n$(function () {\r\n let k = {\r\n allowedKeys: {\r\n 37: 'left',\r\n 38: 'up',\r\n 39: 'right',\r\n 40: 'down',\r\n 65: 'a',\r\n 66: 'b'\r\n },\r\n sequence: ['up', 'up', 'down', 'down', 'left', 'right', 'left', 'right', 'b', 'a'],\r\n position: 0,\r\n activateCheat: function () {\r\n $('.body-content > div:first-child').css('backgroundImage', 'url(\"../../images/login_background.jpg\")')\r\n }\r\n }\r\n\r\n document.addEventListener('keydown', function (e) {\r\n var key = k.allowedKeys[e.keyCode];\r\n var requiredKey = k.sequence[k.position];\r\n if (key == requiredKey) {\r\n k.position++;\r\n //deb(k.position)\r\n\r\n if (k.position == k.sequence.length) {\r\n k.activateCheat();\r\n k.position = 0;\r\n }\r\n } else {\r\n k.position = 0;\r\n }\r\n })\r\n})\r\n\r\n///////////////////////\r\n// Mailing //\r\n///////////////////////\r\n\r\nlet email = {\r\n sendTest: function (p) {\r\n $.ajax({\r\n type: \"GET\",\r\n url: __root + \"Mailing/SendTestEmail?p=\" + p,\r\n processData: false,\r\n datatype: \"json\",\r\n success: function (response) {\r\n if (response.statusCode == 200) {\r\n //toastr.success(response.value) \r\n modal.getModal.info(\"~{Success}\", response.value, true)\r\n } else {\r\n //toastr.error(response.value)\r\n modal.getModal.danger(\"~{Error}\", response.value, true)\r\n }\r\n },\r\n beforeSend: function () { loading.show($('.send-test-mail')) },\r\n complete: function () { loading.hide($('.send-test-mail')) }\r\n })\r\n },\r\n addMarker: function (marker) {\r\n let targetPostion = tinymce.activeEditor.selection.getNode()\r\n if ($(targetPostion).is(':visible')) {\r\n let $marker = $(marker).clone().detach()\r\n let insertContent = $marker.prop('outerHTML')\r\n\r\n if ($marker.find('.marker-section').length > 0) {\r\n insertContent += '

' + insertContent\r\n }\r\n\r\n tinymce.activeEditor.execCommand('mceInsertRawHTML', false, insertContent)\r\n }\r\n }\r\n}\r\n\r\n$(function () {\r\n $(document).on('click', '.send-test-mail', function () { email.sendTest($(this).data('p')) })\r\n\r\n $(document).on('click', '#edit-mailing .kdr-grid-edit-ext', function () {\r\n $('.send-test-mail').hide()\r\n })\r\n $(document).on('click', '#edit-mailing .kdr-grid-cancel-ext', function () {\r\n $('.send-test-mail').show()\r\n })\r\n $(document).on(gridEvents.AFTER_RENDER, '#grid-edit-mail', function (reponse) {\r\n if (gridResponseCodes.SUCCESS == reponse.code) {\r\n $('.send-test-mail').show()\r\n }\r\n })\r\n\r\n $(document).on('click', '.marker-parent', function (event) {\r\n email.addMarker($(this))\r\n })\r\n\r\n $(document).on('click', '#minimize-marker-window', function () {\r\n $('.markers-wrapper').addClass('window-right-out')\r\n })\r\n\r\n $(document).on('animationend', '.window-right-out', function () {\r\n $('.markers-wrapper').hide()\r\n $('.markers-wrapper').removeClass('window-right-out')\r\n $('#show-marker-window').addClass('button-left-in')\r\n $('#show-marker-window').removeClass('hide')\r\n })\r\n\r\n $(document).on('animationend', '.window-left-in', function () {\r\n $('.markers-wrapper').removeClass('window-left-in')\r\n })\r\n\r\n $(document).on('click', '#show-marker-window', function () {\r\n $('#show-marker-window').addClass('button-right-out')\r\n })\r\n\r\n $(document).on('animationend', '.button-right-out', function () {\r\n $('#show-marker-window').addClass('hide')\r\n $('#show-marker-window').removeClass('button-right-out')\r\n $('.markers-wrapper').addClass('window-left-in')\r\n $('.markers-wrapper').show()\r\n })\r\n\r\n $(document).on('animationend', '.button-left-in', function () {\r\n $('#show-marker-window').removeClass('button-left-in')\r\n })\r\n\r\n $(document).on('focusout', '#tinymce.editor-content', function () { email.sendTest($(this).data('p')) })\r\n $(document).on('click', '#edit-mailing .kdr-grid-edit-ext', function () {\r\n $('.markers-wrapper').show()\r\n $('#show-marker-window').addClass('hide')\r\n $('.delete-marker').removeClass('hide')\r\n })\r\n\r\n $(document).on('click', '#edit-mailing .kdr-grid-save-ext', function () {\r\n $('.markers-wrapper').hide()\r\n $('.markers-wrapper').addClass('window-left-in')\r\n $('#show-marker-window').addClass('hide')\r\n $('.delete-marker').addClass('hide')\r\n })\r\n\r\n $(document).on('click', '#edit-mailing .kdr-grid-cancel-ext', function () {\r\n $('.markers-wrapper').hide()\r\n $('.markers-wrapper').addClass('window-left-in')\r\n $('#show-marker-window').addClass('hide')\r\n $('.delete-marker').addClass('hide')\r\n })\r\n\r\n $(document).on(gridEvents.BEFORE_RENDER, '#grid-edit-mail', function (event) {\r\n if (event.code == gridResponseCodes.SUCCESS) {\r\n $('.markers-wrapper').hide()\r\n }\r\n })\r\n})\r\n\r\n$(document).on(gridEvents.BEFORE_RENDER, '#add-mailing-grid', function (event) {\r\n if (event.code == gridResponseCodes.SUCCESS) {\r\n controls.refresh(null, 'mailing-grid')\r\n $('#add-mailing-modal').modal('hide')\r\n }\r\n})\r\n\r\n///////////////////////\r\n// User tour //\r\n///////////////////////\r\nvar __tutorialSteps = [];\r\n\r\nvar tour = null\r\ntry {\r\n if (typeof (Shepherd) != 'undefined') {\r\n tour = new Shepherd.Tour({\r\n useModalOverlay: true,\r\n defaultStepOptions: {\r\n cancelIcon: {\r\n enabled: true\r\n },\r\n classes: 'shepherd-theme-custom',\r\n scrollTo: { behavior: 'smooth', block: 'center' }\r\n }\r\n });\r\n }\r\n} catch (error) {\r\n console.info(\"You are propably using IE\");\r\n console.error(error);\r\n}\r\n\r\nfunction addUrlParameter(paramName, paramValue) {\r\n var url = window.location.href;\r\n var hash = location.hash;\r\n url = url.replace(hash, '');\r\n if (url.indexOf(paramName + \"=\") >= 0) {\r\n var prefix = url.substring(0, url.indexOf(paramName + \"=\"));\r\n var suffix = url.substring(url.indexOf(paramName + \"=\"));\r\n suffix = suffix.substring(suffix.indexOf(\"=\") + 1);\r\n suffix = (suffix.indexOf(\"&\") >= 0) ? suffix.substring(suffix.indexOf(\"&\")) : \"\";\r\n url = prefix + paramName + \"=\" + paramValue + suffix;\r\n } else {\r\n if (url.indexOf(\"?\") < 0) url += \"?\" + paramName + \"=\" + paramValue; else url += \"&\" + paramName + \"=\" + paramValue;\r\n }\r\n window.location.href = url + hash;\r\n}\r\n\r\nfunction findGetParameter(paramName) {\r\n var result = null,\r\n tmp = [];\r\n var items = location.search.substr(1).split(\"&\");\r\n for (var index = 0; index < items.length; index++) {\r\n tmp = items[index].split(\"=\");\r\n if (tmp[0] === paramName) result = decodeURIComponent(tmp[1]);\r\n }\r\n return result;\r\n}\r\n\r\nvar AjaxTutorial = {\r\n loadWaiting: false,\r\n usepopupnotifications: false,\r\n consts: {\r\n tutorial: 'tutorial'\r\n },\r\n\r\n init: function (usepopupnotifications) {\r\n this.loadWaiting = false;\r\n this.usepopupnotifications = usepopupnotifications;\r\n },\r\n\r\n setLoadWaiting: function (display) {\r\n displayAjaxLoading(display);\r\n this.loadWaiting = display;\r\n },\r\n\r\n turnOn: function () {\r\n addUrlParameter(this.consts.tutorial, __tutorialId);\r\n },\r\n\r\n //add a product to the cart/wishlist from the catalog pages\r\n loadTutorial: function (tutorialId) {\r\n if (this.loadWaiting != false) {\r\n return;\r\n }\r\n\r\n this.setLoadWaiting(true);\r\n\r\n $.ajax({\r\n cache: false,\r\n url: __tutorialEndpoint + '?tutorialId=' + tutorialId,\r\n type: \"POST\",\r\n success: this.success_process,\r\n complete: this.resetLoadWaiting,\r\n error: this.ajaxFailure\r\n });\r\n },\r\n\r\n /**@deprecated Use AjaxTutorial.checkState2\r\n * Check if site is in tutorial mode, if yes then start tutorial by id */\r\n checkState: function () {\r\n let tutorialId = findGetParameter(this.consts.tutorial)\r\n\r\n if (undefined != tutorialId && null != tutorialId) {\r\n //alert('Tutorial ID: ' + tutorialId)\r\n this.loadTutorial(tutorialId)\r\n }\r\n },\r\n\r\n /** Check if __tutorialsteps is not udefined and lenght is bigger then 1 \r\n * if yes then show tutorial start button \r\n * else hide the button */\r\n checkState2: function () {\r\n if (!__tutorialSteps || __tutorialSteps.length > 0) {\r\n $('.btTutorial').removeClass('hide')\r\n }\r\n },\r\n\r\n /** Deprecated Use AjaxTutorial.startTour\r\n * Parsing ajax response to steps and starting user tutorial */\r\n success_process: function (response) {\r\n /*\r\n if (response.updatetopcartsectionhtml) {\r\n $(AjaxCart.topcartselector).html(response.updatetopcartsectionhtml);\r\n }\r\n if (response.updatetopwishlistsectionhtml) {\r\n $(AjaxCart.topwishlistselector).html(response.updatetopwishlistsectionhtml);\r\n }\r\n if (response.updateflyoutcartsectionhtml) {\r\n $(AjaxCart.flyoutcartselector).replaceWith(response.updateflyoutcartsectionhtml);\r\n }\r\n */\r\n\r\n tour.steps = []\r\n $(response.items).each(function (i, e) {\r\n let tutorialStep = JSON.parse(e)\r\n tour.addStep(tutorialStep, i)\r\n })\r\n\r\n AjaxTutorial.evalFunction(tour.steps[0])\r\n tour.start()\r\n\r\n if (response.message) {\r\n //display notification\r\n if (response.success == true) {\r\n //success\r\n if (AjaxTutorial.usepopupnotifications == true) {\r\n displayPopupNotification(response.message, 'success', true);\r\n }\r\n else {\r\n //specify timeout for success messages\r\n displayBarNotification(response.message, 'success', 3500);\r\n }\r\n }\r\n else {\r\n //error\r\n if (AjaxTutorial.usepopupnotifications == true) {\r\n displayPopupNotification(response.message, 'error', true);\r\n }\r\n else {\r\n //no timeout for errors\r\n displayBarNotification(response.message, 'error', 0);\r\n }\r\n }\r\n return false;\r\n }\r\n if (response.redirect) {\r\n location.href = response.redirect;\r\n return true;\r\n }\r\n return false;\r\n },\r\n //----------------------------------------------------\r\n\r\n resetLoadWaiting: function () {\r\n AjaxTutorial.setLoadWaiting(false);\r\n },\r\n\r\n ajaxFailure: function () {\r\n alert('Failed to load tutorial. Please refresh the page and try one more time.');\r\n },\r\n\r\n goNext: function () {\r\n let $currentStep = tour.getCurrentStep()\r\n let nextStep = undefined\r\n tour.steps.filter(function (e, i) {\r\n if (e.id == $currentStep.id) {\r\n nextStep = tour.steps[i + 1]\r\n return\r\n }\r\n })\r\n\r\n this.evalFunction($currentStep, 1)\r\n this.evalFunction(nextStep)\r\n tour.next()\r\n },\r\n goBack: function () {\r\n tour.back()\r\n this.evalFunction(tour.getCurrentStep())\r\n },\r\n goCancel: function () {\r\n tour.cancel();\r\n },\r\n\r\n /** If mode == 0 then eval beforShow func, else if mode == 1 then eval afterHide func */\r\n evalFunction: function (step, mode = 0) {\r\n if (!step) {\r\n return\r\n }\r\n\r\n if ((0 == mode) && step.options.beforeShow) { //if step.options.beforeShow is not undefined then do it \r\n eval(step.options.beforeShow)\r\n }\r\n\r\n if ((1 == mode) && step.options.afterHide) {\r\n eval(step.options.afterHide)\r\n }\r\n },\r\n\r\n /** Parsing tutorial steps from _TutorialBox.cshtml and starting tour */\r\n startTour: function () {\r\n tour.steps = []\r\n $(__tutorialSteps).each(function (i, e) {\r\n let tutorialStep = JSON.parse(e)\r\n //console.log(tutorial)\r\n tour.addStep(tutorialStep, i)\r\n })\r\n AjaxTutorial.evalFunction(tour.steps[0])\r\n tour.start()\r\n }\r\n};\r\n\r\n$(function () {\r\n\r\n $(document)\r\n .on('click', '.tourGoNext', function () {\r\n AjaxTutorial.goNext()\r\n })\r\n .on('click', '.tourGoBack', function () {\r\n AjaxTutorial.goBack()\r\n })\r\n .on('click', '.tourGoCancel', function () {\r\n AjaxTutorial.goCancel()\r\n })\r\n .on('click', '.btTutorial', function () {\r\n //AjaxTutorial.turnOn();\r\n AjaxTutorial.startTour()\r\n })\r\n\r\n AjaxTutorial.checkState2()\r\n})\r\n\r\n$(document).on('click', '.tourGoCancel', function () {\r\n $(this).closest('.shepherd-content').parent().addClass('slide-out-animation')\r\n})\r\n\r\n$(document).on('animationend webkitAnimationEnd oAnimationEnd MSAnimationEnd', '.steps .step', function () {\r\n $(this).addClass('step-after-animation')\r\n})\r\n\r\n\r\n///////////////////////\r\n// LP JS //\r\n///////////////////////\r\n/**\r\n * Text translation ajax\r\n */\r\nvar L = {\r\n /**\r\n * Text translation\r\n * L.p(\"~{Error}\").then(r => deb(r))\r\n * Result in console in PL lang:\r\n * 'Blad'\r\n * @param {any} text Text to translate\r\n * Returns translated text as promise\r\n */\r\n p: function (text) {\r\n let lped = text\r\n return new Promise(function (resolve, reject) {\r\n L.ajax(lped).then(function (response) {\r\n if (0 == response.code) {\r\n lped = response.args[0]\r\n } else if (0 < response.message.length) {\r\n //toastr[response.code](response.message)\r\n modal.getModal.danger(\"~{Error}\", response.message, true)\r\n\r\n }\r\n resolve(lped)\r\n })\r\n })\r\n },\r\n ajax: function (text) {\r\n let data = {\r\n text: text\r\n }\r\n\r\n return $.ajax({\r\n type: \"POST\",\r\n url: __root + \"Test/Lp\",\r\n processData: false,\r\n datatype: \"json\",\r\n data: JSON.stringify(data),\r\n contentType: \"application/json\",\r\n })\r\n }\r\n}\r\n\r\n\r\n////////////////\r\n// SUBSTITUTE //\r\n////////////////\r\n$(function () {\r\n $(document).on('click', '.substitute-selector', function () {\r\n let $this = $(this)\r\n //let index = $this.data('id')\r\n let index = $this.data('value')\r\n let info = $this.closest('.dropdown-menu').find('#substitute-selector-info').data('info')\r\n\r\n $.ajax({\r\n type: \"POST\",\r\n url: __root + 'Account/Substitute',\r\n traditional: true,\r\n data: {\r\n info: info,\r\n index: index\r\n },\r\n success: function (response) {\r\n if (response.code == gridResponseCodes.SUCCESS) {\r\n location = __root\r\n } else if (response.code == gridResponseCodes.ERROR) {\r\n //toastr.error(response.info)\r\n modal.getModal.danger(\"~{Error}\", response.info, true)\r\n }\r\n else {\r\n //toastr.warning(response.info)\r\n modal.getModal.warning(\"~{Warning}\", response.info, true)\r\n }\r\n },\r\n beforeSend: function () {\r\n $(tooltipOtions.selector).tooltip('dispose')\r\n }\r\n });\r\n })\r\n\r\n $(document).on('click', '.substitute-terminate-button', function () {\r\n $.ajax({\r\n type: \"GET\",\r\n url: __root + 'Account/TerminateSubstitute',\r\n processData: false,\r\n traditional: true,\r\n contentType: \"application/json\",\r\n dataType: 'json',\r\n success: function (response) {\r\n switch (response.statusCode) {\r\n case 200:\r\n location = __root\r\n break;\r\n case 400:\r\n ShowErrors(response.value)\r\n break\r\n }\r\n }\r\n });\r\n })\r\n\r\n let requesting = false;\r\n $(document).on('paste input', '.substitute-input', function () {\r\n let $this = $(this)\r\n if (requesting == false) {\r\n\r\n\r\n let $parent = $this.closest('div')\r\n let value = $this.val()\r\n $.ajax({\r\n type: \"POST\",\r\n url: __root + 'Account/GetUsersToSubstitute',\r\n dataType: 'html',\r\n traditional: true,\r\n data: {\r\n pattern: value\r\n },\r\n success: function (data) {\r\n $parent.siblings().remove()\r\n let $partial = $(jQuery.parseHTML(data, false))\r\n\r\n //$partial.find(tooltipOtions.selector).tooltip({\r\n // delay: {\r\n // show: tooltipOtions.delay.show,\r\n // hide: tooltipOtions.delay.hide\r\n // },\r\n // boundary: tooltipOtions.boundary,\r\n // trigger: tooltipOtions.trigger\r\n //})\r\n $parent.parent().append($partial)\r\n tooltipHelper.init($parent)\r\n },\r\n beforeSend: function () {\r\n requesting = true\r\n $(tooltipOtions.selector).tooltip('hide')\r\n },\r\n complete: function () {\r\n requesting = false\r\n },\r\n })\r\n }\r\n })\r\n\r\n $(document).on('change input', '.company-search-input', function () {\r\n let $input = $(this)\r\n let v = $input.valExtended().trim();\r\n\r\n let $items = $input.closest('.dropdown-menu').find('.company-selector')\r\n\r\n if (textHelper.isNullOrEmpty(v)) {\r\n $items.show()\r\n } else {\r\n for (let i = 0; i < $items.length; i++) {\r\n let $item = $items.eq(i)\r\n let text = $item.text().trim().toLowerCase()\r\n\r\n if (text.includes(v)) {\r\n $item.show()\r\n } else {\r\n $item.hide()\r\n }\r\n }\r\n }\r\n })\r\n\r\n $(document).on('classChangedTrigger', '.kdr-control-mddm-btn .dropdown-menu', function () {\r\n let $this = $(this)\r\n let $input = $this.find('.substitute-input')\r\n if ($input.length > 0) {\r\n $input.trigger(\"input\")\r\n }\r\n })\r\n})\r\n\r\nfunction ShowErrors(errors) {\r\n $(errors).each(function (i) {\r\n modal.getModal.danger(\"~{Error}\", this.errorDescription, true)\r\n })\r\n}\r\n\r\n$(document).on('mouseover', '.draggable:not(.reset-inset)', function () {\r\n let $this = $(this)\r\n let $handle = $this.find('.draggable-handle')\r\n\r\n $this.draggable({\r\n handle: $handle,\r\n scroll: false,\r\n drag: function () {\r\n let $this = $(this)\r\n let $handle = $this.find('.draggable-handle')\r\n\r\n $.each($handle.isInViewport(), function (propertyName, propertyValue) {\r\n if (propertyValue == false) {\r\n $handle.mouseup()\r\n if ($handle.closest('.modal').length > 0) {\r\n let oldStyles = $this.attr('style').split(';').filter(f => f.length > 0).map(u => u.trim())\r\n\r\n //\"yAxlepx auto auto xAxlepx\"\r\n let insets = oldStyles.filter(u => u.includes('inset'))[0].split(':')[1].trim().split(' ')\r\n insets[0] = '0px'\r\n insets[3] = '0px'\r\n\r\n let newStyles = oldStyles.filter(u => !u.includes('inset'))\r\n newStyles.push('inset: ' + insets.join(' '))\r\n\r\n $this.one('animationend webkitAnimationEnd oAnimationEnd MSAnimationEnd', function () {\r\n $this.attr('style', newStyles.join(\"; \").trim())\r\n .removeClass('reset-inset')\r\n })\r\n .addClass('reset-inset')\r\n\r\n return false\r\n } else {\r\n $this.css('inset', '')\r\n }\r\n }\r\n })\r\n\r\n },\r\n stop: function () {\r\n $this.css('height', '')\r\n }\r\n })\r\n\r\n $handle.css('cursor', 'move')\r\n})\r\n\r\n//////////////////////////////////\r\n// Hanoi //\r\n//////////////////////////////////\r\n\r\n/* Two select list\r\n **/\r\nvar hanoi = {\r\n /**\r\n * Move all from left to rirght select and vice versa\r\n */\r\n classes: {\r\n selectSelected: 'kdr-hanoi-select_selected',\r\n selectNotSelected: 'kdr-hanoi-select_not-selected',\r\n option: 'kdr-hanoi-option',\r\n optionSelected: 'kdr-hanoi-option_selected',\r\n optionNotSelected: 'kdr-hanoi-option_not-selected',\r\n selectWrapper: 'kdr-hanoi-select-wrapper',\r\n selectInput: 'kdr-hanoi-select',\r\n searchInput: 'kdr-hanoi-search_input'\r\n },\r\n mode: {\r\n selected: 0,\r\n all: 1\r\n },\r\n /**\r\n * Move options from one to another select list\r\n * @param {any} sourceSelectInput\r\n * @param {any} mode if 0 then selected else if 1 then all\r\n */\r\n moveItems: function (sourceSelectInput, mode) {\r\n let $sourceSelect = $(sourceSelectInput)\r\n let thisClass = $sourceSelect.hasClass(hanoi.classes.selectSelected) ? hanoi.classes.selectSelected : hanoi.classes.selectNotSelected\r\n let $targetSelect = $sourceSelect.closest('.kdr-hanoi').find('.kdr-hanoi-select:not(.' + thisClass + ')')\r\n\r\n let itemsToMove = []\r\n if (hanoi.mode.selected == mode) {\r\n itemsToMove = $sourceSelect.find('option:selected').detach()\r\n } else if (hanoi.mode.all == mode) {\r\n itemsToMove = $sourceSelect.find('.' + hanoi.classes.option + ':visible').detach()\r\n }\r\n\r\n itemsToMove.toggleClass(hanoi.classes.optionSelected)\r\n itemsToMove.toggleClass(hanoi.classes.optionNotSelected)\r\n\r\n $targetSelect.append(itemsToMove)\r\n\r\n $('.' + hanoi.classes.searchInput).change()\r\n\r\n\r\n hanoi.updateInfo($sourceSelect)\r\n\r\n $targetSelect.val('')\r\n },\r\n /**\r\n * Swapping elements betweend select inputs\r\n * @param {any} hanoiWrapper\r\n * @param {any} mode if 0 then selected else if 1 then all\r\n */\r\n swapItems: function (hanoiWrapper, mode) {\r\n let $this = $(hanoiWrapper)\r\n let selectUno = $this.find('.' + hanoi.classes.selectSelected)\r\n let selectDos = $this.find('.' + hanoi.classes.selectNotSelected)\r\n let optionsUno = []\r\n let optionsDos = []\r\n\r\n let findSelector = '.' + hanoi.classes.option\r\n\r\n if (hanoi.mode.selected == mode) {\r\n findSelector += ':selected'\r\n }\r\n optionsUno = selectUno.find(findSelector).detach()\r\n optionsDos = selectDos.find(findSelector).detach()\r\n\r\n optionsUno.toggleClass(hanoi.classes.optionSelected)\r\n optionsUno.toggleClass(hanoi.classes.optionNotSelected)\r\n optionsDos.toggleClass(hanoi.classes.optionSelected)\r\n optionsDos.toggleClass(hanoi.classes.optionNotSelected)\r\n\r\n selectUno.append(optionsDos)\r\n selectDos.append(optionsUno)\r\n\r\n selectUno.val('')\r\n selectDos.val('')\r\n\r\n hanoi.updateInfo($this)\r\n },\r\n updateInfo: function (hanoiWrapper) {\r\n let $this = $(hanoiWrapper).closest('.kdr-hanoi')\r\n let gridId = $this.attr('control-id')\r\n let $grid = $('#' + gridId)\r\n let gridInfo = controls.getInfo($grid)\r\n let hanoiInfo = $this.find('.kdr-grid-info').val()\r\n let $selectedOption = $this.find('.' + hanoi.classes.optionSelected)\r\n let indexes = []\r\n let timeout = 1000\r\n let isAjaxComplete = true\r\n\r\n $selectedOption.each(function (i, e) {\r\n indexes.push($(e).data('index'))\r\n })\r\n\r\n $.ajax({\r\n type: \"POST\",\r\n url: __root + \"Hanoi/Change\",\r\n traditional: true,\r\n data: {\r\n \"hanoiInfo\": hanoiInfo,\r\n \"control\": gridInfo,\r\n \"args\": JSON.stringify(indexes)\r\n },\r\n success: function (response) {\r\n if (response.code == gridResponseCodes.SUCCESS) {\r\n controls.setInfo($grid, response.info)\r\n } else {\r\n //toastr.warning(response.info)\r\n modal.getModal.warning(\"~{Warning}\", response.value, true)\r\n }\r\n },\r\n beforeSend: function () {\r\n loading.show($this)\r\n //isAjaxComplete = false\r\n //setTimeout(function () {\r\n // if (isAjaxComplete == false) {\r\n // loading.show($this)\r\n // }\r\n //}, timeout)\r\n },\r\n complete: function () {\r\n //isAjaxComplete = true\r\n loading.hide($this)\r\n }\r\n })\r\n },\r\n search: function (searchTarget, value) {\r\n let $this = $(searchTarget)\r\n let val = value.toLowerCase().trim()\r\n let options = []\r\n options = $this.find('.' + hanoi.classes.option)\r\n\r\n if (!val || '' == val) {\r\n options.each(function (i, e) {\r\n let $e = $(e)\r\n $e.show()\r\n })\r\n } else {\r\n options.each(function (i, e) {\r\n let $e = $(e)\r\n if ($e.val().toLowerCase().includes(val)) {\r\n $e.show()\r\n } else {\r\n $e.hide()\r\n }\r\n })\r\n }\r\n },\r\n render: function (control, info) {\r\n let idSelector = '#'\r\n\r\n $.ajax({\r\n type: \"POST\",\r\n url: __root + 'Hanoi/Render',\r\n datatype: \"json\",\r\n traditional: true,\r\n data: {\r\n \"info\": info\r\n },\r\n success: function (response) {\r\n if (3 == response.code) {\r\n //toastr.error(response.message)\r\n modal.getModal.danger(\"~{Error}\", response.message, true)\r\n }\r\n\r\n idSelector += $(control).attr('id')\r\n control.replaceWith(response)\r\n },\r\n error: function (response) {\r\n console.log(response)\r\n }\r\n })\r\n }\r\n}\r\n\r\n$(document).on('click', '.kdr-hanoi-move-left', function () {\r\n let $this = $(this)\r\n let $sourceSelectInput = $this.closest('.kdr-hanoi').find('select.' + hanoi.classes.selectSelected)\r\n hanoi.moveItems($sourceSelectInput, hanoi.mode.selected)\r\n})\r\n$(document).on('click', '.kdr-hanoi-move-right', function () {\r\n let $this = $(this)\r\n let $sourceSelectInput = $this.closest('.kdr-hanoi').find('select.' + hanoi.classes.selectNotSelected)\r\n hanoi.moveItems($sourceSelectInput, hanoi.mode.selected)\r\n})\r\n$(document).on('click', '.kdr-hanoi-move-left-all', function () {\r\n let $this = $(this)\r\n let $sourceSelectInput = $this.closest('.kdr-hanoi').find('select.' + hanoi.classes.selectSelected)\r\n hanoi.moveItems($sourceSelectInput, hanoi.mode.all)\r\n})\r\n$(document).on('click', '.kdr-hanoi-move-right-all', function () {\r\n let $this = $(this)\r\n let $sourceSelectInput = $this.closest('.kdr-hanoi').find('select.' + hanoi.classes.selectNotSelected)\r\n hanoi.moveItems($sourceSelectInput, hanoi.mode.all)\r\n})\r\n$(document).on('click', '.kdr-hanoi-swap', function () {\r\n let $this = $(this)\r\n let $hanoiWrapper = $this.closest('.kdr-hanoi')\r\n hanoi.swapItems($hanoiWrapper, hanoi.mode.selected)\r\n})\r\n$(document).on('click', '.kdr-hanoi-swap-all', function () {\r\n let $this = $(this)\r\n let $hanoiWrapper = $this.closest('.kdr-hanoi')\r\n hanoi.swapItems($hanoiWrapper, hanoi.mode.all)\r\n})\r\n$(document).on('change input', '.kdr-hanoi-search_input', function () {\r\n let $this = $(this)\r\n let $target = $this.closest('.' + hanoi.classes.selectWrapper).find('.' + hanoi.classes.selectInput)\r\n let val = $this.val()\r\n hanoi.search($target, val)\r\n})\r\n$(document).on('click', '.kdr-hanoi-search_clear', function () {\r\n let $searchInput = $(this).parent().find('.' + hanoi.classes.searchInput)\r\n $searchInput.val('').change()\r\n})\r\n$(document).on('mousedown', '.' + hanoi.classes.option, function (e) {\r\n if (!e.shiftKey) {\r\n e.preventDefault()\r\n }\r\n var option = this\r\n let $parent = $(option).parent()\r\n //var scroll = option.scrollTop;\r\n var scrollTop = $parent.scrollTop()\r\n e.target.selected = !e.target.selected;\r\n setTimeout(function () {\r\n //option.scrollTop = scroll;\r\n\r\n $parent.scrollTop(scrollTop)\r\n }, 0);\r\n\r\n $(option).focus();\r\n //.mousemove(function (e) { e.preventDefault() })\r\n})\r\n\r\n////////////////////////////////////\r\n// Dropdown with search bar //\r\n////////////////////////////////////\r\nvar kdrDropdown = {\r\n search($item) {\r\n let $this = $item\r\n let value = $this.val().toLowerCase().trim()\r\n let items = $this.closest('.kdr-dropdown-w-search-menu').find('.kdr-dropdown-w-search-item')\r\n\r\n let matchedItems = []\r\n let notMatchedItems = []\r\n\r\n items.filter(function (v, e) {\r\n let $e = $(e)\r\n let iv = $e.text().toLowerCase()\r\n if (iv.includes(value)) {\r\n matchedItems.push($e[0])\r\n } else {\r\n notMatchedItems.push($e[0])\r\n }\r\n })\r\n\r\n kdrDropdown.hideItems(notMatchedItems)\r\n kdrDropdown.showItems(matchedItems)\r\n kdrDropdown.updatePlacement($this.closest('.kdr-dropdown-w-search-menu'))\r\n },\r\n hideItems(items) {\r\n $(items).addClass('hide')\r\n },\r\n showItems(items) {\r\n $(items).removeClass('hide')\r\n },\r\n selectItem($toggler, item, fireEventsP = false) {\r\n let $this = $(item)\r\n let val = $this.data('value')\r\n\r\n if (val == undefined) {\r\n console.info('Item to set in DDL must have value!')\r\n return;\r\n }\r\n\r\n //let $toggler = $this.closest('.dropdown-menu').data('toggler')\r\n let $ddl;\r\n if (!$toggler) {\r\n let menuId = $this.closest('.dropdown-menu').attr('id')\r\n $ddl = $('.kdr-dropdown-w-search-item_selected[data-target=\"' + menuId + '\"]').closest('.kdr-dropdown-w-search')\r\n $toggler = $ddl.find('.kdr-dropdown-w-search-item_selected')\r\n $this.closest('.dropdown-menu').data('toggler', $toggler)\r\n } else {\r\n $ddl = $toggler.closest('.kdr-dropdown-w-search')\r\n }\r\n\r\n if ($ddl.length == 0) {\r\n console.log($this)\r\n throw 'Cannot find dropdown menu toggler for dropdownmenu'\r\n }\r\n\r\n let $destination = $toggler//$ddl.find('.kdr-dropdown-w-search-item_selected')\r\n\r\n if ($ddl.find('.kdr-dropdown-w-search_multi').length > 0) {\r\n let $checkbox = $this.data('checkboxInput');\r\n if (!$checkbox) {\r\n $checkbox = $this.find('[type=\"checkbox\"]')\r\n $this.data('checkboxInput', $checkbox)\r\n }\r\n\r\n if ($destination.valExtended().includes(val)) {\r\n\r\n $this.removeAttr('selected')\r\n $checkbox.removeAttr('checked')\r\n\r\n $destination.find('.items_selected-text-item[data-value=\"' + val + '\"]').remove()\r\n\r\n } else {\r\n let title = $this.data('htmlP') === true ? $this.data('htmlTitle') : $this.text()\r\n $this.attr('selected', 'selected')\r\n $checkbox.attr('checked', 'checked')\r\n\r\n let $c = $destination.find('.items_selected-text-item-pattern').clone().detach()\r\n $c.find('.dismiss-item').before(title)\r\n $c.attr('data-value', val)\r\n $destination.find('.item_selected-content-wrapper .items_selected-text').append($c)\r\n\r\n $c.removeClass('items_selected-text-item-pattern')\r\n kdrDropdown.initDeleteButton($ddl)\r\n }\r\n\r\n $destination.trigger('refreshSelectedList')\r\n\r\n } else {\r\n let $itemSelectedSpan = $destination.find('.item_selected-text')\r\n\r\n $destination.data('value', val)\r\n\r\n if ($this.find('.kdr-dropdown-w-search-item-text').children().length > 0) {\r\n $itemSelectedSpan.html($this.html())\r\n }\r\n else {\r\n $itemSelectedSpan.text($this.text())\r\n }\r\n\r\n if (fireEventsP) {\r\n $destination.trigger('change')\r\n }\r\n\r\n $destination.data('valueIsInvalid', false)\r\n .trigger({\r\n type: 'kdr',\r\n namespace: 'checkedValueCorrectness',\r\n hasInvalidValue: false,\r\n newValue: val\r\n })\r\n\r\n }\r\n },\r\n selectItems($toggler, items, fireEventsP = false, runAsyncP = true, afterChangeItemCallback) {\r\n if (items != undefined && typeof (items) == 'object' && items.length > 0) {\r\n //let $mddl = $(items[0]).closest('.kdr-dropdown-w-search-menu').data('toggler').closest('.kdr-dropdown-w-search')\r\n //let menuId = $(items[0]).closest('.dropdown-menu').attr('id')\r\n let $mddl = $toggler.closest('.kdr-dropdown-w-search')\r\n\r\n\r\n $mddl.data('isMultiSelecting', true)\r\n\r\n for (var i = 0; i < items.length; i++) {\r\n let j = i\r\n let f = () => {\r\n kdrDropdown.selectItem($toggler, items[j], fireEventsP)\r\n\r\n if (j == items.length - 1) {\r\n $mddl.data('isMultiSelecting', false)\r\n }\r\n\r\n afterChangeItemCallback && afterChangeItemCallback()\r\n }\r\n\r\n if (runAsyncP) {\r\n setTimeout(() => f(), 0)\r\n } else {\r\n f()\r\n }\r\n }\r\n }\r\n },\r\n removeSelectedItem(item) {\r\n let $this = $(item).closest('.items_selected-text-item')\r\n let val = $this.data('value')\r\n\r\n let $destination = $this.closest('.kdr-dropdown-w-search-item_selected')\r\n\r\n let menuId = $destination.data('target')\r\n let $i = $(`#${menuId} .kdr-dropdown-w-search-item[data-value=\"${val}\"]`)\r\n\r\n kdrDropdown.selectItem($destination, $i)\r\n\r\n $destination.closest('.kdr-dropdown-w-search').trigger('hidden.bs.dropdown') //fixme, wyniesc oblsuge tego cuda do jakiejs funkcji albo czegos zeby nie robic tego na evencie\r\n\r\n kdrDropdown.checkIfUpdateShouldPerform($destination)\r\n },\r\n refreshSelectedList($kdrDropdown) {\r\n let $this = $($kdrDropdown).find('.kdr-dropdown-w-search-item_selected')\r\n let items = []\r\n let oldValue = $this.valExtended()\r\n $this.data('oldValue', oldValue)\r\n\r\n $this.find('.items_selected-text-item:not(.items_selected-text-item-pattern)').each(function (i, e) {\r\n items.push($(e).data('value'))\r\n })\r\n $this.data('value', items)\r\n\r\n kdrDropdown.checkCheckboxState($kdrDropdown)\r\n kdrDropdown.displaySelectedItemsCount($kdrDropdown)\r\n kdrDropdown.managePlaceholder($kdrDropdown)\r\n },\r\n initDeleteButton($kdrDropdown) {\r\n let $this = $($kdrDropdown)\r\n\r\n if ($this.hasClass('kdr-dropdown-w-search_multi')) {\r\n $this.find('.dismiss-item').on('click', function (e) {\r\n e.preventDefault()\r\n e.stopPropagation()\r\n kdrDropdown.removeSelectedItem(this)\r\n })\r\n }\r\n },\r\n checkCheckboxState($kdrDropdown) {\r\n setTimeout(() => {\r\n let $this = $($kdrDropdown)\r\n\r\n let menuId = $this.find('.kdr-dropdown-w-search-item_selected').data('target')\r\n let $menu = $('#' + menuId)\r\n let $cb = $menu.find('.kdr-dropdown-w-search-select-all-checkbox')\r\n\r\n if ($cb == undefined || $cb.length == 0) {\r\n throw 'Cannot find checkbox for check all'\r\n }\r\n\r\n let selectedItemsCount = $this.find('.kdr-dropdown-w-search-item_selected').data('value').length\r\n let allItemsCount = $menu.find('.kdr-dropdown-w-search-items .kdr-dropdown-w-search-item').length\r\n\r\n if (selectedItemsCount > 0 && selectedItemsCount != allItemsCount) {\r\n tristateCheckbox.setIndeterminate($cb)\r\n } else {\r\n tristateCheckbox.setIndeterminate($cb, false)\r\n $cb.prop('checked', selectedItemsCount == allItemsCount)\r\n }\r\n\r\n }, 0)\r\n },\r\n /**\r\n * srawdza czy ma odpalic change'a na wybranym ddl'u i jezeli tak to odpala\r\n * @param {any} $ddl .kdr-dropdown-w-search-item_selected\r\n */\r\n checkIfUpdateShouldPerform($ddl) {\r\n if (false == $ddl.hasClass('kdr-dropdown-w-search-item_selected')) {\r\n //$ddl = $ddl.find('.kdr-dropdown-w-search-item_selected')\r\n $ddl = $ddl.data().toggler ?? $ddl.find('.kdr-dropdown-w-search-item_selected')\r\n }\r\n\r\n if ($ddl == undefined || $ddl.length == 0) {\r\n $ddl = $ddl.find('.kdr-dropdown-w-search-item_selected')\r\n }\r\n\r\n if ($ddl.closest('.kdr-dropdown-w-search_multi, .kdr-frax-dropdown').length > 0) {\r\n if (false == compare.arraysAreEqual($ddl.valExtended(), $ddl.data('oldValue') ?? [])) {\r\n $ddl.trigger('change')\r\n }\r\n } else {\r\n if (($ddl.valExtended() != ($ddl.data('oldValue') ?? '') && $ddl.valExtended() >= 0)) {\r\n $ddl.trigger('change')\r\n }\r\n }\r\n },\r\n displaySelectedItemsCount($kdrDropdown) {\r\n let $this = $($kdrDropdown)\r\n let selectedItemsCount = $this.find('.kdr-dropdown-w-search-item_selected').data('value').length\r\n $this.find('.items_selected_count').text(selectedItemsCount)\r\n },\r\n managePlaceholder($kdrDropdown) {\r\n let $dd = $($kdrDropdown)\r\n let $ph = $dd.find('.kdr-dropdown-w-search-placeholder')\r\n let itemsCount = $dd.find('.kdr-dropdown-w-search-item_selected').data('value').length\r\n if (itemsCount > 0) {\r\n $ph.addClass('hide')\r\n } else {\r\n $ph.removeClass('hide')\r\n }\r\n },\r\n updatePosition($kdrDropdownWSearchMenu) {\r\n $kdrDropdownWSearchMenu.each(function () {\r\n let $ddl = $(this)\r\n\r\n if ($ddl.closest('.kdr-grid-quick-filters').length != 0 ||\r\n $ddl.closest('.kdr-grid-hair').length != 0 ||\r\n $ddl.closest('.kdr-grid-scroll-horizontal').length != 0) {\r\n $ddl.closest('.kdr-grid').append($ddl.detach())\r\n }\r\n else if ($ddl.closest('.kdr-incell').length != 0) {\r\n $ddl.closest('.kdr-incell').append($ddl.detach())\r\n }\r\n })\r\n },\r\n updatePlacement($kdrDropdownMenu) {\r\n $kdrDropdownMenu.data().toggler.dropdown('update')\r\n },\r\n /**czysci mddl*/\r\n clearDropdown($kdrDropdownWSearch) {\r\n let $toggler = $kdrDropdownWSearch.find('.kdr-dropdown-w-search-item_selected')\r\n let $menu = $('#' + $toggler.data('target'))\r\n $($kdrDropdownWSearch.find('.kdr-dropdown-w-search-item_selected').valExtended()).each((i, e) =>\r\n kdrDropdown.selectItem($toggler, $menu.find('.kdr-dropdown-w-search-item[data-value=\"' + e + '\"]')) //CHECK ME\r\n )\r\n },\r\n getItemName($kdrDropdownToggler, dataId) {\r\n let targetId = $kdrDropdownToggler.data('target')\r\n return $('#' + targetId).find(`.kdr-dropdown-w-search-item[data-value=\"${dataId}\"] .kdr-dropdown-w-search-item-text`).text()?.trim()\r\n },\r\n getItemByName($kdrDropdownToggler, name) {\r\n let targetId = $kdrDropdownToggler.data('target')\r\n return $('#' + targetId).find(`.kdr-dropdown-w-search-item[title=\"${name}\"]`)\r\n }\r\n}\r\n\r\n\r\n/*to jest jakas patologia ze trzeba tak robic...*/\r\n$(document).on('mouseenter', '.kdr-dropdown-w-search .dismiss-item', function (e) {\r\n $(this).attr('isMouseOver', true)\r\n})\r\n\r\n$(document).on('mouseleave', '.kdr-dropdown-w-search .dismiss-item', function (e) {\r\n $(this).attr('isMouseOver', false)\r\n})\r\n\r\n$(document).on('show.bs.dropdown hide.bs.dropdown', '.kdr-frax-dropdown', function (e) {\r\n let $dismissItem = $(e.target).find('.dismiss-item:hover')\r\n if ($dismissItem.length > 0) {\r\n e.preventDefault()\r\n e.stopPropagation()\r\n /*kdrDropdown.removeSelectedItem($dismissItem)*/\r\n let $this = $dismissItem.closest('.items_selected-text-item')\r\n let $frax = $this.closest(\".kdr-frax-dropdown\")\r\n\r\n let $triggerComponent = $frax.find('.dropdown-toggle')\r\n let dropdownId = '#' + $triggerComponent.data('target')\r\n let $fraxTree = $(dropdownId).find('.kdr-frax--tree')\r\n\r\n $fraxTree.jstree().uncheck_node($this.data('value'))\r\n\r\n $frax.find('.kdr-frax-dropdown-item_selected').data('value', $fraxTree.jstree('get_checked'))\r\n\r\n let selectedItemsCount = $frax.find('.kdr-frax-dropdown-item_selected').data('value').length\r\n\r\n $frax.find('.items_selected_count').text(selectedItemsCount)\r\n $triggerComponent.attr('data-selected-items-count', selectedItemsCount)\r\n }\r\n})\r\n\r\n$(document).on('show.bs.dropdown', '.kdr-frax-dropdown', function (e) {\r\n let $dropdownContainer = $(this)\r\n\r\n if ($dropdownContainer.data('shouldntOpen') === true) {\r\n e.preventDefault()\r\n $dropdownContainer.data('shouldntOpen', false)\r\n }\r\n\r\n let $triggerComponent = $dropdownContainer.find('.kdr-frax-trigger-target')\r\n let dropdownId = '#' + $triggerComponent.data('target')\r\n let $dropdown = $(dropdownId)\r\n\r\n let $fraxTree = $dropdown.find('.kdr-frax--tree')\r\n let currentItems = $fraxTree.valExtended()\r\n\r\n $fraxTree.data('oldValue', currentItems)\r\n $dropdown.data('toggler', $triggerComponent)\r\n\r\n kdrDropdown.updatePosition($dropdown)\r\n})\r\n\r\n$(document).on('hide.bs.dropdown', '.kdr-frax-dropdown', function (e) {\r\n let $t = $(this)\r\n let $triggerComponent = $t.find('.kdr-frax-trigger-target')\r\n\r\n Frax.checkIfValuesHasChangedInFraxDDL($triggerComponent)\r\n $t.data('shouldntOpen', true)\r\n})\r\n\r\n$(document).on('click', '.kdr-dropdown-w-search-item', function (e) {\r\n let $this = $(this)\r\n //let menuId = $this.closest('.dropdown-menu').attr('id')\r\n let $ddl = $this.closest('.dropdown-menu')\r\n let $toggler = $ddl.data().toggler ?? $ddl.closest('.kdr-dropdown-w-search').find('.kdr-dropdown-w-search-item_selected')\r\n if ($toggler.closest('.kdr-dropdown-w-search_multi').length > 0) {\r\n e.preventDefault()\r\n e.stopPropagation()\r\n }\r\n\r\n kdrDropdown.selectItem($toggler, $this, false)\r\n})\r\n\r\n$(document).on('keydown', '.kdr-dropdown-w-search_bar', function (e) {\r\n let items = $(this).parent().find('.kdr-dropdown-w-search-item:visible')\r\n if (13 == e.keyCode && 1 == items.length) {\r\n kdrDropdown.selectItem(items)\r\n }\r\n})\r\n\r\n$(document).on('input', '.kdr-dropdown-w-search_bar', function () {\r\n kdrDropdown.search($(this))\r\n})\r\n\r\n$(document).on('click', '.kdr-dropdown-w-search-menu .kdr-dropdown-w-search-check,'\r\n + '.kdr-dropdown-w-search-menu .kdr-dropdown-w-search_bar', function (e) {\r\n e.stopPropagation()\r\n })\r\n\r\n$(document).on('show.bs.dropdown', '.kdr-dropdown-w-search', function (e) {\r\n let $dismissItemWithMouseOver = $(e.target).find('.dismiss-item[ismouseover=\"true\"]')\r\n if ($dismissItemWithMouseOver.length == 0) {\r\n let $this = $(this)\r\n\r\n let $toggler = $this.data('toggler')\r\n let $dropdownMenu = $this.data('dropdownMenu')\r\n\r\n if ($toggler == undefined || $toggler.length == 0) {\r\n $toggler = $this.find('.dropdown-toggle')\r\n $this.data('toggler', $toggler)\r\n\r\n\r\n }\r\n\r\n if ($dropdownMenu == undefined || $dropdownMenu.length == 0) {\r\n $dropdownMenu = $('#' + $this.find('.kdr-dropdown-w-search-item_selected').data('target'))\r\n $this.data('dropdownMenu', $dropdownMenu)\r\n\r\n if ($toggler.data('bs.dropdown')._menu == undefined) {\r\n $toggler.data('bs.dropdown')._menu = $dropdownMenu[0]\r\n }\r\n\r\n }\r\n\r\n\r\n $dropdownMenu.data('toggler', $toggler)\r\n $toggler.data('oldValue', $toggler.valExtended())\r\n\r\n kdrDropdown.updatePosition($dropdownMenu)\r\n } else {\r\n e.preventDefault()\r\n e.stopPropagation()\r\n kdrDropdown.removeSelectedItem($dismissItemWithMouseOver)\r\n }\r\n})\r\n\r\n$(document).on('shown.bs.dropdown', '.kdr-dropdown-w-search', function () {\r\n let $this = $(this)\r\n let $menu = $this.data().dropdownMenu\r\n\r\n kdrDropdown.initDeleteButton($this)\r\n let $searchBar = $menu.find('.kdr-dropdown-w-search_bar')\r\n $searchBar[0].focus({ preventScroll: true })\r\n})\r\n\r\n$(document).on('hide.bs.dropdown', '.kdr-dropdown-w-search', function (e) {\r\n //console.log($(this).data())\r\n if ($(this).data('isMultiSelecting') === true) {\r\n e.preventDefault()\r\n }\r\n})\r\n\r\n$(document).on('hidden.bs.dropdown', '.kdr-dropdown-w-search', function () {\r\n let $this = $(this)\r\n let $ddl = $this.data().dropdownMenu ?? $this.find(\".kdr-dropdown-w-search-menu\")\r\n\r\n kdrDropdown.showItems($ddl.find('.kdr-dropdown-w-search-item.hide'))\r\n kdrDropdown.initDeleteButton($this)\r\n $ddl.find('.kdr-dropdown-w-search_bar').val('')\r\n\r\n kdrDropdown.checkIfUpdateShouldPerform($this, false)\r\n\r\n})\r\n\r\n$(document).on('change', '.kdr-dropdown-w-search-select-all-checkbox', function (e) {\r\n let $this = $(this)\r\n e.stopPropagation()\r\n\r\n let itemsToSelect = $this.is(':checked')\r\n ? $this.closest('.kdr-dropdown-w-search-menu').find('.kdr-dropdown-w-search-item-checkbox:visible input:not(:checked)').closest('.kdr-dropdown-w-search-item')\r\n : $this.closest('.kdr-dropdown-w-search-menu').find('.kdr-dropdown-w-search-item-checkbox:visible input:checked').closest('.kdr-dropdown-w-search-item')\r\n let $dropdown = $this.closest('.kdr-dropdown-w-search-menu')\r\n let $toggler = $dropdown.data('toggler')\r\n loading.show($toggler)\r\n loading.show($dropdown)\r\n\r\n kdrDropdown.selectItems($toggler, itemsToSelect);\r\n\r\n loading.hide($dropdown);\r\n loading.hide($toggler);\r\n})\r\n\r\n$(document).on('refreshSelectedList', '.kdr-dropdown-w-search_multi .kdr-dropdown-w-search-item_selected', function () {\r\n kdrDropdown.refreshSelectedList($(this).parent())\r\n})\r\n\r\n$(document).on('keydown', '.kdr-dropdown-w-search-menu.show', function (e) {\r\n let $menu = $(this)\r\n let $currentlyFocusedItem = $menu.find(':focus')\r\n let isCurrentlyFocusedItemSearchInput = $currentlyFocusedItem.hasClass('kdr-dropdown-w-search_bar')\r\n let $searchInput = $menu.find('.kdr-dropdown-w-search_bar')\r\n let isDownArrowKey = e.keyCode == 40\r\n let isUpArrowKey = e.keyCode == 38\r\n let isEnterKey = e.keyCode == 13\r\n\r\n if (isDownArrowKey === true || isUpArrowKey === true) {\r\n let $itemToFocus = null\r\n\r\n if (isUpArrowKey) {\r\n if (isCurrentlyFocusedItemSearchInput) {\r\n $itemToFocus = $menu.find('.kdr-dropdown-w-search-item').last()\r\n } else if (0 == $currentlyFocusedItem.prev().length) {\r\n $itemToFocus = $searchInput\r\n } else {\r\n $itemToFocus = $currentlyFocusedItem.prev()\r\n }\r\n } else if (isDownArrowKey) {\r\n if (isCurrentlyFocusedItemSearchInput) {\r\n $itemToFocus = $menu.find('.kdr-dropdown-w-search-item').first()\r\n } else if (0 == $currentlyFocusedItem.next().length) {\r\n $itemToFocus = $searchInput\r\n } else {\r\n $itemToFocus = $currentlyFocusedItem.next()\r\n }\r\n }\r\n\r\n $itemToFocus[0].focus({ preventScroll: true })\r\n }\r\n else if (isEnterKey) {\r\n let $itemToSelect = null\r\n let $visibleItems = $menu.find('.kdr-dropdown-w-search-item:visible')\r\n let $toggler = $menu.data().toggler\r\n\r\n if ($currentlyFocusedItem.hasClass('kdr-dropdown-w-search-item')) {\r\n $itemToSelect = $currentlyFocusedItem\r\n } else if (isCurrentlyFocusedItemSearchInput && $visibleItems.length == 1) {\r\n $itemToSelect = $visibleItems\r\n }\r\n\r\n if ($itemToSelect != null) {\r\n kdrDropdown.selectItem($toggler, $itemToSelect, false)\r\n $toggler[0].focus({ preventScroll: true })\r\n }\r\n //kdrDropdown.selectItem(undefined, $itemToSelect) //CHECK ME\r\n\r\n //$menu.closest('.dropdown:not(.kdr-dropdown-w-search_multi)')\r\n // .find('.kdr-dropdown-w-search-item_selected')[0].focus({ preventScroll: true })\r\n\r\n } else {\r\n $searchInput[0].focus({ preventScroll: true })\r\n }\r\n})\r\n\r\n\r\n//////////////////////////////////\r\n// Text helpers //\r\n//////////////////////////////////\r\nvar text = {\r\n truncate(text, length) {\r\n let string = text.toString().trim()\r\n if (string.length > length) {\r\n string = string.substring(0, length)\r\n string += '...'\r\n }\r\n return string\r\n }\r\n}\r\n\r\n\r\n//////////////////////////////////\r\n// Site return //\r\n//////////////////////////////////\r\nvar site = {\r\n goBack() {\r\n if (/#!/g.test(window.location.href)) {\r\n window.history.go(-2);\r\n } else {\r\n window.history.back();\r\n }\r\n }\r\n}\r\n\r\n$(document).on('click', '.return-site', function (e) {\r\n site.goBack()\r\n})\r\n\r\n//////////////////////////////\r\n// injects //\r\n//////////////////////////////\r\n\r\nlet inject = {\r\n css: function (rules, id) {\r\n if (id == undefined) {\r\n id = null\r\n }\r\n\r\n let css = document.createElement('style')\r\n if (id != null) {\r\n //if (document.getElementById(id)) {\r\n // document.getElementById(id).remove()\r\n //}\r\n\r\n let $obj = $('#' + id)\r\n if ($obj.length > 0) {\r\n $obj.remove()\r\n }\r\n css.id = id\r\n } else {\r\n css.id = uid.getNew()\r\n }\r\n\r\n css.type = 'text/css';\r\n if (css.styleSheet) {\r\n css.styleSheet.cssText = rules // Support for IE\r\n }\r\n else {\r\n css.appendChild(document.createTextNode(rules)); // Support for the rest\r\n document.getElementsByTagName(\"head\")[0].appendChild(css)\r\n }; // Specifies where to place the css\r\n }\r\n}\r\n\r\n//////////////////////////////\r\n// Reports //\r\n//////////////////////////////\r\n\r\n$(document).on(gridEvents.BEFORE_RENDER, '#report-sql-grid', function (event) {\r\n if (event.code == gridResponseCodes.SUCCESS) {\r\n let report_partial_path = window.location.origin + '/Reports/ReportPartial' + window.location.search;\r\n $.ajax({\r\n type: \"GET\",\r\n url: report_partial_path,\r\n datatype: \"json\",\r\n traditional: true,\r\n success: function (response) {\r\n let content = $.parseHTML(response);\r\n let $partial = $(content).find(\"#report_container\");\r\n $(\"#report_container\").replaceWith($partial);\r\n },\r\n beforeSend: function () { loading.show('#report_container') },\r\n complete: function () { loading.hide('#report_container') }\r\n });\r\n }\r\n})\r\n$(document).on(gridEvents.BEFORE_RENDER, '#menu-sql-grid', function (event) {\r\n if (event.code == gridResponseCodes.SUCCESS && event.actionType == gridActions.UPDATE) {\r\n controls.refresh(null, 'generic-sql-menu-grid')\r\n }\r\n})\r\n\r\n\r\n\r\n//////////////////////////////\r\n// Frax //\r\n//////////////////////////////\r\n\r\n$(document).on(\"keyup\", \".kdr-frax-search\", function (e) {\r\n let $frax_search = $(e.target);\r\n let $frax = $('#' + $frax_search.attr('data-control-id'));\r\n\r\n if (e.keyCode != 13) {\r\n if (window.frax_throttle) clearTimeout(window.frax_throttle);\r\n window.frax_throttle = setTimeout(function () {\r\n let v = $frax_search.val();\r\n $frax.jstree(true).search(v);\r\n Frax.scrollToSearched($frax_search)\r\n }, 250);\r\n } else {\r\n Frax.scrollToSearched($frax_search)\r\n }\r\n});\r\n\r\nvar Frax = {\r\n richt: {},\r\n data: {},\r\n ids: [],\r\n selectType: {\r\n \"SELECT\": \"SELECT\",\r\n \"DESELECT\": \"DESELECT\",\r\n },\r\n selectionCallback: {},\r\n initialize: function (id, multiselect = false, draggable = false, strings) {\r\n this.ids.push(id)\r\n let $control = $('#' + id)\r\n let self = this;\r\n //let single_select_props = {\r\n // 'deselect_all': true,\r\n // 'three_state': false\r\n //};\r\n //if (multiselect) single_select_props = {};\r\n\r\n $control.bind('ready.jstree', function (e, data) {\r\n if (Frax.richt[id] != undefined) {\r\n Frax.richt[id]();\r\n }\r\n })\r\n\r\n //$control.on(\r\n // \"select_node.jstree\", function (evt, data) {\r\n // //selected node object: data.node;\r\n // //console.log(11111)\r\n // //console.log(evt)\r\n // //console.log(data)\r\n // }\r\n //);\r\n\r\n $control.bind('select_node.jstree', function (node, selected, event) {\r\n $control.trigger({\r\n type: fraxEvents.SELECTED,\r\n selectedNode: selected\r\n })\r\n })\r\n\r\n $control.bind('deselect_node.jstree', function (node, selected, event) {\r\n $control.trigger({\r\n type: fraxEvents.DESELECTED,\r\n selectedNode: selected\r\n })\r\n })\r\n\r\n $control.bind('changed.jstree', function (node, selected, event) {\r\n $control.trigger({\r\n type: fraxEvents.CHANGED,\r\n event: event\r\n })\r\n })\r\n\r\n if (draggable) {\r\n $control.bind(\"move_node.jstree\", function (event, data) {\r\n let $frax = $(this).closest('.kdr-frax')\r\n let $loadingTargets = $frax\r\n let args = {\r\n sourceValue: data.node.a_attr[\"data-value\"],\r\n targetValue: data.parent != '#' ? $('#' + data.parent + '_anchor').data('value') : null\r\n }\r\n\r\n $.ajax({\r\n type: \"POST\",\r\n url: __root + \"Frax/Act\",\r\n datatype: \"json\",\r\n traditional: true,\r\n data: {\r\n info: controls.getInfo($frax),\r\n magic: data.node.a_attr[\"data-magic\"],\r\n args: JSON.stringify(args)\r\n },\r\n success: function (response) {\r\n\r\n if (response.info == null) {\r\n response.info = controls.getInfo($frax)\r\n }\r\n\r\n controls.magic(controls.getEndpoint($frax), $frax, response, $loadingTargets, true);\r\n },\r\n beforeSend: function () { loading.show($loadingTargets); if ($loadingTargets != undefined && $loadingTargets != null) $loadingTargets.attr('disabled', 'disabled') },\r\n complete: function () { loading.hide($loadingTargets); if ($loadingTargets != undefined && $loadingTargets != null) $loadingTargets.removeAttr('disabled') }\r\n });\r\n })\r\n }\r\n\r\n $control.jstree({\r\n \"checkbox\": {\r\n \"keep_selected_style\": true,\r\n \"three_state\": false,\r\n \"whole_node\": false, //nerwic julki\r\n /*\"cascade_to_disabled\": false,*/\r\n /*\"tie_selection\": false*/\r\n //...single_select_props\r\n },\r\n //\"plugins\": [\"search\", \"conditionalselect\", props.multiselect ? \"checkbox\" : \"\", \"dnd\"],\r\n \"plugins\": [\"search\", \"conditionalselect\", multiselect ? \"checkbox\" : \"\", draggable ? \"dnd\" : \"\"],\r\n 'core': {\r\n \"check_callback\": true,\r\n 'multiple': multiselect,\r\n 'data': self.data[id],\r\n 'check_callback': function (operation, node, node_parent, node_position, more) {\r\n if (operation === 'move_node' && more.ref) {\r\n return Boolean(node.a_attr['data-draggable-out-p']) && Boolean(more.ref.a_attr['data-draggable-in-p'])\r\n }\r\n return true\r\n },\r\n 'strings': strings\r\n },\r\n \"search\": {\r\n \"case_sensitive\": false,\r\n \"show_only_matches\": false\r\n }\r\n });\r\n if (this.selectionCallback[id])\r\n this.registerSelectionCallback(id, this.selectionCallback[id]);\r\n },\r\n destroy: function (id) {\r\n $(\"#\" + id).jstree(\"destroy\");\r\n },\r\n getSelected: function (id) {\r\n return $(\"#\" + id).jstree(\"get_selected\");\r\n },\r\n registerSelectionCallback: function (id, callback) {\r\n let self = this;\r\n this.selectionCallback[id] = callback;\r\n $(\"#\" + id).on(\r\n \"select_node.jstree\", function (evt, data) {\r\n callback(evt, data, self.selectType.SELECT);\r\n }\r\n );\r\n $(\"#\" + id).on(\r\n \"deselect_node.jstree\", function (evt, data) {\r\n callback(evt, data, self.selectType.DESELECT);\r\n }\r\n );\r\n },\r\n scrollToSearched($fraxSearch) {\r\n let $frax_search = $fraxSearch\r\n let $frax = $('#' + $frax_search.attr('data-control-id'));\r\n let isAnyScrolled = $frax.find('.jstree-scroll-to').length > 0\r\n let $scrollToElement;\r\n\r\n if (isAnyScrolled === true && $frax.find('.jstree-search').length > 1) {\r\n let $scrollPosibilities = $frax.find('.jstree-search')\r\n let scrolledIndex = $.inArray($frax.find('.jstree-scroll-to')[0], $scrollPosibilities)\r\n if (scrolledIndex == -1 || (scrolledIndex == $frax.find('.jstree-search').length - 1)) {\r\n $scrollToElement = $scrollPosibilities.eq(0)\r\n } else {\r\n $scrollToElement = $scrollPosibilities.eq(scrolledIndex + 1)\r\n }\r\n $frax.find('.jstree-scroll-to').removeClass('jstree-scroll-to')\r\n\r\n } else {\r\n $scrollToElement = $frax.find('.jstree-search').eq(0)\r\n }\r\n $scrollToElement.addClass('jstree-scroll-to')\r\n\r\n $frax.scrollTop(0).scrollTop($scrollToElement.getPositionInViewport().top - $frax.getPositionInViewport().top)\r\n },\r\n lazyInitialize: function () {\r\n return 0\r\n //FIXME SYF\r\n //for (let i = 0; i < Frax.ids.length; ++i) {\r\n // let id = Frax.ids[i];\r\n\r\n // let magicRelations = magic_relations.filter(function (el) {\r\n // if (el.source == id.substr(1))\r\n // return true;\r\n // });\r\n // if (magicRelations) {\r\n // this.registerSelectionCallback(id, (evt, data) => {\r\n // for (let i = 0; i < magicRelations.length; i++) {\r\n // let id = data.node.id;\r\n // let control = $(\"#\" + magicRelations[i].target);\r\n // let controlType;\r\n // if (control.hasClass('kdr-grid')) controlType = 'Grid';\r\n // else if (control.hasClass('kdr-frax')) controlType = 'Frax';\r\n // loading.show(control);\r\n // let args = {}\r\n // args[$(\"#\" + Frax.ids[i].substr(1)).attr(\"data-index\")] = id;\r\n\r\n // $.ajax({\r\n // type: \"POST\",\r\n // url: __root + \"Filters/Filter\",\r\n // datatype: \"json\",\r\n // traditional: true,\r\n // data: {\r\n // \"control\": control.find(\".kdr-info\").val(),\r\n // \"args\": JSON.stringify(args)\r\n // },\r\n // success: function (response) {\r\n // controls.magic(controlType + \"/Render\", control, response)\r\n // }\r\n // })\r\n // }\r\n\r\n // });\r\n // }\r\n //}\r\n },\r\n rename($frax, $tree, $loadingTargets, magic) {\r\n $tree.jstree().edit($tree.jstree(\"get_selected\"), null, function (node) {\r\n let args = {\r\n nodeName: node.text\r\n }\r\n\r\n $.ajax({\r\n type: \"POST\",\r\n url: __root + \"Frax/Act\",\r\n datatype: \"json\",\r\n traditional: true,\r\n data: {\r\n info: controls.getInfo($frax),\r\n magic: magic,\r\n args: JSON.stringify(args)\r\n },\r\n success: function (response) {\r\n controls.onGridBeforeRender($frax, response.code, fraxActions.RENAME, response.info, response.returnValue)\r\n controls.magic(controls.getEndpoint($frax), $frax, response, $loadingTargets);\r\n },\r\n beforeSend: function () { loading.show($loadingTargets); if ($loadingTargets != undefined && $loadingTargets != null) $loadingTargets.attr('disabled', 'disabled') },\r\n complete: function () { loading.hide($loadingTargets); if ($loadingTargets != undefined && $loadingTargets != null) $loadingTargets.removeAttr('disabled') }\r\n })\r\n })\r\n },\r\n /**\r\n *\r\n * @param {button} $triggerComponent element ktory wywoluje dropdownliste z fraxem\r\n */\r\n checkIfValuesHasChangedInFraxDDL($triggerComponent) {\r\n let dropdownId = '#' + $triggerComponent.data('target')\r\n let $fraxTree = $(dropdownId).find('.kdr-frax--tree')\r\n\r\n let currentItems = $fraxTree.valExtended()\r\n let previousItems = $fraxTree.data('oldValue') ?? []\r\n\r\n if ($fraxTree.hasClass('kdr-frax-multi-select') && compare.arraysAreEqual(currentItems, previousItems) == false) {\r\n $triggerComponent.trigger('change')\r\n } else if ($fraxTree.hasClass('kdr-frax-single-select') && currentItems != previousItems) {\r\n $triggerComponent.trigger('change')\r\n }\r\n }\r\n};\r\n\r\n$(document).on(fraxEvents.SELECTED, '.kdr-filters .kdr-frax-single-select, .kdr-grid .kdr-frax-single-select', function ($node) {\r\n let $frax = $(this)\r\n let dropdownId = $frax.closest('.dropdown-menu').prop('id')\r\n let $dropdownContainer = $('[data-target=\"' + dropdownId + '\"]').closest('.kdr-frax-dropdown')\r\n\r\n $dropdownContainer.find('.kdr-frax-dropdown-selected-item').text($node.selectedNode.node.text)\r\n $frax.closest('.kdr-frax-dropdown-menu').dropdown('hide')\r\n})\r\n\r\n$(document).on(fraxEvents.SELECTED, '.kdr-filters .kdr-frax-multi-select, .kdr-grid .kdr-frax-multi-select', function ($node) {\r\n let $frax = $(this)\r\n let dropdownId = $frax.closest('.dropdown-menu').prop('id')\r\n let $dropdownContainer = $('[data-target=\"' + dropdownId + '\"]').closest('.kdr-frax-dropdown')\r\n\r\n $dropdownContainer.find('.kdr-frax-dropdown-item_selected').data('value', $frax.jstree('get_checked'))\r\n let $destination = $dropdownContainer.find('.kdr-frax-dropdown-item_selected')\r\n\r\n $($dropdownContainer.find('.kdr-frax-dropdown-item_selected').data('value')).each((a, b) => {\r\n if ($dropdownContainer.find('.items_selected-text-item[data-value=' + b + ']').length == 0) {\r\n let $node = $frax.jstree('get_node', b)\r\n let $c = $destination.find('.items_selected-text-item-pattern').clone().detach()\r\n $c.find('.dismiss-item').before($node.text)\r\n $c.attr('data-value', $node.id)\r\n $destination.find('.item_selected-content-wrapper .items_selected-text').append($c)\r\n $c.removeClass('items_selected-text-item-pattern')\r\n }\r\n })\r\n\r\n let values = $dropdownContainer.find('.kdr-frax-dropdown-item_selected').data('value')\r\n\r\n $dropdownContainer.find('.items_selected-text-item:not(.items_selected-text-item-pattern)').each((a, b) => {\r\n if (!values.includes($(b).data('value').toString())) {\r\n $(b).remove()\r\n }\r\n })\r\n\r\n let selectedItemsCount = $dropdownContainer.find('.kdr-frax-dropdown-item_selected').data('value').length\r\n $dropdownContainer.find('.items_selected_count').text(selectedItemsCount)\r\n $dropdownContainer.find('.kdr-frax-trigger-target').attr('data-selected-items-count', selectedItemsCount)\r\n})\r\n\r\n$(document).on(fraxEvents.DESELECTED, '.kdr-filters .kdr-frax-multi-select, .kdr-grid .kdr-frax-multi-select', function ($node) {\r\n let $fraxTree = $(this)\r\n let dropdownId = $fraxTree.closest('.dropdown-menu').prop('id')\r\n let $dropdown = $('[data-target=\"' + dropdownId + '\"]').closest('.kdr-frax-dropdown')\r\n\r\n $dropdown.find('.kdr-frax-dropdown-item_selected').data('value', $fraxTree.valExtended())\r\n /*let $destination = $dropdown.find('.kdr-frax-dropdown-item_selected')*/\r\n $dropdown.find('.items_selected-text-item[data-value=' + $node.selectedNode.node.id + ']').remove()\r\n\r\n let selectedItemsCount = $dropdown.find('.kdr-frax-dropdown-item_selected').data('value').length\r\n $dropdown.find('.items_selected_count').text(selectedItemsCount)\r\n $dropdown.find('.kdr-frax-trigger-target').attr('data-selected-items-count', selectedItemsCount)\r\n})\r\n\r\n$(document).on('click', '.kdr-frax .jstree-anchor:not(.jstree-disabled)', function () {\r\n let $that = $(this)\r\n let $frax = $that.closest(\".kdr-frax\")\r\n\r\n controls.invokeCommands($frax)\r\n\r\n //let inputs = $frax.find('.jstree-anchor.jstree-clicked')\r\n ////let inputs = $frax.jstree(\"get_selected\")\r\n //let args = {}\r\n //controls.getArgs(inputs, args)\r\n});\r\n\r\n$(document).on('click', '.kdr-frax-act', function () {\r\n let $that = $(this)\r\n let $frax = $that.closest(\".kdr-frax\")\r\n let $loadingTargets = $frax\r\n\r\n $.ajax({\r\n type: \"POST\",\r\n url: __root + \"Frax/Act\",\r\n datatype: \"json\",\r\n traditional: true,\r\n data: {\r\n \"info\": controls.getInfo($frax),\r\n \"magic\": $that.attr(\"data-magic\"),\r\n },\r\n success: function (response) {\r\n controls.onGridBeforeRender($frax, response.code, fraxActions.ADD, response.info, response.returnValue)\r\n controls.magic(controls.getEndpoint($frax), $frax, response, $loadingTargets);\r\n },\r\n beforeSend: function () { loading.show($loadingTargets); if ($loadingTargets != undefined && $loadingTargets != null) $loadingTargets.attr('disabled', 'disabled') },\r\n complete: function () { loading.hide($loadingTargets); if ($loadingTargets != undefined && $loadingTargets != null) $loadingTargets.removeAttr('disabled') }\r\n })\r\n});\r\n\r\n$(document).on('click', '.kdr-frax-act-remove', function () {\r\n let $that = $(this)\r\n let $frax = $that.closest(\".kdr-frax\")\r\n let $modal = $frax.find(\".kdr-frax-delete-modal\").clone().detach()\r\n let mId = $modal.prop('id') + 'clonedDetached'\r\n let $loadingTargets = $frax\r\n\r\n $modal.prop('id', mId)\r\n $('body').append($modal)\r\n\r\n modal.prepareModal(mId);\r\n\r\n $modal.on('hidden.bs.modal', function () {\r\n $modal.remove()\r\n })\r\n\r\n let args = { selected: $frax.find('.kdr-frax--tree').jstree().get_selected() }\r\n\r\n $modal.find(\".kdr-grid-remove-confirm\").click(function () {\r\n $modal.modal(\"hide\")\r\n $.ajax({\r\n type: \"POST\",\r\n url: __root + \"Frax/Act\",\r\n datatype: \"json\",\r\n traditional: true,\r\n data: {\r\n \"info\": controls.getInfo($frax),\r\n \"magic\": $that.attr(\"data-magic\"),\r\n \"args\": JSON.stringify(args)\r\n },\r\n success: function (response) {\r\n controls.onGridBeforeRender($frax, response.code, fraxActions.REMOVE, response.info, response.returnValue)\r\n controls.magic(controls.getEndpoint($frax), $frax, response, $loadingTargets);\r\n },\r\n beforeSend: function () { loading.show($loadingTargets); if ($loadingTargets != undefined && $loadingTargets != null) $loadingTargets.attr('disabled', 'disabled') },\r\n complete: function () { loading.hide($loadingTargets); if ($loadingTargets != undefined && $loadingTargets != null) $loadingTargets.removeAttr('disabled') }\r\n })\r\n })\r\n $modal.modal(\"show\")\r\n});\r\n\r\n$(document).on(\"click\", \".kdr-frax-rename\", function () {\r\n let $this = $(this)\r\n let $frax = $this.closest(\".kdr-frax\")\r\n let $tree = $frax.find('.kdr-frax--tree')\r\n\r\n if ($tree.jstree().get_selected(true) &&\r\n $tree.jstree().get_selected(true)[0] &&\r\n $tree.jstree().get_selected(true)[0].state.checkbox_disabled === false) {\r\n Frax.rename($frax, $tree, $frax, $this.attr(\"data-magic\"))\r\n }\r\n else {\r\n modal.getModal.danger(\r\n frax_default_translated_strings['Error'],\r\n frax_default_translated_strings['You do not have sufficient privileges to rename selected element.%{UserMessages}'],\r\n true)\r\n }\r\n})\r\n\r\n$(document).on(gridEvents.BEFORE_RENDER, \"#documents-frax\", function (response) {\r\n if (response.code == gridResponseCodes.SUCCESS && response.actionType == fraxActions.ADD) {\r\n $(document).one(gridEvents.AFTER_RENDER, \"#documents-frax\", function () {\r\n let $frax = $(this)\r\n let $tree = $frax.find('.kdr-frax--tree')\r\n let renameMagic = $frax.find(\".kdr-frax-rename\").attr(\"data-magic\")\r\n\r\n $frax.find('[data-identity-p=\"true\"]').click()\r\n Frax.rename($frax, $tree, $frax, renameMagic)\r\n })\r\n }\r\n if (response.code == gridResponseCodes.SUCCESS\r\n && (response.actionType == fraxActions.RENAME || response.actionType == fraxActions.REMOVE)) {\r\n controls.refresh(null, 'documents-detail')\r\n }\r\n})\r\n\r\n\r\n/////////////////////////////////////\r\n// Frax Folder //\r\n/////////////////////////////////////\r\n\r\nfunction fraxFolderNodeState(object) {\r\n this.opened = object.opened\r\n this.disabled = object.disabled\r\n this.checkbox_disabled = object.checkbox_disabled\r\n this.selected = object.selected\r\n}\r\n\r\nfunction fraxFolderNodeAttributesModel(object) {\r\n this.dataValue = object['dataValue']\r\n this.draggableOutP = object['draggableOutP']\r\n this.draggableInP = object['draggableInP']\r\n this.removableP = object['removableP']\r\n}\r\n\r\nfunction fraxFolderNodeImage(object) {\r\n this.src = object.nodeImage;\r\n /** \r\n * 1 -> img\r\n * 2 -> font awesome icon\r\n * 3 -> magic img\r\n * */\r\n this.imageType = object.nodeImageType;\r\n this.hasAnyImage = () => this.src != undefined && this.src.length > 0\r\n}\r\n\r\nfunction fraxNodeActionButton(object) {\r\n this.tooltip = object.tooltip\r\n this.icon = object.icon\r\n this.classes = object.classes\r\n this.selectedItemClasses = object.selectedItemClasses\r\n}\r\n\r\nfunction fraxFolderNodeModel(object) {\r\n this.groupKey = object.groupKey;\r\n this.id = object.id;\r\n this.parent = object.parent;\r\n this.description = object.description;\r\n this.text = object.text;\r\n /** \r\n * @type {Array}\r\n */\r\n this.nodeActionButtons = object.nodeActionButtons\r\n this.childrenCount = object.nodeChildrenCount\r\n this.image = new fraxFolderNodeImage(object)\r\n this.state = object.state;\r\n this.attributes = new fraxFolderNodeAttributesModel(object.attributes)\r\n}\r\n\r\nconst fraxFolder = {\r\n classes: {\r\n itemImgContainer: 'kdr-frax-folder-item-image-container',\r\n itemImg: 'kdr-frax-folder-item-image',\r\n itemDraggableOut: 'kdr-frax-folder-item-draggable-out',\r\n itemDraggableIn: 'kdr-frax-folder-item-draggable-in',\r\n },\r\n events: {\r\n downloadFraxFolderItem: \"fraxFolderDownloadItem\"\r\n },\r\n currentDraggableItem: null,\r\n /**\r\n * Wyszukuje zaznaczonego obecnie node`a \r\n * @param {any} $fraxFolder frax w ktorym szukamy\r\n * @returns {fraxFolderNodeModel} znaleziony node lub undefined jezeli takowego nima\r\n */\r\n getSelectedNode: ($fraxFolder) => fraxFolder.getStructure($fraxFolder).filter(x => x.state.selected === true)[0],\r\n getSelectedNodeValue: ($fraxFolder) => new fraxFolderNodeModel(fraxFolder.getSelectedNode($fraxFolder)).attributes.dataValue,\r\n /**\r\n * Wyszukuje node'a w strukturze danego fraxa\r\n * @param {any} $fraxFolder frax w ktorym szukamy\r\n * @returns {fraxFolderNodeModel} znaleziony node lub undefined jezeli takowego nima\r\n */\r\n getNodeFromStruct: ($fraxFolder, nodeId) => fraxFolder.getStructure($fraxFolder).filter(x => x.id === nodeId)[0],\r\n /**\r\n * Pobiera strukture danego fraxa\r\n * @param {any} $fraxFolder frax w ktorym szukamy\r\n * @returns {[fraxFolderNodeModel]} znaleziona struktura\r\n */\r\n getStructure: ($fraxFolder) => $fraxFolder.data('structure'),\r\n getNodeChildrens: ($fraxFolder, nodeId) => fraxFolder.getStructure($fraxFolder).filter(x => x.parent == nodeId),\r\n getNodeParent: ($fraxFolder, parentId) => fraxFolder.getStructure($fraxFolder).filter(x => x.id == parentId)[0],\r\n /**\r\n * Wyszukuje templaty html'owe danego fraxa\r\n * @param {any} $fraxFolder frax w ktorym szukamy\r\n * @returns Znalezione templaty\r\n */\r\n getTemplates: ($fraxFolder) => {\r\n return {\r\n selectedItem: $fraxFolder.data('templates').selectedItem,\r\n noData: $fraxFolder.data('templates').noData,\r\n breadcrumb: $fraxFolder.data('templates').breadcrumb,\r\n item: $fraxFolder.data('templates').item\r\n }\r\n },\r\n selectNode($fraxFolder, selectedItemId, triggerEventP = true) {\r\n let currentlySelectedNode = fraxFolder.getSelectedNode($fraxFolder)\r\n\r\n let newNode = fraxFolder.getNodeFromStruct($fraxFolder, selectedItemId)\r\n currentlySelectedNode.state.selected = false\r\n newNode.state.selected = true\r\n\r\n fraxFolder.renderBreadCrumbs($fraxFolder, newNode)\r\n fraxFolder.renderSelectedNode($fraxFolder, new fraxFolderNodeModel(newNode))\r\n fraxFolder.renderSelectedNodeStructure($fraxFolder, newNode)\r\n\r\n if (triggerEventP === true) {\r\n $fraxFolder.trigger({\r\n type: fraxEvents.SELECTED,\r\n selectedItemId: selectedItemId\r\n })\r\n }\r\n },\r\n /**\r\n * Renderuje breadcrumby wg. template'u\r\n * @param {any} $frax\r\n * @param {fraxFolderNodeModel} selectedNode\r\n */\r\n renderBreadCrumbs($frax, selectedNode) {\r\n let nodeParentStruct = [selectedNode];\r\n\r\n /**\r\n * buduje sciezke do wybranego node'a\r\n * @param {fraxFolderNodeModel} node\r\n */\r\n function _buildPath(node) {\r\n let p = fraxFolder.getNodeParent($frax, node.parent)\r\n if (p != undefined && p.length != 0) {\r\n nodeParentStruct.push(p)\r\n _buildPath(p)\r\n }\r\n }\r\n _buildPath(selectedNode)\r\n\r\n let $breadcrumbsContainer = $frax.find('.kdr-frax-folder-breadcrumbs');\r\n let childsToRender = []\r\n\r\n for (var i = nodeParentStruct.length; i > 0; i--) {\r\n //let n = nodeParentStruct[i - 1]\r\n let $n = new fraxFolderNodeModel(nodeParentStruct[i - 1])\r\n let $b = $($.parseHTML(templates.breadcrumb.trim()))\r\n\r\n $b.html($n.text)\r\n $b.data('p', $n.id)\r\n\r\n if ($n.attributes.draggableInP) {\r\n $b.addClass(fraxFolder.classes.itemDraggableIn)\r\n }\r\n\r\n childsToRender.push($b)\r\n }\r\n\r\n if (nodeParentStruct.length < 2) {\r\n $breadcrumbsContainer.find('.kdr-frax-folder-up').fadeOut()\r\n }\r\n else {\r\n $breadcrumbsContainer.find('.kdr-frax-folder-up').fadeIn()\r\n }\r\n\r\n $breadcrumbsContainer.find('.kdr-frax-folder-breadcrumb').remove()\r\n $breadcrumbsContainer.append(childsToRender)\r\n\r\n fraxFolder.initializeDragAndDropFraxFolders($frax, $(childsToRender));\r\n },\r\n /**\r\n * Renderuje wybranego node'a wg. template'u\r\n * @param {any} $frax\r\n * @param {fraxFolderNodeModel} selectedNode\r\n */\r\n renderSelectedNode($frax, selectedNode) {\r\n let templates = fraxFolder.getTemplates($frax)\r\n let $selecteditemInner = $($.parseHTML(templates.selectedItem.trim()))\r\n\r\n let $selectedItemContainer = $frax.find('.kdr-frax-folder-selected-item')\r\n\r\n let $itemDescContainer = $selecteditemInner.find('.kdr-frax-folder-selected-item-desc')\r\n\r\n if (textHelper.isNullOrEmpty(selectedNode.description) === false) {\r\n $itemDescContainer.html(`${selectedNode.description}`)\r\n $selectedItemContainer.show()\r\n } else {\r\n $itemDescContainer.html(templates.noData.trim())\r\n $selectedItemContainer.hide()\r\n }\r\n\r\n let $tConditionalBtnsContainer = $frax.find('.kdr-frax-folder-selected-item-action-buttons-conditional')\r\n\r\n fraxFolder.renderSelectedNodeActionButtons($selectedItemContainer, $tConditionalBtnsContainer, selectedNode.nodeActionButtons, selectedNode.attributes.removableP)\r\n\r\n $selectedItemContainer.data('p', selectedNode.attributes.dataValue)\r\n\r\n setTimeout(() => $selectedItemContainer.html($selecteditemInner), 0)\r\n },\r\n /**\r\n * Renderuje strukture wybrangeo node'a\r\n * @param {any} $frax\r\n * @param {fraxFolderNodeModel} selectedNode\r\n */\r\n renderSelectedNodeStructure($frax, selectedNode) {\r\n let templates = fraxFolder.getTemplates($frax)\r\n let $groups = $frax.find('.kdr-frax-folder-items-group')\r\n let selectedNodeChildrens = fraxFolder.getNodeChildrens($frax, selectedNode.id)\r\n let groupedChildrenNodes = arrayHelper.groupBy(selectedNodeChildrens, \"groupKey\") ?? []\r\n let allRenderedChildrens = $()\r\n let hiddenGroupsCount = 0;\r\n $groups.each((i, e) => {\r\n let $group = $(e)\r\n let $groupRenderPlace = $group.find('.kdr-frax-folder-group')\r\n let groupKey = $group.data('groupKey')\r\n let itemsAreBigP = convert.stringToBoolean($group.data('itemsAreBigP'))\r\n let itemsAreClickableP = convert.stringToBoolean($group.data('itemsAreClickableP'))\r\n\r\n let childs = groupedChildrenNodes[groupKey]\r\n\r\n if (childs == undefined || childs.length == 0) {\r\n hiddenGroupsCount++\r\n\r\n setTimeout(() => {\r\n $group.hide()\r\n $groupRenderPlace.html(templates.noData.trim())\r\n }, 0)\r\n } else {\r\n $group.show()\r\n\r\n let childsToRender = []\r\n for (var i = 0; i < childs.length; i++) {\r\n let c = new fraxFolderNodeModel(childs[i])\r\n let $t = $($.parseHTML(templates.item.trim()))\r\n\r\n $t.data('p', c.id)\r\n $t.find('.kdr-frax-folder-item-name').html(c.text)\r\n\r\n\r\n let tooltip = `${c.text}`;\r\n if (textHelper.isNullOrEmpty(c.description) === false) {\r\n tooltip += `
${c.description}
`\r\n }\r\n\r\n $t.find('.kdr-frax-folder-item-tooltip').attr('title', tooltip)\r\n\r\n if (itemsAreBigP === true) {\r\n $t.addClass('kdr-frax-folder-item-big')\r\n }\r\n\r\n if (itemsAreClickableP === true) {\r\n $t.addClass('kdr-frax-folder-item-clickable')\r\n }\r\n\r\n if (c.attributes.draggableInP) {\r\n $t.addClass(fraxFolder.classes.itemDraggableIn)\r\n }\r\n\r\n if (c.attributes.draggableOutP) {\r\n $t.addClass(fraxFolder.classes.itemDraggableOut)\r\n }\r\n\r\n let $tRemoveBtn = $t.find('.kdr-frax-folder-item-remove-btn')\r\n if (c.state.checkbox_disabled == true) {\r\n $tRemoveBtn.remove()\r\n $tRemoveBtn.data('item', null)\r\n } else {\r\n $tRemoveBtn.show()\r\n $tRemoveBtn.data('item', $t)\r\n }\r\n\r\n let $tItemsCountSpan = $t.find('.kdr-frax-folder-item-children-count')\r\n if (itemsAreBigP === true && c.childrenCount != null && c.childrenCount != undefined) {\r\n $tItemsCountSpan.find('.kdr-frax-folder-item-children-count-value').html(c.childrenCount)\r\n } else {\r\n $tItemsCountSpan.remove()\r\n }\r\n\r\n fraxFolder.renderNodeActionButtons($t, $t.find('.kdr-frax-folder-item-buttons'), c.nodeActionButtons, c.attributes.removableP)\r\n\r\n let $imgContainer = $t.find(`.${fraxFolder.classes.itemImgContainer}`)\r\n let defaultImg = $imgContainer.data('defaultImg')\r\n let $img = null;\r\n\r\n if (c.image.imageType != 0 && c.image.hasAnyImage() === true) {\r\n\r\n if (c.image.imageType == 1 || c.image.imageType == 3) {\r\n let src;\r\n if (c.image.imageType == 1) {\r\n src = `${window.location.origin}${__root}Frax/GetFileByMagic?p=${c.image.src}`\r\n } else {\r\n src = `${window.location.origin}${__root}${c.image.src}`\r\n }\r\n $img = $(``)\r\n } else if (c.image.imageType == 2) {\r\n $img = $(``)\r\n }\r\n\r\n } else {\r\n $img = $(``)\r\n }\r\n $imgContainer.append($img)\r\n\r\n if (itemsAreBigP === true) {\r\n $imgContainer.find('.kdr-frax-folder-item-image-download').remove()\r\n }\r\n\r\n childsToRender.push($t)\r\n allRenderedChildrens = allRenderedChildrens.add($t)\r\n }\r\n\r\n setTimeout(() => {\r\n $groupRenderPlace.html(childsToRender)\r\n tooltipHelper.init($groupRenderPlace, { sanitize: false })\r\n }, 0)\r\n }\r\n $group.find('.kdr-frax-folder-items-group-search').valExtended('')\r\n })\r\n\r\n fraxFolder.renderNoDataOverall($frax, hiddenGroupsCount == $groups.length)\r\n fraxFolder.initializeDragAndDropFraxFolders($frax, allRenderedChildrens);\r\n },\r\n renderNoDataOverall($frax, stateP) {\r\n let $container = $frax.find('.kdr-frax-folder-overall-empty')\r\n if ($container.length > 0) {\r\n if (stateP) {\r\n $container.show()\r\n } else {\r\n $container.hide()\r\n }\r\n }\r\n },\r\n /**\r\n * \r\n * @param {jQuery.object} $nodeBtnsContainer\r\n * @param {Array} nodeActionButtons\r\n */renderSelectedNodeActionButtons($node, $nodeBtnsContainer, nodeActionButtons, nodeRemovableP = false) {\r\n $nodeBtnsContainer.html('')\r\n\r\n if (nodeActionButtons != null && nodeActionButtons.length != 0) {\r\n for (let i = nodeActionButtons.length - 1; i >= 0; i--) {\r\n let btn = nodeActionButtons[i]\r\n let $btn = $(``)\r\n\r\n if (btn.tooltip != null) {\r\n $btn.attr('data-toggle', 'tooltip')\r\n $btn.attr('title', btn.tooltip)\r\n }\r\n\r\n if (btn.icon != null) {\r\n $btn.append(``)\r\n }\r\n\r\n $btn.data('item', $node)\r\n $nodeBtnsContainer.prepend($btn)\r\n }\r\n $nodeBtnsContainer.show()\r\n } else {\r\n $nodeBtnsContainer.hide()\r\n }\r\n\r\n if (nodeRemovableP === false) {\r\n $nodeBtnsContainer.find('.kdr-frax-folder-item-remove-btn').remove()\r\n }\r\n\r\n $nodeBtnsContainer.attr('btn-count', $nodeBtnsContainer.find('.btn').length)\r\n },\r\n /**\r\n * \r\n * @param {jQuery.object} $nodeBtnsContainer\r\n * @param {Array} nodeActionButtons\r\n */\r\n renderNodeActionButtons($node, $nodeBtnsContainer, nodeActionButtons, nodeRemovableP = false) {\r\n\r\n if (nodeActionButtons != null && nodeActionButtons.length != 0) {\r\n let $template = $nodeBtnsContainer.find('.kdr-frax-folder-item-btn-template')\r\n for (let i = nodeActionButtons.length - 1; i >= 0; i--) {\r\n let btn = nodeActionButtons[i]\r\n let $btn = $template.clone()\r\n $btn.removeClass('kdr-frax-folder-item-btn-template')\r\n .addClass(btn.classes)\r\n\r\n if (btn.tooltip != null) {\r\n $btn.find('.dropdown-item-text').text(btn.tooltip)\r\n }\r\n\r\n if (btn.icon != null) {\r\n $btn.find('.icon-template').replaceWith(``)\r\n }\r\n\r\n $btn.data('item', $node)\r\n $template.before($btn)\r\n }\r\n }\r\n\r\n if (nodeRemovableP === false) {\r\n $nodeBtnsContainer.find('.kdr-frax-folder-item-remove-btn').remove()\r\n\r\n if (nodeActionButtons.length == 0) {\r\n $nodeBtnsContainer.remove()\r\n }\r\n }\r\n },\r\n initializeDragAndDropFraxFolders($frax, childsToRender) {\r\n\r\n // Funkcja wywoływana przy rozpoczęciu przeciągania\r\n function dragStart(event) {\r\n fraxFolder.currentDraggableItem = this;\r\n if ($(this).hasClass(fraxFolder.classes.itemDraggableOut)) {\r\n childsToRender.each((index, element) => {\r\n let $element = $(element)\r\n if ($element.hasClass(fraxFolder.classes.itemDraggableIn)) {\r\n $element.addClass('highlight-drag-folders');\r\n }\r\n })\r\n }\r\n }\r\n function dragEnd(event) {\r\n childsToRender.each(function (index, element) {\r\n let $element = $(element)\r\n if ($element.hasClass('kdr-frax-folder-item-clickable')) {\r\n $element.removeClass('highlight-drag-folders');\r\n }\r\n })\r\n }\r\n\r\n // Funkcje wywoływane podczas przeciągania nad obszarem upuszczania\r\n function dragOver(event) {\r\n if (($(fraxFolder.currentDraggableItem).hasClass(fraxFolder.classes.itemDraggableOut) || $(this).hasClass('drag-over')) && fraxFolder.currentDraggableItem !== this) {\r\n event.preventDefault();\r\n $element = $(this)\r\n\r\n if ($element.hasClass(fraxFolder.classes.itemDraggableIn)) {\r\n $element.addClass('highlight-drag-folders-enter');\r\n }\r\n //escapeLogic(event);\r\n }\r\n }\r\n\r\n function dragEnter(event) {\r\n event.preventDefault();\r\n this.classList.add('drag-over');\r\n //escapeLogic(event);\r\n }\r\n\r\n function dragLeave() {\r\n $element = $(this)\r\n $element[0].classList.remove('drag-over');\r\n if ($element.hasClass(fraxFolder.classes.itemDraggableIn)) {\r\n $element.removeClass('highlight-drag-folders-enter');\r\n }\r\n }\r\n\r\n function escapeLogic(event) {\r\n\r\n var $divToEscape = $(\".drag-over\")\r\n\r\n var mouseX = event.clientX;\r\n var mouseY = event.clientY;\r\n\r\n let x = $divToEscape.getPositionInViewport()\r\n var divX = x.left;\r\n var divY = x.top;\r\n var distX = mouseX - divX + 10;\r\n var distY = mouseY - divY + 10;\r\n\r\n var escapeX = -distX;\r\n var escapeY = -distY;\r\n\r\n var w = window.innerWidth;\r\n var h = window.innerHeight;\r\n\r\n positionX = Math.random() * (w - x.left)\r\n positionY = Math.random() * (h - $divToEscape[0].offsetHeight)\r\n\r\n\r\n $divToEscape[0].style.transition = 'transform 0.1s ease-out';\r\n\r\n\r\n $divToEscape[0].style.transform = 'translate(' + positionX + 'px, ' + positionY + 'px)';\r\n }\r\n\r\n // Funkcja wywoływana podczas upuszczenia wiersza\r\n function drop(event) {\r\n event.preventDefault();\r\n let $draggedItem = $(fraxFolder.currentDraggableItem);\r\n let $dropDestination = $(this);\r\n\r\n let draggedP = $draggedItem.data('p')\r\n let targetP = $dropDestination.data('p')\r\n if (draggedP != targetP) {\r\n fraxFolder.moveItem($frax, draggedP, targetP, $frax.data('moveMagic'))\r\n }\r\n }\r\n\r\n childsToRender.each((index, element) => {\r\n let $element = $(element)\r\n\r\n if ($element.hasClass(fraxFolder.classes.itemDraggableOut)) {\r\n $element.attr('id', 'draggableItem' + (index + 1));\r\n $element.attr('draggable', 'true');\r\n $element.on('dragstart', dragStart);\r\n $element.on('dragend', dragEnd);\r\n }\r\n if ($element.hasClass(fraxFolder.classes.itemDraggableIn)) {\r\n $element.on('dragover', dragOver);\r\n $element.on('dragenter', dragEnter);\r\n $element.on('dragleave', dragLeave);\r\n $element.on('dragstart', dragStart);\r\n $element.on('drop', drop);\r\n }\r\n });\r\n\r\n },\r\n removeItem($frax, itemsPToRemove, fraxMagic) {\r\n\r\n let args = { selected: itemsPToRemove }\r\n\r\n modal.getModal.danger(\r\n '~{Delete}',\r\n '~{Are you sure you want to delete this item?}',\r\n false,\r\n '~{Cancel}',\r\n null,\r\n '~{Delete}',\r\n 'btn-danger',\r\n ($modal) => {\r\n $.ajax({\r\n type: \"POST\",\r\n url: __root + \"Frax/Act\",\r\n datatype: \"json\",\r\n traditional: true,\r\n data: {\r\n \"info\": controls.getInfo($frax),\r\n \"magic\": fraxMagic,\r\n \"args\": JSON.stringify(args)\r\n },\r\n success: function (response) {\r\n if (response.code == gridResponseCodes.SUCCESS) {\r\n controls.onGridBeforeRender($frax, response.code, fraxActions.REMOVE, response.info, response.returnValue)\r\n controls.magic(controls.getEndpoint($frax), $frax, response, $frax);\r\n\r\n modalHelper.removeModalFromBody($modal)\r\n } else {\r\n let title = response.code == gridResponseCodes.ERROR ? \"~{Error}\" :\r\n response.code == gridResponseCodes.INFO ? \"~{Information}\" :\r\n response.code == gridResponseCodes.WARNING ? \"~{Warning}\" : null;\r\n modal.getModalAjax({ type: response.code, title: title, message: response.message })\r\n }\r\n },\r\n error: function (response) {\r\n let eggog = response.status + ' ' + $(response.responseText).find('.stackerror').text()\r\n modal.getModal.danger(response.statusText, eggog)\r\n },\r\n beforeSend: function () { loading.show(); },\r\n complete: function () { loading.hide(); }\r\n })\r\n }\r\n )\r\n },\r\n moveItem($frax, sourceItemP, targetItemP, fraxMagic) {\r\n let $loadingTargets = $frax\r\n\r\n let args = {\r\n sourceValue: sourceItemP,\r\n targetValue: targetItemP\r\n }\r\n\r\n $.ajax({\r\n type: \"POST\",\r\n url: __root + \"Frax/Act\",\r\n datatype: \"json\",\r\n traditional: true,\r\n data: {\r\n info: controls.getInfo($frax),\r\n magic: fraxMagic,\r\n args: JSON.stringify(args)\r\n },\r\n success: function (response) {\r\n if (response.info == null) {\r\n response.info = controls.getInfo($frax)\r\n }\r\n\r\n controls.magic(controls.getEndpoint($frax), $frax, response, $loadingTargets, true);\r\n },\r\n beforeSend: function () { loading.show($loadingTargets) },\r\n complete: function () { loading.hide($loadingTargets) }\r\n });\r\n },\r\n searchGroupForItems(searchValue, $groupContainer) {\r\n let $searchItems = $groupContainer.find('.kdr-frax-folder-item')\r\n if (textHelper.isNullOrEmpty(searchValue)) {\r\n $searchItems.show()\r\n } else {\r\n let sss = searchValue.trim().toLowerCase().split(',')\r\n let ss = []\r\n for (var i = 0; i < sss.length; i++) {\r\n let s = sss[i].trim()\r\n if (textHelper.isNullOrEmpty(s) === false) {\r\n ss.push(s)\r\n }\r\n }\r\n\r\n for (var i = 0; i < $searchItems.length; i++) {\r\n let $si = $searchItems.eq(i)\r\n let nameText = $si.find('.kdr-frax-folder-item-name').text().trim().toLowerCase()\r\n if (ss.some(s => nameText.includes(s))) {\r\n $si.show()\r\n } else {\r\n $si.hide()\r\n }\r\n }\r\n }\r\n },\r\n}\r\n\r\n$.fn.fraxFolderInit = function () {\r\n let $f = $(this)\r\n try {\r\n let selectedNode = fraxFolder.getSelectedNode($f)\r\n let selectedNodeId;\r\n\r\n if (selectedNode != undefined) {\r\n selectedNodeId = selectedNode.id\r\n }\r\n\r\n fraxFolder.selectNode($f, selectedNodeId, false)\r\n\r\n controls.onGridAfterUiInit($f, gridResponseCodes.SUCCESS, null)\r\n } catch (exception) {\r\n console.info('Error at frax folder init, fraxId: ', $f.prop('id'))\r\n console.error(exception)\r\n }\r\n}\r\n$.fn.fraxFolderSelectNode = function () {\r\n let $selectedItem = $(this)\r\n let $fraxFolder = $selectedItem.closest('.kdr-frax-folder')\r\n let p = $selectedItem.data('p');\r\n\r\n fraxFolder.selectNode($fraxFolder, p)\r\n}\r\n$.fn.fraxFolderGetSelectedNodeValue = function () {\r\n let $fraxFolder = $(this)\r\n return fraxFolder.getSelectedNodeValue($fraxFolder)\r\n}\r\n$.fn.fraxFolderRemoveItem = function (nodeMagic, magic) {\r\n let $fraxFolder = $(this)\r\n let itemP = [nodeMagic]\r\n return fraxFolder.removeItem($fraxFolder, itemP, magic)\r\n}\r\n$.fn.fraxFolderFindInGroup = function (searchValue, $groupContainer) {\r\n fraxFolder.searchGroupForItems(searchValue, $groupContainer)\r\n}\r\n$.fn.fraxFolderNodeDownloadFile = function (nodeMagic) {\r\n let $fraxNode = $(this)\r\n let $fraxFolder = $fraxNode.closest('.kdr-frax-folder')\r\n return fraxFolder.removeItem($fraxFolder, nodeMagic)\r\n}\r\n\r\n$(document).on('dblclick', '.kdr-frax-folder .kdr-frax-folder-item-clickable', function (e) {\r\n if ($(e.target).hasClass('kdr-frax-folder-item-action-btn') === false) {\r\n let $item = $(this)\r\n $item.fraxFolderSelectNode()\r\n }\r\n})\r\n\r\n$(document).on('click', '.kdr-frax-folder .kdr-frax-folder-breadcrumb', function () {\r\n let $item = $(this)\r\n $item.fraxFolderSelectNode()\r\n})\r\n\r\n$(document).on('click', '.kdr-frax-folder .kdr-frax-folder-item-remove-btn', function () {\r\n let $btn = $(this)\r\n let itemMagic = $btn.data('item').data('p')\r\n let magic = $btn.data('magic')\r\n $btn.closest('.kdr-frax-folder').fraxFolderRemoveItem(itemMagic, magic)\r\n})\r\n\r\n$(document).on(fraxEvents.SELECTED, '.kdr-frax-folder', function () {\r\n controls.invokeCommands($(this))\r\n})\r\n\r\n$(document).on('click', '.kdr-frax-folder .kdr-frax-folder-items-group-search-container .btn-search', function () {\r\n $(this).closest('.kdr-frax-folder-items-group-search-container').find('.kdr-frax-folder-items-group-search').focus()\r\n})\r\n\r\n$(document).on('paste input', '.kdr-frax-folder .kdr-frax-folder-items-group-search-container .kdr-frax-folder-items-group-search', function () {\r\n let $input = $(this)\r\n let $group = $input.closest('.kdr-frax-folder-items-group')\r\n let $frax = $input.closest('.kdr-frax-folder')\r\n $frax.fraxFolderFindInGroup($input.valExtended(), $group)\r\n})\r\n\r\n$(document).on('click', '.kdr-frax-folder .kdr-frax-folder-item-download', function (e) {\r\n if ($(e.target).closest('.dropdown').length == 0) {\r\n\r\n let $item = $(this).closest('.kdr-frax-folder-item')\r\n let $frax = $item.closest('.kdr-frax-folder')\r\n\r\n $item.trigger(fraxFolder.events.downloadFraxFolderItem, [$frax])\r\n }\r\n})\r\n\r\n/////////////////////////////\r\n// EmployeesAssignment //\r\n/////////////////////////////\r\n\r\n/* To tak nie będzie, narazie testowo */\r\n$(window).on('resize scroll', function () {\r\n $(\".kdr-grid\").each(function (index) {\r\n let lastRowHeight = $(this).find(\"tr:last\").height();\r\n\r\n $(this).find(\"th\").css('margin-bottom', lastRowHeight - 1);\r\n });\r\n});\r\n\r\n$(\"#document-structures\").ready(function () {\r\n\r\n $(\"#left-ds-frax\").ready(function () {\r\n Frax.initialize(\"left-ds-frax\");\r\n Frax.registerSelectionCallback(\"left-ds-frax\", function (evt, data, mode) {\r\n $('.kdr-filters[data-control-id=document-structures-details] #id').val(data.node.id);\r\n $('.kdr-filters[data-control-id=document-structures-details] .kdr-filters-btn').last().click();\r\n $('.document-structure-element').html(data.node.text);\r\n });\r\n\r\n });\r\n $(\"#right-ds-frax\").ready(function () {\r\n Frax.initialize(\"right-ds-frax\");\r\n Frax.registerSelectionCallback(\"right-ds-frax\", function (evt, data, mode) {\r\n $('.kdr-filters[data-control-id=document-structures-details] #id').val(data.node.id);\r\n $('.kdr-filters[data-control-id=document-structures-details] .kdr-filters-btn').last().click();\r\n $('.new-document-structure-element').html(data.node.text);\r\n });\r\n\r\n });\r\n $(document).on(\"click\", \".document-structures-action-commit\", function (e) {\r\n loading.show($('.body-content'));\r\n let payload = {\r\n document_from: Frax.getSelected('left-ds-frax')[0],\r\n document_to: Frax.getSelected('right-ds-frax')[0],\r\n date_from: $('.time-from input').val(),\r\n date_to: $('.time-to input').val(),\r\n };\r\n $.ajax({\r\n type: \"POST\",\r\n url: __root + \"Administration/CommitDocument\",\r\n datatype: \"json\",\r\n traditional: true,\r\n data: {\r\n \"payload\": JSON.stringify(payload)\r\n },\r\n success: function (response) {\r\n location.reload(true)\r\n }\r\n })\r\n });\r\n});\r\n\r\n\r\n/////////////////////////////\r\n// CARD PAGES //\r\n////////////////////////////\r\n\r\n/** Card user auth*/\r\nvar card = {\r\n isAble: false,\r\n /**\r\n * Time expressed in seconds\r\n * @param {any} time \r\n */\r\n initPage: function (time, endpoint, p, callback) {\r\n $('.internal-circle').css('animation-duration', time + 's')\r\n\r\n if (time == undefined) {\r\n time = 5000\r\n } else {\r\n time = time * 1000\r\n }\r\n\r\n /*toastr.success('Welcome Infokiosk')*/\r\n\r\n card.allow()\r\n setTimeout(function () { card.checkState(time, endpoint, p, callback) }, time);\r\n },\r\n checkState: function (time, endpoint, p, callback) {\r\n if (card.isAble) {\r\n\r\n let data = p == null ? {} : { p: p }\r\n\r\n $.ajax({\r\n type: \"POST\",\r\n url: __root + endpoint,\r\n datatype: \"json\",\r\n traditional: true,\r\n data: data,\r\n success: function (response) {\r\n if (response.code == gridResponseCodes.SUCCESS) {\r\n /*toastr.success('Authenticated user')*/\r\n\r\n if (callback != undefined) {\r\n callback()\r\n\r\n card.terminate()\r\n //location.replace(__root)\r\n }\r\n } else if (response.code == gridResponseCodes.ERROR) {\r\n toastr.error(response.message)\r\n setTimeout(function () { card.checkState(time, endpoint, p, callback) }, time);\r\n } else {\r\n setTimeout(function () { card.checkState(time, endpoint, p, callback) }, time);\r\n }\r\n },\r\n beforeSend: function () {\r\n //toastr.info('Checking state started')\r\n $('.internal-circle').attr('data-anim', false)\r\n },\r\n complete: function () {\r\n //toastr.info('Checking state ended')\r\n $('.internal-circle').attr('data-anim', true)\r\n }\r\n })\r\n }\r\n },\r\n terminate: function () {\r\n card.isAble = false\r\n },\r\n allow: function () {\r\n card.isAble = true\r\n }\r\n}\r\n\r\n/////////////////////////////\r\n// INFO BOXES //\r\n/////////////////////////////\r\nvar infoBoxes = {\r\n updateSort: function (infoBoard) {\r\n let $infoBoard = $(infoBoard)\r\n\r\n $.ajax({\r\n type: \"POST\",\r\n url: __root + \"InfoBoard/SetInfoBoxSort\",\r\n datatype: \"json\",\r\n traditional: true,\r\n data: {\r\n info: infoBoxes.getInfo($infoBoard),\r\n sortOrder: infoBoxes.getSortOrder($infoBoard)\r\n },\r\n success: function (response) {\r\n if (response.code == gridResponseCodes.SUCCESS) {\r\n //toastr.success('CHANGED')\r\n } else {\r\n toastr.warning(response.message)\r\n }\r\n },\r\n beforeSend: function () {\r\n //toastr.info('START')\r\n },\r\n complete: function () {\r\n //toastr.info('END')\r\n }\r\n })\r\n },\r\n getSortOrder: function (infoBoard) {\r\n let $infoBoard = $(infoBoard)\r\n let sort = []\r\n\r\n $infoBoard.find('.cntInfoBox').each(function (i, e) {\r\n let value = $(e).data('value')\r\n sort.push(parseInt(value, 10))\r\n })\r\n\r\n return sort\r\n },\r\n getInfo: function (infoBoard) {\r\n let val = $(infoBoard).find('#infoBoardInfo').data('info')\r\n\r\n return val\r\n }\r\n}\r\n\r\n$(document).ready(function () {\r\n var d = 100;\r\n var f = 500;\r\n var dd = 0;\r\n $('.cntInfoBox .infobox1').each(function () {\r\n $(this).delay(dd).fadeIn(f);\r\n dd += d;\r\n });\r\n prepareInfoBoxes();\r\n});\r\n\r\nfunction prepareInfoBoxes() {\r\n var f2 = 500;\r\n $('.cntInfoBox.typ1').mouseenter(function () {\r\n $(this).find('.infobox1').fadeOut(f2);\r\n $(this).find('.infobox2').fadeIn(f2);\r\n });\r\n\r\n $('.cntInfoBox.typ1').mouseleave(function () {\r\n $(this).find('.infobox2').fadeOut(f2);\r\n $(this).find('.infobox1').fadeIn(f2);\r\n });\r\n}\r\n\r\nfunction showInfoBoxes() {\r\n $('.cntInfoBox .infobox1').each(function () {\r\n $(this).show();\r\n });\r\n}\r\n\r\n$(function () {\r\n $(\"#sortable\").sortable({\r\n revert: true,\r\n update: function () {\r\n infoBoxes.updateSort(this)\r\n },\r\n });\r\n})\r\n\r\n/////////////////////////////\r\n// InfoBoard //\r\n/////////////////////////////\r\nvar chartHelpers = {\r\n zoomDirections: {\r\n in: 10e2,\r\n out: -10e2\r\n },\r\n panXDirections: {\r\n left: 10e2,\r\n right: -10e2\r\n },\r\n intervalHolder: null,\r\n zoom($target, direction) {\r\n let event = this.createZoomEvent(direction)\r\n $target[0].dispatchEvent(event)\r\n //setTimeout(() => {\r\n // for (let i = 0; i < 3; i++){\r\n //\r\n // let resp = $target[0].dispatchEvent(event)\r\n // console.log(i + ' ' + resp)\r\n // }\r\n //}, 1);\r\n },\r\n panX(canvas, panXDirection) {\r\n let instance = this.getChartInstance(canvas)\r\n\r\n if (panXDirection == chartHelpers.panXDirections.left) {\r\n let firstVisibleLabel = instance.scales[\"x-axis-0\"].min\r\n let firstAbsoluteLabel = instance.data.labels[0]\r\n\r\n if (firstAbsoluteLabel == firstVisibleLabel) {\r\n return false\r\n }\r\n\r\n } else if (panXDirection == chartHelpers.panXDirections.right) {\r\n let absoluteLabelsLength = instance.data.labels.length\r\n\r\n let lastVisibleLabel = instance.scales[\"x-axis-0\"].max\r\n let lastAbsoluteLabel = instance.data.labels[absoluteLabelsLength - 1]\r\n\r\n if (lastVisibleLabel == lastAbsoluteLabel) {\r\n return false\r\n }\r\n } else {\r\n throw console.error('You need to specify panX direction.')\r\n return false\r\n }\r\n\r\n let e = {\r\n deltaX: panXDirection,\r\n deltaY: 0\r\n }\r\n instance._mc.handlers.panstart[0](e)\r\n },\r\n resetZoom(canvas) {\r\n let instance = this.getChartInstance(canvas)\r\n instance.resetZoom()\r\n },\r\n createZoomEvent(direction) {\r\n let e = document.createEvent('MouseEvents')\r\n e.initEvent('wheel', true, true)\r\n\r\n if (direction == this.zoomDirections.in) {\r\n e.deltaY = -10;\r\n } else if (direction == this.zoomDirections.out) {\r\n e.deltaY = 10;\r\n } else {\r\n throw console.error('You need to specify zoom direction.')\r\n return false\r\n }\r\n return e\r\n },\r\n getChartInstance(canvas) {\r\n let hehe = {}\r\n Chart.helpers.each(Chart.instances, function (instance) {\r\n if (instance.chart.canvas == canvas) {\r\n hehe = instance\r\n }\r\n })\r\n return hehe\r\n }\r\n}\r\n\r\n$(document).on('mousedown', '.canvas-zoom-in, .canvas-zoom-out', function () {\r\n let $btn = $(this)\r\n let $target = $($btn.data('target'))\r\n let direction = $btn.hasClass('canvas-zoom-in') ? chartHelpers.zoomDirections.in : chartHelpers.zoomDirections.out\r\n\r\n chartHelpers.intervalHolder = setInterval(function () {\r\n chartHelpers.zoom($target, direction)\r\n }, 25)\r\n})\r\n\r\n$(document).on('mousedown', '.canvas-pan-left, .canvas-pan-right', function () {\r\n let $btn = $(this)\r\n let direction = $btn.hasClass('canvas-pan-left') ? chartHelpers.panXDirections.left : chartHelpers.panXDirections.right\r\n let canvas = $($btn.data('target'))[0]\r\n\r\n chartHelpers.intervalHolder = setInterval(function () {\r\n chartHelpers.panX(canvas, direction)\r\n }, 100)\r\n})\r\n\r\n$(document).on('click', '.canvas-zoom-in, .canvas-zoom-out', function () {\r\n let $btn = $(this)\r\n let $target = $($btn.data('target'))\r\n let direction = $btn.hasClass('canvas-zoom-in') ? chartHelpers.zoomDirections.in : chartHelpers.zoomDirections.out\r\n\r\n for (let i = 0; i < 3; i++) {\r\n chartHelpers.zoom($target, direction)\r\n }\r\n})\r\n\r\n$(document).on('mouseup mouseleave', '.canvas-zoom-in, .canvas-zoom-out, .canvas-pan-left, .canvas-pan-right', function () {\r\n clearInterval(chartHelpers.intervalHolder)\r\n})\r\n\r\n$(document).on('click', '.canvas-pan-left, .canvas-pan-right', function () {\r\n let $btn = $(this)\r\n let direction = $btn.hasClass('canvas-pan-left') ? chartHelpers.panXDirections.left : chartHelpers.panXDirections.right\r\n let canvas = $($btn.data('target'))[0]\r\n\r\n chartHelpers.panX(canvas, direction)\r\n})\r\n\r\n$(document).on('click', '.canvas-zoom-reset', function () {\r\n let $btn = $(this)\r\n let canvas = $($btn.data('target'))[0]\r\n chartHelpers.resetZoom(canvas)\r\n})\r\n\r\n\r\n/////////////////////////////\r\n// Custom tile button //\r\n/////////////////////////////\r\nvar tileButtons = {\r\n eventsNames: {\r\n startedViewOperation: 'started-view-operation',\r\n endedViewOperation: 'ended-view-operation'\r\n },\r\n getButtonContainer($tileButton) { return $tileButton.closest('.tilebuttons-container') },\r\n getEventCatcher($tileButton) { return tileButtons.getButtonContainer($tileButton) },\r\n getIsButtonActive($tileButton) { return $tileButton.find('.tilebutton-body').hasClass('active') },\r\n /**\r\n * FIXME, tak nie wolno robic\r\n * @param {any} $tileButtonContainer\r\n */\r\n animateToSmall($tileButtonContainer) {\r\n $tileButtonContainer.css({\r\n 'height': '0',\r\n 'margin-top': '2.75rem'\r\n })\r\n $tileButtonContainer.find('.tilebutton-content').addClass('button-anim-3')\r\n $tileButtonContainer.find('.tilebutton-icon').addClass('button-anim-1')\r\n $tileButtonContainer.find('.tilebutton-title').addClass('button-anim-2')\r\n $tileButtonContainer.find('.tilebutton-container').addClass('button-anim-4')\r\n $tileButtonContainer.find('.tilebutton-body').css('height', '0')\r\n\r\n $tileButtonContainer.data('isSmallButtonsActivated', true)\r\n $tileButtonContainer.addClass('tilebuttons-smalled')\r\n },\r\n setClickedButtonActive($tileButton) {\r\n tileButtons.getButtonContainer($tileButton).find(\".tilebutton-body.active\").removeClass('active')\r\n $tileButton.find('.tilebutton-body').addClass(\"active\")\r\n },\r\n performViewOperation($tileButton) {\r\n let $container = tileButtons.getButtonContainer($tileButton)\r\n\r\n if ($container.data('isPerformingViewOperations') === true || tileButtons.getIsButtonActive($tileButton) == true) {\r\n return false\r\n } else {\r\n $container.data('isPerformingViewOperations', true)\r\n }\r\n\r\n let $targetsToShow = $($tileButton.data(\"targetsToShowSelector\"))\r\n let $targetsToHide = $($tileButton.data(\"targetsToHideSelector\"))\r\n\r\n $targetsToHide.fadeOut({\r\n duration: 'fast',\r\n start: function () {\r\n tileButtons.getEventCatcher($tileButton).trigger(tileButtons.eventsNames.startedViewOperation, [$targetsToShow, $targetsToHide])\r\n },\r\n complete: function () {\r\n $targetsToShow.fadeIn({\r\n duration: 'fast',\r\n complete: function () {\r\n $container.data('isPerformingViewOperations', false)\r\n tileButtons.setClickedButtonActive($tileButton)\r\n tileButtons.getEventCatcher($tileButton).trigger(tileButtons.eventsNames.endedViewOperation, [$targetsToShow, $targetsToHide])\r\n }\r\n })\r\n }\r\n })\r\n }\r\n}\r\n\r\n$(document).on('click', '.custom-tilebutton[data-targets-to-show-selector][data-targets-to-hide-selector]', function () {\r\n let $btn = $(this)\r\n let $btnContainer = tileButtons.getButtonContainer($btn)\r\n\r\n if ($btnContainer.data('isSmallButtonsActivated') !== true) {\r\n tileButtons.animateToSmall($btnContainer)\r\n }\r\n\r\n tileButtons.performViewOperation($btn)\r\n})\r\n\r\n$(document).on('click', '.modal-confirm-on-close', function () {\r\n\r\n let $this = $(this)\r\n let $baseModal = $(this).closest('.modal')\r\n\r\n modal.getModal.default('~{Cancellation confirmation}', '~{Are you sure you want to cancel? Your changes will not be saved.}', true, '~{Close}', null, '~{Confirm}', 'kdr-grid-remove-confirm btn-primary', function ($modal) {\r\n $modal.modal('hide')\r\n $baseModal.modal('hide')\r\n $baseModal.remove()\r\n }, $this, null, null, function ($modal) {\r\n $modal.addClass('kdr-grid-delete-modal')\r\n })\r\n})\r\n\r\n\r\n/////////////////////////////\r\n// Custom tile button //\r\n/////////////////////////////\r\n$(document).on('change paste input', '#hc-search-input', function () {\r\n let $this = $(this);\r\n let v = $this.valExtended().toLowerCase().trim();\r\n let $control = $('#' + $this.attr('control-id'))\r\n\r\n\r\n let $container, $questionsPartialContainer\r\n\r\n if ($control.length == 0) {\r\n $container = $('#hc-questions-container')\r\n $questionsPartialContainer = $('#hc-questions-partial')\r\n } else {\r\n $container = $control.closest('.hc-main-content-container')\r\n $questionsPartialContainer = $container.find('#hc-questions-partial')\r\n }\r\n\r\n let $allQuestionsItems = $container.find('.hc-questions-item')\r\n $allQuestionsItems.hide();\r\n\r\n //let $counter = $container.find('#hc-questions-counter')\r\n let $counterCount = $container.find('#hc-questions-counter #hc-counter-count')\r\n if (v === '' || !v) {\r\n if ($control.length > 0) {\r\n $control.show();\r\n $questionsPartialContainer.hide();\r\n }\r\n else {\r\n let $children = $container.children();\r\n $children.find('.found-answear-text').html('')\r\n $allQuestionsItems.show();\r\n $counterCount.text($allQuestionsItems.length)\r\n }\r\n }\r\n else {\r\n let a = ''\r\n let matchStrign = ''\r\n for (var i = 0; i < v.length; i++) {\r\n if (/[.,!@#$%^&*]/g.test(v[i])) {\r\n }\r\n else if (v[i] == ' ') {\r\n matchStrign += v[i]\r\n a += '.*'\r\n } else {\r\n matchStrign += `${v[i]}`\r\n a += `${v[i]}`\r\n }\r\n }\r\n\r\n var regex = new RegExp(a, 'gmi')\r\n let $hits = $container.find('.hc-questions-item .answer, .hc-questions-item .hc-questions-item-module, .hc-questions-item .question, .hc-questions-item .hc-questions-item-symbol').filter(function () {\r\n return regex.test($(this).text().trim());\r\n });\r\n if ($hits.length > 0) {\r\n $hits.each(function () {\r\n let $item = $(this)\r\n let $parent = $item.closest('.hc-questions-item')\r\n\r\n if (!$item.hasClass('answer')) {\r\n $parent.find('.found-answear-text').html('')\r\n return\r\n }\r\n\r\n let firstFoundText = ''\r\n let texts = $item.text().split('.').filter(f => regex.test(f))\r\n if (texts.length > 0) {\r\n\r\n $(texts[0].trim().split(' ')).each(function () {\r\n let word = this.toLowerCase()\r\n\r\n $(matchStrign.split(' ')).each(function () {\r\n if (word.includes(this)) {\r\n word = '' + word + ''\r\n }\r\n })\r\n\r\n firstFoundText += word + ' '\r\n })\r\n }\r\n $parent.find('.found-answear-text').html(firstFoundText.trim())\r\n })\r\n }\r\n let $itemsToShow = $hits.closest('.hc-questions-item')\r\n\r\n $itemsToShow.show();\r\n\r\n $counterCount.text($itemsToShow.length)\r\n $questionsPartialContainer.show();\r\n $control.hide();\r\n }\r\n})\r\n\r\n$(document).on('click', '.hc-load-question-details', function () {\r\n let $this = $(this)\r\n let thisId = $this.prop('id')\r\n\r\n let $q = $this.find('.question')\r\n let $a = $('.answer[for=\"#' + thisId + '\"]')\r\n let $target = $('#hc-load-question-details-target')\r\n $target.find('#title').text($q.text())\r\n $target.find('#content').html($a.html())\r\n $target.show();\r\n})\r\n\r\n$(document).on('click', '.get-edit-help-cetner-modal', function () {\r\n modalHelper.getModal('HelpCenter/GetQuestionModal', { p: $(this).attr('p') }, $(this))\r\n})\r\n$(document).on('click', '.get-create-help-cetner-modal', function () {\r\n modalHelper.getModal('HelpCenter/GetQuestionModal', { p: $(this).attr('data-p') }, $(this))\r\n})\r\n\r\n$(document).on('click', '#help-center-question-save-button', function () {\r\n let gridId = $(this).attr(\"grid-id\");\r\n let controlId = $(this).attr(\"control-id\");\r\n $(document).one(gridEvents.BEFORE_RENDER, '#' + gridId, function (event) {\r\n if ((event.code == gridResponseCodes.SUCCESS && event.actionType == gridActions.UPDATE)) {\r\n if (controlId)\r\n controls.refresh(null, controlId);\r\n\r\n let $modal = $(this).closest('.modal')\r\n $modal.modal('hide')\r\n $modal.remove()\r\n }\r\n })\r\n $(`#${gridId} .kdr-grid-save`).click()\r\n})\r\n\r\n/////////////////////////////\r\n// EXPANDER //\r\n/////////////////////////////\r\n\r\nvar expander = {\r\n events: {\r\n EXPANDED: \"expander_expanded\",\r\n },\r\n perform($target, $source) {\r\n if ($target.data('expandedMinimumHeight') == undefined) {\r\n $target.data('expandedMinimumHeight', $target.height())\r\n }\r\n let hasExpanded;\r\n\r\n if ($target.hasClass('expanded') !== true) {\r\n let scrollHeight = $target.prop('scrollHeight')\r\n $target.css('max-height', scrollHeight)\r\n $target.addClass('expanded')\r\n hasExpanded = true;\r\n }\r\n else {\r\n $target.css('max-height', $target.data('expandedMinimumHeight') + 'px')\r\n setTimeout(() => $target.removeClass('expanded'), 250)\r\n hasExpanded = false;\r\n }\r\n\r\n expander.onExpanded($source, hasExpanded)\r\n },\r\n onExpanded($hook, isExpanded) {\r\n $hook.trigger({\r\n type: expander.events.EXPANDED,\r\n isExpanded: isExpanded\r\n })\r\n }\r\n}\r\n\r\n$(document).on('click', '.toggle-expanded', function () {\r\n $($(this).data('target')).toggleClass('expanded')\r\n})\r\n\r\n$(document).on('click', '.toggle-expanded-by-inner', function () {\r\n let $target = $($(this).data('target'))\r\n expander.perform($target, $(this))\r\n})\r\n\r\n$(document).on('click', '.stop-propagation', function (e) {\r\n if (!e)\r\n e = window.event;\r\n\r\n //IE9 & Other Browsers\r\n if (e.stopPropagation) {\r\n e.stopPropagation();\r\n }\r\n //IE8 and Lower\r\n else {\r\n e.cancelBubble = true;\r\n }\r\n e.preventDefault()\r\n})\r\n\r\n\r\n/////////////////////////////\r\n// KANBAN //\r\n////////////////////////////\r\n\r\n\r\nvar kanban = {\r\n data: {},\r\n ids: [],\r\n selectedTask: null,\r\n rememberDetailsBarState: null,\r\n selectType: {\r\n \"SELECT\": \"SELECT\",\r\n \"DESELECT\": \"DESELECT\",\r\n },\r\n events: {\r\n MOVED_ELEMENT: \"kanban-element-moved\",\r\n CALCULATE_COLUMS: \"get-all-columns-from-kanban\"\r\n },\r\n onKanbanMoved($kanban, $movedElement) {\r\n $kanban.trigger({\r\n type: kanban.events.MOVED_ELEMENT,\r\n movedElement: $movedElement,\r\n })\r\n },\r\n act($kanban, $loadingTarget, callback) {\r\n let info = controls.getInfo($kanban)\r\n var a = [];\r\n let args\r\n let $tasks = $loadingTarget.each(function (index, element) {\r\n a.push(JSON.stringify(args = {\r\n sourceValue: $(element).attr(\"taskid\"),\r\n targetValue: $loadingTarget.closest('.kanban-task-list').attr(\"id\"),\r\n ptpsValue: $(element).attr(\"data-p\")\r\n }))\r\n })\r\n\r\n $.ajax({\r\n type: \"POST\",\r\n url: __root + \"Kanban/Act\",\r\n datatype: \"json\",\r\n traditional: true,\r\n data: {\r\n info: info,\r\n magic: $loadingTarget.attr(\"data-action\"),\r\n args: a\r\n },\r\n success: function (response) {\r\n callback && callback(response)\r\n\r\n if ($('#grid-kanban-target').length > 0) {\r\n controls.refresh(null, 'grid-kanban-target')\r\n }\r\n //controls.magic(\"Kanban/Render\", $kanbanBoard, response, $kanbanBoardTarget, true);\r\n },\r\n\r\n beforeSend: function () { $loadingTarget && loading.show($loadingTarget) },\r\n complete: function () { $loadingTarget && loading.hide($loadingTarget && $loadingTarget.trigger('moved-element-details-action')) }\r\n })\r\n },\r\n calculateItemsInColumns($kanban) {\r\n let $columns = $kanban.find('.kanbanColumn');\r\n let $hightlight = $kanban.find('.kanban-task-list')\r\n let height = 0;\r\n\r\n for (let i = 0; i < $columns.length; i++) {\r\n let $column = $columns.eq(i)\r\n $column.css('height', 'fit-content');\r\n $column.trigger('calculate-column-children', $column)\r\n }\r\n\r\n for (let i = 0; i < $columns.length; i++) {\r\n let $column = $columns.eq(i)\r\n if ($column.height() > height) {\r\n height = $column.height();\r\n }\r\n }\r\n\r\n for (let i = 0; i < $columns.length; i++) {\r\n let $column = $columns.eq(i)\r\n $column.css('min-height', height);\r\n }\r\n\r\n $hightlight.each(function (index, item) {\r\n $(item).css('height', height);\r\n })\r\n },\r\n initializeDragAndDrop() {\r\n\r\n $(\".kanban-task-list\").sortable({\r\n items: 'li',\r\n scroll: true,\r\n scrollSensitivity: 50,\r\n connectWith: '.ui-sortable',\r\n placeholder: 'kdr-kanban-placeholder',\r\n activate: function (event, ui) {\r\n\r\n $columns = $('.allow-drop').addClass('allow-drop-avaiable')\r\n let $task = ui.helper\r\n\r\n if (!$task.hasClass('kanbanSelected')) {\r\n $('.kanbanContainer').find('.kanban-task.kanbanSelected').removeClass('kanbanSelected')\r\n }\r\n\r\n $task.addClass('kanbanSelected');\r\n $('.kdr-kanban-placeholder').css('height', $task.css('height'));\r\n kanban.selectedTask = $task\r\n },\r\n beforeStop: function () {\r\n $('.allow-drop').removeClass('allow-drop-avaiable')\r\n },\r\n receive: function (e, ui) {\r\n let $tiles = $('.kanbanSelected')\r\n $tiles.each(function (index, element) {\r\n if ($(element)[0] !== ui.item[0]) {\r\n e.target.appendChild(element)\r\n }\r\n })\r\n\r\n kanban.onKanbanMoved($tiles.closest('.kanbanContainer'), $tiles)\r\n },\r\n update: function (e, ui) {\r\n let tasks = []\r\n\r\n $(e.target).find('.kanban-task').each(function (index, element) {\r\n tasks.push($(element).attr('data-p'))\r\n })\r\n\r\n $.ajax({\r\n url: window.location.origin + __root + 'Kanban/UpdateTasksSortOrder',\r\n datatype: \"json\",\r\n type: \"POST\",\r\n traditional: true,\r\n data: {\r\n p1: tasks\r\n },\r\n success: function (response) {\r\n if (response.code === gridResponseCodes.ERROR) {\r\n console.log(response.message);\r\n }\r\n else {\r\n let taskId = kanban.selectedTask.find('.kanban-task-spanId').text();\r\n\r\n var parts = taskId.split('-');\r\n $('.prefix-holder').text(parts[0])\r\n let url = window.location.origin + __root + 'ProjectManagement/TaskAllElementsByDisplayNumber?p=' + taskId\r\n $('.kanban-details-span-header').text(taskId).attr('href', url)\r\n }\r\n },\r\n error: function () {\r\n console.log('Błąd AJAX');\r\n },\r\n });\r\n }\r\n });\r\n },\r\n chooseTask($task, event) {\r\n let $container = $task.closest('.kanbanContainer')\r\n\r\n if (!event.shiftKey) {\r\n $container.find('.kanban-task.kanbanSelected').removeClass('kanbanSelected')\r\n }\r\n\r\n if ($(event.target).hasClass('stop-propagination-kanban-cell') || event.target.nodeName.toLowerCase() === 'path' || $(event.target).hasClass('kanban-context-menu-all-elements')) {\r\n return;\r\n }\r\n\r\n $task.toggleClass('kanbanSelected')\r\n\r\n if ($('.kanbanSelected').length > 1) {\r\n var x = document.getElementById(\"kanbanDetails\");\r\n x.style.display = \"none\";\r\n }\r\n\r\n kanban.selectedTask = $task\r\n\r\n let taskId = $task.find('.kanban-task-spanId').text();\r\n\r\n var parts = taskId.split('-');\r\n $('.prefix-holder').text(parts[0])\r\n let url = window.location.origin + __root + 'ProjectManagement/TaskAllElementsByDisplayNumber?p=' + taskId\r\n $('.kanban-details-span-header').text(taskId).attr('href', url)\r\n\r\n controls.filterKanban($task, false)\r\n },\r\n formatTime(number) {\r\n let weeks = Math.floor(number / (5 * 8 * 60 * 60));\r\n number %= (5 * 8 * 60 * 60);\r\n let days = Math.floor(number / (8 * 60 * 60));\r\n number %= (8 * 60 * 60);\r\n let hours = Math.floor(number / (60 * 60));\r\n number %= (60 * 60);\r\n let minutes = Math.floor(number / 60);\r\n number %= 60;\r\n\r\n let result = '';\r\n\r\n if (weeks > 0 || days > 0 || hours > 0 || minutes > 0) {\r\n result += (weeks > 0 ? weeks + \"w \" : \"\") +\r\n (days > 0 ? days + \"d \" : \"\") +\r\n (hours > 0 ? hours + \"h \" : \"\") +\r\n (minutes > 0 ? minutes + \"m \" : \"\");\r\n } else {\r\n result += \"0\";\r\n }\r\n\r\n\r\n return result\r\n },\r\n generateLinksForTasksInComment($grid) {\r\n var $textElementList = $grid.find('.kdr-grid-item-select .kb-links');\r\n\r\n var path = window.location.origin + __root + `ProjectManagement/TaskAllElementsByDisplayNumber?p=`;\r\n let projectPrefix = $('.prefix-holder').text();\r\n\r\n $textElementList.each(function () {\r\n\r\n const regex = new RegExp(`(?![^<]*<\\\\/a>)(${projectPrefix}-\\\\d+)`, \"gm\");\r\n let str = $(this).html();\r\n let m;\r\n\r\n while ((m = regex.exec(str)) !== null) {\r\n if (m.index === regex.lastIndex) {\r\n regex.lastIndex++;\r\n }\r\n\r\n const replacement = `
${m[0]}`;\r\n\r\n str = str.substring(0, m.index) + replacement + str.substring(m.index + m[0].length);\r\n\r\n regex.lastIndex = m.index + replacement.length;\r\n }\r\n\r\n $(this).html(str)\r\n })\r\n\r\n },\r\n scroll(value) {\r\n window.scrollTo({\r\n top: value,\r\n left: 0,\r\n behavior: \"smooth\",\r\n });\r\n }\r\n};\r\n\r\n/////////////////////////////\r\n// HELPDESK //\r\n////////////////////////////\r\n\r\nvar helpdesk = {\r\n AutoComplete($element, $parameter) {\r\n minLength: 2,\r\n $element.autocomplete({\r\n source: function (request, response) {\r\n $.ajax({\r\n url: __root + \"ProjectManagement/AutoCompleteList\",\r\n type: 'GET',\r\n data: { p: ($parameter.attr('data-p')) },\r\n dataType: 'json',\r\n success: function (data) {\r\n var results;\r\n\r\n results = $.ui.autocomplete.filter(data, helpdesk.extractLast(request.term));\r\n response(results);\r\n }\r\n });\r\n },\r\n focus: function () {\r\n // prevent value inserted on focus\r\n return false;\r\n },\r\n select: function (event, ui) {\r\n var terms = helpdesk.split(this.value);\r\n // remove the current input\r\n terms.pop();\r\n // add the selected item\r\n terms.push(ui.item.value);\r\n // add placeholder to get the comma-and-space at the end\r\n terms.push(\"\");\r\n this.value = terms.join(\"; \");\r\n return false;\r\n }\r\n });\r\n },\r\n split(val) {\r\n return val.split(/;\\s*/);\r\n },\r\n extractLast(term) {\r\n return helpdesk.split(term).pop();\r\n }\r\n};\r\n\r\n$(document).on(gridEvents.AFTER_RENDER, '#helpdesk-report-forward-grid', function () {\r\n helpdesk.AutoComplete($('.auto-complete-element'), $('.data-p-holder').first())\r\n})\r\n\r\n$(document).on(gridEvents.AFTER_RENDER, '#helpdesk-report-reply-grid', function () {\r\n helpdesk.AutoComplete($('.auto-complete-element'), $('.data-p-holder').first())\r\n})\r\n\r\n$(document).on(gridEvents.AFTER_RENDER, '#helpdesk-report-close-grid', function () {\r\n helpdesk.AutoComplete($('.auto-complete-element'), $('.data-p-holder').first())\r\n})\r\n\r\n$(document).on(gridEvents.AFTER_RENDER, '#helpdesk-report-change-status-info-grid', function () {\r\n helpdesk.AutoComplete($('.auto-complete-element'), $('.data-p-holder').first())\r\n})\r\n\r\n$(document).on('all-grid-are-saved', '.sprint-end-save-btn', function (response) {\r\n if (response.isSuccess) {\r\n let $m = $(this).closest('.modal')\r\n let $info = $('#grid-what-to-do')\r\n modalHelper.getModal('ProjectManagement/KanbanEstimateTasksAfterSprintModal', { info: controls.getInfo($info) })\r\n //modalHelper.getModal('ProjectManagement/TaskAddModal', { p: controls.getInfo(controls.getControl('project-filters')) })\r\n modalHelper.removeModalFromBody($m)\r\n\r\n controls.refresh($(this).attr('data-refresh-target'))\r\n controls.filtersClick()\r\n }\r\n})\r\n\r\n$(document).on('click', 'test-sprint-btn', function (response) {\r\n modalHelper.getModal('ProjectManagement/TaskAddModal', { p: controls.getInfo(controls.getControl('project-filters')) })\r\n})\r\n\r\n$(document).on('kanban-end-rendered', function () {\r\n let $kanbanInfo = controls.getInfo($('#kanban-rendered'))\r\n let $div = $('#kanban-details-container')\r\n\r\n $.ajax({\r\n url: window.location.origin + __root + 'Kanban/RenderKanbanDetails',\r\n datatype: \"json\",\r\n type: 'POST',\r\n traditional: true,\r\n data: {\r\n info: $kanbanInfo\r\n },\r\n success: function (response) {\r\n let $div = $('#kanban-details-container')\r\n $div.html(response)\r\n },\r\n beforeSend: function () { loading.show($div) },\r\n complete: function () { loading.hide($div) },\r\n error: function () {\r\n console.log('Błąd AJAX');\r\n }\r\n });\r\n});\r\n\r\n\r\n/* comment grid task linking logic start */\r\n$(document).on(gridEvents.BEFORE_UI_INIT, '#sprint-comment-grid-all-elements, #grid-kanban-comment, #sprint-grid-all-elements, #grid-selected-task-details-kanban-info', function () {\r\n kanban.generateLinksForTasksInComment($(this));\r\n})\r\n$(document).on(gridEvents.AFTER_RENDER, '[id ^= \"grid-backlog\"]', function () {\r\n kanban.generateLinksForTasksInComment($(this));\r\n})\r\n\r\n/* comment grid task linking logic end */\r\n\r\nlet $gridSelected;\r\nlet cellObject;\r\n\r\n$(document).on('contextmenu', '.backlog-contextmenu td', function (e) {\r\n cellObject = $(this).find('label').text()\r\n})\r\n\r\n$(document).on('contextmenu', '.backlog-contextmenu', function (e) {\r\n let $this = $(this)\r\n //let $menu = $('.backlog-task-data-picker').closest('div').css('display', 'block')\r\n let $menu = $('.backlog-task-data-picker').css('display', 'block')\r\n\r\n $gridSelected = $this\r\n\r\n let taskMagic = $this.find('.params-hook').attr('p'); //clicked task info\r\n let sourceGridId = $this.closest('.kdr-grid').attr('id'); //clicked grid id\r\n let sprintCompareInfo = $this.closest('.kdr-control').find('.sprint-compare-hook').attr('data-p');\r\n\r\n var $foundElement = $('#context-menu-backlog-task [data-info=\"' + sprintCompareInfo + '\"]');\r\n\r\n if ($foundElement.length > 0) {\r\n $foundElement.prev().hide()\r\n } else {\r\n $('.backlog-context-element').hide()\r\n }\r\n\r\n\r\n if ($this.hasClass('backlogSelection')) {\r\n if ($('#context-menu-backlog-task').length > 0) {\r\n $menu = $('#context-menu-backlog-task')\r\n }\r\n }\r\n\r\n if ($menu != undefined) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n } else {\r\n return true\r\n }\r\n\r\n $menu\r\n .css({\r\n top: e.pageY,\r\n left: e.pageX\r\n })\r\n .addClass('show')\r\n .attr('p', taskMagic)\r\n .attr('data-info', sourceGridId)\r\n})\r\n\r\n$(document).on('click', '.backlog-task-data-picker', function () {\r\n let $this = $(this)\r\n let sourceGridId = $this.closest('#context-menu-backlog-task').attr('data-info') //source grid id\r\n let targetSprintInfo = $this.next('[name=\"info\"]').data('info')\r\n let taskMagic = $this.closest('#context-menu-backlog-task').attr('p');\r\n\r\n controls.lockCheckboxes(controls.getControl(sourceGridId), () => {\r\n let $sourceGridAfterLock = controls.getControl(sourceGridId)\r\n let sourceGridInfoAfterLock = controls.getInfo($sourceGridAfterLock)\r\n\r\n $.ajax({\r\n type: \"POST\",\r\n url: window.location.origin + __root + 'ProjectManagement/UpdateMultipleTaskSprintChange',\r\n datatype: \"json\",\r\n traditional: true,\r\n data: {\r\n pars: targetSprintInfo,\r\n p1: sourceGridInfoAfterLock,\r\n taskMagic: taskMagic\r\n },\r\n success: function () {\r\n let sem = 0\r\n let $targetGridRefresh = $(\".kdr-grid-custom-btn\").filter(`[data-p=\"${targetSprintInfo}\"]`).closest('.kdr-grid'); //target grid object\r\n\r\n $.ajax({\r\n type: \"POST\",\r\n url: window.location.origin + __root + 'Grid/ClearCheckboxes',\r\n datatype: \"json\",\r\n traditional: true,\r\n data: {\r\n info: controls.getInfo($sourceGridAfterLock)\r\n },\r\n success: function (response2) {\r\n\r\n if (3 == response2.code) {\r\n modal.getModal.danger(\"~{Error}\", response2.message, true)\r\n return;\r\n }\r\n else {\r\n $('#document-manage-access-privileges-multi-modal').modal('hide')\r\n controls.setInfo($sourceGridAfterLock, response2.info)\r\n controls.refresh($targetGridRefresh, null, null, null, false, (a) => { if (++sem == 2) backlog.initializeDragAndDrop() })\r\n controls.refresh($sourceGridAfterLock, null, null, null, false, (a) => { if (++sem == 2) backlog.initializeDragAndDrop() })\r\n }\r\n },\r\n error: function (response2) {\r\n console.log(response2)\r\n },\r\n beforeSend: function () { },\r\n complete: function () { }\r\n })\r\n controls.refresh($sourceGridAfterLock.closest('.tilemenu-row-body').find('.kdr-grid-backlog-estimated-time'))\r\n controls.refresh($targetGridRefresh.closest('.tilemenu-row-body').find('.kdr-grid-backlog-estimated-time'))\r\n },\r\n error: function (response) {\r\n console.log(response)\r\n }\r\n })\r\n })\r\n})\r\n\r\n$(document).on('click', '.backlog-create-features-btn', function () {\r\n let $targetSprint = $(this).siblings('input').attr('data-info') //target sprint info\r\n let $task = $(this).closest('#context-menu-backlog-task').attr('p') //task info\r\n\r\n let $sourceGridId = $(this).closest('#context-menu-backlog-task').attr('data-info') //source grid id\r\n let $sourceGrid = $('#' + $sourceGridId)\r\n\r\n let info = controls.getInfo($sourceGrid);\r\n\r\n let tasks = []\r\n\r\n $('.multiple-tasks-checkboxes:checkbox:checked').each(function () {\r\n $temp = $(this).closest('tr')\r\n $taskParent = $temp.find('.task-hook')\r\n $taskId = $taskParent.attr('p')\r\n\r\n tasks.push($taskId)\r\n })\r\n\r\n if (tasks.length == 0) {\r\n tasks.push($task)\r\n }\r\n\r\n modalHelper.getModal('ProjectManagement/TaskAddFeatureModalFromBacklog', { p1: tasks, p2: info })\r\n})\r\n\r\n$(document).on('click', '.move-to-the-top-btn', function () {\r\n let $task = $(this).closest('#context-menu-backlog-task').attr('p') //task info\r\n let tasks = []\r\n let $sourceGrid = $gridSelected.closest('.kdr-grid');\r\n let $info = controls.getInfo($gridSelected.closest('.kdr-grid'))\r\n\r\n $('.multiple-tasks-checkboxes:checkbox:checked').each(function () {\r\n $temp = $(this).closest('tr')\r\n $taskParent = $temp.find('.task-hook')\r\n $taskId = $taskParent.find('a').attr('p')\r\n\r\n tasks.push($taskId)\r\n })\r\n\r\n if (tasks.length == 0) {\r\n tasks.push($task)\r\n }\r\n\r\n\r\n $.ajax({\r\n type: \"POST\",\r\n url: window.location.origin + __root + 'ProjectManagement/MoveTaskSprintChange',\r\n datatype: \"json\",\r\n traditional: true,\r\n data: {\r\n p: tasks,\r\n info: $info\r\n },\r\n success: function (response) {\r\n controls.refresh($sourceGrid, null, null, null, false, (a) => { backlog.initializeDragAndDrop() })\r\n },\r\n error: function (response) {\r\n console.log(response)\r\n }\r\n })\r\n})\r\n\r\n$(document).on('click', '.split-task-btn', function () {\r\n let $task = $(this).closest('#context-menu-backlog-task').attr('p') //task info\r\n let $sourceGrid = $gridSelected.closest('.kdr-grid');\r\n let $info = controls.getInfo($gridSelected.closest('.kdr-grid'))\r\n\r\n $.ajax({\r\n type: \"POST\",\r\n url: window.location.origin + __root + 'ProjectManagement/BacklogTaskSplit',\r\n datatype: \"json\",\r\n traditional: true,\r\n data: {\r\n p: $task,\r\n info: $info\r\n },\r\n success: function (response) {\r\n controls.refresh($sourceGrid, null, null, null, false, (a) => { backlog.initializeDragAndDrop() })\r\n },\r\n error: function (response) {\r\n console.log(response)\r\n }\r\n })\r\n})\r\n\r\n$(document).on('click', '.context-menu-kanban-task', function (e) {\r\n e.stopPropagation();\r\n})\r\n\r\n$(document).on('click', '.copy-cell-value', function () {\r\n textHelper.copyTextToClipboard(cellObject)\r\n .then(() => toastr.info(cellObject, 'Copied text to clipboard'))\r\n .catch(() => toastr.error(cellObject, 'Error, cannot copy'));\r\n})\r\n\r\n$(document).on('change', '.noImpactBtn', function () {\r\n if ($('#sprint-grid-all-elements').length) {\r\n let $btn = $('.no-impact-button-disable').closest('.flex-wrappers');\r\n\r\n $btn.closest('.most-modern-cell-parent').toggleClass(\"hide\")\r\n } else {\r\n\r\n let $btn = $('.no-impact-button-disable');\r\n let $checkbox = $('.disable-cb-and-ddl');\r\n let $this = $(this)\r\n\r\n $btn.toggleClass(\"hide\");\r\n $checkbox.toggleClass(\"hide\");\r\n }\r\n});\r\n\r\n$(document).on('change', '.disable-cb-and-ddl .custom-checkbox', function () {\r\n let $btn = $('.no-impact-button-disable');\r\n let $checkbox = $('.noImpactBtn');\r\n let $this = $(this)\r\n\r\n $btn.toggleClass(\"hide\");\r\n $checkbox.toggleClass(\"hide\");\r\n});\r\n\r\n$(document).on(gridEvents.AFTER_RENDER, '#grid-details-task-backlog', function () {\r\n let $btn = $('.no-impact-button-disable');\r\n let $checkbox = $('.noImpactBtn .custom-control-input');\r\n\r\n if ($checkbox.prop('checked')) {\r\n $btn.closest('.flex-wrappers').addClass('hide')\r\n }\r\n})\r\n\r\n$(document).on(gridEvents.AFTER_RENDER, '#sprint-grid-all-elements', function () {\r\n let $btn = $('.no-impact-button-disable').closest('.flex-wrappers');\r\n let $checkbox = $('.noImpactBtn.custom-control-input');\r\n\r\n if ($checkbox.prop('checked')) {\r\n $btn.closest('.most-modern-cell-parent').addClass('hide')\r\n }\r\n})\r\n\r\n$(document).on('click', '.final-step-btn', function () {\r\n var $checkbox = $(this);\r\n let $tbody = $(this).closest('tbody');\r\n\r\n var $button = $tbody.find('button.final-step-type-ddl');\r\n\r\n if ($checkbox.is(':checked')) {\r\n $button.removeClass('disabled');\r\n } else {\r\n $button.addClass('disabled');\r\n }\r\n});\r\n\r\n$(document).on('click', '.reset-checkbox-state-backlog', function () {\r\n controls.refresh('#sprint-grid-all-elements', null, null, null, false)\r\n});\r\n\r\n\r\n$(document).on(gridEvents.AFTER_RENDER, '#project-management-stages-grid', function () {\r\n controls.refresh('#project-management-steps-grid', null, null, null, false)\r\n})\r\n\r\n$(document).on(gridEvents.AFTER_RENDER, '#sprint-grid-all-elements', function () {\r\n let $btn = $('.no-impact-button-disable');\r\n let $checkbox = $('.noImpactBtn');\r\n\r\n if ($checkbox.prop('checked')) {\r\n //$btn.closest('tr').addClass('hide')\r\n $btn.each(function (index, element) {\r\n $(element).closest('tr').addClass('hide')\r\n })\r\n } else {\r\n //$btn.closest('tr').removeClass('hide')\r\n $btn.each(function (index, element) {\r\n $(element).closest('tr').removeClass('hide')\r\n })\r\n }\r\n})\r\n\r\n$(document).on('click', '.kdr-kanban-remove', function () {\r\n let $kanban = $(this).closest('.kdr-kanban')\r\n let $kanbanContainer = $(this).closest('.kdr-kanban').find('.kanbanContainer')\r\n let info = controls.getInfo($kanban)\r\n let $loadingTarget = $kanbanContainer\r\n\r\n let $modal = $kanban.find(\".kdr-kanban-delete-modal\").clone().detach()\r\n let mId = $modal.prop('id') + 'clonedDetached'\r\n $modal.prop('id', mId)\r\n $('body').append($modal)\r\n\r\n modal.prepareModal(mId);\r\n\r\n $modal.on('hidden.bs.modal', function () {\r\n $modal.remove()\r\n })\r\n\r\n let args = {\r\n taskId: $(document).find('.kanbanSelected').attr(\"taskid\")\r\n }\r\n\r\n $modal.find(\".kdr-grid-remove-confirm\").click(function () {\r\n $modal.modal(\"hide\")\r\n $.ajax({\r\n type: \"POST\",\r\n url: __root + \"Kanban/Act\",\r\n datatype: \"json\",\r\n traditional: true,\r\n data: {\r\n info: info,\r\n magic: $loadingTarget.attr(\"data-action\"),\r\n args: JSON.stringify(args)\r\n },\r\n success: function (response) {\r\n loading.callback && loading.callback(response)\r\n controls.magic(\"Kanban/Render\", $kanban, response, $loadingTarget, true);\r\n toastr[toastrTypes[response.code]](response.message);\r\n },\r\n\r\n beforeSend: function () { $loadingTarget && loading.show($loadingTarget) },\r\n complete: function () { $loadingTarget && loading.hide($loadingTarget) }\r\n })\r\n })\r\n $modal.modal(\"show\")\r\n});\r\n\r\n$(document).on('moved-element-details-action', '.kanban-task', function () {\r\n $this = $(this)\r\n var x = document.getElementById(\"kanbanDetails\");\r\n if (x.style.display === \"block\" && kanban.selectedTask != null) {\r\n //kanban.chooseTask($this, event)\r\n controls.filterKanban($this, false)\r\n }\r\n});\r\n\r\n$(document).on('click', '.kanban-task', function (event) {\r\n var x = document.getElementById(\"kanbanDetails\");\r\n if (x.style.display === \"none\" && kanban.selectedTask != null && !event.shiftKey) {\r\n x.style.display = \"block\";\r\n } else if (x.style.display === \"block\" && kanban.selectedTask === null && !event.shiftKey) {\r\n x.style.display = \"none\";\r\n }\r\n});\r\n\r\n$(document).on(kanban.events.MOVED_ELEMENT, '.kdr-kanban', function (event) {\r\n kanban.act($(this), event.movedElement, (response) => {\r\n toastr[toastrTypes[response.code]](response.message)\r\n })\r\n})\r\n\r\n$(document).on('calculate-column-children', function (event, column) {\r\n let $target = $(column)\r\n $target.find($('.kanban-tasks-counter')).text($target.find('.kanban-task-list').children().length)\r\n\r\n let totalEstimatedTime = 0;\r\n let totalSpendTime = 0;\r\n $target.find('.kanban-task-list .estimated-time-not-converted-value').each(function () {\r\n let value = parseFloat($(this).data('p')) || 0;\r\n totalEstimatedTime += value;\r\n });\r\n\r\n $target.find('.kanban-task-list .spend-time-not-converted-value').each(function () {\r\n let value = parseFloat($(this).data('p')) || 0;\r\n totalSpendTime += value;\r\n });\r\n\r\n let $header = $target.find($('.kdr-column-estimated-time-value span'))\r\n\r\n $header.text(kanban.formatTime(totalSpendTime) + '/' + kanban.formatTime(totalEstimatedTime))\r\n //tooltipHelper.init($header);\r\n})\r\n\r\n$(document).on(kanban.events.MOVED_ELEMENT, '.kdr-kanban', function () {\r\n $(this).trigger(kanban.events.CALCULATE_COLUMS)\r\n kanban.calculateItemsInColumns($(this))\r\n})\r\n\r\n$(document).on(gridEvents.AFTER_RENDER, '#kanban-rendered', function () {\r\n $(this).trigger(kanban.events.CALCULATE_COLUMS)\r\n kanban.calculateItemsInColumns($(this))\r\n kanban.initializeDragAndDrop();\r\n})\r\n\r\n$(document).on('click', '.main-menu-side-bar-pin-btn', function () {\r\n $('.main-menu-side-bar').toggleClass(\"main-menu-side-bar-expanded-state\");\r\n\r\n $pinBtn = $('.main-menu-side-bar-pin-btn')\r\n $pinBtn.toggleClass('main-menu-side-bar-active');\r\n\r\n var currentPrefix = $pinBtn.find('.nav-icon').attr('data-prefix');\r\n $pinBtn.find('.nav-icon').attr('data-prefix', currentPrefix === 'far' ? 'fas' : 'far');\r\n})\r\n\r\n$(document).on('click', '.kanban-context-menu-time-spent', function () {\r\n let ptpsId = $(this).attr(\"data-ptps-p\")\r\n\r\n modalHelper.getModal('ProjectManagement/CreateTimeSpendLog', { p: ptpsId })\r\n})\r\n\r\n$(document).on('click', '.kanban-context-menu-users-time', function () {\r\n let $this = $(this)\r\n let taskId = $this.attr(\"data-task-p\")\r\n let ptpsId = $this.attr(\"data-ptps-p\")\r\n\r\n modalHelper.getModal('ProjectManagement/EstimateUsersTimeFastActions', { p1: taskId, p2: ptpsId })\r\n})\r\n\r\n$(document).one(gridEvents.AFTER_RENDER, '#grid-kanban-target', function (event) {\r\n let $columns = $('.kanbanColumn');\r\n let height = 0;\r\n\r\n $columns.each(function (index, item) {\r\n if ($(item).height() > height) {\r\n height = $(item).height();\r\n }\r\n $(item).height(height);\r\n $(item).trigger('calculate-column-children', $(item))\r\n })\r\n})\r\n\r\n$(document).on('click', '.backlog-add-class-btn', function () {\r\n var estimatedTimeGrid = $(this).closest('.tilemenu-row-body').find('.kdr-grid-backlog-estimated-time')\r\n var parentGrid = $(this).closest('.kdr-grid')\r\n if (parentGrid.hasClass('kdr-grid') && !parentGrid.hasClass('backlog-refresh-me')) {\r\n parentGrid.addClass('backlog-refresh-me');\r\n estimatedTimeGrid.addClass('backlog-refresh-me-after-render');\r\n }\r\n});\r\n\r\n$(document).on('click', '.task-add-modal-save', function () {\r\n let $this = $(this)\r\n let controlId = $this.attr('control-id')\r\n let secondControlId = $this.attr('second-control-id')\r\n let $secondControl = controls.getControl(secondControlId, $this)\r\n let $control = controls.getControl(controlId, $this) //$this is passed for back compatiblity\r\n let removeP = !$this.hasClass('kdr-grid-on-success-close-modal-do-not-remove')\r\n $control.find('.kdr-grid-save').click()\r\n\r\n $control.one(gridEvents.BEFORE_RENDER, function (event) {\r\n if (event.code == gridResponseCodes.SUCCESS && event.actionType == gridActions.UPDATE) {\r\n console.log(event.code);\r\n\r\n let $m = $this.closest('.modal')\r\n loading.show($this)\r\n\r\n if ($secondControl.find('.kdr-grid-save').length > 0) {\r\n $secondControl.find('.kdr-grid-save').click()\r\n $secondControl.one(gridEvents.BEFORE_RENDER, function (event) {\r\n loading.hide($this)\r\n\r\n if (event.code == gridResponseCodes.SUCCESS) {\r\n if (removeP) {\r\n modalHelper.removeModalFromBody($m)\r\n }\r\n else {\r\n $m.modal('hide')\r\n }\r\n }\r\n })\r\n }\r\n else {\r\n loading.hide($this)\r\n if (removeP) {\r\n modalHelper.removeModalFromBody($m)\r\n }\r\n else {\r\n $m.modal('hide')\r\n }\r\n }\r\n }\r\n })\r\n})\r\n$(document).on('click', '#btn-reveal', function () {\r\n $(\"#reveal-content\").toggleClass(\"hide-chores\");\r\n\r\n $('#btn-reveal .fa-angles-down').toggleClass('rotate-icon');\r\n});\r\n\r\n$(document).on('click', '#btn-reveal-second', function () {\r\n $(\"#reveal-content-second\").toggleClass(\"hide-chores\");\r\n\r\n $('#btn-reveal-second .fa-angles-down').toggleClass('rotate-icon');\r\n});\r\n\r\n$(document).on('click', '.backlog-remove-class-btn', function () {\r\n $(\".backlog-refresh-me\").removeClass(\"backlog-refresh-me\");\r\n});\r\n\r\n$(document).on('click', '.img-fullscreen-toggle img, .kdr-new-grid-toggle-row-html-container img , .raw-html img', function () {\r\n\r\n let $sourceImg = $(this);\r\n if ($sourceImg.length != 0) {\r\n let src = $sourceImg.attr('src');\r\n\r\n var overlay = document.createElement('div');\r\n overlay.id = 'overlay';\r\n\r\n var img = document.createElement('img');\r\n img.id = 'fullscreen-image';\r\n img.src = src;\r\n\r\n overlay.appendChild(img);\r\n document.body.appendChild(overlay);\r\n\r\n overlay.addEventListener('click', function () {\r\n document.body.removeChild(overlay);\r\n });\r\n }\r\n});\r\n\r\n$(document).on('click', '.backlog-add-task-button', function () {\r\n var parentGrid = $(this).closest('.kdr-grid')\r\n if (parentGrid.hasClass('kdr-grid') && !parentGrid.hasClass('backlog-refresh-me')) {\r\n parentGrid.addClass('backlog-refresh-me');\r\n }\r\n});\r\n\r\nlet filmName;\r\n\r\n$(document).on('click', '.attachement-picker .kdr-dropdown-w-search-item', function () {\r\n let $selectedFile = $(this).attr('title')\r\n let $modal = $(this).closest('.modal');\r\n let args = {}\r\n filmName = $selectedFile\r\n\r\n let $fileItem = $('.kdr-grid-file-item-text-container[title=\"' + $selectedFile + '\"]').closest('.kdr-grid-file-item');\r\n let $cointainer = $fileItem.closest('.kdr-grid-files-list , .kdr-grid-input-file-list')\r\n let $grid = $fileItem.closest('.kdr-grid').length == 0 ? controls.getControl($fileItem.closest('.modal').attr('for')) : $fileItem.closest('.kdr-grid')\r\n\r\n let $input = $modal.find('.kdr-grid-input.sprint-task-comment')\r\n\r\n controls.getArgs($input, args)\r\n\r\n controls.getLinkGridFile(controls.getInfo($grid), $cointainer.data('action'), $cointainer.data('index'), $fileItem.data('index'), $modal, (magic) => {\r\n var path = window.location.origin + __root + `Frax/GetFileByMagic?p=${magic}`;\r\n\r\n args[$input.data('index')] += '
' + filmName + '';\r\n\r\n controls.setArgs($input, args)\r\n })\r\n\r\n});\r\n\r\n$(document).on('refreshView', '#partialBacklogContainer', function (event) {\r\n let $container = $(this)\r\n let backlog_partial_path = window.location.origin + window.location.pathname + 'Partial' + window.location.search;\r\n $.ajax({\r\n type: \"GET\",\r\n url: backlog_partial_path,\r\n datatype: \"json\",\r\n traditional: true,\r\n success: function (response) {\r\n let $content = $($.parseHTML(response));\r\n\r\n $container.html($content)\r\n\r\n backlog.initializeDragAndDrop()\r\n },\r\n beforeSend: function () { loading.show($container) },\r\n complete: function () { loading.hide($container) }\r\n });\r\n})\r\n\r\n$(document).on('click', '.task-copy-no-w-topic', function () {\r\n let $btn = $(this)\r\n let $grid = $btn.closest('.kdr-grid')\r\n let taskNo = $grid.find('.task-no-to-copy').eq(0).text()\r\n let taskTopic = $grid.find('.task-topic-to-copy').eq(0).text()\r\n let text = `${taskNo} - ${taskTopic}`\r\n\r\n textHelper.copyTextToClipboard(text)\r\n .then(() => toastr.info(text, __l.CopiedTextToClipboard))\r\n})\r\n\r\n$(document).on('click', '.copy-feature-descriptions-to-clipboard', function () {\r\n let text = '';\r\n $('.copy-client-desc').not('.kdr-grid-item-update *').each(function () {\r\n const content = $(this).html().trim();\r\n if (content !== '') {\r\n text += content + '

';\r\n }\r\n });\r\n\r\n if (text !== '') {\r\n textHelper.copyHtmlToClipboard(text.replace(/ /g, ' '))\r\n .then(() => toastr.info('', __l.CopiedTextToClipboard))\r\n } else {\r\n toastr.error(__l.NoValueToCopy)\r\n }\r\n})\r\n\r\n$(document).on('click', '.kanban-context-menu-copy-cell-value', function () {\r\n let text = $(this).attr('data-p')\r\n\r\n textHelper.copyTextToClipboard(text)\r\n .then(() => toastr.info(text, __l.CopiedTextToClipboard))\r\n\r\n})\r\n\r\n\r\n$(document).on('click', '.task-add-helpdesk-save-refresh', function () {\r\n let $this = $(this)\r\n let controlId = $this.attr('control-id')\r\n let $control = controls.getControl(controlId, $this) //$this is passed for back compatiblity\r\n let $controlSecond = controls.getControl('helpdesk-report-details-grid')\r\n\r\n $control.one(gridEvents.BEFORE_RENDER, function (event) {\r\n $(document).one(gridEvents.AFTER_RENDER, '#helpdesk-report-details-grid', function (event) {\r\n $btn = $('.hide-after-update-helpdesk')\r\n $btn.remove()\r\n })\r\n if (event.code == gridResponseCodes.SUCCESS) {\r\n controls.refresh(null, 'helpdesk-report-details-grid', $this)\r\n }\r\n })\r\n})\r\n\r\n$(document).on('click', '.helpdesk-close-report', function () {\r\n let $this = $(this)\r\n let controlId = $this.attr('control-id')\r\n let $control = controls.getControl(controlId, $this) //$this is passed for back compatiblity\r\n let $controlSecond = controls.getControl('helpdesk-report-details-grid')\r\n\r\n $control.one(gridEvents.BEFORE_RENDER, function (event) {\r\n $(document).one(gridEvents.AFTER_RENDER, '#helpdesk-report-details-grid', function (event) {\r\n $btn = $('#helpdesk-report-details-grid .kdr-grid-item-buttons')\r\n $btn.remove()\r\n })\r\n if (event.code == gridResponseCodes.SUCCESS) {\r\n controls.refresh(null, 'helpdesk-report-details-grid', $this)\r\n }\r\n })\r\n})\r\n\r\n$(document).on('change', '.helpdesk-toggle', function () {\r\n let $elements = $('.helpdesk-to-hide').toggleClass('hide-tr')\r\n})\r\n\r\n\r\n\r\n\r\n/***********************/\r\n/* E-learning calendar */\r\n/***********************/\r\n$(document).on('click', '.elearning-month-number', function () {\r\n let day = $(this).find('div').attr('value')\r\n let $div = $('#calendar-events-container')\r\n\r\n let info = controls.getInfo(controls.getControl($(this).closest('.elearning-calendar').attr('id')))\r\n\r\n if (($(this).hasClass('elearning-month-selected'))) {\r\n let $removed = $('.elearning-month-number').removeClass('elearning-month-selected')\r\n day = null\r\n }\r\n else {\r\n let $removed = $('.elearning-month-number').removeClass('elearning-month-selected')\r\n $(this).addClass('elearning-month-selected')\r\n }\r\n\r\n $.ajax({\r\n url: window.location.origin + __root + 'Calendar/RenderEvents',\r\n type: 'POST',\r\n traditional: true,\r\n data: {\r\n \"i\": info,\r\n \"p\": day\r\n },\r\n success: function (response) {\r\n let $div = $('#calendar-events-container')\r\n $div.html(response)\r\n\r\n $.ajax({\r\n url: window.location.origin + __root + 'Calendar/GetChosenDate',\r\n type: 'POST',\r\n traditional: true,\r\n data: {\r\n \"i\": info,\r\n \"p\": day\r\n },\r\n success: function (response) {\r\n $('.calendar-date-picker').attr(\"value\", response)\r\n },\r\n error: function () {\r\n console.log('Błąd AJAX');\r\n }\r\n });\r\n },\r\n beforeSend: function () {\r\n loading.show($div)\r\n },\r\n complete: function () {\r\n loading.hide($div)\r\n },\r\n error: function () {\r\n console.log('Błąd AJAX');\r\n }\r\n });\r\n});\r\n$(document).on('click', '.calendar-button-month-back', function () {\r\n let info = controls.getInfo(controls.getControl($(this).closest('.elearning-calendar').attr('id')))\r\n let day = $('.elearning-first-day').find('div').attr('value')\r\n\r\n let $div = $(this).closest('.elearning-calendar')\r\n let control = controls.getControl($(this).closest('.elearning-calendar').attr('id'))\r\n\r\n $.ajax({\r\n url: window.location.origin + __root + 'Calendar/ChangeMonth',\r\n type: 'POST',\r\n traditional: true,\r\n data: {\r\n \"i\": info,\r\n \"direction\": -1\r\n },\r\n success: function (response) {\r\n controls.setInfo(control, response.newInfo)\r\n controls.refresh(control, null, null, 'Calendar/Render', null, ($refreshedControl) => {\r\n\r\n let info = controls.getInfo($refreshedControl)\r\n let day = $('.elearning-first-day').find('div').attr('value')\r\n let $div = $('.elearning-calendar')\r\n\r\n $.ajax({\r\n url: window.location.origin + __root + 'Calendar/RenderEvents',\r\n type: 'POST',\r\n traditional: true,\r\n data: {\r\n \"i\": info,\r\n \"p\": day\r\n },\r\n success: function (response) {\r\n let $div = $('#calendar-events-container')\r\n $div.html(response)\r\n },\r\n beforeSend: function () {\r\n loading.show($div)\r\n },\r\n complete: function () {\r\n let $removed = $('.elearning-month-number').removeClass('elearning-month-selected')\r\n $('.elearning-first-day').addClass('elearning-month-selected')\r\n pickers.initSingle.datePicker($('.calendar-date-picker'))\r\n $('.calendar-date-picker').attr(\"value\", response.date)\r\n loading.hide($div)\r\n },\r\n error: function () {\r\n console.log('Błąd AJAX');\r\n }\r\n });\r\n });\r\n },\r\n beforeSend: function () {\r\n loading.show($div)\r\n },\r\n complete: function () {\r\n },\r\n error: function () {\r\n loading.hide($div)\r\n console.log('Błąd AJAX');\r\n }\r\n });\r\n});\r\n$(document).on('click', '.calendar-button-month-forward', function () {\r\n let info = controls.getInfo(controls.getControl($(this).closest('.elearning-calendar').attr('id')))\r\n let day = $('.elearning-first-day').find('div').attr('value')\r\n\r\n let $div = $(this).closest('.elearning-calendar')\r\n let control = controls.getControl($(this).closest('.elearning-calendar').attr('id'))\r\n\r\n $.ajax({\r\n url: window.location.origin + __root + 'Calendar/ChangeMonth',\r\n type: 'POST',\r\n traditional: true,\r\n data: {\r\n \"i\": info,\r\n \"direction\": 1\r\n },\r\n success: function (response) {\r\n controls.setInfo(control, response.newInfo)\r\n controls.refresh(control, null, null, 'Calendar/Render', null, ($refreshedControl) => {\r\n\r\n let info = controls.getInfo($refreshedControl)\r\n let day = $('.elearning-first-day').find('div').attr('value')\r\n let $div = $('.elearning-calendar')\r\n\r\n $.ajax({\r\n url: window.location.origin + __root + 'Calendar/RenderEvents',\r\n type: 'POST',\r\n traditional: true,\r\n data: {\r\n \"i\": info,\r\n \"p\": day\r\n },\r\n success: function (response) {\r\n let $div = $('#calendar-events-container')\r\n $div.html(response)\r\n },\r\n beforeSend: function () {\r\n loading.show($div)\r\n },\r\n complete: function () {\r\n let $removed = $('.elearning-month-number').removeClass('elearning-month-selected')\r\n $('.elearning-first-day').addClass('elearning-month-selected')\r\n pickers.initSingle.datePicker($('.calendar-date-picker'))\r\n $('.calendar-date-picker').attr(\"value\", response.date)\r\n loading.hide($div)\r\n },\r\n error: function () {\r\n console.log('Błąd AJAX');\r\n }\r\n });\r\n });\r\n },\r\n beforeSend: function () {\r\n loading.show($div)\r\n },\r\n complete: function () {\r\n },\r\n error: function () {\r\n loading.hide($div)\r\n console.log('Błąd AJAX');\r\n }\r\n });\r\n});\r\n$(document).on('change', '.calendar-date-picker', function () {\r\n let info = controls.getInfo(controls.getControl($(this).closest('.elearning-calendar').attr('id')))\r\n\r\n let $div = $(this).closest('.elearning-calendar')\r\n let control = controls.getControl($(this).closest('.elearning-calendar').attr('id'))\r\n\r\n let date = $(this).val()\r\n\r\n $.ajax({\r\n url: window.location.origin + __root + 'Calendar/ChangeDate',\r\n type: 'POST',\r\n traditional: true,\r\n data: {\r\n \"i\": info,\r\n \"date\": date\r\n },\r\n success: function (response) {\r\n controls.setInfo(control, response)\r\n controls.refresh(control, null, null, 'Calendar/Render', null, ($refreshedControl) => {\r\n\r\n var dt = new Date(date)\r\n let info = controls.getInfo($refreshedControl)\r\n let $div2 = $('.elearning-calendar')\r\n\r\n $.ajax({\r\n url: window.location.origin + __root + 'Calendar/RenderEvents',\r\n type: 'POST',\r\n traditional: true,\r\n data: {\r\n \"i\": info,\r\n \"p\": $('.' + dt.getDate()).find('div').attr('value')\r\n },\r\n success: function (response) {\r\n let $div = $('#calendar-events-container')\r\n $div.html(response)\r\n },\r\n beforeSend: function () {\r\n loading.show($div2)\r\n },\r\n complete: function () {\r\n let $removed = $('.elearning-month-number').removeClass('elearning-month-selected')\r\n $('.' + dt.getDate()).addClass('elearning-month-selected')\r\n pickers.initSingle.datePicker($('.calendar-date-picker'))\r\n $('.calendar-date-picker').attr(\"value\", date)\r\n loading.hide($div2)\r\n },\r\n error: function () {\r\n console.log('Błąd AJAX');\r\n }\r\n });\r\n });\r\n },\r\n beforeSend: function () {\r\n loading.show($div)\r\n },\r\n complete: function () {\r\n },\r\n error: function () {\r\n loading.hide($div)\r\n console.log('Błąd AJAX');\r\n }\r\n });\r\n});\r\n$(document).on('click', '.calendar-return', function () {\r\n let info = controls.getInfo(controls.getControl($(this).closest('.elearning-calendar').attr('id')))\r\n\r\n let $div = $(this).closest('.elearning-calendar')\r\n let control = controls.getControl($(this).closest('.elearning-calendar').attr('id'))\r\n\r\n $.ajax({\r\n url: window.location.origin + __root + 'Calendar/Return',\r\n type: 'POST',\r\n traditional: true,\r\n data: {\r\n \"i\": info\r\n },\r\n success: function (response) {\r\n controls.setInfo(control, response.newInfo)\r\n controls.refresh(control, null, null, 'Calendar/Render', null, ($refreshedControl) => {\r\n\r\n let info = controls.getInfo($refreshedControl)\r\n let $div2 = $('.elearning-calendar')\r\n\r\n $.ajax({\r\n url: window.location.origin + __root + 'Calendar/RenderEvents',\r\n type: 'POST',\r\n traditional: true,\r\n data: {\r\n \"i\": info,\r\n \"p\": $('.elearning-month-selected').find('div').attr('value')\r\n },\r\n success: function (response) {\r\n let $div = $('#calendar-events-container')\r\n $div.html(response)\r\n },\r\n beforeSend: function () {\r\n loading.show($div2)\r\n },\r\n complete: function () {\r\n pickers.initSingle.datePicker($('.calendar-date-picker'))\r\n $('.calendar-date-picker').attr(\"value\", response.date)\r\n loading.hide($div2)\r\n },\r\n error: function () {\r\n console.log('Błąd AJAX');\r\n }\r\n });\r\n });\r\n },\r\n beforeSend: function () {\r\n loading.show($div)\r\n },\r\n complete: function () {\r\n },\r\n error: function () {\r\n loading.hide($div)\r\n console.log('Błąd AJAX');\r\n }\r\n });\r\n});\r\n\r\n/*************************/\r\n/* E-learning fancy tile */\r\n/*************************/\r\n\r\n$(document).on('click', '.fancy-tile-zoom-btn, .fancy-tile-zoom-link', function () {\r\n modalHelper.getModal('FancyTile/ShowZoom', { info: controls.getInfo(controls.getControl($(this).closest('.fancy-tile-body').attr('id'))) })\r\n});\r\n\r\n/************************/\r\n/* CourseSectionCreator */\r\n/************************/\r\n\r\n$(document).on('click', '.course-section-creator-add', function () {\r\n modalHelper.getModal('CourseSectionCreator/AddTemplate', { info: controls.getInfo(controls.getControl($(this).closest('.course-section-creator').attr('id'))) })\r\n});\r\n\r\n$(document).on('click', '.edit-template-btn', function () {\r\n modalHelper.getModal('CourseSectionCreator/EditTemplate', { info: controls.getInfo(controls.getControl($(this).closest('.course-section-creator').attr('id'))), p: $(this).attr('data-p') })\r\n});\r\n\r\n$(document).on(gridEvents.AFTER_RENDER, '#add-template', function () {\r\n let sourceControl = controls.getControl('add-template');\r\n let targetControl = controls.getControl('course-section-creator');\r\n\r\n $.ajax({\r\n type: \"POST\",\r\n url: window.location.origin + __root + 'CourseSectionCreator/GetPayloadFromModal',\r\n datatype: \"json\",\r\n traditional: true,\r\n data: {\r\n sourceInfo: controls.getInfo(sourceControl),\r\n targetInfo: controls.getInfo(targetControl)\r\n },\r\n success: function (response) {\r\n if (response != null) {\r\n modalHelper.removeModalFromBody($('#add-template-modal'))\r\n controls.setInfo(targetControl, response);\r\n controls.refresh(targetControl, null, null, 'CourseSectionCreator/Render');\r\n }\r\n }\r\n })\r\n})\r\n$(document).on(gridEvents.AFTER_RENDER, '#edit-template', function () {\r\n let sourceControl = controls.getControl('edit-template');\r\n let targetControl = controls.getControl('course-section-creator');\r\n\r\n $.ajax({\r\n type: \"POST\",\r\n url: window.location.origin + __root + 'CourseSectionCreator/GetPayloadFromModal',\r\n datatype: \"json\",\r\n traditional: true,\r\n data: {\r\n sourceInfo: controls.getInfo(sourceControl),\r\n targetInfo: controls.getInfo(targetControl)\r\n },\r\n success: function (response) {\r\n if (response != null) {\r\n modalHelper.removeModalFromBody($('#edit-template-modal'))\r\n controls.setInfo(targetControl, response);\r\n controls.refresh(targetControl, null, null, 'CourseSectionCreator/Render');\r\n }\r\n }\r\n })\r\n})"],"file":"core.js"}