fixes activities key [fixes SCI-1628]

This commit is contained in:
zmagod 2017-10-04 13:45:52 +02:00
parent e9568bcd47
commit 4380a65caf
8 changed files with 76 additions and 73 deletions

View file

@ -1,13 +1,13 @@
// @flow
import React from "react"; import React from "react";
import PropTypes from "prop-types";
import Moment from "react-moment"; import Moment from "react-moment";
import { FormattedMessage } from "react-intl";
import styled from "styled-components"; import styled from "styled-components";
import { WHITE_COLOR } from "../../../config/constants/colors" import { WHITE_COLOR } from "../../../config/constants/colors";
const StyledLi = styled.li` const StyledLi = styled.li`margin-bottom: 1em;`;
margin-bottom: 1em;
`
const StyledSpan = styled.span` const StyledSpan = styled.span`
display: inline; display: inline;
@ -18,20 +18,20 @@ const StyledSpan = styled.span`
color: ${WHITE_COLOR}; color: ${WHITE_COLOR};
white-space: nowrap; white-space: nowrap;
vertical-align: baseline; vertical-align: baseline;
border-radius: .25em; border-radius: 0.25em;
`; `;
const ActivityDateElement = ({ date }) => const ActivityDateElement = (props: { date: Date, today?: boolean }) => {
const label = props.today ? (
<FormattedMessage id="activities.today"/>
) : (
<Moment format="DD.MM.YYYY">{props.date}</Moment>
);
return (
<StyledLi className="text-center"> <StyledLi className="text-center">
<StyledSpan className="label label-primary"> <StyledSpan className="label label-primary">{label}</StyledSpan>
<Moment format="DD.MM.YYYY"> </StyledLi>
{date} );
</Moment>
</StyledSpan>
</StyledLi>;
ActivityDateElement.propTypes = {
date: PropTypes.instanceOf(Date).isRequired
}; };
export default ActivityDateElement; export default ActivityDateElement;

View file

@ -60,16 +60,38 @@ type State = {
class GlobalActivitiesModal extends Component<Props, State> { class GlobalActivitiesModal extends Component<Props, State> {
displayActivities: Function; displayActivities: Function;
addMoreActivities: Function; addMoreActivities: Function;
loadData: Function;
onCloseModalActions: Function;
constructor(props: Props) { constructor(props: Props) {
super(props); super(props);
this.state = { activities: this.props.activites, more: this.props.more }; this.state = { activities: [], more: false };
this.displayActivities = this.displayActivities.bind(this); this.displayActivities = this.displayActivities.bind(this);
this.addMoreActivities = this.addMoreActivities.bind(this); this.addMoreActivities = this.addMoreActivities.bind(this);
this.onCloseModalActions = this.onCloseModalActions.bind(this);
this.loadData = this.loadData.bind(this);
}
loadData() {
getActivities().then(response => {
this.setState({
activities: response.activities,
more: response.more
});
});
}
onCloseModalActions() {
this.setState({ activities: [], more: false });
this.props.onCloseModal();
} }
displayActivities() { displayActivities() {
if (this.state.activities.length === 0) { if (this.state.activities.length === 0) {
if (this.props.showModal) {
this.loadData();
}
return ( return (
<li> <li>
<FormattedMessage id="activities.no_data" /> <FormattedMessage id="activities.no_data" />
@ -77,22 +99,34 @@ class GlobalActivitiesModal extends Component<Props, State> {
); );
} }
return this.state.activities.map((activity, i, arr) => { return this.state.activities.map((activity, i, arr) => {
const dateNow = new Date();
const newDate = new Date(activity.created_at); const newDate = new Date(activity.created_at);
if (i > 0) { if (i > 0) {
const prevDate = new Date(arr[i - 1].created_at); const prevDate = new Date(arr[i - 1].created_at);
if (prevDate < newDate) { if (prevDate.getDate() > newDate.getDate()) {
return [ return [
<ActivityDateElement key={newDate} date={newDate} />, <ActivityDateElement key={newDate} date={newDate} />,
<ActivityElement key={activity.id} activity={activity} /> <ActivityElement key={i} activity={activity} />
]; ];
} }
} else { } else {
if (
newDate.getDate() === dateNow.getDate() &&
newDate.getMonth() === dateNow.getMonth() &&
newDate.getFullYear() === dateNow.getFullYear()
) {
return [ return [
<ActivityDateElement key={newDate} date={newDate} />, <ActivityDateElement key={newDate} date={newDate} today />,
<ActivityElement key={activity.id} activity={activity} /> <ActivityElement key={i} activity={activity} />
]; ];
} }
return <ActivityElement key={activity.id} activity={activity} />; return [
<ActivityDateElement key={newDate} date={newDate} />,
<ActivityElement key={i} activity={activity} />
];
}
console.log("banana");
return <ActivityElement key={i} activity={activity} />;
}); });
} }
@ -109,7 +143,7 @@ class GlobalActivitiesModal extends Component<Props, State> {
} }
addMoreButton() { addMoreButton() {
if (this.props.more) { if (this.state.more) {
return ( return (
<li className="text-center"> <li className="text-center">
<StyledBottom onClick={this.addMoreActivities}> <StyledBottom onClick={this.addMoreActivities}>
@ -123,7 +157,7 @@ class GlobalActivitiesModal extends Component<Props, State> {
render() { render() {
return ( return (
<Modal show={this.props.showModal} onHide={this.props.onCloseModal}> <Modal show={this.props.showModal} onHide={this.onCloseModalActions}>
<Modal.Header closeButton> <Modal.Header closeButton>
<Modal.Title> <Modal.Title>
<FormattedMessage id="activities.modal_title" /> <FormattedMessage id="activities.modal_title" />
@ -136,7 +170,7 @@ class GlobalActivitiesModal extends Component<Props, State> {
</ul> </ul>
</StyledModalBody> </StyledModalBody>
<Modal.Footer> <Modal.Footer>
<Button onClick={this.props.onCloseModal}> <Button onClick={this.onCloseModalActions}>
<FormattedMessage id="general.close" /> <FormattedMessage id="general.close" />
</Button> </Button>
</Modal.Footer> </Modal.Footer>

View file

@ -9,7 +9,6 @@ import {
WHITE_COLOR, WHITE_COLOR,
BORDER_GRAY_COLOR BORDER_GRAY_COLOR
} from "../../config/constants/colors"; } from "../../config/constants/colors";
import { getActivities } from "../../services/api/activities_api";
import TeamSwitch from "./components/TeamSwitch"; import TeamSwitch from "./components/TeamSwitch";
import GlobalActivitiesModal from "./components/GlobalActivitiesModal"; import GlobalActivitiesModal from "./components/GlobalActivitiesModal";
@ -45,8 +44,6 @@ class Navigation extends Component {
super(props); super(props);
this.state = { this.state = {
showActivitesModal: false, showActivitesModal: false,
activities: [],
more: false,
current_team: { id: 0 } current_team: { id: 0 }
}; };
this.selectItemCallback = this.selectItemCallback.bind(this); this.selectItemCallback = this.selectItemCallback.bind(this);
@ -67,15 +64,6 @@ class Navigation extends Component {
case 4: case 4:
ev.preventDefault(); ev.preventDefault();
this.setState({ showActivitesModal: !this.state.showActivitesModal }); this.setState({ showActivitesModal: !this.state.showActivitesModal });
// load activites if modal is shown
if (this.state.showActivitesModal) {
getActivities().then(response => {
this.setState({
activities: response.activities,
more: response.more
});
});
}
break; break;
default: default:
} }
@ -141,8 +129,6 @@ class Navigation extends Component {
</Nav> </Nav>
</StyledNavbar> </StyledNavbar>
<GlobalActivitiesModal <GlobalActivitiesModal
activities={this.state.activites}
more={this.state.more}
showModal={this.state.showActivitesModal} showModal={this.state.showActivitesModal}
onCloseModal={this.closeModalCallback} onCloseModal={this.closeModalCallback}
/> />

View file

@ -1,6 +1,6 @@
import React, { Component } from "react"; // @flow
import { bool } from "prop-types";
import { connect } from "react-redux"; import React from "react";
import styled from "styled-components"; import styled from "styled-components";
const Wrapper = styled.div` const Wrapper = styled.div`
@ -18,10 +18,9 @@ const Wrapper = styled.div`
} }
`; `;
class Spinner extends Component { export default (props: { spinner_on: boolean }) => {
render() {
let spinner = <div />; let spinner = <div />;
if (this.props.spinner_on) { if (props.spinner_on) {
spinner = ( spinner = (
<Wrapper> <Wrapper>
<div className="center-box"> <div className="center-box">
@ -30,15 +29,5 @@ class Spinner extends Component {
</Wrapper> </Wrapper>
); );
} }
return spinner; return spinner;
}
}
Spinner.propTypes = {
spinner_on: bool.isRequired
}; };
const mapStateToProps = state => state.global_activities;
export default connect(mapStateToProps, {})(Spinner);

View file

@ -28,10 +28,6 @@ export const LEAVE_TEAM = "LEAVE_TEAM";
export const SHOW_LEAVE_TEAM_MODAL = "SHOW_LEAVE_TEAM_MODAL"; export const SHOW_LEAVE_TEAM_MODAL = "SHOW_LEAVE_TEAM_MODAL";
export const UPDATE_TEAM_DESCRIPTION_MODAL = "UPDATE_TEAM_DESCRIPTION_MODAL"; export const UPDATE_TEAM_DESCRIPTION_MODAL = "UPDATE_TEAM_DESCRIPTION_MODAL";
// spinner
export const SPINNER_ON = "SPINNER_ON";
export const SPINNER_OFF = "SPINNER_OFF";
// alerts // alerts
export const ADD_ALERT = "ADD_ALERT"; export const ADD_ALERT = "ADD_ALERT";
export const CLEAR_ALERT = "CLEAR_ALERT"; export const CLEAR_ALERT = "CLEAR_ALERT";

View file

@ -161,7 +161,8 @@ export default {
activities: { activities: {
modal_title: "Activities", modal_title: "Activities",
no_data: "No Data", no_data: "No Data",
more_activities: "More Activities" more_activities: "More Activities",
today: "Today"
}, },
global_team_switch: { global_team_switch: {
new_team: "New team" new_team: "New team"

View file

@ -8,7 +8,6 @@ import { flattenMessages } from "./config/locales/utils";
import messages from "./config/locales/messages"; import messages from "./config/locales/messages";
import store from "./config/store"; import store from "./config/store";
import Spinner from "./components/Spinner";
import AlertsContainer from "./components/AlertsContainer"; import AlertsContainer from "./components/AlertsContainer";
import ModalsContainer from "./components/ModalsContainer"; import ModalsContainer from "./components/ModalsContainer";
import SettingsPage from "./scenes/SettingsPage"; import SettingsPage from "./scenes/SettingsPage";
@ -35,9 +34,7 @@ const ScinoteApp = () =>
</ContentWrapper> </ContentWrapper>
</div> </div>
</BrowserRouter> </BrowserRouter>
<ModalsContainer /> <ModalsContainer />
<Spinner />
</div> </div>
</IntlProvider> </IntlProvider>
</Provider>; </Provider>;

View file

@ -6,5 +6,5 @@ export function getActivities(
lastId: number = 0 lastId: number = 0
): Promise<*> { ): Promise<*> {
const path = `${ACTIVITIES_PATH}?from=${lastId}`; const path = `${ACTIVITIES_PATH}?from=${lastId}`;
return axiosInstance.get(path).then(({ data }) => data); return axiosInstance.get(path).then(({ data }) => data.global_activities);
} }