Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

chore(react-tree): scaffolds TreeItemLayout #25781

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 44 additions & 0 deletions packages/react-components/react-tree/etc/react-tree.api.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,15 @@ import * as React_2 from 'react';
import type { Slot } from '@fluentui/react-utilities';
import type { SlotClassNames } from '@fluentui/react-utilities';

// @public (undocumented)
export const renderTree_unstable: (state: TreeState, contextValues: TreeContextValues) => JSX.Element;

// @public
export const renderTreeItem_unstable: (state: TreeItemState) => JSX.Element;

// @public
export const renderTreeItemLayout_unstable: (state: TreeItemLayoutState) => JSX.Element;

// @public
export const Tree: ForwardRefComponent<TreeProps>;

Expand All @@ -38,6 +47,23 @@ export const TreeItem: ForwardRefComponent<TreeItemProps>;
// @public (undocumented)
export const treeItemClassNames: SlotClassNames<TreeItemSlots>;

// @public
export const TreeItemLayout: ForwardRefComponent<TreeItemLayoutProps>;

// @public (undocumented)
export const treeItemLayoutClassNames: SlotClassNames<TreeItemLayoutSlots>;

// @public
export type TreeItemLayoutProps = ComponentProps<TreeItemLayoutSlots>;

// @public (undocumented)
export type TreeItemLayoutSlots = {
root: Slot<'div'>;
};

// @public
export type TreeItemLayoutState = ComponentState<TreeItemLayoutSlots>;

// @public
export type TreeItemProps = ComponentProps<TreeItemSlots>;

Expand Down Expand Up @@ -69,9 +95,27 @@ export type TreeState = ComponentState<TreeSlots> & TreeContextValue & {
open: boolean;
};

// @public
export const useTree_unstable: (props: TreeProps, ref: React_2.Ref<HTMLElement>) => TreeState;

// @public (undocumented)
export const useTreeContext_unstable: <T>(selector: ContextSelector<TreeContextValue, T>) => T;

// @public
export const useTreeItem_unstable: (props: TreeItemProps, ref: React_2.Ref<TreeItemElement>) => TreeItemState;

// @public
export const useTreeItemLayout_unstable: (props: TreeItemLayoutProps, ref: React_2.Ref<HTMLElement>) => TreeItemLayoutState;

// @public
export const useTreeItemLayoutStyles_unstable: (state: TreeItemLayoutState) => TreeItemLayoutState;

// @public
export const useTreeItemStyles_unstable: (state: TreeItemState) => TreeItemState;

// @public (undocumented)
export const useTreeStyles_unstable: (state: TreeState) => TreeState;

// (No @packageDocumentation comment for this package)

