/////////////////////////////////////////////////////////////////////////// // Copyright © 2014 - 2018 Esri. All Rights Reserved. // // Licensed under the Apache License Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /////////////////////////////////////////////////////////////////////////// define(['dojo/_base/declare', 'dijit/_WidgetBase', 'dijit/_TemplatedMixin', 'dijit/_WidgetsInTemplateMixin', 'dojo/_base/lang', 'esri/lang', "dojo/_base/array", "dojo/dom-style", 'dojo/on', "dojo/dom", "dojo/query", "dojo/topic", 'dojo/text!./templates/ShareOptions.html', 'jimu/shareUtils', "dijit/form/Textarea", "dijit/form/CheckBox", "dijit/layout/BorderContainer" ], function(declare, _WidgetBase, _TemplatedMixin, _WidgetsInTemplateMixin, lang, esriLang, array, domStyle, on, dom, query, topic, template, shareUtils) { /*global dijit*/ var so = declare([_WidgetBase, _TemplatedMixin, _WidgetsInTemplateMixin], { templateString: template, declaredClass: "jimu.dijit.ShareOptions", postMixInProperties: function() { this.inherited(arguments); this.nls = window.jimuNls.shareOptions; //TODO this._checkboxImgUrl this.i18n.openData; }, constructor: function(portalUrl) { this.portalUrl = portalUrl; }, startup: function() { shareUtils.getShareInfo(this.portalUrl).then(lang.hitch(this, function(result) { this._initShow(result); this.own(on(dom.byId("share-everyone-check"), "change", lang.hitch(this, this.clickEveryone))); })); }, _initShow: function(shareInfo) { this.shareInfo = shareInfo; this.shareInfo.items = [this.shareInfo.item]; this.shareInfo.sortField = "title"; // same logic is in ShareMapDlg.js showShareOptions() // this.isAdmin is true if the user is an admin user and the item is owned by somebody else in his org // this.isAdmin is false if the user is an admin user and owns this item, of if the user is not an admin if ((this.shareInfo.userRole.isAdmin() || ((this.shareInfo._roleCanUpdateItems && this.shareInfo._roleCanShare) || this.shareInfo._roleCanShareOthersItems)) && this.shareInfo.itemUser) { // only use showAdmin if admin is not viewing their own content, does not require update privileges this.showAdmin(this.shareInfo.user.groups, this.shareInfo.itemUser, this.shareInfo.adminGroups); } else if (this.shareInfo.user && shareUtils._isUserOwnTheApp(this.shareInfo.user)) { // owner of item this.show(this.shareInfo.user.groups); } else if (this.shareInfo.user && (this.shareInfo.item.access === "public" || this.shareInfo.item.access === "shared" || (this.shareInfo.item.access === "org" && this.shareInfo.currentUser.orgId))) { // could be admin of an org that does not own the item // this.isAdmin is only true if the user is admin of the org that owns the item this.showGroups(this.shareInfo.user.groups); } else { this.show(this.shareInfo.user.groups); } }, clear: function() { dom.byId("share-groups-list").innerHTML = ""; dom.byId("share-everyone-check").setAttribute('value', false); dom.byId("share-account-check").setAttribute('value', false); dom.byId("share-groups-check").setAttribute('value', false); //dojo.style(dojo.byId("share-everyone-check_div"), "display", "none"); //dojo.style(dojo.byId("share-account-check_div"), "display", "none"); domStyle.set(dom.byId("share-everyone-check_div"), "display", "none"); domStyle.set(dom.byId("share-account-check_div"), "display", "none"); //dojo.disconnect(this.shareConnect); this.shareInfo.shareType = "item"; }, showAdmin: function(userGroups, itemUser, adminGroups) { this.shareInfo.itemUser = itemUser; this.shareInfo.userGroups = array.filter(userGroups || [], lang.hitch(this, function() { return (!this.shareInfo.item.capabilities || !this.shareInfo.item.capabilities.length); })); this.shareInfo.userGroups.sort(lang.hitch(this, this._sortFunc)); this.shareInfo.adminGroups = this.filterAdminGroups(adminGroups); // continue with the dialog boot up after we've checked for the user being a part of an organization this.checkForAccount("admin"); }, filterAdminGroups: function(adminGroups) { if (adminGroups) { // filter out admin user groups that the admin and item owner are both members of var groupIds = []; for (var i = 0; i < this.shareInfo.user.groups.length; i++) { groupIds.push(this.shareInfo.user.groups[i].id); } var tmpGroups = []; for (i = 0; i < adminGroups.length; i++) { // if this group hasn't already been seen, add it to the list if (array.indexOf(groupIds, adminGroups[i].id) === -1 && (!adminGroups[i].capabilities || !adminGroups[i].capabilities.length)) { tmpGroups.push(adminGroups[i]); } } return tmpGroups; } return null; }, showGroups: function(userGroups) { this.shareInfo.userGroups = this.filterOwnedGroups(userGroups); if (this.shareInfo.userGroups) { this.shareInfo.userGroups.sort(lang.hitch(this, this._sortFunc)); } this.clear(); this.shareInfo.shareType = "group"; // can't access the detailed item info for a publicly shared item, so just build list this.checkForAccount("group"); }, filterOwnedGroups: function(groups) { if (groups) { var tmpGroups = []; var group; for (var i = 0; i < groups.length; i++) { group = groups[i]; if ((group.userMembership && (group.userMembership.memberType === "owner" || group.userMembership.memberType === "admin")) && (!group.capabilities || !group.capabilities.length)) { tmpGroups.push(group); } } return tmpGroups; } return null; }, show: function(userGroups/*, itemUser*/) { //if (itemUser && itemUser !== null) { //this.itemUser = itemUser; //} this.shareInfo.userGroups = this.filterViewOnlyGroups(userGroups); //if(esri.isDefined(this.userGroups)) { this.shareInfo.userGroups.sort(lang.hitch(this, this._sortFunc)); //} // continue with the dialog boot up after we've checked for the user being a part of an organization this.checkForAccount("item"); }, filterViewOnlyGroups: function(groups) { if (groups) { var tmpGroups = []; var group; for (var i = 0; i < groups.length; i++) { group = groups[i]; // only add the group if the user is the owner/admin or the group is not view only if ((!group.capabilities || !group.capabilities.length) && ((group.userMembership && (group.userMembership.memberType === "owner" || group.userMembership.memberType === "admin")) || (!esriLang.isDefined(group.isViewOnly) || !group.isViewOnly))) { tmpGroups.push(group); } } return tmpGroups; } return null; }, checkForAccount: function(shareType) { dom.byId("share-account-check-label").innerHTML = this.shareInfo.organization.name; // hide org sharing if privilege denied if (this.shareInfo._isCustomRole && !this.shareInfo._roleCanShareToOrg && !this.shareInfo._roleCanShareOthersItemsToOrg) { domStyle.set(dom.byId("share-account-check_div"), "display", "none"); } //showAdminContinue this.clear(); this.shareInfo.shareType = shareType; //TODO ONE item only // for (var i = 0; i < this.items.length; i++) { // var item = this.items[i]; // item.sharing = null; // var url = esriGeowConfig.restBaseUrl + 'content/users/' + // (this.itemUser ? (this.itemUser.username ? this.itemUser.username : this.itemUser.email) : this.user.email); // if ((esri.isDefined(item.folderId) && item.folderId !== '/') || (esri.isDefined(item.ownerFolder) && item.ownerFolder !== '/')) { // url += '/' + (item.folderId || item.ownerFolder); // } // url += '/items/' + item.id; // this.util.getJson(url, dojo.hitch(this, getDetailedInfoHandler, item)); // } var oneItem = this.shareInfo.items[0]; this.shareInfo.lowestAccess = this.findLowestAccessLevel(this.shareInfo.items); shareUtils.getItemById(oneItem, this.portalUrl).then( (lang.hitch(this, function(result) { //TODO get sharingInfo oneItem.sharing = result.sharing; if (this.shareInfo.shareType === "admin") { //1 admin user shareUtils.getItemByUserAndItemId(oneItem, this.shareInfo.itemUser, this.shareInfo.user, this.portalUrl).then(lang.hitch(this, function(result) { oneItem.sharing = result.sharing; this.buildAdminList(); })); } else if (this.shareInfo.shareType === "group") { //3 in same org/ shareUtils.getItemsGroups(oneItem, this.portalUrl).then(lang.hitch(this, function(result) { var groupIds = []; if (result.admin) { for (var i = 0; i < result.admin.length; i++) { groupIds.push(result.admin[i].id); } } oneItem.sharing = { groups: groupIds }; this.buildGroupList(); })); } else if (this.shareInfo.shareType === "item") { //2 creater shareUtils.getItemByUserAndItemId(oneItem, this.shareInfo.itemUser, this.shareInfo.user, this.portalUrl).then(lang.hitch(this, function(result) { oneItem.sharing = result.sharing; this.buildList(); })); } }))); }, buildAdminList: function() { var i, j, k; if ((this.shareInfo.user.groups && this.shareInfo.user.groups.length > 0) || (this.shareInfo.adminGroups && this.shareInfo.adminGroups.length > 0 && this.shareInfo.lowestAccess > 1)) { if (!this.shareInfo._isCustomRole || this.shareInfo._roleCanShareToGroup || this.shareInfo._roleCanShareOthersItemsToGroup) { domStyle.set(dom.byId("share-groups-div"), "display", "block"); } else { domStyle.set(dom.byId("share-groups-div"), "display", "none"); } } // determine which items are shared to groups this.shareInfo.itemsAreSharedToGroups = ","; var groupCounter = []; var item = null, groupId = null, cntr = []; for (i = 0; i < this.shareInfo.items.length; i++) { item = this.shareInfo.items[i]; //this.itemsInfo["_" + item.id] = {}; //this.itemsInfo["_" + item.id].itemsIsSharedToGroups = ","; //eval("this.itemsInfo._" + item.id + " = new Object();"); //eval("this.itemsInfo._" + item.id).itemsIsSharedToGroups = ","; if (item.sharing) { for (k = 0; k < item.sharing.groups.length; k++) { groupId = item.sharing.groups[k]; //this.itemsInfo["_" + item.id].itemsIsSharedToGroups += groupId + ","; //eval("this.itemsInfo._" + item.id).itemsIsSharedToGroups += groupId + ","; if (this.shareInfo.itemsAreSharedToGroups.indexOf("," + groupId + ",") === -1) { this.shareInfo.itemsAreSharedToGroups += groupId + ","; cntr = []; cntr[0] = groupId; cntr[1] = 1; groupCounter[groupCounter.length] = cntr; } else { for (j = 0; j < groupCounter.length; j++) { if (groupCounter[j][0] === groupId) { groupCounter[j][1] = groupCounter[j][1] + 1; break; } } } } } } // item = this.shareInfo.items[0]; // //this.itemsInfo["_" + item.id] = {}; // //this.itemsInfo["_" + item.id].itemsIsSharedToGroups = ","; // //eval("this.itemsInfo._" + item.id + " = new Object();"); // //eval("this.itemsInfo._" + item.id).itemsIsSharedToGroups = ","; // if (item.sharing) { // for (k = 0; k < item.sharing.groups.length; k++) { // groupId = item.sharing.groups[k]; // //this.itemsInfo["_" + item.id].itemsIsSharedToGroups += groupId + ","; // //eval("this.itemsInfo._" + item.id).itemsIsSharedToGroups += groupId + ","; // if (this.shareInfo.itemsAreSharedToGroups.indexOf("," + groupId + ",") === -1) { // this.shareInfo.itemsAreSharedToGroups += groupId + ","; // cntr = []; // cntr[0] = groupId; // cntr[1] = 1; // groupCounter[groupCounter.length] = cntr; // } else { // for (j = 0; j < groupCounter.length; j++) { // if (groupCounter[j][0] === groupId) { // groupCounter[j][1] = groupCounter[j][1] + 1; // break; // } // } // } // } // } var html = ""; var hasOne = false; var group; var checked; var count; for (i = 0; i < this.shareInfo.user.groups.length; i++) { group = this.shareInfo.user.groups[i]; checked = ""; count = this.shareInfo.items.length; if (this.shareInfo.itemsAreSharedToGroups.indexOf("," + group.id + ",") > -1) { checked = "checked"; hasOne = true; for (j = 0; j < groupCounter.length; j++) { if (groupCounter[j][0] === group.id) { count = groupCounter[j][1]; break; } } } if (count < this.shareInfo.items.length) { // not all items are shared to this group html += "
" + "
" + "" + "" + group.title + "
" + "
" + "
" + "" + ""; html = this._addOpenDataStr(group, html); html += "
"; } else { html += "
" + "
" + "" + ""; html = this._addOpenDataStr(group, html); html += "
"; } } // add admin user groups if there are any that the user does not belong to already // admin's groups will only display if the lowest level of all items is account or public if (this.shareInfo.adminGroups && this.shareInfo.adminGroups.length && this.shareInfo.lowestAccess > 1) { html += "

"; for (var m = 0; m < this.shareInfo.adminGroups.length; m++) { group = this.shareInfo.adminGroups[m]; checked = ""; count = this.shareInfo.items.length; if (this.shareInfo.itemsAreSharedToGroups.indexOf("," + group.id + ",") > -1) { checked = "checked"; hasOne = true; for (var n = 0; n < groupCounter.length; n++) { if (groupCounter[n][0] === group.id) { count = groupCounter[n][1]; break; } } } if (count < this.shareInfo.items.length) { // not all items are shared to this group html += "
" + "" + "
" + "" + "" + group.title + "
" + "
" + "
" + "" + ""; html = this._addOpenDataStr(group, html); html += "
"; } else { html += "
" + "" + "
" + "" + ""; html = this._addOpenDataStr(group, html); html += "
"; } } } // it's too early to use the input element here this.own(on(dom.byId("share-groups-list"), "click", lang.hitch(this, this.checkGroup))); dom.byId("share-groups-list").innerHTML = html; if (this.shareInfo.organization) { var sharedToAccountCounter = 0; for (i = 0; i < this.shareInfo.items.length; i++) { if (this.shareInfo.items[i].sharing && this.shareInfo.items[i].sharing.access === "org") { sharedToAccountCounter++; } } if (!this.shareInfo._isCustomRole || this.shareInfo._roleCanShareToOrg || this.shareInfo._roleCanShareOthersItemsToOrg) { if (sharedToAccountCounter === 0) { dijit.byId("share-account-check").set("checked", false); dijit.byId("share-account-check").set("disabled", false); domStyle.set(dom.byId("share-account-check_div"), "display", "block"); } else if (sharedToAccountCounter === this.shareInfo.items.length) { dijit.byId("share-account-check").set("checked", true); dijit.byId("share-account-check").set("disabled", false); domStyle.set(dom.byId("share-account-check_div"), "display", "block"); } else { dijit.byId("share-account-check").set("checked", true); dijit.byId("share-account-check").set("disabled", true); domStyle.set(dom.byId("share-account-check_div"), "display", "block"); } } else { // share account enable dijit.byId("share-account-check").set("disabled", true); domStyle.set(dom.byId("share-account-check_div"), "display", "none"); } } if (!this.shareInfo.organization || this.shareInfo._orgUserCanSharePublicOrOverride) { var sharedToEveryoneCounter = 0; for (i = 0; i < this.shareInfo.items.length; i++) { if (this.shareInfo.items[i].sharing && this.shareInfo.items[i].sharing.access === "public") { sharedToEveryoneCounter++; } } if (sharedToEveryoneCounter === 0) { dijit.byId("share-everyone-check").set("checked", false); domStyle.set(dom.byId("share-everyone-check_div"), "display", "block"); } else if (sharedToEveryoneCounter === this.shareInfo.items.length) { dijit.byId("share-everyone-check").set("checked", true); domStyle.set(dom.byId("share-everyone-check_div"), "display", "block"); if (this.shareInfo.organization && (!this.shareInfo._isCustomRole || this.shareInfo._roleCanShareToOrg || this.shareInfo._roleCanShareOthersItemsToOrg)) { dijit.byId("share-account-check").set("checked", true); dijit.byId("share-account-check").set("disabled", dijit.byId("share-everyone-check").get("checked")); } } else { dijit.byId("share-everyone-check").set("checked", true); if (this.shareInfo.organization && (!this.shareInfo._isCustomRole || this.shareInfo._roleCanShareToOrg || this.shareInfo._roleCanShareOthersItemsToOrg)) { dijit.byId("share-account-check").set("checked", true); dijit.byId("share-account-check").set("disabled", dijit.byId("share-everyone-check").get("checked")); } } this.clickEveryone(); //this.own(on(dom.byId("share-everyone-check"), "click", lang.hitch(this, this.clickEveryone))); } else { dijit.byId("share-everyone-check").set("checked", false); domStyle.set(dom.byId("share-everyone-check_div"), "display", "none"); } if (hasOne) { dijit.byId("share-groups-check").set("checked", true); } else { dijit.byId("share-groups-check").set("checked", false); } this.own(on(dom.byId("share-groups-check"), "click", lang.hitch(this, this.checkGroups))); if (this.shareInfo.organization && (!this.shareInfo._isCustomRole || this.shareInfo._roleCanShareToOrg || this.shareInfo._roleCanShareOthersItemsToOrg)) { this.own(on(dom.byId("share-account-check"), "click", lang.hitch(this, this.clickAccount))); } //dojo.publish("shareOptionsSetup"); }, buildList: function(/*counter*/) { var i, j; if (!this.shareInfo._isCustomRole || this.shareInfo._roleCanShareToGroup || this.shareInfo._roleCanShareOthersItemsToGroup) { if (this.shareInfo.userGroups && this.shareInfo.userGroups.length > 0) { domStyle.set(dom.byId("share-groups-div"), "display", "block"); } else { //dojo.publish("notMemberOfAnyGroups"); } } else { domStyle.set(dom.byId("share-groups-div"), "display", "none"); } this.shareInfo.itemsAreSharedToGroups = ","; var groupCounter = []; for (i = 0; i < this.shareInfo.items.length; i++) { var item = this.shareInfo.items[i]; //this.itemsInfo["_" + item.id] = {}; //this.itemsInfo["_" + item.id].itemsIsSharedToGroups = ","; //eval("this.itemsInfo._" + item.id + " = new Object();"); //eval("this.itemsInfo._" + item.id).itemsIsSharedToGroups = ","; if (item.sharing) { for (var k = 0; k < item.sharing.groups.length; k++) { var groupId = item.sharing.groups[k]; //this.itemsInfo["_" + item.id].itemsIsSharedToGroups += groupId + ","; //eval("this.itemsInfo._" + item.id).itemsIsSharedToGroups += groupId + ","; if (this.shareInfo.itemsAreSharedToGroups.indexOf("," + groupId + ",") === -1) { this.shareInfo.itemsAreSharedToGroups += groupId + ","; var cntr = []; cntr[0] = groupId; cntr[1] = 1; groupCounter[groupCounter.length] = cntr; } else { for (j = 0; j < groupCounter.length; j++) { if (groupCounter[j][0] === groupId) { groupCounter[j][1] = groupCounter[j][1] + 1; break; } } } } } } var html = ""; var hasOne = false; for (i = 0; i < this.shareInfo.userGroups.length; i++) { var group = this.shareInfo.userGroups[i]; var checked = ""; var count = this.shareInfo.items.length; if (this.shareInfo.itemsAreSharedToGroups.indexOf("," + group.id + ",") > -1) { checked = "checked"; hasOne = true; for (j = 0; j < groupCounter.length; j++) { if (groupCounter[j][0] === group.id) { count = groupCounter[j][1]; break; } } } if (count < this.shareInfo.items.length) { // not all items are shared to this group html += "
" + "
" + "" + "" + group.title + "
" + "
" + "
" + "" + ""; html = this._addOpenDataStr(group, html); html += "
"; } else { html += "
" + "
" + "" + ""; html = this._addOpenDataStr(group, html); html += "
"; } } // it's too early to use the input element here this.own(on(dom.byId("share-groups-list"), "click", lang.hitch(this, this.checkGroup))); dom.byId("share-groups-list").innerHTML = html; if (this.shareInfo.organization && this.shareInfo.userRole && (!this.shareInfo._isCustomRole || this.shareInfo._roleCanShareToOrg || this.shareInfo._roleCanShareOthersItemsToOrg)) { var sharedToAccountCounter = 0; for (i = 0; i < this.shareInfo.items.length; i++) { if (this.shareInfo.items[i].sharing && this.shareInfo.items[i].sharing.access === "org") { sharedToAccountCounter++; } } if (sharedToAccountCounter === 0) { dijit.byId("share-account-check").set("checked", false); domStyle.set(dom.byId("share-account-check_div"), "display", "block"); } else if (sharedToAccountCounter === this.shareInfo.items.length) { dijit.byId("share-account-check").set("checked", true); domStyle.set(dom.byId("share-account-check_div"), "display", "block"); } else { dijit.byId("share-account-check").set("checked", true); domStyle.set(dom.byId("share-account-check_div"), "display", "block"); } } if (!this.shareInfo.organization || this.shareInfo._orgUserCanSharePublicOrOverride) { // only a real admin (not custom with canUpdateOrgItems) can overwrite that canSharePublic setting on the org, and only if the admin is in the same org as the item var sharedToEveryoneCounter = 0; for (i = 0; i < this.shareInfo.items.length; i++) { if (this.shareInfo.items[i].sharing && this.shareInfo.items[i].sharing.access === "public") { sharedToEveryoneCounter++; } } if (sharedToEveryoneCounter === 0) { dijit.byId("share-everyone-check").set("checked", false); domStyle.set(dom.byId("share-everyone-check_div"), "display", "block"); } else if (sharedToEveryoneCounter === this.shareInfo.items.length) { dijit.byId("share-everyone-check").set("checked", true); domStyle.set(dom.byId("share-everyone-check_div"), "display", "block"); if (this.shareInfo.organization && this.shareInfo.userRole && (!this.shareInfo._isCustomRole || this.shareInfo._roleCanShareToOrg || this.shareInfo._roleCanShareOthersItemsToOrg)) { dijit.byId("share-account-check").set("checked", true); domStyle.set(dom.byId("share-everyone-check_div"), "display", "block"); } } else { dijit.byId("share-everyone-check").set("checked", true); if (this.shareInfo.organization && this.shareInfo.userRole && (!this.shareInfo._isCustomRole || this.shareInfo._roleCanShareToOrg || this.shareInfo._roleCanShareOthersItemsToOrg)) { dijit.byId("share-account-check").set("checked", true); domStyle.set(dom.byId("share-everyone-check_div"), "display", "block"); } } this.clickEveryone(); //this.own(on(dom.byId("share-everyone-check"), "click", lang.hitch(this, this.clickEveryone))); } else if (this.shareInfo.organization && !this.shareInfo.organization.canSharePublic) { var sharedToEveryoneCounter_org = 0; for (i = 0; i < this.shareInfo.items.length; i++) { if (this.shareInfo.items[i].sharing && this.shareInfo.items[i].sharing.access === "public") { sharedToEveryoneCounter_org++; } } if (sharedToEveryoneCounter_org) { dijit.byId("share-everyone-check").set("checked", true); //dojo.style(dojo.byId("share-everyone-check_div"), "display", "none"); if (this.shareInfo.organization && this.shareInfo.userRole && (!this.shareInfo._isCustomRole || this.shareInfo._roleCanShareToOrg || this.shareInfo._roleCanShareOthersItemsToOrg)) { dijit.byId("share-account-check").set("checked", true); domStyle.set(dom.byId("share-account-check_div"), "display", "block"); } } else { dijit.byId("share-everyone-check").set("checked", false); domStyle.set(dom.byId("share-everyone-check_div"), "display", "none"); } } else { dijit.byId("share-everyone-check").set("checked", false); domStyle.set(dom.byId("share-everyone-check_div"), "display", "none"); } if (hasOne) { dijit.byId("share-groups-check").set("checked", true); } else { dijit.byId("share-groups-check").set("checked", false); } this.own(on(dom.byId("share-groups-check"), "click", lang.hitch(this, this.checkGroups))); if (this.shareInfo.organization && (!this.shareInfo._isCustomRole || this.shareInfo._roleCanShareToOrg || this.shareInfo._roleCanShareOthersItemsToOrg)) { this.own(on(dom.byId("share-account-check"), "click", lang.hitch(this, this.clickAccount))); } //dojo.publish("shareOptionsSetup"); }, buildGroupList: function(/*counter*/) { var i, j; // for (i = 0; i < this.items.length; i++) { // if (!this.items[i].sharing && counter < 20) { // // wait longer // counter = counter + 1; // setTimeout(dojo.hitch(this, "buildGroupList", counter), 100); // return; // } // } if (!this.shareInfo._isCustomRole || this.shareInfo._roleCanShareToGroup || this.shareInfo._roleCanShareOthersItemsToGroup) { if (this.shareInfo.userGroups.length > 0) { domStyle.set(dom.byId("share-groups-div"), "display", "block"); } else { //dojo.publish("doesNotOwnGroups"); } } else { domStyle.set(dom.byId("share-groups-div"), "display", "none"); } // determine which items are shared to groups this.shareInfo.itemsAreSharedToGroups = ","; var groupCounter = []; for (i = 0; i < this.shareInfo.items.length; i++) { var item = this.shareInfo.items[i]; //this.itemsInfo["_" + item.id] = {}; //this.itemsInfo["_" + item.id].itemsIsSharedToGroups = ","; //eval("this.itemsInfo._" + item.id + " = new Object();"); //eval("this.itemsInfo._" + item.id).itemsIsSharedToGroups = ","; if (item.sharing) { for (var k = 0; k < item.sharing.groups.length; k++) { var groupId = item.sharing.groups[k]; //this.itemsInfo["_" + item.id].itemsIsSharedToGroups += groupId + ","; //eval("this.itemsInfo._" + item.id).itemsIsSharedToGroups += groupId + ","; if (this.shareInfo.itemsAreSharedToGroups.indexOf("," + groupId + ",") === -1) { this.shareInfo.itemsAreSharedToGroups += groupId + ","; var cntr = []; cntr[0] = groupId; cntr[1] = 1; groupCounter[groupCounter.length] = cntr; } else { for (j = 0; j < groupCounter.length; j++) { if (groupCounter[j][0] === groupId) { groupCounter[j][1] = groupCounter[j][1] + 1; break; } } } } } } var html = ""; var hasOne = false; var group; var checked; var count; for (i = 0; i < this.shareInfo.userGroups.length; i++) { group = this.shareInfo.userGroups[i]; checked = ""; count = this.shareInfo.items.length; if (this.shareInfo.itemsAreSharedToGroups.indexOf("," + group.id + ",") > -1) { checked = "checked"; hasOne = true; for (j = 0; j < groupCounter.length; j++) { if (groupCounter[j][0] === group.id) { count = groupCounter[j][1]; break; } } } if (count < this.shareInfo.items.length) { // not all items are shared to this group html += "
" + "
" + "" + "" + group.title + "
" + "" + "
" + "" + ""; html = this._addOpenDataStr(group, html); html += "
"; } else { html += "
" + "
" + "" + ""; html = this._addOpenDataStr(group, html); html += "
"; } } // it's too early to use the input element here this.own(on(dom.byId("share-groups-list"), "click", lang.hitch(this, this.checkGroup))); dom.byId("share-groups-list").innerHTML = html; if (hasOne) { dijit.byId("share-groups-check").set("checked", true); } else { dijit.byId("share-groups-check").set("checked", false); } this.own(on(dom.byId("share-groups-check"), "click", lang.hitch(this, this.checkGroups))); //dojo.publish("shareOptionsSetup"); }, share: function(e) { if (this.shareInfo.shareType === "group") { this.shareItemToGroups(); } else if (this.shareInfo.shareType === "admin") { this.shareItemAsAdmin(e); } else { // item this.shareItem(e); } }, checkGroup: function(e) { if (e.target.id.indexOf("img_group_") > -1) { domStyle.set(dom.byId(e.target.id + "_div"), "display", "none"); domStyle.set(dom.byId(e.target.id.substring(4, e.target.id.length) + "_div"), "display", "block"); } if (e.target.checked === true && e.target.id.indexOf("group_") > -1) { dijit.byId("share-groups-check").set("checked", true); } //dojo.publish("onClickGroup"); //topic.publish('ShareOptions/onShareCheckChanged'); }, checkGroups: function() { //dojo.publish("onClickGroup"); //topic.publish('ShareOptions/onShareCheckChanged'); }, clickEveryone: function(/*e*/) { //dojo.stopEvent(e); var isChecked = dijit.byId("share-everyone-check").get('checked'); if (isChecked === true) { // checkbox checked var shareAccountCheckDiv = dom.byId("share-account-check_div"); if (this.shareInfo.organization && shareAccountCheckDiv && domStyle.get(shareAccountCheckDiv, "display") === "block") { dijit.byId("share-account-check").set("checked", true); dijit.byId("share-account-check").set("disabled", true); } } else { // checkbox unchecked if (this.shareInfo.organization && this.shareInfo.userRole && (!this.shareInfo._isCustomRole || this.shareInfo._roleCanShareToOrg || this.shareInfo._roleCanShareOthersItemsToOrg)) { domStyle.set(dom.byId("share-account-check_div"), "display", "block"); } dijit.byId("share-account-check").set("disabled", false); } //dojo.publish("onClickEveryone"); topic.publish('ShareOptions/onClickEveryone', isChecked); //topic.publish('ShareOptions/onShareCheckChanged'); }, clickAccount: function(/*e*/) { //dojo.stopEvent(e); if (dijit.byId("share-account-check").get('checked') === true) { if (this.shareInfo._orgUserCanSharePublicOrOverride) { // only a real admin (not custom with canUpdateOrgItems) can overwrite that canSharePublic setting on the org, and only if the admin is in the same org as the item if (domStyle.get(dom.byId("share-everyone-check_div"), "display") === "none") { domStyle.set(dom.byId("share-everyone-check_div"), "display", "block"); } dijit.byId("share-everyone-check").set("checked", false); } dijit.byId("share-account-check").set("checked", true); } else { // account unchecked dijit.byId("share-account-check").set("checked", false); } //dojo.publish("onClickAccount"); //topic.publish('ShareOptions/onShareCheckChanged'); }, shareItemAsAdmin: function(/*e*/) { var itemIds = ""; var comma = ""; array.forEach(this.shareInfo.items, function(item) { itemIds += comma + item.id; comma = ","; }); var shareWithEveryone = false; var shareWithAccount = false; if ((dom.byId("share-everyone-check_div") && domStyle.get(dom.byId("share-everyone-check_div"), "display") === "block")) { shareWithEveryone = dijit.byId("share-everyone-check").get('checked'); } if ((dom.byId("share-account-check_div") && domStyle.get(dom.byId("share-account-check_div"), "display") === "block")) { shareWithAccount = dijit.byId("share-account-check").get('checked'); } var shareWithGroups = dijit.byId("share-groups-check").get('checked'); var shareWithTheseGroups = ""; var unshareWithTheseGroups = ""; var comma1 = ""; var comma2 = ""; var i = 0; if (shareWithGroups) { var id; if (this.shareInfo.user.groups && this.shareInfo.user.groups.length) { for (i = 0; i < this.shareInfo.user.groups.length; i++) { id = this.shareInfo.user.groups[i].id; if (domStyle.get(dom.byId("group_" + i + "_div"), "display") === "block") { if (dom.byId("group_" + i).checked) { shareWithTheseGroups += comma1 + id; comma1 = ","; } else { unshareWithTheseGroups += comma2 + id; comma2 = ","; } } } } if (this.shareInfo.adminGroups && this.shareInfo.adminGroups.length && this.shareInfo.lowestAccess > 1) { for (var m = 0; m < this.shareInfo.adminGroups.length; m++) { id = this.shareInfo.adminGroups[m].id; if (domStyle.get(dom.byId("group_" + (m + i) + "_div"), "display") === "block") { if (dom.byId("group_" + (m + i)).checked) { shareWithTheseGroups += comma1 + id; comma1 = ","; } else { unshareWithTheseGroups += comma2 + id; comma2 = ","; } } } } } else { // don't share to any group comma2 = ""; if (this.shareInfo.user.groups && this.shareInfo.user.groups.length) { array.forEach(this.shareInfo.user.groups, function(group) { unshareWithTheseGroups += comma2 + group.id; comma2 = ","; }); } if (this.shareInfo.adminGroups && this.shareInfo.adminGroups.length && this.shareInfo.lowestAccess > 1) { array.forEach(this.shareInfo.adminGroups, function(group) { unshareWithTheseGroups += comma2 + group.id; comma2 = ","; }); } } // groups: A comma separated list of group IDs that the item will be shared with or "" if (unshareWithTheseGroups.length > 0) { var unShareRequest = { "items": itemIds, "groups": unshareWithTheseGroups }; for (i = 0; i < this.shareInfo.items.length; i++) { var item = this.shareInfo.items[i]; //'content/users/' + (request.owner || user.email) + '/unshareItems'; //arcgisonline.sharing.geow.Content.unshareItemByID(item, unShareRequest,dojo.hitch(this, unShareHandler, this.items, shareWithTheseGroups, shareWithEveryone, shareWithAccount)); shareUtils._unshareItemById(unShareRequest, item.id, this.portalUrl).then(lang.hitch( this, this.unShareHandler_admin, this.shareInfo.items, itemIds, shareWithTheseGroups, shareWithEveryone, shareWithAccount) ); } } else { this.unShareHandler_admin(this.shareInfo.items, itemIds, shareWithTheseGroups, shareWithEveryone, shareWithAccount); } }, unShareHandler_admin: function(_items, itemIds, _shareWithTheseGroups, _shareWithEveryone, _shareWithAccount) { var totalRequests = _items.length; var shareHandler = function() { totalRequests--; if (totalRequests === 0) { //dojo.publish("onShareUpdate", [_shareWithEveryone ? "public" : // (_shareWithAccount ? "org" : (_shareWithTheseGroups ? "shared" : "private"))]); } }; // groups: A comma separated list of group IDs that the item will be shared with or "" var shareRequest = { "items": itemIds, "groups": _shareWithTheseGroups, "everyone": _shareWithEveryone, "account": _shareWithAccount }; for (var i = 0; i < _items.length; i++) { var item = _items[i]; //'content/items/' + item.id + '/share'; //arcgisonline.sharing.geow.Content.shareItemByID(item, shareRequest, shareHandler); this.shareInfo.user.shareItem(shareRequest, item.id, item.folderId).then(lang.hitch(this, shareHandler)); } }, shareItem: function(/*e*/) { var itemIds = ""; var comma = ""; array.forEach(this.shareInfo.items, function(item) { itemIds += comma + item.id; comma = ","; }); var shareWithEveryone = false; var shareWithAccount = false; if ((dom.byId("share-everyone-check_div") && domStyle.get(dom.byId("share-everyone-check_div"), "display") === "block")) { shareWithEveryone = dijit.byId("share-everyone-check").get('checked'); } if ((dom.byId("share-account-check_div") && domStyle.get(dom.byId("share-account-check_div"), "display") === "block")) { shareWithAccount = dijit.byId("share-account-check").get('checked'); } var shareWithGroups = dijit.byId("share-groups-check").get('checked'); var shareWithTheseGroups = ""; var unshareWithTheseGroups = ""; var comma1 = ""; var comma2 = ""; this.shareInfo.userGroups = this.shareInfo.user.group; if (shareWithGroups) { if (this.shareInfo.userGroups && this.shareInfo.userGroups.length) { array.forEach(this.shareInfo.userGroups, function(group, i) { var id = group.id; if (domStyle.get(dom.byId("group_" + i + "_div"), "display") === "block") { if (dom.byId("group_" + i).checked) { shareWithTheseGroups += comma1 + id; comma1 = ","; } else { unshareWithTheseGroups += comma2 + id; comma2 = ","; } } }); } } else { // don't share to any group comma2 = ""; if (this.shareInfo.userGroups && this.shareInfo.userGroups.length) { array.forEach(this.shareInfo.userGroups, function(group) { unshareWithTheseGroups += comma2 + group.id; comma2 = ","; }); } } // var shareErrorHandler = function(errors) { // dojo.publish("onShareUpdate", [errors]); // }; // groups: A comma separated list of group IDs that the item will be shared with or "" if (unshareWithTheseGroups.length > 0) { var unShareRequest = { "items": itemIds, "groups": unshareWithTheseGroups }; if (this.shareInfo.itemUser && this.shareInfo.itemUser !== null) { var username; if (this.shareInfo.itemUser.username) { username = this.shareInfo.itemUser.username; } else { username = this.shareInfo.itemUser.email; } //shareUtils.unshareItemsByUser(username, unShareRequest, // dojo.hitch(this, unShareHandler, this.itemUser, shareWithTheseGroups, shareWithEveryone, shareWithAccount)); shareUtils.unshareItemsByUser(username, unShareRequest, this.portalUrl).then(lang.hitch( this, this.unShareHandler_item, this.shareInfo.itemUser, itemIds, shareWithTheseGroups, shareWithEveryone, shareWithAccount) ); } else { // arcgisonline.sharing.geow.Content.unshareItems(unShareRequest, // dojo.hitch(this, unShareHandler, this.itemUser, shareWithTheseGroups, shareWithEveryone, shareWithAccount) // ); shareUtils.unshareItems(this.shareInfo.itemUser, unShareRequest, this.portalUrl).then(lang.hitch( this, this.unShareHandler_item, this.shareInfo.itemUser, itemIds, shareWithTheseGroups, shareWithEveryone, shareWithAccount) ); } } else { this.unShareHandler_item(this.shareInfo.itemUser, itemIds, shareWithTheseGroups, shareWithEveryone, shareWithAccount); } //dojo.publish("shareOptionsTeardown"); }, unShareHandler_item: function(_itemUser, itemIds, _shareWithTheseGroups, _shareWithEveryone, _shareWithAccount) { // var shareHandler = function(){ // dojo.publish("onShareUpdate", [_shareWithEveryone?"public":(_shareWithAccount?"org":(_shareWithTheseGroups?"shared":"private"))]); // }; // groups: A comma separated list of group IDs that the item will be shared with or "" var shareRequest = { "items": itemIds, "groups": _shareWithTheseGroups, "everyone": _shareWithEveryone, "account": _shareWithAccount }; if (_itemUser && _itemUser !== null) { var username; if (_itemUser.username) { username = _itemUser.username; } else { username = _itemUser.email; } //arcgisonline.sharing.geow.Content.shareItemsByUser(username, shareRequest, shareHandler); shareUtils.shareItemsByUser(username, shareRequest, this.portalUrl).then(lang.hitch()); } else { //arcgisonline.sharing.geow.Content.shareItems(shareRequest, shareHandler, shareErrorHandler); shareUtils.shareItems(_itemUser, shareRequest, this.portalUrl).then(); } }, findLowestAccessLevel: function(items) { var lowestAccess = 3; // determine lowest share level var accessLevel; var access; for (var i = 0; i < items.length; i++) { access = items[i].access; if (!access) { access = "private"; } if (access.length === 1) { // convert from array (items from a DataGrid come with each property as an array value) access = access[0]; } if (access === "public") { accessLevel = 3; } else if (access === "org") { accessLevel = 2; } else if (access === "shared") { accessLevel = 1; } else if (access === "private") { accessLevel = 0; } if (accessLevel < lowestAccess) { lowestAccess = accessLevel; } } return lowestAccess; }, _sortFunc: function(a, b) { var aa = a[this.shareInfo.sortField].toLowerCase(); var bb = b[this.shareInfo.sortField].toLowerCase(); if (aa === null || bb === null || aa === bb) { return 0; } if (aa < bb) { return -1; } return 1; }, _addOpenDataStr: function(group, html) { if (group.isOpenData && !shareUtils.portal.isPortal) { html += " " + this.i18n.openData; } return html; }, _clearGroupCheckboxes: function() { if (false === dijit.byId("share-groups-check").get("checked")) { var groupCheckBoxes = query(".share-groups-input-checkbox"); for (var i = 0, len = groupCheckBoxes.length; i < len; i++) { var cb = groupCheckBoxes[i]; cb.setAttribute('value', false); } } } }); return so; });