Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

LIMS-1514: Allow sorting of visit list #873

Open
wants to merge 4 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 13 additions & 27 deletions api/src/Page/Proposal.php
Original file line number Diff line number Diff line change
Expand Up @@ -328,10 +328,11 @@ function _get_visits($visit = null, $output = true)

if ($this->has_arg('all')) {
$args = array();
$where = 'WHERE 1=1';
// 'All' is used for the main summary view (Next, Last, Commissioning)
// Ignore session zero for this summary view - they should be included if a proposal is selected
$where .= " AND s.visit_number > 0";
$where = "WHERE s.visit_number > 0";
$select = '';
$join = '';
} else {
if (!$this->has_arg('prop'))
$this->_error('No proposal specified');
Expand All @@ -343,6 +344,9 @@ function _get_visits($visit = null, $output = true)

$args = array($p);
$where = 'WHERE s.proposalid = :1';
$select = 'COUNT(distinct dc.datacollectionid) AS dccount,';
$join = 'LEFT OUTER JOIN datacollectiongroup dcg ON dcg.sessionid = s.sessionid
LEFT OUTER JOIN datacollection dc ON dcg.datacollectiongroupid = dc.datacollectiongroupid';
}

if ($this->has_arg('notnull')) {
Expand Down Expand Up @@ -393,7 +397,8 @@ function _get_visits($visit = null, $output = true)
}

if ($this->has_arg('s')) {
$where .= " AND s.visit_number LIKE :" . (sizeof($args) + 1);
$where .= " AND (s.visit_number LIKE :" . (sizeof($args) + 1) . " OR s.beamlinename LIKE :" . (sizeof($args) + 2) . ")";
array_push($args, $this->arg('s'));
array_push($args, $this->arg('s'));
}

Expand Down Expand Up @@ -435,7 +440,9 @@ function _get_visits($visit = null, $output = true)
$order = 's.startdate DESC';

