From 1c17d181cbc37bf2981ebb320d52d96c53e3b8b8 Mon Sep 17 00:00:00 2001 From: Arun Date: Tue, 14 Jul 2015 15:08:41 +1200 Subject: [PATCH 1/9] LayerListWidget added to github in development branch --- src/LayerListView.html | 6 + src/LayerListView.js | 549 +++++++++++++++++++ src/Metadata.js | 171 ++++++ src/NlsStrings.js | 21 + src/PopupMenu.html | 11 + src/PopupMenu.js | 187 +++++++ src/PopupMenuInfo.js | 361 ++++++++++++ src/Widget.html | 7 + src/Widget.js | 302 ++++++++++ src/config.json | 29 + src/css/images/current_basemap_indicator.png | Bin 0 -> 3013 bytes src/css/style.css | 407 ++++++++++++++ src/images/icon.png | Bin 0 -> 1002 bytes src/images/loading.gif | Bin 0 -> 3919 bytes src/images/metadata.png | Bin 0 -> 431 bytes src/images/noLegend.png | Bin 0 -> 703 bytes src/images/table.png | Bin 0 -> 313 bytes src/images/v.png | Bin 0 -> 951 bytes src/images/v_left.png | Bin 0 -> 1036 bytes src/images/v_right.png | Bin 0 -> 14923 bytes src/manifest.json | 11 + src/nls/ar/strings.js | 21 + src/nls/cs/strings.js | 21 + src/nls/da/strings.js | 21 + src/nls/de/strings.js | 21 + src/nls/el/strings.js | 21 + src/nls/es/strings.js | 21 + src/nls/et/strings.js | 21 + src/nls/fi/strings.js | 21 + src/nls/fr/strings.js | 21 + src/nls/he/strings.js | 21 + src/nls/it/strings.js | 21 + src/nls/ja/strings.js | 21 + src/nls/ko/strings.js | 21 + src/nls/lt/strings.js | 21 + src/nls/lv/strings.js | 21 + src/nls/nb/strings.js | 21 + src/nls/nl/strings.js | 21 + src/nls/pl/strings.js | 21 + src/nls/pt-br/strings.js | 21 + src/nls/pt-pt/strings.js | 21 + src/nls/ro/strings.js | 21 + src/nls/ru/strings.js | 21 + src/nls/strings.js | 50 ++ src/nls/sv/strings.js | 21 + src/nls/th/strings.js | 21 + src/nls/tr/strings.js | 21 + src/nls/vi/strings.js | 21 + src/nls/zh-cn/strings.js | 21 + src/setting/Setting.html | 4 + src/setting/Setting.js | 51 ++ src/setting/css/style.css | 3 + src/setting/nls/ar/strings.js | 5 + src/setting/nls/cs/strings.js | 5 + src/setting/nls/da/strings.js | 5 + src/setting/nls/de/strings.js | 5 + src/setting/nls/el/strings.js | 5 + src/setting/nls/es/strings.js | 5 + src/setting/nls/et/strings.js | 5 + src/setting/nls/fi/strings.js | 5 + src/setting/nls/fr/strings.js | 5 + src/setting/nls/he/strings.js | 5 + src/setting/nls/it/strings.js | 5 + src/setting/nls/ja/strings.js | 5 + src/setting/nls/ko/strings.js | 5 + src/setting/nls/lt/strings.js | 5 + src/setting/nls/lv/strings.js | 5 + src/setting/nls/nb/strings.js | 5 + src/setting/nls/nl/strings.js | 5 + src/setting/nls/pl/strings.js | 5 + src/setting/nls/pt-br/strings.js | 5 + src/setting/nls/pt-pt/strings.js | 5 + src/setting/nls/ro/strings.js | 5 + src/setting/nls/ru/strings.js | 5 + src/setting/nls/strings.js | 32 ++ src/setting/nls/sv/strings.js | 5 + src/setting/nls/th/strings.js | 5 + src/setting/nls/tr/strings.js | 5 + src/setting/nls/vi/strings.js | 5 + src/setting/nls/zh-cn/strings.js | 5 + 80 files changed, 2904 insertions(+) create mode 100644 src/LayerListView.html create mode 100644 src/LayerListView.js create mode 100644 src/Metadata.js create mode 100644 src/NlsStrings.js create mode 100644 src/PopupMenu.html create mode 100644 src/PopupMenu.js create mode 100644 src/PopupMenuInfo.js create mode 100644 src/Widget.html create mode 100644 src/Widget.js create mode 100644 src/config.json create mode 100644 src/css/images/current_basemap_indicator.png create mode 100644 src/css/style.css create mode 100644 src/images/icon.png create mode 100644 src/images/loading.gif create mode 100644 src/images/metadata.png create mode 100644 src/images/noLegend.png create mode 100644 src/images/table.png create mode 100644 src/images/v.png create mode 100644 src/images/v_left.png create mode 100644 src/images/v_right.png create mode 100644 src/manifest.json create mode 100644 src/nls/ar/strings.js create mode 100644 src/nls/cs/strings.js create mode 100644 src/nls/da/strings.js create mode 100644 src/nls/de/strings.js create mode 100644 src/nls/el/strings.js create mode 100644 src/nls/es/strings.js create mode 100644 src/nls/et/strings.js create mode 100644 src/nls/fi/strings.js create mode 100644 src/nls/fr/strings.js create mode 100644 src/nls/he/strings.js create mode 100644 src/nls/it/strings.js create mode 100644 src/nls/ja/strings.js create mode 100644 src/nls/ko/strings.js create mode 100644 src/nls/lt/strings.js create mode 100644 src/nls/lv/strings.js create mode 100644 src/nls/nb/strings.js create mode 100644 src/nls/nl/strings.js create mode 100644 src/nls/pl/strings.js create mode 100644 src/nls/pt-br/strings.js create mode 100644 src/nls/pt-pt/strings.js create mode 100644 src/nls/ro/strings.js create mode 100644 src/nls/ru/strings.js create mode 100644 src/nls/strings.js create mode 100644 src/nls/sv/strings.js create mode 100644 src/nls/th/strings.js create mode 100644 src/nls/tr/strings.js create mode 100644 src/nls/vi/strings.js create mode 100644 src/nls/zh-cn/strings.js create mode 100644 src/setting/Setting.html create mode 100644 src/setting/Setting.js create mode 100644 src/setting/css/style.css create mode 100644 src/setting/nls/ar/strings.js create mode 100644 src/setting/nls/cs/strings.js create mode 100644 src/setting/nls/da/strings.js create mode 100644 src/setting/nls/de/strings.js create mode 100644 src/setting/nls/el/strings.js create mode 100644 src/setting/nls/es/strings.js create mode 100644 src/setting/nls/et/strings.js create mode 100644 src/setting/nls/fi/strings.js create mode 100644 src/setting/nls/fr/strings.js create mode 100644 src/setting/nls/he/strings.js create mode 100644 src/setting/nls/it/strings.js create mode 100644 src/setting/nls/ja/strings.js create mode 100644 src/setting/nls/ko/strings.js create mode 100644 src/setting/nls/lt/strings.js create mode 100644 src/setting/nls/lv/strings.js create mode 100644 src/setting/nls/nb/strings.js create mode 100644 src/setting/nls/nl/strings.js create mode 100644 src/setting/nls/pl/strings.js create mode 100644 src/setting/nls/pt-br/strings.js create mode 100644 src/setting/nls/pt-pt/strings.js create mode 100644 src/setting/nls/ro/strings.js create mode 100644 src/setting/nls/ru/strings.js create mode 100644 src/setting/nls/strings.js create mode 100644 src/setting/nls/sv/strings.js create mode 100644 src/setting/nls/th/strings.js create mode 100644 src/setting/nls/tr/strings.js create mode 100644 src/setting/nls/vi/strings.js create mode 100644 src/setting/nls/zh-cn/strings.js diff --git a/src/LayerListView.html b/src/LayerListView.html new file mode 100644 index 0000000..7f34d52 --- /dev/null +++ b/src/LayerListView.html @@ -0,0 +1,6 @@ + + + + + +
diff --git a/src/LayerListView.js b/src/LayerListView.js new file mode 100644 index 0000000..f9546f9 --- /dev/null +++ b/src/LayerListView.js @@ -0,0 +1,549 @@ +/////////////////////////////////////////////////////////////////////////// +// Copyright © 2014 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([ + 'dijit/_WidgetBase', + 'dojo/_base/declare', + 'dojo/_base/lang', + 'dojo/_base/array', + 'dojo/_base/html', + 'dojo/dom-construct', + 'dojo/on', + 'dojo/query', + 'jimu/dijit/CheckBox', + './PopupMenu', + './Metadata', + 'dijit/_TemplatedMixin', + 'dojo/text!./LayerListView.html', + 'jimu/dijit/LoadingIndicator', + 'dojo/dom-attr', + 'dojo/dom-class', + 'dojo/dom-style', + './NlsStrings' +], function(_WidgetBase, declare, lang, array, html, domConstruct, on, query, + CheckBox, PopupMenu, + Metadata, + _TemplatedMixin, template, LoadingIndicator, + domAttr, domClass, domStyle, NlsStrings) { + + return declare([_WidgetBase, _TemplatedMixin], { + templateString: template, + _currentSelectedLayerRowNode: null, + scaleConfig: [{ + "layerInfo": [], + "layerNode": [] + }], + + postMixInProperties: function() { + this.inherited(arguments); + this.nls = NlsStrings.value; + }, + + postCreate: function () { + var config = this.config.metadataTool; + this.metadata = new Metadata(config); + array.forEach(this.operLayerInfos.finalLayerInfos, function (layerInfo) { + this.drawListNode(layerInfo, 0, this.layerListTable, true); + }, this); + + array.forEach(this.operLayerInfos.tableInfos, function(layerInfo) { + this.drawListNode(layerInfo, 0, this.tableListTable, true); + }, this); + + //this will grey out layer nodes when zoomed out of scale + if (!this._zoomHandler) { + var map = this.map; + this._zoomHandler = this.own(on(map, 'zoom-end', lang.hitch(this, + this._adjustToState))); + } + this._adjustToState(); + }, + + drawListNode: function(layerInfo, level, toTableNode) { + // layerInfo.getLayerType().then(function(type){ + // console.log(type + "-------------------------------"); + // }); + var nodeAndSubNode; + if(layerInfo.newSubLayers.length === 0) { + //addLayerNode + nodeAndSubNode = this.addLayerNode(layerInfo, level, toTableNode); + //add legend node + if(this.config.showLegend) { + this.addLegendNode(layerInfo, level, nodeAndSubNode.subNode); + } else { + domStyle.set(query(".showLegend-image", + nodeAndSubNode.currentNode)[0], + 'display', + 'none'); + } + return; + } + //addLayerNode + nodeAndSubNode = this.addLayerNode(layerInfo, level, toTableNode); + array.forEach(layerInfo.newSubLayers, lang.hitch(this ,function(level, subLayerInfo){ + this.drawListNode(subLayerInfo, level+1, nodeAndSubNode.subNode); + }, level)); + }, + + addLayerNode: function(layerInfo, level, toTableNode) { + var layerTrNode = domConstruct.create('tr', { + 'class': 'jimu-widget-row layer-row ' + + ( /*visible*/ false ? 'jimu-widget-row-selected' : ''), + 'layerTrNodeId': layerInfo.id + }, toTableNode), layerTdNode,metadataTdNode, ckSelectDiv, ckSelect, imageShowLegendNode, imageNoLegendDiv, + imageNoLegendNode,metadataNode, popupMenuNode, i, imageShowLegendDiv, popupMenu, divLabel; + + layerTdNode = domConstruct.create('td', { + 'class': 'col col1' + }, layerTrNode); + + for (i = 0; i < level; i++) { + domConstruct.create('div', { + 'class': 'begin-blank-div jimu-float-leading', + 'innerHTML': '' + }, layerTdNode); + } + + imageShowLegendDiv = domConstruct.create('div', { + 'class': 'showLegend-div jimu-float-leading' + }, layerTdNode); + var showLegendImageSrc; + if(isRTL) { + showLegendImageSrc = this.layerListWidget.folderUrl + 'images/v_left.png'; + } else { + showLegendImageSrc = this.layerListWidget.folderUrl + 'images/v_right.png'; + } + + imageShowLegendNode = domConstruct.create('img', { + 'class': 'showLegend-image', + 'src': showLegendImageSrc, + 'alt': 'l' + }, imageShowLegendDiv); + + ckSelectDiv = domConstruct.create('div', { + 'class': 'div-select jimu-float-leading' + }, layerTdNode); + + ckSelect = new CheckBox({ + checked: layerInfo.isVisible()//layerInfo.visible + }); + domConstruct.place(ckSelect.domNode, ckSelectDiv); + + imageNoLegendDiv = domConstruct.create('div', { + 'class': 'noLegend-div jimu-float-leading' + }, layerTdNode); + + var imageName; + if (layerInfo.isTable) { + imageName = 'images/table.png'; + } else { + imageName = 'images/noLegend.png'; + } + + imageNoLegendNode = domConstruct.create('img', { + 'class': 'noLegend-image', + 'src': this.layerListWidget.folderUrl + imageName, + 'alt': 'l' + }, imageNoLegendDiv); + + if(layerInfo.noLegend || layerInfo.isTable) { + domStyle.set(imageShowLegendDiv, 'display', 'none'); + domStyle.set(ckSelectDiv, 'display', 'none'); + domStyle.set(imageNoLegendDiv, 'display', 'block'); + } + + // set tdNode width + domStyle.set(layerTdNode, 'width', level*12 + 35 + 'px'); + + var layerTitleTdNode = domConstruct.create('td', { + 'class': 'col col2' + }, layerTrNode); + divLabel = domConstruct.create('div', { + 'innerHTML': layerInfo.title, + 'class': 'div-content jimu-float-leading' + }, layerTitleTdNode); + + //domStyle.set(divLabel, 'width', 263 - level*13 + 'px'); + metadataTdNode = domConstruct.create('td', { + 'class': 'col col3' + }, layerTrNode); + if (layerInfo.newSubLayers.length === 0) { + this.metadata._init(metadataTdNode,layerInfo) + } + + + layerTdNode = domConstruct.create('td', { + 'class': 'col col4' + }, layerTrNode); + + // add popupMenu + popupMenuNode = domConstruct.create('div', { + 'class': 'layers-list-popupMenu-div' + }, layerTdNode); + + popupMenu = new PopupMenu({ + //items: layerInfo.popupMenuInfo.menuItems, + _layerInfo: layerInfo, + box: this.layerListWidget.domNode.parentNode, + _appConfig: this.layerListWidget.appConfig + }).placeAt(popupMenuNode); + this.own(on(popupMenu, + 'onMenuClick', + lang.hitch(this, this._onPopupMenuItemClick, layerInfo, popupMenu))); + + + popupMenu.loading = new LoadingIndicator({ + hidden: true + }); + popupMenu.loading.placeAt(popupMenuNode); + + //add a tr node to toTableNode. + var trNode = domConstruct.create('tr', { + 'class': '', + 'layerContentTrNodeId': layerInfo.id + }, toTableNode); + + var tdNode = domConstruct.create('td', { + 'class': '', + 'colspan': '4' + }, trNode); + + var tableNode = domConstruct.create('table', { + 'class': 'layer-sub-node' + }, tdNode); + + //bind event + this.own(on(layerTitleTdNode, + 'click', + lang.hitch(this, + this._onRowTrClick, + layerInfo, + imageShowLegendNode, + layerTrNode, + tableNode))); + + this.own(on(imageShowLegendDiv, + 'click', + lang.hitch(this, + this._onRowTrClick, + layerInfo, + imageShowLegendNode, + layerTrNode, + tableNode))); + + this.own(on(layerTrNode, + 'mouseover', + lang.hitch(this, this._onLayerNodeMouseover, layerTrNode, popupMenu))); + this.own(on(layerTrNode, + 'mouseout', + lang.hitch(this, this._onLayerNodeMouseout, layerTrNode, popupMenu))); + this.own(on(ckSelect.domNode, 'click', lang.hitch(this, + this._onCkSelectNodeClick, + layerInfo, + ckSelect))); + + this.own(on(popupMenuNode, 'click', lang.hitch(this, + this._onPopupMenuClick, + layerInfo, + popupMenu, + layerTrNode))); + + this.scaleConfig.push({ + layerInfo: layerInfo, + layerNode: layerTrNode + }); + + + return {currentNode: layerTrNode, subNode: tableNode}; + }, + + addLegendNode: function(layerInfo, level, toTableNode) { + //var legendsDiv; + var legendTrNode = domConstruct.create('tr', { + 'class': 'legend-node-tr' + }, toTableNode), legendTdNode; + + legendTdNode = domConstruct.create('td', { + 'class': 'legend-node-td' + }, legendTrNode); + +/* + array.forEach(layerInfo.legendInfos, function(legendInfo){ + var i; + for (i = 0; i < level+1; i++) { + domConstruct.create('div', { + 'class': 'begin-blank-div' + }, legendTdNode); + } + domConstruct.place(legendInfo.legendDiv, legendTdNode); + }, this); +*/ + //legendsDiv = layerInfo.obtainLegendsNode(); + + + + // layerInfo.legendsNode = domConstruct.create("div", { + // "class": "legends-div" + // }); + // domConstruct.create("img", { + // "class": "legends-loading-img", + // "src": this.layerListWidget.folderUrl + 'images/loading.gif' + // }, layerInfo.legendsNode); + // layerInfo.initLegendsNode(layerInfo.legendsNode); + // //domStyle.set(layerInfo.legendsNode, 'background-image', + // // 'url(' + this.layerListWidget.folderUrl + 'images/loading.gif)') + // domStyle.set(layerInfo.legendsNode, 'margin-left', (level+1)*12 + 'px'); + // domConstruct.place(layerInfo.legendsNode, legendTdNode); + + + // layerInfo.legendsNode = domConstruct.create("div", { + // "class": "legends-div" + // }); + // domConstruct.create("img", { + // "class": "legends-loading-img", + // "src": this.layerListWidget.folderUrl + 'images/loading.gif' + // }, layerInfo.legendsNode); + // layerInfo.initLegendsNode(layerInfo.legendsNode); + try{ + var legendsNode = layerInfo.createLegendsNode(); + //layerInfo.legendsNode = legendsNode; + //domStyle.set(legendsNode, 'marginLeft', (level+1)*12 + 'px'); + domStyle.set(legendsNode, 'font-size', (level+1)*12 + 'px'); + domConstruct.place(legendsNode, legendTdNode); + }catch(err){ + console.error(err); + } + }, + + // return current state: + // true: fold, + // false: unfold + _fold: function(layerInfo, imageShowLegendNode, subNode) { + /*jshint unused: false*/ + /* global isRTL*/ + var state; + if (domStyle.get(subNode, 'display') === 'none') { + //unfold + domStyle.set(subNode, 'display', 'table'); + //domClass.add(imageShowLegendNode, "layers-list-imageShowLegend-down"); + domAttr.set(imageShowLegendNode, 'src', this.layerListWidget.folderUrl + 'images/v.png'); + state = false;//unfold + } else { + //fold + domStyle.set(subNode, 'display', 'none'); + //domClass.remove(imageShowLegendNode, "layers-list-imageShowLegend-down"); + var src; + if(isRTL) { + src = this.layerListWidget.folderUrl + 'images/v_left.png'; + } else { + src = this.layerListWidget.folderUrl + 'images/v_right.png'; + } + domAttr.set(imageShowLegendNode, 'src', src); + state = true;// fold + } + return state; + }, + + _onCkSelectNodeClick: function(layerInfo, ckSelect, evt) { + if (ckSelect.checked) { + layerInfo.setTopLayerVisible(true); + } else { + layerInfo.setTopLayerVisible(false); + } + evt.stopPropagation(); + }, + + _onPopupMenuClick: function(layerInfo, popupMenu, layerTrNode, evt) { + popupMenu.btnClick(); + /*jshint unused: false*/ + this._changeSelectedLayerRow(layerTrNode); + if (popupMenu && popupMenu.state === 'opened') { + popupMenu.closeDropMenu(); + } else { + //topic.publish("popupMenuAll/hide"); + this._hideCurrentPopupMenu(); + popupMenu.loading.show(); + if (popupMenu) { + this.currentPopupMenu = popupMenu; + popupMenu.getPopupMenuInfo().then(lang.hitch(this, function(popupMenuInfo) { + //handle controlPopup item. + var itemNode = query("[itemid=controlPopup]", popupMenu.dropMenuNode)[0]; + if(itemNode && layerInfo.controlPopupInfo) { + if(layerInfo.controlPopupInfo.enablePopup) { + html.setAttr(itemNode, 'innerHTML', this.nls.removePopup); + } else { + html.setAttr(itemNode, 'innerHTML', this.nls.enablePopup); + } + } + popupMenu.openDropMenu(popupMenuInfo.getDeniedItems()); + popupMenu.loading.hide(); + + })); + } + } + evt.stopPropagation(); + }, + + _hideCurrentPopupMenu: function() { + if(this.currentPopupMenu && this.currentPopupMenu.state === 'opened') { + this.currentPopupMenu.closeDropMenu(); + } + }, + + _onLayerNodeMouseover: function(layerTrNode, popupMenu) { + domClass.add(layerTrNode, "layer-row-mouseover"); + if (popupMenu) { + //domClass.add(popupMenuNode, "layers-list-popupMenu-div-selected"); + domClass.add(popupMenu.btnNode, "jimu-icon-btn-selected"); + } + }, + + _onLayerNodeMouseout: function(layerTrNode, popupMenu) { + domClass.remove(layerTrNode, "layer-row-mouseover"); + if (popupMenu) { + //domClass.remove(popupMenuNode, "layers-list-popupMenu-div-selected"); + domClass.remove(popupMenu.btnNode, "jimu-icon-btn-selected"); + } + }, + + _onPopupMenuHide: function() { + /* + if (popupMenu && popupMenu.state === 'opened') { + //popupMenu.hide(); + popupMenu.closeDropMenu(); + } + */ + console.log("aaa"); + }, + + _onLayerListWidgetPaneClick: function(popupMenu) { + if (popupMenu) { + //popupMenu.hide(); + popupMenu.closeDropMenu(); + } + }, + + _onRowTrClick: function(layerInfo, imageShowLegendNode, layerTrNode, subNode) { + this._changeSelectedLayerRow(layerTrNode); + var fold = this._fold(layerInfo, imageShowLegendNode, subNode); + if(layerInfo.isLeaf() && !fold) { + var legendsNode = query(".legends-div", subNode)[0]; + var loadingImg = query(".legends-loading-img", legendsNode)[0]; + if(legendsNode && loadingImg) { + layerInfo.drawLegends(legendsNode, this.layerListWidget.appConfig.portalUrl); + } + } + }, + + _changeSelectedLayerRow: function(layerTrNode) { + if (this._currentSelectedLayerRowNode && this._currentSelectedLayerRowNode === layerTrNode) { + return; + } + if(this._currentSelectedLayerRowNode) { + domClass.remove(this._currentSelectedLayerRowNode, 'jimu-widget-row-selected'); + } + domClass.add(layerTrNode, 'jimu-widget-row-selected'); + this._currentSelectedLayerRowNode = layerTrNode; + }, + + _onPopupMenuItemClick: function(layerInfo, popupMenu, item, data) { + var evt = { + itemKey: item.key, + extraData: data, + layerListWidget: this.layerListWidget, + layerListView: this + }, result; + + // window.jimuNls.layerInfosMenu.itemTransparency NlsStrings.value.itemTransparency + if (item.key === 'transparency') { + if (domStyle.get(popupMenu.transparencyDiv, 'display') === 'none') { + popupMenu.showTransNode(layerInfo.getOpacity()); + } else { + popupMenu.hideTransNode(); + } + } else { + result = popupMenu.popupMenuInfo.onPopupMenuClick(evt); + if (result.closeMenu) { + popupMenu.closeDropMenu(); + } + } + }, + + // befor exchange: id1 -> id2 + // after exchanged: id2 -> id1 + _exchangeLayerTrNode: function(id1, id2) { + var layer1TrNode = query("tr[layerTrNodeId='" + id1 + "']", this.layerListTable)[0]; + //var layer1ContentTrNode = query("tr[layerContentTrNodeId='" + id1 + "']", + // this.layerListTable)[0]; + var layer2TrNode = query("tr[layerTrNodeId='" + id2 + "']", this.layerListTable)[0]; + var layer2ContentTrNode = query("tr[layerContentTrNodeId='" + id2 + "']", + this.layerListTable)[0]; + // change layerTr + this.layerListTable.removeChild(layer2TrNode); + this.layerListTable.insertBefore(layer2TrNode, layer1TrNode); + // change LayerContentTr + this.layerListTable.removeChild(layer2ContentTrNode); + this.layerListTable.insertBefore(layer2ContentTrNode, layer1TrNode); + }, + + moveUpLayer: function(id) { + // summary: + // move up layer in layer list. + // description: + // call the moveUpLayer method of LayerInfos to change the layer order in map, + // and update the data in LayerInfos + // then, change layerNodeTr and layerContentTr domNode + var beChangedId = this.operLayerInfos.moveUpLayer(id); + if(beChangedId) { + this._exchangeLayerTrNode(beChangedId, id); + } + }, + + moveDownLayer: function(id) { + // summary: + // move down layer in layer list. + // description: + // call the moveDownLayer method of LayerInfos to change the layer order in map, + // and update the data in LayerInfos + // then, change layerNodeTr and layerContentTr domNode + var beChangedId = this.operLayerInfos.moveDownLayer(id); + + if(beChangedId) { + this._exchangeLayerTrNode(id, beChangedId); + } + }, + _adjustToState: function () { + var scale = this.map.getScale(); + array.forEach(this.scaleConfig, function (layerItem) { + if (layerItem.layerInfo.layerObject && (layerItem.layerInfo.layerObject.maxScale || layerItem.layerInfo.layerObject.minScale)) { + var layerObject = layerItem.layerInfo.layerObject; + var layerNode = layerItem.layerNode; + var outScale = (layerObject.maxScale != 0 && scale layerObject.minScale); + if (outScale) { + domClass.add(layerNode, 'LayerOutOfScale'); + + } else { + domClass.remove(layerNode, 'LayerOutOfScale'); + + } + } + + }); + + } + + }); +}); diff --git a/src/Metadata.js b/src/Metadata.js new file mode 100644 index 0000000..91041f7 --- /dev/null +++ b/src/Metadata.js @@ -0,0 +1,171 @@ +define( +[ + "dojo/_base/declare", + "dojo/_base/array", + "dojo/_base/lang", + "dojo/dom", + "dojo/dom-construct", + "dojo/dom-style", + "dojo/dom-attr", + "dojo/on", + "dojo/_base/lang", + "dijit/Dialog", + "dijit/form/Button", + "esri/request", + "dijit/layout/ContentPane", + "./NlsStrings", + "jimu/dijit/Message", + "jimu/dijit/Popup" + +], function ( + declare, + array, + lang, + dom, + domConstruct, + domStyle, + domAttr, + on, + lang, + Dialog, + Button, + esriRequest, + ContentPane, + NlsStrings, + Message, + Popup +) { + var Metadata = declare("Metadata", null, { + config: null, + + constructor: function (config) { + + this.nls = NlsStrings.value; + this.config = config; + + }, + _popupTitle:"Metadata", + _init: function (node, layerInfo) { + var triggerNode = domConstruct.create('div', { + 'class': "layers-list-metaData-div", + title: 'Metadata', + style: "cursor: pointer;" + }, node); + if (!layerInfo.layerObject.url) { + domStyle.set(triggerNode, { "opacity": 0.5 }); + domAttr.set(triggerNode, "title", "Metadata disabled"); + on(triggerNode, "click", lang.hitch(this, function () { + var popup = new Message({ + message: me.nls.metadataWarning, + buttons: [{ + label: me.nls.ok, + onClick: lang.hitch(this, function () { + popup.close(); + }) + }] + }); + })); + + } else { + on(triggerNode, "click", lang.hitch(this, function () { + this._setPopupTitle(layerInfo.title); + this._handleMetadataClick(layerInfo.layerObject.url) + })); + } + }, + _setPopupTitle:function(title){ + this._popupTitle = title; + }, + _handleMetadataClick: function (url,title) { + var itemUrl = url.replace("/FeatureServer/", "/MapServer/"); + var layerId = itemUrl.substr(itemUrl.lastIndexOf('/') + 1); + var serviceUrl = itemUrl.replace(itemUrl.substr(itemUrl.lastIndexOf('/')), ''); + + var url = serviceUrl + this.config.path; + + url = url.replace(/\{([a-zA-Z]+)\}/g, function (match) { + return layerId; + }); + + esriRequest({ + url: url, + callbackParamName: "callback", + handleAs: "json", + }).then(lang.hitch(this,function (response) { + this.parseMetadata(response.metadata); + }),lang.hitch(this, function (error) { + var popup = new Message({ + message: this.nls.metadataWarning, + buttons: [{ + label: this.nls.ok, + onClick: lang.hitch(this, function () { + popup.close(); + }) + }] + }); + })); + }, + parseMetadata: function (metadata) { + var me = this; + var metadataContent = []; + var componentConfig = this.config.metadataParseConfig; + var messageContent = domConstruct.create("div", { + style: "position:relative;margin:0 auto;width:100%;" + }); + array.forEach(componentConfig, lang.hitch(this, function (config, index) { + var label = config.label; + var info = this.findDataInPath(config.path, metadata); + if(info != null){ + if (label.length > 0) { + var labelNode = domConstruct.create("div", { + style: "position:relative;float:left;width:100%;margin-top:10px;", + innerHTML: label + }); + domConstruct.place(labelNode, messageContent); + } + var infoNode = domConstruct.create("div", { + style: "position:relative;float:left", + innerHTML: info + }); + if (label.length > 0) { + domStyle.set(infoNode, { "marginLeft": "10px" ,"marginTop":"20px;"}) + } + + domConstruct.place(infoNode, messageContent); + } + })); + var popup = new Popup({ + content: messageContent, + titleLabel: this._popupTitle, + autoHeight: true, + maxWidth:400, + buttons: [{ + label: this.nls.ok, + onClick: lang.hitch(this, function () { + popup.close(); + }) + }] + }); + }, + findDataInPath:function(path,metadata){ + var subPaths = path.split("->"); + var data = null; + array.some(subPaths, function (key) { + if (!metadata[key]) { + data = null; + return false; + } else { + metadata = metadata[key]; + data = metadata; + } + }); + return data ? this.stripHtml(data) : data; + }, + stripHtml: function (str) { + var regex = /(<([^>]+)>)/ig; + return str.replace(regex, ""); + } + }); + return Metadata; +}); + diff --git a/src/NlsStrings.js b/src/NlsStrings.js new file mode 100644 index 0000000..ed092ad --- /dev/null +++ b/src/NlsStrings.js @@ -0,0 +1,21 @@ +/////////////////////////////////////////////////////////////////////////// +// Copyright © 2014 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([], function() { + var nls = {value: null}; + return nls; +}); + diff --git a/src/PopupMenu.html b/src/PopupMenu.html new file mode 100644 index 0000000..2713211 --- /dev/null +++ b/src/PopupMenu.html @@ -0,0 +1,11 @@ +
+ +
diff --git a/src/PopupMenu.js b/src/PopupMenu.js new file mode 100644 index 0000000..232e212 --- /dev/null +++ b/src/PopupMenu.js @@ -0,0 +1,187 @@ +define([ + 'dojo/_base/declare', + 'dojo/_base/array', + 'dojo/_base/html', + 'dojo/_base/lang', + 'dojo/query', + 'dojo/on', + 'dojo/Deferred', + 'jimu/dijit/DropMenu', + 'dijit/_TemplatedMixin', + 'dijit/form/HorizontalSlider', + 'dijit/form/HorizontalRuleLabels', + 'dojo/text!./PopupMenu.html', + 'dojo/dom-style', + './NlsStrings', + './PopupMenuInfo' +], function(declare, array, html, lang, query, on, Deferred, DropMenu, +_TemplatedMixin, HorizSlider, HorzRuleLabels, template, domStyle, NlsStrings, PopupMenuInfo) { + return declare([DropMenu, _TemplatedMixin], { + templateString: template, + popupMenuInfo: null, + _popupMenuInfoDef: null, + _deniedItems: null, + _layerInfo: null, + constructor: function() { + this.nls = NlsStrings.value; + this._deniedItems = []; + this._popupMenuInfoDef = new Deferred(); + }, + + _getDropMenuPosition: function(){ + return { + top: "28px", + //left: "-107px" + left: 12 - html.getStyle(this.dropMenuNode, 'width') + 'px' + }; + }, + + _getTransNodePosition: function() { + return { + top: "15px", + //left: "-107px" + left: -174 - html.getStyle(this.dropMenuNode, 'width') + 'px' + }; + }, + + _onBtnClick: function(){ + // if(!this.dropMenuNode){ + // PopupMenuInfo.create(this._layerInfo, this._appConfig) + // .then(lang.hitch(this, function(popupMenuInfo) { + // this.items = popupMenuInfo.getDisplayItems(); + // this.popupMenuInfo = popupMenuInfo; + // this._createDropMenuNode(); + // this.own(on(this.dropMenuNode, 'click', lang.hitch(this, function(evt){ + // evt.stopPropagation(); + // }))); + // this._popupMenuInfoDef.resolve(popupMenuInfo); + // })); + // } + }, + + btnClick: function() { + if(!this.dropMenuNode){ + PopupMenuInfo.create(this._layerInfo, this._appConfig) + .then(lang.hitch(this, function(popupMenuInfo) { + this.items = popupMenuInfo.getDisplayItems(); + this.popupMenuInfo = popupMenuInfo; + this._createDropMenuNode(); + this.own(on(this.dropMenuNode, 'click', lang.hitch(this, function(evt){ + evt.stopPropagation(); + }))); + this._popupMenuInfoDef.resolve(popupMenuInfo); + })); + } + }, + + getPopupMenuInfo: function() { + // var def = new Deferred(); + // if(this.popupMenuInfo) { + // def.resolve(this.popupMenuInfo); + // } else { + // PopupMenuInfo.create(this._layerInfo).then(lang.hitch(this, function(popupMenuInfo) { + // this.popupMenuInfo = popupMenuInfo; + // def.resolve(popupMenuInfo); + // })); + // } + // return def; + return this._popupMenuInfoDef; + }, + + // will call after openDropMenu + _refresh: function() { + this._denyItems(); + }, + + _denyItems: function() { + var itemNodes = query("div[class~='menu-item']", this.dropMenuNode) + .forEach(function(itemNode){ + html.removeClass(itemNode, "menu-item-dissable"); + }); + array.forEach(this._deniedItems, function(itemKey) { + itemNodes.forEach(function(itemNode){ + if (html.getAttr(itemNode, 'itemId') === itemKey) { + html.addClass(itemNode, "menu-item-dissable"); + if(itemKey === 'url') { + query(".menu-item-description", itemNode).forEach(function(itemA){ + html.setAttr(itemA, 'href', '#'); + html.removeAttr(itemA, 'target'); + }); + } + } + }); + }, this); + }, + + selectItem: function(item){ + var index = this._deniedItems.indexOf(item.key); + if (index === -1) { + this.emit('onMenuClick', item); + } + }, + + openDropMenu: function(deniedItemsDef){ + // if (deniedItems) { + // this._deniedItems = deniedItems; + // } else { + // this._deniedItems = []; + // } + + deniedItemsDef.then(lang.hitch(this, function(deniedItems) { + this._deniedItems = deniedItems; + this._refresh(); + })); + this.inherited(arguments); + }, + + closeDropMenu: function(){ + this.inherited(arguments); + this.hideTransNode(); + }, + + // about transparcency + _onTransparencyDivClick: function(evt) { + // summary: + // response to click transparency in popummenu. + evt.stopPropagation(); + }, + + showTransNode: function(transValue) { + /* global isRTL */ + if (!this.transHorizSlider) { + this._createTransparencyWidget(); + this.transHorizSlider.set("value", 1 - transValue); + } + domStyle.set(this.transparencyDiv, "top", this._getTransNodePosition().top); + if(isRTL) { + domStyle.set(this.transparencyDiv, "right", this._getTransNodePosition().left); + } else { + domStyle.set(this.transparencyDiv, "left", this._getTransNodePosition().left); + } + domStyle.set(this.transparencyDiv, "display", "block"); + }, + + hideTransNode: function() { + domStyle.set(this.transparencyDiv, "display", "none"); + }, + + _createTransparencyWidget: function() { + this.transHorizSlider= new HorizSlider({ + minimum: 0, + maximum: 1, + intermediateChanges: true + }, this.transparencyBody); + + this.own(this.transHorizSlider.on("change", lang.hitch(this, function(newTransValue){ + var data = {newTransValue: newTransValue}; + this.emit('onMenuClick', {key: 'transparencyChanged'}, data); + }))); + + new HorzRuleLabels({ + container: "bottomDecoration" + }, this.transparencyRule); + } + + + }); +}); diff --git a/src/PopupMenuInfo.js b/src/PopupMenuInfo.js new file mode 100644 index 0000000..92830a7 --- /dev/null +++ b/src/PopupMenuInfo.js @@ -0,0 +1,361 @@ +/////////////////////////////////////////////////////////////////////////// +// Copyright © 2014 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/declare', + 'dojo/_base/array', + 'dojo/_base/lang', + 'dojo/Deferred', + 'dojo/promise/all', + 'jimu/portalUrlUtils', + 'jimu/WidgetManager', + './NlsStrings' +], function(declare, array, lang, Deferred, all, portalUrlUtils, WidgetManager, NlsStrings) { + var clazz = declare([], { + + _candidateMenuItems: null, + //_deniedItems: null, + _displayItems: null, + _layerInfo: null, + _layerType: null, + _appConfig: null, + + constructor: function(layerInfo, displayItemInfos, layerType, appConfig) { + this.nls = NlsStrings.value; + this._layerInfo = layerInfo; + this._layerType = layerType; + this._appConfig = appConfig; + this._initCandidateMenuItems(); + this._initDisplayItems(displayItemInfos); + }, + + _getATagLabel: function() { + var url; + var label; + var itemLayerId = this._layerInfo._isItemLayer && this._layerInfo._isItemLayer(); + + if(itemLayerId) { + url = portalUrlUtils. + getItemDetailsPageUrl(portalUrlUtils.getStandardPortalUrl(this._appConfig.portalUrl), + itemLayerId); + label = this.nls.itemShowItemDetails; + } else if(this._layerInfo.layerObject && + this._layerInfo.layerObject.url && + (this._layerType === "CSVLayer" || this._layerType === "KMLLayer")) { + url = this._layerInfo.layerObject.url; + label = this.nls.itemDownload; + } else if(this._layerInfo.layerObject && this._layerInfo.layerObject.url) { + url = this._layerInfo.layerObject.url; + label = this.nls.itemDesc; + } else { + url = ''; + label = this.nls.itemDesc; + } + + return '' + label + ''; + }, + + + _initCandidateMenuItems: function() { + //descriptionTitle: NlsStrings.value.itemDesc, + // var layerObjectUrl = (this._layerInfo.layerObject && this._layerInfo.layerObject.url) ? + // this._layerInfo.layerObject.url : + // ''; + this._candidateMenuItems = [{ + key: 'separator', + label: '' + },{ + key: 'empty', + label: this.nls.empty + },{ + key: 'zoomto', + label: this.nls.itemZoomTo + },{ + key: 'transparency', + label: this.nls.itemTransparency + },{ + key: 'moveup', + label: this.nls.itemMoveUp + },{ + key: 'movedown', + label: this.nls.itemMoveDown + },{ + key: 'table', + label: this.nls.itemToAttributeTable + },{ + key: 'controlPopup', + label: this.nls.removePopup + },{ + key: 'url', + label: this._getATagLabel() + }]; + }, + + _initDisplayItems: function(displayItemInfos) { + this._displayItems = []; + // according to candidate itmes to init displayItems + array.forEach(displayItemInfos, function(itemInfo) { + array.forEach(this._candidateMenuItems, function(item){ + if(itemInfo.key === item.key) { + this._displayItems.push(lang.clone(item)); + if(itemInfo.onClick) { + this._displayItem.onClick = itemInfo.onClick; + } + } + }, this); + }, this); + }, + + getDeniedItems: function() { + var defRet = new Deferred(); + var dynamicDeniedItems = []; + + if (this._layerInfo.isFirst) { + dynamicDeniedItems.push('moveup'); + } else if (this._layerInfo.isLast) { + dynamicDeniedItems.push('movedown'); + } + + if(!this._layerInfo.layerObject || !this._layerInfo.layerObject.url) { + dynamicDeniedItems.push('url'); + } + + var loadInfoTemplateDef = this._layerInfo.loadInfoTemplate(); + var getSupportTableInfoDef = this._layerInfo.getSupportTableInfo(); + + all({ + infoTemplate: loadInfoTemplateDef, + supportTableInfo: getSupportTableInfoDef + }).then(lang.hitch(this._layerInfo, function(result){ + + // deny controlPopup + if(!result.infoTemplate) { + dynamicDeniedItems.push('controlPopup'); + } + + // deny table. + var supportTableInfo = result.supportTableInfo; + var attributeTableWidgets = WidgetManager.getInstance().getWidgetsByName("AttributeTable"); + var hasAttributeTable = attributeTableWidgets.length > 0 && + attributeTableWidgets[0].visible; + if (!hasAttributeTable || + !supportTableInfo.isSupportedLayer || + !supportTableInfo.isSupportQuery) { + dynamicDeniedItems.push('table'); + } + defRet.resolve(dynamicDeniedItems/*this.***.deniedItems.concat(dynamicDeniedItems)*/); + }), function() { + defRet.resolve(dynamicDeniedItems/*this.***.deniedItems.concat(dynamicDeniedItems)*/); + }); + + return defRet; + }, + + getDisplayItems: function() { + return this._displayItems; + }, + + onPopupMenuClick: function(evt) { + var result = { + closeMenu: true + }; + switch (evt.itemKey) { + case 'zoomto'/*this.nls.itemZoomTo'Zoom to'*/: + this._onItemZoomToClick(evt); + break; + case 'moveup'/*this.nls.itemMoveUp'Move up'*/: + this._onMoveUpItemClick(evt); + break; + case 'movedown'/*this.nls.itemMoveDown'Move down'*/: + this._onMoveDownItemClick(evt); + break; + case 'table'/*this.nls.itemToAttributeTable'Open attribute table'*/: + this._onTableItemClick(evt); + break; + case 'transparencyChanged': + this._onTransparencyChanged(evt); + result.closeMenu = false; + break; + case 'controlPopup': + this._onControlPopup(); + break; + + } + return result; + }, + + /********************************** + * Respond events respectively. + * + * event format: + // evt = { + // itemKey: item key + // extraData: estra data, + // layerListWidget: layerListWidget, + // layerListView: layerListView + // }, result; + **********************************/ + _onItemZoomToClick: function(evt) { + /*jshint unused: false*/ + //this.map.setExtent(this.getExtent()); + this._layerInfo.getExtent().then(lang.hitch(this, function(geometries) { + this._layerInfo.map.setExtent(geometries[0]); + })); + }, + + _onMoveUpItemClick: function(evt) { + if (!this._layerInfo.isFirst) { + evt.layerListView.moveUpLayer(this._layerInfo.id); + } + }, + + _onMoveDownItemClick: function(evt) { + if (!this._layerInfo.isLast) { + evt.layerListView.moveDownLayer(this._layerInfo.id); + } + }, + + _onTableItemClick: function(evt) { + // new version, send layerInfo object. + this._layerInfo.getLayerType().then(lang.hitch(this, function(layerType){ + if (this._layerInfo._getLayerTypesOfSupportTable().indexOf(layerType) >= 0) { + evt.layerListWidget.publishData({ + 'target': 'AttributeTable', + 'layer': this._layerInfo + }); + } + })); + }, + + _onTransparencyChanged: function(evt) { + this._layerInfo.setOpacity(1 - evt.extraData.newTransValue); + }, + + _onControlPopup: function(evt) { + /*jshint unused: false*/ + if(this._layerInfo.controlPopupInfo.enablePopup) { + this._layerInfo.disablePopup(); + } else { + this._layerInfo.enablePopup(); + } + this._layerInfo.map.infoWindow.hide(); + } + }); + + clazz.create = function(layerInfo, appConfig) { + var retDef = new Deferred(); + var isRootLayer = layerInfo.isRootLayer(); + var defaultItemInfos = [{ + key: 'url', + onClick: null + }]; + + var itemInfoCategoreList = { + 'RootLayer': [{ + key: 'zoomto' + },{ + key: 'transparency' + },{ + key:'separator' + },{ + key: 'moveup' + },{ + key: 'movedown' + },{ + key:'separator' + },{ + key: 'url' + }], + 'RootLayerAndFeatureLayer': [{ + key: 'zoomto' + }, { + key: 'transparency' + }, { + key:'separator' + },{ + key: 'controlPopup' + }, { + key:'separator' + },{ + key: 'moveup' + }, { + key: 'movedown' + }, { + key:'separator' + }, { + key: 'table' + }, { + key:'separator' + },{ + key: 'url' + }], + 'FeatureLayer': [{ + key: 'controlPopup' + }, { + key:'separator' + }, { + key: 'table' + }, { + key:'separator' + }, { + key: 'url' + }], + 'GroupLayer': [{ + key: 'url' + }], + 'Table': [{ + key: 'table' + }, { + key:'separator' + }, { + key: 'url' + }], + 'default': defaultItemInfos + }; + + layerInfo.getLayerType().then(lang.hitch(this, function(layerType){ + var itemInfoCategory = ""; + if(isRootLayer && (layerType === "FeatureLayer" || + layerType === "CSVLayer" || + layerType ==="ArcGISImageServiceLayer")) { + itemInfoCategory = "RootLayerAndFeatureLayer"; + } else if(isRootLayer ) { + itemInfoCategory = "RootLayer"; + } else if(layerType === "FeatureLayer" || layerType === "CSVLayer") { + itemInfoCategory = "FeatureLayer"; + } else if(layerType === "GroupLayer") { + itemInfoCategory = "GroupLayer"; + } else if(layerType === "Table") { + itemInfoCategory = "Table"; + } else { + //default condition + itemInfoCategory = "default"; + } + retDef.resolve(new clazz(layerInfo, + itemInfoCategoreList[itemInfoCategory], + layerType, + appConfig)); + }), lang.hitch(this, function() { + //return default popupmenu info. + retDef.resolve(new clazz(layerInfo, [{key:'empty'}])); + })); + return retDef; + }; + + + return clazz; +}); \ No newline at end of file diff --git a/src/Widget.html b/src/Widget.html new file mode 100644 index 0000000..2e35479 --- /dev/null +++ b/src/Widget.html @@ -0,0 +1,7 @@ +
+
+
${nls.titleLayers}
+
+
+
+
diff --git a/src/Widget.js b/src/Widget.js new file mode 100644 index 0000000..e0be995 --- /dev/null +++ b/src/Widget.js @@ -0,0 +1,302 @@ +/////////////////////////////////////////////////////////////////////////// +// Copyright © 2014 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([ + 'jimu/BaseWidget', + 'dojo/_base/declare', + 'dojo/_base/lang', + 'dojo/_base/array', + 'dojo/dom-construct', + 'dojo/dom-geometry', + 'dojo/dom', + 'dojo/on', + 'dojo/_base/unload', + 'dojo/aspect', + 'dojo/query', + 'jimu/dijit/Selectionbox', + './LayerListView', + './PopupMenu', + 'dojo/dom-style', + './NlsStrings', + 'jimu/LayerInfos/LayerInfoFactory', + 'jimu/LayerInfos/LayerInfos', + 'dojo/promise/all' + ], + function(BaseWidget, declare, lang, array, domConstruct, domGeometry, dom, on, baseUnload, + aspect, query, Selectionbox, LayerListView, PopupMenu, domStyle, NlsStrings, LayerInfoFactory, + LayerInfos, all) { + var clazz = declare([BaseWidget], { + /*jshint unused: false*/ + //these two properties is defined in the BaseWiget + baseClass: 'jimu-widget-layerList', + name: 'layerList', + + //layerListView: Object{} + // A module is responsible for show layers list + layerListView: null, + + //operLayerInfos: Object{} + // operational layer infos + operLayerInfos: null, + + startup: function() { + NlsStrings.value = this.nls; + // summary: + // this function will be called when widget is started. + // description: + // according to webmap or basemap to create LayerInfos instance + // and initialize operLayerInfos; + // show layers list; + // bind events of layerList and create popup menu. + // var mapLayers; + // LayerInfoFactory.getInstance(this.map).init().then(lang.hitch(this, function(){ + // if (this.map.itemId) { + // this.operLayerInfos = + // new LayerInfos(this.map.itemInfo.itemData.baseMap.baseMapLayers, + // this.map.itemInfo.itemData.operationalLayers, + // this.map); + // } else { + // mapLayers = this._obtainMapLayers(); + // this.operLayerInfos = new LayerInfos(mapLayers.basemapLayers, + // mapLayers.operationalLayers, this.map); + // } + + // this.showLayers(); + // this.bindEvents(); + // dom.setSelectable(this.layersSection, false); + // })); + + if (this.map.itemId) { + LayerInfos.getInstance(this.map, this.map.itemInfo) + .then(lang.hitch(this, function(operLayerInfos) { + this.operLayerInfos = operLayerInfos; + this.showLayers(); + //this.bindEvents(); + this.own(on(this.operLayerInfos, + 'layerInfosChanged', + lang.hitch(this, this._onLayerInfosChanged))); + dom.setSelectable(this.layersSection, false); + })); + } else { + var itemInfo = this._obtainMapLayers(); + LayerInfos.getInstance(this.map, itemInfo) + .then(lang.hitch(this, function(operLayerInfos) { + this.operLayerInfos = operLayerInfos; + this.showLayers(); + //this.bindEvents(); + this.own(on(this.operLayerInfos, + 'layerInfosChanged', + lang.hitch(this, this._onLayerInfosChanged))); + dom.setSelectable(this.layersSection, false); + })); + } + }, + + destroy: function() { + this._clearLayers(); + this.inherited(arguments); + }, + + _obtainMapLayers: function() { + // summary: + // obtain basemap layers and operational layers if the map is not webmap. + var basemapLayers = [], + operLayers = []; + // emulate a webmapItemInfo. + var retObj = { + itemData: { + baseMap: { + baseMapLayers: [] + }, + operationalLayers: [] + } + }; + // array.forEach(this.map.layerIds.concat(this.map.graphicsLayerIds), function(layerId) { + // var layer = this.map.getLayer(layerId); + // if (layer.isOperationalLayer) { + // operLayers.push({ + // layerObject: layer, + // title: layer.label || layer.title || layer.name || layer.id || " ", + // id: layer.id || " " + // }); + // } else { + // basemapLayers.push({ + // layerObject: layer, + // id: layer.id || " " + // }); + // } + // }, this); + + array.forEach(this.map.graphicsLayerIds, function(layerId) { + var layer = this.map.getLayer(layerId); + if (layer.isOperationalLayer) { + operLayers.push({ + layerObject: layer, + title: layer.label || layer.title || layer.name || layer.id || " ", + id: layer.id || " " + }); + } + }, this); + array.forEach(this.map.layerIds, function(layerId) { + var layer = this.map.getLayer(layerId); + if (layer.isOperationalLayer) { + operLayers.push({ + layerObject: layer, + title: layer.label || layer.title || layer.name || layer.id || " ", + id: layer.id || " " + }); + } else { + basemapLayers.push({ + layerObject: layer, + id: layer.id || " " + }); + } + }, this); + + retObj.itemData.baseMap.baseMapLayers = basemapLayers; + retObj.itemData.operationalLayers = operLayers; + return retObj; + }, + + + + _layerFilter: function(layerId, basemapLayers, operLayers) { + var layer = this.map.getLayer(layerId); + if (layer.isOperationalLayer) { + operLayers.push({ + layerObject: layer, + title: layer.label || layer.title || layer.name || layer.id || " ", + id: layer.id || " " + }); + } else { + basemapLayers.push({ + layerObject: layer, + id: layer.id || " " + }); + } + }, + + showLayers: function() { + // summary: + // create a LayerListView module used to draw layers list in browser. + this.layerListView = new LayerListView({ + operLayerInfos: this.operLayerInfos, + layerListWidget: this, + config: this.config, + map:this.map + }).placeAt(this.layerListBody); + }, + + _createPopupMenu: function() { + // summary: + // popup menu is a dijit used to do some operations of layer + this.popupMenu = new PopupMenu({ + layerListWidget: this + }); + domConstruct.place(this.popupMenu.domNode, this.domNode); + }, + + _clearLayers: function() { + // summary: + // clear layer list + //domConstruct.empty(this.layerListTable); + if (this.layerListView && this.layerListView.destroyRecursive) { + this.layerListView.destroyRecursive(); + } + }, + + flag: true, + + bindEvents: function() { + // summary: + // bind events are listened by this module + var handleRemove, handleRemoves, scaleChangeHandle; + //this.own(aspect.after(this.map, "onLayerAddResult", + // lang.hitch(this, this._onLayersChange))); + this.own(on(this.map, "layer-add-result", lang.hitch(this, this._onLayersChange))); + //handleRemove = aspect.after(this.map, "onLayerRemove", + // lang.hitch(this, this._onLayersChange)); + handleRemove = on(this.map, "layer-remove", lang.hitch(this, this._onLayersChange)); + this.own(handleRemove); + //aspect.after(this.map, "onLayerReorder", lang.hitch(this, this._onLayersChange)); + //this.own(on(this.map, "LayersAddResult", lang.hitch(this, this._onLayersChangeAdds))); + //this.own(on(this.map, "layers-add-result", lang.hitch(this, this._onLayersChange))); + //handleRemoves = aspect.after(this.map, "onLayersRemoved", + // lang.hitch(this, this._onLayersChange)); + //handleRemoves = on(this.map, "layers-removed", lang.hitch(this, this._onLayersChange)); + //this.own(handleRemoves); + //aspect.after(this.map, "onLayersReorder", lang.hitch(this, this._onLayersChange)); + + //this.own(on(this.map, "extent-change", lang.hitch(this, this._onLayersScaleChange))); + + baseUnload.addOnUnload(function() { + handleRemove.remove(); + handleRemoves.remove(); + //scaleChangeHandle.remove(); + }); + + // map infowindow + // on(this.map.infoWindow, "show", lang.hitch(this, function(){ + // all(this.map.infoWindow.deferreds).then(lang.hitch(this, function() { + // var features = []; + // if (this.map.infoWindow.features.length > 0) { + // features.push(this.map.infoWindow.features[0]); + // this.flag = true; + // } + // this.map.infoWindow.setFeatures(features); + // }), function() { + + // }); + + // })); + + // on(this.map.infoWindow, "hide", lang.hitch(this, function(){ + // if (this.flag) { + // this.map.infoWindow.show(); + // this.flag = false; + // } + // })); + }, + + _onLayersChange: function(evt) { + /*jshint unused: false*/ + // summary: + // response to any layer change. + // description: + // udate LayerInfos data, cleare layer list and redraw + if (evt.layer.declaredClass !== "esri.layers.GraphicsLayer") { + this.operLayerInfos.update(); + this._clearLayers(); + this.showLayers(); + } + }, + + _onLayerInfosChanged: function(layerInfo, changedType) { + this._clearLayers(); + this.showLayers(); + } + //_onLayersScaleChange: function (event) { + // console.log("mapScale"); + // var mapScale = this.map.getScale(); + // console.log(mapScale); + // console.log(this.operLayerInfos); + + //} + + }); + //clazz.hasConfig = false; + return clazz; + }); diff --git a/src/config.json b/src/config.json new file mode 100644 index 0000000..8683bbb --- /dev/null +++ b/src/config.json @@ -0,0 +1,29 @@ +{ + "showLegend": true, + "metadataTool": { + "path": "/exts/LayerMetadata/getMetadata?layer={layerId}&f=pjson", + "metadataParseConfig": [ + { + "label": "", + "path": "dataIdInfo->idAbs" + }, + { + "label":"Credit", + "path":"dataIdInfo->idCredit" + }, + { + "label":"Use Limitations", + "path":"dataIdInfo->resConst->Consts->useLimit" + }, + { + "label":"Date Last Updated", + "path":"dataIdInfo->resConst->Consts->useLimit" + } + + ] + } + +} + + + diff --git a/src/css/images/current_basemap_indicator.png b/src/css/images/current_basemap_indicator.png new file mode 100644 index 0000000000000000000000000000000000000000..df226a64f96073296680a4a3bbf35e7aca152378 GIT binary patch literal 3013 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 literal 0 HcmV?d00001 diff --git a/src/images/metadata.png b/src/images/metadata.png new file mode 100644 index 0000000000000000000000000000000000000000..bda8a3d593a8d6128efb303ba06c2b3ce45f3739 GIT binary patch literal 431 zcmV;g0Z{&lP)GZx%bYQI~`M~hs_+$;ShSUy@i66lGEEZzta+S zaT}LWVFT}D-orx7@8L?xY4kHdh#%q@9^q=q>BCfIdoaK$tm8<@Y1EDLL5OeSR>^51 zI*A#qmYlY5x*j$!aW}?Nrye$ayu)LhXo+X>Dat-ra(dRP<^dKlU*T+!u1&;&uVLJ) z@S=?y_>S|Pde}V2u9DNd9iSdIPcYjxcKGQZ2s8K+%l##%jVa0|7P|h8$$9lRLWPg$ z|G((p(8uS>*r>hHf!jj7&;gVRYsQW)*TZJJF$TuhTdAVs?%+7Cw}O1b(HNVp>=$qb z_e)N%chbtcBlBWh`*6u=H2s;Danab^7p=@a?2G+XT>9lRO=X(H66z36UaDZN^mtHOiaPi%_9xdJ}aM(RE#PVNys)cM*gJndH)jQC_5#cp)K57u8bJ zC8^}b{uQ*jv#;-46Ix6RdN|KH-+9mX{&?PV4#5Vx*950^hkk$%;7ee&v8@-=`SuC< zialphYu{~szSm_pnacGNQJ~qqGdkg&!osG22j}2%9&ioV_EZ)qRE1Eew9uQ41=^xQ zPhI(P;PGT`k{m$adF|~QcWsAxmkolNH7hm0tR)Bv5q*l@(MB0ZW|8(!}r{B-9e zr0tHa_g#ngH%LYkh(cs$Y?eJEO4%U;athJl3Z_Oz27^nX*4AD`$jxJrw%IMC$IqN{ zs)|ZL1QoOLFF+bdr`crg zkXbVWq>@Od5=g`&81p`hh>P>fbHRnhYID^-5I(P{1~`O|kxfA9pMV6&+E0YvPhxd7 zGA9iClVir%2Wy!oT%og9K`bg`ko6>D*2>I1hf|uu;&?ZP`bLK?Jd9uDUm^T*HvQHp zuOtnE|KJvj2|}Sc&)-2H$Nl)|yN;*6na(R-`35V_3Yigs(5spBr{eFSsI~ZAwN47F z6(z2mcKWRk{^728?_j*+nvdRPrMYZxjtr-rXnE7FiP706N@HH;CzQ^&(eYclSaUU6 z_#SMc(xVR4zi6-WCl)$sBG5&BR~>$LCF=Pz{G+s$dK~J$Tr=9k%-6hzyl-Y>shDlq lHJ>+`7eFb+|LB(h0|3wO literal 0 HcmV?d00001 diff --git a/src/images/table.png b/src/images/table.png new file mode 100644 index 0000000000000000000000000000000000000000..ea1c21b78016448cfb51d104f06d1be00e66400c GIT binary patch literal 313 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL8%hgh?3y^w370~qEv=}#LT=BJwMkFg)(D3 zQ$0figD*u3fvQ$`x;Tbd_#X|9<~pn(@MX^0?}jcJ=T|N`82&N;bWUWafJUyJlFk{c za~6S%ul)5~&Xx3BM)&lgrCZgK&s=$LdGNxAV@V2&l$&kKGcH6e7GOFmVcGZ~_x3V5 znP&%_jfE=S*Z*V5Xmfl&x9D7m*F#y>>ru-gQal2gvEh0;LOE;a{<391Yp~-V&pQ8t zzq&Qv6M`OHS6?skBUE|i?Z=<>|HS4L6zyR=%QpGdCExvNKsPgZy85}Sb4q9e07bTT AegFUf literal 0 HcmV?d00001 diff --git a/src/images/v.png b/src/images/v.png new file mode 100644 index 0000000000000000000000000000000000000000..5503eb75c924e3b9a215b92e8055f29067a125e7 GIT binary patch literal 951 zcmaJ=O^ee&7>>A9U0B59${vO+g3H=`Zc>vru5HuWf+?k2*d9%jX&bu9#L3j81yKYA zZ+h~u`x^won+I5^6tjD^8e9lfW zT;hk6%`m0?B($9|B%lw6USP1lzIN>Nrqq*$<15iqI zD&Rw6gTy}yB0VwKxvoy_^q6PC974thdl6L6YJ)1m5Gb6ScLY%cs>+FbimHnDfFy_# zFVI)bi+j4F>QVtL9+rB;?m+LD^@T6GGuRO!q0aMh9CNYEAw1+oP18~hNy<}1KAHx^ zPVzytohg_waO5 z_mV5G*iB4Cu6DI@Y<@Z$8m0vD-Au-Q;KgM1ntFdxKOkJ7cIBur4 z!d?_Zi2Z5pR_Tkh3+P9VAt>8{eb5=t`G#x7H!p+ zEsunvo7;$47&A1-&6l&-^|mktZM+#oCH}{ocRUFE62GC><$7%6Zm_hQ;Pu^=rnkH0 zA)hbb1oN522trI-8hzC>d#!>^PWGC@hJvy^vFw5P^Lb)OH##&7RRup&JA>K}iBU*Dx zJo_X1fp4j*0+E4K!z@-ITvRKnVwjbRUewv$f{ex-$6=9e*mhM>bR-)LtD&M@HBCd7 zbwjB#;xV=srPPf)Jk|}E?g$G{#9DTOT}qNBA=~2)SnCo>(k_XCZG*XuAo58sy`EQR z7_5Vn;2!p?2?@ajOWCNYPk zyg&Zwm+=*A!hCzw{p@fwKR9ATld$RN|9t$GO%|#-3(f3v`}g5txiG!@O!->AP`J3f zZ~ZFobt>QPbFU8$=AIXBKi%K|xW{w+lha=wzMnibG0nZada3f_{KU0&!L};dTZM+)@M@%E zZ=U*O_jJ2uo*tQHD|@4w(T5r}=#kJ6hP|#6Xv0c&FXND>}Zva8X6!d_!X zsJT873b}%4$~Z5qlykU%^CkR(pvYL2WL3hdh!ssPYq%hcU)gGgM!IhuYR&q_csTm2 zlI?_{r%BRaFvtzmoa?tGTrQU-S&EKrWa3jNf$7^`XuFOO`5Fgq zKdfZ4(LmGJcwRkkI*=2L*-?tp(C{Rjlcgm|jmG(Dz23siAZ(IkW(x-lS|=Wnnj~=h zzDcP3+M-Jc!u4Z1r7@xl7_A=@CtPS{nNuIH?{`O_EmI<0(xWK>rGOXC#p}4C8+6#DU&bscJ{iue<)>dS#D!5!MtHsjF2FB~^nyM5_Yios-0&QEB%M)9W zI&VvS`0w5ysxB>R23gVBAC)$xWQ^*8 z9yN1qY5iWb@w@$zenpY#OTy9TI2CrMQ}@qLh281YB=e?YhgD@fTB;djMSoB+j9q$D zMyka^K`rP~x;dS(V-HDpuWr+`G>CRcew>nSUzoR_r3({c592XN26mVRS1~cZkn24Z&qrCV9}3IP~et0ey_}lNU30=p&edx!G(WbovZJZ@z=jKmXG2 zUlHod2;IMpkoF-$SKYJMzTTi(b*sMG8vfXNe>H>TOZSw!zYYHS;_uJCdG&h!t>(?M ucb`T-i_Vw#{5!uqtNi)Z + ${nls.showLegend} +
+
diff --git a/src/setting/Setting.js b/src/setting/Setting.js new file mode 100644 index 0000000..61a978f --- /dev/null +++ b/src/setting/Setting.js @@ -0,0 +1,51 @@ +/////////////////////////////////////////////////////////////////////////// +// Copyright © 2014 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/declare', + 'jimu/BaseWidgetSetting', + 'dijit/_WidgetsInTemplateMixin', + 'dijit/form/CheckBox' + ], + function( + declare, + BaseWidgetSetting, + _WidgetsInTemplateMixin) { + return declare([BaseWidgetSetting, _WidgetsInTemplateMixin], { + + baseClass: 'jimu-widget-layerList-setting', + + startup: function() { + this.inherited(arguments); + this.setConfig(this.config); + }, + + setConfig: function(config) { + this.showLegend.setChecked(config.showLegend); + }, + + getConfig: function () { + var config = { + showLegend: "true", + metadataTool: null + }; + config.showLegend = this.showLegend.checked; + config.metadataTool = this.config.metadataTool ? this.config.metadataTool : null; + return config; + } + + }); + }); diff --git a/src/setting/css/style.css b/src/setting/css/style.css new file mode 100644 index 0000000..0091716 --- /dev/null +++ b/src/setting/css/style.css @@ -0,0 +1,3 @@ +.jimu-widget-layerList-setting .show-legend-checkbox { + margin-left: 24px; +} diff --git a/src/setting/nls/ar/strings.js b/src/setting/nls/ar/strings.js new file mode 100644 index 0000000..cf57d61 --- /dev/null +++ b/src/setting/nls/ar/strings.js @@ -0,0 +1,5 @@ +define( + ({ + showLegend: "إظهار وسيلة الإيضاح" + }) +); \ No newline at end of file diff --git a/src/setting/nls/cs/strings.js b/src/setting/nls/cs/strings.js new file mode 100644 index 0000000..18d315a --- /dev/null +++ b/src/setting/nls/cs/strings.js @@ -0,0 +1,5 @@ +define( + ({ + showLegend: "Zobrazit legendu" + }) +); \ No newline at end of file diff --git a/src/setting/nls/da/strings.js b/src/setting/nls/da/strings.js new file mode 100644 index 0000000..75641f8 --- /dev/null +++ b/src/setting/nls/da/strings.js @@ -0,0 +1,5 @@ +define( + ({ + showLegend: "Vis signaturforklaring" + }) +); \ No newline at end of file diff --git a/src/setting/nls/de/strings.js b/src/setting/nls/de/strings.js new file mode 100644 index 0000000..c4d4eea --- /dev/null +++ b/src/setting/nls/de/strings.js @@ -0,0 +1,5 @@ +define( + ({ + showLegend: "Legende anzeigen" + }) +); \ No newline at end of file diff --git a/src/setting/nls/el/strings.js b/src/setting/nls/el/strings.js new file mode 100644 index 0000000..fcd99f9 --- /dev/null +++ b/src/setting/nls/el/strings.js @@ -0,0 +1,5 @@ +define( + ({ + showLegend: "Εμφάνιση υπομνήματος" + }) +); \ No newline at end of file diff --git a/src/setting/nls/es/strings.js b/src/setting/nls/es/strings.js new file mode 100644 index 0000000..70c8fad --- /dev/null +++ b/src/setting/nls/es/strings.js @@ -0,0 +1,5 @@ +define( + ({ + showLegend: "Mostrar leyenda" + }) +); \ No newline at end of file diff --git a/src/setting/nls/et/strings.js b/src/setting/nls/et/strings.js new file mode 100644 index 0000000..1077470 --- /dev/null +++ b/src/setting/nls/et/strings.js @@ -0,0 +1,5 @@ +define( + ({ + showLegend: "Näita legendi" + }) +); \ No newline at end of file diff --git a/src/setting/nls/fi/strings.js b/src/setting/nls/fi/strings.js new file mode 100644 index 0000000..2537dfd --- /dev/null +++ b/src/setting/nls/fi/strings.js @@ -0,0 +1,5 @@ +define( + ({ + showLegend: "Näytä selite" + }) +); \ No newline at end of file diff --git a/src/setting/nls/fr/strings.js b/src/setting/nls/fr/strings.js new file mode 100644 index 0000000..e627b3a --- /dev/null +++ b/src/setting/nls/fr/strings.js @@ -0,0 +1,5 @@ +define( + ({ + showLegend: "Afficher la légende" + }) +); \ No newline at end of file diff --git a/src/setting/nls/he/strings.js b/src/setting/nls/he/strings.js new file mode 100644 index 0000000..7ccc9a5 --- /dev/null +++ b/src/setting/nls/he/strings.js @@ -0,0 +1,5 @@ +define( + ({ + showLegend: "הצג מקרא" + }) +); \ No newline at end of file diff --git a/src/setting/nls/it/strings.js b/src/setting/nls/it/strings.js new file mode 100644 index 0000000..62ed5c9 --- /dev/null +++ b/src/setting/nls/it/strings.js @@ -0,0 +1,5 @@ +define( + ({ + showLegend: "Mostra legenda" + }) +); \ No newline at end of file diff --git a/src/setting/nls/ja/strings.js b/src/setting/nls/ja/strings.js new file mode 100644 index 0000000..55d003a --- /dev/null +++ b/src/setting/nls/ja/strings.js @@ -0,0 +1,5 @@ +define( + ({ + showLegend: "凡例を表示" + }) +); \ No newline at end of file diff --git a/src/setting/nls/ko/strings.js b/src/setting/nls/ko/strings.js new file mode 100644 index 0000000..44cb577 --- /dev/null +++ b/src/setting/nls/ko/strings.js @@ -0,0 +1,5 @@ +define( + ({ + showLegend: "범례 표시" + }) +); \ No newline at end of file diff --git a/src/setting/nls/lt/strings.js b/src/setting/nls/lt/strings.js new file mode 100644 index 0000000..e622a59 --- /dev/null +++ b/src/setting/nls/lt/strings.js @@ -0,0 +1,5 @@ +define( + ({ + showLegend: "Rodyti legendą" + }) +); \ No newline at end of file diff --git a/src/setting/nls/lv/strings.js b/src/setting/nls/lv/strings.js new file mode 100644 index 0000000..89653e2 --- /dev/null +++ b/src/setting/nls/lv/strings.js @@ -0,0 +1,5 @@ +define( + ({ + showLegend: "Rādīt leģendu" + }) +); \ No newline at end of file diff --git a/src/setting/nls/nb/strings.js b/src/setting/nls/nb/strings.js new file mode 100644 index 0000000..84ac5d3 --- /dev/null +++ b/src/setting/nls/nb/strings.js @@ -0,0 +1,5 @@ +define( + ({ + showLegend: "Vis tegnforklaring" + }) +); \ No newline at end of file diff --git a/src/setting/nls/nl/strings.js b/src/setting/nls/nl/strings.js new file mode 100644 index 0000000..1bbb7bb --- /dev/null +++ b/src/setting/nls/nl/strings.js @@ -0,0 +1,5 @@ +define( + ({ + showLegend: "Legenda weergeven" + }) +); \ No newline at end of file diff --git a/src/setting/nls/pl/strings.js b/src/setting/nls/pl/strings.js new file mode 100644 index 0000000..da44175 --- /dev/null +++ b/src/setting/nls/pl/strings.js @@ -0,0 +1,5 @@ +define( + ({ + showLegend: "Pokaż legendę" + }) +); \ No newline at end of file diff --git a/src/setting/nls/pt-br/strings.js b/src/setting/nls/pt-br/strings.js new file mode 100644 index 0000000..ded61f0 --- /dev/null +++ b/src/setting/nls/pt-br/strings.js @@ -0,0 +1,5 @@ +define( + ({ + showLegend: "Mostrar legenda" + }) +); \ No newline at end of file diff --git a/src/setting/nls/pt-pt/strings.js b/src/setting/nls/pt-pt/strings.js new file mode 100644 index 0000000..58a1f6c --- /dev/null +++ b/src/setting/nls/pt-pt/strings.js @@ -0,0 +1,5 @@ +define( + ({ + showLegend: "Exibir legenda" + }) +); \ No newline at end of file diff --git a/src/setting/nls/ro/strings.js b/src/setting/nls/ro/strings.js new file mode 100644 index 0000000..d8d90b1 --- /dev/null +++ b/src/setting/nls/ro/strings.js @@ -0,0 +1,5 @@ +define( + ({ + showLegend: "Afişare legendă" + }) +); \ No newline at end of file diff --git a/src/setting/nls/ru/strings.js b/src/setting/nls/ru/strings.js new file mode 100644 index 0000000..fe7c453 --- /dev/null +++ b/src/setting/nls/ru/strings.js @@ -0,0 +1,5 @@ +define( + ({ + showLegend: "Показать легенду" + }) +); \ No newline at end of file diff --git a/src/setting/nls/strings.js b/src/setting/nls/strings.js new file mode 100644 index 0000000..8f77e7c --- /dev/null +++ b/src/setting/nls/strings.js @@ -0,0 +1,32 @@ +define({ + root: ({ + showLegend: "Show Legend" + }), + "ar": 1, + "cs": 1, + "da": 1, + "de": 1, + "el": 1, + "es": 1, + "et": 1, + "fi": 1, + "fr": 1, + "he": 1, + "it": 1, + "ja": 1, + "ko": 1, + "lt": 1, + "lv": 1, + "nb": 1, + "nl": 1, + "pl": 1, + "pt-br": 1, + "pt-pt": 1, + "ro": 1, + "ru": 1, + "sv": 1, + "th": 1, + "tr": 1, + "vi": 1, + "zh-cn": 1 +}); \ No newline at end of file diff --git a/src/setting/nls/sv/strings.js b/src/setting/nls/sv/strings.js new file mode 100644 index 0000000..c946310 --- /dev/null +++ b/src/setting/nls/sv/strings.js @@ -0,0 +1,5 @@ +define( + ({ + showLegend: "Visa förklaring" + }) +); \ No newline at end of file diff --git a/src/setting/nls/th/strings.js b/src/setting/nls/th/strings.js new file mode 100644 index 0000000..ad4ab1d --- /dev/null +++ b/src/setting/nls/th/strings.js @@ -0,0 +1,5 @@ +define( + ({ + showLegend: "แสดงคำอธิบายสัญลักษณ์" + }) +); \ No newline at end of file diff --git a/src/setting/nls/tr/strings.js b/src/setting/nls/tr/strings.js new file mode 100644 index 0000000..bcf18c2 --- /dev/null +++ b/src/setting/nls/tr/strings.js @@ -0,0 +1,5 @@ +define( + ({ + showLegend: "Gösterimi Göster" + }) +); \ No newline at end of file diff --git a/src/setting/nls/vi/strings.js b/src/setting/nls/vi/strings.js new file mode 100644 index 0000000..ef741a2 --- /dev/null +++ b/src/setting/nls/vi/strings.js @@ -0,0 +1,5 @@ +define( + ({ + showLegend: "Hiển thị Chú giải" + }) +); \ No newline at end of file diff --git a/src/setting/nls/zh-cn/strings.js b/src/setting/nls/zh-cn/strings.js new file mode 100644 index 0000000..4ea2dc5 --- /dev/null +++ b/src/setting/nls/zh-cn/strings.js @@ -0,0 +1,5 @@ +define( + ({ + showLegend: "显示图例" + }) +); \ No newline at end of file From 94588c4d97d47d0f7bcf4d38441e31a87718c51f Mon Sep 17 00:00:00 2001 From: Arun Date: Tue, 28 Jul 2015 12:49:02 +1200 Subject: [PATCH 2/9] Out of scale layers titles to be greyed out instead of the whole node and other associated tools --- src/LayerListView.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/LayerListView.js b/src/LayerListView.js index f9546f9..2a724c7 100644 --- a/src/LayerListView.js +++ b/src/LayerListView.js @@ -530,13 +530,13 @@ define([ array.forEach(this.scaleConfig, function (layerItem) { if (layerItem.layerInfo.layerObject && (layerItem.layerInfo.layerObject.maxScale || layerItem.layerInfo.layerObject.minScale)) { var layerObject = layerItem.layerInfo.layerObject; - var layerNode = layerItem.layerNode; + var layerTextNode = layerItem.layerNode.childNodes[1]; var outScale = (layerObject.maxScale != 0 && scale layerObject.minScale); if (outScale) { - domClass.add(layerNode, 'LayerOutOfScale'); + if (layerTextNode) domClass.add(layerTextNode, 'LayerOutOfScale'); } else { - domClass.remove(layerNode, 'LayerOutOfScale'); + if (layerTextNode) domClass.remove(layerTextNode, 'LayerOutOfScale'); } } From f94f06eff2e137357acf64f2a5b7f6659f7ef6ca Mon Sep 17 00:00:00 2001 From: Arun Date: Fri, 31 Jul 2015 17:20:54 +1200 Subject: [PATCH 3/9] bug fix - FDBK033 --- src/LayerListView.js | 66 ++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 64 insertions(+), 2 deletions(-) diff --git a/src/LayerListView.js b/src/LayerListView.js index 2a724c7..fda23df 100644 --- a/src/LayerListView.js +++ b/src/LayerListView.js @@ -526,8 +526,71 @@ define([ } }, _adjustToState: function () { + // summary: + // enhance the layer name with a font refelcting out-of-scale or in-scale + // description: + // when ever a scale change happens,this method is called to update the layer title with a + // font effect giving an intuition to the user whether the layer is out-of-scale or in-scale of the map + var scale = this.map.getScale(); - array.forEach(this.scaleConfig, function (layerItem) { + + //1/filter the layers with newSubLayers.length = 0,so this will ensure that these are the actual layers + var actualLeafLayers = array.filter(this.scaleConfig, lang.hitch(this,function (item) { + return item.layerInfo.newSubLayers && item.layerInfo.newSubLayers.length == 0; + })); + + + array.forEach(actualLeafLayers, lang.hitch(this,function (leafItem) { + var minScale = 0; + var maxScale = 0; + if (leafItem.layerInfo.originOperLayer.layerType === "ArcGISFeatureLayer") { + var actualFeatureLayer = this.map.getLayer(leafItem.layerInfo.id); + var jsonInfo = null; + if (actualFeatureLayer._json) { + jsonInfo = JSON.parse(actualFeatureLayer._json); + } + + if (actualFeatureLayer.maxScale) { + maxScale = actualFeatureLayer.maxScale; + } else if (jsonInfo && jsonInfo.maxScale) { + maxScale = jsonInfo.maxScale; + } + + if (actualFeatureLayer.minScale) { + minScale = actualFeatureLayer.minScale; + } else if (jsonInfo && jsonInfo.minScale) { + minScale = jsonInfo.minScale; + } + + } else if (leafItem.layerInfo.originOperLayer.mapService) { + var mapService = leafItem.layerInfo.originOperLayer.mapService; + var layerId = mapService.subId; + var subLayerInfoArray = mapService.layerInfo.layerObject.layerInfos; + var subLayerInfo = array.filter(subLayerInfoArray, function (info) { + return Number(info.id) == Number(layerId) ; + })[0]; + maxScale = subLayerInfo.maxScale; + minScale = subLayerInfo.minScale; + + } + var layerTextNode = leafItem.layerNode.childNodes[1]; + var outScale = (maxScale != 0 && scale < maxScale) || (minScale != 0 && scale > minScale); + if (outScale) { + if (layerTextNode) domClass.add(layerTextNode, 'LayerOutOfScale'); + + } else { + if (layerTextNode) domClass.remove(layerTextNode, 'LayerOutOfScale'); + + } + + + })); + + //2/filter the layers with newSubLayers.length > 0,so this will ensure that these are the parent layers + var parentLayers = array.filter(this.scaleConfig, lang.hitch(this,function (item) { + return item.layerInfo.newSubLayers && item.layerInfo.newSubLayers.length > 0; + })); + array.forEach(parentLayers, function (layerItem) { if (layerItem.layerInfo.layerObject && (layerItem.layerInfo.layerObject.maxScale || layerItem.layerInfo.layerObject.minScale)) { var layerObject = layerItem.layerInfo.layerObject; var layerTextNode = layerItem.layerNode.childNodes[1]; @@ -540,7 +603,6 @@ define([ } } - }); } From c7b677db1d819acfc8fd43926f8f487325348365 Mon Sep 17 00:00:00 2001 From: Arun Date: Tue, 4 Aug 2015 10:50:32 +1200 Subject: [PATCH 4/9] Bug fix https://github.com/WaimakaririGeospatial/LayerListWidget/issues/5 --- src/config.json | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/config.json b/src/config.json index 8683bbb..702dbaf 100644 --- a/src/config.json +++ b/src/config.json @@ -6,18 +6,22 @@ { "label": "", "path": "dataIdInfo->idAbs" + }, + { + "label":"Details", + "path":"dataIdInfo->idPurp" }, { "label":"Credit", "path":"dataIdInfo->idCredit" }, { - "label":"Use Limitations", + "label":"Use Limitation", "path":"dataIdInfo->resConst->Consts->useLimit" }, { - "label":"Date Last Updated", - "path":"dataIdInfo->resConst->Consts->useLimit" + "label":"Last Updated", + "path":"dataIdInfo->idCitation->date->reviseDate" } ] From e2c6f194fcff9636fce805e18789ea877641d5f8 Mon Sep 17 00:00:00 2001 From: Arun Date: Thu, 6 Aug 2015 16:59:44 +1200 Subject: [PATCH 5/9] Updated metadata to include copyRight and description values from map service rest api --- src/Metadata.js | 39 ++++++++++++++++++++++++++++++--------- src/config.json | 16 ++++++++-------- 2 files changed, 38 insertions(+), 17 deletions(-) diff --git a/src/Metadata.js b/src/Metadata.js index 91041f7..6d8e42e 100644 --- a/src/Metadata.js +++ b/src/Metadata.js @@ -3,6 +3,7 @@ "dojo/_base/declare", "dojo/_base/array", "dojo/_base/lang", + "dojo/promise/all", "dojo/dom", "dojo/dom-construct", "dojo/dom-style", @@ -21,6 +22,7 @@ declare, array, lang, + all, dom, domConstruct, domStyle, @@ -80,20 +82,33 @@ var itemUrl = url.replace("/FeatureServer/", "/MapServer/"); var layerId = itemUrl.substr(itemUrl.lastIndexOf('/') + 1); var serviceUrl = itemUrl.replace(itemUrl.substr(itemUrl.lastIndexOf('/')), ''); - var url = serviceUrl + this.config.path; url = url.replace(/\{([a-zA-Z]+)\}/g, function (match) { return layerId; }); - - esriRequest({ - url: url, - callbackParamName: "callback", - handleAs: "json", - }).then(lang.hitch(this,function (response) { - this.parseMetadata(response.metadata); + var requests = { + soe: esriRequest({ + url: url, + callbackParamName: "callback", + handleAs: "json" + }), + mxd: esriRequest({ + url: itemUrl, + callbackParamName: "callback", + handleAs: "json", + content: { + f:"json" + } + }) + } + all(requests).then(lang.hitch(this, function (response) { + if (response.soe && response.soe.metadata) { + lang.mixin(response.soe, response.soe.metadata); + } + this.parseMetadata(response); }),lang.hitch(this, function (error) { + console.log(error); var popup = new Message({ message: this.nls.metadataWarning, buttons: [{ @@ -114,7 +129,7 @@ }); array.forEach(componentConfig, lang.hitch(this, function (config, index) { var label = config.label; - var info = this.findDataInPath(config.path, metadata); + var info = this.findDataInPath(config.path, metadata[config.source]); if(info != null){ if (label.length > 0) { var labelNode = domConstruct.create("div", { @@ -159,11 +174,17 @@ data = metadata; } }); + if (new RegExp("reviseDate").test(path) && data) { + data = this.formatDate(data); + } return data ? this.stripHtml(data) : data; }, stripHtml: function (str) { var regex = /(<([^>]+)>)/ig; return str.replace(regex, ""); + }, + formatDate: function (date) { + return date.replace(/[A-Z]+.*/g, "").split("-").reverse().join("-"); } }); return Metadata; diff --git a/src/config.json b/src/config.json index 702dbaf..8b59ee5 100644 --- a/src/config.json +++ b/src/config.json @@ -5,23 +5,23 @@ "metadataParseConfig": [ { "label": "", - "path": "dataIdInfo->idAbs" - }, - { - "label":"Details", - "path":"dataIdInfo->idPurp" + "path": "description", + "source":"mxd" }, { "label":"Credit", - "path":"dataIdInfo->idCredit" + "path":"copyrightText", + "source":"mxd" }, { "label":"Use Limitation", - "path":"dataIdInfo->resConst->Consts->useLimit" + "path":"dataIdInfo->resConst->Consts->useLimit", + "source":"soe" }, { "label":"Last Updated", - "path":"dataIdInfo->idCitation->date->reviseDate" + "path":"dataIdInfo->idCitation->date->reviseDate", + "source":"soe" } ] From 0155881f100c0f174e80572650c154e80499ee11 Mon Sep 17 00:00:00 2001 From: Arun Date: Tue, 18 Aug 2015 10:21:12 +1200 Subject: [PATCH 6/9] Interim check in to test the webmapswitcher - layerlist widget update workflow --- src/LayerListView.js | 9 +-------- src/Widget.js | 17 ++++++++++++++++- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/src/LayerListView.js b/src/LayerListView.js index fda23df..5456d0f 100644 --- a/src/LayerListView.js +++ b/src/LayerListView.js @@ -63,13 +63,7 @@ define([ this.drawListNode(layerInfo, 0, this.tableListTable, true); }, this); - //this will grey out layer nodes when zoomed out of scale - if (!this._zoomHandler) { - var map = this.map; - this._zoomHandler = this.own(on(map, 'zoom-end', lang.hitch(this, - this._adjustToState))); - } - this._adjustToState(); + }, drawListNode: function(layerInfo, level, toTableNode) { @@ -531,7 +525,6 @@ define([ // description: // when ever a scale change happens,this method is called to update the layer title with a // font effect giving an intuition to the user whether the layer is out-of-scale or in-scale of the map - var scale = this.map.getScale(); //1/filter the layers with newSubLayers.length = 0,so this will ensure that these are the actual layers diff --git a/src/Widget.js b/src/Widget.js index e0be995..3d87040 100644 --- a/src/Widget.js +++ b/src/Widget.js @@ -19,6 +19,7 @@ define([ 'dojo/_base/declare', 'dojo/_base/lang', 'dojo/_base/array', + "dojo/topic", 'dojo/dom-construct', 'dojo/dom-geometry', 'dojo/dom', @@ -35,7 +36,7 @@ define([ 'jimu/LayerInfos/LayerInfos', 'dojo/promise/all' ], - function(BaseWidget, declare, lang, array, domConstruct, domGeometry, dom, on, baseUnload, + function(BaseWidget, declare, lang, array,topic, domConstruct, domGeometry, dom, on, baseUnload, aspect, query, Selectionbox, LayerListView, PopupMenu, domStyle, NlsStrings, LayerInfoFactory, LayerInfos, all) { var clazz = declare([BaseWidget], { @@ -103,6 +104,20 @@ define([ dom.setSelectable(this.layersSection, false); })); } + + topic.subscribe("webmapSwitchEvent", lang.hitch(this, function () { + if(this.layerListView) this.layerListView._adjustToState(); + })); + //this will grey out layer nodes when zoomed out of scale + if (!this._zoomHandler) { + var map = this.map; + this._zoomHandler = this.own( + on(map, 'zoom-end', lang.hitch(this,function(){ + if(this.layerListView) this.layerListView._adjustToState(); + })) + ); + } + if (this.layerListView) this.layerListView._adjustToState(); }, destroy: function() { From ba05ff74ba6e77daf78ef968710d59406a73dbb4 Mon Sep 17 00:00:00 2001 From: Arun Date: Wed, 19 Aug 2015 15:15:31 +1200 Subject: [PATCH 7/9] Metadata to show no data warning,Webmapswitcher-Layerlist widget workflow fix --- src/LayerListView.js | 1 - src/Metadata.js | 41 ++++++++++++++++++++------------ src/Widget.js | 56 +++++++++++++++++++------------------------- 3 files changed, 50 insertions(+), 48 deletions(-) diff --git a/src/LayerListView.js b/src/LayerListView.js index 5456d0f..8e8eb45 100644 --- a/src/LayerListView.js +++ b/src/LayerListView.js @@ -420,7 +420,6 @@ define([ popupMenu.closeDropMenu(); } */ - console.log("aaa"); }, _onLayerListWidgetPaneClick: function(popupMenu) { diff --git a/src/Metadata.js b/src/Metadata.js index 6d8e42e..d48f6ec 100644 --- a/src/Metadata.js +++ b/src/Metadata.js @@ -109,15 +109,7 @@ this.parseMetadata(response); }),lang.hitch(this, function (error) { console.log(error); - var popup = new Message({ - message: this.nls.metadataWarning, - buttons: [{ - label: this.nls.ok, - onClick: lang.hitch(this, function () { - popup.close(); - }) - }] - }); + this._showNoDataWarning(); })); }, parseMetadata: function (metadata) { @@ -127,9 +119,11 @@ var messageContent = domConstruct.create("div", { style: "position:relative;margin:0 auto;width:100%;" }); + var noData = true; array.forEach(componentConfig, lang.hitch(this, function (config, index) { var label = config.label; - var info = this.findDataInPath(config.path, metadata[config.source]); + var info = this.findDataInPath(config.path, metadata[config.source]); + if(info != null){ if (label.length > 0) { var labelNode = domConstruct.create("div", { @@ -147,13 +141,30 @@ } domConstruct.place(infoNode, messageContent); + noData = false; } })); - var popup = new Popup({ - content: messageContent, - titleLabel: this._popupTitle, - autoHeight: true, - maxWidth:400, + if (noData) { + this._showNoDataWarning(); + } else { + var popup = new Popup({ + content: messageContent, + titleLabel: this._popupTitle, + autoHeight: true, + maxWidth: 400, + buttons: [{ + label: this.nls.ok, + onClick: lang.hitch(this, function () { + popup.close(); + }) + }] + }); + } + + }, + _showNoDataWarning:function(){ + var popup = new Message({ + message: this.nls.metadataWarning, buttons: [{ label: this.nls.ok, onClick: lang.hitch(this, function () { diff --git a/src/Widget.js b/src/Widget.js index 3d87040..41020b4 100644 --- a/src/Widget.js +++ b/src/Widget.js @@ -44,7 +44,6 @@ define([ //these two properties is defined in the BaseWiget baseClass: 'jimu-widget-layerList', name: 'layerList', - //layerListView: Object{} // A module is responsible for show layers list layerListView: null, @@ -81,45 +80,38 @@ define([ // })); if (this.map.itemId) { - LayerInfos.getInstance(this.map, this.map.itemInfo) - .then(lang.hitch(this, function(operLayerInfos) { + LayerInfos.getInstance(this.map, this.map.itemInfo).then(lang.hitch(this, function(operLayerInfos) { this.operLayerInfos = operLayerInfos; this.showLayers(); //this.bindEvents(); - this.own(on(this.operLayerInfos, - 'layerInfosChanged', - lang.hitch(this, this._onLayerInfosChanged))); + this.own(on(this.operLayerInfos, 'layerInfosChanged', lang.hitch(this, this._onLayerInfosChanged))); dom.setSelectable(this.layersSection, false); + if (this.layerListView) this.layerListView._adjustToState(); })); } else { var itemInfo = this._obtainMapLayers(); - LayerInfos.getInstance(this.map, itemInfo) - .then(lang.hitch(this, function(operLayerInfos) { - this.operLayerInfos = operLayerInfos; - this.showLayers(); - //this.bindEvents(); - this.own(on(this.operLayerInfos, - 'layerInfosChanged', - lang.hitch(this, this._onLayerInfosChanged))); - dom.setSelectable(this.layersSection, false); + LayerInfos.getInstance(this.map, itemInfo).then(lang.hitch(this, function(operLayerInfos) { + this.operLayerInfos = operLayerInfos; + this.showLayers(); + //this.bindEvents(); + this.own(on(this.operLayerInfos, 'layerInfosChanged', lang.hitch(this, this._onLayerInfosChanged))); + dom.setSelectable(this.layersSection, false); + if (this.layerListView) this.layerListView._adjustToState(); })); } - - topic.subscribe("webmapSwitchEvent", lang.hitch(this, function () { - if(this.layerListView) this.layerListView._adjustToState(); - })); + this._registerMapZoom(); + }, + _registerMapZoom:function(){ //this will grey out layer nodes when zoomed out of scale - if (!this._zoomHandler) { - var map = this.map; - this._zoomHandler = this.own( - on(map, 'zoom-end', lang.hitch(this,function(){ - if(this.layerListView) this.layerListView._adjustToState(); - })) - ); - } - if (this.layerListView) this.layerListView._adjustToState(); + if (!this._zoomHandler) { + var map = this.map; + this._zoomHandler = this.own( + on(map, 'zoom-end', lang.hitch(this, function () { + if (this.layerListView) this.layerListView._adjustToState(); + })) + ); + } }, - destroy: function() { this._clearLayers(); this.inherited(arguments); @@ -299,9 +291,9 @@ define([ } }, - _onLayerInfosChanged: function(layerInfo, changedType) { - this._clearLayers(); - this.showLayers(); + _onLayerInfosChanged: function (layerInfo, changedType) { + this._clearLayers(); + this.showLayers(); } //_onLayersScaleChange: function (event) { // console.log("mapScale"); From 3f6b9945042c53f31c400358bf132892b84f256f Mon Sep 17 00:00:00 2001 From: Arun Date: Thu, 20 Aug 2015 14:12:07 +1200 Subject: [PATCH 8/9] property check of a undefined object error fixed --- src/LayerListView.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/LayerListView.js b/src/LayerListView.js index 8e8eb45..355bfcd 100644 --- a/src/LayerListView.js +++ b/src/LayerListView.js @@ -537,6 +537,9 @@ define([ var maxScale = 0; if (leafItem.layerInfo.originOperLayer.layerType === "ArcGISFeatureLayer") { var actualFeatureLayer = this.map.getLayer(leafItem.layerInfo.id); + if (!actualFeatureLayer) { + return + } var jsonInfo = null; if (actualFeatureLayer._json) { jsonInfo = JSON.parse(actualFeatureLayer._json); From 9cc612619add29b13542bd9333cfddb6805a64ff Mon Sep 17 00:00:00 2001 From: Arun Date: Fri, 26 Feb 2016 13:34:06 +1300 Subject: [PATCH 9/9] First release of LayerListWidget compatible with Webapp Builder 1.3. --- src/LayerListView.js | 2 +- src/Widget.js | 42 ++++++++++++++++++++++++++++++++++++++---- src/manifest.json | 6 ++++-- 3 files changed, 43 insertions(+), 7 deletions(-) diff --git a/src/LayerListView.js b/src/LayerListView.js index 355bfcd..94d9804 100644 --- a/src/LayerListView.js +++ b/src/LayerListView.js @@ -55,7 +55,7 @@ define([ postCreate: function () { var config = this.config.metadataTool; this.metadata = new Metadata(config); - array.forEach(this.operLayerInfos.finalLayerInfos, function (layerInfo) { + array.forEach(this.operLayerInfos.getLayerInfoArray(), function (layerInfo) { this.drawListNode(layerInfo, 0, this.layerListTable, true); }, this); diff --git a/src/Widget.js b/src/Widget.js index 41020b4..4b3af70 100644 --- a/src/Widget.js +++ b/src/Widget.js @@ -19,6 +19,7 @@ define([ 'dojo/_base/declare', 'dojo/_base/lang', 'dojo/_base/array', + 'dojo/dom-attr', "dojo/topic", 'dojo/dom-construct', 'dojo/dom-geometry', @@ -27,7 +28,6 @@ define([ 'dojo/_base/unload', 'dojo/aspect', 'dojo/query', - 'jimu/dijit/Selectionbox', './LayerListView', './PopupMenu', 'dojo/dom-style', @@ -36,8 +36,8 @@ define([ 'jimu/LayerInfos/LayerInfos', 'dojo/promise/all' ], - function(BaseWidget, declare, lang, array,topic, domConstruct, domGeometry, dom, on, baseUnload, - aspect, query, Selectionbox, LayerListView, PopupMenu, domStyle, NlsStrings, LayerInfoFactory, + function(BaseWidget, declare, lang, array,domAttr,topic, domConstruct, domGeometry, dom, on, baseUnload, + aspect, query, LayerListView, PopupMenu, domStyle, NlsStrings, LayerInfoFactory, LayerInfos, all) { var clazz = declare([BaseWidget], { /*jshint unused: false*/ @@ -53,7 +53,8 @@ define([ operLayerInfos: null, startup: function() { - NlsStrings.value = this.nls; + NlsStrings.value = this.nls; + // summary: // this function will be called when widget is started. // description: @@ -100,6 +101,7 @@ define([ })); } this._registerMapZoom(); + this._setVersionTitle(); }, _registerMapZoom:function(){ //this will grey out layer nodes when zoomed out of scale @@ -294,6 +296,38 @@ define([ _onLayerInfosChanged: function (layerInfo, changedType) { this._clearLayers(); this.showLayers(); + }, + _setVersionTitle: function () { + var labelNode = this._getLabelNode(this); + var manifestInfo = this.manifest; + var devVersion = manifestInfo.version; + var devWabVersion = manifestInfo.developedAgainst || manifestInfo.wabVersion; + var codeSourcedFrom = manifestInfo.codeSourcedFrom; + var client = manifestInfo.client; + + var title = "Dev version: " + devVersion + "\n"; + title += "Developed/Modified against: WAB" + devWabVersion + "\n"; + title += "Client: " + client + "\n"; + if (codeSourcedFrom) { + title += "Code sourced from: " + codeSourcedFrom + "\n"; + } + + if (labelNode) { + domAttr.set(labelNode, 'title', title); + } + + }, + _getLabelNode: function (widget) { + var labelNode; + if (!(widget.labelNode) && !(widget.titleLabelNode)) { + if (widget.getParent()) { + labelNode = this._getLabelNode(widget.getParent()); + } + } else { + labelNode = widget.labelNode || widget.titleLabelNode; + } + return labelNode; + } //_onLayersScaleChange: function (event) { // console.log("mapScale"); diff --git a/src/manifest.json b/src/manifest.json index 2e493e8..6a3c56f 100644 --- a/src/manifest.json +++ b/src/manifest.json @@ -2,8 +2,10 @@ "name": "LayerListWidget", "2D": true, "platform": "HTML", - "version": "1.2", - "wabVersion": "1.2", + "version": "11795", + "client":"GISCO", + "developedAgainst":"1.3", + "wabVersion":"1.3", "author": "Esri R&D Center Beijing", "description": "", "copyright": "",