{"version":3,"sources":["AX6UIGrid.js"],"names":["_jqmin","require","_AX6UICore2","_AX6Util","_AX6Info","_AX6Mustache","_AX6UIGrid_data","_AX6UIGrid_header","_AX6UIGrid_body","_AX6UIGrid_scroller","_AX6UIGrid_page","_AX6UIGrid_tmpl","_AX6UIGrid_util","formatter","collector","ctrlKeys","33","34","35","36","37","38","39","40","tmpl","initGrid","data","instanceId","this","id","$target","html","_AX6Mustache2","default","render","__tmpl","main","call","$","container","hidden","find","root","header","body","page","scroller","panel","aside-header","left-header","header-scroll","right-header","top-aside-body","top-left-body","top-body","top-body-scroll","top-right-body","aside-body","aside-body-scroll","left-body","left-body-scroll","body-scroll","right-body","bottom-body","bottom-body-scroll","bottom-right-body","livePanelKeys","vertical","vertical-bar","horizontal","corner","navigation","form","clipboard","resizer","height","config","_height","initColumns","_columns","_AX6Util2","isArray","columns","deepCopy","headerTable","_AX6UIGrid_util2","xvar","frozenColumnIndex","bodyRowTable","bodyRowMap","makeBodyRowMap","bodyTrHeight","rows","length","columnHeight","colGroupMap","r","rl","row","c","cl","cols","colIndex","extend","colGroup","k","push","onResetColumns","resetColGroupWidth","footSum","initFootSum","needToPaintSum","grouping","initBodyGroup","alignGrid","_AX6UIGrid_header2","repaint","_AX6UIGrid_body2","_AX6UIGrid_scroller2","resize","_this","CT_WIDTH","width","showLineNumber","lineNumberColumnWidth","showRowSelector","rowSelectorColumnWidth","size","totalWidth","computedWidth","autoWidthColgroupIndexs","i","l","_width","makeHeaderTable","makeBodyRowTable","_footSum","makeFootSumTable","footSumColumns","footSumTable","_grouping","by","bodyGroupingTable","makeBodyGroupingTable","bodyGrouping","sortInfo","kl","orderBy","seq","key","sort","sortFixed","_isFirst","_this2","proxyList","list","Math","min","innerHeight","css","right","CT_INNER_HEIGHT","frozenPanelWidth","endIndex","horizontalScrollerHeight","bodyHeight","footSumHeight","headerHeight","display","pageHeight","fixed","bodyWidth","totalColGroupWidth","verticalScrollerWidth","CT_HEIGHT","CT_INNER_WIDTH","innerWidth","panelDisplayProcess","vPosition","hPosition","containerType","isHide","frozenRowHeight","asidePanelWidth","frozenRowIndex","rightSum","scrollerDisplayProcess","scrollerWidth","scrollerHeight","isFunction","remoteSort","_sortInfo","that","a","b","_AX6UIGrid_data2","initData","clearGroupingData","AX6UIGrid","_this3","theme","animateTime","debounceTime","appendDebouncer","appendDebounceTimes","appendProgressIcon","appendProgress","multipleSelect","virtualScrollY","virtualScrollX","virtualScrollYCountMargin","virtualScrollAccelerated","virtualScrollAcceleratedDelayTime","columnMinWidth","sortable","undefined","align","columnPadding","columnBorderWidth","mergeCells","statusDisplay","navigationItemCount","barMinSize","trackPadding","columnKeys","selected","modified","deleted","disableSelection","tree","use","hashDigit","indentWidth","arrowWidth","iconWidth","icons","openedArrow","selfKey","collapse","_jqmin2","collapsedArrow","selectedColumn","depth","contextMenu","scrollTimer","headerData","rightHeaderData","leftBodyRowData","bodyRowData","rightBodyRowData","leftBodyGroupingData","bodyGroupingData","rightBodyGroupingData","bodyGroupingMap","leftFootSumData","footSumData","customFormatter","getFormatter","customCollector","getCollector","Object","assign","_AX6UIGrid_tmpl2","getTmpl","init","_ret","_possibleConstructorReturn","_formatter","_collector","_tmpl","_this4","onStateChanged","onLoad","initOnce","target","isObject","error","parseJson","attr","selfHash","window","off","on","throttle","e","bind","focused","isInlineEditing","which","_AX6Info2","eventKeys","ESC","RETURN","keyDown","originalEvent","TAB","stopEvent","UP","shiftKey","DOWN","ctrlKey","self","copySelect","blur","SPACE","keys","focusedColumn","document","isPickerClick","findParentNode","_target","getAttribute","setTimeout","initialized","metaKey","_act","_data","processor","KEY_UP","moveFocus","KEY_DOWN","KEY_LEFT","KEY_RIGHT","KEY_HOME","KEY_END","INLINE_EDIT","_e","inlineEdit","test","keydown","columnKey","inlineEditing","activeEditLength","copysuccess","$clipBoard","copyTextArray","copyText","_rowIndex","_dindex","_di","_column","dindex","rowIndex","originalColumn","__isGrouping","join","get","innerText","select","execCommand","isFirstPaint","paintStartRowIndex","set","_colIndex","scrollTo","top","_AX6UIGrid_page2","navigationUpdate","getList","_type","_row","_options","add","focus","_list","append","remove","update","repaintRow","_updateData","updateChild","paintStartColumnIndex","deleteRow","_key","_value","setValue","doindex","repaintCell","_panelName","_rows","__dindex","__doindex","__key","__value","_cindex","first","concat","last","isNumber","_i","_l","splice","columnResizerIndex","sortColumns","_selectObject","selectedClear","clearSelect","updateRowState","click","dblClick","selectAll","updateRowStateAll","table","getExcelString","_fileName","EXCEL","export","_pos","selectedDataIndexs","selectedIndex","HOME","END","empty"],"mappings":"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","file":"AX6UIGrid.js","sourcesContent":["import jQuery from \"jqmin\";\nimport AX6UICore from \"./AX6UICore.js\";\nimport U from \"./AX6Util\";\nimport info from \"./AX6Info\";\nimport mustache from \"./AX6Mustache\";\nimport DATA from \"./AX6UIGrid/AX6UIGrid_data\";\nimport HEADER from \"./AX6UIGrid/AX6UIGrid_header\";\nimport BODY from \"./AX6UIGrid/AX6UIGrid_body\";\nimport SCROLLER from \"./AX6UIGrid/AX6UIGrid_scroller\";\nimport PAGE from \"./AX6UIGrid/AX6UIGrid_page\";\nimport TMPL from \"./AX6UIGrid/AX6UIGrid_tmpl\";\nimport UTIL from \"./AX6UIGrid/AX6UIGrid_util\";\n\n/* ~~~~~~~~~~~~~~~~~~ end of import  ~~~~~~~~~~~~~~~~~~~~ */\n\nlet formatter = {};\nlet collector = {};\nlet ctrlKeys = {\n  \"33\": \"KEY_PAGEUP\",\n  \"34\": \"KEY_PAGEDOWN\",\n  \"35\": \"KEY_END\",\n  \"36\": \"KEY_HOME\",\n  \"37\": \"KEY_LEFT\",\n  \"38\": \"KEY_UP\",\n  \"39\": \"KEY_RIGHT\",\n  \"40\": \"KEY_DOWN\"\n};\nlet tmpl = {};\n\nconst initGrid = function () {\n  // 그리드 템플릿에 전달하고자 하는 데이터를 정리합시다.\n\n  let data = {\n    instanceId: this.id\n  };\n\n  this.$target.html(mustache.render(this.__tmpl.main.call(this), data));\n\n  // 그리드 패널 프레임의 각 엘리먼트를 캐쉬합시다.\n  this.$ = {\n    \"container\": {\n      \"hidden\": this.$target.find('[data-ax6grid-container=\"hidden\"]'),\n      \"root\": this.$target.find('[data-ax6grid-container=\"root\"]'),\n      \"header\": this.$target.find('[data-ax6grid-container=\"header\"]'),\n      \"body\": this.$target.find('[data-ax6grid-container=\"body\"]'),\n      \"page\": this.$target.find('[data-ax6grid-container=\"page\"]'),\n      \"scroller\": this.$target.find('[data-ax6grid-container=\"scroller\"]')\n    },\n    \"panel\": {\n      \"aside-header\": this.$target.find('[data-ax6grid-panel=\"aside-header\"]'),\n      \"left-header\": this.$target.find('[data-ax6grid-panel=\"left-header\"]'),\n      \"header\": this.$target.find('[data-ax6grid-panel=\"header\"]'),\n      \"header-scroll\": this.$target.find('[data-ax6grid-panel-scroll=\"header\"]'),\n      \"right-header\": this.$target.find('[data-ax6grid-panel=\"right-header\"]'),\n      \"top-aside-body\": this.$target.find('[data-ax6grid-panel=\"top-aside-body\"]'),\n      \"top-left-body\": this.$target.find('[data-ax6grid-panel=\"top-left-body\"]'),\n      \"top-body\": this.$target.find('[data-ax6grid-panel=\"top-body\"]'),\n      \"top-body-scroll\": this.$target.find('[data-ax6grid-panel-scroll=\"top-body\"]'),\n      \"top-right-body\": this.$target.find('[data-ax6grid-panel=\"top-right-body\"]'),\n      \"aside-body\": this.$target.find('[data-ax6grid-panel=\"aside-body\"]'),\n      \"aside-body-scroll\": this.$target.find('[data-ax6grid-panel-scroll=\"aside-body\"]'),\n      \"left-body\": this.$target.find('[data-ax6grid-panel=\"left-body\"]'),\n      \"left-body-scroll\": this.$target.find('[data-ax6grid-panel-scroll=\"left-body\"]'),\n      \"body\": this.$target.find('[data-ax6grid-panel=\"body\"]'),\n      \"body-scroll\": this.$target.find('[data-ax6grid-panel-scroll=\"body\"]'),\n      \"right-body\": this.$target.find('[data-ax6grid-panel=\"right-body\"]'),\n      \"right-body-scroll\": this.$target.find('[data-ax6grid-panel-scroll=\"right-body\"]'),\n      \"bottom-aside-body\": this.$target.find('[data-ax6grid-panel=\"bottom-aside-body\"]'),\n      \"bottom-left-body\": this.$target.find('[data-ax6grid-panel=\"bottom-left-body\"]'),\n      \"bottom-body\": this.$target.find('[data-ax6grid-panel=\"bottom-body\"]'),\n      \"bottom-body-scroll\": this.$target.find('[data-ax6grid-panel-scroll=\"bottom-body\"]'),\n      \"bottom-right-body\": this.$target.find('[data-ax6grid-panel=\"bottom-right-body\"]')\n    },\n    \"livePanelKeys\": [], // 현재 사용중인 패널들 (grid-body repaint에서 수집하여 처리)\n    \"scroller\": {\n      \"vertical\": this.$target.find('[data-ax6grid-scroller=\"vertical\"]'),\n      \"vertical-bar\": this.$target.find('[data-ax6grid-scroller=\"vertical-bar\"]'),\n      \"horizontal\": this.$target.find('[data-ax6grid-scroller=\"horizontal\"]'),\n      \"horizontal-bar\": this.$target.find('[data-ax6grid-scroller=\"horizontal-bar\"]'),\n      \"corner\": this.$target.find('[data-ax6grid-scroller=\"corner\"]')\n    },\n    \"page\": {\n      \"navigation\": this.$target.find('[data-ax6grid-page=\"navigation\"]'),\n      \"status\": this.$target.find('[data-ax6grid-page=\"status\"]')\n    },\n    \"form\": {\n      \"clipboard\": this.$target.find('[data-ax6grid-form=\"clipboard\"]')\n    },\n    \"resizer\": {\n      \"vertical\": this.$target.find('[data-ax6grid-resizer=\"vertical\"]'),\n      \"horizontal\": this.$target.find('[data-ax6grid-resizer=\"horizontal\"]')\n    }\n  };\n\n  this.$[\"container\"][\"root\"].css({height: this.config.height || this.config._height});\n\n  return this;\n};\nconst initColumns = function (_columns) {\n  if (!U.isArray(_columns)) _columns = [];\n  this.columns = U.deepCopy(_columns);\n  this.headerTable = UTIL.makeHeaderTable.call(this, this.columns);\n  this.xvar.frozenColumnIndex = this.config.frozenColumnIndex || 0;\n\n  this.bodyRowTable = UTIL.makeBodyRowTable.call(this, this.columns);\n  this.bodyRowMap = UTIL.makeBodyRowMap.call(this, this.bodyRowTable);\n  // 바디에 표현될 한줄의 높이를 계산합니다.\n  this.xvar.bodyTrHeight = this.bodyRowTable.rows.length * this.config.body.columnHeight;\n\n  let colGroupMap = {};\n  for (let r = 0, rl = this.headerTable.rows.length; r < rl; r++) {\n    let row = this.headerTable.rows[r];\n    for (let c = 0, cl = row.cols.length; c < cl; c++) {\n      colGroupMap[row.cols[c].colIndex] = jQuery.extend({}, row.cols[c]);\n    }\n  }\n\n  this.colGroup = [];\n  for (var k in colGroupMap) {\n    this.colGroup.push(colGroupMap[k]);\n  }\n\n  return this;\n};\nconst onResetColumns = function () {\n  initColumns.call(this, this.config.columns);\n  resetColGroupWidth.call(this);\n  if (this.config.footSum) {\n    initFootSum.call(this, this.config.footSum);\n    this.needToPaintSum = true;\n  }\n  if (this.config.body.grouping) initBodyGroup.call(this, this.config.body.grouping);\n  alignGrid.call(this, true);\n  HEADER.repaint.call(this, true);\n  BODY.repaint.call(this, true);\n  SCROLLER.resize.call(this);\n};\nconst resetColGroupWidth = function () {\n  /// !! 그리드 target의 크기가 변경되면 이 함수를 호출하려 this.colGroup의 _width 값을 재 계산 하여야 함. [tom]\n  let CT_WIDTH                                               = this.$[\"container\"][\"root\"].width() - (() => {\n        let width = 0;\n        if (this.config.showLineNumber) width += this.config.lineNumberColumnWidth;\n        if (this.config.showRowSelector) width += this.config.rowSelectorColumnWidth;\n        width += this.config.scroller.size;\n        return width;\n      })(),\n      totalWidth = 0, computedWidth, autoWidthColgroupIndexs = [],\n      colGroup                                               = this.colGroup,\n      i, l;\n\n  for (i = 0, l = colGroup.length; i < l; i++) {\n    if (U.isNumber(colGroup[i].width)) {\n      totalWidth += colGroup[i]._width = colGroup[i].width;\n    } else if (colGroup[i].width === \"*\") {\n      autoWidthColgroupIndexs.push(i);\n    } else if (U.right(colGroup[i].width, 1) === \"%\") {\n      totalWidth += colGroup[i]._width = CT_WIDTH * U.left(colGroup[i].width, \"%\") / 100;\n    }\n  }\n  if (autoWidthColgroupIndexs.length > 0) {\n    computedWidth = (CT_WIDTH - totalWidth) / autoWidthColgroupIndexs.length;\n    for (i = 0, l = autoWidthColgroupIndexs.length; i < l; i++) {\n      colGroup[autoWidthColgroupIndexs[i]]._width = computedWidth;\n    }\n  }\n};\nconst initFootSum = function (_footSum) {\n  if (U.isArray(_footSum)) {\n    this.footSumTable = UTIL.makeFootSumTable.call(this, this.footSumColumns = _footSum);\n  } else {\n    this.footSumColumns = [];\n    this.footSumTable = {};\n  }\n};\nconst initBodyGroup = function (_grouping) {\n  let grouping = jQuery.extend({}, _grouping);\n  if (\"by\" in grouping && \"columns\" in grouping) {\n    this.bodyGrouping = {\n      by: grouping.by,\n      columns: grouping.columns\n    };\n    this.bodyGroupingTable = UTIL.makeBodyGroupingTable.call(this, this.bodyGrouping.columns);\n    this.sortInfo = (function () {\n      let sortInfo = {};\n      for (let k = 0, kl = this.bodyGrouping.by.length; k < kl; k++) {\n        sortInfo[this.bodyGrouping.by[k]] = {\n          orderBy: \"asc\",\n          seq: k,\n          fixed: true\n        };\n        for (let c = 0, cl = this.colGroup.length; c < cl; c++) {\n          if (this.colGroup[c].key === this.bodyGrouping.by[k]) {\n            this.colGroup[c].sort = \"asc\";\n            this.colGroup[c].sortFixed = true;\n          }\n        }\n      }\n      return sortInfo;\n    }).call(this);\n  } else {\n    this.config.body.grouping = false;\n  }\n};\nconst alignGrid = function (_isFirst) {\n  let list = (this.proxyList) ? this.proxyList : this.list;\n  // 대상이 크기가 컬럼의 최소 크기 보다 작업 금지\n  if (Math.min(this.$target.innerWidth(), this.$target.innerHeight()) < 5) {\n    return false;\n  }\n\n  if (!this.config.height) {\n    this.$[\"container\"][\"root\"].css({height: this.config._height = this.$target.height()});\n  }\n\n  let CT_WIDTH        = this.$[\"container\"][\"root\"].width(),\n      CT_HEIGHT       = this.$[\"container\"][\"root\"].height(),\n      CT_INNER_WIDTH  = CT_WIDTH,\n      CT_INNER_HEIGHT = CT_HEIGHT,\n      asidePanelWidth = this.config.asidePanelWidth = (() => {\n        let width = 0;\n        if (this.config.showLineNumber) width += this.config.lineNumberColumnWidth;\n        if (this.config.showRowSelector) width += this.config.rowSelectorColumnWidth;\n        return width;\n      })(),\n      frozenPanelWidth = this.config.frozenPanelWidth = ((colGroup, endIndex) => {\n        let width = 0;\n        for (let i = 0, l = endIndex; i < l; i++) {\n          width += colGroup[i]._width;\n        }\n        return width;\n      })(this.colGroup, this.config.frozenColumnIndex),\n      verticalScrollerWidth, horizontalScrollerHeight, bodyHeight;\n\n  // todo : 우측 함계컬럼 너비 계산\n  let rightPanelWidth = 0,\n      frozenRowHeight = this.config.frozenRowIndex * this.xvar.bodyTrHeight,\n      footSumHeight   = this.footSumColumns.length * this.xvar.bodyTrHeight,\n      headerHeight    = (this.config.header.display) ? this.headerTable.rows.length * this.config.header.columnHeight : 0,\n      pageHeight      = (this.config.page.display) ? this.config.page.height : 0;\n\n  {\n    verticalScrollerWidth = ((CT_HEIGHT - headerHeight - pageHeight - footSumHeight) < list.length * this.xvar.bodyTrHeight) ? this.config.scroller.size : 0;\n    // 남은 너비가 colGroup의 너비보다 넓을때. 수평 스크롤 활성화.\n    horizontalScrollerHeight = (() => {\n      let totalColGroupWidth = 0;\n      // aside 빼고 너비\n      // 수직 스크롤이 있으면 또 빼고 비교\n      let bodyWidth = CT_WIDTH - asidePanelWidth - verticalScrollerWidth;\n      for (let i = 0, l = this.colGroup.length; i < l; i++) {\n        totalColGroupWidth += this.colGroup[i]._width;\n      }\n      return (totalColGroupWidth > bodyWidth) ? this.config.scroller.size : 0;\n    })();\n\n    if (horizontalScrollerHeight > 0) {\n      verticalScrollerWidth = ((CT_HEIGHT - headerHeight - pageHeight - footSumHeight - horizontalScrollerHeight) < list.length * this.xvar.bodyTrHeight) ? this.config.scroller.size : 0;\n    }\n  }\n\n  // 수평 너비 결정\n  CT_INNER_WIDTH = CT_WIDTH - verticalScrollerWidth;\n  // 수직 스크롤러의 높이 결정.\n  CT_INNER_HEIGHT = CT_HEIGHT - pageHeight - horizontalScrollerHeight;\n\n  bodyHeight = CT_INNER_HEIGHT - headerHeight;\n\n  const panelDisplayProcess = function (panel, vPosition, hPosition, containerType) {\n    let css    = {\n          display: \"block\"\n        },\n        isHide = false;\n\n    switch (hPosition) {\n      case \"aside\":\n        if (asidePanelWidth === 0) {\n          isHide = true;\n        } else {\n          css[\"left\"] = 0;\n          css[\"width\"] = asidePanelWidth;\n        }\n        break;\n      case \"left\":\n        if (this.config.frozenColumnIndex === 0) {\n          isHide = true;\n        } else {\n          css[\"left\"] = asidePanelWidth;\n          css[\"width\"] = frozenPanelWidth;\n        }\n        break;\n      case \"right\":\n        if (!this.config.rightSum) {\n          isHide = true;\n        } else {\n\n        }\n        break;\n      default:\n        if (containerType !== \"page\") {\n          if (this.config.frozenColumnIndex === 0) {\n            css[\"left\"] = asidePanelWidth;\n          } else {\n            css[\"left\"] = frozenPanelWidth + asidePanelWidth;\n          }\n          css[\"width\"] = CT_INNER_WIDTH - asidePanelWidth - frozenPanelWidth - rightPanelWidth;\n        }\n        break;\n    }\n\n    if (isHide) {\n      panel.css({display: \"none\"});\n      // 프로세스 중지\n      return this;\n    }\n\n    if (containerType === \"body\") {\n      switch (vPosition) {\n        case \"top\":\n          if (this.config.frozenRowIndex == 0) {\n            isHide = true;\n          } else {\n            css[\"top\"] = 0;\n            css[\"height\"] = frozenRowHeight;\n          }\n          break;\n        case \"bottom\":\n          if (!this.config.footSum) {\n            isHide = true;\n          } else {\n            css[\"top\"] = bodyHeight - footSumHeight;\n            css[\"height\"] = footSumHeight; // footSum height\n          }\n          break;\n        default:\n          css[\"top\"] = frozenRowHeight;\n          css[\"height\"] = bodyHeight - frozenRowHeight - footSumHeight;\n\n          break;\n      }\n    } else if (containerType === \"header\") {\n      css[\"height\"] = headerHeight;\n    } else if (containerType === \"page\") {\n      if (pageHeight == 0) {\n        isHide = true;\n      } else {\n        css[\"height\"] = pageHeight;\n\n      }\n    }\n\n    if (isHide) {\n      panel.css({display: \"none\"});\n      // 프로세스 중지\n      return this;\n    }\n\n    panel.css(css);\n    return this;\n  };\n  const scrollerDisplayProcess = function (panel, scrollerWidth, scrollerHeight, containerType) {\n    let css    = {\n          display: \"block\"\n        },\n        isHide = false;\n\n    switch (containerType) {\n      case \"vertical\":\n        if (scrollerWidth > 0) {\n          css[\"width\"] = scrollerWidth;\n          css[\"height\"] = CT_INNER_HEIGHT;\n          css[\"bottom\"] = scrollerHeight + pageHeight;\n        } else {\n          isHide = true;\n        }\n        break;\n      case \"horizontal\":\n        if (scrollerHeight > 0) {\n          css[\"width\"] = CT_INNER_WIDTH;\n          css[\"height\"] = scrollerHeight;\n          css[\"right\"] = scrollerWidth;\n          css[\"bottom\"] = pageHeight;\n        } else {\n          isHide = true;\n        }\n        break;\n      case \"corner\":\n        if (scrollerWidth > 0 && scrollerHeight > 0) {\n          css[\"width\"] = scrollerWidth;\n          css[\"height\"] = scrollerHeight;\n          css[\"bottom\"] = pageHeight;\n        } else {\n          isHide = true;\n        }\n        break;\n    }\n\n    if (isHide) {\n      panel.css({display: \"none\"});\n      // 프로세스 중지\n      return this;\n    }\n\n    panel.css(css);\n  };\n\n  this.$[\"container\"][\"header\"].css({height: headerHeight});\n  this.$[\"container\"][\"body\"].css({height: bodyHeight});\n\n  // 각 패널들의 크기 표시여부를 결정합니다\n  panelDisplayProcess.call(this, this.$[\"panel\"][\"aside-header\"], \"\", \"aside\", \"header\");\n  panelDisplayProcess.call(this, this.$[\"panel\"][\"left-header\"], \"\", \"left\", \"header\");\n  panelDisplayProcess.call(this, this.$[\"panel\"][\"header\"], \"\", \"\", \"header\");\n  panelDisplayProcess.call(this, this.$[\"panel\"][\"right-header\"], \"\", \"right\", \"header\");\n\n  panelDisplayProcess.call(this, this.$[\"panel\"][\"top-aside-body\"], \"top\", \"aside\", \"body\");\n  panelDisplayProcess.call(this, this.$[\"panel\"][\"top-left-body\"], \"top\", \"left\", \"body\");\n  panelDisplayProcess.call(this, this.$[\"panel\"][\"top-body\"], \"top\", \"\", \"body\");\n  panelDisplayProcess.call(this, this.$[\"panel\"][\"top-right-body\"], \"top\", \"right\", \"body\");\n\n  panelDisplayProcess.call(this, this.$[\"panel\"][\"aside-body\"], \"\", \"aside\", \"body\");\n  panelDisplayProcess.call(this, this.$[\"panel\"][\"left-body\"], \"\", \"left\", \"body\");\n  panelDisplayProcess.call(this, this.$[\"panel\"][\"body\"], \"\", \"\", \"body\");\n  panelDisplayProcess.call(this, this.$[\"panel\"][\"right-body\"], \"\", \"right\", \"body\");\n\n  panelDisplayProcess.call(this, this.$[\"panel\"][\"bottom-aside-body\"], \"bottom\", \"aside\", \"body\");\n  panelDisplayProcess.call(this, this.$[\"panel\"][\"bottom-left-body\"], \"bottom\", \"left\", \"body\");\n  panelDisplayProcess.call(this, this.$[\"panel\"][\"bottom-body\"], \"bottom\", \"\", \"body\");\n  panelDisplayProcess.call(this, this.$[\"panel\"][\"bottom-right-body\"], \"bottom\", \"right\", \"body\");\n\n\n  scrollerDisplayProcess.call(this, this.$[\"scroller\"][\"vertical\"], verticalScrollerWidth, horizontalScrollerHeight, \"vertical\");\n  scrollerDisplayProcess.call(this, this.$[\"scroller\"][\"horizontal\"], verticalScrollerWidth, horizontalScrollerHeight, \"horizontal\");\n  scrollerDisplayProcess.call(this, this.$[\"scroller\"][\"corner\"], verticalScrollerWidth, horizontalScrollerHeight, \"corner\");\n\n  panelDisplayProcess.call(this, this.$[\"container\"][\"page\"], \"\", \"\", \"page\");\n\n  // 각 패널의 사이즈 결정\n  /// 다른 패널의 사이즈 정보가 필요한 경우 여기서 정의해주고 사용함.\n  this.xvar.bodyHeight = this.$.panel[\"body\"].height();\n  this.xvar.bodyWidth = this.$.panel[\"body\"].width();\n  // scrollContentWidth 는 grid-header repaint에서 결정합니다. 까먹지 맙시다. > this.xvar.scrollContentWidth\n\n  return true;\n};\nconst sortColumns = function (_sortInfo) {\n  HEADER.repaint.call(this);\n\n  if (U.isFunction(this.config.remoteSort)) {\n    let that = {sortInfo: []};\n    for (let k in _sortInfo) {\n      that.sortInfo.push({\n        key: k,\n        orderBy: _sortInfo[k].orderBy,\n        seq: _sortInfo[k].seq\n      });\n    }\n    that.sortInfo.sort(function (a, b) {\n      return a.seq > b.seq;\n    });\n    this.config.remoteSort.call(that, that);\n  } else {\n    if (this.config.body.grouping) {\n      this.list = DATA.initData.call(this,\n        DATA.sort.call(this,\n          _sortInfo,\n          DATA.clearGroupingData.call(this,\n            this.list\n          )\n        )\n      );\n    }\n    else {\n      this.list = DATA.sort.call(this, _sortInfo,\n        DATA.clearGroupingData.call(this,\n          this.list\n        ),\n        {resetLineNumber: true}\n      );\n    }\n    BODY.repaint.call(this, true);\n    SCROLLER.resize.call(this);\n  }\n};\n\n/* ~~~~~~~~~~~~~~~~~~ end of private  ~~~~~~~~~~~~~~~~~~~~ */\n\n/**\n * @class\n */\nclass AX6UIGrid extends AX6UICore {\n\n  /**\n   * @static\n   * @param _formatter\n   */\n  static setFormatter(_formatter) {\n    return formatter = Object.assign(formatter, _formatter);\n  }\n\n  /**\n   * @static\n   * @return {Object}\n   */\n  static getFormatter() {\n    return formatter || {};\n  }\n\n  /**\n   * @static\n   * @param _collector\n   * @return {collector}\n   */\n  static setCollector(_collector) {\n    return collector = Object.assign(collector, _collector);\n  }\n\n  /**\n   * @static\n   * @return {collector}\n   */\n  static getCollector() {\n    return collector || {};\n  }\n\n  /**\n   * @static\n   * @param _tmpl\n   * @return {tmpl}\n   */\n  static setTmpl(_tmpl) {\n    return tmpl = Object.assign(tmpl, _tmpl);\n  }\n\n  /**\n   * @static\n   * @return {tmpl}\n   */\n  static getTmpl() {\n    return tmpl || {};\n  }\n\n  /**\n   * @constructor\n   * @param config\n   */\n  constructor(config) {\n    super();\n\n    /**\n     * @member {JSON}\n     * @param config\n     * @param {Element} config.target\n     * @param {Number} [config.frozenColumnIndex=0]\n     * @param {Number} [config.frozenRowIndex=0]\n     * @param {Boolean} [config.showLineNumber=false]\n     * @param {Boolean} [config.showRowSelector=false]\n     * @param {Boolean} [config.multipleSelect=true]\n     * @param {Number} [config.columnMinWidth=100]\n     * @param {Number} [config.lineNumberColumnWidth=30]\n     * @param {Number} [config.rowSelectorColumnWidth=25]\n     * @param {Boolean} [config.sortable=false]\n     * @param {Boolean} [config.multiSort=false]\n     * @param {Function} [config.remoteSort=false]\n     * @param {Boolean} [config.virtualScrollY=true] - 세로축 가상스크롤 처리여부\n     * @param {Boolean} [config.virtualScrollX=true] - 가로축 가상스크롤 처리여부\n     * @param {Object} [config.header]\n     * @param {String} [config.header.align]\n     * @param {Number} [config.header.columnHeight=25]\n     * @param {Number} [config.header.columnPadding=3]\n     * @param {Number} [config.header.columnBorderWidth=1]\n     * @param {Object} [config.body]\n     * @param {Function} [config.body.onClick]\n     * @param {Function} [config.body.onDBLClick]\n     * @param {Function} [config.body.onDataChanged]\n     * @param {Function} [config.body.onContextMenu]\n     * @param {String|Array} [config.body.mergeCells=false] -\n     * @param {String} [config.body.align]\n     * @param {Number} [config.body.columnHeight=25]\n     * @param {Number} [config.body.columnPadding=3]\n     * @param {Number} [config.body.columnBorderWidth=1]\n     * @param {Object} [config.body.grouping]\n     * @param {Array} [config.body.grouping.by] - list grouping keys\n     * @param {Array} [config.body.grouping.columns] - list grouping columns\n     * @param {(String|Function)} [config.body.trStyleClass]\n     * @param {Object} [config.page]\n     * @param {Number} [config.page.height=25]\n     * @param {Boolean} [config.page.display=true] - grid page display\n     * @param {Boolean} [config.page.statusDisplay=true] - grid status display\n     * @param {Number} [config.page.navigationItemCount=5]\n     * @param {Object} [config.scroller]\n     * @param {Number} [config.scroller.size=15]\n     * @param {Number} [config.scroller.barMinSize=15]\n     * @param {Number} [config.scroller.trackPadding=4]\n     * @param {Object} [config.columnKeys]\n     * @param {String} [config.columnKeys.selected=\"_SELECTED\"]\n     * @param {Object[]} config.columns\n     * @param {String} config.columns[].key\n     * @param {String} config.columns[].label\n     * @param {Number} config.columns[].width\n     * @param {(String|Function)} config.columns[].styleClass\n     * @param {(String|Function)} config.columns[].headerStyleClass\n     * @param {Boolean} config.columns[].enableFilter\n     * @param {Boolean} config.columns[].sortable\n     * @param {String} config.columns[].align\n     * @param {(String|Function)} config.columns[].formatter\n     * @param {Object} config.columns[].editor\n     * @param {String} config.columns[].editor.type - text,number,money,date\n     * @param {Object} config.columns[].editor.config\n     * @param {Array} config.columns[].editor.updateWith\n     * @param {Function} config.columns[].editor.disabled - disable editor\n     * @param {Boolean} [config.columns[].multiLine=false]\n     * @param {Object} [config.tree]\n     * @param {Boolean} [config.tree.use=false] - Whether tree-type data is used\n     * @param {Number} [config.tree.hashDigit=8]\n     * @param {Number} [config.tree.indentWidth=10]\n     * @param {Number} [config.tree.arrowWidth=15]\n     * @param {Number} [config.tree.iconWidth=18]\n     * @param {Object} [config.tree.icons]\n     * @param {String} [config.tree.icons.openedArrow='▾']\n     * @param {String} [config.tree.icons.collapsedArrow='▸']\n     * @param {String} [config.tree.icons.groupIcon='⊚']\n     * @param {String} [config.tree.icons.collapsedGroupIcon='⊚']\n     * @param {String} [config.tree.icons.itemIcon='⊙']\n     * @param {Object} [config.tree.columnKeys]\n     * @param {String} [config.tree.columnKeys.parentKey=\"pid\"]\n     * @param {String} [config.tree.columnKeys.selfKey=\"id\"]\n     * @param {String} [config.tree.columnKeys.collapse=\"collapse\"]\n     * @param {String} [config.tree.columnKeys.hidden=\"hidden\"]\n     * @param {String} [config.tree.columnKeys.parentHash=\"__hp__\"]\n     * @param {String} [config.tree.columnKeys.selfHash=\"__hs__\"]\n     * @param {String} [config.tree.columnKeys.children=\"__children__\"]\n     * @param {String} [config.tree.columnKeys.depth=\"__depth__\"]\n     */\n    this.config = {\n      theme: 'default',\n      animateTime: 250,\n      debounceTime: 250,\n      appendDebouncer: null,\n      appendDebounceTimes: 0,\n      appendProgressIcon: '...',\n      appendProgress: false,\n\n      // 틀고정 속성\n      frozenColumnIndex: 0,\n      frozenRowIndex: 0,\n      showLineNumber: false,\n      showRowSelector: false,\n      multipleSelect: true,\n      virtualScrollY: true,\n      virtualScrollX: true,\n\n      // 스크롤될 때 body 페인팅 딜레이를 주어 성능이 좋은 않은 브라우저에서 반응을 빠르게 할 때 사용하는 옵션들\n      virtualScrollYCountMargin: 0,\n      virtualScrollAccelerated: true,\n      virtualScrollAcceleratedDelayTime: 10,\n\n      height: 0,\n      columnMinWidth: 100,\n      lineNumberColumnWidth: 30,\n      rowSelectorColumnWidth: 26,\n      sortable: undefined,\n      remoteSort: false,\n\n      header: {\n        display: true,\n        align: false,\n        columnHeight: 26,\n        columnPadding: 3,\n        columnBorderWidth: 1\n      },\n      body: {\n        align: false,\n        columnHeight: 26,\n        columnPadding: 3,\n        columnBorderWidth: 1,\n        grouping: false,\n        mergeCells: false\n      },\n      rightSum: false,\n      footSum: false,\n      page: {\n        height: 25,\n        display: true,\n        statusDisplay: true,\n        navigationItemCount: 5\n      },\n      scroller: {\n        size: 15,\n        barMinSize: 15,\n        trackPadding: 4\n      },\n      columnKeys: {\n        selected: '__selected__',\n        modified: '__modified__',\n        deleted: '__deleted__',\n        disableSelection: '__disable_selection__'\n      },\n      tree: {\n        use: false,\n        hashDigit: 8,\n        indentWidth: 10,\n        arrowWidth: 15,\n        iconWidth: 18,\n        icons: {\n          openedArrow: '▾',\n          collapsedArrow: '▸',\n          groupIcon: '⊚',\n          collapsedGroupIcon: '⊚',\n          itemIcon: '⊙'\n        },\n        columnKeys: {\n          parentKey: \"pid\",\n          selfKey: \"id\",\n          collapse: \"collapse\",\n          hidden: \"hidden\",\n          parentHash: \"__hp__\",\n          selfHash: \"__hs__\",\n          children: \"__children__\",\n          depth: \"__depth__\",\n        }\n      }\n    };\n    jQuery.extend(true, this.config, config);\n\n    // 멤버 변수 초기화\n    /**\n     * @member {Object}\n     */\n    this.xvar = {\n      bodyTrHeight: 0, // 한줄의 높이\n      scrollContentWidth: 0, // 스크롤 될 내용물의 너비 (스크롤 될 내용물 : panel['body-scroll'] 안에 컬럼이 있는)\n      scrollContentHeight: 0, // 스크롤 된 내용물의 높이\n      scrollTimer: null\n    };\n\n    // 그리드 데이터셋\n    /**\n     * @member {Array}\n     */\n    this.columns = []; // config.columns에서 복제된 오브젝트\n    /**\n     * @member {Array}\n     */\n    this.colGroup = []; // columns를 table태그로 출력하기 좋게 변환한 오브젝트\n    /**\n     * @member {Array}\n     */\n    this.footSumColumns = [];\n    /**\n     * @member {Object}\n     */\n    this.bodyGrouping = {};\n    /**\n     * @member {Array}\n     */\n    this.list = []; // 그리드의 데이터\n    /**\n     * @member {Array}\n     */\n    this.proxyList = null; // 그리드 데이터의 대리자\n    /**\n     * @member {Object}\n     */\n    this.page = null; // 그리드의 페이지 정보\n\n    this.selectedDataIndexs = [];\n    this.deletedList = [];\n\n    /**\n     * @member {Object}\n     */\n    this.sortInfo = {}; // 그리드의 헤더 정렬 정보\n    this.focused = false;\n    /**\n     * @member {Object}\n     */\n    this.focusedColumn = {}; // 그리드 바디의 포커스된 셀 정보\n    /**\n     * @member {Object}\n     */\n    this.selectedColumn = {}; // 그리드 바디의 선택된 셀 정보\n    this.isInlineEditing = false;\n    /**\n     * @member {Object}\n     */\n    this.inlineEditing = {};\n    /**\n     * @member {Object}\n     */\n    this.listIndexMap = {}; // tree데이터 사용시 데이터 인덱싱 맵\n    /**\n     * @member {Object}\n     */\n    this.contextMenu = null; // contentMenu 의 인스턴스\n\n    // header\n    /**\n     * @member {Object}\n     */\n    this.headerTable = {};\n    /**\n     * @member {Object}\n     */\n    this.leftHeaderData = {};\n    /**\n     * @member {Object}\n     */\n    this.headerData = {};\n    /**\n     * @member {Object}\n     */\n    this.rightHeaderData = {};\n\n    // body\n    /**\n     * @member {Object}\n     */\n    this.bodyRowTable = {};\n    /**\n     * @member {Object}\n     */\n    this.leftBodyRowData = {};\n    /**\n     * @member {Object}\n     */\n    this.bodyRowData = {};\n    /**\n     * @member {Object}\n     */\n    this.rightBodyRowData = {};\n    /**\n     * @member {Object}\n     */\n    this.bodyRowMap = {};\n\n    /**\n     * @member {Object}\n     */\n    this.bodyGroupingTable = {};\n    /**\n     * @member {Object}\n     */\n    this.leftBodyGroupingData = {};\n    /**\n     * @member {Object}\n     */\n    this.bodyGroupingData = {};\n    /**\n     * @member {Object}\n     */\n    this.rightBodyGroupingData = {};\n    /**\n     * @member {Object}\n     */\n    this.bodyGroupingMap = {};\n\n    // footSum\n    /**\n     * @member {Object}\n     */\n    this.footSumTable = {}; // footSum의 출력레이아웃\n    /**\n     * @member {Object}\n     */\n    this.leftFootSumData = {}; // frozenColumnIndex 를 기준으로 나누어진 출력 레이아웃 왼쪽\n    /**\n     * @member {Object}\n     */\n    this.footSumData = {}; // frozenColumnIndex 를 기준으로 나누어진 출력 레이아웃 오른쪽\n    /**\n     * @member {Boolean}\n     */\n    this.needToPaintSum = true; // 데이터 셋이 변경되어 summary 변경 필요여부\n\n    /**\n     * 사용자 정의 formatter. AX6UIGrid.setFormatter 를 이용하여 확장\n     * @member\n     */\n    this.customFormatter = AX6UIGrid.getFormatter();\n\n    /**\n     * 사용자 정의 collector. AX6UIGrid.setCollector 를 이용하여 확장\n     * @member\n     */\n    this.customCollector = AX6UIGrid.getCollector();\n\n    this.__tmpl = Object.assign(TMPL, AX6UIGrid.getTmpl());\n\n    if (typeof config !== \"undefined\") this.init();\n\n    return this;\n  }\n\n  /**\n   * @method\n   * @param config\n   */\n  init() {\n    // 그리드의 이벤트 정의 구간\n    this.onStateChanged = this.config.onStateChanged;\n    this.onLoad = this.config.onLoad;\n\n    // init 호출 여부\n    this.initOnce();\n\n    if (typeof this.config.target !== \"undefined\") {\n\n      this.$target = jQuery(this.config.target);\n\n      // target attribute data\n      (function (data) {\n        if (U.isObject(data) && !data.error) {\n          this.config = jQuery.extend(true, {}, this.config, data);\n        }\n      }).call(this, U.parseJson(this.$target.attr(\"data-ax6ui-grid-config\"), true));\n\n      if (!this.config.height) {\n        this.config._height = this.$target.height();\n      }\n\n      if (!this.id) this.id = this.$target.data(\"ax6ui-grid-id\");\n      if (!this.id) {\n        this.id = 'ax6ui-grid-' + this.instanceId;\n        this.$target.data(\"ax6ui-grid-id\", this.id);\n      }\n\n      DATA.init.call(this);\n\n      if (this.config.tree.use) { // 트리라면\n        this.sortInfo = {};\n        this.sortInfo[this.config.tree.columnKeys.selfHash] = {orderBy: \"asc\", seq: 0, fixed: true};\n      }\n\n      ///========\n      // 그리드를 그리기 위한 가장 기초적인 작업 뼈대와 틀을 준비합니다. 이 메소드는 초기화 시 한번만 호출 되게 됩니다.\n      initGrid.call(this);\n\n      // columns데이터를 분석하여 미리 처리해야하는 데이터를 정리합니다.\n      initColumns.call(this, this.config.columns);\n      resetColGroupWidth.call(this);\n\n      // footSum 데이터를 분석하여 미리 처리해야 하는 데이터를 정리\n      if (this.config.footSum) initFootSum.call(this, this.config.footSum);\n\n      // bodyGrouping 데이터를 분석하여 미리 처리해야 하는 데이터를 정리\n      if (this.config.body.grouping) initBodyGroup.call(this, this.config.body.grouping);\n\n      // 그리드의 각 요소의 크기를 맞춤니다.\n      alignGrid.call(this, true);\n\n      // columns의 데이터로 header데이터를 만들고\n      HEADER.init.call(this);\n      // header를 출력합니다.\n      HEADER.repaint.call(this);\n\n      // columns의 데이터로 body데이터를 만들고\n      BODY.init.call(this);\n      // body를 출력합니다.\n      BODY.repaint.call(this);\n\n      // scroller\n      SCROLLER.init.call(this);\n      SCROLLER.resize.call(this);\n\n      jQuery(window)\n        .off(\"resize.ax6grid-\" + this.instanceId)\n        .off(\"keydown.ax6grid-\" + this.instanceId)\n        .on(\"resize.ax6grid-\" + this.instanceId, U.throttle(function (e) {\n          alignGrid.call(this);\n          SCROLLER.resize.call(this);\n          BODY.repaint.call(this);  // window resize시 repaint 함수 호출\n        }, 30).bind(this))\n        .on(\"keydown.ax6grid-\" + this.instanceId, (e) => {\n          if (this.focused) {\n            if (this.isInlineEditing) {\n              if (e.which == info.eventKeys.ESC) {\n                this.keyDown(\"ESC\", e.originalEvent);\n              }\n              else if (e.which == info.eventKeys.RETURN) {\n                this.keyDown(\"RETURN\", e.originalEvent);\n              }\n              else if (e.which == info.eventKeys.TAB) {\n                this.keyDown(\"TAB\", e.originalEvent);\n                U.stopEvent(e);\n              }\n              else if (e.which == info.eventKeys.UP) {\n                this.keyDown(\"RETURN\", {shiftKey: true});\n              }\n              else if (e.which == info.eventKeys.DOWN) {\n                this.keyDown(\"RETURN\", {});\n              }\n            }\n            else {\n              if (e.metaKey || e.ctrlKey) {\n                if (e.which == 67) { // c\n                  self.copySelect();\n                }\n              } else {\n                if (ctrlKeys[e.which]) {\n                  this.keyDown(ctrlKeys[e.which], e.originalEvent); // 키다운 이벤트 호출\n                  U.stopEvent(e);\n                } else if (e.which == info.eventKeys.ESC) {\n                  if (this.focused) {\n                    BODY.blur.call(self);\n                  }\n                } else if (e.which == info.eventKeys.RETURN || e.which == info.eventKeys.SPACE) {\n                  this.keyDown(\"RETURN\", e.originalEvent);\n                } else if (e.which == info.eventKeys.TAB) {\n                  //self.keyDown(\"RETURN\", e.originalEvent);\n                  U.stopEvent(e);\n                } else if (Object.keys(this.focusedColumn).length) {\n                  this.keyDown(\"INLINE_EDIT\", e.originalEvent);\n                }\n              }\n            }\n          }\n        });\n\n      jQuery(document.body)\n        .off(\"click.ax6grid-\" + this.instanceId)\n        .on(\"click.ax6grid-\" + this.instanceId, (e) => {\n          let isPickerClick = false,\n              target        = U.findParentNode(e.target, function (_target) {\n                if (isPickerClick = _target.getAttribute(\"data-ax6grid-inline-edit-picker\")) {\n                  return true;\n                }\n                return _target.getAttribute(\"data-ax6grid-container\") === \"root\";\n              });\n\n          if (target && target.getAttribute(\"data-ax6grid-instance\") === this.id) {\n            this.focused = true;\n          } else {\n            this.focused = false;\n            BODY.blur.call(this);\n          }\n        });\n\n      // 그리드 레이아웃이 모든 준비를 마친시점에 onLoad존재 여부를 확인하고 호출하여 줍니다.\n      setTimeout(() => {\n        if (this.onLoad) {\n          this.onLoad.call({\n            self: this\n          });\n        }\n      });\n    }\n  }\n\n  /**\n   * @method\n   */\n  initOnce() {\n    if (this.initialized) return this;\n    this.initialized = true;\n  }\n\n  /**\n   * 그리드의 각 패널들의 크기를 변경된 설정에 맞추어 다시 그림\n   * @method\n   * @return {AX6UIGrid}\n   */\n  align() {\n    if (alignGrid.call(this)) {\n      BODY.repaint.call(this);\n      SCROLLER.resize.call(this);\n    }\n    return this;\n  }\n\n  /**\n   * 그리드에 키보드 액션을 전달\n   * @method\n   * @param _act\n   * @param _data\n   * @return {AX6UIGrid}\n   */\n  keyDown(_act, _data) {\n    const processor = {\n      \"KEY_UP\": function () {\n        BODY.moveFocus.call(this, \"UP\");\n      },\n      \"KEY_DOWN\": function () {\n        BODY.moveFocus.call(this, \"DOWN\");\n      },\n      \"KEY_LEFT\": function () {\n        BODY.moveFocus.call(this, \"LEFT\");\n      },\n      \"KEY_RIGHT\": function () {\n        BODY.moveFocus.call(this, \"RIGHT\");\n      },\n      \"KEY_HOME\": function () {\n        BODY.moveFocus.call(this, \"HOME\");\n      },\n      \"KEY_END\": function () {\n        BODY.moveFocus.call(this, \"END\");\n      },\n      \"INLINE_EDIT\": function (_e) {\n        BODY.inlineEdit.active.call(this, this.focusedColumn, _e);\n        if (!/[0-9a-zA-Z]/.test(_e.key)) {\n          U.stopEvent(_e);\n        }\n      },\n      \"ESC\": function (_e) {\n        BODY.inlineEdit.keydown.call(this, \"ESC\");\n      },\n      \"RETURN\": function (_e) {\n        var activeEditLength = 0;\n        for (var columnKey in this.inlineEditing) {\n          activeEditLength++;\n\n          if (!BODY.inlineEdit.keydown.call(this, \"RETURN\", columnKey)) {\n            return false;\n            U.stopEvent(_e);\n          }\n          // next focus\n          if (activeEditLength == 1) {\n            if (BODY.moveFocus.call(this, (_e.shiftKey) ? \"UP\" : \"DOWN\")) {\n              BODY.inlineEdit.keydown.call(this, \"RETURN\");\n            }\n          }\n        }\n        if (activeEditLength == 0) {\n          BODY.inlineEdit.keydown.call(this, \"RETURN\");\n          U.stopEvent(_e);\n        } else {\n\n        }\n      },\n      \"TAB\": function (_e) {\n\n        var activeEditLength = 0;\n        for (var columnKey in this.inlineEditing) {\n          activeEditLength++;\n\n          BODY.inlineEdit.keydown.call(this, \"RETURN\", columnKey, {moveFocus: true});\n          // next focus\n          if (activeEditLength == 1) {\n            if (BODY.moveFocus.call(this, (_e.shiftKey) ? \"LEFT\" : \"RIGHT\")) {\n              BODY.inlineEdit.keydown.call(this, \"RETURN\", undefined, {moveFocus: true});\n            }\n          }\n        }\n      }\n    };\n    if (_act in processor) processor[_act].call(this, _data);\n    return this;\n  }\n\n  /**\n   * 선택된 셀을 클립보드에 복사합니다\n   * @method\n   * @return {*}\n   */\n  copySelect() {\n    let copysuccess,\n        $clipBoard                         = this.$[\"form\"][\"clipboard\"],\n        copyTextArray                      = [], copyText = \"\",\n        _rowIndex, _colIndex, _dindex, _di = 0;\n\n    for (let c in this.selectedColumn) {\n      let _column = this.selectedColumn[c];\n\n      if (_column) {\n        if (typeof _dindex === \"undefined\") {\n          _dindex = _column.dindex;\n          _rowIndex = _column.rowIndex;\n          _colIndex = _column.rowIndex;\n        }\n\n        if (_dindex != _column.dindex || _rowIndex != _column.rowIndex) {\n          _di++;\n        }\n\n        if (!copyTextArray[_di]) {\n          copyTextArray[_di] = [];\n        }\n        let originalColumn = this.bodyRowMap[_column.rowIndex + \"_\" + _column.colIndex];\n        if (originalColumn) {\n          if (this.list[_column.dindex].__isGrouping) {\n            copyTextArray[_di].push(this.list[_column.dindex][_column.colIndex]);\n          } else {\n            copyTextArray[_di].push(this.list[_column.dindex][originalColumn.key]);\n          }\n        } else {\n          copyTextArray[_di].push(\"\");\n        }\n\n        _dindex = _column.dindex;\n        _rowIndex = _column.rowIndex;\n      }\n    }\n\n    copyTextArray.forEach(function (r) {\n      copyText += r.join('\\t') + \"\\n\";\n    });\n\n    $clipBoard.get(0).innerText = copyText;\n    $clipBoard.select();\n\n    try {\n      copysuccess = document.execCommand(\"copy\");\n    }\n    catch (e) {\n      copysuccess = false;\n    }\n    return copysuccess;\n  }\n\n  /**\n   * @method\n   * @param _data\n   * @return {AX6UIGrid}\n   * @example\n   * ```js\n   * import {AX6UIGrid as Grid} from \"ax6ui\";\n   *\n   * let grid = new Grid({target: el});\n   * grid.setData([\n   *  {name: \"Thomas\"}\n   * ]);\n   *\n   * grid.setData({\n     *  list: [],\n     *  page: {\n     *      currentPage: 0,\n     *      pageSize: 50,\n     *      totalElements: 500,\n     *      totalPages: 100\n     *  }\n     * });\n   * ```\n   */\n  setData(_data) {\n    let isFirstPaint = (typeof this.xvar.paintStartRowIndex === \"undefined\");\n\n    DATA.set.call(this, _data);\n    BODY.repaint.call(this);\n    if (!isFirstPaint) BODY.scrollTo.call(this, {top: 0});\n\n    alignGrid.call(this);\n    SCROLLER.resize.call(this);\n    PAGE.navigationUpdate.call(this);\n\n    isFirstPaint = null;\n    return this;\n  }\n\n  /**\n   * @method\n   * @param _type\n   * @return {*}\n   * @example\n   * ```js\n   * import {AX6UIGrid as Grid} from \"ax6ui\";\n   * let grid = new Grid({target: el});\n   * grid.setData([]);\n   *\n   * grid.getList(); // return all\n   * grid.getList(\"selected\");\n   * grid.getList(\"modified\");\n   * grid.getList(\"deleted\");\n   * ```\n   */\n  getList(_type) {\n    return DATA.getList.call(this, _type);\n  }\n\n  /**\n   * @method\n   * @param _height\n   * @return {AX6UIGrid}\n   * @example\n   * ```js\n   * grid.setHeight(height);\n   * ```\n   */\n  setHeight(_height) {\n    if (_height == \"100%\") {\n      _height = this.$target.offsetParent().innerHeight();\n    }\n    this.$target.css({height: _height});\n    this.$[\"container\"][\"root\"].css({height: _height});\n    alignGrid.call(this);\n    BODY.repaint.call(this, \"reset\");\n    SCROLLER.resize.call(this);\n    return this;\n  }\n\n  /**\n   * @method\n   * @param _row\n   * @param {Number|String} [_dindex=\"last\"]\n   * @param _options\n   * @param {Boolean} [_options.sort]\n   * @param {Number|String} [_options.focus] - HOME|END|[dindex]\n   * @return {AX6UIGrid}\n   * @example\n   * ```js\n   * grid.addRow($.extend({}, {...}), \"first\");\n   * grid.addRow($.extend({}, {...}), \"last\", {focus: \"END\"});\n   * grid.addRow($.extend({}, {...}), \"last\", {focus: \"HOME\"});\n   * grid.addRow($.extend({}, {...}), \"last\", {focus: 10});\n   * ```\n   */\n  addRow(_row, _dindex, _options) {\n    DATA.add.call(this, _row, _dindex, _options);\n    alignGrid.call(this);\n    BODY.repaint.call(this, \"reset\");\n    if (_options && _options.focus) {\n      BODY.moveFocus.call(this, _options.focus);\n    }\n    SCROLLER.resize.call(this);\n    return this;\n  }\n\n  /**\n   * @method\n   * @param _list\n   * @return {AX6UIGrid}\n   * @example\n   * ```js\n   * grid.appendToList([{},{},{}]);\n   * grid.appendToList([{},{},{}]);\n   * ```\n   */\n  appendToList(_list) {\n    DATA.append.call(this, _list, (function () {\n      alignGrid.call(this);\n      BODY.repaint.call(this);\n      SCROLLER.resize.call(this);\n    }).bind(this));\n    return this;\n  }\n\n  /**\n   * @method\n   * @param {Number|String} [_dindex=last]\n   * @return {AX6UIGrid}\n   * @example\n   * ```js\n   * grid.removeRow();\n   * grid.removeRow(\"first\");\n   * grid.removeRow(\"last\");\n   * grid.removeRow(1);\n   * grid.removeRow(\"selected\");\n   * ```\n   */\n  removeRow(_dindex) {\n    DATA.remove.call(this, _dindex);\n    alignGrid.call(this);\n    BODY.repaint.call(this, \"reset\");\n    BODY.moveFocus.call(this, (this.config.body.grouping) ? \"START\" : \"END\");\n    SCROLLER.resize.call(this);\n    return this;\n  }\n\n  /**\n   * @method\n   * @param _row\n   * @param _dindex\n   * @return {AX6UIGrid}\n   * @example\n   * ```js\n   * grid.updateRow({price: 100, amount: 100, cost: 10000}, 1);\n   * ```\n   */\n  updateRow(_row, _dindex) {\n    DATA.update.call(this, _row, _dindex);\n    // todo : mergeCells 옵션에 따라 예외처리\n    BODY.repaintRow.call(this, _dindex);\n    return this;\n  }\n\n  /**\n   * @method\n   * @param {Number} _dindex\n   * @param {Object} _updateData\n   * @param {Object} [_options]\n   * @param {Function} [_options.filter]\n   * @returns {AX6UIGrid}\n   * @example\n   * ```js\n   * onDataChanged: function () {\n     *      this.self.updateChildRows(this.dindex, {isChecked: this.item.isChecked});\n     * }\n   *\n   * onDataChanged: function () {\n     *      this.self.updateChildRows(this.dindex, {isChecked: this.item.isChecked}, {filter: function(){\n     *          return this.item.type == \"A\";\n     *      });\n     * }\n     * ```\n     */\n  updateChildRows(_dindex, _updateData, _options) {\n    DATA.updateChild.call(this, _dindex, _updateData, _options);\n    this.xvar.paintStartRowIndex = undefined;\n    this.xvar.paintStartColumnIndex = undefined;\n    BODY.repaint.call(this);\n    return this;\n  }\n\n  /**\n   * @method\n   * @param {Number|String} _dindex\n   * @returns {AX6UIGrid}\n   * @example\n   * ```js\n   * grid.deleteRow(\"first\");\n   * grid.deleteRow(\"last\");\n   * grid.deleteRow(1);\n   * grid.deleteRow(\"selected\");\n   * ```\n   */\n  deleteRow(_dindex) {\n    DATA.deleteRow.call(this, _dindex);\n    alignGrid.call(this);\n    BODY.repaint.call(this, \"reset\");\n\n    SCROLLER.resize.call(this);\n    return this;\n  }\n\n  /**\n   * @method\n   * @param _dindex\n   * @param _key\n   * @param _value\n   * @returns {AX6UIGrid}\n   * @example\n   * ```js\n   * grid.setValue(0, \"price\", 100);\n   * ```\n   */\n  setValue(_dindex, _key, _value) {\n    let doindex;\n\n    if (DATA.setValue.call(this, _dindex, doindex, _key, _value)) {\n      let repaintCell = function (_panelName, _rows, __dindex, __doindex, __key, __value) {\n        for (let r = 0, rl = _rows.length; r < rl; r++) {\n          for (let c = 0, cl = _rows[r].cols.length; c < cl; c++) {\n            if (_rows[r].cols[c].key == __key) {\n              if (this.xvar.frozenRowIndex > __dindex) {\n                BODY.repaintCell.call(this, \"top-\" + _panelName, __dindex, __doindex, r, c, __value);\n              } else {\n                BODY.repaintCell.call(this, _panelName + \"-scroll\", __dindex, __doindex, r, c, __value);\n              }\n            }\n          }\n        }\n      };\n\n      repaintCell.call(this, \"left-body\", this.leftBodyRowData.rows, _dindex, doindex, _key, _value);\n      repaintCell.call(this, \"body\", this.bodyRowData.rows, _dindex, doindex, _key, _value);\n    }\n\n    return this;\n  }\n\n  /**\n   * @method\n   * @param {Object} _column\n   * @param {Number|String} [_cindex=last]\n   * @returns {AX6UIGrid}\n   */\n  addColumn(_column, _cindex) {\n    const processor = {\n      \"first\": function (_column) {\n        this.config.columns = [].concat(_column).concat(this.config.columns);\n      },\n      \"last\": function (_column) {\n        this.config.columns = this.config.columns.concat([].concat(_column));\n      }\n    };\n\n    if (typeof _column === \"undefined\") throw '_column must not be null';\n    if (typeof _cindex === \"undefined\") _cindex = \"last\";\n    if (_cindex in processor) {\n      processor[_cindex].call(this, _column);\n    } else {\n      if (!U.isNumber(_cindex)) {\n        throw 'invalid argument _cindex';\n      }\n      if (U.isArray(_column)) {\n        for (let _i = 0, _l = _column.length; _i < _l; _i++) {\n          this.config.columns.splice(_cindex + _i, 0, _column[_i]);\n        }\n      } else {\n        this.config.columns.splice(_cindex, 0, _column);\n      }\n    }\n    onResetColumns.call(this); // 컬럼이 변경되었을 때.\n    return this;\n  }\n\n  /**\n   * @method\n   * @param {Number|String} [_cindex=last]\n   * @returns {AX6UIGrid}\n   */\n  removeColumn(_cindex) {\n    const processor = {\n      \"first\": function (_cindex) {\n        this.config.columns.splice(_cindex, 1);\n      },\n      \"last\": function () {\n        this.config.columns.splice(this.config.columns.length - 1, 1);\n      }\n    };\n    if (typeof _cindex === \"undefined\") _cindex = \"last\";\n    if (_cindex in processor) {\n      processor[_cindex].call(this, _cindex);\n    } else {\n      if (!U.isNumber(_cindex)) {\n        throw 'invalid argument _cindex';\n      }\n      //\n      this.config.columns.splice(_cindex, 1);\n    }\n    onResetColumns.call(this); // 컬럼이 변경되었을 때.\n    return this;\n  }\n\n  /**\n   * @method\n   * @param {Object} _column\n   * @param {Number} _cindex\n   * @returns {AX6UIGrid}\n   */\n  updateColumn(_column, _cindex) {\n    if (!U.isNumber(_cindex)) {\n      throw 'invalid argument _cindex';\n    }\n    //\n    this.config.columns.splice(_cindex, 1, _column);\n    onResetColumns.call(this); // 컬럼이 변경되었을 때.\n    return this;\n  }\n\n  /**\n   * @method\n   * @param {Number} _width\n   * @param {Number} _cindex\n   * @returns {AX6UIGrid}\n   */\n  setColumnWidth(_width, _cindex) {\n    this.colGroup[this.xvar.columnResizerIndex]._width = _width;\n    this.needToPaintSum = true;\n\n    // 컬럼너비 변경사항 적용.\n    HEADER.repaint.call(this);\n    BODY.repaint.call(this, true);\n    SCROLLER.resize.call(this);\n\n    alignGrid.call(this);\n    return this;\n  }\n\n  /**\n   * @method\n   * @returns {Object} sortInfo\n   */\n  getColumnSortInfo() {\n    let that = {sortInfo: []};\n    for (let k in this.sortInfo) {\n      that.sortInfo.push({\n        key: k,\n        orderBy: this.sortInfo[k].orderBy,\n        seq: this.sortInfo[k].seq\n      });\n    }\n    that.sortInfo.sort(function (a, b) {\n      return a.seq > b.seq;\n    });\n    return that.sortInfo;\n  }\n\n  /**\n   * @method\n   * @param {Object} _sortInfo\n   * @param {Object} _sortInfo.key\n   * @param {Number} _sortInfo.key.seq - seq of sortOrder\n   * @param {String} _sortInfo.key.orderBy - \"desc\"|\"asc\"\n   * @returns {AX6UIGrid}\n   * @example\n   * ```js\n   * grid.setColumnSort({a:{seq:0, orderBy:\"desc\"}, b:{seq:1, orderBy:\"asc\"}});\n   * ```\n   */\n  setColumnSort(_sortInfo) {\n    if (typeof _sortInfo !== \"undefined\") {\n      this.sortInfo = _sortInfo;\n      HEADER.applySortStatus.call(this, _sortInfo);\n    }\n\n    sortColumns.call(this, _sortInfo || this.sortInfo);\n    return this;\n  }\n\n  /**\n   * @method\n   * @param {Number|Object} _selectObject\n   * @param {Number} _selectObject.index - index of row\n   * @param {Number} _selectObject.rowIndex - rowIndex of columns\n   * @param {Number} _selectObject.conIndex - colIndex of columns\n   * @param {Object} _options\n   * @param {Boolean} _options.selectedClear\n   * @param {Boolean} _options.selected\n   * @returns {AX6UIGrid}\n   * @example\n   * ```js\n   * grid.select(0);\n   * grid.select(0, {selected: true});\n   * grid.select(0, {selected: false});\n   * grid.select(0, {selectedClear: true});\n   * ```\n   */\n  select(_selectObject, _options) {\n    if (U.isNumber(_selectObject)) {\n      let dindex = _selectObject;\n\n      if (!this.config.multipleSelect) {\n        this.clearSelect();\n      } else {\n        if (_options && _options.selectedClear) {\n          this.clearSelect();\n        }\n      }\n\n      DATA.select.call(this, dindex, undefined, _options && _options.selected);\n      BODY.updateRowState.call(this, [\"selected\"], dindex, undefined);\n    }\n    return this;\n  }\n\n  /**\n   * @method\n   * @param _dindex\n   * @return {AX6UIGrid}\n   */\n  clickBody(_dindex) {\n    BODY.click.call(this, _dindex);\n    return this;\n  }\n\n  /**\n   * @method\n   * @param _dindex\n   * @return {AX6UIGrid}\n   */\n  DBLClickBody(_dindex) {\n    BODY.dblClick.call(this, _dindex);\n    return this;\n  }\n\n  /**\n   * @method\n   * @return {AX6UIGrid}\n   */\n  clearSelect() {\n    BODY.updateRowState.call(this, [\"selectedClear\"]);\n    DATA.clearSelect.call(this);\n    return this;\n  }\n\n  /**\n   * @method\n   * @param {Object} _options\n   * @param {Boolean} _options.selected\n   * @param {Function} _options.filter\n   * @returns {AX6UIGrid}\n   * @example\n   * ```js\n   * grid.selectAll();\n   * grid.selectAll({selected: true});\n   * grid.selectAll({selected: false});\n   * grid.selectAll({filter: function(){\n     *      return this[\"b\"] == \"A01\";\n     * });\n     * grid.selectAll({selected: true, filter: function(){\n     *      return this[\"b\"] == \"A01\";\n     * });\n     * ```\n     */\n  selectAll(_options) {\n    DATA.selectAll.call(this, _options && _options.selected, _options);\n    BODY.updateRowStateAll.call(this, [\"selected\"]);\n    return this;\n  }\n\n  /**\n   * @method\n   * @param {String} _fileName\n   * @returns {AX6UIGrid|String}\n   * @example\n   * ```js\n   * grid.exportExcel(\"grid-to-excel.xls\");\n   * console.log(grid.exportExcel());\n   * ```\n   */\n  exportExcel(_fileName) {\n    let table = [];\n    table.push('<table border=\"1\">');\n    table.push(HEADER.getExcelString.call(this));\n    table.push(BODY.getExcelString.call(this));\n    table.push('</table>');\n\n    if (typeof _fileName === \"undefined\") {\n      return table.join('');\n    }\n    else {\n      EXCEL.export.call(this, [table.join('')], _fileName);\n    }\n\n    return this;\n  }\n\n  /**\n   * @method\n   * @param {String|Number} _pos - UP, DOWN, LEFT, RIGHT, HOME, END\n   * @returns {AX6UIGrid}\n   * @example\n   * ```js\n   * grid.focus(\"UP\");\n   * grid.focus(\"DOWN\");\n   * grid.focus(\"HOME\");\n   * grid.focus(\"END\");\n   * ```\n   */\n  focus(_pos) {\n\n    if (BODY.moveFocus.call(this, _pos)) {\n      let focusedColumn;\n      for (let c in this.focusedColumn) {\n        focusedColumn = jQuery.extend({}, this.focusedColumn[c], true);\n        break;\n      }\n      if (focusedColumn) {\n        this.select(focusedColumn.dindex, {selectedClear: true});\n      }\n    }\n    else {\n      if (typeof this.selectedDataIndexs[0] === \"undefined\") {\n        this.select(0);\n      } else {\n        let selectedIndex = this.selectedDataIndexs[0];\n        const processor = {\n          \"UP\": function () {\n            if (selectedIndex > 0) {\n              this.select(selectedIndex - 1, {selectedClear: true});\n              BODY.moveFocus.call(this, selectedIndex - 1);\n            }\n          },\n          \"DOWN\": function () {\n            if (selectedIndex < this.list.length - 1) {\n              this.select(selectedIndex + 1, {selectedClear: true});\n              BODY.moveFocus.call(this, selectedIndex + 1);\n            }\n          },\n          \"HOME\": function () {\n            this.select(0, {selectedClear: true});\n            BODY.moveFocus.call(this, 0);\n          },\n          \"END\": function () {\n            this.select(this.list.length - 1, {selectedClear: true});\n            BODY.moveFocus.call(this, this.list.length - 1);\n          }\n        };\n\n        if (_pos in processor) {\n          processor[_pos].call(this);\n        }\n      }\n    }\n    return this;\n  }\n\n  /**\n   * @method\n   * @return {null}\n   */\n  destroy() {\n    this.$target.empty();\n    this.list = [];\n\n    return null;\n  }\n}\n\nexport default AX6UIGrid;"]}