Skip to content

Commit

Permalink
Use the "fid" of the featureContext instead of: fid || id.
Browse files Browse the repository at this point in the history
  • Loading branch information
jorix committed Dec 22, 2012
1 parent 68e0997 commit 3292db3
Showing 1 changed file with 85 additions and 103 deletions.
188 changes: 85 additions & 103 deletions lib/FeaturePopups.js
Expand Up @@ -662,10 +662,6 @@ OpenLayers.Control.FeaturePopups = OpenLayers.Class(OpenLayers.Control, {
* combination of the layer.id+feature.id and can be used only as an * combination of the layer.id+feature.id and can be used only as an
* html attribute. * html attribute.
* *
* It is convenient to use ${showPopup(fid)} instead of ${showPopup()}
* when the layer features have fid, this ensures that the popups from
* a list is still shown after zoom, even if a BBOX strategies is used.
*
* Parameters: * Parameters:
* layer - {<OpenLayers.Layer.Vector>} * layer - {<OpenLayers.Layer.Vector>}
* options - {Object} Optional * options - {Object} Optional
Expand All @@ -676,13 +672,25 @@ OpenLayers.Control.FeaturePopups = OpenLayers.Class(OpenLayers.Control, {
* instead of values of context used by templates `list` and * instead of values of context used by templates `list` and
* `hoverList`. If 'undefined' key exists their value will be * `hoverList`. If 'undefined' key exists their value will be
* used instead of text 'undefined'. * used instead of text 'undefined'.
* featureContext - {Object} Contains the keys with the values that were * featureContext - {Object} Contains the keys with the values --could be a
* used instead of values of feature properties (used by * function or {string}--, the resulting value is used instead of values
* templates: single, item, hover, hoverItem) If 'undefined' key exists * of feature property with the same name, if "fid" key is declared must
* their value will be used instead of text 'undefined'. * be a function that returns unique values for each layer features.
* (used by templates: single, item, hover, hoverItem) If 'undefined'
* key exists their value will be used instead of text 'undefined'.
* eventListeners - {Object} This object will be registered with * eventListeners - {Object} This object will be registered with
* <OpenLayers.Events.on>, default scope is the control. * <OpenLayers.Events.on>, default scope is the control.
* *
* *NOTE*: If the features of the layer may have an *"fid" duplicate* the key
* "fid" of "featureContext" *should be declared*, e.g. as
* (code)
* ... },
* featureContext: {
* fid: function(feature) { return feature.id; },
* ...
* }, ...
* (end)
*
* Valid templates: * Valid templates:
* single - {String || Function} template used to show a single feature. * single - {String || Function} template used to show a single feature.
* list - {String || Function} template used to show selected * list - {String || Function} template used to show selected
Expand Down Expand Up @@ -849,13 +857,12 @@ OpenLayers.Control.FeaturePopups = OpenLayers.Class(OpenLayers.Control, {
* *
* Parameters: * Parameters:
* layerId - {String} id of the layer of selected feature. * layerId - {String} id of the layer of selected feature.
* featureId - {String} id of the feature. * featureId - {String} id of the feature, see featureContext at <addLayer>.
* idName - {String} Name of id: "id" or "fid".
*/ */
showSingleFeatureById: function(layerId, featureId, idName) { showSingleFeatureById: function(layerId, featureId) {
var layerObj = this.layerObjs[layerId]; var layerObj = this.layerObjs[layerId];
if (layerObj) { if (layerObj) {
layerObj.showSingleFeatureById(featureId, idName); layerObj.showSingleFeatureById(featureId);
} else { } else {
var popupObj = this.popupObjs.listItem; var popupObj = this.popupObjs.listItem;
popupObj && popupObj.clear(); popupObj && popupObj.clear();
Expand Down Expand Up @@ -1441,8 +1448,8 @@ OpenLayers.Control.FeaturePopups.Popup = OpenLayers.Class({
var elem = OpenLayers.Event.element(evt); var elem = OpenLayers.Event.element(evt);
if (elem.id) { if (elem.id) {
var ids = elem.id.split('-'); var ids = elem.id.split('-');
if (ids.length >= 3) { if (ids.length >= 2) {
this.showSingleFeatureById(ids[1], ids[3], ids[2]); this.showSingleFeatureById(ids[1], ids[2]);
OpenLayers.Event.stop(evt); OpenLayers.Event.stop(evt);
} }
} }
Expand Down Expand Up @@ -1528,7 +1535,7 @@ OpenLayers.Control.FeaturePopups.Popup = OpenLayers.Class({
} }
}; };
if (_relatedPopup.calculateRelativePosition) { if (_relatedPopup.calculateRelativePosition) {
_relatedPopup.calculateRelativePosition = function () { _relatedPopup.calculateRelativePosition = function() {
return _relpopRelPosition; return _relpopRelPosition;
}; };
} }
Expand Down Expand Up @@ -1629,19 +1636,19 @@ OpenLayers.Control.FeaturePopups.Layer = OpenLayers.Class({


/** /**
* APIProperty: templates * APIProperty: templates
* {Object} Set of templates, see <FeaturePopups.AddLayer> * {Object} Set of templates, see <FeaturePopups.addLayer>
*/ */
templates: null, templates: null,


/** /**
* APIProperty: featureContext * APIProperty: featureContext
* {Object} See <FeaturePopups.AddLayer> * {Object} See <FeaturePopups.addLayer>
*/ */
featureContext: null, featureContext: null,


/** /**
* APIProperty: listContext * APIProperty: listContext
* {Object} See <FeaturePopups.AddLayer> * {Object} See <FeaturePopups.addLayer>
*/ */
listContext: null, listContext: null,


Expand Down Expand Up @@ -1745,7 +1752,7 @@ OpenLayers.Control.FeaturePopups.Layer = OpenLayers.Class({
* {RegEx} Used to activate events in the html elements to show individual * {RegEx} Used to activate events in the html elements to show individual
* popup. * popup.
*/ */
regExpShow: /\$\{showPopup\((|id|fid)\)(\w*)\}/g, regExpShow: /\$\{showPopup\(\w*\)\w*\}/g,


/** /**
* Property: regExpAttributes * Property: regExpAttributes
Expand Down Expand Up @@ -1811,6 +1818,29 @@ OpenLayers.Control.FeaturePopups.Layer = OpenLayers.Class({
this.layerListeners['featuresremoved'] = this.onFeaturesremoved; this.layerListeners['featuresremoved'] = this.onFeaturesremoved;
} }


// fid by feature context
var getFid = this.featureContext && this.featureContext.fid;
if (getFid) {
this.getFeatureId = getFid;
} else {
/**
* Function: getFeatureId
* Internal use!, see "featureContext" at <FeaturePopups.addLayer>
* to know how to use "id" or "fid" of features.
*
* Parameters:
* feature - {OpenLayers.Feature.Vector}
*
* Returns:
* {String} A unique identifier of the feature within the layer.
*/
this.getFeatureId = function(feature) {
return feature.fid || feature.id;
}
this.featureContext = OpenLayers.Util.extend(
this.featureContext, {fid: this.getFeatureId});
}

// Renderer of templates // Renderer of templates
// --------------- // ---------------
// private vars // private vars
Expand Down Expand Up @@ -1895,15 +1925,14 @@ OpenLayers.Control.FeaturePopups.Layer = OpenLayers.Class({
*/ */
prepareTemplate: function(template) { prepareTemplate: function(template) {
if (typeof template == 'string') { if (typeof template == 'string') {
var subId = 0, var _subId = 0,
layerId = this.layer.id; _layerId = this.layer.id;
template = template.replace( template = template.replace(
this.regExpShow, this.regExpShow,
function(a, idName) { function(a) {
subId++; _subId++;
idName = idName || 'id'; return 'id="showPopup-' + _layerId +
return 'id="showPopup-' + layerId + '-' + '-${fid}-' + _subId + '"';
idName + '-${' + idName + '}-' + subId + '"';
} }
); );
template = template.replace( template = template.replace(
Expand Down Expand Up @@ -2090,22 +2119,13 @@ OpenLayers.Control.FeaturePopups.Layer = OpenLayers.Class({
*/ */
storeAsSelected: function(feature) { storeAsSelected: function(feature) {
var layerId = feature.layer.id; var layerId = feature.layer.id;
var savedSF = this.selection, var savedSF = this.selection;
fid = feature.fid; if (feature.cluster) {
if (fid) {
savedSF[fid] = true;
} else if (feature.cluster) {
for (var i = 0 , len = feature.cluster.length; i < len; i++) { for (var i = 0 , len = feature.cluster.length; i < len; i++) {
var cFeature = feature.cluster[i]; savedSF[this.getFeatureId(feature.cluster[i])] = true;
var fidfid = cFeature.fid;
if (fidfid) {
savedSF[fidfid] = true;
} else {
savedSF[cFeature.id] = true;
}
} }
} else { } else {
savedSF[feature.id] = true; savedSF[this.getFeatureId(feature)] = true;
} }
}, },


Expand All @@ -2123,22 +2143,14 @@ OpenLayers.Control.FeaturePopups.Layer = OpenLayers.Class({
var savedSF = this.selection, var savedSF = this.selection,
feature = evt.feature; feature = evt.feature;
if (savedSF) { if (savedSF) {
var fid = feature.fid; if (feature.cluster) {
if (fid) {
delete savedSF[fid];
} else if (feature.cluster) {
for (var i = 0, len = feature.cluster.length; for (var i = 0, len = feature.cluster.length;
i < len; i++) { i < len; i++) {
var cFeature = feature.cluster[i]; delete savedSF[
var fidfid = cFeature.fid; this.getFeatureId(feature.cluster[i])];
if (fidfid) {
delete savedSF[fidfid];
} else {
delete savedSF[cFeature.id];
}
} }
} else { } else {
delete savedSF[feature.id]; delete savedSF[this.getFeatureId(feature)];
} }
} }
} }
Expand Down Expand Up @@ -2227,7 +2239,7 @@ OpenLayers.Control.FeaturePopups.Layer = OpenLayers.Class({
!_handlerFeature.lastFeature.layer) { !_handlerFeature.lastFeature.layer) {
_replaceLastFeature = true; _replaceLastFeature = true;
} }
var select = function (feature) { var select = function(feature) {
selectCtl.select(feature); selectCtl.select(feature);
if (_replaceLastFeature) { if (_replaceLastFeature) {
_handlerFeature.lastFeature = feature; _handlerFeature.lastFeature = feature;
Expand All @@ -2238,23 +2250,15 @@ OpenLayers.Control.FeaturePopups.Layer = OpenLayers.Class({
this.updatingSelection = true; this.updatingSelection = true;
for (var i = 0 , len = features.length; i < len; i++) { for (var i = 0 , len = features.length; i < len; i++) {
var feature = features[i]; var feature = features[i];
if (feature.fid && savedSF[feature.fid]) { if (feature.cluster) {
select(feature);
} else if (feature.cluster) {
for (var ii = 0, lenlen = feature.cluster.length; for (var ii = 0, lenlen = feature.cluster.length;
ii < lenlen; ii++) { ii < lenlen; ii++) {
var cFeature = feature.cluster[ii]; if (savedSF[this.getFeatureId(feature.cluster[ii])]) {
if (cFeature.fid) {
if (savedSF[cFeature.fid]) {
select(feature);
break;
}
} else if (savedSF[cFeature.id]) {
select(feature); select(feature);
break; break;
} }
} }
} else if (savedSF[feature.id]) { } else if (savedSF[this.getFeatureId(feature)]) {
select(feature); select(feature);
} }
} }
Expand All @@ -2275,15 +2279,9 @@ OpenLayers.Control.FeaturePopups.Layer = OpenLayers.Class({
layerFeatures = this.getSingleFeatures(layer.features); layerFeatures = this.getSingleFeatures(layer.features);
// get hash // get hash
if (layer.getVisibility() && layer.map) { if (layer.getVisibility() && layer.map) {
var feature, var ids = [];
ids = [];
for (var i = 0, len = layerFeatures.length; i < len; ++i) { for (var i = 0, len = layerFeatures.length; i < len; ++i) {
feature = layerFeatures[i]; ids.push(this.getFeatureId(layerFeatures[i]));
if (feature.fid) {
ids.push(feature.fid);
} else {
ids.push(feature.id);
}
} }
featuresHash = ids.sort().join('\t'); featuresHash = ids.sort().join('\t');
} else { } else {
Expand Down Expand Up @@ -2330,11 +2328,7 @@ OpenLayers.Control.FeaturePopups.Layer = OpenLayers.Class({
for (var ii = 0, llen = clusterFeatures.length; for (var ii = 0, llen = clusterFeatures.length;
ii < llen; ii++) { ii < llen; ii++) {
var cFeature = clusterFeatures[ii]; var cFeature = clusterFeatures[ii];
if (cFeature.fid) { if (savedSF[this.getFeatureId(cFeature)]) {
if (savedSF[cFeature.fid]) {
features.push(cFeature);
}
} else if (savedSF[cFeature.id]) {
features.push(cFeature); features.push(cFeature);
} }
} }
Expand Down Expand Up @@ -2479,23 +2473,15 @@ OpenLayers.Control.FeaturePopups.Layer = OpenLayers.Class({
for (var i = 0 , len = features.length; i < len; i++) { for (var i = 0 , len = features.length; i < len; i++) {
var feature = features[i], var feature = features[i],
selected = false; selected = false;
if (feature.fid && savedSF[feature.fid]) { if (feature.cluster) {
selected = true;
} else if (feature.cluster) {
for (var ii = 0, lenlen = feature.cluster.length; for (var ii = 0, lenlen = feature.cluster.length;
ii < lenlen; ii++) { ii < lenlen; ii++) {
var cFeature = feature.cluster[ii]; if (savedSF[this.getFeatureId(feature.cluster[ii])]) {
if (cFeature.fid) {
if (savedSF[cFeature.fid]) {
selected = true;
break;
}
} else if (savedSF[cFeature.id]) {
selected = true; selected = true;
break; break;
} }
} }
} else if (savedSF[feature.id]) { } else if (savedSF[this.getFeatureId(feature)]) {
selected = true; selected = true;
} }
if (selected) { if (selected) {
Expand Down Expand Up @@ -2555,23 +2541,15 @@ OpenLayers.Control.FeaturePopups.Layer = OpenLayers.Class({
for (var i = features.length - 1; i >= 0; i--) { for (var i = features.length - 1; i >= 0; i--) {
var feature = features[i], var feature = features[i],
selected = false; selected = false;
if (feature.fid && savedSF[feature.fid]) { if (feature.cluster) {
selected = true;
} else if (feature.cluster) {
for (var ii = 0, lenlen = feature.cluster.length; for (var ii = 0, lenlen = feature.cluster.length;
ii < lenlen; ii++) { ii < lenlen; ii++) {
var cFeature = feature.cluster[ii]; if (savedSF[this.getFeatureId(feature.cluster[ii])]) {
if (cFeature.fid) {
if (savedSF[cFeature.fid]) {
selected = true;
break;
}
} else if (savedSF[cFeature.id]) {
selected = true; selected = true;
break; break;
} }
} }
} else if (savedSF[feature.id]) { } else if (savedSF[this.getFeatureId(feature)]) {
selected = true; selected = true;
} }
if (!selected) { if (!selected) {
Expand All @@ -2590,19 +2568,20 @@ OpenLayers.Control.FeaturePopups.Layer = OpenLayers.Class({


/** /**
* APIMethod: showSingleFeatureById * APIMethod: showSingleFeatureById
* See featureContext at <FeaturePopups.addLayer> to know how to use "id" or
* "fid" of features.
* *
* Parameters: * Parameters:
* featureId - {String} id of the feature. * featureId - {String} id of the feature.
* idName - {String} Name of id: "id" or "fid".
*/ */
showSingleFeatureById: function(featureId, idName) { showSingleFeatureById: function(featureId) {
var popupObj = this.control.popupObjs.listItem; var popupObj = this.control.popupObjs.listItem;
if (!popupObj) { return; } if (!popupObj) { return; }


idName = idName || 'id';
var clearPopup = true; var clearPopup = true;
if (featureId) { if (featureId) {
var i, len, feature, var i, len, feature,
found = false,
layer = this.layer, layer = this.layer,
features = layer.features; features = layer.features;
for (i = 0, len = features.length; i < len; i++) { for (i = 0, len = features.length; i < len; i++) {
Expand All @@ -2613,14 +2592,17 @@ OpenLayers.Control.FeaturePopups.Layer = OpenLayers.Class({
for (ii = 0, len2 = cFeature.cluster.length; for (ii = 0, len2 = cFeature.cluster.length;
ii < len2; ii++) { ii < len2; ii++) {
feature = cFeature.cluster[ii]; feature = cFeature.cluster[ii];
if (feature[idName] == featureId) { if (this.getFeatureId(feature) === featureId) {
found = true;
break; break;
} }
} }
} else {
found = this.getFeatureId(feature) === featureId;
} }
// Don't try to show a cluster as a single feature, // Don't try to show a cluster as a single feature,
// templates.single does not support it. // templates.single does not support it.
if (feature[idName] == featureId && !feature.cluster) { if (found && !feature.cluster) {
popupObj.clear(); popupObj.clear();
var template = this.templates.single; var template = this.templates.single;
if (template) { if (template) {
Expand Down

0 comments on commit 3292db3

Please sign in to comment.