Skip to content

Commit

Permalink
Merge pull request #296 from mikecao/dev
Browse files Browse the repository at this point in the history
v0.96.0 Realtime dashboard
  • Loading branch information
mikecao authored Oct 14, 2020
2 parents 6c4f0f6 + e0a7fd9 commit f13d7cf
Show file tree
Hide file tree
Showing 109 changed files with 2,377 additions and 1,201 deletions.
1 change: 1 addition & 0 deletions assets/bolt.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 1 addition & 0 deletions assets/eye.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 1 addition & 0 deletions assets/visitor.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 1 addition & 1 deletion components/common/CopyButton.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import Button from './Button';
import { FormattedMessage } from 'react-intl';

const defaultText = (
<FormattedMessage id="button.copy-to-clipboard" defaultMessage="Copy to clipboard" />
<FormattedMessage id="label.copy-to-clipboard" defaultMessage="Copy to clipboard" />
);

export default function CopyButton({ element, ...props }) {
Expand Down
15 changes: 15 additions & 0 deletions components/common/Dot.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import React from 'react';
import classNames from 'classnames';
import styles from './Dot.module.css';

export default function Dot({ color, size, className }) {
return (
<div
style={{ background: color }}
className={classNames(styles.dot, className, {
[styles.small]: size === 'small',
[styles.large]: size === 'large',
})}
/>
);
}
17 changes: 17 additions & 0 deletions components/common/Dot.module.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
.dot {
background: var(--green400);
width: 10px;
height: 10px;
border-radius: 100%;
margin-right: 10px;
}

.dot.small {
width: 8px;
height: 8px;
}

.dot.large {
width: 16px;
height: 16px;
}
2 changes: 1 addition & 1 deletion components/common/EmptyPlaceholder.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import styles from './EmptyPlaceholder.module.css';
export default function EmptyPlaceholder({ msg, children }) {
return (
<div className={styles.placeholder}>
<Icon icon={<Logo />} size="xlarge" />
<Icon className={styles.icon} icon={<Logo />} size="xlarge" />
<h2>{msg}</h2>
{children}
</div>
Expand Down
4 changes: 4 additions & 0 deletions components/common/EmptyPlaceholder.module.css
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,7 @@
align-items: center;
min-height: 600px;
}

.icon {
margin-bottom: 30px;
}
11 changes: 11 additions & 0 deletions components/common/FilterButtons.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import React from 'react';
import ButtonLayout from 'components/layout/ButtonLayout';
import ButtonGroup from './ButtonGroup';

export default function FilterButtons({ buttons, selected, onClick }) {
return (
<ButtonLayout>
<ButtonGroup size="xsmall" items={buttons} selectedItem={selected} onClick={onClick} />
</ButtonLayout>
);
}
4 changes: 2 additions & 2 deletions components/common/RefreshButton.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ export default function RefreshButton({ websiteId }) {
const dispatch = useDispatch();
const [dateRange] = useDateRange(websiteId);
const [loading, setLoading] = useState(false);
const completed = useSelector(state => state.queries[`/api/website/${websiteId}/metrics`]);
const completed = useSelector(state => state.queries[`/api/website/${websiteId}/stats`]);

function handleClick() {
if (dateRange) {
Expand All @@ -28,7 +28,7 @@ export default function RefreshButton({ websiteId }) {
return (
<Button
icon={loading ? <Dots /> : <Refresh />}
tooltip={<FormattedMessage id="button.refresh" defaultMessage="Refresh" />}
tooltip={<FormattedMessage id="label.refresh" defaultMessage="Refresh" />}
tooltipId="button-refresh"
size="small"
onClick={handleClick}
Expand Down
72 changes: 45 additions & 27 deletions components/common/Table.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,40 +3,58 @@ import classNames from 'classnames';
import NoData from 'components/common/NoData';
import styles from './Table.module.css';

export default function Table({ columns, rows, empty }) {
export default function Table({
columns,
rows,
empty,
className,
bodyClassName,
rowKey,
showHeader = true,
children,
}) {
if (empty && rows.length === 0) {
return empty;
}

return (
<div className={styles.table}>
<div className={classNames(styles.header, 'row')}>
{columns.map(({ key, label, className, style, header }) => (
<div
key={key}
className={classNames(styles.head, className, header?.className)}
style={{ ...style, ...header?.style }}
>
{label}
</div>
))}
</div>
<div className={styles.body}>
<div className={classNames(styles.table, className)}>
{showHeader && (
<div className={classNames(styles.header, 'row')}>
{columns.map(({ key, label, className, style, header }) => (
<div
key={key}
className={classNames(styles.head, className, header?.className)}
style={{ ...style, ...header?.style }}
>
{label}
</div>
))}
</div>
)}
<div className={classNames(styles.body, bodyClassName)}>
{rows.length === 0 && <NoData />}
{rows.map((row, rowIndex) => (
<div className={classNames(styles.row, 'row')} key={rowIndex}>
{columns.map(({ key, render, className, style, cell }) => (
<div
key={`${rowIndex}${key}`}
className={classNames(styles.cell, className, cell?.className)}
style={{ ...style, ...cell?.style }}
>
{render ? render(row) : row[key]}
</div>
))}
</div>
))}
{!children &&
rows.map((row, index) => {
const id = rowKey ? rowKey(row) : index;
return <TableRow key={id} columns={columns} row={row} />;
})}
{children}
</div>
</div>
);
}

export const TableRow = ({ columns, row }) => (
<div className={classNames(styles.row, 'row')}>
{columns.map(({ key, render, className, style, cell }, index) => (
<div
key={`${key}-${index}`}
className={classNames(styles.cell, className, cell?.className)}
style={{ ...style, ...cell?.style }}
>
{render ? render(row) : row[key]}
</div>
))}
</div>
);
7 changes: 7 additions & 0 deletions components/common/Tag.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import React from 'react';
import classNames from 'classnames';
import styles from './Tag.module.css';

export default function Tag({ className, children }) {
return <span className={classNames(styles.tag, className)}>{children}</span>;
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
.type {
font-size: var(--font-size-small);
.tag {
padding: 2px 4px;
border: 1px solid var(--gray300);
border-radius: 4px;
Expand Down
4 changes: 2 additions & 2 deletions components/common/UpdateNotice.js
Original file line number Diff line number Diff line change
Expand Up @@ -36,10 +36,10 @@ export default function UpdateNotice() {
</div>
<ButtonLayout>
<Button size="xsmall" variant="action" onClick={handleViewClick}>
<FormattedMessage id="button.view-details" defaultMessage="View details" />
<FormattedMessage id="label.view-details" defaultMessage="View details" />
</Button>
<Button size="xsmall" onClick={handleDismissClick}>
<FormattedMessage id="button.dismiss" defaultMessage="Dismiss" />
<FormattedMessage id="label.dismiss" defaultMessage="Dismiss" />
</Button>
</ButtonLayout>
</div>
Expand Down
4 changes: 2 additions & 2 deletions components/forms/AccountEditForm.js
Original file line number Diff line number Diff line change
Expand Up @@ -70,10 +70,10 @@ export default function AccountEditForm({ values, onSave, onClose }) {
</FormRow>
<FormButtons>
<Button type="submit" variant="action">
<FormattedMessage id="button.save" defaultMessage="Save" />
<FormattedMessage id="label.save" defaultMessage="Save" />
</Button>
<Button onClick={onClose}>
<FormattedMessage id="button.cancel" defaultMessage="Cancel" />
<FormattedMessage id="label.cancel" defaultMessage="Cancel" />
</Button>
</FormButtons>
<FormMessage>{message}</FormMessage>
Expand Down
4 changes: 2 additions & 2 deletions components/forms/ChangePasswordForm.js
Original file line number Diff line number Diff line change
Expand Up @@ -85,10 +85,10 @@ export default function ChangePasswordForm({ values, onSave, onClose }) {
</FormRow>
<FormButtons>
<Button type="submit" variant="action">
<FormattedMessage id="button.save" defaultMessage="Save" />
<FormattedMessage id="label.save" defaultMessage="Save" />
</Button>
<Button onClick={onClose}>
<FormattedMessage id="button.cancel" defaultMessage="Cancel" />
<FormattedMessage id="label.cancel" defaultMessage="Cancel" />
</Button>
</FormButtons>
<FormMessage>{message}</FormMessage>
Expand Down
8 changes: 4 additions & 4 deletions components/forms/DatePickerForm.js
Original file line number Diff line number Diff line change
Expand Up @@ -33,11 +33,11 @@ export default function DatePickerForm({

const buttons = [
{
label: <FormattedMessage id="button.single-day" defaultMessage="Single day" />,
label: <FormattedMessage id="label.single-day" defaultMessage="Single day" />,
value: FILTER_DAY,
},
{
label: <FormattedMessage id="button.date-range" defaultMessage="Date range" />,
label: <FormattedMessage id="label.date-range" defaultMessage="Date range" />,
value: FILTER_RANGE,
},
];
Expand Down Expand Up @@ -72,10 +72,10 @@ export default function DatePickerForm({
</div>
<FormButtons>
<Button variant="action" onClick={handleSave} disabled={disabled}>
<FormattedMessage id="button.save" defaultMessage="Save" />
<FormattedMessage id="label.save" defaultMessage="Save" />
</Button>
<Button onClick={onClose}>
<FormattedMessage id="button.cancel" defaultMessage="Cancel" />
<FormattedMessage id="label.cancel" defaultMessage="Cancel" />
</Button>
</FormButtons>
</div>
Expand Down
4 changes: 2 additions & 2 deletions components/forms/DeleteForm.js
Original file line number Diff line number Diff line change
Expand Up @@ -82,10 +82,10 @@ export default function DeleteForm({ values, onSave, onClose }) {
variant="danger"
disabled={props.values.confirmation !== CONFIRMATION_WORD}
>
<FormattedMessage id="button.delete" defaultMessage="Delete" />
<FormattedMessage id="label.delete" defaultMessage="Delete" />
</Button>
<Button onClick={onClose}>
<FormattedMessage id="button.cancel" defaultMessage="Cancel" />
<FormattedMessage id="label.cancel" defaultMessage="Cancel" />
</Button>
</FormButtons>
<FormMessage>{message}</FormMessage>
Expand Down
2 changes: 1 addition & 1 deletion components/forms/LoginForm.js
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ export default function LoginForm() {
</FormRow>
<FormButtons>
<Button type="submit" variant="action">
<FormattedMessage id="button.login" defaultMessage="Login" />
<FormattedMessage id="label.login" defaultMessage="Login" />
</Button>
</FormButtons>
<FormMessage>{message}</FormMessage>
Expand Down
2 changes: 1 addition & 1 deletion components/forms/ShareUrlForm.js
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ export default function TrackingCodeForm({ values, onClose }) {
<FormButtons>
<CopyButton type="submit" variant="action" element={ref} />
<Button onClick={onClose}>
<FormattedMessage id="button.cancel" defaultMessage="Cancel" />
<FormattedMessage id="label.cancel" defaultMessage="Cancel" />
</Button>
</FormButtons>
</FormLayout>
Expand Down
2 changes: 1 addition & 1 deletion components/forms/TrackingCodeForm.js
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ export default function TrackingCodeForm({ values, onClose }) {
<FormButtons>
<CopyButton type="submit" variant="action" element={ref} />
<Button onClick={onClose}>
<FormattedMessage id="button.cancel" defaultMessage="Cancel" />
<FormattedMessage id="label.cancel" defaultMessage="Cancel" />
</Button>
</FormButtons>
</FormLayout>
Expand Down
4 changes: 2 additions & 2 deletions components/forms/WebsiteEditForm.js
Original file line number Diff line number Diff line change
Expand Up @@ -91,10 +91,10 @@ export default function WebsiteEditForm({ values, onSave, onClose }) {
</FormRow>
<FormButtons>
<Button type="submit" variant="action">
<FormattedMessage id="button.save" defaultMessage="Save" />
<FormattedMessage id="label.save" defaultMessage="Save" />
</Button>
<Button onClick={onClose}>
<FormattedMessage id="button.cancel" defaultMessage="Cancel" />
<FormattedMessage id="label.cancel" defaultMessage="Cancel" />
</Button>
</FormButtons>
<FormMessage>{message}</FormMessage>
Expand Down
4 changes: 3 additions & 1 deletion components/layout/Footer.js
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,9 @@ export default function Footer() {
}}
/>
</div>
<div className={classNames(styles.version, 'col-12 col-md-4')}>{`v${current}`}</div>
<div className={classNames(styles.version, 'col-12 col-md-4')}>
<Link href={`https://github.com/mikecao/umami/releases`}>{`v${current}`}</Link>
</div>
</div>
</footer>
);
Expand Down
31 changes: 31 additions & 0 deletions components/layout/GridLayout.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import React from 'react';
import classNames from 'classnames';
import styles from './GridLayout.module.css';

export default function GridLayout({ className, children }) {
return <div className={classNames(styles.grid, className)}>{children}</div>;
}

export const GridRow = ({ className, children }) => {
return <div className={classNames(styles.row, className, 'row')}>{children}</div>;
};

export const GridColumn = ({ xs, sm, md, lg, xl, className, children }) => {
const classes = [];

classes.push(xs ? `col-${xs}` : 'col-12');

if (sm) {
classes.push(`col-sm-${sm}`);
}
if (md) {
classes.push(`col-md-${md}`);
}
if (lg) {
classes.push(`col-lg-${lg}`);
}
if (xl) {
classes.push(`col-lg-${xl}`);
}
return <div className={classNames(styles.col, classes, className)}>{children}</div>;
};
Loading

1 comment on commit f13d7cf

@vercel
Copy link

@vercel vercel bot commented on f13d7cf Oct 14, 2020

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please sign in to comment.