/*
* 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 React from 'react'
import styled from 'styled-components'
export type IRowListViewSize = 'small' | 'medium'
const Grid = styled.div<{
bottomBorder: boolean
rowHeight?: IRowListViewSize
}>`
display: grid;
grid-template-columns: auto 1fr auto;
${({ rowHeight }) =>
rowHeight === 'medium' && 'grid-auto-rows: minmax(56px, auto);'}
${({ rowHeight }) =>
rowHeight === 'small' && 'grid-auto-rows: minmax(48px, auto);'}
${({ bottomBorder }) => bottomBorder && 'border-bottom: 1px solid'};
border-color: ${({ theme }) => theme.colors.grey200};
> div:not(:nth-last-child(-n + 4)) {
border-bottom: 1px solid ${({ theme }) => theme.colors.grey200};
}
@media (max-width: ${({ theme }) => theme.grid.breakpoints.md}px) {
grid-template-columns: auto;
> div:not(:nth-last-child(-n + 1)) {
border-bottom: 1px solid ${({ theme }) => theme.colors.grey200};
}
}
`
const LabelValueContainer = styled.div`
display: flex;
padding: 8px 0;
grid-column-start: 2;
gap: 20px;
@media (max-width: ${({ theme }) => theme.grid.breakpoints.md}px) {
display: none;
}
`
const ValueContainer = styled.div<{ compactLabel?: boolean }>`
display: flex;
${({ compactLabel }) => (!compactLabel ? 'flex: 0 1 50%;' : '')}
${({ compactLabel }) => (compactLabel ? 'margin:0 auto;' : '')}
align-items: center;
color: ${({ theme }) => theme.colors.grey600};
@media (max-width: ${({ theme }) => theme.grid.breakpoints.md}px) {
display: none;
}
`
const MobileValueContainer = styled(ValueContainer)`
@media (max-width: ${({ theme }) => theme.grid.breakpoints.md}px) {
display: block;
padding-left: 0;
flex: 1;
grid-row-start: 2;
grid-column: 2;
align-items: center;
}
`
const LabelContainer = styled.div<{ compactLabel?: boolean }>`
display: flex;
${({ compactLabel }) => (!compactLabel ? 'flex: 1 0 50%;' : '')}
align-items: center;
button > div {
padding: 0;
}
@media (max-width: ${({ theme }) => theme.grid.breakpoints.md}px) {
display: none;
}
`
const MobileLabelContainer = styled(LabelContainer)`
@media (max-width: ${({ theme }) => theme.grid.breakpoints.md}px) {
display: block;
grid-column-start: 2;
align-self: center;
}
`
const ActionsContainer = styled.div`
display: flex;
padding: 8px 0;
gap: 8px;
align-items: center;
justify-content: right;
@media (max-width: ${({ theme }) => theme.grid.breakpoints.md}px) {
display: none;
}
`
const ImageContainer = styled.div`
display: flex;
align-items: center;
padding-right: 16px;
@media (max-width: ${({ theme }) => theme.grid.breakpoints.md}px) {
display: none;
}
`
const MobileImageContainer = styled.div`
display: flex;
align-items: center;
padding-right: 16px;
`
const MobileContainer = styled.div`
display: none;
@media (max-width: ${({ theme }) => theme.grid.breakpoints.md}px) {
display: grid;
padding-top: 8px;
padding-bottom: 16px;
grid-template-rows: auto auto;
grid-template-columns: auto 1fr auto;
}
`
const MobileActionsContainer = styled.div`
display: flex;
gap: 4px;
align-items: center;
justify-content: right;
`
export interface IListViewItemSimplifiedProps {
image?: React.ReactNode
label: React.ReactNode
value?: React.ReactNode
actions?: React.ReactNode
className?: string
compactLabel?: boolean
}
/**
* Use the list view to summarise information, for example a user’s responce at the declaration form or for showing performance data
*/
export function ListViewItemSimplified({
image,
label,
value,
className,
actions,
compactLabel
}: IListViewItemSimplifiedProps) {
return (
{image && (
{image}
)}
{label}
{value && (
{value}
)}
{actions}
{image && {image}}
{label}
{actions}
{value && {value}}
)
}
export function ListViewSimplified({
className,
bottomBorder = false,
children,
id,
rowHeight = 'medium'
}: {
bottomBorder?: boolean
className?: string
children: React.ReactNode
id?: string
rowHeight?: IRowListViewSize
}) {
return (
{children}
)
}