Compartir a través de


Aprovechar al máximo el uso de listas y bibliotecas modernas

Este artículo describe cómo obtener el máximo número de listas y bibliotecas al usar la interfaz de usuario moderna en SharePoint.

Todavía no puede transformar todas las listas y bibliotecas con la experiencia moderna porque:

  • El equipo de SharePoint no ha compilado aún algunos tipos de listas y bibliotecas para que aparezcan en una interfaz de usuario moderna, por ejemplo las listas de tareas o las listas de eventos. Para acceder a estas podría esperar a que el equipo de SharePoint implemente una versión moderna o cambiar a una opción equivalente. Estas opciones incluyen usar Microsoft Planner en lugar de una Lista de tareas clásica o usar el calendario de su grupo de Microsoft 365 en lugar de un calendario clásico de lista de eventos de SharePoint.

  • Hay algunos tipos de listas y bibliotecas que se pueden mostrar en la interfaz moderna, pero que están bloqueados debido a una configuración o personalización incompatibles. Y aquí sí puede intervenir.

Importante

Las herramientas de modernización y todos los demás componentes PnP son herramientas de código abierto sostenidas por una comunidad activa que proporciona soporte técnico. Los canales oficiales de soporte técnico de Microsoft no ofrecen ningún contrato de nivel de servicio para herramientas de código abierto.

Plantillas de listas disponibles en la interfaz de usuario moderna

Estos son los tipos de plantillas de lista más comunes que SharePoint puede mostrar actualmente en una interfaz de usuario moderna (a partir de octubre de 2018):

  • Lista (100)
  • Biblioteca de documentos (101)
  • Lista de vínculos (103)
  • Lista de anuncios (104)
  • Lista de contactos (105)
  • Biblioteca de imágenes (109)
  • Biblioteca de formularios (115)
  • Biblioteca de páginas de sitio (119)
  • Cuadrícula personalizada (120)
  • Lista de vínculos promocionados (170)
  • Biblioteca de páginas de publicación (850)
  • Biblioteca de activos (851)
  • Lista de seguimiento de problemas (1100)

En esta sección aprenderá a identificar listas que no se muestran como una lista moderna, el motivo de que sea así y cómo solucionarlo (si es posible). Pero antes de pasar a esto, es importante tener en cuenta que en la mayor parte de espacios empresariales vemos que la mayoría de las listas se cargan en moderna sin problemas. Las listas que no se cargan de forma moderna o bien se mantienen en la forma clásica (por ejemplo, la lista de calendario o de tareas), o bien pueden estar desbloqueadas corrigiendo los errores, que es lo que se aborda en esta serie de artículos. Las listas que no se cargan como listas modernas son completamente válidas para el uso, totalmente compatibles y no deberían impedirle habilitar la experiencia de listas y bibliotecas modernas del espacio empresarial.

Importante

SharePoint usará automáticamente y de forma predeterminada listas y bibliotecas modernas, pero también cambiará automáticamente cuando sea necesario. Esto garantizará que todas las listas que pueden usar la forma moderna se presenten como una lista moderna mientras que las listas que no puedan simplemente cambiarán a la forma clásica al usarlas.

Detectar listas y bibliotecas que no están disponibles en la interfaz de usuario moderna

El enfoque recomendado para averiguar qué listas y bibliotecas no se muestran en la interfaz moderna es ejecutar el Analizador de modernización de SharePoint. Esta herramienta realiza un análisis en profundidad de todas las listas y bibliotecas del espacio empresarial y crea informes que le proporcionan detalles sobre las listas y bibliotecas que no se muestran en la interfaz moderna y, lo que es más importante, por qué sucede esto. Según el resultado del analizador, puede desbloquear las listas y bibliotecas corrigiéndolas, tema que se trata en el capítulo siguiente.

Desbloquear listas y bibliotecas

Una lista se puede bloquear por uno o varios motivos, que se describen en el resultado del analizador. A continuación encontrará los motivos típicos y sus métodos de corrección.

Personalizaciones incompatibles

Una personalización incompatible es la razón más común por la que las listas no se muestran en la interfaz moderna, y suele ser debido a uno de estos procedimientos:

  • Uso de JSLink
  • Uso de una acción personalizada del usuario que inserta JavaScript

Para solucionar estos bloqueadores, puede eliminar la personalización (en caso de que ya no sea relevante para la empresa) o crear una solución alternativa. Para obtener más información sobre cómo crear las personalizaciones que son compatibles con la experiencia de biblioteca y listas modernas consulte el artículo Modernización de las personalizaciones. Puesto que JSLink en el nivel de elemento web impide que la página use la experiencia de listas y bibliotecas modernas, necesita quitar esta configuración. Puede hacerlo manualmente al cambiar la página al modo de edición mediante el anexo de ?ToolPaneView=2&pagemode=edit a la dirección URL de la página y, después, actualizar las propiedades del elemento web. Para hacer esto mediante programación puede obtener el elemento web a través de la clase LimitedWebPartManager y, a continuación, actualizar las propiedades correspondientes tal como se muestra en el siguiente fragmento de código. Puede combinar este fragmento de código con el código más completo que se muestra más adelante en esta página para obtener una solución completa.

