You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

170 lines
5.1 KiB
TypeScript

import * as React from 'react';
import IconButton from '@material-ui/core/IconButton';
import Tab from '@material-ui/core/Tab';
import Tabs from '@material-ui/core/Tabs';
import { Theme, withTheme } from '@material-ui/core/styles';
import IconEdit from '@material-ui/icons/Edit';
import IconMembers from '@material-ui/icons/People';
import IconImport from '@material-ui/icons/ImportExport';
import SearchableAddressBook from '../components/SearchableAddressBook';
import Contact from '../components/Contact';
import Calendar from '../components/Calendar';
import Event from '../components/Event';
import Task from '../components/Task';
import TaskList from '../components/TaskList';
import AppBarOverride from '../widgets/AppBarOverride';
import Container from '../widgets/Container';
import JournalEntries from '../components/JournalEntries';
import journalView from './journalView';
import ImportDialog from './ImportDialog';
import { syncEntriesToItemMap, syncEntriesToEventItemMap, syncEntriesToTaskItemMap } from '../journal-processors';
import { SyncInfo, SyncInfoJournal } from '../SyncGate';
import { Link } from 'react-router-dom';
import { routeResolver } from '../App';
import { historyPersistor } from '../persist-state-history';
import { CredentialsData, UserInfoData } from '../store';
interface PropsType {
etesync: CredentialsData;
userInfo: UserInfoData;
syncInfo: SyncInfo;
syncJournal: SyncInfoJournal;
isOwner: boolean;
}
interface PropsTypeInner extends PropsType {
theme: Theme;
}
const JournalAddressBook = journalView(SearchableAddressBook, Contact);
const PersistCalendar = historyPersistor('Calendar')(Calendar);
const JournalCalendar = journalView(PersistCalendar, Event);
const JournalTaskList = journalView(TaskList, Task);
class Journal extends React.Component<PropsTypeInner> {
public state: {
tab: number,
importDialogOpen: boolean,
};
constructor(props: PropsTypeInner) {
super(props);
this.importDialogToggle = this.importDialogToggle.bind(this);
this.state = {
tab: 0,
importDialogOpen: false,
};
}
public render() {
const { theme, isOwner, syncJournal } = this.props;
let currentTab = this.state.tab;
let journalOnly = false;
const journal = syncJournal.journal;
const collectionInfo = syncJournal.collection;
const syncEntries = syncJournal.entries;
let itemsTitle: string;
let itemsView: JSX.Element;
if (collectionInfo.type === 'CALENDAR') {
itemsView = (
<JournalCalendar
journal={journal}
entries={syncEntriesToEventItemMap(collectionInfo, syncEntries)}
/>);
itemsTitle = 'Events';
} else if (collectionInfo.type === 'ADDRESS_BOOK') {
itemsView =
<JournalAddressBook journal={journal} entries={syncEntriesToItemMap(collectionInfo, syncEntries)} />;
itemsTitle = 'Contacts';
} else if (collectionInfo.type === 'TASKS') {
itemsView = (
<JournalTaskList
journal={journal}
entries={syncEntriesToTaskItemMap(collectionInfo, syncEntries)}
/>);
itemsTitle = 'Tasks';
} else {
itemsView = <div>Preview is not supported for this journal type</div>;
itemsTitle = 'Items';
journalOnly = true;
}
currentTab = journalOnly ? 1 : currentTab;
return (
<React.Fragment>
<AppBarOverride title={collectionInfo.displayName}>
{ isOwner &&
<>
<IconButton
component={Link}
title="Edit"
{...{to: routeResolver.getRoute('journals._id.edit', { journalUid: journal.uid })}}
>
<IconEdit />
</IconButton>
<IconButton
component={Link}
title="Members"
{...{to: routeResolver.getRoute('journals._id.members', { journalUid: journal.uid })}}
>
<IconMembers />
</IconButton>
</>
}
<IconButton
title="Import"
onClick={this.importDialogToggle}
>
<IconImport />
</IconButton>
</AppBarOverride>
<Tabs
variant="fullWidth"
style={{ backgroundColor: theme.palette.primary.main }}
value={currentTab}
onChange={(event, tab) => this.setState({ tab })}
>
<Tab label={itemsTitle} disabled={journalOnly} />
<Tab label="Journal Entries" />
</Tabs>
{ currentTab === 0 &&
<Container>
{itemsView}
</Container>
}
{ currentTab === 1 &&
<Container>
<JournalEntries journal={journal} entries={syncEntries} />
</Container>
}
<ImportDialog
etesync={this.props.etesync}
userInfo={this.props.userInfo}
syncJournal={this.props.syncJournal}
open={this.state.importDialogOpen}
onClose={this.importDialogToggle}
/>
</React.Fragment>
);
}
private importDialogToggle() {
this.setState((state: any) => ({ importDialogOpen: !state.importDialogOpen }));
}
}
export default withTheme()(Journal);