Skip to content

Commit 090eece

Browse files
committed
Revert "SelectPanel: Make panel full screen on narrow screens with Save and optional Cancel button (#5761)"
This reverts commit 94bc6e4.
1 parent fe58f67 commit 090eece

File tree

6 files changed

+26
-169
lines changed

6 files changed

+26
-169
lines changed

.changeset/responsive-selectpanel.md

-5
This file was deleted.

packages/react/src/SelectPanel/SelectPanel.docs.json

-6
Original file line numberDiff line numberDiff line change
@@ -127,12 +127,6 @@
127127
"description": "Callback when the search input changes",
128128
"defaultValue": ""
129129
},
130-
{
131-
"name": "onCancel",
132-
"type": "() => void",
133-
"description": "(Narrow screens) Callback when the user hits cancel or close",
134-
"defaultValue": ""
135-
},
136130
{
137131
"name": "overlayProps",
138132
"type": "Partial<OverlayProps>",

packages/react/src/SelectPanel/SelectPanel.features.stories.tsx

-52
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,6 @@ export const SingleSelect = () => {
177177
selected={selected}
178178
onSelectedChange={setSelected}
179179
onFilterChange={setFilter}
180-
onCancel={() => setOpen(false)}
181180
width="medium"
182181
/>
183182
</FormControl>
@@ -653,54 +652,3 @@ export const AsyncFetch: StoryObj<SelectPanelProps> = {
653652
},
654653
},
655654
}
656-
657-
export const WithOnCancel = () => {
658-
const [intialSelection, setInitialSelection] = React.useState<ItemInput[]>(items.slice(1, 3))
659-
660-
const [selected, setSelected] = React.useState<ItemInput[]>(intialSelection)
661-
const [filter, setFilter] = React.useState('')
662-
const filteredItems = items.filter(
663-
item =>
664-
// design guidelines say to always show selected items in the list
665-
selected.some(selectedItem => selectedItem.text === item.text) ||
666-
// then filter the rest
667-
item.text.toLowerCase().startsWith(filter.toLowerCase()),
668-
)
669-
// design guidelines say to sort selected items first
670-
const selectedItemsSortedFirst = filteredItems.sort((a, b) => {
671-
const aIsSelected = selected.some(selectedItem => selectedItem.text === a.text)
672-
const bIsSelected = selected.some(selectedItem => selectedItem.text === b.text)
673-
if (aIsSelected && !bIsSelected) return -1
674-
if (!aIsSelected && bIsSelected) return 1
675-
return 0
676-
})
677-
678-
const [open, setOpen] = useState(false)
679-
React.useEffect(() => {
680-
if (!open) setInitialSelection(selected) // set initialSelection for next time
681-
}, [open, selected])
682-
683-
return (
684-
<FormControl>
685-
<FormControl.Label>Labels</FormControl.Label>
686-
<SelectPanel
687-
title="Select labels"
688-
placeholder="Select labels"
689-
subtitle="Use labels to organize issues and pull requests"
690-
renderAnchor={({children, ...anchorProps}) => (
691-
<Button trailingAction={TriangleDownIcon} {...anchorProps} aria-haspopup="dialog">
692-
{children}
693-
</Button>
694-
)}
695-
open={open}
696-
onOpenChange={setOpen}
697-
items={selectedItemsSortedFirst}
698-
selected={selected}
699-
onSelectedChange={setSelected}
700-
onCancel={() => setSelected(intialSelection)}
701-
onFilterChange={setFilter}
702-
width="medium"
703-
/>
704-
</FormControl>
705-
)
706-
}

packages/react/src/SelectPanel/SelectPanel.module.css

+3-27
Original file line numberDiff line numberDiff line change
@@ -5,22 +5,17 @@
55
flex-direction: column;
66
}
77