webPart.Properties["JSLink"] = "";
webPart.SaveWebPartChanges();
cc.ExecuteQuery();

Existencia de determinados tipos de campos

Ciertos tipos de campo (datos externos BCS, Geolocalización, OutcomeChoice en modo de edición, Image, Html y SummaryLinks) no funcionan aún en una interfaz de usuario moderna. Para corregirlos, puede seguir estos enfoques:

  • Elimine el campo de las vistas. El campo sigue ahí, así que la experiencia de edición es clásica, pero al menos, las vistas son modernas.
  • Migre los datos del campo a un nuevo campo compatible con la interfaz moderna.
  • Anule el campo por completo si no lo está usando.

Bloqueo de interfaz de usuario de biblioteca o moderno en el nivel de sitio o web

Se pueden bloquear la interfaz de usuario moderna de listas y bibliotecas de una colección de sitios completa (nivel de sitio) o uno o más sitios (nivel web). Esto puede remediarse deshabilitando las funciones de ámbito de web o de sitio correspondientes como se muestra en el siguiente fragmento de PowerShell PnP:

$minimumVersion = New-Object System.Version("2.24.1803.0")
if (-not (Get-InstalledModule -Name SharePointPnPPowerShellOnline -MinimumVersion $minimumVersion -ErrorAction Ignore))
{
    Install-Module SharePointPnPPowerShellOnline -MinimumVersion $minimumVersion -Scope CurrentUser
}
Import-Module SharePointPnPPowerShellOnline -DisableNameChecking -MinimumVersion $minimumVersion

Connect-PnPOnline -Url "<your site url>"

# Disable the modern list site level blocking feature
Disable-PnPFeature -Identity "E3540C7D-6BEA-403C-A224-1A12EAFEE4C4" -Scope Site
# Disable the modern list web level blocking feature
Disable-PnPFeature -Identity "52E14B6F-B1BB-4969-B89B-C4FAA56745EF" -Scope Web

Nota:

PnP PowerShell es una solución de código abierto con una comunidad activa que ofrece su soporte. No hay ningún contrato de nivel de servicio para el soporte de la herramienta de código abierto de Microsoft.

Bloqueo de interfaz de usuario de biblioteca o moderno en el nivel de lista

Se puede definir una lista para que siempre ejecute la experiencia clásica a nivel de lista (ListExperienceOptions establecido en ClassicExperience). Puede deshacerlo usando el fragmento de código siguiente:

// Load the list you want to update
var list = context.Web.Lists.GetByTitle(title);
context.Load(list);
context.ExecuteQuery();

// Possible options are Auto (= defaults to modern), NewExperience (= "modern") and ClassicExperience
list.ListExperienceOptions = ListExperience.Auto;

// Persist the changes
list.Update();
context.ExecuteQuery();

Listas que se muestran con BaseTemplate = 0

Cada lista tiene una plantilla de base, pero a veces es posible que vea listas con un valor de plantilla de base 0 en el resultado del escáner. Esto es debido a que para estas listas no hay una vista marcada como predeterminada o a veces no hay ninguna vista en absoluto. La corrección para estas listas es ir a la página de configuración de listas (_layouts/15/listedit.aspx?List=%7B<list id>%7D) y proporcionar una vista a la lista.

Páginas de vista de lista personalizadas que contienen algo más que la lista XSLTListViewWebPart

Los usuarios pueden modificar la vista de lista clásica y las páginas de edición, por lo que se podría, por ejemplo, agregar otros elementos web en una página de vista de lista. Si lo ha hecho, la lista ya no se muestra en la interfaz moderna. Para corregirlo, lo único que puede hacer es eliminar los elementos web agregados de las páginas de lista. Puede comprobar estos casos manualmente yendo a la lista y anexando ?ToolPaneView=2&pagemode=edit a la dirección URL de la lista. Esto cambiará la página al modo de edición y debería mostrar los elementos web adicionales y permitirle quitarlos. Si desea hacerlo mediante programación los fragmentos de código siguientes son una buena base inicial. Este fragmento de código depende de la biblioteca básica de sitios PnP, que puede instalar para el proyecto de Visual Studio a través del paquete nuget SharePointPnPCoreOnline.

using Microsoft.SharePoint.Client;
using Microsoft.SharePoint.Client.WebParts;
using OfficeDevPnP.Core;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security;