if ($this->has_arg('sort_by')) {
$cols = array('ST' => 's.startdate', 'EN' => 's.enddate', 'VIS' => 's.visit_number', 'BL' => 's.beamlinename', 'LC' => 's.beamlineoperator', 'COMMENT' => 's.comments');
$cols = array('ST' => 's.startdate', 'EN' => 's.enddate', 'VIS' => 's.visit_number', 'BL' => 's.beamlinename',
'LC' => 's.beamlineoperator', 'COMMENT' => 's.comments', 'ERA' => 's.riskrating',
'SESSIONTYPE' => 'sessiontype', 'DCCOUNT' => 'dccount');
$dir = $this->has_arg('order') ? ($this->arg('order') == 'asc' ? 'ASC' : 'DESC') : 'ASC';
if (array_key_exists($this->arg('sort_by'), $cols))
$order = $cols[$this->arg('sort_by')] . ' ' . $dir;
Expand Down Expand Up @@ -469,42 +476,21 @@ function _get_visits($visit = null, $output = true)
s.beamcalendarid,
CONCAT(p.proposalcode, p.proposalnumber) AS proposal,
COUNT(shp.personid) AS persons,
$select
s.proposalid
FROM BLSession s
INNER JOIN proposal p ON p.proposalid = s.proposalid
LEFT OUTER JOIN sessiontype st ON st.sessionid = s.sessionid
LEFT OUTER JOIN session_has_person shp ON shp.sessionid = s.sessionid
LEFT OUTER JOIN beamlinesetup bls on bls.beamlinesetupid = s.beamlinesetupid
LEFT OUTER JOIN beamcalendar bc ON bc.beamcalendarid = s.beamcalendarid
$join
$where
GROUP BY s.sessionid
ORDER BY $order", $args);

$ids = array();
$wcs = array();
foreach ($rows as $r) {
array_push($ids, $r['SESSIONID']);
array_push($wcs, 'dcg.sessionid=:' . sizeof($ids));
}

$dcs = array();
if (sizeof($ids)) {
$where = implode(' OR ', $wcs);
$tdcs = $this->db->pq("SELECT count(dc.datacollectionid) as c, dcg.sessionid
FROM datacollection dc
INNER JOIN datacollectiongroup dcg ON dcg.datacollectiongroupid = dc.datacollectiongroupid
WHERE $where GROUP BY dcg.sessionid", $ids);
foreach ($tdcs as $t)
$dcs[$t['SESSIONID']] = $t['C'];
}

foreach ($rows as &$r) {
$dc = array_key_exists($r['SESSIONID'], $dcs) ? $dcs[$r['SESSIONID']] : 0;
$r['COMMENT'] = $r['COMMENTS'];
$r['DCCOUNT'] = $dc;

$bl_type = $this->_get_type_from_beamline($r['BL']);

$r['TYPE'] = $bl_type ? $bl_type : 'gen';
}

Expand Down
42 changes: 34 additions & 8 deletions client/src/js/modules/visits/views/visit_list.vue
Original file line number Diff line number Diff line change
Expand Up @@ -16,15 +16,16 @@
<div class="tw-pb-2">
<input data-testid="visit-table-search"
placeholder='Search'
v-on:keyup.enter="fetchData"
v-on:keyup="fetchData"
v-model = "searchVisit"/>
</div>

<table data-testid="visit-table" class="tw-w-full tw-mb-2">
<thead>
<td v-for="(value) in headers" :key="value.id" data-testid="visit-table-headers"
class="tw-w-1/8 tw-bg-table-header-background tw-text-table-header-color tw-font-bold tw-py-2 tw-text-center">
{{value.title}}
class="tw-w-1/8 tw-bg-table-header-background tw-text-table-header-color tw-py-2 tw-text-center">
<button v-if="value.key != 'DEWARS'" class="tw-font-bold" :id="value.order || value.key" @click="headerClick($event)">{{value.title}}</button>
<span v-else class="tw-font-bold">{{value.title}}</span>
</td>
</thead>

Expand Down Expand Up @@ -120,21 +121,25 @@ export default {
visits: [],
dewars: [],
searchVisit : '',
orderBy: '',
order: 1,
headers: [
{
key: "STARTDATE",
title: 'Start'
title: 'Start',
order: 'ST'
},
{
key: "ENDDATE",
title: 'End'
title: 'End',
order: 'EN'
},
{
key: "VIS",
title: 'Number'
},
{
key: "BEAMLINENAME",
key: "BL",
title: 'Beamline'
},
{
Expand All @@ -147,7 +152,8 @@ export default {
},
{
key: "UNIQUELCS",
title: 'Local Contact'
title: 'Local Contact',
order: 'LC'
},
{
key: "COMMENTS",
Expand Down Expand Up @@ -178,6 +184,7 @@ export default {
window.location.href = '/proposals/';
}
this.fetchData()
this.fetchData = _.debounce(this.fetchData, 500)
},
methods: {
async fetchData() {
Expand All @@ -188,8 +195,18 @@ export default {
page: this.currentPage,
per_page: this.pageSize,
prop: this.proposal,
s: this.searchVisit,
order: 'order',
directions: {
'-1': 'asc',
'1': 'desc',
},
};
this.visitCollection.state = {
sortKey: 'sort_by',
order: this.order,
};
if (this.searchVisit) this.visitCollection.queryParams.s = this.searchVisit;
if (this.orderBy) this.visitCollection.queryParams.sort_by = this.orderBy;

const results = await this.$store.dispatch('getCollection', this.visitCollection);
this.visits = results.toJSON().map((e) => {
Expand Down Expand Up @@ -259,6 +276,15 @@ export default {
window.location.href = 'dc/visit/' + this.proposal + '-' + visit.VIS;
}
},
headerClick(event) {
if (this.orderBy === event.target.id) {
this.order = -this.order;
} else {
this.order = 1;
}
this.orderBy = event.target.id;
this.fetchData();
},
handleFocusOut(visit) {
// if click outside of active input box then input returns to text
if(visit.clicked) {
Expand Down
Loading