
SLING-INF.content.devwidgets.mymemberships.javascript.mymemberships.js Maven / Gradle / Ivy
/*
* Licensed to the Sakai Foundation (SF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The SF licenses this file
* to you 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.
*/
// load the master sakai object to access all Sakai OAE API methods
require(["jquery", "sakai/sakai.api.core"], function($, sakai) {
/**
* @name sakai_global.mymemberships
*
* @class mymemberships
*
* @description
* My Memberships lists the groups and worlds that a member is affiliated with
*
* @version 0.0.1
* @param {String} tuid Unique id of the widget
* @param {Boolean} showSettings Show the settings of the widget or not
*/
sakai_global.mymemberships = function (tuid, showSettings) {
/////////////////////////////
// Configuration variables //
/////////////////////////////
var mymemberships = { // global widget data
isOwnerViewing: false,
sortOrder: "modified",
listStyle: "list"
};
// DOM jQuery Objects
var $rootel = $("#" + tuid); // unique container for each widget instance
var $mymemberships_items = $("#mymemberships_items", $rootel);
var $mymemberships_nodata = $("#mymemberships_nodata", $rootel);
var $mymemberships_nogroups = $("#mymemberships_nogroups", $rootel);
var $mymemberships_actionbar = $("#mymemberships_actionbar", $rootel);
var $mymemberships_sortby = $("#mymemberships_sortby", $rootel);
var $mymemberships_item = $(".mymemberships_item", $rootel);
var $mymemberships_show_grid = $(".s3d-listview-grid", $rootel);
var $mymemberships_show_list = $(".s3d-listview-list", $rootel);
var $mymemberships_nosearchresults = $("#mymemberships_nosearchresults");
var currentQuery = "";
///////////////////////
// Utility Functions //
///////////////////////
/**
* Compare the titles of 2 group objects
*
* @param {Object} a
* @param {Object} b
* @return 1, 0 or -1
*/
var groupSortName = function (a, b) {
if (a["sakai:group-title"].toLowerCase() > b["sakai:group-title"].toLowerCase()) {
return 1;
} else {
if (a["sakai:group-title"].toLowerCase() === b["sakai:group-title"].toLowerCase()) {
return 0;
} else {
return -1;
}
}
};
/**
* Compare the modification date of 2 group objects
*
* @param {Object} a
* @param {Object} b
* @return 1, 0 or -1
*/
var groupSortModified = function (a, b) {
if (a["lastModified"] > b["lastModified"]) {
return 1;
} else {
if (a["lastModified"] === b["lastModified"]) {
return 0;
} else {
return -1;
}
}
};
////////////////////
// Event Handlers //
////////////////////
$mymemberships_sortby.change(function () {
var sortSelection = this.options[this.selectedIndex].value;
if (sortSelection === "desc") {
mymemberships.sortOrder = "desc";
$.bbq.pushState({"mso": "desc"});
} else if (sortSelection === "asc") {
mymemberships.sortOrder = "asc";
$.bbq.pushState({"mso": "asc"});
} else {
mymemberships.sortOrder = "modified";
$.bbq.pushState({"mso": "modified"});
}
doInit();
});
////////////////////////////////////////////
// Data retrieval and rendering functions //
////////////////////////////////////////////
/**
* Renders the given groups
*
* @param {Object} groups JSON containing group data
*/
var render = function (groups) {
if (!groups.entry.length) {
$mymemberships_items.hide();
sakai.api.Util.TemplateRenderer("mymemberships_nogroups_template", {isMe: mymemberships.isOwnerViewing}, $mymemberships_nogroups);
$mymemberships_nogroups.show();
$(".s3d-page-header-top-row", $rootel).hide();
$(".s3d-page-header-bottom-row", $rootel).hide();
return;
} else {
if(sakai.data.me.user.anon){
$(".s3d-page-header-bottom-row", $rootel).hide();
} else {
$(".s3d-page-header-top-row", $rootel).show();
$(".s3d-page-header-bottom-row", $rootel).show();
}
if(mymemberships.sortOrder === "modified"){
groups.entry = groups.entry.sort(groupSortModified);
groups.entry.reverse();
} else {
groups.entry = groups.entry.sort(groupSortName);
if(mymemberships.sortOrder === "desc"){
groups.entry.reverse();
}
}
var groupData = [];
var tempGroupData = sakai.api.Groups.prepareGroupsForRender(groups.entry, sakai.data.me);
$.each(tempGroupData, function (i, group) {
var titleMatch = group["sakai:group-title"] && group["sakai:group-title"].toLowerCase().indexOf(currentQuery.toLowerCase()) >= 0;
var descriptionMatch = group["sakai:group-description"] && group["sakai:group-description"].toLowerCase().indexOf(currentQuery.toLowerCase()) >= 0;
var idMatch = group.groupid.toLowerCase().indexOf(currentQuery.toLowerCase()) >= 0;
if(titleMatch || descriptionMatch || idMatch){
var groupType = sakai.api.i18n.getValueForKey("OTHER");
if (group["sakai:category"]){
for (var c = 0; c < sakai.config.worldTemplates.length; c++) {
if (sakai.config.worldTemplates[c].id === group["sakai:category"]){
groupType = sakai.api.i18n.getValueForKey(sakai.config.worldTemplates[c].title);
}
}
}
groupData.push({
id: group.groupid,
url: "/~" + sakai.api.Util.makeSafeURL(group.groupid),
picsrc: group.picPath,
edit_url: "/dev/group_edit2.html?id=" + group.groupid,
title: group["sakai:group-title"],
titleShort: group["sakai:group-title-short"],
titleShorter: group["sakai:group-title-shorter"],
descShort: group["sakai:group-description-short"],
descShorter: group["sakai:group-description-shorter"],
type: groupType,
lastModified: group.lastModified,
contentCount: group.counts.contentCount,
membersCount: group.counts.membersCount,
tags: group.tagsProcessed,
userMember: sakai.api.Groups.isCurrentUserAMember(group.groupid,sakai.data.me),
joinable: group["sakai:group-joinable"]
});
}
});
var json = {
groups: groupData,
isOwnerViewing: mymemberships.isOwnerViewing,
user_manages: function (group) {
if (!group) { return false; }
return sakai.api.Groups.isCurrentUserAManager(group.id, sakai.data.me);
},
sakai: sakai
};
$mymemberships_nodata.hide();
$mymemberships_nogroups.hide();
// Show message that no search results where returned.
if(!json.groups.length){
$mymemberships_nosearchresults.show();
$mymemberships_items.hide();
} else {
$mymemberships_nosearchresults.hide();
$mymemberships_items.show();
$("#mymemberships_sortarea", $rootel).show();
$("#mymemberships_items", $rootel).html(sakai.api.Util.TemplateRenderer(
$("#mymemberships_items_template", $rootel), json));
}
// display functions available to logged in users
if (!sakai.data.me.user.anon) {
$(".mymemberships_item_anonuser").hide();
$(".mymemberships_item_user_functions").show();
}
if (mymemberships.isOwnerViewing) {
// disable remove membership button if not allowed to leave
var groupsToCheck = [];
$.each(groups.entry, function(i, group){
groupsToCheck.push(group.groupid);
});
sakai.api.Groups.isAllowedToLeave(groupsToCheck, sakai.data.me, function(leaveAllowed){
$.each(leaveAllowed, function(groupid, canLeave){
if (!canLeave) {
$(".mymemberships_leave[data-sakai-entityid='" + groupid + "']").addClass("mymemberhips_disabled_leave");
}
});
});
}
}
};
var checkAddingEnabled = function(){
if($(".mymemberships_select_group_checkbox:checked")[0]){
$("#mymemberships_addpeople_button").removeAttr("disabled");
$("#mymemberships_message_button").removeAttr("disabled");
} else {
$("#mymemberships_addpeople_button").attr("disabled", true);
$("#mymemberships_message_button").attr("disabled", true);
$("#mymemberships_select_checkbox").removeAttr("checked");
}
};
var updateMessageAndAddToData = function(){
var idArr = [];
var titleArr = [];
$.each($(".mymemberships_select_group_checkbox:checked"), function(i, group){
idArr.push($(group).data("groupid"));
titleArr.push($(group).data("grouptitle"));
});
$("#mymemberships_message_button").attr("sakai-entityid", idArr);
$("#mymemberships_message_button").attr("sakai-entityname", titleArr);
$("#mymemberships_addpeople_button").data("entityid", idArr);
$("#mymemberships_addpeople_button").data("entityname", titleArr);
};
var removeMembership = function(groupid,groupname){
sakai.api.Groups.getRole(sakai.data.me.user.userid,groupid,function(success,role) {
sakai.api.Groups.leave(groupid,role,sakai.data.me,function(success) {
if (success) {
$(window).trigger("lhnav.updateCount", ["memberships", -1]);
$("#mymemberships_delete_membership_dialog").jqmHide();
$("#mymemberships_item_"+groupid).fadeOut(false, function(){
// Show the default message if I have no remaining memberships
if ($("#mymemberships_items li:visible").length === 0){
render({
entry: []
});
}
});
sakai.api.Util.notification.show(sakai.api.i18n.getValueForKey("MY_MEMBERSHIPS","mymemberships"),
sakai.api.i18n.getValueForKey("YOU_HAVE_LEFT_GROUP","mymemberships").replace("${groupname}",groupname),
sakai.api.Util.notification.type.INFORMATION);
} else {
$("#mymemberships_delete_membership_dialog").jqmHide();
sakai.api.Util.notification.show(sakai.api.i18n.getValueForKey("MY_MEMBERSHIPS","mymemberships"),
sakai.api.i18n.getValueForKey("ERROR_LEAVING_GROUP","mymemberships").replace("${groupname}",groupname),
sakai.api.Util.notification.type.ERROR);
}
});
});
};
var uncheckAll = function(){
$("#mymemberships_select_checkbox").removeAttr("checked");
};
/////////////////////////////
// Initialization function //
/////////////////////////////
var handleHashChange = function(){
if (sakai_global.profile.main.data.userid === sakai.data.me.user.userid) {
mymemberships.isOwnerViewing = true;
render(sakai.api.Groups.getMemberships(sakai.data.me.groups));
} else {
sakai.api.Server.loadJSON("/system/me", function(success, data){
mymemberships.isOwnerViewing = false;
render(sakai.api.Groups.getMemberships(data.groups));
}, { uid: sakai_global.profile.main.data.userid });
}
sakai.api.Util.TemplateRenderer("mymemberships_title_template", {
isMe: mymemberships.isOwnerViewing,
user: sakai_global.profile.main.data.basic.elements.firstName.value
}, $("#mymemberships_title_container", $rootel));
uncheckAll();
$(".s3d-listview-options", $rootel).find("div").removeClass("selected");
mymemberships.listStyle = $.bbq.getState("ls") || "list";
if (mymemberships.listStyle === "list"){
$("#mymemberships_items", $rootel).removeClass("s3d-search-results-grid");
$mymemberships_show_list.addClass("selected");
$mymemberships_show_list.children().addClass("selected");
} else {
$("#mymemberships_items", $rootel).addClass("s3d-search-results-grid");
$mymemberships_show_grid.addClass("selected");
$mymemberships_show_grid.children().addClass("selected");
}
};
var addBinding = function(){
$(window).bind("hashchanged.mymemberships.sakai", handleHashChange);
$("#mymemberships_search_button").click(function(){
var q = $.trim($("#mymemberships_livefilter").val());
if (q !== currentQuery) {
$.bbq.pushState({"mq": q, "mp": 1});
currentQuery = q;
}
});
$mymemberships_show_list.click(function(){
$.bbq.pushState({"ls": "list"});
});
$mymemberships_show_grid.click(function(){
$.bbq.pushState({"ls": "grid"});
});
$("#mymemberships_livefilter").keyup(function(ev){
var q = $.trim($("#mymemberships_livefilter").val());
if (q !== currentQuery && ev.keyCode === 13) {
$.bbq.pushState({"mq": q, "mp": 1});
currentQuery = q;
}
return false;
});
$("#mymemberships_select_checkbox").change(function(){
if($(this).is(":checked")){
$("#mymemberships_addpeople_button").removeAttr("disabled");
$(".mymemberships_select_group_checkbox").attr("checked", true);
} else{
$("#mymemberships_addpeople_button").attr("disabled", true);
$(".mymemberships_select_group_checkbox").removeAttr("checked");
}
checkAddingEnabled();
updateMessageAndAddToData();
});
$(".mymemberships_select_group_checkbox").live("change", function(){
checkAddingEnabled();
updateMessageAndAddToData();
});
$("#mymemberships_delete_membership_dialog").jqm({
modal: true,
overlay: 20,
toTop: true
});
$(".s3d-actions-delete", $rootel).live("click", function() {
if ($(this).hasClass("mymemberhips_disabled_leave")) {
sakai.api.Util.notification.show(sakai.api.i18n.getValueForKey("GROUP_MEMBERSHIP"),
sakai.api.i18n.getValueForKey("UNABLE_TO_LEAVE", "mymemberships").replace("${groupname}", $(this).attr("data-sakai-entityname")),
sakai.api.Util.notification.type.ERROR);
} else {
var msg = sakai.api.i18n.getValueForKey("ARE_YOU_SURE_YOU_WANT_TO_LEAVE", "mymemberships").replace("${groupname}", '' + $(this).data("sakai-entityname") + '');
$("#mymemberships_are_you_sure").html(msg);
$("#mymemberships_delete_membership_confirm").attr("data-sakai-entityid", $(this).attr("data-sakai-entityid"));
$("#mymemberships_delete_membership_confirm").attr("data-sakai-entityname", $(this).attr("data-sakai-entityname"));
sakai.api.Util.positionDialogBox($("#mymemberships_delete_membership_dialog"));
sakai.api.Util.bindDialogFocus($("#mymemberships_delete_membership_dialog"));
$("#mymemberships_delete_membership_dialog").jqmShow();
}
});
$("#mymemberships_delete_membership_confirm").live("click", function(){
removeMembership($(this).data("sakai-entityid"),$(this).attr("data-sakai-entityname"));
updateMessageAndAddToData();
});
if (sakai_global.profile.main.data.userid !== sakai.data.me.user.userid) {
$('.searchgroups_result_plus',$rootel).live("click", function(ev) {
var joinable = $(this).data("group-joinable");
var groupid = $(this).data("groupid");
var itemdiv = $(this);
sakai.api.Groups.addJoinRequest(groupid, function (success) {
if (success) {
var notimsg = "";
if (joinable === "withauth") {
// Don't add green tick yet because they need to be approved.
notimsg = sakai.api.i18n.getValueForKey("YOUR_REQUEST_HAS_BEEN_SENT");
}
else { // Everything else should be regular success
$("#searchgroups_memberimage_"+groupid).show();
notimsg = sakai.api.i18n.getValueForKey("SUCCESSFULLY_ADDED_TO_GROUP");
}
sakai.api.Util.notification.show(sakai.api.i18n.getValueForKey("GROUP_MEMBERSHIP"),
notimsg, sakai.api.Util.notification.type.INFORMATION);
itemdiv.removeClass("s3d-action-icon s3d-actions-addtolibrary searchgroups_result_plus");
$("#searchgroups_memberimage_" + groupid).show();
} else {
sakai.api.Util.notification.show(sakai.api.i18n.getValueForKey("GROUP_MEMBERSHIP"),
sakai.api.i18n.getValueForKey("PROBLEM_ADDING_TO_GROUP"),
sakai.api.Util.notification.type.ERROR);
}
});
});
}
};
/**
* Initialization function that is run when the widget is loaded. Determines
* which mode the widget is in (settings or main), loads the necessary data
* and shows the correct view.
*/
var doInit = function () {
addBinding();
currentQuery = $.bbq.getState("mq") || "";
$("#mymemberships_livefilter").val(currentQuery);
mymemberships.sortOrder = $.bbq.getState("mso") || "modified";
$("#mymemberships_sortby").val(mymemberships.sortOrder);
mymemberships.listStyle = $.bbq.getState("ls") || "list";
handleHashChange();
};
// run the initialization function when the widget object loads
doInit();
};
// inform Sakai OAE that this widget has loaded and is ready to run
sakai.api.Widgets.widgetLoader.informOnLoad("mymemberships");
});
© 2015 - 2025 Weber Informatics LLC | Privacy Policy