diff --git a/Backend/CSAMS/Controllers/TopController.cs b/Backend/CSAMS/Controllers/TopController.cs index c0a59786a84de2a8c78af96d6526312c550db9dd..f252bdbdc0b9c30265ff0f4e9d4184a0b9201060 100644 --- a/Backend/CSAMS/Controllers/TopController.cs +++ b/Backend/CSAMS/Controllers/TopController.cs @@ -31,111 +31,8 @@ namespace CSAMS.Controllers - /* - - [HttpGet("Top/{N}/{Type}/{IsProject}")] - public async Task<ActionResult<TopModel[]>> GetTopReviews(int N, string Type, Boolean IsProject) - { - - // var test = await _context.Assignments.ToArrayAsync(); - var fields = await _context.Fields.ToArrayAsync(); - // TopModel[][] child = new TopModel[test.ToList().Count][]; - - Console.WriteLine($"N is {N} and Type is {Type}"); - - var t = _context.UserReviews.Include(r => r.Review).Include(r => r.Assignment) - .AsEnumerable() - // .GroupBy(r => r.AssignmentID) - // .Select(r => TopProjects(r.ToArray(), fields, IsProject)) - .Where(p => p != null) - - .ToArray(); - if (IsProject == true) - { - if (Type == "Top") - { - return t - .GroupBy(r => r.AssignmentID) - .Select(r => TopProjects(r.ToArray(), fields, IsProject,0)) - .Where(r => r != null) - - .OrderByDescending(p => p.Grade) - .Take(N) - .ToArray(); - ; - } - else if (Type == "Bottom") - { - Console.WriteLine(t.Length); - var x = t - .GroupBy(r => r.AssignmentID) - .Select(r => TopProjects(r.ToArray(), fields, IsProject, 0)) - .Where(r => r != null) - .OrderBy(p => p.Grade) - .Take(N) - - .ToArray(); - return x; - } - else - { - return t - .GroupBy(r => r.AssignmentID) - .Select(r => TopProjects(r.ToArray(), fields, IsProject, 0)) - .Where(r => r != null) - .Take(2) - .ToArray(); - ; - } - } - else//////////////////////////// - { - var average = GetMiddle(_context.UserReviews.Include(r => r.Review).ToArray(), fields); - - if (Type == "Top") - { - return t - - .GroupBy(r => r.UserReviewer) - .Select(r => TopProjects(r.ToArray(), fields, IsProject, average)) - - .Where(r => r != null) - - .OrderBy(p=>p.Grade) - - .Take(N) - - .ToArray(); - ; - } - else if (Type == "Bottom") - { - return t - .GroupBy(r => r.UserReviewer) - .Select(r => TopProjects(r.ToArray(), fields, IsProject, average)) - .Where(r => r != null) - .OrderByDescending(p => p.Grade) - .Take(N) - .ToArray(); - - } - else - { - return t - .GroupBy(r => r.ReviewID) - .Select(r => TopProjects(r.ToArray(), fields, IsProject, average)) - .Where(r => r != null) - .Take(2) - .ToArray(); - ; - } - } - - - } - - */ - [HttpGet("Top/{N}/{Type}/{IsProject}")] + + // [HttpGet("Top/{N}/{Type}/{IsProject}")] public static TopModel TopProjects(UserReviews[] userReviews, Fields[] fields, Boolean IsProject,float average) { @@ -247,7 +144,13 @@ namespace CSAMS.Controllers .ToArray(); var toAverege = _context.UserReviews.Include(r => r.Review).ToArray(); - return OuterTopProjects(N, Type, IsProject, userdata, fields, toAverege); + + var ret = OuterTopProjects(N, Type, IsProject, userdata, fields, toAverege); + + if (ret.Length == 0) + return BadRequest("0 length"); + + return ret; } diff --git a/React/test-http/package.json b/React/test-http/package.json index cb2dfa65b8ef8be437eddf0b4abfc5d8e9fe903b..1566c63f9fe776de8bff21ebc82960ba78b79aa1 100644 --- a/React/test-http/package.json +++ b/React/test-http/package.json @@ -9,6 +9,7 @@ "axios": "^0.21.4", "components": "^0.1.0", "react": "^17.0.2", + "react-bootstrap": "^2.0.2", "react-boxplot": "^3.1.0", "react-dom": "^17.0.2", "react-dropdown": "^1.9.2", diff --git a/React/test-http/src/App.css b/React/test-http/src/App.css index 1f94ff5ea044b60283c908624aeff0e19c0a53f5..998170fe69794537e5317cc9028ee683efa4d629 100644 --- a/React/test-http/src/App.css +++ b/React/test-http/src/App.css @@ -93,6 +93,16 @@ color: white; background-color: rgb(110,94,254); } + +.blackButton{ + background-color: rgb(69, 39, 116); + color: black; +} + +.whiteButton{ + background-color: white; + color: black; +} /* .paginationDisabled a { color: grey; diff --git a/React/test-http/src/App.js b/React/test-http/src/App.js index 02fe5fa01dfbb62f50c5d9d0c67817e0d5dfedfd..24252d65fdf9dd524e43393c6ec997aad4d2c9a3 100644 --- a/React/test-http/src/App.js +++ b/React/test-http/src/App.js @@ -58,6 +58,11 @@ function App() { <Route path='/Statistics' > <Statistics /> </Route> + <Route path='/Top' > + <Top /> + </Route> + + </Router> ); diff --git a/React/test-http/src/components/Navbar/MenuItems.js b/React/test-http/src/components/Navbar/MenuItems.js index b898ce87800d3f68692a1d9019532fb37f0652b4..7e182cfc201db64a4410623918fb60c57e213b54 100644 --- a/React/test-http/src/components/Navbar/MenuItems.js +++ b/React/test-http/src/components/Navbar/MenuItems.js @@ -36,8 +36,8 @@ export const MenuItems = [ }, { - title: 'Sign up', - url: '#', - cName: 'nav-links-mobile' + title:'Top', + url: 'http://localhost:3000/Top/top', + cName:'nav-links' }, ] \ No newline at end of file diff --git a/React/test-http/src/components/ReviewerComments.js b/React/test-http/src/components/ReviewerComments.js index 5baee7b26fe7e5b98cbe62ca8a3efe9f2d5f216a..e432b9410c8b121d100ec95e4c095a3c51aca3b4 100644 --- a/React/test-http/src/components/ReviewerComments.js +++ b/React/test-http/src/components/ReviewerComments.js @@ -30,7 +30,7 @@ class ReviewerComments extends Component { render() { const { posts, errorMsg } = this.state - if (errorMsg == '') { + if (errorMsg ==='') { console.log(errorMsg) let n = 0 return ( diff --git a/React/test-http/src/components/Top.js b/React/test-http/src/components/Top.js new file mode 100644 index 0000000000000000000000000000000000000000..9650ce97fa7f1d8ca7f8e46381557ea01ef7ee3c --- /dev/null +++ b/React/test-http/src/components/Top.js @@ -0,0 +1,221 @@ +import React, { Component } from 'react' +import axios from 'axios' +import TopInsides from './TopInsides' + +class Top extends Component { + constructor(props) { + super(props) + + this.state = { + posts: [], + errorMsg: '', + N: '', + Type: 'Top', + IsProject: true, + site: 'https://localhost:44344/api/Top/top', + Submited: false, + TopsClicked: false, + ProjectsClicked: false, + Backup: false + + + } + } + + changeHandler = (e) => { + this.setState({ [e.target.name]: e.target.value }) + + } + + Capitalize(str) { + if (str.width > 1) + return str.charAt(0).toUpperCase() + str.toLowerCase().toslice(1); + return str + } + + doSomething() { + + // console.log(this.state) + + if (this.state.Submited === true) { + axios + .get(this.state.site + '/' + this.state.N + '/' + this.state.Type + '/' + this.state.IsProject) + .then(response => { + console.log(response) + this.setState({ posts: response.data }) + + // this.setState({site:'https://localhost:44344/api/Top/top'}) + if(this.state.posts.length>1) { + this.setState({ errorMsg: '' }) + this.setState({ errorMsg2: '' }) + } + + // TopInsides(this.state.posts,this.state.Backup) + + }) + .catch(error => { + console.log(error) + this.setState({posts: []}) + this.setState({ errorMsg: 'Error retrieving data' }) + }) + + } + } + + submitHandler = (e) => { + e.preventDefault() + console.log('test') + this.setState({ [e.target.name]: e.target.value }) + this.setState({ IsProject: this.state.IsProject }) + + if (this.state.N < 1 || this.state.N > 300) { + this.setState({ errorMsg2: ' Error in imput field 1. Provide possitive number (within reason)' }) + } + this.setState({ Backup: this.state.IsProject }) + this.setState({ Submited: true }, () => { this.doSomething() }) + // this.setState({site:this.state.site+'/'+this.state.N+'/'+this.state.Type+'/'+this.state.IsProject},()=>{ this.doSomething()}) + + + // this.doSomething() + + + } + //clickHandler() { } + + onChangeValue(event) { + this.setState({ Type: EventTarget.value }) + //console.log(this.state) + } + changeColorIs() { + this.setState({ ProjectsClicked: !this.state.ProjectsClicked }) + } + + changeColorType() { + this.setState({ TopsClicked: !this.state.TopsClicked }) + // console.log(this.state+"COLOR CHANGE!!") + } + + render() { + let btn_classtype = this.state.TopsClicked ? "blackButton" : "whiteButton"; + let btn_classIs = this.state.ProjectsClicked ? "blackButton" : "whiteButton"; + let btn_classIs2 = this.state.ProjectsClicked ? "whiteButton" : "blackButton"; + let btn_classtype2 = this.state.TopsClicked ? "whiteButton" : "blackButton"; + const { posts, errorMsg, errorMsg2, N, } = this.state + + let message + if (this.state.Submited === false) { + message = <div>Please enter N,Top or Bottom and Projects or Reviewers</div> + } else { + console.log(this.state) + message = + <div style={{ textAlign: 'center' }}> + + {/* <tr style={{ display: 'flex', justifyContent: 'center' }}> + <td style={{ border: "1px solid rgb(0, 0, 0)", width: 300 }}>Grade</td> + <td style={{ border: "1px solid rgb(0, 0, 0)", width: 300 }}>Assignment name</td> + <td style={{ border: "1px solid rgb(0, 0, 0)", width: 200 }}>Assignment ID</td> + <td style={{ border: "1px solid rgb(0, 0, 0)", width: 200 }}>Reviewer ID</td> + </tr> */} + + {TopInsides(posts, this.state.Backup)} + {/* {posts.map(row => ( + <tr key={row.id} style={{ display: 'flex', justifyContent: 'center' }}> + <td style={{ border: "1px solid rgb(0, 0, 0)", backgroundColor: (n % 2) === 1 ? '#aae' : '#dde', width: 300 }}>{row.grade}</td> + <td style={{ border: "1px solid rgb(0, 0, 0)", backgroundColor: (n % 2) === 1 ? '#aae' : '#dde', width: 300 }}>{row.assingmentName}</td> + <td style={{ border: "1px solid rgb(0, 0, 0)", backgroundColor: (n % 2) === 1 ? '#aae' : '#dde', width: 200 }}>{row.assingmentID}</td> + <td style={{ border: "1px solid rgb(0, 0, 0)", backgroundColor: (n++ % 2) === 1 ? '#aae' : '#dde', width: 200 }}>{row.reviewerID}</td> + </tr> + ))} */} + </div> + } + + + return ( + + <div style={{ border: 'outset', textAlign: 'center' }}> + + <div > + Top or Bottom: + <button + className={btn_classtype2} + + title={"Top"} + + onClick={() => { + this.setState({ Type: 'Top' }); + // this.setState({TopClicked:false }); + if (this.state.TopsClicked === true) { this.setState({ TopsClicked: !this.state.TopsClicked }) } + console.log(this.state.Type + "Top") + }} + color="#841584" + >Top</button> + + <button + className={btn_classtype} + + title={"Bottom"} + + onClick={() => { + this.setState({ Type: 'Bottom' }); + // this.setState({TopClicked:false }); + if (this.state.TopsClicked === false) { this.setState({ TopsClicked: !this.state.TopsClicked }) } + console.log(this.state.Type + "BOTTOM") + }} + color="#841584" + >Bottom</button> + + </div> + + <div > + Projects or Reviewers: + + <button + className={btn_classIs2} + title={"Projects"} + + onClick={() => { + this.setState({ IsProject: 'true' }); + // this.setState({ProjectsClicked:true }); + if (this.state.ProjectsClicked === true) { this.setState({ ProjectsClicked: !this.state.ProjectsClicked }) } + + }} + color="#841584" + >Projects</button> + <button + className={btn_classIs} + title={"Reviewers"} + + onClick={() => { + this.setState({ IsProject: 'false' }); + // this.setState({ProjectsClicked:false }); + if (this.state.ProjectsClicked === false) { this.setState({ ProjectsClicked: !this.state.ProjectsClicked }) } + console.log(this.state) + }} + color="#841584" + >Reviewers</button> + + </div> + + <form onSubmit={this.submitHandler}> + <div> + <input type='text' name='N' value={N} onChange={this.changeHandler} placeholder='N' /> + </div> + {/* <div> + <input type='text' name='Type' value={Type} onChange={this.changeHandler} placeholder='Enter:Top or Bottom'/> + </div> + <div> + <input type='text' name='IsProject' value={IsProject} onChange={this.changeHandler} placeholder='Groupby: Projects or Reviewers'/> + </div> */} + <button type='submit'>Submit </button> + </form> + <div>{message}</div> + + {errorMsg ? <div style={{ border: 'solid', borderColor: 'red' }} >{errorMsg}</div> : null} + {errorMsg2 ? <div style={{ border: 'solid', borderColor: 'red' }} >{errorMsg2}</div> : null} + + </div> + ) + } + +} +export default Top diff --git a/React/test-http/src/components/TopInsides.js b/React/test-http/src/components/TopInsides.js new file mode 100644 index 0000000000000000000000000000000000000000..131757e99eed04bc1005e4c9e5f82d23a27d2e4e --- /dev/null +++ b/React/test-http/src/components/TopInsides.js @@ -0,0 +1,59 @@ +import React from 'react' + +export default function TopInsides(posts, IsProject) { + let n = 0 + let message + let toppings + + + if(IsProject==='true'||IsProject===true){ + console.log(IsProject+" IS TRUE") + message= posts.map(row => ( + + <tr key={row.id} style={{ display: 'flex', justifyContent: 'center' }}> + <td style={{ border: "1px solid rgb(0, 0, 0)", backgroundColor: (n % 2) === 1 ? '#aae' : '#dde', width: 300 }}>{row.grade}</td> + <td style={{ border: "1px solid rgb(0, 0, 0)", backgroundColor: (n % 2) === 1 ? '#aae' : '#dde', width: 300 }}>{row.assingmentName}</td> + <td style={{ border: "1px solid rgb(0, 0, 0)", backgroundColor: (n++ % 2) === 1 ? '#aae' : '#dde', width: 200 }}>{row.assingmentID}</td> + + </tr> + + )) + + toppings= <tr style={{ display: 'flex', justifyContent: 'center' }}> + <td style={{ border: "1px solid rgb(0, 0, 0)", width: 300 }}>Grade</td> + <td style={{ border: "1px solid rgb(0, 0, 0)", width: 300 }}>Assignment name</td> + <td style={{ border: "1px solid rgb(0, 0, 0)", width: 200 }}>Assignment ID</td> + + </tr> + + }else if(IsProject==='false'||IsProject===false){ + console.log(IsProject+" IS FALSE") + message= posts.map(row => ( + + <tr key={row.id} style={{ display: 'flex', justifyContent: 'center' }}> + <td style={{ border: "1px solid rgb(0, 0, 0)", backgroundColor: (n % 2) === 1 ? '#aae' : '#dde', width: 300 }}>{row.grade}</td> + + <td style={{ border: "1px solid rgb(0, 0, 0)", backgroundColor: (n++ % 2) === 1 ? '#aae' : '#dde', width: 200 }}>{row.reviewerID}</td> + </tr> + + )) + toppings= <tr style={{ display: 'flex', justifyContent: 'center' }}> + <td style={{ border: "1px solid rgb(0, 0, 0)", width: 300 }}>Grade</td> + + <td style={{ border: "1px solid rgb(0, 0, 0)", width: 200 }}>Reviewer ID</td> + </tr> + + } + + console.log(IsProject+" IS IT THO PROJECT?") + return ( + <div> + {toppings} + { message} + </div> + ) + + + } + +