@reltio/components 1.4.884 → 1.4.885

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.
@@ -51,7 +51,7 @@ var Title_1 = __importDefault(require("../../../Title/Title"));
51
51
  var CardinalityMessage_1 = __importDefault(require("./CardinalityMessage"));
52
52
  var ErrorMessage_1 = __importDefault(require("../../../ErrorWrapper/ErrorMessage"));
53
53
  var Attribute_1 = __importDefault(require("../AttributesFactory/Attribute"));
54
- var Tags_1 = __importDefault(require("../../readMode/SpecialAttributes/Tags")); //TODO: should be edit mode
54
+ var Tags_1 = __importDefault(require("../Tags"));
55
55
  var Roles_1 = __importDefault(require("../../readMode/SpecialAttributes/Roles")); //TODO: should be edit mode
56
56
  var styles_1 = require("./styles");
57
57
  var SpecialRenderer = function (_a) {
@@ -0,0 +1,7 @@
1
+ /// <reference types="react" />
2
+ declare type Props = {
3
+ className?: string;
4
+ values: string[];
5
+ };
6
+ declare const Tags: ({ className, values }: Props) => JSX.Element;
7
+ export default Tags;
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
+ }) : (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ o[k2] = m[k];
8
+ }));
9
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
10
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
11
+ }) : function(o, v) {
12
+ o["default"] = v;
13
+ });
14
+ var __importStar = (this && this.__importStar) || function (mod) {
15
+ if (mod && mod.__esModule) return mod;
16
+ var result = {};
17
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
18
+ __setModuleDefault(result, mod);
19
+ return result;
20
+ };
21
+ var __importDefault = (this && this.__importDefault) || function (mod) {
22
+ return (mod && mod.__esModule) ? mod : { "default": mod };
23
+ };
24
+ Object.defineProperty(exports, "__esModule", { value: true });
25
+ var react_1 = __importStar(require("react"));
26
+ var react_redux_1 = require("react-redux");
27
+ var mdm_module_1 = __importStar(require("@reltio/mdm-module"));
28
+ var mdm_sdk_1 = require("@reltio/mdm-sdk");
29
+ var TypeaheadEditor_1 = __importDefault(require("../../../editors/TypeaheadEditor/TypeaheadEditor"));
30
+ var filtersWithSearch = function (searchQuery) { return [
31
+ {
32
+ filter: 'containsWordStartingWith',
33
+ fieldName: 'tags',
34
+ values: [searchQuery]
35
+ }
36
+ ]; };
37
+ var getQuery = function (searchQuery) {
38
+ return searchQuery ? "?filter=" + mdm_sdk_1.buildFilterQueryString()(filtersWithSearch(searchQuery)) : '';
39
+ };
40
+ var body = [
41
+ {
42
+ fieldName: 'tags',
43
+ orderType: 'reversedCount'
44
+ }
45
+ ];
46
+ var getSuggestions = function (searchQuery) {
47
+ return mdm_sdk_1.getFacets({ query: getQuery(searchQuery), body: body }).then(function (response) { return Object.keys(response.tags); });
48
+ };
49
+ var Tags = function (_a) {
50
+ var className = _a.className, values = _a.values;
51
+ var dispatch = react_redux_1.useDispatch();
52
+ var entityUri = react_redux_1.useSelector(mdm_module_1.default.selectors.getEntityUri);
53
+ var onChange = react_1.useCallback(function (tags) {
54
+ return dispatch(mdm_module_1.profile.actions.modifyAttribute({
55
+ value: tags,
56
+ attributeType: mdm_sdk_1.EntityAttrTypes.tags,
57
+ uri: entityUri
58
+ }));
59
+ }, [dispatch, entityUri]);
60
+ return (react_1.default.createElement(TypeaheadEditor_1.default, { fullWidth: true, multiple: true, variant: "filled", className: className, value: values, onChange: onChange, getSuggestions: getSuggestions }));
61
+ };
62
+ exports.default = Tags;
@@ -0,0 +1 @@
1
+ export { default } from './Tags';
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.default = void 0;
7
+ var Tags_1 = require("./Tags");
8
+ Object.defineProperty(exports, "default", { enumerable: true, get: function () { return __importDefault(Tags_1).default; } });
@@ -6,7 +6,7 @@ declare function TypeaheadEditor({ value, getSuggestions, onChange, multiple, fu
6
6
  onChange: any;
7
7
  multiple: any;
8
8
  fullWidth: any;
9
- InputProps: any;
9
+ InputProps?: {};
10
10
  }): JSX.Element;
