Sometimes, we get certain requirements to change the permission of the item; i.e., the item should only be visible to certain groups or members.
Thus, here I am going to share a method to break item level inheritance, using JSOM.
- //Params:context - Clientcontext.
- //itemId -ID of item.
- //person1 - people picker which accepts only a single user.
- //person2 - people picker which accepts multiple users.
- function BreakSecurityInheritanceAddUser(context, itemId, person1, person2) {
- var oList = context.get_web().get_lists().getByTitle(<List Name>);
- var web = context.get_web();
- var groupNames = web.get_siteGroups();
- var ownerName = "";
- var membername = "";
- var oListItem = oList.getItemById(itemId);
- oListItem.breakRoleInheritance(false);
- //This copies only the role of currently logged in user & deletes/does not copy remaining roles.
- //if u set it to true it will copy all the roles and u need to delete them manually.
- context.load(groupNames);
- context.executeQueryAsync(function () {
- var groupEnum = groupNames.getEnumerator();
- while (groupEnum.moveNext())
- var grpItem = groupEnum.get_current();
- context.load(grpItem);
- if (grpItem.get_title() == "* Owners") ownerName = grpItem;
- if (grpItem.get_title() == "* Members") membername = grpItem;
- }
- if (person1 != null && person1 != "undefined" && person1 != "")
- var p1 = web.ensureUser(person1);
- var p2 = [];
- if (person2 != null && person2 != "undefined" && person2 != "") {
- for (var i = 0; i < rdrAccess.length; i++) {
- p2[i] = web.ensureUser(person2[i]);
- }
- }
- var readerRoleDefinitionBinding = SP.RoleDefinitionBindingCollection.newObject(context);
- readerRoleDefinitionBinding.add(context.get_web().get_roleDefinitions().getByType(SP.RoleType.reader));
- if (person2 != null && person2 != "undefined" && person2 != "") {
- for (var i = 0; i < person2.length; i++) {
- if (p2[i] != null) oListItem.get_roleAssignments().add(readerAccess[i], readerRoleDefinitionBinding);
- context.load(p2[i]);
- }
- }
- var editRoleDefinitionBinding = SP.RoleDefinitionBindingCollection.newObject(context);
- editRoleDefinitionBinding.add(context.get_web().get_roleDefinitions().getByType(SP.RoleType.editor));
- if (p1 != null) { oListItem.get_roleAssignments().add(assigne, editRoleDefinitionBinding); context.load(p1); }
- if (membername != null) { oListItem.get_roleAssignments().add(membername, editRoleDefinitionBinding); context.load(membername); }
- var adminRoleDefinitionBinding = SP.RoleDefinitionBindingCollection.newObject(context);
- adminRoleDefinitionBinding.add(context.get_web().get_roleDefinitions().getByType(SP.RoleType.administrator));
- if (ownerName != null) { oListItem.get_roleAssignments().add(ownerName, adminRoleDefinitionBinding); context.load(ownerName); }
- context.load(oListItem);
- context.executeQueryAsync(
- function () {
- console.log('Success');
- window.location.href = <redirect to allitems page.>;
- },
- function (sender, args) {
- console.log(args.get_message());
- window.location.href = <redirect to allitems page.>;;
- });
- }, function (sender, args) {
- alert(args.get_message());
- window.location.href = <redirect to allitems page.>;
- });
- }

Abhijit GhoshPosted Apr 3, 2018, 11:41 AM
//use below code to delete the users .make sure u dont delete the current user.else u will be given access denied when u call execute query var count = RoleAssignments.length; for (var i = 0; i < count; i++) { /*Loop through our array and tell each RoleAssignment to delete itself */ RoleAssignments[i].deleteObject(); } How to check current user's roleassignment within the for loop ?
Tarun DPosted Sep 8, 2016, 4:50 AM
Thanks for sharing..