/*
Copyright (C) 2017 Cloudbase Solutions SRL
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see .
*/
import * as React from 'react'
import { observer } from 'mobx-react'
import styled from 'styled-components'
import { Link } from 'react-router-dom'
import StatusIcon from '@src/components/ui/StatusComponents/StatusIcon'
import StatusImage from '@src/components/ui/StatusComponents/StatusImage'
import Button from '@src/components/ui/Button'
import {
InfoColumn, MainItemInfo, ItemReplicaBadge, ItemTitle, ItemDescription,
} from '@src/components/ui/Dropdowns/NotificationDropdown'
import type { NotificationItemData } from '@src/@types/NotificationItem'
import { ThemePalette, ThemeProps } from '@src/components/Theme'
import replicaImage from './images/replica.svg'
const Wrapper = styled.div`
flex-grow: 1;
`
const Title = styled.div`
font-size: 24px;
font-weight: ${ThemeProps.fontWeights.light};
margin-bottom: 12px;
`
const Module = styled.div`
background: ${ThemePalette.grayscale[0]};
display: flex;
overflow: hidden;
border-radius: ${ThemeProps.borderRadius};
height: 273px;
`
const LoadingWrapper = styled.div`
width: 100%;
height: 100%;
display: flex;
justify-content: center;
align-items: center;
overflow: hidden;
`
const List = styled.div`
width: 100%;
display: flex;
flex-direction: column;
flex-wrap: wrap;
`
const ListItem = styled(Link)`
padding: 8px 16px 8px 16px;
cursor: pointer;
text-decoration: none;
color: inherit;
display: block;
transition: all ${ThemeProps.animations.swift};
&:hover {
background: ${ThemePalette.grayscale[1]};
}
`
const NoItems = styled.div`
display: flex;
flex-direction: column;
align-items: center;
width: 100%;
`
const ReplicaImage = styled.div`
${ThemeProps.exactSize('148px')}
background: url('${replicaImage}') center no-repeat;
`
const Message = styled.div`
text-align: center;
margin-bottom: 32px;
`
type Props = {
notificationItems: NotificationItemData[],
style?: React.CSSProperties | null,
loading?: boolean,
large?: boolean,
onNewClick?: () => void,
}
@observer
class DashboardActivity extends React.Component {
renderList() {
return (
{this.props.notificationItems
.filter((_, i) => i < (this.props.large ? 10 : 5)).map((item, i) => {
const executionsHref = item.status === 'RUNNING' ? item.type === 'replica' ? '/executions' : item.type === 'migration' ? '/tasks' : '' : ''
return (
{item.type === 'replica' ? 'RE' : 'MI'}
{item.name}{item.description}
)
})}
)
}
renderNoItems() {
return (
There is no recent activity in this project.
)
}
renderLoading() {
return (
)
}
render() {
return (
Recent Activity
{this.props.notificationItems.length === 0 && this.props.loading
? this.renderLoading() : this.props.notificationItems.length
? this.renderList() : this.renderNoItems()}
)
}
}
export default DashboardActivity