All Downloads are FREE. Search and download functionalities are using the official Maven repository.

SLING-INF.content.devwidgets.areapermissions.javascript.areapermissions.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.areapermissions
     *
     * @class areapermissions
     *
     * @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.areapermissions = function (tuid, showSettings) {

        var areapermissionsSelectable = ".areapermissions_selectable > input";

        var contextData = false;
        var visibility = "selected";
        var currentArea = {};
        var visibilityindex = {
            "everyone": 1,
            "loggedin": 2,
            "selected": 3
        };

        //////////////////////////
        // Rendering group data //
        //////////////////////////

        var loadGroupData = function(){
             var groupData = sakai_global.group.groupData;
             var roles = $.parseJSON(groupData["sakai:roles"]);

             // Calculate for each role what current permission is
             currentArea = sakai_global.group.pubdata.structure0[contextData.path];
             var editRoles = $.parseJSON(currentArea._edit);
             var viewRoles = $.parseJSON(currentArea._view);
             for (var i = 0; i < roles.length; i++){
                 var role = roles[i];
                 if ($.inArray("-" + role.id, editRoles) !== -1){
                     role.value = "edit";
                 } else if ($.inArray("-" + role.id, viewRoles) !== -1){
                     role.value = "view";
                 } else {
                     role.value = "hidden";
                 }
                 role.roleTitle = sakai.api.i18n.getValueForKey(role.titlePlural);
                 role.creatorRole = sakai_global.group.groupData["sakai:creatorRole"] === role.id;
             }

             var sortedroles = [];
             // Creators
             $.each(roles, function(i, role){
                 if(role.creatorRole){
                     sortedroles.push(role);
                 }
             });
             // Managers
             $.each(roles, function(i, role){
                 if(role.isManagerRole && !role.creatorRole){
                     sortedroles.push(role);
                 }
             });
             // Viewers
             $.each(roles, function(i, role){
                 if(!role.isManagerRole){
                     sortedroles.push(role);
                 }
             });

             if ($.inArray("anonymous", viewRoles) !== -1 && sakai_global.group.groupData["sakai:group-visible"] === "public"){
                 visibility = "everyone";
             } else if ($.inArray("everyone", viewRoles) !== -1 && (sakai_global.group.groupData["sakai:group-visible"] === "logged-in-only" || sakai_global.group.groupData["sakai:group-visible"] === "public")){
                 visibility = "loggedin";
             } else {
                 visibility = "selected";
             }

             sakai.api.Groups.getRole(sakai.data.me.user.userid, groupData["sakai:group-id"], function(success, data){
                // Render the list
                $("#areapermissions_content_container").html(sakai.api.Util.TemplateRenderer("areapermissions_content_template", {
                    "roles": sortedroles,
                    "visibility": visibility,
                    "manager": contextData.isManager,
                    "groupPermissions": sakai_global.group.groupData["sakai:group-visible"],
                    "sakai": sakai,
                    "area": currentArea._title,
                    "meRole": data.id
                }));
             });
         };

         var checkSelectedPermissionForRole = function(roleId){
             // Check for view permissions
             var roleCanSee = false;
             var seeEl = $("#areapermissions_see_" + roleId);
             if(seeEl.attr("checked")){
                 roleCanSee = true;
             }
             // if view permissions, check for edit permissions
             if(roleCanSee){
                 var editEl = $("#areapermissions_edit_" + roleId);
                 if(editEl.attr("checked")){
                     return "edit";
                 } else {
                     return "view";
                 }
             } else {
                 return false;
             }
         };

         var applyPermissions = function(){
             $("#areapermissions_apply_permissions").attr("disabled", "disabled");
             $("#areapermissions_proceedandapply").attr("disabled", "disabled");
             var groupData = sakai_global.group.groupData;
             var roles = $.parseJSON(groupData["sakai:roles"]);

             var newView = [];
             var newEdit = [];

             // Collect everyone and anonymous value
             var generalVisibility = $("#areapermissions_see_container input[type=radio]:checked").val();
             if (generalVisibility === "everyone"){
                 newView.push("everyone"); 
                 newView.push("anonymous");
             } else if (generalVisibility === "loggedin"){
                 newView.push("everyone");
             }

             // Collect new view roles and new edit roles
             for (var i = 0; i < roles.length; i++){
                var rolePermission = checkSelectedPermissionForRole(roles[i].id);
                if (rolePermission === "edit"){
                    newEdit.push("-" + roles[i].id);
                } else if (rolePermission === "view"){
                    newView.push("-" + roles[i].id);
                }
            }

            // Refetch docstructure information
            $.ajax({
                url: "/~" + sakai_global.group.groupId + "/docstructure.infinity.json",
                success: function(data){
                    // Store view and edit roles
                    var pubdata = sakai.api.Server.cleanUpSakaiDocObject(data);
                    pubdata.structure0[contextData.path]._view = $.toJSON(newView);
                    pubdata.structure0[contextData.path]._edit = $.toJSON(newEdit);
                    sakai_global.group.pubdata.structure0 = pubdata.structure0;
                    sakai.api.Server.saveJSON("/~" + sakai_global.group.groupId + "/docstructure", {
                        "structure0": $.toJSON(pubdata.structure0)
                    });
                }
            });

            // If I manage the document, add/remove appropriate roles from document
            //if (contextData.isManager){

                // General visibility
                // Options are public, everyone or private
                var permissionsBatch = [];

                var generalPermission = "";
                if (generalVisibility === "everyone"){
                    generalPermission = "public";
                } else if (generalVisibility === "loggedin"){
                    generalPermission = "everyone";
                } else if (generalVisibility === "selected"){
                    generalPermission = "private";
                }
                permissionsBatch.push({
                    "url": contextData.pageSavePath + ".json",
                    "method": "POST",
                    "parameters": {
                        "sakai:permissions": generalPermission
                    }
                });

                // Per role visibility
                for (var j = 0; j < roles.length; j++) {
                    var role = sakai_global.group.groupId + "-" + roles[j].id;
                    var selectedPermission = checkSelectedPermissionForRole(roles[j].id);
                    var parameters = {
                        ":viewer@Delete": role,
                        ":manager@Delete": role
                    };
                    var aclParameters = {
                        "principalId": role,
                        "privilege@jcr:write": "denied",
                        "privilege@jcr:read": "denied"
                    };
                    if (selectedPermission === "edit"){
                        parameters = {
                            ":viewer@Delete": role,
                            ":manager": role
                        };
                        aclParameters = {
                            "principalId": role,
                            "privilege@jcr:write": "granted",
                            "privilege@jcr:read": "granted"
                        };
                    } else if (selectedPermission === "view"){
                        parameters = {
                            ":viewer": role,
                            ":manager@Delete": role
                        };
                        aclParameters = {
                            "principalId": role,
                            "privilege@jcr:write": "denied",
                            "privilege@jcr:read": "granted"
                        };
                    }
                    permissionsBatch.push({
                        "url": contextData.pageSavePath + ".members.json",
                        "method": "POST",
                        "parameters": parameters
                    });
                    permissionsBatch.push({
                        "url": contextData.pageSavePath + ".modifyAce.html",
                        "method": "POST",
                        "parameters": aclParameters
                    });
                }

                // Send requests
                sakai.api.Server.batch(permissionsBatch, function(success, data){
                    if (generalPermission) {
                        sakai.api.Content.setFilePermissions([{
                            "hashpath": contextData.pageSavePath.substring(3),
                            "permissions": generalPermission
                        }]);
                    }
                    $("#areapermissions_warning_container").jqmHide();
                    $("#areapermissions_container").jqmHide();
                    sakai.api.Util.notification.show($("#areapermissions_notification_title").text(), $("#areapermissions_notification_body").text());
                });
            //}
        };

        var determineContentManager = function(){
             $.ajax({
                 url: contextData.pageSavePath + ".infinity.json",
                 success: function(data){
                     var manager = false;
                     var managers = data["sakai:pooled-content-manager"];
                     for (var i = 0; i < managers.length; i++) {
                        if (managers[i] === sakai.data.me.user.userid || 
                            sakai.api.Groups.isCurrentUserAMember(managers[i], sakai.data.me)) {
                            manager = true;
                        }
                     }
                     contextData.isManager = manager;
                     loadGroupData();
                 }, error: function(data){
                     contextData.isManager = false;
                     loadGroupData();
                 }
             });
         };

         var showWarning = function(){
             var newVisibilityVal = $.trim($("#areapermissions_see_container input[type=radio]:checked").val());
             if (visibility === newVisibilityVal || visibilityindex[newVisibilityVal] > visibilityindex[visibility] || newVisibilityVal === "selected"){
                 applyPermissions();
             } else {
                 $("#areapermissions_warning_container_text").html(sakai.api.Util.TemplateRenderer("areapermissions_warning_container_text_template", {
                     "visibility": newVisibilityVal,
                     "area": currentArea._title
                 }));
                 $("#areapermissions_proceedandapply").removeAttr("disabled");
                 $("#areapermissions_apply_permissions").removeAttr("disabled");
                 sakai.api.Util.bindDialogFocus($("#areapermissions_warning_container"));
                 $("#areapermissions_warning_container").jqmShow();
             }
         };


         /////////////////////////////////
         // Modal dialog initialization //
         /////////////////////////////////

         var addBinding = function(){
             $(areapermissionsSelectable).live("click", function(){
                 $("#areapermissions_see_container .s3d-outer-shadow-container").addClass("areapermissions_unselected_rbt");
                 $(areapermissionsSelectable).parent().removeClass("s3d-outer-shadow-container");
                 $(this).parent().addClass("s3d-outer-shadow-container");
                 $(this).parent().removeClass("areapermissions_unselected_rbt");
                 if($(this).attr("id") === "areapermissions_see_private"){
                     $("#areapermissions_see_private_specific").show();
                 } else {
                     $("#areapermissions_see_private_specific").hide();
                 }
             });

             $(".areapermissions_role_edit_check").live("change", function(ev){
                 var roleId = $(ev.currentTarget).attr("id").split("areapermissions_edit_")[1];
                 if(ev.currentTarget.checked){
                     $(".areapermissions_see_" + roleId + "_checked").show();
                     $("#areapermissions_see_" + roleId).hide();
                     $("#areapermissions_see_" + roleId).attr("checked", "checked");
                 } else{
                     $(".areapermissions_see_" + roleId + "_checked").hide();
                     $("#areapermissions_see_" + roleId).show();
                 }
             });

             $("#areapermissions_apply_permissions").bind("click", showWarning);
             $("#areapermissions_proceedandapply").live("click", applyPermissions);
         };

         var initializeOverlay = function(){
             $("#areapermissions_container").jqm({
                 modal: true,
                 overlay: 20,
                 toTop: true,
                 zIndex: 3000
             });

             $("#areapermissions_warning_container").jqm({
                 modal: true,
                 overlay: 20,
                 toTop: true,
                 zIndex: 4000
             });

             $("#areapermissions_apply_permissions").removeAttr("disabled");
             sakai.api.Util.bindDialogFocus($("#areapermissions_container"));
             $("#areapermissions_container").jqmShow();
         };


         /////////////////////
         // External events //
         /////////////////////

         $(window).bind("permissions.area.trigger", function(ev, _contextData){
             contextData = _contextData;
             initializeOverlay();
             determineContentManager();
         });

         addBinding();

    };

    // inform Sakai OAE that this widget has loaded and is ready to run
    sakai.api.Widgets.widgetLoader.informOnLoad("areapermissions");
});




© 2015 - 2025 Weber Informatics LLC | Privacy Policy