@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
@@ -6,35 +6,64 @@ import { validateAql } from '../services/cmdbService';
6
6
  export var useValidateAqlText = function useValidateAqlText(workspaceId, hostname) {
7
7
  var _useState = useState(false),
8
8
  _useState2 = _slicedToArray(_useState, 2),
9
- isLoading = _useState2[0],
10
- setIsLoading = _useState2[1];
9
+ loading = _useState2[0],
10
+ setLoading = _useState2[1];
11
+ var _useState3 = useState(false),
12
+ _useState4 = _slicedToArray(_useState3, 2),
13
+ isValidAqlText = _useState4[0],
14
+ setIsValidAqlText = _useState4[1];
15
+ var _useState5 = useState(),
16
+ _useState6 = _slicedToArray(_useState5, 2),
17
+ error = _useState6[0],
18
+ setError = _useState6[1];
11
19
  var validateAqlText = useCallback( /*#__PURE__*/function () {
12
20
  var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(aql) {
13
- var validateAqlResponse;
21
+ var isValid, validateAqlResponse;
14
22
  return _regeneratorRuntime.wrap(function _callee$(_context) {
15
23
  while (1) switch (_context.prev = _context.next) {
16
24
  case 0:
17
- setIsLoading(true);
18
- _context.next = 3;
25
+ setLoading(true);
26
+ setError(undefined);
27
+ isValid = false;
28
+ _context.prev = 3;
29
+ _context.next = 6;
19
30
  return validateAql(workspaceId, {
20
31
  qlQuery: aql
21
- }, hostname);
22
- case 3:
23
- validateAqlResponse = _context.sent;
24
- setIsLoading(false);
25
- return _context.abrupt("return", validateAqlResponse.isValid);
32
+ });
26
33
  case 6:
34
+ validateAqlResponse = _context.sent;
35
+ setIsValidAqlText(validateAqlResponse.isValid);
36
+ isValid = validateAqlResponse.isValid;
37
+ _context.next = 14;
38
+ break;
39
+ case 11:
40
+ _context.prev = 11;
41
+ _context.t0 = _context["catch"](3);
42
+ if (_context.t0 instanceof Error) {
43
+ setError(_context.t0);
44
+ } else {
45
+ setError(new Error('Unexpected error occured'));
46
+ }
47
+ case 14:
48
+ _context.prev = 14;
49
+ setLoading(false);
50
+ return _context.finish(14);
51
+ case 17:
52
+ return _context.abrupt("return", isValid);
53
+ case 18:
27
54
  case "end":
28
55
  return _context.stop();
29
56
  }
30
- }, _callee);
57
+ }, _callee, null, [[3, 11, 14, 17]]);
31
58
  }));
32
59
  return function (_x) {
33
60
  return _ref.apply(this, arguments);
34
61
  };
35
- }(), [hostname, workspaceId]);
62
+ }(), [workspaceId]);
36
63
  return {
64
+ isValidAqlText: isValidAqlText,
37
65
  validateAqlText: validateAqlText,
38
- isLoading: isLoading
66
+ validateAqlTextLoading: loading,
67
+ validateAqlTextError: error
39
68
  };
40
69
  };
package/dist/esm/index.js CHANGED
@@ -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';
@@ -2,13 +2,13 @@ import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
2
2
  import _regeneratorRuntime from "@babel/runtime/regenerator";
3
3
  import { request } from '@atlaskit/linking-common';
4
4
  export var getWorkspaceId = /*#__PURE__*/function () {
5
- var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(hostname) {
5
+ var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
6
6
  var _workspaceDetailsResp;
7
7
  var url, workspaceDetailsResponse;
8
8
  return _regeneratorRuntime.wrap(function _callee$(_context) {
9
9
  while (1) switch (_context.prev = _context.next) {
10
10
  case 0:
11
- url = "".concat(hostname || '', "/rest/servicedesk/cmdb/latest/workspace");
11
+ url = '/rest/servicedesk/cmdb/latest/workspace';
12
12
  _context.next = 3;
13
13
  return request('get', url, undefined, undefined, [200, 201, 202, 203, 204]);
14
14
  case 3:
@@ -26,18 +26,26 @@ export var getWorkspaceId = /*#__PURE__*/function () {
26
26
  }
27
27
  }, _callee);
28
28
  }));
