@atlaskit/link-datasource 0.29.3 → 0.29.5

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.
Files changed (98) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/dist/cjs/hooks/useAssetsClient.js +50 -31
  3. package/dist/cjs/hooks/useObjectSchemas.js +74 -0
  4. package/dist/cjs/hooks/useValidateAqlText.js +42 -13
  5. package/dist/cjs/index.js +7 -1
  6. package/dist/cjs/services/cmdbService.js +17 -8
  7. package/dist/cjs/types/assets/types.js +7 -1
  8. package/dist/cjs/ui/assets-modal/modal/index.js +46 -10
  9. package/dist/cjs/ui/assets-modal/modal/messages.js +5 -0
  10. package/dist/cjs/ui/assets-modal/modal/styled.js +1 -1
  11. package/dist/cjs/ui/assets-modal/search-container/aql-search-input/index.js +161 -0
  12. package/dist/cjs/ui/assets-modal/search-container/aql-search-input/loading-state.js +18 -0
  13. package/dist/cjs/ui/assets-modal/search-container/aql-search-input/messages.js +15 -0
  14. package/dist/cjs/ui/assets-modal/search-container/index.js +50 -0
  15. package/dist/cjs/ui/assets-modal/search-container/loading-state.js +21 -0
  16. package/dist/cjs/ui/assets-modal/search-container/object-schema-select/index.js +103 -0
  17. package/dist/cjs/ui/assets-modal/search-container/object-schema-select/loading-state.js +18 -0
  18. package/dist/cjs/ui/assets-modal/search-container/object-schema-select/messages.js +25 -0
  19. package/dist/cjs/ui/assets-modal/search-container/object-schema-select/utils.js +13 -0
  20. package/dist/cjs/ui/assets-modal/search-container/styled.js +22 -0
  21. package/dist/cjs/version.json +1 -1
  22. package/dist/es2019/hooks/useAssetsClient.js +22 -13
  23. package/dist/es2019/hooks/useObjectSchemas.js +32 -0
  24. package/dist/es2019/hooks/useValidateAqlText.js +26 -9
  25. package/dist/es2019/index.js +1 -0
  26. package/dist/es2019/services/cmdbService.js +14 -6
  27. package/dist/es2019/types/assets/types.js +3 -1
  28. package/dist/es2019/ui/assets-modal/modal/index.js +42 -8
  29. package/dist/es2019/ui/assets-modal/modal/messages.js +5 -0
  30. package/dist/es2019/ui/assets-modal/modal/styled.js +3 -3
  31. package/dist/es2019/ui/assets-modal/search-container/aql-search-input/index.js +129 -0
  32. package/dist/es2019/ui/assets-modal/search-container/aql-search-input/loading-state.js +8 -0
  33. package/dist/es2019/ui/assets-modal/search-container/aql-search-input/messages.js +8 -0
  34. package/dist/es2019/ui/assets-modal/search-container/index.js +46 -0
  35. package/dist/es2019/ui/assets-modal/search-container/loading-state.js +14 -0
  36. package/dist/es2019/ui/assets-modal/search-container/object-schema-select/index.js +65 -0
  37. package/dist/es2019/ui/assets-modal/search-container/object-schema-select/loading-state.js +8 -0
  38. package/dist/es2019/ui/assets-modal/search-container/object-schema-select/messages.js +18 -0
  39. package/dist/es2019/ui/assets-modal/search-container/object-schema-select/utils.js +4 -0
  40. package/dist/es2019/ui/assets-modal/search-container/styled.js +22 -0
  41. package/dist/es2019/version.json +1 -1
  42. package/dist/esm/hooks/useAssetsClient.js +51 -32
  43. package/dist/esm/hooks/useObjectSchemas.js +66 -0
  44. package/dist/esm/hooks/useValidateAqlText.js +42 -13
  45. package/dist/esm/index.js +1 -0
  46. package/dist/esm/services/cmdbService.js +15 -7
  47. package/dist/esm/types/assets/types.js +3 -1
  48. package/dist/esm/ui/assets-modal/modal/index.js +46 -10
  49. package/dist/esm/ui/assets-modal/modal/messages.js +5 -0
  50. package/dist/esm/ui/assets-modal/modal/styled.js +1 -1
  51. package/dist/esm/ui/assets-modal/search-container/aql-search-input/index.js +152 -0
  52. package/dist/esm/ui/assets-modal/search-container/aql-search-input/loading-state.js +10 -0
  53. package/dist/esm/ui/assets-modal/search-container/aql-search-input/messages.js +8 -0
  54. package/dist/esm/ui/assets-modal/search-container/index.js +41 -0
  55. package/dist/esm/ui/assets-modal/search-container/loading-state.js +13 -0
  56. package/dist/esm/ui/assets-modal/search-container/object-schema-select/index.js +94 -0
  57. package/dist/esm/ui/assets-modal/search-container/object-schema-select/loading-state.js +10 -0
  58. package/dist/esm/ui/assets-modal/search-container/object-schema-select/messages.js +18 -0
  59. package/dist/esm/ui/assets-modal/search-container/object-schema-select/utils.js +6 -0
  60. package/dist/esm/ui/assets-modal/search-container/styled.js +11 -0
  61. package/dist/esm/version.json +1 -1
  62. package/dist/types/hooks/useAssetsClient.d.ts +8 -6
  63. package/dist/types/hooks/useObjectSchemas.d.ts +8 -0
  64. package/dist/types/hooks/useValidateAqlText.d.ts +5 -2
  65. package/dist/types/index.d.ts +1 -0
  66. package/dist/types/services/cmdbService.d.ts +4 -3
  67. package/dist/types/types/assets/types.d.ts +21 -10
  68. package/dist/types/ui/assets-modal/modal/messages.d.ts +5 -0
  69. package/dist/types/ui/assets-modal/search-container/aql-search-input/index.d.ts +8 -0
  70. package/dist/types/ui/assets-modal/search-container/aql-search-input/loading-state.d.ts +3 -0
  71. package/dist/types/ui/assets-modal/search-container/aql-search-input/messages.d.ts +7 -0
  72. package/dist/types/ui/assets-modal/search-container/index.d.ts +16 -0
  73. package/dist/types/ui/assets-modal/search-container/loading-state.d.ts +8 -0
  74. package/dist/types/ui/assets-modal/search-container/object-schema-select/index.d.ts +10 -0
  75. package/dist/types/ui/assets-modal/search-container/object-schema-select/loading-state.d.ts +3 -0
  76. package/dist/types/ui/assets-modal/search-container/object-schema-select/messages.d.ts +17 -0
  77. package/dist/types/ui/assets-modal/search-container/object-schema-select/utils.d.ts +2 -0
  78. package/dist/types/ui/assets-modal/search-container/styled.d.ts +19 -0
  79. package/dist/types-ts4.5/hooks/useAssetsClient.d.ts +8 -6
  80. package/dist/types-ts4.5/hooks/useObjectSchemas.d.ts +8 -0
  81. package/dist/types-ts4.5/hooks/useValidateAqlText.d.ts +5 -2
  82. package/dist/types-ts4.5/index.d.ts +1 -0
  83. package/dist/types-ts4.5/services/cmdbService.d.ts +4 -3
  84. package/dist/types-ts4.5/types/assets/types.d.ts +21 -10
  85. package/dist/types-ts4.5/ui/assets-modal/modal/messages.d.ts +5 -0
  86. package/dist/types-ts4.5/ui/assets-modal/search-container/aql-search-input/index.d.ts +8 -0
  87. package/dist/types-ts4.5/ui/assets-modal/search-container/aql-search-input/loading-state.d.ts +3 -0
  88. package/dist/types-ts4.5/ui/assets-modal/search-container/aql-search-input/messages.d.ts +7 -0
  89. package/dist/types-ts4.5/ui/assets-modal/search-container/index.d.ts +16 -0
  90. package/dist/types-ts4.5/ui/assets-modal/search-container/loading-state.d.ts +8 -0
  91. package/dist/types-ts4.5/ui/assets-modal/search-container/object-schema-select/index.d.ts +10 -0
  92. package/dist/types-ts4.5/ui/assets-modal/search-container/object-schema-select/loading-state.d.ts +3 -0
  93. package/dist/types-ts4.5/ui/assets-modal/search-container/object-schema-select/messages.d.ts +17 -0
  94. package/dist/types-ts4.5/ui/assets-modal/search-container/object-schema-select/utils.d.ts +2 -0
  95. package/dist/types-ts4.5/ui/assets-modal/search-container/styled.d.ts +19 -0
  96. package/package.json +4 -2
  97. package/report.api.md +7 -5
  98. package/tmp/api-report-tmp.d.ts +5 -3
