From 97442e4202495f283ec6cfdb07431fde76f6877a Mon Sep 17 00:00:00 2001 From: Olivier Francou Date: Wed, 15 Dec 2021 12:47:20 +0100 Subject: [PATCH 1/3] =?UTF-8?q?ajout=20d'un=20bloquage=20cot=C3=A9=20back?= =?UTF-8?q?=20et=20front?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- issue-tracker-ui/app/IssueAddNavItem.js | 63 ++++++++++++------- .../issuetracker/web/api/IssueController.java | 18 ++++-- 2 files changed, 55 insertions(+), 26 deletions(-) diff --git a/issue-tracker-ui/app/IssueAddNavItem.js b/issue-tracker-ui/app/IssueAddNavItem.js index 3b3266f..4157cb4 100644 --- a/issue-tracker-ui/app/IssueAddNavItem.js +++ b/issue-tracker-ui/app/IssueAddNavItem.js @@ -10,10 +10,13 @@ class IssueAddNavItem extends React.Component { this.state = { showing: false, toastVisible: false, toastMessage: '', toastType: 'success', + error: false }; this.showModal = this.showModal.bind(this); this.hideModal = this.hideModal.bind(this); this.submit = this.submit.bind(this); + this.displayError = this.displayError.bind(this); + this.hideError = this.hideError.bind(this); this.showError = this.showError.bind(this); this.dismissToast = this.dismissToast.bind(this); } @@ -37,32 +40,52 @@ class IssueAddNavItem extends React.Component { this.setState({ toastVisible: false }); } + displayError() { + this.setState({ error: true }); + } + + hideError() { + this.setState({ error: false }); + } + submit(e) { e.preventDefault(); - this.hideModal(); const form = document.forms.issueAdd; const newIssue = { owner: form.owner.value, title: form.title.value, status: 'NEW', created: new Date(), }; - fetch('/api/issues', { - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify(newIssue), - }).then(response => { - if (response.ok) { - window.location.reload(false); - } else { - response.json().then(error => { - this.showError(`Failed to add issue: ${error.message}`); - }); - } - }).catch(err => { - this.showError(`Error in sending data to server: ${err.message}`); - }); + if (form.title.value !== "") { + this.hideModal(); + fetch('/api/issues', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify(newIssue), + }).then(response => { + if (response.ok) { + window.location.reload(false); + } else { + response.json().then(error => { + this.showError(`Failed to add issue: ${error.message}`); + }); + } + }).catch(err => { + this.showError(`Error in sending data to server: ${err.message}`); + }); + } + else { + this.displayError(); + } } - + render() { + let button; + if (this.state.error) { + button = The field title is missing; + } + else { + button = null; + } return ( Create Issue @@ -73,7 +96,8 @@ class IssueAddNavItem extends React.Component {
Title - + + {button} Owner @@ -88,9 +112,6 @@ class IssueAddNavItem extends React.Component { - ); } diff --git a/issue-tracker-ws/src/main/java/org/example/issuetracker/web/api/IssueController.java b/issue-tracker-ws/src/main/java/org/example/issuetracker/web/api/IssueController.java index d0c3734..92b25e0 100644 --- a/issue-tracker-ws/src/main/java/org/example/issuetracker/web/api/IssueController.java +++ b/issue-tracker-ws/src/main/java/org/example/issuetracker/web/api/IssueController.java @@ -12,6 +12,7 @@ import org.springframework.web.bind.annotation.*; import java.util.List; +import java.util.Objects; import java.util.function.Predicate; import static java.util.stream.Collectors.toList; @@ -113,13 +114,20 @@ public ResponseEntity createIssue(@RequestBody Issue issue) { logger.info("> createIssue"); Issue createdIssue = null; - try { - createdIssue = issueService.create(issue); - } catch (Exception e) { - logger.error("Unexpected Exception caught.", e); - return new ResponseEntity<>(INTERNAL_SERVER_ERROR); + if(!Objects.equals(issue.getTitle(), " ")){ + try { + createdIssue = issueService.create(issue); + } catch (Exception e) { + logger.error("Unexpected Exception caught.", e); + return new ResponseEntity<>(INTERNAL_SERVER_ERROR); + } + } + else{ + return new ResponseEntity<>(HttpStatus.BAD_REQUEST); } + + logger.info("< createIssue"); return new ResponseEntity<>(createdIssue, HttpStatus.CREATED); } From 774afdf0701c8eca9739f25268e189fb76185933 Mon Sep 17 00:00:00 2001 From: Olivier Francou Date: Thu, 23 Dec 2021 14:10:35 +0100 Subject: [PATCH 2/3] =?UTF-8?q?Bugfix=20qui=20emp=C3=AAche=20l'insertion?= =?UTF-8?q?=20d'espace=20dans=20le=20titre?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/example/issuetracker/web/api/IssueController.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/issue-tracker-ws/src/main/java/org/example/issuetracker/web/api/IssueController.java b/issue-tracker-ws/src/main/java/org/example/issuetracker/web/api/IssueController.java index 75110b9..fcd3811 100644 --- a/issue-tracker-ws/src/main/java/org/example/issuetracker/web/api/IssueController.java +++ b/issue-tracker-ws/src/main/java/org/example/issuetracker/web/api/IssueController.java @@ -108,8 +108,8 @@ public ResponseEntity getIssue(@PathVariable("id") UUID id) { public ResponseEntity createIssue(@RequestBody Issue issue) { logger.info("> createIssue"); - Issue createdIssue = null; - if(!Objects.equals(issue.getTitle(), " ")){ + Issue createdIssue; + if(issue.getTitle().replace(" ", "").length() != 0){ try { createdIssue = issueService.create(issue); } catch (Exception e) { @@ -121,8 +121,6 @@ public ResponseEntity createIssue(@RequestBody Issue issue) { return new ResponseEntity<>(HttpStatus.BAD_REQUEST); } - - logger.info("< createIssue"); return new ResponseEntity<>(createdIssue, HttpStatus.CREATED); } From 8dc74b91aa13aee2111d124c7fe72b8037a5cb26 Mon Sep 17 00:00:00 2001 From: Olivier Francou Date: Fri, 24 Dec 2021 09:52:40 +0100 Subject: [PATCH 3/3] =?UTF-8?q?nettoyage=20et=20am=C3=A9lioration=20du=20f?= =?UTF-8?q?ront?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- issue-tracker-ui/app/IssueAdd.js | 45 ------------------- issue-tracker-ui/app/IssueAddNavItem.js | 26 +++++------ issue-tracker-ui/app/IssueDelItem.js | 2 +- .../issuetracker/web/api/IssueController.java | 7 +-- 4 files changed, 15 insertions(+), 65 deletions(-) delete mode 100644 issue-tracker-ui/app/IssueAdd.js diff --git a/issue-tracker-ui/app/IssueAdd.js b/issue-tracker-ui/app/IssueAdd.js deleted file mode 100644 index 55322cd..0000000 --- a/issue-tracker-ui/app/IssueAdd.js +++ /dev/null @@ -1,45 +0,0 @@ -import React, { Component } from 'react'; -import PropTypes from 'prop-types'; -import { Form, FormControl, Button } from 'react-bootstrap'; - -export default class IssueAdd extends Component { - constructor() { - super(); - this.handleSubmit = this.handleSubmit.bind(this); - } - - handleSubmit(e) { - console.log('==> soumission du formulaire') - e.preventDefault(); - var form = document.forms.issueAdd; - this.props.createIssue( - { - owner: form.owner.value, - title: form.title.value, - status: 'NEW', - created: new Date() - } - ); - // clear the form for the next input - form.owner.value = ""; - form.title.value = ""; - } - - render() { - return ( -
- - - {' '} - - {' '} - - -
- ) - } -} - -IssueAdd.propTypes = { - createIssue: PropTypes.func.isRequired, -}; diff --git a/issue-tracker-ui/app/IssueAddNavItem.js b/issue-tracker-ui/app/IssueAddNavItem.js index 4157cb4..a667554 100644 --- a/issue-tracker-ui/app/IssueAddNavItem.js +++ b/issue-tracker-ui/app/IssueAddNavItem.js @@ -1,7 +1,7 @@ import React from 'react'; import { withRouter } from 'react-router'; import PropTypes from 'prop-types'; -import { NavItem, Glyphicon, Modal, Form, FormGroup, FormControl, FormSelect, ControlLabel, Button, ButtonToolbar } from 'react-bootstrap'; +import { NavItem, Glyphicon, Modal, Form, FormGroup, FormControl, ControlLabel, Button, ButtonToolbar } from 'react-bootstrap'; import Toast from './Toast.js'; class IssueAddNavItem extends React.Component { @@ -15,14 +15,12 @@ class IssueAddNavItem extends React.Component { this.showModal = this.showModal.bind(this); this.hideModal = this.hideModal.bind(this); this.submit = this.submit.bind(this); - this.displayError = this.displayError.bind(this); - this.hideError = this.hideError.bind(this); this.showError = this.showError.bind(this); this.dismissToast = this.dismissToast.bind(this); } showModal() { - this.setState({ showing: true }); + this.setState({ showing: true, error : false }); } hideModal() { @@ -40,13 +38,6 @@ class IssueAddNavItem extends React.Component { this.setState({ toastVisible: false }); } - displayError() { - this.setState({ error: true }); - } - - hideError() { - this.setState({ error: false }); - } submit(e) { e.preventDefault(); @@ -65,16 +56,16 @@ class IssueAddNavItem extends React.Component { if (response.ok) { window.location.reload(false); } else { - response.json().then(error => { - this.showError(`Failed to add issue: ${error.message}`); - }); + response.json().then( + this.showError(`Failed to add issue. The field Title is empty`) + ); } }).catch(err => { this.showError(`Error in sending data to server: ${err.message}`); }); } else { - this.displayError(); + this.setState({ error: true }); } } @@ -95,7 +86,7 @@ class IssueAddNavItem extends React.Component {
- Title + Title* {button} @@ -112,6 +103,9 @@ class IssueAddNavItem extends React.Component { + ); } diff --git a/issue-tracker-ui/app/IssueDelItem.js b/issue-tracker-ui/app/IssueDelItem.js index 719a24d..2004380 100644 --- a/issue-tracker-ui/app/IssueDelItem.js +++ b/issue-tracker-ui/app/IssueDelItem.js @@ -1,6 +1,6 @@ import React, { Component } from 'react'; import { withRouter } from 'react-router'; -import PropTypes, { node } from 'prop-types'; +import PropTypes from 'prop-types'; import { NavItem, Glyphicon, Modal, Button, ButtonToolbar } from 'react-bootstrap'; import Toast from './Toast.js'; diff --git a/issue-tracker-ws/src/main/java/org/example/issuetracker/web/api/IssueController.java b/issue-tracker-ws/src/main/java/org/example/issuetracker/web/api/IssueController.java index 5e51216..5b336b9 100644 --- a/issue-tracker-ws/src/main/java/org/example/issuetracker/web/api/IssueController.java +++ b/issue-tracker-ws/src/main/java/org/example/issuetracker/web/api/IssueController.java @@ -120,16 +120,17 @@ public ResponseEntity createIssue(@RequestBody Issue issue) { try { createdIssue = issueService.create(issue); } catch (Exception e) { - logger.error("Unexpected Exception caught.", e); + logger.error(ERROR, e); return new ResponseEntity<>(INTERNAL_SERVER_ERROR); } } else{ - return new ResponseEntity<>(HttpStatus.BAD_REQUEST); + logger.info("The field title can not be empty " + issue); + return new ResponseEntity<>(issue, BAD_REQUEST); } logger.info("< createIssue"); - return new ResponseEntity<>(createdIssue, HttpStatus.CREATED); + return new ResponseEntity<>(createdIssue, CREATED); } @PutMapping(value = "/issues/{id}", consumes = APPLICATION_JSON_VALUE, produces = APPLICATION_JSON_VALUE)