Document Sets are useful for grouping relevant documents together and maintain a shared metadata for all the documents. Document Sets are supported in the modern sites and it is available when we activate the site collection feature called 'Document Sets' (Site Settings -> Site Collection Administration -> Site collection features)
Here are the steps to be done for using a Document Set
- Activate the 'Document Sets' feature
- From the List Settings page of the library, Advanced Settings, select 'Yes' for Allow management of content types and save the settings.
- In the list settings page of the library, under Content Types section, select 'Add from existing site content types' and select the Document Set content type.
- Now you will be able to create a Document Set from the Modern UI of the document library.
How to create a document set using PnPjs
While this is no direct API to handle document sets, we can create a new document set by performing some of the above steps using PnPjs (2.0.11). And then create a normal folder and change the content type id of the new folder to the id of the document set content type.
import { sp } from '@pnp/sp';
import '@pnp/sp/sites';
import '@pnp/sp/features';
import '@pnp/sp/webs';
import '@pnp/sp/lists';
import '@pnp/sp/content-types';
import '@pnp/sp/folders';
import '@pnp/sp/items';
// Activate the Document Set feature using the feature ID
// This will be same for all tenants, as this a default/OOTB feature
const res = await sp.site.features.add("3bae86a2-776d-499d-9db8-fa4cdc7884f8", true);
// Add the content type to the document library
const lib = sp.web.lists.getByTitle("Documents");
// ID for the document set content type. This will be same across all the tenants.
const documentSetContentTypeId = "0x0120D520";
await lib.contentTypes.addAvailableContentType(documentSetContentTypeId);
// Create a normal folder within an existing folder
const folderName = "Manuals";
const newFolder = await lib.rootFolder.folders.getByName('Client Documents').addSubFolderUsingPath(folderName)
// Update the content type Id
const fldObj = await lib.rootFolder.folders.getByName('Client Documents').folders.getByName(folderName).listItemAllFields.get();
await lib.items.getById(fldObj.Id).update({
ContentTypeId: documentSetContentTypeId
});
The above snippet creates a new Document Set called 'Manuals' within the folder 'Client Documents', inside the Shared Documents library.