vendredi 14 décembre 2012

How to activate custom action based on SharePoint Right

This javascript function is a helper to enable or disable custom action for SharePoint 2010 based on ContentTypeID, Permissions and number of selected element.

You can call this function in the CommandUIHandler EnabledScript attribute

Create a custom action for Ribbon :

  <CustomAction Id="Ribbon.AlertPerso"
              RegistrationType="ContentType"
                 RegistrationId="0x0101002D02DF72FAFB4EAB9446F92337C759AE01"
              Location="CommandUI.Ribbon" Title="Alert Perso">
    <CommandUIExtension>
      <CommandUIDefinitions>
        <CommandUIDefinition Location="Ribbon.Documents.Manage.Controls._children">
          <Button Id="Ribbon.CreerAlerter.Button"
                  LabelText="Créer une alerte personnalisée"
                  TemplateAlias="o2"
                  Image16by16="/_layouts/images/avertir16.png"
                  Image32by32="/_layouts/images/avertir32.png"
                  Sequence="08"
                  Command="AlerteCommandeDoc" />
        </CommandUIDefinition>
      </CommandUIDefinitions>
      <CommandUIHandlers>
        <CommandUIHandler Command="AlerteCommandeDoc"
                          CommandAction="javascript:window.location='votre page cible."
<!-- Replace the first attribute by you content type id, the second one with the SPPermission needed, and the thrid with the number of element that have to be selected (list of sharepoint permission kind : http://msdn.microsoft.com/en-us/library/ee556747(v=office.14).aspx) -->            EnabledScript="javascript:ActiveTypeContenuDroit('0x0101002D02DF72FAFB4EAB9446F92337C759AE01',SP.PermissionKind.,1);"/>
      </CommandUIHandlers>
    </CommandUIExtension>
  </CustomAction>
</Elements>




Ajout de la fonction dans core.js :

//Id of SP.ListItem
var ItemSelectedID;
//Content Type ID
var ItemSelectedContentType;
//SP.ListItem
var ItemSelectedItem;
//Right on the item.
var ItemSelectedRight;

//Check if the custom action is enabled

//ContenuID : Content Type Id that the item must match.
//Permission : Permissions needed, if null the custom action will be enabled.
function ActiveTypeContenuDroit(ContenuID, Permission, TypeAction) {
    var result = false;
    var selectedItems = SP.ListOperation.Selection.getSelectedItems();
    var countItems = CountDictionary(selectedItems);

    //when the action is available for all items.
    if (TypeAction == 0 && countItems == TypeAction) {
        result = true;
    } else {
        //when the action is available when only one item is selected.
        if (countItems == TypeAction && TypeAction == 1) {
            //when the objet is not defined
            if (this.ItemSelectedID == null) {
                var listGuid = SP.ListOperation.Selection.getSelectedList();
                ItemSelectedID = selectedItems[0]['id'];
                ListItemContentTypePermission(this.ItemSelectedID, listGuid);
            }
            //when the charged item is not previous item that was charged
            else if (this.ItemSelectedID != selectedItems[0]['id']) {
                this.ItemSelectedID = selectedItems[0]['id'];
                var listGuid = SP.ListOperation.Selection.getSelectedList();
                ListItemContentTypePermission(this.ItemSelectedID, listGuid);
            }
            //compare with the content type id parameter
            else if (this.ItemSelectedContentType != null) {
                if (ItemSelectedContentType.toString().indexOf(ContenuID.toString()) != -1) {
                    //Check rigth on the object.
                    if (Permission != null && ItemSelectedRight != null) {
                        if (ItemSelectedRight == null) {
                            alert("ItemSelectedRight null");
                        }
                        else {
                            //Check rigth on the object.
                            var permettre = ItemSelectedRight.has(Permission);
                            if (permettre) {
                                { result = true; }
                            }
                        }
                    }
                    else {
                        result = true;
                    }
                }
            }
        }
        else {
            //when more than one selected value is possible
            if (TypeAction > 1) {
                    // .. action when two item selected.
                alert("not defined ActiveTypeContenuDroit " + TypeAction);
                result = false;
            }
        }
    }
    return result;
}

//Initialize SP.ListItem and get the property  Title  ContentTypeId EffectiveBasePermissions
function ListItemContentTypePermission(ItemId, listGuid) {
    var clientContext = new SP.ClientContext();
    var web = clientContext.get_web();
    var lists = web.get_lists();
    var list = lists.getById(listGuid);
    ItemSelectedItem = list.getItemById(ItemId);
    clientContext.load(ItemSelectedItem, 'Title', 'ContentTypeId', 'EffectiveBasePermissions');
    clientContext.executeQueryAsync(onListItemContentTypePermission, failedListItemContentTypePermission);
}

//Get the needed property.
function onListItemContentTypePermission(sender, args) {
    ItemSelectedRight = ItemSelectedItem.get_effectiveBasePermissions();
    ItemSelectedContentType = ItemSelectedItem.get_item('ContentTypeId');
    RefreshCommandUI();
}

function failedListItemContentTypePermission(sender, args) {
    alert('Request failed. \nError: ' + args.get_message() + '\nStackTrace: ' + args.get_stackTrace());
}

SharePoint Client Side Object Model (CSOM)

Un petit coup de chapeau pour ce très bon post qui trait du CSOM dans SharePoint 2010, SharePoint 2007, SharePoint 2013.

Et notamment sur la récupération du SP.ClientContext< ainsi que le fonctionnement des executeQueryAsync

http://blog.aptillon.com/2012/09/25/the-sharepoint-javascript-object-modelresources-and-real-world-examples/

vendredi 23 novembre 2012

Soirée Intel et Microsft autour de Windows 8

Microsoft et Intel organisent une soirée au RedLigth ce jeudi 29 Novembre, cette soirée sera dédié aux ultrabooks ainsi qu'au développement d'application Windows 8 "AppTouch"

Des experts Microsoft et Intel seront là pour assurer le show et des stands de démo seront aussi présents pour essayer les dernières technos.

( cocktail / bière / pizza à volonté ) 

Programme de la soirée :

19h30 : Accueil des participants au Red Light & cocktails

19h45 :  Présentation de la Intel Developer Zone
Découvrez la gestion du tactile sous Windows 8 et les APIs natives/C#/HTML vous permettant d’en tirer partie L'accent sera mis sur le développement d'applications pour Ultrabook. 

20h :Guideline de User Interface sur Ultrabook
Formation technique au touch et aux outils de design d'interface pour Ultrabook. Guidelines sur le UI/UX sur Ultrabook.

20h45: Rencontre avec les Sensors
Découvrez toutes les API de Sensors qui sont mises à dispositon des développeurs.

21h30 : Drinks et Pizzas et Démos
Pendant toutes la soirée, vous pourrez profiter d'un espace démo et de coachs qui seront présents pour vous conseiller et répondre à toutes vos questions. 

Le récap de l'événement est ici : 
http://www.meetup.com/Intel-Technologies-Meetup/events/92504522/


Et l'inscription sur le site de intel :
http://applabintel.eventbrite.com/

mardi 20 novembre 2012

The HTTP service located is too busy / Le service HTTP est trop occupé



Pour provisionner un service trop occupé dans SharePoint 2010, exécuter les commande suivantes :

$sts = Get-SPServiceApplication | ?{$_ -match "nom du service"}  
$sts.Status
$sts.Provision()


Erreur sharepoint lié :
An exception occurred when trying to issue security token: Le service HTTP situé sur ../SecurityTokenServiceApplication/securitytoken.svc/actas est trop occupé.
Exception occured while connecting to WCF endpoint: System.ServiceModel.ServerTooBusyException


mardi 23 octobre 2012

Deactivate "I like" and "Notes" on ListItem for Sharepoint 2010 Ribbon / Désactiver les "J'aime ca" et "Notes" sur SharePoint 2010

Il suffit de désactiver la feature de ferme correspondante avec le code suivant :

Disable-SPFeature -id "756D8A58-4E24-4288-B981-65DC93F9C4E5" -force

Hide top navigation bar for Sharepoint 2010 / Cacher le ruban et la barre de navigation supérieur via code depuis la masterPage


Il ne faut pas oublier de passer les différents div en "runat='server'" pour que le code marche.

private void HideShowElement(bool value)
    {
        if(value) // Administrateur
    {    
    Control haut  = this.FindControl("msWwpselectlink");
//((HtmlControl)haut).Width="0px";
  ((HtmlControl)haut).Attributes.Add("style","display:block;");

Control hautLien  = this.FindControl("topNavgationBar");
  ((HtmlControl)hautLien).Attributes.Add("style","display:block;");


    Control crt = this.FindControl("PanelAdminLeft");
    if(crt!= null)
    {
    crt.Visible = true;
                //Supprime le css pour aligner à gauche.
                Control content = this.FindControl("MSO_ContentTable");
                if(content != null){
                ((HtmlControl)content).Attributes.Add("class","s4-ca s4-ca-dlgNoRibbon");}
    }
    }
    else  // Non administrateur
    {
    Control haut  = this.FindControl("msWwpselectlink");
// haut.Visible = false;
  ((HtmlControl)haut).Attributes.Add("style","display:none;");
  Control hautLien  = this.FindControl("topNavgationBar");
  ((HtmlControl)hautLien).Attributes.Add("style","display:none;");


    Control crt = this.FindControl("PanelAdminLeft");
    if(crt!= null)
    {
    crt.Visible = false;
                //Supprime le css pour aligner à gauche.
                Control content = this.FindControl("MSO_ContentTable");
                if(content != null){
                ((HtmlControl)content).Attributes.Remove("class");}
            }
    }
    }