```
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export * from './components/TreeItemLayout/index';
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import * as React from 'react';
import { render } from '@testing-library/react';
import { TreeItemLayout } from './TreeItemLayout';
import { isConformant } from '../../testing/isConformant';

describe('TreeItemLayout', () => {
isConformant({
Component: TreeItemLayout,
displayName: 'TreeItemLayout',
});

// TODO add more tests here, and create visual regression tests in /apps/vr-tests

it('renders a default state', () => {
const result = render(<TreeItemLayout>Default TreeItemLayout</TreeItemLayout>);
expect(result.container).toMatchSnapshot();
});
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import * as React from 'react';
import { useTreeItemLayout_unstable } from './useTreeItemLayout';
import { renderTreeItemLayout_unstable } from './renderTreeItemLayout';
import { useTreeItemLayoutStyles_unstable } from './useTreeItemLayoutStyles';
import type { TreeItemLayoutProps } from './TreeItemLayout.types';
import type { ForwardRefComponent } from '@fluentui/react-utilities';

/**
* TreeItemLayout component - TODO: add more docs
*/
export const TreeItemLayout: ForwardRefComponent<TreeItemLayoutProps> = React.forwardRef((props, ref) => {
const state = useTreeItemLayout_unstable(props, ref);

useTreeItemLayoutStyles_unstable(state);
return renderTreeItemLayout_unstable(state);
});

TreeItemLayout.displayName = 'TreeItemLayout';
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import type { ComponentProps, ComponentState, Slot } from '@fluentui/react-utilities';

export type TreeItemLayoutSlots = {
root: Slot<'div'>;
};

/**
* TreeItemLayout Props
*/
export type TreeItemLayoutProps = ComponentProps<TreeItemLayoutSlots>;

/**
* State used in rendering TreeItemLayout
*/
export type TreeItemLayoutState = ComponentState<TreeItemLayoutSlots>;
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP

exports[`TreeItemLayout renders a default state 1`] = `
<div>
<div
class="fui-TreeItemLayout"
>
Default TreeItemLayout
</div>
</div>
`;
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
export * from './TreeItemLayout';
export * from './TreeItemLayout.types';
export * from './renderTreeItemLayout';
export * from './useTreeItemLayout';
export * from './useTreeItemLayoutStyles';
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import * as React from 'react';
import { getSlots } from '@fluentui/react-utilities';
import type { TreeItemLayoutState, TreeItemLayoutSlots } from './TreeItemLayout.types';

/**
* Render the final JSX of TreeItemLayout
*/
export const renderTreeItemLayout_unstable = (state: TreeItemLayoutState) => {
const { slots, slotProps } = getSlots<TreeItemLayoutSlots>(state);

// TODO Add additional slots in the appropriate place
return <slots.root {...slotProps.root} />;
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import * as React from 'react';
import { getNativeElementProps } from '@fluentui/react-utilities';
import type { TreeItemLayoutProps, TreeItemLayoutState } from './TreeItemLayout.types';

/**
* Create the state required to render TreeItemLayout.
*
* The returned state can be modified with hooks such as useTreeItemLayoutStyles_unstable,
* before being passed to renderTreeItemLayout_unstable.
*
* @param props - props from this instance of TreeItemLayout
* @param ref - reference to root HTMLElement of TreeItemLayout
*/
export const useTreeItemLayout_unstable = (
props: TreeItemLayoutProps,
ref: React.Ref<HTMLElement>,
): TreeItemLayoutState => {
return {
// TODO add appropriate props/defaults
components: {
// TODO add each slot's element type or component
root: 'div',
},
// TODO add appropriate slots, for example:
// mySlot: resolveShorthand(props.mySlot),
root: getNativeElementProps('div', {
ref,
...props,
}),
};
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
import { makeStyles, mergeClasses } from '@griffel/react';
import type { TreeItemLayoutSlots, TreeItemLayoutState } from './TreeItemLayout.types';
import type { SlotClassNames } from '@fluentui/react-utilities';

export const treeItemLayoutClassNames: SlotClassNames<TreeItemLayoutSlots> = {
root: 'fui-TreeItemLayout',
// TODO: add class names for all slots on TreeItemLayoutSlots.
// Should be of the form `<slotName>: 'fui-TreeItemLayout__<slotName>`
};

/**
* Styles for the root slot
*/
const useStyles = makeStyles({
root: {
// TODO Add default styles for the root element
},

// TODO add additional classes for different states and/or slots
});

/**
* Apply styling to the TreeItemLayout slots based on the state
*/
export const useTreeItemLayoutStyles_unstable = (state: TreeItemLayoutState): TreeItemLayoutState => {
const styles = useStyles();
state.root.className = mergeClasses(treeItemLayoutClassNames.root, styles.root, state.root.className);

// TODO Add class names to slots, for example:
// state.mySlot.className = mergeClasses(styles.mySlot, state.mySlot.className);

return state;
};
19 changes: 17 additions & 2 deletions packages/react-components/react-tree/src/index.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,22 @@
export { Tree, treeClassNames } from './Tree';
export { Tree, treeClassNames, renderTree_unstable, useTreeStyles_unstable, useTree_unstable } from './Tree';
export type { TreeProps, TreeState, TreeSlots } from './Tree';

export { TreeItem, treeItemClassNames } from './TreeItem';
export {
TreeItem,
treeItemClassNames,
renderTreeItem_unstable,
useTreeItemStyles_unstable,
useTreeItem_unstable,
} from './TreeItem';
export type { TreeItemProps, TreeItemState, TreeItemSlots } from './TreeItem';

export type { TreeContextValue, useTreeContext_unstable, TreeProvider } from './contexts';

export {
TreeItemLayout,
treeItemLayoutClassNames,
renderTreeItemLayout_unstable,
useTreeItemLayoutStyles_unstable,
useTreeItemLayout_unstable,
} from './TreeItemLayout';
export type { TreeItemLayoutProps, TreeItemLayoutState, TreeItemLayoutSlots } from './TreeItemLayout';