diff --git a/Gemfile b/Gemfile
index 6fdf8561..6852a4c3 100644
--- a/Gemfile
+++ b/Gemfile
@@ -37,13 +37,13 @@ gem 'resource_api', git: 'https://github.com/performant-software/resource-api.gi
gem 'jwt_auth', git: 'https://github.com/performant-software/jwt-auth.git', tag: 'v0.1.3'
# Core data
-gem 'core_data_connector', git: 'https://github.com/performant-software/core-data-connector.git', tag: 'v0.1.109'
+gem 'core_data_connector', git: 'https://github.com/performant-software/core-data-connector.git', tag: 'v0.1.111'
# IIIF
gem 'triple_eye_effable', git: 'https://github.com/performant-software/triple-eye-effable.git', tag: 'v0.2.7'
# User defined fields
-gem 'user_defined_fields', git: 'https://github.com/performant-software/user-defined-fields.git', tag: 'v0.1.14'
+gem 'user_defined_fields', git: 'https://github.com/performant-software/user-defined-fields.git', tag: 'v0.1.15'
# Fuzzy dates
gem 'fuzzy_dates', git: 'https://github.com/performant-software/fuzzy-dates.git', tag: 'v0.1.2'
diff --git a/Gemfile.lock b/Gemfile.lock
index 2b01be60..8e0bc999 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -1,7 +1,7 @@
GIT
remote: https://github.com/performant-software/core-data-connector.git
- revision: 727ca617ce80b2d9dc29f2cb0f80f707df31335d
- tag: v0.1.109
+ revision: b7786f958414034ed449c89350fff768ec4f94be
+ tag: v0.1.111
specs:
core_data_connector (0.1.0)
activerecord-postgis-adapter (~> 11.0)
@@ -59,8 +59,8 @@ GIT
GIT
remote: https://github.com/performant-software/user-defined-fields.git
- revision: 9799f151ab51506eef42177c756b762060a9838a
- tag: v0.1.14
+ revision: 3fe09c999fa5193e8de9e1253e60d25c95a40af8
+ tag: v0.1.15
specs:
user_defined_fields (0.1.0)
rails (>= 6.0.3.2, < 9)
@@ -245,7 +245,7 @@ GEM
racc (~> 1.4)
nokogiri (1.18.9-x86_64-linux-gnu)
racc (~> 1.4)
- oj (3.16.12)
+ oj (3.16.13)
bigdecimal (>= 3.0)
ostruct (>= 0.2)
ostruct (0.6.3)
diff --git a/client/src/components/ItemPage.js b/client/src/components/ItemPage.js
index 7aae5634..1bbd619c 100644
--- a/client/src/components/ItemPage.js
+++ b/client/src/components/ItemPage.js
@@ -49,7 +49,14 @@ type ComponentProps = {
saved?: boolean
};
-const ItemPage = ({ form: Form, onInitialize, onSave }: Props) => {
+const ItemPage = (props: Props) => {
+ const {
+ form: Form,
+ onCreateManifests,
+ onInitialize,
+ onSave
+ } = props;
+
const { t } = useTranslation();
const Component = useCallback((props: ComponentProps) => {
@@ -152,7 +159,9 @@ const ItemPage = ({ form: Form, onInitialize, onSave }: Props) => {
saving={props.saving}
/>
-
+
{ projectModel?.allow_identifiers && props.item.id && (
{
const Page = withReactRouterEditPage(Component, {
id: 'itemId',
+ onCreateManifests,
onSave,
onInitialize,
resolveValidationError: Validation.resolveUpdateError.bind(this)
diff --git a/client/src/components/ProjectModelRelationshipFactory.js b/client/src/components/ProjectModelRelationshipFactory.js
index 622f5fbe..a5f379fd 100644
--- a/client/src/components/ProjectModelRelationshipFactory.js
+++ b/client/src/components/ProjectModelRelationshipFactory.js
@@ -1,4 +1,4 @@
-// flow
+// @flow
import React, { useMemo } from 'react';
import RelatedEvent from './RelatedEvent';
@@ -13,7 +13,12 @@ import RelatedWork from './RelatedWork';
import { Types } from '../utils/ProjectModels';
import useProjectModelRelationship from '../hooks/ProjectModelRelationship';
-const ProjectModelRelationshipFactory = (props) => {
+type Props = {
+ onCreateManifests: (id: number, params: { [key: string]: any }) => Promise,
+ relationshipId: number
+};
+
+const ProjectModelRelationshipFactory = (props: Props) => {
const { projectModelRelationship } = useProjectModelRelationship();
/**
@@ -56,6 +61,7 @@ const ProjectModelRelationshipFactory = (props) => {
case Types.MediaContent:
component = (
);
diff --git a/client/src/components/ProjectModelRelationshipsFactory.js b/client/src/components/ProjectModelRelationshipsFactory.js
index 164e6c10..9785caef 100644
--- a/client/src/components/ProjectModelRelationshipsFactory.js
+++ b/client/src/components/ProjectModelRelationshipsFactory.js
@@ -16,7 +16,11 @@ import RelationshipsService from '../services/Relationships';
import { Types } from '../utils/ProjectModels';
import useProjectModelRelationship from '../hooks/ProjectModelRelationship';
-const ProjectModelRelationshipsFactory = () => {
+type Props = {
+ onCreateManifests: (id: number, params: { [key: string] : any }) => Promise
+};
+
+const ProjectModelRelationshipsFactory = (props: Props) => {
const [loaded, setLoaded] = useState(false);
const [relationships, setRelationships] = useState();
@@ -87,7 +91,9 @@ const ProjectModelRelationshipsFactory = () => {
if (classView === Types.MediaContent) {
return (
-
+
);
}
@@ -136,6 +142,7 @@ const ProjectModelRelationshipsFactory = () => {
return (
);
diff --git a/client/src/components/RelatedMediaContent.js b/client/src/components/RelatedMediaContent.js
index 93272deb..fc26f78c 100644
--- a/client/src/components/RelatedMediaContent.js
+++ b/client/src/components/RelatedMediaContent.js
@@ -1,30 +1,37 @@
// @flow
import { EditModal, FileInputButton, LazyIIIF } from '@performant-software/semantic-components';
-import { IIIF as IIIFUtils } from '@performant-software/shared-components';
import type { EditContainerProps } from '@performant-software/shared-components/types';
import React, { useCallback, useContext, useMemo, useState } from 'react';
import { useTranslation } from 'react-i18next';
import { Button, Form } from 'semantic-ui-react';
import _ from 'underscore';
+import ItemContext from '../context/Item';
+import ManifestUrlButton from './ManifestUrlButton';
+import MediaContentUtils from '../utils/MediaContent';
import MediaContentsService from '../services/MediaContents';
import ProjectContext from '../context/Project';
import RelatedMediaContentModal from './RelatedMediaContentModal';
import type { Relationship as RelationshipType } from '../types/Relationship';
import RelationshipsService from '../services/Relationships';
-import { useRelationship } from '../hooks/Relationship';
+import useParams from '../hooks/ParsedParams';
import useProjectModelRelationship from '../hooks/ProjectModelRelationship';
+import { useRelationship } from '../hooks/Relationship';
import withRelationshipEditForm from '../hooks/RelationshipEditForm';
type Props = EditContainerProps & {
- item: RelationshipType
+ item: RelationshipType,
+ onCreateManifests: (id: number, params: { [key: string] : any }) => Promise
};
const RelatedMediaContentForm = (props: Props) => {
const [editModal, setEditModal] = useState(false);
+ const [saving, setSaving] = useState(false);
- const { project } = useContext(ProjectContext);
- const { foreignProjectModelId } = useProjectModelRelationship();
+ const { project, projectModel } = useContext(ProjectContext);
+ const { uuid } = useContext(ItemContext);
+ const { itemId } = useParams();
+ const { foreignProjectModelId, projectModelRelationship } = useProjectModelRelationship();
const { t } = useTranslation();
const {
@@ -35,11 +42,27 @@ const RelatedMediaContentForm = (props: Props) => {
} = useRelationship(props);
/**
- * Sets the manifest URL.
+ * Memo-izes the manifest URL.
+ */
+ const manifestUrl = useMemo(() => (
+ MediaContentUtils.getManifestURL(projectModel, uuid, projectModelRelationship.uuid)
+ ), [projectModel, projectModelRelationship, uuid])
+
+ /**
+ * Calls the onCreateManifests callback.
*
- * @type {string|string|*}
+ * @type {(function(): void)|*}
*/
- const manifest = useMemo(() => (IIIFUtils.createManifestURL(foreignObject?.manifest)), [foreignObject?.manifest]);
+ const onCreateManifest = useCallback(() => {
+ setSaving(true);
+
+ const params = {
+ project_model_relationship_id: projectModelRelationship.id
+ };
+
+ props.onCreateManifests(itemId, params)
+ .then(() => setSaving(false));
+ }, [itemId, projectModelRelationship])
/**
* Deletes the current relationship.
@@ -93,7 +116,7 @@ const RelatedMediaContentForm = (props: Props) => {
contentType={foreignObject?.content_type}
downloadUrl={foreignObject?.content_download_url}
key={foreignObject?.id}
- manifest={manifest}
+ manifest={manifestUrl}
preview={foreignObject?.content_preview_url}
src={foreignObject?.content_url}
>
@@ -116,11 +139,22 @@ const RelatedMediaContentForm = (props: Props) => {
{ props.item.id && (
<>
+
+
);
};
-const Relationships = () => {
+const Relationships = (props) => {
const { projectModel } = useContext(ProjectContext);
const { itemId } = useParams();
@@ -53,6 +55,7 @@ const Relationships = () => {
return _.map(projectModel.all_project_model_relationships, (projectModelRelationship) => (
));
diff --git a/client/src/hooks/RelationshipEditForm.js b/client/src/hooks/RelationshipEditForm.js
index 59b8c072..c6ac513b 100644
--- a/client/src/hooks/RelationshipEditForm.js
+++ b/client/src/hooks/RelationshipEditForm.js
@@ -67,7 +67,7 @@ const withRelationshipEditForm = (WrappedComponent) => (props: Props) => {
*
* @type {unknown}
*/
- const Component = useMemo(() => , [props]);
+ const Component = useMemo(() => , [id, props]);
return Component;
};
diff --git a/client/src/i18n/en.json b/client/src/i18n/en.json
index 636b6795..f10fcc87 100644
--- a/client/src/i18n/en.json
+++ b/client/src/i18n/en.json
@@ -842,7 +842,15 @@
"name": "Name"
}
},
+ "RelatedMediaContent": {
+ "buttons": {
+ "refreshManifest": "Refresh Manifest"
+ }
+ },
"RelatedMediaContents": {
+ "buttons": {
+ "refreshManifest": "Refresh Manifest"
+ },
"options": {
"link": "Link existing record",
"upload": "Upload from your computer"
diff --git a/client/src/pages/Event.js b/client/src/pages/Event.js
index c6b2b85e..f19f89fc 100644
--- a/client/src/pages/Event.js
+++ b/client/src/pages/Event.js
@@ -8,6 +8,10 @@ import EventsService from '../services/Events';
const Person = () => (
(
+ EventsService
+ .createManifests(id, params)
+ )}
onInitialize={(id) => (
EventsService
.fetchOne(id)
diff --git a/client/src/pages/Instance.js b/client/src/pages/Instance.js
index ac54ab4f..93f26605 100644
--- a/client/src/pages/Instance.js
+++ b/client/src/pages/Instance.js
@@ -8,6 +8,10 @@ import ItemPage from '../components/ItemPage';
const Instance = () => (
(
+ InstancesService
+ .createManifests(id, params)
+ )}
onInitialize={(id) => (
InstancesService
.fetchOne(id)
diff --git a/client/src/pages/Item.js b/client/src/pages/Item.js
index bc6d34c9..010bef4f 100644
--- a/client/src/pages/Item.js
+++ b/client/src/pages/Item.js
@@ -8,6 +8,10 @@ import ItemsService from '../services/Items';
const Item = () => (
(
+ ItemsService
+ .createManifests(id, params)
+ )}
onInitialize={(id) => (
ItemsService
.fetchOne(id)
diff --git a/client/src/pages/MediaContent.js b/client/src/pages/MediaContent.js
index ae6dbd41..fd34056d 100644
--- a/client/src/pages/MediaContent.js
+++ b/client/src/pages/MediaContent.js
@@ -12,6 +12,10 @@ const MediaContent = () => {
return (
(
+ MediaContentsService
+ .createManifests(id, params)
+ )}
onInitialize={(id) => (
MediaContentsService
.fetchOne(id)
diff --git a/client/src/pages/Organization.js b/client/src/pages/Organization.js
index 1b34d4f5..7ed2922a 100644
--- a/client/src/pages/Organization.js
+++ b/client/src/pages/Organization.js
@@ -8,6 +8,10 @@ import OrganizationService from '../services/Organizations';
const Organization = () => (
(
+ OrganizationService
+ .createManifests(id, params)
+ )}
onInitialize={(id) => (
OrganizationService
.fetchOne(id)
diff --git a/client/src/pages/Person.js b/client/src/pages/Person.js
index 5be28a74..24e05da5 100644
--- a/client/src/pages/Person.js
+++ b/client/src/pages/Person.js
@@ -8,6 +8,10 @@ import PersonForm from '../components/PersonForm';
const Person = () => (
(
+ PeopleService
+ .createManifests(id, params)
+ )}
onInitialize={(id) => (
PeopleService
.fetchOne(id)
diff --git a/client/src/pages/Place.js b/client/src/pages/Place.js
index f8871f22..3057ff6c 100644
--- a/client/src/pages/Place.js
+++ b/client/src/pages/Place.js
@@ -8,6 +8,10 @@ import PlacesService from '../services/Places';
const Place = () => (
(
+ PlacesService
+ .createManifests(id, params)
+ )}
onInitialize={(id) => (
PlacesService
.fetchOne(id)
diff --git a/client/src/pages/TaxonomyItem.js b/client/src/pages/TaxonomyItem.js
index 16eada71..4b755ed9 100644
--- a/client/src/pages/TaxonomyItem.js
+++ b/client/src/pages/TaxonomyItem.js
@@ -8,6 +8,10 @@ import TaxonomyItemForm from '../components/TaxonomyItemForm';
const TaxonomyItem = () => (
(
+ TaxonomiesService
+ .createManifests(id, params)
+ )}
onInitialize={(id) => (
TaxonomiesService
.fetchOne(id)
diff --git a/client/src/pages/Work.js b/client/src/pages/Work.js
index efa9ffab..b36654e5 100644
--- a/client/src/pages/Work.js
+++ b/client/src/pages/Work.js
@@ -8,6 +8,10 @@ import WorksService from '../services/Works';
const Work = () => (
(
+ WorksService
+ .createManifests(id, params)
+ )}
onInitialize={(id) => (
WorksService
.fetchOne(id)
diff --git a/client/src/services/Base.js b/client/src/services/Base.js
new file mode 100644
index 00000000..ebdb778f
--- /dev/null
+++ b/client/src/services/Base.js
@@ -0,0 +1,51 @@
+// @flow
+
+import { BaseService as APIBase } from '@performant-software/shared-components';
+
+/**
+ * Class responsible for handling all merge and manifests API requests.
+ */
+class BaseService extends APIBase {
+ /**
+ * Constructs a new BaseService object. This constructor should never be used directly.
+ */
+ constructor() {
+ super();
+
+ if (this.constructor === BaseService) {
+ throw new TypeError('Abstract class "BaseService" cannot be instantiated directly.');
+ }
+ }
+
+ /**
+ * Calls the /core_data///create_manifests API endpoint.
+ *
+ * @param id
+ * @param params
+ *
+ * @returns {*}
+ */
+ createManifests(id, params = {}) {
+ const transform = this.getTransform();
+ const payload = transform.toManifestable(params);
+
+ return this.getAxios().post(`${this.getBaseUrl()}/${id}/create_manifests`, payload, this.getConfig());
+ }
+
+ /**
+ * Calls the /core_data//merge API endpoint.
+ *
+ * @param item
+ * @param ids
+ *
+ * @returns {*}
+ */
+ mergeRecords(item, ids) {
+ const transform = this.getTransform();
+ const payload = transform.toMergeable(item, ids);
+
+ return this.getAxios().post(`${this.getBaseUrl()}/merge`, payload, this.getConfig());
+ }
+}
+
+export default BaseService;
diff --git a/client/src/services/Events.js b/client/src/services/Events.js
index dac4384f..b5cb2de0 100644
--- a/client/src/services/Events.js
+++ b/client/src/services/Events.js
@@ -1,12 +1,12 @@
// @flow
+import BaseService from './Base';
import EventTransform from '../transforms/Event';
-import MergeableService from './Mergeable';
/**
* Class responsible for handling all event API requests.
*/
-class Events extends MergeableService {
+class Events extends BaseService {
/**
* Returns the event base URL.
*
diff --git a/client/src/services/Instances.js b/client/src/services/Instances.js
index ecceb699..54432215 100644
--- a/client/src/services/Instances.js
+++ b/client/src/services/Instances.js
@@ -1,12 +1,12 @@
// @flow
+import BaseService from './Base';
import InstanceTransform from '../transforms/Instance';
-import MergeableService from './Mergeable';
/**
* Class responsible for handling all Instance API requests.
*/
-class Instances extends MergeableService {
+class Instances extends BaseService {
/**
* Returns the Instance base URL.
*
diff --git a/client/src/services/Items.js b/client/src/services/Items.js
index 478dc5b9..ba41422e 100644
--- a/client/src/services/Items.js
+++ b/client/src/services/Items.js
@@ -1,13 +1,13 @@
// @flow
+import BaseService from './Base';
import Importable from '../transforms/Importable';
import ItemTransform from '../transforms/Item';
-import MergeableService from './Mergeable';
/**
* Class responsible for handling all item API requests.
*/
-class Items extends MergeableService {
+class Items extends BaseService {
/**
* Calls the `/items/:id/analyze_import` API endpoint.
*
diff --git a/client/src/services/MediaContents.js b/client/src/services/MediaContents.js
index ab0d4b71..70a36f81 100644
--- a/client/src/services/MediaContents.js
+++ b/client/src/services/MediaContents.js
@@ -1,8 +1,8 @@
// @flow
import { TripleEyeEffable } from '@performant-software/shared-components';
+import BaseService from './Base';
import MediaContentTransform from '../transforms/MediaContent';
-import MergeableService from './Mergeable';
import type { MediaContent as MediaContentType } from '../types/MediaContent';
import type { Project as ProjectType } from '../types/Project';
import SessionService from './Session';
@@ -10,7 +10,7 @@ import SessionService from './Session';
/**
* Class responsible for handling all media contents API requests.
*/
-class MediaContents extends MergeableService {
+class MediaContents extends BaseService {
/**
* Returns the media contents base URL.
*
diff --git a/client/src/services/Mergeable.js b/client/src/services/Mergeable.js
deleted file mode 100644
index 6eb996d6..00000000
--- a/client/src/services/Mergeable.js
+++ /dev/null
@@ -1,34 +0,0 @@
-// @flow
-
-import { BaseService } from '@performant-software/shared-components';
-
-/**
- * Class responsible for handling all merge API requests.
- */
-class MergeableService extends BaseService {
- /**
- * Constructs a new MergeableService object. This constructor should never be used directly.
- */
- constructor() {
- super();
-
- if (this.constructor === MergeableService) {
- throw new TypeError('Abstract class "MergeableService" cannot be instantiated directly.');
- }
- }
-
- /**
- * Calls the /core_data//merge API endpoint.
- *
- * @param item
- * @param ids
- *
- * @returns {*}
- */
- mergeRecords(item, ids) {
- const transform = this.getTransform();
- return this.getAxios().post(`${this.getBaseUrl()}/merge`, transform.toMergeable(item, ids), this.getConfig());
- }
-}
-
-export default MergeableService;
diff --git a/client/src/services/Organizations.js b/client/src/services/Organizations.js
index 28349903..783ef489 100644
--- a/client/src/services/Organizations.js
+++ b/client/src/services/Organizations.js
@@ -1,12 +1,12 @@
// @flow
-import MergeableService from './Mergeable';
+import BaseService from './Base';
import OrganizationTransform from '../transforms/Organization';
/**
* Class responsible for handling all organization API requests.
*/
-class Organization extends MergeableService {
+class Organization extends BaseService {
/**
* Returns the organization base URL.
*
diff --git a/client/src/services/People.js b/client/src/services/People.js
index 4272bfc8..4654c5a4 100644
--- a/client/src/services/People.js
+++ b/client/src/services/People.js
@@ -1,12 +1,12 @@
// @flow
-import MergeableService from './Mergeable';
+import BaseService from './Base';
import PersonTransform from '../transforms/Person';
/**
* Class responsible for handling all person API requests.
*/
-class People extends MergeableService {
+class People extends BaseService {
/**
* Returns the person base URL.
*
diff --git a/client/src/services/Places.js b/client/src/services/Places.js
index 7eae7f43..845b8a34 100644
--- a/client/src/services/Places.js
+++ b/client/src/services/Places.js
@@ -1,12 +1,12 @@
// @flow
-import MergeableService from './Mergeable';
+import BaseService from './Base';
import PlaceTransform from '../transforms/Place';
/**
* Class responsible for handling all place API requests.
*/
-class Places extends MergeableService {
+class Places extends BaseService {
/**
* Returns the places base URL.
*
diff --git a/client/src/services/Taxonomies.js b/client/src/services/Taxonomies.js
index 3acccbd9..5287d03d 100644
--- a/client/src/services/Taxonomies.js
+++ b/client/src/services/Taxonomies.js
@@ -1,12 +1,12 @@
// @flow
-import MergeableService from './Mergeable';
+import BaseService from './Base';
import TaxonomyTransform from '../transforms/Taxonomy';
/**
* Class responsible for handling all taxonomy API requests.
*/
-class Taxonomies extends MergeableService {
+class Taxonomies extends BaseService {
/**
* Returns the taxonomy base URL.
*
diff --git a/client/src/services/Works.js b/client/src/services/Works.js
index 8380de9f..1500aa73 100644
--- a/client/src/services/Works.js
+++ b/client/src/services/Works.js
@@ -1,12 +1,12 @@
// @flow
-import MergeableService from './Mergeable';
+import BaseService from './Base';
import WorkTransform from '../transforms/Work';
/**
* Class responsible for handling all work API requests.
*/
-class Works extends MergeableService {
+class Works extends BaseService {
/**
* Returns the work base URL.
*
diff --git a/client/src/transforms/Mergeable.js b/client/src/transforms/Base.js
similarity index 50%
rename from client/src/transforms/Mergeable.js
rename to client/src/transforms/Base.js
index 66626c54..13fe20cd 100644
--- a/client/src/transforms/Mergeable.js
+++ b/client/src/transforms/Base.js
@@ -1,11 +1,23 @@
// @flow
-import { BaseTransform, ObjectJs as ObjectUtils } from '@performant-software/shared-components';
+import { BaseTransform as APIBase, ObjectJs as ObjectUtils } from '@performant-software/shared-components';
+import _ from 'underscore';
/**
* Class responsible for transforming records for merge requests.
*/
-class MergeableTransform extends BaseTransform {
+class BaseTransform extends APIBase {
+ /**
+ * Returns a hash of the valid parameters for the manifests endpoint.
+ *
+ * @param params
+ *
+ * @returns {*}
+ */
+ toManifestable(params) {
+ return _.pick(params, 'project_model_relationship_id');
+ }
+
/**
* Converts the passed item to a mergeable payload by removing any "id" attributes.
*
@@ -22,4 +34,4 @@ class MergeableTransform extends BaseTransform {
}
}
-export default MergeableTransform;
+export default BaseTransform;
diff --git a/client/src/transforms/Event.js b/client/src/transforms/Event.js
index 958364e0..13e0df3a 100644
--- a/client/src/transforms/Event.js
+++ b/client/src/transforms/Event.js
@@ -1,13 +1,12 @@
// @flow
-import { FuzzyDateTransform } from '@performant-software/shared-components';
+import BaseTransform from './Base';
import type { Event as EventType } from '../types/Event';
-import MergeableTransform from './Mergeable';
/**
* Class responsible for transforming event records for POST/PUT requests.
*/
-class Event extends MergeableTransform {
+class Event extends BaseTransform {
/**
* Returns the event parameter name.
*
diff --git a/client/src/transforms/Instance.js b/client/src/transforms/Instance.js
index f1c4d8df..4612113e 100644
--- a/client/src/transforms/Instance.js
+++ b/client/src/transforms/Instance.js
@@ -1,13 +1,13 @@
// @flow
+import BaseTransform from './Base';
import type { Instance as InstanceType } from '../types/Instance';
-import MergeableTransform from './Mergeable';
import SourceNames from './SourceNames';
/**
* Class responsible for transforming instance records for POST/PUT requests.
*/
-class Instance extends MergeableTransform {
+class Instance extends BaseTransform {
/**
* Returns the instance parameter name.
*
diff --git a/client/src/transforms/Item.js b/client/src/transforms/Item.js
index bdffcaf7..1c4d6921 100644
--- a/client/src/transforms/Item.js
+++ b/client/src/transforms/Item.js
@@ -2,14 +2,14 @@
import { DataTypes } from '@performant-software/user-defined-fields';
import _ from 'underscore';
+import BaseTransform from './Base';
import type { Item as ItemType } from '../types/Item';
-import MergeableTransform from './Mergeable';
import SourceNames from './SourceNames';
/**
* Class responsible for transforming item records for POST/PUT requests.
*/
-class Item extends MergeableTransform {
+class Item extends BaseTransform {
/**
* Returns the item parameter name.
*
diff --git a/client/src/transforms/MediaContent.js b/client/src/transforms/MediaContent.js
index 0f798e60..42a67644 100644
--- a/client/src/transforms/MediaContent.js
+++ b/client/src/transforms/MediaContent.js
@@ -36,6 +36,17 @@ class MediaContent extends FormDataTransform {
];
}
+ /**
+ * Returns the valid parameters for the create_manifests endpoint.
+ *
+ * @param params
+ *
+ * @returns {*}
+ */
+ toManifestable(params: { [key: string]: any }) {
+ return _.pick(params, 'project_model_relationship_id');
+ }
+
/**
* Converts the passed media contents to a mergeable payload by removing any "id" attributes.
*
diff --git a/client/src/transforms/Organization.js b/client/src/transforms/Organization.js
index 0e2968a1..26048d45 100644
--- a/client/src/transforms/Organization.js
+++ b/client/src/transforms/Organization.js
@@ -1,13 +1,13 @@
// @flow
-import MergeableTransform from './Mergeable';
+import BaseTransform from './Base';
import type { Organization as OrganizationType } from '../types/Organization';
import OrganizationNames from './OrganizationNames';
/**
* Class responsible for transforming organization records for POST/PUT requests.
*/
-class Organization extends MergeableTransform {
+class Organization extends BaseTransform {
/**
* Returns the person parameter name.
*
diff --git a/client/src/transforms/Person.js b/client/src/transforms/Person.js
index 0ca61727..3ca07114 100644
--- a/client/src/transforms/Person.js
+++ b/client/src/transforms/Person.js
@@ -1,14 +1,14 @@
// @flow
import _ from 'underscore';
-import MergeableTransform from './Mergeable';
+import BaseTransform from './Base';
import type { Person as PersonType } from '../types/Person';
import PersonNames from './PersonNames';
/**
* Class responsible for transforming person records for POST/PUT requests.
*/
-class Person extends MergeableTransform {
+class Person extends BaseTransform {
/**
* Returns the person parameter name.
*
diff --git a/client/src/transforms/Place.js b/client/src/transforms/Place.js
index 75e2b343..29aca8ec 100644
--- a/client/src/transforms/Place.js
+++ b/client/src/transforms/Place.js
@@ -1,7 +1,7 @@
// @flow
import _ from 'underscore';
-import MergeableTransform from './Mergeable';
+import BaseTransform from './Base';
import type { Place as PlaceType } from '../types/Place';
import PlaceGeometry from './PlaceGeometry';
import PlaceLayers from './PlaceLayers';
@@ -10,7 +10,7 @@ import PlaceNames from './PlaceNames';
/**
* Class responsible for transforming place records for POST/PUT requests.
*/
-class Place extends MergeableTransform {
+class Place extends BaseTransform {
/**
* Returns the place parameter name.
*
diff --git a/client/src/transforms/Taxonomy.js b/client/src/transforms/Taxonomy.js
index 51dac7a0..6c67165e 100644
--- a/client/src/transforms/Taxonomy.js
+++ b/client/src/transforms/Taxonomy.js
@@ -1,12 +1,12 @@
// @flow
-import MergeableTransform from './Mergeable';
+import BaseTransform from './Base';
import type { Taxonomy as TaxonomyType } from '../types/Taxonomy';
/**
* Class responsible for transforming taxonomy records for POST/PUT requests.
*/
-class Taxonomy extends MergeableTransform {
+class Taxonomy extends BaseTransform {
/**
* Returns the taxonomy parameter name.
*
diff --git a/client/src/transforms/Work.js b/client/src/transforms/Work.js
index 3548ab7f..6ba91781 100644
--- a/client/src/transforms/Work.js
+++ b/client/src/transforms/Work.js
@@ -1,10 +1,10 @@
// @flow
-import MergeableTransform from './Mergeable';
+import BaseTransform from './Base';
import SourceNames from './SourceNames';
import type { Work as WorkType } from '../types/Work';
-class Work extends MergeableTransform {
+class Work extends BaseTransform {
/**
* Returns the work parameter name.
*