@@ -0,0 +1,161 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.SEARCH_DEBOUNCE_MS = exports.AqlSearchInput = void 0;
8
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
9
+ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
10
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
11
+ var _react = require("react");
12
+ var _react2 = require("@emotion/react");
13
+ var _reactIntlNext = require("react-intl-next");
14
+ var _button = _interopRequireDefault(require("@atlaskit/button"));
15
+ var _form = require("@atlaskit/form");
16
+ var _checkCircle = _interopRequireDefault(require("@atlaskit/icon/glyph/check-circle"));
17
+ var _crossCircle = _interopRequireDefault(require("@atlaskit/icon/glyph/cross-circle"));
18
+ var _search = _interopRequireDefault(require("@atlaskit/icon/glyph/editor/search"));
19
+ var _spinner = _interopRequireDefault(require("@atlaskit/spinner"));
20
+ var _textfield = _interopRequireDefault(require("@atlaskit/textfield"));
21
+ var _useValidateAqlText2 = require("../../../../hooks/useValidateAqlText");
22
+ var _types = require("../../../../types/assets/types");
23
+ var _styled = require("../styled");
24
+ var _messages = require("./messages");
25
+ /** @jsx jsx */
26
+
27
+ /* Meta isn't exported in @atlaskit/form
28
+ Taken from packages/design-system/form/src/field.tsx */
29
+
30
+ var searchButtonStyles = (0, _react2.css)({
31
+ marginRight: "var(--ds-space-075, 6px)"
32
+ });
33
+ var SEARCH_DEBOUNCE_MS = 350;
34
+ exports.SEARCH_DEBOUNCE_MS = SEARCH_DEBOUNCE_MS;
35
+ var renderValidatorIcon = function renderValidatorIcon(value, error, meta) {
36
+ if (value && meta !== null && meta !== void 0 && meta.validating) {
37
+ return (0, _react2.jsx)(_spinner.default, {
38
+ size: "medium",
39
+ testId: "assets-datasource-modal--aql-validating"
40
+ });
41
+ }
42
+ if (value && error) {
43
+ return (0, _react2.jsx)(_crossCircle.default, {
44
+ label: "label",
45
+ primaryColor: "red",
46
+ size: "medium",
47
+ testId: "assets-datasource-modal--aql-invalid"
48
+ });
49
+ }
50
+ if (value && meta.valid) {
51
+ return (0, _react2.jsx)(_checkCircle.default, {
52
+ label: "label",
53
+ primaryColor: "green",
54
+ size: "medium",
55
+ testId: "assets-datasource-modal--aql-valid"
56
+ });
57
+ }
58
+ return (0, _react2.jsx)(_search.default, {
59
+ label: "label",
60
+ size: "medium",
61
+ testId: "assets-datasource-modal--aql-idle"
62
+ });
63
+ };
64
+ var AqlSearchInput = function AqlSearchInput(_ref) {
65
+ var value = _ref.value,
66
+ workspaceId = _ref.workspaceId,
67
+ _ref$testId = _ref.testId,
68
+ testId = _ref$testId === void 0 ? 'assets-datasource-modal--aql-search-input' : _ref$testId;
69
+ var _useIntl = (0, _reactIntlNext.useIntl)(),
70
+ formatMessage = _useIntl.formatMessage;
71
+ var timeout = (0, _react.useRef)();
72
+ var lastValue = (0, _react.useRef)(value);
73
+ var lastResult = (0, _react.useRef)(Promise.resolve(undefined));
74
+ var _useValidateAqlText = (0, _useValidateAqlText2.useValidateAqlText)(workspaceId),
75
+ validateAqlText = _useValidateAqlText.validateAqlText;
76
+
77
+ // Validation expects undefined when valid and a string as an error message when invalid
78
+ var handleValidation = (0, _react.useCallback)( /*#__PURE__*/function () {
79
+ var _ref2 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(newUnvalidatedQlQuery) {
80
+ var isValid;
81
+ return _regenerator.default.wrap(function _callee$(_context) {
82
+ while (1) switch (_context.prev = _context.next) {
83
+ case 0:
84
+ if (newUnvalidatedQlQuery) {
85
+ _context.next = 2;
86
+ break;
87
+ }
88
+ return _context.abrupt("return", undefined);
89
+ case 2:
90
+ _context.next = 4;
91
+ return validateAqlText(newUnvalidatedQlQuery);
92
+ case 4:
93
+ isValid = _context.sent;
94
+ return _context.abrupt("return", isValid ? undefined : 'invalid');
95
+ case 6:
96
+ case "end":
97
+ return _context.stop();
98
+ }
99
+ }, _callee);
100
+ }));
101
+ return function (_x) {
102
+ return _ref2.apply(this, arguments);
103
+ };
104
+ }(), [validateAqlText]);
105
+
106
+ /* Debounce async validation for input, validation is also called on every field change
107
+ in a form so we need to also memoize. The async validate function is expected to either:
108
+ Immediately return a promise (which is then collected into an array, every single time validation is run),
109
+ or immediately return either undefined or an error message */
110
+ var debouncedMemoizedValidation = function debouncedMemoizedValidation(value) {
111
+ return new Promise(function (resolve) {
112
+ if (timeout.current) {
113
+ timeout.current();
114
+ }
115
+ if (value !== lastValue.current) {
116
+ var timerId = setTimeout(function () {
117
+ lastValue.current = value;
118
+ lastResult.current = handleValidation(value);
119
+ resolve(lastResult.current);
120
+ }, SEARCH_DEBOUNCE_MS);
121
+ timeout.current = function () {
122
+ clearTimeout(timerId);
123
+ resolve('debouncing');
124
+ };
125
+ } else {
126
+ resolve(lastResult.current);
127
+ }
128
+ });
129
+ };
130
+ return (0, _react2.jsx)(_styled.FieldContainer, null, (0, _react2.jsx)(_form.Field, {
131
+ name: _types.aqlKey,
132
+ defaultValue: value,
133
+ validate: debouncedMemoizedValidation
134
+ }, function (_ref3) {
135
+ var fieldProps = _ref3.fieldProps,
136
+ meta = _ref3.meta,
137
+ error = _ref3.error;
138
+ return (0, _react2.jsx)(_textfield.default, (0, _extends2.default)({}, fieldProps, {
139
+ elemBeforeInput: (0, _react2.jsx)("span", {
140
+ style: {
141
+ paddingLeft: 6,
142
+ width: 24
143
+ }
144
+ }, renderValidatorIcon(fieldProps.value, error, meta)),
145
+ elemAfterInput: (0, _react2.jsx)(_button.default, {
146
+ appearance: "primary",
147
+ css: searchButtonStyles,
148
+ iconBefore: (0, _react2.jsx)(_search.default, {
149
+ label: formatMessage(_messages.searchInputMessages.placeholder),
150
+ size: "medium"
151
+ }),
152
+ spacing: "none",
153
+ testId: "assets-datasource-modal--aql-search-button",
154
+ type: "submit"
155
+ }),
156
+ placeholder: formatMessage(_messages.searchInputMessages.placeholder),
157
+ testId: testId
158
+ }));
159
+ }));
160
+ };
161
+ exports.AqlSearchInput = AqlSearchInput;
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.AssetsAqlSearchInputSkeleton = void 0;
7
+ var _react = require("@emotion/react");
8
+ var _linkingCommon = require("@atlaskit/linking-common");
9
+ /** @jsx jsx */
10
+
11
+ var AssetsAqlSearchInputSkeleton = function AssetsAqlSearchInputSkeleton() {
12
+ return (0, _react.jsx)(_linkingCommon.Skeleton, {
13
+ width: "100%",
14
+ height: "40px",
15
+ testId: "assets-datasource-modal--aql-search-input-skeleton"
16
+ });
17
+ };
18
+ exports.AssetsAqlSearchInputSkeleton = AssetsAqlSearchInputSkeleton;
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.searchInputMessages = void 0;
7
+ var _reactIntlNext = require("react-intl-next");
8
+ var searchInputMessages = (0, _reactIntlNext.defineMessages)({
9
+ placeholder: {
10
+ id: 'linkDataSource.assets.configModal.aqlSearchInput.placeholder',
11
+ description: 'Display text for AQL search button',
12
+ defaultMessage: 'Search via AQL'
13
+ }
14
+ });
15
+ exports.searchInputMessages = searchInputMessages;
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.AssetsSearchContainer = void 0;
8
+ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
9
+ var _react = require("@emotion/react");
10
+ var _form = _interopRequireDefault(require("@atlaskit/form"));
11
+ var _aqlSearchInput = require("./aql-search-input");
12
+ var _objectSchemaSelect = require("./object-schema-select");
13
+ var _styled = require("./styled");
14
+ /** @jsx jsx */
15
+
16
+ var DEFAULT_AQL_QUERY = '';
17
+ var SEARCH_FORM_ID = 'linkDataSource.assets.configModal.searchContainer-form';
18
+ var AssetsSearchContainer = function AssetsSearchContainer(props) {
19
+ var onSearch = props.onSearch,
20
+ workspaceId = props.workspaceId,
21
+ initialSearchData = props.initialSearchData,
22
+ modalTitle = props.modalTitle;
23
+ var onFormSubmit = function onFormSubmit(searchFormValues) {
24
+ var aql = searchFormValues.aql,
25
+ objectSchema = searchFormValues.objectSchema;
26
+ if (objectSchema) {
27
+ // Pass the validated aql and object schema back to modal
28
+ onSearch(aql, objectSchema.value);
29
+ }
30
+ };
31
+ return (0, _react.jsx)(_form.default, {
32
+ onSubmit: onFormSubmit
33
+ }, function (_ref) {
34
+ var _initialSearchData$ob, _initialSearchData$aq;
35
+ var formProps = _ref.formProps;
36
+ return (0, _react.jsx)(_styled.FormContainer, (0, _extends2.default)({}, formProps, {
37
+ id: SEARCH_FORM_ID
38
+ }), (0, _react.jsx)(_styled.FormRowContainer, {
39
+ isNarrowGap: true
40
+ }, modalTitle, (0, _react.jsx)(_styled.SchemaSelectContainer, null, (0, _react.jsx)(_objectSchemaSelect.AssetsObjectSchemaSelect, {
41
+ value: (_initialSearchData$ob = initialSearchData.objectSchema) !== null && _initialSearchData$ob !== void 0 ? _initialSearchData$ob : undefined,
42
+ workspaceId: workspaceId,
43
+ classNamePrefix: "assets-datasource-modal--object-schema-select"
44
+ }))), (0, _react.jsx)(_styled.FormRowContainer, null, (0, _react.jsx)(_aqlSearchInput.AqlSearchInput, {
45
+ value: (_initialSearchData$aq = initialSearchData.aql) !== null && _initialSearchData$aq !== void 0 ? _initialSearchData$aq : DEFAULT_AQL_QUERY,
46
+ workspaceId: workspaceId
47
+ })));
48
+ });
49
+ };
50
+ exports.AssetsSearchContainer = AssetsSearchContainer;
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.AssetsSearchContainerLoading = void 0;
7
+ var _react = require("@emotion/react");
8
+ var _loadingState = require("./aql-search-input/loading-state");
9
+ var _loadingState2 = require("./object-schema-select/loading-state");
10
+ var _styled = require("./styled");
11
+ /** @jsx jsx */
12
+
13
+ var AssetsSearchContainerLoading = function AssetsSearchContainerLoading(_ref) {
14
+ var modalTitle = _ref.modalTitle;
15
+ return (0, _react.jsx)(_styled.FormContainer, {
16
+ "data-testid": "assets-datasource-modal--search-container-skeleton"
17
+ }, (0, _react.jsx)(_styled.FormRowContainer, {
18
+ isNarrowGap: true
19
+ }, modalTitle, (0, _react.jsx)(_styled.SchemaSelectContainer, null, (0, _react.jsx)(_loadingState2.AssetsObjectSchemaSelectSkeleton, null))), (0, _react.jsx)(_styled.FormRowContainer, null, (0, _react.jsx)(_loadingState.AssetsAqlSearchInputSkeleton, null)));
20
+ };
21
+ exports.AssetsSearchContainerLoading = AssetsSearchContainerLoading;
@@ -0,0 +1,103 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.SEARCH_DEBOUNCE_MS = exports.AssetsObjectSchemaSelect = void 0;
8
+ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
9
+ var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
10
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
11
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
12
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
13
+ var _react = require("react");
14
+ var _react2 = require("@emotion/react");
15
+ var _debouncePromise = _interopRequireDefault(require("debounce-promise"));
16
+ var _reactIntlNext = require("react-intl-next");
17
+ var _form = require("@atlaskit/form");
18
+ var _select = require("@atlaskit/select");
19
+ var _useObjectSchemas2 = require("../../../../hooks/useObjectSchemas");
20
+ var _types = require("../../../../types/assets/types");
21
+ var _styled = require("../styled");
22
+ var _messages = require("./messages");
23
+ var _utils = require("./utils");
24
+ var _excluded = ["onChange", "onFocus"];
25
+ /** @jsx jsx */
26
+ var SEARCH_DEBOUNCE_MS = 350;
27
+ exports.SEARCH_DEBOUNCE_MS = SEARCH_DEBOUNCE_MS;
28
+ var AssetsObjectSchemaSelect = function AssetsObjectSchemaSelect(_ref) {
29
+ var value = _ref.value,
30
+ workspaceId = _ref.workspaceId,
31
+ _ref$classNamePrefix = _ref.classNamePrefix,
32
+ classNamePrefix = _ref$classNamePrefix === void 0 ? 'assets-datasource-modal--object-schema-select' : _ref$classNamePrefix;
33
+ var _useIntl = (0, _reactIntlNext.useIntl)(),
34
+ formatMessage = _useIntl.formatMessage;
35
+ var _useObjectSchemas = (0, _useObjectSchemas2.useObjectSchemas)(workspaceId),
36
+ fetchObjectSchemas = _useObjectSchemas.fetchObjectSchemas,
37
+ objectSchemasLoading = _useObjectSchemas.objectSchemasLoading;
38
+ var _useState = (0, _react.useState)(undefined),
39
+ _useState2 = (0, _slicedToArray2.default)(_useState, 2),
40
+ defaultOptions = _useState2[0],
41
+ setDefaultOptions = _useState2[1];
42
+ var selectedObjectSchema = value ? (0, _utils.objectSchemaToSelectOption)(value) : undefined;
43
+ var loadOptions = /*#__PURE__*/function () {
44
+ var _ref2 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(inputValue) {
45
+ var objectSchemas, options;
46
+ return _regenerator.default.wrap(function _callee$(_context) {
47
+ while (1) switch (_context.prev = _context.next) {
48
+ case 0:
49
+ _context.next = 2;
50
+ return fetchObjectSchemas(inputValue);
51
+ case 2:
52
+ objectSchemas = _context.sent;
53
+ options = objectSchemas ? objectSchemas.map(function (objectSchema) {
54
+ return (0, _utils.objectSchemaToSelectOption)(objectSchema);
55
+ }) : [];
56
+ return _context.abrupt("return", options);
57
+ case 5:
58
+ case "end":
59
+ return _context.stop();
60
+ }
61
+ }, _callee);
62
+ }));
63
+ return function loadOptions(_x) {
64
+ return _ref2.apply(this, arguments);
65
+ };
66
+ }();
67
+ var debouncedLoadOptions = (0, _debouncePromise.default)(loadOptions, SEARCH_DEBOUNCE_MS);
68
+ var validateSchema = function validateSchema(value) {
69
+ if (!value || !value.value) {
70
+ return formatMessage(_messages.objectSchemaSelectMessages.schemaRequired);
71
+ }
72
+ return undefined;
73
+ };
74
+ return (0, _react2.jsx)(_styled.FieldContainer, null, (0, _react2.jsx)(_form.Field, {
75
+ name: _types.objectSchemaKey,
76
+ defaultValue: selectedObjectSchema,
77
+ validate: function validate(value) {
78
+ return validateSchema(value);
79
+ }
80
+ }, function (_ref3) {
81
+ var _ref3$fieldProps = _ref3.fieldProps,
82
+ _onChange = _ref3$fieldProps.onChange,
83
+ onFocus = _ref3$fieldProps.onFocus,
84
+ restFieldProps = (0, _objectWithoutProperties2.default)(_ref3$fieldProps, _excluded);
85
+ return (0, _react2.jsx)(_select.AsyncSelect, (0, _extends2.default)({
86
+ classNamePrefix: classNamePrefix,
87
+ isLoading: objectSchemasLoading,
88
+ defaultOptions: defaultOptions || [],
89
+ isSearchable: true,
90
+ loadOptions: debouncedLoadOptions,
91
+ placeholder: formatMessage(_messages.objectSchemaSelectMessages.placeholder),
92
+ onChange: function onChange(newOption) {
93
+ return newOption && _onChange(newOption);
94
+ },
95
+ onFocus: function onFocus() {
96
+ if (!defaultOptions) {
97
+ loadOptions('').then(setDefaultOptions);
98
+ }
99
+ }
100
+ }, restFieldProps));
101
+ }));
102
+ };
103
+ exports.AssetsObjectSchemaSelect = AssetsObjectSchemaSelect;
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.AssetsObjectSchemaSelectSkeleton = void 0;
7
+ var _react = require("@emotion/react");
8
+ var _linkingCommon = require("@atlaskit/linking-common");
9
+ /** @jsx jsx */
10
+
11
+ var AssetsObjectSchemaSelectSkeleton = function AssetsObjectSchemaSelectSkeleton() {
12
+ return (0, _react.jsx)(_linkingCommon.Skeleton, {
13
+ width: "100%",
14
+ height: "40px",
15
+ testId: "assets-datasource-modal--object-schema-select-skeleton"
16
+ });
17
+ };
18
+ exports.AssetsObjectSchemaSelectSkeleton = AssetsObjectSchemaSelectSkeleton;
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.objectSchemaSelectMessages = void 0;
7
+ var _reactIntlNext = require("react-intl-next");
8
+ var objectSchemaSelectMessages = (0, _reactIntlNext.defineMessages)({
9
+ label: {
10
+ id: 'linkDataSource.assets.configModal.objectSchemaSelect.label',
11
+ description: 'Label text for a select input where users can choose an Assets object schema to use',
12
+ defaultMessage: 'Select schema'
13
+ },
14
+ placeholder: {
15
+ id: 'linkDataSource.assets.configModal.objectSchemaSelect.placeholder',
16
+ description: 'Placeholder text for a select input where users can choose an Assets object schema to use',
17
+ defaultMessage: 'Select schema'
18
+ },
19
+ schemaRequired: {
20
+ id: 'linkDataSource.assets.configModal.objectSchemaSelect.schemaRequired',
21
+ description: 'Validation message displayed to the user when the select is blank',
22
+ defaultMessage: 'Schema is required'
23
+ }
24
+ });
25
+ exports.objectSchemaSelectMessages = objectSchemaSelectMessages;
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.objectSchemaToSelectOption = void 0;
7
+ var objectSchemaToSelectOption = function objectSchemaToSelectOption(objectSchema) {
8
+ return {
9
+ label: objectSchema.name,
10
+ value: objectSchema.id
11
+ };
12
+ };
13
+ exports.objectSchemaToSelectOption = objectSchemaToSelectOption;
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.SchemaSelectContainer = exports.FormRowContainer = exports.FormContainer = exports.FieldContainer = void 0;
8
+ var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
9
+ var _styled = _interopRequireDefault(require("@emotion/styled"));
10
+ var _templateObject, _templateObject2, _templateObject3, _templateObject4;
11
+ var FormRowContainer = _styled.default.div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2.default)(["\n align-items: center;\n display: flex;\n gap: ", ";\n flex-grow: 1;\n width: 100%;\n"])), function (props) {
12
+ return props.isNarrowGap ? "var(--ds-space-100, 8px)" : "var(--ds-space-200, 16px)";
13
+ });
14
+ exports.FormRowContainer = FormRowContainer;
15
+ var FormContainer = _styled.default.form(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2.default)(["\n display: grid;\n row-gap: ", ";\n width: 100%;\n"])), "var(--ds-space-200, 16px)");
16
+
17
+ // Override the top margin of fields
18
+ exports.FormContainer = FormContainer;
19
+ var FieldContainer = _styled.default.div(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2.default)(["\n flex: 1;\n margin-top: calc(-1 * ", ");\n"])), "var(--ds-space-100, 8px)");
20
+ exports.FieldContainer = FieldContainer;
21
+ var SchemaSelectContainer = _styled.default.div(_templateObject4 || (_templateObject4 = (0, _taggedTemplateLiteral2.default)(["\n width: 200px;\n"])));
22
+ exports.SchemaSelectContainer = SchemaSelectContainer;
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@atlaskit/link-datasource",
3
- "version": "0.29.3",
3
+ "version": "0.29.5",
4
4
  "sideEffects": false
