Skip to content

Commit

Permalink
Merge pull request #20 from OneraHub/ft-import-discipline
Browse files Browse the repository at this point in the history
Ft import discipline
  • Loading branch information
relf committed Nov 22, 2019
2 parents 4428fc4 + fb7da6d commit 1b195f4
Show file tree
Hide file tree
Showing 36 changed files with 627 additions and 105 deletions.
4 changes: 3 additions & 1 deletion CHANGELOG
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,10 @@

<h3>1.4.0 (30/11/2019)</h3>
<ul>
<li>User can export a discipline from an analysis to another</li>
<li>Export toolbar moved in Export tab</li>
<li>Refactor Help menu with WhatsOpt documentation et web services API documentation</li>
<li>Implementation: Javascript linting</li>
<li>Implementation: Javascript linting, automated review with Codacy</li>
</ul>

<h3>1.3.0 (14/10/2019)</h3>
Expand Down
2 changes: 1 addition & 1 deletion VERSION
Original file line number Diff line number Diff line change
@@ -1 +1 @@
1.3.1
1.3.2
4 changes: 2 additions & 2 deletions app/assets/stylesheets/mda_viewer.scss
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,8 @@ div.editor-section {
margin-top:10px;
}

label.editor-header {
font-weight: bold;
div.editor-section-label {
margin:10px 0px 10px 0px;
}

.text-inactive {
Expand Down
2 changes: 1 addition & 1 deletion app/controllers/analyses_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ class AnalysesController < ApplicationController

# GET /mdas
def index
@mdas = policy_scope(Analysis)
@mdas = policy_scope(Analysis).roots
end

# GET /mdas/1
Expand Down
21 changes: 17 additions & 4 deletions app/controllers/api/v1/analyses_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,13 @@ class Api::V1::AnalysesController < Api::ApiController

before_action :set_mda, only: [:show, :update]

# GET /api/v1/mdas
# GET /api/v1/mdas[?with_sub_analyses=true]
def index
@mdas = policy_scope(Analysis)
if params[:with_sub_analyses]
@mdas = policy_scope(Analysis)
else
@mdas = policy_scope(Analysis).roots
end
json_response @mdas
end

Expand All @@ -32,7 +36,14 @@ def create

# PUT/PATCH /api/v1/mdas/1
def update
@mda.update!(mda_params)
import = mda_params[:import]
if import
fromAnalysis = Analysis.find(import[:analysis])
authorize(fromAnalysis, :show?)
@mda.import!(fromAnalysis, import[:disciplines])
else
@mda.update!(mda_params)
end
head :no_content
end

Expand All @@ -44,10 +55,12 @@ def set_mda

def mda_params
params.require(:analysis).permit(
:with_sub_analyses,
:name,
:note,
:public,
disciplines_attributes: [
import: [:analysis, disciplines: [] ],
disciplines_attributes: [
:name,
variables_attributes: [
:name, :io_mode, :type, :shape, :units, :desc,
Expand Down
37 changes: 21 additions & 16 deletions app/javascript/mda_viewer/components/AnalysisEditor.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -65,32 +65,37 @@ class AnalysisEditor extends React.PureComponent {
return (
<div className="container-fluid">
<div className="editor-section">
<div>Information</div>
<div className="editor-section-label">Information</div>
<form className="col-6" onSubmit={onAnalysisUpdate}>
<div className="form-group">
<label htmlFor="name">
<div className="editor-section-label">
Name
<input
type="text"
value={newAnalysisName}
className="form-control"
id="name"
onChange={onAnalysisNameChange}
/>
</label>
</div>
<input
type="text"
value={newAnalysisName}
className="form-control"
id="name"
onChange={onAnalysisNameChange}
/>
</div>
<div className="form-group">
<AnalysisNoteEditor
mdaId={mdaId}
note={note}
onAnalysisNoteChange={onAnalysisNoteChange}
/>
<div className="editor-section-label">
Notes
</div>
<div className="editor-section-label">
<AnalysisNoteEditor
mdaId={mdaId}
note={note}
onAnalysisNoteChange={onAnalysisNoteChange}
/>
</div>
</div>
<button type="submit" className="btn btn-primary ml-3">Save</button>
</form>
</div>
<div className="editor-section">
<div>Privacy</div>
<div className="editor-section-label">Privacy</div>
<form className="form" onSubmit={onAnalysisUpdate}>
<div className="form-group form-check">
<label htmlFor="public" className="form-check-label">
Expand Down
9 changes: 3 additions & 6 deletions app/javascript/mda_viewer/components/AnalysisNoteEditor.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -33,12 +33,9 @@ class AnalysisNoteEditor extends React.Component {

return (
<div>
<label htmlFor="analysis_note">
Note
<input type="hidden" name="analysis[note]" id={id} value={note} />
{/* <textarea name="analysis[note]" id={id} defaultValue={this.props.note} /> */}
<trix-editor id="analysis_note" input={id} class="trix-content form-control" ref={this.trixInput} />
</label>
<input type="hidden" name="analysis[note]" id={id} value={note} />
{/* <textarea name="analysis[note]" id={id} defaultValue={this.props.note} /> */}
<trix-editor id="analysis_note" input={id} class="trix-content form-control" ref={this.trixInput} />
</div>
);
}
Expand Down
5 changes: 4 additions & 1 deletion app/javascript/mda_viewer/components/AnalysisSelector.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,10 @@ class AnalysisSelector extends React.Component {

render() {
const { defaultSelected, isLoading, options } = this.state;
const { message } = this.props;
return (
<AsyncTypeahead
id="analysis"
defaultSelected={defaultSelected}
isLoading={isLoading}
options={options}
Expand All @@ -50,7 +52,7 @@ class AnalysisSelector extends React.Component {
labelKey="label"
minLength={2}
onSearch={this.handleSearch}
placeholder="Search for sub-analysis..."
placeholder={message}
onChange={this.handleChange}
ref={(ref) => { this.typeahead = ref; }}
/>
Expand All @@ -59,6 +61,7 @@ class AnalysisSelector extends React.Component {
}

AnalysisSelector.propTypes = {
message: PropTypes.string.isRequired,
selected: PropTypes.array.isRequired,
onAnalysisSearch: PropTypes.func.isRequired,
onAnalysisSelected: PropTypes.func.isRequired,
Expand Down
2 changes: 1 addition & 1 deletion app/javascript/mda_viewer/components/ConnectionsEditor.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -291,7 +291,7 @@ class ConnectionsEditor extends React.Component {

return (
<div className="container-fluid">
<div className="row editor-section">
<div className="row editor-section mt-3">
<div className="col-2">
<DisciplineSelector
label="From"
Expand Down
25 changes: 15 additions & 10 deletions app/javascript/mda_viewer/components/DisciplinesEditor.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,7 @@ class Discipline extends React.Component {
deploymentOrSubAnalysis = (
<div className="form-group ml-2">
<AnalysisSelector
message="Search for sub-analysis..."
selected={selected}
onAnalysisSearch={onSubAnalysisSearch}
onAnalysisSelected={this.handleSubAnalysisSelected}
Expand Down Expand Up @@ -301,7 +302,7 @@ class DisciplinesEditor extends React.Component {
return (
<div className="container-fluid">
<div className="editor-section">
<div>
<div className="editor-section-label">
Disciplines
<span className="badge badge-info ml-2">{nbNodes}</span>
</div>
Expand All @@ -324,16 +325,20 @@ class DisciplinesEditor extends React.Component {
</DragDropContext>
</div>
<div className="editor-section">
<form className="form-inline" onSubmit={onDisciplineCreate}>
<form className="form" onSubmit={onDisciplineCreate}>
<div className="form-group">
<input
type="text"
value={name}
placeholder="Enter Discipline Name..."
className="form-control"
id="name"
onChange={onDisciplineNameChange}
/>
<div className="row">
<div className="col-3">
<input
type="text"
value={name}
placeholder="Enter Discipline Name..."
className="form-control"
id="name"
onChange={onDisciplineNameChange}
/>
</div>
</div>
</div>
<button type="submit" className="btn btn-primary ml-3">Add</button>
</form>
Expand Down
119 changes: 119 additions & 0 deletions app/javascript/mda_viewer/components/ExportPanel.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
import React from 'react';
import PropTypes from 'prop-types';
import ToolBar from './ToolBar';
import AnalysisSelector from './AnalysisSelector';

class ExportPanel extends React.Component {
constructor(props) {
super(props);
this.state = {
selected: [],
};
const { api, db } = this.props;
this.api = api;
this.db = db;
this.handleAnalysisSearch = this.handleAnalysisSearch.bind(this);
this.handleAnalysisSelected = this.handleAnalysisSelected.bind(this);
}

handleAnalysisSearch(callback) {
this.api.getAnalysisToExportTo(
(response) => {
const options = response.data
.filter((analysis) => analysis.id !== this.db.getAnalysisId())
.map((analysis) => ({ id: analysis.id, label: `#${analysis.id} ${analysis.name}` }));
callback(options);
},
);
}

handleAnalysisSelected(selected) {
this.setState({ selected });
}

handleExport(disc) {
const { selected } = this.state;
const [selection] = selected;

this.api.importDiscipline(this.db.getAnalysisId(), disc.id, selection.id,
() => {
/* global dataConfirmModal */
dataConfirmModal.confirm({
title: 'Export done!',
text: `Discipline ${disc.name} exported to ${selection.label}`,
commit: `Go to ${selection.label}`,
commitClass: 'btn-primary',
cancel: 'Continue',
cancelClass: 'btn-info',
onConfirm: () => { window.location.href = this.api.url(`/analyses/${selection.id}`); },
onCancel: () => { },
});
},
(error) => {
console.log(error);
dataConfirmModal.confirm({
title: 'Oups!',
text: 'Sorry something went wrong!',
commit: 'Ok',
commitClass: 'btn-primary',
cancelClass: 'd-none',
onConfirm: () => { },
});
});
}

render() {
const mdaId = this.db.getAnalysisId();
const { selected } = this.state;
const disabled = (selected.length === 0);

let disciplineExports = [];
disciplineExports = this.db.getDisciplines().map((disc) => {
const label = `Export ${disc.name}`;
return (
<div key={disc.id} className="btn-group mr-2" role="group">
<button
className="btn btn-primary"
type="button"
onClick={() => this.handleExport(disc)}
disabled={disabled}
>
{label}
</button>
</div>
);
});

return (
<div className="container-fluid">
<div className="editor-section">
<div className="editor-section-label">Analysis export</div>
<ToolBar mdaId={mdaId} api={this.api} db={this.db} />
</div>
<div className="editor-section">
<div className="editor-section-label">Discipline export</div>
<div className="row">
<div className="col-4">
<AnalysisSelector
message="Search analysis to export to..."
selected={selected}
onAnalysisSearch={this.handleAnalysisSearch}
onAnalysisSelected={this.handleAnalysisSelected}
/>
</div>
</div>
<div className="btn-toolbar mt-2" role="toolbar">
{disciplineExports}
</div>
</div>
</div>
);
}
}

ExportPanel.propTypes = {
api: PropTypes.object.isRequired,
db: PropTypes.object.isRequired,
};

export default ExportPanel;
Loading

0 comments on commit 1b195f4

Please sign in to comment.