Files
pezkuwi-apps/packages/react-components/src/SortDropdown.tsx
T

156 lines
3.0 KiB
TypeScript

// Copyright 2017-2026 @pezkuwi/react-components authors & contributors
// SPDX-License-Identifier: Apache-2.0
import type { DropdownItemProps } from 'semantic-ui-react';
import React from 'react';
import Dropdown from './Dropdown.js';
import Icon from './Icon.js';
import { styled } from './styled.js';
interface Props {
className?: string;
defaultValue: string;
label: string;
onChange: (value: any) => void;
onClick: () => void;
options: (DropdownItemProps | React.ReactNode)[];
sortDirection: 'descending' | 'ascending';
}
function SortDropdown ({ className = '', defaultValue, label, onChange, onClick, options, sortDirection }: Props): React.ReactElement<Props> {
return (
<StyledDiv className={`${className} ui--Sort`}>
<Dropdown
defaultValue={defaultValue}
label={label}
onChange={onChange}
options={options}
/>
<button onClick={onClick}>
<Icon
className={`arrow up${sortDirection === 'ascending' ? ' isActive' : ''}`}
color='gray'
icon='sort-up'
/>
<Icon
className={`arrow down${sortDirection === 'descending' ? ' isActive' : ''}`}
color='gray'
icon='sort-down'
/>
</button>
</StyledDiv>
);
}
const StyledDiv = styled.div`
position: relative;
display: flex;
flex-direction: row;
flex-wrap: nowrap;
margin-right: 0.5rem;
&& .ui--Labelled.ui--Dropdown {
padding: 0;
label {
left: 1.55rem;
z-index: 115;
}
.ui.selection.dropdown {
min-width: 7.857rem;
z-index: 110;
border-width: 1px 0 1px 1px;
border-style: solid;
border-color: var(--border-input);
border-radius: 4px 0 0 4px;
&.active {
position: absolute;
min-width: 10.714rem;
z-index: 120;
border-width: 1px;
border-radius: 4px;
top: 0;
left: 0;
}
.visible.menu {
border-color: var(--border-input);
}
}
}
button {
margin: 0.25rem 0;
position: relative;
width: 2.857rem;
height: 3.893rem;
background-color: var(--bg-input);
border-width: 1px 1px 1px 0;
border-style: solid;
border-color: var(--border-input);
border-radius: 0 4px 4px 0;
align-items: center;
display: flex;
flex-flow: column;
justify-content: center;
&:hover {
cursor: pointer;
}
.arrow {
&:first-child {
margin-bottom: -20%;
}
&:last-child {
margin-top: -20%;
}
}
}
&::after {
content: '';
position: absolute;
left: 7.857rem;
top: 10%;
width: 1px;
height: 80%;
background-color: var(--border-input);
z-index: 99;
}
button:hover,
.ui--Labelled.ui--Dropdown:hover {
&::after {
content: '';
position: absolute;
top: 0;
height: 100%;
width: 1px;
z-index: 100;
}
}
button:hover::after {
left: 0;
}
.ui--Labelled.ui--Dropdown:hover::after {
left: 7.857rem;
}
`;
export default React.memo(SortDropdown);