5
5
  }
@@ -1,32 +1,41 @@
1
1
  import { useEffect, useState } from 'react';
2
- import { fetchObjectSchemas, getWorkspaceId } from '../services/cmdbService';
3
- // TODO: Pass in localhost:3000 for testing locally - remember to remove this code after
4
- // You must also have a proxy server running to forward requests from http://localhost:3000 to a JSM premium url
5
- export const useAssetsClient = hostname => {
6
- const [objectSchemas, setObjectSchemas] = useState();
2
+ import { fetchObjectSchema, getWorkspaceId } from '../services/cmdbService';
3
+ export const useAssetsClient = initialParameters => {
4
+ const [loading, setLoading] = useState(false);
7
5
  const [workspaceId, setWorkspaceId] = useState();
6
+ const [objectSchema, setObjectSchema] = useState();
8
7
  const [error, setError] = useState();
9
8
  useEffect(() => {
10
9
  (async () => {
10
+ setLoading(true);
11
+ setError(undefined);
11
12
  try {
12
- const workspaceId = await getWorkspaceId(hostname);
13
- const objectSchemasResponse = await fetchObjectSchemas(workspaceId, hostname);
13
+ const workspaceId = await getWorkspaceId();
14
14
  setWorkspaceId(workspaceId);
15
- setObjectSchemas(objectSchemasResponse.values);
15
+ // Check schema from initial parameters still exists and fetch name for schema select
16
+ if (initialParameters !== null && initialParameters !== void 0 && initialParameters.schemaId) {
17
+ try {
18
+ const fetchedObjectSchema = await fetchObjectSchema(workspaceId, initialParameters === null || initialParameters === void 0 ? void 0 : initialParameters.schemaId);
19
+ setObjectSchema(fetchedObjectSchema);
20
+ } catch {
21
+ // Could update this to check if status is 404 and set objectSchemaError
22
+ }
23
+ }
16
24
  } catch (err) {
17
25
  if (err instanceof Error) {
18
26
  setError(err);
19
27
  } else {
20
28
  setError(new Error('Unexpected error occured'));
21
- // eslint-disable-next-line no-console
22
- console.error(err);
23
29
  }
30
+ } finally {
31
+ setLoading(false);
24
32
  }
25
33
  })();
26
- }, [hostname]);
34
+ }, [initialParameters]);
27
35
  return {
28
36
  workspaceId,
29
- objectSchemas,
30
- error
37
+ workspaceError: error,
38
+ objectSchema,
39
+ assetsClientLoading: loading
31
40
  };
