/////////////////////////////////////////////////////////////////////////// // 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/_base/array', 'dojo/_base/declare', './BlankValueProvider', './SimpleValueProvider', './TwoNumbersValueProvider', './TwoDatesValueProvider', './ListValueProvider', './AdvancedListValueProvider', './PredefinedValueProvider', './NumberListValueProvider', './DateIsInValueProvider', 'jimu/utils', 'jimu/LayerInfos/LayerInfos' ], function(lang, array, declare, BlankValueProvider, SimpleValueProvider, TwoNumbersValueProvider, TwoDatesValueProvider, ListValueProvider, AdvancedListValueProvider, PredefinedValueProvider, NumberListValueProvider, DateIsInValueProvider, jimuUtils, LayerInfos) { var BLANK_VALUE_PROVIDER = "BLANK_VALUE_PROVIDER"; var SIMPLE_VALUE_PROVIDER = "SIMPLE_VALUE_PROVIDER"; var TWO_NUMBERS_VALUE_PROVIDER = "TWO_NUMBERS_VALUE_PROVIDER"; var TWO_DATES_VALUE_PROVIDER = "TWO_DATES_VALUE_PROVIDER"; var LIST_VALUE_PROVIDER = "LIST_VALUE_PROVIDER"; var NUMBER_LIST_VALUE_PROVIDER = "NUMBER_LIST_VALUE_PROVIDER"; var DATE_IS_IN_VALUE_PROVIDER = "DATE_IS_IN_VALUE_PROVIDER"; var ADVANCED_LIST_VALUE_PROVIDER = "ADVANCED_LIST_VALUE_PROVIDER"; var UNIQUE_PREDEFINED_VALUE_PROVIDER = "UNIQUE_PREDEFINED_VALUE_PROVIDER"; var MULTIPLE_PREDEFINED_VALUE_PROVIDER = "MULTIPLE_PREDEFINED_VALUE_PROVIDER"; //operator + type => value provider var relationship = { //string stringOperatorIs: { value: { normalProviderType: SIMPLE_VALUE_PROVIDER, codedValueProviderType: LIST_VALUE_PROVIDER, supportAskForValue: true, supportCaseSensitive: true }, field: { normalProviderType: LIST_VALUE_PROVIDER }, unique: { normalProviderType: LIST_VALUE_PROVIDER, supportAskForValue: true, filterCodedValueIfPossible: true }, uniquePredefined:{ normalProviderType: UNIQUE_PREDEFINED_VALUE_PROVIDER, supportAskForValue: true, supportCaseSensitive: true } }, stringOperatorIsNot: { value: { normalProviderType: SIMPLE_VALUE_PROVIDER, codedValueProviderType: LIST_VALUE_PROVIDER, supportAskForValue: true, supportCaseSensitive: true }, field: { normalProviderType: LIST_VALUE_PROVIDER }, unique: { normalProviderType: LIST_VALUE_PROVIDER, supportAskForValue: true, filterCodedValueIfPossible: true }, uniquePredefined:{ normalProviderType: UNIQUE_PREDEFINED_VALUE_PROVIDER, supportAskForValue: true, supportCaseSensitive: true } }, stringOperatorStartsWith: { value: { normalProviderType: SIMPLE_VALUE_PROVIDER, supportAskForValue: true, supportCaseSensitive: true }, values:{ normalProviderType: SIMPLE_VALUE_PROVIDER }, uniquePredefined:{ normalProviderType: UNIQUE_PREDEFINED_VALUE_PROVIDER, supportAskForValue: true, supportCaseSensitive: true }, multiplePredefined:{ normalProviderType: MULTIPLE_PREDEFINED_VALUE_PROVIDER, supportAskForValue: true, supportCaseSensitive: true } }, stringOperatorEndsWith: { value: { normalProviderType: SIMPLE_VALUE_PROVIDER, supportAskForValue: true, supportCaseSensitive: true }, values:{ normalProviderType: SIMPLE_VALUE_PROVIDER }, uniquePredefined:{ normalProviderType: UNIQUE_PREDEFINED_VALUE_PROVIDER, supportAskForValue: true, supportCaseSensitive: true }, multiplePredefined:{ normalProviderType: MULTIPLE_PREDEFINED_VALUE_PROVIDER, supportAskForValue: true, supportCaseSensitive: true } }, stringOperatorContains: { value: { normalProviderType: SIMPLE_VALUE_PROVIDER, supportAskForValue: true, supportCaseSensitive: true }, values:{ normalProviderType: SIMPLE_VALUE_PROVIDER }, uniquePredefined:{ normalProviderType: UNIQUE_PREDEFINED_VALUE_PROVIDER, supportAskForValue: true, supportCaseSensitive: true }, multiplePredefined:{ normalProviderType: MULTIPLE_PREDEFINED_VALUE_PROVIDER, supportAskForValue: true, supportCaseSensitive: true } }, stringOperatorDoesNotContain: { value: { normalProviderType: SIMPLE_VALUE_PROVIDER, supportAskForValue: true, supportCaseSensitive: true }, values:{ normalProviderType: SIMPLE_VALUE_PROVIDER }, uniquePredefined:{ normalProviderType: UNIQUE_PREDEFINED_VALUE_PROVIDER, supportAskForValue: true, supportCaseSensitive: true }, multiplePredefined:{ normalProviderType: MULTIPLE_PREDEFINED_VALUE_PROVIDER, supportAskForValue: true, supportCaseSensitive: true } }, stringOperatorIsAnyOf: { values:{ normalProviderType: SIMPLE_VALUE_PROVIDER }, multiple:{ normalProviderType: ADVANCED_LIST_VALUE_PROVIDER, supportAskForValue: true, filterCodedValueIfPossible: true }, multiplePredefined:{ normalProviderType: MULTIPLE_PREDEFINED_VALUE_PROVIDER, supportAskForValue: true } }, stringOperatorIsNoneOf: { values:{ normalProviderType: SIMPLE_VALUE_PROVIDER }, multiple:{ normalProviderType: ADVANCED_LIST_VALUE_PROVIDER, supportAskForValue: true, filterCodedValueIfPossible: true }, multiplePredefined:{ normalProviderType: MULTIPLE_PREDEFINED_VALUE_PROVIDER, supportAskForValue: true } }, stringOperatorIsBlank: { value: { normalProviderType: BLANK_VALUE_PROVIDER } }, stringOperatorIsNotBlank: { value: { normalProviderType: BLANK_VALUE_PROVIDER } }, //number numberOperatorIs: { value: { normalProviderType: SIMPLE_VALUE_PROVIDER, codedValueProviderType: LIST_VALUE_PROVIDER, supportAskForValue: true }, field: { normalProviderType: LIST_VALUE_PROVIDER }, unique: { normalProviderType: LIST_VALUE_PROVIDER, supportAskForValue: true, filterCodedValueIfPossible: true }, uniquePredefined:{ normalProviderType: UNIQUE_PREDEFINED_VALUE_PROVIDER, supportAskForValue: true } }, numberOperatorIsNot: { value: { normalProviderType: SIMPLE_VALUE_PROVIDER, codedValueProviderType: LIST_VALUE_PROVIDER, supportAskForValue: true }, field: { normalProviderType: LIST_VALUE_PROVIDER }, unique: { normalProviderType: LIST_VALUE_PROVIDER, supportAskForValue: true, filterCodedValueIfPossible: true }, uniquePredefined:{ normalProviderType: UNIQUE_PREDEFINED_VALUE_PROVIDER, supportAskForValue: true } }, numberOperatorIsAtLeast: { value: { normalProviderType: SIMPLE_VALUE_PROVIDER, supportAskForValue: true }, field: { normalProviderType: LIST_VALUE_PROVIDER }, unique: { normalProviderType: LIST_VALUE_PROVIDER, supportAskForValue: true, filterCodedValueIfPossible: true }, uniquePredefined:{ normalProviderType: UNIQUE_PREDEFINED_VALUE_PROVIDER, supportAskForValue: true } }, numberOperatorIsLessThan: { value: { normalProviderType: SIMPLE_VALUE_PROVIDER, supportAskForValue: true }, field: { normalProviderType: LIST_VALUE_PROVIDER }, unique: { normalProviderType: LIST_VALUE_PROVIDER, supportAskForValue: true, filterCodedValueIfPossible: true }, uniquePredefined:{ normalProviderType: UNIQUE_PREDEFINED_VALUE_PROVIDER, supportAskForValue: true } }, numberOperatorIsAtMost: { value: { normalProviderType: SIMPLE_VALUE_PROVIDER, supportAskForValue: true }, field: { normalProviderType: LIST_VALUE_PROVIDER }, unique: { normalProviderType: LIST_VALUE_PROVIDER, supportAskForValue: true, filterCodedValueIfPossible: true }, uniquePredefined:{ normalProviderType: UNIQUE_PREDEFINED_VALUE_PROVIDER, supportAskForValue: true } }, numberOperatorIsGreaterThan: { value: { normalProviderType: SIMPLE_VALUE_PROVIDER, supportAskForValue: true }, field: { normalProviderType: LIST_VALUE_PROVIDER }, unique: { normalProviderType: LIST_VALUE_PROVIDER, supportAskForValue: true, filterCodedValueIfPossible: true }, uniquePredefined:{ normalProviderType: UNIQUE_PREDEFINED_VALUE_PROVIDER, supportAskForValue: true } }, numberOperatorIsAnyOf: { values:{ normalProviderType: SIMPLE_VALUE_PROVIDER }, multiple:{ normalProviderType: ADVANCED_LIST_VALUE_PROVIDER, supportAskForValue: true }, multiplePredefined:{ normalProviderType: MULTIPLE_PREDEFINED_VALUE_PROVIDER, supportAskForValue: true } }, numberOperatorIsNoneOf: { values:{ normalProviderType: SIMPLE_VALUE_PROVIDER }, multiple:{ normalProviderType: ADVANCED_LIST_VALUE_PROVIDER, supportAskForValue: true }, multiplePredefined:{ normalProviderType: MULTIPLE_PREDEFINED_VALUE_PROVIDER, supportAskForValue: true } }, numberOperatorIsBetween: { value: { normalProviderType: TWO_NUMBERS_VALUE_PROVIDER, supportAskForValue: true } }, numberOperatorIsNotBetween: { value: { normalProviderType: TWO_NUMBERS_VALUE_PROVIDER, supportAskForValue: true } }, numberOperatorIsBlank: { value: { normalProviderType: BLANK_VALUE_PROVIDER } }, numberOperatorIsNotBlank: { value: { normalProviderType: BLANK_VALUE_PROVIDER } }, //date dateOperatorIsOn: { value: { normalProviderType: SIMPLE_VALUE_PROVIDER, supportAskForValue: true }, field: { normalProviderType: LIST_VALUE_PROVIDER } // Unique type can work already but we set it hidden in UI just right now. // , // unique: { // normalProviderType: LIST_VALUE_PROVIDER, // supportAskForValue: true, // filterCodedValueIfPossible: true // } }, dateOperatorIsNotOn: { value: { normalProviderType: SIMPLE_VALUE_PROVIDER, supportAskForValue: true }, field: { normalProviderType: LIST_VALUE_PROVIDER } // Unique type can work already but we set it hidden in UI just right now. // , // unique: { // normalProviderType: LIST_VALUE_PROVIDER, // supportAskForValue: true, // filterCodedValueIfPossible: true // } }, dateOperatorIsIn: { value: { normalProviderType: DATE_IS_IN_VALUE_PROVIDER, supportAskForValue: true } }, dateOperatorIsNotIn: { value: { normalProviderType: DATE_IS_IN_VALUE_PROVIDER, supportAskForValue: true } }, dateOperatorIsBefore: { value: { normalProviderType: SIMPLE_VALUE_PROVIDER, supportAskForValue: true }, field: { normalProviderType: LIST_VALUE_PROVIDER } }, dateOperatorIsAfter: { value: { normalProviderType: SIMPLE_VALUE_PROVIDER, supportAskForValue: true }, field: { normalProviderType: LIST_VALUE_PROVIDER } }, dateOperatorIsOnOrBefore: { value: { normalProviderType: SIMPLE_VALUE_PROVIDER, supportAskForValue: true }, field: { normalProviderType: LIST_VALUE_PROVIDER } }, dateOperatorIsOnOrAfter: { value: { normalProviderType: SIMPLE_VALUE_PROVIDER, supportAskForValue: true }, field: { normalProviderType: LIST_VALUE_PROVIDER } }, dateOperatorInTheLast: { value: { normalProviderType: NUMBER_LIST_VALUE_PROVIDER, supportAskForValue: true } }, dateOperatorNotInTheLast: { value: { normalProviderType: NUMBER_LIST_VALUE_PROVIDER, supportAskForValue: true } }, dateOperatorIsBetween: { value: { normalProviderType: TWO_DATES_VALUE_PROVIDER, supportAskForValue: true } }, dateOperatorIsNotBetween: { value: { normalProviderType: TWO_DATES_VALUE_PROVIDER, supportAskForValue: true } }, dateOperatorIsBlank: { value: { normalProviderType: BLANK_VALUE_PROVIDER } }, dateOperatorIsNotBlank: { value: { normalProviderType: BLANK_VALUE_PROVIDER } } }; var clazz = declare([], { nls: null, layerInfo: null,//jimu/LayerInfos/LayerInfo, maybe null popupInfo: null,//webmap popupInfo, maybe null //options: url: null,//required layerDefinition: null,//required featureLayerId: null,//required constructor: function(options){ //{url,layerDefinition} lang.mixin(this, options); this.nls = window.jimuNls.filterBuilder; var layerInfosObj = LayerInfos.getInstanceSync(); if(this.featureLayerId){ this.layerInfo = layerInfosObj.getLayerOrTableInfoById(this.featureLayerId); if(this.layerInfo){ this.popupInfo = this.layerInfo.getPopupInfo(); } } }, getSupportedValueTypes: function(fieldName, operator){ var valueTypes = [];//["value","field","unique"] var operatorInfo = relationship[operator]; if(operatorInfo){ // var version = parseFloat(this.layerDefinition.currentVersion); if(operatorInfo.value){ valueTypes.push("value"); } if(operatorInfo.field){ var fieldNames = this._getSameShortTypeFieldNames(fieldName); if(fieldNames.length > 0){ valueTypes.push("field"); } } if(operatorInfo.unique){ if(this.url){ if(!this._isStreamServer(this.url)){ // if(version >= 10.1){ valueTypes.push("unique"); // } } } } if(operatorInfo.multiple){ if(this.url){ if(!this._isStreamServer(this.url)){ // if(version >= 10.1){ //version, for query params valueTypes.push("multiple"); // } } } } // if(operatorInfo.values){ //hide values in UI // valueTypes.push("values"); // } if(operatorInfo.uniquePredefined){ if(this.url){ if(!this._isStreamServer(this.url)){ // if(version >= 10.1){ valueTypes.push("uniquePredefined"); // } } } } if(operatorInfo.multiplePredefined){ if(this.url){ if(!this._isStreamServer(this.url)){ // if(version >= 10.1){ valueTypes.push("multiplePredefined"); // } } } } } return valueTypes; }, _isStreamServer: function(url){ url = url || ""; url = url.replace(/\/*$/g, ''); var reg = /\/StreamServer$/gi; return reg.test(url); }, _getSameShortTypeFieldNames: function(fieldName){ var fieldNames = []; var info = this._getFieldInfo(this.layerDefinition, fieldName); var shortType = clazz.getShortTypeByEsriType(info.type); array.forEach(this.layerDefinition.fields, lang.hitch(this, function(fieldInfo){ if(fieldInfo.name !== fieldName){ if(clazz.getShortTypeByEsriType(fieldInfo.type) === shortType){ fieldNames.push(fieldInfo.name); } } })); return fieldNames; }, getValueProvider: function(partObj, runtime){ /*{ "fieldObj": { "name": "OBJECTID", "label": "OBJECTID", "shortType": "number", "type": "esriFieldTypeOID" }, "operator": "numberOperatorIs", "valueObj": { "isValid": true, "type": "value", "value": 123 }, "interactiveObj": "", "caseSensitive": false, "expr": "OBJECTID = 123" }*/ //partObj.valueObj.type must be set //partObj.valueObj.value, partObj.valueObj.value1 and partObj.valueObj.value2 are optional var valueProvider = null; var operator = partObj.operator; var operatorInfo = lang.clone(relationship[operator]); if(operatorInfo){ var valueType = partObj.valueObj.type; var fieldName = partObj.fieldObj.name; var fieldInfo = this._getFieldInfo(this.layerDefinition, fieldName); var valueTypeInfo = operatorInfo[valueType]; var valueProviderType = valueTypeInfo.normalProviderType; var staticValues = null; //for codedValues var codedValues = jimuUtils.getCodedValueListForCodedValueOrSubTypes(this.layerDefinition, fieldName); if(valueType === 'field'){ var otherFieldNames = this._getSameShortTypeFieldNames(fieldName); if(otherFieldNames.length > 0){ staticValues = array.map(otherFieldNames, lang.hitch(this, function(fieldName){ return { value: fieldName, label: fieldName }; })); } }else{ if(codedValues && codedValues.length > 0 && valueTypeInfo.codedValueProviderType){ valueProviderType = valueTypeInfo.codedValueProviderType; } } var filterCodedValueIfPossible = !!valueTypeInfo.filterCodedValueIfPossible; var args = { nls: this.nls, url: this.url, layerDefinition: this.layerDefinition, partObj: partObj, fieldInfo: fieldInfo, codedValues: codedValues, staticValues: staticValues, layerInfo: this.layerInfo, popupInfo: this.popupInfo, operatorInfo: operatorInfo, filterCodedValueIfPossible: filterCodedValueIfPossible, runtime: runtime }; if(valueProviderType === BLANK_VALUE_PROVIDER){ valueProvider = new BlankValueProvider(args); } else if(valueProviderType === SIMPLE_VALUE_PROVIDER){ valueProvider = new SimpleValueProvider(args); }else if(valueProviderType === TWO_NUMBERS_VALUE_PROVIDER){ valueProvider = new TwoNumbersValueProvider(args); }else if(valueProviderType === TWO_DATES_VALUE_PROVIDER){ valueProvider = new TwoDatesValueProvider(args); }else if(valueProviderType === LIST_VALUE_PROVIDER){ // if(operator === "stringOperatorIs" || // operator === "stringOperatorIsNot" || // operator === "numberOperatorIs" || // operator === "numberOperatorIsNot"){ // args.showNullValues = true; // }else{ // args.showNullValues = false; // } args.showNullValues = false; if(valueType === 'value' || valueType === 'field'){ // || args.fieldInfo.type === 'esriFieldTypeDate'){ valueProvider = new ListValueProvider(args);//origin unique provider }else{ args.providerType = valueProviderType; args.selectUI = 'dropdown'; // if(valueType === 'field'){ // args.isNumberField = false; //field's name is a string // } valueProvider = new AdvancedListValueProvider(args); } }else if(valueProviderType === NUMBER_LIST_VALUE_PROVIDER){ valueProvider = new NumberListValueProvider(args); }else if(valueProviderType === DATE_IS_IN_VALUE_PROVIDER){ valueProvider = new DateIsInValueProvider(args); } else if(valueProviderType === ADVANCED_LIST_VALUE_PROVIDER){ //mutiple---setting&runtime args.providerType = valueProviderType; args.selectUI = 'dropdown'; valueProvider = new AdvancedListValueProvider(args); } else if(valueProviderType === UNIQUE_PREDEFINED_VALUE_PROVIDER || valueProviderType === MULTIPLE_PREDEFINED_VALUE_PROVIDER){ args.providerType = valueProviderType; args.selectUI = args.partObj.valueObj ? args.partObj.valueObj.selectUI : null; if(runtime){ valueProvider = new AdvancedListValueProvider(args); }else{ valueProvider = new PredefinedValueProvider(args); } } } return valueProvider; }, _getFieldInfo: function(layerDefinition, fieldName){ var fieldInfos = layerDefinition.fields; for(var i = 0;i < fieldInfos.length; i++){ var fieldInfo = fieldInfos[i]; if(fieldName === fieldInfo.name){ return fieldInfo; } } return null; } }); clazz.getOperatorInfo = function(operator) { var operatorInfo = lang.clone(relationship[operator]); return operatorInfo; }; clazz.getOperatorsByShortType = function(shortType, isHosted){ var operators = []; if(shortType === 'string'){ operators = [ "stringOperatorIs", "stringOperatorIsNot", "stringOperatorStartsWith", "stringOperatorEndsWith", "stringOperatorContains", "stringOperatorDoesNotContain", "stringOperatorIsAnyOf", "stringOperatorIsNoneOf", "stringOperatorIsBlank", "stringOperatorIsNotBlank" ]; }else if(shortType === 'number'){ operators = [ "numberOperatorIs", "numberOperatorIsNot", "numberOperatorIsAtLeast", "numberOperatorIsAtMost", "numberOperatorIsLessThan", "numberOperatorIsGreaterThan", "numberOperatorIsAnyOf", "numberOperatorIsNoneOf", "numberOperatorIsBetween", "numberOperatorIsNotBetween", "numberOperatorIsBlank", "numberOperatorIsNotBlank" ]; }else if(shortType === 'date'){ operators = [ "dateOperatorIsOn", "dateOperatorIsNotOn", "dateOperatorIsIn", "dateOperatorIsNotIn", "dateOperatorIsBefore", "dateOperatorIsAfter", "dateOperatorIsOnOrBefore", "dateOperatorIsOnOrAfter", "dateOperatorIsBetween", "dateOperatorIsNotBetween", "dateOperatorIsBlank", "dateOperatorIsNotBlank" ]; if(isHosted){ operators.splice(8,0,"dateOperatorInTheLast","dateOperatorNotInTheLast"); } } return operators; }; clazz.getShortTypeByEsriType = function(esriFieldType){ var shortType = null; if(esriFieldType === 'esriFieldTypeString'){ shortType = 'string'; }else if(esriFieldType === 'esriFieldTypeDate'){ shortType = 'date'; }else{ var numberTypes = ['esriFieldTypeOID', 'esriFieldTypeSmallInteger', 'esriFieldTypeInteger', 'esriFieldTypeSingle', 'esriFieldTypeDouble']; if(numberTypes.indexOf(esriFieldType) >= 0){ shortType = 'number'; } } return shortType; }; return clazz; });