@linkurious/ogma-linkurious-parser 3.1.12 → 4.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/captions/captions.js +39 -50
- package/dist/captions/captions.js.map +1 -1
- package/dist/filters/filters.js +54 -76
- package/dist/filters/filters.js.map +1 -1
- package/dist/ogma/features/OgmaStore.js +15 -30
- package/dist/ogma/features/OgmaStore.js.map +1 -1
- package/dist/ogma/features/captions.js +42 -87
- package/dist/ogma/features/captions.js.map +1 -1
- package/dist/ogma/features/reactive.js +57 -75
- package/dist/ogma/features/reactive.js.map +1 -1
- package/dist/ogma/features/selectors.js +15 -15
- package/dist/ogma/features/selectors.js.map +1 -1
- package/dist/ogma/features/styles.js +114 -137
- package/dist/ogma/features/styles.js.map +1 -1
- package/dist/ogma/features/transformations.js +46 -94
- package/dist/ogma/features/transformations.js.map +1 -1
- package/dist/ogma/index.js +138 -221
- package/dist/ogma/index.js.map +1 -1
- package/dist/styles/edgeAttributes.js +30 -46
- package/dist/styles/edgeAttributes.js.map +1 -1
- package/dist/styles/itemAttributes.js +31 -41
- package/dist/styles/itemAttributes.js.map +1 -1
- package/dist/styles/nodeAttributes.js +48 -71
- package/dist/styles/nodeAttributes.js.map +1 -1
- package/dist/styles/styleRule.js +56 -68
- package/dist/styles/styleRule.js.map +1 -1
- package/dist/styles/styleRules.js +149 -192
- package/dist/styles/styleRules.js.map +1 -1
- package/dist/tools/ogmaTool.js +27 -30
- package/dist/tools/ogmaTool.js.map +1 -1
- package/dist/tools/tools.js +87 -91
- package/dist/tools/tools.js.map +1 -1
- package/package.json +5 -5
|
@@ -1,49 +1,40 @@
|
|
|
1
1
|
'use strict';
|
|
2
|
-
var __spreadArrays = (this && this.__spreadArrays) || function () {
|
|
3
|
-
for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;
|
|
4
|
-
for (var r = Array(s), k = 0, i = 0; i < il; i++)
|
|
5
|
-
for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)
|
|
6
|
-
r[k] = a[j];
|
|
7
|
-
return r;
|
|
8
|
-
};
|
|
9
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
function Captions() {
|
|
14
|
-
}
|
|
3
|
+
const rest_client_1 = require("@linkurious/rest-client");
|
|
4
|
+
const tools_1 = require("../tools/tools");
|
|
5
|
+
class Captions {
|
|
15
6
|
/**
|
|
16
7
|
* Return label for each node
|
|
17
8
|
*/
|
|
18
|
-
|
|
19
|
-
|
|
9
|
+
static getText(itemData, schema, graphSchema) {
|
|
10
|
+
const types = 'categories' in itemData ? itemData.categories : [itemData.type];
|
|
20
11
|
if (Captions.captionExist(types, schema)) {
|
|
21
12
|
return 'categories' in itemData
|
|
22
13
|
? Captions.generateNodeCaption(itemData, schema, graphSchema) || null
|
|
23
14
|
: Captions.generateEdgeCaption(itemData, schema, graphSchema) || null;
|
|
24
15
|
}
|
|
25
16
|
if (itemData.properties !== undefined) {
|
|
26
|
-
|
|
17
|
+
const heuristicCaptionElement = tools_1.CAPTION_HEURISTIC.find((value) => {
|
|
27
18
|
return itemData.properties[value] !== undefined;
|
|
28
19
|
});
|
|
29
20
|
if (heuristicCaptionElement !== undefined &&
|
|
30
21
|
tools_1.Tools.isDefined(itemData.properties[heuristicCaptionElement])) {
|
|
31
|
-
return
|
|
22
|
+
return `${tools_1.Tools.getValueFromLkProperty(itemData.properties[heuristicCaptionElement])}`.trim();
|
|
32
23
|
}
|
|
33
24
|
}
|
|
34
25
|
return null;
|
|
35
|
-
}
|
|
26
|
+
}
|
|
36
27
|
/**
|
|
37
28
|
* Return a readable string from an LkProperty
|
|
38
29
|
*/
|
|
39
|
-
|
|
30
|
+
static getLabel(propertyValue, propertyType) {
|
|
40
31
|
var _a;
|
|
41
32
|
if (typeof propertyValue === 'object' && 'type' in propertyValue) {
|
|
42
33
|
if (!('original' in propertyValue) && !('value' in propertyValue)) {
|
|
43
34
|
return null;
|
|
44
35
|
}
|
|
45
36
|
if ('original' in propertyValue) {
|
|
46
|
-
return
|
|
37
|
+
return `${propertyValue.original}`;
|
|
47
38
|
}
|
|
48
39
|
if ('value' in propertyValue) {
|
|
49
40
|
return tools_1.Tools.formatDate(new Date(new Date(propertyValue.value).getTime() +
|
|
@@ -54,64 +45,63 @@ var Captions = /** @class */ (function () {
|
|
|
54
45
|
propertyType.options !== undefined) {
|
|
55
46
|
return tools_1.Tools.formatCurrencyValue(propertyValue, propertyType.options);
|
|
56
47
|
}
|
|
57
|
-
return
|
|
58
|
-
}
|
|
48
|
+
return `${propertyValue}`.trim();
|
|
49
|
+
}
|
|
59
50
|
/**
|
|
60
51
|
* Return true if caption configuration exists in schema
|
|
61
52
|
*/
|
|
62
|
-
|
|
63
|
-
return itemTypes.some(
|
|
64
|
-
}
|
|
53
|
+
static captionExist(itemTypes, schema) {
|
|
54
|
+
return itemTypes.some((type) => tools_1.Tools.isDefined(schema[type]));
|
|
55
|
+
}
|
|
65
56
|
/**
|
|
66
57
|
* Generate text from node data and captions schema
|
|
67
58
|
*/
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
categories.forEach(function (category) {
|
|
59
|
+
static generateNodeCaption(itemData, schema, graphSchema) {
|
|
60
|
+
const categories = itemData.categories;
|
|
61
|
+
const caption = [];
|
|
62
|
+
let captionProps = [];
|
|
63
|
+
categories.forEach((category) => {
|
|
74
64
|
if (schema[category] && schema[category].active) {
|
|
75
65
|
if (schema[category].displayName) {
|
|
76
66
|
caption.push(category);
|
|
77
67
|
}
|
|
78
|
-
captionProps =
|
|
68
|
+
captionProps = [...captionProps, ...schema[category].properties];
|
|
79
69
|
}
|
|
80
70
|
});
|
|
81
|
-
tools_1.Tools.uniqBy(captionProps).forEach(
|
|
71
|
+
tools_1.Tools.uniqBy(captionProps).forEach((propertyKey) => {
|
|
82
72
|
if (itemData.properties[propertyKey] !== undefined) {
|
|
83
|
-
|
|
73
|
+
const propertyType = graphSchema
|
|
84
74
|
? Captions.getPropertyType(graphSchema, propertyKey, categories[0])
|
|
85
75
|
: undefined;
|
|
86
|
-
caption.push(
|
|
76
|
+
caption.push(this.getLabel(itemData.properties[propertyKey], propertyType));
|
|
87
77
|
}
|
|
88
78
|
});
|
|
89
79
|
return caption
|
|
90
|
-
.filter(
|
|
80
|
+
.filter((c) => c !== null)
|
|
91
81
|
.join(' - ')
|
|
92
82
|
.trim();
|
|
93
|
-
}
|
|
94
|
-
|
|
83
|
+
}
|
|
84
|
+
static getPropertyType(graphSchema, propertyKey, itemType) {
|
|
95
85
|
var _a, _b;
|
|
96
|
-
|
|
97
|
-
|
|
86
|
+
const typeGraphSchema = graphSchema.find((schemaType) => schemaType.itemType === itemType);
|
|
87
|
+
const property = (_a = typeGraphSchema) === null || _a === void 0 ? void 0 : _a.properties.find((property) => property.propertyKey === propertyKey);
|
|
98
88
|
return (_b = property) === null || _b === void 0 ? void 0 : _b.propertyType;
|
|
99
|
-
}
|
|
89
|
+
}
|
|
100
90
|
/**
|
|
101
91
|
* Generate text from edge data and captions schema
|
|
102
92
|
*/
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
93
|
+
static generateEdgeCaption(itemData, schema, graphSchema) {
|
|
94
|
+
const type = itemData.type;
|
|
95
|
+
const caption = [];
|
|
96
|
+
let captionProps = [];
|
|
107
97
|
if (schema[type] && schema[type].active) {
|
|
108
98
|
if (schema[type].displayName) {
|
|
109
99
|
caption.push(type);
|
|
110
100
|
}
|
|
111
|
-
captionProps =
|
|
112
|
-
tools_1.Tools.uniqBy(captionProps).forEach(
|
|
101
|
+
captionProps = [...captionProps, ...schema[type].properties];
|
|
102
|
+
tools_1.Tools.uniqBy(captionProps).forEach((propertyKey) => {
|
|
113
103
|
if (tools_1.Tools.isDefined(itemData.properties[propertyKey])) {
|
|
114
|
-
|
|
104
|
+
const propertyType = graphSchema
|
|
115
105
|
? Captions.getPropertyType(graphSchema, propertyKey, type)
|
|
116
106
|
: undefined;
|
|
117
107
|
caption.push(Captions.getLabel(itemData.properties[propertyKey], propertyType));
|
|
@@ -120,8 +110,7 @@ var Captions = /** @class */ (function () {
|
|
|
120
110
|
return caption.join(' - ').trim();
|
|
121
111
|
}
|
|
122
112
|
return '';
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
}());
|
|
113
|
+
}
|
|
114
|
+
}
|
|
126
115
|
exports.Captions = Captions;
|
|
127
116
|
//# sourceMappingURL=captions.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"captions.js","sourceRoot":"","sources":["../../src/captions/captions.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC
|
|
1
|
+
{"version":3,"file":"captions.js","sourceRoot":"","sources":["../../src/captions/captions.ts"],"names":[],"mappings":"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","sourcesContent":["'use strict';\n\nimport {\n GraphSchemaTypeWithAccess,\n ICaptionConfig,\n ItemFieldsCaptions,\n LkEdgeData,\n LkNodeData,\n LkProperty,\n PropertyType,\n PropertyTypeName,\n GraphSchemaPropertyWithAccess\n} from '@linkurious/rest-client';\n\nimport {CAPTION_HEURISTIC, Tools} from '../tools/tools';\n\nexport class Captions {\n /**\n * Return label for each node\n */\n public static getText(\n itemData: LkNodeData | LkEdgeData,\n schema: ItemFieldsCaptions,\n graphSchema?: GraphSchemaTypeWithAccess[]\n ): string | null {\n const types = 'categories' in itemData ? itemData.categories : [itemData.type];\n if (Captions.captionExist(types, schema)) {\n return 'categories' in itemData\n ? Captions.generateNodeCaption(itemData, schema, graphSchema) || null\n : Captions.generateEdgeCaption(itemData, schema, graphSchema) || null;\n }\n if (itemData.properties !== undefined) {\n const heuristicCaptionElement = CAPTION_HEURISTIC.find((value) => {\n return itemData.properties[value] !== undefined;\n });\n if (\n heuristicCaptionElement !== undefined &&\n Tools.isDefined(itemData.properties[heuristicCaptionElement])\n ) {\n return `${Tools.getValueFromLkProperty(\n itemData.properties[heuristicCaptionElement]\n )}`.trim();\n }\n }\n return null;\n }\n\n /**\n * Return a readable string from an LkProperty\n */\n private static getLabel(\n propertyValue: LkProperty,\n propertyType?: PropertyType | undefined\n ): string | null {\n if (typeof propertyValue === 'object' && 'type' in propertyValue) {\n if (!('original' in propertyValue) && !('value' in propertyValue)) {\n return null;\n }\n if ('original' in propertyValue) {\n return `${propertyValue.original}`;\n }\n if ('value' in propertyValue) {\n return Tools.formatDate(\n new Date(\n new Date(propertyValue.value).getTime() +\n Tools.timezoneToMilliseconds(propertyValue.timezone)\n ).toISOString()\n );\n }\n } else if (\n propertyType?.name === PropertyTypeName.NUMBER &&\n propertyType.options !== undefined\n ) {\n return Tools.formatCurrencyValue(propertyValue as number, propertyType.options);\n }\n return `${propertyValue}`.trim();\n }\n\n /**\n * Return true if caption configuration exists in schema\n */\n public static captionExist(itemTypes: Array<string>, schema: ItemFieldsCaptions): boolean {\n return itemTypes.some((type) => Tools.isDefined(schema[type]));\n }\n\n /**\n * Generate text from node data and captions schema\n */\n public static generateNodeCaption(\n itemData: LkNodeData,\n schema: {[key: string]: ICaptionConfig},\n graphSchema?: GraphSchemaTypeWithAccess[]\n ): string {\n const categories = itemData.categories;\n const caption: Array<string | null> = [];\n let captionProps: Array<string | null> = [];\n categories.forEach((category) => {\n if (schema[category] && schema[category].active) {\n if (schema[category].displayName) {\n caption.push(category);\n }\n captionProps = [...captionProps, ...schema[category].properties];\n }\n });\n Tools.uniqBy(captionProps).forEach((propertyKey) => {\n if (itemData.properties[propertyKey] !== undefined) {\n const propertyType = graphSchema\n ? Captions.getPropertyType(graphSchema, propertyKey, categories[0])\n : undefined;\n caption.push(this.getLabel(itemData.properties[propertyKey], propertyType));\n }\n });\n return caption\n .filter((c) => c !== null)\n .join(' - ')\n .trim();\n }\n\n public static getPropertyType(\n graphSchema: GraphSchemaTypeWithAccess[],\n propertyKey: string,\n itemType: string\n ): PropertyType | undefined {\n const typeGraphSchema = graphSchema.find((schemaType) => schemaType.itemType === itemType);\n const property = typeGraphSchema?.properties.find(\n (property) => property.propertyKey === propertyKey\n );\n return ((property as unknown) as GraphSchemaPropertyWithAccess)?.propertyType;\n }\n\n /**\n * Generate text from edge data and captions schema\n */\n public static generateEdgeCaption(\n itemData: LkEdgeData,\n schema: {[key: string]: ICaptionConfig},\n graphSchema?: GraphSchemaTypeWithAccess[]\n ): string {\n const type = itemData.type;\n const caption: Array<string | null> = [];\n let captionProps: Array<string | null> = [];\n if (schema[type] && schema[type].active) {\n if (schema[type].displayName) {\n caption.push(type);\n }\n captionProps = [...captionProps, ...schema[type].properties];\n Tools.uniqBy(captionProps).forEach((propertyKey) => {\n if (Tools.isDefined(itemData.properties[propertyKey])) {\n const propertyType = graphSchema\n ? Captions.getPropertyType(graphSchema, propertyKey, type)\n : undefined;\n caption.push(Captions.getLabel(itemData.properties[propertyKey], propertyType));\n }\n });\n return caption.join(' - ').trim();\n }\n return '';\n }\n}\n"]}
|
package/dist/filters/filters.js
CHANGED
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
function Filters() {
|
|
7
|
-
}
|
|
3
|
+
const rest_client_1 = require("@linkurious/rest-client");
|
|
4
|
+
const tools_1 = require("../tools/tools");
|
|
5
|
+
class Filters {
|
|
8
6
|
/**
|
|
9
7
|
* Returns whether the node/edge should be *filtered* (a.k.a. *hidden*).
|
|
10
8
|
*
|
|
@@ -16,7 +14,7 @@ var Filters = /** @class */ (function () {
|
|
|
16
14
|
* @param filterRules
|
|
17
15
|
* @param itemData
|
|
18
16
|
*/
|
|
19
|
-
|
|
17
|
+
static isFiltered(filterRules, itemData) {
|
|
20
18
|
if (!tools_1.Tools.isDefined(itemData)) {
|
|
21
19
|
return false;
|
|
22
20
|
}
|
|
@@ -26,12 +24,12 @@ var Filters = /** @class */ (function () {
|
|
|
26
24
|
else {
|
|
27
25
|
return Filters.getFilterFunction(filterRules, false)(itemData);
|
|
28
26
|
}
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
|
|
27
|
+
}
|
|
28
|
+
static getFilterFunction(filterRules, isNode) {
|
|
29
|
+
const filterKey = JSON.stringify(filterRules, null, '');
|
|
32
30
|
// This cast is needed to tell the TypeScript compiler to trust us that "isNode" and "T" are dependent.
|
|
33
|
-
|
|
34
|
-
|
|
31
|
+
const filterCache = (isNode ? Filters.nodeCache : Filters.edgeCache);
|
|
32
|
+
let filterFunc = filterCache.get(filterKey);
|
|
35
33
|
if (!filterFunc) {
|
|
36
34
|
filterFunc = Filters.createFilterFunction(filterRules, isNode);
|
|
37
35
|
if (filterCache.size > Filters.FILTER_CACHE_SIZE) {
|
|
@@ -40,26 +38,23 @@ var Filters = /** @class */ (function () {
|
|
|
40
38
|
filterCache.set(filterKey, filterFunc);
|
|
41
39
|
}
|
|
42
40
|
return filterFunc;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
return Filters.filterToFilterFunction(filter, isNode);
|
|
47
|
-
});
|
|
41
|
+
}
|
|
42
|
+
static createFilterFunction(filterRules, isNode) {
|
|
43
|
+
const filterFunctions = filterRules.map((filter) => Filters.filterToFilterFunction(filter, isNode));
|
|
48
44
|
/**
|
|
49
45
|
* For each filterFunction, as soon as we find a filterFunction that says that a given
|
|
50
46
|
* node/edge should be filtered/hidden, we return `true` for the node/edge.
|
|
51
47
|
*/
|
|
52
|
-
return
|
|
53
|
-
for (
|
|
54
|
-
var filterFunction = filterFunctions_1[_i];
|
|
48
|
+
return (itemData) => {
|
|
49
|
+
for (const filterFunction of filterFunctions) {
|
|
55
50
|
if (filterFunction(itemData)) {
|
|
56
51
|
return true;
|
|
57
52
|
}
|
|
58
53
|
}
|
|
59
54
|
return false;
|
|
60
55
|
};
|
|
61
|
-
}
|
|
62
|
-
|
|
56
|
+
}
|
|
57
|
+
static filterToFilterFunction(filter, isNode) {
|
|
63
58
|
switch (filter.type) {
|
|
64
59
|
case rest_client_1.SelectorType.ANY:
|
|
65
60
|
return Filters.createAnyFilterFunction(filter, isNode);
|
|
@@ -72,10 +67,10 @@ var Filters = /** @class */ (function () {
|
|
|
72
67
|
case rest_client_1.SelectorType.NAN:
|
|
73
68
|
return Filters.createNaNFilterFunction(filter, isNode);
|
|
74
69
|
}
|
|
75
|
-
}
|
|
76
|
-
|
|
70
|
+
}
|
|
71
|
+
static createAnyFilterFunction(filter, isNode) {
|
|
77
72
|
if (isNode) {
|
|
78
|
-
return
|
|
73
|
+
return (itemData) => {
|
|
79
74
|
if (filter.itemType === undefined) {
|
|
80
75
|
return true;
|
|
81
76
|
}
|
|
@@ -84,72 +79,56 @@ var Filters = /** @class */ (function () {
|
|
|
84
79
|
}
|
|
85
80
|
else {
|
|
86
81
|
// isEdge
|
|
87
|
-
return
|
|
82
|
+
return (itemData) => itemData.type === filter.itemType;
|
|
88
83
|
}
|
|
89
|
-
}
|
|
90
|
-
|
|
84
|
+
}
|
|
85
|
+
static createIsFilterFunction(filter, isNode) {
|
|
91
86
|
if (isNode) {
|
|
92
|
-
return
|
|
93
|
-
|
|
94
|
-
tools_1.Tools.getPropertyValue(tools_1.Tools.getIn(itemData, filter.input), true) === filter.value;
|
|
95
|
-
};
|
|
87
|
+
return (itemData) => itemData.categories.includes(filter.itemType) &&
|
|
88
|
+
tools_1.Tools.getPropertyValue(tools_1.Tools.getIn(itemData, filter.input), true) === filter.value;
|
|
96
89
|
}
|
|
97
90
|
else {
|
|
98
91
|
// isEdge
|
|
99
|
-
return
|
|
100
|
-
|
|
101
|
-
tools_1.Tools.getPropertyValue(tools_1.Tools.getIn(itemData, filter.input), true) === filter.value;
|
|
102
|
-
};
|
|
92
|
+
return (itemData) => itemData.type === filter.itemType &&
|
|
93
|
+
tools_1.Tools.getPropertyValue(tools_1.Tools.getIn(itemData, filter.input), true) === filter.value;
|
|
103
94
|
}
|
|
104
|
-
}
|
|
105
|
-
|
|
95
|
+
}
|
|
96
|
+
static createNoValueFilterFunction(filter, isNode) {
|
|
106
97
|
if (isNode) {
|
|
107
|
-
return
|
|
108
|
-
|
|
109
|
-
!tools_1.Tools.isDefined(tools_1.Tools.getPropertyValue(tools_1.Tools.getIn(itemData, filter.input), true));
|
|
110
|
-
};
|
|
98
|
+
return (itemData) => itemData.categories.includes(filter.itemType) &&
|
|
99
|
+
!tools_1.Tools.isDefined(tools_1.Tools.getPropertyValue(tools_1.Tools.getIn(itemData, filter.input), true));
|
|
111
100
|
}
|
|
112
101
|
else {
|
|
113
102
|
// isEdge
|
|
114
|
-
return
|
|
115
|
-
|
|
116
|
-
!tools_1.Tools.isDefined(tools_1.Tools.getPropertyValue(tools_1.Tools.getIn(itemData, filter.input), true));
|
|
117
|
-
};
|
|
103
|
+
return (itemData) => itemData.type === filter.itemType &&
|
|
104
|
+
!tools_1.Tools.isDefined(tools_1.Tools.getPropertyValue(tools_1.Tools.getIn(itemData, filter.input), true));
|
|
118
105
|
}
|
|
119
|
-
}
|
|
120
|
-
|
|
106
|
+
}
|
|
107
|
+
static createNaNFilterFunction(filter, isNode) {
|
|
121
108
|
if (isNode) {
|
|
122
|
-
return
|
|
123
|
-
|
|
124
|
-
Filters.isNotANumber(tools_1.Tools.getPropertyValue(tools_1.Tools.getIn(itemData, filter.input), true));
|
|
125
|
-
};
|
|
109
|
+
return (itemData) => itemData.categories.includes(filter.itemType) &&
|
|
110
|
+
Filters.isNotANumber(tools_1.Tools.getPropertyValue(tools_1.Tools.getIn(itemData, filter.input), true));
|
|
126
111
|
}
|
|
127
112
|
else {
|
|
128
113
|
// isEdge
|
|
129
|
-
return
|
|
130
|
-
|
|
131
|
-
Filters.isNotANumber(tools_1.Tools.getPropertyValue(tools_1.Tools.getIn(itemData, filter.input), true));
|
|
132
|
-
};
|
|
114
|
+
return (itemData) => itemData.type === filter.itemType &&
|
|
115
|
+
Filters.isNotANumber(tools_1.Tools.getPropertyValue(tools_1.Tools.getIn(itemData, filter.input), true));
|
|
133
116
|
}
|
|
134
|
-
}
|
|
135
|
-
|
|
117
|
+
}
|
|
118
|
+
static isNotANumber(value) {
|
|
136
119
|
return tools_1.Tools.isDefined(value) && !tools_1.Tools.isNumber(value);
|
|
137
|
-
}
|
|
138
|
-
|
|
120
|
+
}
|
|
121
|
+
static createRangeFilterFunction(filter, isNode) {
|
|
139
122
|
if (isNode) {
|
|
140
|
-
return
|
|
141
|
-
|
|
142
|
-
Filters.valueShouldBeHidden(tools_1.Tools.getPropertyValue(tools_1.Tools.getIn(itemData, filter.input), false), filter.value);
|
|
143
|
-
};
|
|
123
|
+
return (itemData) => itemData.categories.includes(filter.itemType) &&
|
|
124
|
+
Filters.valueShouldBeHidden(tools_1.Tools.getPropertyValue(tools_1.Tools.getIn(itemData, filter.input), false), filter.value);
|
|
144
125
|
}
|
|
145
126
|
else {
|
|
146
127
|
// isEdge
|
|
147
|
-
return
|
|
148
|
-
|
|
149
|
-
Filters.valueShouldBeHidden(tools_1.Tools.getPropertyValue(tools_1.Tools.getIn(itemData, filter.input), false), filter.value);
|
|
150
|
-
};
|
|
128
|
+
return (itemData) => itemData.type === filter.itemType &&
|
|
129
|
+
Filters.valueShouldBeHidden(tools_1.Tools.getPropertyValue(tools_1.Tools.getIn(itemData, filter.input), false), filter.value);
|
|
151
130
|
}
|
|
152
|
-
}
|
|
131
|
+
}
|
|
153
132
|
/**
|
|
154
133
|
* Returns true if `value` should be filtered/hidden.
|
|
155
134
|
*
|
|
@@ -160,8 +139,8 @@ var Filters = /** @class */ (function () {
|
|
|
160
139
|
*
|
|
161
140
|
* Returns false (i.e. will not filter/hide) if `value` is not a number.
|
|
162
141
|
*/
|
|
163
|
-
|
|
164
|
-
|
|
142
|
+
static valueShouldBeHidden(value, range) {
|
|
143
|
+
const n = tools_1.Tools.parseFloat(value);
|
|
165
144
|
if (Number.isNaN(n)) {
|
|
166
145
|
return false;
|
|
167
146
|
}
|
|
@@ -178,11 +157,10 @@ var Filters = /** @class */ (function () {
|
|
|
178
157
|
(range['<='] !== undefined && n <= range['<=']) ||
|
|
179
158
|
(range['>'] !== undefined && n > range['>']) ||
|
|
180
159
|
(range['>='] !== undefined && n >= range['>=']));
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
Filters.edgeCache = new Map();
|
|
184
|
-
Filters.FILTER_CACHE_SIZE = 5;
|
|
185
|
-
return Filters;
|
|
186
|
-
}());
|
|
160
|
+
}
|
|
161
|
+
}
|
|
187
162
|
exports.Filters = Filters;
|
|
163
|
+
Filters.nodeCache = new Map();
|
|
164
|
+
Filters.edgeCache = new Map();
|
|
165
|
+
Filters.FILTER_CACHE_SIZE = 5;
|
|
188
166
|
//# sourceMappingURL=filters.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filters.js","sourceRoot":"","sources":["../../src/filters/filters.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n ItemSelector,\n LkEdgeData,\n LkNodeData,\n IRangeValues,\n SelectorType,\n ISelectorAny,\n ISelectorIs,\n ISelectorNoValue,\n ISelectorNaN,\n ISelectorRange,\n LkItemData\n} from '@linkurious/rest-client';\n\nimport {Tools} from '../tools/tools';\n\ntype FilterFunction<T extends LkItemData> = (itemData: T) => boolean;\n\nexport class Filters {\n private static nodeCache: Map<string, FilterFunction<LkNodeData>> = new Map();\n private static edgeCache: Map<string, FilterFunction<LkEdgeData>> = new Map();\n private static FILTER_CACHE_SIZE = 5;\n\n /**\n * Returns whether the node/edge should be *filtered* (a.k.a. *hidden*).\n *\n * Notes:\n * 1. `filterRules` are rules that match what should be filtered/hidden.\n * 2. `filterRules` are combined inclusively: as soon as one rule returns `true` for\n * an item, the item can be hidden/filtered.\n *\n * @param filterRules\n * @param itemData\n */\n public static isFiltered(\n filterRules: Array<ItemSelector>,\n itemData: LkNodeData | LkEdgeData\n ): boolean {\n if (!Tools.isDefined(itemData)) {\n return false;\n }\n\n if ('categories' in itemData) {\n return Filters.getFilterFunction(filterRules, true)(itemData);\n } else {\n return Filters.getFilterFunction(filterRules, false)(itemData);\n }\n }\n\n private static getFilterFunction<T extends LkNodeData | LkEdgeData>(\n filterRules: Array<ItemSelector>,\n isNode: boolean\n ): FilterFunction<T> {\n const filterKey = JSON.stringify(filterRules, null, '');\n\n // This cast is needed to tell the TypeScript compiler to trust us that \"isNode\" and \"T\" are dependent.\n const filterCache = (isNode ? Filters.nodeCache : Filters.edgeCache) as Map<\n string,\n FilterFunction<T>\n >;\n\n let filterFunc = filterCache.get(filterKey);\n if (!filterFunc) {\n filterFunc = Filters.createFilterFunction(filterRules, isNode);\n if (filterCache.size > Filters.FILTER_CACHE_SIZE) {\n filterCache.clear();\n }\n filterCache.set(filterKey, filterFunc);\n }\n return filterFunc;\n }\n\n private static createFilterFunction<T extends LkNodeData | LkEdgeData>(\n filterRules: Array<ItemSelector>,\n isNode: boolean\n ): FilterFunction<T> {\n const filterFunctions = filterRules.map((filter: ItemSelector) =>\n Filters.filterToFilterFunction(filter, isNode)\n );\n\n /**\n * For each filterFunction, as soon as we find a filterFunction that says that a given\n * node/edge should be filtered/hidden, we return `true` for the node/edge.\n */\n return (itemData: T): boolean => {\n for (const filterFunction of filterFunctions) {\n if (filterFunction(itemData)) {\n return true;\n }\n }\n return false;\n };\n }\n\n private static filterToFilterFunction<T extends LkNodeData | LkEdgeData>(\n filter: ItemSelector,\n isNode: boolean\n ): FilterFunction<T> {\n switch (filter.type) {\n case SelectorType.ANY:\n return Filters.createAnyFilterFunction(filter, isNode);\n case SelectorType.IS:\n return Filters.createIsFilterFunction(filter, isNode);\n case SelectorType.NO_VALUE:\n return Filters.createNoValueFilterFunction(filter, isNode);\n case SelectorType.RANGE:\n return Filters.createRangeFilterFunction(filter, isNode);\n case SelectorType.NAN:\n return Filters.createNaNFilterFunction(filter, isNode);\n }\n }\n\n private static createAnyFilterFunction<T extends LkNodeData | LkEdgeData>(\n filter: ISelectorAny,\n isNode: boolean\n ): FilterFunction<T> {\n if (isNode) {\n return (itemData: T) => {\n if (filter.itemType === undefined) {\n return true;\n }\n return (itemData as LkNodeData).categories.includes(filter.itemType);\n };\n } else {\n // isEdge\n return (itemData: T) => (itemData as LkEdgeData).type === filter.itemType;\n }\n }\n\n private static createIsFilterFunction<T extends LkNodeData | LkEdgeData>(\n filter: ISelectorIs,\n isNode: boolean\n ): FilterFunction<T> {\n if (isNode) {\n return (itemData: T) =>\n (itemData as LkNodeData).categories.includes(filter.itemType) &&\n Tools.getPropertyValue(Tools.getIn(itemData, filter.input), true) === filter.value;\n } else {\n // isEdge\n return (itemData: T) =>\n (itemData as LkEdgeData).type === filter.itemType &&\n Tools.getPropertyValue(Tools.getIn(itemData, filter.input), true) === filter.value;\n }\n }\n\n private static createNoValueFilterFunction<T extends LkNodeData | LkEdgeData>(\n filter: ISelectorNoValue,\n isNode: boolean\n ): FilterFunction<T> {\n if (isNode) {\n return (itemData: T) =>\n (itemData as LkNodeData).categories.includes(filter.itemType) &&\n !Tools.isDefined(Tools.getPropertyValue(Tools.getIn(itemData, filter.input), true));\n } else {\n // isEdge\n return (itemData: T) =>\n (itemData as LkEdgeData).type === filter.itemType &&\n !Tools.isDefined(Tools.getPropertyValue(Tools.getIn(itemData, filter.input), true));\n }\n }\n\n private static createNaNFilterFunction<T extends LkNodeData | LkEdgeData>(\n filter: ISelectorNaN,\n isNode: boolean\n ): FilterFunction<T> {\n if (isNode) {\n return (itemData: T) =>\n (itemData as LkNodeData).categories.includes(filter.itemType) &&\n Filters.isNotANumber(Tools.getPropertyValue(Tools.getIn(itemData, filter.input), true));\n } else {\n // isEdge\n return (itemData: T) =>\n (itemData as LkEdgeData).type === filter.itemType &&\n Filters.isNotANumber(Tools.getPropertyValue(Tools.getIn(itemData, filter.input), true));\n }\n }\n\n private static isNotANumber(value: any) {\n return Tools.isDefined(value) && !Tools.isNumber(value);\n }\n\n public static createRangeFilterFunction<T extends LkNodeData | LkEdgeData>(\n filter: ISelectorRange,\n isNode: boolean\n ): FilterFunction<T> {\n if (isNode) {\n return (itemData: T) =>\n (itemData as LkNodeData).categories.includes(filter.itemType) &&\n Filters.valueShouldBeHidden(\n Tools.getPropertyValue(Tools.getIn(itemData, filter.input), false),\n filter.value\n );\n } else {\n // isEdge\n return (itemData: T) =>\n (itemData as LkEdgeData).type === filter.itemType &&\n Filters.valueShouldBeHidden(\n Tools.getPropertyValue(Tools.getIn(itemData, filter.input), false),\n filter.value\n );\n }\n }\n\n /**\n * Returns true if `value` should be filtered/hidden.\n *\n * `range` describes what should be filtered/hidden:\n * - e.g. {\"<\":10, \">=\":20} => hide any value in ]-inf, 10[ *OR* in [20, +inf[\n * - e.g. {\"<=\":10} => hide any value in ]-inf, 10]\n * - e.g. {\">=\":20} => hide any value in [20, +inf[\n *\n * Returns false (i.e. will not filter/hide) if `value` is not a number.\n */\n public static valueShouldBeHidden(value: unknown, range: IRangeValues): boolean {\n const n = Tools.parseFloat(value);\n if (Number.isNaN(n)) {\n return false;\n }\n\n /**\n * As soon as we find a condition that says that `value` should be filtered/hidden,\n * we return `true`.\n *\n * If `range` contains multiple conditions, all are checked and if any condition causes\n * `value` to be in the filtered/hidden range, we return `true`.\n *\n * If no condition causes `value` to be filtered/hidden, we return `false`.\n */\n return (\n (range['<'] !== undefined && n < range['<']) ||\n (range['<='] !== undefined && n <= range['<=']) ||\n (range['>'] !== undefined && n > range['>']) ||\n (range['>='] !== undefined && n >= range['>='])\n );\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"filters.js","sourceRoot":"","sources":["../../src/filters/filters.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n ItemSelector,\n LkEdgeData,\n LkNodeData,\n IRangeValues,\n SelectorType,\n ISelectorAny,\n ISelectorIs,\n ISelectorNoValue,\n ISelectorNaN,\n ISelectorRange,\n LkItemData\n} from '@linkurious/rest-client';\n\nimport {Tools} from '../tools/tools';\n\ntype FilterFunction<T extends LkItemData> = (itemData: T) => boolean;\n\nexport class Filters {\n private static nodeCache: Map<string, FilterFunction<LkNodeData>> = new Map();\n private static edgeCache: Map<string, FilterFunction<LkEdgeData>> = new Map();\n private static FILTER_CACHE_SIZE = 5;\n\n /**\n * Returns whether the node/edge should be *filtered* (a.k.a. *hidden*).\n *\n * Notes:\n * 1. `filterRules` are rules that match what should be filtered/hidden.\n * 2. `filterRules` are combined inclusively: as soon as one rule returns `true` for\n * an item, the item can be hidden/filtered.\n *\n * @param filterRules\n * @param itemData\n */\n public static isFiltered(\n filterRules: Array<ItemSelector>,\n itemData: LkNodeData | LkEdgeData\n ): boolean {\n if (!Tools.isDefined(itemData)) {\n return false;\n }\n\n if ('categories' in itemData) {\n return Filters.getFilterFunction(filterRules, true)(itemData);\n } else {\n return Filters.getFilterFunction(filterRules, false)(itemData);\n }\n }\n\n private static getFilterFunction<T extends LkNodeData | LkEdgeData>(\n filterRules: Array<ItemSelector>,\n isNode: boolean\n ): FilterFunction<T> {\n const filterKey = JSON.stringify(filterRules, null, '');\n\n // This cast is needed to tell the TypeScript compiler to trust us that \"isNode\" and \"T\" are dependent.\n const filterCache = (isNode ? Filters.nodeCache : Filters.edgeCache) as Map<\n string,\n FilterFunction<T>\n >;\n\n let filterFunc = filterCache.get(filterKey);\n if (!filterFunc) {\n filterFunc = Filters.createFilterFunction(filterRules, isNode);\n if (filterCache.size > Filters.FILTER_CACHE_SIZE) {\n filterCache.clear();\n }\n filterCache.set(filterKey, filterFunc);\n }\n return filterFunc;\n }\n\n private static createFilterFunction<T extends LkNodeData | LkEdgeData>(\n filterRules: Array<ItemSelector>,\n isNode: boolean\n ): FilterFunction<T> {\n const filterFunctions = filterRules.map((filter: ItemSelector) =>\n Filters.filterToFilterFunction(filter, isNode)\n );\n\n /**\n * For each filterFunction, as soon as we find a filterFunction that says that a given\n * node/edge should be filtered/hidden, we return `true` for the node/edge.\n */\n return (itemData: T): boolean => {\n for (const filterFunction of filterFunctions) {\n if (filterFunction(itemData)) {\n return true;\n }\n }\n return false;\n };\n }\n\n private static filterToFilterFunction<T extends LkNodeData | LkEdgeData>(\n filter: ItemSelector,\n isNode: boolean\n ): FilterFunction<T> {\n switch (filter.type) {\n case SelectorType.ANY:\n return Filters.createAnyFilterFunction(filter, isNode);\n case SelectorType.IS:\n return Filters.createIsFilterFunction(filter, isNode);\n case SelectorType.NO_VALUE:\n return Filters.createNoValueFilterFunction(filter, isNode);\n case SelectorType.RANGE:\n return Filters.createRangeFilterFunction(filter, isNode);\n case SelectorType.NAN:\n return Filters.createNaNFilterFunction(filter, isNode);\n }\n }\n\n private static createAnyFilterFunction<T extends LkNodeData | LkEdgeData>(\n filter: ISelectorAny,\n isNode: boolean\n ): FilterFunction<T> {\n if (isNode) {\n return (itemData: T) => {\n if (filter.itemType === undefined) {\n return true;\n }\n return (itemData as LkNodeData).categories.includes(filter.itemType);\n };\n } else {\n // isEdge\n return (itemData: T) => (itemData as LkEdgeData).type === filter.itemType;\n }\n }\n\n private static createIsFilterFunction<T extends LkNodeData | LkEdgeData>(\n filter: ISelectorIs,\n isNode: boolean\n ): FilterFunction<T> {\n if (isNode) {\n return (itemData: T) =>\n (itemData as LkNodeData).categories.includes(filter.itemType) &&\n Tools.getPropertyValue(Tools.getIn(itemData, filter.input), true) === filter.value;\n } else {\n // isEdge\n return (itemData: T) =>\n (itemData as LkEdgeData).type === filter.itemType &&\n Tools.getPropertyValue(Tools.getIn(itemData, filter.input), true) === filter.value;\n }\n }\n\n private static createNoValueFilterFunction<T extends LkNodeData | LkEdgeData>(\n filter: ISelectorNoValue,\n isNode: boolean\n ): FilterFunction<T> {\n if (isNode) {\n return (itemData: T) =>\n (itemData as LkNodeData).categories.includes(filter.itemType) &&\n !Tools.isDefined(Tools.getPropertyValue(Tools.getIn(itemData, filter.input), true));\n } else {\n // isEdge\n return (itemData: T) =>\n (itemData as LkEdgeData).type === filter.itemType &&\n !Tools.isDefined(Tools.getPropertyValue(Tools.getIn(itemData, filter.input), true));\n }\n }\n\n private static createNaNFilterFunction<T extends LkNodeData | LkEdgeData>(\n filter: ISelectorNaN,\n isNode: boolean\n ): FilterFunction<T> {\n if (isNode) {\n return (itemData: T) =>\n (itemData as LkNodeData).categories.includes(filter.itemType) &&\n Filters.isNotANumber(Tools.getPropertyValue(Tools.getIn(itemData, filter.input), true));\n } else {\n // isEdge\n return (itemData: T) =>\n (itemData as LkEdgeData).type === filter.itemType &&\n Filters.isNotANumber(Tools.getPropertyValue(Tools.getIn(itemData, filter.input), true));\n }\n }\n\n private static isNotANumber(value: any) {\n return Tools.isDefined(value) && !Tools.isNumber(value);\n }\n\n public static createRangeFilterFunction<T extends LkNodeData | LkEdgeData>(\n filter: ISelectorRange,\n isNode: boolean\n ): FilterFunction<T> {\n if (isNode) {\n return (itemData: T) =>\n (itemData as LkNodeData).categories.includes(filter.itemType) &&\n Filters.valueShouldBeHidden(\n Tools.getPropertyValue(Tools.getIn(itemData, filter.input), false),\n filter.value\n );\n } else {\n // isEdge\n return (itemData: T) =>\n (itemData as LkEdgeData).type === filter.itemType &&\n Filters.valueShouldBeHidden(\n Tools.getPropertyValue(Tools.getIn(itemData, filter.input), false),\n filter.value\n );\n }\n }\n\n /**\n * Returns true if `value` should be filtered/hidden.\n *\n * `range` describes what should be filtered/hidden:\n * - e.g. {\"<\":10, \">=\":20} => hide any value in ]-inf, 10[ *OR* in [20, +inf[\n * - e.g. {\"<=\":10} => hide any value in ]-inf, 10]\n * - e.g. {\">=\":20} => hide any value in [20, +inf[\n *\n * Returns false (i.e. will not filter/hide) if `value` is not a number.\n */\n public static valueShouldBeHidden(value: unknown, range: IRangeValues): boolean {\n const n = Tools.parseFloat(value);\n if (Number.isNaN(n)) {\n return false;\n }\n\n /**\n * As soon as we find a condition that says that `value` should be filtered/hidden,\n * we return `true`.\n *\n * If `range` contains multiple conditions, all are checked and if any condition causes\n * `value` to be in the filtered/hidden range, we return `true`.\n *\n * If no condition causes `value` to be filtered/hidden, we return `false`.\n */\n return (\n (range['<'] !== undefined && n < range['<']) ||\n (range['<='] !== undefined && n <= range['<=']) ||\n (range['>'] !== undefined && n > range['>']) ||\n (range['>='] !== undefined && n >= range['>='])\n );\n }\n}\n"]}
|
|
@@ -1,51 +1,36 @@
|
|
|
1
1
|
'use strict';
|
|
2
|
-
var __extends = (this && this.__extends) || (function () {
|
|
3
|
-
var extendStatics = function (d, b) {
|
|
4
|
-
extendStatics = Object.setPrototypeOf ||
|
|
5
|
-
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
|
6
|
-
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
|
|
7
|
-
return extendStatics(d, b);
|
|
8
|
-
};
|
|
9
|
-
return function (d, b) {
|
|
10
|
-
extendStatics(d, b);
|
|
11
|
-
function __() { this.constructor = d; }
|
|
12
|
-
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|
13
|
-
};
|
|
14
|
-
})();
|
|
15
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
return _super.call(this, d) || this;
|
|
3
|
+
const rxjs_1 = require("rxjs");
|
|
4
|
+
const operators_1 = require("rxjs/operators");
|
|
5
|
+
const tools_1 = require("../../tools/tools");
|
|
6
|
+
const reactive_1 = require("./reactive");
|
|
7
|
+
class OgmaStore extends rxjs_1.BehaviorSubject {
|
|
8
|
+
constructor(d) {
|
|
9
|
+
super(d);
|
|
24
10
|
}
|
|
25
11
|
/**
|
|
26
12
|
* Modify Ogma state based on a method
|
|
27
13
|
*/
|
|
28
|
-
|
|
14
|
+
dispatch(mapFn) {
|
|
29
15
|
this.next(mapFn(this.value));
|
|
30
|
-
}
|
|
16
|
+
}
|
|
31
17
|
/**
|
|
32
18
|
* Return a piece of state
|
|
33
19
|
*/
|
|
34
|
-
|
|
35
|
-
return this.pipe(operators_1.map(mapFn), operators_1.distinctUntilChanged(
|
|
36
|
-
}
|
|
20
|
+
selectStore(mapFn) {
|
|
21
|
+
return this.pipe(operators_1.map(mapFn), operators_1.distinctUntilChanged((p, n) => tools_1.Tools.isEqual(p, n)));
|
|
22
|
+
}
|
|
37
23
|
/**
|
|
38
24
|
* Clear the state of Ogma
|
|
39
25
|
*/
|
|
40
|
-
|
|
26
|
+
clear() {
|
|
41
27
|
this.next({
|
|
42
28
|
selection: new reactive_1.DummyNodeList(),
|
|
43
29
|
items: { node: [], edge: [] },
|
|
44
30
|
changes: undefined,
|
|
45
31
|
animation: false
|
|
46
32
|
});
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
}(rxjs_1.BehaviorSubject));
|
|
33
|
+
}
|
|
34
|
+
}
|
|
50
35
|
exports.OgmaStore = OgmaStore;
|
|
51
36
|
//# sourceMappingURL=OgmaStore.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OgmaStore.js","sourceRoot":"","sources":["../../../src/ogma/features/OgmaStore.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC
|
|
1
|
+
{"version":3,"file":"OgmaStore.js","sourceRoot":"","sources":["../../../src/ogma/features/OgmaStore.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,+BAAiD;AACjD,8CAAyD;AAEzD,6CAAwC;AAExC,yCAAoD;AAEpD,MAAa,SAAU,SAAQ,sBAA0B;IACvD,YAAY,CAAY;QACtB,KAAK,CAAC,CAAC,CAAC,CAAC;IACX,CAAC;IAED;;OAEG;IACI,QAAQ,CAAC,KAAsC;QACpD,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAC/B,CAAC;IAED;;OAEG;IACI,WAAW,CAAI,KAA8B;QAClD,OAAO,IAAI,CAAC,IAAI,CACd,eAAG,CAAC,KAAK,CAAC,EACV,gCAAoB,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,aAAK,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CACpD,CAAC;IACJ,CAAC;IAED;;OAEG;IACI,KAAK;QACV,IAAI,CAAC,IAAI,CAAC;YACR,SAAS,EAAE,IAAI,wBAAa,EAAS;YACrC,KAAK,EAAE,EAAC,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAC;YAC3B,OAAO,EAAE,SAAS;YAClB,SAAS,EAAE,KAAK;SACjB,CAAC,CAAC;IACL,CAAC;CACF;AAjCD,8BAiCC","sourcesContent":["'use strict';\n\nimport {BehaviorSubject, Observable} from 'rxjs';\nimport {distinctUntilChanged, map} from 'rxjs/operators';\n\nimport {Tools} from '../../tools/tools';\n\nimport {DummyNodeList, OgmaState} from './reactive';\n\nexport class OgmaStore extends BehaviorSubject<OgmaState> {\n constructor(d: OgmaState) {\n super(d);\n }\n\n /**\n * Modify Ogma state based on a method\n */\n public dispatch(mapFn: (state: OgmaState) => OgmaState): void {\n this.next(mapFn(this.value));\n }\n\n /**\n * Return a piece of state\n */\n public selectStore<K>(mapFn: (state: OgmaState) => K): Observable<K> {\n return this.pipe(\n map(mapFn),\n distinctUntilChanged((p, n) => Tools.isEqual(p, n))\n );\n }\n\n /**\n * Clear the state of Ogma\n */\n public clear(): void {\n this.next({\n selection: new DummyNodeList() as any,\n items: {node: [], edge: []},\n changes: undefined,\n animation: false\n });\n }\n}\n"]}
|