Personalizar listas e bibliotecas "modernas"

Em 2016, a equipe do SharePoint Online lançou listas de documentos e bibliotecas "modernas", que proporcionam uma melhor experiência ao usuário que é mais rápida, mais intuitiva e responsiva. As experiências "modernas" trazem muitos benefícios, e é altamente recomendável usá-las. Se suas personalizações atuais ainda não funcionam com a experiência "moderna", é hora de revisá-las para que seus usuários possam se beneficiar dessas grandes melhorias:

  • As bibliotecas de documentos "modernas" têm uma interface de usuário atualizada que oferece uma experiência semelhante ao OneDrive, por isso é mais intuitivo criar uma nova pasta e carregar arquivos no navegador.

  • Você pode selecionar Fixar no início para adicionar documentos “acima da dobra” em qualquer visualização na tela.

  • Copiar não é novidade, mas os gestos de cópia e movimentação são inteligentes para exibir sua arquitetura de informações e permitir que você crie novas pastas em tempo real.

  • Você não precisará mais fazer tantas cópias. Bibliotecas de documentos são inteligentes quanto a lembrar de outros arquivos que você está usando no SharePoint, para que você possa importar outros arquivos de outras bibliotecas como links, sem ter que duplicar arquivos entre vários sites.

  • As novas bibliotecas de documentos permitem agrupar arquivos diretamente na página principal, sem selecionar uma tela de administração separada. Você também pode arrastar para alterar o tamanho de suas colunas, assim como classificar, filtrar e agrupar de qualquer cabeçalho de coluna.

  • Os navegadores móveis têm os mesmos recursos da área de trabalho, tornando o SharePoint produtivo para todos os usuários, independentemente de interagirem por meio de mouse, teclado, toque ou leitor de tela.

  • Agora você pode editar os metadados diretamente a partir da exibição principal no painel de informações. Não será mais preciso clicar em várias telas para aplicar uma atualização!

  • Graças à integração do Office Online, você pode navegar por uma exibição completa do documento na parte superior do painel de informações. O painel oferece metadados, incluindo o histórico de atividades recentes, atualizações no arquivo e quem recebeu um compartilhamento do arquivo.

Este artigo enfoca as opções de extensibilidade dentro das experiências de bibliotecas e listas "modernas". No entanto, se quiser saber mais sobre as funcionalidades oferecidas pelas experiências "modernas", confira os seguintes recursos:

No restante deste artigo, usaremos o modo "moderno" para a nova experiência do usuário e "clássico" para a experiência do usuário herdada.

Importante

Não estamos substituindo a experiência "clássica", ambas coexistirão.

Visão geral das opções de personalização

Listas e bibliotecas "modernas" não oferecem suporte a tantas opções de personalização quanto as listas e bibliotecas "clássicas". Neste artigo, fornecemos detalhes e exemplos das opções com suporte. A equipe do SharePoint está trabalhando para oferecer mais opções no futuro. A lista a seguir fornece uma visão geral rápida dos recursos com suporte para listas e bibliotecas "modernas":

  • Subconjunto de ações personalizadas do usuário
  • Identidade visual personalizada
  • Integração do Flow e do PowerApps

Atualmente, essas personalizações não são compatíveis com listas e bibliotecas "modernas":

  • Personalizações de campo baseadas em JSLink (consulte a observação nas Extensões da Estrutura do SharePoint)
  • Personalizações de exibição baseadas em JSLink (consulte a observação nas Extensões da Estrutura do SharePoint)
  • CSS personalizada por meio da propriedade da Web AlternateCSSUrl
  • JavaScript personalizado inserido por meio de ações personalizadas do usuário (confira a observação em Extensões da Estrutura do SharePoint)
  • Páginas mestras personalizadas (uma identidade visual mais extensa será compatível posteriormente usando opções alternativas)
  • Personalização via InfoPath
  • Estratégia de download mínimo (MDS)
  • Publicação do SharePoint Server

Observação

Em junho de 2017, as Extensões da Estrutura do SharePoint entraram em versão prévia para desenvolvedores. Ao usar essas Extensões de Estrutura do SharePoint, você pode controlar a renderização de um campo por meio de um código personalizado, bem como criar ações de usuário personalizadas que executem seu código personalizado. Para obter mais informações, confira Visão geral das Extensões da Estrutura do SharePoint.

Ações personalizadas do usuário

As experiências "modernas" permitem que certas ações personalizadas do usuário sejam exibidas na nova interface do usuário, mas nem todas as configurações de ação do usuário com suporte pelo modo "clássico" têm suporte na experiência "moderna". A tabela a seguir fornece uma visão geral de alto nível dos locais de ações personalizadas com suporte e como eles são exibidos na interface "moderna":