32
41
  };
@@ -0,0 +1,32 @@
1
+ import { useCallback, useState } from 'react';
2
+ import { fetchObjectSchemas } from '../services/cmdbService';
3
+ export const useObjectSchemas = workspaceId => {
4
+ const [loading, setLoading] = useState(false);
5
+ const [objectSchemas, setObjectSchemas] = useState();
6
+ const [error, setError] = useState();
7
+ const request = useCallback(async query => {
8
+ setLoading(true);
9
+ setError(undefined);
10
+ let fetchedObjectSchemas;
11
+ try {
12
+ const fetchedObjectSchemasResponse = await fetchObjectSchemas(workspaceId, query);
13
+ setObjectSchemas(fetchedObjectSchemasResponse.values);
14
+ fetchedObjectSchemas = fetchedObjectSchemasResponse.values;
15
+ } catch (err) {
16
+ if (err instanceof Error) {
17
+ setError(err);
18
+ } else {
19
+ setError(new Error('Unexpected error occured'));
20
+ }
21
+ } finally {
22
+ setLoading(false);
23
+ }
24
+ return fetchedObjectSchemas;
25
+ }, [workspaceId]);
26
+ return {
27
+ objectSchemasLoading: loading,
28
+ objectSchemasError: error,
29
+ objectSchemas,
30
+ fetchObjectSchemas: request
31
+ };
32
+ };
@@ -1,17 +1,34 @@
1
1
  import { useCallback, useState } from 'react';
