Fix: track and restore changed document fields from session storage (#10468)

This commit is contained in:
shamoon 2025-07-29 00:38:43 -04:00 committed by GitHub
parent 5e7ee924ff
commit 4637f5c5e5
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 54 additions and 5 deletions

View File

@ -1030,6 +1030,22 @@ describe('DocumentDetailComponent', () => {
}) })
}) })
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', () => { it('should show custom field errors', () => {
initNormally() initNormally()
component.error = { component.error = {

View File

@ -451,6 +451,15 @@ export class DocumentDetailComponent
] ]
delete openDocument['permissions_form'] 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) this.updateComponent(openDocument)
} else { } else {
this.openDocumentService.openDocument(doc) this.openDocumentService.openDocument(doc)
@ -514,7 +523,7 @@ export class DocumentDetailComponent
) )
.subscribe({ .subscribe({
next: ({ doc, dirty }) => { next: ({ doc, dirty }) => {
this.openDocumentService.setDirty(doc, dirty) this.openDocumentService.setDirty(doc, dirty, this.getChangedFields())
}, },
error: (error) => { error: (error) => {
this.router.navigate(['404'], { this.router.navigate(['404'], {

View File

@ -158,4 +158,7 @@ export interface Document extends ObjectWithPermissions {
remove_inbox_tags?: boolean remove_inbox_tags?: boolean
page_count?: number page_count?: number
// Frontend only
__changedFields?: string[]
} }

View File

@ -241,4 +241,15 @@ describe('OpenDocumentsService', () => {
openDocumentsService.openDocument(doc) openDocumentsService.openDocument(doc)
expect(consoleSpy).toHaveBeenCalled() 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'])
})
}) })

View File

@ -84,10 +84,20 @@ export class OpenDocumentsService {
this.save() this.save()
} }
setDirty(doc: Document, dirty: boolean) { setDirty(doc: Document, dirty: boolean, changedFields: object = {}) {
if (!this.openDocuments.find((d) => d.id == doc.id)) return const existingDoc = this.getOpenDocument(doc.id)
if (dirty) this.dirtyDocuments.add(doc.id) if (!existingDoc) return
else this.dirtyDocuments.delete(doc.id) 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 { hasDirty(): boolean {