Local de ação personalizada do usuário Visível na interface do usuário "moderna"
EditControlBlock Sim, essas entradas aparecem como itens de menu personalizados.
CommandUI.Ribbon Sim, essas entradas aparecem como itens da barra de ferramentas.
Todos os outros locais (por exemplo scriptlink) Infelizmente, essas ações personalizadas do usuário não funcionarão.

Observação

Essas ações personalizadas aparecem em listas e bibliotecas "modernas" somente quando você está em sites "clássicos" com a interface do usuário "moderna" ativada. Por padrão, eles não aparecem em sites "modernos" porque não é possível adicionar ações personalizadas do usuário a sites "modernos", pois eles têm a opção NoScript ativada. No entanto, você pode desativar o NoScript em sites "modernos" para obter o mesmo comportamento de listas e bibliotecas "modernas" em sites "clássicos" e "modernos".

Ações personalizadas do usuário EditControlBlock

A adição de links personalizados ao menu de contexto pode ser feita usando o EditControlBlock como o local para sua ação personalizada. O seguinte XML de provisionamento PnP cria duas entradas personalizadas.

<pnp:ProvisioningTemplate ID="EditControlBlockSamples" Version="1" xmlns:pnp="http://schemas.dev.office.com/PnP/2015/12/ProvisioningSchema">
  <pnp:CustomActions>
    <pnp:SiteCustomActions>
      <pnp:CustomAction Name="CA_1" Description="ca 1" Location="EditControlBlock" RegistrationType="List" RegistrationId="101" Title="CA 1 Title" Sequence="3000" Url="https://contoso.azurewebsites.net/pages/index.aspx" Enabled="true"/>
      <pnp:CustomAction Name="CA_2" Description="ca 2" Location="EditControlBlock" RegistrationType="ContentType" RegistrationId="0x0101" Title="CA 2 Title" Sequence="4000" Url="https://contoso.azurewebsites.net/pages/index.aspx" Enabled="true"/>
    </pnp:SiteCustomActions>
  </pnp:CustomActions>
</pnp:ProvisioningTemplate>

Você pode aplicar esse modelo de provisionamento PnP a um site usando a biblioteca PnP Core ou o PnP PowerShell. Optamos por mostrar a abordagem do PowerShell neste artigo. Uma primeira etapa é instalar o módulo PnP PowerShell. Depois disso, salve o XML de provisionamento PnP em um arquivo e as duas linhas simples do PnP PowerShell são suficientes para aplicar o modelo:


# Connect to a previously created Modern Site
$cred = Get-Credential
Connect-PnPOnline -Url https://[tenant].sharepoint.com/sites/siteurl -Credentials $cred

# Apply the PnP provisioning template
Apply-PnPProvisioningTemplate -Path c:\customaction_modern_editcontrolblock.xml -Handlers CustomActions

Observação

O PnP PowerShell é uma solução de software livre com uma comunidade ativa de suporte. Não há nenhuma SLA para o suporte da ferramenta de software livre por parte da Microsoft.

Se você atualizar a visualização "moderna" de uma biblioteca de documentos em seu site, verá as novas entradas.

Ações personalizadas de EditControlBlock visíveis no menu

Ações personalizadas de EditControlBlock visíveis no menu

Observação

  • Se você estiver tentando isso em um site de equipe "moderno" em que você desativou a opção NoScript, use a versão de abril de 2017 ou posterior do PnP-PowerShell. Se preferir, use a versão atual do desenvolvedor.
  • Se você quiser usar essa amostra para uma lista, defina o atributo RegistrationId como 100.

Ações personalizadas do usuário CommandUI.Ribbon

Se você quiser estender a barra de ferramentas na lista "moderna" e nas experiências de biblioteca, poderá fazê-lo adicionando uma ação personalizada do usuário visando o local CommandUI.Ribbon, conforme mostrado nesta amostra XML de provisionamento PnP.