2
2
  import { validateAql } from '../services/cmdbService';
3
3
  export const useValidateAqlText = (workspaceId, hostname) => {
4
- const [isLoading, setIsLoading] = useState(false);
4
+ const [loading, setLoading] = useState(false);
5
+ const [isValidAqlText, setIsValidAqlText] = useState(false);
6
+ const [error, setError] = useState();
5
7
  const validateAqlText = useCallback(async aql => {
6
- setIsLoading(true);
7
- const validateAqlResponse = await validateAql(workspaceId, {
8
- qlQuery: aql
9
- }, hostname);
10
- setIsLoading(false);
11
- return validateAqlResponse.isValid;
12
- }, [hostname, workspaceId]);
8
+ setLoading(true);
9
+ setError(undefined);
10
+ let isValid = false;
11
+ try {
12
+ const validateAqlResponse = await validateAql(workspaceId, {
13
+ qlQuery: aql
14
+ });
15
+ setIsValidAqlText(validateAqlResponse.isValid);
16
+ isValid = validateAqlResponse.isValid;
17
+ } catch (err) {
18
+ if (err instanceof Error) {
19
+ setError(err);
20
+ } else {
21
+ setError(new Error('Unexpected error occured'));
22
+ }
23
+ } finally {
24
+ setLoading(false);
25
+ }
26
+ return isValid;
27
+ }, [workspaceId]);
13
28
  return {
29
+ isValidAqlText,
14
30
  validateAqlText,
15
- isLoading
31
+ validateAqlTextLoading: loading,
32
+ validateAqlTextError: error
16
33
  };
