From 0b5775c834920392808509b470032d3cf800a9e3 Mon Sep 17 00:00:00 2001 From: Louis Wolmarans Date: Wed, 6 May 2026 21:41:12 +0200 Subject: [PATCH 1/4] bulk actions activate handler --- .../SnippetsTable/SnippetsListTable.tsx | 23 +++++++++++++++---- .../components/common/ListTable/ListTable.tsx | 12 ++++++++-- .../common/ListTable/TableHeadings.tsx | 10 ++++++-- .../common/ListTable/TableItems.tsx | 9 +++++--- .../components/common/ListTable/TableNav.tsx | 15 +++++++++++- 5 files changed, 57 insertions(+), 12 deletions(-) diff --git a/src/js/components/ManageMenu/SnippetsTable/SnippetsListTable.tsx b/src/js/components/ManageMenu/SnippetsTable/SnippetsListTable.tsx index 757a3f05..34fdec4d 100644 --- a/src/js/components/ManageMenu/SnippetsTable/SnippetsListTable.tsx +++ b/src/js/components/ManageMenu/SnippetsTable/SnippetsListTable.tsx @@ -3,6 +3,7 @@ import React, { Fragment, useEffect, useMemo, useState } from 'react' import classnames from 'classnames' import { createInterpolateElement } from '@wordpress/element' import { useRestAPI } from '../../../hooks/useRestAPI' +import { useSnippetsAPI } from '../../../hooks/useSnippetsAPI' import { useSnippetsList } from '../../../hooks/useSnippetsList' import { handleUnknownError } from '../../../utils/errors' import { downloadBulkSnippetExportFile } from '../../../utils/files' @@ -248,13 +249,27 @@ const NoItemsMessage = () => { } -const useBulkActions = (allSnippets: Snippet[]): ListTableBulkAction[] => -{ +const useBulkActions = (allSnippets: Snippet[]): ListTableBulkAction[] => { + const { activate } = useSnippetsAPI() + const { refreshSnippetsList } = useSnippetsList() + return useMemo( () => [ { name: __('Activate', 'code-snippets'), - apply: () => Promise.resolve() + apply: async (selected: Set) => { + const targets = allSnippets.filter(snippet => selected.has(snippet.id) && !snippet.active) + + if (0 === targets.length) { + return + } + + await Promise.all(targets.map(snippet => + activate({ id: snippet.id, network: snippet.network }).catch(handleUnknownError) + )) + + await refreshSnippetsList() + } }, { name: __('Deactivate', 'code-snippets'), @@ -290,7 +305,7 @@ const useBulkActions = (allSnippets: Snippet[]): ListTableBulkAction Promise.resolve() } ], - [allSnippets] + [allSnippets, activate, refreshSnippetsList] ) } diff --git a/src/js/components/common/ListTable/ListTable.tsx b/src/js/components/common/ListTable/ListTable.tsx index d7b7621f..afe33218 100644 --- a/src/js/components/common/ListTable/ListTable.tsx +++ b/src/js/components/common/ListTable/ListTable.tsx @@ -131,7 +131,14 @@ const ListTableMarkup = ({ @@ -170,6 +177,7 @@ export const ListTable = ({ actions, extraTableNav, selected: getVisibleSelected(visibleItems, getKey, selected), + setSelected, disabled, currentPage, totalPages, @@ -178,7 +186,7 @@ export const ListTable = ({ } const tableHeadingsProps: Omit, 'which'> = - { items: visibleItems, setSelected, columns, getKey, sortColumn, setSortColumn, sortDirection, setSortDirection } + { items: visibleItems, selected, setSelected, columns, getKey, sortColumn, setSortColumn, sortDirection, setSortDirection } return extends Pick, 'columns' | 'getKey' | 'items'> { which: 'head' | 'foot' sortColumn: ListTableColumn | undefined + selected: Set setSelected: Dispatch>> sortDirection: ListTableSortDirection setSortColumn: Dispatch | undefined>> @@ -72,17 +73,21 @@ export const TableHeadings = ({ getKey, columns, sortColumn, + selected, setSelected, setSortColumn, sortDirection, setSortDirection -}: TableHeadingsProps) => - +}: TableHeadingsProps) => { + const allSelected = 0 < items.length && items.every(item => selected.has(getKey(item))) + + return { setSelected(new Set(event.target.checked ? items.map(getKey) : [])) }} @@ -113,3 +118,4 @@ export const TableHeadings = ({ /> })} +} diff --git a/src/js/components/common/ListTable/TableItems.tsx b/src/js/components/common/ListTable/TableItems.tsx index 5b8e67b1..8c3393eb 100644 --- a/src/js/components/common/ListTable/TableItems.tsx +++ b/src/js/components/common/ListTable/TableItems.tsx @@ -6,10 +6,11 @@ import type { ListTableColumn, ListTableItemsProps } from './ListTable' interface CheckboxCellProps extends Pick, 'getKey'> { item: T + selected: Set setSelected: Dispatch>> } -const CheckboxCell = ({ item, setSelected, getKey }: CheckboxCellProps) => +const CheckboxCell = ({ item, selected, setSelected, getKey }: CheckboxCellProps) =>