})
})
+ it('should restore changed fields and mark as dirty', () => {
+ jest
+ .spyOn(activatedRoute, 'paramMap', 'get')
+ .mockReturnValue(of(convertToParamMap({ id: 3, section: 'details' })))
+ jest.spyOn(documentService, 'get').mockReturnValueOnce(of(doc))
+ const docWithChanges = Object.assign({}, doc)
+ docWithChanges.__changedFields = ['title', 'tags', 'owner']
+ jest
+ .spyOn(openDocumentsService, 'getOpenDocument')
+ .mockReturnValue(docWithChanges)
+ fixture.detectChanges() // calls ngOnInit
+ expect(component.documentForm.get('title').dirty).toBeTruthy()
+ expect(component.documentForm.get('tags').dirty).toBeTruthy()
+ expect(component.documentForm.get('permissions_form').dirty).toBeTruthy()
+ })
+
it('should show custom field errors', () => {
initNormally()
component.error = {
]
delete openDocument['permissions_form']
}
+ if (openDocument.__changedFields) {
+ openDocument.__changedFields.forEach((field) => {
+ if (field === 'owner' || field === 'set_permissions') {
+ this.documentForm.get('permissions_form').markAsDirty()
+ } else {
+ this.documentForm.get(field)?.markAsDirty()
+ }
+ })
+ }
this.updateComponent(openDocument)
} else {
this.openDocumentService.openDocument(doc)
)
.subscribe({
next: ({ doc, dirty }) => {
- this.openDocumentService.setDirty(doc, dirty)
+ this.openDocumentService.setDirty(doc, dirty, this.getChangedFields())
},
error: (error) => {
this.router.navigate(['404'], {
remove_inbox_tags?: boolean
page_count?: number
+
+ // Frontend only
+ __changedFields?: string[]
}
openDocumentsService.openDocument(doc)
expect(consoleSpy).toHaveBeenCalled()
})
+
+ it('should set dirty status with changed fields', () => {
+ subscriptions.push(
+ openDocumentsService.openDocument(documents[0]).subscribe()
+ )
+ const changedFields = { title: 'foo', content: 'bar' }
+ openDocumentsService.setDirty(documents[0], true, changedFields)
+ expect(
+ openDocumentsService.getOpenDocument(documents[0].id).__changedFields
+ ).toEqual(['title', 'content'])
+ })
})
this.save()
}
- setDirty(doc: Document, dirty: boolean) {
- if (!this.openDocuments.find((d) => d.id == doc.id)) return
- if (dirty) this.dirtyDocuments.add(doc.id)
- else this.dirtyDocuments.delete(doc.id)
+ setDirty(doc: Document, dirty: boolean, changedFields: object = {}) {
+ const existingDoc = this.getOpenDocument(doc.id)
+ if (!existingDoc) return
+ if (dirty) {
+ this.dirtyDocuments.add(doc.id)
+ existingDoc.__changedFields = Object.keys(changedFields).filter(
+ (key) => key !== 'id'
+ )
+ } else {
+ this.dirtyDocuments.delete(doc.id)
+ existingDoc.__changedFields = []
+ }
+
+ this.save()
}
hasDirty(): boolean {