Ignore:
Timestamp:
04/28/20 12:57:03 (5 years ago)
Author:
bart
Message:

Release 1.4.0

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/main/webapp/newtournament.xhtml

    r11 r12  
    44<title>Profiles and Domains list</title>
    55<link rel="stylesheet" type="text/css" href="style.css" />
    6 
    76</head>
    87<body onload="init()">
     
    2019        <br />
    2120        <br />
    22         <input type="number" id="partiespersession" name="tentacles" min="2"
    23                 max="10" value="2" /> Number of parties in each session
    24         <br />
    25 
    26         <input type="checkbox" id="reuseparties" /> Pick parties with return
    27         when creating sessions
     21        <input type="number" id="teamspersession" name="tentacles" min="2"
     22                max="10" value="2" /> Number of teams in each session
     23        <br />
     24
     25        <input type="checkbox" id="reuseteams" /> Pick teams with return when
     26        creating sessions
    2827        <br />
    2928
    3029        <br />
    3130        <div id="box" class="box">
    32                 Session Protocol settings <br /> Session Protocol:
    33                 <select id="protocolselection">
     31                Session Protocol settings <br /> Session Protocol: <select
     32                        id="protocolselection" onchange="selectProtocol()">
    3433                        <option value="SAOP">SAOP</option>
    3534                        <option value="SHAOP">SHAOP</option>
    36                 </select>
    37                
    38                 <br /> Deadline: <input type="number" id="deadlinevalue"
     35                </select> <br /> Deadline: <input type="number" id="deadlinevalue"
    3936                        name="deadline" min="1" max="10000" value="10" /> <select
    4037                        id="deadlinetype">
     
    4643
    4744        <div id="box" class="box">
    48                 <br /> Domain/Profile Server: <input type="url" name="url"
     45                <h3>Profiles</h3>
     46                Domain/Profile Server: <input type="url" name="url"
    4947                        id="profilesserverurl" value="localhost:8080/profilesserver-1.3.1"
    5048                        pattern=".*:[0-9]+/profilesserver" size="30"
     
    5351                        <!-- <option>Waiting for profiles server</option> -->
    5452                </select> <br /> <br />
    55                 <button onclick="addProfile()">Add</button>
    56                 Profile: <select id="profileselection">
    57                         <!-- <option>Waiting for partiesserver</option> -->
    58                 </select>
    59                  Filter: <input type="text" id="filter" value="" maxlength="40" />
    60                
     53                <!--  first selected profile -->
     54                Profile: <select id="profileselection1">
     55                </select> Filter: <input type="text" id="filter1" value="" maxlength="40" /> <br />
     56                <!--  second selected profile -->
     57                <div class="onlySHAOP">
     58                        COB: <select id="profileselection2">
     59                        </select> Filter: <input type="text" id="filter2" value="" maxlength="40" />
     60                        <br />
     61                </div>
     62                <button onclick="addProfiles()">Add</button>
    6163                <br /> <br />
    62 
    6364                <table id="profiles">
    6465                        <thead>
     
    7576        <br />
    7677        <div id="box" class="box">
     78                <h3>Teams</h3>
    7779                <br /> Parties Server: <input type="url" name="url"
    7880                        id="partiesserverurl" value="localhost:8080/partiesserver-1.3.1"
    7981                        pattern=".*:[0-9]+/partiesserver" size="30"
    8082                        onchange="connectParties()"> </input> <br /> <br />
     83                <!-- party  1 selection -->
    8184                Party: <select id="partyselection">
    82                         <!-- <option>Waiting for partiesserver</option> -->
    83                 </select> <br /> Parameters: { <input type="text" id="parameters"
    84                         onchange="updateParameters()" value="" maxlength="100" /> } <br />
    85                 <button onclick="addParty()">Add</button>
    86                        
     85                </select> Parameters: { <input type="text" id="parameters"
     86                        onchange="getParameters('parameters')" value="" maxlength="100" /> }
     87                <br />
     88                <!-- party 2 selection -->
     89                <div class="onlySHAOP">
     90                        COB: <select id="partyselection2">
     91                        </select> Parameters: { <input type="text" id="parameters2"
     92                                onchange="getParameters('parameters2')" value="" maxlength="100" />
     93                        }
     94                </div>
     95                <br />
     96
     97
     98                <button onclick="addTeam()">Add</button>
     99
    87100                <br /> <br />
    88101                <table>
     
    90103                                <th align="left">Party</th>
    91104                                <th align="left">Parameters</th>
     105                                <th align="left"><div class="onlySHAOP">Compare Bids Party</div></th>
     106                                <th align="left"><div class="onlySHAOP">Compare Bids Parameters</div></th>
    92107                        </thead>
    93                         <tbody id="partiesList">
    94                                 <tr id="partiesList">
     108                        <tbody id="teamList">
     109                                <tr id="FIXME REMOVE">
    95110                                </tr>
    96111
     
    106121        <div id="started" style="visibility: hidden">
    107122                Your tournament started. Click <a href="" id="logref">here</a> to view
    108                 the log file. <br />
    109                 <a href="" id="plotref">show results table.</a>.
     123                the log file. <br /> <a href="" id="plotref">show results table.</a>.
    110124        </div>
    111125
     
    113127
    114128<script type="application/javascript">
     129       
     130       
     131       
     132       
     133       
     134       
     135       
     136       
    115137       
    116138       
     
    144166        var knowndomains={};
    145167       
    146         var parties=[];
     168        var teamslist=[];
    147169        var profiles=[]
    148         // current setting of parameters
    149         var parameters = {};
    150 
    151        
     170
     171        /**
     172        called when user changes the protocol.
     173        With SHAOP we show COB selectors and COB columns in the tables.
     174    */
     175    function selectProtocol() {
     176        const isShaop= "SHAOP"==document.getElementById("protocolselection").value;
     177        setStyleSheet('.onlySHAOP','{ display: '+(isShaop? '?':'none')+'; }')
     178    }
     179   
     180    /**
     181    Change style sheet to new value. Nothing happens if there is
     182    no style sheet with given classname.
     183    @param classname the name of the style definition, eg '.onlySHAOP'
     184    @param style the new style for the class. eg  '{ max-width: 100px; }'
     185    */
     186    function setStyleSheet(classname, style) {
     187        for (var cssRulenr=0; cssRulenr< document.styleSheets.length; cssRulenr++) {
     188                var cssRule = document.styleSheets[cssRulenr];
     189                // there may be multple CSS definitions, check each.
     190                var rules = cssRule.cssRules;
     191                for (var rulenr=0;  rulenr<rules.length; rulenr++) {
     192                        var rule = rules[rulenr];
     193                        if ('selectorText' in rule && rule.selectorText==classname) {
     194                                cssRule.deleteRule(rulenr);
     195                                cssRule.insertRule(classname+ " "+style, rulenr);
     196                        }
     197                }
     198        }
     199    }
     200       
    152201        /**
    153202        Refresh known domains using given profilesserver URL.
     
    233282    }
    234283
    235        
     284        /**
     285        @param parties a new list of parties available on the parties server
     286        */
    236287        function updateParties(parties) {
    237                 var combobox = document.getElementById("partyselection");
     288                updatePartyCombo(document.getElementById("partyselection"), parties, 'shaop');
     289                updatePartyCombo(document.getElementById("partyselection2"), parties, 'comparebids');
     290        }
     291       
     292        /**
     293        put the available parties in the party comboboxes.
     294        @param combobox a document <select> element
     295        @param parties a dict of party information coming from the partiesserver
     296        @param select a string that may be a substring of the part names.
     297        @return the combobox value that contains 'select' as substring, or undefined
     298        */
     299        function updatePartyCombo(combobox, parties, select) {
     300                var selection=undefined;
    238301                combobox.options.length=0;
    239302        for (var party in parties) {
    240303            var option = document.createElement('option');
    241304            option.text = option.value = parties[party].uri;
     305            if (option.text.includes(select) ) option.selected=true;
    242306            combobox.add(option, 0);
    243307        }
     308        return selection;
    244309        }
    245310   
    246311
    247 
     312   
    248313    /**
    249     updates parameters field to match the given text.
     314    @param elementname eg "parameters", the ID of the element in the <input> element
     315    @return the JSON parsed object, or {} if empty or parsing fails.
    250316    */
    251         function updateParameters() {
    252                 var text="{"+document.getElementById("parameters").value+"}";
     317    function getParameters(elementname) {
     318                var text="{"+document.getElementById(elementname).value+"}";
    253319        try {
    254                         parameters=JSON.parse(text);
     320                        return JSON.parse(text);
    255321        } catch(e) {
    256                 alert("Parameters can not be parsed. "+e);
    257                 return;
     322                alert("Parameters can not be parsed. Make sure you write correct JSON here."+e);
    258323        }
    259         }
     324                return {};
     325    }
    260326
    261327        /**
     
    269335                if (domaincombobox.options.length==0) return; // fixme clean profiles options?
    270336                var domain = domaincombobox.options[domaincombobox.selectedIndex].value;
    271                
    272                 var profilecombo = document.getElementById("profileselection");
     337                updateProfiles(knowndomains[domain])
     338        }
     339       
     340        function updateProfiles(profileslist) {
     341                updateProfileCombo(document.getElementById("profileselection1"),profileslist);
     342                updateProfileCombo(document.getElementById("profileselection2"),profileslist);
     343        }
     344       
     345        /**
     346        @param combobox the <select> element that should be udpated
     347        @param profileslist the list of profile names to be put in the combbo
     348        */
     349        function updateProfileCombo(profilecombo, profileslist) {
    273350                profilecombo.options.length=0;
    274                 for (var profile in knowndomains[domain]) {
     351                for (var profile in profileslist) {
    275352            var option = document.createElement('option');
    276             option.text = option.value = knowndomains[domain][profile];
     353            option.text = option.value = profileslist[profile];
    277354            profilecombo.add(option, 0);
    278355                }
    279356        }
    280357       
     358       
    281359        /**
    282360        Called when user clicks "Add"
    283361        */
    284         function addParty() {
     362        function addTeam() {
    285363                var partycombo = document.getElementById("partyselection");
     364                var partycombo2 = document.getElementById("partyselection2");
     365                var param = getParameters("parameters");
     366                var param2 = getParameters("parameters2");
     367               
    286368               
    287369                if (partycombo.options.length==0) {
     
    289371                        return;
    290372                }
    291                 parties.push({"partyref":partycombo.options[partycombo.selectedIndex].value, "parameters":parameters})
    292                 updatePartyTable();
    293         }
    294        
    295         /** updates the party table, to match the #partyprofiles list.          */
    296         function updatePartyTable() {
    297                 var table = document.getElementById("partiesList");
     373                var team = [];
     374                team.push({"partyref":partycombo.options[partycombo.selectedIndex].value, "parameters":param});
     375                team.push({"partyref":partycombo2.options[partycombo2.selectedIndex].value, "parameters":param2});
     376
     377                teamslist.push(team);
     378                updateTeamsTable();
     379        }
     380       
     381        /** updates the teams table, to match the #partyprofiles list.          */
     382        function updateTeamsTable() {
     383                var table = document.getElementById("teamList");
    298384                table.innerHTML = ""; // clear table
    299                 for ( var party in parties) {
     385                for ( const team of teamslist) {
    300386                        var row = table.insertRow(-1);
    301                         var cell1 = row.insertCell(-1);
    302                         var cell2 = row.insertCell(-1);
    303                         cell1.innerHTML = parties[party]["partyref"];
    304                         cell2.innerHTML = JSON.stringify(parties[party]["parameters"]);
    305                 }
    306 
    307         }
    308 
    309         /**
    310         Called when user clicks "Add" to add a profile
    311         */
    312         function addProfile() {
    313                 var profilecombo = document.getElementById("profileselection");
    314 
     387                        for (const col in team) {
     388                                const party = team[col]
     389                                var cell1 = row.insertCell(-1);
     390                                var cell2 = row.insertCell(-1);
     391                                cell1.innerHTML = party["partyref"];
     392                                cell2.innerHTML = JSON.stringify(party["parameters"]);
     393                                if (col>0) {
     394                                        cell1.className = cell2.className = "onlySHAOP";
     395                                }
     396
     397                        }
     398                }
     399               
     400                selectProtocol(); // HACK we need to KEEP onlySHAOP elements hidden
     401        }
     402
     403        /**
     404        @param profilenr the profile nr, 1 for normal , 2 for cob profile
     405        */
     406        function getProfile(profilenr) {
     407                var profilecombo = document.getElementById("profileselection"+profilenr);
    315408                if (profilecombo.options.length==0) {
    316409                        alert("Please set domain/profile server and select a domain and a profile");
    317                         return;
    318                 }
    319                 var filteroptions = document.getElementById("filter").value;
     410                        throw "blabla";
     411                }
     412                var filteroptions = document.getElementById("filter"+profilenr).value;
    320413                if (filteroptions!="") {
    321414                        filteroptions="?"+filteroptions;
    322415                }
    323416
    324                 profiles.push(profilecombo.options[profilecombo.selectedIndex].value + filteroptions)
     417                //return profilecombo.options[profilecombo.selectedIndex].value + filteroptions
     418                return profilecombo.value + filteroptions
     419        }
     420       
     421        /**
     422        Called when user clicks "Add" to add a profile set
     423        */
     424        function addProfiles() {
     425                profiles.push([getProfile(1), getProfile(2)]);
    325426                updateProfileTable(); // what, MVC?
    326427        }
     
    330431                var table = document.getElementById("profilesList");
    331432                table.innerHTML = ""; // clear table
    332                 for ( var profile in profiles) {
     433                for ( const profileset of profiles) {
    333434                        var row = table.insertRow(-1);
    334                         var cell1 = row.insertCell(-1);
    335                         cell1.innerHTML = profiles[profile];
    336                 }
    337 
     435                        for (var col in profileset) {
     436                                var profile = profileset[col];
     437                                var cell1 = row.insertCell(-1);
     438                                cell1.innerHTML = profile;
     439                                if (col>0) cell1.className = "onlySHAOP"
     440                        }                       
     441                }
     442                selectProtocol(); // HACK we need to KEEP onlySHAOP elements hidden
    338443        }
    339444       
     
    366471        */
    367472        function start() {
    368                 var npersession = document.getElementById("partiespersession").value;
    369                
    370                 if (parties.length < npersession || npersession <2) {
    371                         alert("At least "+npersession+" parties are needed.");
     473                const npersession = document.getElementById("teamspersession").value;
     474               
     475                if (teamslist.length < npersession) {
     476                        alert("At least "+npersession+" teams are needed.");
    372477                        return;
    373478                }
    374479               
    375480                if (profiles.length < npersession) {
    376                         alert("At least "+npersession+" profiles are needed.");
     481                        alert("At least "+npersession+" profilesets are needed.");
    377482                        return;
    378483                }
     
    396501       
    397502        /**
    398         @return a json request package containing a AllPermutationsSettings
     503        @return a json request package containing a AllPermutationsSettings.
     504        It assumes that global vars parties and sessionSettings have been set properly.
    399505        */
    400506        function makeRequest() {
     507                const npersession = document.getElementById("teamspersession").value;
     508                const reuseTeams  = document.getElementById("reuseteams").checked;
     509                const protocolcombobox = document.getElementById("protocolselection");
     510                const protocol = protocolcombobox.options[protocolcombobox.selectedIndex].value;
     511                const header=protocol+"Settings";
     512
    401513                var deadline={};
    402                 var value = document.getElementById("deadlinevalue").value;
    403                 var dtypecombo  = document.getElementById("deadlinetype");
     514                const value = document.getElementById("deadlinevalue").value;
     515                const dtypecombo  = document.getElementById("deadlinetype");
    404516                if (dtypecombo.options[dtypecombo.selectedIndex].value=="TIME") {
    405517                        deadline["deadlinetime"] = { "durationms": 1000*value};
     
    408520                        deadline["deadlinerounds"] = {"rounds": value, "durationms": 10000};
    409521                }
    410                 var reuseParties  = document.getElementById("reuseparties").checked;
    411                
    412                 var protocolcombobox = document.getElementById("protocolselection");
    413                 var protocol = protocolcombobox.options[protocolcombobox.selectedIndex].value;
    414                 var header=protocol+"Settings";
    415        
     522               
    416523                // create S(H)AOPSettings. [header] is a weird ECMA script workaround for javascript issue.
    417                 var sessionSettings = { [header]:{"participants":[],"deadline":deadline}};
    418                 return JSON.stringify({"AllPermutationsSettings":{"parties":parties,"profiles":profiles,"reuseParties":reuseParties,"partiesPerSession":2,"sessionsettings":sessionSettings}});
     524                const sessionSettings = { [header]:{"participants":[],"deadline":deadline}};
     525               
     526                var teamsFull = [];
     527                for (const team of teamslist) {
     528                        if (protocol=="SAOP") // only first member of team is used.
     529                                teamsFull.push({"Team":[team[0]]});
     530                        else
     531                                teamsFull.push({"Team":team});
     532                }
     533                var profilesFull = [] ;
     534                for (const profileset of profiles) {
     535                        if (protocol=="SAOP") // only first member of team is used.
     536                                profilesFull.push({"ProfileList":[profileset[0]]});
     537                        else
     538                                profilesFull.push({"ProfileList":profileset});
     539                }
     540               
     541                return JSON.stringify({"AllPermutationsSettings":{"teams":teamsFull,"profileslists":profilesFull,
     542                        "reuseTeams":reuseTeams,"teamsPerSession":npersession,"sessionsettings":sessionSettings}});
    419543        }
    420544       
     
    423547        */
    424548        function init() {
    425                 document.getElementById("partiesserverurl").value =window.location.hostname+":8080/partiesserver-1.3.1";
    426                 document.getElementById("profilesserverurl").value =window.location.hostname+":8080/profilesserver-1.3.1";
    427 
    428 
     549                document.getElementById("partiesserverurl").value =window.location.hostname+":8080/partiesserver-1.4.0";
     550                document.getElementById("profilesserverurl").value =window.location.hostname+":8080/profilesserver-1.4.0";
     551
     552                selectProtocol();
    429553                connectDomain();
    430554                connectParties();
     
    438562
    439563
     564
     565
     566
     567
     568
     569
     570
     571
    440572</script>
    441573
Note: See TracChangeset for help on using the changeset viewer.