BemsWebApplication.Formula = function (params, viewInfo) { "use strict"; var FACILITY_TYPE_DEPTH = 2, FACILITY_DEPTH = 3, FORMULA_DEPTH = 4; var FNameForSearch = ko.observable(), PNameForSearch = ko.observable(); var eq = BWA.DataUtil.constructEqualFilter; // hcLee 2016 01 15 확장 var deferredForSearch = new $.Deferred(); // hcLee 2016 01 15 확장 var works = ko.observableArray(); var facilityTypeDataSource = BemsWebApplication.db.createDataSource('BemsFacilityType'), facilityDataSource = BemsWebApplication.db.createDataSource('CmFacility', true), formulaBaseDataSource = BemsWebApplication.db.createDataSource('BemsFormulaBase'), formulaDataSource = BemsWebApplication.db.createDataSource('BemsFormula'), tableDataSource = BemsWebApplication.db.createDataSource('BemsFormulaTable'), parameterDataSource = BWA.DataUtil.createDataSource({ dataSourceOptions: { select: [ 'SiteId', 'FacilityTypeId', 'FacilityCode', 'FormulaId', 'ParameterId', 'ParameterFacilityCode', 'ParameterPropertyId', 'CmFacility/Name', 'BemsMonitoringPoint/Name', 'BemsMonitoringPoint/CmFacility/Name' ], expand: ['CmFacility', 'BemsMonitoringPoint', 'BemsMonitoringPoint/CmFacility'], extendOptions: { forceOriginalField: true, alterNames: { 'CmFacility/Name': 'FacilityName', 'BemsMonitoringPoint/Name': 'PointName', } } } }, 'BemsFormulaParameter'), formulaDataViewModel = new BWA.BemsFormulaViewModel(), factory = BemsWebApplication.Factory.PointLocationMapping, viewModel, formulaPointPopup = null, gridView, popupVisible = ko.observable(false), parameters = ko.observableArray(), facilityParameters = ko.observableArray(), selectedTreeItemData = ko.observable(null), selectedTreeItem = ko.observable(null), // 2015 11 12 hcLee 추가 기존 TreeItem -> TreeItemData 로 변경 하고 (위) 이거 추가함 // selectedPoints = ko.observableArray(), pointDataSource = factory.getDataSource(), /* pointDataSource = BWA.DataUtil.createDataSource({ dataSourceOptions: { select: [ 'SiteId', 'FacilityTypeId', 'FacilityCode', 'PropertyId', 'BuildingId', 'FloorId', 'ZoneId', 'ValueType', //'IsAccumulated', 'Name', 'Description', 'CmFacility/Name', 'BemsServiceType/Name', 'BemsFacilityType/Name', 'BemsFuelType/Name' ], expand: ['CmFacility', 'BemsServiceType', 'BemsFacilityType', 'BemsFuelType'], extendOptions: { forceOriginalField: true //alterNames: { // 'CmFacility/Name': 'FacilityName', //} }, filter: [ ['SiteId', '=', BWA.UserInfo.SiteId()], 'and', ['FacilityTypeId', '<', 100] ]}, }, 'BemsMonitoringPoint'), */ pointDataGridOptions = utils.datagrid.defaultOptions({ // 중요 !!! hcLee 2016 01 15 //dxDataSource: pointDataSource, dataSource: works, /* filter: [ // ['SiteId', '=', BWA.UserInfo.SiteId()] eq('FacilityCode', 1002), ], */ datagridId: 'pointDataGrid', dbId: 'BemsMonitoringPoint', width: '100%', height: 720, //selection: { // mode: 'multiple' //}, columns: factory.getColumns([ { dataField: 'CmFacility/Name', width: '30%' }, { dataField: 'Name', width: '55%' }, { dataField: 'ValueType', width: '15%' } ]), wordWrapEnabled: true, rowPrepared: function (rowElement, rowInfo) { if (rowInfo.rowType != 'data') { return; } rowElement .addClass('draggablePointRow') .data('data', rowInfo.data) .data('keyValue', rowInfo.key); }, contentReadyAction: function (e) { e.element.find('.draggablePointRow').draggable({ cursor: 'point', appendTo: '#mainContents', cursorAt: { right: 0, bottom: 0 }, helper: function (e) { var div = $('
', { 'overflow': 'auto' }); div.text('test'); return div; }, start: function (event, ui) { var $originalRow = $(this); var $originalRowCells = $originalRow.children(); var key = $originalRow.data('keyValue'); var data = $originalRow.data('data'); ui.helper .data('keyValue', key) .data('data', data) //.text('{0} [{1}]'.formati(data.FacilityName(), data.Name())) .text('{0} [{1}]'.formati(data['CmFacility/Name'](), data.Name())) .addClass('drag-helper'); //console.log(ui.helper); //var $originalRowCells = $originalRow.children(), // $clonedRowCells = $clonedRow.children(); //$('
').text($clonedRowCells.get(1).text()); ////var $originalRowCells = $originalRow.children(), //// $clonedRowCells = $clonedRow.children(); ////for (var i = 0; i < $originalRowCells.length; i++) //// $($clonedRowCells.get(i)).width($($originalRowCells.get(i)).width()); //$clonedRow // .width($originalRow.width()) // .addClass('drag-helper'); //console.log(ui.helper.offset()); //var offset = ui.helper.offset(); //ui.helper.appendTo($('#mainContents')); //ui.position.top = offset.top; //ui.position.left = offset.left; //console.log('after'); //console.log(ui.helper.offset()); ////ui.helper.offset(offset); //ui.helper.css({ // left: offset.left, // top: offset.top //}); //console.log(ui.helper.offset()); } }); }, handleDataGridRowClick: function () { formulaPointPopup.handleDataGridRowClick.apply(this, arguments); }, // : function (id, dataGrid, clickRow, popupVisible) { // viewModel.formulaPointPopup.show(); //} }), parameterDataGridOptions = utils.datagrid.defaultOptions({ dataSource: parameters, datagridId: 'parameterDataGrid', width: '100%', height: 320, pager: { showPageSizeSelector: false, allowedPageSizes: [] }, //selection: { // mode: 'multiple' //}, columns: [ { dataField: 'ParameterId', caption: $G('variable'), width: '10%' }, //{ dataField: 'ParameterFacilityCode/CmFacility/Name', width: '30%' }, // { dataField: 'FacilityName', caption: $G('facilityName'), width: '45%' }, { dataField: 'BemsMonitoringPoint/CmFacility/Name', caption: $G('facilityName'), width: '45%' }, { dataField: 'PointName', caption: $G('pointName'), width: '45%' }, ], wordWrapEnabled: true, rowPrepared: function (rowElement, rowInfo) { if (rowInfo.rowType != 'data') { return; } rowElement .addClass('droppableParameterRow') .data('keyValue', rowInfo.key) .data('data', rowInfo.data); }, contentReadyAction: function (e) { e.element.find('.droppableParameterRow').droppable({ drop: function (event, ui) { var draggingRowKey = ui.draggable.data('keyValue'); var draggingRowData = ui.draggable.data('data'); var targetRowKey = $(this).data('keyValue'); var draggingIndex = null, targetIndex = null; console.log(draggingRowKey); console.log(targetRowKey); var paramter = _.find(parameters(), function (x) { return x.ParameterId === targetRowKey.ParameterId; }); paramter.FacilityKey = draggingRowKey; //paramter.FacilityName = draggingRowData.FacilityName(); //hcLee 2016 03 02 paramter['BemsMonitoringPoint/CmFacility/Name'] = draggingRowData['CmFacility/Name'](); paramter.PointName = draggingRowData.Name(); paramter.ParameterFacilityCode = draggingRowData.FacilityCode(); paramter.ParameterPropertyId = draggingRowData.PropertyId(); $('#parameterDataGrid').dxDataGrid('instance').refresh(); console.log($('#parameterDataGrid').dxDataGrid('instance').option('hoverStateEnabled')); } }); }, handleDataGridRowClick: function (id, dataGrid, clickRow, popupVisible) { }, }), tableDataGridOptions = utils.datagrid.defaultOptions({ dxDataSource: tableDataSource, datagridId: 'tableDataGrid', dbId: 'BemsFormulaTable', width: '100%', height: 240, pager: { showPageSizeSelector: false, allowedPageSizes: [] }, //selection: { // mode: 'multiple' //}, columns: [ { dataField: 'FunctionName', caption: $G('functionName'), width: '20%' }, { dataField: 'Description', caption: $G('description'), width: '80%' }, ], wordWrapEnabled: true, handleDataGridRowClick: function (id, dataGrid, clickRow, popupVisible) { } }); formulaDataViewModel.Name = ko.observable(); // hcLee 2016 01 15 확장 function handleViewShowing() { deferredForSearch.resolve(); handleSearchInSearchView(); } // hcLee 2016 01 15 확장 function handleSearchInSearchView(filter) { var filterA = []; filterA.push(['SiteId', '=', BWA.UserInfo.SiteId()]); filterA.push(['FacilityTypeId', '<', 100]); _.each(filter, function (x) { filterA.push(x); }); pointDataSource.filter(filterA); pointDataSource.load().done(function (result) { works(result); }); } function refreshList() { } function handleClickTreeItem(element, data) { // 2015 11 16 hcLee 추가 selectedTreeItem(data); var depth = data.depth; if (depth !== FORMULA_DEPTH) return; var parent = data.parentData; var data = data.data; selectedTreeItemData(data); var siteId = BWA.UserInfo.SiteId(); var filter = [ eq('SiteId', siteId), 'and', eq('FacilityTypeId', data.FacilityTypeId()), 'and', eq('FormulaId', data.FormulaId()), 'and', eq('FacilityCode', parent.data.FacilityCode()), ]; formulaDataViewModel.SiteId(siteId); formulaDataViewModel.FacilityTypeId(data.FacilityTypeId()); formulaDataViewModel.FacilityCode(parent.data.FacilityCode()); // parent 값을 가져올 수 있도록 treewidget를 수정 하자. formulaDataViewModel.FormulaId(data.FormulaId()); formulaDataViewModel.Name(data.Name); formulaDataSource.filter(filter); formulaDataSource.load().done(function (result) { if (_.isEmpty(result)) { // BWA.DataUtil.resetViewModel(formulaDataViewModel); formulaDataViewModel.Formula(''); parameters([]); return; } formulaDataViewModel.fromJS(result[0].toJS()); formulaDataViewModel.Name(data.Name()); parameterDataSource.filter([ eq('SiteId', siteId), 'and', eq('FacilityTypeId', data.FacilityTypeId()), 'and', //eq('FacilityCode', parent.data.FacilityCode()), eq('FacilityCode', formulaDataViewModel.FacilityCode()), 'and', eq('FormulaId', data.FormulaId()) ]); parameterDataSource.load().done(function (paramterArray) { // if (_.isEmpty(paramterArray) === false) { parameters(paramterArray); // } }); }); } function handleViewShown() { // 트리노드 선택 후 다른 화면으로 이동 한 경우, // 다시 현재 화면으로 들어왔을 때 이전에 선택되어 있던 트리노드가 // 계속 선택된 상태로 표시되는 현상을 막기 위한 코드 if (facilityDataSource._items.length != 0) { var data = selectedTreeItem(); if (data != null) $('#formulaTreeView').cwTreeView('reload', selectedTreeItem().parentData); } var eq = BWA.DataUtil.constructEqualFilter; $('#formulaTreeView').cwTreeView({ width: '40%', height: 'auto', onClickTreeItem: handleClickTreeItem, delegateDataSource: function (data, alterObj) { var id = data.id; var depth = data.depth; var promise = null; switch (depth) { case 0: var typeDeferred = new $.Deferred(); promise = typeDeferred.promise(); alterObj.IsFunction = false; typeDeferred.resolve([ { Id: 99, Name: '등록설비' }, { Id: 100, Name: '시스템' } ]); break; case 1: var filter; switch (data.data.Id) { case 99: filter = [['FacilityTypeId', '<', 99]]; break; case 100: filter = [['FacilityTypeId', '>', 99]]; break; } facilityTypeDataSource.filter(filter); promise = facilityTypeDataSource.load(); break; case 2: facilityDataSource.filter([ eq('SiteId', BWA.UserInfo.SiteId()), 'and', eq('FacilityTypeId', data.data.FacilityTypeId()) ]); promise = facilityDataSource.load(); break; case 3: formulaBaseDataSource.filter([ eq('FacilityTypeId', data.data.FacilityTypeId()) ]); promise = formulaBaseDataSource.load(); break; } return promise; }, }); } function hanleRemoveSelectedParameter() { var gridView = $('#parameterDataGrid').dxDataGrid('instance'); var rows = gridView.getSelectedRowsData(); console.log(rows); } function getParametersFromFormula() { var regex = /\b[A-Z]\b/g; var match; // var ps = parameters(); var list = []; while (match = regex.exec(formulaDataViewModel.Formula())) { var variable = match[0]; if (_.some(list, function (x) { return x.ParameterId() === variable; })) continue; list.push({ 'ParameterId': ko.observable(variable) }); } return list; } function formulaValueChangeAction(e) { var savedParameters = parameters(); var formulaParameters = getParametersFromFormula(); console.log(savedParameters); console.log(formulaParameters); _.each(formulaParameters, function (p) { if (_.some(savedParameters, function (x) { return x.ParameterId() === p.ParameterId(); })) return; parameters.push(p); }); for (var i = 0 ; i < savedParameters.length ; i++) { var p = savedParameters[i]; if (_.some(formulaParameters, function (x) { console.log(x.ParameterId() + ' !== ' + p.ParameterId()); return x.ParameterId() === p.ParameterId(); })) { continue; } parameters.splice(i, 1); i--; } } function saveFormula() { var formula = formulaDataViewModel.toJS(); if (_.some(parameters(), function (x) { // 아래 코드에서 오류발생하여 변경 //return _.isUndefined(x.ParameterFacilityCode) || _.isUndefined(x.ParameterFacilityCode()); return _.isUndefined(x.ParameterFacilityCode); })) { utils.toast.show('관제점이 할당되지 않은 파라미터가 존재합니다.', 'error'); return; } formula.Paramters = _.map(parameters(), function (x) { x = BWA.DataUtil.convertHybridViewModelToJS(x); x.SiteId = formula.SiteId; x.FacilityTypeId = formula.FacilityTypeId; x.FacilityCode = formula.FacilityCode; x.FormulaId = formula.FormulaId; return _.pick(x, 'SiteId', 'FacilityTypeId', 'FacilityCode', 'FormulaId', 'ParameterId', 'ParameterFacilityCode', 'ParameterPropertyId'); }); var promise = BWA.api.post('BemsFormula/PostBemsFormula', formula); promise.done(function () { utils.toast.show($G('successDatabaseProcessMsg')); }); } FNameForSearch(""); PNameForSearch(""); var searchViewOptions = { searchViewItems: [ { id: 'CmFacility/Name', value: FNameForSearch }, { id: 'Name', value: PNameForSearch }, ], promiseDataInSearchView: deferredForSearch.promise() }; viewModel = { // viewShown: handleViewShown, refreshList: refreshList, saveFormula: saveFormula, pointDataGridOptions: pointDataGridOptions, parameterDataGridOptions: parameterDataGridOptions, tableDataGridOptions: tableDataGridOptions, formulaDataViewModel: formulaDataViewModel, formulaValueChangeAction: formulaValueChangeAction, hanleRemoveSelectedParameter: hanleRemoveSelectedParameter, // hcLee 2016 01 15 확장 viewShowing: handleViewShowing, }; formulaPointPopup = viewModel.formulaPointPopup = BWA.Popup.FormulaPointPopup.create(viewModel); // hcLee 2016 01 15 확장 //return $.extend(BWA.CommonView.create(params, viewInfo, viewModel.options, null, handleViewShown), viewModel); return $.extend(BWA.CommonView.create(params, viewInfo, searchViewOptions, ko.observable(null), handleViewShown, null, handleSearchInSearchView), viewModel); };