<pnp:ProvisioningTemplate ID="CommandUIRibbonSamples" Version="1" xmlns:pnp="http://schemas.dev.office.com/PnP/2015/12/ProvisioningSchema">
  <pnp:CustomActions>
    <pnp:SiteCustomActions>
      <pnp:CustomAction Name="CA_4" Description="ca 4" Location="CommandUI.Ribbon" RegistrationType="List" RegistrationId="101" Title="CA 4 Title" Sequence="6000" Enabled="true">
        <pnp:CommandUIExtension>
          <CommandUIDefinitions>
            <CommandUIDefinition Location="Ribbon.Documents.Copies.Controls._children">
              <Button
                Id="Ribbon.Documents.Copies.OfficeDevPnPDownloadAll"
                Command="OfficeDevPnP.Cmd.DownloadAll"
                Image16by16="/_layouts/15/images/sharepointfoundation16.png"
                LabelText="Download All"
                Description="Download all files separately"
                ToolTipTitle="Download All"
                ToolTipDescription="Download all files separately"
                TemplateAlias="o1"
                Sequence="15"/>
            </CommandUIDefinition>
          </CommandUIDefinitions>
          <CommandUIHandlers>
            <CommandUIHandler
              Command="OfficeDevPnP.Cmd.DownloadAll"
              CommandAction="https://contoso.azurewebsites.net/pages/index.aspx" />
          </CommandUIHandlers>
        </pnp:CommandUIExtension>
      </pnp:CustomAction>
      <pnp:CustomAction Name="CA_6" Description="ca 6" Location="CommandUI.Ribbon" RegistrationType="ContentType" RegistrationId="0x0101" Title="CA 6 Title" Sequence="5000" Enabled="true">
        <pnp:CommandUIExtension>
            <CommandUIDefinitions>
              <CommandUIDefinition Location="Ribbon.Tabs._children">
                <Tab Id="Custom Tab" Title="Custom Tab" Description="Custom Tab">
                  <Scaling Id="Custom Tab.Scaling">
                    <MaxSize Id="Custom Group.Scaling.MaxSize" GroupId="Custom Group" Size="TwoLarge" />
                    <MaxSize Id="Custom Group 2.Scaling.MaxSize" GroupId="Custom Group 2" Size="OneLarge" />
                    <Scale Id="Custom Group.Scaling.Scale" GroupId="Custom Group" Size="TwoLarge" />
                    <Scale Id="Custom Group 2.Scaling.Scale" GroupId="Custom Group 2" Size="OneLarge" />
                  </Scaling>
                  <Groups Id="Custom Tab.Groups">
                    <Group Id="Custom Group 2" Title="Custom Group 2" Description="Custom Group 2" Sequence="7888" Template="Ribbon.Templates.OneLarge">
                      <Controls Id="Custom Group 2.Controls">
                        <Button Id="CustomButton3" LabelText="Custom Button 3" Image16by16="/_layouts/15/images/attach16.png" Image32by32="/_layouts/15/images/attach16.png" ToolTipTitle="Custom Button 3" ToolTipDescription="Custom Button 3" Command="CustomButton3.Command" TemplateAlias="c3" />
                      </Controls>
                    </Group>
                    <Group Id="Custom Group" Title="Custom Group 1" Description="Custom Group 1" Sequence="10000" Template="Ribbon.Templates.TwoLarge">
                      <Controls Id="Custom Group 1.Controls">
                        <Button Id="CustomButton1" LabelText="Custom Button 1" Image16by16="/_layouts/15/images/itslidelibrary.png" Image32by32="/_layouts/15/images/itslidelibrary.png" ToolTipTitle="Custom Button 1" ToolTipDescription="Custom Button 1" Command="CustomButton1.Command" TemplateAlias="c1" />
                        <Button Id="CustomButton2" LabelText="Custom Button 2" Image16by16="/_layouts/15/images/dldsln16.png" Image32by32="/_layouts/15/images/dldsln16.png" ToolTipTitle="Custom Button 2" ToolTipDescription="Custom Button 2" Command="CustomButton2.Command" TemplateAlias="c2" />
                      </Controls>
                    </Group>
                  </Groups>
                </Tab>
              </CommandUIDefinition>
              <CommandUIDefinition Location="Ribbon.Templates._children">
                <GroupTemplate Id="Ribbon.Templates.TwoLarge">
                  <Layout Title="TwoLarge" LayoutTitle="TwoLarge"> 
                    <Section Alignment="Top" Type="OneRow"> 
                      <Row> 
                        <ControlRef DisplayMode="Large" TemplateAlias="c1" /> 
                        <ControlRef DisplayMode="Large" TemplateAlias="c2" /> 
                      </Row> 
                    </Section> 
                  </Layout> 
                </GroupTemplate>
              </CommandUIDefinition>
              <CommandUIDefinition Location="Ribbon.Templates._children">
                <GroupTemplate Id="Ribbon.Templates.OneLarge">
                  <Layout Title="OneLarge" LayoutTitle="OneLarge"> 
                    <Section Alignment="Top" Type="OneRow"> 
                      <Row> 
                        <ControlRef DisplayMode="Large" TemplateAlias="c3" /> 
                      </Row> 
                    </Section> 
                  </Layout> 
                </GroupTemplate>
              </CommandUIDefinition>
            </CommandUIDefinitions>
            <CommandUIHandlers>
              <CommandUIHandler Command="CustomButton1.Command" CommandAction="https://contoso.azurewebsites.net/pages/index.aspx" />
              <CommandUIHandler Command="CustomButton2.Command" CommandAction="http://www.bing.com" />
              <CommandUIHandler Command="CustomButton3.Command" CommandAction="https://developer.microsoft.com/sharepoint" />
            </CommandUIHandlers>
        </pnp:CommandUIExtension>
      </pnp:CustomAction>
    </pnp:SiteCustomActions>
  </pnp:CustomActions>
