From a5fcea1cd7afbfd2051fdd3845fe52542ddd4770 Mon Sep 17 00:00:00 2001 From: Bill Date: Wed, 17 Nov 2021 16:38:36 -0500 Subject: [PATCH] Layout accordion updates --- src/assets/styles/utils.scss | 4 ++ .../accordion/NitroCardAccordionContext.tsx | 21 +++++++ .../accordion/NitroCardAccordionView.scss | 5 ++ .../card/accordion/NitroCardAccordionView.tsx | 29 ++++++++-- .../accordion/NitroCardAccordionView.types.ts | 6 +- .../set/NitroCardAccordionSetView.scss | 7 ++- .../set/NitroCardAccordionSetView.tsx | 58 ++++++++++++++++++- 7 files changed, 120 insertions(+), 10 deletions(-) create mode 100644 src/layout/card/accordion/NitroCardAccordionContext.tsx diff --git a/src/assets/styles/utils.scss b/src/assets/styles/utils.scss index e0ccc5d4..e90775c4 100644 --- a/src/assets/styles/utils.scss +++ b/src/assets/styles/utils.scss @@ -70,3 +70,7 @@ ul { .grayscale { filter: grayscale(1); } + +.flex-none { + flex: none; +} diff --git a/src/layout/card/accordion/NitroCardAccordionContext.tsx b/src/layout/card/accordion/NitroCardAccordionContext.tsx new file mode 100644 index 00000000..61377d54 --- /dev/null +++ b/src/layout/card/accordion/NitroCardAccordionContext.tsx @@ -0,0 +1,21 @@ +import { createContext, Dispatch, FC, ProviderProps, SetStateAction, useContext } from 'react'; + +export interface INitroCardAccordionContext +{ + closers: Function[]; + setClosers: Dispatch>; + closeAll: () => void; +} + +const NitroCardAccordionContext = createContext({ + closers: null, + setClosers: null, + closeAll: null +}); + +export const NitroCardAccordionContextProvider: FC> = props => +{ + return ; +} + +export const useNitroCardAccordionContext = () => useContext(NitroCardAccordionContext); diff --git a/src/layout/card/accordion/NitroCardAccordionView.scss b/src/layout/card/accordion/NitroCardAccordionView.scss index 417a6cc6..906aa63f 100644 --- a/src/layout/card/accordion/NitroCardAccordionView.scss +++ b/src/layout/card/accordion/NitroCardAccordionView.scss @@ -1 +1,6 @@ +.nitro-card-accordion { + display: flex; + height: 100%; +} + @import "./set/NitroCardAccordionSetView"; diff --git a/src/layout/card/accordion/NitroCardAccordionView.tsx b/src/layout/card/accordion/NitroCardAccordionView.tsx index 40a68384..8088a8c7 100644 --- a/src/layout/card/accordion/NitroCardAccordionView.tsx +++ b/src/layout/card/accordion/NitroCardAccordionView.tsx @@ -1,13 +1,32 @@ -import { FC } from 'react'; +import { FC, useCallback, useMemo, useState } from 'react'; +import { NitroLayoutFlexColumn } from '../..'; +import { NitroCardAccordionContextProvider } from './NitroCardAccordionContext'; import { NitroCardAccordionViewProps } from './NitroCardAccordionView.types'; export const NitroCardAccordionView: FC = props => { - const { className = '' } = props; + const { className = '', children = null, ...rest } = props; + const [ closers, setClosers ] = useState([]); + + const getClassName = useMemo(() => + { + let newClassName = 'nitro-card-accordion text-black'; + + if(className && className.length) newClassName += ` ${ className }`; + + return newClassName; + }, [ className ]); + + const closeAll = useCallback(() => + { + for(const closer of closers) closer(); + }, [ closers ]); return ( -
- { props.children } -
+ + + { children } + + ); } diff --git a/src/layout/card/accordion/NitroCardAccordionView.types.ts b/src/layout/card/accordion/NitroCardAccordionView.types.ts index 73b8bbe3..fe87b21a 100644 --- a/src/layout/card/accordion/NitroCardAccordionView.types.ts +++ b/src/layout/card/accordion/NitroCardAccordionView.types.ts @@ -1,4 +1,6 @@ -export interface NitroCardAccordionViewProps +import { NitroLayoutFlexColumnProps } from '../..'; + +export interface NitroCardAccordionViewProps extends NitroLayoutFlexColumnProps { - className?: string; + } diff --git a/src/layout/card/accordion/set/NitroCardAccordionSetView.scss b/src/layout/card/accordion/set/NitroCardAccordionSetView.scss index 24324967..6380fe23 100644 --- a/src/layout/card/accordion/set/NitroCardAccordionSetView.scss +++ b/src/layout/card/accordion/set/NitroCardAccordionSetView.scss @@ -1,9 +1,14 @@ .nitro-card-accordion-set { + + &.active { + height: 100%; + background: rgba($white, 0.5); + } + .nitro-card-accordion-set-header { border-bottom: 1px solid rgba($black, 0.2); } .nitro-card-accordion-set-content { - background: rgba($white, 0.5); } } diff --git a/src/layout/card/accordion/set/NitroCardAccordionSetView.tsx b/src/layout/card/accordion/set/NitroCardAccordionSetView.tsx index dcc513ea..94958c02 100644 --- a/src/layout/card/accordion/set/NitroCardAccordionSetView.tsx +++ b/src/layout/card/accordion/set/NitroCardAccordionSetView.tsx @@ -1,13 +1,15 @@ import classNames from 'classnames'; -import { FC, useEffect, useMemo, useState } from 'react'; +import { FC, useCallback, useEffect, useMemo, useState } from 'react'; import { NitroLayoutFlex } from '../../..'; import { NitroLayoutBase } from '../../../base'; +import { useNitroCardAccordionContext } from '../NitroCardAccordionContext'; import { NitroCardAccordionSetViewProps } from './NitroCardAccordionSetView.types'; export const NitroCardAccordionSetView: FC = props => { const { headerText = '', isExpanded = false, className = '', children = null, ...rest } = props; const [ isOpen, setIsOpen ] = useState(false); + const { setClosers = null, closeAll = null } = useNitroCardAccordionContext(); const getClassName = useMemo(() => { @@ -20,14 +22,66 @@ export const NitroCardAccordionSetView: FC = pro return newClassName; }, [ className, isOpen ]); + const onClick = useCallback(() => + { + closeAll(); + + setIsOpen(prevValue => !prevValue); + // if(isOpen) + // { + // closeAll(); + // } + // else + // { + // BatchUpdates(() => + // { + // closeAll(); + // setIsOpen(true); + // }); + // } + }, [ closeAll ]); + + const close = useCallback(() => + { + setIsOpen(false); + }, []); + useEffect(() => { setIsOpen(isExpanded); }, [ isExpanded ]); + useEffect(() => + { + const closeFunction = close; + + setClosers(prevValue => + { + const newClosers = [ ...prevValue ]; + + newClosers.push(closeFunction); + + return newClosers; + }); + + return () => + { + setClosers(prevValue => + { + const newClosers = [ ...prevValue ]; + + const index = newClosers.indexOf(closeFunction); + + if(index >= 0) newClosers.splice(index, 1); + + return newClosers; + }); + } + }, [ close, setClosers ]); + return ( - setIsOpen(!isOpen) }> +
{ headerText }