Редактирование заявок у конкретного пользователя #14

Merged
gorbenko.pavel merged 9 commits from edit-by-user into main 2026-08-19 12:58:07 +00:00
3 changed files with 41 additions and 16 deletions
Showing only changes of commit ef7f27171d - Show all commits
@@ -12,3 +12,9 @@
font-weight: 600;
color: $gray-700;
}
.panelActions {
display: flex;
align-items: center;
gap: 8px;
}
@@ -158,6 +158,13 @@ export const ManageByUserScreen: React.FC<IManageByUserScreenProps> = ({ 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<IReplaceScope | undefined>();
const [resultToast, setResultToast] = React.useState<{ message: string; kind: 'ok' | 'err' } | undefined>();
@@ -297,14 +304,19 @@ export const ManageByUserScreen: React.FC<IManageByUserScreenProps> = ({ api, di
<Panel>
<div className={styles.panelHeader}>
<div className={styles.panelTitle}>{`${texts.manageByUser.liveTitle} (${liveRows.length})`}</div>
<Button
variant="secondary"
size="sm"
disabled={checkedLiveRows.length === 0}
onClick={() => setReplaceScope({ live: checkedLiveRows, templates: [] })}
>
{texts.manageByUser.replaceSelected(checkedLiveRows.length)}
</Button>
<div className={styles.panelActions}>
<Button variant="ghost" size="sm" disabled={liveRows.length === 0} onClick={toggleAllLive}>
{allLiveChecked ? texts.manageByUser.deselectAll : texts.manageByUser.selectAll}
</Button>
<Button
variant="secondary"
size="sm"
disabled={checkedLiveRows.length === 0}
onClick={() => setReplaceScope({ live: checkedLiveRows, templates: [] })}
>
{texts.manageByUser.replaceSelected(checkedLiveRows.length)}
</Button>
</div>
</div>
{liveError && <Alert kind="err">{`${texts.manageByUser.liveLoadError}: ${liveError}`}</Alert>}
{liveLoading && <div>{texts.common.loading}</div>}
@@ -318,14 +330,19 @@ export const ManageByUserScreen: React.FC<IManageByUserScreenProps> = ({ api, di
<Panel>
<div className={styles.panelHeader}>
<div className={styles.panelTitle}>{`${texts.manageByUser.templatesTitle} (${templateRows.length})`}</div>
<Button
variant="secondary"
size="sm"
disabled={checkedTemplateRows.length === 0}
onClick={() => setReplaceScope({ live: [], templates: checkedTemplateRows })}
>
{texts.manageByUser.replaceSelected(checkedTemplateRows.length)}
</Button>
<div className={styles.panelActions}>
<Button variant="ghost" size="sm" disabled={templateRows.length === 0} onClick={toggleAllTemplates}>
{allTemplatesChecked ? texts.manageByUser.deselectAll : texts.manageByUser.selectAll}
</Button>
<Button
variant="secondary"
size="sm"
disabled={checkedTemplateRows.length === 0}
onClick={() => setReplaceScope({ live: [], templates: checkedTemplateRows })}
>
{texts.manageByUser.replaceSelected(checkedTemplateRows.length)}
</Button>
</div>
</div>
{templateSteps.error && <Alert kind="err">{`${texts.manageByUser.templatesLoadError}: ${templateSteps.error}`}</Alert>}
{templateSteps.isLoading && <div>{texts.common.loading}</div>}
@@ -464,6 +464,8 @@ export const texts = {
columnStepStatus: 'Статус шага',
columnCondition: 'Условие',
replaceOne: 'Заменить',
selectAll: 'Выбрать все',
deselectAll: 'Снять выделение',
replaceSelected: (count: number): string => `Заменить выбранные (${count})`,
replaceModalTitle: 'Новый согласующий',
newEmployeeLabel: 'Сотрудник',