f65c2a6037af97f87f69d2bdfc3d639903d72162.svn-base 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351
  1. $(function() {
  2. 'use strict';
  3. window.utils = window.utils || {};
  4. $.extend(window.utils, {
  5. datagrid: {
  6. // dxNumberBox와 span으로 연결해 뒀다가,
  7. // cellClick 이벤트 클릭이 발생하면 dxNumberBox를 보여준다.
  8. // 그러므로 cellClick 이벤트에서 cellClickEventForDataGridTemplate 함수를 반드시 호출해야 한다.
  9. // purchase-request-popup.js 참조
  10. getNumberBoxDataGridTemplateFunc: function(options) {
  11. options = options || {};
  12. var min = options.min || 0,
  13. max = options.max,
  14. step = options.step || 1,
  15. showSpinButtons = options.showSpinButtons || true,
  16. alignment = options.alignment || 'left',
  17. convertValueWhenValueChanged = options.convertValueWhenValueChanged || _.identity;
  18. return function(cellElement, cellInfo) {
  19. var data = cellInfo.data;
  20. var dataField = cellInfo.column.dataField,
  21. $dxNumberBox,
  22. $span;
  23. $dxNumberBox = $('<div>').dxNumberBox({
  24. min: min,
  25. max: max,
  26. step: step,
  27. showSpinButtons: showSpinButtons,
  28. visible: false,
  29. alignment: alignment,
  30. value: cellInfo.value,
  31. focusOutAction: function(e) {
  32. e.component.option('visible', false);
  33. cellElement.css('padding', '');
  34. $span.css('display', '');
  35. $span.text($NumberFormat(data[dataField]()));
  36. },
  37. valueChangeAction: function (e) {
  38. if (data.MaxMaterialCount !== undefined)
  39. {
  40. if (e.value > (typeof (data.MaxMaterialCount) == "function" ? data.MaxMaterialCount() : data.MaxMaterialCount)) {
  41. e.value = (typeof (data.MaxMaterialCount) == "function" ? data.MaxMaterialCount() : data.MaxMaterialCount);
  42. utils.toast.show('입력 가능 수량이 초과되었습니다.', 'warning');
  43. }
  44. }
  45. // 예산편성 화면 관련 자동 계산 수식
  46. if (dataField === 'YearlyBudget') {
  47. data[dataField](e.value);
  48. data[dataField](convertValueWhenValueChanged(data, e.value));
  49. } else if (dataField === 'MonthlyBudget'){
  50. data[dataField](e.value);
  51. data[dataField](convertValueWhenValueChanged(data, e.value));
  52. }
  53. else if (dataField === 'MonthlyExecution') {
  54. data[dataField](e.value);
  55. data[dataField](convertValueWhenValueChanged(data, e.value));
  56. }
  57. else if (dataField === 'YearlyExecution') {
  58. data[dataField](e.value);
  59. data[dataField](convertValueWhenValueChanged(data, e.value));
  60. }
  61. else {
  62. data[dataField](convertValueWhenValueChanged(e.value));
  63. }
  64. //data[dataField](convertValueWhenValueChanged(e.value));
  65. }
  66. });
  67. $dxNumberBox.appendTo(cellElement);
  68. $span = $('<span>')
  69. .text($NumberFormat(cellInfo.value))
  70. .appendTo(cellElement);
  71. data[dataField + 'NumberBox'] = $dxNumberBox.dxNumberBox('instance');
  72. data['$span' + dataField] = $span;
  73. };
  74. },
  75. cellClickEventForDataGridTemplate: function(e, dataField) {
  76. if (e.column.dataField === dataField) {
  77. var numberBoxName = [dataField, 'NumberBox'].join('');
  78. if (e.data[numberBoxName] !== undefined) {
  79. e.data[numberBoxName].option('visible', true);
  80. e.data[numberBoxName].focus();
  81. e.data['$span' + dataField].css('display', 'none');
  82. e.cellElement.css('padding', '0px');
  83. }
  84. return true;
  85. }
  86. return false;
  87. },
  88. getItems: function(datagrid) {
  89. return datagrid._controllers.data._dataSource._items;
  90. },
  91. dataSource: function(dataSource) {
  92. var dataSourceOptions = {
  93. store: dataSource._store,
  94. map: dataSource._mapFunc
  95. };
  96. var options = dataSource._storeLoadOptions;
  97. $.each(options, function(name, value) {
  98. var that = value;
  99. if (that === undefined) return true;
  100. dataSourceOptions[name] = value;
  101. });
  102. return dataSourceOptions;
  103. },
  104. getSelectedRowsData: function(id) {
  105. var dataGrid = $('#' + id).dxDataGrid('instance');
  106. return dataGrid.getSelectedRowsData();
  107. },
  108. getSelectedRowsDataWithFormatObject: function(id, objectFormat) {
  109. var dataGrid = $('#' + id).dxDataGrid('instance');
  110. var items = dataGrid.getSelectedRowsData();
  111. var array = [];
  112. $.each(items, function(i, item) {
  113. var obj = {};
  114. $.each(objectFormat, function(name, value) {
  115. obj[name] = value || $KoValue(item[name]);
  116. });
  117. array.push(obj);
  118. });
  119. return array;
  120. },
  121. columnIsUse: function(width) {
  122. return {
  123. dataField: 'IsUse',
  124. caption: $G("isUse"),
  125. alignment: 'center',
  126. width: width || '20%',
  127. customizeText: function(cellInfo) {
  128. return $G.isUse(cellInfo.value);
  129. }
  130. }
  131. },
  132. navigateView: function(data, view, tableNameOrIdsArray) {
  133. if (typeof tableNameOrIdsArray === 'string') {
  134. tableNameOrIdsArray = BemsWebApplication.db[tableNameOrIdsArray].key();
  135. }
  136. // var data = selectedItems.selectedRowsData[0];
  137. var getter = DevExpress.data.utils.compileGetter(tableNameOrIdsArray);
  138. var idsObject = getter(data);
  139. //var ids = DevExpress.framework.Route.prototype.formatSegment(values);
  140. BemsWebApplication.app.navigate({ view: view, id: idsObject }, { target: "back" });
  141. //BemsWebApplication.app.navigate( [ view , '/' , keys ].join('') , { target: "back" });
  142. },
  143. customizeTextForDateTimeFunc: function(cellInfo) {
  144. return $G.dateTime(cellInfo.value);
  145. },
  146. setSelectedId: function(data, view, tableNameOrIdsArray, options) {
  147. if (options.selectedId === undefined) return;
  148. if (typeof tableNameOrIdsArray === 'string') {
  149. tableNameOrIdsArray = BemsWebApplication.db[tableNameOrIdsArray].key();
  150. }
  151. // var data = selectedItems.selectedRowsData[0];
  152. var getter = DevExpress.data.utils.compileGetter(tableNameOrIdsArray);
  153. var idsObject = getter(data);
  154. if (_.isArray(tableNameOrIdsArray)) {
  155. $.each(idsObject, function(name, value) {
  156. options.selectedId[name] = value;
  157. });
  158. }
  159. else {
  160. options.selectedId[tableNameOrIdsArray] = idsObject;
  161. }
  162. },
  163. popupView: function(data, view, tableNameOrIdsArray, options) {
  164. options.popupVisible(true);
  165. },
  166. defaultOptions: function(options) {
  167. options = $.extend(options, {
  168. hoverStateEnabled: true
  169. });
  170. if (_.has(options, 'pager') === false) {
  171. options.paging = {
  172. pageSize: 20
  173. };
  174. options.pager = {
  175. visible: true,
  176. showPageSizeSelector: false,
  177. allowedPageSizes: [15, 20]
  178. };
  179. }
  180. if (_.has(options, 'selection') === false) {
  181. options.selection = {
  182. mode: 'single'
  183. };
  184. }
  185. if (typeof options.dxDataSource === "object") {
  186. options.dataSource = utils.datagrid.dataSource(options.dxDataSource);
  187. //delete options.dxDataSource;
  188. }
  189. if (typeof options.searchPanelPlaceHolder === 'string') {
  190. options.searchPanel = {
  191. visible: true,
  192. width: 250,
  193. placeholder: options.searchPanelPlaceHolder
  194. };
  195. //delete options.searchPanelPlaceHolder;
  196. }
  197. var numberCellPrepared = null;
  198. if (options.useNumberColumn === true) {
  199. if (typeof options.datagridId !== 'string') {
  200. throw Error("need the Id of datagrid");
  201. }
  202. var datagrid = null;
  203. // useNumberColumn 옵션이 true이면, 무조건 순서 번호로 보여준다.
  204. // multple로 설정되어 있으면 체크박스 컬럼이 생기기 때문에 numberIndex를 1로 설정한다.
  205. // 컬럼 선택에 의한 소팅이 되려면 실제 테이블의 필드 ID로 dataField를 설정하는 것이 좋다.
  206. numberCellPrepared = function(cellElement, cellInfo) {
  207. var numberIndex = 0;
  208. if (options.selection && options.selection.mode === 'multiple') {
  209. numberIndex = 1;
  210. }
  211. //if (cellInfo.columnIndex === numberIndex) { // 2015 07 18 hcLee V14.1-V15.1
  212. if (cellInfo.columnIndex === numberIndex && cellInfo.rowType == 'data') { // // 2015 07 18 hcLee V14.1-V15.1
  213. var isAsc = cellInfo.column.sortOrder === 'asc';
  214. if (datagrid === null) {
  215. datagrid = $('#' + options.datagridId).dxDataGrid('instance');
  216. }
  217. var number;
  218. if (cellInfo.column.sortOrder === 'asc') {
  219. number = cellInfo.row.dataIndex + 1 + (datagrid.pageIndex() * datagrid.pageSize());
  220. }
  221. else {
  222. // 2015 07 18 V15.1에서는 cellInfo.rowType == 'data'인 경우에만 row.dataIndex가 의미를 가짐
  223. number = datagrid.totalCount() - (datagrid.pageIndex() * datagrid.pageSize()) - cellInfo.row.dataIndex;
  224. }
  225. //cellInfo.value = cellInfo.displayValue = cellInfo.rowIndex + 1;
  226. //cellInfo.text = number;
  227. $(cellElement).text(number);
  228. }
  229. };
  230. }
  231. if (typeof options.cellPrepared === 'function') {
  232. var cellPrepared = options.cellPrepared;
  233. options.cellPrepared = function(cellElement, cellInfo) {
  234. if (numberCellPrepared != null) numberCellPrepared(cellElement, cellInfo);
  235. cellPrepared(cellElement, cellInfo);
  236. };
  237. }
  238. else if (numberCellPrepared != null) {
  239. options.cellPrepared = numberCellPrepared;
  240. }
  241. if (typeof options.datagridId === "string") {
  242. var self = this;
  243. options.rowClick = function(clickRow) {
  244. if (_.isFunction(options.selectedData)) {
  245. options.selectedData(clickRow.data);
  246. }
  247. self.setSelectedId(clickRow.data, options.viewId, options.dbId, options);
  248. var dataGridInstance = $(['#', options.datagridId].join('')).dxDataGrid('instance');
  249. if (typeof options.handleDataGridRowClick == 'function') {
  250. // handleShowPopup으로 팝업을 띄우도록 수정했는데,
  251. // showPopup 라는 대행함수를 연결함
  252. var showPopup = function(show) {
  253. if (show) {
  254. options.handleShowPopup(clickRow.data);
  255. }
  256. else {
  257. options.popupVisible(false);
  258. }
  259. }
  260. options.handleDataGridRowClick(options.datagridId, dataGridInstance, clickRow, showPopup);
  261. }
  262. else {
  263. //hcLee 2016 02 19 추가
  264. if (_.isFunction(options.handleShowPopup)) {
  265. //var dataGrid = $('#gridContainer').dxDataGrid('instance');
  266. dataGridInstance.clearSelection();
  267. options.handleShowPopup(clickRow.data);
  268. }
  269. //options.selectedSourceItem.fromJS(clickRow.data);
  270. //utils.datagrid.popupView(clickRow.data, options.viewId, options.dbId, options);
  271. //utils.datagrid.navigateView(clickRow.data, options.viewId, options.dbId);
  272. }
  273. };
  274. }
  275. return options;
  276. }
  277. }
  278. });
  279. });