diff --git a/api/src/Database/Type/MySQL.php b/api/src/Database/Type/MySQL.php index eb475396f..19ca994f6 100644 --- a/api/src/Database/Type/MySQL.php +++ b/api/src/Database/Type/MySQL.php @@ -202,6 +202,7 @@ class MySQL extends DatabaseParent { // Xray Centring 'XrayCentring', 'XrayCentringResult', + 'XrayCentring', 'BeamCalendar', 'SpaceGroup', diff --git a/api/src/Model/Services/UserData.php b/api/src/Model/Services/UserData.php index bb762b322..2a01cdbb5 100644 --- a/api/src/Model/Services/UserData.php +++ b/api/src/Model/Services/UserData.php @@ -192,7 +192,7 @@ function getUsers($getCount, $isStaffMember, $stringMatch, $page, $sortBy = null } } - $rows = $this->db->paginate("SELECT $extc p.personid, p.givenname, p.familyname, CONCAT(p.givenname, ' ', p.familyname) as fullname, p.login, p.emailaddress, p.phonenumber, l.name as labname, l.address, l.city, '' as postcode, l.country + $rows = $this->db->paginate("SELECT $extc p.personid, p.givenname, p.familyname, CONCAT(p.givenname, ' ', p.familyname) as fullname, p.login, p.emailaddress, p.phonenumber, l.name as labname, l.address, l.city, l.postcode, l.country FROM person p LEFT OUTER JOIN proposalhasperson prhp ON prhp.personid = p.personid LEFT OUTER JOIN labcontact lc ON lc.personid = p.personid @@ -253,7 +253,7 @@ function getUsersForProposal($where, $getCount, $page, $sortBy, $proposalid, $cu } } - $extc = "p.personid, p.givenname, p.familyname, CONCAT(p.givenname, ' ', p.familyname) as fullname, p.login, p.emailaddress, p.phonenumber, l.name as labname, l.address, l.city, '' as postcode, l.country"; + $extc = "p.personid, p.givenname, p.familyname, CONCAT(p.givenname, ' ', p.familyname) as fullname, p.login, p.emailaddress, p.phonenumber, l.name as labname, l.address, l.city, l.postcode, l.country"; $rows = $this->db->paginate("(SELECT $extc FROM person p LEFT OUTER JOIN ProposalHasPerson prhp ON prhp.personid = p.personid diff --git a/api/src/Page/Contact.php b/api/src/Page/Contact.php index 762656e0a..10807e4c8 100644 --- a/api/src/Page/Contact.php +++ b/api/src/Page/Contact.php @@ -149,19 +149,62 @@ function _add_contact() { WHERE c.cardname=:1 and c.proposalid=:2", array($this->arg('CARDNAME'), $this->proposalid)); if (sizeof($cont)) $this->_error('The specified card name already exists'); - $this->db->pq("INSERT INTO laboratory (laboratoryid,name,address,city,postcode,country) - VALUES (s_laboratory.nextval, :1, :2, :3, :4, :5) RETURNING laboratoryid INTO :id", - array($this->arg('LABNAME'), $this->arg('ADDRESS'), $this->arg('CITY'), $this->arg('POSTCODE'), $this->arg('COUNTRY'))); - $lid = $this->db->id(); - - $email = $this->has_arg('EMAILADDRESS') ? $this->arg('EMAILADDRESS') : ''; - $phone = $this->has_arg('PHONENUMBER') ? $this->arg('PHONENUMBER') : ''; - - $this->db->pq("INSERT INTO person (personid, givenname, familyname, emailaddress, phonenumber, laboratoryid) - VALUES (s_person.nextval, :1, :2, :3, :4, :5) RETURNING personid INTO :id", - array($this->arg('GIVENNAME'), $this->arg('FAMILYNAME'), $email, $phone, $lid)); + if ($this->has_arg('PERSONID')) { + $pid = $this->arg('PERSONID'); + + $check = $this->db->pq("SELECT c.labcontactid + FROM labcontact c + WHERE c.personid=:1 and c.proposalid=:2", array($pid, $this->proposalid)); + if (sizeof($check)) $this->_error('The specified login already has a lab contact for this proposal'); + + $lab = $this->db->pq("SELECT l.laboratoryid FROM laboratory l + INNER JOIN person p ON l.laboratoryid = p.laboratoryid + WHERE p.personid=:1", array($pid)); + + if (sizeof($lab)) { + # Update laboratory + $lfields = array('LABNAME', 'ADDRESS', 'CITY', 'COUNTRY', 'POSTCODE'); + foreach ($lfields as $i => $f) { + if ($this->has_arg($f)) { + $c = $f == 'LABNAME' ? 'NAME' : $f; + $this->db->pq('UPDATE laboratory SET '.$c.'=:1 WHERE laboratoryid=:2', array($this->arg($f), $lab['LABORATORYID'])); + } + } + } + else { + # Create laboratory + $this->db->pq("INSERT INTO laboratory (laboratoryid,name,address,city,postcode,country) + VALUES (s_laboratory.nextval, :1, :2, :3, :4, :5) RETURNING laboratoryid INTO :id", + array($this->arg('LABNAME'), $this->arg('ADDRESS'), $this->arg('CITY'), $this->arg('POSTCODE'), $this->arg('COUNTRY'))); + $lid = $this->db->id(); + $this->db->pq('UPDATE person SET laboratoryid=:1 WHERE personid=:2', array($lid, $pid)); + } + + # Update person + $pfields = array('FAMILYNAME', 'GIVENNAME', 'PHONENUMBER', 'EMAILADDRESS'); + foreach ($pfields as $i => $f) { + if ($this->has_arg($f)) { + $this->db->pq('UPDATE person SET '.$f.'=:1 WHERE personid=:2', array($this->arg($f), $pid)); + } + } + + } + else { - $pid = $this->db->id(); + $this->db->pq("INSERT INTO laboratory (laboratoryid,name,address,city,postcode,country) + VALUES (s_laboratory.nextval, :1, :2, :3, :4, :5) RETURNING laboratoryid INTO :id", + array($this->arg('LABNAME'), $this->arg('ADDRESS'), $this->arg('CITY'), $this->arg('POSTCODE'), $this->arg('COUNTRY'))); + $lid = $this->db->id(); + + $email = $this->has_arg('EMAILADDRESS') ? $this->arg('EMAILADDRESS') : ''; + $phone = $this->has_arg('PHONENUMBER') ? $this->arg('PHONENUMBER') : ''; + + $this->db->pq("INSERT INTO person (personid, givenname, familyname, emailaddress, phonenumber, laboratoryid) + VALUES (s_person.nextval, :1, :2, :3, :4, :5) RETURNING personid INTO :id", + array($this->arg('GIVENNAME'), $this->arg('FAMILYNAME'), $email, $phone, $lid)); + + $pid = $this->db->id(); + } $c = $this->def_arg('DEFAULTCOURRIERCOMPANY', ''); $ca = $this->has_arg('COURIERACCOUNT') ? $this->arg('COURIERACCOUNT') : ''; diff --git a/api/src/Page/DC.php b/api/src/Page/DC.php index c6e49a59c..7879d0615 100644 --- a/api/src/Page/DC.php +++ b/api/src/Page/DC.php @@ -47,6 +47,7 @@ class DC extends Page array('/chi', 'post', '_chk_image'), array('/imq/:id', 'get', '_image_qi'), array('/grid/:id', 'get', '_grid_info'), + array('/grid/xrc/:id', 'get', '_grid_xrc'), array('/grid/map', 'get', '_grid_map'), array('/ed/:id', 'get', '_edge', array('id' => '\d+'), 'edge'), array('/mca/:id', 'get', '_mca', array('id' => '\d+'), 'mca'), @@ -394,6 +395,7 @@ function _data_collections($single = null) # Data collection group if ($this->has_arg('dcg') || $this->has_arg('PROCESSINGJOBID')) { $fields = "count(distinct dca.datacollectionfileattachmentid) as dcac, + if(dca.fileType='recip',1,0) as recip, count(distinct dcc.datacollectioncommentid) as dccc, 1 as dcc, smp.name as sample, @@ -527,6 +529,7 @@ function _data_collections($single = null) } } else { $fields = "count(distinct dca.datacollectionfileattachmentid) as dcac, + if(dca.fileType='recip',1,0) as recip, count(distinct dcc.datacollectioncommentid) as dccc, count(distinct dc.datacollectionid) as dcc, min(smp.name) as sample, @@ -677,6 +680,7 @@ function _data_collections($single = null) SELECT $extc 1 as dcac, + 0 as recip, 1 as dccc, 1 as dcc, smp.name as sample, @@ -769,6 +773,7 @@ function _data_collections($single = null) SELECT $extc 1 as dcac, + 0 as recip, 1 as dccc, 1 as dcc, smp.name as sample, @@ -861,6 +866,7 @@ function _data_collections($single = null) SELECT $extc 1 as dcac, + 0 as recip, 1 as dccc, 1 as dcc, smp.name as sample, @@ -1443,17 +1449,19 @@ function _null_or($field, $conversion) # Grid Scan Info function _grid_info() { - $info = $this->db->pq("SELECT dc.datacollectiongroupid, dc.datacollectionid, dc.axisstart, p.posx as x, p.posy as y, p.posz as z, g.dx_mm, g.dy_mm, g.steps_x, g.steps_y, IFNULL(g.micronsperpixelx,g.pixelspermicronx) as micronsperpixelx, IFNULL(g.micronsperpixely,g.pixelspermicrony) as micronsperpixely, g.snapshot_offsetxpixel, g.snapshot_offsetypixel, g.orientation, g.snaked, DATE_FORMAT(dc.starttime, '%Y%m%d') as startdate + $info = $this->db->pq("SELECT dc.datacollectiongroupid, dc.datacollectionid, dc.axisstart, p.posx as x, p.posy as y, p.posz as z, g.dx_mm, g.dy_mm, g.steps_x, g.steps_y, IFNULL(g.micronsperpixelx,g.pixelspermicronx) as micronsperpixelx, IFNULL(g.micronsperpixely,g.pixelspermicrony) as micronsperpixely, g.snapshot_offsetxpixel, g.snapshot_offsetypixel, g.orientation, g.snaked, DATE_FORMAT(dc.starttime, '%Y%m%d') as startdate, xrc.status as xrcstatus, xrcr.xraycentringresultid FROM gridinfo g INNER JOIN datacollection dc on (dc.datacollectionid = g.datacollectionid) or (dc.datacollectiongroupid = g.datacollectiongroupid) LEFT OUTER JOIN position p ON dc.positionid = p.positionid + LEFT OUTER JOIN xraycentring xrc ON dc.datacollectiongroupid = xrc.datacollectiongroupid + LEFT OUTER JOIN xraycentringresult xrcr ON xrc.xraycentringid = xrcr.xraycentringid WHERE dc.datacollectionid = :1 ", array($this->arg('id'))); if (!sizeof($info)) $this->_output(array()); else { foreach ($info[0] as $k => &$v) { - if ($k == 'ORIENTATION') + if ($k == 'ORIENTATION' || $k == 'XRCSTATUS') continue; $v = floatval($v); } @@ -1475,6 +1483,32 @@ function _grid_map() } + # XRC + function _grid_xrc() + { + $info = $this->db->pq("SELECT dc.datacollectiongroupid, dc.datacollectionid, + xrc.xraycentringtype as method, xrcr.xraycentringresultid, + xrcr.centreofmassx as x, xrcr.centreofmassy as y, xrcr.centreofmassz as z + FROM datacollection dc + INNER JOIN xraycentring xrc ON xrc.datacollectiongroupid = dc.datacollectiongroupid + INNER JOIN xraycentringresult xrcr ON xrcr.xraycentringid = xrc.xraycentringid + WHERE dc.datacollectionid = :1 ", array($this->arg('id'))); + + if (!sizeof($info)) + $this->_output(array('total' => 0, 'data' => array())); + else { + foreach ($info as &$i) { + foreach ($i as $k => &$v) { + if ($k == 'METHOD') + continue; + $v = round(floatval($v), 2); + } + } + $this->_output(array('total' => sizeof($info), 'data' => $info)); + } + } + + # ------------------------------------------------------------------------ # Fluorescence Map Info function _fluo_map() diff --git a/api/src/Page/Processing.php b/api/src/Page/Processing.php index 4620f4abb..ab1c792fc 100644 --- a/api/src/Page/Processing.php +++ b/api/src/Page/Processing.php @@ -87,10 +87,11 @@ function _screening_status($where, $ids) { function _xrc_status($where, $ids) { $dcs = $this->db->pq( - "SELECT xrc.status as xrcstatus, dc.datacollectionid + "SELECT xrc.status as xrcstatus, dc.datacollectionid, xrc.xrayCentringType as method, xrcr.xraycentringresultid as xrcresults FROM datacollection dc INNER JOIN datacollectiongroup dcg ON dcg.datacollectiongroupid = dc.datacollectiongroupid LEFT OUTER JOIN xraycentring xrc ON xrc.datacollectiongroupid = dc.datacollectiongroupid + LEFT OUTER JOIN XrayCentringResult xrcr ON xrc.xrayCentringId = xrcr.xrayCentringId INNER JOIN blsession s ON s.sessionid = dcg.sessionid INNER JOIN proposal p ON p.proposalid = s.proposalid WHERE $where", @@ -104,13 +105,15 @@ function _xrc_status($where, $ids) { } $statuses[$dc['DATACOLLECTIONID']]['XrayCentring'] = - $dc['XRCSTATUS'] === null - ? 0 - : ($dc['XRCSTATUS'] === 'pending' - ? 1 - : ($dc['XRCSTATUS'] === 'success' - ? 2 - : 3)); + $dc['METHOD'] !== '3d' + ? -1 + : ($dc['XRCSTATUS'] === null + ? 0 + : ($dc['XRCSTATUS'] === 'pending' + ? 1 + : ($dc['XRCSTATUS'] === 'success' && $dc['XRCRESULTS'] !== null + ? 2 + : 3))); } return $statuses; diff --git a/api/tests/Model/Services/UserDataSingleInvocationTest.php b/api/tests/Model/Services/UserDataSingleInvocationTest.php index d1add87da..d5a64bb86 100644 --- a/api/tests/Model/Services/UserDataSingleInvocationTest.php +++ b/api/tests/Model/Services/UserDataSingleInvocationTest.php @@ -134,7 +134,7 @@ public function testGetUsersCountWithDefaults(): void public function testGetUsersWithDefaults(): void { $res = $this->userData->getUsers(false, true, 's', 3); - $this->assertEquals("SELECT p.personid, p.givenname, p.familyname, CONCAT(p.givenname, ' ', p.familyname) as fullname, p.login, p.emailaddress, p.phonenumber, l.name as labname, l.address, l.city, '' as postcode, l.country FROM Person p LEFT OUTER JOIN ProposalHasPerson prhp ON prhp.personid = p.personid LEFT OUTER JOIN LabContact lc ON lc.personid = p.personid LEFT OUTER JOIN Laboratory l ON l.laboratoryid = p.laboratoryid WHERE p.login IS NOT NULL AND (lower(p.familyname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.givenname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.login) LIKE lower(CONCAT(CONCAT('%','s'),'%'))) GROUP BY p.personid ORDER BY p.familyname,p.givenname LIMIT 30,15", $this->db->getLastQuery()); + $this->assertEquals("SELECT p.personid, p.givenname, p.familyname, CONCAT(p.givenname, ' ', p.familyname) as fullname, p.login, p.emailaddress, p.phonenumber, l.name as labname, l.address, l.city, l.postcode, l.country FROM Person p LEFT OUTER JOIN ProposalHasPerson prhp ON prhp.personid = p.personid LEFT OUTER JOIN LabContact lc ON lc.personid = p.personid LEFT OUTER JOIN Laboratory l ON l.laboratoryid = p.laboratoryid WHERE p.login IS NOT NULL AND (lower(p.familyname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.givenname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.login) LIKE lower(CONCAT(CONCAT('%','s'),'%'))) GROUP BY p.personid ORDER BY p.familyname,p.givenname LIMIT 30,15", $this->db->getLastQuery()); $this->assertEmpty($res); } @@ -148,14 +148,14 @@ public function testGetUsersCountWithInvalidSortBy(): void public function testGetUsersWithValidSortBy(): void { $res = $this->userData->getUsers(false, true, 's', 3, 'LOGIN'); - $this->assertEquals("SELECT p.personid, p.givenname, p.familyname, CONCAT(p.givenname, ' ', p.familyname) as fullname, p.login, p.emailaddress, p.phonenumber, l.name as labname, l.address, l.city, '' as postcode, l.country FROM Person p LEFT OUTER JOIN ProposalHasPerson prhp ON prhp.personid = p.personid LEFT OUTER JOIN LabContact lc ON lc.personid = p.personid LEFT OUTER JOIN Laboratory l ON l.laboratoryid = p.laboratoryid WHERE p.login IS NOT NULL AND (lower(p.familyname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.givenname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.login) LIKE lower(CONCAT(CONCAT('%','s'),'%'))) GROUP BY p.personid ORDER BY p.login ASC LIMIT 30,15", $this->db->getLastQuery()); + $this->assertEquals("SELECT p.personid, p.givenname, p.familyname, CONCAT(p.givenname, ' ', p.familyname) as fullname, p.login, p.emailaddress, p.phonenumber, l.name as labname, l.address, l.city, l.postcode, l.country FROM Person p LEFT OUTER JOIN ProposalHasPerson prhp ON prhp.personid = p.personid LEFT OUTER JOIN LabContact lc ON lc.personid = p.personid LEFT OUTER JOIN Laboratory l ON l.laboratoryid = p.laboratoryid WHERE p.login IS NOT NULL AND (lower(p.familyname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.givenname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.login) LIKE lower(CONCAT(CONCAT('%','s'),'%'))) GROUP BY p.personid ORDER BY p.login ASC LIMIT 30,15", $this->db->getLastQuery()); $this->assertEmpty($res); } public function testGetUsersWithInvalidSortBy(): void { $res = $this->userData->getUsers(false, true, 's', 3, 'blah'); - $this->assertEquals("SELECT p.personid, p.givenname, p.familyname, CONCAT(p.givenname, ' ', p.familyname) as fullname, p.login, p.emailaddress, p.phonenumber, l.name as labname, l.address, l.city, '' as postcode, l.country FROM Person p LEFT OUTER JOIN ProposalHasPerson prhp ON prhp.personid = p.personid LEFT OUTER JOIN LabContact lc ON lc.personid = p.personid LEFT OUTER JOIN Laboratory l ON l.laboratoryid = p.laboratoryid WHERE p.login IS NOT NULL AND (lower(p.familyname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.givenname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.login) LIKE lower(CONCAT(CONCAT('%','s'),'%'))) GROUP BY p.personid ORDER BY p.familyname,p.givenname LIMIT 30,15", $this->db->getLastQuery()); + $this->assertEquals("SELECT p.personid, p.givenname, p.familyname, CONCAT(p.givenname, ' ', p.familyname) as fullname, p.login, p.emailaddress, p.phonenumber, l.name as labname, l.address, l.city, l.postcode, l.country FROM Person p LEFT OUTER JOIN ProposalHasPerson prhp ON prhp.personid = p.personid LEFT OUTER JOIN LabContact lc ON lc.personid = p.personid LEFT OUTER JOIN Laboratory l ON l.laboratoryid = p.laboratoryid WHERE p.login IS NOT NULL AND (lower(p.familyname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.givenname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.login) LIKE lower(CONCAT(CONCAT('%','s'),'%'))) GROUP BY p.personid ORDER BY p.familyname,p.givenname LIMIT 30,15", $this->db->getLastQuery()); $this->assertEmpty($res); } @@ -169,7 +169,7 @@ public function testGetUsersCountWithValidSortBy(): void public function testGetUsersWithValidSortBypID(): void { $res = $this->userData->getUsers(false, true, 's', 3, 'LOGIN', 5, 5); - $this->assertEquals("SELECT p.personid, p.givenname, p.familyname, CONCAT(p.givenname, ' ', p.familyname) as fullname, p.login, p.emailaddress, p.phonenumber, l.name as labname, l.address, l.city, '' as postcode, l.country FROM Person p LEFT OUTER JOIN ProposalHasPerson prhp ON prhp.personid = p.personid LEFT OUTER JOIN LabContact lc ON lc.personid = p.personid LEFT OUTER JOIN Laboratory l ON l.laboratoryid = p.laboratoryid WHERE p.login IS NOT NULL AND (prhp.proposalid=5 OR lc.proposalid=5 OR p.personid=null) AND (lower(p.familyname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.givenname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.login) LIKE lower(CONCAT(CONCAT('%','s'),'%'))) GROUP BY p.personid ORDER BY p.login ASC LIMIT 30,15", $this->db->getLastQuery()); + $this->assertEquals("SELECT p.personid, p.givenname, p.familyname, CONCAT(p.givenname, ' ', p.familyname) as fullname, p.login, p.emailaddress, p.phonenumber, l.name as labname, l.address, l.city, l.postcode, l.country FROM Person p LEFT OUTER JOIN ProposalHasPerson prhp ON prhp.personid = p.personid LEFT OUTER JOIN LabContact lc ON lc.personid = p.personid LEFT OUTER JOIN Laboratory l ON l.laboratoryid = p.laboratoryid WHERE p.login IS NOT NULL AND (prhp.proposalid=5 OR lc.proposalid=5 OR p.personid=null) AND (lower(p.familyname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.givenname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.login) LIKE lower(CONCAT(CONCAT('%','s'),'%'))) GROUP BY p.personid ORDER BY p.login ASC LIMIT 30,15", $this->db->getLastQuery()); $this->assertEmpty($res); } @@ -183,7 +183,7 @@ public function testGetUsersCountWithValidSortByPid(): void public function testGetUsersWithValidSortBypIDPersonId(): void { $res = $this->userData->getUsers(false, true, 's', 3, 'LOGIN', 5, 5, 6); - $this->assertEquals("SELECT p.personid, p.givenname, p.familyname, CONCAT(p.givenname, ' ', p.familyname) as fullname, p.login, p.emailaddress, p.phonenumber, l.name as labname, l.address, l.city, '' as postcode, l.country FROM Person p LEFT OUTER JOIN ProposalHasPerson prhp ON prhp.personid = p.personid LEFT OUTER JOIN LabContact lc ON lc.personid = p.personid LEFT OUTER JOIN Laboratory l ON l.laboratoryid = p.laboratoryid WHERE 1=1 AND (prhp.proposalid=5 OR lc.proposalid=5 OR p.personid=null) AND p.personid=6 AND (lower(p.familyname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.givenname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.login) LIKE lower(CONCAT(CONCAT('%','s'),'%'))) GROUP BY p.personid ORDER BY p.login ASC LIMIT 30,15", $this->db->getLastQuery()); + $this->assertEquals("SELECT p.personid, p.givenname, p.familyname, CONCAT(p.givenname, ' ', p.familyname) as fullname, p.login, p.emailaddress, p.phonenumber, l.name as labname, l.address, l.city, l.postcode, l.country FROM Person p LEFT OUTER JOIN ProposalHasPerson prhp ON prhp.personid = p.personid LEFT OUTER JOIN LabContact lc ON lc.personid = p.personid LEFT OUTER JOIN Laboratory l ON l.laboratoryid = p.laboratoryid WHERE 1=1 AND (prhp.proposalid=5 OR lc.proposalid=5 OR p.personid=null) AND p.personid=6 AND (lower(p.familyname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.givenname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.login) LIKE lower(CONCAT(CONCAT('%','s'),'%'))) GROUP BY p.personid ORDER BY p.login ASC LIMIT 30,15", $this->db->getLastQuery()); $this->assertEmpty($res); } @@ -197,7 +197,7 @@ public function testGetUsersCountWithValidSortByPidPersonId(): void public function testGetUsersWithValidSortBypIDPersonIdIsManager(): void { $res = $this->userData->getUsers(false, true, 's', 3, 'LOGIN', 5, 5, 6, true); - $this->assertEquals("SELECT p.personid, p.givenname, p.familyname, CONCAT(p.givenname, ' ', p.familyname) as fullname, p.login, p.emailaddress, p.phonenumber, l.name as labname, l.address, l.city, '' as postcode, l.country FROM Person p LEFT OUTER JOIN ProposalHasPerson prhp ON prhp.personid = p.personid LEFT OUTER JOIN LabContact lc ON lc.personid = p.personid LEFT OUTER JOIN Laboratory l ON l.laboratoryid = p.laboratoryid WHERE 1=1 AND (prhp.proposalid=5 OR lc.proposalid=5 OR p.personid=null) AND p.personid=6 AND (lower(p.familyname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.givenname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.login) LIKE lower(CONCAT(CONCAT('%','s'),'%'))) GROUP BY p.personid ORDER BY p.login ASC LIMIT 30,15", $this->db->getLastQuery()); + $this->assertEquals("SELECT p.personid, p.givenname, p.familyname, CONCAT(p.givenname, ' ', p.familyname) as fullname, p.login, p.emailaddress, p.phonenumber, l.name as labname, l.address, l.city, l.postcode, l.country FROM Person p LEFT OUTER JOIN ProposalHasPerson prhp ON prhp.personid = p.personid LEFT OUTER JOIN LabContact lc ON lc.personid = p.personid LEFT OUTER JOIN Laboratory l ON l.laboratoryid = p.laboratoryid WHERE 1=1 AND (prhp.proposalid=5 OR lc.proposalid=5 OR p.personid=null) AND p.personid=6 AND (lower(p.familyname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.givenname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.login) LIKE lower(CONCAT(CONCAT('%','s'),'%'))) GROUP BY p.personid ORDER BY p.login ASC LIMIT 30,15", $this->db->getLastQuery()); $this->assertEmpty($res); } @@ -211,7 +211,7 @@ public function testGetUsersCountWithValidSortByPidPersonIdIsManager(): void public function testGetUsersWithValidSortBypIDPersonIdIsManagerCurrentUserId(): void { $res = $this->userData->getUsers(false, true, 's', 3, 'LOGIN', 5, 5, 6, true, 7); - $this->assertEquals("SELECT p.personid, p.givenname, p.familyname, CONCAT(p.givenname, ' ', p.familyname) as fullname, p.login, p.emailaddress, p.phonenumber, l.name as labname, l.address, l.city, '' as postcode, l.country FROM Person p LEFT OUTER JOIN ProposalHasPerson prhp ON prhp.personid = p.personid LEFT OUTER JOIN LabContact lc ON lc.personid = p.personid LEFT OUTER JOIN Laboratory l ON l.laboratoryid = p.laboratoryid WHERE 1=1 AND (prhp.proposalid=5 OR lc.proposalid=5 OR p.personid=7) AND p.personid=6 AND (lower(p.familyname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.givenname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.login) LIKE lower(CONCAT(CONCAT('%','s'),'%'))) GROUP BY p.personid ORDER BY p.login ASC LIMIT 30,15", $this->db->getLastQuery()); + $this->assertEquals("SELECT p.personid, p.givenname, p.familyname, CONCAT(p.givenname, ' ', p.familyname) as fullname, p.login, p.emailaddress, p.phonenumber, l.name as labname, l.address, l.city, l.postcode, l.country FROM Person p LEFT OUTER JOIN ProposalHasPerson prhp ON prhp.personid = p.personid LEFT OUTER JOIN LabContact lc ON lc.personid = p.personid LEFT OUTER JOIN Laboratory l ON l.laboratoryid = p.laboratoryid WHERE 1=1 AND (prhp.proposalid=5 OR lc.proposalid=5 OR p.personid=7) AND p.personid=6 AND (lower(p.familyname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.givenname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.login) LIKE lower(CONCAT(CONCAT('%','s'),'%'))) GROUP BY p.personid ORDER BY p.login ASC LIMIT 30,15", $this->db->getLastQuery()); $this->assertEmpty($res); } @@ -225,7 +225,7 @@ public function testGetUsersCountWithValidSortByPidPersonIdIsManagerCurrentUserI public function testGetUsersWithValidSortBypIDPersonIdIsManagerCurrentUserIdGid(): void { $res = $this->userData->getUsers(false, true, 's', 3, 'LOGIN', 5, 5, 6, true, 7, 8); - $this->assertEquals("SELECT p.personid, p.givenname, p.familyname, CONCAT(p.givenname, ' ', p.familyname) as fullname, p.login, p.emailaddress, p.phonenumber, l.name as labname, l.address, l.city, '' as postcode, l.country FROM Person p LEFT OUTER JOIN ProposalHasPerson prhp ON prhp.personid = p.personid LEFT OUTER JOIN LabContact lc ON lc.personid = p.personid LEFT OUTER JOIN Laboratory l ON l.laboratoryid = p.laboratoryid INNER JOIN UserGroup_has_Person uhp ON uhp.personid = p.personid WHERE 1=1 AND (prhp.proposalid=5 OR lc.proposalid=5 OR p.personid=7) AND p.personid=6 AND (lower(p.familyname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.givenname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.login) LIKE lower(CONCAT(CONCAT('%','s'),'%'))) AND uhp.usergroupid=8 GROUP BY p.personid ORDER BY p.login ASC LIMIT 30,15", $this->db->getLastQuery()); + $this->assertEquals("SELECT p.personid, p.givenname, p.familyname, CONCAT(p.givenname, ' ', p.familyname) as fullname, p.login, p.emailaddress, p.phonenumber, l.name as labname, l.address, l.city, l.postcode, l.country FROM Person p LEFT OUTER JOIN ProposalHasPerson prhp ON prhp.personid = p.personid LEFT OUTER JOIN LabContact lc ON lc.personid = p.personid LEFT OUTER JOIN Laboratory l ON l.laboratoryid = p.laboratoryid INNER JOIN UserGroup_has_Person uhp ON uhp.personid = p.personid WHERE 1=1 AND (prhp.proposalid=5 OR lc.proposalid=5 OR p.personid=7) AND p.personid=6 AND (lower(p.familyname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.givenname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.login) LIKE lower(CONCAT(CONCAT('%','s'),'%'))) AND uhp.usergroupid=8 GROUP BY p.personid ORDER BY p.login ASC LIMIT 30,15", $this->db->getLastQuery()); $this->assertEmpty($res); } @@ -239,7 +239,7 @@ public function testGetUsersCountWithValidSortByPidPersonIdIsManagerCurrentUserI public function testGetUsersWithValidSortBypIDPersonIdIsManagerCurrentUserIdSid(): void { $res = $this->userData->getUsers(false, true, 's', 3, 'LOGIN', 5, 5, 6, true, 7, null, 9); - $this->assertEquals("SELECT p.personid, p.givenname, p.familyname, CONCAT(p.givenname, ' ', p.familyname) as fullname, p.login, p.emailaddress, p.phonenumber, l.name as labname, l.address, l.city, '' as postcode, l.country FROM Person p LEFT OUTER JOIN ProposalHasPerson prhp ON prhp.personid = p.personid LEFT OUTER JOIN LabContact lc ON lc.personid = p.personid LEFT OUTER JOIN Laboratory l ON l.laboratoryid = p.laboratoryid INNER JOIN blsession_has_person shp ON shp.personid = p.personid WHERE 1=1 AND (prhp.proposalid=5 OR lc.proposalid=5 OR p.personid=7) AND p.personid=6 AND (lower(p.familyname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.givenname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.login) LIKE lower(CONCAT(CONCAT('%','s'),'%'))) AND shp.sessionid=9 GROUP BY p.personid ORDER BY p.login ASC LIMIT 30,15", $this->db->getLastQuery()); + $this->assertEquals("SELECT p.personid, p.givenname, p.familyname, CONCAT(p.givenname, ' ', p.familyname) as fullname, p.login, p.emailaddress, p.phonenumber, l.name as labname, l.address, l.city, l.postcode, l.country FROM Person p LEFT OUTER JOIN ProposalHasPerson prhp ON prhp.personid = p.personid LEFT OUTER JOIN LabContact lc ON lc.personid = p.personid LEFT OUTER JOIN Laboratory l ON l.laboratoryid = p.laboratoryid INNER JOIN blsession_has_person shp ON shp.personid = p.personid WHERE 1=1 AND (prhp.proposalid=5 OR lc.proposalid=5 OR p.personid=7) AND p.personid=6 AND (lower(p.familyname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.givenname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.login) LIKE lower(CONCAT(CONCAT('%','s'),'%'))) AND shp.sessionid=9 GROUP BY p.personid ORDER BY p.login ASC LIMIT 30,15", $this->db->getLastQuery()); $this->assertEmpty($res); } @@ -253,7 +253,7 @@ public function testGetUsersCountWithValidSortByPidPersonIdIsManagerCurrentUserI public function testGetUsersWithValidSortBypIDPersonIdIsManagerCurrentUserIdPjid(): void { $res = $this->userData->getUsers(false, true, 's', 3, 'LOGIN', 5, 5, 6, true, 7, null, null, 10); - $this->assertEquals("SELECT CONCAT(p.personid, '-', php.projectid) as ppid, p.personid, p.givenname, p.familyname, CONCAT(p.givenname, ' ', p.familyname) as fullname, p.login, p.emailaddress, p.phonenumber, l.name as labname, l.address, l.city, '' as postcode, l.country FROM Person p LEFT OUTER JOIN ProposalHasPerson prhp ON prhp.personid = p.personid LEFT OUTER JOIN LabContact lc ON lc.personid = p.personid LEFT OUTER JOIN Laboratory l ON l.laboratoryid = p.laboratoryid INNER JOIN Project_has_Person php ON p.personid = php.personid WHERE 1=1 AND (prhp.proposalid=5 OR lc.proposalid=5 OR p.personid=7) AND p.personid=6 AND (lower(p.familyname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.givenname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.login) LIKE lower(CONCAT(CONCAT('%','s'),'%'))) AND php.projectid=10 GROUP BY p.personid ORDER BY p.login ASC LIMIT 30,15", $this->db->getLastQuery()); + $this->assertEquals("SELECT CONCAT(p.personid, '-', php.projectid) as ppid, p.personid, p.givenname, p.familyname, CONCAT(p.givenname, ' ', p.familyname) as fullname, p.login, p.emailaddress, p.phonenumber, l.name as labname, l.address, l.city, l.postcode, l.country FROM Person p LEFT OUTER JOIN ProposalHasPerson prhp ON prhp.personid = p.personid LEFT OUTER JOIN LabContact lc ON lc.personid = p.personid LEFT OUTER JOIN Laboratory l ON l.laboratoryid = p.laboratoryid INNER JOIN Project_has_Person php ON p.personid = php.personid WHERE 1=1 AND (prhp.proposalid=5 OR lc.proposalid=5 OR p.personid=7) AND p.personid=6 AND (lower(p.familyname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.givenname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.login) LIKE lower(CONCAT(CONCAT('%','s'),'%'))) AND php.projectid=10 GROUP BY p.personid ORDER BY p.login ASC LIMIT 30,15", $this->db->getLastQuery()); $this->assertEmpty($res); } @@ -267,7 +267,7 @@ public function testGetUsersCountWithValidSortByPidPersonIdIsManagerCurrentUserI public function testGetUsersWithValidSortBypIDPersonIdIsManagerCurrentUserIdVisitname(): void { $res = $this->userData->getUsers(false, true, 's', 3, 'LOGIN', 5, 5, 6, true, 7, null, null, null, 'visit1'); - $this->assertEquals("SELECT count(ses.sessionid) as visits, DATE_FORMAT(max(ses.startdate), '%d-%m-%Y') as last, shp.remote, shp.role, p.personid, p.givenname, p.familyname, CONCAT(p.givenname, ' ', p.familyname) as fullname, p.login, p.emailaddress, p.phonenumber, l.name as labname, l.address, l.city, '' as postcode, l.country FROM Person p LEFT OUTER JOIN ProposalHasPerson prhp ON prhp.personid = p.personid LEFT OUTER JOIN LabContact lc ON lc.personid = p.personid LEFT OUTER JOIN Laboratory l ON l.laboratoryid = p.laboratoryid INNER JOIN Session_has_Person shp ON shp.personid = p.personid INNER JOIN BLSession s ON shp.sessionid = s.sessionid INNER JOIN Proposal pr ON pr.proposalid = s.proposalid LEFT OUTER JOIN Session_has_Person shp2 ON p.personid = shp2.personid LEFT OUTER JOIN BLSession ses ON ses.sessionid = shp2.sessionid AND ses.startdate < s.startdate WHERE 1=1 AND (prhp.proposalid=5 OR lc.proposalid=5 OR p.personid=7) AND p.personid=6 AND (lower(p.familyname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.givenname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.login) LIKE lower(CONCAT(CONCAT('%','s'),'%'))) AND shp.remote IS NOT NULL AND CONCAT(pr.proposalcode, pr.proposalnumber, '-', s.visit_number) LIKE 'visit1' GROUP BY p.personid, p.givenname, p.familyname, p.login ORDER BY p.login ASC LIMIT 30,15", $this->db->getLastQuery()); + $this->assertEquals("SELECT count(ses.sessionid) as visits, DATE_FORMAT(max(ses.startdate), '%d-%m-%Y') as last, shp.remote, shp.role, p.personid, p.givenname, p.familyname, CONCAT(p.givenname, ' ', p.familyname) as fullname, p.login, p.emailaddress, p.phonenumber, l.name as labname, l.address, l.city, l.postcode, l.country FROM Person p LEFT OUTER JOIN ProposalHasPerson prhp ON prhp.personid = p.personid LEFT OUTER JOIN LabContact lc ON lc.personid = p.personid LEFT OUTER JOIN Laboratory l ON l.laboratoryid = p.laboratoryid INNER JOIN Session_has_Person shp ON shp.personid = p.personid INNER JOIN BLSession s ON shp.sessionid = s.sessionid INNER JOIN Proposal pr ON pr.proposalid = s.proposalid LEFT OUTER JOIN Session_has_Person shp2 ON p.personid = shp2.personid LEFT OUTER JOIN BLSession ses ON ses.sessionid = shp2.sessionid AND ses.startdate < s.startdate WHERE 1=1 AND (prhp.proposalid=5 OR lc.proposalid=5 OR p.personid=7) AND p.personid=6 AND (lower(p.familyname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.givenname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.login) LIKE lower(CONCAT(CONCAT('%','s'),'%'))) AND shp.remote IS NOT NULL AND CONCAT(pr.proposalcode, pr.proposalnumber, '-', s.visit_number) LIKE 'visit1' GROUP BY p.personid, p.givenname, p.familyname, p.login ORDER BY p.login ASC LIMIT 30,15", $this->db->getLastQuery()); $this->assertEmpty($res); } @@ -281,7 +281,7 @@ public function testGetUsersCountWithValidSortByPidPersonIdIsManagerCurrentUserI public function testGetUsersWithValidSortBypIDPersonIdIsManagerCurrentUserIdPerPage(): void { $res = $this->userData->getUsers(false, true, 's', 1, 'LOGIN', 5, 5, 6, true, 7, null, null, null, null, 3); - $this->assertEquals("SELECT p.personid, p.givenname, p.familyname, CONCAT(p.givenname, ' ', p.familyname) as fullname, p.login, p.emailaddress, p.phonenumber, l.name as labname, l.address, l.city, '' as postcode, l.country FROM Person p LEFT OUTER JOIN ProposalHasPerson prhp ON prhp.personid = p.personid LEFT OUTER JOIN LabContact lc ON lc.personid = p.personid LEFT OUTER JOIN Laboratory l ON l.laboratoryid = p.laboratoryid WHERE 1=1 AND (prhp.proposalid=5 OR lc.proposalid=5 OR p.personid=7) AND p.personid=6 AND (lower(p.familyname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.givenname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.login) LIKE lower(CONCAT(CONCAT('%','s'),'%'))) GROUP BY p.personid ORDER BY p.login ASC LIMIT 0,3", $this->db->getLastQuery()); + $this->assertEquals("SELECT p.personid, p.givenname, p.familyname, CONCAT(p.givenname, ' ', p.familyname) as fullname, p.login, p.emailaddress, p.phonenumber, l.name as labname, l.address, l.city, l.postcode, l.country FROM Person p LEFT OUTER JOIN ProposalHasPerson prhp ON prhp.personid = p.personid LEFT OUTER JOIN LabContact lc ON lc.personid = p.personid LEFT OUTER JOIN Laboratory l ON l.laboratoryid = p.laboratoryid WHERE 1=1 AND (prhp.proposalid=5 OR lc.proposalid=5 OR p.personid=7) AND p.personid=6 AND (lower(p.familyname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.givenname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.login) LIKE lower(CONCAT(CONCAT('%','s'),'%'))) GROUP BY p.personid ORDER BY p.login ASC LIMIT 0,3", $this->db->getLastQuery()); $this->assertEmpty($res); } @@ -302,7 +302,7 @@ public function testGetUsersCountWithValidSortByPidPersonIdIsManagerCurrentUserI public function testGetUsersWithValidSortBypIDPersonIdIsManagerCurrentUserIdPerPageDirAndIsOnlyLogin(): void { $res = $this->userData->getUsers(false, true, 's', 1, 'LOGIN', 5, 5, 6, true, 7, null, null, null, null, 3, false, false, true); - $this->assertEquals("SELECT p.personid, p.givenname, p.familyname, CONCAT(p.givenname, ' ', p.familyname) as fullname, p.login, p.emailaddress, p.phonenumber, l.name as labname, l.address, l.city, '' as postcode, l.country FROM Person p LEFT OUTER JOIN ProposalHasPerson prhp ON prhp.personid = p.personid LEFT OUTER JOIN LabContact lc ON lc.personid = p.personid LEFT OUTER JOIN Laboratory l ON l.laboratoryid = p.laboratoryid WHERE p.login IS NOT NULL AND (prhp.proposalid=5 OR lc.proposalid=5 OR p.personid=7) AND p.personid=6 AND (lower(p.familyname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.givenname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.login) LIKE lower(CONCAT(CONCAT('%','s'),'%'))) GROUP BY p.personid ORDER BY p.login DESC LIMIT 0,3", $this->db->getLastQuery()); + $this->assertEquals("SELECT p.personid, p.givenname, p.familyname, CONCAT(p.givenname, ' ', p.familyname) as fullname, p.login, p.emailaddress, p.phonenumber, l.name as labname, l.address, l.city, l.postcode, l.country FROM Person p LEFT OUTER JOIN ProposalHasPerson prhp ON prhp.personid = p.personid LEFT OUTER JOIN LabContact lc ON lc.personid = p.personid LEFT OUTER JOIN Laboratory l ON l.laboratoryid = p.laboratoryid WHERE p.login IS NOT NULL AND (prhp.proposalid=5 OR lc.proposalid=5 OR p.personid=7) AND p.personid=6 AND (lower(p.familyname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.givenname) LIKE lower(CONCAT(CONCAT('%','s'),'%')) OR lower(p.login) LIKE lower(CONCAT(CONCAT('%','s'),'%'))) GROUP BY p.personid ORDER BY p.login DESC LIMIT 0,3", $this->db->getLastQuery()); $this->assertEmpty($res); } diff --git a/client/src/js/app/store/store.js b/client/src/js/app/store/store.js index 6d851acab..6f29dc340 100644 --- a/client/src/js/app/store/store.js +++ b/client/src/js/app/store/store.js @@ -367,7 +367,8 @@ const store = new Vuex.Store({ oidcId: state => state.auth.oidcId, apiUrl: state => state.apiUrl, appUrl: state => state.appUrl, - getAppOptions: state => state.appOptions + getAppOptions: state => state.appOptions, + isLoading: state => state.isLoading, } }) diff --git a/client/src/js/models/labcontact.js b/client/src/js/models/labcontact.js index 1b732ca40..b2eff310d 100644 --- a/client/src/js/models/labcontact.js +++ b/client/src/js/models/labcontact.js @@ -9,6 +9,9 @@ define(['backbone'], function(Backbone) { required: true, pattern: 'wwsdash', }, + PERSONID: { + required: false, + }, FAMILYNAME: { required: true, pattern: 'wwdash', diff --git a/client/src/js/modules/contact/views/addcontact.js b/client/src/js/modules/contact/views/addcontact.js index 29d7c9f34..45f61414a 100644 --- a/client/src/js/modules/contact/views/addcontact.js +++ b/client/src/js/modules/contact/views/addcontact.js @@ -1,6 +1,7 @@ define(['views/form', 'models/labcontact', 'collections/countries', + 'collections/users', 'templates/contact/contactadd.html', 'jquery', 'backbone', @@ -8,7 +9,7 @@ define(['views/form', 'backbone-validation', ], function(FormView, - Contact, Countries, + Contact, Countries, Users, template, $_, Backbone) { @@ -17,26 +18,68 @@ define(['views/form', ui: { country: 'select[name=COUNTRY]', + pid: 'select[name=PERSONID]', + cn: 'input[name=CARDNAME]', + fn: 'input[name=FAMILYNAME]', + gn: 'input[name=GIVENNAME]', + pn: 'input[name=PHONENUMBER]', + ea: 'input[name=EMAILADDRESS]', + ln: 'input[name=LABNAME]', + ad: 'textarea[name=ADDRESS]', + ci: 'input[name=CITY]', + pc: 'input[name=POSTCODE]', + }, + + events: { + 'change @ui.pid': 'fillUserInfo', + }, + + fillUserInfo: function() { + var u = this.users.findWhere({ PERSONID: this.ui.pid.val() }) + if (u){ + this.ui.cn.val(u.get('FULLNAME')) + this.ui.fn.val(u.get('FAMILYNAME')) + this.ui.gn.val(u.get('GIVENNAME')) + this.ui.pn.val(u.get('PHONENUMBER')) + this.ui.ea.val(u.get('EMAILADDRESS')) + this.ui.ln.val(u.get('LABNAME')) + this.ui.ad.val(u.get('ADDRESS')) + this.ui.ci.val(u.get('CITY')) + this.ui.pc.val(u.get('POSTCODE')) + this.ui.country.val(u.get('COUNTRY')) + } }, initialize: function() { this.countries = new Countries() this.countries.state.pageSize = 9999 - this.ready = this.countries.fetch() + this.users = new Users() + this.users.queryParams.login = 1 }, createModel: function() { this.model = new Contact() }, - + onRender: function() { - $.when(this.ready).done(this.populateCountries.bind(this)) + Promise.all([this.countries.fetch(), this.users.fetch()]).then(() => { + this.populateCountries(); + this.populateUsers(); + }) }, populateCountries: function() { this.ui.country.html(this.countries.opts()) }, + populateUsers: function() { + // only want to display the current user + var u = this.users.findWhere({ PERSONID: app.personid.toString() }) + var opts = '' + opts += '' + this.ui.pid.html(opts) + }, + success: function(model, response, options) { console.log('success from contact add') if (this.getOption('dialog')) { diff --git a/client/src/js/modules/dc/views/grid.js b/client/src/js/modules/dc/views/grid.js index b16b0f11f..3b6489d28 100644 --- a/client/src/js/modules/dc/views/grid.js +++ b/client/src/js/modules/dc/views/grid.js @@ -37,6 +37,8 @@ define(['marionette', bx: '.boxx', by: '.boxy', zoom: 'a.zoom', + warning: '.warning', + warningli: '.warning-li', holder: '.holder h1', }, @@ -68,6 +70,7 @@ define(['marionette', this.gridplot = new GridPlot({ BL: this.model.get('BL'), ID: this.model.get('ID'), NUMIMG: this.model.get('NUMIMG'), parent: this.model, imagestatuses: this.getOption('imagestatuses') }) this.listenTo(this.gridplot, 'current', this.loadImage, this) + this.listenTo(this.gridplot, 'warning', this.loadWarning, this) }, // should be an event @@ -81,11 +84,18 @@ define(['marionette', this.ui.val.text(val) this.ui.img.text(number+1) }, + + loadWarning: function(val) { + console.log('set warning', arguments) + this.ui.warning.text(val) + this.ui.warningli.show() + }, onShow: function() { this.ui.holder.hide() this.ui.zoom.hide() + this.ui.warningli.hide() this.diviewer = new ImageViewer({ model: this.model, embed: true, readyText: 'Click on the grid to load a diffraction image' }) this.ui.di.append(this.diviewer.render().$el) @@ -121,7 +131,7 @@ define(['marionette', this.hasXRC = true } - if (state == 2) { + if (state >= 2) { this.xrc = new GridXRC({ id: this.model.get('ID') }) this.xrc.fetch({ success: this.showXRC.bind(this) @@ -131,7 +141,16 @@ define(['marionette', }, showXRC: function() { - this.ui.holder.prepend('Method: '+this.xrc.get('METHOD')+' - X Pos: '+this.xrc.get('X')+' Y Pos: '+this.xrc.get('Y')) + var xrcs = this.xrc.get('data') + var t = '' + for (var i = 0; i < xrcs.length; i++) { + t += ' - Crystal '+(i+1)+': X Pos '+xrcs[i]['X']+' Y Pos '+xrcs[i]['Y']+' Z Pos '+xrcs[i]['Z'] + } + if (xrcs.length > 0) { + this.ui.holder.prepend('Method: '+xrcs[0]['METHOD']+t) + } else { + this.ui.holder.prepend('Found no diffraction') + } }, onDestroy: function() { @@ -146,4 +165,4 @@ define(['marionette', }) -}) \ No newline at end of file +}) diff --git a/client/src/js/modules/dc/views/gridplot.js b/client/src/js/modules/dc/views/gridplot.js index e03a6bad2..ea9c0acd4 100644 --- a/client/src/js/modules/dc/views/gridplot.js +++ b/client/src/js/modules/dc/views/gridplot.js @@ -25,9 +25,11 @@ define(['jquery', 'marionette', hmt: 'input[name=heatmap]', ty: 'select[name=type]', ty2: 'select[name=type2]', + ty3: 'select[name=type3]', xfm: '.xfm', flu: 'input[name=fluo]', el: 'select[name=element]', + sns: 'a[name=snapshots]', }, events: { @@ -36,6 +38,7 @@ define(['jquery', 'marionette', 'change @ui.ty': 'setType', 'change @ui.ty2': 'loadAttachment', + 'change @ui.ty3': 'loadImage', 'change @ui.hmt': 'setHM', 'change @ui.flu': 'toggleFluo', @@ -97,6 +100,7 @@ define(['jquery', 'marionette', this.offset_h = 0 this.scale = 1 this.current = -1 + this.image_1_width = -1 this.heatmapToggle = false @@ -144,6 +148,28 @@ define(['jquery', 'marionette', } }, + populateImageSelect: function() { + opts = [] + for (let i=1; i<=4; i++) { + if (this.getOption('parent').get('X'+i)) { + opts.push('') + if (i === 1) { + // show button to view image full size + this.ui.sns.append('') + } else { + this.ui.sns.append('') + } + } + } + if (opts.length > 1) { + this.ui.ty3.html(opts).show() + } + }, + + loadImage: function() { + var n = this.ui.ty3.val() + this.snapshot.load(app.apiurl+'/image/id/'+this.getOption('ID')+'/f/1/n/'+n) + }, toggleFluo: function() { if (this.ui.flu.is(':checked')) { @@ -223,6 +249,15 @@ define(['jquery', 'marionette', this.loadAttachment() } } + var xrcstatus = this.grid.get('XRCSTATUS') + var result = this.grid.get('XRAYCENTRINGRESULTID') + if (xrcstatus == 'success' && result == 0) { + this.trigger('warning', 'No diffraction found'); + } else if (xrcstatus == 'failed') { + this.trigger('warning', 'Xray Centring has failed'); + } else if (xrcstatus == 'pending') { + this.trigger('warning', 'Xray Centring analysis pending'); + } }, @@ -242,11 +277,18 @@ define(['jquery', 'marionette', this.hasSnapshot = true this.$el.removeClass('loading') this.draw() + if (this.ui.ty3.val() == 1) { + this.image_1_width = this.snapshot.width + } + var n = this.ui.ty3.val() + this.ui.sns.magnificPopup({ type: 'image', delegate: 'a', gallery: { enabled:true } }) }, onRender: function() { this.ui.xfm.hide() this.ui.ty2.hide() + this.ui.ty3.hide() + this.populateImageSelect() }, @@ -315,6 +357,17 @@ define(['jquery', 'marionette', h *= scalef } + if (this.image_1_width > 0 && this.snapshot.width != this.image_1_width) { + // Image size is different to image 1, so hide PIA results as they would be in the wrong location + this.ui.ty.val(-1) + this.ui.ty2.val('') + this.ui.ty.prop('disabled', true) + this.ui.ty2.prop('disabled', true) + } else { + this.ui.ty.prop('disabled', false) + this.ui.ty2.prop('disabled', false) + } + var cvratio = this.perceivedw / this.perceivedh var snratio = w/h diff --git a/client/src/js/modules/imaging/views/queuecontainer.js b/client/src/js/modules/imaging/views/queuecontainer.js index 8c53dc5eb..e4c6d396d 100644 --- a/client/src/js/modules/imaging/views/queuecontainer.js +++ b/client/src/js/modules/imaging/views/queuecontainer.js @@ -523,6 +523,7 @@ define(['marionette', events: { 'click button.submit': 'queueContainer', 'click a.apply': 'applyPreset', + 'click a.applyall': 'applyPresetAll', 'click a.unqueue': 'unqueueContainer', 'click a.addpage': 'queuePageSamples', 'click a.addall': 'queueAllSamples', @@ -615,25 +616,36 @@ define(['marionette', e.preventDefault() var p = this.plans.findWhere({ DIFFRACTIONPLANID: this.ui.preset.val() }) - if (p) this.applyModel(p) + if (p) this.applyModel(p, true) }, - applyModel: function(p) { - var models = this.qsubsamples.where({ isGridSelected: true }) - _.each(models, function(m) { - if (p.get('EXPERIMENTKIND') !== m.get('EXPERIMENTKIND')) return + applyPresetAll:function(e) { + e.preventDefault() + + var p = this.plans.findWhere({ DIFFRACTIONPLANID: this.ui.preset.val() }) + if (p) this.applyModel(p, false) + }, + + applyModel: function(modelParameter, isLimitedToSelected) { + if (isLimitedToSelected) { + var models = this.qsubsamples.where({ isGridSelected: true }) + } else { + var models = this.qsubsamples.fullCollection.toArray() + } + _.each(models, function(model) { + if (modelParameter.get('EXPERIMENTKIND') !== model.get('EXPERIMENTKIND')) return _.each(['REQUIREDRESOLUTION', 'PREFERREDBEAMSIZEX', 'PREFERREDBEAMSIZEY', 'EXPOSURETIME', 'BOXSIZEX', 'BOXSIZEY', 'AXISSTART', 'AXISRANGE', 'NUMBEROFIMAGES', 'TRANSMISSION', 'ENERGY', 'MONOCHROMATOR'], function(k) { - if (p.get(k) !== null) m.set(k, p.get(k)) + if (modelParameter.get(k) !== null) model.set(k, modelParameter.get(k)) }, this) - m.save() - m.trigger('refresh') + model.save() + model.trigger('refresh') }, this) }, cloneModel: function(m) { console.log('cloning', m) - this.applyModel(m) + this.applyModel(m, true) }, queueContainer: function(e) { diff --git a/client/src/js/modules/types/mx/shipment/views/container-mixin.js b/client/src/js/modules/types/mx/shipment/views/container-mixin.js index df67d5d4e..f622ac683 100644 --- a/client/src/js/modules/types/mx/shipment/views/container-mixin.js +++ b/client/src/js/modules/types/mx/shipment/views/container-mixin.js @@ -318,14 +318,16 @@ export default { // Save the sample to the server via backbone model // Location should be the sample LOCATION async onSaveSample(location) { - try { + if (this.$store.getters.isLoading) { // avoid double click + return + } + try { this.$store.commit('loading', true) const result = await this.$refs.containerForm.validate() - if (result) { await this.saveSample(location) const samplesRef = this.$refs.samples - samplesRef.$refs[`sample-row-${location}`][0].closeSampleEditing() + samplesRef.$refs[`sample-row-${location}`][0].closeSampleEditing() this.$refs.containerForm.reset() } else { diff --git a/client/src/js/modules/types/mx/shipment/views/mx-container-add.vue b/client/src/js/modules/types/mx/shipment/views/mx-container-add.vue index 35e187eb7..ed253119e 100644 --- a/client/src/js/modules/types/mx/shipment/views/mx-container-add.vue +++ b/client/src/js/modules/types/mx/shipment/views/mx-container-add.vue @@ -559,30 +559,7 @@ export default { QUEUEFORUDC: { immediate: true, handler: function(newVal) { - let samples - if (newVal) { - samples = this.samples.map(sample => { - if (!sample.CENTRINGMETHOD) { - sample.CENTRINGMETHOD = 'diffraction' - } - - if (!sample.EXPERIMENTKIND) { - sample.EXPERIMENTKIND = 'Ligand binding' - } - - if (!sample.SCREENINGMETHOD) { - sample.SCREENINGMETHOD = 'none' - } - - return sample - }) - - this.AUTOMATED = 1 - } else { - this.AUTOMATED = '' - } - - this.$store.commit('samples/set', samples) + this.selectQueueForUDC(newVal) } }, SPACEGROUP: { @@ -692,9 +669,13 @@ export default { // On success, reset because we will want to start with a clean slate this.$store.commit('samples/reset') - // Reset container - we may want to add more containers so just reset the name and barcode + // Reset container - we may want to add more containers so reset the name, barcode and registered container this.NAME = '' this.BARCODE = '' + this.CONTAINERREGISTRYID = '' + // Trigger default setting of UDC fields if selected + this.selectQueueForUDC(this.AUTOMATED) + // Reset state of form this.$refs.containerForm.reset() } catch (error) { @@ -706,6 +687,32 @@ export default { window.scrollTo(0,0); } }, + selectQueueForUDC(newVal) { + let samples + if (newVal) { + samples = this.samples.map(sample => { + if (!sample.CENTRINGMETHOD) { + sample.CENTRINGMETHOD = 'diffraction' + } + + if (!sample.EXPERIMENTKIND) { + sample.EXPERIMENTKIND = 'Ligand binding' + } + + if (!sample.SCREENINGMETHOD) { + sample.SCREENINGMETHOD = 'none' + } + + return sample + }) + + this.AUTOMATED = 1 + } else { + this.AUTOMATED = '' + } + + this.$store.commit('samples/set', samples) + }, resetSamples(capacity) { this.$store.commit('samples/reset', capacity) // this.$store.commit('samples/set', { data: this.samples.map((sample => {}))}) diff --git a/client/src/js/templates/contact/contactadd.html b/client/src/js/templates/contact/contactadd.html index ac10a6303..6aee6dc98 100644 --- a/client/src/js/templates/contact/contactadd.html +++ b/client/src/js/templates/contact/contactadd.html @@ -18,6 +18,13 @@

Add New Home Lab Contact

  • Contact Details
  • +
  • + + +
  • +
  • diff --git a/client/src/js/templates/dc/dc_title.html b/client/src/js/templates/dc/dc_title.html index ed306f528..1d6422b1a 100644 --- a/client/src/js/templates/dc/dc_title.html +++ b/client/src/js/templates/dc/dc_title.html @@ -9,7 +9,11 @@ <%-DCCC%> Comment(s) - <%-DCAC%> + <% if (RECIP == "1") { %> + <%-DCAC%> + <% } else { %> + <%-DCAC%> + <% } %> @@ -18,4 +22,4 @@ <% if (ARCHIVED == "1") { %> - <% } %> \ No newline at end of file + <% } %> diff --git a/client/src/js/templates/dc/grid.html b/client/src/js/templates/dc/grid.html index 3ab942094..4232c7392 100644 --- a/client/src/js/templates/dc/grid.html +++ b/client/src/js/templates/dc/grid.html @@ -25,6 +25,7 @@

    Y: Z:
  • +
  • Warning:
  • Enlarge diff --git a/client/src/js/templates/dc/gridplot.html b/client/src/js/templates/dc/gridplot.html index 207dbc6ef..4a8e5e8f1 100644 --- a/client/src/js/templates/dc/gridplot.html +++ b/client/src/js/templates/dc/gridplot.html @@ -1,4 +1,7 @@
    + + +
    - \ No newline at end of file + diff --git a/client/src/js/templates/imaging/queuecontainer.html b/client/src/js/templates/imaging/queuecontainer.html index b3d665d83..26ecbe899 100644 --- a/client/src/js/templates/imaging/queuecontainer.html +++ b/client/src/js/templates/imaging/queuecontainer.html @@ -50,7 +50,9 @@

    Available Samples

    Queued Samples

    -Presets: Apply +Presets: + Apply to Selected + Apply to All