mirror of
https://github.com/pezkuwichain/pezkuwi-apps.git
synced 2026-04-22 17:07:58 +00:00
156 lines
3.0 KiB
TypeScript
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);
|