кнопка выбрать все в таблице
This commit is contained in:
@@ -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,6 +304,10 @@ export const ManageByUserScreen: React.FC<IManageByUserScreenProps> = ({ api, di
|
||||
<Panel>
|
||||
<div className={styles.panelHeader}>
|
||||
<div className={styles.panelTitle}>{`${texts.manageByUser.liveTitle} (${liveRows.length})`}</div>
|
||||
<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"
|
||||
@@ -306,6 +317,7 @@ export const ManageByUserScreen: React.FC<IManageByUserScreenProps> = ({ api, di
|
||||
{texts.manageByUser.replaceSelected(checkedLiveRows.length)}
|
||||
</Button>
|
||||
</div>
|
||||
</div>
|
||||
{liveError && <Alert kind="err">{`${texts.manageByUser.liveLoadError}: ${liveError}`}</Alert>}
|
||||
{liveLoading && <div>{texts.common.loading}</div>}
|
||||
{!liveLoading && !liveError && (
|
||||
@@ -318,6 +330,10 @@ export const ManageByUserScreen: React.FC<IManageByUserScreenProps> = ({ api, di
|
||||
<Panel>
|
||||
<div className={styles.panelHeader}>
|
||||
<div className={styles.panelTitle}>{`${texts.manageByUser.templatesTitle} (${templateRows.length})`}</div>
|
||||
<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"
|
||||
@@ -327,6 +343,7 @@ export const ManageByUserScreen: React.FC<IManageByUserScreenProps> = ({ api, di
|
||||
{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>}
|
||||
{!templateSteps.isLoading && !templateSteps.error && (
|
||||
|
||||
@@ -464,6 +464,8 @@ export const texts = {
|
||||
columnStepStatus: 'Статус шага',
|
||||
columnCondition: 'Условие',
|
||||
replaceOne: 'Заменить',
|
||||
selectAll: 'Выбрать все',
|
||||
deselectAll: 'Снять выделение',
|
||||
replaceSelected: (count: number): string => `Заменить выбранные (${count})`,
|
||||
replaceModalTitle: 'Новый согласующий',
|
||||
newEmployeeLabel: 'Сотрудник',
|
||||
|
||||
Reference in New Issue
Block a user