Skip to content

Commit 1dd7535

Browse files
authored
Merge pull request NotionX#384 from NotionX/view-tabs
added new tabs for multiple views
2 parents f5331b2 + 0548ec3 commit 1dd7535

File tree

4 files changed

+73
-414
lines changed

4 files changed

+73
-414
lines changed

packages/react-notion-x/package.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@
2424
"dependencies": {
2525
"@fisch0920/medium-zoom": "^1.0.7",
2626
"@matejmazur/react-katex": "^3.1.3",
27-
"@radix-ui/react-dropdown-menu": "^0.1.6",
2827
"katex": "^0.15.3",
2928
"notion-types": "^6.13.4",
3029
"notion-utils": "^6.13.4",

packages/react-notion-x/src/styles.css

Lines changed: 19 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2740,43 +2740,41 @@ svg.notion-page-icon {
27402740
will-change: transform, opacity;
27412741
}
27422742

2743-
.notion-collection-view-dropdown-content-item {
2743+
.notion-collection-view-tabs-row {
2744+
display: flex;
2745+
flex-direction: row;
2746+
flex-wrap: wrap;
2747+
width: 120%
2748+
}
2749+
2750+
.notion-collection-view-tabs-content-item {
27442751
all: unset;
27452752
position: relative;
27462753
height: 25px;
2747-
padding: 7px 96px 7px 10px;
2754+
padding: 7px 10px 7px 10px;
27482755
line-height: 1;
27492756
display: flex;
27502757
align-items: center;
2751-
border-radius: 3px;
27522758
user-select: none;
27532759
cursor: pointer;
27542760
color: rgb(55, 53, 47);
27552761
font-size: 14px;
27562762
}
27572763

2758-
.notion-collection-view-dropdown-content-item[data-disabled] {
2759-
color: #777;
2760-
pointer-events: none;
2761-
cursor: unset;
2762-
}
2763-
2764-
.notion-collection-view-dropdown-content-item:focus,
2765-
.notion-collection-view-dropdown-content-item-active {
2766-
background-color: #ebfaff;
2764+
.notion-collection-view-tabs-content-item:hover {
2765+
background-color: var(--fg-color-1);
2766+
border-radius: 3px;
27672767
}
27682768

2769-
.notion-collection-view-dropdown-content-item-active-icon {
2770-
position: absolute;
2771-
right: 0;
2772-
width: 32px;
2773-
display: inline-flex;
2774-
align-items: center;
2775-
justify-content: center;
2769+
.notion-collection-view-tabs-content-item-active {
2770+
border-bottom: solid 2px #000;
2771+
font-weight: bold;
27762772
}
27772773

2778-
.notion-collection-view-dropdown-content-item-active-icon > svg {
2779-
width: 12px;
2774+
@media only screen and (max-width: 730px) {
2775+
.notion-collection-view-tabs-row {
2776+
width: 100%;
2777+
}
27802778
}
27812779

27822780
@keyframes slideDownAndFade {

packages/react-notion-x/src/third-party/collection.tsx

Lines changed: 52 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,9 @@ import {
66
getTextContent
77
} from 'notion-utils'
88
import { useLocalStorage, useWindowSize } from 'react-use'
9-
import * as DropdownMenu from '@radix-ui/react-dropdown-menu'
109

1110
import { CollectionRow } from './collection-row'
1211
import { CollectionViewIcon } from '../icons/collection-view-icon'
13-
import CheckIcon from '../icons/check'
14-
import { ChevronDownIcon } from '../icons/chevron-down-icon'
1512
import { CollectionView } from './collection-view'
1613
import { PropertyImplMemo } from './property'
1714
import { PageIcon } from '../components/page-icon'
@@ -123,7 +120,7 @@ const CollectionViewBlock: React.FC<{
123120
recordMap.collection_query[collectionId]?.[collectionViewId]
124121
const parentPage = getBlockParentPage(block, recordMap)
125122

126-
const { style, width, padding } = React.useMemo(() => {
123+
const { width, padding } = React.useMemo(() => {
127124
const style: React.CSSProperties = {}
128125

129126
if (collectionView?.type !== 'table' && collectionView?.type !== 'board') {
@@ -185,86 +182,69 @@ const CollectionViewBlock: React.FC<{
185182
}
186183

187184
return (
188-
<div className={cs('notion-collection', className)}>
189-
<div className='notion-collection-header' style={style}>
190-
{title && (
191-
<div className='notion-collection-header-title'>
192-
<PageIcon
193-
block={block}
194-
className='notion-page-title-icon'
195-
hideDefaultIcon
185+
<>
186+
<div>
187+
<div>
188+
{viewIds.length > 1 && showCollectionViewDropdown && (
189+
<CollectionViewTabs
190+
collectionViewId={collectionViewId}
191+
viewIds={viewIds}
192+
onChangeView={onChangeView}
196193
/>
197-
198-
{title}
199-
</div>
200-
)}
201-
202-
{viewIds.length > 1 && showCollectionViewDropdown && (
203-
<CollectionViewDropdownMenu
204-
collectionView={collectionView}
205-
collectionViewId={collectionViewId}
206-
viewIds={viewIds}
207-
onChangeView={onChangeView}
208-
/>
209-
)}
194+
)}
195+
</div>
196+
<div className='notion-collection-header'>
197+
{/*TODO: only show if no full DB*/}
198+
{title && (
199+
<div className='notion-collection-header-title'>
200+
<PageIcon
201+
block={block}
202+
className='notion-page-title-icon'
203+
hideDefaultIcon
204+
/>
205+
{title}
206+
</div>
207+
)}
208+
</div>
210209
</div>
211-
212-
<CollectionView
213-
collection={collection}
214-
collectionView={collectionView}
215-
collectionData={collectionData}
216-
padding={padding}
217-
width={width}
218-
/>
219-
</div>
210+
<div className={cs('notion-collection', className)}>
211+
<CollectionView
212+
collection={collection}
213+
collectionView={collectionView}
214+
collectionData={collectionData}
215+
padding={padding}
216+
width={width}
217+
/>
218+
</div>
219+
</>
220220
)
221221
}
222222

223-
const CollectionViewDropdownMenu: React.FC<{
223+
const CollectionViewTabs: React.FC<{
224224
collectionViewId: string
225-
collectionView: types.CollectionView
226225
viewIds: string[]
227226
onChangeView: (viewId: string) => unknown
228-
}> = ({ collectionViewId, collectionView, viewIds, onChangeView }) => {
227+
}> = ({ collectionViewId, viewIds, onChangeView }) => {
229228
const { recordMap } = useNotionContext()
230229

231230
return (
232-
<DropdownMenu.Root>
233-
<DropdownMenu.Trigger className='notion-collection-view-dropdown'>
234-
<CollectionViewColumnDesc collectionView={collectionView}>
235-
<ChevronDownIcon className='notion-collection-view-dropdown-icon' />
236-
</CollectionViewColumnDesc>
237-
</DropdownMenu.Trigger>
238-
239-
<DropdownMenu.Content className='notion-collection-view-dropdown-content'>
240-
<DropdownMenu.RadioGroup
241-
value={collectionViewId}
242-
onValueChange={onChangeView}
231+
<div className='notion-collection-view-tabs-row'>
232+
{viewIds.map((viewId) => (
233+
<button
234+
onClick={() => onChangeView(viewId)}
235+
key={viewId}
236+
className={cs(
237+
'notion-collection-view-tabs-content-item',
238+
collectionViewId === viewId &&
239+
'notion-collection-view-tabs-content-item-active'
240+
)}
243241
>
244-
{viewIds.map((viewId) => (
245-
<DropdownMenu.RadioItem
246-
key={viewId}
247-
value={viewId}
248-
className={cs(
249-
'notion-collection-view-dropdown-content-item',
250-
collectionViewId === viewId &&
251-
'notion-collection-view-dropdown-content-item-active'
252-
)}
253-
>
254-
{collectionViewId === viewId && (
255-
<div className='notion-collection-view-dropdown-content-item-active-icon'>
256-
<CheckIcon />
257-
</div>
258-
)}
259-
260-
<CollectionViewColumnDesc
261-
collectionView={recordMap.collection_view[viewId]?.value}
262-
/>
263-
</DropdownMenu.RadioItem>
264-
))}
265-
</DropdownMenu.RadioGroup>
266-
</DropdownMenu.Content>
267-
</DropdownMenu.Root>
242+
<CollectionViewColumnDesc
243+
collectionView={recordMap.collection_view[viewId]?.value}
244+
/>
245+
</button>
246+
))}
247+
</div>
268248
)
269249
}
270250

0 commit comments

Comments
 (0)