@atlaskit/link-datasource 0.29.4 → 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 (91) hide show
  1. package/CHANGELOG.md +7 -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/services/cmdbService.js +17 -8
  6. package/dist/cjs/types/assets/types.js +7 -1
  7. package/dist/cjs/ui/assets-modal/modal/index.js +46 -10
  8. package/dist/cjs/ui/assets-modal/modal/messages.js +5 -0
  9. package/dist/cjs/ui/assets-modal/modal/styled.js +1 -1
  10. package/dist/cjs/ui/assets-modal/search-container/aql-search-input/index.js +161 -0
  11. package/dist/cjs/ui/assets-modal/search-container/aql-search-input/loading-state.js +18 -0
  12. package/dist/cjs/ui/assets-modal/search-container/aql-search-input/messages.js +15 -0
  13. package/dist/cjs/ui/assets-modal/search-container/index.js +50 -0
  14. package/dist/cjs/ui/assets-modal/search-container/loading-state.js +21 -0
  15. package/dist/cjs/ui/assets-modal/search-container/object-schema-select/index.js +103 -0
  16. package/dist/cjs/ui/assets-modal/search-container/object-schema-select/loading-state.js +18 -0
  17. package/dist/cjs/ui/assets-modal/search-container/object-schema-select/messages.js +25 -0
  18. package/dist/cjs/ui/assets-modal/search-container/object-schema-select/utils.js +13 -0
  19. package/dist/cjs/ui/assets-modal/search-container/styled.js +22 -0
  20. package/dist/cjs/version.json +1 -1
  21. package/dist/es2019/hooks/useAssetsClient.js +22 -13
  22. package/dist/es2019/hooks/useObjectSchemas.js +32 -0
  23. package/dist/es2019/hooks/useValidateAqlText.js +26 -9
  24. package/dist/es2019/services/cmdbService.js +14 -6
  25. package/dist/es2019/types/assets/types.js +3 -1
  26. package/dist/es2019/ui/assets-modal/modal/index.js +42 -8
  27. package/dist/es2019/ui/assets-modal/modal/messages.js +5 -0
  28. package/dist/es2019/ui/assets-modal/modal/styled.js +3 -3
  29. package/dist/es2019/ui/assets-modal/search-container/aql-search-input/index.js +129 -0
  30. package/dist/es2019/ui/assets-modal/search-container/aql-search-input/loading-state.js +8 -0
  31. package/dist/es2019/ui/assets-modal/search-container/aql-search-input/messages.js +8 -0
  32. package/dist/es2019/ui/assets-modal/search-container/index.js +46 -0
  33. package/dist/es2019/ui/assets-modal/search-container/loading-state.js +14 -0
  34. package/dist/es2019/ui/assets-modal/search-container/object-schema-select/index.js +65 -0
  35. package/dist/es2019/ui/assets-modal/search-container/object-schema-select/loading-state.js +8 -0
  36. package/dist/es2019/ui/assets-modal/search-container/object-schema-select/messages.js +18 -0
  37. package/dist/es2019/ui/assets-modal/search-container/object-schema-select/utils.js +4 -0
  38. package/dist/es2019/ui/assets-modal/search-container/styled.js +22 -0
  39. package/dist/es2019/version.json +1 -1
  40. package/dist/esm/hooks/useAssetsClient.js +51 -32
  41. package/dist/esm/hooks/useObjectSchemas.js +66 -0
  42. package/dist/esm/hooks/useValidateAqlText.js +42 -13
  43. package/dist/esm/services/cmdbService.js +15 -7
  44. package/dist/esm/types/assets/types.js +3 -1
  45. package/dist/esm/ui/assets-modal/modal/index.js +46 -10
  46. package/dist/esm/ui/assets-modal/modal/messages.js +5 -0
  47. package/dist/esm/ui/assets-modal/modal/styled.js +1 -1
  48. package/dist/esm/ui/assets-modal/search-container/aql-search-input/index.js +152 -0
  49. package/dist/esm/ui/assets-modal/search-container/aql-search-input/loading-state.js +10 -0
  50. package/dist/esm/ui/assets-modal/search-container/aql-search-input/messages.js +8 -0
  51. package/dist/esm/ui/assets-modal/search-container/index.js +41 -0
  52. package/dist/esm/ui/assets-modal/search-container/loading-state.js +13 -0
  53. package/dist/esm/ui/assets-modal/search-container/object-schema-select/index.js +94 -0
  54. package/dist/esm/ui/assets-modal/search-container/object-schema-select/loading-state.js +10 -0
  55. package/dist/esm/ui/assets-modal/search-container/object-schema-select/messages.js +18 -0
  56. package/dist/esm/ui/assets-modal/search-container/object-schema-select/utils.js +6 -0
  57. package/dist/esm/ui/assets-modal/search-container/styled.js +11 -0
  58. package/dist/esm/version.json +1 -1
  59. package/dist/types/hooks/useAssetsClient.d.ts +8 -6
  60. package/dist/types/hooks/useObjectSchemas.d.ts +8 -0
  61. package/dist/types/hooks/useValidateAqlText.d.ts +5 -2
  62. package/dist/types/services/cmdbService.d.ts +4 -3
  63. package/dist/types/types/assets/types.d.ts +21 -10
  64. package/dist/types/ui/assets-modal/modal/messages.d.ts +5 -0
  65. package/dist/types/ui/assets-modal/search-container/aql-search-input/index.d.ts +8 -0
  66. package/dist/types/ui/assets-modal/search-container/aql-search-input/loading-state.d.ts +3 -0
  67. package/dist/types/ui/assets-modal/search-container/aql-search-input/messages.d.ts +7 -0
  68. package/dist/types/ui/assets-modal/search-container/index.d.ts +16 -0
  69. package/dist/types/ui/assets-modal/search-container/loading-state.d.ts +8 -0
  70. package/dist/types/ui/assets-modal/search-container/object-schema-select/index.d.ts +10 -0
  71. package/dist/types/ui/assets-modal/search-container/object-schema-select/loading-state.d.ts +3 -0
  72. package/dist/types/ui/assets-modal/search-container/object-schema-select/messages.d.ts +17 -0
  73. package/dist/types/ui/assets-modal/search-container/object-schema-select/utils.d.ts +2 -0
  74. package/dist/types/ui/assets-modal/search-container/styled.d.ts +19 -0
  75. package/dist/types-ts4.5/hooks/useAssetsClient.d.ts +8 -6
  76. package/dist/types-ts4.5/hooks/useObjectSchemas.d.ts +8 -0
  77. package/dist/types-ts4.5/hooks/useValidateAqlText.d.ts +5 -2
  78. package/dist/types-ts4.5/services/cmdbService.d.ts +4 -3
  79. package/dist/types-ts4.5/types/assets/types.d.ts +21 -10
  80. package/dist/types-ts4.5/ui/assets-modal/modal/messages.d.ts +5 -0
  81. package/dist/types-ts4.5/ui/assets-modal/search-container/aql-search-input/index.d.ts +8 -0
  82. package/dist/types-ts4.5/ui/assets-modal/search-container/aql-search-input/loading-state.d.ts +3 -0
  83. package/dist/types-ts4.5/ui/assets-modal/search-container/aql-search-input/messages.d.ts +7 -0
  84. package/dist/types-ts4.5/ui/assets-modal/search-container/index.d.ts +16 -0
  85. package/dist/types-ts4.5/ui/assets-modal/search-container/loading-state.d.ts +8 -0
  86. package/dist/types-ts4.5/ui/assets-modal/search-container/object-schema-select/index.d.ts +10 -0
  87. package/dist/types-ts4.5/ui/assets-modal/search-container/object-schema-select/loading-state.d.ts +3 -0
  88. package/dist/types-ts4.5/ui/assets-modal/search-container/object-schema-select/messages.d.ts +17 -0
  89. package/dist/types-ts4.5/ui/assets-modal/search-container/object-schema-select/utils.d.ts +2 -0
  90. package/dist/types-ts4.5/ui/assets-modal/search-container/styled.d.ts +19 -0
  91. package/package.json +4 -2
@@ -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.4",
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,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';
@@ -6,9 +6,13 @@ import Button from '@atlaskit/button/standard-button';
6
6
  import Modal, { ModalBody, ModalFooter, ModalHeader, ModalTitle, ModalTransition } from '@atlaskit/modal-dialog';
7
7
  import { useAssetsClient } from '../../../hooks/useAssetsClient';
8
8
  import { useDatasourceTableState } from '../../../hooks/useDatasourceTableState';
9
+ import { ModalLoadingError } from '../../common/error-state/modal-loading-error';
10
+ import { AssetsSearchContainer } from '../search-container';
11
+ import { AssetsSearchContainerLoading } from '../search-container/loading-state';
9
12
  import { modalMessages } from './messages';
10
13
  import { RenderAssetsContent } from './render-assets-content';
11
14
  import { ModalContentContainer } from './styled';
15
+ const AssetsModalTitle = jsx(ModalTitle, null, jsx(FormattedMessage, modalMessages.insertObjectsTitle));
12
16
  export const AssetsConfigModal = props => {
13
17
  const {
14
18
  datasourceId,
@@ -17,16 +21,22 @@ export const AssetsConfigModal = props => {
17
21
  onInsert,
18
22
  visibleColumnKeys: initialVisibleColumnKeys
19
23
  } = props;
20
- const [aql] = useState(initialParameters === null || initialParameters === void 0 ? void 0 : initialParameters.aql);
21
- const [schemaId] = useState(initialParameters === null || initialParameters === void 0 ? void 0 : initialParameters.schemaId);
24
+ const [aql, setAql] = useState(initialParameters === null || initialParameters === void 0 ? void 0 : initialParameters.aql);
25
+ const [schemaId, setSchemaId] = useState(initialParameters === null || initialParameters === void 0 ? void 0 : initialParameters.schemaId);
22
26
  const [visibleColumnKeys, setVisibleColumnKeys] = useState(initialVisibleColumnKeys);
27
+
28
+ // If a workspaceError occurs this is a critical error
23
29
  const {
24
- workspaceId
25
- } = useAssetsClient();
30
+ workspaceId,
31
+ workspaceError,
32
+ objectSchema,
33
+ assetsClientLoading
34
+ } = useAssetsClient(initialParameters);
26
35
  const parameters = useMemo(() => ({
27
36
  aql: aql || '',
28
37
  schemaId: schemaId || '',
29
- workspaceId: '' /* TODO FLY-1240: Add workspace Id */
38
+ workspaceId: '',
39
+ cloudId: ''
30
40
  }), [aql, schemaId]);
31
41
  const {
32
42
  status,
@@ -40,7 +50,7 @@ export const AssetsConfigModal = props => {
40
50
  const newVisibleColumnKeys = !initialVisibleColumnKeys || (initialVisibleColumnKeys || []).length === 0 ? defaultVisibleColumnKeys : initialVisibleColumnKeys;
41
51
  setVisibleColumnKeys(newVisibleColumnKeys);
42
52
  }, [initialVisibleColumnKeys, defaultVisibleColumnKeys]);
43
- const isDisabled = status === 'rejected' || status === 'loading' || status === 'empty' || !aql || !workspaceId || !schemaId;
53
+ const isDisabled = status === 'rejected' || status === 'loading' || status === 'empty' || !!workspaceError || assetsClientLoading || !aql || !schemaId;
44
54
  const retrieveUrlForSmartCardRender = useCallback(() => {
45
55
  var _data$key, _data$key$data;
46
56
  const [data] = responseItems;
@@ -48,7 +58,7 @@ export const AssetsConfigModal = props => {
48
58
  return data === null || data === void 0 ? void 0 : (_data$key = data.key) === null || _data$key === void 0 ? void 0 : (_data$key$data = _data$key.data) === null || _data$key$data === void 0 ? void 0 : _data$key$data.url;
49
59
  }, [responseItems]);
50
60
  const onInsertPressed = useCallback(() => {
51
- if (!aql) {
61
+ if (!aql || !schemaId) {
52
62
  return;
53
63
  }
54
64
  const firstAssetUrl = retrieveUrlForSmartCardRender();
@@ -84,12 +94,36 @@ export const AssetsConfigModal = props => {
84
94
  });
85
95
  }
86
96
  }, [aql, datasourceId, onInsert, responseItems.length, retrieveUrlForSmartCardRender, schemaId, visibleColumnKeys]);
97
+ const handleOnSearch = useCallback((aql, schemaId) => {
98
+ setAql(aql);
99
+ setSchemaId(schemaId);
100
+ }, []);
101
+ const renderModalTitleContent = useCallback(() => {
102
+ if (workspaceError) {
103
+ return undefined;
104
+ } else {
105
+ if (!workspaceId || assetsClientLoading) {
106
+ return jsx(AssetsSearchContainerLoading, {
107
+ modalTitle: AssetsModalTitle
108
+ });
109
+ }
110
+ return jsx(AssetsSearchContainer, {
111
+ workspaceId: workspaceId,
112
+ initialSearchData: {
113
+ aql,
114
+ objectSchema
115
+ },
116
+ onSearch: handleOnSearch,
117
+ modalTitle: AssetsModalTitle
118
+ });
119
+ }
120
+ }, [aql, assetsClientLoading, handleOnSearch, objectSchema, workspaceError, workspaceId]);
87
121
  return jsx(ModalTransition, null, jsx(Modal, {
88
122
  testId: 'asset-datasource-modal',
89
123
  onClose: onCancel,
90
124
  width: "x-large",
91
125
  shouldScrollInViewport: true
92
- }, jsx(ModalHeader, null, jsx(ModalTitle, null)), jsx(ModalBody, null, jsx(ModalContentContainer, null, jsx(RenderAssetsContent, {
126
+ }, jsx(ModalHeader, null, renderModalTitleContent()), jsx(ModalBody, null, jsx(ModalContentContainer, null, workspaceError ? jsx(ModalLoadingError, null) : jsx(RenderAssetsContent, {
93
127
  status: status,
94
128
  responseItems: responseItems
95
129
  }))), jsx(ModalFooter, null, jsx(Button, {
@@ -9,5 +9,10 @@ export const modalMessages = defineMessages({
9
9
  id: 'linkDataSource.assets.configmodal.insertIssuesButtonText',
10
10
  description: 'Button text to insert the displayed content',
11
11
  defaultMessage: 'Insert objects'
12
+ },
13
+ insertObjectsTitle: {
14
+ id: 'linkDataSource.assets.configmodal.insertObjectsTitle',
15
+ description: 'Title for the Assets Objects Datasource config modal which prefixes a select picker',
16
+ defaultMessage: 'Insert objects from'
12
17
  }
13
18
  });
@@ -1,6 +1,6 @@
1
1
  import styled from '@emotion/styled';
2
2
  export const ModalContentContainer = styled.div`
3
- display: 'grid';
4
- height: '420px';
5
- overflow: 'auto';
3
+ display: grid;
4
+ height: 420px;
5
+ overflow: auto;
6
6
  `;