Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
49 commits
Select commit Hold shift + click to select a range
2e5e921
Formatted test and config code and updated test files
droberts-ctrlo Jul 16, 2025
9845bc8
Updated error handler
droberts-ctrlo Dec 2, 2025
fa6a1e0
Updated ts-ignore where this was causing issues with linting and chec…
droberts-ctrlo Dec 2, 2025
320fb28
Added editorconfig and upgraded ESLint to current version
droberts-ctrlo Jul 17, 2025
c80408a
Formatted and changed code with ESLint fixes - functionality has not …
droberts-ctrlo Jul 17, 2025
ab13c5c
Fixed formatting and code where this was broken on merge with current…
droberts-ctrlo Aug 4, 2025
4ce41ca
Created and updated JSDoc and TS typings where necessary
droberts-ctrlo Jul 25, 2025
a1f7480
Updated linting rules, and added comments where required
droberts-ctrlo Jul 29, 2025
f9b3cf5
Updated and removed extra dependencies and exports where not required
droberts-ctrlo Aug 5, 2025
7a9a46d
Updated with changes within current dev
droberts-ctrlo Aug 19, 2025
5f091e7
Upgraded packages and set up new webpack config
droberts-ctrlo Jul 31, 2025
d95dd21
Removed extra unused dependencies
droberts-ctrlo Aug 5, 2025
3cbda18
Updated to new DataTables.net API
droberts-ctrlo Jul 31, 2025
48c7246
Updated dashboard and react components
droberts-ctrlo Aug 5, 2025
b3362e4
Removed extra packages
droberts-ctrlo Aug 5, 2025
3bac84e
Updated dashboard and react components
droberts-ctrlo Aug 5, 2025
9c61d76
Updated code to align with BS5
droberts-ctrlo Sep 19, 2025
c6ffd75
Added searchable select component
droberts-ctrlo Sep 25, 2025
b4f9b3a
Fixed error in more-less
droberts-ctrlo Oct 31, 2025
72ee02b
Update code and tsconfig to omit errors
droberts-ctrlo Dec 12, 2025
6eb802e
Fix error in layouts view
droberts-ctrlo Dec 15, 2025
c8c7803
fix for dev merge
droberts-ctrlo Jun 18, 2026
aac1cd3
Fix erroneous changes
droberts-ctrlo Jun 18, 2026
dccb21d
Update cypress to fix failing tests
droberts-ctrlo Jun 18, 2026
b4d46f0
Update tests.yml
droberts-ctrlo Jun 19, 2026
7cc5bd9
Add checks for deprecation and apply fixes where possible
droberts-ctrlo Jun 23, 2026
efa2424
Clean up code
droberts-ctrlo Jun 23, 2026
d01c58f
Fix test to only skip erroring sections rather than the whole test
droberts-ctrlo Jun 23, 2026
b70942f
Fix typo in markdown component
droberts-ctrlo Jun 23, 2026
9447ad2
Use variables where possible rather than hex colours
droberts-ctrlo Jun 23, 2026
f65a2c8
Fix header on topics field
droberts-ctrlo Jul 1, 2026
e8c98d8
Fix helptext for code not displaying correctly
droberts-ctrlo Jul 1, 2026
abbfd13
Fix invalid header on field selection
droberts-ctrlo Jul 1, 2026
ca35e56
Update lists to provide gap between
droberts-ctrlo Jul 1, 2026
fd89f7a
Add correct data-bs-* attributes where they were missed
droberts-ctrlo Jul 1, 2026
1815205
Fix autosave colour issue
droberts-ctrlo Jul 2, 2026
1d2472c
Upgrade packages
droberts-ctrlo Jul 3, 2026
ad5c3e7
Update dependencies and modify tests
droberts-ctrlo Jul 13, 2026
3d7dcc4
Fix cypress to work with newer browser versions
droberts-ctrlo Jun 19, 2026
5d90709
Update webpack file to silence deprecations we have no control over
droberts-ctrlo May 27, 2026
12ed28d
Update tests to run async calls as shown in documentation
droberts-ctrlo Jul 16, 2026
155b5f8
General clean up of test files and ensure that code is correct
droberts-ctrlo Jul 16, 2026
ca5339b
Remove bootstrap-icons
droberts-ctrlo Jul 29, 2026
9208316
Update files as per review
droberts-ctrlo Jul 29, 2026
a420b27
Update file where review item was missed
droberts-ctrlo Jul 29, 2026
a8e7565
Update view to encode title correctly
droberts-ctrlo Jul 29, 2026
e0efbb0
Minor versions upgrade
droberts-ctrlo Jul 29, 2026
5d6fe1e
Fix error in test
droberts-ctrlo Jul 29, 2026
60edebc
Update minor versions
droberts-ctrlo Jul 29, 2026
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
4 changes: 3 additions & 1 deletion .github/workflows/install.sh
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
#!/bin/bash

