Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

New group folders for dynamic map services #747

Merged
merged 50 commits into from
Feb 6, 2018
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
Show all changes
50 commits
Select commit Hold shift + click to select a range
c9b1a5d
new group folders for dynamic map services.
tmcgee Jul 15, 2017
ded5f08
Change icon for Grouped layers to folder
tmcgee Jul 15, 2017
d0b03b1
Merge branch 'develop' into feature/new-group-folders-for-dynamic-map…
tmcgee Jul 22, 2017
23d8f9d
ensure that layerIds variable is assigned a value..
tmcgee Aug 1, 2017
703079f
re-initialize the groupedLayerInfos once the grouped layers have been…
tmcgee Aug 1, 2017
1b98e94
re-initialize the groupedLayerInfos once the grouped layers have been…
tmcgee Aug 1, 2017
f8bdd92
Merge branch 'feature/new-group-folders-for-dynamic-map-services' of …
tmcgee Aug 1, 2017
ce3c209
Merge branch 'develop' into feature/new-group-folders-for-dynamic-map…
green3g Aug 2, 2017
fef659c
Merge branch 'develop' into feature/new-group-folders-for-dynamic-map…
tmcgee Aug 5, 2017
9acbe2c
Merge branch 'develop' into feature/new-group-folders-for-dynamic-map…
tmcgee Aug 7, 2017
c2badb9
fix how visiblity of sublayers is determined.
tmcgee Aug 8, 2017
075e0ec
Merge branch 'develop' into feature/new-group-folders-for-dynamic-map…
green3g Aug 8, 2017
a11c0d1
Merge branch 'develop' into feature/new-group-folders-for-dynamic-map…
green3g Aug 11, 2017
c4066ea
Remove sublayer ids for groups in dynamic layers after the layer is …
tmcgee Aug 15, 2017
2f65925
remove console.log statement
tmcgee Aug 15, 2017
3892922
Merge branch 'develop' into feature/new-group-folders-for-dynamic-map…
tmcgee Aug 23, 2017
ad93516
Add option to use alternative visibility mode instead of triStateTree
duckblaster Aug 30, 2017
a5697ab
Fix lint errors
duckblaster Aug 30, 2017
817c3ed
Merge branch 'develop' into feature/new-group-folders-for-dynamic-map…
tmcgee Sep 8, 2017
61176d1
Merge branch 'develop' into feature/new-group-folders-for-dynamic-map…
tmcgee Sep 8, 2017
c987f02
Merge branch 'develop' into feature/new-group-folders-for-dynamic-map…
tmcgee Sep 12, 2017
031085e
Merge branch 'develop' into feature/new-group-folders-for-dynamic-map…
tmcgee Sep 18, 2017
25ce8ae
Merge pull request #766 from duckblaster/feature/new-group-folders-fo…
tmcgee Sep 27, 2017
62d7311
remove unused code and properties.
tmcgee Sep 28, 2017
e75eee3
Merge branch 'develop' into feature/new-group-folders-for-dynamic-map…
green3g Sep 29, 2017
68eccdd
Merge remote-tracking branch 'origin/feature/new-group-folders-for-dy…
tmcgee Sep 29, 2017
da33135
Merge branch 'develop' into feature/new-group-folders-for-dynamic-map…
tmcgee Sep 29, 2017
c21c689
Merge remote-tracking branch 'origin/feature/new-group-folders-for-dy…
tmcgee Oct 2, 2017
90d6940
Merge branch 'develop' into feature/new-group-folders-for-dynamic-map…
green3g Oct 2, 2017
8ed3b7b
Merge remote-tracking branch 'origin/feature/new-group-folders-for-dy…
tmcgee Oct 2, 2017
311a920
change property name to something more universal
tmcgee Oct 5, 2017
f609de0
Simplify _setFolderCheckbox method
tmcgee Oct 5, 2017
0fb5966
Merge branch 'develop' into feature/new-group-folders-for-dynamic-map…
tmcgee Oct 21, 2017
0e67324
Merge branch 'develop' into feature/new-group-folders-for-dynamic-map…
tmcgee Nov 2, 2017
91264ac
Merge branch 'develop' into feature/new-group-folders-for-dynamic-map…
tmcgee Nov 5, 2017
62c26fb
Merge branch 'develop' into feature/new-group-folders-for-dynamic-map…
tmcgee Nov 8, 2017
f9d6bba
Merge remote-tracking branch 'origin/feature/new-group-folders-for-dy…
tmcgee Nov 11, 2017
5176974
Merge remote-tracking branch 'origin/feature/new-group-folders-for-dy…
tmcgee Nov 11, 2017
8f06bcc
Extend support for ignoring group layer visibility to Identify widget
tmcgee Nov 11, 2017
85ad1b5
Merge branch 'develop' into feature/new-group-folders-for-dynamic-map…
tmcgee Nov 28, 2017
1a54b51
Merge remote-tracking branch 'origin/feature/new-group-folders-for-dy…
tmcgee Dec 7, 2017
a36cf4d
Merge branch 'develop' into feature/new-group-folders-for-dynamic-map…
tmcgee Dec 9, 2017
2c8abdc
Merge remote-tracking branch 'origin/feature/new-group-folders-for-dy…
tmcgee Dec 11, 2017
ec719b3
Merge branch 'develop' into feature/new-group-folders-for-dynamic-map…
tmcgee Dec 24, 2017
35912d2
Merge remote-tracking branch 'origin/feature/new-group-folders-for-dy…
tmcgee Dec 30, 2017
c6cbb5e
Merge branch 'develop' into feature/new-group-folders-for-dynamic-map…
tmcgee Jan 7, 2018
4914c32
Merge branch 'develop' into feature/new-group-folders-for-dynamic-map…
green3g Jan 14, 2018
f094a54
Merge remote-tracking branch 'origin/feature/new-group-folders-for-dy…
tmcgee Jan 14, 2018
ece3c1d
Merge branch 'develop' into feature/new-group-folders-for-dynamic-map…
tmcgee Jan 20, 2018
1ac6226
Merge branch 'develop' into feature/new-group-folders-for-dynamic-map…
tmcgee Feb 3, 2018
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion viewer/js/config/viewer.js
Original file line number Diff line number Diff line change
Expand Up @@ -201,14 +201,17 @@ define([
opacity: 1.0,
visible: true,
imageParameters: buildImageParameters({
layerIds: [0, 2, 4, 5, 8, 10, 12, 21],
// include only sub layer ids.
// group layers omitted
layerIds: [2, 4, 5, 8, 12, 21],
layerOption: 'show'
})
},
identifyLayerInfos: {
layerIds: [2, 4, 5, 8, 12, 21]
},
layerControlLayerInfos: {
// group layers included to maintain folder hierarchy, not visibility.
layerIds: [0, 2, 4, 5, 8, 9, 10, 12, 21]
},
legendLayerInfos: {
Expand Down
4 changes: 2 additions & 2 deletions viewer/js/gis/dijit/LayerControl.js
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,8 @@ define([
indeterminate: 'fa-minus fa-fw fa-border layerControlIcon-Indeterminate',
update: 'fa-refresh layerControlIcon-Update',
menu: 'fa-bars layerControlIcon-Menu',
folder: 'fa-folder-o fa-fw layerControlIcon-Folder',
folderOpen: 'fa-folder-open-o fa-fw layerControlIcon-Folder layerControlIcon-FolderOpen'
folder: 'fa-folder fa-fw layerControlIcon-Folder',
folderOpen: 'fa-folder-open fa-fw layerControlIcon-Folder layerControlIcon-FolderOpen'
},
separated: false,
overlayReorder: false,
Expand Down
78 changes: 45 additions & 33 deletions viewer/js/gis/dijit/LayerControl/controls/Dynamic.js
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ define([
_visLayersHandler: null,
constructor: function () {
this._sublayerControls = [];
this._folderControls = [];
},
_layerTypePreInit: function () {
if (this.layer.layerInfos.length > 1 && this.controlOptions.sublayers) {
Expand Down Expand Up @@ -118,7 +119,8 @@ define([
var pid = info.parentLayerId,
slids = info.subLayerIds,
controlId = layer.id + '-' + info.id + '-sublayer-control',
control;
control = null,
controlIsSubLayer = false;
// it's a top level
if (pid === -1 || allLayers.indexOf(pid) === -1) {
if (slids === null) {
Expand All @@ -130,6 +132,7 @@ define([
icons: this.icons
});
domConst.place(control.domNode, this.expandNode, 'last');
controlIsSubLayer = true;
} else if (slids !== null) {
// it's a top level folder
control = new DynamicFolder({
Expand Down Expand Up @@ -158,10 +161,19 @@ define([
icons: this.icons
});
domConst.place(control.domNode, registry.byId(layer.id + '-' + info.parentLayerId + '-sublayer-control').expandNode, 'last');
controlIsSubLayer = true;
}
control.startup();
this._sublayerControls.push(control);
if (controlIsSubLayer) {
this._sublayerControls.push(control);
} else {
this._folderControls.push(control);
}
}));

array.forEach(this._folderControls, function (control) {
control._checkFolderVisibility();
});
}
},
// simply remove expandClickNode
Expand All @@ -176,56 +188,56 @@ define([
_setVisibleLayers: function () {
// remove aspect handler
this._visLayersHandler.remove();
// because ags doesn't respect a layer group's visibility
// i.e. layer 3 (the group) is not in array but it's sublayers are; sublayers will show
// so check and if group is off also remove the sublayers
var layer = this.layer,
setLayers = [];
visibleLayers = [];
array.forEach(query('.' + layer.id + '-layerControlSublayerCheck'), function (i) {
if (domAttr.get(i, 'data-checked') === 'checked') {
setLayers.push(parseInt(domAttr.get(i, 'data-sublayer-id'), 10));
}
});
array.forEach(layer.layerInfos, function (info) {
if (info.subLayerIds !== null && array.indexOf(setLayers, info.id) === -1) {
array.forEach(info.subLayerIds, function (sub) {
if (array.indexOf(setLayers, sub) !== -1) {
setLayers.splice(array.indexOf(setLayers, sub), 1);
}
});
} else if (info.subLayerIds !== null && array.indexOf(setLayers, info.id) !== -1) {
setLayers.splice(array.indexOf(setLayers, info.id), 1);
if (domAttr.get(i, 'data-checked') === 'checked' && !domAttr.get(i, 'data-layer-folder')) {
visibleLayers.push(parseInt(domAttr.get(i, 'data-sublayer-id'), 10));
}
});
if (!setLayers.length) {
setLayers.push(-1);
if (!visibleLayers.length) {
visibleLayers.push(-1);
}
layer.setVisibleLayers(setLayers);

array.forEach(this._folderControls, function (control) {
control._checkFolderVisibility();
});

layer.setVisibleLayers(visibleLayers);
layer.refresh();

topic.publish('layerControl/setVisibleLayers', {
id: layer.id,
visibleLayers: setLayers
visibleLayers: visibleLayers
});
// set aspect handler
this._visLayersHandler = aspect.after(this.layer, 'setVisibleLayers', lang.hitch(this, '_onSetVisibleLayers'), true);
},
_onSetVisibleLayers: function (visLayers) {
var visibleIds = [];
array.forEach(this.layer.layerInfos, function (info) {
if (array.indexOf(visLayers, info.id) !== -1) {
visibleIds.push(info.id);
}
if (info.parentLayerId !== -1 && array.indexOf(visibleIds, info.parentLayerId) === -1) {
visibleIds.push(info.parentLayerId);
}
});
// set the sub layer visibilty first
array.forEach(this._sublayerControls, function (control) {
if (array.indexOf(visibleIds, control.sublayerInfo.id) !== -1) {
if (array.indexOf(visLayers, control.sublayerInfo.id) !== -1) {
control._setSublayerCheckbox(true);
} else {
control._setSublayerCheckbox(false);
}
});

// setting the folder (group layer) visibility will change
// visibility for all children sub layer and folders
array.forEach(this._folderControls, function (control) {
if (array.indexOf(visLayers, control.sublayerInfo.id) !== -1) {
control._setFolderCheckbox(true);
} else {
control._setFolderCheckbox(false);
}
});

// finally, set the folder UI (state of checkbox) based on
// the sub layers and folders within the parent folder
array.forEach(this._folderControls, function (control) {
control._checkFolderVisibility();
});
}
});
return DynamicControl;
Expand Down
5 changes: 5 additions & 0 deletions viewer/js/gis/dijit/LayerControl/controls/Grouped.js
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,11 @@ define([
_layerType: 'grouped', // constant
_esriLayerType: null, // constant

constructor: function () {
this.inherited(arguments);
this.icons.expand = this.icons.groupFolder || this.icons.folder;
this.icons.collapse = this.icons.groupFolderOpen || this.icons.folderOpen;
},
// create and legend
_layerTypePreInit: function () {
array.forEach(this.layerDetails, lang.hitch(this, function (layerDetail) {
Expand Down
2 changes: 1 addition & 1 deletion viewer/js/gis/dijit/LayerControl/controls/_Control.js
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ define([
_expandClickHandler: null, // the click handler for the expandNode
constructor: function (params) {
if (params.controller) {
this.icons = params.controller.icons;
this.icons = lang.clone(params.controller.icons);
} // if not you've got bigger problems
this._handlers = [];
},
Expand Down
139 changes: 124 additions & 15 deletions viewer/js/gis/dijit/LayerControl/controls/_DynamicFolder.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ define([
'dojo/_base/lang',
'dojo/_base/array',
'dojo/on',
'dojo/query',
'dojo/dom-class',
'dojo/dom-style',
'dojo/dom-attr',
Expand All @@ -16,6 +17,7 @@ define([
lang,
array,
on,
query,
domClass,
domStyle,
domAttr,
Expand Down Expand Up @@ -50,25 +52,21 @@ define([
}
var checkNode = this.checkNode;
domAttr.set(checkNode, 'data-sublayer-id', this.sublayerInfo.id);
domAttr.set(checkNode, 'data-layer-folder', true);
domClass.add(checkNode, this.control.layer.id + '-layerControlSublayerCheck');
if (array.indexOf(this.control.layer.visibleLayers, this.sublayerInfo.id) !== -1) {
this._setSublayerCheckbox(true, checkNode);
} else {
this._setSublayerCheckbox(false, checkNode);
}

this._handlers.push(on(checkNode, 'click', lang.hitch(this, function (event) {

// prevent click event from bubbling
if (event.stopPropagation) {
event.stopPropagation();
}

if (domAttr.get(checkNode, 'data-checked') === 'checked') {
this._setSublayerCheckbox(false, checkNode);
if (!this._hasAnyInvisibleLayer()) {
this._setFolderCheckbox(false, checkNode);
} else {
this._setSublayerCheckbox(true, checkNode);
this._setFolderCheckbox(true, checkNode);
}
this.control._setVisibleLayers();
this._checkboxScaleRange();
})));
html.set(this.labelNode, this.sublayerInfo.name);
Expand Down Expand Up @@ -99,18 +97,129 @@ define([
}
})));
},
// set checkbox based on layer so it's always in sync
_setSublayerCheckbox: function (checked, checkNode) {
// toggles visibility of all sublayers
_setFolderCheckbox: function (checked, checkNode, isChildFolder) {
var i = this.icons,
dataChecked = (checked) ? 'checked' : 'unchecked',
slNodes = this._getSubLayerNodes();
checkNode = checkNode || this.checkNode;
var i = this.icons;
if (checked) {
array.forEach(slNodes, lang.hitch(this, function (node) {

// child is folder
if (domAttr.get(node, 'data-layer-folder')) {
var folderControl = this._getFolderControl(node);
if (folderControl) {
folderControl._setFolderCheckbox(checked, node, true);
}
// child is sub layer
} else {
domAttr.set(node, 'data-checked', dataChecked);
if (checked) {
domClass.replace(node, i.checked, i.unchecked);
} else {
domClass.replace(node, i.unchecked, i.checked);
}
}
}));

// wait until all folders in hierarchy have been
// processed before setting the layer's visible layers
if (!isChildFolder) {
this.control._setVisibleLayers();
}
},

_hasAnyVisibleLayer: function () {
var slNodes = this._getSubLayerNodes();
return array.some(slNodes, lang.hitch(this, function (node) {
if (domAttr.get(node, 'data-layer-folder')) {
var folderControl = this._getFolderControl(node);
if (folderControl) {
return folderControl._hasAnyVisibleLayer();
}
return true;
}
return (domAttr.get(node, 'data-checked') === 'checked');
}));
},

_hasAnyInvisibleLayer: function () {
var slNodes = this._getSubLayerNodes();
return array.some(slNodes, lang.hitch(this, function (node) {
if (domAttr.get(node, 'data-layer-folder')) {
var folderControl = this._getFolderControl(node);
if (folderControl) {
return folderControl._hasAnyInvisibleLayer();
}
return true;
}
return (domAttr.get(node, 'data-checked') !== 'checked');
}));
},

_getSubLayerNodes: function () {
var layerIds = this.control.controlOptions.layerIds;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It looks like this is a bug, if layerIds is not provided, it breaks on 176.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

updated line 161 to:

var layerIds = this.control.controlOptions.layerIds || [];

var subLayerInfos = [];
if (this.control.controlOptions.subLayerInfos && !this.control.controlOptions.includeUnspecifiedLayers) {
subLayerInfos = array.map(this.control.controlOptions.subLayerInfos, function (sli) {
return sli.id;
});
}

var subLayerNodes = query('.' + this.control.layer.id + '-layerControlSublayerCheck', this.domNode);
return array.filter(subLayerNodes, lang.hitch(this, function (node) {
var subLayerID = parseInt(domAttr.get(node, 'data-sublayer-id'), 10);
// is the sublayer contained in this folder
if (array.indexOf(this.sublayerInfo.subLayerIds, subLayerID) < 0) {
return false;
// is the sublayer included in layer's layerIds (if they are defined)
} else if (layerIds.length && array.indexOf(layerIds, subLayerID) < 0) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

layerIds.length throws an error when layerIds is not defined

return false;
// is the sublayer included in layer's subLayerInfos (if they are defined)
} else if (subLayerInfos.length && array.indexOf(subLayerInfos, subLayerID) < 0) {
return false;
}
return true;
}));
},

_getFolderControl: function (node) {
var subLayerID = parseInt(domAttr.get(node, 'data-sublayer-id'), 10);
var controls = array.filter(this.control._folderControls, function (control) {
return (control.sublayerInfo.id === subLayerID);
});
if (controls.length) {
return controls[0];
}
return null;
},

// set visibility of folder (group layer) based on the visibility
// of children sub-layers and folders
_checkFolderVisibility: function () {
var checkNode = this.checkNode,
i = this.icons;

var hasVisible = this._hasAnyVisibleLayer();
var hasHidden = this._hasAnyInvisibleLayer();

domClass.remove(checkNode, i.checked);
domClass.remove(checkNode, i.unchecked);
domClass.remove(checkNode, i.indeterminate);

// indeterminate - both visible and invisible layers in group
if (hasVisible && hasHidden) {
domAttr.set(checkNode, 'data-checked', 'indeterminate');
domClass.add(checkNode, i.indeterminate);
} else if (hasVisible) {
domAttr.set(checkNode, 'data-checked', 'checked');
domClass.replace(checkNode, i.checked, i.unchecked);
domClass.add(checkNode, i.checked);
} else {
domAttr.set(checkNode, 'data-checked', 'unchecked');
domClass.replace(checkNode, i.unchecked, i.checked);
domClass.add(checkNode, i.unchecked);
}
},

// check scales and add/remove disabled classes from checkbox
_checkboxScaleRange: function () {
var node = this.checkNode,
Expand Down
8 changes: 4 additions & 4 deletions viewer/js/gis/dijit/LayerControl/css/LayerControl.css
Original file line number Diff line number Diff line change
Expand Up @@ -88,16 +88,16 @@
color: #666;
}

.layerControlDijit .layerControlTableExpand .layerControlIcon-Folder {
color: #F4D57A;
}

.layerControlDijit .layerControlTableCheck .fa-border {
border-color: #333;
border-radius: 3px;
padding: 0.15em 0.1875em 0.1125em;
}

.layerControlDijit .layerControlTableCheck .layerControlIcon-Folder {
color: #333;
}

.layerControlDijit .layerControlTableCheck .layerControlIcon-Checked {
color: #090;
}
Expand Down