@journeyapps-labs/reactor-mod-data-browser 3.0.1 → 3.1.0
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 +45 -0
- package/dist/@types/actions/connections/SetConnectionColorAction.d.ts +11 -0
- package/dist/@types/actions/saved-queries/OpenSavedQueryAction.d.ts +10 -0
- package/dist/@types/actions/saved-queries/RemoveSavedQueryAction.d.ts +9 -0
- package/dist/@types/core/AbstractConnection.d.ts +2 -0
- package/dist/@types/core/SchemaModelDefinition.d.ts +5 -0
- package/dist/@types/core/connection-colors.d.ts +10 -0
- package/dist/@types/core/query/StandardModelFields.d.ts +5 -0
- package/dist/@types/core/query/filters.d.ts +46 -5
- package/dist/@types/core/query/query-simple/SimplePage.d.ts +2 -0
- package/dist/@types/core/query/query-simple/SimpleQuery.d.ts +12 -3
- package/dist/@types/core/query/query-simple/SimpleQueryColumns.d.ts +12 -0
- package/dist/@types/core/query/query-simple/SimpleQueryFilterState.d.ts +37 -0
- package/dist/@types/core/query/query-simple/SimpleQueryPlanner.d.ts +4 -0
- package/dist/@types/core/query/query-simple/SimpleQuerySortState.d.ts +23 -0
- package/dist/@types/core/query/query-simple/SimpleQueryTypes.d.ts +24 -0
- package/dist/@types/core/query/widgets/ColumnDisplayWidget.d.ts +1 -0
- package/dist/@types/core/query/widgets/PeekRelationshipButton.d.ts +7 -0
- package/dist/@types/core/query/widgets/SmartColumnWidget.d.ts +3 -0
- package/dist/@types/core/query/widgets/SmartFilterWidget.d.ts +6 -0
- package/dist/@types/entities/ConnectionEntityDefinition.d.ts +2 -0
- package/dist/@types/entities/SavedQueryEntityDefinition.d.ts +8 -0
- package/dist/@types/entities.d.ts +2 -1
- package/dist/@types/forms/APIConnectionForm.d.ts +1 -0
- package/dist/@types/forms/TypeEngine.d.ts +3 -21
- package/dist/@types/forms/types/attachment-handler.d.ts +2 -0
- package/dist/@types/forms/types/boolean-handler.d.ts +2 -0
- package/dist/@types/forms/types/date-handler.d.ts +2 -0
- package/dist/@types/forms/types/filters/ClearableFilterFormDialogDirective.d.ts +10 -0
- package/dist/@types/forms/types/filters/ConditionalFilterForm.d.ts +23 -0
- package/dist/@types/forms/types/image-handler.d.ts +2 -0
- package/dist/@types/forms/types/location-handler.d.ts +2 -0
- package/dist/@types/forms/types/multiple-choice-handler.d.ts +2 -0
- package/dist/@types/forms/types/multiple-choice-integer-handler.d.ts +2 -0
- package/dist/@types/forms/types/number-handler.d.ts +2 -0
- package/dist/@types/forms/types/shared/type-handler.d.ts +37 -0
- package/dist/@types/forms/types/shared/ui.d.ts +768 -0
- package/dist/@types/forms/types/single-choice-handler.d.ts +2 -0
- package/dist/@types/forms/types/single-choice-integer-handler.d.ts +2 -0
- package/dist/@types/forms/types/text-handler.d.ts +3 -0
- package/dist/@types/index.d.ts +1 -0
- package/dist/@types/panels/_shared/SharedConnectionPanelFactory.d.ts +19 -0
- package/dist/@types/panels/_shared/SharedModelPanelFactory.d.ts +5 -2
- package/dist/@types/panels/query/QueryPanelFactory.d.ts +6 -2
- package/dist/@types/panels/query/TableControlsWidget.d.ts +2 -0
- package/dist/@types/panels/query/table-controls/ChangesControlsWidget.d.ts +8 -0
- package/dist/@types/panels/query/table-controls/FilterControlsWidget.d.ts +7 -0
- package/dist/@types/panels/query/table-controls/PageControlsWidget.d.ts +9 -0
- package/dist/@types/panels/query/table-controls/QueryControlsWidget.d.ts +11 -0
- package/dist/@types/panels/query/table-controls/SortChipWidget.d.ts +10 -0
- package/dist/@types/panels/query/table-controls/SortControlsWidget.d.ts +7 -0
- package/dist/@types/preferences/QueryControlPreferences.d.ts +7 -0
- package/dist/@types/stores/SavedQueryStore.d.ts +34 -0
- package/dist/@types/widgets/EmptyValueWidget.d.ts +7 -0
- package/dist/DataBrowserModule.js +21 -7
- package/dist/DataBrowserModule.js.map +1 -1
- package/dist/actions/connections/AddConnectionAction.js +2 -2
- package/dist/actions/connections/AddConnectionAction.js.map +1 -1
- package/dist/actions/connections/RemoveConnectionAction.js +2 -2
- package/dist/actions/connections/RemoveConnectionAction.js.map +1 -1
- package/dist/actions/connections/SetConnectionColorAction.js +63 -0
- package/dist/actions/connections/SetConnectionColorAction.js.map +1 -0
- package/dist/actions/saved-queries/OpenSavedQueryAction.js +58 -0
- package/dist/actions/saved-queries/OpenSavedQueryAction.js.map +1 -0
- package/dist/actions/saved-queries/RemoveSavedQueryAction.js +43 -0
- package/dist/actions/saved-queries/RemoveSavedQueryAction.js.map +1 -0
- package/dist/actions/schema-definitions/CreateModelAction.js +2 -2
- package/dist/actions/schema-definitions/CreateModelAction.js.map +1 -1
- package/dist/actions/schema-definitions/QuerySchemaModelAction.js +2 -2
- package/dist/actions/schema-definitions/QuerySchemaModelAction.js.map +1 -1
- package/dist/actions/schema-model/EditSchemaModelAction.js +2 -2
- package/dist/actions/schema-model/EditSchemaModelAction.js.map +1 -1
- package/dist/actions/schema-model/ViewSchemaModelAsJsonAction.js +2 -2
- package/dist/actions/schema-model/ViewSchemaModelAsJsonAction.js.map +1 -1
- package/dist/core/AbstractConnection.js +116 -90
- package/dist/core/AbstractConnection.js.map +1 -1
- package/dist/core/SchemaModelDefinition.js +14 -0
- package/dist/core/SchemaModelDefinition.js.map +1 -1
- package/dist/core/connection-colors.js +36 -0
- package/dist/core/connection-colors.js.map +1 -0
- package/dist/core/query/StandardModelFields.js +10 -0
- package/dist/core/query/StandardModelFields.js.map +1 -0
- package/dist/core/query/filters.js +86 -4
- package/dist/core/query/filters.js.map +1 -1
- package/dist/core/query/query-simple/SimplePage.js +2 -4
- package/dist/core/query/query-simple/SimplePage.js.map +1 -1
- package/dist/core/query/query-simple/SimpleQuery.js +64 -68
- package/dist/core/query/query-simple/SimpleQuery.js.map +1 -1
- package/dist/core/query/query-simple/SimpleQueryColumns.js +88 -0
- package/dist/core/query/query-simple/SimpleQueryColumns.js.map +1 -0
- package/dist/core/query/query-simple/SimpleQueryFilterState.js +136 -0
- package/dist/core/query/query-simple/SimpleQueryFilterState.js.map +1 -0
- package/dist/core/query/query-simple/SimpleQueryPlanner.js +14 -0
- package/dist/core/query/query-simple/SimpleQueryPlanner.js.map +1 -0
- package/dist/core/query/query-simple/SimpleQuerySortState.js +140 -0
- package/dist/core/query/query-simple/SimpleQuerySortState.js.map +1 -0
- package/dist/core/query/query-simple/SimpleQueryTypes.js +44 -0
- package/dist/core/query/query-simple/SimpleQueryTypes.js.map +1 -0
- package/dist/core/query/widgets/BelongsToDisplayWidget.js +14 -7
- package/dist/core/query/widgets/BelongsToDisplayWidget.js.map +1 -1
- package/dist/core/query/widgets/CellDisplayWidget.js +5 -9
- package/dist/core/query/widgets/CellDisplayWidget.js.map +1 -1
- package/dist/core/query/widgets/ColumnDisplayWidget.js +13 -12
- package/dist/core/query/widgets/ColumnDisplayWidget.js.map +1 -1
- package/dist/core/query/widgets/PeekRelationshipButton.js +128 -0
- package/dist/core/query/widgets/PeekRelationshipButton.js.map +1 -0
- package/dist/core/query/widgets/SmartColumnWidget.js +18 -3
- package/dist/core/query/widgets/SmartColumnWidget.js.map +1 -1
- package/dist/core/query/widgets/SmartFilterWidget.js +88 -51
- package/dist/core/query/widgets/SmartFilterWidget.js.map +1 -1
- package/dist/entities/ConnectionEntityDefinition.js +32 -7
- package/dist/entities/ConnectionEntityDefinition.js.map +1 -1
- package/dist/entities/SavedQueryEntityDefinition.js +68 -0
- package/dist/entities/SavedQueryEntityDefinition.js.map +1 -0
- package/dist/entities/SchemaModelDefinitionEntityDefinition.js +3 -1
- package/dist/entities/SchemaModelDefinitionEntityDefinition.js.map +1 -1
- package/dist/entities.js +1 -0
- package/dist/entities.js.map +1 -1
- package/dist/forms/APIConnectionForm.js +11 -2
- package/dist/forms/APIConnectionForm.js.map +1 -1
- package/dist/forms/TypeEngine.js +30 -306
- package/dist/forms/TypeEngine.js.map +1 -1
- package/dist/forms/types/attachment-handler.js +29 -0
- package/dist/forms/types/attachment-handler.js.map +1 -0
- package/dist/forms/types/boolean-handler.js +22 -0
- package/dist/forms/types/boolean-handler.js.map +1 -0
- package/dist/forms/types/date-handler.js +97 -0
- package/dist/forms/types/date-handler.js.map +1 -0
- package/dist/forms/types/filters/ClearableFilterFormDialogDirective.js +25 -0
- package/dist/forms/types/filters/ClearableFilterFormDialogDirective.js.map +1 -0
- package/dist/forms/types/filters/ConditionalFilterForm.js +87 -0
- package/dist/forms/types/filters/ConditionalFilterForm.js.map +1 -0
- package/dist/forms/types/image-handler.js +82 -0
- package/dist/forms/types/image-handler.js.map +1 -0
- package/dist/forms/types/location-handler.js +49 -0
- package/dist/forms/types/location-handler.js.map +1 -0
- package/dist/forms/types/multiple-choice-handler.js +37 -0
- package/dist/forms/types/multiple-choice-handler.js.map +1 -0
- package/dist/forms/types/multiple-choice-integer-handler.js +37 -0
- package/dist/forms/types/multiple-choice-integer-handler.js.map +1 -0
- package/dist/forms/types/number-handler.js +79 -0
- package/dist/forms/types/number-handler.js.map +1 -0
- package/dist/forms/types/shared/type-handler.js +2 -0
- package/dist/forms/types/shared/type-handler.js.map +1 -0
- package/dist/forms/types/shared/ui.js +33 -0
- package/dist/forms/types/shared/ui.js.map +1 -0
- package/dist/forms/types/single-choice-handler.js +41 -0
- package/dist/forms/types/single-choice-handler.js.map +1 -0
- package/dist/forms/types/single-choice-integer-handler.js +41 -0
- package/dist/forms/types/single-choice-integer-handler.js.map +1 -0
- package/dist/forms/types/text-handler.js +170 -0
- package/dist/forms/types/text-handler.js.map +1 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/panels/_shared/SharedConnectionPanelFactory.js +48 -0
- package/dist/panels/_shared/SharedConnectionPanelFactory.js.map +1 -0
- package/dist/panels/_shared/SharedModelPanelFactory.js +7 -2
- package/dist/panels/_shared/SharedModelPanelFactory.js.map +1 -1
- package/dist/panels/query/PageResultsWidget.js +28 -11
- package/dist/panels/query/PageResultsWidget.js.map +1 -1
- package/dist/panels/query/QueryPanelFactory.js +17 -2
- package/dist/panels/query/QueryPanelFactory.js.map +1 -1
- package/dist/panels/query/QueryPanelWidget.js +55 -9
- package/dist/panels/query/QueryPanelWidget.js.map +1 -1
- package/dist/panels/query/TableControlsWidget.js +29 -67
- package/dist/panels/query/TableControlsWidget.js.map +1 -1
- package/dist/panels/query/table-controls/ChangesControlsWidget.js +36 -0
- package/dist/panels/query/table-controls/ChangesControlsWidget.js.map +1 -0
- package/dist/panels/query/table-controls/FilterControlsWidget.js +106 -0
- package/dist/panels/query/table-controls/FilterControlsWidget.js.map +1 -0
- package/dist/panels/query/table-controls/PageControlsWidget.js +65 -0
- package/dist/panels/query/table-controls/PageControlsWidget.js.map +1 -0
- package/dist/panels/query/table-controls/QueryControlsWidget.js +85 -0
- package/dist/panels/query/table-controls/QueryControlsWidget.js.map +1 -0
- package/dist/panels/query/table-controls/SortChipWidget.js +75 -0
- package/dist/panels/query/table-controls/SortChipWidget.js.map +1 -0
- package/dist/panels/query/table-controls/SortControlsWidget.js +65 -0
- package/dist/panels/query/table-controls/SortControlsWidget.js.map +1 -0
- package/dist/preferences/QueryControlPreferences.js +28 -0
- package/dist/preferences/QueryControlPreferences.js.map +1 -0
- package/dist/stores/ConnectionStore.js +2 -0
- package/dist/stores/ConnectionStore.js.map +1 -1
- package/dist/stores/SavedQueryStore.js +131 -0
- package/dist/stores/SavedQueryStore.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/widgets/EmptyValueWidget.js +15 -0
- package/dist/widgets/EmptyValueWidget.js.map +1 -0
- package/dist-module/bundle.js +181 -51
- package/dist-module/bundle.js.map +1 -1
- package/package.json +13 -13
- package/src/DataBrowserModule.ts +21 -7
- package/src/actions/connections/AddConnectionAction.tsx +2 -2
- package/src/actions/connections/RemoveConnectionAction.tsx +2 -2
- package/src/actions/connections/SetConnectionColorAction.ts +52 -0
- package/src/actions/saved-queries/OpenSavedQueryAction.ts +43 -0
- package/src/actions/saved-queries/RemoveSavedQueryAction.ts +27 -0
- package/src/actions/schema-definitions/CreateModelAction.ts +9 -2
- package/src/actions/schema-definitions/QuerySchemaModelAction.ts +9 -2
- package/src/actions/schema-model/EditSchemaModelAction.ts +9 -2
- package/src/actions/schema-model/ViewSchemaModelAsJsonAction.ts +9 -2
- package/src/core/AbstractConnection.ts +7 -1
- package/src/core/SchemaModelDefinition.ts +16 -0
- package/src/core/connection-colors.ts +49 -0
- package/src/core/query/StandardModelFields.ts +9 -0
- package/src/core/query/filters.ts +121 -6
- package/src/core/query/query-simple/SimplePage.ts +4 -5
- package/src/core/query/query-simple/SimpleQuery.tsx +83 -86
- package/src/core/query/query-simple/SimpleQueryColumns.tsx +126 -0
- package/src/core/query/query-simple/SimpleQueryFilterState.ts +160 -0
- package/src/core/query/query-simple/SimpleQueryPlanner.ts +18 -0
- package/src/core/query/query-simple/SimpleQuerySortState.ts +133 -0
- package/src/core/query/query-simple/SimpleQueryTypes.ts +61 -0
- package/src/core/query/widgets/BelongsToDisplayWidget.tsx +19 -11
- package/src/core/query/widgets/CellDisplayWidget.tsx +5 -10
- package/src/core/query/widgets/ColumnDisplayWidget.tsx +24 -20
- package/src/core/query/widgets/PeekRelationshipButton.tsx +161 -0
- package/src/core/query/widgets/SmartColumnWidget.tsx +26 -4
- package/src/core/query/widgets/SmartFilterWidget.tsx +119 -69
- package/src/entities/ConnectionEntityDefinition.tsx +33 -4
- package/src/entities/SavedQueryEntityDefinition.ts +72 -0
- package/src/entities/SchemaModelDefinitionEntityDefinition.ts +5 -2
- package/src/entities.ts +2 -1
- package/src/forms/APIConnectionForm.tsx +15 -2
- package/src/forms/TypeEngine.tsx +35 -421
- package/src/forms/types/attachment-handler.tsx +35 -0
- package/src/forms/types/boolean-handler.tsx +28 -0
- package/src/forms/types/date-handler.tsx +125 -0
- package/src/forms/types/filters/ClearableFilterFormDialogDirective.ts +32 -0
- package/src/forms/types/filters/ConditionalFilterForm.tsx +109 -0
- package/src/forms/types/image-handler.tsx +90 -0
- package/src/forms/types/location-handler.tsx +53 -0
- package/src/forms/types/multiple-choice-handler.tsx +37 -0
- package/src/forms/types/multiple-choice-integer-handler.tsx +37 -0
- package/src/forms/types/number-handler.tsx +100 -0
- package/src/forms/types/shared/type-handler.ts +36 -0
- package/src/forms/types/shared/ui.tsx +40 -0
- package/src/forms/types/single-choice-handler.tsx +47 -0
- package/src/forms/types/single-choice-integer-handler.tsx +47 -0
- package/src/forms/types/text-handler.tsx +247 -0
- package/src/index.ts +1 -0
- package/src/panels/_shared/SharedConnectionPanelFactory.tsx +55 -0
- package/src/panels/_shared/SharedModelPanelFactory.tsx +8 -2
- package/src/panels/query/PageResultsWidget.tsx +40 -28
- package/src/panels/query/QueryPanelFactory.tsx +19 -2
- package/src/panels/query/QueryPanelWidget.tsx +64 -9
- package/src/panels/query/TableControlsWidget.tsx +42 -120
- package/src/panels/query/table-controls/ChangesControlsWidget.tsx +72 -0
- package/src/panels/query/table-controls/FilterControlsWidget.tsx +145 -0
- package/src/panels/query/table-controls/PageControlsWidget.tsx +97 -0
- package/src/panels/query/table-controls/QueryControlsWidget.tsx +127 -0
- package/src/panels/query/table-controls/SortChipWidget.tsx +119 -0
- package/src/panels/query/table-controls/SortControlsWidget.tsx +95 -0
- package/src/preferences/QueryControlPreferences.ts +34 -0
- package/src/stores/ConnectionStore.ts +2 -0
- package/src/stores/SavedQueryStore.ts +121 -0
- package/src/widgets/EmptyValueWidget.tsx +20 -0
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
|
-
import { useEffect, useState } from 'react';
|
|
2
|
+
import { useEffect, useRef, useState } from 'react';
|
|
3
3
|
import { QueryPanelModel } from './QueryPanelFactory';
|
|
4
4
|
import { observer } from 'mobx-react';
|
|
5
5
|
import styled from '@emotion/styled';
|
|
@@ -22,7 +22,16 @@ namespace S {
|
|
|
22
22
|
}
|
|
23
23
|
|
|
24
24
|
export const QueryPanelWidget: React.FC<QueryPanelWidgetProps> = observer((props) => {
|
|
25
|
-
const [
|
|
25
|
+
const [displayPage, setDisplayPage] = useState<Page>(null);
|
|
26
|
+
const [loading, setLoading] = useState(false);
|
|
27
|
+
const displayPageRef = useRef<Page>(null);
|
|
28
|
+
const pendingDisposerRef = useRef<() => void>(null);
|
|
29
|
+
|
|
30
|
+
const setVisiblePage = (page: Page) => {
|
|
31
|
+
displayPageRef.current = page;
|
|
32
|
+
setDisplayPage(page);
|
|
33
|
+
};
|
|
34
|
+
|
|
26
35
|
useEffect(() => {
|
|
27
36
|
if (!props.model.query) {
|
|
28
37
|
return;
|
|
@@ -33,13 +42,53 @@ export const QueryPanelWidget: React.FC<QueryPanelWidgetProps> = observer((props
|
|
|
33
42
|
useEffect(() => {
|
|
34
43
|
return autorun(() => {
|
|
35
44
|
if (props.model.query) {
|
|
36
|
-
|
|
45
|
+
const nextPage = props.model.query.getPage(props.model.current_page);
|
|
46
|
+
const currentPage = displayPageRef.current;
|
|
47
|
+
|
|
48
|
+
if (!currentPage) {
|
|
49
|
+
setVisiblePage(nextPage);
|
|
50
|
+
setLoading(!!nextPage?.loading);
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
if (nextPage === currentPage) {
|
|
55
|
+
setLoading(!!nextPage.loading);
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
if (!nextPage.loading) {
|
|
60
|
+
pendingDisposerRef.current?.();
|
|
61
|
+
pendingDisposerRef.current = null;
|
|
62
|
+
setVisiblePage(nextPage);
|
|
63
|
+
setLoading(false);
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
setLoading(true);
|
|
68
|
+
pendingDisposerRef.current?.();
|
|
69
|
+
pendingDisposerRef.current = autorun(() => {
|
|
70
|
+
if (!nextPage.loading) {
|
|
71
|
+
pendingDisposerRef.current?.();
|
|
72
|
+
pendingDisposerRef.current = null;
|
|
73
|
+
setVisiblePage(nextPage);
|
|
74
|
+
setLoading(false);
|
|
75
|
+
}
|
|
76
|
+
});
|
|
37
77
|
}
|
|
38
78
|
});
|
|
39
79
|
}, [props.model.query]);
|
|
40
80
|
|
|
81
|
+
useEffect(() => {
|
|
82
|
+
return () => {
|
|
83
|
+
pendingDisposerRef.current?.();
|
|
84
|
+
pendingDisposerRef.current = null;
|
|
85
|
+
};
|
|
86
|
+
}, []);
|
|
87
|
+
|
|
88
|
+
const activePage = displayPage || (props.model.query ? props.model.query.getPage(props.model.current_page) : null);
|
|
89
|
+
|
|
41
90
|
return (
|
|
42
|
-
<LoadingPanelWidget loading={!props.model.query || !
|
|
91
|
+
<LoadingPanelWidget loading={!props.model.query || !activePage}>
|
|
43
92
|
{() => {
|
|
44
93
|
return (
|
|
45
94
|
<S.Container>
|
|
@@ -47,9 +96,12 @@ export const QueryPanelWidget: React.FC<QueryPanelWidgetProps> = observer((props
|
|
|
47
96
|
top={
|
|
48
97
|
<TableControlsWidget
|
|
49
98
|
query={props.model.query}
|
|
50
|
-
current_page={
|
|
99
|
+
current_page={activePage}
|
|
100
|
+
loading={loading}
|
|
101
|
+
onLoadSavedQuery={async (id) => {
|
|
102
|
+
await props.model.loadSavedQuery(id);
|
|
103
|
+
}}
|
|
51
104
|
goToPage={(index) => {
|
|
52
|
-
setPage(props.model.query.getPage(index));
|
|
53
105
|
props.model.current_page = index;
|
|
54
106
|
}}
|
|
55
107
|
/>
|
|
@@ -57,15 +109,18 @@ export const QueryPanelWidget: React.FC<QueryPanelWidgetProps> = observer((props
|
|
|
57
109
|
bottom={
|
|
58
110
|
<TableControlsWidget
|
|
59
111
|
query={props.model.query}
|
|
60
|
-
current_page={
|
|
112
|
+
current_page={activePage}
|
|
113
|
+
loading={loading}
|
|
114
|
+
onLoadSavedQuery={async (id) => {
|
|
115
|
+
await props.model.loadSavedQuery(id);
|
|
116
|
+
}}
|
|
61
117
|
goToPage={(index) => {
|
|
62
|
-
setPage(props.model.query.getPage(index));
|
|
63
118
|
props.model.current_page = index;
|
|
64
119
|
}}
|
|
65
120
|
/>
|
|
66
121
|
}
|
|
67
122
|
>
|
|
68
|
-
<PageResultsWidget query={props.model.query} page={
|
|
123
|
+
<PageResultsWidget query={props.model.query} page={activePage} />
|
|
69
124
|
</BorderLayoutWidget>
|
|
70
125
|
</S.Container>
|
|
71
126
|
);
|
|
@@ -1,153 +1,75 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
|
-
import {
|
|
3
|
-
ComboBoxItem,
|
|
4
|
-
ioc,
|
|
5
|
-
PanelButtonWidget,
|
|
6
|
-
PanelDropdownWidget,
|
|
7
|
-
setupTooltipProps,
|
|
8
|
-
styled,
|
|
9
|
-
theme,
|
|
10
|
-
ThemeStore,
|
|
11
|
-
TooltipPosition,
|
|
12
|
-
WorkspaceStore
|
|
13
|
-
} from '@journeyapps-labs/reactor-mod';
|
|
2
|
+
import { BooleanSetting, IconWidget, ioc, PrefsStore, styled } from '@journeyapps-labs/reactor-mod';
|
|
14
3
|
import { AbstractQuery } from '../../core/query/AbstractQuery';
|
|
15
4
|
import { observer } from 'mobx-react';
|
|
16
5
|
import * as _ from 'lodash';
|
|
17
6
|
import { Page } from '../../core/query/Page';
|
|
18
|
-
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
|
19
|
-
import { SimplePage } from '../../core/query/query-simple/SimplePage';
|
|
20
|
-
import { QueryPanelModel } from './QueryPanelFactory';
|
|
21
|
-
import { ChangedModelQuery } from '../../core/query/query-changed/ChangedModelQuery';
|
|
22
7
|
import { SimpleQuery } from '../../core/query/query-simple/SimpleQuery';
|
|
8
|
+
import { SavedQueryStore } from '../../stores/SavedQueryStore';
|
|
9
|
+
import { PageControlsWidget } from './table-controls/PageControlsWidget';
|
|
10
|
+
import { QueryControlsWidget } from './table-controls/QueryControlsWidget';
|
|
11
|
+
import { SortControlsWidget } from './table-controls/SortControlsWidget';
|
|
12
|
+
import { ChangesControlsWidget } from './table-controls/ChangesControlsWidget';
|
|
13
|
+
import { FilterControlsWidget } from './table-controls/FilterControlsWidget';
|
|
14
|
+
import { QueryControlPreferences } from '../../preferences/QueryControlPreferences';
|
|
23
15
|
|
|
24
16
|
export interface TableControlsWidgetProps {
|
|
25
17
|
current_page: Page;
|
|
26
18
|
goToPage?: (index: number) => any;
|
|
27
19
|
className?: any;
|
|
28
20
|
query: AbstractQuery;
|
|
21
|
+
onLoadSavedQuery?: (id: string) => Promise<any> | any;
|
|
22
|
+
loading?: boolean;
|
|
29
23
|
}
|
|
30
24
|
|
|
31
25
|
export const TableControlsWidget: React.FC<TableControlsWidgetProps> = observer((props) => {
|
|
32
|
-
const
|
|
33
|
-
const
|
|
26
|
+
const prefsStore = ioc.get(PrefsStore);
|
|
27
|
+
const simpleQuery = props.query instanceof SimpleQuery ? props.query : null;
|
|
28
|
+
const savedQueries = simpleQuery ? ioc.get(SavedQueryStore).getSavedForQuery(simpleQuery) : [];
|
|
29
|
+
const activeSavedQuery =
|
|
30
|
+
simpleQuery &&
|
|
31
|
+
(savedQueries.find((saved) => {
|
|
32
|
+
return _.isEqual(saved.query, simpleQuery.serialize());
|
|
33
|
+
}) ||
|
|
34
|
+
null);
|
|
35
|
+
const showSortControls = prefsStore.getPreference<BooleanSetting>(QueryControlPreferences.SHOW_SORT_CONTROLS).checked;
|
|
36
|
+
const showFilterControls = prefsStore.getPreference<BooleanSetting>(
|
|
37
|
+
QueryControlPreferences.SHOW_FILTER_CONTROLS
|
|
38
|
+
).checked;
|
|
39
|
+
|
|
34
40
|
return (
|
|
35
41
|
<S.Container className={props.className}>
|
|
36
|
-
<
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
}
|
|
42
|
-
/>
|
|
43
|
-
<PanelButtonWidget
|
|
44
|
-
disabled={props.query.totalPages == props.current_page.index + 1}
|
|
45
|
-
label="Next"
|
|
46
|
-
action={() => {
|
|
47
|
-
props.goToPage(props.current_page.index + 1);
|
|
48
|
-
}}
|
|
42
|
+
<PageControlsWidget query={props.query} currentPage={props.current_page} goToPage={props.goToPage} />
|
|
43
|
+
<QueryControlsWidget
|
|
44
|
+
query={props.query}
|
|
45
|
+
simpleQuery={simpleQuery}
|
|
46
|
+
activeSavedQueryName={activeSavedQuery?.name || null}
|
|
47
|
+
onLoadSavedQuery={props.onLoadSavedQuery}
|
|
49
48
|
/>
|
|
50
|
-
|
|
51
|
-
<
|
|
52
|
-
onChange={({ key }) => {
|
|
53
|
-
props.goToPage(parseInt(key));
|
|
54
|
-
}}
|
|
55
|
-
selected={`${props.current_page.index}`}
|
|
56
|
-
items={_.range(0, props.query.totalPages).map((r) => {
|
|
57
|
-
return {
|
|
58
|
-
title: `${r + 1}`,
|
|
59
|
-
key: `${r}`
|
|
60
|
-
} as ComboBoxItem;
|
|
61
|
-
})}
|
|
62
|
-
/>
|
|
63
|
-
<S.TotalPages>/ {props.query.totalPages}</S.TotalPages>
|
|
64
|
-
</S.PageSelector>
|
|
65
|
-
{props.current_page instanceof SimplePage ? (
|
|
66
|
-
<PanelButtonWidget
|
|
67
|
-
label="Page"
|
|
68
|
-
tooltip="Reload page"
|
|
69
|
-
icon="refresh"
|
|
70
|
-
action={async () => {
|
|
71
|
-
await (props.current_page as SimplePage).load();
|
|
72
|
-
}}
|
|
73
|
-
/>
|
|
49
|
+
{simpleQuery && showFilterControls ? (
|
|
50
|
+
<FilterControlsWidget simpleQuery={simpleQuery} goToPage={props.goToPage} />
|
|
74
51
|
) : null}
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
icon="refresh"
|
|
78
|
-
action={async (event, loading) => {
|
|
79
|
-
await props.query.load();
|
|
80
|
-
}}
|
|
81
|
-
/>
|
|
82
|
-
{dirtyObjects.length > 0 ? (
|
|
83
|
-
<>
|
|
84
|
-
<PanelButtonWidget
|
|
85
|
-
label={`Save all [${dirtyObjects.length}]`}
|
|
86
|
-
icon="save"
|
|
87
|
-
iconColor={_theme.status.success}
|
|
88
|
-
action={async (event, loading) => {
|
|
89
|
-
props.query.batchSave();
|
|
90
|
-
}}
|
|
91
|
-
/>
|
|
92
|
-
<span
|
|
93
|
-
{...setupTooltipProps({
|
|
94
|
-
tooltip: 'Discard all edits',
|
|
95
|
-
tooltipPos: TooltipPosition.RIGHT
|
|
96
|
-
})}
|
|
97
|
-
>
|
|
98
|
-
<S.RevertButton
|
|
99
|
-
icon="arrow-rotate-back"
|
|
100
|
-
onClick={() => {
|
|
101
|
-
props.current_page.reset();
|
|
102
|
-
}}
|
|
103
|
-
/>
|
|
104
|
-
</span>
|
|
105
|
-
{props.query instanceof SimpleQuery ? (
|
|
106
|
-
<span
|
|
107
|
-
{...setupTooltipProps({
|
|
108
|
-
tooltip: 'View changed models',
|
|
109
|
-
tooltipPos: TooltipPosition.RIGHT
|
|
110
|
-
})}
|
|
111
|
-
>
|
|
112
|
-
<S.RevertButton
|
|
113
|
-
icon="eye"
|
|
114
|
-
onClick={() => {
|
|
115
|
-
ioc
|
|
116
|
-
.get(WorkspaceStore)
|
|
117
|
-
.addModel(new QueryPanelModel(new ChangedModelQuery(props.query as SimpleQuery)));
|
|
118
|
-
}}
|
|
119
|
-
/>
|
|
120
|
-
</span>
|
|
121
|
-
) : null}
|
|
122
|
-
</>
|
|
52
|
+
{simpleQuery && showSortControls ? (
|
|
53
|
+
<SortControlsWidget simpleQuery={simpleQuery} goToPage={props.goToPage} />
|
|
123
54
|
) : null}
|
|
55
|
+
<ChangesControlsWidget query={props.query} currentPage={props.current_page} />
|
|
56
|
+
{props.loading ? <S.Loading icon="spinner" spin={true} /> : null}
|
|
124
57
|
</S.Container>
|
|
125
58
|
);
|
|
126
59
|
});
|
|
60
|
+
|
|
127
61
|
namespace S {
|
|
128
62
|
export const Container = styled.div`
|
|
129
63
|
display: flex;
|
|
130
64
|
flex-direction: row;
|
|
131
|
-
column-gap:
|
|
65
|
+
column-gap: 20px;
|
|
66
|
+
row-gap: 20px;
|
|
132
67
|
padding: 5px 5px;
|
|
133
68
|
align-items: center;
|
|
69
|
+
flex-wrap: wrap;
|
|
134
70
|
`;
|
|
135
71
|
|
|
136
|
-
export const
|
|
137
|
-
|
|
138
|
-
flex-direction: row;
|
|
139
|
-
align-items: center;
|
|
140
|
-
`;
|
|
141
|
-
|
|
142
|
-
export const TotalPages = styled.div`
|
|
143
|
-
color: ${(p) => p.theme.text.primary};
|
|
144
|
-
padding-left: 5px;
|
|
145
|
-
`;
|
|
146
|
-
|
|
147
|
-
export const RevertButton = styled(FontAwesomeIcon)`
|
|
148
|
-
color: ${(p) => p.theme.status.success};
|
|
149
|
-
font-size: 12px;
|
|
150
|
-
padding: 5px;
|
|
151
|
-
cursor: pointer;
|
|
72
|
+
export const Loading = styled(IconWidget)`
|
|
73
|
+
color: ${(p) => p.theme.button.icon};
|
|
152
74
|
`;
|
|
153
75
|
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import {
|
|
3
|
+
InputContainerWidget,
|
|
4
|
+
ioc,
|
|
5
|
+
PanelButtonWidget,
|
|
6
|
+
styled,
|
|
7
|
+
theme,
|
|
8
|
+
ThemeStore,
|
|
9
|
+
WorkspaceStore
|
|
10
|
+
} from '@journeyapps-labs/reactor-mod';
|
|
11
|
+
import { AbstractQuery } from '../../../core/query/AbstractQuery';
|
|
12
|
+
import { Page } from '../../../core/query/Page';
|
|
13
|
+
import { ChangedModelQuery } from '../../../core/query/query-changed/ChangedModelQuery';
|
|
14
|
+
import { SimpleQuery } from '../../../core/query/query-simple/SimpleQuery';
|
|
15
|
+
import { QueryPanelModel } from '../QueryPanelFactory';
|
|
16
|
+
import { observer } from 'mobx-react';
|
|
17
|
+
|
|
18
|
+
export interface ChangesControlsWidgetProps {
|
|
19
|
+
query: AbstractQuery;
|
|
20
|
+
currentPage: Page;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export const ChangesControlsWidget: React.FC<ChangesControlsWidgetProps> = observer((props) => {
|
|
24
|
+
const _theme = ioc.get(ThemeStore).getCurrentTheme(theme);
|
|
25
|
+
const dirtyObjects = props.query.getDirtyObjects();
|
|
26
|
+
|
|
27
|
+
if (dirtyObjects.length === 0) {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
return (
|
|
32
|
+
<InputContainerWidget label="Changes">
|
|
33
|
+
<S.Group>
|
|
34
|
+
<PanelButtonWidget
|
|
35
|
+
label={`Save all [${dirtyObjects.length}]`}
|
|
36
|
+
icon="save"
|
|
37
|
+
iconColor={_theme.status.success}
|
|
38
|
+
action={async () => {
|
|
39
|
+
props.query.batchSave();
|
|
40
|
+
}}
|
|
41
|
+
/>
|
|
42
|
+
<PanelButtonWidget
|
|
43
|
+
tooltip="Discard all edits"
|
|
44
|
+
icon="arrow-rotate-back"
|
|
45
|
+
action={() => {
|
|
46
|
+
props.currentPage.reset();
|
|
47
|
+
}}
|
|
48
|
+
/>
|
|
49
|
+
{props.query instanceof SimpleQuery ? (
|
|
50
|
+
<PanelButtonWidget
|
|
51
|
+
tooltip="View changed models"
|
|
52
|
+
icon="eye"
|
|
53
|
+
action={() => {
|
|
54
|
+
ioc.get(WorkspaceStore).addModel(new QueryPanelModel(new ChangedModelQuery(props.query as SimpleQuery)));
|
|
55
|
+
}}
|
|
56
|
+
/>
|
|
57
|
+
) : null}
|
|
58
|
+
</S.Group>
|
|
59
|
+
</InputContainerWidget>
|
|
60
|
+
);
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
namespace S {
|
|
64
|
+
export const Group = styled.div`
|
|
65
|
+
display: flex;
|
|
66
|
+
flex-direction: row;
|
|
67
|
+
align-items: center;
|
|
68
|
+
column-gap: 5px;
|
|
69
|
+
row-gap: 5px;
|
|
70
|
+
flex-wrap: wrap;
|
|
71
|
+
`;
|
|
72
|
+
}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import {
|
|
3
|
+
ComboBoxItem,
|
|
4
|
+
ComboBoxStore2,
|
|
5
|
+
InputContainerWidget,
|
|
6
|
+
PanelButtonMode,
|
|
7
|
+
PanelButtonWidget,
|
|
8
|
+
SimpleComboBoxDirective,
|
|
9
|
+
ioc,
|
|
10
|
+
styled
|
|
11
|
+
} from '@journeyapps-labs/reactor-mod';
|
|
12
|
+
import { SimpleQuery } from '../../../core/query/query-simple/SimpleQuery';
|
|
13
|
+
import { SmartFilterMetadataWidget } from '../../../core/query/widgets/SmartFilterWidget';
|
|
14
|
+
|
|
15
|
+
export interface FilterControlsWidgetProps {
|
|
16
|
+
simpleQuery: SimpleQuery;
|
|
17
|
+
goToPage?: (index: number) => any;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export const FilterControlsWidget: React.FC<FilterControlsWidgetProps> = (props) => {
|
|
21
|
+
const showAddFilterMenu = async (event: React.MouseEvent<any>) => {
|
|
22
|
+
const fields = props.simpleQuery.filterState.getFilterableFields();
|
|
23
|
+
if (fields.length === 0) {
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
const directive = await ioc.get(ComboBoxStore2).show(
|
|
27
|
+
new SimpleComboBoxDirective({
|
|
28
|
+
title: 'Add filter',
|
|
29
|
+
event: event as any,
|
|
30
|
+
items: fields.map((field) => {
|
|
31
|
+
return {
|
|
32
|
+
key: field.key,
|
|
33
|
+
title: field.label,
|
|
34
|
+
action: async () => {
|
|
35
|
+
await props.simpleQuery.filterState.setupFilterForField(field.key, event.nativeEvent as any);
|
|
36
|
+
props.goToPage?.(0);
|
|
37
|
+
}
|
|
38
|
+
} as ComboBoxItem;
|
|
39
|
+
})
|
|
40
|
+
})
|
|
41
|
+
);
|
|
42
|
+
directive.getSelectedItem();
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
const filters = props.simpleQuery.filterState.getActiveFilters();
|
|
46
|
+
|
|
47
|
+
return (
|
|
48
|
+
<InputContainerWidget label="Filters">
|
|
49
|
+
<S.Group>
|
|
50
|
+
<PanelButtonWidget
|
|
51
|
+
icon="plus"
|
|
52
|
+
tooltip="Add filter"
|
|
53
|
+
action={async (event) => {
|
|
54
|
+
await showAddFilterMenu(event as any);
|
|
55
|
+
}}
|
|
56
|
+
/>
|
|
57
|
+
{filters.map((entry) => {
|
|
58
|
+
const key = entry.variable.name;
|
|
59
|
+
const label = entry.variable.label || entry.variable.name;
|
|
60
|
+
return (
|
|
61
|
+
<S.FilterItem
|
|
62
|
+
key={key}
|
|
63
|
+
onContextMenu={async (event) => {
|
|
64
|
+
event.preventDefault();
|
|
65
|
+
event.stopPropagation();
|
|
66
|
+
const directive = await ioc.get(ComboBoxStore2).show(
|
|
67
|
+
new SimpleComboBoxDirective({
|
|
68
|
+
title: label,
|
|
69
|
+
event: event as any,
|
|
70
|
+
items: [
|
|
71
|
+
{
|
|
72
|
+
key: 'edit',
|
|
73
|
+
title: 'Edit filter',
|
|
74
|
+
icon: 'pencil',
|
|
75
|
+
action: async () => {
|
|
76
|
+
await props.simpleQuery.filterState.setupFilterForField(key, event.nativeEvent as any);
|
|
77
|
+
props.goToPage?.(0);
|
|
78
|
+
}
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
key: 'clear',
|
|
82
|
+
title: 'Clear filter',
|
|
83
|
+
icon: 'trash',
|
|
84
|
+
action: async () => {
|
|
85
|
+
entry.filter.delete();
|
|
86
|
+
props.goToPage?.(0);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
]
|
|
90
|
+
})
|
|
91
|
+
);
|
|
92
|
+
directive.getSelectedItem();
|
|
93
|
+
}}
|
|
94
|
+
>
|
|
95
|
+
<S.FilterLabel>{label}</S.FilterLabel>
|
|
96
|
+
<SmartFilterMetadataWidget filter={entry.filter} variable={entry.filter.variable} />
|
|
97
|
+
<S.CloseButton
|
|
98
|
+
mode={PanelButtonMode.LINK}
|
|
99
|
+
icon="close"
|
|
100
|
+
tooltip={`Clear ${label} filter`}
|
|
101
|
+
action={async () => {
|
|
102
|
+
entry.filter.delete();
|
|
103
|
+
props.goToPage?.(0);
|
|
104
|
+
}}
|
|
105
|
+
/>
|
|
106
|
+
</S.FilterItem>
|
|
107
|
+
);
|
|
108
|
+
})}
|
|
109
|
+
</S.Group>
|
|
110
|
+
</InputContainerWidget>
|
|
111
|
+
);
|
|
112
|
+
};
|
|
113
|
+
|
|
114
|
+
namespace S {
|
|
115
|
+
export const Group = styled.div`
|
|
116
|
+
display: flex;
|
|
117
|
+
flex-direction: row;
|
|
118
|
+
align-items: center;
|
|
119
|
+
column-gap: 5px;
|
|
120
|
+
row-gap: 5px;
|
|
121
|
+
flex-wrap: wrap;
|
|
122
|
+
`;
|
|
123
|
+
|
|
124
|
+
export const FilterItem = styled.div`
|
|
125
|
+
display: flex;
|
|
126
|
+
flex-direction: row;
|
|
127
|
+
align-items: center;
|
|
128
|
+
border-radius: 4px;
|
|
129
|
+
padding: 1px 3px;
|
|
130
|
+
|
|
131
|
+
&:hover {
|
|
132
|
+
background: ${(p) => p.theme.forms.groupBorder};
|
|
133
|
+
}
|
|
134
|
+
`;
|
|
135
|
+
|
|
136
|
+
export const CloseButton = styled(PanelButtonWidget)`
|
|
137
|
+
padding: 2px;
|
|
138
|
+
`;
|
|
139
|
+
|
|
140
|
+
export const FilterLabel = styled.div`
|
|
141
|
+
font-size: 12px;
|
|
142
|
+
color: ${(p) => p.theme.text.secondary};
|
|
143
|
+
padding-right: 4px;
|
|
144
|
+
`;
|
|
145
|
+
}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import {
|
|
3
|
+
ComboBoxItem,
|
|
4
|
+
IconWidget,
|
|
5
|
+
InputContainerWidget,
|
|
6
|
+
PanelButtonWidget,
|
|
7
|
+
PanelDropdownWidget,
|
|
8
|
+
styled
|
|
9
|
+
} from '@journeyapps-labs/reactor-mod';
|
|
10
|
+
import * as _ from 'lodash';
|
|
11
|
+
import { AbstractQuery } from '../../../core/query/AbstractQuery';
|
|
12
|
+
import { Page } from '../../../core/query/Page';
|
|
13
|
+
import { observer } from 'mobx-react';
|
|
14
|
+
|
|
15
|
+
export interface PageControlsWidgetProps {
|
|
16
|
+
query: AbstractQuery;
|
|
17
|
+
currentPage: Page;
|
|
18
|
+
goToPage?: (index: number) => any;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export const PageControlsWidget: React.FC<PageControlsWidgetProps> = observer((props) => {
|
|
22
|
+
const hasCurrentPage = !!props.currentPage;
|
|
23
|
+
const currentPageIndex = props.currentPage?.index ?? 0;
|
|
24
|
+
|
|
25
|
+
return (
|
|
26
|
+
<InputContainerWidget label="Page">
|
|
27
|
+
<S.Group>
|
|
28
|
+
<PanelButtonWidget
|
|
29
|
+
disabled={!hasCurrentPage || currentPageIndex === 0}
|
|
30
|
+
label="Prev"
|
|
31
|
+
action={() => {
|
|
32
|
+
if (!hasCurrentPage) {
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
props.goToPage?.(currentPageIndex - 1);
|
|
36
|
+
}}
|
|
37
|
+
/>
|
|
38
|
+
<PanelButtonWidget
|
|
39
|
+
disabled={!hasCurrentPage || props.query.totalPages === currentPageIndex + 1}
|
|
40
|
+
label="Next"
|
|
41
|
+
action={() => {
|
|
42
|
+
if (!hasCurrentPage) {
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
props.goToPage?.(currentPageIndex + 1);
|
|
46
|
+
}}
|
|
47
|
+
/>
|
|
48
|
+
<S.PageSelector>
|
|
49
|
+
<PanelDropdownWidget
|
|
50
|
+
onChange={({ key }) => {
|
|
51
|
+
props.goToPage?.(parseInt(key));
|
|
52
|
+
}}
|
|
53
|
+
selected={`${currentPageIndex}`}
|
|
54
|
+
items={_.range(0, props.query.totalPages).map((r) => {
|
|
55
|
+
return {
|
|
56
|
+
title: `${r + 1}`,
|
|
57
|
+
key: `${r}`
|
|
58
|
+
} as ComboBoxItem;
|
|
59
|
+
})}
|
|
60
|
+
/>
|
|
61
|
+
<S.TotalPages>
|
|
62
|
+
/ {props.query.totalPages === 0 ? <S.Spinner icon="spinner" spin={true} /> : props.query.totalPages}
|
|
63
|
+
</S.TotalPages>
|
|
64
|
+
</S.PageSelector>
|
|
65
|
+
</S.Group>
|
|
66
|
+
</InputContainerWidget>
|
|
67
|
+
);
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
namespace S {
|
|
71
|
+
export const Group = styled.div`
|
|
72
|
+
display: flex;
|
|
73
|
+
flex-direction: row;
|
|
74
|
+
align-items: center;
|
|
75
|
+
column-gap: 5px;
|
|
76
|
+
row-gap: 5px;
|
|
77
|
+
flex-wrap: wrap;
|
|
78
|
+
`;
|
|
79
|
+
|
|
80
|
+
export const PageSelector = styled.div`
|
|
81
|
+
display: flex;
|
|
82
|
+
flex-direction: row;
|
|
83
|
+
align-items: center;
|
|
84
|
+
`;
|
|
85
|
+
|
|
86
|
+
export const TotalPages = styled.div`
|
|
87
|
+
color: ${(p) => p.theme.text.primary};
|
|
88
|
+
padding-left: 5px;
|
|
89
|
+
display: flex;
|
|
90
|
+
flex-direction: row;
|
|
91
|
+
align-items: center;
|
|
92
|
+
`;
|
|
93
|
+
|
|
94
|
+
export const Spinner = styled(IconWidget)`
|
|
95
|
+
color: ${(p) => p.theme.text.secondary};
|
|
96
|
+
`;
|
|
97
|
+
}
|