Utiliser le flux de travail SAP avec Duet Enterprise 2.0
Introduction
Flux de travail SAP Business permet d'automatiser les processus d'entreprise et avec Duet Enterprise 2.0, ces flux de travail peut être intégrées au sein d'un Complément SharePoint.
Les étapes suivantes indiquent comment créer une application, configurez-le, puis comment afficher les informations récupérées à partir du flux de travail SAP.
Créer une application pour SharePoint et Duet Enterprise 2.0
La première étape consiste à créer un Complément SharePoint qui contiendra les informations de connexion à l'aide d'un type de contenu externe pour Business Connectivity Services (BCS), des listes externes et toutes les personnalisations que vous voudrez peut-être utiliser pour présenter les données.
Pour créer une application pour SharePoint :
Démarrez Visual Studio 2012 en tant qu'administrateur.
Choisissez fichier, Nouveau, Nouveau projet.
Dans la boîte de dialogue Nouveau projet, développez le nœud Visual c#, développez le nœud Office/SharePoint, puis choisissez le nœud applications.
Choose App for SharePoint.
Nommez le projet, puis cliquez sur OK.
Dans la première boîte de dialogue spécifier l'application des paramètres de SharePoint, nommez votre application, puis choisissez hébergée sur SharePoint sous Comment voulez-vous héberger votre application pour SharePoint. Également spécifier l'URL du site de flux de travail Duet vous souhaitez déboguer contre sous quel site SharePoint voulez-vous utiliser pour le débogage de votre application et cliquez sur Terminer.
On the Build menu, choose Deploy <your app name> .
Une fois que l'application est déployée, Visual Studio lance la page par défaut pour l'application.
Ajouter les listes externes et le type de contenu externe à l'application
BCS doivent être informés de la source de données externe. Cette opération est effectuée à l'aide d'un type de contenu externe.
Pour ajouter un type de contenu externe :
Dans l' Explorateur de solutions, ouvrez le menu contextuel du projet et choisissez Ajouter, types de contenu pour la source de données externe.
Dans la page Spécifier la Source de OData, entrez l'URL du Service de flux de travail Duet Enterprise. Voici un exemple d'une URL de service Duet :
https:// : <<DUETGATEWAY> > <<PORT> > /sap/opu/odata/IWWRK/DUET_WORKFLOW_CORE;mo;c=SHAREPOINT_DE
Choisissez un nom pour votre source ODATA, par exemple, SAPWorkflows et puis cliquez sur suivant.
Spécifiez le nom d'utilisateur SAP et le mot de passe pour vous connecter à des métadonnées de service.
Une liste des entités de données qui sont exposés par le OData Service apparaît. Sélectionnez les entités que vous souhaitez inclure dans le type de contenu externe. Dans cet exemple, en utilisant les services de flux de travail SAP, sélectionnez l'une des options suivantes :
AttachmentCollection
CommentCollection
DecisionOptionCollection
ExtensibleElementCollection
ParticipantCollection
ServiceOperations
TaskDescriptionCollection
WorkflowTaskCollection
Activez la case à cocher créer des instances de liste pour les entités de données sélectionné (à l'exception des opérations de Service).
Cliquez sur Terminer.
Notes
[!REMARQUE] Assurez-vous que le service de flux de travail SAP permet à l'authentification de base en tant que les outils de génération automatique BDC dans Visual Studio.
Ajouter une fonctionnalité d'action personnalisée à une liste de flux de travail Duet Enterprise 2.0
Afin de fournir un moyen pour l'utilisateur de travailler avec les nouvelles fonctionnalités ajoutées à une liste SharePoint, la procédure suivante ajoute un élément au menu Actions du Site.
Pour ajouter une action personnalisée :
Cliquez avec le bouton droit sur le projet d'Complément SharePoint, puis ajoutez un nouvel élément Action personnalisée d'interface utilisateur.
Ouvrez le fichier Elements.xml de la fonctionnalité web d'hôte une action personnalisée. En remplaçant le code dans le fichier par le code XML suivant, l'action personnalisée sera :
Déclarer une action personnalisée ECB et ses attributs.
Déclarer une action personnalisée du ruban et ses attributs.
Déclarer la cible de la page Web app et les valeurs qui lui sont passées via la chaîne de requête.
L'élément UrlAction utilise plusieurs jetons. Pour plus d'informations, voir Chaînes URL et jetons dans les compléments pour SharePoint.
<?xml version="1.0" encoding="utf-8"?>
<Elements xmlns="http://schemas.microsoft.com/sharepoint/">
<CustomAction Id="ViewDetailsECBCustomAction"
RegistrationType="List"
RegistrationId="107"
Location="EditControlBlock"
Sequence="1"
ImageUrl="_layouts/15/images/placeholder16x16.png"
Title="View Details">
<UrlAction Url="~appWebUrl/Pages/ViewDetails.aspx?
{StandardTokens}&amp;ListId={ListId}&amp;ItemId={ItemId}"/>
</CustomAction>
<CustomAction
Id="ViewDetailsRibbonAction"
RegistrationId="107"
RegistrationType="List"
Location="CommandUI.Ribbon"
Title="View Details"
HostWebDialog="false"
HostWebDialogHeight="500"
HostWebDialogWidth="500">
<CommandUIExtension>
<CommandUIDefinitions>
<CommandUIDefinition
Location="Ribbon.ListItem.Workflow.Controls._children">
<Button
Id="Ribbon.ListItem.Workflow.ViewDetails"
Alt="View Details"
Sequence="25"
Command="Invoke_ViewDetailsSAPWorkflow"
LabelText="View Details"
TemplateAlias="o1"
Image32by32="_layouts/15/images/placeholder32x32.png"
Image16by16="_layouts/15/images/placeholder16x16.png"/>
</CommandUIDefinition>
</CommandUIDefinitions>
<CommandUIHandlers>
<CommandUIHandler
Command="Invoke_ViewDetailsSAPWorkflow"
CommandAction="~appWebUrl/Pages/ViewDetails.aspx?
{StandardTokens}&amp;ListId={ListId}&amp;ItemId={SelectedItemId}"/>
</CommandUIHandlers>
</CommandUIExtension>
</CustomAction>
</Elements>
Ajoutez une nouvelle page, la page de ViewDetails.aspx au projet.
Appuyez sur F5 pour générer et déployer l'application SharePoint.
Accédez à la liste des éléments de travail dans le site web hôte et cliquez sur Afficher les détails dans le menu contextuel. Vous serez redirigé vers ViewDetails.aspx.
Notes
[!REMARQUE] Assurez-vous que le service de flux de travail SAP permet à l'authentification de base. Les BDC la génération automatique des outils dans Visual Studio actuellement uniquement en charge l'authentification anonyme et de base.
Si vous déployez l'application, puis accédez à Des listes/WorkflowTaskCollection à l'intérieur de votre application, vous verrez le message suivant :
« Message système externe: « LobSystem (système externe) a renvoyé erreur d'authentification. » ».
Pour résoudre ce problème, vous devez ajouter l'ouverture de session unique à l'application pour fournir des informations d'identification de l'authentification aux BCS et le système principal SAP.
Ajouter la sécurité d'authentification unique pour l'application
Duet Enterprise Single Sign-On permettra aux utilisateurs d'être authentifiés afin qu'ils peuvent accéder aux ressources sur les côtés de la SharePoint et SAP avec une connexion.
Pour ajouter de l'authentification unique :
- Créer une connexion OData en exécutant la commande suivante sur SharePoint Management Shell.
New-SPODataConnectionSetting -Name SAPWorkflow
-ServiceContext "http://localhost" -ExtensionProvider
"OBA.Server.Canary.ObaOdataServerExtensionProvider, OBA.Server.SSOProvider,
Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c"
-AuthenticationMode passthrough -ServiceAddressURL
"https://<<DUETGATEWAY>>:<<PORT>>/sap/opu/odata/IWWRK/
DUET_WORKFLOW_CORE;mo;c=SHAREPOINT_DE"
Double-cliquez sur WorkflowTaskCollection.ect.
Dans la fenêtre Propriétés, vous devez mettre à jour la valeur de
ODataConnectionSettingIdà SAPWorkflow .Autoriser l'application d'utiliser la connexion.
Ouvrez fichier AppManifest.xml.
Dans les Demandes d'autorisation, sélectionnez étendue, BCS puis autorisation = lecture.
Appuyez sur F5 pour déployer l'application.
Dans la page autorisations pour l'application, sélectionnez la connexion OData que cette application utilise.
Sélectionnez le bouton Approuver.
Accédez à ... / Listes/WorkflowTaskCollection. Vous devez voir les tâches SAP qui vous sont assignés provenant directement le système SAP.
Tâches de flux de travail d'accès et les éléments associés à l'aide du JSOM
Dans la mesure où Compléments SharePoint doit utiliser le code client pour communiquer avec SharePoint, les éléments suivants va vous montrer comment interagir avec les tâches de flux de travail SAP à l'aide du modèle objet JavaScript.
Pour créer le code :
Avec le bouton droit le dossier Pages dans l' Explorateur de solutions, ajoutez une page .NET et nommez-la ViewDetails.aspx
Collez le code HTML suivant dans la section
PlaceHolderAdditionalPageHead. Cela chargera défini la référence de feuille de style, le script et puis renvoyer les tâches de flux de travail associés de SAP.
<link
rel="Stylesheet"
type="text/css"
href="../Content/App.css"/>
<script
src="//ajax.aspnetcdn.com/ajax/4.0/1/MicrosoftAjax.js"
type="text/javascript">
</script>
<script
src="//ajax.aspnetcdn.com/ajax/jQuery/jquery-1.7.2.min.js"
type="text/javascript">
</script>
<script
src="../Scripts/ViewDetails.js"
type="text/javascript">
</script>
Droit sur le dossier Scripts, puis ajoutez un fichier JavaScript. Nommez-le ViewDetails.js.
Ce code effectue les opérations suivantes :
Récupère le
ClientContextpour le site web parent.ID d'extrait le
TaskInstanceParentIdpour la tâche de flux de travail sélectionné à l'aide de la liste des flux de travail Duet GUID et l'élément sélectionné l'.Analyse le
TaskInstanceParentIdpour obtenir une origine de SAP et l'ID du flux de travail dans SAP.Charge les entités pour les types de contenu externes.
Lit la tâche de flux de travail spécifique à partir de SAP à l'aide de la recherche spécifique en transmettant l'origine de SAP et l'ID de tâche de flux de travail pour SAP en tant que paramètres.
Lit les éléments associés à la tâche de flux de travail SAP.
- Voici le code HTML et le JavaScript complète pour la page.
// This code runs when the DOM is ready. It ensures the SharePoint
// script files are loaded and then executes execOperation().
$(document).ready(function () {
SP.SOD.executeFunc("sp.js", "SP.ClientContext", execOperation);
});
function execOperation() {
retrieveTaskFromList();
}
function retrieveTaskFromList() {
// Retrieves the ClientContext of the parent web.
var clientContext =
new SP.ClientContext.get_current();
var appContextSite =
new SP.AppContextSite(clientContext,
decodeURIComponent(getQueryStringParameter("SPHostUrl")));
var web = appContextSite.get_web();
// Loads the selected workflow task from the duet workflow list.
var listGuid = decodeURIComponent(getQueryStringParameter("ListId"));
var itemId = decodeURIComponent(getQueryStringParameter("ItemId"))
this.workflowItem = web.get_lists().getById(
listGuid.substring(1, listGuid.length - 1)).getItemById(itemId);
clientContext.load(workflowItem);
clientContext.executeQueryAsync(
Function.createDelegate(this, this.onLoadingTaskSucceeded),
Function.createDelegate(this, this.onError)
);
}
function onLoadingTaskSucceeded() {
var sapParameters = parseParentTaskId(workflowItem.
get_item("TaskInstanceParentId"));
getDataFromSAP(sapParameters);
}
// Parses the TaskInstanceParentId
// to get SAP Origin and the id for the workflow in SAP.
function parseParentTaskId(parentTaskId) {
var idlength = parseInt(parentTaskId.substring(0, 2));
var sapParameters = new Object();
if (parentTaskId.length > (17 + idlength)) {
sapParameters.workitemId = parentTaskId.substring(5, 5 + idlength);
sapParameters.sapOrigin = parentTaskId.substring(17 + idlength);
}
return sapParameters;
}
// Retrieves the workflow task and associated elements from SAP.
function getDataFromSAP(sapParameters) {
context = new SP.ClientContext.get_current();
//Loads the entities for the external content types.
wfEntity = context.get_web().getAppBdcCatalog().
getEntity("DUET_WORKFLOW_CORE", "WorkflowTaskCollection");
context.load(wfEntity);
wfExtensibleElementEntity = context.get_web().getAppBdcCatalog().
getEntity("DUET_WORKFLOW_CORE", "ExtensibleElementCollection");
context.load(wfExtensibleElementEntity);
wfCommentsEntity = context.get_web().getAppBdcCatalog().
getEntity("DUET_WORKFLOW_CORE", "CommentCollection");
context.load(wfCommentsEntity);
wfDecisionsEntity = context.get_web().getAppBdcCatalog().
getEntity("DUET_WORKFLOW_CORE", "DecisionOptionCollection");
context.load(wfDecisionsEntity);
wfParticipantEntity = context.get_web().getAppBdcCatalog().
getEntity("DUET_WORKFLOW_CORE", "ParticipantCollection");
context.load(wfParticipantEntity);
wfDescriptionEntity = context.get_web().getAppBdcCatalog().
getEntity("DUET_WORKFLOW_CORE", "TaskDescriptionCollection");
context.load(wfDescriptionEntity);
wfAttachmentEntity = context.get_web().getAppBdcCatalog().
getEntity("DUET_WORKFLOW_CORE", "AttachmentCollection");
context.load(wfAttachmentEntity);
// Loads a LOB system instances.
lobSystem = wfEntity.getLobSystem();
lobSystemInstanceCollection = lobSystem.getLobSystemInstances();
context.load(lobSystemInstanceCollection);
context.executeQueryAsync(onLoadingLOBInstanceSucceeded, onError);
function onLoadingLOBInstanceSucceeded() {
lobSystemInstance = lobSystemInstanceCollection.get_item(0);
// Reads the workflow task from SAP using specific finder.
var identifierValues = [sapParameters.sapOrigin, sapParameters.workitemId];
var entityIdentity = SP.BusinessData.Runtime.EntityIdentity.
newObject(context, identifierValues);
wfEntityInstance = wfEntity.findSpecific(entityIdentity,
"ReadSpecificWorkflowTask", lobSystemInstance);
context.load(wfEntityInstance);
context.executeQueryAsync(onLoadingWorkflowSucceeded, onError);
}
function onLoadingWorkflowSucceeded() {
// Reads the associated elements for the workflow task.
var exFilterCollection = wfExtensibleElementEntity.getFilters(
"GetExtensibleElementsFromWorkflowTaskCollection");
context.load(exFilterCollection);
exElementsCollection = wfExtensibleElementEntity.findAssociated(
wfEntityInstance, "GetExtensibleElementsFromWorkflowTaskCollection",
exFilterCollection, lobSystemInstance);
context.load(exElementsCollection);
var comFilterCollection = wfCommentsEntity.getFilters(
"GetCommentsFromWorkflowTaskCollection");
context.load(comFilterCollection);
commentsCollection = wfCommentsEntity.findAssociated(
wfEntityInstance, "GetCommentsFromWorkflowTaskCollection",
comFilterCollection, lobSystemInstance);
context.load(commentsCollection);
var decFilterCollection = wfDecisionsEntity.getFilters(
"GetDecisionOptionsFromWorkflowTaskCollection");
context.load(decFilterCollection);
decisionsCollection = wfDecisionsEntity.findAssociated(
wfEntityInstance, "GetDecisionOptionsFromWorkflowTaskCollection",
decFilterCollection, lobSystemInstance);
context.load(decisionsCollection);
var partFilterCollection = wfParticipantEntity.getFilters(
"GetParticipantsFromWorkflowTaskCollection");
context.load(partFilterCollection);
participantsCollection = wfParticipantEntity.findAssociated(
wfEntityInstance, "GetParticipantsFromWorkflowTaskCollection",
partFilterCollection, lobSystemInstance);
context.load(participantsCollection);
var descFilterCollection = wfDescriptionEntity.getFilters(
"GetDescriptionFromWorkflowTaskCollection");
context.load(descFilterCollection);
descriptionCollection = wfDescriptionEntity.findAssociated(
wfEntityInstance, "GetDescriptionFromWorkflowTaskCollection",
descFilterCollection, lobSystemInstance);
context.load(descriptionCollection);
var attaFilterCollection = wfAttachmentEntity.getFilters(
"GetAttachmentsFromWorkflowTaskCollection");
context.load(attaFilterCollection);
attachmentCollection = wfAttachmentEntity.findAssociated(
wfEntityInstance, "GetAttachmentsFromWorkflowTaskCollection",
attaFilterCollection, lobSystemInstance);
context.load(attachmentCollection);
context.executeQueryAsync(getUpdatedDataSucceeded, onError);
}
function getUpdatedDataSucceeded() {
alert("# of extensible elements: " + exElementsCollection.get_count() +
"\\n# of comments: " + commentsCollection.get_count() +
"\\n# of decision options: " + decisionsCollection.get_count() +
"\\n# of attachments: " + attachmentCollection.get_count() +
"\\n# of participants: " + participantsCollection.get_count());
}
function onError(sender, e) {
alert("Request failed. " + e.get_message() +
"\\n" + e.get_stackTrace());
}
}
// Retrieves a query string value.
function getQueryStringParameter(paramToRetrieve) {
var params = document.URL.split("")[1].split("&");
var strParams = "";
for (var i = 0; i < params.length; i = i + 1) {
var singleParam = params[i].split("=");
if (singleParam[0] == paramToRetrieve)
return singleParam[1];
}
}
Ouvrez le fichier AppManifest.xml.
Dans les Demandes d'autorisation, sélectionnez l' étendue, Web et autorisation et définir la valeur de la lire .
Appuyez sur F5 pour déployer la solution sur le site de flux de travail duet.
Accédez à Mes tâches de flux de travail. Sélectionnez Afficher les détails dans le menu ECB ou sélectionnez une tâche, puis appuyez sur Afficher les détails dans le ruban. Vous serez redirigé vers ViewDetails.aspx où vous verrez une alerte contenant le nombre pour certains des éléments associés au flux de travail.
À l'aide de code HTML et JavaScript pour restituer l'interface utilisateur personnalisée
Dans ViewDetails.aspx, remplacez le code suivant par votre propre HTML et le JavaScript pour restituer votre propre interface utilisateur personnalisée.
alert("# of extensible elements: " + exElementsCollection.get_count() +
"\\n# of comments: " + commentsCollection.get_count() +
"\\n# of decision options: " + decisionsCollection.get_count() +
"\\n# of attachments: " + attachmentCollection.get_count() +
"\\n# of participants: " + participantsCollection.get_count());
Ajout de contrôle Lync à votre page de détails
Voici une option pour votre interface utilisateur personnalisée. Ajout d'un contrôle Lync vous donnera la possibilité de communiquer avec vos contacts Lync à partir de la page personnalisée.
Pour ajouter un contrôle Lync :
Droit sur le dossier Scripts dans l'Explorateur de solutions, ajoutez un fichier JavaScript et nommez-le People.js.
Le balisage suivant sera :
Ajoutez le contrôle de la présence pour les participants de la tâche.
Intégration de Lync dans la légende des participants pour la collaboration d'un seul clic de la tâche.
Collez le code suivant dans la page People.js.
var presenceControlCount = 0;
var appWebURL = '';
function AddPeopleControl(userName) {
var id = "pc_participants_" + presenceControlCount++;
var prevId = null;
return "<div id='" + id + "' ></div>" +
"<script>" +
"LoadPeopleControl('" +id+ "', '" +prevId+ "', '" +userName+ "');" +
"</script>";
}
function LoadPeopleControl(elemId, prevId, user) {
var prevElement = null;
var element = $("#" + elemId);
user = "fareast\\\\" + user.toLowerCase();
GetUsersInfo(user, element, prevElement);
}
function GetUsersInfo(accountName, htmlElement, waitforElement) {
var clientContext = SP.ClientContext.get_current();
var website = clientContext.get_web();
clientContext.load(website);
clientContext.executeQueryAsync(onRequestSucceeded, onRequestFailed);
function onRequestSucceeded() {
appWebURL = website.get_url();
var queryURL = appWebURL +
"/_api/SP.UserProfiles.PeopleManager/GetPropertiesFor(accountName=@v)?@v='"
+ accountName + "'";
jQuery.ajax({
url: queryURL,
type: "GET",
headers: {
"ACCEPT": "application/json;odata=verbose"
},
success: function (data) {
var html = [];
var i = 0;
var id = htmlElement[0].id + "_";
var about_info;
if (data.d.UserProfileProperties != null) {
for (i = 0; i < data.d.UserProfileProperties.results.length; i++) {
if (data.d.UserProfileProperties.results[i].Key == "AboutMe") {
about_info = data.d.UserProfileProperties.results[i].Value;
}
}
}
var email = data.d.Email;
var profileUrl = data.d.UserUrl;
var pictureUrl = data.d.PictureUrl;
var name = data.d.DisplayName;
if (name == null) {
name = accountName;
}
var isFollowed = data.d.IsFollowed;
var html = [
"<table>",
"<tr>",
"<td>",
"<span class='ms-spimn-presenceWrapper ms-spimn-imgSize-5x48'> ",
"<img id='imn_" + id + "_" + i++ + ",type=smtp'" ,
"onload=\\"IMNRC('", email, "')\\" ",
"class='ms-spimn-img ms-spimn-presence-offline-5x48x32 '",
"title='' name='imnmark' alt='Offline' ",
"src='/_layouts/15/images/spimn.png' ",
"sip='" + email + "' showofflinepawn='1'>",
"</span>",
"</td>",
"<td>",
"<span class='ms-imnSpan'>",
"<a class='ms-imnlink' tabindex='-1'",
"onclick='IMNImageOnClick(event);return false;' href='#'>",
"<img id='imn_" + id + "_" + i++ + ",type=smtp'",
"onload=\\"IMNRC('", email, "')\\"",
"class=' ms-hide' title='' name='imnmark' alt='Away' ",
"src='/_layouts/15/images/spimn.png' ",
"sip='" + email + "' showofflinepawn='1'>",
"</a>",
"<a class='ms-subtleLink ms-peopleux-imgUserLink' ",
"onclick='GoToLinkOrDialogNewWindow(this);return false;' ",
"href='" + profileUrl + "'>",
"<span style='width: 48px; height: 48px;'" ,
"class='ms-peopleux-userImgWrapper'>",
"<img style='cliptop: 0px; clipright: 48px;" ,
"clipbottom: 48px; clipleft: 0px; ",
"min-height: 48px; min-width: 48px; max-width: 48px;' ",
"class='ms-peopleux-userImg' alt='' src='" +pictureUrl+ "'>",
"</span>",
"</a>",
"</span>",
"</td>",
"<td>",
"<span class='ms-spimn-presenceWrapper ms-spimn-imgSize-5x48'>",
"<img id='imn_" + id + "_" + i++ + ",type=smtp' ",
"onload=\\"IMNRC('", email, "')\\" ",
"class='ms-spimn-img ms-spimn-presence-offline-5x48x32' ",
"title='' name='imnmark' alt='Offline' ",
"src='/_layouts/15/images/spimn.png' ",
"sip='" + email + "' showofflinepawn='1'>",
"</span>",
"</td>",
"<td>",
"<span class='ms-microfeed-userName ms-textLarge' ",
"style='font-size: medium;'>" + name + "<br/>",
"<div id='people_callout_" + id + "_" + i + "' ",
"class='ms-microfeed-button ms-textSmall" +
"ms-secondaryCommandLink ms-microfeed-footerButton' ",
"align='center' ",
"style='cursor:pointer; font-size:small;' > more... </div>",
"<script>",
"RegisterCallOut(\\"people_callout_" + id + "_" + i +
"\\",\\"" + name + "\\",\\"" + encodeURI(about_info) +
"\\",\\"" + profileUrl + "\\",\\"" + isFollowed + "\\");",
"</script>",
"</span>",
"</td>",
"</tr>",
"</table>",
];
htmlElement.html(html.join(''));
}
});
}
function onRequestFailed(sender, args) {
alert('Error: ' + args.get_message());
}
}
function RegisterCallOut(divId, displayName, aboutme, userUrl, isFollowed) {
if (typeof CalloutManager !== "object" || typeof Callout !== "function" || typeof CalloutAction !== "function")
return;
var launchdiv = document.getElementById(divId);
var calloutId = divId + "_callout";
var html = [];
html.push("<br/>");
if (aboutme == "") {
html.push("No Information Found about this person.");
}
else {
html.push(decodeURI(aboutme));
}
html.push("<hr/>");
if (isFollowed == true) {
html.push("<div>You are <b>following</b> this person</div>");
}
else {
html.push("<div >You are <b>not following</b> this person</div>");
}
var callout = CalloutManager.createNew({
launchPoint: launchdiv,
openOptions: {
closeCalloutOnBlur: true,
event: "click",
showCloseButton: true
},
ID: calloutId,
title: displayName,
content: html.join("")
});
callout.addAction(new CalloutAction({
text: "View Profile", onClickCallback:
function (calloutActionClickEvent, calloutAction) {
window.open(userUrl);
}
}));
}
Notes
[!REMARQUE] Le nom d'utilisateur du participant dans le réseau d'entreprise est la même que celle dans SAP.
Ouvrez la page du fichier AppManifest.xml.
Dans les Demandes d'autorisation, sélectionnez l' étendue, les autorisations et les profils utilisateur et affectez-lui la valeur à lire .
Copiez le code suivant et collez-le dans la section
PlaceHolderAdditionalPageHeaddans ViewDetails.aspx.
<script src="../Scripts/People.js" type="text/javascript"></script>
- Pour ajouter le contrôle de la présence d'un participant, appelez les éléments suivants :
AddPeopleControl(userName);