/*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*
* OpenCRVS is also distributed under the terms of the Civil Registration
* & Healthcare Disclaimer located at http://opencrvs.org/license.
*
* Copyright (C) The OpenCRVS Authors located at https://github.com/opencrvs/opencrvs-core/blob/master/AUTHORS.
*/
import * as React from 'react'
import styled from 'styled-components'
import { Link } from '../Link'
import { Button } from '../Button'
const Container = styled.div`
display: flex;
flex-direction: row;
flex-wrap: nowrap;
border-bottom: 1px solid ${({ theme }) => theme.colors.grey200};
padding: 16px 0px;
width: 100%;
&:last-child {
border-bottom: none;
}
`
const ListDataContainer = styled.div`
align-items: center;
display: flex;
flex-grow: 1;
max-width: 90%;
@media (max-width: ${({ theme }) => theme.grid.breakpoints.md}px) {
flex-direction: column;
width: 100%;
}
`
const ValueContainer = styled.div`
width: 100%;
`
const Label = styled.label`
${({ theme }) => theme.fonts.bold16};
flex: 1;
margin-right: 10%;
max-width: 40%;
@media (max-width: ${({ theme }) => theme.grid.breakpoints.md}px) {
max-width: 100%;
${({ theme }) => theme.fonts.bold16};
margin-right: auto;
}
`
const Value = styled.div`
${({ theme }) => theme.fonts.reg16};
flex: 1;
overflow-wrap: break-word;
max-width: 50%;
@media (max-width: ${({ theme }) => theme.grid.breakpoints.md}px) {
${({ theme }) => theme.fonts.reg16};
max-width: 100%;
margin-right: auto;
}
`
const LabelValueLayer = styled.div`
width: 100%;
display: flex;
flex-flow: row;
@media (max-width: ${({ theme }) => theme.grid.breakpoints.md}px) {
${({ theme }) => theme.fonts.reg16};
width: 80%;
}
`
const HideOnMobile = styled.div`
display: inline;
@media (max-width: ${({ theme }) => theme.grid.breakpoints.md}px) {
display: none;
}
`
const HideOnDesktop = styled.div`
display: none;
@media (max-width: ${({ theme }) => theme.grid.breakpoints.md}px) {
display: flex;
}
`
const PlaceHolder = styled.div`
${({ theme }) => theme.fonts.reg16};
color: ${({ theme }) => theme.colors.supportingCopy};
flex: 1;
`
const Action = styled.div`
width: auto;
@media (max-width: ${({ theme }) => theme.grid.breakpoints.md}px) {
margin-left: auto;
}
`
const StatusContainer = styled.div`
width: auto;
margin-left: 250px;
@media (max-width: ${({ theme }) => theme.grid.breakpoints.md}px) {
margin-right: auto;
margin-top: 15px;
margin-left: 45px;
}
`
const MenuContainer = styled.div`
margin-left: 30%;
@media (max-width: ${({ theme }) => theme.grid.breakpoints.md}px) {
max-width: 40%;
margin-left: auto;
}
`
const ProfileInfoContainer = styled.div`
display: flex;
width: 10%;
white-space: nowrap;
@media (max-width: ${({ theme }) => theme.grid.breakpoints.md}px) {
margin-right: auto;
${({ theme }) => theme.fonts.reg16};
width: 50%;
}
`
interface IAction {
id?: string
label: string
disabled?: boolean
handler?: () => void
}
export interface IListRowProps {
id?: string
label: string | React.ReactNode
value?: React.ReactNode
placeHolder?: string
action?: IAction
actionsMenu?: React.ReactNode
actionType?: ActionType
isLinkLabel?: boolean
onClickLabelLink?: () => void
status?: React.ReactNode
nameWithAvatar?: React.ReactNode
}
export enum ActionType {
LINK = 'link',
ICON = 'icon',
BUTTON = 'button'
}
const RowLabel = ({
id,
label,
value,
placeHolder,
action,
actionsMenu,
actionType,
isLinkLabel,
onClickLabelLink,
nameWithAvatar,
status
}: IListRowProps) => (
<>
{isLinkLabel ? (
) : nameWithAvatar ? (
{nameWithAvatar}
) : (
)}
{value && {value}}
{placeHolder && (
{placeHolder}
)}
{status && {status}}
{actionsMenu && {actionsMenu}}
{action && (actionType === ActionType.LINK || !actionType) && (
{action.label}
)}
{action && actionType === ActionType.ICON && (
{action.label}
)}
{action && actionType === ActionType.BUTTON && (
)}
{actionsMenu && {actionsMenu}}
>
)
export const ListRow = (props: IListRowProps) => {
const { id, label, value } = props
if (label) {
return
}
return (
{value}
)
}