set -e

apt-get update
apt-get install -y curl gpg
curl -o- https://debian.ctrlo.com/repos/apt/debian/whatever.gpg.key | gpg --dearmor -o /usr/share/keyrings/ctrlo-keyring.gpg
Expand All @@ -18,4 +20,4 @@ apt-get install -y libmoox-types-mooselike-datetime-perl libdatetime-format-date
apt-get install -y libfile-slurp-perl libfile-mimeinfo-perl liblist-compare-perl libnet-oauth2-authorizationserver-perl libfontconfig1
apt-get install -y libctrlo-pdf-perl libpdf-builder-perl fonts-liberation libdate-holidays-gb-perl libcgi-deurl-xs-perl libfile-bom-perl
apt-get install -y libdatetime-format-iso8601-perl liblog-log4perl-perl libwww-mechanize-chrome-perl chromium libfile-libmagic-perl libnet-saml2-perl
apt-get install -y liburl-encode-perl libtext-markdown-perl libtest-tempdir-tiny-perl libtest-mocktime-perl
apt-get install -y liburl-encode-perl libtext-markdown-perl libtest-tempdir-tiny-perl libtest-mocktime-perl libdancer2-plugin-logreport-perl
1 change: 1 addition & 0 deletions .github/workflows/tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,7 @@ jobs:
browser:
- name: 'chrome'
os: 'ubuntu-22.04'
node_version: 24.x

