diff --git a/src/components/entity/activity.vue b/src/components/entity/activity.vue
index e46af48b7..c890a9436 100644
--- a/src/components/entity/activity.vue
+++ b/src/components/entity/activity.vue
@@ -57,17 +57,23 @@ const feed = computed(() => {
let versionIndex = entityVersions.length - 1;
for (const audit of audits) {
if (audit.action === 'entity.update.version') {
- const { submission } = audit.details;
+ const { submission } = audit.details.source;
const entityVersion = entityVersions[versionIndex];
versionIndex -= 1;
groups.push([{ entry: audit, submission, entityVersion }]);
} else if (audit.action === 'entity.create') {
const group = [{ entry: audit }];
const { details } = audit;
- if (details.sourceEvent?.action === 'submission.update')
- group.push({ entry: details.sourceEvent });
- if (details.submissionCreate != null)
- group.push({ entry: details.submissionCreate, submission: details.submission });
+ // this will insert a feed entry for the submission approval event
+ if (details.source?.event?.action === 'submission.update')
+ group.push({ entry: details.source.event });
+ // this will insert a feed entry for the submission creation
+ if (details.source?.submission != null) {
+ group.push({
+ entry: { action: 'submission.create', loggedAt: details.source.submission.createdAt },
+ submission: details.source.submission
+ });
+ }
groups.push(group);
} else {
groups.push([{ entry: audit }]);
diff --git a/src/components/entity/basic-details.vue b/src/components/entity/basic-details.vue
index 14661f7a8..f54eff92b 100644
--- a/src/components/entity/basic-details.vue
+++ b/src/components/entity/basic-details.vue
@@ -18,16 +18,16 @@ except according to the terms contained in the LICENSE file.
{{ $t('entity.entityId') }}
{{ entity.uuid }}
-
+
{{ $t('creatingSubmission') }}
-
- {{ submission.currentVersion.instanceName ?? instanceId }}
+
+ {{ submission.currentVersion.instanceName ?? submission.instanceId }}
- {{ instanceId }}
+ {{ submission.instanceId }}
{{ $t('submissionDeleted') }}
@@ -65,23 +65,16 @@ const projectId = inject('projectId');
// created.
const { entity, audits } = useRequestData();
-// Using `ref` and watchEffect() for instanceId and `submission` rather than
-// `computed` so that they don't change whenever `audits` is refreshed.
-const instanceId = ref(undefined);
+// Using `ref` and watchEffect() for `submission` rather than
+// `computed` so that it doesn't change whenever `audits` is refreshed.
const submission = ref(undefined);
watchEffect(() => {
- if (instanceId.value !== undefined || !audits.dataExists) return;
+ if (submission.value !== undefined || !audits.dataExists) return;
const audit = audits.find(({ action }) => action === 'entity.create');
// `audit` should always exist in production, but it doesn't always exist in
// testing.
if (audit == null) return;
- const { submissionCreate } = audit.details;
- if (submissionCreate != null) {
- instanceId.value = submissionCreate.details.instanceId;
- submission.value = audit.details.submission;
- } else {
- instanceId.value = null;
- }
+ submission.value = audit.details.source?.submission;
});
const { submissionPath } = useRoutes();
diff --git a/src/components/entity/feed-entry.vue b/src/components/entity/feed-entry.vue
index 0babcd844..1bf90e5a9 100644
--- a/src/components/entity/feed-entry.vue
+++ b/src/components/entity/feed-entry.vue
@@ -15,20 +15,20 @@ except according to the terms contained in the LICENSE file.
-
{{ submission.currentVersion.instanceName ?? submission.instanceId }}
-
+
{{ deletedSubmission }}
-
+
@@ -44,7 +44,7 @@ except according to the terms contained in the LICENSE file.
-
{{ entity.currentVersion.label }}
@@ -63,8 +63,8 @@ except according to the terms contained in the LICENSE file.
-
-
+
@@ -148,18 +148,13 @@ const creatingSubmissionPath = computed(() => submissionPath(
));
const { t } = useI18n();
-// This function pulls out the submission instance ID when the event
-// is about a submission (creation, approval) and the ID is directly
-// in the event details.
const deletedSubmission = computed(() => {
- const id = props.entry.details.instanceId;
+ const id = props.submission.instanceId;
return t('title.submission.create.deleted.deletedSubmission', { id });
});
-// This function pulls out the submission instance ID in events about
-// entities, where the instance ID is found deep inside the submissionCreate event.
const deletedSubmissionEntityEvent = computed(() => {
- const id = props.entry.details.submissionCreate.details.instanceId;
+ const id = props.submission.instanceId;
return t('title.entity.update_version.submission.deleted.deletedSubmission', { id });
});
const { reviewStateIcon } = useReviewState();
diff --git a/src/components/entity/version-link.vue b/src/components/entity/version-link.vue
index dd618de6e..24f0f6af8 100644
--- a/src/components/entity/version-link.vue
+++ b/src/components/entity/version-link.vue
@@ -44,10 +44,10 @@ const versionPath = computed(() => {
const { t } = useI18n();
const text = computed(() => {
const { source } = props.version;
- const { submissionCreate } = source;
- if (submissionCreate != null) {
- const nameOrId = source.submission?.currentVersion?.instanceName ??
- submissionCreate.details.instanceId;
+ const { submission } = source;
+ if (submission != null) {
+ const nameOrId = submission.currentVersion?.instanceName ??
+ submission.instanceId;
return t('submission', { instanceName: nameOrId });
}
return t('api', { name: props.version.creator.displayName });
diff --git a/test/components/entity/activity.spec.js b/test/components/entity/activity.spec.js
index d762db4e7..c4e95a207 100644
--- a/test/components/entity/activity.spec.js
+++ b/test/components/entity/activity.spec.js
@@ -38,17 +38,17 @@ const resolveConflict = () => {
testData.extendedEntities.createPast(1, { uuid: 'e' });
testData.extendedAudits.createPast(1, {
action: 'entity.create',
- details: {}
+ details: { source: {} }
});
testData.extendedEntityVersions.createPast(1);
testData.extendedAudits.createPast(1, {
action: 'entity.update.version',
- details: {}
+ details: { source: {} }
});
testData.extendedEntityVersions.createPast(1, { baseVersion: 1 });
testData.extendedAudits.createPast(1, {
action: 'entity.update.version',
- details: {}
+ details: { source: {} }
});
testData.extendedEntities.resolve(-1);
testData.extendedAudits.createPast(1, { action: 'entity.update.resolve' });
@@ -102,7 +102,7 @@ describe('EntityActivity', () => {
testData.extendedEntities.createPast(1);
testData.extendedAudits.createPast(1, {
action: 'entity.create',
- details: sourceDetails
+ details: { source: sourceDetails }
});
const component = mountComponent();
component.findAll('.feed-entry-group').length.should.equal(1);
@@ -119,7 +119,7 @@ describe('EntityActivity', () => {
testData.extendedEntities.createPast(1);
testData.extendedAudits.createPast(1, {
action: 'entity.create',
- details: sourceDetails
+ details: { source: sourceDetails }
});
const component = mountComponent();
component.findAll('.feed-entry-group').length.should.equal(1);
@@ -137,7 +137,7 @@ describe('EntityActivity', () => {
testData.extendedEntities.createPast(1);
testData.extendedAudits.createPast(1, {
action: 'entity.create',
- details: sourceDetails
+ details: { source: sourceDetails }
});
const component = mountComponent();
component.findAll('.feed-entry-group').length.should.equal(1);
@@ -187,13 +187,13 @@ describe('EntityActivity', () => {
});
testData.extendedAudits.createPast(1, {
action: 'entity.create',
- details: {}
+ details: { source: {} }
});
for (let version = 2; version <= 50; version += 1) {
testData.extendedEntityVersions.createPast(1);
testData.extendedAudits.createPast(1, {
action: 'entity.update.version',
- details: {}
+ details: { source: {} }
});
}
};
@@ -258,7 +258,7 @@ describe('EntityActivity', () => {
});
testData.extendedAudits.createPast(1, {
action: 'entity.update.version',
- details: {}
+ details: { source: {} }
});
return testData.standardEntities.last();
})
diff --git a/test/components/entity/basic-details.spec.js b/test/components/entity/basic-details.spec.js
index e3d1817a6..597601e61 100644
--- a/test/components/entity/basic-details.spec.js
+++ b/test/components/entity/basic-details.spec.js
@@ -47,20 +47,18 @@ describe('EntityBasicDetails', () => {
const submission = testData.extendedSubmissions
.createPast(1, { instanceId: 's', ...submissionOptions })
.last();
- const submissionCreate = testData.extendedAudits
- .createPast(1, {
- action: 'submission.create',
- details: { instanceId: submission.instanceId }
- })
- .last();
-
testData.extendedEntities.createPast(1, { uuid: 'e' });
const details = {
entity: { uuid: 'e' },
- submissionCreate
+ source: {}
};
if (!submissionDeleted)
- details.submission = { ...submission, xmlFormId: 'f' };
+ details.source = { submission: { ...submission, xmlFormId: 'f' } }; // Use entire submission, augmented with form id
+ else {
+ // If submission is deleted, these are the only fields we pass through in the audit log
+ const { instanceId, submitter, createdAt } = submission;
+ details.source = { submission: { instanceId, submitter, createdAt } };
+ }
testData.extendedAudits.createPast(1, {
action: 'entity.create',
details
@@ -147,7 +145,7 @@ describe('EntityBasicDetails', () => {
});
testData.extendedAudits.createPast(1, {
action: 'entity.update.version',
- details: {}
+ details: { source: {} }
});
return testData.standardEntities.last();
})
diff --git a/test/components/entity/feed-entry.spec.js b/test/components/entity/feed-entry.spec.js
index 702fd2224..92885cec7 100644
--- a/test/components/entity/feed-entry.spec.js
+++ b/test/components/entity/feed-entry.spec.js
@@ -50,18 +50,25 @@ describe('EntityFeedEntry', () => {
describe('submission.create audit event', () => {
const createSubmission = ({ deleted = false, ...options } = {}) => {
- const submission = testData.extendedSubmissions
+ // create a submission
+ const fullSubmission = testData.extendedSubmissions
.createPast(1, { instanceId: 's', ...options })
.last();
+ // return either full or partial submission info depending on if submission was deleted
+ const submission = (deleted)
+ ? { instanceId: fullSubmission.instanceId, submitter: fullSubmission.submitter, createdAt: fullSubmission.createdAt }
+ : { ...fullSubmission, xmlFormId: 'f' }; // full submission augmented with form id
+
const audit = testData.extendedAudits
.createPast(1, {
action: 'submission.create',
- details: { instanceId: 's' }
+ details: { instanceId: submission.instanceId }
})
.last();
+
return {
entry: audit,
- submission: deleted ? null : { ...submission, xmlFormId: 'f' }
+ submission
};
};
@@ -160,13 +167,12 @@ describe('EntityFeedEntry', () => {
// entity.create event.
const createEntity = (options = {}) => {
const details = {
- entity: { uuid: 'e' }
+ entity: { uuid: 'e' },
+ source: {}
};
if (options.submission === true) {
- testData.extendedSubmissions.createPast(1);
- details.submissionCreate = testData.extendedAudits
- .createPast(1, { action: 'submission.create' })
- .last();
+ const submission = testData.extendedSubmissions.createPast(1).last();
+ details.source = { submission: { ...submission, xmlFormId: 'f' } };
}
testData.extendedAudits.createPast(1, {
action: 'entity.create',
@@ -218,7 +224,7 @@ describe('EntityFeedEntry', () => {
testData.extendedEntityVersions.createPast(1);
testData.extendedAudits.createPast(1, {
action: 'entity.update.version',
- details: {}
+ details: { source: {} }
});
});
@@ -250,21 +256,21 @@ describe('EntityFeedEntry', () => {
describe('entity.update.version (via submission) audit event', () => {
const updateEntityFromSubmission = ({ deleted = false, ...options } = {}) => {
- const details = {
- entity: { uuid: 'e' }
- };
-
- details.submissionCreate = testData.extendedAudits
- .createPast(1, {
- action: 'submission.create',
- details: { instanceId: 'x' }
- })
- .last();
-
- const submission = testData.extendedSubmissions
+ // create the submission this event is based on
+ const fullSubmission = testData.extendedSubmissions
.createPast(1, { instanceId: 's', ...options })
.last();
+ // return either full or partial submission info depending on if submission was deleted
+ const submission = (deleted)
+ ? { instanceId: fullSubmission.instanceId, submitter: fullSubmission.submitter, createdAt: fullSubmission.createdAt }
+ : { ...fullSubmission, xmlFormId: 'f' }; // full submission augmented with form id
+
+ const details = {
+ entity: { uuid: 'e' },
+ source: { submission } // source would also have `event` but that is not used in this component
+ };
+
testData.extendedEntityVersions.createPast(1);
const audit = testData.extendedAudits
.createPast(1, {
@@ -275,7 +281,7 @@ describe('EntityFeedEntry', () => {
return {
entry: audit,
- submission: deleted ? null : { ...submission, xmlFormId: 'f' }
+ submission
};
};
@@ -308,7 +314,7 @@ describe('EntityFeedEntry', () => {
it('shows the correct text with deleted submission instance id', () => {
const component = mountComponent({ props: updateEntityFromSubmission({ deleted: true }) });
const text = component.get('.feed-entry-title .title').text();
- text.should.equal('Data updated by (deleted Submission x)');
+ text.should.equal('Data updated by (deleted Submission s)');
});
it('does not link to the deleted submission', () => {
diff --git a/test/components/entity/show.spec.js b/test/components/entity/show.spec.js
index e9ccaf3a4..ca55a202d 100644
--- a/test/components/entity/show.spec.js
+++ b/test/components/entity/show.spec.js
@@ -86,7 +86,7 @@ describe('EntityShow', () => {
});
testData.extendedAudits.createPast(1, {
action: 'entity.update.version',
- details: {}
+ details: { source: {} }
});
return testData.standardEntities.last();
})
@@ -151,7 +151,7 @@ describe('EntityShow', () => {
});
testData.extendedAudits.createPast(1, {
action: 'entity.update.version',
- details: {}
+ details: { source: {} }
});
return testData.standardEntities.last();
diff --git a/test/components/entity/version-link.spec.js b/test/components/entity/version-link.spec.js
index 626d50d6c..d671f2314 100644
--- a/test/components/entity/version-link.spec.js
+++ b/test/components/entity/version-link.spec.js
@@ -37,25 +37,33 @@ describe('EntityVersionLink', () => {
describe('entity source is a submission', () => {
it('shows the instance name if the submission has one', () => {
- const { submission, submissionCreate } = testData.extendedEntities
+ const { submission } = testData.extendedEntities
.createSourceSubmission('submission.create', {
meta: { instanceName: 'Some Name' }
});
testData.extendedEntities.createPast(1, {
- source: { submission, submissionCreate }
+ source: { submission }
});
mountComponent().text().should.equal('Submission Some Name');
});
- it('falls back to the instance ID', () => {
- const { submissionCreate } = testData.extendedEntities
+ it('shows the instance ID if the submission has no instance name', () => {
+ const { submission } = testData.extendedEntities
.createSourceSubmission('submission.create', { instanceId: 's' });
testData.extendedEntities.createPast(1, {
- // Don't specify source.submission, matching the response if the
- // submission is deleted.
- source: { submissionCreate }
+ source: { submission }
});
mountComponent().text().should.equal('Submission s');
});
+
+ it('falls back to the instance ID if submission deleted', () => {
+ // Final argument about source submission: deleted=true
+ const { submission } = testData.extendedEntities
+ .createSourceSubmission('submission.create', { instanceId: 'x' }, true);
+ testData.extendedEntities.createPast(1, {
+ source: { submission }
+ });
+ mountComponent().text().should.equal('Submission x');
+ });
});
});
diff --git a/test/data/entities.js b/test/data/entities.js
index a341ef24c..a2b33d60f 100644
--- a/test/data/entities.js
+++ b/test/data/entities.js
@@ -258,28 +258,30 @@ export const entityOData = (top = 250, skip = 0) => {
};
// Creates a source submission along with submission audit log events.
-extendedEntities.createSourceSubmission = (sourceAction, submissionOptions = {}) => {
- const submission = extendedSubmissions
+extendedEntities.createSourceSubmission = (sourceAction, submissionOptions = {}, deleted = false) => {
+ const fullSubmission = extendedSubmissions
.createPast(1, submissionOptions)
.last();
const formVersion = submissionOptions.formVersion ?? extendedForms.first();
- const submissionWithFormId = {
- ...submission,
- xmlFormId: formVersion.xmlFormId
- };
+ const submission = (!deleted)
+ ? { ...fullSubmission, xmlFormId: formVersion.xmlFormId }
+ : {
+ instanceId: fullSubmission.instanceId,
+ submitter: fullSubmission.submitter,
+ createdAt: fullSubmission.createdAt
+ };
const auditOptions = {
actor: submission.submitter,
actee: formVersion,
details: { instanceId: submission.instanceId }
};
- const submissionCreate = extendedAudits
+ extendedAudits
.createPast(1, {
action: 'submission.create',
loggedAt: submission.createdAt,
...auditOptions
- })
- .last();
+ });
if (sourceAction === 'submission.update') {
extendedSubmissions.update(-1, { reviewState: 'approved' });
extendedAudits.createPast(1, {
@@ -295,9 +297,9 @@ extendedEntities.createSourceSubmission = (sourceAction, submissionOptions = {})
} else if (sourceAction !== 'submission.create') {
throw new Error('invalid action');
}
- const sourceEvent = extendedAudits.last();
+ const event = extendedAudits.last();
- return { submission: submissionWithFormId, submissionCreate, sourceEvent };
+ return { submission, event };
};
extendedEntities.resolve = (index) => {