namespace MultipleWebPartFixer
{
    class Program
    {
        static void Main(string[] args)
        {
            string siteUrl = "https://contoso.sharepoint.com/sites/demo";
            string userName = "joe@contoso.onmicrosoft.com";
            AuthenticationManager am = new AuthenticationManager();
            using (var cc = am.GetSharePointOnlineAuthenticatedContextTenant(siteUrl, userName, GetSecureString("Password")))
            {
                // Grab the list
                var list = cc.Web.Lists.GetByTitle("listtofix");
                list.EnsureProperties(l => l.RootFolder, l => l.Id);

                bool isNoScriptSite = cc.Web.IsNoScriptSite();

                if (isNoScriptSite)
                {
                    throw new Exception("You don't have the needed permissions to apply this fix!");
                }

                // get the current (allitems) form
                var files = list.RootFolder.FindFiles("allitems.aspx");
                var allItemsForm = files.FirstOrDefault();
                if (allItemsForm != null)
                {
                    // Load web part manager and web parts
                    var limitedWPManager = allItemsForm.GetLimitedWebPartManager(PersonalizationScope.Shared);
                    cc.Load(limitedWPManager);

                    // Load the web parts on the page
                    IEnumerable<WebPartDefinition> webParts = cc.LoadQuery(limitedWPManager.WebParts.IncludeWithDefaultProperties(wp => wp.Id, wp => wp.ZoneId, wp => wp.WebPart.ExportMode, wp => wp.WebPart.Title, wp => wp.WebPart.ZoneIndex, wp => wp.WebPart.IsClosed, wp => wp.WebPart.Hidden, wp => wp.WebPart.Properties));
                    cc.ExecuteQueryRetry();

                    List<WebPartDefinition> webPartsToDelete = new List<WebPartDefinition>();
                    if (webParts.Count() > 1)
                    {
                        // List all except the XsltListView web part(s)
                        foreach (var webPart in webParts)
                        {
                            if (GetTypeFromProperties(webPart.WebPart.Properties) != "XsltListView")
                            {
                                webPartsToDelete.Add(webPart);
                            }
                        }

                        if (webPartsToDelete.Count == webParts.Count() - 1)
                        {
                            foreach(var webPart in webPartsToDelete)
                            {
                                webPart.DeleteWebPart();
                            }
                            cc.ExecuteQueryRetry();
                            Console.WriteLine("List fixed!");
                        }
                        else
                        {
                            // Special case...investigation needed. Go to list and append ?ToolPaneView=2&pagemode=edit to the list url to check the page
                            Console.WriteLine("Go to list and append ?ToolPaneView=2&pagemode=edit to the list url to check this page");
                        }
                    }
                }
            }

            Console.WriteLine("Press enter to continue...");
            Console.ReadLine();
        }

        public static string GetTypeFromProperties(PropertyValues properties)
        {
            // Check for XSLTListView web part
            string[] xsltWebPart = new string[] { "ListUrl", "ListId", "Xsl", "JSLink", "ShowTimelineIfAvailable" };
            if (CheckWebPartProperties(xsltWebPart, properties))
            {
                return "XsltListView";
            }

            return "";
        }
        private static bool CheckWebPartProperties(string[] propertiesToCheck, PropertyValues properties)
        {
            bool isWebPart = true;
            foreach (var wpProp in propertiesToCheck)
            {
                if (!properties.FieldValues.ContainsKey(wpProp))
                {
                    isWebPart = false;
                    break;
                }
            }

            return isWebPart;
        }

        private static SecureString GetSecureString(string label)
        {
            SecureString sStrPwd = new SecureString();
            try
            {
                Console.Write(String.Format("{0}: ", label));

                for (ConsoleKeyInfo keyInfo = Console.ReadKey(true); keyInfo.Key != ConsoleKey.Enter; keyInfo = Console.ReadKey(true))
                {
                    if (keyInfo.Key == ConsoleKey.Backspace)
                    {
                        if (sStrPwd.Length > 0)
                        {
                            sStrPwd.RemoveAt(sStrPwd.Length - 1);
                            Console.SetCursorPosition(Console.CursorLeft - 1, Console.CursorTop);
                            Console.Write(" ");
                            Console.SetCursorPosition(Console.CursorLeft - 1, Console.CursorTop);
                        }
                    }
                    else if (keyInfo.Key != ConsoleKey.Enter)
                    {
                        Console.Write("*");
                        sStrPwd.AppendChar(keyInfo.KeyChar);
                    }

                }
                Console.WriteLine("");
            }
            catch (Exception e)
            {
                sStrPwd = null;
                Console.WriteLine(e.Message);
            }

            return sStrPwd;
        }
    }
}

Vea también