MWAN001
MWAN001

Reputation: 41

Default OOBX EditForm disappeared for a SharePoint document library

Default OOBX EditForm disappeared for a SharePoint document library. We tried to create a new edit form in SharePoint designer but got an error that Could not save the List Changes to Server. Then tried another approach, go to All files/Documentlibrary/Forms -- here got list view threshold error. We have more than 10 thousands items in the library, can't open up forms folder.

Please advise how to get the default edit form back.

Upvotes: 2

Views: 1069

Answers (1)

willman
willman

Reputation: 1201

You'll need to do it through PowerShell:

$webpartTemplate = @"
<WebPart xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/WebPart/v2">
    <Assembly>Microsoft.SharePoint, Version=16.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c</Assembly>  
    <TypeName>Microsoft.SharePoint.WebPartPages.ListFormWebPart</TypeName>
    <ListName xmlns="http://schemas.microsoft.com/WebPart/v2/ListForm">{{{LIST_ID}}}</ListName>
    <ListId xmlns="http://schemas.microsoft.com/WebPart/v2/ListForm">{{LIST_ID}}</ListId>
    <PageType xmlns="http://schemas.microsoft.com/WebPart/v2/ListForm">{{PAGE_TYPE}}</PageType>
    <FormType xmlns="http://schemas.microsoft.com/WebPart/v2/ListForm">{{FORM_TYPE}}</FormType>
    <ControlMode xmlns="http://schemas.microsoft.com/WebPart/v2/ListForm">{{CONTROL_MODE}}</ControlMode>
    <ViewFlag xmlns="http://schemas.microsoft.com/WebPart/v2/ListForm">1048576</ViewFlag>
    <ViewFlags xmlns="http://schemas.microsoft.com/WebPart/v2/ListForm">Default</ViewFlags>
    <ListItemId xmlns="http://schemas.microsoft.com/WebPart/v2/ListForm">0</ListItemId>
</WebPart>
"@

Function Create-DefaultListForm
{
    param(
        [parameter(Mandatory=$true)]$List, 
        [parameter(Mandatory=$true)][string]$FormUrl, 
        [parameter(Mandatory=$true)][ValidateSet("Display", "Edit", "New")]$FormType
    )

    begin { }    
    process
    {

        $webpartXml = $webpartTemplate -replace "{{LIST_ID}}", $List.Id.ToString()

        switch ($FormType)
        {
            "Display" { 
                $webpartXml = $webpartXml -replace "{{PAGE_TYPE}}", "PAGE_DISPLAYFORM" 
                $webpartXml = $webpartXml -replace "{{FORM_TYPE}}", "4"  
                $webpartXml = $webpartXml -replace "{{CONTROL_MODE}}", "Display"  
                break;
            }
            "Edit" { 
                $webpartXml = $webpartXml -replace "{{PAGE_TYPE}}", "PAGE_EDITFORM" 
                $webpartXml = $webpartXml -replace "{{FORM_TYPE}}", "6"  
                $webpartXml = $webpartXml -replace "{{CONTROL_MODE}}", "Edit"  
                break;
            }
            "New" { 
                $webpartXml = $webpartXml -replace "{{PAGE_TYPE}}", "PAGE_NEWFORM" 
                $webpartXml = $webpartXml -replace "{{FORM_TYPE}}", "8"  
                $webpartXml = $webpartXml -replace "{{CONTROL_MODE}}", "New"  
                break;
            }
        }

        try
        {           
            #Check if form page already exists
            $listPages = Get-PnPProperty -ClientObject $List.RootFolder -Property Files
            $formPage = $listPages | Where-Object { $_.ServerRelativeUrl.ToLower() -eq $FormUrl.ToLower() }

            if ($null -eq $formPage) {
                Write-Output "  [Creating Form Page] $FormUrl"

                #Create Form
                Remove-PnPFile -ServerRelativeUrl $FormUrl -Force
                $formPage = $List.RootFolder.Files.AddTemplateFile($FormUrl, [Microsoft.SharePoint.Client.TemplateFileType]::FormPage)            
            }
            else {
                #Form page exists, check if form is recognized by list (i.e. form page has a form webpart on it)
                $listForms = Get-PnPProperty -ClientObject $List -Property Forms

                if ($null -ne $listForms -and $listForms.Count -gt 0) {
                    $existingForm = $list.Forms | Where-Object { $_.ServerRelativeUrl.ToLower() -eq $FormUrl.ToLower() }
                    if ($null -ne $existingForm) {
                        Write-Warning "  [Form Already Exists] $FormUrl"
                        return;
                    }                
                }
            }

            Write-Output "  [Adding Form Webpart] $FormUrl"
            #Get Webpart Manager for Form
            $wpm = $formPage.GetLimitedWebPartManager([Microsoft.SharePoint.Client.WebParts.PersonalizationScope]::Shared)

            #Import Webpart on page
            $wp = $wpm.ImportWebPart($webpartXml)

            #Add webpart to Form
            $wpm.AddWebPart($wp.WebPart, "Main", 1) | Out-Null

            #Execute changes
            $List.Context.ExecuteQuery()                    
        }
        catch
        {
            Write-Error "Error creating form $FormType at $FormUrl. Error: $($_.Exception)"
        }
    }
    end { }
}

Use the script something like this. If you only need to restore the EditForm, then you obviously you can skip the Upload, New, and DispForms below:

    Connect-PnPOnline -Url $problemSiteUrl -UseWebLogin
    $list = Get-PnPList $problemlistTitle
    $listUrl = $list.RootFolder.ServerRelativeUrl

    # Handle Document Library Types
    if ($list.BaseType -eq [Microsoft.SharePoint.Client.BaseType]::DocumentLibrary) {
        Write-Host " > Processing Library: $listUrl"
        Create-DefaultListForm -List $list -FormUrl "$listUrl/Forms/Upload.aspx"   -FormType New
        Create-DefaultListForm -List $list -FormUrl "$listUrl/Forms/DispForm.aspx" -FormType Display
        Create-DefaultListForm -List $list -FormUrl "$listUrl/Forms/EditForm.aspx" -FormType Edit
    }

    # Handle Generic List Types
    else {
        Write-Host " > Processing List: $listUrl"
        Create-DefaultListForm -List $list -FormUrl "$listUrl/NewForm.aspx"  -FormType New
        Create-DefaultListForm -List $list -FormUrl "$listUrl/DispForm.aspx" -FormType Display
        Create-DefaultListForm -List $list -FormUrl "$listUrl/EditForm.aspx" -FormType Edit
    }

If you only need the Edit form, use the Create-DefaultListForm function like this:

    Connect-PnPOnline -Url 'UrlOfProblemSite' -UseWebLogin
    $list = Get-PnPList 'TitleOfTheProblemLibraryHere'
    $listUrl = $list.RootFolder.ServerRelativeUrl

    Create-DefaultListForm -List $list -FormUrl "$listUrl/Forms/EditForm.aspx" -FormType Edit

Upvotes: 1

Related Questions