Welcome to mirror list, hosted at ThFree Co, Russian Federation.

monkeyPatchObjectAPIForNotebooks.js « notebook « plugins « src - github.com/nasa/openmct.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 8222b5effe2e6b6a772e39afd85f4a8ef18f1ab2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
import { isNotebookType } from './notebook-constants';

export default function (openmct) {
    const apiSave = openmct.objects.save.bind(openmct.objects);

    openmct.objects.save = async (domainObject) => {
        if (!isNotebookType(domainObject)) {
            return apiSave(domainObject);
        }

        const isNewMutable = !domainObject.isMutable;
        const localMutable = openmct.objects._toMutable(domainObject);
        let result;

        try {
            result = await apiSave(localMutable);
        } catch (error) {
            if (error instanceof openmct.objects.errors.Conflict) {
                result = resolveConflicts(localMutable, openmct);
            } else {
                result = Promise.reject(error);
            }
        } finally {
            if (isNewMutable) {
                openmct.objects.destroyMutable(localMutable);
            }
        }

        return result;
    };
}

function resolveConflicts(localMutable, openmct) {
    const localEntries = JSON.parse(JSON.stringify(localMutable.configuration.entries));

    return openmct.objects.getMutable(localMutable.identifier).then((remoteMutable) => {
        applyLocalEntries(remoteMutable, localEntries, openmct);

        openmct.objects.destroyMutable(remoteMutable);

        return true;
    });
}

function applyLocalEntries(mutable, entries, openmct) {
    Object.entries(entries).forEach(([sectionKey, pagesInSection]) => {
        Object.entries(pagesInSection).forEach(([pageKey, localEntries]) => {
            const remoteEntries = mutable.configuration.entries[sectionKey][pageKey];
            const mergedEntries = [].concat(remoteEntries);
            let shouldMutate = false;

            const locallyAddedEntries = _.differenceBy(localEntries, remoteEntries, 'id');
            const locallyModifiedEntries = _.differenceWith(localEntries, remoteEntries, (localEntry, remoteEntry) => {
                return localEntry.id === remoteEntry.id && localEntry.text === remoteEntry.text;
            });

            locallyAddedEntries.forEach((localEntry) => {
                mergedEntries.push(localEntry);
                shouldMutate = true;
            });

            locallyModifiedEntries.forEach((locallyModifiedEntry) => {
                let mergedEntry = mergedEntries.find(entry => entry.id === locallyModifiedEntry.id);
                if (mergedEntry !== undefined
                    && locallyModifiedEntry.text.match(/\S/)) {
                    mergedEntry.text = locallyModifiedEntry.text;
                    shouldMutate = true;
                }
            });

            if (shouldMutate) {
                openmct.objects.mutate(mutable, `configuration.entries.${sectionKey}.${pageKey}`, mergedEntries);
            }
        });
    });
}