1 /** 2 * Copyright (C) 2005-2010 Alfresco Software Limited. 3 * 4 * This file is part of Alfresco 5 * 6 * Alfresco is free software: you can redistribute it and/or modify 7 * it under the terms of the GNU Lesser General Public License as published by 8 * the Free Software Foundation, either version 3 of the License, or 9 * (at your option) any later version. 10 * 11 * Alfresco is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 * GNU Lesser General Public License for more details. 15 * 16 * You should have received a copy of the GNU Lesser General Public License 17 * along with Alfresco. If not, see <http://www.gnu.org/licenses/>. 18 */ 19 20 /** 21 * Sites Module 22 * 23 * @namespace Alfresco.module 24 * @class .description 25 */ 26 (function() 27 { 28 /** 29 * YUI Library aliases 30 */ 31 var Dom = YAHOO.util.Dom, 32 Event = YAHOO.util.Event; 33 34 /** 35 * Alfresco Slingshot aliases 36 */ 37 var $html = Alfresco.util.encodeHTML; 38 39 Alfresco.module.Sites = function(htmlId) 40 { 41 return Alfresco.module.Sites.superclass.constructor.call(this, "Alfresco.module.Sites", htmlId, ["button", "menu", "container"]); 42 }; 43 44 YAHOO.extend(Alfresco.module.Sites, Alfresco.component.Base, 45 { 46 /** 47 * Object container for initialization options 48 * 49 * @property options 50 * @type object 51 */ 52 options: 53 { 54 /** 55 * Current siteId. 56 * 57 * @property siteId 58 * @type string 59 * @default "" 60 */ 61 siteId: "", 62 63 /** 64 * Current site title. 65 * 66 * @property siteTitle 67 * @type string 68 * @default "" 69 */ 70 siteTitle: "", 71 72 /** 73 * Favourite sites 74 * 75 * @property favouriteSites 76 * @type object 77 * @default {} 78 */ 79 favouriteSites: {} 80 }, 81 82 /** 83 * Fired by YUI when parent element is available for scripting. 84 * 85 * @method onReady 86 */ 87 onReady: function Sites_onReady() 88 { 89 // Notifications that the favourite sites have been updated 90 YAHOO.Bubbling.on("favouriteSiteAdded", this.onFavouriteSiteAdded, this); 91 YAHOO.Bubbling.on("favouriteSiteRemoved", this.onFavouriteSiteRemoved, this); 92 YAHOO.Bubbling.on("siteDeleted", this.onSiteDeleted, this); 93 94 this.preferencesService = new Alfresco.service.Preferences(); 95 96 var templateUrl = Alfresco.constants.URL_SERVICECONTEXT + "modules/header/sites", 97 dataObj = 98 { 99 htmlid: this.id 100 }; 101 102 if (this.options.siteId !== "") 103 { 104 dataObj.siteId = this.options.siteId; 105 } 106 107 Alfresco.util.Ajax.request( 108 { 109 url: templateUrl, 110 dataObj: dataObj, 111 successCallback: 112 { 113 fn: this.onTemplateLoaded, 114 scope: this 115 }, 116 failureMessage: "Could not load module template from '" + templateUrl + "'.", 117 scope: this, 118 execScripts: true 119 }); 120 }, 121 122 /** 123 * Event callback when dialog template has been loaded 124 * 125 * @method onTemplateLoaded 126 * @param response {object} Server response from load template XHR request 127 */ 128 onTemplateLoaded: function Sites_onTemplateLoaded(response) 129 { 130 // Inject the template from the XHR request into a new DIV element 131 var containerDiv = document.createElement("div"); 132 containerDiv.innerHTML = response.serverResponse.responseText; 133 document.body.insertBefore(containerDiv, document.body.firstChild); 134 135 this.widgets.sitesButton = new YAHOO.widget.Button(this.id, 136 { 137 type: "menu", 138 menu: this.id + "-sites-menu", 139 lazyloadmenu: false 140 }); 141 }, 142 143 /** 144 * Show the Create Site dialog 145 * 146 * @method showCreateSite 147 */ 148 showCreateSite: function Sites_showCreateSite() 149 { 150 Alfresco.module.getCreateSiteInstance().show(); 151 }, 152 153 /** 154 * Favourite Site has been added 155 * 156 * @method onFavouriteSiteAdded 157 * @param layer {object} Event fired 158 * @param args {array} Event parameters (depends on event type) 159 */ 160 onFavouriteSiteAdded: function Sites_onFavouriteSiteAdded(layer, args) 161 { 162 var obj = args[1]; 163 if (obj && obj.shortName !== null) 164 { 165 this.options.favouriteSites[obj.shortName] = obj.title; 166 this._renderFavouriteSites(); 167 } 168 }, 169 170 /** 171 * Favourite Site has been removed 172 * 173 * @method onFavouriteSiteAdded 174 * @param layer {object} Event fired 175 * @param args {array} Event parameters (depends on event type) 176 */ 177 onFavouriteSiteRemoved: function Sites_onFavouriteSiteRemoved(layer, args) 178 { 179 var obj = args[1]; 180 if (obj && obj.shortName !== null) 181 { 182 if (obj.shortName in this.options.favouriteSites) 183 { 184 delete this.options.favouriteSites[obj.shortName]; 185 this._renderFavouriteSites(); 186 } 187 } 188 }, 189 190 /** 191 * Site has been deleted - maybe remove from favourites menu 192 * 193 * @method onSiteDeleted 194 * @param layer {object} Event fired 195 * @param args {array} Event parameters (depends on event type) 196 */ 197 onSiteDeleted: function Sites_onSiteDeleted(layer, args) 198 { 199 var obj = args[1]; 200 if (obj && obj.site !== null) 201 { 202 if (obj.site.shortName in this.options.favouriteSites) 203 { 204 delete this.options.favouriteSites[obj.site.shortName]; 205 this._renderFavouriteSites(); 206 } 207 } 208 }, 209 210 /** 211 * Renders favourite sites into menu 212 * 213 * @method renderFavouriteSites 214 * @private 215 */ 216 _renderFavouriteSites: function Sites__renderFavouriteSites() 217 { 218 var sites = [], site, sitesMenu = this.widgets.sitesButton.getMenu(), sitesGroup, i, ii; 219 220 // Create a sorted list of our current favourites 221 for (site in this.options.favouriteSites) 222 { 223 if (this.options.favouriteSites.hasOwnProperty(site)) 224 { 225 sites.push(site); 226 } 227 } 228 sites.sort(); 229 230 sitesGroup = sitesMenu.getItemGroups()[0]; 231 for (i = 0, ii = sitesGroup.length; i < ii; i++) 232 { 233 sitesMenu.removeItem(0, 0, true); 234 } 235 236 Dom.setStyle(this.id + "-favouritesContainer", "display", sites.length > 0 ? "block" : "none"); 237 Dom.setStyle(this.id + "-favouriteSites", "display", sites.length > 0 ? "block" : "none"); 238 239 for (i = 0, ii = sites.length; i < ii; i++) 240 { 241 sitesMenu.addItem( 242 { 243 text: $html(this.options.favouriteSites[sites[i]]), 244 url: Alfresco.util.uriTemplate("sitedashboardpage", 245 { 246 site: sites[i] 247 }) 248 }, 0); 249 } 250 251 // Show/hide "Add to favourites" menu item if we're in a site 252 if (this.options.siteId.length !== 0) 253 { 254 Dom.setStyle(this.id + "-addFavourite", "display", this.options.siteId in this.options.favouriteSites ? "none" : "block"); 255 } 256 257 sitesMenu.render(); 258 }, 259 260 /** 261 * Adds the current site as a favourite 262 * 263 * @method addAsFavourite 264 */ 265 addAsFavourite: function Sites_addAsFavourite() 266 { 267 var site = 268 { 269 shortName: this.options.siteId, 270 title: this.options.siteTitle 271 }, 272 me = this; 273 274 var responseConfig = 275 { 276 failureCallback: 277 { 278 fn: function(event, obj) 279 { 280 Alfresco.util.PopupManager.displayPrompt( 281 { 282 text: me.msg("message.save.failure") 283 }); 284 }, 285 scope: this 286 }, 287 successCallback: 288 { 289 fn: function(event, obj) 290 { 291 YAHOO.Bubbling.fire("favouriteSiteAdded", obj.site); 292 }, 293 scope: this, 294 obj: 295 { 296 site: site 297 } 298 } 299 }; 300 301 this.preferencesService.set(Alfresco.service.Preferences.FAVOURITE_SITES + "." + site.shortName, true, responseConfig); 302 } 303 }); 304 })(); 305 /** 306 * Dummy instance to load optional YUI components early. 307 * Use fake "null" id, which is tested later in onComponentsLoaded() 308 */ 309 var moduleSites = new Alfresco.module.Sites("null");