diff --git a/packages/frontend/core/src/components/page-list/view/edit-collection/edit-collection.tsx b/packages/frontend/core/src/components/page-list/view/edit-collection/edit-collection.tsx index 58a70b945..ee88ba414 100644 --- a/packages/frontend/core/src/components/page-list/view/edit-collection/edit-collection.tsx +++ b/packages/frontend/core/src/components/page-list/view/edit-collection/edit-collection.tsx @@ -8,8 +8,8 @@ import type { ReactNode } from 'react'; import { useCallback, useMemo, useState } from 'react'; import * as styles from './edit-collection.css'; -import { PagesMode } from './pages-mode'; import { RulesMode } from './rules-mode'; +import { SelectPage } from './select-page'; export type EditCollectionMode = 'page' | 'rule'; @@ -110,6 +110,12 @@ export const EditCollection = ({ allowList: init.allowList, }); }, [init.allowList, init.filterList, value]); + const onIdsChange = useCallback( + (ids: string[]) => { + onChange({ ...value, allowList: ids }); + }, + [value] + ); const buttons = useMemo( () => ( <> @@ -164,13 +170,13 @@ export const EditCollection = ({ className={styles.collectionEditContainer} > {mode === 'page' ? ( - + init={value.allowList} + onChange={onIdsChange} + header={switchMode} + buttons={buttons} + /> ) : ( void; - buttons: ReactNode; - switchMode: ReactNode; - allPageListConfig: AllPageListConfig; -}) => { - const t = useI18n(); - const favAdapter = useService(FavoriteItemsAdapter); - const favorites = useLiveData(favAdapter.favorites$); - const { - showFilter, - filters, - updateFilters, - clickFilter, - createFilter, - filteredList, - } = useFilter( - allPageListConfig.allPages.map(meta => ({ - meta, - publicMode: allPageListConfig.getPublicMode(meta.id), - favorite: favorites.some(f => f.id === meta.id), - })) - ); - const pageHeaderColsDef = usePageHeaderColsDef(); - const { searchText, updateSearchText, searchedList } = - useSearch(filteredList); - const clearSelected = useCallback(() => { - updateCollection({ - ...collection, - allowList: [], - }); - }, [collection, updateCollection]); - const pageOperationsRenderer = useCallback( - (item: ListItem) => { - const page = item as DocMeta; - return allPageListConfig.favoriteRender(page); - }, - [allPageListConfig] - ); - - const pageItemRenderer = useCallback((item: ListItem) => { - return ; - }, []); - const pageHeaderRenderer = useCallback(() => { - return ; - }, [pageHeaderColsDef]); - return ( - <> - updateSearchText(e.target.value)} - className={styles.rulesTitle} - style={{ - color: 'var(--affine-text-primary-color)', - }} - placeholder={t['com.affine.editCollection.search.placeholder']()} - > - - - - {switchMode} - {!showFilter && filters.length === 0 ? ( - - } - > - - - - - ) : ( - - )} - - {showFilter ? ( - - - - ) : null} - {searchedList.length ? ( - { - updateCollection({ - ...collection, - allowList: ids, - }); - }} - itemRenderer={pageItemRenderer} - operationsRenderer={pageOperationsRenderer} - headerRenderer={pageHeaderRenderer} - selectedIds={collection.allowList} - isPreferredEdgeless={allPageListConfig.isEdgeless} - /> - ) : ( - - )} - - - - - - {t['com.affine.selectPage.selected']()} - - {collection.allowList.length} - - - - {t['com.affine.editCollection.pages.clear']()} - - - {buttons} - - > - ); -}; diff --git a/packages/frontend/core/src/components/page-list/view/edit-collection/select-page.tsx b/packages/frontend/core/src/components/page-list/view/edit-collection/select-page.tsx index b51dc18fb..06b053412 100644 --- a/packages/frontend/core/src/components/page-list/view/edit-collection/select-page.tsx +++ b/packages/frontend/core/src/components/page-list/view/edit-collection/select-page.tsx @@ -5,7 +5,7 @@ import { FilterIcon } from '@blocksuite/icons/rc'; import type { DocMeta } from '@blocksuite/store'; import { useLiveData, useService } from '@toeverything/infra'; import clsx from 'clsx'; -import { useCallback, useState } from 'react'; +import { type ReactNode, useCallback, useState } from 'react'; import { FilterList } from '../../filter'; import { VariableSelect } from '../../filter/vars'; @@ -25,20 +25,35 @@ export const SelectPage = ({ init, onConfirm, onCancel, + onChange: propsOnChange, + confirmText, + header, + buttons, }: { allPageListConfig: AllPageListConfig; init: string[]; - onConfirm: (pageIds: string[]) => void; - onCancel: () => void; + onConfirm?: (pageIds: string[]) => void; + onCancel?: () => void; + onChange?: (values: string[]) => void; + confirmText?: ReactNode; + header?: ReactNode; + buttons?: ReactNode; }) => { const t = useI18n(); - const [value, onChange] = useState(init); + const [value, setValue] = useState(init); + const onChange = useCallback( + (value: string[]) => { + propsOnChange?.(value); + setValue(value); + }, + [propsOnChange] + ); const confirm = useCallback(() => { - onConfirm(value); + onConfirm?.(value); }, [value, onConfirm]); const clearSelected = useCallback(() => { onChange([]); - }, []); + }, [onChange]); const favAdapter = useService(FavoriteItemsAdapter); const favourites = useLiveData(favAdapter.favorites$); const pageHeaderColsDef = usePageHeaderColsDef(); @@ -85,9 +100,11 @@ export const SelectPage = ({ > - - {t['com.affine.selectPage.title']()} - + {header ?? ( + + {t['com.affine.selectPage.title']()} + + )} {!showFilter && filters.length === 0 ? ( - - {t['com.affine.editCollection.button.cancel']()} - - - {t['Confirm']()} - + {buttons ?? ( + <> + + {t['com.affine.editCollection.button.cancel']()} + + + {confirmText ?? t['Confirm']()} + + > + )}