</pnp:ProvisioningTemplate>

Depois de adicionar essas ações personalizadas do usuário, você as verá na barra de ferramentas. Observe que as guias personalizadas são transformadas em um menu suspenso.

Ação personalizada visível na barra de ferramentas

Ação personalizada visível na barra de ferramentas


Observação

  • Se você estiver tentando isso em um site de equipe "moderno" em que você desativou a opção NoScript, use a versão de abril de 2017 ou posterior do PnP-PowerShell. Se preferir, use a versão atual do desenvolvedor.
  • Se você quiser usar essa amostra para uma lista, defina os atributos RegistrationId como 100 e use o seguinte XML para a ação personalizada do usuário CA_4.
	<CommandUIDefinition Location="Ribbon.Templates._children">
	  <Button
	    Id="Ribbon.Templates.OfficeDevPnPDownloadAll"
	    Command="OfficeDevPnP.Cmd.DownloadAll"
	    Image16by16="/_layouts/15/images/sharepointfoundation16.png"
	    LabelText="Download All"
	    Description="Download all files separately"
	    ToolTipTitle="Download All"
	    ToolTipDescription="Download all files separately"
	    TemplateAlias="o1"
	    Sequence="15"/>
	</CommandUIDefinition>

Limitações da ação personalizada do usuário

Ao desenvolver ações personalizadas do usuário que precisam funcionar em experiências "modernas", considere as seguintes limitações:

  • Você não pode controlar completamente a ordem em que as ações personalizadas do usuário são exibidas. As ações personalizadas do usuário são adicionadas na ordem em que _api/web/Lists(guid'listid')/CustomActionElements retorna as ações personalizadas do usuário, e essa API atualmente não leva em consideração os atributos da sequência. Botões definidos dentro de uma guia personalizada podem ser ordenados adicionando-os na ordem correta no xml CommandUIDefinition. Nossa amostra mostra o Botão 3 como primeiro, e isso deve-se à ordem no XML.

  • O agrupamento de ações personalizadas do usuário dentro de uma guia personalizada é orientado pela presença de elementos Button sempre que houver vários elementos Tab ou Group no elemento xml do elemento de ação personalizada do usuário retornado.

  • Ações de comando não podem conter JavaScript. Por exemplo, usar CommandAction="javascript:alert('My custom Action');" significa que a ação personalizada do usuário não será exibida.

  • O uso das propriedades ScriptLink ou ScriptBlock não é possível, pois elas só podem ser usadas com o local de ação personalizada do usuário ScriptLink, que não tem suporte.

  • Usar mapas de imagem (por exemplo,Image16by16="/_layouts/15/1033/images/formatmap16x16.png?rev=33" Image16by16Left="-144" Image16by16Top="-107") não funciona; será preciso especificar imagens individuais. Observe também que apenas imagens 16 x 16 são relevantes.

Identidade visual personalizada

Se o seu site usar um tema personalizado, esse tema personalizado será respeitado na lista "moderna" e nas experiências da biblioteca, conforme mostrado no exemplo a seguir.

Lista moderna com identidade visual personalizada proveniente do tema personalizado

Lista moderna com identidade visual personalizada proveniente do tema personalizado

Configurar a experiência do usuário final

Você tem várias opções para controlar se a experiência de biblioteca e lista "moderna" ou "clássica" é usada. Confira o artigo Ampliar o uso da experiência da biblioteca e das listas modernas para obter mais detalhes.

Quando a detecção automática interna alterna automaticamente a renderização de volta para "clássica"?

O SharePoint usa um sistema de detecção automática para alternar automaticamente a renderização de uma lista para "clássica", supondo que você não desative a experiência "moderna" para sua lista usando as substituições no escopo do site, da Web ou da lista explicadas na seção anterior. Esse sistema de detecção automática alterna automaticamente para "clássico" sempre que o SharePoint detecta que sua lista está usando recursos que (ainda) não têm suporte no modo "moderno".