29
- return function getWorkspaceId(_x) {
29
+ return function getWorkspaceId() {
30
30
  return _ref.apply(this, arguments);
31
31
  };
32
32
  }();
33
- export var validateAql = function validateAql(workspaceId, data, hostname) {
34
- var url = "".concat(hostname || '', "/gateway/api/jsm/assets/workspace/").concat(workspaceId, "/v1/aql/validate");
33
+ export var validateAql = function validateAql(workspaceId, data) {
34
+ var url = "/gateway/api/jsm/assets/workspace/".concat(workspaceId, "/v1/aql/validate");
35
35
  return request('post', url, {
36
36
  qlQuery: data.qlQuery,
37
37
  context: 'SMART_LINKS'
38
38
  }, undefined, [200, 201, 202, 203, 204]);
39
39
  };
40
- export var fetchObjectSchemas = function fetchObjectSchemas(workspaceId, hostname) {
41
- var url = "".concat(hostname || '', "/gateway/api/jsm/assets/workspace/").concat(workspaceId, "/v1/objectschema/list?maxResults=100");
40
+ export var fetchObjectSchema = function fetchObjectSchema(workspaceId, schemaId) {
41
+ var url = "/gateway/api/jsm/assets/workspace/".concat(workspaceId, "/v1/objectschema/").concat(schemaId);
42
+ return request('get', url, undefined, undefined, [200, 201, 202, 203, 204]);
43
+ };
44
+ export var fetchObjectSchemas = function fetchObjectSchemas(workspaceId, query) {
45
+ var queryParams = new URLSearchParams();
46
+ queryParams.set('maxResults', '20');
47
+ queryParams.set('includeCounts', 'false');
48
+ query && queryParams.set('query', query);
49
+ var url = "/gateway/api/jsm/assets/workspace/".concat(workspaceId, "/v1/objectschema/list?").concat(queryParams);
42
50
  return request('get', url, undefined, undefined, [200, 201, 202, 203, 204]);
43
51
  };
@@ -1 +1,3 @@
1
- export {};
1
+ // These are to enforce the field "name" property and keep everything typed
2
+ export var objectSchemaKey = 'objectSchema';
3
+ export var aqlKey = 'aql';
@@ -7,9 +7,13 @@ import Button from '@atlaskit/button/standard-button';
7
7
  import Modal, { ModalBody, ModalFooter, ModalHeader, ModalTitle, ModalTransition } from '@atlaskit/modal-dialog';
8
8
  import { useAssetsClient } from '../../../hooks/useAssetsClient';
9
9
  import { useDatasourceTableState } from '../../../hooks/useDatasourceTableState';
10
+ import { ModalLoadingError } from '../../common/error-state/modal-loading-error';
11
+ import { AssetsSearchContainer } from '../search-container';
12
+ import { AssetsSearchContainerLoading } from '../search-container/loading-state';
10
13
  import { modalMessages } from './messages';
11
14
  import { RenderAssetsContent } from './render-assets-content';
12
15
  import { ModalContentContainer } from './styled';
16
+ var AssetsModalTitle = jsx(ModalTitle, null, jsx(FormattedMessage, modalMessages.insertObjectsTitle));
13
17
  export var AssetsConfigModal = function AssetsConfigModal(props) {
14
18
  var datasourceId = props.datasourceId,
15
19
  initialParameters = props.parameters,
@@ -17,22 +21,30 @@ export var AssetsConfigModal = function AssetsConfigModal(props) {
17
21
  onInsert = props.onInsert,
18
22
  initialVisibleColumnKeys = props.visibleColumnKeys;
19
23
  var _useState = useState(initialParameters === null || initialParameters === void 0 ? void 0 : initialParameters.aql),
20
- _useState2 = _slicedToArray(_useState, 1),
21
- aql = _useState2[0];
24
+ _useState2 = _slicedToArray(_useState, 2),
25
+ aql = _useState2[0],
26
+ setAql = _useState2[1];
22
27
  var _useState3 = useState(initialParameters === null || initialParameters === void 0 ? void 0 : initialParameters.schemaId),
23
- _useState4 = _slicedToArray(_useState3, 1),
24
- schemaId = _useState4[0];
28
+ _useState4 = _slicedToArray(_useState3, 2),
29
+ schemaId = _useState4[0],
30
+ setSchemaId = _useState4[1];
25
31
  var _useState5 = useState(initialVisibleColumnKeys),
26
32
  _useState6 = _slicedToArray(_useState5, 2),
27
33
  visibleColumnKeys = _useState6[0],
28
34
  setVisibleColumnKeys = _useState6[1];
29
- var _useAssetsClient = useAssetsClient(),
30
- workspaceId = _useAssetsClient.workspaceId;
35
+
36
+ // If a workspaceError occurs this is a critical error
37
+ var _useAssetsClient = useAssetsClient(initialParameters),
38
+ workspaceId = _useAssetsClient.workspaceId,
39
+ workspaceError = _useAssetsClient.workspaceError,
40
+ objectSchema = _useAssetsClient.objectSchema,
41
+ assetsClientLoading = _useAssetsClient.assetsClientLoading;
31
42
  var parameters = useMemo(function () {
32
43
  return {
33
44
  aql: aql || '',
34
45
  schemaId: schemaId || '',
35
- workspaceId: '' /* TODO FLY-1240: Add workspace Id */
46
+ workspaceId: '',
47
+ cloudId: ''
36
48
  };
37
49
  }, [aql, schemaId]);
38
50
  var _useDatasourceTableSt = useDatasourceTableState({
@@ -46,7 +58,7 @@ export var AssetsConfigModal = function AssetsConfigModal(props) {
46
58
  var newVisibleColumnKeys = !initialVisibleColumnKeys || (initialVisibleColumnKeys || []).length === 0 ? defaultVisibleColumnKeys : initialVisibleColumnKeys;
47
59
  setVisibleColumnKeys(newVisibleColumnKeys);
48
60
  }, [initialVisibleColumnKeys, defaultVisibleColumnKeys]);
49
- var isDisabled = status === 'rejected' || status === 'loading' || status === 'empty' || !aql || !workspaceId || !schemaId;
61
+ var isDisabled = status === 'rejected' || status === 'loading' || status === 'empty' || !!workspaceError || assetsClientLoading || !aql || !schemaId;
50
62
  var retrieveUrlForSmartCardRender = useCallback(function () {
51
63
  var _data$key, _data$key$data;
52
64
  var _responseItems = _slicedToArray(responseItems, 1),
@@ -55,7 +67,7 @@ export var AssetsConfigModal = function AssetsConfigModal(props) {
55
67
  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;
56
68
  }, [responseItems]);
57
69
  var onInsertPressed = useCallback(function () {
58
- if (!aql) {
70
+ if (!aql || !schemaId) {
59
71
  return;
60
72
  }
61
73
  var firstAssetUrl = retrieveUrlForSmartCardRender();
@@ -93,12 +105,36 @@ export var AssetsConfigModal = function AssetsConfigModal(props) {
93
105
  });
94
106
  }
95
107
  }, [aql, datasourceId, onInsert, responseItems.length, retrieveUrlForSmartCardRender, schemaId, visibleColumnKeys]);
108
+ var handleOnSearch = useCallback(function (aql, schemaId) {
109
+ setAql(aql);
110
+ setSchemaId(schemaId);
111
+ }, []);
112
+ var renderModalTitleContent = useCallback(function () {
113
+ if (workspaceError) {
114
+ return undefined;
115
+ } else {
116
+ if (!workspaceId || assetsClientLoading) {
117
+ return jsx(AssetsSearchContainerLoading, {
118
+ modalTitle: AssetsModalTitle
119
+ });
120
+ }
121
+ return jsx(AssetsSearchContainer, {
122
+ workspaceId: workspaceId,
123
+ initialSearchData: {
124
+ aql: aql,
125
+ objectSchema: objectSchema
126
+ },
127
+ onSearch: handleOnSearch,
128
+ modalTitle: AssetsModalTitle
129
+ });
130
+ }
131
+ }, [aql, assetsClientLoading, handleOnSearch, objectSchema, workspaceError, workspaceId]);
96
132
  return jsx(ModalTransition, null, jsx(Modal, {
97
133
  testId: 'asset-datasource-modal',
98
134
  onClose: onCancel,
99
135
  width: "x-large",
100
136
  shouldScrollInViewport: true
101
- }, jsx(ModalHeader, null, jsx(ModalTitle, null)), jsx(ModalBody, null, jsx(ModalContentContainer, null, jsx(RenderAssetsContent, {
137
+ }, jsx(ModalHeader, null, renderModalTitleContent()), jsx(ModalBody, null, jsx(ModalContentContainer, null, workspaceError ? jsx(ModalLoadingError, null) : jsx(RenderAssetsContent, {
102
138
  status: status,
103
139
  responseItems: responseItems
104
140
  }))), jsx(ModalFooter, null, jsx(Button, {
@@ -9,5 +9,10 @@ export var 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,4 +1,4 @@
1
1
  import _taggedTemplateLiteral from "@babel/runtime/helpers/taggedTemplateLiteral";
2
2
  var _templateObject;
3
3
  import styled from '@emotion/styled';
4
- export var ModalContentContainer = styled.div(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n display: 'grid';\n height: '420px';\n overflow: 'auto';\n"])));
4
+ export var ModalContentContainer = styled.div(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n display: grid;\n height: 420px;\n overflow: auto;\n"])));
@@ -0,0 +1,152 @@
1
+ import _extends from "@babel/runtime/helpers/extends";
2
+ import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
3
+ import _regeneratorRuntime from "@babel/runtime/regenerator";
4
+ /** @jsx jsx */
5
+ import { useCallback, useRef } from 'react';
6
+ import { css, jsx } from '@emotion/react';
7
+ import { useIntl } from 'react-intl-next';
8
+ import Button from '@atlaskit/button';
9
+ import { Field } from '@atlaskit/form';
10
+ import CheckCircleIcon from '@atlaskit/icon/glyph/check-circle';
11
+ import CrossCircleIcon from '@atlaskit/icon/glyph/cross-circle';
12
+ import SearchIcon from '@atlaskit/icon/glyph/editor/search';
13
+ import Spinner from '@atlaskit/spinner';
14
+ import Textfield from '@atlaskit/textfield';
15
+ import { useValidateAqlText } from '../../../../hooks/useValidateAqlText';
16
+ import { aqlKey } from '../../../../types/assets/types';
17
+ import { FieldContainer } from '../styled';
18
+ import { searchInputMessages } from './messages';
19
+
20
+ /* Meta isn't exported in @atlaskit/form
21
+ Taken from packages/design-system/form/src/field.tsx */
22
+
23
+ var searchButtonStyles = css({
24
+ marginRight: "var(--ds-space-075, 6px)"
25
+ });
26
+ export var SEARCH_DEBOUNCE_MS = 350;
27
+ var renderValidatorIcon = function renderValidatorIcon(value, error, meta) {
28
+ if (value && meta !== null && meta !== void 0 && meta.validating) {
29
+ return jsx(Spinner, {
30
+ size: "medium",
31
+ testId: "assets-datasource-modal--aql-validating"
32
+ });
33
+ }
34
+ if (value && error) {
35
+ return jsx(CrossCircleIcon, {
36
+ label: "label",
37
+ primaryColor: "red",
38
+ size: "medium",
39
+ testId: "assets-datasource-modal--aql-invalid"
40
+ });
41
+ }
42
+ if (value && meta.valid) {
43
+ return jsx(CheckCircleIcon, {
44
+ label: "label",
45
+ primaryColor: "green",
46
+ size: "medium",
47
+ testId: "assets-datasource-modal--aql-valid"
48
+ });
49
+ }
50
+ return jsx(SearchIcon, {
51
+ label: "label",
52
+ size: "medium",
53
+ testId: "assets-datasource-modal--aql-idle"
54
+ });
55
+ };
56
+ export var AqlSearchInput = function AqlSearchInput(_ref) {
57
+ var value = _ref.value,
58
+ workspaceId = _ref.workspaceId,
59
+ _ref$testId = _ref.testId,
60
+ testId = _ref$testId === void 0 ? 'assets-datasource-modal--aql-search-input' : _ref$testId;
61
+ var _useIntl = useIntl(),
62
+ formatMessage = _useIntl.formatMessage;
63
+ var timeout = useRef();
64
+ var lastValue = useRef(value);
65
+ var lastResult = useRef(Promise.resolve(undefined));
66
+ var _useValidateAqlText = useValidateAqlText(workspaceId),
67
+ validateAqlText = _useValidateAqlText.validateAqlText;
68
+
69
+ // Validation expects undefined when valid and a string as an error message when invalid
70
+ var handleValidation = useCallback( /*#__PURE__*/function () {
71
+ var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(newUnvalidatedQlQuery) {
72
+ var isValid;
73
+ return _regeneratorRuntime.wrap(function _callee$(_context) {
74
+ while (1) switch (_context.prev = _context.next) {
75
+ case 0:
76
+ if (newUnvalidatedQlQuery) {
77
+ _context.next = 2;
78
+ break;
79
+ }
80
+ return _context.abrupt("return", undefined);
81
+ case 2:
82
+ _context.next = 4;
83
+ return validateAqlText(newUnvalidatedQlQuery);
84
+ case 4:
85
+ isValid = _context.sent;
86
+ return _context.abrupt("return", isValid ? undefined : 'invalid');
87
+ case 6:
88
+ case "end":
89
+ return _context.stop();
90
+ }
91
+ }, _callee);
92
+ }));
93
+ return function (_x) {
94
+ return _ref2.apply(this, arguments);
95
+ };
96
+ }(), [validateAqlText]);
97
+
98
+ /* Debounce async validation for input, validation is also called on every field change
99
+ in a form so we need to also memoize. The async validate function is expected to either:
100
+ Immediately return a promise (which is then collected into an array, every single time validation is run),
101
+ or immediately return either undefined or an error message */
102
+ var debouncedMemoizedValidation = function debouncedMemoizedValidation(value) {
103
+ return new Promise(function (resolve) {
104
+ if (timeout.current) {
105
+ timeout.current();
106
+ }
107
+ if (value !== lastValue.current) {
108
+ var timerId = setTimeout(function () {
109
+ lastValue.current = value;
110
+ lastResult.current = handleValidation(value);
111
+ resolve(lastResult.current);
112
+ }, SEARCH_DEBOUNCE_MS);
113
+ timeout.current = function () {
114
+ clearTimeout(timerId);
115
+ resolve('debouncing');
116
+ };
117
+ } else {
118
+ resolve(lastResult.current);
119
+ }
120
+ });
121
+ };
122
+ return jsx(FieldContainer, null, jsx(Field, {
123
+ name: aqlKey,
124
+ defaultValue: value,
125
+ validate: debouncedMemoizedValidation
126
+ }, function (_ref3) {
127
+ var fieldProps = _ref3.fieldProps,
128
+ meta = _ref3.meta,
129
+ error = _ref3.error;
130
+ return jsx(Textfield, _extends({}, fieldProps, {
131
+ elemBeforeInput: jsx("span", {
132
+ style: {
133
+ paddingLeft: 6,
134
+ width: 24
135
+ }
136
+ }, renderValidatorIcon(fieldProps.value, error, meta)),
137
+ elemAfterInput: jsx(Button, {
138
+ appearance: "primary",
139
+ css: searchButtonStyles,
140
+ iconBefore: jsx(SearchIcon, {
141
+ label: formatMessage(searchInputMessages.placeholder),
142
+ size: "medium"
143
+ }),
144
+ spacing: "none",
145
+ testId: "assets-datasource-modal--aql-search-button",
146
+ type: "submit"
147
+ }),
148
+ placeholder: formatMessage(searchInputMessages.placeholder),
149
+ testId: testId
150
+ }));
151
+ }));
152
+ };
@@ -0,0 +1,10 @@
1
+ /** @jsx jsx */
2
+ import { jsx } from '@emotion/react';
3
+ import { Skeleton } from '@atlaskit/linking-common';
4
+ export var AssetsAqlSearchInputSkeleton = function AssetsAqlSearchInputSkeleton() {
5
+ return jsx(Skeleton, {
6
+ width: "100%",
7
+ height: "40px",
8
+ testId: "assets-datasource-modal--aql-search-input-skeleton"
9
+ });
10
+ };
@@ -0,0 +1,8 @@
1
+ import { defineMessages } from 'react-intl-next';
2
+ export var searchInputMessages = defineMessages({
3
+ placeholder: {
4
+ id: 'linkDataSource.assets.configModal.aqlSearchInput.placeholder',
5
+ description: 'Display text for AQL search button',
6
+ defaultMessage: 'Search via AQL'
7
+ }
8
+ });
@@ -0,0 +1,41 @@
1
+ import _extends from "@babel/runtime/helpers/extends";
2
+ /** @jsx jsx */
3
+ import { jsx } from '@emotion/react';
4
+ import Form from '@atlaskit/form';
5
+ import { AqlSearchInput } from './aql-search-input';
6
+ import { AssetsObjectSchemaSelect } from './object-schema-select';
7
+ import { FormContainer, FormRowContainer, SchemaSelectContainer } from './styled';
8
+ var DEFAULT_AQL_QUERY = '';
9
+ var SEARCH_FORM_ID = 'linkDataSource.assets.configModal.searchContainer-form';
10
+ export var AssetsSearchContainer = function AssetsSearchContainer(props) {
11
+ var onSearch = props.onSearch,
12
+ workspaceId = props.workspaceId,
13
+ initialSearchData = props.initialSearchData,
14
+ modalTitle = props.modalTitle;
15
+ var onFormSubmit = function onFormSubmit(searchFormValues) {
16
+ var aql = searchFormValues.aql,
17
+ objectSchema = searchFormValues.objectSchema;
18
+ if (objectSchema) {
19
+ // Pass the validated aql and object schema back to modal
20
+ onSearch(aql, objectSchema.value);
21
+ }
22
+ };
23
+ return jsx(Form, {
24
+ onSubmit: onFormSubmit
25
+ }, function (_ref) {
26
+ var _initialSearchData$ob, _initialSearchData$aq;
27
+ var formProps = _ref.formProps;
28
+ return jsx(FormContainer, _extends({}, formProps, {
29
+ id: SEARCH_FORM_ID
30
+ }), jsx(FormRowContainer, {
31
+ isNarrowGap: true
32
+ }, modalTitle, jsx(SchemaSelectContainer, null, jsx(AssetsObjectSchemaSelect, {
33
+ value: (_initialSearchData$ob = initialSearchData.objectSchema) !== null && _initialSearchData$ob !== void 0 ? _initialSearchData$ob : undefined,
34
+ workspaceId: workspaceId,
35
+ classNamePrefix: "assets-datasource-modal--object-schema-select"
36
+ }))), jsx(FormRowContainer, null, jsx(AqlSearchInput, {
37
+ value: (_initialSearchData$aq = initialSearchData.aql) !== null && _initialSearchData$aq !== void 0 ? _initialSearchData$aq : DEFAULT_AQL_QUERY,
38
+ workspaceId: workspaceId
39
+ })));
40
+ });
41
+ };
@@ -0,0 +1,13 @@
1
+ /** @jsx jsx */
2
+ import { jsx } from '@emotion/react';
3
+ import { AssetsAqlSearchInputSkeleton } from './aql-search-input/loading-state';
4
+ import { AssetsObjectSchemaSelectSkeleton } from './object-schema-select/loading-state';
5
+ import { FormContainer, FormRowContainer, SchemaSelectContainer } from './styled';
6
+ export var AssetsSearchContainerLoading = function AssetsSearchContainerLoading(_ref) {
7
+ var modalTitle = _ref.modalTitle;
8
+ return jsx(FormContainer, {
9
+ "data-testid": "assets-datasource-modal--search-container-skeleton"
10
+ }, jsx(FormRowContainer, {
11
+ isNarrowGap: true
12
+ }, modalTitle, jsx(SchemaSelectContainer, null, jsx(AssetsObjectSchemaSelectSkeleton, null))), jsx(FormRowContainer, null, jsx(AssetsAqlSearchInputSkeleton, null)));
13
+ };
@@ -0,0 +1,94 @@
1
+ import _extends from "@babel/runtime/helpers/extends";
2
+ import _objectWithoutProperties from "@babel/runtime/helpers/objectWithoutProperties";
3
+ import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
4
+ import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
5
+ var _excluded = ["onChange", "onFocus"];
6
+ import _regeneratorRuntime from "@babel/runtime/regenerator";
7
+ /** @jsx jsx */
8
+ import { useState } from 'react';
9
+ import { jsx } from '@emotion/react';
10
+ import debounce from 'debounce-promise';
11
+ import { useIntl } from 'react-intl-next';
12
+ import { Field } from '@atlaskit/form';
13
+ import { AsyncSelect } from '@atlaskit/select';
14
+ import { useObjectSchemas } from '../../../../hooks/useObjectSchemas';
15
+ import { objectSchemaKey } from '../../../../types/assets/types';
16
+ import { FieldContainer } from '../styled';
17
+ import { objectSchemaSelectMessages } from './messages';
18
+ import { objectSchemaToSelectOption } from './utils';
19
+ export var SEARCH_DEBOUNCE_MS = 350;
20
+ export var AssetsObjectSchemaSelect = function AssetsObjectSchemaSelect(_ref) {
21
+ var value = _ref.value,
22
+ workspaceId = _ref.workspaceId,
23
+ _ref$classNamePrefix = _ref.classNamePrefix,
24
+ classNamePrefix = _ref$classNamePrefix === void 0 ? 'assets-datasource-modal--object-schema-select' : _ref$classNamePrefix;
25
+ var _useIntl = useIntl(),
26
+ formatMessage = _useIntl.formatMessage;
27
+ var _useObjectSchemas = useObjectSchemas(workspaceId),
28
+ fetchObjectSchemas = _useObjectSchemas.fetchObjectSchemas,
29
+ objectSchemasLoading = _useObjectSchemas.objectSchemasLoading;
30
+ var _useState = useState(undefined),
31
+ _useState2 = _slicedToArray(_useState, 2),
32
+ defaultOptions = _useState2[0],
33
+ setDefaultOptions = _useState2[1];
34
+ var selectedObjectSchema = value ? objectSchemaToSelectOption(value) : undefined;
35
+ var loadOptions = /*#__PURE__*/function () {
36
+ var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(inputValue) {
37
+ var objectSchemas, options;
38
+ return _regeneratorRuntime.wrap(function _callee$(_context) {
39
+ while (1) switch (_context.prev = _context.next) {
40
+ case 0:
41
+ _context.next = 2;
42
+ return fetchObjectSchemas(inputValue);
43
+ case 2:
44
+ objectSchemas = _context.sent;
45
+ options = objectSchemas ? objectSchemas.map(function (objectSchema) {
46
+ return objectSchemaToSelectOption(objectSchema);
47
+ }) : [];
48
+ return _context.abrupt("return", options);
49
+ case 5:
50
+ case "end":
51
+ return _context.stop();
52
+ }
53
+ }, _callee);
54
+ }));
55
+ return function loadOptions(_x) {
56
+ return _ref2.apply(this, arguments);
57
+ };
58
+ }();
59
+ var debouncedLoadOptions = debounce(loadOptions, SEARCH_DEBOUNCE_MS);
60
+ var validateSchema = function validateSchema(value) {
61
+ if (!value || !value.value) {
62
+ return formatMessage(objectSchemaSelectMessages.schemaRequired);
63
+ }
64
+ return undefined;
65
+ };
66
+ return jsx(FieldContainer, null, jsx(Field, {
67
+ name: objectSchemaKey,
68
+ defaultValue: selectedObjectSchema,
69
+ validate: function validate(value) {
70
+ return validateSchema(value);
71
+ }
72
+ }, function (_ref3) {
73
+ var _ref3$fieldProps = _ref3.fieldProps,
74
+ _onChange = _ref3$fieldProps.onChange,
75
+ onFocus = _ref3$fieldProps.onFocus,
76
+ restFieldProps = _objectWithoutProperties(_ref3$fieldProps, _excluded);
77
+ return jsx(AsyncSelect, _extends({
78
+ classNamePrefix: classNamePrefix,
79
+ isLoading: objectSchemasLoading,
80
+ defaultOptions: defaultOptions || [],
81
+ isSearchable: true,
82
+ loadOptions: debouncedLoadOptions,
83
+ placeholder: formatMessage(objectSchemaSelectMessages.placeholder),
84
+ onChange: function onChange(newOption) {
85
+ return newOption && _onChange(newOption);
86
+ },
87
+ onFocus: function onFocus() {
88
+ if (!defaultOptions) {
89
+ loadOptions('').then(setDefaultOptions);
90
+ }
91
+ }
92
+ }, restFieldProps));
93
+ }));
94
+ };
@@ -0,0 +1,10 @@
1
+ /** @jsx jsx */
2
+ import { jsx } from '@emotion/react';
3
+ import { Skeleton } from '@atlaskit/linking-common';
4
+ export var AssetsObjectSchemaSelectSkeleton = function AssetsObjectSchemaSelectSkeleton() {
5
+ return jsx(Skeleton, {
6
+ width: "100%",
7
+ height: "40px",
8
+ testId: "assets-datasource-modal--object-schema-select-skeleton"
9
+ });
10
+ };
@@ -0,0 +1,18 @@
1
+ import { defineMessages } from 'react-intl-next';
2
+ export var objectSchemaSelectMessages = defineMessages({
3
+ label: {
4
+ id: 'linkDataSource.assets.configModal.objectSchemaSelect.label',
5
+ description: 'Label text for a select input where users can choose an Assets object schema to use',
6
+ defaultMessage: 'Select schema'
7
+ },
8
+ placeholder: {
9
+ id: 'linkDataSource.assets.configModal.objectSchemaSelect.placeholder',
10
+ description: 'Placeholder text for a select input where users can choose an Assets object schema to use',
11
+ defaultMessage: 'Select schema'
12
+ },
13
+ schemaRequired: {
14
+ id: 'linkDataSource.assets.configModal.objectSchemaSelect.schemaRequired',
15
+ description: 'Validation message displayed to the user when the select is blank',
16
+ defaultMessage: 'Schema is required'
17
+ }
18
+ });
@@ -0,0 +1,6 @@
1
+ export var objectSchemaToSelectOption = function objectSchemaToSelectOption(objectSchema) {
2
+ return {
3
+ label: objectSchema.name,
4
+ value: objectSchema.id
5
+ };
6
+ };
@@ -0,0 +1,11 @@
1
+ import _taggedTemplateLiteral from "@babel/runtime/helpers/taggedTemplateLiteral";
2
+ var _templateObject, _templateObject2, _templateObject3, _templateObject4;
3
+ import styled from '@emotion/styled';
4
+ export var FormRowContainer = styled.div(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n align-items: center;\n display: flex;\n gap: ", ";\n flex-grow: 1;\n width: 100%;\n"])), function (props) {
5
+ return props.isNarrowGap ? "var(--ds-space-100, 8px)" : "var(--ds-space-200, 16px)";
6
+ });
7
+ export var FormContainer = styled.form(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral(["\n display: grid;\n row-gap: ", ";\n width: 100%;\n"])), "var(--ds-space-200, 16px)");
8
+
9
+ // Override the top margin of fields
10
+ export var FieldContainer = styled.div(_templateObject3 || (_templateObject3 = _taggedTemplateLiteral(["\n flex: 1;\n margin-top: calc(-1 * ", ");\n"])), "var(--ds-space-100, 8px)");
11
+ export var SchemaSelectContainer = styled.div(_templateObject4 || (_templateObject4 = _taggedTemplateLiteral(["\n width: 200px;\n"])));
@@ -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
  }