feat: request portal — bespoke forms + approval mechanism
This commit is contained in:
@@ -0,0 +1,84 @@
|
||||
# Провижининг списков SharePoint
|
||||
|
||||
Автоматическое создание списков **данных** для форм портала заявок из манифестов
|
||||
`provisioning.json` (по одному на форму, лежат в папке каждой формы).
|
||||
|
||||
> Списки **согласования** пока не создаются — только данные.
|
||||
|
||||
## Как это работает
|
||||
|
||||
- Каждая форма описывает свои колонки в `src/webparts/requestPortal/forms/<Форма>/provisioning.json`.
|
||||
- Скрипт `Provision-Lists.ps1` читает все такие манифесты и **идемпотентно** создаёт
|
||||
списки и колонки: перед созданием колонки проверяется, что её ещё нет; повторный
|
||||
запуск ничего не ломает и не дублирует.
|
||||
|
||||
Добавить колонку/форму = отредактировать/добавить `provisioning.json` и перезапустить скрипт.
|
||||
|
||||
## Поддерживаемые типы колонок (`type` в манифесте)
|
||||
|
||||
| type | Что это | Доп. поля |
|
||||
| ---------- | ------------------ | --------- |
|
||||
| `Text` | однострочный текст | — |
|
||||
| `Note` | многострочный текст| — |
|
||||
| `Number` | число | `decimals` (знаков после запятой) |
|
||||
| `Choice` | выбор из вариантов | `choices` (массив) |
|
||||
| `DateTime` | дата/время | — |
|
||||
| `Boolean` | да/нет | — |
|
||||
| `User` | пользователь | — |
|
||||
| `Lookup` | подстановка | `lookupList` (заголовок источника), `lookupShowField` (по умолч. `Title`) |
|
||||
|
||||
Плюс на уровне формы: `titleColumnName` — переименовать стандартную колонку `Title`.
|
||||
|
||||
> **Порядок для Lookup:** список-источник должен существовать раньше, чем колонка,
|
||||
> которая на него ссылается. Если источник в другой форме — сначала прогоните её манифест.
|
||||
|
||||
## Разовая подготовка
|
||||
|
||||
1. Установить модуль PnP PowerShell (нужен PowerShell 7+):
|
||||
```powershell
|
||||
Install-Module PnP.PowerShell -Scope CurrentUser
|
||||
```
|
||||
2. Зарегистрировать приложение с правом `Sites.Selected` и сертификатом в хранилище:
|
||||
```powershell
|
||||
Register-PnPEntraIDApp -ApplicationName "PnP-Provisioning-Scoped" -Tenant "<тенант>.onmicrosoft.com" -SharePointApplicationPermissions "Sites.Selected" -Store CurrentUser
|
||||
```
|
||||
Запомнить **Client Id** из вывода.
|
||||
3. Администратор один раз:
|
||||
- одобряет запрос на согласие приложения (Admin consent),
|
||||
- выдаёт приложению доступ **только к нужному сайту**:
|
||||
```powershell
|
||||
Grant-PnPAzureADAppSitePermission -AppId "<client-id>" -DisplayName "PnP-Provisioning-Scoped" -Permissions FullControl -Site "https://<тенант>.sharepoint.com/sites/<сайт>"
|
||||
```
|
||||
|
||||
## Запуск
|
||||
|
||||
Узнать отпечаток сертификата (Thumbprint):
|
||||
```powershell
|
||||
Get-ChildItem Cert:\CurrentUser\My | Where-Object { $_.Subject -like "*PnP-Provisioning-Scoped*" } | Select-Object Subject, Thumbprint
|
||||
```
|
||||
|
||||
Запустить провижининг (вход по сертификату, без пароля в коде):
|
||||
```powershell
|
||||
cd provisioning
|
||||
./Provision-Lists.ps1 `
|
||||
-SiteUrl "https://<тенант>.sharepoint.com/sites/<сайт>" `
|
||||
-ClientId "<client-id>" `
|
||||
-Tenant "<тенант>.onmicrosoft.com" `
|
||||
-Thumbprint "<отпечаток>"
|
||||
```
|
||||
|
||||
Лог: `[+]` — создано, `[=]` — уже существовало, `[~]` — переименовано, `[!]` — предупреждение.
|
||||
|
||||
## Важно про имена колонок
|
||||
|
||||
В манифесте у колонки два имени:
|
||||
- `internalName` — латиницей, без пробелов, ≤32 символов (техническое имя в SharePoint);
|
||||
- `title` — отображаемое, любое (рус., с пробелами).
|
||||
|
||||
Так мы избегаем проблемы, когда SharePoint кодирует пробелы в `_x0020_` и обращения к
|
||||
полю ломаются. Не создавайте колонки с русским internalName.
|
||||
|
||||
## Проверка на тесте
|
||||
|
||||
Сначала прогоните на **тестовом** сайте, убедитесь, что списки и колонки создались
|
||||
правильно, и только потом — на боевом.
|
||||
Reference in New Issue
Block a user