From 410ab766f724e660dc21f6196e2a309cfd0a442f Mon Sep 17 00:00:00 2001 From: Mark Williams Date: Wed, 30 Sep 2026 12:23:50 +0100 Subject: [PATCH 1/3] LIMS-2402: Mark proposal as inactive after end date --- api/src/Page/Proposal.php | 4 +++- client/src/js/app/components/navbar.vue | 10 +++++----- client/src/js/app/components/sidebar.vue | 12 ++++++------ client/src/js/app/store/modules/store.proposal.js | 2 +- 4 files changed, 15 insertions(+), 13 deletions(-) diff --git a/api/src/Page/Proposal.php b/api/src/Page/Proposal.php index 47a32bc5d..eedd925cc 100644 --- a/api/src/Page/Proposal.php +++ b/api/src/Page/Proposal.php @@ -214,7 +214,9 @@ function _get_proposals($id = null) $order = $cols[$this->arg('sort_by')] . ' ' . $dir; } - $rows = $this->db->paginate("SELECT CONCAT(p.proposalcode,p.proposalnumber) as proposal, p.title, TO_CHAR(p.bltimestamp, 'DD-MM-YYYY') as st, p.proposalcode, p.proposalnumber, count(distinct s.sessionid) as vcount, p.proposalid, CONCAT(pe.givenname, ' ', pe.familyname) as fullname, pe.personid, p.state, IF(p.state = 'Open', 1, 0) as active, CONCAT(p.proposalcode,p.proposalnumber) as prop, s.beamlinename + $rows = $this->db->paginate("SELECT CONCAT(p.proposalcode,p.proposalnumber) as proposal, p.title, TO_CHAR(p.bltimestamp, 'DD-MM-YYYY') as st, p.proposalcode, p.proposalnumber, count(distinct s.sessionid) as vcount, p.proposalid, CONCAT(pe.givenname, ' ', pe.familyname) as fullname, pe.personid, p.state, + IF(p.state = 'Open' AND (p.endDate IS NULL OR p.endDate >= NOW()), 1, 0) as active, + CONCAT(p.proposalcode,p.proposalnumber) as prop, s.beamlinename FROM proposal p LEFT OUTER JOIN blsession s ON p.proposalid = s.proposalid LEFT OUTER JOIN person pe ON pe.personid = p.personid diff --git a/client/src/js/app/components/navbar.vue b/client/src/js/app/components/navbar.vue index c0ac3dfb5..33f39026c 100644 --- a/client/src/js/app/components/navbar.vue +++ b/client/src/js/app/components/navbar.vue @@ -27,7 +27,7 @@ >

  {{ proposal ? proposal : 'No Proposal' }}

  • -

    This proposal is closed. You cannot create shipments, proteins or contacts.

    +

    This proposal has ended. You cannot create shipments, proteins or contacts.

    Click here for more info.
  • @@ -160,8 +160,8 @@ export default { proposal: function() { return this.$store.getters['proposal/currentProposal'] }, - isProposalClosed: function() { - return this.$store.getters['proposal/currentProposalState'] === 'Closed' + isProposalActive: function() { + return this.$store.getters['proposal/currentProposalActive'] }, isLoggedIn: function() { return this.$store.getters['auth/isLoggedIn'] diff --git a/client/src/js/app/components/sidebar.vue b/client/src/js/app/components/sidebar.vue index 7f6e0ae24..7121b7ef5 100644 --- a/client/src/js/app/components/sidebar.vue +++ b/client/src/js/app/components/sidebar.vue @@ -22,7 +22,7 @@ >

     {{ proposal ? proposal : 'No Proposal' }} -

    This proposal is closed.

    You cannot create shipments, proteins or contacts.

    +

    This proposal has ended.

    You cannot create shipments, proteins or contacts.

    \ No newline at end of file + diff --git a/client/src/js/app/store/modules/store.proposal.js b/client/src/js/app/store/modules/store.proposal.js index 51b1556bb..571792fa4 100644 --- a/client/src/js/app/store/modules/store.proposal.js +++ b/client/src/js/app/store/modules/store.proposal.js @@ -136,7 +136,7 @@ const proposalModule = { return state.proposal }, currentProposalType: state => state.proposalType, - currentProposalState: state => state.proposalModel ? state.proposalModel.get('STATE'): null, + currentProposalActive: state => state.proposalModel ? Number(state.proposalModel.get('ACTIVE')) === 1 : false, getProposalId: state => state.proposalModel ? state.proposalModel.get('PROPOSALID'): null, currentVisit: state => state.visit, currentProposalModel: state => state.proposalModel From 0de8c4e7d6dbfcb4d0e424c1817d10c69571691e Mon Sep 17 00:00:00 2001 From: Mark Williams Date: Wed, 30 Sep 2026 12:48:22 +0100 Subject: [PATCH 2/3] LIMS-2402: Fix tests --- client/tests/unit/js/components/sidebar.spec.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/client/tests/unit/js/components/sidebar.spec.js b/client/tests/unit/js/components/sidebar.spec.js index 5ff8f0718..0709a2c06 100644 --- a/client/tests/unit/js/components/sidebar.spec.js +++ b/client/tests/unit/js/components/sidebar.spec.js @@ -33,20 +33,20 @@ describe("Sidebar", () => { expect(wrapper.vm.isLoggedIn).toBe(false); }); - it("isProposalClosed returns true if proposal is Closed", () => { - localVue.prototype.$store.getters["proposal/currentProposalState"] = "Closed"; + it("isProposalActive returns true if proposal is active", () => { + localVue.prototype.$store.getters["proposal/currentProposalActive"] = "1"; const wrapper = shallowMount(Sidebar, { localVue, }); - expect(wrapper.vm.isProposalClosed).toBe(true); + expect(wrapper.vm.isProposalActive).toBe(true); }); - it("isProposalClosed returns false if proposal is not Closed", () => { - localVue.prototype.$store.getters["proposal/currentProposalState"] = "anything else"; + it("isProposalActive returns false if proposal is not active", () => { + localVue.prototype.$store.getters["proposal/currentProposalActive"] = "0"; const wrapper = shallowMount(Sidebar, { localVue, }); - expect(wrapper.vm.isProposalClosed).toBe(false); + expect(wrapper.vm.isProposalActive).toBe(false); }); it("extras initially empty without proposal", () => { @@ -75,4 +75,4 @@ describe("Sidebar", () => { }); expect(wrapper.vm.extras).toBe(extras); }); -}); \ No newline at end of file +}); From c6ac8add1ea8324c70eb62c5d5ed0f0ac548b3e1 Mon Sep 17 00:00:00 2001 From: Mark Williams Date: Wed, 30 Sep 2026 12:52:54 +0100 Subject: [PATCH 3/3] LIMS-2402: Fix tests --- client/tests/unit/js/components/sidebar.spec.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/tests/unit/js/components/sidebar.spec.js b/client/tests/unit/js/components/sidebar.spec.js index 0709a2c06..7c216c61d 100644 --- a/client/tests/unit/js/components/sidebar.spec.js +++ b/client/tests/unit/js/components/sidebar.spec.js @@ -34,7 +34,7 @@ describe("Sidebar", () => { }); it("isProposalActive returns true if proposal is active", () => { - localVue.prototype.$store.getters["proposal/currentProposalActive"] = "1"; + localVue.prototype.$store.getters["proposal/currentProposalActive"] = true; const wrapper = shallowMount(Sidebar, { localVue, }); @@ -42,7 +42,7 @@ describe("Sidebar", () => { }); it("isProposalActive returns false if proposal is not active", () => { - localVue.prototype.$store.getters["proposal/currentProposalActive"] = "0"; + localVue.prototype.$store.getters["proposal/currentProposalActive"] = false; const wrapper = shallowMount(Sidebar, { localVue, });