Partilhar via


Criar controles de UX usando suplementos hospedados pelo provedor do SharePoint

Crie controles de UX em suplementos hospedados pelo provedor do SharePoint que funcionam e se comportam como controles de UX na Web do host.

O artigo descreve três exemplos que mostram como implementar controles de UX no suplemento hospedado pelo provedor:

Esses exemplos usam o JavaScript e o JSOM para se comunicar com o SharePoint e usam a biblioteca entre domínios para lidar com chamadas de função do suplemento para o domínio do site do host.

Observação

The code in this article is provided as-is, without warranty of any kind, either express or implied, including any implied warranties of fitness for a particular purpose, merchantability, or non-infringement.

Controle de Seletor de Pessoas

O exemplo Core.PeoplePicker mostra como implementar um controle de seletor de pessoas em um suplemento hospedado pelo provedor. Quando o usuário começa a digitar um nome na caixa de entrada de texto, o controle pesquisa o repositório de perfil do usuário para possíveis correspondências e os exibe na interface do usuário. O suplemento exibe um controle de seletor de pessoas configurável e extensível que é executado em um host remoto e consulta o repositório de perfil de usuário no site do host para corresponder às entradas do usuário.

Pessoas controle de seletor

Pessoas controle de seletor

Observação

A solução do Visual Studio para o exemplo contém um módulo chamado "Dummy" para garantir que, quando o suplemento for implantado, ele crie um suplemento na Web. Uma Web de suplemento é necessária para chamadas entre domínios.

A pasta Scripts do projeto Core.PeoplePickerWeb contém arquivos app.js e peoplepickercontrol.js (juntamente com as pessoas que escolhem arquivos de recursos para obter suporte adicional ao idioma). O arquivo app.js busca o contexto do cliente usando a biblioteca entre domínios e conecta o HTML no arquivo Default.aspx no controle de seletor de pessoas. O arquivo Default.aspx contém as <div> marcas que implementam a caixa de texto e o recurso de pesquisa de pessoas.

<div id="divAdministrators" class="cam-peoplepicker-userlookup ms-fullWidth">
  <span id="spanAdministrators"></span>
<asp:TextBox ID="inputAdministrators" runat="server" CssClass="cam-peoplepicker-edit" Width="70"></asp:TextBox>
</div>
<div id="divAdministratorsSearch" class="cam-peoplepicker-usersearch ms-emphasisBorder"></div>
<asp:HiddenField ID="hdnAdministrators" runat="server" />


O arquivo app.js então cria e configura um controle de seletor de pessoas.

//Make a people picker control.
//1. context = SharePoint Client Context object
//2. $('#spanAdministrators') = SPAN that will 'host' the people picker control
//3. $('#inputAdministrators') = INPUT that will be used to capture user input
//4. $('#divAdministratorsSearch') = DIV that will show the 'drop-down' of the picker
//5. $('#hdnAdministrators') = INPUT hidden control that will host resolved users
peoplePicker = new CAMControl.PeoplePicker(context, $('#spanAdministrators'), $('#inputAdministrators'), $('#divAdministratorsSearch'), $('#hdnAdministrators'));
// required to pass the variable name here!
peoplePicker.InstanceName = "peoplePicker";
// Hook up everything.
peoplePicker.Initialize();


O controle de seletor de pessoas consulta o objeto ClientPeoplePickerWebServiceInterface na biblioteca JSOM para iniciar pesquisas de usuários cujos nomes correspondem às cadeias de caracteres inseridas.

