/* // Copyright © 2014 - 2018 Esri. All rights reserved. TRADE SECRETS: ESRI PROPRIETARY AND CONFIDENTIAL Unpublished material - all rights reserved under the Copyright Laws of the United States and applicable international laws, treaties, and conventions. For additional information, contact: Attn: Contracts and Legal Department Environmental Systems Research Institute, Inc. 380 New York Street Redlands, California, 92373 USA email: contracts@esri.com */ define([ 'dojo/_base/declare', 'dojo/topic', 'dijit/_WidgetBase', 'dijit/_TemplatedMixin', 'dijit/_WidgetsInTemplateMixin', 'dojo/text!./templates/ItemSelector.html', 'dojo/Evented', 'dojo/_base/lang', 'dojo/_base/config', 'dojo/_base/array', 'dojo/_base/html', 'dojo/_base/Deferred', 'dojo/promise/all', 'dojo/query', 'dojo/on', 'jimu/utils', 'jimu/portalUtils', 'jimu/tokenUtils', 'jimu/portalUrlUtils', 'jimu/dijit/ViewStack', 'jimu/dijit/Search', 'jimu/dijit/TabContainer3', 'jimu/dijit/_ItemTable' ], function(declare, topic, _WidgetBase, _TemplatedMixin, _WidgetsInTemplateMixin, template, Evented, lang, dojoConfig, array, html, Deferred, all, query, on, jimuUtils, portalUtils, tokenUtils, portalUrlUtils, ViewStack, Search, TabContainer3, _ItemTable) { /*jshint unused: false*/ /* jshint maxlen: 200 */ return declare([_WidgetBase, _TemplatedMixin, _WidgetsInTemplateMixin, Evented], { templateString: template, declaredClass: 'jimu.dijit.ItemSelector', baseClass: "jimu-item-selector", tab: null, _user: null, _group: null, //public portal _allPublicPortalQuery: null, _filterPublicPortalQuery: null, //public ArcGIS.com _allPublicOnlineQuery: null, _filterPublicOnlineQuery: null, //organization _allOrganizationQuery: null, _filterOrganizationQuery: null, //my content _allMyContentQuery: null, _filterMyContentQuery: null, //group _allGroupQuery: null, _filterGroupQuery: null, _isPublicTabShow: false, _signIn:false, _itemTypeQueryString: '', _typeKeywordQueryString: '', //options: portalUrl: null, itemTypes: '',//array, such as ['Web Map'], ['Feature Service','Map Service']... typeKeywords: '',//array, such as ['Web AppBuilder'] or ['Web AppBuilder','Web Map']... showOnlineItems: true, onlyShowOnlineFeaturedItems: false, //public methods: //getSelectedItem //events: //item-selected //none-item-selected //update //css classes: //signin-tip //search-none-icon //search-none-tip postMixInProperties: function(){ this.portalUrl = portalUrlUtils.getStandardPortalUrl(this.portalUrl); this.showOnlineItems = this.showOnlineItems === false ? false : true; //handle itemTypes if(!(this.itemTypes && this.itemTypes.length > 0)){ this.itemTypes = []; } this._itemTypes = ''; array.forEach(this.itemTypes, lang.hitch(this, function(type, index){ this._itemTypes += '"' + type + '"'; if(index !== this.itemTypes.length - 1){ this._itemTypes += ','; } })); this._itemTypes = '[' + this._itemTypes + ']'; //handle typeKeywords if(!(this.typeKeywords && this.typeKeywords.length > 0)){ this.typeKeywords = []; } this._typeKeywords = ''; array.forEach(this.typeKeywords, lang.hitch(this, function(keyword, index){ this._typeKeywords += '"' + keyword + '"'; if(index !== this.typeKeywords.length - 1){ this._typeKeywords += ','; } })); this._typeKeywords = '[' + this._typeKeywords + ']'; this.nls = window.jimuNls.itemSelector; }, postCreate: function() { this.inherited(arguments); var portalUrl = this._getPortalUrl(); this.portal = portalUtils.getPortal(portalUrl); this._initOptions(); this._initSearchQuery(); this._initTabs(); this._initPortalRadio(); this._initItemTables(); this._initPublic(); this._initPrivate(); this._updateUIbySignIn(); }, _initOptions: function(){ this._itemTypeQueryString = jimuUtils.getItemQueryStringByTypes(this.itemTypes); this._typeKeywordQueryString = jimuUtils.getItemQueryStringByTypeKeywords(this.typeKeywords); }, _initTabs: function(){ var tabMyContent = { title: this.nls.myContent, content: this.mycontentTabNode }; var tabOrganization = { title: this.nls.myOrganization, content: this.organizationTabNode }; var tabGroup = { title: this.nls.myGroup, content: this.groupTabNode }; var tabPublic = { title: this.nls.publicMap, content: this.publicTabNode }; var tabs = [tabMyContent, tabOrganization, tabGroup, tabPublic]; this.tab = new TabContainer3({ tabs: tabs }, this.tabNode); this.own(on(this.tab, "tabChanged", lang.hitch(this, function(title) { html.setStyle(this.signinSection, 'display', 'none'); if (title !== this.nls.publicMap) { this._isPublicTabShow = false; this._updateUIbySignIn(); } else { this._isPublicTabShow = true; } }))); }, _updateUIbySignIn: function(){ html.setStyle(this.signinSection, 'display', 'none'); var selector = '.organization-tab-content-main,' + '.group-tab-content-main,' + '.mycontent-tab-content-main'; var contentMains = query(selector, this.domNode); var signIn = tokenUtils.userHaveSignInPortal(this._getPortalUrl()); if (signIn) { contentMains.style('display', 'block'); } else { contentMains.style('display', 'none'); if(!this._isPublicTabShow){ html.setStyle(this.signinSection, 'display', 'block'); } } }, _initPortalRadio: function(){ jimuUtils.combineRadioCheckBoxWithLabel(this.portalPublicRaido, this.portalPublicLabel); jimuUtils.combineRadioCheckBoxWithLabel(this.onlinePublicRaido, this.onlinePublicLabel); var portalUrl = this._getPortalUrl(); var portalServer = portalUrlUtils.getServerByUrl(portalUrl); this.portalPublicRaido.disabled = false; this.onlinePublicRaido.disabled = false; this.portalPublicRaido.checked = true; var shouldHidePublicArcGIScom = false; if(portalUrlUtils.isArcGIScom(portalServer)){ shouldHidePublicArcGIScom = true; this.portalPublicLabel.innerHTML = 'ArcGIS.com'; } else{ this.portalPublicLabel.innerHTML = portalServer; if(this.showOnlineItems){ shouldHidePublicArcGIScom = false; } else{ shouldHidePublicArcGIScom = true; } } if(shouldHidePublicArcGIScom){ this.onlinePublicRaido.disabled = true; html.setStyle(this.onlinePublicRaido, 'display', 'none'); html.setStyle(this.onlinePublicLabel, 'display', 'none'); } }, _initSearchQuery: function(){ var culture = dojoConfig.locale && dojoConfig.locale.slice(0, 2) || 'en'; var currentLocaleOwner = 'esri_' + culture.toLowerCase(); var allLocaleOwners = ["esri_he", "esri_fr", "esri_ja", "esri_nl", "esri_th", "esri_tr", "esri_nb", "esri_ro", "esri_it", "esri_pl", "esri_po", "esri_ru", "esri_pt", "esri_en", "esri_ar", "esri_et", "esri_es", "esri_ko", "esri_cs", "esri_da", "esri_zh", "esri_sv", "esri_lt", "esri_fi", "esri_lv", "esri_de", "esri_vi"]; var removedOwners = array.filter(allLocaleOwners, lang.hitch(this, function(item){ return item !== currentLocaleOwner; })); var ownerStr = ''; array.forEach(removedOwners, lang.hitch(this, function(owner){ ownerStr += ' -owner:' + owner + ' '; })); var orgStr = " "; if(this.portal && this.portal.user && this.portal.user.orgId){ orgStr = " orgid:" + this.portal.user.orgId + " "; } var strPublicPortalQuery = orgStr + this._itemTypeQueryString + ' AND access:public ' + ownerStr + ' ' + this._typeKeywordQueryString; //portal public this._allPublicPortalQuery = this._getQuery({ sortField:'numViews', sortOrder:'desc', q: strPublicPortalQuery }); this._filterPublicPortalQuery = this._getQuery({ q: strPublicPortalQuery, basicQ: strPublicPortalQuery }); //ArcGIS.com public var groupIds = ' (group:"c755678be14e4a0984af36a15f5b643e" ' + ' OR group:"b8787a74b4d74f7fb9b8fac918735153") '; var strGroup = this.onlyShowOnlineFeaturedItems ? groupIds : ' '; this._allPublicOnlineQuery = this._getQuery({ sortField:'numViews', sortOrder:'desc', q: strGroup + this._itemTypeQueryString + ' AND access:public ' + this._typeKeywordQueryString }); this._filterPublicOnlineQuery = this._getQuery({ q:this._itemTypeQueryString + ' AND access:public ' + this._typeKeywordQueryString }); //organization this._allOrganizationQuery = this._getQuery(); this._filterOrganizationQuery = this._getQuery(); //my content this._allMyContentQuery = this._getQuery(); this._filterMyContentQuery = this._getQuery(); //group this._allGroupQuery = this._getQuery(); this._filterGroupQuery = this._getQuery(); }, _getQuery: function(other){ var other2 = other || {}; var query = lang.mixin({ start:1, num:16, f:'json' }, other2); return query; }, _getPortalUrl: function(){ return portalUrlUtils.getStandardPortalUrl(this.portalUrl); }, _initItemTables: function(){ //pass onCreateItemContent callback if(typeof this.onCreateItemContent === 'function'){ this.mycontentItemTable.onCreateItemContent = this.onCreateItemContent; this.organizationItemTable.onCreateItemContent = this.onCreateItemContent; this.groupItemTable.onCreateItemContent = this.onCreateItemContent; this.publicPortalItemTable.onCreateItemContent = this.onCreateItemContent; this.publicOnlineItemTable.onCreateItemContent = this.onCreateItemContent; } //bind events this.own( on(this.publicPortalItemTable, 'item-dom-clicked', lang.hitch(this, this._onItemDomClicked)) ); this.own( on(this.publicOnlineItemTable, 'item-dom-clicked', lang.hitch(this, this._onItemDomClicked)) ); this.own( on(this.organizationItemTable, 'item-dom-clicked', lang.hitch(this, this._onItemDomClicked)) ); this.own( on(this.groupItemTable, 'item-dom-clicked', lang.hitch(this, this._onItemDomClicked)) ); this.own( on(this.mycontentItemTable, 'item-dom-clicked', lang.hitch(this, this._onItemDomClicked)) ); this.own( on(this.publicPortalItemTable, 'update', lang.hitch(this, this._onItemTableUpdate)) ); this.own( on(this.publicOnlineItemTable, 'update', lang.hitch(this, this._onItemTableUpdate)) ); this.own( on(this.organizationItemTable, 'update', lang.hitch(this, this._onItemTableUpdate)) ); this.own( on(this.groupItemTable, 'update', lang.hitch(this, this._onItemTableUpdate)) ); this.own( on(this.mycontentItemTable, 'update', lang.hitch(this, this._onItemTableUpdate)) ); var portalUrl = this._getPortalUrl(); //portal public if(!this.portalPublicRaido.disabled){ this.publicPortalItemTable.set('portalUrl', portalUrl); this.publicPortalItemTable.searchAllItems(this._allPublicPortalQuery); this.publicPortalItemTable.set('filteredQuery', this._filterPublicPortalQuery); } //ArcGIS.com public if(!this.onlinePublicRaido.disabled){ this.publicOnlineItemTable.set('portalUrl', window.location.protocol + '//www.arcgis.com'); this.publicOnlineItemTable.searchAllItems(this._allPublicOnlineQuery); this.publicOnlineItemTable.set('filteredQuery', this._filterPublicOnlineQuery); } }, _initPublic: function(){ this.own(on(this.portalPublicRaido, 'click', lang.hitch(this, this._onPublicRaidoClicked))); this.own(on(this.onlinePublicRaido, 'click', lang.hitch(this, this._onPublicRaidoClicked))); this._onPublicRaidoClicked(); }, _onPublicRaidoClicked: function(){ if(this.portalPublicRaido.checked){ this.publicPortalItemTable.show(); this.publicOnlineItemTable.hide(); } else if(this.onlinePublicRaido.checked){ this.publicPortalItemTable.hide(); this.publicOnlineItemTable.show(); } }, _onPublicSearch: function(text){ text = text && lang.trim(text); if(text){ //show filtered section this.publicPortalItemTable.showFilterItemsSection(); this.publicOnlineItemTable.showFilterItemsSection(); if (this.portalPublicRaido.checked) { //text + this._itemTypeQueryString + ' AND access:public ' + this._typeKeywordQueryString this._filterPublicPortalQuery.q = text + ' ' + this._filterPublicPortalQuery.basicQ; this._filterPublicPortalQuery.start = 1; this.publicPortalItemTable.searchFilteredItems(this._filterPublicPortalQuery); } else if (this.onlinePublicRaido.checked) { this._filterPublicOnlineQuery.q = text + ' ' + this._itemTypeQueryString + ' AND access:public ' + this._typeKeywordQueryString; this._filterPublicOnlineQuery.start = 1; this.publicOnlineItemTable.searchFilteredItems(this._filterPublicOnlineQuery); } } else{ //show all section this.publicPortalItemTable.showAllItemsSection(); this.publicOnlineItemTable.showAllItemsSection(); } }, _initPrivate: function(){ this._resetPortalMaps(); this.own(on(this.groupsSelect, 'change', lang.hitch(this, this._onGroupsSelectChange))); var portalServer = portalUrlUtils.getServerByUrl(this._getPortalUrl()); if(portalUrlUtils.isArcGIScom(portalServer)){ portalServer = 'ArcGIS.com'; } var signIn = tokenUtils.userHaveSignInPortal(this._getPortalUrl()); if(signIn){ this._onSignIn(); } }, _onOrganizationSearch: function(text){ text = text && lang.trim(text); if(text){ //show filtered section if(this._allOrganizationQuery){ var q = this._allOrganizationQuery.q; if(q){ this._filterOrganizationQuery.q = text + ' ' + q; this._filterOrganizationQuery.start = 1; this.organizationItemTable.searchFilteredItems(this._filterOrganizationQuery); } } } else{ //show all section this.organizationItemTable.showAllItemsSection(); } }, _onMyContentSearch: function(text){ text = text && lang.trim(text); if(text){ //show filtered section if(this._allMyContentQuery){ var q = this._allMyContentQuery.q; if(q){ this._filterMyContentQuery.q = text + ' ' + q; this._filterMyContentQuery.start = 1; this.mycontentItemTable.searchFilteredItems(this._filterMyContentQuery); } } } else{ //show all section this.mycontentItemTable.showAllItemsSection(); } }, _onGroupSearch: function(text){ text = text && lang.trim(text); if(text){ //show filtered section if(this._allGroupQuery){ var q = this._allGroupQuery.q; if(q){ this._filterGroupQuery.q = text + ' ' + q; this._filterGroupQuery.start = 1; this.groupItemTable.searchFilteredItems(this._filterGroupQuery); } } } else{ this.groupItemTable.showAllItemsSection(); } }, _onSignIn: function(){ this._updateUIbySignIn(); if(this._signIn){ return; } this._signIn = true; var portalUrl = this._getPortalUrl(); var portal = portalUtils.getPortal(portalUrl); portal.getUser().then(lang.hitch(this, function(user){ if(!this.domNode){ return; } this._resetPortalMaps(); this._searchOrganization(user); this._searchMyContent(user); this._searchGroups(user); })); }, _onSignOut: function(){ this._signIn = false; this._resetPortalMaps(); this._updateUIbySignIn(); }, _resetPortalMaps: function(){ this.organizationItemTable.clear(); this.mycontentItemTable.clear(); this._resetGroupsSection(); }, _searchOrganization: function(user) { this.organizationItemTable.clear(); var strPublicOrg = " AND (access:org OR access:public) "; var q = " orgid:" + user.orgId + " AND " + this._itemTypeQueryString + strPublicOrg + this._typeKeywordQueryString; var portalUrl = this._getPortalUrl(); this._allOrganizationQuery = this._getQuery({q:q}); this._filterOrganizationQuery = this._getQuery({q:q}); this.organizationItemTable.set('portalUrl', portalUrl); this.organizationItemTable.searchAllItems(this._allOrganizationQuery); }, _searchMyContent: function(user) { this.mycontentItemTable.clear(); var portalUrl = this._getPortalUrl(); var q = "owner:" + user.username + " AND " + this._itemTypeQueryString + ' ' + this._typeKeywordQueryString; this._allMyContentQuery = this._getQuery({q:q}); this._filterMyContentQuery = this._getQuery({q:q}); this.mycontentItemTable.set('portalUrl', portalUrl); this.mycontentItemTable.searchAllItems(this._allMyContentQuery); }, _searchGroups: function(user){ this._resetGroupsSection(); html.setStyle(this.groupsSection, "display", "block"); var groups = user.getGroups(); if (groups.length > 0) { html.setStyle(this.groupSearch.domNode, 'display', 'block'); this.groupItemTable.show(); html.empty(this.groupsSelect); for (var i = 0; i < groups.length; i++) { var group = groups[i]; html.create("option", { value: group.id, innerHTML: group.title }, this.groupsSelect); } this._onGroupsSelectChange(); } this._updateUIbyGroups(groups.length); }, _resetGroupsSection: function(){ html.setStyle(this.groupsSection, "display", "none"); html.empty(this.groupsSelect); html.create("option", { value: 'nodata', innerHTML: this.nls.noneGroups }, this.groupsSelect); this.groupItemTable.clear(); html.setStyle(this.groupSearch.domNode, 'display', 'none'); this.groupItemTable.hide(); this._updateUIbyGroups(0); }, _updateUIbyGroups: function(groupIdsCount){ if(groupIdsCount === 0){ html.setStyle(this.groupsSection, 'top', '15px'); } else{ html.setStyle(this.groupsSection, 'top', '50px'); } }, _onGroupsSelectChange: function(){ var groupId = this.groupsSelect.value; this.groupItemTable.clear(); if (groupId === 'nodata') { html.setStyle(this.groupSearch, 'display', 'none'); this.groupItemTable.hide(); } else{ html.setStyle(this.groupSearch, 'display', 'block'); this.groupItemTable.show(); var portalUrl = this._getPortalUrl(); var q = "group:" + groupId + " AND " + this._itemTypeQueryString + ' ' + this._typeKeywordQueryString; this._allGroupQuery = this._getQuery({q:q}); this._filterGroupQuery = this._getQuery({q:q}); this.groupItemTable.set('portalUrl', portalUrl); this.groupItemTable.searchAllItems(this._allGroupQuery); } }, _onItemTableUpdate: function(){ this.emit("update"); }, _onItemDomClicked: function(itemDiv){ var isSelected = html.hasClass(itemDiv, 'jimu-state-active'); query('.item.jimu-state-active', this.domNode).removeClass('jimu-state-active'); if(isSelected){ html.addClass(itemDiv, 'jimu-state-active'); } var item = this.getSelectedItem(); if(item){ this.emit('item-selected', item); } else{ this.emit('none-item-selected'); } }, getSelectedItem: function(){ var item = null; var itemDivs = query('.item.jimu-state-active', this.domNode); if(itemDivs.length > 0){ var itemDiv = itemDivs[0]; item = lang.mixin({}, itemDiv.item); } return item; } }); });