Skip to content

Commit 1115dd0

Browse files
fix(i18n): allow to store the new entry in the draft after a pre save (#7227)
* fix(i18n): allow to store the new entry in the draft after a pre save * feat(persistEntry): test preSave that return data or entry map * fix(linter): expected property shorthand object-shorthand * fix: format backend spec, update caniuse-lite --------- Co-authored-by: Martin Jagodic <[email protected]>
1 parent aef22c7 commit 1115dd0

File tree

3 files changed

+86
-5
lines changed

3 files changed

+86
-5
lines changed

package-lock.json

+3-3
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/decap-cms-core/src/__tests__/backend.spec.js

+75
Original file line numberDiff line numberDiff line change
@@ -318,6 +318,81 @@ describe('Backend', () => {
318318
});
319319
});
320320

321+
describe('persistEntry', () => {
322+
it('should update the draft with the new entry returned by preSave event', async () => {
323+
const implementation = {
324+
init: jest.fn(() => implementation),
325+
persistEntry: jest.fn(() => implementation),
326+
};
327+
328+
const config = {
329+
backend: {
330+
commit_messages: 'commit-messages',
331+
},
332+
};
333+
const collection = Map({
334+
name: 'posts',
335+
});
336+
const entry = Map({
337+
data: 'old_data',
338+
});
339+
const newEntry = Map({
340+
data: 'new_data',
341+
});
342+
const entryDraft = Map({
343+
entry,
344+
});
345+
const user = { login: 'login', name: 'name' };
346+
const backend = new Backend(implementation, { config, backendName: 'github' });
347+
348+
backend.currentUser = jest.fn().mockResolvedValue(user);
349+
backend.entryToRaw = jest.fn().mockReturnValue('content');
350+
backend.invokePreSaveEvent = jest.fn().mockReturnValueOnce(newEntry);
351+
352+
await backend.persistEntry({ config, collection, entryDraft });
353+
354+
expect(backend.entryToRaw).toHaveBeenCalledTimes(1);
355+
expect(backend.entryToRaw).toHaveBeenCalledWith(collection, newEntry);
356+
});
357+
358+
it('should update the draft with the new data returned by preSave event', async () => {
359+
const implementation = {
360+
init: jest.fn(() => implementation),
361+
persistEntry: jest.fn(() => implementation),
362+
};
363+
364+
const config = {
365+
backend: {
366+
commit_messages: 'commit-messages',
367+
},
368+
};
369+
const collection = Map({
370+
name: 'posts',
371+
});
372+
const entry = Map({
373+
data: Map({}),
374+
});
375+
const newData = Map({});
376+
const newEntry = Map({
377+
data: newData,
378+
});
379+
const entryDraft = Map({
380+
entry,
381+
});
382+
const user = { login: 'login', name: 'name' };
383+
const backend = new Backend(implementation, { config, backendName: 'github' });
384+
385+
backend.currentUser = jest.fn().mockResolvedValue(user);
386+
backend.entryToRaw = jest.fn().mockReturnValue('content');
387+
backend.invokePreSaveEvent = jest.fn().mockReturnValueOnce(newData);
388+
389+
await backend.persistEntry({ config, collection, entryDraft });
390+
391+
expect(backend.entryToRaw).toHaveBeenCalledTimes(1);
392+
expect(backend.entryToRaw).toHaveBeenCalledWith(collection, newEntry);
393+
});
394+
});
395+
321396
describe('persistMedia', () => {
322397
it('should persist media', async () => {
323398
const persistMediaResult = {};

packages/decap-cms-core/src/backend.ts

+8-2
Original file line numberDiff line numberDiff line change
@@ -1091,8 +1091,14 @@ export class Backend {
10911091
unpublished = false,
10921092
status,
10931093
}: PersistArgs) {
1094-
const modifiedData = await this.invokePreSaveEvent(draft.get('entry'));
1095-
const entryDraft = (modifiedData && draft.setIn(['entry', 'data'], modifiedData)) || draft;
1094+
const updatedEntity = await this.invokePreSaveEvent(draft.get('entry'));
1095+
1096+
let entryDraft;
1097+
if (updatedEntity.get('data') === undefined) {
1098+
entryDraft = (updatedEntity && draft.setIn(['entry', 'data'], updatedEntity)) || draft;
1099+
} else {
1100+
entryDraft = (updatedEntity && draft.setIn(['entry'], updatedEntity)) || draft;
1101+
}
10961102

10971103
const newEntry = entryDraft.getIn(['entry', 'newRecord']) || false;
10981104

0 commit comments

Comments
 (0)