diff --git a/src/webparts/controlsTest/components/TestControl.tsx b/src/webparts/controlsTest/components/TestControl.tsx
index f9bfa5ff0..0b18c1a4d 100644
--- a/src/webparts/controlsTest/components/TestControl.tsx
+++ b/src/webparts/controlsTest/components/TestControl.tsx
@@ -9,37 +9,48 @@ import {
Title3,
makeStyles,
shorthands,
+ Button,
+ Text,
} from '@fluentui/react-components';
-import { IUserInfo } from '../../../controls/userPicker/models/IUserInfo';
+import {
+ AddRegular,
+ EditRegular,
+ DeleteRegular,
+ CopyRegular,
+ ArrowUploadRegular,
+ FilterRegular,
+ ArrowSortRegular,
+ SettingsRegular,
+ GridRegular,
+ ListRegular,
+ ShareRegular,
+ ArrowDownloadRegular,
+ PinRegular,
+ FolderAddRegular,
+ RenameRegular,
+ InfoRegular,
+ ArchiveRegular,
+ TagRegular,
+} from '@fluentui/react-icons';
import { WebPartContext } from '@microsoft/sp-webpart-base';
+import { ListToolbar } from '../../../controls/ListToolbar';
+import { IToolbarItem } from '../../../controls/ListToolbar';
+
+import { IUserInfo } from '../../../controls/userPicker/models/IUserInfo';
+
import { createV9Theme } from '@fluentui/react-migration-v8-v9';
import { Kpis } from '../../../controls/KPIControl';
const useStyles = makeStyles({
root: {
display: 'flex',
- flexDirection: 'row',
- alignItems: 'center',
- justifyContent: 'center',
- ...shorthands.gap('10px'),
- marginLeft: '50%',
- marginRight: '50%',
+ flexDirection: 'column',
+ gap:'10px',
height: 'fit-content',
- width: 'fit-content',
- },
- image: {
- width: '20px',
- height: '20px',
- },
- title: {
- marginBottom: '30px',
- display: 'flex',
- flexDirection: 'row',
- justifyContent: 'center',
- alignItems: 'center',
+ width: '100%',
},
});
@@ -49,21 +60,281 @@ export interface ITestControlProps {
}
export const TestControl: React.FunctionComponent
= (
- props: React.PropsWithChildren
+ props: React.PropsWithChildren,
) => {
const { themeVariant, context } = props;
const styles = useStyles();
- const setTheme = React.useCallback((): Partial => {
- return createV9Theme(themeVariant);
- }, [themeVariant]);
+ const [selectedCount, setSelectedCount] = React.useState(0);
+ const [isLoading, setIsLoading] = React.useState(false);
+ const [view, setView] = React.useState<'grid' | 'list'>('list');
- const onSelectedUsers = (users: IUserInfo[]) => {
- console.log('selected users', users);
- };
+ // Callback handler for toolbar item clicks
+ const onToolbarItemClick = React.useCallback(
+ (action: string) => {
+ console.log(`Toolbar action selected: ${action}`);
+
+ switch (action) {
+ case 'new':
+ console.log('Creating new item...');
+ break;
+ case 'newFolder':
+ console.log('Creating new folder...');
+ break;
+ case 'upload':
+ console.log('Opening upload dialog...');
+ break;
+ case 'edit':
+ console.log('Editing selected item...');
+ break;
+ case 'rename':
+ console.log('Renaming selected item...');
+ break;
+ case 'copy':
+ console.log(`Copying ${selectedCount} item(s)...`);
+ break;
+ case 'share':
+ console.log(`Sharing ${selectedCount} item(s)...`);
+ break;
+ case 'download':
+ console.log(`Downloading ${selectedCount} item(s)...`);
+ break;
+ case 'pin':
+ console.log(`Pinning ${selectedCount} item(s)...`);
+ break;
+ case 'tag':
+ console.log(`Tagging ${selectedCount} item(s)...`);
+ break;
+ case 'archive':
+ console.log(`Archiving ${selectedCount} item(s)...`);
+ break;
+ case 'details':
+ console.log('Opening details panel...');
+ break;
+ case 'delete':
+ console.log(`Deleting ${selectedCount} item(s)...`);
+ setSelectedCount(0);
+ break;
+ case 'filter':
+ console.log('Opening filter panel...');
+ break;
+ case 'sort':
+ console.log('Opening sort options...');
+ break;
+ case 'settings':
+ console.log('Opening settings...');
+ break;
+ default:
+ break;
+ }
+ },
+ [selectedCount],
+ );
+
+ // Regular items (left side) with grouping
+ const items: IToolbarItem[] = React.useMemo(
+ () => [
+ // Create group
+ {
+ key: 'new',
+ label: 'New',
+ icon: ,
+ appearance: 'primary',
+ group: 'create',
+ onClick: () => onToolbarItemClick('new'),
+ },
+ {
+ key: 'newFolder',
+ label: 'New Folder',
+ icon: ,
+ appearance: 'subtle',
+ group: 'create',
+ onClick: () => onToolbarItemClick('newFolder'),
+ },
+ {
+ key: 'upload',
+ label: 'Upload',
+ icon: ,
+ appearance: 'subtle',
+ group: 'create',
+ onClick: () => onToolbarItemClick('upload'),
+ },
+ // Edit group
+ {
+ key: 'edit',
+ label: 'Edit',
+ icon: ,
+ group: 'edit',
+ appearance: 'subtle',
+ visible: selectedCount === 1,
+ onClick: () => onToolbarItemClick('edit'),
+ },
+ {
+ key: 'rename',
+ label: 'Rename',
+ icon: ,
+ group: 'edit',
+ appearance: 'subtle',
+ visible: selectedCount === 1,
+ onClick: () => onToolbarItemClick('rename'),
+ },
+ {
+ key: 'copy',
+ label: 'Copy',
+ icon: ,
+ group: 'edit',
+ appearance: 'subtle',
+ visible: selectedCount > 0,
+ onClick: () => onToolbarItemClick('copy'),
+ },
+ // Share & Download group
+ {
+ key: 'share',
+ label: 'Share',
+ icon: ,
+ group: 'share',
+ appearance: 'subtle',
+ visible: selectedCount > 0,
+ onClick: () => onToolbarItemClick('share'),
+ },
+ {
+ key: 'download',
+ label: 'Download',
+ icon: ,
+ group: 'share',
+ appearance: 'subtle',
+ visible: selectedCount > 0,
+ onClick: () => onToolbarItemClick('download'),
+ },
+ // Organize group
+ {
+ key: 'pin',
+ label: 'Pin to top',
+ icon: ,
+ group: 'organize',
+ appearance: 'subtle',
+ visible: selectedCount > 0,
+ onClick: () => onToolbarItemClick('pin'),
+ },
+ {
+ key: 'tag',
+ label: 'Tag',
+ icon: ,
+ group: 'organize',
+ appearance: 'subtle',
+ visible: selectedCount > 0,
+ onClick: () => onToolbarItemClick('tag'),
+ },
+ {
+ key: 'archive',
+ label: 'Archive',
+ icon: ,
+ group: 'organize',
+ appearance: 'subtle',
+ visible: selectedCount > 0,
+ onClick: () => onToolbarItemClick('archive'),
+ },
+ // Info group (always visible)
+ {
+ key: 'details',
+ label: 'Details',
+ icon: ,
+ group: 'info',
+ appearance: 'subtle',
+ visible: selectedCount === 1,
+ onClick: () => onToolbarItemClick('details'),
+ },
+ // Danger group
+ {
+ key: 'delete',
+ label: 'Delete',
+ icon: ,
+ group: 'danger',
+ appearance: 'subtle',
+ visible: selectedCount > 0,
+ dividerBefore: true,
+ onClick: () => onToolbarItemClick('delete'),
+ },
+ ],
+ [selectedCount, onToolbarItemClick],
+ );
+
+ // Far items (right side)
+ const farItems: IToolbarItem[] = React.useMemo(
+ () => [
+ {
+ key: 'filter',
+ label: 'Filter',
+ icon: ,
+ appearance: 'transparent',
+ onClick: () => onToolbarItemClick('filter'),
+ },
+ {
+ key: 'sort',
+ label: 'Sort',
+ icon: ,
+ appearance: 'transparent',
+ onClick: () => onToolbarItemClick('sort'),
+ dividerAfter: true,
+ },
+ {
+ key: 'gridView',
+ icon: ,
+ tooltip: 'Grid view',
+ appearance: view === 'grid' ? 'primary' : 'transparent',
+ onClick: () => {
+ setView('grid');
+ onToolbarItemClick('gridView');
+ },
+ },
+ {
+ key: 'listView',
+ icon: ,
+ tooltip: 'List view',
+ appearance: view === 'list' ? 'primary' : 'transparent',
+ onClick: () => {
+ setView('list');
+ onToolbarItemClick('listView');
+ },
+ },
+ {
+ key: 'settings',
+ icon: ,
+ tooltip: 'Settings',
+ appearance: 'transparent',
+ onClick: () => onToolbarItemClick('settings'),
+ },
+ ],
+ [view, onToolbarItemClick],
+ );
return (
+
+
+ Simulate selection:
+
+
+
+ Current: {selectedCount} selected
+
+
0 ? selectedCount : undefined}
+ showGroupDividers={true}
+ ariaLabel="Document library toolbar"
+ />
+
<>