Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

VUU-33 add context for layouts #35

Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions vuu-ui/packages/vuu-filters/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,4 @@ export * from "./filter-bar";
export * from "./filter-clause";
export * from "./filter-input";
export * from "./filter-utils";
export * from "./local-config";
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
padding: 8px 0px;
align-self: stretch;
flex: 1 1 auto;
cursor: pointer;
}

.vuuLayoutList-layoutName {
Expand Down
16 changes: 13 additions & 3 deletions vuu-ui/packages/vuu-shell/src/layout-management/LayoutList.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { List } from '@finos/vuu-ui-controls';
import { LayoutMetadata } from './layoutTypes';
import { useLayoutManager } from './useLayoutManager';

import './LayoutList.css'

Expand All @@ -9,10 +10,18 @@ type LayoutGroups = {

const classBase = "vuuLayoutList";

export const LayoutsList = (props: { layouts: LayoutMetadata[] }) => {
const { layouts } = props;
export const LayoutsList = () => {
const { layouts } = useLayoutManager();

const layoutsByGroup = layouts.reduce((acc: LayoutGroups, cur) => {
const layoutMetadata = layouts.map(layout => layout.metadata)

const handleLoadLayout = (layoutId?: string) => {
// TODO load layout
console.log("loading layout with id", layoutId)
console.log("json:", layouts.find(layout => layout.metadata.id === layoutId))
}

const layoutsByGroup = layoutMetadata.reduce((acc: LayoutGroups, cur) => {
if (acc[cur.group]) {
return {
...acc,
Expand Down Expand Up @@ -40,6 +49,7 @@ export const LayoutsList = (props: { layouts: LayoutMetadata[] }) => {
<div
className={`${classBase}-layoutContainer`}
key={layout?.id}
onClick={() => handleLoadLayout(layout?.id)}
>
<img className={`${classBase}-screenshot`} src={layout?.screenshot} />
<div>
Expand Down
41 changes: 31 additions & 10 deletions vuu-ui/packages/vuu-shell/src/layout-management/SaveLayoutPanel.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
import { ChangeEvent, useState } from "react";
import { ChangeEvent, useEffect, useState } from "react";
import { Input, Button, FormField, FormFieldLabel, Text } from "@salt-ds/core";
import { ComboBox, Checkbox, RadioButton, RadioIcon } from "@finos/vuu-ui-controls";
import { ComboBox, Checkbox, RadioButton } from "@finos/vuu-ui-controls";
import { formatDate, takeScreenshot } from "@finos/vuu-utils";
import { LayoutMetadata } from "./layoutTypes";

import "./SaveLayoutPanel.css";

Expand Down Expand Up @@ -30,17 +32,33 @@ type RadioValue = typeof radioValues[number];

type SaveLayoutPanelProps = {
onCancel: () => void;
onSave: (layoutName: string, group: string, checkValues: string[], radioValue: string) => void;
screenshot: string | undefined;
onSave: (layoutMetadata: Omit<LayoutMetadata, "id">) => void;
};

export const SaveLayoutPanel = (props: SaveLayoutPanelProps) => {
const { onCancel, onSave, screenshot } = props;
const { onCancel, onSave } = props;

const [layoutName, setLayoutName] = useState<string>("");
const [group, setGroup] = useState<string>("");
const [checkValues, setCheckValues] = useState<string[]>([]);
const [radioValue, setRadioValue] = useState<RadioValue>(radioValues[0]);
const [screenshot, setScreenshot] = useState<string | undefined>();

useEffect(() => {
takeScreenshot(document.getElementsByClassName("vuuShell-content")[0] as HTMLElement).then(screenshot =>
setScreenshot(screenshot)
)
}, [])

const handleSubmit = () => {
onSave({
name: layoutName,
group,
screenshot: screenshot ?? "",
user: "User",
date: formatDate(new Date(), "dd.mm.yyyy")
})
}

return (
<div className={`${classBase}-panelContainer`}>
Expand Down Expand Up @@ -118,14 +136,17 @@ export const SaveLayoutPanel = (props: SaveLayoutPanelProps) => {
</div>
</div>
<div className={`${classBase}-buttonsContainer`}>
<Button className={`${classBase}-cancelButton`} onClick={onCancel}>
Cancel
<Button
className={`${classBase}-cancelButton`}
onClick={onCancel}
>Cancel
</Button>
<Button
className={`${classBase}-saveButton`}
onClick={() => onSave(layoutName, group, checkValues, radioValue)}
disabled={layoutName === "" || group === ""}>
Save
onClick={handleSubmit}
disabled={layoutName === "" || group === ""}
>Save

</Button>
</div>
</div>
Expand Down
5 changes: 3 additions & 2 deletions vuu-ui/packages/vuu-shell/src/layout-management/index.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
export * from "./SaveLayoutPanel";
export * from "./LayoutList";
export * from "./layoutTypes";
export * from "./LayoutList"
export * from "./layoutTypes"
export * from "./useLayoutManager"
21 changes: 14 additions & 7 deletions vuu-ui/packages/vuu-shell/src/layout-management/layoutTypes.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,15 @@
import { LayoutJSON } from "@finos/vuu-layout";

export type LayoutMetadata = {
name: string,
group: string,
screenshot: string,
user: string,
date: string,
id: string
}
name: string;
group: string;
screenshot: string;
user: string;
date: string;
id: string;
};

export type Layout = {
json: LayoutJSON;
metadata: LayoutMetadata;
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
import React, { useState, useCallback, useContext, useEffect } from "react";
import { getLocalEntity, saveLocalEntity } from "@finos/vuu-filters";
import { LayoutJSON } from "@finos/vuu-layout";
import { getUniqueId } from "@finos/vuu-utils";
import { LayoutMetadata, Layout } from "./layoutTypes";

export const LayoutManagementContext = React.createContext<{
layouts: Layout[],
saveLayout: (n: Omit<LayoutMetadata, "id">) => void
}>({ layouts: [], saveLayout: () => { } })

export const LayoutManagementProvider = (props: { children: JSX.Element | JSX.Element[] }) => {

const [layouts, setLayouts] = useState<Layout[]>([])

useEffect(() => {
const layouts = getLocalEntity<Layout[]>("layouts")
setLayouts(layouts || [])
}, [])

useEffect(() => {
saveLocalEntity<Layout[]>("layouts", layouts)
}, [layouts])

const saveLayout = useCallback((metadata: Omit<LayoutMetadata, "id">) => {
const json = getLocalEntity<LayoutJSON>("api/vui")
if (json) {
setLayouts(prev =>
[
...prev,
{
metadata: {
...metadata,
id: getUniqueId()
},
json
}
]
)
}
}, [])

return (
<LayoutManagementContext.Provider value={{ layouts, saveLayout }} >
{props.children}
</LayoutManagementContext.Provider>
)
}

export const useLayoutManager = () => useContext(LayoutManagementContext);
1 change: 1 addition & 0 deletions vuu-ui/packages/vuu-utils/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,3 +30,4 @@ export * from "./selection-utils";
export * from "./sort-utils";
export * from "./text-utils";
export * from "./url-utils";
export * from "./screenshot-utils"
3 changes: 0 additions & 3 deletions vuu-ui/packages/vuu-utils/src/screenshot-utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ import { toPng } from "html-to-image";
* @returns Base64 encoded image url
*/
export async function takeScreenshot(node: HTMLElement) {
localStorage.removeItem("layout-screenshot");

const screenshot = await toPng(node, { cacheBust: true })
.then((dataUrl) => {
Expand All @@ -20,7 +19,5 @@ export async function takeScreenshot(node: HTMLElement) {
if (!screenshot) {
return undefined;
}

localStorage.setItem("layout-screenshot", screenshot);
return screenshot;
}
28 changes: 16 additions & 12 deletions vuu-ui/packages/vuu-utils/test/screenshot-utils.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,8 @@ import { describe, expect, it, vi } from "vitest";
* @vitest-environment happy-dom
*/

describe("screenshot-utils", () => {
vi.mock("html-to-image");

it("takes a screenshot and saves it to local storage", async () => {
const setItem = vi.spyOn(window.localStorage, "setItem");
describe("takeScreenshot", () => {
it("returns a string when toPng() promise is resolved", async () => {
const placeholderImage =
"data:image/png;base64,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";

Expand All @@ -20,15 +17,22 @@ describe("screenshot-utils", () => {

const node = document.createElement("div");

node.style.backgroundColor = "red";
node.style.border = "1px solid black";
node.style.width = "100px";
node.style.height = "100px";
const screenshot = await takeScreenshot(node);

expect(typeof screenshot).toEqual("string");
});

it("returns undefined when toPng() promise is rejected", async () => {
// We need to mock the html-to-image package because the web API operations it relies on (e.g. canvas.toDataUrl) are not available in the test environment
const htmlToImage = await import("html-to-image");
htmlToImage.toPng = vi.fn().mockRejectedValue({});

const node = document.createElement("div");

const screenshot = await takeScreenshot(node);

expect(screenshot).toBeDefined();
expect(setItem).toHaveBeenCalledWith("layout-screenshot", screenshot);
expect(localStorage.getItem("layout-screenshot")).toEqual(screenshot);
console.log(screenshot);

expect(screenshot).toBeUndefined();
});
});
57 changes: 28 additions & 29 deletions vuu-ui/showcase/src/examples/Apps/NewTheme.examples.tsx
Original file line number Diff line number Diff line change
@@ -1,12 +1,18 @@
import { LeftNav, SaveLayoutPanel, Shell } from "@finos/vuu-shell";
import {
CSSProperties,
ReactElement,
useCallback,
useMemo,
useState,
} from "react";
import { AutoTableNext } from "../Table/TableNext.examples";
import {
LayoutMetadata,
LeftNav,
SaveLayoutPanel,
Shell,
LayoutManagementProvider,
useLayoutManager
} from "@finos/vuu-shell";
import { registerComponent } from "@finos/vuu-layout";
import { TableSettingsPanel } from "@finos/vuu-table-extras";
import {
Expand All @@ -18,44 +24,31 @@ import {
ContextMenuItemDescriptor,
MenuActionHandler,
MenuBuilder,
} from "packages/vuu-data-types";
} from "@finos/vuu-data-types";
import { AutoTableNext } from "../Table/TableNext.examples";

import "./NewTheme.examples.css";
import { takeScreenshot } from "@finos/vuu-utils/src/screenshot-utils";

registerComponent("AutoTableNext", AutoTableNext, "view");
registerComponent("TableSettings", TableSettingsPanel, "view");

const user = { username: "test-user", token: "test-token" };

let displaySequence = 1;

export const ShellWithNewTheme = () => {
const ShellWithNewTheme = () => {
const [dialogContent, setDialogContent] = useState<ReactElement>();

const handleCloseDialog = useCallback(() => {
setDialogContent(undefined);
}, []);

const handleSave = useCallback(
(
layoutName: string,
layoutGroup: string,
checkValues: string[],
radioValues: string
) => {
console.log(
`Save Layout as ${layoutName} to group ${layoutGroup} with settings [${checkValues}] and ${radioValues}`
);
},
[]
);
const { saveLayout } = useLayoutManager();

const handleScreenshot = async (nodeId: string) => {
await takeScreenshot(document.getElementById(nodeId) as HTMLElement);

return localStorage.getItem("layout-screenshot") || undefined;
};
const handleSave = useCallback((layoutMetadata: Omit<LayoutMetadata, "id">) => {
console.log(`Save layout as ${layoutMetadata.name} to group ${layoutMetadata.group}`);
saveLayout(layoutMetadata)
setDialogContent(undefined)
}, []);

const [buildMenuOptions, handleMenuAction] = useMemo<
[MenuBuilder, MenuActionHandler]
Expand All @@ -81,7 +74,7 @@ export const ShellWithNewTheme = () => {
}
return menuDescriptors;
},
async (action: MenuActionClosePopup) => {
(action: MenuActionClosePopup) => {
console.log("menu action", {
Copy link

Choose a reason for hiding this comment

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

a MenuActionClose action has an options object. I made a change to add an attribute to that options object controlledComponetIdis the id of the component controlled by the tab from which the save layout menu was popped up. That gives you the id of the element we need to capture teh screen grab from. Will avoid that slightly fragile
getElementsByClassName("vuuShell-content")[0] to locate the element.
It can be passed as a prop straight into the SaveLayoutPanel

action,
});
Expand All @@ -90,9 +83,6 @@ export const ShellWithNewTheme = () => {
<SaveLayoutPanel
onCancel={handleCloseDialog}
onSave={handleSave}
screenshot={await handleScreenshot(
action.options.controlledComponentId as string
)}
/>
);
return true;
Expand Down Expand Up @@ -170,6 +160,7 @@ export const ShellWithNewTheme = () => {
leftSidePanel={<LeftNav style={{ width: 240 }} />}
loginUrl={window.location.toString()}
user={user}
saveLocation="local"
style={
{
"--vuuShell-height": "100vh",
Expand All @@ -191,4 +182,12 @@ export const ShellWithNewTheme = () => {
);
};

ShellWithNewTheme.displaySequence = displaySequence++;
export const ShellWithNewThemeAndLayoutManagement = () => {
return (
<LayoutManagementProvider>
<ShellWithNewTheme />
</LayoutManagementProvider>
)
}

ShellWithNewThemeAndLayoutManagement.displaySequence = displaySequence++;
Loading
Loading