izmjena algoritma
This commit is contained in:
@@ -1,2 +1,3 @@
|
|||||||
PEOPLE_DB=https://docs.google.com/spreadsheets/d/1s4Ytz7mf-YpszVTMTTrYd5iG_dsTGjrCpDQbpIx7zkU/edit#gid=0
|
PEOPLE_DB=https://docs.google.com/spreadsheets/d/1s4Ytz7mf-YpszVTMTTrYd5iG_dsTGjrCpDQbpIx7zkU/edit#gid=1116948122
|
||||||
PAIRS_LIST=https://docs.google.com/spreadsheets/d/1gPuRhTry3YoJ_ibI2BfL1ue2_YLlhtW56OP39ADJY_4/edit#gid=0
|
PAIRS_LIST=https://docs.google.com/spreadsheets/d/1JXtDjajJLZb_iXvDYfBEVYdCfehF_URHeeO7_hBXLrI/edit#gid=0
|
||||||
|
|
||||||
|
|||||||
205
backend/app.js
205
backend/app.js
@@ -113,7 +113,11 @@ function getPairs(callback){
|
|||||||
} 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];
|
||||||
@@ -144,69 +148,185 @@ function getAvailableNames(callback){
|
|||||||
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);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function getRandomInt(min, max) {
|
||||||
|
return Math.floor(Math.random() * (max - min + 1)) + min;
|
||||||
|
}
|
||||||
|
|
||||||
function MakePairs(callback){
|
function MakePairs(callback){
|
||||||
executeAPI(getAvailableNames,function(names){
|
executeAPI(getAvailableNames,function(names){
|
||||||
executeAPI(getPairs, function(pairs){
|
executeAPI(getPairs, function(pairs){
|
||||||
let next_i=false;
|
const numOfPairs = Math.floor(names.length / 2);
|
||||||
|
const left_side = [];
|
||||||
|
const right_side = [];
|
||||||
|
|
||||||
const newPairs = [];
|
const newPairs = [];
|
||||||
const usedNames = [];
|
|
||||||
for (let i=0;i<names.length;i++){
|
|
||||||
next_i=false;
|
|
||||||
for (let j=0;j<names.length;j++){
|
|
||||||
if (i!=j){
|
|
||||||
|
|
||||||
let found=false;
|
for (let i=0;i<numOfPairs;i++){
|
||||||
|
|
||||||
pairs.filter((pair)=>{
|
let id1 = getRandomInt(0,names.length-1);
|
||||||
if ((pair.name1==names[i] && pair.name2==names[j])||(pair.name1==names[j] && pair.name2==names[i])){
|
left_side.push(names[id1]);
|
||||||
found=true;
|
names.splice(id1,1);
|
||||||
return;
|
let id2 = getRandomInt(0,names.length-1);
|
||||||
}
|
right_side.push(names[id2]);
|
||||||
});
|
names.splice(id2,1);
|
||||||
|
}
|
||||||
|
|
||||||
if (!found){
|
//make pairs using both sides
|
||||||
usedNames.filter((name)=>{
|
|
||||||
if (names[i] === name || names[j] === name){
|
for (let i=0;i<left_side.length;i++){
|
||||||
found=true;
|
if (i==left_side.length) break;
|
||||||
return;
|
for (let j=0;j<right_side.length;j++){
|
||||||
}
|
let tmpName1 = left_side[i];
|
||||||
});
|
let tmpName2 = right_side[j];
|
||||||
}
|
let exist=false;
|
||||||
|
pairs.filter((pair)=>{
|
||||||
|
if (((pair.name1 == tmpName1)&&(pair.name2==tmpName2))||((pair.name1==tmpName2)&&(pair.name2==tmpName1))){
|
||||||
if (!found){
|
exist = true;
|
||||||
next_i=true;
|
return;
|
||||||
newPairs.push({name1:names[i], name2:names[j]});
|
|
||||||
usedNames.push(names[i]);
|
|
||||||
usedNames.push(names[j]);
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
});
|
||||||
|
if (!exist){
|
||||||
|
newPairs.push({name1:tmpName1, name2:tmpName2});
|
||||||
|
left_side.splice(i,1);
|
||||||
|
right_side.splice(j,1);
|
||||||
|
i=-1;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (next_i) continue;
|
|
||||||
}
|
}
|
||||||
pairsForSave=newPairs;
|
|
||||||
callback.send(newPairs);
|
//make pairs from names on left side
|
||||||
|
for (let i=0;i<left_side.length;i++){
|
||||||
|
for (let j=0;j<left_side.length;j++){
|
||||||
|
if (i==j) continue;
|
||||||
|
let tmpName1 = left_side[i];
|
||||||
|
let tmpName2 = left_side[j];
|
||||||
|
let exist=false;
|
||||||
|
pairs.filter((pair)=>{
|
||||||
|
if (((pair.name1 == tmpName1)&&(pair.name2==tmpName2))||((pair.name1==tmpName2)&&(pair.name2==tmpName1))){
|
||||||
|
exist = true;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
if (!exist){
|
||||||
|
newPairs.push({name1:tmpName1, name2:tmpName2});
|
||||||
|
left_side.splice(i,1);
|
||||||
|
if (i>j)
|
||||||
|
left_side.splice(j,1);
|
||||||
|
else
|
||||||
|
left_side.splice(j-1,1);
|
||||||
|
i=-1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//make pairs from names on right side
|
||||||
|
for (let i=0;i<right_side.length;i++){
|
||||||
|
for (let j=0;j<right_side.length;j++){
|
||||||
|
if (i==j) continue;
|
||||||
|
let tmpName1 = right_side[i];
|
||||||
|
let tmpName2 = right_side[j];
|
||||||
|
let exist=false;
|
||||||
|
pairs.filter((pair)=>{
|
||||||
|
if (((pair.name1 == tmpName1)&&(pair.name2==tmpName2))||((pair.name1==tmpName2)&&(pair.name2==tmpName1))){
|
||||||
|
exist = true;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
if (!exist){
|
||||||
|
newPairs.push({name1:tmpName1, name2:tmpName2});
|
||||||
|
right_side.splice(i,1);
|
||||||
|
if (i>j)
|
||||||
|
right_side.splice(j,1);
|
||||||
|
else
|
||||||
|
right_side.splice(j-1,1);
|
||||||
|
i=-1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//try to make pair using unused name from list of names and names on left side
|
||||||
|
if (names.length>0){
|
||||||
|
let tmpName1 = names[0];
|
||||||
|
for (let i=0;i<left_side.length;i++){
|
||||||
|
let tmpName2 = left_side[i];
|
||||||
|
let exist=false;
|
||||||
|
pairs.filter((pair)=>{
|
||||||
|
if (((pair.name1 == tmpName1)&&(pair.name2==tmpName2))||((pair.name1==tmpName2)&&(pair.name2==tmpName1))){
|
||||||
|
exist = true;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
if (!exist){
|
||||||
|
newPairs.push({name1:tmpName1, name2:tmpName2});
|
||||||
|
names=[];
|
||||||
|
left_side.splice(i,1);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//try to make pair using unused name from list of names and names on right side
|
||||||
|
if (names.length>0){
|
||||||
|
let tmpName1 = names[0];
|
||||||
|
for (let i=0;i<right_side.length;i++){
|
||||||
|
let tmpName2 = right_side[i];
|
||||||
|
let exist=false;
|
||||||
|
pairs.filter((pair)=>{
|
||||||
|
if (((pair.name1 == tmpName1)&&(pair.name2==tmpName2))||((pair.name1==tmpName2)&&(pair.name2==tmpName1))){
|
||||||
|
exist = true;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
if (!exist){
|
||||||
|
newPairs.push({name1:tmpName1, name2:tmpName2});
|
||||||
|
names=[];
|
||||||
|
right_side.splice(i,1);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pairsForSave = newPairs;
|
||||||
|
|
||||||
|
let withoutPair = [];
|
||||||
|
for (let i=0;i<left_side.length;i++)
|
||||||
|
withoutPair.push(left_side[i]);
|
||||||
|
for (let i=0;i<right_side.length;i++)
|
||||||
|
withoutPair.push(right_side[i]);
|
||||||
|
if (names.length>0)
|
||||||
|
withoutPair.push(names[0]);
|
||||||
|
|
||||||
|
if (withoutPair.length==0) withoutPair=null;
|
||||||
|
|
||||||
|
callback.send({pairs: newPairs, left: withoutPair });
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
//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 +340,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);
|
||||||
|
|
||||||
@@ -279,5 +400,5 @@ app.get('/savePairs', (req,resp)=>{
|
|||||||
|
|
||||||
|
|
||||||
app.listen(3005, function () {
|
app.listen(3005, function () {
|
||||||
console.log('server na portu 3005');
|
console.log('Server running - port 3005');
|
||||||
})
|
})
|
||||||
@@ -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:true, waitingPairs:false, waitingSave:false});
|
||||||
}.bind(this));
|
}.bind(this));
|
||||||
|
|
||||||
|
|
||||||
@@ -46,13 +46,26 @@ 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.renderPairsList &&
|
||||||
</div>
|
<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>
|
||||||
|
|||||||
@@ -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>
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -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>
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user