@atlaskit/link-datasource 0.14.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +233 -0
- package/README.md +3 -0
- package/dist/cjs/hooks/useDatasourceTableState.js +133 -0
- package/dist/cjs/index.js +19 -0
- package/dist/cjs/services/getAvailableJiraSites.js +65 -0
- package/dist/cjs/services/makeGetJqlAutocompleteData.js +66 -0
- package/dist/cjs/services/makeGetJqlSuggestionsData.js +55 -0
- package/dist/cjs/ui/issue-like-table/column-picker/index.js +93 -0
- package/dist/cjs/ui/issue-like-table/column-picker/types.js +5 -0
- package/dist/cjs/ui/issue-like-table/draggable-table-heading.js +182 -0
- package/dist/cjs/ui/issue-like-table/empty-state/index.js +127 -0
- package/dist/cjs/ui/issue-like-table/empty-state/priority.js +28 -0
- package/dist/cjs/ui/issue-like-table/empty-state/type.js +51 -0
- package/dist/cjs/ui/issue-like-table/empty-state/types.js +5 -0
- package/dist/cjs/ui/issue-like-table/index.js +300 -0
- package/dist/cjs/ui/issue-like-table/render-type/boolean/index.js +30 -0
- package/dist/cjs/ui/issue-like-table/render-type/boolean/messages.js +20 -0
- package/dist/cjs/ui/issue-like-table/render-type/date-time/index.js +47 -0
- package/dist/cjs/ui/issue-like-table/render-type/icon/index.js +34 -0
- package/dist/cjs/ui/issue-like-table/render-type/index.js +63 -0
- package/dist/cjs/ui/issue-like-table/render-type/link/index.js +56 -0
- package/dist/cjs/ui/issue-like-table/render-type/number/index.js +24 -0
- package/dist/cjs/ui/issue-like-table/render-type/status/index.js +28 -0
- package/dist/cjs/ui/issue-like-table/render-type/tag/index.js +27 -0
- package/dist/cjs/ui/issue-like-table/render-type/text/index.js +23 -0
- package/dist/cjs/ui/issue-like-table/render-type/user/index.js +36 -0
- package/dist/cjs/ui/issue-like-table/render-type/user/messages.js +15 -0
- package/dist/cjs/ui/issue-like-table/styled.js +12 -0
- package/dist/cjs/ui/issue-like-table/types.js +5 -0
- package/dist/cjs/ui/issue-like-table/useIsOnScreen.js +32 -0
- package/dist/cjs/ui/jira-issues/modal/basic-search-input/index.js +52 -0
- package/dist/cjs/ui/jira-issues/modal/basic-search-input/messages.js +15 -0
- package/dist/cjs/ui/jira-issues/modal/index.js +267 -0
- package/dist/cjs/ui/jira-issues/modal/jira-search-container/buildJQL.js +27 -0
- package/dist/cjs/ui/jira-issues/modal/jira-search-container/index.js +116 -0
- package/dist/cjs/ui/jira-issues/modal/jira-search-container/messages.js +15 -0
- package/dist/cjs/ui/jira-issues/modal/jql-editor/index.js +41 -0
- package/dist/cjs/ui/jira-issues/modal/messages.js +45 -0
- package/dist/cjs/ui/jira-issues/modal/mode-switcher/index.js +97 -0
- package/dist/cjs/ui/jira-issues/modal/site-selector/index.js +55 -0
- package/dist/cjs/ui/jira-issues/modal/site-selector/messages.js +20 -0
- package/dist/cjs/ui/jira-issues/table-footer/index.js +68 -0
- package/dist/cjs/ui/jira-issues/table-footer/messages.js +25 -0
- package/dist/cjs/ui/jira-issues/table-footer/sync-info/index.js +79 -0
- package/dist/cjs/ui/jira-issues/table-footer/sync-info/messages.js +20 -0
- package/dist/cjs/ui/jira-issues/tableView.js +64 -0
- package/dist/cjs/ui/jira-issues/types.js +5 -0
- package/dist/cjs/version.json +5 -0
- package/dist/es2019/hooks/useDatasourceTableState.js +77 -0
- package/dist/es2019/index.js +2 -0
- package/dist/es2019/services/getAvailableJiraSites.js +20 -0
- package/dist/es2019/services/makeGetJqlAutocompleteData.js +19 -0
- package/dist/es2019/services/makeGetJqlSuggestionsData.js +11 -0
- package/dist/es2019/ui/issue-like-table/column-picker/index.js +77 -0
- package/dist/es2019/ui/issue-like-table/column-picker/types.js +1 -0
- package/dist/es2019/ui/issue-like-table/draggable-table-heading.js +166 -0
- package/dist/es2019/ui/issue-like-table/empty-state/index.js +113 -0
- package/dist/es2019/ui/issue-like-table/empty-state/priority.js +32 -0
- package/dist/es2019/ui/issue-like-table/empty-state/type.js +46 -0
- package/dist/es2019/ui/issue-like-table/empty-state/types.js +1 -0
- package/dist/es2019/ui/issue-like-table/index.js +259 -0
- package/dist/es2019/ui/issue-like-table/render-type/boolean/index.js +21 -0
- package/dist/es2019/ui/issue-like-table/render-type/boolean/messages.js +13 -0
- package/dist/es2019/ui/issue-like-table/render-type/date-time/index.js +37 -0
- package/dist/es2019/ui/issue-like-table/render-type/icon/index.js +27 -0
- package/dist/es2019/ui/issue-like-table/render-type/index.js +55 -0
- package/dist/es2019/ui/issue-like-table/render-type/link/index.js +38 -0
- package/dist/es2019/ui/issue-like-table/render-type/number/index.js +15 -0
- package/dist/es2019/ui/issue-like-table/render-type/status/index.js +19 -0
- package/dist/es2019/ui/issue-like-table/render-type/tag/index.js +18 -0
- package/dist/es2019/ui/issue-like-table/render-type/text/index.js +14 -0
- package/dist/es2019/ui/issue-like-table/render-type/user/index.js +29 -0
- package/dist/es2019/ui/issue-like-table/render-type/user/messages.js +8 -0
- package/dist/es2019/ui/issue-like-table/styled.js +6 -0
- package/dist/es2019/ui/issue-like-table/types.js +1 -0
- package/dist/es2019/ui/issue-like-table/useIsOnScreen.js +17 -0
- package/dist/es2019/ui/jira-issues/modal/basic-search-input/index.js +42 -0
- package/dist/es2019/ui/jira-issues/modal/basic-search-input/messages.js +8 -0
- package/dist/es2019/ui/jira-issues/modal/index.js +227 -0
- package/dist/es2019/ui/jira-issues/modal/jira-search-container/buildJQL.js +20 -0
- package/dist/es2019/ui/jira-issues/modal/jira-search-container/index.js +90 -0
- package/dist/es2019/ui/jira-issues/modal/jira-search-container/messages.js +8 -0
- package/dist/es2019/ui/jira-issues/modal/jql-editor/index.js +33 -0
- package/dist/es2019/ui/jira-issues/modal/messages.js +38 -0
- package/dist/es2019/ui/jira-issues/modal/mode-switcher/index.js +90 -0
- package/dist/es2019/ui/jira-issues/modal/site-selector/index.js +43 -0
- package/dist/es2019/ui/jira-issues/modal/site-selector/messages.js +13 -0
- package/dist/es2019/ui/jira-issues/table-footer/index.js +78 -0
- package/dist/es2019/ui/jira-issues/table-footer/messages.js +18 -0
- package/dist/es2019/ui/jira-issues/table-footer/sync-info/index.js +59 -0
- package/dist/es2019/ui/jira-issues/table-footer/sync-info/messages.js +13 -0
- package/dist/es2019/ui/jira-issues/tableView.js +57 -0
- package/dist/es2019/ui/jira-issues/types.js +1 -0
- package/dist/es2019/version.json +5 -0
- package/dist/esm/hooks/useDatasourceTableState.js +125 -0
- package/dist/esm/index.js +2 -0
- package/dist/esm/services/getAvailableJiraSites.js +57 -0
- package/dist/esm/services/makeGetJqlAutocompleteData.js +58 -0
- package/dist/esm/services/makeGetJqlSuggestionsData.js +47 -0
- package/dist/esm/ui/issue-like-table/column-picker/index.js +85 -0
- package/dist/esm/ui/issue-like-table/column-picker/types.js +1 -0
- package/dist/esm/ui/issue-like-table/draggable-table-heading.js +173 -0
- package/dist/esm/ui/issue-like-table/empty-state/index.js +118 -0
- package/dist/esm/ui/issue-like-table/empty-state/priority.js +20 -0
- package/dist/esm/ui/issue-like-table/empty-state/type.js +43 -0
- package/dist/esm/ui/issue-like-table/empty-state/types.js +1 -0
- package/dist/esm/ui/issue-like-table/index.js +292 -0
- package/dist/esm/ui/issue-like-table/render-type/boolean/index.js +21 -0
- package/dist/esm/ui/issue-like-table/render-type/boolean/messages.js +13 -0
- package/dist/esm/ui/issue-like-table/render-type/date-time/index.js +38 -0
- package/dist/esm/ui/issue-like-table/render-type/icon/index.js +25 -0
- package/dist/esm/ui/issue-like-table/render-type/index.js +55 -0
- package/dist/esm/ui/issue-like-table/render-type/link/index.js +44 -0
- package/dist/esm/ui/issue-like-table/render-type/number/index.js +15 -0
- package/dist/esm/ui/issue-like-table/render-type/status/index.js +19 -0
- package/dist/esm/ui/issue-like-table/render-type/tag/index.js +18 -0
- package/dist/esm/ui/issue-like-table/render-type/text/index.js +14 -0
- package/dist/esm/ui/issue-like-table/render-type/user/index.js +27 -0
- package/dist/esm/ui/issue-like-table/render-type/user/messages.js +8 -0
- package/dist/esm/ui/issue-like-table/styled.js +4 -0
- package/dist/esm/ui/issue-like-table/types.js +1 -0
- package/dist/esm/ui/issue-like-table/useIsOnScreen.js +25 -0
- package/dist/esm/ui/jira-issues/modal/basic-search-input/index.js +43 -0
- package/dist/esm/ui/jira-issues/modal/basic-search-input/messages.js +8 -0
- package/dist/esm/ui/jira-issues/modal/index.js +255 -0
- package/dist/esm/ui/jira-issues/modal/jira-search-container/buildJQL.js +20 -0
- package/dist/esm/ui/jira-issues/modal/jira-search-container/index.js +104 -0
- package/dist/esm/ui/jira-issues/modal/jira-search-container/messages.js +8 -0
- package/dist/esm/ui/jira-issues/modal/jql-editor/index.js +31 -0
- package/dist/esm/ui/jira-issues/modal/messages.js +38 -0
- package/dist/esm/ui/jira-issues/modal/mode-switcher/index.js +88 -0
- package/dist/esm/ui/jira-issues/modal/site-selector/index.js +44 -0
- package/dist/esm/ui/jira-issues/modal/site-selector/messages.js +13 -0
- package/dist/esm/ui/jira-issues/table-footer/index.js +60 -0
- package/dist/esm/ui/jira-issues/table-footer/messages.js +18 -0
- package/dist/esm/ui/jira-issues/table-footer/sync-info/index.js +68 -0
- package/dist/esm/ui/jira-issues/table-footer/sync-info/messages.js +13 -0
- package/dist/esm/ui/jira-issues/tableView.js +55 -0
- package/dist/esm/ui/jira-issues/types.js +1 -0
- package/dist/esm/version.json +5 -0
- package/dist/types/hooks/useDatasourceTableState.d.ts +13 -0
- package/dist/types/index.d.ts +2 -0
- package/dist/types/services/getAvailableJiraSites.d.ts +6 -0
- package/dist/types/services/makeGetJqlAutocompleteData.d.ts +6 -0
- package/dist/types/services/makeGetJqlSuggestionsData.d.ts +5 -0
- package/dist/types/ui/issue-like-table/column-picker/index.d.ts +3 -0
- package/dist/types/ui/issue-like-table/column-picker/types.d.ts +6 -0
- package/dist/types/ui/issue-like-table/draggable-table-heading.d.ts +12 -0
- package/dist/types/ui/issue-like-table/empty-state/index.d.ts +6 -0
- package/dist/types/ui/issue-like-table/empty-state/priority.d.ts +6 -0
- package/dist/types/ui/issue-like-table/empty-state/type.d.ts +6 -0
- package/dist/types/ui/issue-like-table/empty-state/types.d.ts +2 -0
- package/dist/types/ui/issue-like-table/index.d.ts +15 -0
- package/dist/types/ui/issue-like-table/render-type/boolean/index.d.ts +8 -0
- package/dist/types/ui/issue-like-table/render-type/boolean/messages.d.ts +12 -0
- package/dist/types/ui/issue-like-table/render-type/date-time/index.d.ts +10 -0
- package/dist/types/ui/issue-like-table/render-type/icon/index.d.ts +8 -0
- package/dist/types/ui/issue-like-table/render-type/index.d.ts +2 -0
- package/dist/types/ui/issue-like-table/render-type/link/index.d.ts +8 -0
- package/dist/types/ui/issue-like-table/render-type/number/index.d.ts +8 -0
- package/dist/types/ui/issue-like-table/render-type/status/index.d.ts +8 -0
- package/dist/types/ui/issue-like-table/render-type/tag/index.d.ts +9 -0
- package/dist/types/ui/issue-like-table/render-type/text/index.d.ts +8 -0
- package/dist/types/ui/issue-like-table/render-type/user/index.d.ts +11 -0
- package/dist/types/ui/issue-like-table/render-type/user/messages.d.ts +7 -0
- package/dist/types/ui/issue-like-table/styled.d.ts +5 -0
- package/dist/types/ui/issue-like-table/types.d.ts +38 -0
- package/dist/types/ui/issue-like-table/useIsOnScreen.d.ts +1 -0
- package/dist/types/ui/jira-issues/modal/basic-search-input/index.d.ts +12 -0
- package/dist/types/ui/jira-issues/modal/basic-search-input/messages.d.ts +7 -0
- package/dist/types/ui/jira-issues/modal/index.d.ts +13 -0
- package/dist/types/ui/jira-issues/modal/jira-search-container/buildJQL.d.ts +7 -0
- package/dist/types/ui/jira-issues/modal/jira-search-container/index.d.ts +7 -0
- package/dist/types/ui/jira-issues/modal/jira-search-container/messages.d.ts +7 -0
- package/dist/types/ui/jira-issues/modal/jql-editor/index.d.ts +8 -0
- package/dist/types/ui/jira-issues/modal/messages.d.ts +37 -0
- package/dist/types/ui/jira-issues/modal/mode-switcher/index.d.ts +12 -0
- package/dist/types/ui/jira-issues/modal/site-selector/index.d.ts +10 -0
- package/dist/types/ui/jira-issues/modal/site-selector/messages.d.ts +12 -0
- package/dist/types/ui/jira-issues/table-footer/index.d.ts +7 -0
- package/dist/types/ui/jira-issues/table-footer/messages.d.ts +17 -0
- package/dist/types/ui/jira-issues/table-footer/sync-info/index.d.ts +4 -0
- package/dist/types/ui/jira-issues/table-footer/sync-info/messages.d.ts +12 -0
- package/dist/types/ui/jira-issues/tableView.d.ts +3 -0
- package/dist/types/ui/jira-issues/types.d.ts +14 -0
- package/dist/types-ts4.5/hooks/useDatasourceTableState.d.ts +13 -0
- package/dist/types-ts4.5/index.d.ts +2 -0
- package/dist/types-ts4.5/services/getAvailableJiraSites.d.ts +6 -0
- package/dist/types-ts4.5/services/makeGetJqlAutocompleteData.d.ts +6 -0
- package/dist/types-ts4.5/services/makeGetJqlSuggestionsData.d.ts +5 -0
- package/dist/types-ts4.5/ui/issue-like-table/column-picker/index.d.ts +3 -0
- package/dist/types-ts4.5/ui/issue-like-table/column-picker/types.d.ts +6 -0
- package/dist/types-ts4.5/ui/issue-like-table/draggable-table-heading.d.ts +12 -0
- package/dist/types-ts4.5/ui/issue-like-table/empty-state/index.d.ts +6 -0
- package/dist/types-ts4.5/ui/issue-like-table/empty-state/priority.d.ts +6 -0
- package/dist/types-ts4.5/ui/issue-like-table/empty-state/type.d.ts +6 -0
- package/dist/types-ts4.5/ui/issue-like-table/empty-state/types.d.ts +2 -0
- package/dist/types-ts4.5/ui/issue-like-table/index.d.ts +15 -0
- package/dist/types-ts4.5/ui/issue-like-table/render-type/boolean/index.d.ts +8 -0
- package/dist/types-ts4.5/ui/issue-like-table/render-type/boolean/messages.d.ts +12 -0
- package/dist/types-ts4.5/ui/issue-like-table/render-type/date-time/index.d.ts +10 -0
- package/dist/types-ts4.5/ui/issue-like-table/render-type/icon/index.d.ts +8 -0
- package/dist/types-ts4.5/ui/issue-like-table/render-type/index.d.ts +2 -0
- package/dist/types-ts4.5/ui/issue-like-table/render-type/link/index.d.ts +8 -0
- package/dist/types-ts4.5/ui/issue-like-table/render-type/number/index.d.ts +8 -0
- package/dist/types-ts4.5/ui/issue-like-table/render-type/status/index.d.ts +8 -0
- package/dist/types-ts4.5/ui/issue-like-table/render-type/tag/index.d.ts +9 -0
- package/dist/types-ts4.5/ui/issue-like-table/render-type/text/index.d.ts +8 -0
- package/dist/types-ts4.5/ui/issue-like-table/render-type/user/index.d.ts +11 -0
- package/dist/types-ts4.5/ui/issue-like-table/render-type/user/messages.d.ts +7 -0
- package/dist/types-ts4.5/ui/issue-like-table/styled.d.ts +5 -0
- package/dist/types-ts4.5/ui/issue-like-table/types.d.ts +38 -0
- package/dist/types-ts4.5/ui/issue-like-table/useIsOnScreen.d.ts +1 -0
- package/dist/types-ts4.5/ui/jira-issues/modal/basic-search-input/index.d.ts +12 -0
- package/dist/types-ts4.5/ui/jira-issues/modal/basic-search-input/messages.d.ts +7 -0
- package/dist/types-ts4.5/ui/jira-issues/modal/index.d.ts +13 -0
- package/dist/types-ts4.5/ui/jira-issues/modal/jira-search-container/buildJQL.d.ts +7 -0
- package/dist/types-ts4.5/ui/jira-issues/modal/jira-search-container/index.d.ts +7 -0
- package/dist/types-ts4.5/ui/jira-issues/modal/jira-search-container/messages.d.ts +7 -0
- package/dist/types-ts4.5/ui/jira-issues/modal/jql-editor/index.d.ts +8 -0
- package/dist/types-ts4.5/ui/jira-issues/modal/messages.d.ts +37 -0
- package/dist/types-ts4.5/ui/jira-issues/modal/mode-switcher/index.d.ts +12 -0
- package/dist/types-ts4.5/ui/jira-issues/modal/site-selector/index.d.ts +10 -0
- package/dist/types-ts4.5/ui/jira-issues/modal/site-selector/messages.d.ts +12 -0
- package/dist/types-ts4.5/ui/jira-issues/table-footer/index.d.ts +7 -0
- package/dist/types-ts4.5/ui/jira-issues/table-footer/messages.d.ts +17 -0
- package/dist/types-ts4.5/ui/jira-issues/table-footer/sync-info/index.d.ts +4 -0
- package/dist/types-ts4.5/ui/jira-issues/table-footer/sync-info/messages.d.ts +12 -0
- package/dist/types-ts4.5/ui/jira-issues/tableView.d.ts +3 -0
- package/dist/types-ts4.5/ui/jira-issues/types.d.ts +14 -0
- package/examples-helpers/buildIssueLikeTable.tsx +88 -0
- package/examples-helpers/buildJiraIssuesTable.tsx +31 -0
- package/examples-helpers/images.json +4 -0
- package/examples-helpers/mockAutocompleteData.ts +54 -0
- package/examples-helpers/mockJiraAvailableSites.ts +27 -0
- package/examples-helpers/mockJiraData.ts +546 -0
- package/examples-helpers/mockJqlSmartLinkData.ts +72 -0
- package/examples-helpers/mockSmartLinkData.ts +67 -0
- package/examples-helpers/mockSuggestionData.ts +17 -0
- package/examples-helpers/setupDatasourcesMocks.ts +199 -0
- package/examples-helpers/setupModalExampleMocks.ts +32 -0
- package/examples-helpers/smartLinkCustomClient.ts +26 -0
- package/package.json +118 -0
- package/report.api.md +98 -0
- package/tmp/api-report-tmp.d.ts +64 -0
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import _extends from "@babel/runtime/helpers/extends";
|
|
2
|
+
/** @jsx jsx */
|
|
3
|
+
import { useCallback, useMemo } from 'react';
|
|
4
|
+
import { jsx } from '@emotion/react';
|
|
5
|
+
import Button from '@atlaskit/button/standard-button';
|
|
6
|
+
import BoardIcon from '@atlaskit/icon/glyph/board';
|
|
7
|
+
import ChevronDownIcon from '@atlaskit/icon/glyph/chevron-down';
|
|
8
|
+
import { CheckboxOption, PopupSelect } from '@atlaskit/select';
|
|
9
|
+
export const ColumnPicker = ({
|
|
10
|
+
columns,
|
|
11
|
+
selectedColumnKeys,
|
|
12
|
+
onSelectedColumnKeysChange
|
|
13
|
+
}) => {
|
|
14
|
+
const mapColumnToOption = useCallback(({
|
|
15
|
+
key,
|
|
16
|
+
title
|
|
17
|
+
}) => ({
|
|
18
|
+
label: title,
|
|
19
|
+
value: key
|
|
20
|
+
}), []);
|
|
21
|
+
const selectedOptions = columns.filter(({
|
|
22
|
+
key
|
|
23
|
+
}) => selectedColumnKeys.includes(key)).map(mapColumnToOption);
|
|
24
|
+
const allOptions = useMemo(() => {
|
|
25
|
+
return columns.filter(({
|
|
26
|
+
title,
|
|
27
|
+
key
|
|
28
|
+
}) => title).map(mapColumnToOption);
|
|
29
|
+
}, [columns, mapColumnToOption]);
|
|
30
|
+
const handleChange = useCallback(selectedOptions => {
|
|
31
|
+
const selectedValues = selectedOptions.map(({
|
|
32
|
+
value
|
|
33
|
+
}) => value);
|
|
34
|
+
selectedValues.sort((a, b) => {
|
|
35
|
+
const indexB = columns.findIndex(({
|
|
36
|
+
key
|
|
37
|
+
}) => key === b);
|
|
38
|
+
const indexA = columns.findIndex(({
|
|
39
|
+
key
|
|
40
|
+
}) => key === a);
|
|
41
|
+
return indexA - indexB;
|
|
42
|
+
});
|
|
43
|
+
onSelectedColumnKeysChange(selectedValues);
|
|
44
|
+
}, [columns, onSelectedColumnKeysChange]);
|
|
45
|
+
return jsx(PopupSelect, {
|
|
46
|
+
classNamePrefix: 'column-picker-popup',
|
|
47
|
+
testId: 'column-picker-popup',
|
|
48
|
+
components: {
|
|
49
|
+
Option: CheckboxOption
|
|
50
|
+
},
|
|
51
|
+
options: allOptions,
|
|
52
|
+
value: selectedOptions,
|
|
53
|
+
closeMenuOnSelect: false,
|
|
54
|
+
hideSelectedOptions: false,
|
|
55
|
+
isMulti: true,
|
|
56
|
+
placeholder: "Search for fields" // TODO Translate
|
|
57
|
+
,
|
|
58
|
+
"aria-label": "Search for fields",
|
|
59
|
+
onChange: handleChange,
|
|
60
|
+
target: ({
|
|
61
|
+
isOpen,
|
|
62
|
+
...triggerProps
|
|
63
|
+
}) => jsx(Button, _extends({}, triggerProps, {
|
|
64
|
+
isSelected: isOpen,
|
|
65
|
+
iconBefore: jsx("div", null, jsx(BoardIcon, {
|
|
66
|
+
label: "board",
|
|
67
|
+
size: "small"
|
|
68
|
+
}), jsx(ChevronDownIcon, {
|
|
69
|
+
label: "down",
|
|
70
|
+
size: "small"
|
|
71
|
+
})),
|
|
72
|
+
spacing: "compact",
|
|
73
|
+
appearance: "subtle",
|
|
74
|
+
testId: "column-picker-trigger-button"
|
|
75
|
+
}))
|
|
76
|
+
});
|
|
77
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
/** @jsx jsx */
|
|
2
|
+
import { useEffect, useRef, useState } from 'react';
|
|
3
|
+
import { css, jsx } from '@emotion/react';
|
|
4
|
+
import invariant from 'tiny-invariant';
|
|
5
|
+
import DragHandlerIcon from '@atlaskit/icon/glyph/drag-handler';
|
|
6
|
+
import { attachClosestEdge, extractClosestEdge } from '@atlaskit/pragmatic-drag-and-drop-hitbox/addon/closest-edge';
|
|
7
|
+
import { DropIndicator } from '@atlaskit/pragmatic-drag-and-drop-react-indicator/box';
|
|
8
|
+
import { draggable, dropTargetForElements, monitorForElements } from '@atlaskit/pragmatic-drag-and-drop/adapter/element';
|
|
9
|
+
import { combine } from '@atlaskit/pragmatic-drag-and-drop/util/combine';
|
|
10
|
+
import { TableHeading } from './styled';
|
|
11
|
+
const tableHeadingStyles = css({
|
|
12
|
+
cursor: 'grab'
|
|
13
|
+
});
|
|
14
|
+
const tableHeadingStatusStyles = {
|
|
15
|
+
idle: css({
|
|
16
|
+
':hover': {
|
|
17
|
+
background: "var(--ds-surface-hovered, #091E4224)"
|
|
18
|
+
}
|
|
19
|
+
}),
|
|
20
|
+
dragging: css({
|
|
21
|
+
background: "var(--ds-background-disabled, #091E4224)",
|
|
22
|
+
color: "var(--ds-text-disabled, #091E424F)"
|
|
23
|
+
})
|
|
24
|
+
};
|
|
25
|
+
const verticallyAlignedStyles = css({
|
|
26
|
+
display: 'flex',
|
|
27
|
+
alignItems: 'center',
|
|
28
|
+
whiteSpace: 'nowrap'
|
|
29
|
+
});
|
|
30
|
+
const dragHandleStyles = css({
|
|
31
|
+
position: 'relative',
|
|
32
|
+
display: 'flex',
|
|
33
|
+
alignItems: 'center'
|
|
34
|
+
});
|
|
35
|
+
const dropTargetStyles = css({
|
|
36
|
+
position: 'absolute',
|
|
37
|
+
top: 0,
|
|
38
|
+
left: 0,
|
|
39
|
+
width: '100%'
|
|
40
|
+
});
|
|
41
|
+
const noPointerEventsStyles = css({
|
|
42
|
+
pointerEvents: 'none'
|
|
43
|
+
});
|
|
44
|
+
export const DraggableTableHeading = ({
|
|
45
|
+
children,
|
|
46
|
+
id,
|
|
47
|
+
index,
|
|
48
|
+
tableId,
|
|
49
|
+
dndPreviewHeight,
|
|
50
|
+
onDragPreviewStart,
|
|
51
|
+
onDragPreviewEnd
|
|
52
|
+
}) => {
|
|
53
|
+
const ref = useRef(null);
|
|
54
|
+
const [status, setStatus] = useState('idle');
|
|
55
|
+
const [isDraggingAnyColumn, setIsDraggingAnyColumn] = useState(false);
|
|
56
|
+
const [closestEdge, setClosestEdge] = useState(null);
|
|
57
|
+
const dropTargetRef = useRef(null);
|
|
58
|
+
useEffect(() => {
|
|
59
|
+
const cell = ref.current;
|
|
60
|
+
invariant(cell);
|
|
61
|
+
return combine(draggable({
|
|
62
|
+
element: cell,
|
|
63
|
+
getInitialData() {
|
|
64
|
+
return {
|
|
65
|
+
type: 'table-header',
|
|
66
|
+
id,
|
|
67
|
+
index,
|
|
68
|
+
tableId
|
|
69
|
+
};
|
|
70
|
+
},
|
|
71
|
+
onGenerateDragPreview() {
|
|
72
|
+
setStatus('preview');
|
|
73
|
+
onDragPreviewStart();
|
|
74
|
+
},
|
|
75
|
+
onDragStart() {
|
|
76
|
+
setStatus('dragging');
|
|
77
|
+
onDragPreviewEnd();
|
|
78
|
+
},
|
|
79
|
+
onDrop() {
|
|
80
|
+
setStatus('idle');
|
|
81
|
+
}
|
|
82
|
+
}));
|
|
83
|
+
}, [id, index, onDragPreviewEnd, onDragPreviewStart, tableId]);
|
|
84
|
+
|
|
85
|
+
// Here we handle drop target, that in our case is absolutely positioned div that covers full width and height
|
|
86
|
+
// of this column (has height of whole table). It sits on top of everything, but has `pointerEvents: 'none'` by default
|
|
87
|
+
useEffect(() => {
|
|
88
|
+
const dropTarget = dropTargetRef.current;
|
|
89
|
+
invariant(dropTarget);
|
|
90
|
+
return dropTargetForElements({
|
|
91
|
+
element: dropTarget,
|
|
92
|
+
getIsSticky() {
|
|
93
|
+
return true;
|
|
94
|
+
},
|
|
95
|
+
getData({
|
|
96
|
+
input,
|
|
97
|
+
element
|
|
98
|
+
}) {
|
|
99
|
+
const data = {
|
|
100
|
+
id,
|
|
101
|
+
index
|
|
102
|
+
};
|
|
103
|
+
return attachClosestEdge(data, {
|
|
104
|
+
input,
|
|
105
|
+
element,
|
|
106
|
+
allowedEdges: ['left', 'right']
|
|
107
|
+
});
|
|
108
|
+
},
|
|
109
|
+
canDrop(args) {
|
|
110
|
+
return args.source.data.type === 'table-header' && args.source.data.tableId === tableId;
|
|
111
|
+
},
|
|
112
|
+
onDrag(args) {
|
|
113
|
+
if (args.source.data.id !== id) {
|
|
114
|
+
setClosestEdge(extractClosestEdge(args.self.data));
|
|
115
|
+
}
|
|
116
|
+
},
|
|
117
|
+
onDragLeave() {
|
|
118
|
+
setClosestEdge(null);
|
|
119
|
+
},
|
|
120
|
+
onDrop() {
|
|
121
|
+
setClosestEdge(null);
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
}, [id, index, tableId]);
|
|
125
|
+
|
|
126
|
+
// During dragging anywhere we want to remove `pointerEvents: 'none'` from all the drop targets
|
|
127
|
+
useEffect(() => {
|
|
128
|
+
return monitorForElements({
|
|
129
|
+
canMonitor({
|
|
130
|
+
source
|
|
131
|
+
}) {
|
|
132
|
+
return source.data.type === 'table-header' && source.data.tableId === tableId;
|
|
133
|
+
},
|
|
134
|
+
onDragStart() {
|
|
135
|
+
/**
|
|
136
|
+
* Should cause a synchronous re-render.
|
|
137
|
+
*/
|
|
138
|
+
setIsDraggingAnyColumn(true);
|
|
139
|
+
},
|
|
140
|
+
onDrop() {
|
|
141
|
+
setIsDraggingAnyColumn(false);
|
|
142
|
+
}
|
|
143
|
+
});
|
|
144
|
+
}, [tableId]);
|
|
145
|
+
return jsx(TableHeading, {
|
|
146
|
+
ref: ref,
|
|
147
|
+
css: [tableHeadingStyles, tableHeadingStatusStyles[status]],
|
|
148
|
+
"data-testid": `${id}-column-heading`
|
|
149
|
+
}, jsx("div", {
|
|
150
|
+
ref: dropTargetRef,
|
|
151
|
+
css: [dropTargetStyles, isDraggingAnyColumn ? null : noPointerEventsStyles],
|
|
152
|
+
style: {
|
|
153
|
+
height: `${dndPreviewHeight}px`
|
|
154
|
+
},
|
|
155
|
+
"data-testid": 'column-drop-target'
|
|
156
|
+
}, closestEdge && jsx(DropIndicator, {
|
|
157
|
+
edge: closestEdge
|
|
158
|
+
})), jsx("div", {
|
|
159
|
+
css: verticallyAlignedStyles
|
|
160
|
+
}, jsx("div", {
|
|
161
|
+
css: dragHandleStyles
|
|
162
|
+
}, jsx(DragHandlerIcon, {
|
|
163
|
+
label: `${id}-drag-icon`,
|
|
164
|
+
size: "medium"
|
|
165
|
+
})), children));
|
|
166
|
+
};
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/** @jsx jsx */
|
|
2
|
+
import { useCallback } from 'react';
|
|
3
|
+
import { jsx } from '@emotion/react';
|
|
4
|
+
import { Skeleton } from '@atlaskit/linking-common';
|
|
5
|
+
import UserType from '../render-type/user';
|
|
6
|
+
import { TableHeading } from '../styled';
|
|
7
|
+
import Priority from './priority';
|
|
8
|
+
import Type from './type';
|
|
9
|
+
const columns = [{
|
|
10
|
+
key: 'type',
|
|
11
|
+
title: 'Type'
|
|
12
|
+
}, {
|
|
13
|
+
key: 'issue',
|
|
14
|
+
title: 'Key',
|
|
15
|
+
width: 50
|
|
16
|
+
}, {
|
|
17
|
+
key: 'summary',
|
|
18
|
+
title: 'Summary'
|
|
19
|
+
}, {
|
|
20
|
+
key: 'assignee',
|
|
21
|
+
title: 'Assignee',
|
|
22
|
+
width: 100
|
|
23
|
+
}, {
|
|
24
|
+
key: 'priority',
|
|
25
|
+
title: 'P'
|
|
26
|
+
}, {
|
|
27
|
+
key: 'status',
|
|
28
|
+
title: 'Status'
|
|
29
|
+
}, {
|
|
30
|
+
key: 'resolution',
|
|
31
|
+
title: 'Resolution'
|
|
32
|
+
}, {
|
|
33
|
+
key: 'created',
|
|
34
|
+
title: 'Created'
|
|
35
|
+
}, {
|
|
36
|
+
key: 'due',
|
|
37
|
+
title: 'Updated'
|
|
38
|
+
}];
|
|
39
|
+
const priorities = ['low', 'medium', 'high', 'medium', 'low', 'blocker', 'medium', 'blocker', 'high', 'low'];
|
|
40
|
+
const types = ['task', 'story', 'commit', 'epic', 'bug', 'task', 'story', 'commit', 'issue', 'epic'];
|
|
41
|
+
const summaryColumnWidths = [141, 208, 186, 212, 212, 151, 212, 182, 180, 147];
|
|
42
|
+
const statusColumnWidths = [75, 54, 66, 73, 52, 73, 55, 80, 66, 59];
|
|
43
|
+
const rows = new Array(10).fill(null).map((_, index) => ({
|
|
44
|
+
id: index,
|
|
45
|
+
priority: priorities[index],
|
|
46
|
+
type: types[index],
|
|
47
|
+
summaryWidth: summaryColumnWidths[index],
|
|
48
|
+
statusWidth: statusColumnWidths[index]
|
|
49
|
+
}));
|
|
50
|
+
export default (props => {
|
|
51
|
+
const renderItem = useCallback(({
|
|
52
|
+
key,
|
|
53
|
+
width
|
|
54
|
+
}, {
|
|
55
|
+
priority,
|
|
56
|
+
type,
|
|
57
|
+
summaryWidth,
|
|
58
|
+
statusWidth
|
|
59
|
+
}) => {
|
|
60
|
+
switch (key) {
|
|
61
|
+
case 'assignee':
|
|
62
|
+
return jsx(UserType, null, jsx(Skeleton, {
|
|
63
|
+
width: width,
|
|
64
|
+
height: 13,
|
|
65
|
+
borderRadius: 8
|
|
66
|
+
}));
|
|
67
|
+
case 'priority':
|
|
68
|
+
return jsx(Priority, {
|
|
69
|
+
priority: priority
|
|
70
|
+
});
|
|
71
|
+
case 'type':
|
|
72
|
+
return jsx(Type, {
|
|
73
|
+
type: type
|
|
74
|
+
});
|
|
75
|
+
case 'summary':
|
|
76
|
+
return jsx(Skeleton, {
|
|
77
|
+
appearance: "blue",
|
|
78
|
+
width: summaryWidth,
|
|
79
|
+
borderRadius: 10,
|
|
80
|
+
height: 13
|
|
81
|
+
});
|
|
82
|
+
case 'status':
|
|
83
|
+
return jsx(Skeleton, {
|
|
84
|
+
appearance: "blue",
|
|
85
|
+
width: statusWidth,
|
|
86
|
+
height: 16,
|
|
87
|
+
borderRadius: 3
|
|
88
|
+
});
|
|
89
|
+
default:
|
|
90
|
+
return jsx(Skeleton, {
|
|
91
|
+
width: width,
|
|
92
|
+
height: 13,
|
|
93
|
+
borderRadius: 8
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
}, []);
|
|
97
|
+
return jsx("table", {
|
|
98
|
+
"data-testid": props.testId
|
|
99
|
+
}, jsx("thead", null, jsx("tr", null, columns.map(({
|
|
100
|
+
title,
|
|
101
|
+
key,
|
|
102
|
+
width
|
|
103
|
+
}) => jsx(TableHeading, {
|
|
104
|
+
key: key,
|
|
105
|
+
style: {
|
|
106
|
+
width
|
|
107
|
+
}
|
|
108
|
+
}, title)))), jsx("tbody", null, rows.map(row => jsx("tr", {
|
|
109
|
+
key: row.id
|
|
110
|
+
}, columns.map(column => jsx("td", {
|
|
111
|
+
key: column.key
|
|
112
|
+
}, renderItem(column, row)))))));
|
|
113
|
+
});
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { B300, R300, Y300 } from '@atlaskit/theme/colors';
|
|
3
|
+
import IconType from '../render-type/icon';
|
|
4
|
+
// https://stackoverflow.com/questions/61099149/svg-fill-color-not-working-with-hex-colors
|
|
5
|
+
const replaceHashInHex = hex => hex.replace('#', '%23');
|
|
6
|
+
const priorityToSVGPathMap = {
|
|
7
|
+
low: ` <path
|
|
8
|
+
d="M12.5 6.1c.5-.3 1.1-.1 1.4.4.3.5.1 1.1-.3 1.3l-5 3c-.3.2-.7.2-1 0l-5-3c-.6-.2-.7-.9-.4-1.3.2-.5.9-.7 1.3-.4L8 8.8l4.5-2.7z"
|
|
9
|
+
fill="${replaceHashInHex(B300)}"
|
|
10
|
+
/>`,
|
|
11
|
+
medium: `<path
|
|
12
|
+
fill="${replaceHashInHex(Y300)}"
|
|
13
|
+
d="M3,4h10c0.6,0,1,0.4,1,1s-0.4,1-1,1H3C2.4,6,2,5.6,2,5S2.4,4,3,4z M3,10h10c0.6,0,1,0.4,1,1s-0.4,1-1,1H3
|
|
14
|
+
c-0.6,0-1-0.4-1-1S2.4,10,3,10z"
|
|
15
|
+
/>`,
|
|
16
|
+
high: `<path
|
|
17
|
+
d="M3.5 9.9c-.5.3-1.1.1-1.4-.3s-.1-1.1.4-1.4l5-3c.3-.2.7-.2 1 0l5 3c.5.3.6.9.3 1.4-.3.5-.9.6-1.4.3L8 7.2 3.5 9.9z"
|
|
18
|
+
fill="${replaceHashInHex(R300)}"
|
|
19
|
+
/>`,
|
|
20
|
+
blocker: `<path
|
|
21
|
+
d="M8 15c-3.9 0-7-3.1-7-7s3.1-7 7-7 7 3.1 7 7-3.1 7-7 7zM4 7c-.6 0-1 .4-1 1s.4 1 1 1h8c.6 0 1-.4 1-1s-.4-1-1-1H4z"
|
|
22
|
+
fill="${replaceHashInHex(R300)}"
|
|
23
|
+
/>`
|
|
24
|
+
};
|
|
25
|
+
export default (({
|
|
26
|
+
priority
|
|
27
|
+
}) => {
|
|
28
|
+
const image = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16">${priorityToSVGPathMap[priority]}</svg>`;
|
|
29
|
+
return /*#__PURE__*/React.createElement(IconType, {
|
|
30
|
+
source: `data:image/svg+xml;utf8,${image}`
|
|
31
|
+
});
|
|
32
|
+
});
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import styled from '@emotion/styled';
|
|
3
|
+
import Bug16Icon from '@atlaskit/icon-object/glyph/bug/16';
|
|
4
|
+
import Commit16Icon from '@atlaskit/icon-object/glyph/commit/16';
|
|
5
|
+
import Epic16Icon from '@atlaskit/icon-object/glyph/epic/16';
|
|
6
|
+
import Issue16Icon from '@atlaskit/icon-object/glyph/issue/16';
|
|
7
|
+
import Story16Icon from '@atlaskit/icon-object/glyph/story/16';
|
|
8
|
+
import Task16Icon from '@atlaskit/icon-object/glyph/task/16';
|
|
9
|
+
const IconWrapper = styled.div`
|
|
10
|
+
display: flex;
|
|
11
|
+
align-items: center;
|
|
12
|
+
justify-content: center;
|
|
13
|
+
`;
|
|
14
|
+
export default (({
|
|
15
|
+
type
|
|
16
|
+
}) => {
|
|
17
|
+
const TypeIcon = () => {
|
|
18
|
+
switch (type) {
|
|
19
|
+
case 'issue':
|
|
20
|
+
return /*#__PURE__*/React.createElement(Issue16Icon, {
|
|
21
|
+
label: 'issue'
|
|
22
|
+
});
|
|
23
|
+
case 'commit':
|
|
24
|
+
return /*#__PURE__*/React.createElement(Commit16Icon, {
|
|
25
|
+
label: 'commit'
|
|
26
|
+
});
|
|
27
|
+
case 'story':
|
|
28
|
+
return /*#__PURE__*/React.createElement(Story16Icon, {
|
|
29
|
+
label: 'story'
|
|
30
|
+
});
|
|
31
|
+
case 'epic':
|
|
32
|
+
return /*#__PURE__*/React.createElement(Epic16Icon, {
|
|
33
|
+
label: 'epic'
|
|
34
|
+
});
|
|
35
|
+
case 'bug':
|
|
36
|
+
return /*#__PURE__*/React.createElement(Bug16Icon, {
|
|
37
|
+
label: 'bug'
|
|
38
|
+
});
|
|
39
|
+
case 'task':
|
|
40
|
+
return /*#__PURE__*/React.createElement(Task16Icon, {
|
|
41
|
+
label: 'task'
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
return /*#__PURE__*/React.createElement(IconWrapper, null, /*#__PURE__*/React.createElement(TypeIcon, null));
|
|
46
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
/** @jsx jsx */
|
|
2
|
+
import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
|
3
|
+
import { css, jsx } from '@emotion/react';
|
|
4
|
+
import invariant from 'tiny-invariant';
|
|
5
|
+
import { Skeleton } from '@atlaskit/linking-common';
|
|
6
|
+
import { autoScroller } from '@atlaskit/pragmatic-drag-and-drop-autoscroll';
|
|
7
|
+
import { extractClosestEdge } from '@atlaskit/pragmatic-drag-and-drop-hitbox/addon/closest-edge';
|
|
8
|
+
import { reorderWithEdge } from '@atlaskit/pragmatic-drag-and-drop-hitbox/util/reorder-with-edge';
|
|
9
|
+
import { monitorForElements } from '@atlaskit/pragmatic-drag-and-drop/adapter/element';
|
|
10
|
+
import { combine } from '@atlaskit/pragmatic-drag-and-drop/util/combine';
|
|
11
|
+
import { ColumnPicker } from './column-picker';
|
|
12
|
+
import { DraggableTableHeading } from './draggable-table-heading';
|
|
13
|
+
import TableEmptyState from './empty-state';
|
|
14
|
+
import { fallbackRenderType } from './render-type';
|
|
15
|
+
import { TableHeading } from './styled';
|
|
16
|
+
import { useIsOnScreen } from './useIsOnScreen';
|
|
17
|
+
const tableHeadStyles = css({
|
|
18
|
+
background: "var(--ds-surface, #FFF)",
|
|
19
|
+
borderTop: '2px solid transparent'
|
|
20
|
+
});
|
|
21
|
+
const columnPickerHeaderStyles = css({
|
|
22
|
+
width: '40px',
|
|
23
|
+
// TODO use some variable for that?
|
|
24
|
+
paddingBlock: "var(--ds-space-100, 8px)"
|
|
25
|
+
});
|
|
26
|
+
const tableDragPreviewStyles = css({
|
|
27
|
+
backgroundColor: "var(--ds-surface, #FFF)"
|
|
28
|
+
});
|
|
29
|
+
const containerDragPreviewStyles = css({
|
|
30
|
+
overflow: 'hidden'
|
|
31
|
+
});
|
|
32
|
+
function extractIndex(data) {
|
|
33
|
+
const {
|
|
34
|
+
index
|
|
35
|
+
} = data;
|
|
36
|
+
invariant(typeof index === 'number');
|
|
37
|
+
return index;
|
|
38
|
+
}
|
|
39
|
+
const orderColumns = (columns, visibleColumnKeys) => {
|
|
40
|
+
// newColumnKeyOrder contains keys of selected (visible columns only).
|
|
41
|
+
// In order to sort all the columns we need to insert unselected ones into this list
|
|
42
|
+
// We put them into their absolution position as it was in unchanged (before column move) order.
|
|
43
|
+
columns.forEach(({
|
|
44
|
+
key
|
|
45
|
+
}, index) => {
|
|
46
|
+
if (!visibleColumnKeys.includes(key)) {
|
|
47
|
+
visibleColumnKeys.splice(index, 0, key);
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
columns.sort((a, b) => {
|
|
51
|
+
const indexB = visibleColumnKeys.indexOf(b.key);
|
|
52
|
+
const indexA = visibleColumnKeys.indexOf(a.key);
|
|
53
|
+
return indexA - indexB;
|
|
54
|
+
});
|
|
55
|
+
return [...columns];
|
|
56
|
+
};
|
|
57
|
+
export const IssueLikeDataTableView = ({
|
|
58
|
+
testId,
|
|
59
|
+
onNextPage,
|
|
60
|
+
items,
|
|
61
|
+
columns,
|
|
62
|
+
renderItem = fallbackRenderType,
|
|
63
|
+
visibleColumnKeys,
|
|
64
|
+
onVisibleColumnKeysChange,
|
|
65
|
+
status,
|
|
66
|
+
hasNextPage
|
|
67
|
+
}) => {
|
|
68
|
+
var _orderedColumns$find;
|
|
69
|
+
const tableId = useMemo(() => Symbol('unique-id'), []);
|
|
70
|
+
const [lastRowElement, setLastRowElement] = useState(null);
|
|
71
|
+
const [isDragPreview, setIsDragPreview] = useState(false);
|
|
72
|
+
const isBottomOfTableVisibleRaw = useIsOnScreen(lastRowElement);
|
|
73
|
+
const containerRef = useRef(null);
|
|
74
|
+
const [orderedColumns, setOrderedColumns] = useState(() => orderColumns([...columns], [...visibleColumnKeys]));
|
|
75
|
+
const visibleSortedColumns = useMemo(() => visibleColumnKeys.map(visibleKey => orderedColumns.find(({
|
|
76
|
+
key
|
|
77
|
+
}) => visibleKey === key)).filter(Boolean), [orderedColumns, visibleColumnKeys]);
|
|
78
|
+
|
|
79
|
+
// TODO seems like this component can't handle some combination of incremental data retreaval.
|
|
80
|
+
// If data comes first, then columns and then visibleColumnKeys it blows up,
|
|
81
|
+
// or some other combination.
|
|
82
|
+
|
|
83
|
+
const identityColumnKey = (_orderedColumns$find = orderedColumns.find(column => column.isIdentity)) === null || _orderedColumns$find === void 0 ? void 0 : _orderedColumns$find.key;
|
|
84
|
+
const loadingRow = useMemo(() => ({
|
|
85
|
+
key: 'loading',
|
|
86
|
+
cells: visibleSortedColumns.map(({
|
|
87
|
+
key
|
|
88
|
+
}) => {
|
|
89
|
+
const content = jsx(Skeleton, {
|
|
90
|
+
borderRadius: "var(--ds-radius-100, 3px)",
|
|
91
|
+
width: '100%',
|
|
92
|
+
height: '20px'
|
|
93
|
+
});
|
|
94
|
+
return {
|
|
95
|
+
key,
|
|
96
|
+
content
|
|
97
|
+
};
|
|
98
|
+
})
|
|
99
|
+
}), [visibleSortedColumns]);
|
|
100
|
+
const headColumns = visibleSortedColumns.map(column => ({
|
|
101
|
+
key: column.key,
|
|
102
|
+
content: column.title,
|
|
103
|
+
// width: TODO Find out how we going to retrieve column width
|
|
104
|
+
shouldTruncate: true
|
|
105
|
+
}));
|
|
106
|
+
useEffect(() => {
|
|
107
|
+
if (status === 'empty' || isBottomOfTableVisibleRaw && hasNextPage && status !== 'loading') {
|
|
108
|
+
void onNextPage();
|
|
109
|
+
}
|
|
110
|
+
}, [isBottomOfTableVisibleRaw, status, hasNextPage, onNextPage]);
|
|
111
|
+
let dndPreviewHeight = 0;
|
|
112
|
+
if (items.length > 0 && containerRef.current) {
|
|
113
|
+
const containerEl = containerRef.current;
|
|
114
|
+
invariant(containerEl);
|
|
115
|
+
dndPreviewHeight = containerEl.offsetHeight;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// This variable contains initial Y mouse coordinate, so we can restrict
|
|
119
|
+
// autoScroller in X axis only
|
|
120
|
+
const initialAutoScrollerClientY = useRef();
|
|
121
|
+
useEffect(() => {
|
|
122
|
+
if (!onVisibleColumnKeysChange) {
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
return combine(monitorForElements({
|
|
126
|
+
onDragStart: ({
|
|
127
|
+
location
|
|
128
|
+
}) => {
|
|
129
|
+
initialAutoScrollerClientY.current = location.current.input.clientY;
|
|
130
|
+
autoScroller.start({
|
|
131
|
+
input: location.current.input,
|
|
132
|
+
behavior: 'container-only'
|
|
133
|
+
});
|
|
134
|
+
},
|
|
135
|
+
onDrag: ({
|
|
136
|
+
location
|
|
137
|
+
}) => {
|
|
138
|
+
autoScroller.updateInput({
|
|
139
|
+
input: {
|
|
140
|
+
...location.current.input,
|
|
141
|
+
clientY: initialAutoScrollerClientY.current || 0
|
|
142
|
+
}
|
|
143
|
+
});
|
|
144
|
+
},
|
|
145
|
+
onDrop({
|
|
146
|
+
source,
|
|
147
|
+
location
|
|
148
|
+
}) {
|
|
149
|
+
initialAutoScrollerClientY.current = null;
|
|
150
|
+
autoScroller.stop();
|
|
151
|
+
if (location.current.dropTargets.length === 0) {
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
const target = location.current.dropTargets[0];
|
|
155
|
+
if (source.data.id === target.data.id) {
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
if (source.data.type === 'table-header' && source.data.tableId === tableId) {
|
|
159
|
+
const closestEdgeOfTarget = extractClosestEdge(target.data);
|
|
160
|
+
invariant(closestEdgeOfTarget === 'left' || closestEdgeOfTarget === 'right');
|
|
161
|
+
const startIndex = extractIndex(source.data);
|
|
162
|
+
const indexOfTarget = extractIndex(target.data);
|
|
163
|
+
const newColumnKeyOrder = reorderWithEdge({
|
|
164
|
+
list: visibleColumnKeys,
|
|
165
|
+
closestEdgeOfTarget,
|
|
166
|
+
startIndex,
|
|
167
|
+
indexOfTarget,
|
|
168
|
+
axis: 'horizontal'
|
|
169
|
+
});
|
|
170
|
+
onVisibleColumnKeysChange === null || onVisibleColumnKeysChange === void 0 ? void 0 : onVisibleColumnKeysChange([...newColumnKeyOrder]);
|
|
171
|
+
|
|
172
|
+
// We sort columns (whole objects) according to their key order presented in newColumnKeyOrder
|
|
173
|
+
setOrderedColumns(columns => {
|
|
174
|
+
return orderColumns([...columns], [...newColumnKeyOrder]);
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}));
|
|
179
|
+
}, [visibleColumnKeys, onVisibleColumnKeysChange, tableId]);
|
|
180
|
+
const tableRows = useMemo(() => items.map((newRowData, rowIndex) => ({
|
|
181
|
+
key: `${identityColumnKey && newRowData[identityColumnKey] || rowIndex}`,
|
|
182
|
+
cells: visibleSortedColumns.map(({
|
|
183
|
+
key,
|
|
184
|
+
type
|
|
185
|
+
}) => {
|
|
186
|
+
const value = newRowData[key];
|
|
187
|
+
const values = Array.isArray(value) ? value : [value];
|
|
188
|
+
const content = values.map(value => renderItem({
|
|
189
|
+
type,
|
|
190
|
+
value
|
|
191
|
+
}));
|
|
192
|
+
return {
|
|
193
|
+
key,
|
|
194
|
+
content
|
|
195
|
+
};
|
|
196
|
+
}),
|
|
197
|
+
ref: rowIndex === items.length - 1 ? el => setLastRowElement(el) : undefined
|
|
198
|
+
})), [identityColumnKey, renderItem, items, visibleSortedColumns]);
|
|
199
|
+
const rows = [...tableRows, ...(status === 'loading' ? [loadingRow] : [])];
|
|
200
|
+
const setIsDragPreviewOn = useCallback(() => setIsDragPreview(true), [setIsDragPreview]);
|
|
201
|
+
const setIsDragPreviewOff = useCallback(() => setIsDragPreview(false), [setIsDragPreview]);
|
|
202
|
+
const onSelectedColumnKeysChange = useCallback(newSelectedColumnKeys => {
|
|
203
|
+
onVisibleColumnKeysChange === null || onVisibleColumnKeysChange === void 0 ? void 0 : onVisibleColumnKeysChange(newSelectedColumnKeys);
|
|
204
|
+
}, [onVisibleColumnKeysChange]);
|
|
205
|
+
return jsx("div", {
|
|
206
|
+
ref: containerRef,
|
|
207
|
+
css: isDragPreview ? containerDragPreviewStyles : null
|
|
208
|
+
}, jsx("table", {
|
|
209
|
+
css: isDragPreview ? tableDragPreviewStyles : null,
|
|
210
|
+
"data-testid": testId
|
|
211
|
+
}, jsx("thead", {
|
|
212
|
+
"data-testid": testId && `${testId}--head`,
|
|
213
|
+
css: tableHeadStyles
|
|
214
|
+
}, jsx("tr", null, headColumns.map(({
|
|
215
|
+
key,
|
|
216
|
+
content
|
|
217
|
+
}, cellIndex) => {
|
|
218
|
+
if (onVisibleColumnKeysChange) {
|
|
219
|
+
return jsx(DraggableTableHeading, {
|
|
220
|
+
tableId: tableId,
|
|
221
|
+
key: key,
|
|
222
|
+
id: key,
|
|
223
|
+
index: cellIndex,
|
|
224
|
+
dndPreviewHeight: dndPreviewHeight,
|
|
225
|
+
onDragPreviewStart: setIsDragPreviewOn,
|
|
226
|
+
onDragPreviewEnd: setIsDragPreviewOff
|
|
227
|
+
}, content);
|
|
228
|
+
} else {
|
|
229
|
+
return jsx(TableHeading, {
|
|
230
|
+
key: key,
|
|
231
|
+
"data-testid": `${key}-column-heading`
|
|
232
|
+
}, content);
|
|
233
|
+
}
|
|
234
|
+
}), onVisibleColumnKeysChange && jsx("th", {
|
|
235
|
+
css: columnPickerHeaderStyles
|
|
236
|
+
}, jsx(ColumnPicker, {
|
|
237
|
+
columns: orderedColumns,
|
|
238
|
+
selectedColumnKeys: visibleColumnKeys,
|
|
239
|
+
onSelectedColumnKeysChange: onSelectedColumnKeysChange
|
|
240
|
+
})))), jsx("tbody", {
|
|
241
|
+
"data-testid": testId && `${testId}--body`
|
|
242
|
+
}, rows.map(({
|
|
243
|
+
key,
|
|
244
|
+
cells,
|
|
245
|
+
ref
|
|
246
|
+
}) => jsx("tr", {
|
|
247
|
+
key: key,
|
|
248
|
+
"data-testid": testId && `${testId}--row-${key}`,
|
|
249
|
+
ref: ref
|
|
250
|
+
}, cells.map(({
|
|
251
|
+
key,
|
|
252
|
+
content
|
|
253
|
+
}, cellIndex) => jsx("td", {
|
|
254
|
+
key: key,
|
|
255
|
+
"data-testid": testId && `${testId}--cell-${cellIndex}`,
|
|
256
|
+
colSpan: cellIndex + 1 === cells.length ? 2 : undefined
|
|
257
|
+
}, content)))))));
|
|
258
|
+
};
|
|
259
|
+
export const EmptyState = TableEmptyState;
|