diff --git a/frontend/src/webparts/approvalAdmin/components/screens/ManageByUserScreen.module.scss b/frontend/src/webparts/approvalAdmin/components/screens/ManageByUserScreen.module.scss index 85f9d72..06ec689 100644 --- a/frontend/src/webparts/approvalAdmin/components/screens/ManageByUserScreen.module.scss +++ b/frontend/src/webparts/approvalAdmin/components/screens/ManageByUserScreen.module.scss @@ -12,3 +12,9 @@ font-weight: 600; color: $gray-700; } + +.panelActions { + display: flex; + align-items: center; + gap: 8px; +} diff --git a/frontend/src/webparts/approvalAdmin/components/screens/ManageByUserScreen.tsx b/frontend/src/webparts/approvalAdmin/components/screens/ManageByUserScreen.tsx index 11e9a3b..e5f3877 100644 --- a/frontend/src/webparts/approvalAdmin/components/screens/ManageByUserScreen.tsx +++ b/frontend/src/webparts/approvalAdmin/components/screens/ManageByUserScreen.tsx @@ -158,6 +158,13 @@ export const ManageByUserScreen: React.FC = ({ api, di const checkedLiveRows = liveRows.filter(r => checkedLiveKeys.has(liveRowKey(r))); const checkedTemplateRows = templateRows.filter(r => checkedTemplateIds.has(r.id)); + const allLiveChecked = liveRows.length > 0 && checkedLiveRows.length === liveRows.length; + const toggleAllLive = (): void => setCheckedLiveKeys(allLiveChecked ? new Set() : new Set(liveRows.map(liveRowKey))); + + const allTemplatesChecked = templateRows.length > 0 && checkedTemplateRows.length === templateRows.length; + const toggleAllTemplates = (): void => + setCheckedTemplateIds(allTemplatesChecked ? new Set() : new Set(templateRows.map(r => r.id))); + const [replaceScope, setReplaceScope] = React.useState(); const [resultToast, setResultToast] = React.useState<{ message: string; kind: 'ok' | 'err' } | undefined>(); @@ -297,14 +304,19 @@ export const ManageByUserScreen: React.FC = ({ api, di
{`${texts.manageByUser.liveTitle} (${liveRows.length})`}
- +
+ + +
{liveError && {`${texts.manageByUser.liveLoadError}: ${liveError}`}} {liveLoading &&
{texts.common.loading}
} @@ -318,14 +330,19 @@ export const ManageByUserScreen: React.FC = ({ api, di
{`${texts.manageByUser.templatesTitle} (${templateRows.length})`}
- +
+ + +
{templateSteps.error && {`${texts.manageByUser.templatesLoadError}: ${templateSteps.error}`}} {templateSteps.isLoading &&
{texts.common.loading}
} diff --git a/frontend/src/webparts/approvalAdmin/texts.ts b/frontend/src/webparts/approvalAdmin/texts.ts index 3823a10..9482992 100644 --- a/frontend/src/webparts/approvalAdmin/texts.ts +++ b/frontend/src/webparts/approvalAdmin/texts.ts @@ -464,6 +464,8 @@ export const texts = { columnStepStatus: 'Статус шага', columnCondition: 'Условие', replaceOne: 'Заменить', + selectAll: 'Выбрать все', + deselectAll: 'Снять выделение', replaceSelected: (count: number): string => `Заменить выбранные (${count})`, replaceModalTitle: 'Новый согласующий', newEmployeeLabel: 'Сотрудник',