/////////////////////////////////////////////////////////////////////////// // Copyright © 2014 - 2018 Esri. All Rights Reserved. // // Licensed under the Apache License Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /////////////////////////////////////////////////////////////////////////// define([ 'dojo/_base/lang', 'dojo/Deferred', 'dojo/_base/html', 'dojo/_base/array', 'dojo/_base/declare', 'dojo/Evented', // 'dojo/on', 'dojo/query', './ValueProvider', './EditTable', './AdvancedListValueSelect', 'dijit/_TemplatedMixin', 'dijit/_WidgetsInTemplateMixin', 'dojo/text!./PredefinedValuePopup.html', 'dojo/store/Memory', 'jimu/utils', 'jimu/dijit/Popup', 'jimu/dijit/_filter/pageControlForQuery', 'dojox/form/CheckedMultiSelect' ], function(lang, Deferred, html, array, declare, Evented, query, ValueProvider, EditTable, AdvancedListValueSelect, _TemplatedMixin, _WidgetsInTemplateMixin,template, Memory, jimuUtils, Popup, pageControlForQuery, CheckedMultiSelect) { return declare([ValueProvider, _TemplatedMixin, _WidgetsInTemplateMixin, Evented], { templateString: template, codedValues: null,//[{value,label}] for coded values and sub types staticValues: null,//[{value,label}] showNullValues: false,//show null values cbxPopup: null, pageSize: 1000, //page size pageIndex:1, //current page //optional selectUI: null, //dropdown, expanded postMixInProperties:function(){ this.inherited(arguments); this.CommonNls = window.jimuNls.common; this.Nls = window.jimuNls.filterBuilder; this.emptyStr = window.apiNls.widgets.FeatureTable.empty; }, postCreate: function(){ this.inherited(arguments); this.selectUI = this.selectUI ? this.selectUI : 'dropdown'; html.addClass(this.domNode, 'jimu-filter-mutcheck-list-value-provider'); // this.layerName.innerText = this.layerDefinition.name; this.controlType = 'unique'; //unique, multiple if(this.providerType === 'MULTIPLE_PREDEFINED_VALUE_PROVIDER'){ this.controlType = 'multiple'; } this.isNumberField = jimuUtils.isNumberField(this.fieldInfo.type); if(!this.editTable){ this.editTable = new EditTable({ tableType: this.controlType, dataList: [], codedValues: this.codedValues, emptyStr: this.emptyStr, customValue: this.Nls.addValuePlaceHolder, customLabel: this.Nls.addLabelPlaceHolder, isNumberField: this.isNumberField }); this.editTable.placeAt(this.tableContent); this.editTable.on("editTable_openListSelectByName", lang.hitch(this, this._showListSelectByTable)); this.editTable.on("editTable_itemChanged", lang.hitch(this, this._editTableItemChanged)); this.editTable.on("editTable_getValLabelsArrayForNumber", lang.hitch(this, this._getValLabelsArrayForNumber)); } this.supportPaing = true; if(!this.pageControlForQuery){ this.pageControlForQuery = new pageControlForQuery({ pageSize: this.pageSize, pageIndex: 1, layerUrl: this.url, // layerInfo: this.layerInfo, fieldInfo: this.fieldInfo, queryWhere: '1=1', layerDefinition: this.layerDefinition, fieldPopupInfo: this.fieldPopupInfo, // spatialReference: this.layerInfo.map.spatialReference, isNumberField: this.isNumberField }); } if(!this.listSelect){ // this._initAdvancedListValueSelect(); this.listSelect = new AdvancedListValueSelect({ emptyStr: this.emptyStr, runtime: this.runtime, pageSize: this.pageSize, // selectType: 'multiple',// when it's in header selectType: 'unique',//when it's for single item controlType: 'predefined', dataList:[], selectedDataList:[], isNumberField: this.isNumberField }); // this.listSelect.placeAt(this.listSelectStore); // this.own(topic.subscribe("AdvancedListValueSelect/itemChecked", lang.hitch(this, this._createTarget))); this.listSelect.on("advancedListValueSelect_itemChecked", lang.hitch(this, this._createTarget)); this.listSelect.on("advancedListValueSelect_itemUnChecked", lang.hitch(this, this._destoryTarget)); this.listSelect.on("advancedListValueSelect_addNextPage", lang.hitch(this, this._addNextPage)); this.listSelect.on("advancedListValueSelect_searchKey", lang.hitch(this, this._searchKey)); this.listSelect.on("advancedListValueSelect_searchKeyLocal", lang.hitch(this, this._searchKeyLocal)); this.listSelect.on("advancedListValueSelect_itemCheckedForPredefined", lang.hitch(this, this._createTargetForPredefined)); } if(!this.mutiValuesSelect){ this.mutiValuesSelect = new CheckedMultiSelect({ multiple: true, required: false, intermediateChanges: true, //Fires onChange for each value change or only on demand style: {'width':'100%'} }); } //event this._multipleSelectProviderEventHandler = lang.hitch(this, this._multipleSelectProviderEvent); document.addEventListener('click', this._multipleSelectProviderEventHandler); /* this.own(on(document, 'click', lang.hitch(this, function(evt){ var target = event.target || event.srcElement; if((this.editTable && target !== this.editTable.searchTarget) && (this.cbxPopup && this.cbxPopup.domNode && !html.isDescendant(target, this.cbxPopup.domNode))){ this._createTargetForPredefined(); evt.stopPropagation(); return; } if(this.editTable && target === this.editTable.searchTarget && (this.cbxPopup && this.cbxPopup.domNode)){ //click search if(html.getStyle(this.cbxPopup.domNode, 'display') === 'block'){ html.setStyle(this.cbxPopup.domNode, 'display', 'none'); }else{ html.setStyle(this.cbxPopup.domNode, 'display', 'block'); } return; } var isIn = this._isInSelectPopup(target); if(isIn || this.runtime){ //always displaying on runtime page evt.stopPropagation(); return; }else{ html.setStyle(this.valuesPopupNode, 'display', 'none'); } }))); */ // this.own(on(this.valuesPopupNode, 'click', lang.hitch(this, function(evt){ // evt.stopPropagation(); // }))); //[{id,value,label}] var store = new Memory({idProperty:'id', data: []}); this.listSelect.set('store', store); }, _multipleSelectProviderEvent: function(event){ var target = event.target || event.srcElement; var isSearchBtn = html.isDescendant(target, this.editTable.searchBtn); if(this.editTable && this.cbxPopup && this.cbxPopup.domNode){ if(isSearchBtn){ //click search btn if(html.getStyle(this.cbxPopup.domNode, 'display') === 'block'){ html.setStyle(this.cbxPopup.domNode, 'display', 'none'); }else{ html.setStyle(this.cbxPopup.domNode, 'display', 'block'); } }else if(!html.isDescendant(target, this.cbxPopup.domNode)){ //other space this._createTargetForPredefined(); } event.stopPropagation(); return; } var isIn = this._isInSelectPopup(target); if(isIn || this.runtime){ //always displaying on runtime page event.stopPropagation(); return; }else{ html.setStyle(this.valuesPopupNode, 'display', 'none'); } }, _initAdvancedListValueSelect: function(){ this.pageControlForQuery.pageIndex = 1; this.pageControlForQuery.isKeyQueryLoader = false; this.listSelect = new AdvancedListValueSelect({ emptyStr: this.emptyStr, runtime: this.runtime, pageSize: this.pageSize, isCacheFinish: this.pageControlForQuery._isUniqueValueCacheFinish, // selectType: 'multiple',// when it's in header selectType: 'unique',//when it's for single item controlType: 'predefined', dataList:[], selectedDataList:[], isNumberField: this.isNumberField }); // this.listSelect.placeAt(this.listSelectStore); // this.own(topic.subscribe("AdvancedListValueSelect/itemChecked", lang.hitch(this, this._createTarget))); this.listSelect.on("advancedListValueSelect_itemChecked", lang.hitch(this, this._createTarget)); this.listSelect.on("advancedListValueSelect_itemUnChecked", lang.hitch(this, this._destoryTarget)); this.listSelect.on("advancedListValueSelect_addNextPage", lang.hitch(this, this._addNextPage)); this.listSelect.on("advancedListValueSelect_searchKey", lang.hitch(this, this._searchKey)); this.listSelect.on("advancedListValueSelect_searchKeyLocal", lang.hitch(this, this._searchKeyLocal)); this.listSelect.on("advancedListValueSelect_itemCheckedForPredefined", lang.hitch(this, this._createTargetForPredefined)); }, _isInSelectPopup:function(target){ var classList = ['dijitCheckBoxInput', 'dojoxMultiSelectItemLabel', 'dojoxMultiSelectItemBox', 'dojoxMultiSelectItem', 'dojoxCheckedMultiSelectWrapper', 'dojoxCheckedMultiSelect', 'value-type-popup', 'popupOper', 'pageItem']; var isIn = false; for(var key = 0;key <= classList.length; key ++ ){ if(html.hasClass(target, classList[key])){ isIn = true; break; } } return isIn; }, //for list select popup // _createTarget: function(name){ // this.editTable._createTarget(name); // }, //for editTable _createTarget: function(){ this.editTable._createTarget('', '', '', '', true); this._editTableItemChanged(); }, _createTargetForPredefined: function(value, name){ this.editTable._setNewLabel(value, name); this.cbxPopup.close(); this._editTableItemChanged(); }, _destoryTarget:function(name){ this.editTable._destroyTarget(name); this._editTableItemChanged(); }, _editTableItemChanged: function(){ if(!this.runtime){ var valueObj = this.getValueObject(); this._setApplyState(valueObj.value.length); } }, _setApplyState: function(state){ this.emit("predefinedValuePopup_setApplyBtnState", state); }, _cbxWidth: 245, _cbxHeight: 340, isPopupLoading: false, _showListSelectByTable: function(name){ if(this.isPopupLoading){ return; } this._initAdvancedListValueSelect();//init select & pagecontrol this.valueList = [name]; this.getCheckedList(this.valueList); var rPosition = html.position(this.editTable.searchBtn); var popupPosition = { left: rPosition.x - 226, top: rPosition.y + 30 }; if(window.isRTL){ popupPosition.left = rPosition.x; } this.cbxPopup = new Popup({ width: this._cbxWidth, height: this._cbxHeight, content: this.listSelect.domNode, enableMoveable: false, hasTitle: false, hasOverlay: false, contentHasNoMargin: true, moveToCenter: false, customPosition: {left: popupPosition.left, top: popupPosition.top}, buttons: [] }); //update popup UI for this dijit this.cbxPopup.setDomNodeStyls({'border-radius': 0, 'border': '1px solid #999'}); this.cbxPopup.on("popupHasInitedSuccessfully", lang.hitch(this, function(){ var rPosition = html.position(this.editTable.searchBtn); var popupPosition = { left: rPosition.x - 226, top: rPosition.y + 30 }; if(window.isRTL){ popupPosition.left = rPosition.x; } this.cbxPopup.setCustomPosition(popupPosition.left, popupPosition.top); })); if(this.listSelect.valueInput){ this.listSelect.valueInput.focus(); } this._showLoadingIcon(); this.isPopupLoading = true; this._valueLabels().then(lang.hitch(this, function(valueLabels) { this.isPopupLoading = false; this._hideLoadingIcon(); if(valueLabels === true){ }else{ var ifCheck = false; if(this.valueList && this.valueList.length !== 0){ ifCheck = true; } this.listSelect.setCBXData(valueLabels,ifCheck); } })); }, _valueLabels: function(){ var def = new Deferred(); this.listSelect.codedValues = false; this.listSelect.disPlayLabel = 'label'; if(this.staticValues){ this._setValueForStaticValues(this.staticValues); def.resolve(true); return def; } else if(this.codedValues){ if(this.filterCodedValue){ this.listSelect.codedValues = true; }else{ this._setValueForStaticValues(this.codedValues); def.resolve(true); return def; } } this.pageControlForQuery.queryByPage(true).then(lang.hitch(this, function(valueLabels){ //for multiple def.resolve(valueLabels); }), lang.hitch(this, function(err){ console.log(err); this._hideLoadingIcon(); def.reject(err); })); return def; }, _setValueForStaticValues: function(valueLabels){ this.listSelect.codedValues = true; if(valueLabels){ this.pageControlForQuery._codedvalueCache = valueLabels; valueLabels = valueLabels.length > 0 ? valueLabels : []; // this.listSelect.disPlayLabel = 'label'; this.listSelect.setCBXData(valueLabels, true, true); } }, //types: dropdown, expanded _changeDisplayType: function(evt){ var target = evt.target || evt.srcElement; var option; if(html.hasClass(target, 'option')){ option = target; }else{ option = jimuUtils.getAncestorDom(target, function(dom){ return html.hasClass(dom, 'option'); }, 2); } if(!html.hasClass(option, 'checked')){ html.addClass(option, 'checked'); var otherOption = query('.' + this.selectUI + 'Option ', this.displayTypes)[0]; html.removeClass(otherOption, 'checked'); // this.selectUI = html.hasClass(option, 'dropdownOption') ? 'dropdown' : 'expanded'; this.selectUI = this.selectUI === 'expanded' ? 'dropdown' : 'expanded'; } }, _setDisplayTypeStyle: function(){ var titleDom = query('.title', this.displayTypes)[0]; var labelDoms = query('.label', this.displayTypes); var w = (html.getStyle(this.displayTypes, 'width') - html.getStyle(titleDom, 'width') - 2 * 40) / 2; var leftLabelW = html.getStyle(labelDoms[0], 'width'); leftLabelW = leftLabelW < w ? leftLabelW : w; var rightLabelW = html.getStyle(labelDoms[1], 'width'); rightLabelW = rightLabelW < w ? rightLabelW : w; html.setStyle(labelDoms[0], 'width', leftLabelW + 'px'); html.setStyle(labelDoms[1], 'width', rightLabelW + 'px'); }, _addNextPage: function(){ if(!this.listSelect){ return; } this._showLoadingIcon(); var def = this.pageControlForQuery.queryByPage(this.listSelect.ifFristPage); def.then(lang.hitch(this, function(valueLabels){ this.listSelect.isCacheFinish = this.pageControlForQuery._isUniqueValueCacheFinish; this.listSelect.setCBXData(valueLabels, true); this._hideLoadingIcon(); }), lang.hitch(this, function(err){ console.log(err); this._hideLoadingIcon(); })); }, //this.allFeatures = []; _searchKey: function(name){ if(!this.listSelect){ return; } this._showLoadingIcon(); this.pageControlForQuery._searchKey(name).then(lang.hitch(this, function(result) { this.listSelect.setCBXContentBySearch(result); this._hideLoadingIcon(); }), lang.hitch(this, function(err){ console.log(err); this._hideLoadingIcon(); })); }, _searchKeyLocal: function(name){ if(!this.listSelect){ return; } this._showLoadingIcon(); var result = this.pageControlForQuery._searchKeyLocal(name); this.listSelect.setCBXContentBySearch(result); this._hideLoadingIcon(); }, _handlerPageValues: function(){ }, getCheckedList: function(valueList){ this.listSelect.checkedList = []; if(this.isNumberField){ array.forEach(valueList, lang.hitch(this, function(item) { this.listSelect.checkedList.push(parseFloat(item)); })); }else{ this.listSelect.checkedList = valueList; } }, _showPopup:function(){ // this._showLoadingIcon(); //refresh values var valueList = this.getValueObject().valueList; this.valueList = valueList === null ? undefined : valueList; // this.listSelect.checkedList = this.valueList; // if(this.listSelect.vallueInput === undefined){ // this.cbxPopup = null; // } this.getCheckedList(this.valueList); if(this.cbxPopup){ // this.getCheckedList(this.valueList); this.listSelect.checkCBXItems(false); // this.listSelect.setCBXData(valueLabels,true); this.cbxPopup.show(); // this._hideLoadingIcon(); return; } var popupName = this.layerDefinition.name + '(' + this.fieldName + ')'; this.cbxPopup = new Popup({ width: 355, height: 596, content: this.listSelect.domNode, //need a dom, not html string titleLabel: popupName, isResize: false, // onClose: function(){return false}, onClose: lang.hitch(this, function () { //save dom // this.cbxPopup.content = null; // html.place(this.listSelect.domNode, this.listSelectStore); //continue this.cbxPopup.hide(); return false; }), buttons: [] }); this._showLoadingIcon(); this.pageControlForQuery.queryByPage().then(lang.hitch(this, function(valueLabels) { this._hideLoadingIcon(); var ifCheck = false; if(this.valueList && this.valueList.length !== 0){ ifCheck = true; } // var cbxData = this.listSelect.setCBXData(valueLabels,ifCheck); this.listSelect.setCBXData(valueLabels,ifCheck); })); }, getDijits: function(){ return [this.mutiValuesSelect]; }, setValueObject: function(valueObj){//, isFromConfig valueObj.value = valueObj.value? valueObj.value: []; var selectUI = valueObj.selectUI ? valueObj.selectUI : this.selectUI; var typeOption = query('.' + selectUI + 'Option ', this.displayTypes)[0]; html.addClass(typeOption, 'checked'); var newValueLabels = null;//get values' format datas on the first colum in table if(this.isNumberField){ var valsArray = []; for(var key = 0; key < valueObj.value.length; key ++){ valsArray.push(valueObj.value[key].value); } newValueLabels = this._getValLabelsArrayForNumber(false, valsArray); } this.editTable.emptyLabel = valueObj.emptyLabel; this.editTable.enableEmpty = valueObj.enableEmpty; this.editTable.setListValues(valueObj.value, newValueLabels); }, _getValLabelsArrayForNumber: function(isTrigger, valsArray){ var valueLabels = jimuUtils._getValues(this.layerDefinition, this.fieldPopupInfo, this.fieldName, valsArray); if(isTrigger){ this.editTable.currentValLabel = valueLabels[0].label; } return valueLabels; }, tryGetValueObject: function(){ if(this.isValidValue()){ return this.getValueObject(); }else if(this.isEmptyValue()){ return { "isValid": true, "selectUI": this.selectUI, "type": this.partObj.valueObj.type, "value": [], "valueList": [] }; } return null; }, getValueObject: function(){ if(this.isValidValue()){ var valsObj = this.editTable.getListValues(); var result = { "isValid": true, "selectUI": this.selectUI, "type": this.partObj.valueObj.type, "value": valsObj.list, //valueObj list "valueList": valsObj.valueList //value list }; if(this.controlType === 'unique'){ result.emptyLabel = valsObj.emptyLabel; result.enableEmpty = valsObj.enableEmpty; } return result; } return null; }, setRequired: function(required){ this.mutiValuesSelect.set("required", required); }, queryByPage: function(){ var def = this.pageControlForQuery.queryByPage(this.listSelect.ifFristPage); def.then(lang.hitch(this, function(features){ def.resolve(features); }), lang.hitch(this, function(err){ console.log(err); def.reject(err); })); }, _showLoadingIcon: function(){ if(this.listSelect && this.listSelect.listContainer){ html.addClass(this.listSelect.listContainer, 'jimu-circle-loading'); } }, _hideLoadingIcon: function(){ if(this.listSelect && this.listSelect.listContainer){ html.removeClass(this.listSelect.listContainer, 'jimu-circle-loading'); } }, destroy: function() { if(this._multipleSelectProviderEventHandler){ document.removeEventListener('click', this._multipleSelectProviderEventHandler); } this.inherited(arguments); }, destroyProvider:function(){ if(this.editTable){ this.editTable.destroy(); } // this.editTable = null; if(this.listSelect){ this.listSelect.destroy(); } this.listSelect = null; this.destroy(); html.destroy(this.domNode); // this.inherited(arguments); } }); });