Merge pull request #2 from senaduka/Bilal

Bilal
This commit is contained in:
Senad Uka
2017-10-30 16:07:10 +01:00
committed by GitHub
5 changed files with 196 additions and 63 deletions

14
.vscode/launch.json vendored Normal file
View File

@@ -0,0 +1,14 @@
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"type": "node",
"request": "launch",
"name": "Launch Program",
"program": "${workspaceFolder}/backend/app.js"
}
]
}

View File

@@ -88,7 +88,7 @@ function storeToken(token) {
try { try {
fs.mkdirSync(TOKEN_DIR); fs.mkdirSync(TOKEN_DIR);
} catch (err) { } catch (err) {
if (err.code != 'EEXIST') { if (err.code !== 'EEXIST') {
throw err; throw err;
} }
} }
@@ -109,11 +109,15 @@ function getPairs(callback){
if(err) { if(err) {
// Handle error // Handle error
console.log(err); console.log(err);
return null; callback(null, true);
} else { } else {
const pairs = []; const pairs = [];
lastRow = result.valueRanges[0].values.length; try{
lastRow = result.valueRanges[0].values.length;
}catch(err){
lastRow = 0;
}
for (let i=0;i<lastRow;i++){ for (let i=0;i<lastRow;i++){
let name1 = result.valueRanges[0].values[i][0]; let name1 = result.valueRanges[0].values[i][0];
@@ -122,7 +126,7 @@ function getPairs(callback){
pairs.push({name1:name1,name2:name2}); pairs.push({name1:name1,name2:name2});
} }
} }
callback(pairs); callback(pairs,false);
} }
}); });
} }
@@ -139,74 +143,171 @@ function getAvailableNames(callback){
if(err) { if(err) {
// Handle error // Handle error
console.log(err); console.log(err);
return null; callback(null, true);
} else { } else {
const names = []; const names = [];
for (let i=0;i<result.valueRanges[0].values.length;i++){ for (let i=0;i<result.valueRanges[0].values.length;i++){
let name = result.valueRanges[0].values[i][0];
let available = result.valueRanges[1].values[i][0];
if (name && (available=='x')){ try{
names.push(name); let name = result.valueRanges[0].values[i][0];
} let available = result.valueRanges[1].values[i][0];
if (name && (available==='x')){
names.push(name);
}
}catch(err){
}
} }
callback(names); callback(names,false);
} }
}); });
} }
function MakePairs(callback){ var matrix = [];
executeAPI(getAvailableNames,function(names){ var tree = [];
executeAPI(getPairs, function(pairs){ let done = false;
let next_i=false;
const newPairs = []; function count_pairs(row, col, cntr){
const usedNames = []; if (done) return;
matrix[row][col] = 2;
//mark all fields in matrix related to row and col names
for(let i=0;i<row;i++) matrix[row][i] = (matrix[row][i]===0)? cntr: matrix[row][i];
for(let i=0;i<col;i++) matrix[col][i] = (matrix[col][i]===0)? cntr: matrix[col][i];
for(let i=row;i<matrix.length;i++) matrix[i][row] = (matrix[i][row]===0)? cntr: matrix[i][row];
for(let i=col;i<matrix.length;i++) matrix[i][col] = (matrix[i][col]===0)? cntr: matrix[i][col];
//find next pair
let found = false;
for (let i=0;i<matrix.length;i++){
for (let j=0;j<=i;j++){
if (matrix[i][j]===0){
count_pairs(i,j,cntr+1);
found=true;
}
}
}
if (!found){
let inner_tree = [];
for (let i=0;i<matrix.length;i++){
for (let j=0;j<=i;j++){
if (matrix[i][j]===2){
inner_tree.push({row: i, col:j});
}
}
}
if (inner_tree.length === max_pairs) {
done=true;
tree.push(inner_tree);
}
}
//remove marks from matrix
for(let i=0;i<row;i++) matrix[row][i] = (matrix[row][i]===cntr)? 0: matrix[row][i];
for(let i=0;i<col;i++) matrix[col][i] = (matrix[col][i]===cntr)? 0: matrix[col][i];
for(let i=row;i<matrix.length;i++) matrix[i][row] = (matrix[i][row]===cntr)? 0: matrix[i][row];
for(let i=col;i<matrix.length;i++) matrix[i][col] = (matrix[i][col]===cntr)? 0: matrix[i][col];
matrix[row][col] = 0;
}
function MakePairsV3(callback){
executeAPI(getAvailableNames,function(names,error){
if (error){
console.log("Error - could not load names");
callback.send({pairs: null, left: null, error: true, error_message: 'Could not load names list'});
return;
}
executeAPI(getPairs, function(pairs,error){
if (error){
console.log("Error - could not load pairs");
callback.send({pairs: null, left: null, error: true, error_message: 'Could not load pairs list'});
return;
}
max_pairs = Math.floor(names.length/2);
matrix=[];
for (let i=0;i<names.length;i++){ for (let i=0;i<names.length;i++){
next_i=false; let matrix_row = [];
for (let j=0;j<names.length;j++){ for (let j=0;j<=i;j++) (i===j)? matrix_row.push(1):matrix_row.push(0);
if (i!=j){ matrix.push(matrix_row);
}
let found=false;
pairs.filter((pair)=>{
if ((pair.name1==names[i] && pair.name2==names[j])||(pair.name1==names[j] && pair.name2==names[i])){
found=true;
return;
}
});
if (!found){ //Mark existing pairs, put 3 in matrix fields
usedNames.filter((name)=>{ pairs.filter((pair)=>{
if (names[i] === name || names[j] === name){
found=true;
return;
}
});
}
if (!found){ let name1_id = names.indexOf(pair.name1);
next_i=true; let name2_id = names.indexOf(pair.name2);
newPairs.push({name1:names[i], name2:names[j]});
usedNames.push(names[i]); if (name1_id !== -1 && name2_id !== -1){
usedNames.push(names[j]); if (name1_id > name2_id){
break; matrix[name1_id][name2_id] = 3;
} }else{
matrix[name2_id][name1_id] = 3;
} }
} }
if (next_i) continue; });
tree = [];
done=false;
for (let i=0;i<names.length;i++){
for (let j=0;j<=i;j++){
if (matrix[i][j] === 0){
count_pairs(i,j,5);
if (done) break;
}
}
if (done) break;
} }
pairsForSave=newPairs;
callback.send(newPairs); let max_count_index = 0;
for (let i=0;i<tree.length;i++){
if (tree[i].length > tree[max_count_index].length)
max_count_index = i;
}
let result_pairs = [];
if (tree.length > 0){
for (let i=0;i<tree[max_count_index].length;i++){
result_pairs.push({name1: names[tree[max_count_index][i].row],name2: names[tree[max_count_index][i].col] });
}
let indexToRemove = [];
for (let i=0;i<tree[max_count_index].length;i++){
indexToRemove.push(tree[max_count_index][i].row);
indexToRemove.push(tree[max_count_index][i].col);
}
indexToRemove.sort((a,b)=>{
if (a>b) return -1; else return 1;
});
for (let i=0;i<indexToRemove.length;i++)
names.splice(indexToRemove[i],1);
}
if (names.length === 0) names=null;
pairsForSave = result_pairs;
callback.send({pairs: result_pairs, left: names, error:false});
}); });
}); });
//Napravi par -> Provjeri da li postoji -> Snimi ili ponovi postupak
} }
function SavePairs(callback){ function SavePairs(callback){
if (lastRow== null) return; if (lastRow=== null) {
callback.send({result:true});
return;
}
auth=oauth2Client; auth=oauth2Client;
@@ -220,6 +321,7 @@ function SavePairs(callback){
const data = []; const data = [];
if (lastRow === 0) lastRow=-1;
let range1= '2017!A'+(lastRow+2)+':A'+(lastRow+2+pairsForSave.length); let range1= '2017!A'+(lastRow+2)+':A'+(lastRow+2+pairsForSave.length);
let range2= '2017!B'+(lastRow+2)+':B'+(lastRow+2+pairsForSave.length); let range2= '2017!B'+(lastRow+2)+':B'+(lastRow+2+pairsForSave.length);
@@ -269,15 +371,13 @@ app.use(function(req, res, next) {
app.get('/getPairs',(req,resp)=>{ app.get('/getPairs',(req,resp)=>{
pairsForSave=[]; pairsForSave=[];
lastRow=null; lastRow=null;
MakePairs(resp); MakePairsV3(resp);
}); });
app.get('/savePairs', (req,resp)=>{ app.get('/savePairs', (req,resp)=>{
SavePairs(resp); SavePairs(resp);
//resp.send({result:true});
}); });
app.listen(3005, function () { app.listen(3005, function () {
console.log('server na portu 3005'); console.log("Server running - Port 3005");
}) })

View File

@@ -18,10 +18,10 @@ class App extends Component {
getPairsEventHandler = (event) =>{ getPairsEventHandler = (event) =>{
let url = `http://${BASE_URL}:3005/getPairs`; let url = `http://${BASE_URL}:3005/getPairs`;
this.setState({waitingPairs:true}); this.setState({waitingPairs:true, renderFinish:false, waitingSave:true});
fetch(url, {}).then(function(response) { return response.json(); }).then(function(data) { fetch(url, {}).then(function(response) { return response.json(); }).then(function(data) {
this.setState({pairs : data, renderPairsList:true, waitingPairs:false}); this.setState({pairs : data.pairs, left:data.left, renderPairsList:!data.error, waitingPairs:false, waitingSave:false, error: data.error, error_message: data.error_message});
}.bind(this)); }.bind(this));
@@ -46,13 +46,32 @@ class App extends Component {
<div className = "horizontalDiv"> <div className = "horizontalDiv">
<button disabled={this.state.waitingPairs} onClick = {this.getPairsEventHandler}>Get pairs</button> <button disabled={this.state.waitingPairs} onClick = {this.getPairsEventHandler}>Get pairs</button>
</div> </div>
<div> {
<h2> List of pairs : </h2> this.state.error &&
</div> <div>
<h2> Error - {this.state.error_message} </h2>
</div>
}
{
this.state.renderPairsList &&
<div>
<h2> List of pairs : </h2>
</div>
}
{ {
this.state.renderPairsList && this.state.renderPairsList &&
<PairsListComponent pairs = {this.state.pairs}/> <PairsListComponent pairs = {this.state.pairs}/>
} }
{
this.state.renderPairsList && this.state.left &&
<div>
<h2> Without pair : </h2>
{
this.state.left.map((name, index) =>
(<div key={name}>{index+1}. {name}</div>))
}
</div>
}
{ {
this.state.renderPairsList && this.state.renderPairsList &&
<button disabled={this.state.waitingSave} onClick = {this.savePairsEventHandler}> Save pairs </button> <button disabled={this.state.waitingSave} onClick = {this.savePairsEventHandler}> Save pairs </button>

View File

@@ -3,14 +3,14 @@ import React, { Component } from 'react';
export default class PairComponent extends Component{ export default class PairComponent extends Component{
constructor(props) { constructor(props) {
super(props); super(props);
this.state = {pairName: this.props.pair}; this.state = {pairName: this.props.pair, index: this.props.index};
} }
render(){ render(){
return ( return (
<div> <div>
<div className = "horizontalDiv"> <div className = "horizontalDiv">
<div>{this.state.pairName.name1} - {this.state.pairName.name2}</div> <div>{this.state.index+1}. {this.state.pairName.name1} - {this.state.pairName.name2}</div>
</div> </div>
</div> </div>
) )

View File

@@ -7,7 +7,7 @@ export default class PairsListComponent extends Component{
<div id = "outerDiv"> <div id = "outerDiv">
{ {
this.props.pairs.map((pair, index) => this.props.pairs.map((pair, index) =>
(<PairComponent key = {index} index = {index} pair = {pair}/>)) (<PairComponent key = {pair.name1+pair.name2} index = {index} pair = {pair}/>))
} }
</div> </div>
) )