///////////////////////////////////////////////////////////////////////////
|
// 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/on',
|
'dojo/Evented',
|
'dojo/_base/lang',
|
'dojo/_base/html',
|
'dojo/_base/array',
|
'dojo/_base/declare',
|
'dijit/_WidgetBase',
|
'dijit/_TemplatedMixin',
|
'jimu/utils',
|
'esri/lang'
|
],
|
function(on, Evented, lang, html, array, declare, _WidgetBase, _TemplatedMixin, jimuUtils, esriLang) {
|
|
return declare([_WidgetBase, _TemplatedMixin, Evented], {
|
baseClass: 'jimu-filter-value-provider',
|
fieldName: null,
|
shortType: null,
|
_enabled: false,
|
cascade: "none",//none,previous,all
|
filterCodedValue: false,
|
fieldPopupInfo: null,//maybe null
|
|
//options
|
nls: null,
|
url: null,
|
layerDefinition: null,
|
fieldInfo: null,
|
partObj: null,
|
runtime: true,//If true, means used at widget runtime. If false, means used in widget setting page.
|
//partObj.valueObj.type must be set
|
//partObj.valueObj.value, partObj.valueObj.value1 and partObj.valueObj.value2 are optional
|
staticValues: null,//[{value,label}]
|
codedValues: null,//[{value,label}] for coded values and sub types
|
layerInfo: null,//optional, jimu/LayerInfos/LayerInfo
|
popupInfo: null,//optional
|
operatorInfo: null,
|
filterCodedValueIfPossible: false,
|
|
//partObj
|
/*{
|
"fieldObj": {
|
"name": "OBJECTID",
|
"label": "OBJECTID",
|
"shortType": "number",
|
"type": "esriFieldTypeOID"
|
},
|
"operator": "numberOperatorIs",
|
"valueObj": {
|
"isValid": true,
|
"type": "value",
|
"value": 123
|
},
|
"interactiveObj": "",
|
"caseSensitive": false,
|
"expr": "OBJECTID = 123"
|
}*/
|
//codedValues
|
/*
|
[{
|
name: "Excellent",
|
code: 0
|
},{
|
name: "Good",
|
code: 1
|
},{
|
name: "Fair",
|
code: 2
|
},{
|
name: "Poor",
|
code: 3
|
}]
|
*/
|
|
//methods needs to override:
|
//setValueObject
|
//getValueObject
|
|
postMixInProperties: function(){
|
this.inherited(arguments);
|
this.shortType = this.partObj.fieldObj.shortType;
|
this.fieldName = this.partObj.fieldObj.name;
|
this.cascade = this.partObj.interactiveObj && this.partObj.interactiveObj.cascade;
|
if(this.runtime && this.codedValues && this.filterCodedValueIfPossible &&
|
jimuUtils.isCodedValuesSupportFilter(this.layerDefinition, this.codedValues.length)){
|
this.filterCodedValue = true;
|
}else{
|
this.filterCodedValue = false;
|
}
|
if(this.popupInfo){
|
if(this.popupInfo.fieldInfos && this.popupInfo.fieldInfos.length > 0){
|
array.some(this.popupInfo.fieldInfos, lang.hitch(this, function(fieldPopupInfo){
|
if(fieldPopupInfo.fieldName === this.fieldName){
|
this.fieldPopupInfo = fieldPopupInfo;
|
return true;
|
}else{
|
return false;
|
}
|
}));
|
}
|
}
|
},
|
|
getDijits: function(){
|
return [];
|
},
|
|
//bind change event
|
bindChangeEvents: function() {
|
//var classNames = ["dijit.form.FilteringSelect", "dijit.form.ValidationTextBox",
|
// "dijit.form.DateTextBox", "dijit.form.NumberTextBox"];
|
var dijits = this.getDijits();
|
|
array.forEach(dijits, lang.hitch(this, function(dijit) {
|
if(dijit.declaredClass && dijit.declaredClass.indexOf("dijit.") === 0){
|
//dijit.form.FilteringSelect -> dijit-form-FilteringSelect
|
html.addClass(dijit.domNode, dijit.declaredClass.replace(/\./g, '-'));
|
}
|
this.own(on(dijit, 'change', lang.hitch(this, this._onChanged)));
|
this.own(on(dijit, 'enter', lang.hitch(this, this._onEnter)));
|
}));
|
},
|
|
_onChanged: function(){
|
if(this._onEnterTriggered){
|
return;
|
}
|
this.emit('change');
|
},
|
|
_onEnterTriggered: false,
|
|
_onEnter: function(){
|
this._onEnterTriggered = true;
|
this.emit('change');
|
this.emit('enter');
|
setTimeout(lang.hitch(this, function(){
|
this._onEnterTriggered = false;
|
}), 100);
|
},
|
|
tryLocaleNumber: function(value) {
|
var result = jimuUtils.localizeNumber(value);
|
if (result === null || result === undefined) {
|
result = value;
|
}
|
return result;
|
},
|
|
getPartObject: function(){
|
var valueObj = this.getValueObject();
|
if(!valueObj){
|
return null;
|
}
|
var partObj = lang.clone(this.partObj);
|
partObj.valueObj = valueObj;
|
return partObj;
|
},
|
|
//maybe return a deferred object
|
setValueObject: function(){},
|
|
getValueObject: function(){},
|
|
//used for _SingleFilter
|
tryGetValueObject: function(){
|
return this.getValueObject();
|
},
|
|
setRequired: function(){},
|
|
//-1 means invalid value type
|
//0 means empty value, this ValueProvider should be ignored
|
//1 means valid value
|
getStatus: function(){
|
var status = 1;
|
var dijits = this.getDijits();
|
if(dijits.length > 0){
|
var statusArr = array.map(dijits, lang.hitch(this, function(dijit){
|
if(typeof dijit.getStatus === 'function'){
|
return dijit.getStatus();
|
}else{
|
return this.getStatusForDijit(dijit);
|
}
|
}));
|
status = Math.min.apply(statusArr, statusArr);
|
}
|
return status;
|
},
|
|
//return -1 means input a wrong value
|
//return 0 means empty value
|
//return 1 means valid value
|
getStatusForDijit: function(dijit){
|
if(dijit.validate()){
|
if(dijit.get("DisplayedValue")){
|
return 1;
|
}else{
|
return 0;
|
}
|
}else{
|
return -1;
|
}
|
},
|
|
isInvalidValue: function(){
|
return this.getStatus() < 0;
|
},
|
|
isEmptyValue: function(){
|
return this.getStatus() === 0;
|
},
|
|
isValidValue: function(){
|
return this.getStatus() > 0;
|
},
|
|
isBlankValueProvider: function(){
|
return false;
|
},
|
|
//Filter related dijits doesn't call this method. GroupFilter and some other widgets call it.
|
getFilterExpr: function(){
|
var expr = "1=1";
|
var expr1 = this.getLayerFilterExpr();
|
if(this.cascade === "all" || this.cascade === "previous"){
|
var expr2 = this.getCascadeFilterExpr();
|
expr = "(" + expr1 + ") AND (" + expr2 + ")";
|
}else{
|
expr = expr1;
|
}
|
return expr;
|
},
|
|
//This method id only called by getFilterExpr.
|
getLayerFilterExpr: function(){
|
var expr = "1=1";
|
if(this.layerInfo){
|
expr = this.layerInfo.getFilter();
|
}
|
if(!expr){
|
expr = "1=1";
|
}
|
return expr;
|
},
|
|
_getWebMapFilterExpr: function(){
|
var expr = "";
|
if(this.layerInfo){
|
expr = this.layerInfo.getFilterOfWebmap();
|
}
|
if(!expr){
|
expr = "1=1";
|
}
|
return expr;
|
},
|
|
//used for ListValueProvider
|
getDropdownFilterExpr: function(){
|
var expr = "1=1";
|
var expr1 = this._getWebMapFilterExpr();
|
if(this.cascade === "all" || this.cascade === "previous"){
|
var expr2 = this.getCascadeFilterExpr();
|
expr = "(" + expr1 + ") AND (" + expr2 + ")";
|
}else{
|
expr = expr1;
|
}
|
return expr;
|
},
|
|
getCascadeFilterExpr: function(){
|
return "1=1";
|
},
|
|
getDropdownFilterPartsObj: function(){
|
var partsObj = {parts:[]};
|
if(this.cascade === "all" || this.cascade === "previous"){
|
partsObj = this.getCascadeFilterPartsObj();
|
}
|
return partsObj;
|
},
|
|
getCascadeFilterPartsObj: function(){
|
return {};
|
},
|
|
//get codedvalue list by partsObj
|
//partsObj: eg: {logicalOperator:"AND",parts:[]}
|
getCodedValueListByPartsObj: function(layerDefinition, fieldName, partsObj, /*optional*/codedValues){
|
var fieldInfo = jimuUtils.getFieldInfoByFieldName(layerDefinition.fields, fieldName);
|
var typeIdField = layerDefinition.typeIdField;
|
var valueLabels = null;
|
var typeIdFieldValue;
|
|
var parts = partsObj.parts;
|
for(var key in parts){
|
var part = parts[key];
|
if(part.fieldObj.name === typeIdField){ //not considering the subtypeid exists twice or more
|
typeIdFieldValue = part.valueObj.value;
|
valueLabels = jimuUtils._getCodedValueBySubTypeId(layerDefinition, fieldName, typeIdFieldValue, fieldInfo);
|
break;
|
}
|
}
|
|
var selectedValue;
|
if(!valueLabels){
|
if(codedValues){
|
valueLabels = codedValues;
|
}else{
|
valueLabels = jimuUtils._getAllCodedValue(layerDefinition, fieldInfo);
|
}
|
}
|
if(valueLabels && valueLabels.length > 0){
|
selectedValue = valueLabels[0].value;
|
}
|
return {
|
selectedValue: selectedValue,
|
valueLabels: valueLabels
|
};
|
},
|
|
isDefined: function(value){
|
return esriLang.isDefined(value);
|
},
|
|
disable: function(){
|
this._enabled = false;
|
},
|
|
enable: function(){
|
this._enabled = true;
|
},
|
|
isEnabled: function(){
|
return this._enabled;
|
},
|
|
destroy: function(){
|
this.inherited(arguments);
|
}
|
|
});
|
});
|