• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

geonetwork / geonetwork-ui / 12471273633

23 Dec 2024 06:26PM UTC coverage: 84.204% (-0.4%) from 84.621%
12471273633

Pull #1051

github

web-flow
Merge 183a90b40 into 8c98ae01e
Pull Request #1051: [Editor]: Warn user if draft has been updated

3248 of 4338 branches covered (74.87%)

Branch coverage included in aggregate %.

69 of 73 new or added lines in 10 files covered. (94.52%)

11 existing lines in 2 files now uncovered.

9253 of 10508 relevant lines covered (88.06%)

199.09 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

88.57
/libs/feature/editor/src/lib/services/editor.service.ts
1
import { Injectable } from '@angular/core'
2✔
2
import { Observable, switchMap } from 'rxjs'
2✔
3
import { map, tap } from 'rxjs/operators'
2✔
4
import { CatalogRecord } from '@geonetwork-ui/common/domain/model/record'
5
import { EditorConfig } from '../models/'
6
import { evaluate } from '../expressions'
2✔
7
import { RecordsRepositoryInterface } from '@geonetwork-ui/common/domain/repository/records-repository.interface'
2✔
8

9
@Injectable({
10
  providedIn: 'root',
11
})
12
export class EditorService {
2✔
13
  constructor(private recordsRepository: RecordsRepositoryInterface) {}
5!
14

15
  // returns the record as it was when saved, alongside its source
16
  saveRecord(
17
    record: CatalogRecord,
18
    recordSource: string,
19
    fieldsConfig: EditorConfig,
20
    generateNewUniqueIdentifier = false
3✔
21
  ): Observable<[CatalogRecord, string]> {
22
    const savedRecord = { ...record }
4✔
23

24
    const fields = fieldsConfig.pages.flatMap((page) =>
4✔
25
      page.sections.flatMap((section) => section.fields)
36✔
26
    )
27

28
    // run onSave processes
29
    for (const field of fields) {
4✔
30
      if (field.onSaveProcess && field.model) {
88✔
31
        const evaluator = evaluate(field.onSaveProcess)
4✔
32
        savedRecord[field.model] = evaluator({
4✔
33
          model: field.model,
34
          value: record[field.model],
35
        })
36
      }
37
    }
38

39
    // if we want a new unique identifier, clear the existing one
40
    if (generateNewUniqueIdentifier) {
4✔
41
      savedRecord.uniqueIdentifier = null
1✔
42
    }
43

44
    return this.recordsRepository.saveRecord(savedRecord, recordSource).pipe(
4✔
45
      switchMap((uniqueIdentifier) =>
46
        this.recordsRepository.openRecordForEdition(uniqueIdentifier)
4✔
47
      ),
48
      tap(() => {
49
        // if saving was successful, the original draft can be discarded
50
        this.recordsRepository.clearRecordDraft(record.uniqueIdentifier)
4✔
51
      }),
52
      map(([record, recordSource]) => [record, recordSource])
4✔
53
    )
54
  }
55

56
  // emits and completes once saving is done
57
  // note: onSave processes are not run for drafts
58
  saveRecordAsDraft(
59
    record: CatalogRecord,
60
    recordSource: string
61
  ): Observable<void> {
62
    record.recordUpdated = new Date()
1✔
63
    return this.recordsRepository
1✔
64
      .saveRecordAsDraft(record, recordSource)
65
      .pipe(map(() => undefined))
1✔
66
  }
67

68
  undoRecordDraft(
69
    record: CatalogRecord
70
  ): Observable<[CatalogRecord, string, boolean]> {
71
    this.recordsRepository.clearRecordDraft(record.uniqueIdentifier)
×
72
    return this.recordsRepository.openRecordForEdition(record.uniqueIdentifier)
×
73
  }
74

75
  hasRecordChangedSinceDraft(
76
    localRecord: CatalogRecord
77
  ): Observable<{ user: string; date: Date }> {
NEW
78
    return this.recordsRepository.hasRecordChangedSinceDraft(localRecord)
×
79
  }
80
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc