app/ItemView/MetadataView.tsx (106 lines of code) (raw):
import React, { useContext, useState } from "react";
import MetadataGroupView, { MetadataGroupViewMode } from "./MetadataGroupView";
import FieldGroupCache from "../vidispine/FieldGroupCache";
import { VidispineItem } from "../vidispine/item/VidispineItem";
import {
FormControl,
FormControlLabel,
Grid,
Switch,
Typography,
} from "@material-ui/core";
import ToggleButton from "@material-ui/lab/ToggleButton";
import { Edit } from "@material-ui/icons";
import VidispineContext from "../Context/VidispineContext";
import { VidispineFieldGroup } from "../vidispine/field-group/VidispineFieldGroup";
import MetadataDeliverableView from "./MetadataDeliverableView";
import RawMetadataView from "./RawMetadataView";
import content from "*.svg";
interface MetadataViewProps {
elevation: number;
readonly: boolean;
content: VidispineItem;
valueDidChange: (
groupname: string,
fieldname: string,
newvalue: string[]
) => void;
}
const MetadataView: React.FC<MetadataViewProps> = (props) => {
const [editMode, setEditMode] = useState<boolean>(false);
const [rawMode, setRawMode] = useState(false);
const vidispineContext = useContext(VidispineContext);
const contentForGroupName = (
groupname: string,
group: VidispineFieldGroup
) => {
switch (groupname) {
case "Deliverable":
return (
<MetadataDeliverableView
group={group}
content={props.content}
elevation={props.elevation}
/>
);
default:
return (
<MetadataGroupView
key={groupname}
group={group}
content={props.content}
elevation={props.elevation}
mode={
editMode
? MetadataGroupViewMode.MetadataEdit
: MetadataGroupViewMode.MetadataView
}
valueDidChange={(fieldname, newvalue) =>
props.valueDidChange(groupname, fieldname, newvalue)
}
/>
);
}
};
const getTableContent = (fieldCache: FieldGroupCache) =>
//So, Array.from() is not the most performant method of iterating, but should be fine on small collections
//https://stackoverflow.com/questions/43885365/using-map-on-an-iterator
Array.from(fieldCache._content, ([groupname, group]) => {
//only render groups that are present on the item
return props.content.hasGroup(groupname)
? contentForGroupName(groupname, group)
: null;
});
return (
<>
<Grid container justify="flex-end" alignContent="flex-start" spacing={4}>
<Grid item>
<FormControlLabel
control={
<Switch
value={rawMode}
onChange={() => setRawMode((prev) => !prev)}
/>
}
label="View raw"
/>
</Grid>
<Grid item>
<ToggleButton
id="metadata-edit-toggle"
selected={editMode}
onChange={() => setEditMode(!editMode)}
>
<Edit />
<Typography variant="caption">
{editMode ? "Finish Editing" : "Edit Metadata"}
</Typography>
</ToggleButton>
</Grid>
</Grid>
{rawMode ? (
<RawMetadataView itemId={props.content.id} elevation={3} />
) : vidispineContext ? (
getTableContent(vidispineContext.fieldCache)
) : undefined}
</>
);
};
export default MetadataView;