diff --git a/src/components/exporttemplate/ExportTemplateDialog.jsx b/src/components/exporttemplate/ExportTemplateDialog.jsx
new file mode 100644
index 0000000..ca442a8
--- /dev/null
+++ b/src/components/exporttemplate/ExportTemplateDialog.jsx
@@ -0,0 +1,43 @@
+import Dialog from '@material-ui/core/Dialog';
+import DialogTitle from '@material-ui/core/DialogTitle';
+import { compose } from 'redux';
+
+import * as formActions from '../../formactions/exporttemplate';
+import withUI from '../../hoc/withUI';
+import DialogContent from '../ui/DialogContent';
+import WizardForm from '../ui/WizardForm';
+
+import ExportTemplateForm from './ExportTemplateForm';
+
+function ExportTemplateDialog({ templateName, open, onClose, onSuccess, openSnackBar, onFail }) {
+ const onSubmitSuccess = (response, dispatch, props) => {
+ const { locationName } = response;
+ const messageContent = `Export Location ${locationName} Created`;
+ openSnackBar({ messageContent });
+ onClose();
+ if (onSuccess) onSuccess(response, dispatch, props);
+ };
+ const onSubmitFail = (error, dispatch, props) => {
+ const messageContent = 'Error Creating Export Template';
+ openSnackBar({ messageContent, messageColor: 'secondary' });
+ if (onFail) onSuccess(error, dispatch, props);
+ };
+ return (
+
+ );
+}
+
+export default compose(withUI)(ExportTemplateDialog);
diff --git a/src/components/exporttemplate/ExportTemplateForm.jsx b/src/components/exporttemplate/ExportTemplateForm.jsx
new file mode 100644
index 0000000..93e3c5b
--- /dev/null
+++ b/src/components/exporttemplate/ExportTemplateForm.jsx
@@ -0,0 +1,331 @@
+import FormControlLabel from '@material-ui/core/FormControlLabel';
+import Typography from '@material-ui/core/Typography';
+import { reduxForm } from 'redux-form';
+
+import { required } from '../../utils/FieldValidation';
+import { TextField } from '../form';
+import { loadShapeTagOptions } from '../shapetag/ShapeTagSelect';
+import BoolCheckbox from '../ui/BoolCheckbox';
+import ChipInput from '../ui/ChipInput';
+import CodeField from '../ui/CodeField';
+import Field from '../ui/Field';
+import FieldArray from '../ui/FieldArray';
+import FormSection from '../ui/FormSection';
+import { StatefulAsyncSelect } from '../ui/Select';
+
+const ExportTemplateArchiveType = ['ZIP', 'TAR'].map((value) => ({ value, label: value }));
+const ExportTemplateCompressType = ['GZ', 'BZIP2'].map((value) => ({ value, label: value }));
+
+function ExportTemplateArchive() {
+ return (
+ <>
+
+
+
+ >
+ );
+}
+
+function ExportTemplateCollection() {
+ return (
+ <>
+
+
+ >
+ );
+}
+
+function ExportTemplateItem() {
+ return (
+ <>
+
+
+ >
+ );
+}
+
+function ExportTemplateComponent() {
+ return ;
+}
+
+function ExportTemplateComponentFile() {
+ return ;
+}
+
+function ExportTemplateCompress() {
+ return (
+ <>
+
+
+
+ >
+ );
+}
+
+function ExportTemplateDummy() {
+ return ;
+}
+
+function ExportTemplateExternal() {
+ return (
+ <>
+
+
+ >
+ );
+}
+
+function ExportTemplateFolder() {
+ return ;
+}
+
+function ExportTemplateTextContent() {
+ return (
+ <>
+
+ }
+ label="scripttags"
+ />
+ >
+ );
+}
+
+function ExportTemplateIterate() {
+ return (
+ <>
+
+
+
+ >
+ );
+}
+
+function ExportTemplateLibrary() {
+ return (
+ <>
+
+
+ >
+ );
+}
+
+function ExportTemplateSequence() {
+ return (
+ <>
+
+
+ }
+ label="generate"
+ />
+
+ >
+ );
+}
+
+function ExportTemplateShape() {
+ return (
+ <>
+
+ }
+ label="generate"
+ />
+ >
+ );
+}
+
+function ExportTemplateText() {
+ return (
+ <>
+
+
+
+
+
+
+ >
+ );
+}
+
+function ExportTemplateChoiceGroup() {
+ return (
+ <>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ >
+ );
+}
+
+function ExportTemplateType() {
+ return (
+ <>
+
+
+
+
+
+
+
+
+ >
+ );
+}
+
+function ExportTemplateForm({ templateName, error, handleSubmit }) {
+ return (
+
+ );
+}
+
+export default reduxForm()(ExportTemplateForm);
diff --git a/src/containers/ExportTemplateList.jsx b/src/containers/ExportTemplateList.jsx
new file mode 100644
index 0000000..c4d11cb
--- /dev/null
+++ b/src/containers/ExportTemplateList.jsx
@@ -0,0 +1,84 @@
+import { PureComponent } from 'react';
+
+import { compose } from 'redux';
+
+import { exportlocation as api } from '@vidispine/vdt-api';
+
+import ExportLocationDialog from '../components/exportlocation/ExportLocationDialog';
+import TitleHeader from '../components/ui/TitleHeader';
+import UriListCard from '../components/ui/UriListCard';
+import withUI from '../hoc/withSnackbar';
+
+const EXPORTTEMPLATE_CREATE_MODAL = 'EXPORTTEMPLATE_CREATE_MODAL';
+
+class ExportTemplateList extends PureComponent {
+ constructor(props) {
+ super(props);
+ this.onRefresh = this.onRefresh.bind(this);
+ this.onRefreshError = this.onRefreshError.bind(this);
+ this.state = {
+ uriListDocument: undefined,
+ };
+ }
+
+ componentDidMount() {
+ this.onRefresh();
+ document.title = 'VidiCore Admin | Export Template';
+ }
+
+ onRefresh() {
+ try {
+ api
+ .getConfiguration()
+ .then((response) => this.setState({ uriListDocument: response.data }))
+ .catch((error) => this.onRefreshError(error));
+ } catch (error) {
+ this.onRefreshError(error);
+ }
+ }
+
+ onRefreshError() {
+ const { openSnackBar } = this.props;
+ const messageContent = 'Error Loading Export Templates';
+ openSnackBar({ messageContent, messageColor: 'secondary' });
+ }
+
+ render() {
+ const { uriListDocument } = this.state;
+ const { history } = this.props;
+
+ return (
+ <>
+
+ {uriListDocument && (
+ `/export-template/${uri}/`}
+ titleCase
+ />
+ )}
+ {
+ history.push(`/export-template/${exportTemplate}`);
+ }}
+ />
+ >
+ );
+ }
+}
+
+export default compose(withUI)(ExportTemplateList);
diff --git a/src/formactions/exporttemplate.js b/src/formactions/exporttemplate.js
new file mode 100644
index 0000000..2d1fded
--- /dev/null
+++ b/src/formactions/exporttemplate.js
@@ -0,0 +1,33 @@
+import { exporttemplate as ExportTemplateApi } from '@vidispine/vdt-api';
+
+import withSubmissionError from './withSubmissionError';
+
+export const onListExportTemplate = withSubmissionError((form) => {
+ const { queryParams } = form;
+ return ExportTemplateApi.listExportTemplate({
+ queryParams,
+ });
+});
+
+export const onUpdateExportTemplate = withSubmissionError((form, dispatch, props) => {
+ const { exportTemplateDocument } = form;
+ const templateName = props.templateName || form.templateName;
+ return ExportTemplateApi.updateExportTemplate({
+ templateName,
+ exportTemplateDocument,
+ });
+});
+
+export const onTestExportTemplate = withSubmissionError((form) => {
+ const { queryParams } = form;
+ return ExportTemplateApi.createExportTemplateTest({
+ queryParams,
+ });
+});
+
+export const onRenderExportTemplate = withSubmissionError((form) => {
+ const { queryParams } = form;
+ return ExportTemplateApi.createExportTemplateTestRender({
+ queryParams,
+ });
+});