A seguir estão as configurações que são avaliadas como parte do sistema de detecção automática e que fazem a lista renderizar no modo "clássico":

  • Se a página do formulário de lista solicitada tiver zero ou mais de uma web part nela.

  • (Até julho de 2017) Se o recurso de escopo da web "Navegação e filtragem de metadados" estiver ativado. Estamos implementando o suporte de navegação de metadados gerenciados para listas e bibliotecas "modernas".

  • Se a web part disponível for uma XSLTListViewWebPart (a maneira padrão de renderizar a lista) e:

    • Há um conjunto de valores não padrão JSLink ou XslLink para as propriedades da web part.
    • A página é mostrada em uma caixa de diálogo (IsDlg=1).
    • A lista não é baseada em um dos seguintes tipos: Biblioteca de Documentos (101), Biblioteca de Imagens (109), Biblioteca de Páginas da Web (119), ou Lista Genérica (100). A partir de agosto de 2017, Anúncios (104) e Links (103) são renderizados usando a interface "moderna".
    • A propriedade JSLink é configurada em um dos campos a serem renderizados.
    • Um dos campos para renderizar é do tipo BCS external data, Geolocation, OutcomeChoice, ou um desses tipos de campo de publicação Image, Html, ou SummaryLinks.
    • Há ações personalizadas de usuário no escopo da lista que possuem sua propriedade ScriptSrc definida.
  • Se a parte da Web disponível for um ListFormWebPart e:

    • A página é mostrada em uma caixa de diálogo (IsDlg=1).
    • É uma página de formulário "Novo" para uma biblioteca de documentos.
    • Os campos a serem renderizados não são nenhum desses tipos suportados: Attachments, TaxonomyField, Boolean, Choice, Currency, DateTime, File, Lookup, MultiChoice, MultiLine exceto quando Append com controle de versão está ativado, Number, Text, User, ou Url.

Detectar programaticamente se sua biblioteca/lista será exibida usando o modo "moderno" ou "clássico"

A seção anterior explicou o raciocínio por trás do nosso mecanismo de detecção automática, mas felizmente há uma maneira fácil para você, como desenvolvedor, entender como uma biblioteca/lista será renderizada. Obter essas informações é tão simples quanto obter o valor da propriedade de arquivo PageRenderType, que você pode obter usando CSOM ou REST. Os exemplos a seguir mostram como carregar primeiro a página que está renderizando a lista e, em seguida, obter PageRenderType:

Amostra CSOM

using (var cc = new ClientContext(siteUrl))
{
    cc.Credentials = new SharePointOnlineCredentials(userName, password);
    
    // Load the AllItems.aspx file from the list
    File file = cc.Web.GetFileByServerRelativeUrl("/sites/dev/ECMTest/Forms/AllItems.aspx");
    cc.Load(file, f => f.PageRenderType);
    cc.ExecuteQuery();

    // Check page render type
    Console.WriteLine($"Status = {file.PageRenderType}");
}

Observação

A propriedade PageRenderType foi introduzida na versão de 1º de janeiro de 2017 do CSOM (16.1.6112.1200).


Solicitação REST

GET _api/web/getfilebyserverrelativeurl('/sites/dev/ECMTest/Forms/AllItems.aspx')/pageRenderType

A chamada REST obtém o valor inteiro, explicado na tabela a seguir.

Valor Motivo
0 Indefinido = 0, (que não há informações suficientes para saber o modo de renderização)
1 MultipeWePart
2 JSLinkCustomization
3 XslLinkCustomization
4 NoSPList
5 HasBusinessDataField
6 HasTaskOutcomeField
7 HasPublishingfield
8 HasGeolocationField
9 HasCustomActionWithCode
10 HasMetadataNavFeature
11 SpecialViewType
12 ListTypeNoSupportForModernMode
13 AnonymousUser
14 ListSettingOff
15 SiteSettingOff
16 WebSettingOff
17 TenantSettingOff
18 CustomizedForm
19 DocLibNewForm
20 UnsupportedFieldTypeInForm
21 InvalidFieldTypeInForm
22 InvalidControModeInForm
23 CustomizedPage
24 ListTemplateNotSupported
100 Modern

Considerações adicionais

Apresentaremos mais opções de personalização para as experiências "modernas" de listas e bibliotecas gradualmente. Elas serão alinhadas com o lançamento de recursos adicionais do SharePoint Framework. Atualmente não há programação exata disponível, mas atualizaremos os artigos de experiência "modernos" sempre que novos recursos forem lançados.

Confira também