Instalace a aktivace
Nasazení balíčku .sppkg do katalogu aplikací a aktivace formuláře na seznamu.
Požadavky
- SharePoint Online s moderním prostředím seznamů. Řešení je postavené na SPFx 1.23 (
FormCustomizerrozšíření aListViewCommandSet). - Role pro nasazení: správce App Catalogu (tenantového, nebo site collection) a pro aktivaci na seznamu vlastník webu. Pro skripty v PowerShellu modul
PnP.PowerShell(Install-Module -Name PnP.PowerShell -Scope CurrentUser). - Sestavení balíčku: Node.js
>=22.14 <23a nainstalované závislosti v obou balících (spfx-form-customizerispfx-form-customizer-core). Hotový.sppkguž Node nepotřebuje.
Sestavení balíčku
Pokud máte hotový .sppkg od dodavatele, přejděte rovnou na Nasazení balíčku.
- V obou složkách
spfx-form-customizer-coreaspfx-form-customizerspusťtenpm install(balíčky nemají workspaces, každý má vlastnínode_modules). - V kořeni repozitáře spusťte
npm run ship. Příkaz synchronizuje jádro, spustí unit testy, smaže staré výstupy a sestaví produkční balíček. - Výsledek je
spfx-form-customizer/sharepoint/solution/spfx-form-customizer.sppkg. Skripty a styly jsou uvnitř balíčku (includeClientSideAssets) a SharePoint je servíruje z CDN katalogu aplikací, žádné externí úložiště není potřeba.
Před vydáním celého repozitáře spusťte i npm run verify (kontrola jádra, testy, dokumentace). Postup vydání popisuje Vydání.
Nasazení balíčku
Balíček se nahrává do katalogu aplikací. Vyberte jednu ze dvou variant.
Tenantový App Catalog (doporučeno)
- Otevřete SharePoint Admin Center (
https://<tenant>-admin.sharepoint.com), sekci Apps a v ní App Catalog (nebo přímohttps://<tenant>.sharepoint.com/sites/appcatalog). - Nahrajte
spfx-form-customizer.sppkgdo knihovny Apps for SharePoint. - V dialogu zaškrtněte Enable this app and add it to all sites. Balíček má
skipFeatureDeployment: true, takže se nasadí pro celý tenant a nemusíte ho přidávat na jednotlivé weby. - Potvrďte tlačítkem Enable app.
App Catalog site collection
Pokud nemáte přístup k tenantovému katalogu, může správce site collection vytvořit vlastní App Catalog (Add-PnPSiteCollectionAppCatalog) a balíček nahrát do něj. Řešení se pak nabízí jen na webech té site collection.
Storage Entity (licence, politika skriptů) se čtou přes /_api/web/GetStorageEntity, který může vrátit hodnotu z App Catalogu site collection dříve než tenantovou. Správce site collection s vlastním katalogem tak může zapnout skripty jen pro svůj web. Podrobnosti v Politice skriptů.
Aktivace formuláře na seznamu
Nasazení balíčku samo nic na seznamech nemění. Formulář musíte na seznamu zapnout, a to jednou z cest níže. Aktivací se pro vybrané typy obsahu nastaví komponenta CustomFormCustomizer (ID 910d1ea6-1bac-43f1-8f31-01aeba0c3605) jako formulář nové položky, úpravy a zobrazení.
Tlačítko „Vlastní formulář“ / „Otevřít editor FormCraft 365“ (Form Activator)
Balíček obsahuje rozšíření FormActivatorCommandSet, které přidá na příkazovou lištu seznamu příkaz pro správu vlastního formuláře (náhrada PowerShellu) a v případě nakonfigurovaných vlastních akcí seznamu také tlačítka na lištu a do kontextového menu.
- Otevřete seznam a na příkazové liště klikněte na Vlastní formulář (pokud na seznamu vlastní formulář ještě není aktivní) nebo na Otevřít editor FormCraft 365 (pokud už je vlastní formulář aktivní). Příkaz vidí jen vlastníci webu (kontrola oprávnění
ManageWeb, případně člen skupiny návrhářů). Viditelnost a stav aktivace se určí hned při načtení lišty z oprávnění stránky a výsledek se pamatuje do konce relace prohlížeče (sessionStorage), takže lišta nepřeblikává; skutečná oprávnění se vždy ověřují při načtení a uložení konfigurace. Pokud už je formulář aktivní, tlačítko otevře přímo návrhář formuláře (RibbonBuilderHost), kde lze formulář upravovat i spravovat aktivaci přes tlačítko Aktivace na seznamech. - V dialogu Aktivace vlastního formuláře případně vyberte jiný seznam webu (nabízejí se seznamy se šablonou 100, 120 a 1100; knihovny dokumentů se nenabízejí).
- Zvolte, pro které režimy se formulář použije: Nový záznam (NewForm), Editace záznamu (EditForm), Zobrazení záznamu (DisplayForm).
- Zaškrtněte typy obsahu seznamu (skryté typy a složky se nenabízejí) a klikněte na Aktivovat vlastní formulář. Dialog dále nabízí dvě volby (výchozí zapnuto): Vypnout offline dostupnost seznamu (bez toho se tlačítka a akce seznamu u uživatelů se synchronizací Microsoft Lists nemusí zobrazit; seznam nebude dostupný offline) a Vypnout rychlé úpravy (zobrazení mřížky) (zabrání úpravám mimo formulář). Pravidla FormCraftu (povinnost, zámky, výpočty) platí jen ve formuláři; úpravy přes Excel, Power Automate, API nebo mobilní aplikaci je neobejdou jen tehdy, když jsou pravidla nastavena přímo na sloupcích SharePointu. Selhání nastavení seznamu je jen varování. Při deaktivaci lze volbou Obnovit offline dostupnost a rychlé úpravy obě nastavení vrátit. U již aktivních typů je tlačítko Aktualizovat nastavení a Deaktivovat (vrátit výchozí SP formulář).
Je-li konfigurace chráněna heslem zámku editoru, dialog před změnou nebo deaktivací vyžádá heslo. Stejný dialog otevřete i z návrháře tlačítkem Aktivace na seznamech.
Název příkazu na liště je lokalizovaný podle jazyka SharePointu (angličtina, čeština, němčina, slovenština; jiné jazyky dostanou anglický název).
Aktivace se dotkne jen formulářů, které zapínáte. Vazba jiného customizeru na formulář, který nezvolíte, zůstane beze změny, a deaktivace maže jen vazbu na komponent Form Customizeru. Před změnou se načte aktuální stav typů obsahu. Když změna selže v polovině, dialog už změněné typy obsahu vrátí do původního stavu, nebo v chybě vyjmenuje typy, které zůstaly změněné.
SharePoint je jednostránková aplikace a vazby formulářů drží v paměti stránky, proto se aktivace i deaktivace projeví až po plném načtení stránky. Dialog po úspěšné změně zobrazí upozornění s tlačítkem Načíst stránku nyní a při zavření dialogu po změně stránku načte sám. Dialog otevřený z návrháře stránku automaticky nenačítá (nepřišli byste o rozpracovanou konfiguraci), tlačítko k dispozici je.
Příkazy jsou v balíčku registrovány jako dvě samostatné komponenty: pro příkazovou lištu (CommandBar, komponenta FormActivatorCommandSet) a pro kontextové menu (ContextMenu, komponenta FormListActionsContextMenu, od verze 1.28.1) na seznamech se šablonami 100 (obecný seznam), 120 (vlastní seznam) a 1100 (seznam problémů), tedy stejných jako nabízí dialog. Knihovny dokumentů (101) příkaz nemají. Po aktualizaci na 1.28.1 nebo ze starší verze než 1.26.0 zkontrolujte záznamy v seznamu Tenant Wide Extensions (staré záznamy kontextového menu smazat, chybějící doplnit, ověřit, že žádný není zakázaný; postup viz Kontrola záznamů Tenant Wide Extensions); jinak zůstanou tlačítka na liště zdvojená a administrátorský příkaz „Vlastní formulář“ / „Otevřít editor FormCraft 365“ se objeví i v kontextovém menu. Chcete-li formulář zapnout na jiném typu seznamu, použijte PowerShell nebo dialog z návrháře. Pokud se příkaz na liště neukáže, ověřte, že je v tenantovém katalogu zapnutá volba pro všechny weby, případně zapněte na webu funkci spfx-form-customizer Feature (Nastavení webu, Spravovat funkce webu).
PowerShell (Manage-FormCustomizer.ps1)
Pro hromadnou správu je v repozitáři skript scripts/Manage-FormCustomizer.ps1 (PnP.PowerShell 1.x i 2.x). Při spuštění se interaktivně připojí k webu (Connect-PnPOnline -Interactive), případně použije existující spojení k téže URL. Nastavuje vlastnosti NewFormClientSideComponentId, EditFormClientSideComponentId a DisplayFormClientSideComponentId na typech obsahu seznamu (kromě složek 0x0120) pomocí Set-PnPContentType, stejně jako dialog „Vlastní formulář“.
| Parametr | Význam | Výchozí hodnota |
|---|---|---|
-SiteUrl | URL webu (povinný) | – |
-ListTitle | Název nebo GUID seznamu (povinný) | – |
-Action | Status, Enable, Disable | Status |
-ComponentId | GUID komponenty z manifestu | 910d1ea6-1bac-43f1-8f31-01aeba0c3605 |
-ClientId | Client ID Entra ID aplikace pro Connect-PnPOnline -Interactive (PnP.PowerShell 2.x) | přednastaveno ve skriptu |
# Zjištění stavu (NATIVNÍ SHAREPOINT / AKTIVNÍ / JINÁ KOMPONENTA pro každý formulář)
.\scripts\Manage-FormCustomizer.ps1 -SiteUrl "https://contoso.sharepoint.com/sites/intranet" -ListTitle "Poptavky" -Action Status
# Aktivace pro NewForm, EditForm i DisplayForm
.\scripts\Manage-FormCustomizer.ps1 -SiteUrl "https://contoso.sharepoint.com/sites/intranet" -ListTitle "Poptavky" -Action Enable
# Návrat na nativní formuláře (prázdné GUID)
.\scripts\Manage-FormCustomizer.ps1 -SiteUrl "https://contoso.sharepoint.com/sites/intranet" -ListTitle "Poptavky" -Action Disable
Skript nastavuje formuláře na úrovni seznamu, dialog „Vlastní formulář“ na úrovni typů obsahu seznamu. Stav mezi oběma cestami se proto nemusí v dialogu zobrazit stejně. Pro jeden seznam držte jednu cestu a stav ověřte příkazem -Action Status.
Soubory v SiteAssets
Konfigurace formulářů se ukládá do knihovny Site Assets webu, ve kterém seznam leží. Složku SiteAssets/FormCustomizer vytvoří návrhář při prvním uložení. Způsob jejího zabezpečení popisuje Oprávnění.
| Cesta | Obsah |
|---|---|
SiteAssets/FormCustomizer/<listId>/config.json | Aktuální konfigurace formuláře. Jediný soubor, který čte běh formuláře. |
SiteAssets/FormCustomizer/<listId>/backup.json | Předchozí funkční konfigurace (automatická záloha při každém uložení, funkce „Obnovit ze zálohy“). |
SiteAssets/FormCustomizer/<listId>/history/ | Posledních 10 verzí konfigurace jako soubory <listId>.<časová značka>.json. Obnova z historie zatím nemá tlačítko, soubor obsah vložíte do panelu Raw JSON (viz Řešení problémů). |
SiteAssets/FormCustomizer/license.txt | Licenční klíč uložený volbou „Tato site collection“ (viz Licence). |
Starší verze ukládaly konfiguraci do property bagu seznamu a do souboru FormCustomizer/<listId>.json. Běh formuláře je už nečte. Návrhář vlastníka je jednorázově načte, abyste je mohli převést uložením.
Aktualizace na novou verzi
- Před sestavením zvyšte verzi v
spfx-form-customizer/config/package-solution.json:solution.versionifeatures[0].version(formátmajor.minor.patch.build, např.1.9.0.0na1.9.1.0). Bez nové verze SharePoint nový balíček jako aktualizaci nepřijme. - Sestavte balíček příkazem
npm run ship. - V App Catalogu nahrajte nový
.sppkga potvrďte přepsání stávajícího. U tenantového nasazení potvrďte znovu Enable app. - Po obnovení stránky (případně po vyprázdnění cache prohlížeče) se používá nová verze. Konfigurace v
SiteAssets, licenční klíč ani politika skriptů se při aktualizaci nemění. - Aktualizace balíčku (nový
.sppkgs volbou přidat na všechny weby) existující záznamy Tenant Wide Extensions nemění ani nemaže, přidá jen chybějící. Po aktualizaci vždy zkontrolujte, že seznam obsahuje právě 6 záznamů z tabulky a žádný není zakázaný (Disabled = Yes), viz kontrola záznamů Tenant Wide Extensions.
Kontrola záznamů Tenant Wide Extensions (aktualizace na 1.28.1 a ze starší verze než 1.26.0)
Rozšíření Command Set tvoří od verze 1.28.1 dvě samostatné komponenty: FormActivatorCommandSet (příkazová lišta: příkaz „Vlastní formulář“ / „Otevřít editor FormCraft 365“ a akce seznamu pro lištu) a FormListActionsContextMenu (kontextové menu položky: jen akce seznamu pro kontextové menu). Každá je registrovaná pro šablony seznamů 100, 120 a 1100. Celkem jde o 6 záznamů v seznamu Tenant Wide Extensions v App Catalogu.
SharePoint při aktualizaci přidá záznamy, které v seznamu chybí podle názvu; existující záznamy nemění ani nemaže, zastaralé je nutné smazat ručně. Po aktualizaci vždy zkontrolujte, že seznam obsahuje právě 6 záznamů z tabulky a že žádný z nich nemá Disabled = Yes (zakázaný záznam SharePoint vůbec nedoručí, takže příslušný příkaz se nespustí). Chybějící nebo zakázané záznamy způsobí, že se tlačítko „Vlastní formulář“ / „Otevřít editor FormCraft 365“ na liště nezobrazí. Zastaralé záznamy způsobí zdvojená tlačítka na liště a administrátorský příkaz i v kontextovém menu.
Očekávané záznamy (Sequence 0, Disabled No, Web Template a Host Properties prázdné):
| Title | Component Id | Location | List Template | Component Properties |
|---|---|---|---|---|
| FormActivatorCommandSet-100 | 4a8b7c12-5d3e-4f9a-8b1c-6e2d9f4a3b5c | ClientSideExtension.ListViewCommandSet.CommandBar | 100 | {"surface":"commandBar"} |
| FormListActionsContextMenu-100 | a9998067-8e06-423f-b8a0-3177988f3a42 | ClientSideExtension.ListViewCommandSet.ContextMenu | 100 | {} |
| FormActivatorCommandSet-120 | 4a8b7c12-5d3e-4f9a-8b1c-6e2d9f4a3b5c | ClientSideExtension.ListViewCommandSet.CommandBar | 120 | {"surface":"commandBar"} |
| FormListActionsContextMenu-120 | a9998067-8e06-423f-b8a0-3177988f3a42 | ClientSideExtension.ListViewCommandSet.ContextMenu | 120 | {} |
| FormActivatorCommandSet-1100 | 4a8b7c12-5d3e-4f9a-8b1c-6e2d9f4a3b5c | ClientSideExtension.ListViewCommandSet.CommandBar | 1100 | {"surface":"commandBar"} |
| FormListActionsContextMenu-1100 | a9998067-8e06-423f-b8a0-3177988f3a42 | ClientSideExtension.ListViewCommandSet.ContextMenu | 1100 | {} |
Aktualizace na 1.28.1 a novější (BUG-23): do verze 1.28.0 používaly záznamy kontextového menu stejné Component Id jako lišta a lišily se jen vlastností {"surface":"contextMenu"}. Kontextové menu má od 1.28.1 vlastní komponentu (čistší řešení; předpokládaná příčina kolísavého chování lišty byla jiná, viz Řešení potíží: synchronizace Microsoft Lists a omylem zakázaný záznam). SharePoint při aktualizaci přidal tři nové záznamy FormListActionsContextMenu-100/120/1100. Staré záznamy FormActivatorCommandSet-ContextMenu-100/120/1100 neupravujte, ale smažte; ponechání nebo úprava vytvoří duplicitní registrace. Dokud je nesmažete, akce kontextového menu se nezobrazí (stará komponenta je ignoruje) a lišta funguje správně.
Postup v prohlížeči:
- Otevřete seznam
https://<tenant>.sharepoint.com/sites/<appcatalog>/Lists/TenantWideExtensions/AllItems.aspx(App Catalog, Obsah webu, Tenant Wide Extensions). - Do zobrazení přidejte sloupce Component Id, Location, List Template a Component Properties a vyfiltrujte Component Id
4a8b7c12-5d3e-4f9a-8b1c-6e2d9f4a3b5c. - Aktualizace na 1.28.1 a novější: smažte staré záznamy kontextového menu, tedy ty s Location
ClientSideExtension.ListViewCommandSet.ContextMenu, jejichž Component Id je4a8b7c12-5d3e-4f9a-8b1c-6e2d9f4a3b5c(názvyFormActivatorCommandSet-ContextMenu-<šablona>). Nové záznamyFormListActionsContextMenu-<šablona>s Component Ida9998067-8e06-423f-b8a0-3177988f3a42SharePoint přidal sám; nejsou-li v seznamu, vytvořte je. - Chybějící záznamy doplňte tlačítkem New (nová položka) podle tabulky výše. Ověřte, že žádný záznam nemá Disabled = Yes.
- Zastaralé záznamy smažte: ty, jejichž Location je jen
ClientSideExtension.ListViewCommandSet(bez přípony.CommandBar/.ContextMenu), záznamy lišty s prázdnými Component Properties a všechny záznamy, které v tabulce nejsou. Řiďte se sloupci Location a Component Id, ne názvem. - Změna se na webech projeví zhruba do 20 minut, poté obnovte stránku (Ctrl+F5). Příkaz „Vlastní formulář“ / „Otevřít editor FormCraft 365“ má být na liště jen jednou a v kontextovém menu nikdy.
Alternativa: odeberte aplikaci z App Catalogu včetně koše a nahrajte ji znovu s volbou přidat na všechny weby. SharePoint záznamy vytvoří znovu se správnými Component Id. Po tu dobu jsou formuláře nedostupné na všech webech; konfigurace v SiteAssets zůstanou zachované.
Totéž přes PnP PowerShell (nejdřív spusťte jen výpis; úpravy až po kontrole). Výchozí aplikace PnP Management Shell byla vyřazena, proto je u -ClientId nutné zadat vlastní aplikaci registrovanou v Microsoft Entra ID tenantu:
Connect-PnPOnline -Url https://<tenant>.sharepoint.com/sites/<appcatalog> -Interactive -ClientId <id-vaší-aplikace>
$list = "Lists/TenantWideExtensions"
$barId = "4a8b7c12-5d3e-4f9a-8b1c-6e2d9f4a3b5c" # FormActivatorCommandSet (lišta)
$ctxId = "a9998067-8e06-423f-b8a0-3177988f3a42" # FormListActionsContextMenu (kontextové menu, od 1.28.1)
$bar = "ClientSideExtension.ListViewCommandSet.CommandBar"; $ctx = "ClientSideExtension.ListViewCommandSet.ContextMenu"
$mine = { Get-PnPListItem -List $list | Where-Object { $_["TenantWideExtensionComponentId"] -in @($barId, $ctxId) } }
# 1) Výpis: ID | Component Id | Location | šablona | vlastnosti
& $mine | ForEach-Object { "{0} | {1} | {2} | {3} | {4}" -f $_.Id, $_["TenantWideExtensionComponentId"], $_["TenantWideExtensionLocation"], $_["TenantWideExtensionListTemplate"], $_["TenantWideExtensionComponentProperties"] }
# 2) Aktualizace na 1.28.1+: staré záznamy ContextMenu s Component Id lišty SMAZAT (ne upravovat; nové vytvoří SharePoint / krok 4)
& $mine | Where-Object { $_["TenantWideExtensionComponentId"] -eq $barId -and $_["TenantWideExtensionLocation"] -eq $ctx } |
ForEach-Object { Remove-PnPListItem -List $list -Identity $_.Id -Force }
# 3) Smazání zastaralých záznamů (Location bez přípony, záznamy lišty bez vlastností)
& $mine | Where-Object { $_["TenantWideExtensionLocation"] -eq "ClientSideExtension.ListViewCommandSet" -or
($_["TenantWideExtensionComponentId"] -eq $barId -and -not $_["TenantWideExtensionComponentProperties"]) } |
ForEach-Object { Remove-PnPListItem -List $list -Identity $_.Id -Force }
# 4) Doplnění chybějících záznamů (existující se přeskočí)
$existing = & $mine
foreach ($tpl in "100","120","1100") {
foreach ($s in @(@{ Cid = $barId; Loc = $bar; Props = '{"surface":"commandBar"}'; Name = "FormActivatorCommandSet-$tpl" },
@{ Cid = $ctxId; Loc = $ctx; Props = '{}'; Name = "FormListActionsContextMenu-$tpl" })) {
if ($existing | Where-Object { $_["TenantWideExtensionComponentId"] -eq $s.Cid -and $_["TenantWideExtensionLocation"] -eq $s.Loc -and "$($_["TenantWideExtensionListTemplate"])" -eq $tpl }) { continue }
Add-PnPListItem -List $list -Values @{
Title = $s.Name; TenantWideExtensionComponentId = $s.Cid; TenantWideExtensionLocation = $s.Loc
TenantWideExtensionListTemplate = $tpl; TenantWideExtensionComponentProperties = $s.Props
TenantWideExtensionSequence = 0; TenantWideExtensionDisabled = $false } | Out-Null
}
}
Konfigurace uložená novější verzí produktu (vyšší schemaVersion) se starší verzí nepřepíše: ukládání je zablokované. Vracíte-li se k starší verzi balíčku, počítejte s tím. Viz Konfigurace z novější verze.
Odinstalace
- Na každém seznamu formulář deaktivujte: dialog „Vlastní formulář“ (Deaktivovat) nebo
Manage-FormCustomizer.ps1 -Action Disable. Seznam se vrátí k výchozím formulářům SharePointu. - V App Catalogu balíček odeberte (Remove, případně smažte soubor z knihovny Apps for SharePoint).
- Volitelně uklidíte data: smažte složku
SiteAssets/FormCustomizerna webech, kde se formulář používal, a odeberte Storage Entity:Remove-PnPStorageEntity -Key SpfxFormCustomizer_License Remove-PnPStorageEntity -Key FormCraft365_ScriptsPolicy Remove-PnPStorageEntity -Key SpfxFormCustomizer_ScriptPolicy
Odeberete-li balíček dřív, než formuláře deaktivujete, zůstanou seznamy odkazovat na neexistující komponentu. Nejprve vždy deaktivace.