Skip to content

Commit bf7110f

Browse files
Show "Link Entity List" button after publishing new entity list (#921)
1 parent 7008a3a commit bf7110f

File tree

2 files changed

+145
-25
lines changed

2 files changed

+145
-25
lines changed

src/components/form-draft/status.vue

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -136,10 +136,10 @@ export default {
136136
},
137137
emits: ['fetch-project', 'fetch-form', 'fetch-draft'],
138138
setup() {
139-
const { form, publishedAttachments, formVersions, formDraft, formDatasetDiff, formDraftDatasetDiff } = useRequestData();
139+
const { form, publishedAttachments, formVersions, formDraft, datasets, formDatasetDiff, formDraftDatasetDiff } = useRequestData();
140140
const { projectPath, formPath } = useRoutes();
141141
return {
142-
form, publishedAttachments, formVersions, formDraft, formDatasetDiff, formDraftDatasetDiff,
142+
form, publishedAttachments, formVersions, formDraft, datasets, formDatasetDiff, formDraftDatasetDiff,
143143
projectPath, formPath
144144
};
145145
},
@@ -183,14 +183,22 @@ export default {
183183
// the form didn't already have a published version, then there would be a
184184
// validateData violation if we didn't clear it.
185185
this.$emit('fetch-form');
186-
this.formDraftDatasetDiff.reset();
187-
this.formDatasetDiff.reset();
186+
187+
// Other resources that may have changed after publish
188188
this.publishedAttachments.reset();
189+
this.datasets.reset();
190+
this.formDatasetDiff.reset();
191+
this.formDraftDatasetDiff.reset();
192+
193+
// We will update additional resources, but only after navigating to the
194+
// form overview. We need to wait to update these resources because they
195+
// are used on this page.
189196
afterNextNavigation(this.$router, () => {
190197
// Re-request the project in case its `datasets` property has changed.
191198
this.$emit('fetch-project', true);
192199
this.formVersions.data = null;
193200
this.formDraft.setToNone();
201+
194202
this.alert.success(this.$t('alert.publish'));
195203
});
196204
this.$router.push(this.formPath());

test/components/form-attachment/list.spec.js

Lines changed: 133 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import DateTime from '../../../src/components/date-time.vue';
22
import FormAttachmentNameMismatch from '../../../src/components/form-attachment/name-mismatch.vue';
33
import FormAttachmentRow from '../../../src/components/form-attachment/row.vue';
4-
import FormAttachmentLinkDataset from '../../../src/components/form-attachment/link-dataset.vue';
54
import FormAttachmentUploadFiles from '../../../src/components/form-attachment/upload-files.vue';
65

76
import testData from '../../data';
@@ -1037,15 +1036,25 @@ describe('FormAttachmentList', () => {
10371036
});
10381037

10391038
describe('dataset linking', () => {
1040-
beforeEach(() => {
1039+
it('sends a request for datasets if the project has one', () => {
1040+
testData.extendedProjects.createPast(1, { forms: 2, datasets: 1 });
1041+
testData.extendedDatasets.createPast(1);
10411042
testData.extendedForms.createPast(1, { draft: true });
1043+
testData.standardFormAttachments.createPast(1);
1044+
return load('/projects/1/forms/f/draft/attachments', { root: false })
1045+
.respondWithData(() => testData.extendedDatasets.sorted())
1046+
.testRequests([{ url: '/v1/projects/1/datasets' }]);
10421047
});
10431048

1044-
it('autolinks dataset', async () => {
1049+
it('renders correctly for an attachment linked to a dataset', async () => {
1050+
testData.extendedProjects.createPast(1, { forms: 2, datasets: 1 });
1051+
testData.extendedDatasets.createPast(1, { name: 'shovels' });
1052+
testData.extendedForms.createPast(1, { draft: true });
10451053
testData.standardFormAttachments.createPast(1, { type: 'file', name: 'shovels.csv', datasetExists: true });
10461054
const component = await load('/projects/1/forms/f/draft/attachments', {
10471055
root: false
1048-
});
1056+
})
1057+
.respondWithData(() => testData.extendedDatasets.sorted());
10491058
component.get('td.form-attachment-list-uploaded .dataset-label').text().should.equal('Linked to Entity List shovels');
10501059
component.get('td.form-attachment-list-action').text().should.equal('Upload a file to override.');
10511060
const a = component.get('td.form-attachment-list-name a');
@@ -1055,12 +1064,9 @@ describe('FormAttachmentList', () => {
10551064

10561065
describe('Datasets preview hint', () => {
10571066
beforeEach(() => {
1058-
testData.extendedProjects.createPast(1, {
1059-
name: 'My Project Name',
1060-
forms: 1,
1061-
datasets: 1
1062-
});
1067+
testData.extendedProjects.createPast(1, { forms: 2, datasets: 1 });
10631068
testData.extendedDatasets.createPast(1, { name: 'shovels' });
1069+
testData.extendedForms.createPast(1, { draft: true });
10641070
});
10651071

10661072
const loadAttachmentComponent = () => load('/projects/1/forms/f/draft/attachments', {
@@ -1080,39 +1086,145 @@ describe('FormAttachmentList', () => {
10801086
});
10811087
});
10821088

1083-
describe('link dataset', () => {
1089+
describe('"Link Entity List" button', () => {
10841090
beforeEach(() => {
1085-
testData.extendedProjects.createPast(1, {
1086-
name: 'My Project Name',
1087-
forms: 1,
1088-
datasets: 1
1089-
});
1091+
testData.extendedProjects.createPast(1, { forms: 2, datasets: 1 });
10901092
testData.extendedDatasets.createPast(1, { name: 'shovels' });
1093+
testData.extendedForms.createPast(1, { draft: true });
10911094
testData.standardFormAttachments.createPast(1, { type: 'file', name: 'shovels.csv', blobExists: true });
10921095
});
10931096

1094-
it('shows Link Dataset button', async () => {
1097+
it('shows the button if an attachment can be linked', async () => {
10951098
const component = await load('/projects/1/forms/f/draft/attachments', {
10961099
root: false
10971100
})
10981101
.respondWithData(() => testData.extendedDatasets.sorted());
10991102
component.get('td.form-attachment-list-action .btn-link-dataset').exists().should.be.true();
11001103
});
11011104

1102-
it('links dataset', async () => {
1103-
await load('/projects/1/forms/f/draft/attachments', {
1104-
root: false
1105-
})
1105+
it('updates the attachment after it is linked', () =>
1106+
load('/projects/1/forms/f/draft/attachments', { root: false })
11061107
.respondWithData(() => testData.extendedDatasets.sorted())
11071108
.complete()
11081109
.request(async (component) => {
11091110
await component.get('td.form-attachment-list-action .btn-link-dataset').trigger('click');
1110-
component.getComponent(FormAttachmentLinkDataset).get('.btn-link-dataset').trigger('click');
1111+
return component.get('#form-attachment-link-dataset .btn-link-dataset').trigger('click');
11111112
})
11121113
.respondWithSuccess()
11131114
.afterResponse(component => {
11141115
component.get('td.form-attachment-list-uploaded .dataset-label').text().should.equal('Linked to Entity List shovels');
11151116
component.get('td.form-attachment-list-action').text().should.equal('Upload a file to override.');
1117+
}));
1118+
});
1119+
1120+
describe('linking after publishing new dataset', () => {
1121+
it('shows "Link Entity List" after first dataset is published', () => {
1122+
testData.extendedForms.createPast(1, { draft: true });
1123+
// Create an attachment with the same name as the dataset that will be
1124+
// published along with the form draft.
1125+
const attachments = testData.standardFormAttachments
1126+
.createPast(1, { type: 'file', name: 'shovels.csv', blobExists: true })
1127+
.sorted();
1128+
return load('/projects/1/forms/f/draft/attachments')
1129+
.complete()
1130+
.load('/projects/1/forms/f/draft', {
1131+
project: false,
1132+
form: false,
1133+
formDraft: false,
1134+
attachments: false
1135+
})
1136+
.complete()
1137+
.request(async (app) => {
1138+
await app.get('#form-draft-status-publish-button').trigger('click');
1139+
return app.get('#form-draft-publish .btn-primary').trigger('click');
1140+
})
1141+
.respondWithData(() => {
1142+
testData.extendedFormDrafts.publish(-1);
1143+
testData.extendedDatasets.createPast(1, { name: 'shovels' });
1144+
return { success: true };
1145+
})
1146+
.respondWithData(() => testData.extendedForms.last())
1147+
.respondWithData(() => ({
1148+
...testData.extendedProjects.last(),
1149+
datasets: 1
1150+
}))
1151+
.respondWithData(() => attachments)
1152+
.complete()
1153+
.request(app =>
1154+
app.get('#form-head-create-draft-button').trigger('click'))
1155+
.respondWithData(() => {
1156+
testData.extendedFormVersions.createNew({ draft: true });
1157+
return { success: true };
1158+
})
1159+
.respondFor('/projects/1/forms/f/draft', {
1160+
project: false,
1161+
form: false
1162+
})
1163+
.complete()
1164+
.route('/projects/1/forms/f/draft/attachments')
1165+
.respondWithData(() => testData.extendedDatasets.sorted())
1166+
// Now that a dataset has been published, a request should be sent for
1167+
// `datasets`, even though one wasn't sent before.
1168+
.testRequests([{ url: '/v1/projects/1/datasets' }])
1169+
.afterResponse(app => {
1170+
const button = app.find('.form-attachment-row .btn-link-dataset');
1171+
button.exists().should.be.true();
1172+
});
1173+
});
1174+
1175+
it('shows "Link Entity List" after another dataset is published', () => {
1176+
const project = testData.extendedProjects
1177+
.createPast(1, { forms: 2, datasets: 1 })
1178+
.last();
1179+
// There is an existing dataset named shovels. Publishing the form draft
1180+
// will publish a new dataset named trees.
1181+
testData.extendedDatasets.createPast(1, { name: 'shovels' });
1182+
testData.extendedForms.createPast(1, { draft: true });
1183+
const attachments = testData.standardFormAttachments
1184+
.createPast(1, { type: 'file', name: 'trees.csv', blobExists: true })
1185+
.sorted();
1186+
return load('/projects/1/forms/f/draft/attachments')
1187+
.respondWithData(() => testData.extendedDatasets.sorted())
1188+
.complete()
1189+
.load('/projects/1/forms/f/draft', {
1190+
project: false,
1191+
form: false,
1192+
formDraft: false,
1193+
attachments: false
1194+
})
1195+
.complete()
1196+
.request(async (app) => {
1197+
await app.get('#form-draft-status-publish-button').trigger('click');
1198+
return app.get('#form-draft-publish .btn-primary').trigger('click');
1199+
})
1200+
.respondWithData(() => {
1201+
testData.extendedFormDrafts.publish(-1);
1202+
testData.extendedDatasets.createPast(1, { name: 'trees' });
1203+
return { success: true };
1204+
})
1205+
.respondWithData(() => testData.extendedForms.last())
1206+
.respondWithData(() => ({ ...project, datasets: 2 }))
1207+
.respondWithData(() => attachments)
1208+
.complete()
1209+
.request(app =>
1210+
app.get('#form-head-create-draft-button').trigger('click'))
1211+
.respondWithData(() => {
1212+
testData.extendedFormVersions.createNew({ draft: true });
1213+
return { success: true };
1214+
})
1215+
.respondFor('/projects/1/forms/f/draft', {
1216+
project: false,
1217+
form: false
1218+
})
1219+
.complete()
1220+
.route('/projects/1/forms/f/draft/attachments')
1221+
.respondWithData(() => testData.extendedDatasets.sorted())
1222+
// After the form draft is published, a new request should be sent for
1223+
// `datasets`.
1224+
.testRequests([{ url: '/v1/projects/1/datasets' }])
1225+
.afterResponse(app => {
1226+
const button = app.find('.form-attachment-row .btn-link-dataset');
1227+
button.exists().should.be.true();
11161228
});
11171229
});
11181230
});

0 commit comments

Comments
 (0)