services:
postgres:
Expand Down
1 change: 1 addition & 0 deletions cypress.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,5 +6,6 @@ export default defineConfig({
setupNodeEvents(on, config) {
// implement node event listeners here
},
allowCypressEnv: false
},
});
76 changes: 44 additions & 32 deletions cypress/e2e/functionality/02-homepage.cy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,7 @@ import { goodPassword, goodUser } from "../../support/constants";
describe('Dashboard Tests', () => {
const bigLipsum = `Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque accumsan, sem et vulputate imperdiet, enim ipsum rhoncus massa, sit amet pellentesque lacus urna sit amet enim. In tristique mollis tincidunt. Sed eget ligula metus. Integer sodales placerat erat. Aliquam erat volutpat. Curabitur varius lacinia diam fringilla efficitur. Sed euismod purus vel turpis molestie, ac fringilla nisi vestibulum. Maecenas ullamcorper ornare dui sodales gravida. Donec maximus egestas eleifend. Etiam in ultrices ante. Duis quis volutpat turpis. Nulla dignissim ornare aliquet.
Fusce interdum gravida est, sit amet vehicula nisi suscipit at. Pellentesque nec fermentum leo, in vehicula nulla. Nam dapibus ultricies tortor in maximus. Donec enim velit, molestie nec feugiat sed, posuere non ex. Nulla pellentesque gravida feugiat. Sed ornare purus vel libero semper aliquet. Nulla rutrum nunc sed vulputate gravida. Cras lobortis, lacus non tincidunt suscipit, leo quam vehicula libero, in vehicula diam justo ac est.
Mauris tempus, mi nec sodales semper, metus neque blandit sem, non scelerisque nunc libero eu augue. Cras ornare ut lectus in mattis. Quisque magna elit, efficitur nec dolor sed, semper dictum nunc. Cras ultricies, augue eget interdum aliquam, quam ex blandit sem, nec sollicitudin ex elit non mauris. Fusce dui justo, feugiat id lacus sit amet, pulvinar tristique felis. Etiam rhoncus ex ut congue aliquet. Sed at felis eget neque rhoncus malesuada. Aliquam commodo condimentum massa, sed volutpat nibh congue et. Maecenas blandit massa sed nisl pulvinar, vitae consectetur tortor placerat. Nulla laoreet diam ipsum, sit amet consectetur sem condimentum quis. Nullam et justo sem. Sed et sapien tempus, scelerisque nisl ac, pretium arcu.
Donec quis finibus ante. Nulla et dui posuere, semper elit quis, maximus ipsum. Aliquam ante nulla, pellentesque sed neque sit amet, finibus cursus est. Aliquam sed sollicitudin orci. Nulla malesuada augue lectus, ac tincidunt orci fermentum ac. Nullam pulvinar diam felis, sed condimentum arcu ornare sit amet. Praesent eget lobortis purus. In hac habitasse platea dictumst. Ut lorem nisl, fringilla vitae quam lobortis, vehicula egestas magna. Sed convallis placerat ante quis convallis. Vivamus pharetra quam diam, ut ultricies neque mollis vitae. Morbi augue tellus, feugiat a interdum a, tincidunt vel ante.
Ut diam tortor, hendrerit eget ipsum non, suscipit mattis elit. Pellentesque ut porttitor risus, at pulvinar tortor. Integer eleifend volutpat efficitur. Maecenas massa odio, pharetra eu eleifend eu, volutpat sed dui. Donec efficitur sed risus sit amet imperdiet. Pellentesque nec arcu non nibh congue cursus et a sapien. Phasellus ullamcorper magna nec varius facilisis. Curabitur et tempus est. Nulla tincidunt porttitor mollis. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Aenean vitae pretium felis. Aliquam vehicula et nisl sit amet pharetra. Nulla ac sollicitudin velit. Cras egestas ac sem vitae sollicitudin. Nullam convallis risus id massa vestibulum imperdiet. Cras in enim sit amet ligula placerat eleifend.`
Mauris tempus, mi nec sodales semper, metus neque blandit sem, non scelerisque nunc libero eu augue. Cras ornare ut lectus in mattis. Quisque magna elit, efficitur nec dolor sed, semper dictum nunc. Cras ultricies, augue eget interdum aliquam, quam ex blandit sem, nec sollicitudin ex elit non mauris. Fusce dui justo, feugiat id lacus sit amet, pulvinar tristique felis. Etiam rhoncus ex ut congue aliquet. Sed at felis eget neque rhoncus malesuada. Aliquam commodo condimentum massa, sed volutpat nibh congue et. Maecenas blandit massa sed nisl pulvinar, vitae consectetur tortor placerat. Nulla laoreet diam ipsum, sit amet consectetur sem condimentum quis. Nullam et justo sem. Sed et sapien tempus, scelerisque nisl ac, pretium arcu.`

beforeEach(() => {
cy.loginAndGoTo(goodUser, goodPassword, 'http://localhost:3000/?did=1');
Expand All @@ -21,61 +19,73 @@ Ut diam tortor, hendrerit eget ipsum non, suscipit mattis elit. Pellentesque ut
})

it('Displays the home page correctly', () => {
cy.get("li.list__item").eq(0)
cy.get("a.nav-link").eq(0)
.should("exist")
.contains("Home dashboard (shared)")
.should("have.class", "link--active");
cy.get("li.list__item").eq(1)
.should("have.class", "active")
.contains("Home dashboard (shared)");
cy.get("a.nav-link").eq(1)
.should("exist")
.contains("Home dashboard (personal)")
.should("not.have.class", "link--active");
.should("not.have.class", "active")
.contains("Home dashboard (personal)");
});

it('Should navigate to the personal dashboard', () => {
cy.get("li.list__item").eq(1)
cy.get("a.nav-link").eq(1)
.should("exist")
.should("not.have.class", "link--active")
.should("not.have.class", "active")
.click();
cy.get("a.nav-link").eq(1)
.should("exist")
.should("have.class", "active")
.contains("Home dashboard (personal)");
});

it('Should navigate to the shared dashboard', () => {
cy.get("li.list__item").eq(0)
cy.get("a.nav-link").eq(1)
.click();
cy.get("a.nav-link").eq(0)
.should("exist")
.should("not.have.class", "link--active")
.should("not.have.class", "active")
.click();
cy.get("a.nav-link").eq(0)
.should("exist")
.should("have.class", "active")
.contains("Home dashboard (shared)");
});

context("Shared Dashboard", () => {
it('Should cancel creation of a shared dashboard widget', () => {
cy.wait(1000);
cy.get(".ld-footer-container")
.find("button")
.eq(1)
.click();
cy.get(".ld-footer-container")
.find(".dropdown__menu")
.find(".dropdown-menu.show")
.find("a")
.eq(1)
.eq(0)
.click();
cy.get("[aria-label='Edit Modal']").find("button.btn-cancel").click();
cy.get(".ld-widget").should("have.length", 0);
});

it("Should create a shared dashboard widget", () => {
cy.wait(1000);
cy.get(".ld-footer-container")
.find("button")
.eq(1)
.click();
cy.get(".ld-footer-container")
.find(".dropdown__menu")
.find(".dropdown-menu.show")
.find("a")
.eq(1)
.eq(0)
.click();
cy.get("[aria-label='Edit Modal']")
.find("input[name='title']", { timeout: 10000 })
.should("be.visible");
cy.get("[aria-label='Edit Modal']")
.find(".modal-footer__right")
.find("button.btn-default").click();
.find("button.btn-primary").click();
cy.get(".ld-widget").should("have.length", 1);
cy.get(".ld-widget").find("div").contains("This is a new notice widget - click edit to update the contents");
});
Expand All @@ -90,7 +100,7 @@ Ut diam tortor, hendrerit eget ipsum non, suscipit mattis elit. Pellentesque ut
.type("With a new title");
cy.get("[aria-label='Edit Modal']")
.find(".modal-footer__right")
.find("button.btn-default").click();
.find("button.btn-primary").click();
cy.get(".ld-widget").find("h4").contains("With a new title");
});

Expand All @@ -105,7 +115,7 @@ Ut diam tortor, hendrerit eget ipsum non, suscipit mattis elit. Pellentesque ut
.type(bigLipsum);
cy.get("[aria-label='Edit Modal']")
.find(".modal-footer__right")
.find("button.btn-default").click();
.find("button.btn-primary").click();
});

it("Should delete a shared dashboard widget", () => {
Expand All @@ -120,43 +130,45 @@ Ut diam tortor, hendrerit eget ipsum non, suscipit mattis elit. Pellentesque ut

context("Personal Dashboard", () => {
it('Should cancel creation of a personal dashboard widget', () => {
cy.get("a.link--primary").click();
cy.get("a.nav-link").eq(1).click();
cy.wait(1000);
cy.get(".ld-footer-container")
.find("button")
.eq(1)
.click();
cy.get(".ld-footer-container")
.find(".dropdown__menu")
.find(".dropdown-menu.show")
.find("a")
.eq(1)
.eq(0)
.click();
cy.get("[aria-label='Edit Modal']").find("button.btn-cancel").click();
cy.get(".ld-widget").should("have.length", 1);
});

it("Should create a personal dashboard widget", () => {
cy.get("a.link--primary").click();
cy.get("a.nav-link").eq(1).click();
cy.wait(1000);
cy.get(".ld-footer-container")
.find("button")
.eq(1)
.click();
cy.get(".ld-footer-container")
.find(".dropdown__menu")
.find(".dropdown-menu.show")
.find("a")
.eq(1)
.eq(0)
.click();
cy.get("[aria-label='Edit Modal']")
.find("input[name='title']", { timeout: 10000 })
.should("be.visible");
cy.get("[aria-label='Edit Modal']")
.find(".modal-footer__right")
.find("button.btn-default").click();
.find("button.btn-primary").click();
cy.get(".ld-widget").should("have.length", 2);
cy.get(".ld-widget").eq(1).find("div").contains("This is a new notice widget - click edit to update the contents");
});

it("Should edit a personal dashboard widget", () => {
cy.get("a.link--primary").click();
cy.get("a.nav-link").eq(1).click();
cy.get(".ld-widget").eq(1).find(".ld-edit-button").click();
cy.get("[aria-label='Edit Modal']")
.find("input[name='title']", { timeout: 10000 })
Expand All @@ -166,12 +178,12 @@ Ut diam tortor, hendrerit eget ipsum non, suscipit mattis elit. Pellentesque ut
.type("With a new title");
cy.get("[aria-label='Edit Modal']")
.find(".modal-footer__right")
.find("button.btn-default").click();
.find("button.btn-primary").click();
cy.get(".ld-widget").eq(1).find("h4").contains("With a new title");
});

it("Should edit a personal dashboard widget with a lot of text", () => {
cy.get("a.link--primary").click();
cy.get("a.nav-link").eq(1).click();
cy.get(".ld-widget").eq(1).find(".ld-edit-button").click();
cy.get("[aria-label='Edit Modal']")
.find("input[name='title']", { timeout: 10000 })
Expand All @@ -182,11 +194,11 @@ Ut diam tortor, hendrerit eget ipsum non, suscipit mattis elit. Pellentesque ut
.type(bigLipsum);
cy.get("[aria-label='Edit Modal']")
.find(".modal-footer__right")
.find("button.btn-default").click();
.find("button.btn-primary").click();
});

it("Should delete a personal dashboard widget", () => {
cy.get("a.link--primary").click();
cy.get("a.nav-link").eq(1).click();
cy.get(".ld-widget").eq(1).find(".ld-edit-button").click();
cy.get("[aria-label='Edit Modal']")
.find("input[name='title']", { timeout: 10000 })
Expand Down
8 changes: 4 additions & 4 deletions cypress/e2e/functionality/03-settings.cy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ describe("settings tests", () => {
.find("tr")
.contains("No titles available");
cy.mainHeader()
.find(".btn-default")
.find(".btn-primary")
.should("exist")
.click();
cy.location("pathname").should("include", "/title_add");
Expand Down Expand Up @@ -93,7 +93,7 @@ describe("settings tests", () => {
.find("tr")
.contains("No titles available");
cy.mainHeader()
.find(".btn-default")
.find(".btn-primary")
.should("exist")
.click();
cy.location("pathname").should("include", "/title_add");
Expand Down Expand Up @@ -191,7 +191,7 @@ describe("settings tests", () => {
.find("tr")
.contains("No organisations available");
cy.mainHeader()
.find(".btn-default")
.find(".btn-primary")
.should("exist")
.click();
cy.location("pathname").should("include", "/organisation_add");
Expand Down Expand Up @@ -219,7 +219,7 @@ describe("settings tests", () => {
.find("tr")
.contains("No organisations available");
cy.mainHeader()
.find(".btn-default")
.find(".btn-primary")
.should("exist")
.click();
cy.location("pathname").should("include", "/organisation_add");
Expand Down
4 changes: 2 additions & 2 deletions cypress/e2e/functionality/06-tables-and-wizard.cy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ describe('Another Test Suite', () => {

//attempt save with incorrect (fails)
it.skip('should fail to save new table with invalid shortname ', () => {
cy.get('[data-target="#newTableModal"]').click();
cy.get('[data-bs-target="#newTableModal"]').click();
cy.get('#shortName').type('This value wont $4v£');
cy.get("#name").type("table to fail");
cy.get('.btn-js-next').eq(0).click();
Expand All @@ -19,7 +19,7 @@ describe('Another Test Suite', () => {
});

it('should save a new table successfully', () => {
cy.get('[data-target="#newTableModal"]').click();
cy.get('[data-bs-target="#newTableModal"]').click();
cy.get('#shortName').type('1-test_table');
cy.get("#name").type("1-test-table");
cy.get('.btn-js-next').eq(0).click();
Expand Down
66 changes: 0 additions & 66 deletions cypress/e2e/functionality/08-data-view.cy.ts

This file was deleted.

Loading
Loading