11
11
  declare namespace TypeaheadEditor {
12
12
  namespace propTypes {
@@ -50,6 +50,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
50
50
  };
51
51
  Object.defineProperty(exports, "__esModule", { value: true });
52
52
  var react_autosuggest_1 = __importDefault(require("react-autosuggest"));
53
+ var react_input_autosize_1 = __importDefault(require("react-input-autosize"));
53
54
  var classnames_1 = __importDefault(require("classnames"));
54
55
  var TextField_1 = __importDefault(require("@material-ui/core/TextField"));
55
56
  var MenuItem_1 = __importDefault(require("@material-ui/core/MenuItem"));
@@ -66,9 +67,9 @@ var ExpandedValueTooltip_1 = __importDefault(require("../../ExpandedValueTooltip
66
67
  var ValueChip_1 = __importDefault(require("../../ValueChip/ValueChip"));
67
68
  var FETCH_DEBOUNCE_INTERVAL = 300;
68
69
  var TypeaheadEditor = function (_a) {
69
- var value = _a.value, getSuggestions = _a.getSuggestions, onChange = _a.onChange, multiple = _a.multiple, fullWidth = _a.fullWidth, InputProps = _a.InputProps, inputProps = __rest(_a, ["value", "getSuggestions", "onChange", "multiple", "fullWidth", "InputProps"]);
70
- var _b = react_1.useState([]), suggestions = _b[0], setSuggestions = _b[1];
71
- var _c = react_1.useState(false), isPlaceholderVisible = _c[0], setPlaceholderVisibility = _c[1];
70
+ var value = _a.value, getSuggestions = _a.getSuggestions, onChange = _a.onChange, multiple = _a.multiple, fullWidth = _a.fullWidth, _b = _a.InputProps, InputProps = _b === void 0 ? {} : _b, inputProps = __rest(_a, ["value", "getSuggestions", "onChange", "multiple", "fullWidth", "InputProps"]);
71
+ var _c = react_1.useState([]), suggestions = _c[0], setSuggestions = _c[1];
72
+ var _d = react_1.useState(false), isPlaceholderVisible = _d[0], setPlaceholderVisibility = _d[1];
72
73
  var inputRef = react_1.useRef();
73
74
  var styles = styles_1.useStyles();
74
75
  var isFocused = function () { var _a; return ((_a = inputRef.current) === null || _a === void 0 ? void 0 : _a.querySelector('input')) === document.activeElement; };
@@ -77,8 +78,8 @@ var TypeaheadEditor = function (_a) {
77
78
  getSuggestions
78
79
  ]);
79
80
  value = ramda_1.defaultTo(multiple ? [] : '', value);
80
- var _d = react_1.useState(''), currentValue = _d[0], setCurrentValue = _d[1];
81
- var _e = react_1.useState(false), hasHighlightedItem = _e[0], setHasHighlightedItem = _e[1];
81
+ var _e = react_1.useState(''), currentValue = _e[0], setCurrentValue = _e[1];
82
+ var _f = react_1.useState(false), hasHighlightedItem = _f[0], setHasHighlightedItem = _f[1];
82
83
  var onInputChange = function (_a) {
83
84
  var newValue = _a.newValue, method = _a.method;
84
85
  switch (method) {
@@ -123,7 +124,7 @@ var TypeaheadEditor = function (_a) {
123
124
  underline: classnames_1.default((_b = {}, _b[styles['input__underline']] = mdm_sdk_1.isEmptyValue(value), _b)),
124
125
  input: classnames_1.default(styles['rawInput'], ramda_1.path(['classes', 'input'], InputProps))
125
126
  };
126
- return multiple ? (react_1.default.createElement(TextField_1.default, __assign({}, otherProps, { ref: inputRef, inputRef: ref, InputProps: __assign(__assign({}, InputProps), { startAdornment: value.map(function (item, index) { return (react_1.default.createElement(ValueChip_1.default, { key: item, label: item, onDelete: function () { return onChange(ramda_1.remove(index, 1, value)); } })); }), classes: __assign({ root: classnames_1.default(styles['multiple-input__input'], ramda_1.path(['classes', 'root'], InputProps)), adornedStart: styles['multiple-input__adornedStart'] }, commonClasses) }), value: currentValue, onChange: onInputChange, classes: { root: styles['multiple-input__root'] } }))) : (react_1.default.createElement(TextField_1.default, __assign({}, otherProps, { ref: inputRef, inputRef: ref, value: value, onChange: ramda_1.pipe(ramda_1.tap(onInputChange), utils_1.getValue, onChange), InputProps: __assign(__assign({}, InputProps), { classes: __assign({ root: classnames_1.default(styles['input__root'], ramda_1.path(['classes', 'root'], InputProps)) }, commonClasses) }) })));
127
+ return multiple ? (react_1.default.createElement(TextField_1.default, __assign({}, otherProps, { ref: inputRef, inputRef: ref, InputProps: __assign(__assign({}, InputProps), { startAdornment: value.map(function (item, index) { return (react_1.default.createElement(ValueChip_1.default, { key: item, label: item, onDelete: function () { return onChange(ramda_1.remove(index, 1, value)); } })); }), inputComponent: react_input_autosize_1.default, classes: __assign(__assign({ root: classnames_1.default(styles['multiple-input__input'], ramda_1.path(['classes', 'root'], InputProps)) }, commonClasses), { input: classnames_1.default(styles.autosizeInput, commonClasses.input), adornedStart: styles['multiple-input__adornedStart'] }) }), value: currentValue, onChange: onInputChange, classes: { root: styles['multiple-input__root'] } }))) : (react_1.default.createElement(TextField_1.default, __assign({}, otherProps, { ref: inputRef, inputRef: ref, value: value, onChange: ramda_1.pipe(ramda_1.tap(onInputChange), utils_1.getValue, onChange), InputProps: __assign(__assign({}, InputProps), { classes: __assign({ root: classnames_1.default(styles['input__root'], ramda_1.path(['classes', 'root'], InputProps)) }, commonClasses) }) })));
127
128
  }, renderSuggestionsContainer: function (_a) {
128
129
  var children = _a.children, _b = _a.containerProps, ref = _b.ref, restContainerProps = __rest(_b, ["ref"]);
129
130
  return (react_1.default.createElement(Popper_1.default, { anchorEl: inputRef.current, open: Boolean(children) || isPlaceholderVisible },
@@ -1 +1 @@
1
- export const useStyles: (props?: any) => import("@material-ui/core/styles/withStyles").ClassNameMap<"typeahead__suggestions-placeholder" | "typeahead__suggestions-container--open" | "typeahead__suggestions-list" | "typeahead__suggestions-menuItem" | "input__root" | "rawInput" | "multiple-input__root" | "multiple-input__input" | "multiple-input__adornedStart" | "input__underline" | "typeahead__suggestions-container" | "menuItem--item">;
1
+ export const useStyles: (props?: any) => import("@material-ui/core/styles/withStyles").ClassNameMap<"autosizeInput" | "typeahead__suggestions-placeholder" | "typeahead__suggestions-container--open" | "typeahead__suggestions-list" | "typeahead__suggestions-menuItem" | "input__root" | "rawInput" | "multiple-input__root" | "multiple-input__input" | "multiple-input__adornedStart" | "input__underline" | "typeahead__suggestions-container" | "menuItem--item">;
@@ -24,6 +24,21 @@ exports.useStyles = styles_1.makeStyles({
24
24
  color: 'rgba(0,0,0,0.87)',
25
25
  fontSize: '14px'
26
26
  },
27
+ autosizeInput: {
28
+ width: 'auto',
29
+ paddingTop: '10px',
30
+ paddingBottom: '11px',
31
+ marginLeft: '5px',
32
+ overflow: 'hidden',
33
+ '& input': {
34
+ background: '0px center',
35
+ border: 0,
36
+ fontSize: 'inherit',
37
+ outline: 0,
38
+ padding: 0,
39
+ color: 'inherit'
40
+ }
41
+ },
27
42
  rawInput: {
28
43
  height: '19px'
29
44
  },
@@ -27,7 +27,7 @@ import Title from '../../../Title/Title';
27
27
  import Cardinality from './CardinalityMessage';
28
28
  import ErrorMessage from '../../../ErrorWrapper/ErrorMessage';
29
29
  import Attribute from '../AttributesFactory/Attribute';
30
- import Tags from '../../readMode/SpecialAttributes/Tags'; //TODO: should be edit mode
30
+ import Tags from '../Tags';
31
31
  import Roles from '../../readMode/SpecialAttributes/Roles'; //TODO: should be edit mode
32
32
  import { useStyles } from './styles';
33
33
  var SpecialRenderer = function (_a) {
@@ -0,0 +1,7 @@
1
+ /// <reference types="react" />
2
+ declare type Props = {
3
+ className?: string;
4
+ values: string[];
5
+ };
6
+ declare const Tags: ({ className, values }: Props) => JSX.Element;
7
+ export default Tags;
@@ -0,0 +1,38 @@
1
+ import React, { useCallback } from 'react';
2
+ import { useDispatch, useSelector } from 'react-redux';
3
+ import mdmModule, { profile } from '@reltio/mdm-module';
4
+ import { getFacets, EntityAttrTypes, buildFilterQueryString } from '@reltio/mdm-sdk';
5
+ import TypeaheadEditor from '../../../editors/TypeaheadEditor/TypeaheadEditor';
6
+ var filtersWithSearch = function (searchQuery) { return [
7
+ {
8
+ filter: 'containsWordStartingWith',
9
+ fieldName: 'tags',
10
+ values: [searchQuery]
11
+ }
12
+ ]; };
13
+ var getQuery = function (searchQuery) {
14
+ return searchQuery ? "?filter=" + buildFilterQueryString()(filtersWithSearch(searchQuery)) : '';
15
+ };
16
+ var body = [
17
+ {
18
+ fieldName: 'tags',
19
+ orderType: 'reversedCount'
20
+ }
21
+ ];
22
+ var getSuggestions = function (searchQuery) {
23
+ return getFacets({ query: getQuery(searchQuery), body: body }).then(function (response) { return Object.keys(response.tags); });
24
+ };
25
+ var Tags = function (_a) {
26
+ var className = _a.className, values = _a.values;
27
+ var dispatch = useDispatch();
28
+ var entityUri = useSelector(mdmModule.selectors.getEntityUri);
29
+ var onChange = useCallback(function (tags) {
30
+ return dispatch(profile.actions.modifyAttribute({
31
+ value: tags,
32
+ attributeType: EntityAttrTypes.tags,
33
+ uri: entityUri
34
+ }));
35
+ }, [dispatch, entityUri]);
36
+ return (React.createElement(TypeaheadEditor, { fullWidth: true, multiple: true, variant: "filled", className: className, value: values, onChange: onChange, getSuggestions: getSuggestions }));
37
+ };
38
+ export default Tags;
@@ -0,0 +1 @@
1
+ export { default } from './Tags';
@@ -0,0 +1 @@
1
+ export { default } from './Tags';
@@ -6,7 +6,7 @@ declare function TypeaheadEditor({ value, getSuggestions, onChange, multiple, fu
6
6
  onChange: any;
7
7
  multiple: any;
8
8
  fullWidth: any;
9
- InputProps: any;
9
+ InputProps?: {};
10
10
  }): JSX.Element;
11
11
  declare namespace TypeaheadEditor {
12
12
  namespace propTypes {
@@ -26,6 +26,7 @@ var __spreadArray = (this && this.__spreadArray) || function (to, from) {
26
26
  return to;
27
27
  };
28
28
  import Autosuggest from 'react-autosuggest';
29
+ import AutosizeInput from 'react-input-autosize';
29
30
  import classnames from 'classnames';
30
31
  import TextField from '@material-ui/core/TextField';
31
32
  import MenuItem from '@material-ui/core/MenuItem';
@@ -42,9 +43,9 @@ import ExpandedValueTooltip from '../../ExpandedValueTooltip/ExpandedValueToolti
42
43
  import ValueChip from '../../ValueChip/ValueChip';
43
44
  var FETCH_DEBOUNCE_INTERVAL = 300;
44
45
  var TypeaheadEditor = function (_a) {
45
- var value = _a.value, getSuggestions = _a.getSuggestions, onChange = _a.onChange, multiple = _a.multiple, fullWidth = _a.fullWidth, InputProps = _a.InputProps, inputProps = __rest(_a, ["value", "getSuggestions", "onChange", "multiple", "fullWidth", "InputProps"]);
46
- var _b = useState([]), suggestions = _b[0], setSuggestions = _b[1];
47
- var _c = useState(false), isPlaceholderVisible = _c[0], setPlaceholderVisibility = _c[1];
46
+ var value = _a.value, getSuggestions = _a.getSuggestions, onChange = _a.onChange, multiple = _a.multiple, fullWidth = _a.fullWidth, _b = _a.InputProps, InputProps = _b === void 0 ? {} : _b, inputProps = __rest(_a, ["value", "getSuggestions", "onChange", "multiple", "fullWidth", "InputProps"]);
47
+ var _c = useState([]), suggestions = _c[0], setSuggestions = _c[1];
48
+ var _d = useState(false), isPlaceholderVisible = _d[0], setPlaceholderVisibility = _d[1];
48
49
  var inputRef = useRef();
49
50
  var styles = useStyles();
50
51
  var isFocused = function () { var _a; return ((_a = inputRef.current) === null || _a === void 0 ? void 0 : _a.querySelector('input')) === document.activeElement; };
@@ -53,8 +54,8 @@ var TypeaheadEditor = function (_a) {
53
54
  getSuggestions
54
55
  ]);
55
56
  value = defaultTo(multiple ? [] : '', value);
56
- var _d = useState(''), currentValue = _d[0], setCurrentValue = _d[1];
57
- var _e = useState(false), hasHighlightedItem = _e[0], setHasHighlightedItem = _e[1];
57
+ var _e = useState(''), currentValue = _e[0], setCurrentValue = _e[1];
58
+ var _f = useState(false), hasHighlightedItem = _f[0], setHasHighlightedItem = _f[1];
58
59
  var onInputChange = function (_a) {
59
60
  var newValue = _a.newValue, method = _a.method;
60
61
  switch (method) {
@@ -99,7 +100,7 @@ var TypeaheadEditor = function (_a) {
99
100
  underline: classnames((_b = {}, _b[styles['input__underline']] = isEmptyValue(value), _b)),
100
101
  input: classnames(styles['rawInput'], path(['classes', 'input'], InputProps))
101
102
  };
102
- return multiple ? (React.createElement(TextField, __assign({}, otherProps, { ref: inputRef, inputRef: ref, InputProps: __assign(__assign({}, InputProps), { startAdornment: value.map(function (item, index) { return (React.createElement(ValueChip, { key: item, label: item, onDelete: function () { return onChange(remove(index, 1, value)); } })); }), classes: __assign({ root: classnames(styles['multiple-input__input'], path(['classes', 'root'], InputProps)), adornedStart: styles['multiple-input__adornedStart'] }, commonClasses) }), value: currentValue, onChange: onInputChange, classes: { root: styles['multiple-input__root'] } }))) : (React.createElement(TextField, __assign({}, otherProps, { ref: inputRef, inputRef: ref, value: value, onChange: pipe(tap(onInputChange), getValue, onChange), InputProps: __assign(__assign({}, InputProps), { classes: __assign({ root: classnames(styles['input__root'], path(['classes', 'root'], InputProps)) }, commonClasses) }) })));
103
+ return multiple ? (React.createElement(TextField, __assign({}, otherProps, { ref: inputRef, inputRef: ref, InputProps: __assign(__assign({}, InputProps), { startAdornment: value.map(function (item, index) { return (React.createElement(ValueChip, { key: item, label: item, onDelete: function () { return onChange(remove(index, 1, value)); } })); }), inputComponent: AutosizeInput, classes: __assign(__assign({ root: classnames(styles['multiple-input__input'], path(['classes', 'root'], InputProps)) }, commonClasses), { input: classnames(styles.autosizeInput, commonClasses.input), adornedStart: styles['multiple-input__adornedStart'] }) }), value: currentValue, onChange: onInputChange, classes: { root: styles['multiple-input__root'] } }))) : (React.createElement(TextField, __assign({}, otherProps, { ref: inputRef, inputRef: ref, value: value, onChange: pipe(tap(onInputChange), getValue, onChange), InputProps: __assign(__assign({}, InputProps), { classes: __assign({ root: classnames(styles['input__root'], path(['classes', 'root'], InputProps)) }, commonClasses) }) })));
103
104
  }, renderSuggestionsContainer: function (_a) {
104
105
  var children = _a.children, _b = _a.containerProps, ref = _b.ref, restContainerProps = __rest(_b, ["ref"]);
105
106
  return (React.createElement(Popper, { anchorEl: inputRef.current, open: Boolean(children) || isPlaceholderVisible },
@@ -1 +1 @@
1
- export const useStyles: (props?: any) => import("@material-ui/core/styles/withStyles").ClassNameMap<"typeahead__suggestions-placeholder" | "typeahead__suggestions-container--open" | "typeahead__suggestions-list" | "typeahead__suggestions-menuItem" | "input__root" | "rawInput" | "multiple-input__root" | "multiple-input__input" | "multiple-input__adornedStart" | "input__underline" | "typeahead__suggestions-container" | "menuItem--item">;
1
+ export const useStyles: (props?: any) => import("@material-ui/core/styles/withStyles").ClassNameMap<"autosizeInput" | "typeahead__suggestions-placeholder" | "typeahead__suggestions-container--open" | "typeahead__suggestions-list" | "typeahead__suggestions-menuItem" | "input__root" | "rawInput" | "multiple-input__root" | "multiple-input__input" | "multiple-input__adornedStart" | "input__underline" | "typeahead__suggestions-container" | "menuItem--item">;
@@ -21,6 +21,21 @@ export var useStyles = makeStyles({
21
21
  color: 'rgba(0,0,0,0.87)',
22
22
  fontSize: '14px'
23
23
  },
24
+ autosizeInput: {
25
+ width: 'auto',
26
+ paddingTop: '10px',
27
+ paddingBottom: '11px',
28
+ marginLeft: '5px',
29
+ overflow: 'hidden',
30
+ '& input': {
31
+ background: '0px center',
32
+ border: 0,
33
+ fontSize: 'inherit',
34
+ outline: 0,
35
+ padding: 0,
36
+ color: 'inherit'
37
+ }
38
+ },
24
39
  rawInput: {
25
40
  height: '19px'
26
41
  },
package/package.json CHANGED
@@ -1,14 +1,14 @@
1
1
  {
2
2
  "name": "@reltio/components",
3
- "version": "1.4.884",
3
+ "version": "1.4.885",
4
4
  "license": "SEE LICENSE IN LICENSE FILE",
5
5
  "main": "./cjs/index.js",
6
6
  "module": "./esm/index.js",
7
7
  "dependencies": {
8
8
  "@date-io/moment": "^1.3.5",
9
9
  "@react-google-maps/api": "^2.7.0",
10
- "@reltio/mdm-module": "^1.4.884",
11
- "@reltio/mdm-sdk": "^1.4.884",
10
+ "@reltio/mdm-module": "^1.4.885",
11
+ "@reltio/mdm-sdk": "^1.4.885",
12
12
  "classnames": "^2.2.5",
13
13
  "frontend-collective-react-dnd-scrollzone": "^1.0.2",
14
14
  "nanoid": "^2.0.0",