@pingux/astro 2.27.0-alpha.2 → 2.27.0-alpha.4
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/lib/cjs/components/ArrayField/ArrayField.js +3 -3
- package/lib/cjs/components/ArrayField/ArrayField.stories.js +23 -9
- package/lib/cjs/components/HelpHint/HelpHint.js +10 -8
- package/lib/cjs/components/HelpHint/HelpHint.test.js +6 -5
- package/lib/cjs/hooks/useSelectField/useSelectField.js +3 -2
- package/lib/components/ArrayField/ArrayField.js +3 -3
- package/lib/components/ArrayField/ArrayField.stories.js +23 -9
- package/lib/components/HelpHint/HelpHint.js +10 -8
- package/lib/components/HelpHint/HelpHint.test.js +6 -5
- package/lib/hooks/useSelectField/useSelectField.js +3 -2
- package/package.json +1 -1
@@ -122,9 +122,9 @@ var ArrayField = function ArrayField(props) {
|
|
122
122
|
raLabelProps = _useLabel.labelProps;
|
123
123
|
var isLimitReached = !!maxSize && (value || fieldValues).length >= maxSize;
|
124
124
|
var isDisabled = (value || fieldValues).length === 1;
|
125
|
-
var renderedItem = (0, _react.useCallback)(function (id, fieldValue, otherFieldProps, onComponentRender) {
|
125
|
+
var renderedItem = (0, _react.useCallback)(function (id, fieldValue, otherFieldProps, onComponentRender, labelId) {
|
126
126
|
if (onComponentRender) {
|
127
|
-
return onComponentRender(id, fieldValue, onFieldValueChange, onFieldDelete, isDisabled, otherFieldProps);
|
127
|
+
return onComponentRender(id, fieldValue, onFieldValueChange, onFieldDelete, isDisabled, labelId, otherFieldProps);
|
128
128
|
}
|
129
129
|
return renderField(id, fieldValue, onFieldValueChange, onFieldDelete, isDisabled, otherFieldProps);
|
130
130
|
}, [onFieldValueChange, onFieldDelete, renderField, isDisabled]);
|
@@ -145,7 +145,7 @@ var ArrayField = function ArrayField(props) {
|
|
145
145
|
as: "li",
|
146
146
|
mb: "xs",
|
147
147
|
key: id
|
148
|
-
}, renderedItem(id, fieldValue, otherFieldProps, onComponentRender));
|
148
|
+
}, renderedItem(id, fieldValue, otherFieldProps, onComponentRender, raLabelProps === null || raLabelProps === void 0 ? void 0 : raLabelProps.id));
|
149
149
|
})), helperText && (0, _react2.jsx)(_.FieldHelperText, {
|
150
150
|
status: status
|
151
151
|
}, helperText), isLimitReached && (0, _react2.jsx)(_.FieldHelperText, {
|
@@ -121,7 +121,8 @@ var Uncontrolled = function Uncontrolled(_ref) {
|
|
121
121
|
}, args));
|
122
122
|
};
|
123
123
|
exports.Uncontrolled = Uncontrolled;
|
124
|
-
var Controlled = function Controlled() {
|
124
|
+
var Controlled = function Controlled(_ref2) {
|
125
|
+
var args = (0, _extends2["default"])({}, ((0, _objectDestructuringEmpty2["default"])(_ref2), _ref2));
|
125
126
|
var defaultDataSelectField = [{
|
126
127
|
id: (0, _uuid.v4)(),
|
127
128
|
fieldValue: 'red',
|
@@ -140,7 +141,11 @@ var Controlled = function Controlled() {
|
|
140
141
|
}
|
141
142
|
})
|
142
143
|
}
|
143
|
-
}, otherFieldProps
|
144
|
+
}, otherFieldProps, {
|
145
|
+
listBoxProps: {
|
146
|
+
'aria-labelledby': otherFieldProps
|
147
|
+
}
|
148
|
+
}), (0, _react2.jsx)(_index.Item, {
|
144
149
|
key: "red"
|
145
150
|
}, "Red"), (0, _react2.jsx)(_index.Item, {
|
146
151
|
key: "blue"
|
@@ -166,7 +171,11 @@ var Controlled = function Controlled() {
|
|
166
171
|
}
|
167
172
|
})
|
168
173
|
}
|
169
|
-
}, otherFieldProps
|
174
|
+
}, otherFieldProps, {
|
175
|
+
listBoxProps: {
|
176
|
+
'aria-labelledby': otherFieldProps
|
177
|
+
}
|
178
|
+
}), (0, _react2.jsx)(_index.Item, {
|
170
179
|
key: "orange"
|
171
180
|
}, "Orange"), (0, _react2.jsx)(_index.Item, {
|
172
181
|
key: "purple"
|
@@ -193,7 +202,11 @@ var Controlled = function Controlled() {
|
|
193
202
|
}
|
194
203
|
})
|
195
204
|
}
|
196
|
-
}, otherFieldProps
|
205
|
+
}, otherFieldProps, {
|
206
|
+
listBoxProps: {
|
207
|
+
'aria-labelledby': otherFieldProps
|
208
|
+
}
|
209
|
+
}), (0, _react2.jsx)(_index.Item, {
|
197
210
|
key: "blue"
|
198
211
|
}, "Blue"), (0, _react2.jsx)(_index.Item, {
|
199
212
|
key: "teal"
|
@@ -217,8 +230,8 @@ var Controlled = function Controlled() {
|
|
217
230
|
};
|
218
231
|
var handleOnDelete = function handleOnDelete(fieldId) {
|
219
232
|
setFieldValues(function (oldValues) {
|
220
|
-
return (0, _filter["default"])(oldValues).call(oldValues, function (
|
221
|
-
var id =
|
233
|
+
return (0, _filter["default"])(oldValues).call(oldValues, function (_ref3) {
|
234
|
+
var id = _ref3.id;
|
222
235
|
return id !== fieldId;
|
223
236
|
});
|
224
237
|
});
|
@@ -231,12 +244,13 @@ var Controlled = function Controlled() {
|
|
231
244
|
onDelete: handleOnDelete,
|
232
245
|
sx: {
|
233
246
|
width: '400px'
|
234
|
-
}
|
247
|
+
},
|
248
|
+
label: args.label
|
235
249
|
});
|
236
250
|
};
|
237
251
|
exports.Controlled = Controlled;
|
238
|
-
var WithLimitedItemsNumber = function WithLimitedItemsNumber(
|
239
|
-
var args = (0, _extends2["default"])({}, ((0, _objectDestructuringEmpty2["default"])(
|
252
|
+
var WithLimitedItemsNumber = function WithLimitedItemsNumber(_ref4) {
|
253
|
+
var args = (0, _extends2["default"])({}, ((0, _objectDestructuringEmpty2["default"])(_ref4), _ref4));
|
240
254
|
return (0, _react2.jsx)(_index.ArrayField, (0, _extends2["default"])({
|
241
255
|
defaultValue: defaultData,
|
242
256
|
renderField: function renderField(id, fieldValue, onFieldValueChange, onFieldDelete, isDisabled, otherFieldProps) {
|
@@ -74,11 +74,11 @@ var HelpHint = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
|
|
74
74
|
focusProps = _useFocusRing.focusProps,
|
75
75
|
isFocusVisible = _useFocusRing.isFocusVisible;
|
76
76
|
var _useHover = (0, _interactions.useHover)({}),
|
77
|
-
|
78
|
-
|
77
|
+
overlayHoverProps = _useHover.hoverProps,
|
78
|
+
isOverlayHovered = _useHover.isHovered;
|
79
79
|
var _useHover2 = (0, _interactions.useHover)({}),
|
80
|
-
|
81
|
-
|
80
|
+
hoverProps = _useHover2.hoverProps,
|
81
|
+
isTriggerHovered = _useHover2.isHovered;
|
82
82
|
var popoverState = (0, _reactStately.useOverlayTriggerState)({});
|
83
83
|
var open = popoverState.open,
|
84
84
|
close = popoverState.close,
|
@@ -98,15 +98,16 @@ var HelpHint = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
|
|
98
98
|
// but keep it open if the trigger or overlay are hovered again before it closes.
|
99
99
|
(0, _react.useEffect)(function () {
|
100
100
|
var timeout;
|
101
|
-
|
101
|
+
var isHovered = isTriggerHovered || isOverlayHovered;
|
102
|
+
if (isHovered || isFocusWithinOverlay) {
|
102
103
|
open();
|
103
|
-
} else {
|
104
|
+
} else if (!isFocusWithinOverlay && !isFocusVisible && !isHovered) {
|
104
105
|
timeout = (0, _setTimeout2["default"])(close, closeDelay || 1000);
|
105
106
|
}
|
106
107
|
return function () {
|
107
108
|
clearTimeout(timeout);
|
108
109
|
};
|
109
|
-
}, [
|
110
|
+
}, [isFocusWithinOverlay, isFocusVisible, isOverlayHovered, isTriggerHovered]);
|
110
111
|
(0, _react.useEffect)(function () {
|
111
112
|
if (isOpen) {
|
112
113
|
return triggerRef === null || triggerRef === void 0 ? void 0 : triggerRef.current.setAttribute('aria-expanded', 'true');
|
@@ -170,7 +171,8 @@ var HelpHint = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
|
|
170
171
|
restoreFocus: true,
|
171
172
|
autoFocus: isFocusVisible
|
172
173
|
}, (0, _react2.jsx)(_.Box, {
|
173
|
-
variant: "helpHint.popoverContainer"
|
174
|
+
variant: "helpHint.popoverContainer",
|
175
|
+
role: "status"
|
174
176
|
}, _safariAgent.isSafari ? addIsSafariCompatiblePropToLinkChildren(children) : children))));
|
175
177
|
});
|
176
178
|
HelpHint.propTypes = {
|
@@ -87,7 +87,7 @@ test('keeps the popover open if the popover is hovered', /*#__PURE__*/(0, _async
|
|
87
87
|
}
|
88
88
|
}, _callee2);
|
89
89
|
})));
|
90
|
-
test('popover without focusable children should open onPress and disappear in 1000ms', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3() {
|
90
|
+
test('popover without focusable children should open onPress and disappear in 1000ms after blur', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3() {
|
91
91
|
var helpHintButton;
|
92
92
|
return _regeneratorRuntime().wrap(function _callee3$(_context3) {
|
93
93
|
while (1) switch (_context3.prev = _context3.next) {
|
@@ -99,20 +99,21 @@ test('popover without focusable children should open onPress and disappear in 10
|
|
99
99
|
_userEvent["default"].type(helpHintButton, '{enter}', {
|
100
100
|
skipClick: true
|
101
101
|
});
|
102
|
-
|
102
|
+
_userEvent["default"].tab();
|
103
|
+
_context3.next = 8;
|
103
104
|
return (0, _testWrapper.waitFor)(function () {
|
104
105
|
expect(_testWrapper.screen.queryByRole('presentation')).toBeInTheDocument();
|
105
106
|
}, {
|
106
107
|
timeout: 500
|
107
108
|
});
|
108
|
-
case
|
109
|
-
_context3.next =
|
109
|
+
case 8:
|
110
|
+
_context3.next = 10;
|
110
111
|
return (0, _testWrapper.waitFor)(function () {
|
111
112
|
expect(_testWrapper.screen.queryByRole('presentation')).not.toBeInTheDocument();
|
112
113
|
}, {
|
113
114
|
timeout: 1100
|
114
115
|
});
|
115
|
-
case
|
116
|
+
case 10:
|
116
117
|
case "end":
|
117
118
|
return _context3.stop();
|
118
119
|
}
|
@@ -59,7 +59,8 @@ var useSelectField = function useSelectField(props, ref) {
|
|
59
59
|
onOpenChange = props.onOpenChange,
|
60
60
|
onSelectionChange = props.onSelectionChange,
|
61
61
|
controlProps = props.controlProps,
|
62
|
-
scrollBoxProps = props.scrollBoxProps
|
62
|
+
scrollBoxProps = props.scrollBoxProps,
|
63
|
+
listBoxProps = props.listBoxProps;
|
63
64
|
// We use falsy booleans as defaults, but React Aria has this as true by default so we need to
|
64
65
|
// negate this.
|
65
66
|
var shouldFlip = !isNotFlippable;
|
@@ -194,7 +195,7 @@ var useSelectField = function useSelectField(props, ref) {
|
|
194
195
|
variant: "listBox.selectField",
|
195
196
|
isLoading: isLoadingMore,
|
196
197
|
onLoadMore: onLoadMore
|
197
|
-
}, menuProps)), (0, _react2.jsx)(_reactAria.DismissButton, {
|
198
|
+
}, menuProps, listBoxProps)), (0, _react2.jsx)(_reactAria.DismissButton, {
|
198
199
|
onDismiss: function onDismiss() {
|
199
200
|
return state.close();
|
200
201
|
}
|
@@ -110,9 +110,9 @@ var ArrayField = function ArrayField(props) {
|
|
110
110
|
raLabelProps = _useLabel.labelProps;
|
111
111
|
var isLimitReached = !!maxSize && (value || fieldValues).length >= maxSize;
|
112
112
|
var isDisabled = (value || fieldValues).length === 1;
|
113
|
-
var renderedItem = useCallback(function (id, fieldValue, otherFieldProps, onComponentRender) {
|
113
|
+
var renderedItem = useCallback(function (id, fieldValue, otherFieldProps, onComponentRender, labelId) {
|
114
114
|
if (onComponentRender) {
|
115
|
-
return onComponentRender(id, fieldValue, onFieldValueChange, onFieldDelete, isDisabled, otherFieldProps);
|
115
|
+
return onComponentRender(id, fieldValue, onFieldValueChange, onFieldDelete, isDisabled, labelId, otherFieldProps);
|
116
116
|
}
|
117
117
|
return renderField(id, fieldValue, onFieldValueChange, onFieldDelete, isDisabled, otherFieldProps);
|
118
118
|
}, [onFieldValueChange, onFieldDelete, renderField, isDisabled]);
|
@@ -133,7 +133,7 @@ var ArrayField = function ArrayField(props) {
|
|
133
133
|
as: "li",
|
134
134
|
mb: "xs",
|
135
135
|
key: id
|
136
|
-
}, renderedItem(id, fieldValue, otherFieldProps, onComponentRender));
|
136
|
+
}, renderedItem(id, fieldValue, otherFieldProps, onComponentRender, raLabelProps === null || raLabelProps === void 0 ? void 0 : raLabelProps.id));
|
137
137
|
})), helperText && ___EmotionJSX(FieldHelperText, {
|
138
138
|
status: status
|
139
139
|
}, helperText), isLimitReached && ___EmotionJSX(FieldHelperText, {
|
@@ -111,7 +111,8 @@ export var Uncontrolled = function Uncontrolled(_ref) {
|
|
111
111
|
}
|
112
112
|
}, args));
|
113
113
|
};
|
114
|
-
export var Controlled = function Controlled() {
|
114
|
+
export var Controlled = function Controlled(_ref2) {
|
115
|
+
var args = _extends({}, (_objectDestructuringEmpty(_ref2), _ref2));
|
115
116
|
var defaultDataSelectField = [{
|
116
117
|
id: uuid(),
|
117
118
|
fieldValue: 'red',
|
@@ -130,7 +131,11 @@ export var Controlled = function Controlled() {
|
|
130
131
|
}
|
131
132
|
})
|
132
133
|
}
|
133
|
-
}, otherFieldProps
|
134
|
+
}, otherFieldProps, {
|
135
|
+
listBoxProps: {
|
136
|
+
'aria-labelledby': otherFieldProps
|
137
|
+
}
|
138
|
+
}), ___EmotionJSX(Item, {
|
134
139
|
key: "red"
|
135
140
|
}, "Red"), ___EmotionJSX(Item, {
|
136
141
|
key: "blue"
|
@@ -156,7 +161,11 @@ export var Controlled = function Controlled() {
|
|
156
161
|
}
|
157
162
|
})
|
158
163
|
}
|
159
|
-
}, otherFieldProps
|
164
|
+
}, otherFieldProps, {
|
165
|
+
listBoxProps: {
|
166
|
+
'aria-labelledby': otherFieldProps
|
167
|
+
}
|
168
|
+
}), ___EmotionJSX(Item, {
|
160
169
|
key: "orange"
|
161
170
|
}, "Orange"), ___EmotionJSX(Item, {
|
162
171
|
key: "purple"
|
@@ -183,7 +192,11 @@ export var Controlled = function Controlled() {
|
|
183
192
|
}
|
184
193
|
})
|
185
194
|
}
|
186
|
-
}, otherFieldProps
|
195
|
+
}, otherFieldProps, {
|
196
|
+
listBoxProps: {
|
197
|
+
'aria-labelledby': otherFieldProps
|
198
|
+
}
|
199
|
+
}), ___EmotionJSX(Item, {
|
187
200
|
key: "blue"
|
188
201
|
}, "Blue"), ___EmotionJSX(Item, {
|
189
202
|
key: "teal"
|
@@ -207,8 +220,8 @@ export var Controlled = function Controlled() {
|
|
207
220
|
};
|
208
221
|
var handleOnDelete = function handleOnDelete(fieldId) {
|
209
222
|
setFieldValues(function (oldValues) {
|
210
|
-
return _filterInstanceProperty(oldValues).call(oldValues, function (
|
211
|
-
var id =
|
223
|
+
return _filterInstanceProperty(oldValues).call(oldValues, function (_ref3) {
|
224
|
+
var id = _ref3.id;
|
212
225
|
return id !== fieldId;
|
213
226
|
});
|
214
227
|
});
|
@@ -221,11 +234,12 @@ export var Controlled = function Controlled() {
|
|
221
234
|
onDelete: handleOnDelete,
|
222
235
|
sx: {
|
223
236
|
width: '400px'
|
224
|
-
}
|
237
|
+
},
|
238
|
+
label: args.label
|
225
239
|
});
|
226
240
|
};
|
227
|
-
export var WithLimitedItemsNumber = function WithLimitedItemsNumber(
|
228
|
-
var args = _extends({}, (_objectDestructuringEmpty(
|
241
|
+
export var WithLimitedItemsNumber = function WithLimitedItemsNumber(_ref4) {
|
242
|
+
var args = _extends({}, (_objectDestructuringEmpty(_ref4), _ref4));
|
229
243
|
return ___EmotionJSX(ArrayField, _extends({
|
230
244
|
defaultValue: defaultData,
|
231
245
|
renderField: function renderField(id, fieldValue, onFieldValueChange, onFieldDelete, isDisabled, otherFieldProps) {
|
@@ -61,11 +61,11 @@ var HelpHint = /*#__PURE__*/forwardRef(function (props, ref) {
|
|
61
61
|
focusProps = _useFocusRing.focusProps,
|
62
62
|
isFocusVisible = _useFocusRing.isFocusVisible;
|
63
63
|
var _useHover = useHover({}),
|
64
|
-
|
65
|
-
|
64
|
+
overlayHoverProps = _useHover.hoverProps,
|
65
|
+
isOverlayHovered = _useHover.isHovered;
|
66
66
|
var _useHover2 = useHover({}),
|
67
|
-
|
68
|
-
|
67
|
+
hoverProps = _useHover2.hoverProps,
|
68
|
+
isTriggerHovered = _useHover2.isHovered;
|
69
69
|
var popoverState = useOverlayTriggerState({});
|
70
70
|
var open = popoverState.open,
|
71
71
|
close = popoverState.close,
|
@@ -85,15 +85,16 @@ var HelpHint = /*#__PURE__*/forwardRef(function (props, ref) {
|
|
85
85
|
// but keep it open if the trigger or overlay are hovered again before it closes.
|
86
86
|
useEffect(function () {
|
87
87
|
var timeout;
|
88
|
-
|
88
|
+
var isHovered = isTriggerHovered || isOverlayHovered;
|
89
|
+
if (isHovered || isFocusWithinOverlay) {
|
89
90
|
open();
|
90
|
-
} else {
|
91
|
+
} else if (!isFocusWithinOverlay && !isFocusVisible && !isHovered) {
|
91
92
|
timeout = _setTimeout(close, closeDelay || 1000);
|
92
93
|
}
|
93
94
|
return function () {
|
94
95
|
clearTimeout(timeout);
|
95
96
|
};
|
96
|
-
}, [
|
97
|
+
}, [isFocusWithinOverlay, isFocusVisible, isOverlayHovered, isTriggerHovered]);
|
97
98
|
useEffect(function () {
|
98
99
|
if (isOpen) {
|
99
100
|
return triggerRef === null || triggerRef === void 0 ? void 0 : triggerRef.current.setAttribute('aria-expanded', 'true');
|
@@ -157,7 +158,8 @@ var HelpHint = /*#__PURE__*/forwardRef(function (props, ref) {
|
|
157
158
|
restoreFocus: true,
|
158
159
|
autoFocus: isFocusVisible
|
159
160
|
}, ___EmotionJSX(Box, {
|
160
|
-
variant: "helpHint.popoverContainer"
|
161
|
+
variant: "helpHint.popoverContainer",
|
162
|
+
role: "status"
|
161
163
|
}, isSafari ? addIsSafariCompatiblePropToLinkChildren(children) : children))));
|
162
164
|
});
|
163
165
|
HelpHint.propTypes = {
|
@@ -84,7 +84,7 @@ test('keeps the popover open if the popover is hovered', /*#__PURE__*/_asyncToGe
|
|
84
84
|
}
|
85
85
|
}, _callee2);
|
86
86
|
})));
|
87
|
-
test('popover without focusable children should open onPress and disappear in 1000ms', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3() {
|
87
|
+
test('popover without focusable children should open onPress and disappear in 1000ms after blur', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3() {
|
88
88
|
var helpHintButton;
|
89
89
|
return _regeneratorRuntime().wrap(function _callee3$(_context3) {
|
90
90
|
while (1) switch (_context3.prev = _context3.next) {
|
@@ -96,20 +96,21 @@ test('popover without focusable children should open onPress and disappear in 10
|
|
96
96
|
userEvent.type(helpHintButton, '{enter}', {
|
97
97
|
skipClick: true
|
98
98
|
});
|
99
|
-
|
99
|
+
userEvent.tab();
|
100
|
+
_context3.next = 8;
|
100
101
|
return waitFor(function () {
|
101
102
|
expect(screen.queryByRole('presentation')).toBeInTheDocument();
|
102
103
|
}, {
|
103
104
|
timeout: 500
|
104
105
|
});
|
105
|
-
case
|
106
|
-
_context3.next =
|
106
|
+
case 8:
|
107
|
+
_context3.next = 10;
|
107
108
|
return waitFor(function () {
|
108
109
|
expect(screen.queryByRole('presentation')).not.toBeInTheDocument();
|
109
110
|
}, {
|
110
111
|
timeout: 1100
|
111
112
|
});
|
112
|
-
case
|
113
|
+
case 10:
|
113
114
|
case "end":
|
114
115
|
return _context3.stop();
|
115
116
|
}
|
@@ -48,7 +48,8 @@ var useSelectField = function useSelectField(props, ref) {
|
|
48
48
|
onOpenChange = props.onOpenChange,
|
49
49
|
onSelectionChange = props.onSelectionChange,
|
50
50
|
controlProps = props.controlProps,
|
51
|
-
scrollBoxProps = props.scrollBoxProps
|
51
|
+
scrollBoxProps = props.scrollBoxProps,
|
52
|
+
listBoxProps = props.listBoxProps;
|
52
53
|
// We use falsy booleans as defaults, but React Aria has this as true by default so we need to
|
53
54
|
// negate this.
|
54
55
|
var shouldFlip = !isNotFlippable;
|
@@ -183,7 +184,7 @@ var useSelectField = function useSelectField(props, ref) {
|
|
183
184
|
variant: "listBox.selectField",
|
184
185
|
isLoading: isLoadingMore,
|
185
186
|
onLoadMore: onLoadMore
|
186
|
-
}, menuProps)), ___EmotionJSX(DismissButton, {
|
187
|
+
}, menuProps, listBoxProps)), ___EmotionJSX(DismissButton, {
|
187
188
|
onDismiss: function onDismiss() {
|
188
189
|
return state.close();
|
189
190
|
}
|