if (searchText.length >= parent.GetMinimalCharactersBeforeSearching()) {
                            resultDisplay = 'Searching...';
                            if (typeof resultsSearching != 'undefined') {
                                resultDisplay = resultsSearching;
                            }

                  var searchbusy = parent.Format('<div class=\'ms-emphasisBorder\' style=\'width: 400px; padding: 4px; border-left: none; border-bottom: none; border-right: none; cursor: default;\'>{0}</div>', resultDisplay);
                            parent.PeoplePickerDisplay.html(searchbusy);
                            // Display the suggestion box.
                            parent.ShowSelectionBox();

                   var query = new SP.UI.ApplicationPages.ClientPeoplePickerQueryParameters();
                            query.set_allowMultipleEntities(false);
                            query.set_maximumEntitySuggestions(2000);
                            query.set_principalType(parent.GetPrincipalType());
                            query.set_principalSource(15);
                            query.set_queryString(searchText);
                            var searchResult = SP.UI.ApplicationPages.ClientPeoplePickerWebServiceInterface.clientPeoplePickerSearchUser(parent.SharePointContext, query);

                  // Update the global queryID variable so that you can correlate incoming delegate calls.
                            parent._queryID = parent._queryID + 1;
                            var queryIDToPass = parent._queryID;
                            parent._lastQueryID = queryIDToPass;

                  // Make the SharePoint request.
                            parent.SharePointContext.executeQueryAsync(Function.createDelegate(this, function () { parent.QuerySuccess(queryIDToPass, searchResult); }),
                                                Function.createDelegate(this, function () { parent.QueryFailure(queryIDToPass); }));

Controle de menu taxonomia

O exemplo Core.TaxonomyMenu mostra como implementar um controle de menu de taxonomia localizável que é preenchido do repositório de termos em um suplemento hospedado pelo provedor. O suplemento também configura o termo de armazenamento de idiomas, grupos, conjuntos e termos necessários para preencher o menu e verifica a preferência de idioma do usuário para definir o idioma de exibição.

O suplemento implementa uma classe TaxonomyHelper (CSOM) que configura o repositório de termos e o preenche com termos. Em seguida, ele carrega na pasta raiz do site um arquivo JavaScript que exibe os links de navegação.

O suplemento configura o armazenamento de termos no site do host. Ele usa objetos e métodos CSOM para criar um grupo de termos e definir e, em seguida, popula o termo definido com quatro termos.

Tela de configuração do repositório de termos

Tela de configuração do repositório de termos

Ao escolher o botão Configurar o armazenamento de termos , o suplemento:

  • Verifique se os idiomas necessários (inglês, alemão, francês e sueco) estão habilitados no repositório de termo.
  • Cria um grupo de termos e um conjunto de termos e preenche o termo definido com quatro novos termos.

O código a seguir na classe TaxonomyHelper verifica se os idiomas necessários estão habilitados e, se não estiverem, ele os habilita.

var languages = new int[] { 1031, 1033, 1036, 1053 };
            Array.ForEach(languages, l => { 
                if (!termStore.Languages.Contains(l)) 
                    termStore.AddLanguage(l); 
            });

            termStore.CommitAll();
            clientContext.ExecuteQuery();

// Create the term group.
termGroup = termStore.CreateGroup("Taxonomy Navigation", groupId);
                clientContext.Load(termGroup);
                clientContext.ExecuteQuery();

Por fim, o código a seguir na mesma classe TaxonomyHelper cria cada novo termo, juntamente com rótulos para as línguas alemã, francesa e sueca. Ele também define um valor para a propriedade _Sys_Nav_SimpleLinkUrl , que é equivalente à propriedade Link Simples ou Cabeçalho na Ferramenta de Gerenciamento de Armazenamento de Termos. Nesse caso, a URL de cada termo aponta de volta para o site raiz.

var term = termSet.CreateTerm(termName, 1033, Guid.NewGuid());
term.CreateLabel(termNameGerman, 1031, false);
term.CreateLabel(termNameFrench, 1036, false);
term.CreateLabel(termNameSwedish, 1053, false);
term.SetLocalCustomProperty("_Sys_Nav_SimpleLinkUrl", clientContext.Web.ServerRelativeUrl);

Em seguida, o suplemento insere o arquivo topnav.js na pasta raiz do site do host. Este arquivo contém o JavaScript que insere os links deste termo definidos na navegação da página inicial do site do host. A interface do usuário do suplemento também mostra como os links de navegação serão exibidos no site do host após o suplemento carregar o arquivo JavaScript.

O código a seguir no arquivo topnav.js usa JSOM para marcar para o idioma preferido do usuário.

var targetUser = "i:0#.f|membership|" + _spPageContextInfo.userLoginName;
        context = new SP.ClientContext.get_current();
var peopleManager = new SP.UserProfiles.PeopleManager(context);
var userProperty = peopleManager.getUserProfilePropertyFor(targetUser, "SPS-MUILanguages");

Em seguida, o suplemento determina se a preferência de idioma do usuário corresponde a um dos idiomas habilitados. Se encontrar uma correspondência, o código a seguir obterá os termos e os rótulos associados para o idioma preferido do usuário.

while (termEnumerator.moveNext()) {
    var currentTerm = termEnumerator.get_current();
    var label = currentTerm.getDefaultLabel(lcid);

    termItems.push(currentTerm);
    termLabels.push(label);
    context.load(currentTerm);

Por fim, o código a seguir no arquivo topnav.js insere links que contêm os termos no elemento de navegação superior do site de host.

html += "<ul style='margin-top: 0px; margin-bottom: 0px;'>"
        for (var i in termItems) {
            var term = termItems[i];
            var termLabel = termLabels[i];
            var linkName = termLabel.get_value() != 0 ? termLabel.get_value() : term.get_name();
            var linkUrl = term.get_localCustomProperties()['_Sys_Nav_SimpleLinkUrl'];

            html += "<li style='display: inline;list-style-type: none; padding-right: 20px;'><a href='" + linkUrl + "'>" + linkName + "</a></li>";
        }
        html += "</ul>";

        $('#DeltaTopNavigation').html(html);
        SP.UI.Notify.removeNotification(nid);

Controle do seletor de taxonomia

O exemplo Core.TaxonomyPicker mostra como implementar um controle de seletor de taxonomia em um suplemento hospedado pelo provedor. Quando o usuário começa a digitar um termo na caixa de entrada de texto, o controle pesquisa o armazenamento de termos para possíveis correspondências e exibe-os em uma lista na caixa de entrada.

O suplemento cria uma página HTML que está em conformidade com os requisitos do seletor de taxonomia JSOM e, em seguida, adiciona e configura o controle. Ele usa a biblioteca JSOM para consultar o repositório de termos do site de host. O seletor de taxonomia se comunica com o Serviço de Metadados Gerenciados do SharePoint, que requer permissão de gravação no escopo de permissão de taxonomia para que ele possa ler de conjuntos de termos fechados e gravar para abrir conjuntos de termos. Verifique se o arquivo AppManifest.xml definiu a permissão de gravação no escopo apropriado.

A pasta Scripts do projeto Core.TaxonomyPicker contém arquivos app.js e taxonomypickercontrol.js (juntamente com um arquivo de recurso do seletor de taxonomia para suporte adicional ao idioma). O arquivo app.js busca o contexto do cliente usando a biblioteca entre domínios e conecta o HTML no arquivo Default.aspx no controle do seletor de taxonomia. O arquivo Default.aspx contém o campo oculto que implementa a caixa de texto e a funcionalidade do seletor de taxonomia. Ele também adiciona uma lista com marcadores para exibir sugestões retornadas do repositório de termos.

<div style="left: 50%; width: 600px; margin-left: -300px; position: absolute;">
            <table>
                <tr>
                    <td class="ms-formlabel" valign="top"><h3 class="ms-standardheader">Keywords Termset:</h3></td>
                    <td class="ms-formbody" valign="top">
                        <div class="ms-core-form-line" style="margin-bottom: 0px;">
                            <asp:HiddenField runat="server" id="taxPickerKeywords" />
                        </div>
                    </td>
                </tr>
            </table>

            <asp:Button runat="server" OnClick="SubmitButton_Click" Text="Submit" />

            <asp:BulletedList runat="server" ID="SelectedValues" DataTextField="Label" />
</div>

O arquivo app.js cria e configura um controle de seletor de taxonomia.

// Load scripts for calling taxonomy APIs.
                    $.getScript(layoutsRoot + 'init.js',
                        function () {
                            $.getScript(layoutsRoot + 'sp.taxonomy.js',
                                function () {
                                    // Bind the taxonomy picker to the default keywords term set.
                                    $('#taxPickerKeywords').taxpicker({ isMulti: true, allowFillIn: true, useKeywords: true }, context);
                                });
                        });


O controle do seletor de taxonomia usa o código a seguir para abrir uma instância taxonomySession no JSOM para carregar todos os termos do armazenamento de termos.

// Get the taxonomy session by using CSOM.
            var taxSession = SP.Taxonomy.TaxonomySession.getTaxonomySession(spContext);
            //Use the default term store...this could be extended here to support additional term stores.
            var termStore = taxSession.getDefaultSiteCollectionTermStore();

            // Get the term set based on the properties of the term set.
            if (this.Id != null)
                this.RawTermSet = termStore.getTermSet(this.Id); // Get term set by ID.
            else if (this.UseHashtags)
                this.RawTermSet = termStore.get_hashTagsTermSet(); // Get the hashtags term set.
            else if (this.UseKeywords)
                this.RawTermSet = termStore.get_keywordsTermSet(); // Get the keywords term set.

            // Get all terms for the term set and organize them in the async callback.
            this.RawTerms = this.RawTermSet.getAllTerms();
            spContext.load(this.RawTermSet);
            spContext.load(this.RawTerms);
            spContext.executeQueryAsync(Function.createDelegate(this, this.termsLoadedSuccess), Function.createDelegate(this, this.termsLoadedFailed));

O controle do seletor de taxonomia procura possíveis correspondências dos termos carregados e adiciona novos termos ao armazenamento de termos conforme necessário.

Confira também