diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/v2/AbstractOmniscientTopLevelDataSetRegistrator.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/v2/AbstractOmniscientTopLevelDataSetRegistrator.java index 142fee8ce8c38c648b59390c3d2adae447de95fc..2c19f07ce96ec9ecfd4e0febe6c099b4cc659cc0 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/v2/AbstractOmniscientTopLevelDataSetRegistrator.java +++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/v2/AbstractOmniscientTopLevelDataSetRegistrator.java @@ -20,6 +20,7 @@ import static ch.systemsx.cisd.etlserver.IStorageProcessorTransactional.STORAGE_ import static ch.systemsx.cisd.etlserver.ThreadParameters.ON_ERROR_DECISION_KEY; import java.io.File; +import java.io.IOException; import java.util.List; import java.util.Properties; import java.util.concurrent.locks.Lock; @@ -27,6 +28,7 @@ import java.util.concurrent.locks.ReentrantLock; import org.apache.log4j.Logger; +import ch.systemsx.cisd.base.exceptions.CheckedExceptionTunnel; import ch.systemsx.cisd.base.exceptions.InterruptedExceptionUnchecked; import ch.systemsx.cisd.common.action.AbstractDelegatedActionWithResult; import ch.systemsx.cisd.common.action.IDelegatedActionWithResult; @@ -384,6 +386,8 @@ public abstract class AbstractOmniscientTopLevelDataSetRegistrator<T extends Dat markerFileCleanupAction = new DoNothingDelegatedAction(); } + checkAccessRightsRecursively(incomingDataSetFile); + // read from configuration prestaging parameter. DataSetRegistrationPreStagingBehavior preStagingUsage = state.getGlobalState().getThreadParameters() @@ -414,6 +418,28 @@ public abstract class AbstractOmniscientTopLevelDataSetRegistrator<T extends Dat cleanupAction); } } + + private void checkAccessRightsRecursively(File file) + { + if (file.canRead() == false) + { + throw CheckedExceptionTunnel.wrapIfNecessary(new IOException( + "No reading rights for data set file '" + file.getAbsolutePath() + "'.")); + } + if (file.isDirectory()) + { + if (file.canWrite() == false) + { + throw CheckedExceptionTunnel.wrapIfNecessary(new IOException( + "No writing rights for data set folder '" + file.getAbsolutePath() + "'.")); + } + File[] files = file.listFiles(); + for (File child : files) + { + checkAccessRightsRecursively(child); + } + } + } /** * Make a copy of the file to the prestaging directory. diff --git a/openbis-common/source/java/ch/systemsx/cisd/openbis/common/log/DefaultAppenderFilter.java b/openbis-common/source/java/ch/systemsx/cisd/openbis/common/log/DefaultAppenderFilter.java index c6be60e8d999f23f62e349c39c3347c0290897aa..d92470039eeba120221d694465cf709749790068 100644 --- a/openbis-common/source/java/ch/systemsx/cisd/openbis/common/log/DefaultAppenderFilter.java +++ b/openbis-common/source/java/ch/systemsx/cisd/openbis/common/log/DefaultAppenderFilter.java @@ -24,6 +24,11 @@ import org.apache.log4j.spi.LoggingEvent; */ public class DefaultAppenderFilter extends Filter { + public DefaultAppenderFilter() + { + System.err.println("filter"); + } + @Override public int decide(LoggingEvent event) { @@ -40,9 +45,10 @@ public class DefaultAppenderFilter extends Filter private int decide(String logger, String message) { - if ((logger.startsWith("ACCESS.") || logger.startsWith("TRACKING.")) + if (((logger.startsWith("ACCESS.") || logger.startsWith("TRACKING.")) && logger.endsWith("Logger") && message.contains("(START)")) + || logger.equals("org.hibernate.orm.deprecation")) { return Filter.DENY; } else diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/SingleSignOnServlet.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/SingleSignOnServlet.java new file mode 100644 index 0000000000000000000000000000000000000000..69103f4388ff2e2b008e513b023e762398bbaf2e --- /dev/null +++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/SingleSignOnServlet.java @@ -0,0 +1,127 @@ +/* + * Copyright 2019 ETH Zuerich, SIS + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package ch.ethz.sis.openbis.generic.server; + +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.log4j.Logger; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; + +import ch.systemsx.cisd.authentication.IPrincipalProvider; +import ch.systemsx.cisd.authentication.Principal; +import ch.systemsx.cisd.common.logging.LogCategory; +import ch.systemsx.cisd.common.logging.LogFactory; +import ch.systemsx.cisd.common.spring.ExposablePropertyPlaceholderConfigurer; +import ch.systemsx.cisd.openbis.generic.client.web.server.AbstractServlet; +import ch.systemsx.cisd.openbis.generic.server.ComponentNames; +import ch.systemsx.cisd.openbis.generic.shared.IOpenBisSessionManager; +import ch.systemsx.cisd.openbis.generic.shared.dto.Session; + +/** + * @author Franz-Josef Elmer + */ +@Controller +public class SingleSignOnServlet extends AbstractServlet +{ + public static final String SERVLET_NAME = "ssos"; + + public static final String SESSION_ID_KEY = "session-id-key"; + + public static final String DEFAULT_SESSION_ID_KEY = "Shib-Session-ID"; + + public static final String USER_ID_KEY = "user-id-key"; + + public static final String DEFAULT_USER_ID_KEY = "mail"; + + public static final String FIRST_NAME_KEY = "first-name-key"; + + public static final String DEFAULT_FIRST_NAME_KEY = "givenName"; + + public static final String LAST_NAME_KEY = "last-name-key"; + + public static final String DEFAULT_LAST_NAME_KEY = "surname"; + + public static final String EMAIL_KEY = "email-key"; + + public static final String DEFAULT_EMAIL_KEY = "mail"; + + public static final String REDIRECT_URL_KEY = "redirect-url"; + + public static final String DEFAULT_REDIRECT_URL = "webapp/eln-lims"; + + private static final Logger operationLog = LogFactory.getLogger(LogCategory.OPERATION, SingleSignOnServlet.class); + + @Resource(name = ExposablePropertyPlaceholderConfigurer.PROPERTY_CONFIGURER_BEAN_NAME) + private ExposablePropertyPlaceholderConfigurer configurer; + + @Resource(name = ComponentNames.SESSION_MANAGER) + private IOpenBisSessionManager sessionManager; + + private final Map<String, String> sessionTokenBySessionId = new HashMap<>(); + + @Override + @RequestMapping({ SERVLET_NAME }) + protected void respondToRequest(HttpServletRequest request, HttpServletResponse response) throws Exception, IOException + { + String sessionId = getHeader(request, SESSION_ID_KEY, DEFAULT_SESSION_ID_KEY); + String sessionToken = sessionTokenBySessionId.get(sessionId); + if (sessionToken != null) + { + Session session = sessionManager.tryGetSession(sessionToken); + if (session != null) + { + return; + } + } + String userId = getHeader(request, USER_ID_KEY, DEFAULT_USER_ID_KEY); + String firstName = getHeader(request, FIRST_NAME_KEY, DEFAULT_FIRST_NAME_KEY); + String lastName = getHeader(request, LAST_NAME_KEY, DEFAULT_LAST_NAME_KEY); + String email = getHeader(request, EMAIL_KEY, DEFAULT_EMAIL_KEY); + Principal principal = new Principal(userId, firstName, lastName, email, true); + sessionToken = sessionManager.tryToOpenSession(userId, new IPrincipalProvider() + { + + @Override + public Principal tryToGetPrincipal(String userID) + { + return principal; + } + }); + sessionTokenBySessionId.put(sessionId, sessionToken); + operationLog.info("Session " + sessionToken + " created for session id " + sessionId); + response.sendRedirect(configurer.getResolvedProps().getProperty(REDIRECT_URL_KEY, DEFAULT_REDIRECT_URL)); + } + + private String getHeader(HttpServletRequest request, String keyProperty, String defaultKey) + { + String key = configurer.getResolvedProps().getProperty(keyProperty, defaultKey); + String header = request.getHeader(key); + if (header != null) + { + return header; + } + throw new IllegalArgumentException("Missing header '" + key + "'."); + } + +} diff --git a/openbis_ng_ui/.babelrc b/openbis_ng_ui/.babelrc deleted file mode 100644 index 7683f4458cdc954baa9ef62e6891fdd95821cc54..0000000000000000000000000000000000000000 --- a/openbis_ng_ui/.babelrc +++ /dev/null @@ -1,4 +0,0 @@ -{ - "presets":["@babel/preset-env", "@babel/preset-react"], - "plugins": ["@babel/plugin-transform-runtime", "@babel/plugin-proposal-object-rest-spread", "@babel/plugin-proposal-class-properties"] -} diff --git a/openbis_ng_ui/babel.config.js b/openbis_ng_ui/babel.config.js new file mode 100644 index 0000000000000000000000000000000000000000..8f5ca5e35a7fba4fd2b08c31cd02abf0d8b83509 --- /dev/null +++ b/openbis_ng_ui/babel.config.js @@ -0,0 +1,20 @@ +/* eslint-disable-next-line no-undef */ +module.exports = function (api) { + api.cache(true) + + const presets = [ + '@babel/preset-env', + '@babel/preset-react', + ] + + const plugins = [ + '@babel/plugin-transform-runtime', + '@babel/plugin-proposal-object-rest-spread', + '@babel/plugin-proposal-class-properties' + ] + + return { + presets, + plugins + } +} diff --git a/openbis_ng_ui/jest.config.js b/openbis_ng_ui/jest.config.js new file mode 100644 index 0000000000000000000000000000000000000000..82e9d638d412a254a477bad383680cb442fdd40e --- /dev/null +++ b/openbis_ng_ui/jest.config.js @@ -0,0 +1,10 @@ +/* eslint-disable-next-line no-undef */ +module.exports = { + reporters: [ + 'default', + 'jest-junit' + ], + setupFilesAfterEnv: [ + '<rootDir>srcTest/setupTests.js' + ] +} diff --git a/openbis_ng_ui/package.json b/openbis_ng_ui/package.json index e204e134575ceea425bdda57d961536dc6f3bb44..364817cd84262470f1e89b2031ed6d7fdd099bdd 100644 --- a/openbis_ng_ui/package.json +++ b/openbis_ng_ui/package.json @@ -5,56 +5,60 @@ "author": "Antti Luomi", "license": "Apache-2.0", "dependencies": { - "@material-ui/core": "^3.9.3", - "@material-ui/icons": "^3.0.2", - "install": "^0.12.2", - "npm": "^6.9.0", + "@material-ui/core": "^4.2.0", + "@material-ui/icons": "^4.2.1", + "connected-react-router": "^6.5.0", + "history": "^4.9.0", + "install": "^0.13.0", + "npm": "^6.10.0", "prop-types": "^15.7.2", "react": "^16.8.6", "react-dnd": "^7.4.5", "react-dnd-html5-backend": "^7.4.4", "react-dom": "^16.8.6", - "react-redux": "^7.0.3", + "react-redux": "^7.1.0", + "react-router": "^5.0.1", "redux": "^4.0.1", - "redux-saga": "^1.0.2", + "redux-saga": "^1.0.5", "reselect": "^4.0.0", "typeface-roboto": "^0.0.54" }, "devDependencies": { - "auto-bind": "^2.1.0", - "@babel/core": "^7.4.4", - "@babel/preset-env": "^7.4.4", + "@babel/core": "^7.5.0", + "@babel/plugin-proposal-class-properties": "^7.5.0", + "@babel/plugin-proposal-object-rest-spread": "^7.5.1", + "@babel/plugin-transform-modules-commonjs": "^7.5.0", + "@babel/plugin-transform-runtime": "^7.5.0", + "@babel/preset-env": "^7.5.0", "@babel/preset-react": "^7.0.0", - "@babel/plugin-transform-runtime": "^7.4.4", - "@babel/plugin-proposal-object-rest-spread": "^7.4.4", - "@babel/plugin-proposal-class-properties": "^7.4.4", - "babel-jest": "^24.7.1", - "babel-loader": "^8.0.5", - "babel-eslint": "^10.0.1", - "css-loader": "^2.1.1", - "enzyme": "^3.9.0", - "enzyme-adapter-react-16": "^1.12.1", - "eslint": "^5.16.0", + "auto-bind": "^2.1.0", + "babel-eslint": "^10.0.2", + "babel-jest": "^24.8.0", + "babel-loader": "^8.0.6", + "css-loader": "^3.0.0", + "enzyme": "^3.10.0", + "enzyme-adapter-react-16": "^1.14.0", + "eslint": "^6.0.1", "eslint-config-standard": "^12.0.0", - "eslint-plugin-import": "^2.17.2", - "eslint-plugin-jest": "^22.5.1", - "eslint-plugin-node": "^9.0.0", - "eslint-plugin-promise": "^4.1.1", - "eslint-plugin-react": "^7.13.0", + "eslint-plugin-import": "^2.18.0", + "eslint-plugin-jest": "^22.7.2", + "eslint-plugin-node": "^9.1.0", + "eslint-plugin-promise": "^4.2.1", + "eslint-plugin-react": "^7.14.2", "eslint-plugin-standard": "^4.0.0", - "file-loader": "^3.0.1", + "file-loader": "^4.0.0", "html-webpack-plugin": "^3.2.0", - "jest": "^24.7.1", + "jest": "^24.8.0", "jest-junit": "^6.4.0", - "raw-loader": "^2.0.0", - "react-hot-loader": "^4.8.4", + "raw-loader": "^3.0.0", + "react-hot-loader": "^4.12.5", "react-loader": "^2.4.5", "source-map-loader": "^0.2.4", "style-loader": "^0.23.1", - "url-loader": "^1.1.2", - "webpack": "^4.30.0", - "webpack-cli": "^3.3.1", - "webpack-dev-server": "^3.3.1" + "url-loader": "^2.0.1", + "webpack": "^4.35.3", + "webpack-cli": "^3.3.5", + "webpack-dev-server": "^3.7.2" }, "scripts": { "dev": "webpack-dev-server --hot --config webpack.config.dev.js", @@ -64,14 +68,5 @@ "lint:fix": "eslint --ext .js,.jsx src test --fix", "test": "jest", "test:watch": "npm test -- --watch" - }, - "jest": { - "reporters": [ - "default", - "jest-junit" - ], - "setupFilesAfterEnv": [ - "<rootDir>srcTest/setupTests.js" - ] } } diff --git a/openbis_ng_ui/src/components/common/browser/BrowserNode.jsx b/openbis_ng_ui/src/components/common/browser/BrowserNode.jsx index 22a2051da6da1aa3376250247d0d46f0da3c42e3..2844eecc2a71beaf7eb266494f8d66853333adc3 100644 --- a/openbis_ng_ui/src/components/common/browser/BrowserNode.jsx +++ b/openbis_ng_ui/src/components/common/browser/BrowserNode.jsx @@ -12,10 +12,8 @@ import logger from '../../../common/logger.js' const styles = { icon: { - margin: '0px 8px' - }, - text: { - marginLeft: '-16px' + margin: '0px 8px', + minWidth: '24px' } } @@ -31,7 +29,7 @@ class BrowserNode extends React.Component { button selected={node.selected} onClick={() => this.props.nodeSelect(node.id)} - style={{paddingLeft: level * 20 + 'px'}}> + style={{paddingLeft: level * 24 + 'px'}}> {this.renderIcon(node)} {this.renderText(node)} </ListItem> @@ -69,21 +67,17 @@ class BrowserNode extends React.Component { root: classes.icon }}>{icon}</ListItemIcon> }else{ - return null + return <ListItemIcon classes={{ + root: classes.icon + }}><span></span></ListItemIcon> } } renderText(node){ logger.log(logger.DEBUG, 'BrowserNode.renderText "' + node.text + '"') - const classes = this.props.classes - return <ListItemText primary={node.text} - inset={true} - classes={{ - primary: classes.text - }} /> } diff --git a/openbis_ng_ui/src/components/common/content/ContentTabs.jsx b/openbis_ng_ui/src/components/common/content/ContentTabs.jsx index 889ca3bdbe6a6a701787267a1c03f91834f8747d..d6eec630b753b230250f13d86a7ff549929463f1 100644 --- a/openbis_ng_ui/src/components/common/content/ContentTabs.jsx +++ b/openbis_ng_ui/src/components/common/content/ContentTabs.jsx @@ -4,19 +4,10 @@ import {withStyles} from '@material-ui/core/styles' import Tabs from '@material-ui/core/Tabs' import Tab from '@material-ui/core/Tab' import CloseIcon from '@material-ui/icons/Close' +import * as objectTypes from '../../../common/consts/objectType.js' import logger from '../../../common/logger.js' const styles = { - tabsRoot: { - height: '48px' - }, - tabsScrollable: { - overflow: 'auto', - marginBottom: '0px !important' - }, - tabsScrollButtons: { - height: '48px' - }, tabRoot: { textTransform: 'none' }, @@ -26,7 +17,6 @@ const styles = { tabLabel: { display: 'inline-flex', alignItems: 'center', - marginRight: '-16px' } } @@ -52,11 +42,6 @@ class ContentTabs extends React.Component { value={_.findIndex(this.props.objects, this.props.selectedObject)} variant="scrollable" scrollButtons="on" - classes={{ - root: classes.tabsRoot, - scrollable: classes.tabsScrollable, - scrollButtons: classes.tabsScrollButtons - }} onChange={this.handleTabChange} > {this.props.objects.map(object => @@ -72,7 +57,18 @@ class ContentTabs extends React.Component { } renderLabel(object){ - let label = _.find(this.props.changedObjects, object) ? object.id + '*' : object.id + let changed = _.find(this.props.changedObjects, object) ? '*' : '' + let label = null + + switch(object.type){ + case objectTypes.SEARCH: + label = 'search: ' + object.id + break + default: + label = object.id + changed + break + } + return <span className={this.props.classes.tabLabel}>{label}{this.renderIcon(object)}</span> } diff --git a/openbis_ng_ui/src/components/common/error/ErrorDialog.jsx b/openbis_ng_ui/src/components/common/error/ErrorDialog.jsx index c2b40483998ca2036b9395f939dd9f9223cb0da7..f8d504134de996ad6ce90ea6c47a5a0af8c2d2ae 100644 --- a/openbis_ng_ui/src/components/common/error/ErrorDialog.jsx +++ b/openbis_ng_ui/src/components/common/error/ErrorDialog.jsx @@ -14,11 +14,11 @@ import logger from '../../../common/logger.js' import profile from '../../../profile.js' -const dialogStyles = { +const dialogStyles = (theme) => ({ paper: { - backgroundColor: '#ffd2d2', - }, -} + backgroundColor: theme.palette.error.main + } +}) const StyledDialog = withStyles(dialogStyles)(Dialog) diff --git a/openbis_ng_ui/src/components/common/form/EditableField.jsx b/openbis_ng_ui/src/components/common/form/EditableField.jsx index babaa760fa29ff8c28f1cbc25061c6d50060a6d7..c6959a2d8f0d3a8b06fce1d0fb1b78b992e95488 100644 --- a/openbis_ng_ui/src/components/common/form/EditableField.jsx +++ b/openbis_ng_ui/src/components/common/form/EditableField.jsx @@ -5,7 +5,7 @@ import {withStyles} from '@material-ui/core/styles' import * as util from '../../../common/util.js' import logger from '../../../common/logger.js' -const styles = () => ({ +const styles = (theme) => ({ container: { display: 'inline-flex', margin: '1px 30px 1px 1px', @@ -19,7 +19,7 @@ const styles = () => ({ hovered: { margin: '0px', border: '1px solid', - borderColor: 'rgba(0, 0, 0, 0.14)' + borderColor: theme.palette.action.selected }, }) diff --git a/openbis_ng_ui/src/components/common/grid/Grid.jsx b/openbis_ng_ui/src/components/common/grid/Grid.jsx index 49f450a50c0fb3b259369c472a69306a105f9bef..dc9f18dea94ce3c49e4c9096c2a6f3ec6f1bd34d 100644 --- a/openbis_ng_ui/src/components/common/grid/Grid.jsx +++ b/openbis_ng_ui/src/components/common/grid/Grid.jsx @@ -24,7 +24,7 @@ const styles = (theme) => ({ }, headerContainer: { flexGrow: 0, - padding: theme.spacing.unit * 2, + padding: theme.spacing(2), paddingBottom: 0 }, footerContainer: { @@ -35,8 +35,8 @@ const styles = (theme) => ({ tableContainer: { flexGrow: 1, overflow: 'auto', - paddingLeft: theme.spacing.unit * 2, - paddingRight: theme.spacing.unit * 2 + paddingLeft: theme.spacing(2), + paddingRight: theme.spacing(2) }, table: { height: '100%' @@ -83,7 +83,7 @@ class Grid extends React.Component { this.state = { loaded: false, - filter: '', + filter: this.props.filter || '', page: 0, pageSize: 10, visibleColumns: Object.keys(this.columnsMap), @@ -179,7 +179,7 @@ class Grid extends React.Component { page: 0, filter }), () => { - this.load() + this.loadData() }) } @@ -201,7 +201,7 @@ class Grid extends React.Component { sortDirection: prevState.sortDirection === 'asc' ? 'desc' : 'asc' }), () => { this.saveSettings() - this.load() + this.loadData() }) } } @@ -210,7 +210,7 @@ class Grid extends React.Component { this.setState(() => ({ page }), () => { - this.load() + this.loadData() }) } @@ -220,7 +220,7 @@ class Grid extends React.Component { pageSize }), () => { this.saveSettings() - this.load() + this.loadData() }) } @@ -273,7 +273,7 @@ class Grid extends React.Component { } const { classes } = this.props - const { page, pageSize, filter, visibleColumns, sort, sortDirection } = this.state + const { page, pageSize, filter, visibleColumns } = this.state let pagedObjects = null let totalCount = null @@ -300,40 +300,18 @@ class Grid extends React.Component { <Table classes={{ root: classes.table }}> <TableHead classes={{ root: classes.tableHeader }}> <TableRow> - {this.columnsArray.map(column => { - if(visibleColumns.includes(column.field)){ - return ( - <TableCell key={column.field}> - <TableSortLabel - active={column.sort && sort === column.field} - direction={sortDirection} - onClick={this.handleSortChange(column)} - > - {column.label} - </TableSortLabel> - </TableCell> - ) - }else{ - return null - } - })} + {this.columnsArray.map(column => + this.renderHeaderCell(column) + )} </TableRow> </TableHead> <TableBody> {pagedObjects.map(row => { return ( <TableRow key={row.id} hover> - {this.columnsArray.map(column => { - if(visibleColumns.includes(column.field)){ - return ( - <TableCell key={column.field}> - {column.render(row)} - </TableCell> - ) - }else{ - return null - } - })} + {this.columnsArray.map(column => + this.renderRowCell(column, row) + )} </TableRow> ) })} @@ -361,6 +339,49 @@ class Grid extends React.Component { ) } + renderHeaderCell(column){ + const { visibleColumns, sort, sortDirection } = this.state + + if(visibleColumns.includes(column.field)){ + if(column.sort){ + return ( + <TableCell key={column.field}> + <TableSortLabel + active={sort === column.field} + direction={sortDirection} + onClick={this.handleSortChange(column)} + > + {column.label} + </TableSortLabel> + </TableCell> + ) + }else{ + return ( + <TableCell key={column.field}> + {column.label} + </TableCell> + ) + } + }else{ + return null + } + } + + renderRowCell(column, row){ + const { visibleColumns } = this.state + + if(visibleColumns.includes(column.field)){ + let rendered = column.render(row) + return ( + <TableCell key={column.field}> + {rendered ? rendered : <span> </span> } + </TableCell> + ) + }else{ + return null + } + } + } export default _.flow( diff --git a/openbis_ng_ui/src/components/common/loading/Loading.jsx b/openbis_ng_ui/src/components/common/loading/Loading.jsx index 42b0aef09c698670bdf3d8392dc5daa4d3311866..17951d7dbabfd8857a0bb3b42f9fb2a0ddee44d7 100644 --- a/openbis_ng_ui/src/components/common/loading/Loading.jsx +++ b/openbis_ng_ui/src/components/common/loading/Loading.jsx @@ -3,13 +3,13 @@ import {withStyles} from '@material-ui/core/styles' import CircularProgress from '@material-ui/core/CircularProgress' import logger from '../../../common/logger.js' -const styles = { +const styles = (theme) => ({ loader: { position: 'absolute', width: '100%', height: '100%', zIndex: 1000, - backgroundColor: '#FFFFFF', + backgroundColor: theme.palette.background.paper, opacity: 0.8, textAlign: 'center', }, @@ -18,7 +18,7 @@ const styles = { top: '20%', left: 'calc(50% - 20px)' } -} +}) class Loading extends React.Component { diff --git a/openbis_ng_ui/src/components/common/menu/Menu.jsx b/openbis_ng_ui/src/components/common/menu/Menu.jsx index d9b3a8b49e8a459e5601fc66903b70a99f42debf..ff4b7684e227720e25a0a73bd16920bb12c50d59 100644 --- a/openbis_ng_ui/src/components/common/menu/Menu.jsx +++ b/openbis_ng_ui/src/components/common/menu/Menu.jsx @@ -22,15 +22,15 @@ const styles = (theme) => ({ flexGrow: 1, }, search: { - color: theme.palette.common.white, - backgroundColor: fade(theme.palette.common.white, 0.15), + color: theme.palette.background.paper, + backgroundColor: fade(theme.palette.background.paper, 0.15), '&:hover': { - backgroundColor: fade(theme.palette.common.white, 0.25), + backgroundColor: fade(theme.palette.background.paper, 0.25), }, borderRadius: theme.shape.borderRadius, - paddingLeft: theme.spacing.unit, - paddingRight: theme.spacing.unit, - marginRight: theme.spacing.unit * 2, + paddingLeft: theme.spacing(1), + paddingRight: theme.spacing(1), + marginRight: theme.spacing(2), transition: theme.transitions.create('width'), width: '200px', '&:focus-within': { @@ -38,8 +38,8 @@ const styles = (theme) => ({ }, }, searchIcon: { - paddingLeft: theme.spacing.unit / 2, - paddingRight: theme.spacing.unit, + paddingLeft: theme.spacing(1) / 2, + paddingRight: theme.spacing(1), cursor: 'default' }, searchClear: { diff --git a/openbis_ng_ui/src/components/types/objectType/ObjectType.jsx b/openbis_ng_ui/src/components/types/objectType/ObjectType.jsx index 778fb80d8e9f17bff15d4fcc4c992f4e2c481038..96d78d7f7eb672da9d1dedf8faeb2eb5106ac117 100644 --- a/openbis_ng_ui/src/components/types/objectType/ObjectType.jsx +++ b/openbis_ng_ui/src/components/types/objectType/ObjectType.jsx @@ -19,11 +19,11 @@ const styles = (theme) => ({ form: { flex: '1 1 0', overflow: 'auto', - padding: theme.spacing.unit * 2 + padding: theme.spacing(2) }, footer: { flex: '0 0', - padding: theme.spacing.unit * 2 + padding: theme.spacing(2) } }) diff --git a/openbis_ng_ui/src/components/types/objectType/ObjectTypeFooter.jsx b/openbis_ng_ui/src/components/types/objectType/ObjectTypeFooter.jsx index 7b3659efbc7457db90ba0d8867c6399206e91498..04282adde58f352648b291141913cb26ae8b08de 100644 --- a/openbis_ng_ui/src/components/types/objectType/ObjectTypeFooter.jsx +++ b/openbis_ng_ui/src/components/types/objectType/ObjectTypeFooter.jsx @@ -5,7 +5,7 @@ import logger from '../../../common/logger.js' const styles = (theme) => ({ button: { - marginRight: theme.spacing.unit * 2 + marginRight: theme.spacing(2) } }) diff --git a/openbis_ng_ui/src/components/types/objectType/ObjectTypePropertyRow.jsx b/openbis_ng_ui/src/components/types/objectType/ObjectTypePropertyRow.jsx index e23c1dd7444b9f0e8b18131f9925e501e44a34d7..f626780e6c1a5901e916d9db469e1ee96c5e5699 100644 --- a/openbis_ng_ui/src/components/types/objectType/ObjectTypePropertyRow.jsx +++ b/openbis_ng_ui/src/components/types/objectType/ObjectTypePropertyRow.jsx @@ -16,11 +16,11 @@ const styles = (theme) => ({ row: { backgroundColor: theme.palette.background.paper, '&:hover': { - backgroundColor: 'rgba(0, 0, 0, 0.08)', + backgroundColor: theme.palette.action.hover, cursor: 'pointer' }, '&$selected': { - backgroundColor: 'rgba(0, 0, 0, 0.14)' + backgroundColor: theme.palette.action.selected } }, selected: {}, diff --git a/openbis_ng_ui/src/components/types/search/Search.jsx b/openbis_ng_ui/src/components/types/search/Search.jsx index 320b56fa19b45c16cd3cb7d6870994375d560b7e..4c9591e0cf599a527275733b36c400333a916c33 100644 --- a/openbis_ng_ui/src/components/types/search/Search.jsx +++ b/openbis_ng_ui/src/components/types/search/Search.jsx @@ -62,9 +62,6 @@ class Search extends React.Component { searchObjectTypes(){ let criteria = new dto.SampleTypeSearchCriteria() let fo = new dto.SampleTypeFetchOptions() - - criteria.withCode().thatContains(this.props.objectId) - return facade.searchSampleTypes(criteria, fo).then(result => { return result.objects }) @@ -73,9 +70,6 @@ class Search extends React.Component { searchCollectionTypes(){ let criteria = new dto.ExperimentTypeSearchCriteria() let fo = new dto.ExperimentTypeFetchOptions() - - criteria.withCode().thatContains(this.props.objectId) - return facade.searchExperimentTypes(criteria, fo).then(result => { return result.objects }) @@ -84,9 +78,6 @@ class Search extends React.Component { searchDataSetTypes(){ let criteria = new dto.DataSetTypeSearchCriteria() let fo = new dto.DataSetTypeFetchOptions() - - criteria.withCode().thatContains(this.props.objectId) - return facade.searchDataSetTypes(criteria, fo).then(result => { return result.objects }) @@ -95,9 +86,6 @@ class Search extends React.Component { searchMaterialTypes(){ let criteria = new dto.MaterialTypeSearchCriteria() let fo = new dto.MaterialTypeFetchOptions() - - criteria.withCode().thatContains(this.props.objectId) - return facade.searchMaterialTypes(criteria, fo).then(result => { return result.objects }) @@ -128,6 +116,7 @@ class Search extends React.Component { return ( <Grid id={ids.TYPES_GRID_ID} + filter={this.props.objectId} columns={[ { field: 'permId.entityKind', diff --git a/openbis_ng_ui/src/components/users/search/Search.jsx b/openbis_ng_ui/src/components/users/search/Search.jsx index 9be872e451444da57f788c340fc024b859493092..03a26ce48bbd1f52b94eae2830c7dc138cb1cb90 100644 --- a/openbis_ng_ui/src/components/users/search/Search.jsx +++ b/openbis_ng_ui/src/components/users/search/Search.jsx @@ -42,6 +42,7 @@ class Search extends React.Component { return ( <Grid id={ids.USERS_GRID_ID} + filter={this.props.objectId} columns={[ { field: 'userId' diff --git a/openbis_ng_ui/src/store/reducers/ui/pages/common/page.js b/openbis_ng_ui/src/store/reducers/ui/pages/common/page.js index 98d06f6e2b2ecf07f92e21372ad5641f1ecc5475..5af622632607567f19edcf32ced0cb6a70e81612 100644 --- a/openbis_ng_ui/src/store/reducers/ui/pages/common/page.js +++ b/openbis_ng_ui/src/store/reducers/ui/pages/common/page.js @@ -58,7 +58,9 @@ export const changedObjects = (state = [], action) => { export const selectedObject = (state = null, action) => { switch(action.type){ case actions.SET_SELECTED_OBJECT: { - let newState = action.payload.type && action.payload.id ? { type: action.payload.type, id: action.payload.id } : null + const { type, id } = action.payload + + let newState = (type === null || type === undefined) && (id === null || id === undefined) ? null : { type: action.payload.type, id: action.payload.id } if(_.isEqual(state, newState)){ return state diff --git a/openbis_ng_ui/src/store/sagas/app.js b/openbis_ng_ui/src/store/sagas/app.js index 690fdbc63ddbccc6ca88733f6f8de01537910a27..d37b03ba936d12752280296c92d7256af3ff074b 100644 --- a/openbis_ng_ui/src/store/sagas/app.js +++ b/openbis_ng_ui/src/store/sagas/app.js @@ -63,10 +63,8 @@ function* logout() { function* search(action) { const {page, text} = action.payload - if(text && text.trim()){ - yield put(actions.objectOpen(page, objectTypes.SEARCH, text.trim())) - yield put(actions.setSearch('')) - } + yield put(actions.objectOpen(page, objectTypes.SEARCH, text.trim())) + yield put(actions.setSearch('')) } function* currentPageChange(action){ diff --git a/openbis_ng_ui/srcTest/components/common/browser/browser.test.js b/openbis_ng_ui/srcTest/components/common/browser/browser.test.js index 181104e78cf9a33c5ed94ad261da4e5384ee0288..49aa1fef982ebc7ad35daca9d3b5745efe0b6c21 100644 --- a/openbis_ng_ui/srcTest/components/common/browser/browser.test.js +++ b/openbis_ng_ui/srcTest/components/common/browser/browser.test.js @@ -72,7 +72,7 @@ describe('browser', () => { function simulateNodeIconClick(wrapper, id){ wrapper.findWhere(node => { return node.name() === 'BrowserNode' && node.prop('node').id === id - }).find('ListItemIcon').find('SvgIcon').first().simulate('click') + }).find('svg').first().simulate('click') } function simulateFilterChange(wrapper, filter){ diff --git a/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/controllers/MainController.js b/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/controllers/MainController.js index f2d8deeff0a0a358862f9b049f01cb9d1e54f710..142198f6bab65d4da0dce1cf78171022e97001b4 100644 --- a/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/controllers/MainController.js +++ b/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/controllers/MainController.js @@ -461,7 +461,7 @@ function MainController(profile) { case "showSpacePage": var _this = this; this.serverFacade.getSpaceFromCode(arg, function(space) { - document.title = "Space " + space.code; + document.title = "Space " + space; _this._showSpacePage(space); //window.scrollTo(0,0); }); diff --git a/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/server/ServerFacade.js b/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/server/ServerFacade.js index 64e007e98e0cfec6b754767c377c02d5f2b2090e..781654a1d5cba5321c51acaf63a999af16e765cf 100644 --- a/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/server/ServerFacade.js +++ b/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/server/ServerFacade.js @@ -336,10 +336,12 @@ function ServerFacade(openbisServer) { } this.listSpaces = function(callbackFunction) { - this.openbisServer.listSpacesWithProjectsAndRoleAssignments(null, function(data) { + var spaceRules = { entityKind : "SPACE", logicalOperator : "AND", rules : { } }; + mainController.serverFacade.searchForSpacesAdvanced(spaceRules, null, function(spacesSearchResult) { var spaces = []; - for(var i = 0; i < data.result.length; i++) { - spaces.push(data.result[i].code); + for(var sIdx = 0; sIdx < spacesSearchResult.objects.length; sIdx++) { + var space = spacesSearchResult.objects[sIdx]; + spaces.push(space.code); } callbackFunction(spaces); }); @@ -350,9 +352,9 @@ function ServerFacade(openbisServer) { } this.getSpaceFromCode = function(spaceCode, callbackFunction) { - this.openbisServer.listSpacesWithProjectsAndRoleAssignments(null, function(data) { - data.result.forEach(function(space){ - if(space.code === spaceCode) { + this.listSpaces(function(spaces) { + spaces.forEach(function(space){ + if(space === spaceCode) { callbackFunction(space); } }); @@ -2481,11 +2483,13 @@ function ServerFacade(openbisServer) { function(RoleAssignmentSearchCriteria, RoleAssignmentFetchOptions) { var criteria = new RoleAssignmentSearchCriteria(); - if (criteriaParams.space) { - criteria.withSpace().withCode().thatEquals(criteriaParams.space); - } if (criteriaParams.project) { criteria.withProject().withCode().thatEquals(criteriaParams.project); + if (criteriaParams.space) { + criteria.withProject().withSpace().withCode().thatEquals(criteriaParams.space); + } + } else if (criteriaParams.space) { + criteria.withSpace().withCode().thatEquals(criteriaParams.space); } if (criteriaParams.user) { criteria.withUser().withUserId().thatEquals(criteriaParams.user); diff --git a/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/util/FormUtil.js b/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/util/FormUtil.js index a70b6b6090a7a3e7ff1f16ef2545ff883f1a3a72..21929caa7676b2790e943fdc550df41d0a730761 100644 --- a/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/util/FormUtil.js +++ b/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/util/FormUtil.js @@ -1361,8 +1361,8 @@ var FormUtil = new function() { }); } - // params.space: space code (set this or project) - // params.project: project code (set this or space) + // params.space: space code (or space code of project) + // params.project: project code // params.acceptCallback: function to be called with (shareWith, groupOrUser) this.showAuthorizationDialog = function(params) { @@ -1370,7 +1370,7 @@ var FormUtil = new function() { Util.blockUI(); mainController.serverFacade.searchRoleAssignments({ - space: params.space ? params.space.code : null, + space: params.space ? params.space : (params.project ? params.project.spaceCode : null), project: params.project ? params.project.code : null, }, function(roleAssignments) { @@ -1378,7 +1378,7 @@ var FormUtil = new function() { // components var $roleAssignmentTable = _this._getRoleAssignmentTable(roleAssignments, _this._revokeRoleAssignment.bind(_this, params)); - var spaceOrProjectLabel = params.space ? params.space.code : params.project.code; + var spaceOrProjectLabel = params.space ? params.space : params.project.code; var $roleDropdown = FormUtil.getDropdown([ { label: 'Observer', value: 'OBSERVER', selected: true }, { label: 'User', value: 'USER' }, @@ -1453,7 +1453,7 @@ var FormUtil = new function() { user: grantTo == "User" ? groupOrUser : null, group: grantTo == "Group" ? groupOrUser.toUpperCase() : null, role: role, - space: dialogParams.space ? dialogParams.space.code : null, + space: dialogParams.space ? dialogParams.space : null, project: dialogParams.project ? dialogParams.project.permId : null, }, function(success, result) { if (success) { @@ -1565,7 +1565,7 @@ var FormUtil = new function() { entity = entityMap[key]; if(entity.type == entityTypeOrder[typeOrder]) { $table.append($("<tr>") - .append($("<td>").append(_this._getBooleanField('freezing-form-' + key.replace("+", "-"), entity.displayName, true))) + .append($("<td>").append(_this._getBooleanField(_this._createFormFieldId(key), entity.displayName, true))) .append($("<td>").append(getTypeDisplayName(entity.type))) .append($("<td>").append(entity.permId)) .append($("<td>").append(entity.displayName)) @@ -1609,34 +1609,35 @@ var FormUtil = new function() { $window.append($btnAccept).append(' ').append($btnCancel); $window.submit(function() { - var username = mainController.serverFacade.getUserId(); - var password = $passField.val(); - new openbis().login( - username, - password, - function(data) { - if(data.result == null) { - Util.showUserError('The given password is not correct.'); - } else { - var sessionToken = data.result; - - - for (key in entityMap) { - if(!$('#freezing-form-' + key.replace("+", "-"))[0].checked) { - delete entityMap[key]; + if (_this._atLeastOnyEntitySelectedHasBeenSelectedForFreezing(entityMap)) { + var username = mainController.serverFacade.getUserId(); + var password = $passField.val(); + new openbis().login( + username, + password, + function(data) { + if(data.result == null) { + Util.showUserError('The given password is not correct.'); + } else { + var sessionToken = data.result; + + + for (key in entityMap) { + if(!$('#' + _this._createFormFieldId(key))[0].checked) { + delete entityMap[key]; + } } - } - - var parameters = { - "method" : "freeze", - "sessionToken" : sessionToken, - "freezeList" : entityMap - } - mainController.serverFacade.customASService(parameters, function(result) { - if(result.status === "OK") { - Util.showSuccess("Freezing succeeded.", function() { - Util.unblockUI(); - switch(entityType) { + + var parameters = { + "method" : "freeze", + "sessionToken" : sessionToken, + "freezeList" : entityMap + } + mainController.serverFacade.customASService(parameters, function(result) { + if(result.status === "OK") { + Util.showSuccess("Freezing succeeded.", function() { + Util.unblockUI(); + switch(entityType) { case "SPACE": mainController.changeView('showSpacePage', permId); break; @@ -1652,17 +1653,22 @@ var FormUtil = new function() { case "DATASET": mainController.changeView('showViewDataSetPageFromPermId', permId); break; - } - }); - } else { - Util.showUserError('Freezing failed.', function() { - Util.unblockUI(); - }); - } - }, "freeze-api", _this.showFreezingError); - } - }); - Util.blockUI(); + } + }); + } else { + Util.showUserError('Freezing failed.', function() { + Util.unblockUI(); + }); + } + }, "freeze-api", _this.showFreezingError); + } + }); + Util.blockUI(); + } else { + Util.showUserError('Nothing selected for freezing.', function() { + Util.unblockUI(); + }); + } }); var css = { @@ -1684,6 +1690,19 @@ var FormUtil = new function() { }, "freeze-api", _this.showFreezingError); } + this._atLeastOnyEntitySelectedHasBeenSelectedForFreezing = function(entityMap) { + for (key in entityMap) { + if ($('#' + this._createFormFieldId(key))[0].checked) { + return true; + } + } + return false; + } + + this._createFormFieldId = function(key) { + return 'freezing-form-' + key.replace("+", "-"); + } + this.showFreezingError = function(error) { Util.showError(error.message); } diff --git a/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/views/Inventory/InventoryView.js b/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/views/Inventory/InventoryView.js index 8265e76b1a8157aa3b811b6f00b2100995ff6155..0f759da88b94ab92a84789bbf2694b36d84ad91d 100644 --- a/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/views/Inventory/InventoryView.js +++ b/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/views/Inventory/InventoryView.js @@ -32,13 +32,12 @@ function InventoryView(inventoryController, inventoryView) { // var toolbarModel = []; - mainController.serverFacade.listSpacesWithProjectsAndRoleAssignments(null, function(dataWithSpacesAndProjects) { - var spaces = dataWithSpacesAndProjects.result; + mainController.serverFacade.listSpaces(function(spaces) { var labSpaces = []; for (var i = 0; i < spaces.length; i++) { var space = spaces[i]; - if(profile.isInventorySpace(space.code) && !space.code.endsWith("STOCK_CATALOG") && !space.code.endsWith("STOCK_ORDERS") && !space.code.endsWith("ELN_SETTINGS")) { - labSpaces.push({ type: "SPACE", permId : space.code, expand : true }); + if(profile.isInventorySpace(space) && !space.endsWith("STOCK_CATALOG") && !space.endsWith("STOCK_ORDERS") && !space.endsWith("ELN_SETTINGS")) { + labSpaces.push({ type: "SPACE", permId : space, expand : true }); } } diff --git a/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/views/LabNotebook/LabNotebookView.js b/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/views/LabNotebook/LabNotebookView.js index 3e5ca01092b4d7072940011f3e08ea78948265c3..23f1938cf1390b6dfda0c6f4f697a4609dd820a6 100644 --- a/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/views/LabNotebook/LabNotebookView.js +++ b/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/views/LabNotebook/LabNotebookView.js @@ -32,13 +32,12 @@ function LabNotebookView(labNotebookController, labNotebookView) { // var toolbarModel = []; - mainController.serverFacade.listSpacesWithProjectsAndRoleAssignments(null, function(dataWithSpacesAndProjects) { - var spaces = dataWithSpacesAndProjects.result; + mainController.serverFacade.listSpaces(function(spaces) { var labSpaces = []; for (var i = 0; i < spaces.length; i++) { var space = spaces[i]; - if(!profile.isInventorySpace(space.code)) { - labSpaces.push({ type: "SPACE", permId : space.code, expand : true }); + if(!profile.isInventorySpace(space)) { + labSpaces.push({ type: "SPACE", permId : space, expand : true }); } } diff --git a/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/views/SpaceForm/SpaceFormController.js b/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/views/SpaceForm/SpaceFormController.js index b2db9fd4456891997c709fe84141b24d83dca6b4..215c023a1e72976b85e2a09b37d0ee5f7919907f 100644 --- a/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/views/SpaceForm/SpaceFormController.js +++ b/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/views/SpaceForm/SpaceFormController.js @@ -24,11 +24,11 @@ function SpaceFormController(mainController, space) { require([ "as/dto/space/id/SpacePermId", "as/dto/space/fetchoptions/SpaceFetchOptions" ], function(SpacePermId, SpaceFetchOptions) { - var id = new SpacePermId(space.code); + var id = new SpacePermId(space); mainController.openbisV3.getSpaces([ id ], new SpaceFetchOptions()).done(function(map) { _this._spaceFormModel.v3_space = map[id]; _this._mainController.getUserRole({ - space: _this._spaceFormModel.space.code + space: _this._spaceFormModel.space }, function(roles){ _this._spaceFormModel.roles = roles; _this._spaceFormView.repaint(views); @@ -42,7 +42,7 @@ function SpaceFormController(mainController, space) { } this.createProject = function() { - this._mainController.changeView('showCreateProjectPage', this._spaceFormModel.space.code); + this._mainController.changeView('showCreateProjectPage', this._spaceFormModel.space); } } \ No newline at end of file diff --git a/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/views/SpaceForm/SpaceFormView.js b/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/views/SpaceForm/SpaceFormView.js index 6d25177f692be77db0c5739a34593dac448a0f18..ca91751a9770f772bc44efa4ce3602caf8a3b48a 100644 --- a/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/views/SpaceForm/SpaceFormView.js +++ b/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/views/SpaceForm/SpaceFormView.js @@ -29,7 +29,7 @@ function SpaceFormView(spaceFormController, spaceFormModel) { var typeTitle = "Space: "; - var $formTitle = $("<h2>").append(typeTitle + this._spaceFormModel.space.code); + var $formTitle = $("<h2>").append(typeTitle + this._spaceFormModel.space); // // Toolbar @@ -43,10 +43,10 @@ function SpaceFormView(spaceFormController, spaceFormModel) { } //Export - var $exportAll = FormUtil.getExportButton([{ type: "SPACE", permId : _this._spaceFormModel.space.code, expand : true }], false); + var $exportAll = FormUtil.getExportButton([{ type: "SPACE", permId : _this._spaceFormModel.space, expand : true }], false); toolbarModel.push({ component : $exportAll, tooltip: "Export Metadata & Data" }); - var $exportOnlyMetadata = FormUtil.getExportButton([{ type: "SPACE", permId : _this._spaceFormModel.space.code, expand : true }], true); + var $exportOnlyMetadata = FormUtil.getExportButton([{ type: "SPACE", permId : _this._spaceFormModel.space, expand : true }], true); toolbarModel.push({ component : $exportOnlyMetadata, tooltip: "Export Metadata only" }); //Jupyter Button diff --git a/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/views/Stock/StockView.js b/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/views/Stock/StockView.js index 5f9dbaada129d7b0b604c8286a9791173d2062d7..0b05416901f41b9445d21435d0659708a833d245 100644 --- a/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/views/Stock/StockView.js +++ b/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/views/Stock/StockView.js @@ -35,13 +35,12 @@ function StockView(stockController, stockView) { var $export = FormUtil.getButtonWithIcon("glyphicon-export", function() { Util.blockUI(); var facade = mainController.serverFacade; - facade.listSpacesWithProjectsAndRoleAssignments(null, function(dataWithSpacesAndProjects) { - var spaces = dataWithSpacesAndProjects.result; + facade.listSpaces(function(spaces) { var stockSpaces = []; for (var i = 0; i < spaces.length; i++) { var space = spaces[i]; - if(space.code === "STOCK_CATALOG" || space.code === "STOCK_ORDERS") { - stockSpaces.push({ type: "SPACE", permId : space.code, expand : true }); + if(space === "STOCK_CATALOG" || space === "STOCK_ORDERS") { + stockSpaces.push({ type: "SPACE", permId : space, expand : true }); } } diff --git a/openbis_standard_technologies/dist/server/service.properties b/openbis_standard_technologies/dist/server/service.properties index 5a3431b14ebed33be0ad679a89087ad58659aec1..0e38ec4f10eea30ad869f6b8a5e1f88fb63a0d93 100644 --- a/openbis_standard_technologies/dist/server/service.properties +++ b/openbis_standard_technologies/dist/server/service.properties @@ -21,6 +21,15 @@ database.max-idle-connections = # connections. Default: 3600s. database.active-connections-log-interval = +# --------------------------------------------------------------------------- +# Master data by Excel sheets +# --------------------------------------------------------------------------- +# Path to the file which stores version information of master data imported from Excel sheets. +# Default value: ../../../xls-import-version-info.json. The file will be created. +# It should be <openbis installation path>/servers/openBIS-server. +# Note, that the folder containing this file has to exist. +# xls-import.version-data-file = ../../../xls-import-version-info.json + # --------------------------------------------------------------------------- # Imaging database for screening and microscopy (optional, only used if screening technology switched on) # --------------------------------------------------------------------------- diff --git a/rtd_phosphonetx/build.gradle b/rtd_phosphonetx/build.gradle index 430f4fe6471fdab68e8d595e9be7fc991dee47e4..a53a350ca6216b9c5c52b20743dd3a825c140888 100644 --- a/rtd_phosphonetx/build.gradle +++ b/rtd_phosphonetx/build.gradle @@ -18,11 +18,6 @@ dependencies { } sourceSets { - main { - resources { - srcDirs = ['source/java'] - } - } test { resources { srcDirs = ['source/java'] diff --git a/screening/build.gradle b/screening/build.gradle index 3e859afcbdbe66e41f6be96baefe8acc866e0e9a..4b6fec3fbfddc91e0c1a86675a29b31b26fc03df 100644 --- a/screening/build.gradle +++ b/screening/build.gradle @@ -21,11 +21,6 @@ dependencies { } sourceSets { - main { - resources { - srcDirs = ['source/java'] - } - } test { resources { srcDirs = ['source/java']