update pinned ui. remove paging if dashboard edited

This commit is contained in:
Francis Cao 2024-11-19 11:22:37 -08:00
parent 27295380b7
commit ec2f5203fe
4 changed files with 20 additions and 13 deletions

View File

@ -17,11 +17,6 @@
padding: 5px; padding: 5px;
} }
.pin {
width: 20px;
height: 20px;
}
.item h1 { .item h1 {
font-weight: 600; font-weight: 600;
font-size: 16px; font-size: 16px;

View File

@ -1,7 +1,7 @@
import { useState, useMemo, useEffect } from 'react'; import { useState, useMemo, useEffect } from 'react';
import { DragDropContext, Draggable, Droppable } from 'react-beautiful-dnd'; import { DragDropContext, Draggable, Droppable } from 'react-beautiful-dnd';
import classNames from 'classnames'; import classNames from 'classnames';
import { Button, Loading } from 'react-basics'; import { Button, Icon, Loading } from 'react-basics';
import Icons from 'components/icons'; import Icons from 'components/icons';
import { firstBy } from 'thenby'; import { firstBy } from 'thenby';
import useDashboard, { saveDashboard } from 'store/dashboard'; import useDashboard, { saveDashboard } from 'store/dashboard';
@ -12,10 +12,11 @@ const DRAG_ID = 'dashboard-website-ordering';
export function DashboardEdit({ teamId }: { teamId: string }) { export function DashboardEdit({ teamId }: { teamId: string }) {
const settings = useDashboard(); const settings = useDashboard();
const { websiteOrder, websiteActive } = settings; const { websiteOrder, websiteActive, isEdited } = settings;
const { formatMessage, labels } = useMessages(); const { formatMessage, labels } = useMessages();
const [order, setOrder] = useState(websiteOrder || []); const [order, setOrder] = useState(websiteOrder || []);
const [active, setActive] = useState(websiteActive || []); const [active, setActive] = useState(websiteActive || []);
const [edited, setEdited] = useState(isEdited);
const [websites, setWebsites] = useState([]); const [websites, setWebsites] = useState([]);
const { const {
@ -39,7 +40,10 @@ export function DashboardEdit({ teamId }: { teamId: string }) {
const ordered = useMemo(() => { const ordered = useMemo(() => {
if (websites) { if (websites) {
return websites return websites
.map((website: { id: any }) => ({ ...website, order: order.indexOf(website.id) })) .map((website: { id: any; name: string; domain: string }) => ({
...website,
order: order.indexOf(website.id),
}))
.sort(firstBy('order')); .sort(firstBy('order'));
} }
return []; return [];
@ -53,29 +57,33 @@ export function DashboardEdit({ teamId }: { teamId: string }) {
orderedWebsites.splice(destination.index, 0, removed); orderedWebsites.splice(destination.index, 0, removed);
setOrder(orderedWebsites.map(website => website?.id || 0)); setOrder(orderedWebsites.map(website => website?.id || 0));
setEdited(true);
} }
function handleActiveWebsites(id: string) { function handleActiveWebsites(id: string) {
setActive(prevActive => setActive(prevActive =>
prevActive.includes(id) ? prevActive.filter(a => a !== id) : [...prevActive, id], prevActive.includes(id) ? prevActive.filter(a => a !== id) : [...prevActive, id],
); );
setEdited(true);
} }
function handleSave() { function handleSave() {
saveDashboard({ saveDashboard({
editing: false, editing: false,
isEdited: edited,
websiteOrder: order, websiteOrder: order,
websiteActive: active, websiteActive: active,
}); });
} }
function handleCancel() { function handleCancel() {
saveDashboard({ editing: false, websiteOrder, websiteActive }); saveDashboard({ editing: false, websiteOrder, websiteActive, isEdited });
} }
function handleReset() { function handleReset() {
setOrder([]); setOrder([]);
setActive([]); setActive([]);
setEdited(false);
} }
if (isLoading) { if (isLoading) {
@ -115,11 +123,14 @@ export function DashboardEdit({ teamId }: { teamId: string }) {
})} })}
{...provided.draggableProps} {...provided.draggableProps}
{...provided.dragHandleProps} {...provided.dragHandleProps}
onClick={() => handleActiveWebsites(id)}
> >
<div className={styles.text}> <div className={styles.text}>
<div className={styles.pinActive}> <div className={styles.pinActive}>
{active.includes(id) ? <Icons.PushPin className={styles.pin} /> : null} <Button size="sm" onClick={() => handleActiveWebsites(id)}>
<Icon rotate={active.includes(id) ? 0 : 45}>
<Icons.PushPin />
</Icon>
</Button>
</div> </div>
<h1>{name}</h1> <h1>{name}</h1>
<h2>{domain}</h2> <h2>{domain}</h2>

View File

@ -13,9 +13,9 @@ import LinkButton from 'components/common/LinkButton';
export function DashboardPage() { export function DashboardPage() {
const { formatMessage, labels, messages } = useMessages(); const { formatMessage, labels, messages } = useMessages();
const { teamId, renderTeamUrl } = useTeamUrl(); const { teamId, renderTeamUrl } = useTeamUrl();
const { showCharts, editing } = useDashboard(); const { showCharts, editing, isEdited } = useDashboard();
const { dir } = useLocale(); const { dir } = useLocale();
const pageSize = 10; const pageSize = isEdited ? 200 : 10;
const { result, query, params, setParams } = useWebsites({ teamId }, { pageSize }); const { result, query, params, setParams } = useWebsites({ teamId }, { pageSize });
const { page } = params; const { page } = params;

View File

@ -8,6 +8,7 @@ export const initialState = {
websiteOrder: [], websiteOrder: [],
websiteActive: [], websiteActive: [],
editing: false, editing: false,
isEdited: false,
}; };
const store = create(() => ({ ...initialState, ...getItem(DASHBOARD_CONFIG) })); const store = create(() => ({ ...initialState, ...getItem(DASHBOARD_CONFIG) }));