8-
.Header {
9-
display: flex;
10-
justify-content: space-between;
11-
align-items: center;
8+
.Content {
129
padding-top: var(--base-size-8);
13-
padding-right: var(--base-size-8);
14-
padding-left: var(--base-size-8);
10+
padding-right: var(--base-size-16);
11+
padding-left: var(--base-size-16);
1512
}
1613

1714
.Title {
18-
margin-left: var(--base-size-8);
1915
font-size: var(--text-body-size-medium);
2016
}
2117

2218
.Subtitle {
23-
margin-left: var(--base-size-8);
2419
font-size: var(--text-body-size-small);
2520
color: var(--fgColor-muted);
2621
}
@@ -73,22 +68,3 @@
7368
height: inherit;
7469
max-height: inherit;
7570
}
76-
77-
.ResponsiveCloseButton {
78-
display: none;
79-
80-
@media screen and (--viewportRange-narrow) {
81-
display: inline-grid;
82-
}
83-
}
84-
85-
.ResponsiveFooter {
86-
display: none;
87-
padding: var(--base-size-16);
88-
89-
@media screen and (--viewportRange-narrow) {
90-
display: flex;
91-
gap: var(--stack-gap-condensed);
92-
justify-content: right;
93-
}
94-
}

packages/react/src/SelectPanel/SelectPanel.tsx

+23-79
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import {AlertIcon, InfoIcon, SearchIcon, StopIcon, TriangleDownIcon, XIcon} from '@primer/octicons-react'
1+
import {AlertIcon, InfoIcon, SearchIcon, StopIcon, TriangleDownIcon} from '@primer/octicons-react'
22
import React, {useCallback, useEffect, useMemo, useRef, useState} from 'react'
33
import type {AnchoredOverlayProps} from '../AnchoredOverlay'
44
import {AnchoredOverlay} from '../AnchoredOverlay'
@@ -11,7 +11,7 @@ import type {OverlayProps} from '../Overlay'
1111
import type {TextInputProps} from '../TextInput'
1212
import type {ItemProps, ItemInput} from './types'
1313

14-
import {Button, IconButton} from '../Button'
14+
import {Button} from '../Button'
1515
import {useProvidedRefOrCreate} from '../hooks'
1616
import type {FocusZoneHookSettings} from '../hooks/useFocusZone'
1717
import {useId} from '../hooks/useId'
@@ -22,6 +22,7 @@ import type {FilteredActionListLoadingType} from '../FilteredActionList/Filtered
2222
import {FilteredActionListLoadingTypes} from '../FilteredActionList/FilteredActionListLoaders'
2323
import {useFeatureFlag} from '../FeatureFlags'
2424
import {announce} from '@primer/live-region-element'
25+
2526
import classes from './SelectPanel.module.css'
2627
import {clsx} from 'clsx'
2728

@@ -131,7 +132,6 @@ interface SelectPanelBaseProps {
131132
text: string | React.ReactElement
132133
variant: 'info' | 'warning' | 'error'
133134
}
134-
onCancel?: () => void
135135
}
136136

