Skip to content

Commit

Permalink
DTRA-1279/ Kate/ Feat: add Date picker (#62)
Browse files Browse the repository at this point in the history
* feat: add second action sheet

* feat: add date range formatting and refactored existing code

* feat: add range selection filtration

* refactor: chip and time filter

* fix: empty posituions after filtration

* refactor: do clean up

* chore: rename variables
  • Loading branch information
kate-deriv committed May 24, 2024
1 parent 13254e6 commit 4abfa7d
Show file tree
Hide file tree
Showing 13 changed files with 209 additions and 92 deletions.
45 changes: 4 additions & 41 deletions packages/trader/src/AppV2/Components/Chip/chip.scss
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,9 @@
border-color: var(--component-chip-border-color);
border-radius: var(--component-chip-border-radius);
background-color: var(--core-color-solid-slate-50);
padding-inline: var(--component-chip-spacing-padding-lg);
height: var(--component-chip-height-md);
gap: var(--component-chip-spacing-padding-sm);

&:hover {
background-color: var(--component-chip-bg-hover);
Expand Down Expand Up @@ -67,48 +70,8 @@
}
}

&__disabled {
&--true {
& > svg {
fill: var(--component-chip-icon-disabled) !important;
}

& > p {
color: var(--component-chip-label-color-disabled) !important;
}
}
}

&__size {
&--sm {
padding-inline: var(--component-chip-spacing-padding-md);
height: var(--component-chip-height-sm);
gap: var(--component-chip-spacing-padding-xs);
}
&--md {
padding-inline: var(--component-chip-spacing-padding-lg);
height: var(--component-chip-height-md);
gap: var(--component-chip-spacing-padding-sm);
}
&--lg {
padding-inline: var(--component-chip-spacing-padding-xl);
height: var(--component-chip-height-lg);
gap: var(--component-chip-spacing-padding-md);
}
}

&__custom-right-padding {
&__size {
&--sm {
padding-inline: var(--component-chip-spacing-padding-md) var(--component-chip-spacing-padding-xs);
}
&--md {
padding-inline: var(--component-chip-spacing-padding-lg) var(--component-chip-spacing-padding-sm);
}
&--lg {
padding-inline: var(--component-chip-spacing-padding-xl) var(--component-chip-spacing-padding-md);
}
}
padding-inline: var(--component-chip-spacing-padding-lg) var(--component-chip-spacing-padding-sm);
}
}

Expand Down
26 changes: 5 additions & 21 deletions packages/trader/src/AppV2/Components/Chip/chip.tsx
Original file line number Diff line number Diff line change
@@ -1,16 +1,10 @@
import React from 'react';
import { StandaloneChevronDownRegularIcon } from '@deriv/quill-icons';
import { LabelPairedChevronDownSmRegularIcon } from '@deriv/quill-icons';
import './chip.scss';
import clsx from 'clsx';
import { CaptionText, Text } from '@deriv-com/quill-ui';
import { Text } from '@deriv-com/quill-ui';
import { TRegularSizes } from '@deriv-com/quill-ui/dist/types';

export const LabelTextSizes: Record<TRegularSizes, JSX.Element> = {
sm: <CaptionText />,
md: <Text />,
lg: <Text />,
};

