Arvados-DCO-1.1-Signed-off-by: Peter Amstutz <peter.amstutz@curii.com>
const advancedFormValues = getWorkflowRunnerSettings(workflow);
const advancedFormValues = getWorkflowRunnerSettings(workflow);
- const owner = getResource<ProjectResource | UserResource>(getState().runProcessPanel.processOwnerUuid)(getState().resources);
+ let owner = getResource<ProjectResource | UserResource>(getState().runProcessPanel.processOwnerUuid)(getState().resources);
+ const userUuid = getUserUuid(getState());
+ if (!owner || !userUuid || owner.writableBy.indexOf(userUuid) === -1) {
+ owner = undefined;
+ }
if (isStepChanged && isWorkflowChanged) {
dispatch(runProcessPanelActions.SET_STEP_CHANGED(false));
if (isStepChanged && isWorkflowChanged) {
dispatch(runProcessPanelActions.SET_STEP_CHANGED(false));
import { getResource, ResourcesState } from 'store/resources/resources';
import { ProjectResource } from 'models/project';
import { UserResource } from 'models/user';
import { getResource, ResourcesState } from 'store/resources/resources';
import { ProjectResource } from 'models/project';
import { UserResource } from 'models/user';
+import { getUserUuid } from "common/getuser";
export const WORKFLOW_PANEL_ID = "workflowPanel";
const UUID_PREFIX_PROPERTY_NAME = 'uuidPrefix';
export const WORKFLOW_PANEL_ID = "workflowPanel";
const UUID_PREFIX_PROPERTY_NAME = 'uuidPrefix';
dispatch(initialize(RUN_PROCESS_ADVANCED_FORM, getWorkflowRunnerSettings(workflow)));
let owner;
if (ownerUuid) {
dispatch(initialize(RUN_PROCESS_ADVANCED_FORM, getWorkflowRunnerSettings(workflow)));
let owner;
if (ownerUuid) {
- dispatch(runProcessPanelActions.SET_PROCESS_OWNER_UUID(ownerUuid));
+ // Must be writable.
+ const userUuid = getUserUuid(getState());
owner = getResource<ProjectResource | UserResource>(ownerUuid)(getState().resources);
owner = getResource<ProjectResource | UserResource>(ownerUuid)(getState().resources);
+ if (!owner || !userUuid || owner.writableBy.indexOf(userUuid) === -1) {
+ owner = undefined;
+ }
+ }
+ if (owner) {
+ dispatch(runProcessPanelActions.SET_PROCESS_OWNER_UUID(owner.uuid));
}
dispatch(initialize(RUN_PROCESS_BASIC_FORM, { name, owner }));
}
dispatch(initialize(RUN_PROCESS_BASIC_FORM, { name, owner }));
import React from 'react';
import { connect, DispatchProp } from 'react-redux';
import React from 'react';
import { connect, DispatchProp } from 'react-redux';
-import { Field, WrappedFieldProps } from 'redux-form';
+import { Field } from 'redux-form';
import { Input, Dialog, DialogTitle, DialogContent, DialogActions, Button } from '@material-ui/core';
import {
GenericCommandInputParameter
import { Input, Dialog, DialogTitle, DialogContent, DialogActions, Button } from '@material-ui/core';
import {
GenericCommandInputParameter
import { ProjectsTreePickerItem } from 'views-components/projects-tree-picker/generic-projects-tree-picker';
import { ProjectResource } from 'models/project';
import { ResourceKind } from 'models/resource';
import { ProjectsTreePickerItem } from 'views-components/projects-tree-picker/generic-projects-tree-picker';
import { ProjectResource } from 'models/project';
import { ResourceKind } from 'models/resource';
+import { RootState } from 'store/store';
+import { getUserUuid } from 'common/getuser';
export type ProjectCommandInputParameter = GenericCommandInputParameter<ProjectResource, ProjectResource>;
export type ProjectCommandInputParameter = GenericCommandInputParameter<ProjectResource, ProjectResource>;
+const require: any = (value?: ProjectResource) => (value === undefined);
+
export interface ProjectInputProps {
input: ProjectCommandInputParameter;
options?: { showOnlyOwned: boolean, showOnlyWritable: boolean };
export interface ProjectInputProps {
input: ProjectCommandInputParameter;
options?: { showOnlyOwned: boolean, showOnlyWritable: boolean };
commandInput={input}
component={ProjectInputComponent as any}
format={format}
commandInput={input}
component={ProjectInputComponent as any}
format={format}
project?: ProjectResource;
}
project?: ProjectResource;
}
-export const ProjectInputComponent = connect()(
- class ProjectInputComponent extends React.Component<GenericInputProps & DispatchProp & {
+interface HasUserUuid {
+ userUuid: string;
+};
+
+const mapStateToProps = (state: RootState) => ({ userUuid: getUserUuid(state) });
+
+export const ProjectInputComponent = connect(mapStateToProps)(
+ class ProjectInputComponent extends React.Component<GenericInputProps & DispatchProp & HasUserUuid & {
options?: { showOnlyOwned: boolean, showOnlyWritable: boolean };
}, ProjectInputComponentState> {
state: ProjectInputComponentState = {
options?: { showOnlyOwned: boolean, showOnlyWritable: boolean };
}, ProjectInputComponentState> {
state: ProjectInputComponentState = {
+ invalid = () => (!this.state.project || this.state.project.writableBy.indexOf(this.props.userUuid) === -1);
+
renderInput() {
return <GenericInput
component={props =>
renderInput() {
return <GenericInput
component={props =>
<DialogActions>
<Button onClick={this.closeDialog}>Cancel</Button>
<Button
<DialogActions>
<Button onClick={this.closeDialog}>Cancel</Button>
<Button
- disabled={!this.state.project}
+ disabled={this.invalid()}
variant='contained'
color='primary'
onClick={this.submit}>Ok</Button>
variant='contained'
color='primary'
onClick={this.submit}>Ok</Button>
<Field
name='name'
component={TextField as any}
<Field
name='name'
component={TextField as any}
- label="Enter a new name for run process"
+ label="Name for this workflow run"
required
validate={PROCESS_NAME_VALIDATION} />
</Grid>
required
validate={PROCESS_NAME_VALIDATION} />
</Grid>
<Field
name='description'
component={TextField as any}
<Field
name='description'
component={TextField as any}
- label="Enter a description for run process" />
+ label="Optional description of this workflow run" />
</Grid>
<Grid item xs={12} md={6}>
<ProjectInput input={{
</Grid>
<Grid item xs={12} md={6}>
<ProjectInput input={{