137137
export type SelectPanelProps = SelectPanelBaseProps &
@@ -194,7 +194,6 @@ export function SelectPanel({
194194
width,
195195
id,
196196
notice,
197-
onCancel,
198197
...listProps
199198
}: SelectPanelProps): JSX.Element {
200199
const titleId = useId()
@@ -358,7 +357,7 @@ export function SelectPanel({
358357
[onOpenChange],
359358
)
360359
const onClose = useCallback(
361-
(gesture: Parameters<Exclude<AnchoredOverlayProps['onClose'], undefined>>[0] | 'selection' | 'escape') => {
360+
(gesture: Parameters<Exclude<AnchoredOverlayProps['onClose'], undefined>>[0] | 'selection') => {
362361
onOpenChange(false, gesture)
363362
},
364363
[onOpenChange],
@@ -466,7 +465,6 @@ export function SelectPanel({
466465
height={height}
467466
width={width}
468467
anchorId={id}
469-
variant={{regular: 'anchored', narrow: 'fullscreen'}}
470468
pinPosition={!height}
471469
>
472470
<LiveRegionOutlet />
@@ -485,54 +483,24 @@ export function SelectPanel({
485483
sx={enabled ? undefined : {display: 'flex', flexDirection: 'column', height: 'inherit', maxHeight: 'inherit'}}
486484
className={enabled ? classes.Wrapper : undefined}
487485
>
488-
<Box
489-
sx={
490-
enabled
491-
? undefined
492-
: {
493-
display: 'flex',
494-
justifyContent: 'space-between',
495-
alignItems: 'center',
496-
paddingTop: 2,
497-
paddingRight: 2,
498-
paddingLeft: 2,
499-
}
500-
}
501-
className={enabled ? classes.Header : undefined}
502-
>
503-
<div>
504-
<Heading
505-
as="h1"
506-
id={titleId}
507-
sx={enabled ? undefined : {fontSize: 1, marginLeft: 2}}
508-
className={enabled ? classes.Title : undefined}
486+
<Box sx={enabled ? undefined : {pt: 2, px: 3}} className={enabled ? classes.Content : undefined}>
487+
<Heading
488+
as="h1"
489+
id={titleId}
490+
sx={enabled ? undefined : {fontSize: 1}}
491+
className={enabled ? classes.Title : undefined}
492+
>
493+
{title}
494+
</Heading>
495+
{subtitle ? (
496+
<Box
497+
id={subtitleId}
498+
sx={enabled ? undefined : {fontSize: 0, color: 'fg.muted'}}
499+
className={enabled ? classes.Subtitle : undefined}
509500
>
510-
{title}
511-
</Heading>
512-
{subtitle ? (
513-
<Box
514-
id={subtitleId}
515-
sx={enabled ? undefined : {marginLeft: 2, fontSize: 0, color: 'fg.muted'}}
516-
className={enabled ? classes.Subtitle : undefined}
517-
>
518-
{subtitle}
519-
</Box>
520-
) : null}
521-
</div>
522-
{onCancel && (
523-
<IconButton
524-
type="button"
525-
variant="invisible"
526-
icon={XIcon}
527-
aria-label="Cancel and close"
528-
sx={enabled ? undefined : {display: ['inline-grid', 'inline-grid', 'none', 'none']}}
529-
className={enabled ? classes.ResponsiveCloseButton : undefined}
530-
onClick={() => {
531-
onCancel()
532-
onClose('escape')
533-
}}
534-
/>
535-
)}
501+
{subtitle}
502+
</Box>
503+
) : null}
536504
</Box>
537505
{notice && (
538506
<div aria-live="polite" data-variant={notice.variant} className={classes.Notice}>
@@ -563,7 +531,7 @@ export function SelectPanel({
563531
className={enabled ? clsx(className, classes.FilteredActionList) : className}
564532
announcementsEnabled={false}
565533
/>
566-
{footer ? (
534+
{footer && (
567535
<Box
568536
sx={
569537
enabled
@@ -579,31 +547,7 @@ export function SelectPanel({
579547
>
580548
{footer}
581549
</Box>
582-
) : isMultiSelectVariant(selected) ? (
583-
/* Save and Cancel buttons are only useful for multiple selection, single selection instantly closes the panel */
584-
<div className={clsx(classes.Footer, classes.ResponsiveFooter)}>
585-
{/* we add a save and cancel button on narrow screens when SelectPanel is full-screen */}
586-
{onCancel && (
587-
<Button
588-
size="medium"
589-
onClick={() => {
590-
onCancel()
591-
onClose('escape')
592-
}}
593-
>
594-
Cancel
595-
</Button>
596-
)}
597-
<Button
598-
variant="primary"
599-
size="medium"
600-
block={onCancel ? false : true}
601-
onClick={() => onClose('click-outside')}
602-
>
603-
Save
604-
</Button>
605-
</div>
606-
) : null}
550+
)}
607551
</Box>
608552
</AnchoredOverlay>
609553
</LiveRegion>

0 commit comments

Comments
 (0)