Skip to content

Commit 157e28a

Browse files
authored
Fix geosolutions-it#10990 Review resources catalog code to make it usable by GeoStore and GeoNode (geosolutions-it#10991)
1 parent f6acbb6 commit 157e28a

68 files changed

Lines changed: 772 additions & 549 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

web/client/plugins/ResourcesCatalog/api/resources.js renamed to web/client/api/ResourcesCatalog.js

Lines changed: 7 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,11 @@
66
* LICENSE file in the root directory of this source tree.
77
*/
88

9-
import { searchListByAttributes, getResource } from '../../../observables/geostore';
9+
import { searchListByAttributes, getResource } from '../observables/geostore';
1010
import { castArray } from 'lodash';
11-
import GeoStoreDAO from '../../../api/GeoStoreDAO';
11+
import GeoStoreDAO from './GeoStoreDAO';
1212
import { addFilters, getFilterByField, splitFilterValue } from '../utils/ResourcesFiltersUtils';
13-
import { parseResourceProperties } from '../utils/ResourcesUtils';
13+
import { parseResourceProperties } from '../utils/GeostoreUtils';
1414

1515
const applyDoubleQuote = value => `"${value}"`;
1616

@@ -148,7 +148,6 @@ export const requestResources = ({
148148
page = 1,
149149
pageSize = 12,
150150
sort = 'name',
151-
customFilters,
152151
q,
153152
...query
154153
} = params || {};
@@ -200,23 +199,9 @@ export const requestResources = ({
200199
total: response.totalCount,
201200
isNextPageAvailable: page < (response?.totalCount / pageSize),
202201
resources: resources
203-
.map(({ tags, ...resource }) => {
204-
return parseResourceProperties({
205-
...resource,
206-
...(tags && { tags: castArray(tags) })
207-
});
208-
})
209202
.map((resource) => {
210203
const context = contexts.find(ctx => ctx.id === resource?.attributes?.context);
211-
if (context) {
212-
return {
213-
...resource,
214-
'@extras': {
215-
context
216-
}
217-
};
218-
}
219-
return resource;
204+
return parseResourceProperties(resource, context);
220205
})
221206
};
222207
});
@@ -391,10 +376,9 @@ export const facets = [
391376
];
392377

393378