17
34
  };
@@ -1,4 +1,5 @@
1
1
  export { default as JiraIssuesConfigModal } from './ui/jira-issues-modal';
2
+ export { default as AssetsConfigModal } from './ui/assets-modal';
2
3
  export { default as DatasourceTableView } from './ui/datasource-table-view';
3
4
  export { default as JSMAssetsConfigModal } from './ui/assets-modal';
4
5
  export { JIRA_LIST_OF_LINKS_DATASOURCE_ID } from './ui/jira-issues-modal';
@@ -1,21 +1,29 @@
1
1
  import { request } from '@atlaskit/linking-common';
2
- export const getWorkspaceId = async hostname => {
2
+ export const getWorkspaceId = async () => {
3
3
  var _workspaceDetailsResp;
4
- const url = `${hostname || ''}/rest/servicedesk/cmdb/latest/workspace`;
4
+ const url = '/rest/servicedesk/cmdb/latest/workspace';
5
5
  const workspaceDetailsResponse = await request('get', url, undefined, undefined, [200, 201, 202, 203, 204]);
6
6
  if (!((_workspaceDetailsResp = workspaceDetailsResponse.results) !== null && _workspaceDetailsResp !== void 0 && _workspaceDetailsResp.length)) {
7
7
  throw new Error('No workspace results found');
8
8
  }
9
9
  return workspaceDetailsResponse.results[0].id;
10
10
  };
11
- export const validateAql = (workspaceId, data, hostname) => {
12
- const url = `${hostname || ''}/gateway/api/jsm/assets/workspace/${workspaceId}/v1/aql/validate`;
11
+ export const validateAql = (workspaceId, data) => {
12
+ const url = `/gateway/api/jsm/assets/workspace/${workspaceId}/v1/aql/validate`;
13
13
  return request('post', url, {
14
14
  qlQuery: data.qlQuery,
15
15
  context: 'SMART_LINKS'
16
16
  }, undefined, [200, 201, 202, 203, 204]);
17
17
  };
18
- export const fetchObjectSchemas = (workspaceId, hostname) => {
19
- const url = `${hostname || ''}/gateway/api/jsm/assets/workspace/${workspaceId}/v1/objectschema/list?maxResults=100`;
18
+ export const fetchObjectSchema = (workspaceId, schemaId) => {
19
+ const url = `/gateway/api/jsm/assets/workspace/${workspaceId}/v1/objectschema/${schemaId}`;
20
+ return request('get', url, undefined, undefined, [200, 201, 202, 203, 204]);
21
+ };
22
+ export const fetchObjectSchemas = (workspaceId, query) => {
23
+ const queryParams = new URLSearchParams();
24
+ queryParams.set('maxResults', '20');
25
+ queryParams.set('includeCounts', 'false');
26
+ query && queryParams.set('query', query);
27
+ const url = `/gateway/api/jsm/assets/workspace/${workspaceId}/v1/objectschema/list?${queryParams}`;
20
28
  return request('get', url, undefined, undefined, [200, 201, 202, 203, 204]);
21
29
  };
@@ -1 +1,3 @@
1
- export {};
1
+ // These are to enforce the field "name" property and keep everything typed
2
+ export const objectSchemaKey = 'objectSchema';
3
+ export const aqlKey = 'aql';