type BaseChipProps = Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'label'> & {
label?: React.ReactNode;
disabled?: boolean;
Expand All @@ -25,24 +19,14 @@ const Chip = React.forwardRef<HTMLButtonElement, BaseChipProps>(
({ size = 'md', label, dropdown = false, className, selected, isDropdownOpen = false, onClick, ...rest }, ref) => (
<button
onClick={onClick}
className={clsx(
'quill-chip',
`quill-chip__size--${size}`,
dropdown && `quill-chip__custom-right-padding__size--${size}`,
className
)}
className={clsx('quill-chip', dropdown && 'quill-chip__custom-right-padding', className)}
data-state={selected ? 'selected' : ''}
ref={ref}
{...rest}
>
{label &&
React.cloneElement(LabelTextSizes[size], {
children: label,
})}
{label && <Text size={size}>{label}</Text>}
{dropdown && (
<StandaloneChevronDownRegularIcon
width={24}
height={24}
<LabelPairedChevronDownSmRegularIcon
data-state={isDropdownOpen ? 'open' : 'close'}
className='rotate'
/>
Expand Down
15 changes: 15 additions & 0 deletions packages/trader/src/AppV2/Components/DatePicker/date-picker.scss
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
.date-picker__action-sheet {
padding: 0;

.react-calendar__month-view__days {
font-size: var(--core-fontSize-100);
}
//TODO: temporary CSS
.react-calendar__tile--now:after {
display: none;
}
}

.quill-date-picker__wrapper--fixed-width {
margin: auto;
}
53 changes: 53 additions & 0 deletions packages/trader/src/AppV2/Components/DatePicker/date-picker.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
import React from 'react';
import { ActionSheet, DatePicker } from '@deriv-com/quill-ui';
import { toMoment } from '@deriv/shared';
import { Localize } from '@deriv/translations';

type TDateRangePicker = {
isOpen?: boolean;
onClose: () => void;
setSelectedDateRangeString: React.Dispatch<React.SetStateAction<string | undefined>>;
handleDateChange: (values: { to?: moment.Moment; from?: moment.Moment; is_batch?: boolean }) => void;
};
const DateRangePicker = ({ isOpen, onClose, setSelectedDateRangeString, handleDateChange }: TDateRangePicker) => {
const [chosenRangeString, setChosenRangeString] = React.useState<string>();
const [chosenRange, setChosenRange] = React.useState<(string | null | Date)[] | null | Date>([]);

const onApply = () => {
setSelectedDateRangeString(chosenRangeString);
if (Array.isArray(chosenRange) && chosenRange.length)
handleDateChange({ from: toMoment(chosenRange[0]), to: toMoment(chosenRange[1]) });
onClose();
};

return (
<ActionSheet.Root isOpen={isOpen} onClose={onClose} position='left'>
<ActionSheet.Portal>
<ActionSheet.Header title={<Localize i18n_default_text='Choose a date range' />} />
<ActionSheet.Content>
<DatePicker
selectRange
onFormattedDate={value => setChosenRangeString(value)}
className='date-picker__action-sheet'
onChange={value => setChosenRange(value)}
optionsConfig={{
day: '2-digit',
month: 'short',
year: 'numeric',
}}
/>
</ActionSheet.Content>
<ActionSheet.Footer
primaryAction={{
content: 'Apply',
onAction: onApply,
}}
alignment='vertical'
isPrimaryButtonDisabled={!chosenRangeString}
/>
</ActionSheet.Portal>
</ActionSheet.Root>
);
};

export default DateRangePicker;
4 changes: 4 additions & 0 deletions packages/trader/src/AppV2/Components/DatePicker/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
import DatePicker from './date-picker';
import './date-picker.scss';

export default DatePicker;
Original file line number Diff line number Diff line change
Expand Up @@ -14,5 +14,9 @@
align-items: center;
gap: var(--semantic-spacing-gap-sm);
}

.icon {
fill: var(--core-color-solid-slate-200);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ const EmptyPositions = ({ isClosedTab, noMatchesFound }: TEmptyPositionsProps) =
return (
<div className={`empty-positions__${isClosedTab ? 'closed' : 'open'}`}>
<div className='icon' data-testid='dt_empty_state_icon'>
<Icon iconSize='2xl' fill='var(--core-color-solid-slate-200)' />
<Icon iconSize='2xl' />
</div>
<div className='message'>
{/* There is an issue with tokens: the 'lg' size should give 18px but it's giving 20px, it's being discussed. */}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ const ContractTypeFilter = ({ setContractTypeFilter, contractTypeFilter }: TCont
isDropdownOpen={isDropdownOpen}
onClick={() => setIsDropdownOpen(!isDropdownOpen)}
selected={!!changedOptions.length}
size='sm'
/>
<ActionSheet.Root isOpen={isDropdownOpen} onClose={onActionSheetClose} position='left'>
<ActionSheet.Portal>
Expand All @@ -80,8 +81,7 @@ const ContractTypeFilter = ({ setContractTypeFilter, contractTypeFilter }: TCont
secondaryAction={{ content: 'Clear All', onAction: () => setChangedOptions([]) }}
alignment='vertical'
shouldCloseOnSecondaryButtonClick={false}
// TODO: replace className with disabling props after Quill library updates
className={`${changedOptions.length ? '' : 'disabled'}`}
isSecondaryButtonDisabled={!changedOptions.length}
/>
</ActionSheet.Portal>
</ActionSheet.Root>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import React from 'react';
import { Text } from '@deriv-com/quill-ui';
import { LabelPairedChevronRightSmBoldIcon } from '@deriv/quill-icons';
import { Localize } from '@deriv/translations';

type TCustomDateFilterButton = {
setShowDatePicker: React.Dispatch<React.SetStateAction<boolean>>;
selectedRangeDateString?: string;
};

const CustomDateFilterButton = ({ setShowDatePicker, selectedRangeDateString }: TCustomDateFilterButton) => (
<button className='custom-time-filter__wrapper' onClick={() => setShowDatePicker(true)}>
<Text size='md' className='custom-time-filter__label'>
<Localize i18n_default_text='Custom' />
</Text>
{selectedRangeDateString && (
<Text size='sm' color='quill-typography__color--subtle'>
{selectedRangeDateString}
</Text>
)}
<LabelPairedChevronRightSmBoldIcon className='custom-time-filter__icon' />
</button>
);

export default CustomDateFilterButton;
33 changes: 33 additions & 0 deletions packages/trader/src/AppV2/Components/Filter/filter.scss
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,41 @@
height: var(--core-size-2000);
padding-block: var(--core-spacing-400);

label {
flex-grow: 1;
}

&__wrapper {
padding-block: var(--core-spacing-800);

.quill-radio-button {
padding-block: var(--core-spacing-400);
width: 100%;

&__label {
font-size: var(--core-fontSize-100);
flex-grow: 1;
margin: 0;
}
}
}
}
}

.custom-time-filter {
&__wrapper {
display: flex;
gap: var(--core-spacing-400);
margin-block: var(--core-spacing-400);
width: 100%;
}

&__label {
flex-grow: 1;
}

&__icon {
width: var(--core-size-1200);
height: var(--core-size-1200);
}
}
Loading

0 comments on commit 4abfa7d

Please sign in to comment.