@reltio/components 1.4.1970 → 1.4.1971
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/cjs/ReadableSearchQuery/ReadableSearchQuery.d.ts +1 -0
- package/cjs/ReadableSearchQuery/ReadableSearchQuery.js +2 -2
- package/cjs/ReadableSearchQueryBuilder/ReadableSearchQueryBuilder.d.ts +15 -0
- package/cjs/ReadableSearchQueryBuilder/ReadableSearchQueryBuilder.js +128 -0
- package/cjs/ReadableSearchQueryBuilder/ReadableSearchQueryBuilder.test.d.ts +1 -0
- package/cjs/ReadableSearchQueryBuilder/ReadableSearchQueryBuilder.test.js +137 -0
- package/cjs/ReadableSearchQueryBuilder/index.d.ts +1 -0
- package/cjs/ReadableSearchQueryBuilder/index.js +5 -0
- package/cjs/ReadableSearchQueryBuilder/styles.d.ts +1 -0
- package/cjs/ReadableSearchQueryBuilder/styles.js +23 -0
- package/cjs/index.d.ts +1 -0
- package/cjs/index.js +7 -5
- package/esm/ReadableSearchQuery/ReadableSearchQuery.d.ts +1 -0
- package/esm/ReadableSearchQuery/ReadableSearchQuery.js +2 -2
- package/esm/ReadableSearchQueryBuilder/ReadableSearchQueryBuilder.d.ts +15 -0
- package/esm/ReadableSearchQueryBuilder/ReadableSearchQueryBuilder.js +98 -0
- package/esm/ReadableSearchQueryBuilder/ReadableSearchQueryBuilder.test.d.ts +1 -0
- package/esm/ReadableSearchQueryBuilder/ReadableSearchQueryBuilder.test.js +132 -0
- package/esm/ReadableSearchQueryBuilder/index.d.ts +1 -0
- package/esm/ReadableSearchQueryBuilder/index.js +1 -0
- package/esm/ReadableSearchQueryBuilder/styles.d.ts +1 -0
- package/esm/ReadableSearchQueryBuilder/styles.js +20 -0
- package/esm/index.d.ts +1 -0
- package/esm/index.js +1 -0
- package/package.json +2 -2
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { ReadableQueryPrimitive } from '@reltio/mdm-sdk';
|
|
3
3
|
export declare const ReadableSearchQuery: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLSpanElement> & {
|
|
4
|
+
classes?: Record<string, string>;
|
|
4
5
|
readableQuery?: ReadableQueryPrimitive[];
|
|
5
6
|
} & React.RefAttributes<HTMLElement>>;
|
|
@@ -53,11 +53,11 @@ var react_1 = __importStar(require("react"));
|
|
|
53
53
|
var classnames_1 = __importDefault(require("classnames"));
|
|
54
54
|
var styles_1 = require("./styles");
|
|
55
55
|
exports.ReadableSearchQuery = (0, react_1.forwardRef)(function (_a, ref) {
|
|
56
|
-
var _b = _a.readableQuery, readableQuery = _b === void 0 ? [] : _b, className = _a.className, otherProps = __rest(_a, ["readableQuery", "className"]);
|
|
56
|
+
var _b = _a.readableQuery, readableQuery = _b === void 0 ? [] : _b, className = _a.className, _c = _a.classes, classes = _c === void 0 ? {} : _c, otherProps = __rest(_a, ["readableQuery", "className", "classes"]);
|
|
57
57
|
var styles = (0, styles_1.useStyles)();
|
|
58
58
|
return (react_1.default.createElement("span", __assign({ ref: ref, className: (0, classnames_1.default)(styles.query, className), "data-reltio-id": "search-readable-query" }, otherProps), readableQuery.map(function (_a, i) {
|
|
59
59
|
var type = _a.type, text = _a.text;
|
|
60
|
-
return (react_1.default.createElement("span", { key: i, className: styles[type] }, text));
|
|
60
|
+
return (react_1.default.createElement("span", { key: i, className: (0, classnames_1.default)(styles[type], classes[type]) }, text));
|
|
61
61
|
})));
|
|
62
62
|
});
|
|
63
63
|
exports.ReadableSearchQuery.displayName = 'ReadableSearchQuery';
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { ReadableQueryPrimitive } from '@reltio/mdm-sdk';
|
|
3
|
+
type Classes = {
|
|
4
|
+
root?: string;
|
|
5
|
+
queryWrapper?: string;
|
|
6
|
+
title?: string;
|
|
7
|
+
[key: string]: string;
|
|
8
|
+
};
|
|
9
|
+
type Props = {
|
|
10
|
+
readableQuery: ReadableQueryPrimitive[];
|
|
11
|
+
classes?: Classes;
|
|
12
|
+
title?: string;
|
|
13
|
+
};
|
|
14
|
+
export declare const ReadableSearchQueryBuilder: ({ readableQuery, classes, title }: Props) => React.JSX.Element;
|
|
15
|
+
export {};
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
26
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
27
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
28
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
29
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
30
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
31
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
32
|
+
});
|
|
33
|
+
};
|
|
34
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
35
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
36
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
37
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
38
|
+
function step(op) {
|
|
39
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
40
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
41
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
42
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
43
|
+
switch (op[0]) {
|
|
44
|
+
case 0: case 1: t = op; break;
|
|
45
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
46
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
47
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
48
|
+
default:
|
|
49
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
50
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
51
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
52
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
53
|
+
if (t[2]) _.ops.pop();
|
|
54
|
+
_.trys.pop(); continue;
|
|
55
|
+
}
|
|
56
|
+
op = body.call(thisArg, _);
|
|
57
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
58
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
62
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
63
|
+
};
|
|
64
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
65
|
+
exports.ReadableSearchQueryBuilder = void 0;
|
|
66
|
+
var react_1 = __importStar(require("react"));
|
|
67
|
+
var ui_i18n_1 = __importDefault(require("ui-i18n"));
|
|
68
|
+
var classnames_1 = __importDefault(require("classnames"));
|
|
69
|
+
var mdm_sdk_1 = require("@reltio/mdm-sdk");
|
|
70
|
+
var Tooltip_1 = __importDefault(require("@mui/material/Tooltip"));
|
|
71
|
+
var ReadableSearchQuery_1 = require("../ReadableSearchQuery");
|
|
72
|
+
var styles_1 = require("./styles");
|
|
73
|
+
var ReadableSearchQueryBuilder = function (_a) {
|
|
74
|
+
var readableQuery = _a.readableQuery, _b = _a.classes, classes = _b === void 0 ? {} : _b, _c = _a.title, title = _c === void 0 ? ui_i18n_1.default.text('Search query') : _c;
|
|
75
|
+
var styles = (0, styles_1.useStyles)();
|
|
76
|
+
var initialTooltipTitle = ui_i18n_1.default.text('Copy to clipboard');
|
|
77
|
+
var _d = (0, react_1.useState)(initialTooltipTitle), tooltipTitle = _d[0], setTooltipTitle = _d[1];
|
|
78
|
+
var _e = (0, react_1.useState)(0), queryMouseEnterX = _e[0], setQueryMouseEnterX = _e[1];
|
|
79
|
+
var _f = (0, react_1.useState)(0), queryMouseEnterY = _f[0], setQueryMouseEnterY = _f[1];
|
|
80
|
+
var onQueryMouseEnter = (0, react_1.useCallback)(function (e) {
|
|
81
|
+
setQueryMouseEnterX(e.clientX);
|
|
82
|
+
setQueryMouseEnterY(e.clientY);
|
|
83
|
+
}, []);
|
|
84
|
+
var onTooltipClose = (0, react_1.useCallback)(function () {
|
|
85
|
+
setTooltipTitle(initialTooltipTitle);
|
|
86
|
+
}, [initialTooltipTitle]);
|
|
87
|
+
var copyQueryToClipboard = (0, react_1.useCallback)(function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
88
|
+
var _a;
|
|
89
|
+
return __generator(this, function (_b) {
|
|
90
|
+
switch (_b.label) {
|
|
91
|
+
case 0:
|
|
92
|
+
_b.trys.push([0, 2, , 3]);
|
|
93
|
+
return [4 /*yield*/, navigator.clipboard.writeText((0, mdm_sdk_1.readableQueryToString)(readableQuery))];
|
|
94
|
+
case 1:
|
|
95
|
+
_b.sent();
|
|
96
|
+
setTooltipTitle(ui_i18n_1.default.text('Query was copied'));
|
|
97
|
+
return [3 /*break*/, 3];
|
|
98
|
+
case 2:
|
|
99
|
+
_a = _b.sent();
|
|
100
|
+
setTooltipTitle(ui_i18n_1.default.text('Error'));
|
|
101
|
+
return [3 /*break*/, 3];
|
|
102
|
+
case 3: return [2 /*return*/];
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
}); }, [readableQuery]);
|
|
106
|
+
// When query is too long and div.queryContainer has scroll, we have wrong tooltip position.
|
|
107
|
+
// Possible solution is wrap in Tooltip div.queryContainer component, but it's too wide for short queries.
|
|
108
|
+
// So, we decided to place tooltip near position where cursor was entered on div.query
|
|
109
|
+
var popperProps = (0, react_1.useMemo)(function () { return ({
|
|
110
|
+
anchorEl: {
|
|
111
|
+
clientWidth: 1,
|
|
112
|
+
clientHeight: 1,
|
|
113
|
+
getBoundingClientRect: function () { return ({
|
|
114
|
+
left: queryMouseEnterX,
|
|
115
|
+
bottom: queryMouseEnterY,
|
|
116
|
+
height: 1,
|
|
117
|
+
right: queryMouseEnterX,
|
|
118
|
+
width: 1,
|
|
119
|
+
top: queryMouseEnterY
|
|
120
|
+
}); }
|
|
121
|
+
}
|
|
122
|
+
}); }, [queryMouseEnterX, queryMouseEnterY]);
|
|
123
|
+
return (react_1.default.createElement("div", { className: (0, classnames_1.default)(styles.root, classes.root) },
|
|
124
|
+
react_1.default.createElement("span", { className: classes.title }, title),
|
|
125
|
+
react_1.default.createElement("div", { className: (0, classnames_1.default)(styles.queryWrapper, classes.queryWrapper) }, readableQuery.length > 0 ? (react_1.default.createElement(Tooltip_1.default, { key: tooltipTitle, title: tooltipTitle, onClose: onTooltipClose, PopperProps: popperProps },
|
|
126
|
+
react_1.default.createElement(ReadableSearchQuery_1.ReadableSearchQuery, { readableQuery: readableQuery, onMouseEnter: onQueryMouseEnter, onClick: copyQueryToClipboard, classes: classes, className: styles.query }))) : (react_1.default.createElement("span", { className: styles.noQuery }, ui_i18n_1.default.text('Build your search and view your search query here'))))));
|
|
127
|
+
};
|
|
128
|
+
exports.ReadableSearchQueryBuilder = ReadableSearchQueryBuilder;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __assign = (this && this.__assign) || function () {
|
|
3
|
+
__assign = Object.assign || function(t) {
|
|
4
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
5
|
+
s = arguments[i];
|
|
6
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
7
|
+
t[p] = s[p];
|
|
8
|
+
}
|
|
9
|
+
return t;
|
|
10
|
+
};
|
|
11
|
+
return __assign.apply(this, arguments);
|
|
12
|
+
};
|
|
13
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
14
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
15
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
16
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
17
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
18
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
19
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
20
|
+
});
|
|
21
|
+
};
|
|
22
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
23
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
24
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
25
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
26
|
+
function step(op) {
|
|
27
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
28
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
29
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
30
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
31
|
+
switch (op[0]) {
|
|
32
|
+
case 0: case 1: t = op; break;
|
|
33
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
34
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
35
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
36
|
+
default:
|
|
37
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
38
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
39
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
40
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
41
|
+
if (t[2]) _.ops.pop();
|
|
42
|
+
_.trys.pop(); continue;
|
|
43
|
+
}
|
|
44
|
+
op = body.call(thisArg, _);
|
|
45
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
46
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
50
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
51
|
+
};
|
|
52
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
53
|
+
var react_1 = __importDefault(require("react"));
|
|
54
|
+
var react_2 = require("@testing-library/react");
|
|
55
|
+
var ReadableSearchQueryBuilder_1 = require("./ReadableSearchQueryBuilder");
|
|
56
|
+
var defaultReadableQuery = [
|
|
57
|
+
{ text: 'REGISTRY: ', type: 'entityTypeLabel' },
|
|
58
|
+
{ text: 'Name', type: 'attributeLabel' },
|
|
59
|
+
{ text: ' ', type: 'space' },
|
|
60
|
+
{ text: '≠', type: 'attributeFilter' },
|
|
61
|
+
{ text: ' ', type: 'space' },
|
|
62
|
+
{ text: '"John"', type: 'attributeValue' }
|
|
63
|
+
];
|
|
64
|
+
var defaultProps = {
|
|
65
|
+
readableQuery: defaultReadableQuery
|
|
66
|
+
};
|
|
67
|
+
var setUp = function (props) {
|
|
68
|
+
if (props === void 0) { props = defaultProps; }
|
|
69
|
+
return __assign({}, (0, react_2.render)(react_1.default.createElement(ReadableSearchQueryBuilder_1.ReadableSearchQueryBuilder, __assign({}, props))));
|
|
70
|
+
};
|
|
71
|
+
describe('Readable search query builder behaviour', function () {
|
|
72
|
+
beforeEach(function () {
|
|
73
|
+
Object.assign(navigator, { clipboard: { writeText: jest.fn() } });
|
|
74
|
+
});
|
|
75
|
+
afterEach(function () {
|
|
76
|
+
jest.clearAllMocks();
|
|
77
|
+
});
|
|
78
|
+
it('should render correctly', function () {
|
|
79
|
+
setUp();
|
|
80
|
+
react_2.screen.getByText('Search query');
|
|
81
|
+
expect(react_2.screen.getByTestId('search-readable-query')).toHaveTextContent('REGISTRY: Name ≠ "John"');
|
|
82
|
+
expect(react_2.screen.queryByText('Build your search and view your search query here')).not.toBeInTheDocument();
|
|
83
|
+
});
|
|
84
|
+
it('should render custom title correctly', function () {
|
|
85
|
+
var props = __assign(__assign({}, defaultProps), { title: 'Custom title' });
|
|
86
|
+
setUp(props);
|
|
87
|
+
react_2.screen.getByText('Custom title');
|
|
88
|
+
});
|
|
89
|
+
it('should render special message when readable query is empty', function () {
|
|
90
|
+
var props = __assign(__assign({}, defaultProps), { readableQuery: [] });
|
|
91
|
+
setUp(props);
|
|
92
|
+
expect(react_2.screen.queryByTestId('search-readable-query')).not.toBeInTheDocument();
|
|
93
|
+
react_2.screen.getByText('Build your search and view your search query here');
|
|
94
|
+
});
|
|
95
|
+
it('should copy text of readable query in clipboard on query click', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
96
|
+
var query;
|
|
97
|
+
return __generator(this, function (_a) {
|
|
98
|
+
switch (_a.label) {
|
|
99
|
+
case 0:
|
|
100
|
+
navigator.clipboard.writeText.mockResolvedValue(null);
|
|
101
|
+
setUp();
|
|
102
|
+
query = react_2.screen.getByTestId('search-readable-query');
|
|
103
|
+
// eslint-disable-next-line testing-library/prefer-user-event
|
|
104
|
+
react_2.fireEvent.mouseOver(query);
|
|
105
|
+
react_2.screen.getByLabelText('Copy to clipboard');
|
|
106
|
+
// eslint-disable-next-line testing-library/prefer-user-event
|
|
107
|
+
react_2.fireEvent.click(query);
|
|
108
|
+
return [4 /*yield*/, react_2.screen.findByLabelText('Query was copied')];
|
|
109
|
+
case 1:
|
|
110
|
+
_a.sent();
|
|
111
|
+
expect(navigator.clipboard.writeText).toHaveBeenCalledWith('REGISTRY: Name ≠ "John"');
|
|
112
|
+
return [2 /*return*/];
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
}); });
|
|
116
|
+
it('should show error text in tooltip if attempt to copy text to clipboard was failed', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
117
|
+
var query;
|
|
118
|
+
return __generator(this, function (_a) {
|
|
119
|
+
switch (_a.label) {
|
|
120
|
+
case 0:
|
|
121
|
+
navigator.clipboard.writeText.mockRejectedValue(null);
|
|
122
|
+
setUp();
|
|
123
|
+
query = react_2.screen.getByTestId('search-readable-query');
|
|
124
|
+
// eslint-disable-next-line testing-library/prefer-user-event
|
|
125
|
+
react_2.fireEvent.mouseOver(query);
|
|
126
|
+
react_2.screen.getByLabelText('Copy to clipboard');
|
|
127
|
+
// eslint-disable-next-line testing-library/prefer-user-event
|
|
128
|
+
react_2.fireEvent.click(query);
|
|
129
|
+
return [4 /*yield*/, react_2.screen.findByLabelText('Error')];
|
|
130
|
+
case 1:
|
|
131
|
+
_a.sent();
|
|
132
|
+
expect(navigator.clipboard.writeText).toHaveBeenCalledWith('REGISTRY: Name ≠ "John"');
|
|
133
|
+
return [2 /*return*/];
|
|
134
|
+
}
|
|
135
|
+
});
|
|
136
|
+
}); });
|
|
137
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { ReadableSearchQueryBuilder } from './ReadableSearchQueryBuilder';
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ReadableSearchQueryBuilder = void 0;
|
|
4
|
+
var ReadableSearchQueryBuilder_1 = require("./ReadableSearchQueryBuilder");
|
|
5
|
+
Object.defineProperty(exports, "ReadableSearchQueryBuilder", { enumerable: true, get: function () { return ReadableSearchQueryBuilder_1.ReadableSearchQueryBuilder; } });
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const useStyles: (props?: any) => import("@mui/styles").ClassNameMap<"root" | "query" | "queryWrapper" | "noQuery">;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.useStyles = void 0;
|
|
4
|
+
var styles_1 = require("@mui/styles");
|
|
5
|
+
exports.useStyles = (0, styles_1.makeStyles)({
|
|
6
|
+
root: {
|
|
7
|
+
fontSize: '12px',
|
|
8
|
+
lineHeight: '16px',
|
|
9
|
+
color: 'rgba(0,0,0,0.38)'
|
|
10
|
+
},
|
|
11
|
+
queryWrapper: {
|
|
12
|
+
height: 'auto',
|
|
13
|
+
maxHeight: '48px',
|
|
14
|
+
paddingTop: '4px',
|
|
15
|
+
overflow: 'auto'
|
|
16
|
+
},
|
|
17
|
+
query: {
|
|
18
|
+
cursor: 'pointer'
|
|
19
|
+
},
|
|
20
|
+
noQuery: {
|
|
21
|
+
color: '#000000'
|
|
22
|
+
}
|
|
23
|
+
});
|
package/cjs/index.d.ts
CHANGED
|
@@ -129,6 +129,7 @@ export { StepNavigation } from './StepNavigation';
|
|
|
129
129
|
export { TableSkeleton } from './TableSkeleton';
|
|
130
130
|
export { LogicOperator } from './LogicOperator';
|
|
131
131
|
export { ReadableSearchQuery } from './ReadableSearchQuery';
|
|
132
|
+
export { ReadableSearchQueryBuilder } from './ReadableSearchQueryBuilder';
|
|
132
133
|
export { ImportButton } from './ImportButton';
|
|
133
134
|
export { LinearLoadIndicator } from './LinearLoadIndicator';
|
|
134
135
|
export { Link } from './Link';
|
package/cjs/index.js
CHANGED
|
@@ -16,11 +16,11 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
17
|
exports.NestedAttributeEditor = exports.NestedAttribute = exports.MoreAttributesButton = exports.InlineReferenceAttribute = exports.InlineNestedAttribute = exports.InlineImageAttribute = exports.InlineAttributesPager = exports.InfoIcon = exports.EditableImageAttributesLine = exports.FilterButton = exports.FacetViewHeader = exports.ExpandedValueTooltip = exports.EntitySelector = exports.EntityCreator = exports.AttributesPager = exports.AttributesList = exports.EditableAttribute = exports.DropDownMenuButton = exports.DescriptionIcon = exports.DefaultCellValueRenderer = exports.ControlAttributeIcon = exports.ColumnsSettingsPopup = exports.ColumnsSettings = exports.ColorBar = exports.CollapseRowButton = exports.BasicChartsFactory = exports.ChartsFactory = exports.CardinalityMessage = exports.BranchDecorator = exports.BasicViewHeader = exports.BasicViewContent = exports.BasicView = exports.BasicTablePagination = exports.basicTableViewState = exports.BasicTable = exports.BasicAttributeSelector = exports.BarChart = exports.AvatarWithFallback = exports.AutoSizeList = exports.AttributesView = exports.AttributesValuesEditor = exports.AttributesFiltersButton = exports.AttributesFiltersBuilder = exports.AttributesFilterSelector = exports.AttributesErrorsPanel = exports.AttributeListItem = exports.AttributeGroupIcon = exports.ArrowExpandButton = exports.ActionsPanel = exports.ActionButton = void 0;
|
|
18
18
|
exports.ConnectionEditor = exports.DropDownSelector = exports.ReactSelectOptionWithCheckIcon = exports.ReactSelectMenuWithPopper = exports.ReactSelectMenuList = exports.ReactSelectLoadMoreButton = exports.ReactSelectDropdownIndicatorWithIconButton = exports.ReactSelectDropdownIndicator = exports.Highlighter = exports.HierarchyNodeTitle = exports.HierarchicalAttributeTooltip = exports.HideOnShrink = exports.ExpandableSearchInput = exports.ErrorPopup = exports.ErrorBoundary = exports.EntityUriLink = exports.EntityTypesSelector = exports.EntityTypeIcon = exports.EntityTypeBadge = exports.EntityAvatar = exports.EMPTY_STATE_VARIANTS = exports.EMPTY_STATE_ICONS = exports.EmptyState = exports.Drawer = exports.DataTypeValue = exports.DataTenantBadge = exports.ConnectionRelationTypeSelector = exports.CollaborationItem = exports.ConfirmationDialog = exports.CommentsContainer = exports.ColoredSourceIcon = exports.CollapseButton = exports.TreeChart = exports.TableWithBars = exports.SourceIcon = exports.SmallIconButtonWithTooltip = exports.SmallIconButton = exports.SimpleAttributeEditor = exports.SimpleAttribute = exports.RowCellAutoSizer = exports.RelationTypeSelector = exports.ReferenceAttributeEditor = exports.ReferenceAttribute = exports.ImageAttributesLine = exports.ReadOnlyAttributesPager = exports.ReadOnlyAttributesList = exports.ReadOnlyAttribute = exports.ReadOnlyAttributeValuesBlock = exports.PieChart = exports.OvIcon = void 0;
|
|
19
|
-
exports.
|
|
20
|
-
exports.
|
|
21
|
-
exports.
|
|
22
|
-
exports.
|
|
23
|
-
exports.FakeMouseEvent = exports.rerenderWrapper = exports.mockElementSizes = exports.fixClicksOnResizablePanes = exports.mockBasicTableSizing = exports.getMuiIconsByName = exports.getMuiIconByName = exports.delayPromise = exports.deepFreeze = exports.awaitMockPromises = exports.TestStylesProvider = exports.TestPerspectivesSettingsProvider = exports.mergeClasses = exports.isControlOrCommandPressed = exports.getValue = exports.getChecked = exports.showErrorMessage = exports.showDefaultErrorMessage = exports.enrichDataWithPercents = exports.defaultRenderRowCell = exports.defaultGetRowCellHeight = exports.columnFilterToMdmFilter = exports.buildColumnsSizeById = exports.buildColumnsFilter = void 0;
|
|
19
|
+
exports.MultipleInput = exports.ModeSwitcherSelect = exports.ModeSwitcher = exports.TransitiveMatchBlock = exports.SimpleMatchRulesBuilder = exports.SimpleMatchRulesBlock = exports.SimpleMatchRules = exports.MatchRulesBlock = exports.LoadingSpinner = exports.Link = exports.LinearLoadIndicator = exports.ImportButton = exports.ReadableSearchQueryBuilder = exports.ReadableSearchQuery = exports.LogicOperator = exports.TableSkeleton = exports.StepNavigation = exports.TenantLabel = exports.RelevanceScoreBadge = exports.RequiredMark = exports.SettingsMenu = exports.TenantsDropDownSelector = exports.TenantIcon = exports.SourceSystemsSelector = exports.MatchRulesSelector = exports.MultiValueSelector = exports.ProfilesList = exports.NotMatchButton = exports.MergeButton = exports.ProfileMatchCard = exports.ImageGalleryDialog = exports.RelationTypesSelector = exports.ScreenProfileBand = exports.ProfileBandNavigation = exports.EmptyStub = exports.SaveSegmentDialog = exports.MaskingSwitcher = exports.FileTypeEditor = exports.EmptySearchResult = exports.DropDownEditor = exports.FilterValueEditor = exports.MultiValueChip = exports.TextEditor = exports.DateRangeEditor = exports.NumberEditor = exports.DataTypeValueEditor = exports.DateEditor = exports.ErrorWrapper = exports.ErrorMessage = exports.ConfigureColumnsPopup = void 0;
|
|
20
|
+
exports.BlockImageGalleryDialogContext = exports.PopupBoundariesContext = exports.HistoryDiffContext = exports.AsyncMountContext = exports.MdmModuleProvider = exports.withTableContext = exports.withFilterAtBottom = exports.withPercents = exports.withContext = exports.withDateRangeSelector = exports.withDragHandle = exports.withAsyncMount = exports.withTooltip = exports.DateRangeSelector = exports.UpSetChart = exports.GaugeChart = exports.RelationEditor = exports.ReltioMap = exports.Marginator = exports.LightArrowTooltip = exports.ScrollableTabs = exports.VirtualGroupedList = exports.ViewMoreToggle = exports.VerticalHeadingsTable = exports.VerticalDivider = exports.AttributeTitle = exports.Spacer = exports.SimpleDropDownSelector = exports.SidePanelContentHeader = exports.SidePanel = exports.SidePanelEmptyState = exports.SideButtonsPanel = exports.SelectorWithOnlyOptionAutoSelect = exports.SelectionPopup = exports.WhiteSearchInput = exports.SearchInput = exports.ProfileResizablePanes = exports.ResizablePanes = exports.ReltioGridLayout = exports.RCTree = exports.reactSortableTreeHelpers = exports.ReactSortableTree = exports.MultiSelect = exports.QueryBuilderRowsGroup = exports.QueryBuilderRow = exports.ProfileCard = exports.ProfileBand = exports.PotentialMatchReviewCard = exports.PopupWithArrow = exports.Popper = void 0;
|
|
21
|
+
exports.SegmentationContext = exports.useReloadData = exports.ReloadDataProvider = exports.useAttributeValueConfigPermissions = exports.ConfigPermissionsContextProvider = exports.ConfigPermissionsContext = exports.useActionsHook = exports.ActionsHookProvider = exports.PageRequestsAbortingContext = exports.DependentLookupAutopopulationContext = exports.FeaturesContext = exports.LabelsContext = exports.UrlGeneratorsContext = exports.isHighlightedAttributeType = exports.isHighlightedErrorType = exports.ScrollType = exports.ScrollToElementProvider = exports.ScrollToElementContext = exports.SearchValueContext = exports.InterceptHandlersContext = exports.HighlightedValuesContext = exports.SnackbarContext = exports.SearchFiltersContext = exports.useReloadFacet = exports.ReloadFacetProvider = exports.useReloadAllFacets = exports.SandboxAPIContext = exports.EntityContext = exports.RelatedObjectUrisContext = exports.WorkflowTasksContext = exports.useEntityLoadingIndication = exports.EntityLoadingIndicationProvider = exports.EntityMarkerContext = exports.useAttributeExpanded = exports.ExpandedAttributesProvider = exports.useHighlightedCrosswalks = exports.useCrosswalkHighlight = exports.useCrosswalkFocus = exports.useCrosswalkColor = exports.CrosswalksDisplayProvider = exports.EntitiesMapContext = exports.IdContext = exports.ProfilePerspectiveViewContext = exports.usePerspectivesSettings = exports.PerspectivesSettingsContext = exports.PivotingAttributeContext = exports.UsersContext = exports.InitialCollaborationContextValue = exports.CollaborationContextProvider = exports.CollaborationContext = void 0;
|
|
22
|
+
exports.resolveMarkers = exports.useMarkers = exports.useMaskedAttribute = exports.useKeyboardNavigation = exports.useDynamicRowCellHeight = exports.useClickableStyle = exports.BasicTableCellRenderer = exports.useBasicTableCellRenderer = exports.useHiddenAttributes = exports.useSavedSearchesRequest = exports.useRequestDCRReview = exports.useAutoFocus = exports.useExpandInvalidRelations = exports.useLayoutResetter = exports.useIsMountedRef = exports.useSnackbar = exports.useSavedStateForEntityType = exports.useReadableSearchState = exports.useEditableConnection = exports.useCustomScripts = exports.useMarkAsNotMatchRequest = exports.useMergeAllRequest = exports.usePagingSimulator = exports.useMatchesLoader = exports.useConfigPermissions = exports.useWhyDidYouUpdate = exports.useUsers = exports.useSavedState = exports.useSafePromise = exports.useRunOnceAfterValueInitialization = exports.useRelationsLoader = exports.useRelationTypeSelector = exports.usePrevious = exports.useDidUpdateEffect = exports.useCommentsEntitiesMap = exports.useCollaboration = exports.useAsyncMount = exports.useAPI = exports.useActions = exports.useMatchesColumnsData = exports.useScrollToAttributeError = exports.ProfileTablesContext = exports.HiddenAttributesContext = exports.BasicTableContext = exports.BasicTableRowCollapseContext = exports.useDeleteUnmaskedAttributeForRelation = exports.useUnmaskedAttributeValue = exports.useUnmaskAttributeValue = exports.useMaskAttributeValue = exports.MaskedAttributesProvider = void 0;
|
|
23
|
+
exports.FakeMouseEvent = exports.rerenderWrapper = exports.mockElementSizes = exports.fixClicksOnResizablePanes = exports.mockBasicTableSizing = exports.getMuiIconsByName = exports.getMuiIconByName = exports.delayPromise = exports.deepFreeze = exports.awaitMockPromises = exports.TestStylesProvider = exports.TestPerspectivesSettingsProvider = exports.mergeClasses = exports.isControlOrCommandPressed = exports.getValue = exports.getChecked = exports.showErrorMessage = exports.showDefaultErrorMessage = exports.enrichDataWithPercents = exports.defaultRenderRowCell = exports.defaultGetRowCellHeight = exports.columnFilterToMdmFilter = exports.buildColumnsSizeById = exports.buildColumnsFilter = exports.useSegmentationRequest = void 0;
|
|
24
24
|
// components
|
|
25
25
|
var ActionButton_1 = require("./ActionButton");
|
|
26
26
|
Object.defineProperty(exports, "ActionButton", { enumerable: true, get: function () { return ActionButton_1.ActionButton; } });
|
|
@@ -290,6 +290,8 @@ var LogicOperator_1 = require("./LogicOperator");
|
|
|
290
290
|
Object.defineProperty(exports, "LogicOperator", { enumerable: true, get: function () { return LogicOperator_1.LogicOperator; } });
|
|
291
291
|
var ReadableSearchQuery_1 = require("./ReadableSearchQuery");
|
|
292
292
|
Object.defineProperty(exports, "ReadableSearchQuery", { enumerable: true, get: function () { return ReadableSearchQuery_1.ReadableSearchQuery; } });
|
|
293
|
+
var ReadableSearchQueryBuilder_1 = require("./ReadableSearchQueryBuilder");
|
|
294
|
+
Object.defineProperty(exports, "ReadableSearchQueryBuilder", { enumerable: true, get: function () { return ReadableSearchQueryBuilder_1.ReadableSearchQueryBuilder; } });
|
|
293
295
|
var ImportButton_1 = require("./ImportButton");
|
|
294
296
|
Object.defineProperty(exports, "ImportButton", { enumerable: true, get: function () { return ImportButton_1.ImportButton; } });
|
|
295
297
|
var LinearLoadIndicator_1 = require("./LinearLoadIndicator");
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { ReadableQueryPrimitive } from '@reltio/mdm-sdk';
|
|
3
3
|
export declare const ReadableSearchQuery: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLSpanElement> & {
|
|
4
|
+
classes?: Record<string, string>;
|
|
4
5
|
readableQuery?: ReadableQueryPrimitive[];
|
|
5
6
|
} & React.RefAttributes<HTMLElement>>;
|
|
@@ -24,11 +24,11 @@ import React, { forwardRef } from 'react';
|
|
|
24
24
|
import classnames from 'classnames';
|
|
25
25
|
import { useStyles } from './styles';
|
|
26
26
|
export var ReadableSearchQuery = forwardRef(function (_a, ref) {
|
|
27
|
-
var _b = _a.readableQuery, readableQuery = _b === void 0 ? [] : _b, className = _a.className, otherProps = __rest(_a, ["readableQuery", "className"]);
|
|
27
|
+
var _b = _a.readableQuery, readableQuery = _b === void 0 ? [] : _b, className = _a.className, _c = _a.classes, classes = _c === void 0 ? {} : _c, otherProps = __rest(_a, ["readableQuery", "className", "classes"]);
|
|
28
28
|
var styles = useStyles();
|
|
29
29
|
return (React.createElement("span", __assign({ ref: ref, className: classnames(styles.query, className), "data-reltio-id": "search-readable-query" }, otherProps), readableQuery.map(function (_a, i) {
|
|
30
30
|
var type = _a.type, text = _a.text;
|
|
31
|
-
return (React.createElement("span", { key: i, className: styles[type] }, text));
|
|
31
|
+
return (React.createElement("span", { key: i, className: classnames(styles[type], classes[type]) }, text));
|
|
32
32
|
})));
|
|
33
33
|
});
|
|
34
34
|
ReadableSearchQuery.displayName = 'ReadableSearchQuery';
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { ReadableQueryPrimitive } from '@reltio/mdm-sdk';
|
|
3
|
+
type Classes = {
|
|
4
|
+
root?: string;
|
|
5
|
+
queryWrapper?: string;
|
|
6
|
+
title?: string;
|
|
7
|
+
[key: string]: string;
|
|
8
|
+
};
|
|
9
|
+
type Props = {
|
|
10
|
+
readableQuery: ReadableQueryPrimitive[];
|
|
11
|
+
classes?: Classes;
|
|
12
|
+
title?: string;
|
|
13
|
+
};
|
|
14
|
+
export declare const ReadableSearchQueryBuilder: ({ readableQuery, classes, title }: Props) => React.JSX.Element;
|
|
15
|
+
export {};
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
11
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
12
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
13
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
14
|
+
function step(op) {
|
|
15
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
16
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
17
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
18
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
19
|
+
switch (op[0]) {
|
|
20
|
+
case 0: case 1: t = op; break;
|
|
21
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
22
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
23
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
24
|
+
default:
|
|
25
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
26
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
27
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
28
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
29
|
+
if (t[2]) _.ops.pop();
|
|
30
|
+
_.trys.pop(); continue;
|
|
31
|
+
}
|
|
32
|
+
op = body.call(thisArg, _);
|
|
33
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
34
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
import React, { useState, useMemo, useCallback } from 'react';
|
|
38
|
+
import i18n from 'ui-i18n';
|
|
39
|
+
import classnames from 'classnames';
|
|
40
|
+
import { readableQueryToString } from '@reltio/mdm-sdk';
|
|
41
|
+
import Tooltip from '@mui/material/Tooltip';
|
|
42
|
+
import { ReadableSearchQuery } from '../ReadableSearchQuery';
|
|
43
|
+
import { useStyles } from './styles';
|
|
44
|
+
export var ReadableSearchQueryBuilder = function (_a) {
|
|
45
|
+
var readableQuery = _a.readableQuery, _b = _a.classes, classes = _b === void 0 ? {} : _b, _c = _a.title, title = _c === void 0 ? i18n.text('Search query') : _c;
|
|
46
|
+
var styles = useStyles();
|
|
47
|
+
var initialTooltipTitle = i18n.text('Copy to clipboard');
|
|
48
|
+
var _d = useState(initialTooltipTitle), tooltipTitle = _d[0], setTooltipTitle = _d[1];
|
|
49
|
+
var _e = useState(0), queryMouseEnterX = _e[0], setQueryMouseEnterX = _e[1];
|
|
50
|
+
var _f = useState(0), queryMouseEnterY = _f[0], setQueryMouseEnterY = _f[1];
|
|
51
|
+
var onQueryMouseEnter = useCallback(function (e) {
|
|
52
|
+
setQueryMouseEnterX(e.clientX);
|
|
53
|
+
setQueryMouseEnterY(e.clientY);
|
|
54
|
+
}, []);
|
|
55
|
+
var onTooltipClose = useCallback(function () {
|
|
56
|
+
setTooltipTitle(initialTooltipTitle);
|
|
57
|
+
}, [initialTooltipTitle]);
|
|
58
|
+
var copyQueryToClipboard = useCallback(function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
59
|
+
var _a;
|
|
60
|
+
return __generator(this, function (_b) {
|
|
61
|
+
switch (_b.label) {
|
|
62
|
+
case 0:
|
|
63
|
+
_b.trys.push([0, 2, , 3]);
|
|
64
|
+
return [4 /*yield*/, navigator.clipboard.writeText(readableQueryToString(readableQuery))];
|
|
65
|
+
case 1:
|
|
66
|
+
_b.sent();
|
|
67
|
+
setTooltipTitle(i18n.text('Query was copied'));
|
|
68
|
+
return [3 /*break*/, 3];
|
|
69
|
+
case 2:
|
|
70
|
+
_a = _b.sent();
|
|
71
|
+
setTooltipTitle(i18n.text('Error'));
|
|
72
|
+
return [3 /*break*/, 3];
|
|
73
|
+
case 3: return [2 /*return*/];
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
}); }, [readableQuery]);
|
|
77
|
+
// When query is too long and div.queryContainer has scroll, we have wrong tooltip position.
|
|
78
|
+
// Possible solution is wrap in Tooltip div.queryContainer component, but it's too wide for short queries.
|
|
79
|
+
// So, we decided to place tooltip near position where cursor was entered on div.query
|
|
80
|
+
var popperProps = useMemo(function () { return ({
|
|
81
|
+
anchorEl: {
|
|
82
|
+
clientWidth: 1,
|
|
83
|
+
clientHeight: 1,
|
|
84
|
+
getBoundingClientRect: function () { return ({
|
|
85
|
+
left: queryMouseEnterX,
|
|
86
|
+
bottom: queryMouseEnterY,
|
|
87
|
+
height: 1,
|
|
88
|
+
right: queryMouseEnterX,
|
|
89
|
+
width: 1,
|
|
90
|
+
top: queryMouseEnterY
|
|
91
|
+
}); }
|
|
92
|
+
}
|
|
93
|
+
}); }, [queryMouseEnterX, queryMouseEnterY]);
|
|
94
|
+
return (React.createElement("div", { className: classnames(styles.root, classes.root) },
|
|
95
|
+
React.createElement("span", { className: classes.title }, title),
|
|
96
|
+
React.createElement("div", { className: classnames(styles.queryWrapper, classes.queryWrapper) }, readableQuery.length > 0 ? (React.createElement(Tooltip, { key: tooltipTitle, title: tooltipTitle, onClose: onTooltipClose, PopperProps: popperProps },
|
|
97
|
+
React.createElement(ReadableSearchQuery, { readableQuery: readableQuery, onMouseEnter: onQueryMouseEnter, onClick: copyQueryToClipboard, classes: classes, className: styles.query }))) : (React.createElement("span", { className: styles.noQuery }, i18n.text('Build your search and view your search query here'))))));
|
|
98
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
var __assign = (this && this.__assign) || function () {
|
|
2
|
+
__assign = Object.assign || function(t) {
|
|
3
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
4
|
+
s = arguments[i];
|
|
5
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
6
|
+
t[p] = s[p];
|
|
7
|
+
}
|
|
8
|
+
return t;
|
|
9
|
+
};
|
|
10
|
+
return __assign.apply(this, arguments);
|
|
11
|
+
};
|
|
12
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
13
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
14
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
15
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
16
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
17
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
18
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
19
|
+
});
|
|
20
|
+
};
|
|
21
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
22
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
23
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
24
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
25
|
+
function step(op) {
|
|
26
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
27
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
28
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
29
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
30
|
+
switch (op[0]) {
|
|
31
|
+
case 0: case 1: t = op; break;
|
|
32
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
33
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
34
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
35
|
+
default:
|
|
36
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
37
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
38
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
39
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
40
|
+
if (t[2]) _.ops.pop();
|
|
41
|
+
_.trys.pop(); continue;
|
|
42
|
+
}
|
|
43
|
+
op = body.call(thisArg, _);
|
|
44
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
45
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
import React from 'react';
|
|
49
|
+
import { fireEvent, render, screen } from '@testing-library/react';
|
|
50
|
+
import { ReadableSearchQueryBuilder } from './ReadableSearchQueryBuilder';
|
|
51
|
+
var defaultReadableQuery = [
|
|
52
|
+
{ text: 'REGISTRY: ', type: 'entityTypeLabel' },
|
|
53
|
+
{ text: 'Name', type: 'attributeLabel' },
|
|
54
|
+
{ text: ' ', type: 'space' },
|
|
55
|
+
{ text: '≠', type: 'attributeFilter' },
|
|
56
|
+
{ text: ' ', type: 'space' },
|
|
57
|
+
{ text: '"John"', type: 'attributeValue' }
|
|
58
|
+
];
|
|
59
|
+
var defaultProps = {
|
|
60
|
+
readableQuery: defaultReadableQuery
|
|
61
|
+
};
|
|
62
|
+
var setUp = function (props) {
|
|
63
|
+
if (props === void 0) { props = defaultProps; }
|
|
64
|
+
return __assign({}, render(React.createElement(ReadableSearchQueryBuilder, __assign({}, props))));
|
|
65
|
+
};
|
|
66
|
+
describe('Readable search query builder behaviour', function () {
|
|
67
|
+
beforeEach(function () {
|
|
68
|
+
Object.assign(navigator, { clipboard: { writeText: jest.fn() } });
|
|
69
|
+
});
|
|
70
|
+
afterEach(function () {
|
|
71
|
+
jest.clearAllMocks();
|
|
72
|
+
});
|
|
73
|
+
it('should render correctly', function () {
|
|
74
|
+
setUp();
|
|
75
|
+
screen.getByText('Search query');
|
|
76
|
+
expect(screen.getByTestId('search-readable-query')).toHaveTextContent('REGISTRY: Name ≠ "John"');
|
|
77
|
+
expect(screen.queryByText('Build your search and view your search query here')).not.toBeInTheDocument();
|
|
78
|
+
});
|
|
79
|
+
it('should render custom title correctly', function () {
|
|
80
|
+
var props = __assign(__assign({}, defaultProps), { title: 'Custom title' });
|
|
81
|
+
setUp(props);
|
|
82
|
+
screen.getByText('Custom title');
|
|
83
|
+
});
|
|
84
|
+
it('should render special message when readable query is empty', function () {
|
|
85
|
+
var props = __assign(__assign({}, defaultProps), { readableQuery: [] });
|
|
86
|
+
setUp(props);
|
|
87
|
+
expect(screen.queryByTestId('search-readable-query')).not.toBeInTheDocument();
|
|
88
|
+
screen.getByText('Build your search and view your search query here');
|
|
89
|
+
});
|
|
90
|
+
it('should copy text of readable query in clipboard on query click', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
91
|
+
var query;
|
|
92
|
+
return __generator(this, function (_a) {
|
|
93
|
+
switch (_a.label) {
|
|
94
|
+
case 0:
|
|
95
|
+
navigator.clipboard.writeText.mockResolvedValue(null);
|
|
96
|
+
setUp();
|
|
97
|
+
query = screen.getByTestId('search-readable-query');
|
|
98
|
+
// eslint-disable-next-line testing-library/prefer-user-event
|
|
99
|
+
fireEvent.mouseOver(query);
|
|
100
|
+
screen.getByLabelText('Copy to clipboard');
|
|
101
|
+
// eslint-disable-next-line testing-library/prefer-user-event
|
|
102
|
+
fireEvent.click(query);
|
|
103
|
+
return [4 /*yield*/, screen.findByLabelText('Query was copied')];
|
|
104
|
+
case 1:
|
|
105
|
+
_a.sent();
|
|
106
|
+
expect(navigator.clipboard.writeText).toHaveBeenCalledWith('REGISTRY: Name ≠ "John"');
|
|
107
|
+
return [2 /*return*/];
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
}); });
|
|
111
|
+
it('should show error text in tooltip if attempt to copy text to clipboard was failed', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
112
|
+
var query;
|
|
113
|
+
return __generator(this, function (_a) {
|
|
114
|
+
switch (_a.label) {
|
|
115
|
+
case 0:
|
|
116
|
+
navigator.clipboard.writeText.mockRejectedValue(null);
|
|
117
|
+
setUp();
|
|
118
|
+
query = screen.getByTestId('search-readable-query');
|
|
119
|
+
// eslint-disable-next-line testing-library/prefer-user-event
|
|
120
|
+
fireEvent.mouseOver(query);
|
|
121
|
+
screen.getByLabelText('Copy to clipboard');
|
|
122
|
+
// eslint-disable-next-line testing-library/prefer-user-event
|
|
123
|
+
fireEvent.click(query);
|
|
124
|
+
return [4 /*yield*/, screen.findByLabelText('Error')];
|
|
125
|
+
case 1:
|
|
126
|
+
_a.sent();
|
|
127
|
+
expect(navigator.clipboard.writeText).toHaveBeenCalledWith('REGISTRY: Name ≠ "John"');
|
|
128
|
+
return [2 /*return*/];
|
|
129
|
+
}
|
|
130
|
+
});
|
|
131
|
+
}); });
|
|
132
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { ReadableSearchQueryBuilder } from './ReadableSearchQueryBuilder';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { ReadableSearchQueryBuilder } from './ReadableSearchQueryBuilder';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const useStyles: (props?: any) => import("@mui/styles").ClassNameMap<"root" | "query" | "queryWrapper" | "noQuery">;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { makeStyles } from '@mui/styles';
|
|
2
|
+
export var useStyles = makeStyles({
|
|
3
|
+
root: {
|
|
4
|
+
fontSize: '12px',
|
|
5
|
+
lineHeight: '16px',
|
|
6
|
+
color: 'rgba(0,0,0,0.38)'
|
|
7
|
+
},
|
|
8
|
+
queryWrapper: {
|
|
9
|
+
height: 'auto',
|
|
10
|
+
maxHeight: '48px',
|
|
11
|
+
paddingTop: '4px',
|
|
12
|
+
overflow: 'auto'
|
|
13
|
+
},
|
|
14
|
+
query: {
|
|
15
|
+
cursor: 'pointer'
|
|
16
|
+
},
|
|
17
|
+
noQuery: {
|
|
18
|
+
color: '#000000'
|
|
19
|
+
}
|
|
20
|
+
});
|
package/esm/index.d.ts
CHANGED
|
@@ -129,6 +129,7 @@ export { StepNavigation } from './StepNavigation';
|
|
|
129
129
|
export { TableSkeleton } from './TableSkeleton';
|
|
130
130
|
export { LogicOperator } from './LogicOperator';
|
|
131
131
|
export { ReadableSearchQuery } from './ReadableSearchQuery';
|
|
132
|
+
export { ReadableSearchQueryBuilder } from './ReadableSearchQueryBuilder';
|
|
132
133
|
export { ImportButton } from './ImportButton';
|
|
133
134
|
export { LinearLoadIndicator } from './LinearLoadIndicator';
|
|
134
135
|
export { Link } from './Link';
|
package/esm/index.js
CHANGED
|
@@ -130,6 +130,7 @@ export { StepNavigation } from './StepNavigation';
|
|
|
130
130
|
export { TableSkeleton } from './TableSkeleton';
|
|
131
131
|
export { LogicOperator } from './LogicOperator';
|
|
132
132
|
export { ReadableSearchQuery } from './ReadableSearchQuery';
|
|
133
|
+
export { ReadableSearchQueryBuilder } from './ReadableSearchQueryBuilder';
|
|
133
134
|
export { ImportButton } from './ImportButton';
|
|
134
135
|
export { LinearLoadIndicator } from './LinearLoadIndicator';
|
|
135
136
|
export { Link } from './Link';
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@reltio/components",
|
|
3
|
-
"version": "1.4.
|
|
3
|
+
"version": "1.4.1971",
|
|
4
4
|
"license": "SEE LICENSE IN LICENSE FILE",
|
|
5
5
|
"main": "./cjs/index.js",
|
|
6
6
|
"module": "./esm/index.js",
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
"@fluentui/react-context-selector": "^9.1.26",
|
|
9
9
|
"@react-google-maps/api": "2.7.0",
|
|
10
10
|
"@react-sigma/core": "3.4.0",
|
|
11
|
-
"@reltio/mdm-sdk": "^1.4.
|
|
11
|
+
"@reltio/mdm-sdk": "^1.4.1874",
|
|
12
12
|
"d3-cloud": "^1.2.5",
|
|
13
13
|
"d3-geo": "^2.0.1",
|
|
14
14
|
"d3-hierarchy": "^2.0.0",
|