394-
export const facetsRequest = ({
379+
export const requestFacets = ({
395380
fields,
396-
query,
397-
customFilters
381+
query
398382
}) => {
399383
const newFields = fields.map((field) => {
400384
if (field.facet) {
@@ -416,8 +400,7 @@ export const facetsRequest = ({
416400
facet.update({
417401
facet,
418402
fields,
419-
query,
420-
customFilters
403+
query
421404
})
422405
)
423406
).then((updatedFacets) => {

web/client/plugins/ResourcesCatalog/api/__tests__/resources-test.js renamed to web/client/api/__tests__/ResourcesCatalog-test.js

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,13 @@
88

99
import {
1010
requestResources
11-
} from '../resources';
11+
} from '../ResourcesCatalog';
1212
import expect from 'expect';
13-
import axios from '../../../../libs/ajax';
13+
import axios from '../../libs/ajax';
1414
import MockAdapter from 'axios-mock-adapter';
1515
import xml2js from 'xml2js';
1616

17-
describe('resources api', () => {
17+
describe('ResourceCatalog api', () => {
1818
let mockAxios;
1919
beforeEach(() => {
2020
mockAxios = new MockAdapter(axios);
@@ -263,7 +263,16 @@ describe('resources api', () => {
263263
"id": 2,
264264
"name": "contextName",
265265
"attributes": {}
266-
}
266+
},
267+
"info": { "title": "Map", "icon": { "glyph": "1-map", "type": "glyphicon" }, "thumbnailUrl": undefined, "viewerPath": "/viewer/1", "viewerUrl": "#/viewer/1" },
268+
"status": { "items": [{
269+
"type": 'icon',
270+
"glyph": 'cogs',
271+
"tooltipId": 'resourcesCatalog.mapUsesContext',
272+
"tooltipParams": {
273+
"contextName": "contextName"
274+
}
275+
}] }
267276
}
268277
}]
269278
});

web/client/api/persistence/index.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,15 @@ export const updateResourceAttribute = (...args) => Persistence.getApi().updateR
112112
export const deleteResource = (...args) => Persistence.getApi().deleteResource(...args);
113113
export const searchListByAttributes = (...args) => Persistence.getApi().searchListByAttributes(...args);
114114

115+
/**
116+
* get all the available paginated resources
117+
*/
118+
export const getCatalogResources = (...args) => Persistence.getApi().getCatalogResources(...args);
119+
/**
120+
* get catalog facets
121+
*/
122+
export const getCatalogFacets = (...args) => Persistence.getApi().getCatalogFacets(...args);
123+
115124

116125
Persistence = {
117126
api,

web/client/components/layout/ConfirmDialog.jsx

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,19 @@ function ConfirmDialog({
3232
children,
3333
preventHide,
3434
titleParams,
35-
descriptionParams
35+
descriptionParams,
36+
cancelParams,
37+
confirmParams,
38+
onHide
3639
}) {
3740

3841
function handleHide() {
3942
if (!loading && !preventHide) {
40-
onCancel();
43+
if (onHide) {
44+
onHide();
45+
} else {
46+
onCancel();
47+
}
4148
}
4249
}
4350

@@ -65,10 +72,10 @@ function ConfirmDialog({
6572
<FlexBox centerChildrenVertically gap="sm">
6673
<FlexBox.Fill />
6774
<Button disabled={loading} onClick={() => onCancel()}>
68-
<Message msgId={cancelId} />
75+
<Message msgId={cancelId} msgParams={cancelParams}/>
6976
</Button>
7077
<Button disabled={disabled || loading} variant={variant} onClick={() => onConfirm()}>
71-
<Message msgId={confirmId} />
78+
<Message msgId={confirmId} msgParams={confirmParams} />
7279
{loading ? <>{' '}<Spinner /></> : null}
7380
</Button>
7481
</FlexBox>

web/client/components/layout/__tests__/ConfirmDialog-test.jsx

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import ReactDOM from 'react-dom';
1212
import expect from 'expect';
1313
import ConfirmDialog from '../ConfirmDialog';
1414
import { Simulate } from 'react-dom/test-utils';
15+
import { IntlProvider } from 'react-intl';
1516

1617
describe('ConfirmDialog component', () => {
1718
beforeEach((done) => {
@@ -70,4 +71,30 @@ describe('ConfirmDialog component', () => {
7071
const confirmButton = document.querySelectorAll('.btn')[1];
7172
expect(confirmButton.disabled).toBe(true);
7273
});
74+
it('should use msgParams on the confirm dialog when applicable', () => {
75+
const msgId = 'Test {id}';
76+
ReactDOM.render(
77+
<IntlProvider locale="en-US" messages={{ [msgId]: 'Test {id}' }}>
78+
<ConfirmDialog
79+
show
80+
cancelId={msgId}
81+
cancelParams={{ id: 1 }}
82+
confirmId={msgId}
83+
confirmParams={{ id: 2 }}
84+
titleId={msgId}
85+
titleParams={{ id: 3 }}
86+
descriptionId={msgId}
87+
descriptionParams={{ id: 4 }}
88+
/></IntlProvider>,
89+
document.getElementById('container')
90+
);
91+
const buttons = document.querySelectorAll('.btn');
92+
expect(buttons.length).toBe(2);
93+
expect(buttons[0].textContent).toBe('Test 1');
94+
expect(buttons[1].textContent).toBe('Test 2');
95+
const textSpans = document.querySelectorAll('span');
96+
expect(textSpans.length).toBe(4);
97+
expect(textSpans[0].textContent).toBe('Test 3');
98+
expect(textSpans[1].textContent).toBe('Test 4');
99+
});
73100
});

web/client/libs/ajax.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ axios.interceptors.request.use(config => {
155155

156156
axios.interceptors.response.use(response => response, (error) => {
157157
let proxyUrl = ConfigUtils.getProxyUrl();
158-
const sameOrigin = checkSameOrigin(error.config.url || '');
158+
const sameOrigin = checkSameOrigin(error?.config?.url || '');
159159
const errorResponseFunc = () => Promise.reject(error.response ? {...error.response, originalError: error} : error);
160160
if (error.config && !error.config.url.includes(proxyUrl.url) && !sameOrigin) {
161161
if (getProxyCacheByUrl(error.config.url) === undefined && typeof error.response === 'undefined') {

web/client/observables/geostore.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import { Observable } from 'rxjs';
1010
import uuid from 'uuid/v1';
1111
import { includes, isNil, omit, isArray, isObject, get, find, castArray } from 'lodash';
1212
import GeoStoreDAO from '../api/GeoStoreDAO';
13+
import * as ResourcesCatalog from '../api/ResourcesCatalog';
1314

1415
const createLinkedResourceURL = (id, tail = "") => `rest/geostore/data/${id}${tail}`;
1516
import {getResourceIdFromURL} from "../utils/ResourceUtils";
@@ -415,3 +416,6 @@ export const updateResourceAttribute = ({ id, name, value } = {}, API = GeoStore
415416
Observable.defer(
416417
() => API.updateResourceAttribute(id, name, value)
417418
).switchMap(() => Observable.of(id));
419+
420+
export const getCatalogResources = (...args) => Observable.defer(() => ResourcesCatalog.requestResources(...args));
421+
export const getCatalogFacets = (...args) => Observable.defer(() => ResourcesCatalog.requestFacets(...args));

web/client/plugins/ResourcesCatalog/GroupManager.jsx

Lines changed: 23 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,7 @@ import { createStructuredSelector } from 'reselect';
1313
import { getRouterLocation } from './selectors/resources';
1414
import usePluginItems from '../../hooks/usePluginItems';
1515
import ConnectedResourcesGrid from './containers/ResourcesGrid';
16-
import { hashLocationToHref } from './utils/ResourcesFiltersUtils';
17-
import { getResourceTypesInfo, getResourceId } from './utils/ResourcesUtils';
16+
import { hashLocationToHref } from '../../utils/ResourcesFiltersUtils';
1817
import GeoStoreDAO from '../../api/GeoStoreDAO';
1918
import Message from '../../components/I18N/Message';
2019
import { Button } from 'react-bootstrap';
@@ -106,7 +105,28 @@ function requestGroups({ params }) {
106105
return {
107106
total: totalCount,
108107
isNextPageAvailable: page < (totalCount / pageSize),
109-
resources: groups.map((group) => group)
108+
resources: groups.map((group) => ({
109+
...group,
110+
'@extras': {
111+
status: {
112+
items: [
113+
...(group.enabled === true ? [{
114+
type: 'icon',
115+
tooltipId: 'users.active',
116+
glyph: 'ok-sign',
117+
iconType: 'glyphicon',
118+
variant: 'success'
119+
}] : [{
120+
type: 'icon',
121+
tooltipId: 'users.inactive',
122+
glyph: 'minus-sign',
123+
iconType: 'glyphicon',
124+
variant: 'danger'
125+
}])
126+
]
127+
}
128+
}
129+
}))
110130
};
111131
});
112132
}
@@ -234,28 +254,7 @@ function GroupManager({
234254
{ Component: ConnectedNewGroup, target: 'right-menu', name: "newgroup" }
235255
]}
236256
metadata={metadata}
237-
getResourceStatus={(resource) => {
238-
return {
239-
items: [
240-
...(resource.enabled === true ? [{
241-
type: 'icon',
242-
tooltipId: 'users.active',
243-
glyph: 'ok-sign',
244-
iconType: 'glyphicon',
245-
variant: 'success'
246-
}] : [{
247-
type: 'icon',
248-
tooltipId: 'users.inactive',
249-
glyph: 'minus-sign',
250-
iconType: 'glyphicon',
251-
variant: 'danger'
252-
}])
253-
]
254-
};
255-
}}
256257
formatHref={handleFormatHref}
257-
getResourceTypesInfo={getResourceTypesInfo}
258-
getResourceId={getResourceId}
259258
cardLayoutStyle="grid"
260259
hideThumbnail
261260
resourcesFoundMsgId="usergroups.userGroupsFound"

web/client/plugins/ResourcesCatalog/ResourceDetails.jsx

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,12 +33,13 @@ import ResourcesPanelWrapper from './components/ResourcesPanelWrapper';
3333
import TargetSelectorPortal from './components/TargetSelectorPortal';
3434
import useResourcePanelWrapper from './hooks/useResourcePanelWrapper';
3535
import { withResizeDetector } from 'react-resize-detector';
36-
import { requestResource, facets } from './api/resources';
36+
import { requestResource, facets } from '../../api/ResourcesCatalog';
3737
import { isEmpty } from 'lodash';
3838
import PendingStatePrompt from './containers/PendingStatePrompt';
3939
import ResourceDetailsComponent from './containers/ResourceDetails';
4040
import Button from '../../components/layout/Button';
41-
import { getResourceTypesInfo, getResourceId, parseResourceProperties } from './utils/ResourcesUtils';
41+
import { parseResourceProperties } from '../../utils/GeostoreUtils';
42+
import { getResourceInfo } from '../../utils/ResourcesUtils';
4243
import Icon from './components/Icon';
4344
import Text from '../../components/layout/Text';
4445
import FlexBox from '../../components/layout/FlexBox';
@@ -346,7 +347,7 @@ function BrandNavbarDetailsButton({
346347
name: resourceType
347348
}
348349
});
349-
const { title } = getResourceTypesInfo(resource || selectedResource);
350+
const { title } = getResourceInfo(resource);
350351
return (
351352
<FlexBox component="li" centerChildrenVertically gap="xs">
352353
<ButtonWithTooltip
@@ -396,7 +397,7 @@ export default createPlugin('ResourceDetails', {
396397
)(({ resourcesGridId, resource, onSelect, component, selectedResource, onShow }) => {
397398
const Component = component;
398399
function handleClick() {
399-
if (getResourceId(selectedResource) !== getResourceId(resource)) {
400+
if (selectedResource?.id !== resource?.id) {
400401
onSelect(resource, resourcesGridId);
401402
onShow(true, resourcesGridId);
402403
}

web/client/plugins/ResourcesCatalog/ResourcesFiltersForm.jsx

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,12 @@ import { searchResources, setShowFiltersForm } from './actions/resources';
1818
import ResourcesFiltersFormButton from './containers/ResourcesFiltersFormButton';
1919
import useParsePluginConfigExpressions from './hooks/useParsePluginConfigExpressions';
2020
import useFilterFacets from './hooks/useFilterFacets';
21-
import { facetsRequest } from './api/resources';
2221
import ResourcesPanelWrapper from './components/ResourcesPanelWrapper';
2322
import TargetSelectorPortal from './components/TargetSelectorPortal';
2423
import useResourcePanelWrapper from './hooks/useResourcePanelWrapper';
2524
import { withResizeDetector } from 'react-resize-detector';
2625
import { userSelector } from '../../selectors/security';
26+
import { getCatalogFacets } from '../../api/persistence';
2727

2828
/**
2929
* This plugin renders a side panel with configurable input filters
@@ -187,7 +187,6 @@ function ResourcesFiltersForm({
187187
}
188188
],
189189
monitoredState,
190-
customFilters,
191190
location,
192191
show,
193192
targetSelector,
@@ -223,8 +222,8 @@ function ResourcesFiltersForm({
223222
} = useFilterFacets({
224223
query,
225224
fields: parsedConfig.fields,
226-
request: facetsRequest,
227-
customFilters,
225+
request: (...args) => getCatalogFacets(...args).toPromise(),
226+
monitoredState,
228227
visible: !!show
229228
}, [user]);
230229

0 commit comments

Comments
 (0)