Skip to content

Commit

Permalink
Save rough changes
Browse files Browse the repository at this point in the history
  • Loading branch information
johnbradley committed Jan 11, 2024
1 parent fb887fa commit f052796
Show file tree
Hide file tree
Showing 10 changed files with 271 additions and 124 deletions.
7 changes: 7 additions & 0 deletions andromeda-ui/backend/dataset.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,13 @@ export async function uploadDataset(file: File) {
});
}

export async function readDataset(datasetId: string) {
const url = apiURL("/dataset/" + datasetId);
const response = await fetch(url);
const text = await response.text()
return text;
}

export async function dimensionalReduction(
dataset_id: string,
weights: any,
Expand Down
4 changes: 2 additions & 2 deletions andromeda-ui/backend/parseCSV.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import Papa from "papaparse";

export async function parseCSVFile(file: File) {
export async function parseCSVFile(fileContent: string) {
// Wrap Papa.parse in a promise to allow async/await usage
const promise: any = new Promise((resolve, reject) => {
var config = {
Expand All @@ -14,7 +14,7 @@ export async function parseCSVFile(file: File) {
reject(error);
},
};
Papa.parse(file, config);
Papa.parse(fileContent, config);
});
return await promise;
}
Expand Down
10 changes: 10 additions & 0 deletions andromeda-ui/components/CSVFilename.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
interface CSVFilenameProps {
name: string;
}

export function CSVFilename(props: CSVFilenameProps) {
return <div>
<span className="text-md font-medium">CSV file:&nbsp;</span>
<span>{props.name}</span>
</div>
}
7 changes: 6 additions & 1 deletion andromeda-ui/components/ConfigureDataset.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import ColoredButton from './ColoredButton';
import { groupColumnsByType } from "../backend/parseCSV";

interface ConfigureDatasetProps {
datasetName: string
columnDetails: any;
columnSettings: any;
setColumnSettings: any;
Expand All @@ -12,7 +13,7 @@ interface ConfigureDatasetProps {
}

export default function ConfigureDataset(props: ConfigureDatasetProps) {
const { columnDetails, columnSettings, setColumnSettings, visualizeData, onClickBack } = props;
const { datasetName, columnDetails, columnSettings, setColumnSettings, visualizeData, onClickBack } = props;
function setLabelColumnName(value: string) {
setColumnSettings({ ...columnSettings, label: value })
}
Expand Down Expand Up @@ -57,6 +58,10 @@ export default function ConfigureDataset(props: ConfigureDatasetProps) {

return <div>
<h2 className="text-xl mb-2 font-bold">Configure Visualization</h2>
<div>
<div className="text-md font-medium">CSV file</div>
<div className="ml-3">{datasetName}</div>
</div>
<div>
<SimpleSelect
label="Label"
Expand Down
1 change: 0 additions & 1 deletion andromeda-ui/components/SelectColumnsList.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@ export default function SelectColumnsList(props: SelectColumnsListrProps) {
const { columns, selectedColumns, changeSelectedColumn } = props
const groupedItems = groupItems(columns, CHECKBOXES_PER_ROW)
const columnTableRows = groupedItems.map((columnNamesSubset: string[], idx: number) => {
console.log(idx, columnNamesSubset);
const checkboxes: any = columnNamesSubset.map((x) => {
const name = "select_column_" + x;
return <td key={x} className="px-2 whitespace-nowrap">
Expand Down
22 changes: 7 additions & 15 deletions andromeda-ui/components/UploadFile.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,20 +4,17 @@ import ColoredButton from './ColoredButton';

interface UploadFileProps {
uploadFile: any;
showUploadButton: boolean;
selectedFileChanged: any;
}

export default function UploadFile(props: UploadFileProps) {
const { uploadFile, showUploadButton, selectedFileChanged } = props;
const { uploadFile } = props;
const [selectedFile, setSelectedFile] = useState<File>();

async function onChangeSelectedFile(event: React.ChangeEvent<HTMLInputElement>) {
const { files } = event.target;
const selectedFiles = files as FileList;
if (selectedFiles && selectedFiles.length > 0) {
setSelectedFile(selectedFiles[0]);
selectedFileChanged();
} else {
setSelectedFile(undefined);
}
Expand All @@ -31,16 +28,6 @@ export default function UploadFile(props: UploadFileProps) {
}
}

let uploadButton = null;
if (showUploadButton) {
uploadButton = <ColoredButton
label="Upload File"
onClick={onClickUploadFile}
disabled={selectedFile === undefined}
color="blue"
/>
}

return <>
<div>
<label
Expand All @@ -55,6 +42,11 @@ export default function UploadFile(props: UploadFileProps) {
accept=".csv"
id="formFile" />
</div>
{uploadButton}
<ColoredButton
label="Upload File"
onClick={onClickUploadFile}
disabled={selectedFile === undefined}
color="blue"
/>
</>
}
77 changes: 77 additions & 0 deletions andromeda-ui/pages/dataset/[dataset]/index.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
import { useRouter } from 'next/router'
import React, { useState, useEffect } from 'react';
import { getColumnConfig, readDataset } from "../../../backend/dataset";
import ConfigureDataset from "../../../components/ConfigureDataset";
import TitleBar from "../../../components/TitleBar";
import Main from "../../../components/Main";
import { parseCSVFile, createColumnDetails, createColumnSettings } from "../../../backend/parseCSV";
import Spinner from '@/components/Spinner';


export default function Home() {
const router = useRouter()
const [datasetID, setDatasetID] = useState<string>();
const [datasetName, setDatasetName] = useState<string>();
const [columnDetails, setColumnDetails] = useState<any>();
const [columnSettings, setColumnSettings] = useState<any>();

useEffect(() => {
if (router.query.dataset && typeof router.query.dataset === "string") {
showConfigureDatasetPanel(router.query.dataset);
if (router.query.name && typeof router.query.name === "string") {
setDatasetName(router.query.name);
} else {
setDatasetName(router.query.dataset);
}
}
}, [router.query.dataset]);

async function showConfigureDatasetPanel(newDatasetId: string) {
const datasetContent = await readDataset(newDatasetId);
const rows = await parseCSVFile(datasetContent);
const details = createColumnDetails(rows);
const columnConfig = await getColumnConfig();
const settings = createColumnSettings(details, columnConfig);
setDatasetID(newDatasetId);
setColumnDetails(details);
setColumnSettings(settings);
}

function visualizeData() {
router.push({
pathname: `/dataset/${datasetID}/visualize`,
query: {
name: router.query.name,
label: columnSettings.label,
url: columnSettings.url,
selected: columnSettings.selected
}
});
}

function onClickBack() {
router.back();
}

let content = <Spinner />;
if (datasetID && datasetName) {
content = <ConfigureDataset
datasetName={datasetName}
columnDetails={columnDetails}
columnSettings={columnSettings}
setColumnSettings={setColumnSettings}
visualizeData={visualizeData}
onClickBack={onClickBack}
/>;
}
return (
<>
<TitleBar selected="/" />
<Main>
<div>
{content}
</div>
</Main>
</>
)
}
123 changes: 123 additions & 0 deletions andromeda-ui/pages/dataset/[dataset]/visualize/index.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,123 @@
import dynamic from 'next/dynamic'
import { useRouter } from 'next/router'
import React, { useState, useEffect } from 'react';
import TitleBar from "../../../../components/TitleBar";
import Main from "../../../../components/Main";
import { showError } from "../../../../util/toast";

const DataExplorer = dynamic(() => import("../../../../components/DataExplorer"), {
ssr: false,
});
import { uploadDataset, dimensionalReduction, reverseDimensionalReduction,
calculatePointScaling, getColumnConfig, readDataset } from "../../../../backend/dataset";
import { parseCSVFile, createColumnDetails, createColumnSettings } from "../../../../backend/parseCSV";
import Spinner from '@/components/Spinner';
import { CSVFilename } from '@/components/CSVFilename';


const DEFAULT_POINT_SCALING = 1.0;

export default function Home() {
const router = useRouter()

const [datasetID, setDatasetID] = useState<string>();
const [datasetName, setDatasetName] = useState<string>("");
const [imageData, setImageData] = useState<any[]>();
const [weightData, setWeightData] = useState<any[]>();
const [columnSettings, setColumnSettings] = useState<any>();
const [pointScaling, setPointScaling] = useState<number>(DEFAULT_POINT_SCALING);

useEffect(() => {
if (router.query.dataset && typeof router.query.dataset === "string") {
showDataExplorer(router.query.dataset);
if (router.query.name && typeof router.query.name === "string") {
setDatasetName(router.query.name);
} else {
setDatasetName(router.query.dataset);
}
}
}, [router.query.dataset, router.query.name]);

useEffect(() => {
if (datasetID && columnSettings) {
const initialWeights = { all: 1.0 / columnSettings.selected.length };
performDimensionalReduction(datasetID, initialWeights);
}
}, [datasetID, columnSettings]);

async function showDataExplorer(newDatasetId:string) {
const settings = {
label: router.query.label,
url: router.query.url,
selected: router.query.selected
};
console.log(settings);
setDatasetID(newDatasetId);
setColumnSettings(settings);
setImageData(undefined);
setWeightData(undefined);
}

async function performDimensionalReduction(id: string, weights: any) {
try {
const result = await dimensionalReduction(id, weights, columnSettings)
setDatasetID(id);
setPointScaling(calculatePointScaling(result.images));
setImageData(result.images);
setWeightData(result.weights);
return result;
} catch (error: any) {
console.log(error);
showError(error.message);
}
return null;
}

async function performReverseDimensionalReduction(id: string, movedPositions: any[]) {
try {
const result = await reverseDimensionalReduction(id, movedPositions, columnSettings)
setWeightData(result.weights);
return result;
} catch (error: any) {
console.log(error);
showError(error.message);
}
return null;
}
function onDataExplorerClickBack() {
router.back()
}

let content = <Spinner />;;
if (datasetID && imageData) {
content =
<>
<DataExplorer
datasetID={datasetID}
images={imageData}
weights={weightData}
setImageData={setImageData}
drFunc={performDimensionalReduction}
rdrFunc={performReverseDimensionalReduction}
columnSettings={columnSettings}
onClickBack={onDataExplorerClickBack}
pointScaling={pointScaling}
setPointScaling={setPointScaling}
/>
</>;
}

return (
<>
<TitleBar selected="/" />
<Main>
<div>
<CSVFilename name={datasetName} />
</div>
<div>
{content}
</div>
</Main>
</>
)
}
Loading

0 comments on commit f052796

Please sign in to comment.