diff --git a/.gitea/workflows/smart-clinic-lint-docker.yml b/.gitea/workflows/smart-clinic-lint-docker.yml index 668c48a..1be2ee2 100644 --- a/.gitea/workflows/smart-clinic-lint-docker.yml +++ b/.gitea/workflows/smart-clinic-lint-docker.yml @@ -16,6 +16,11 @@ jobs: with: ssh-key: ${{ secrets.SSH_JOHN_PRIVATE_KEY }} - name: Run hadolint - uses: hadolint/hadolint-action@v3.1.0 + uses: hadolint/hadolint-action@v3.3.0 with: - dockerfile: ./SmartClinicManagementSystem/app/Dockerfile \ No newline at end of file + dockerfile: ./SmartClinicManagementSystem/app/Dockerfile + output-file: hadolint.log + - uses: actions/upload-artifact@v4 + with: + name: hadolint.log + path: hadolint.log \ No newline at end of file diff --git a/.gitea/workflows/smart-clinic-lint-frontend.yml b/.gitea/workflows/smart-clinic-lint-frontend.yml index 5deab61..2bf2626 100644 --- a/.gitea/workflows/smart-clinic-lint-frontend.yml +++ b/.gitea/workflows/smart-clinic-lint-frontend.yml @@ -17,10 +17,10 @@ jobs: ssh-key: ${{ secrets.SSH_JOHN_PRIVATE_KEY }} - name: Install linters run: | - npm install -g htmlhint stylelint eslint + npm install -g htmlhint stylelint stylelint-config-standard eslint - name: Lint HTML - run: htmlhint "./SmartClinicManagementSystem/app/src/main/resources/static/assets/pages/*.html" || true + run: htmlhint "./SmartClinicManagementSystem/app/src/main/resources/static/pages//*.html" || true - name: Lint CSS - run: stylelint "./SmartClinicManagementSystem/app/src/main/resources/static/assets/css/*.css" || true + run: stylelint "./SmartClinicManagementSystem/app/src/main/resources/static/assets/css//*.css" || true - name: Lint JS - run: eslint "./SmartClinicManagementSystem/app/src/main/resources/static/js/*.js" || true \ No newline at end of file + run: eslint -c SmartClinicManagementSystem/eslint.config.js "./SmartClinicManagementSystem/app/src/main/resources/static/js//*.js" || true \ No newline at end of file diff --git a/SmartClinicManagementSystem/app/src/main/resources/static/assets/css/addPrescription.css b/SmartClinicManagementSystem/app/src/main/resources/static/assets/css/addPrescription.css index 82d4cfa..27adb29 100644 --- a/SmartClinicManagementSystem/app/src/main/resources/static/assets/css/addPrescription.css +++ b/SmartClinicManagementSystem/app/src/main/resources/static/assets/css/addPrescription.css @@ -7,7 +7,7 @@ margin: 50px auto; padding: 30px; border-radius: 15px; - box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); + box-shadow: 0 4px 12px rgb(0 0 0 / 10%); animation: fadeIn 0.5s ease-in-out; } @@ -41,7 +41,7 @@ font-size: 15px; outline: none; transition: 0.3s; - font-family: "Verdana"; + font-family: Verdana, serif; } input:focus, textarea:focus { @@ -53,6 +53,7 @@ #patientName{ background-color: #bdbcbc80; } + .btn-primary { background-color: #047857; color: #fff; @@ -86,6 +87,13 @@ } @keyframes fadeIn { - from { opacity: 0; transform: translateY(30px); } - to { opacity: 1; transform: translateY(0); } - } + from { + opacity: 0; + transform: translateY(30px); + } + + to { + opacity: 1; + transform: translateY(0); + } + } \ No newline at end of file diff --git a/SmartClinicManagementSystem/app/src/main/resources/static/assets/css/adminDashboard.css b/SmartClinicManagementSystem/app/src/main/resources/static/assets/css/adminDashboard.css index 972f8bc..f8a9ce4 100644 --- a/SmartClinicManagementSystem/app/src/main/resources/static/assets/css/adminDashboard.css +++ b/SmartClinicManagementSystem/app/src/main/resources/static/assets/css/adminDashboard.css @@ -45,7 +45,7 @@ button { font-size: 16px; } -button::hover { +button:hover { background-color: #A62B1F; } @@ -59,6 +59,6 @@ button::hover { cursor: pointer; } -.adminBtn::hover { +.adminBtn:hover { color: #A62B1F; } \ No newline at end of file diff --git a/SmartClinicManagementSystem/app/src/main/resources/static/assets/css/doctorDashboard.css b/SmartClinicManagementSystem/app/src/main/resources/static/assets/css/doctorDashboard.css index f5526e9..7d0c90b 100644 --- a/SmartClinicManagementSystem/app/src/main/resources/static/assets/css/doctorDashboard.css +++ b/SmartClinicManagementSystem/app/src/main/resources/static/assets/css/doctorDashboard.css @@ -59,7 +59,7 @@ tr:nth-child(odd) { background-color: #ffffffc0; } -tr::hover { +tr:hover { background-color: #015c5d39; } @@ -71,11 +71,11 @@ tr::hover { .prescription-btn:hover { transform: scale(1.1); - background-color: lighten(0.1); + filter: brightness(110%); } .prescription-btn:active { - transform: scale(0.95); + transform: scale(0.95); } .noPatientRecord { @@ -93,7 +93,7 @@ tr::hover { .date-picker { margin-left: 10px; margin-top: 13px; - corner-radius: 8px; + border-radius: 8px; padding: 10px; height: 30px; } \ No newline at end of file diff --git a/SmartClinicManagementSystem/app/src/main/resources/static/assets/css/index.css b/SmartClinicManagementSystem/app/src/main/resources/static/assets/css/index.css index afdf13b..f4d3264 100644 --- a/SmartClinicManagementSystem/app/src/main/resources/static/assets/css/index.css +++ b/SmartClinicManagementSystem/app/src/main/resources/static/assets/css/index.css @@ -6,7 +6,7 @@ html, body { height: 100%; - font-family: 'Roboto' sans-serif; + font-family: Roboto, sans-serif; } .wrapper { @@ -19,7 +19,7 @@ h2 { font-size: 48px; margin-bottom: 50px; color: #003e3e; - font-family: 'Alegreya', 'Roboto', sans-serif; + font-family: Alegreya, Roboto, sans-serif; font-weight: bold; } @@ -41,11 +41,11 @@ button { padding: 10px 20px; width: 200px; margin: 10px; - pointer:cursor; + cursor: pointer; font-size: 16px; } -button::hover { +button:hover { background-color: #A62B1F; } @@ -53,7 +53,6 @@ button::hover { background-color: #015c5d; } - -.dashboard-btn::hover { +.dashboard-btn:hover { background: #003e3e; } \ No newline at end of file diff --git a/SmartClinicManagementSystem/app/src/main/resources/static/assets/css/patientDashboard.css b/SmartClinicManagementSystem/app/src/main/resources/static/assets/css/patientDashboard.css index 9504647..fdb3a58 100644 --- a/SmartClinicManagementSystem/app/src/main/resources/static/assets/css/patientDashboard.css +++ b/SmartClinicManagementSystem/app/src/main/resources/static/assets/css/patientDashboard.css @@ -8,6 +8,7 @@ .card-actions:hover{ background-color: #1c3745; } + .ripple-overlay { position: fixed; width: 20px; @@ -34,7 +35,7 @@ padding: 20px; z-index: 10000; transition: bottom 1.5s ease-in; - box-shadow: 0 -5px 10px rgba(0, 0, 0, 0.3); + box-shadow: 0 -5px 10px rgb(0 0 0 / 30%); border-radius: 10px 10px 0 0; text-align: center; } @@ -73,6 +74,7 @@ } + .confirm-booking:hover { filter: brightness(1.2); background-color: #1c3745; diff --git a/SmartClinicManagementSystem/app/src/main/resources/static/assets/css/style.css b/SmartClinicManagementSystem/app/src/main/resources/static/assets/css/style.css index 7cb35c0..d9aa153 100644 --- a/SmartClinicManagementSystem/app/src/main/resources/static/assets/css/style.css +++ b/SmartClinicManagementSystem/app/src/main/resources/static/assets/css/style.css @@ -50,7 +50,7 @@ /* Responsive behavior */ - @media (max-width: 600px) { + @media (width <= 600px) { .header { flex-direction: column; align-items: flex-start; @@ -77,9 +77,11 @@ .doctorHeader{ margin-right: 30px } + .doctorHeader:hover{ color:#A62B1F; } + /* Footer Section */ .footer { background-color: #f4f4f4; @@ -149,7 +151,7 @@ } /* Mobile Responsiveness */ - @media (max-width: 768px) { + @media (width <= 768px) { .footer-container { flex-direction: column; align-items: flex-start; @@ -171,7 +173,7 @@ top: 0; width: 100%; height: 100%; - background-color: rgba(0,0,0,0.6); + background-color: rgb(0 0 0 / 60%); } .modal-content { @@ -229,7 +231,7 @@ .input-field:focus { outline: none; border-color: #015c5d; - box-shadow: 0 0 5px rgba(1, 92, 93, 0.5); + box-shadow: 0 0 5px rgb(1 92 93 / 50%); filter: brightness(1.2); } @@ -255,7 +257,7 @@ width:auto; overflow: hidden; background-color: #fff; - box-shadow: 0 4px 6px rgba(0,0,0,0.1); + box-shadow: 0 4px 6px rgb(0 0 0 / 10%); transition: transform 0.2s ease; } @@ -275,7 +277,7 @@ } .doctor-info p { - margin: 20px 0px; + margin: 20px 0; font-size: 14px; color: #555; } @@ -323,7 +325,7 @@ .searchBar:focus{ outline: none; border-color: #015c5d; - box-shadow: 0 0 5px rgba(1, 92, 93, 0.697); + box-shadow: 0 0 5px rgb(1 92 93 / 69.7%); } .filter-wrapper { @@ -350,7 +352,7 @@ .filter-select:focus { border-color: #015c5d; - box-shadow: 0 0 5px rgba(1, 92, 93, 0.697); + box-shadow: 0 0 5px rgb(1 92 93 / 69.7%); outline: none; } diff --git a/SmartClinicManagementSystem/app/src/main/resources/static/assets/css/updateAppointment.css b/SmartClinicManagementSystem/app/src/main/resources/static/assets/css/updateAppointment.css index c72d99c..29319b5 100644 --- a/SmartClinicManagementSystem/app/src/main/resources/static/assets/css/updateAppointment.css +++ b/SmartClinicManagementSystem/app/src/main/resources/static/assets/css/updateAppointment.css @@ -5,7 +5,7 @@ margin: 10px auto; padding: 30px; border-radius: 15px; - box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); + box-shadow: 0 4px 12px rgb(0 0 0 / 10%); animation: fadeIn 0.5s ease-in-out; } @@ -39,7 +39,7 @@ font-size: 15px; outline: none; transition: 0.3s; - font-family: "Verdana"; + font-family: Verdana, sans-serif; } input:focus, textarea:focus { @@ -51,6 +51,7 @@ #patientName{ background-color: #bdbcbc80; } + .btn-primary { background-color: #047857; color: #fff; @@ -84,6 +85,13 @@ } @keyframes fadeIn { - from { opacity: 0; transform: translateY(30px); } - to { opacity: 1; transform: translateY(0); } - } + from { + opacity: 0; + transform: translateY(30px); + } + + to { + opacity: 1; + transform: translateY(0); + } + } \ No newline at end of file diff --git a/SmartClinicManagementSystem/app/src/main/resources/static/js/addPrescription.js b/SmartClinicManagementSystem/app/src/main/resources/static/js/addPrescription.js index e7bea96..ad28191 100644 --- a/SmartClinicManagementSystem/app/src/main/resources/static/js/addPrescription.js +++ b/SmartClinicManagementSystem/app/src/main/resources/static/js/addPrescription.js @@ -6,14 +6,14 @@ document.addEventListener('DOMContentLoaded', async () => { const medicinesInput = document.getElementById("medicines"); const dosageInput = document.getElementById("dosage"); const notesInput = document.getElementById("notes"); - const heading = document.getElementById("heading") + const heading = document.getElementById("heading"); const urlParams = new URLSearchParams(window.location.search); const appointmentId = urlParams.get("appointmentId"); const mode = urlParams.get("mode"); const token = localStorage.getItem("token"); - const patientName = urlParams.get("patientName") + const patientName = urlParams.get("patientName"); if (heading) { if (mode === "view") { diff --git a/SmartClinicManagementSystem/app/src/main/resources/static/js/adminDashboard.js b/SmartClinicManagementSystem/app/src/main/resources/static/js/adminDashboard.js index 3e64dd3..e6bbc4b 100644 --- a/SmartClinicManagementSystem/app/src/main/resources/static/js/adminDashboard.js +++ b/SmartClinicManagementSystem/app/src/main/resources/static/js/adminDashboard.js @@ -23,7 +23,7 @@ window.adminAddDoctor = async function() { "specialty": document.getElementById("specialization").value, "phone": document.getElementById("doctorPhone").value, "availableTimes": Array.from( document.querySelectorAll('input[name=availability]:checked').values()).map(input => input.value) - } + }; const token = localStorage.getItem("token"); if (token == 'undefined') { @@ -41,4 +41,4 @@ window.adminAddDoctor = async function() { console.error("Registration failed:", error); alert("❌ An error occurred while registering up."); } -} \ No newline at end of file +}; \ No newline at end of file diff --git a/SmartClinicManagementSystem/app/src/main/resources/static/js/loggedPatient.js b/SmartClinicManagementSystem/app/src/main/resources/static/js/loggedPatient.js index 23d5937..1ae0bf8 100644 --- a/SmartClinicManagementSystem/app/src/main/resources/static/js/loggedPatient.js +++ b/SmartClinicManagementSystem/app/src/main/resources/static/js/loggedPatient.js @@ -30,8 +30,8 @@ function loadDoctorCards() { export function showBookingOverlay(e, doctor, patient) { const button = e.target; const rect = button.getBoundingClientRect(); - console.log(patient.name) - console.log(patient) + console.log(patient.name); + console.log(patient); const ripple = document.createElement("div"); ripple.classList.add("ripple-overlay"); ripple.style.left = `${e.clientX}px`; diff --git a/SmartClinicManagementSystem/app/src/main/resources/static/js/patientDashboard.js b/SmartClinicManagementSystem/app/src/main/resources/static/js/patientDashboard.js index bf9e813..28a3685 100644 --- a/SmartClinicManagementSystem/app/src/main/resources/static/js/patientDashboard.js +++ b/SmartClinicManagementSystem/app/src/main/resources/static/js/patientDashboard.js @@ -18,13 +18,13 @@ document.addEventListener("DOMContentLoaded", () => { }); document.addEventListener("DOMContentLoaded", () => { - const loginBtn = document.getElementById("patientLogin") + const loginBtn = document.getElementById("patientLogin"); if (loginBtn) { loginBtn.addEventListener("click", () => { - openModal("patientLogin") - }) + openModal("patientLogin"); + }); } -}) +}); document.getElementById("searchBar").addEventListener("input", filterDoctorsOnChange); document.getElementById("filterTime").addEventListener("change", filterDoctorsOnChange); @@ -40,7 +40,7 @@ function loadDoctorCards() { const card = createDoctorCard(doctor); contentDiv.appendChild(card); }); - }) + }); } @@ -67,7 +67,7 @@ function filterDoctorsOnChange() { contentDiv.innerHTML = "

No doctors found with the given filters.

"; console.log("Nothing"); } - }) + }); } @@ -101,8 +101,8 @@ window.loginPatient = async function () { const data = { email, password - } - console.log("loginPatient :: ", data) + }; + console.log("loginPatient :: ", data); const response = await patientLogin(data); console.log("Status Code:", response.status); console.log("Response OK:", response.ok); @@ -110,7 +110,7 @@ window.loginPatient = async function () { const result = await response.json(); console.log(result); selectRole('loggedPatient'); - localStorage.setItem('token', result.token) + localStorage.setItem('token', result.token); window.location.href = '/pages/loggedPatientDashboard.html'; } else { alert('❌ Invalid credentials!'); @@ -118,8 +118,8 @@ window.loginPatient = async function () { } catch (error) { alert("❌ Failed to Login : ", error); - console.log("Error :: loginPatient :: ", error) + console.log("Error :: loginPatient :: ", error); } -} \ No newline at end of file +}; \ No newline at end of file diff --git a/SmartClinicManagementSystem/app/src/main/resources/static/js/patientRecordServices.js b/SmartClinicManagementSystem/app/src/main/resources/static/js/patientRecordServices.js index abf40b7..021a2f0 100644 --- a/SmartClinicManagementSystem/app/src/main/resources/static/js/patientRecordServices.js +++ b/SmartClinicManagementSystem/app/src/main/resources/static/js/patientRecordServices.js @@ -20,7 +20,7 @@ async function initializePage() { // Filter by both patientId and doctorId const filteredAppointments = appointmentData.filter(app => app.doctorId == doctorId); - console.log(filteredAppointments) + console.log(filteredAppointments); renderAppointments(filteredAppointments); } catch (error) { console.error("Error loading appointments:", error); diff --git a/SmartClinicManagementSystem/app/src/main/resources/static/js/render.js b/SmartClinicManagementSystem/app/src/main/resources/static/js/render.js index 22ebda7..06ac8ba 100644 --- a/SmartClinicManagementSystem/app/src/main/resources/static/js/render.js +++ b/SmartClinicManagementSystem/app/src/main/resources/static/js/render.js @@ -23,7 +23,7 @@ function selectRole(role) { function renderContent() { const role = getRole(); if (!role) { - console.error("No role set!") + console.error("No role set!"); window.location.href = "/"; // if no role, send to role selection page return; } diff --git a/SmartClinicManagementSystem/app/src/main/resources/static/js/updateAppointment.js b/SmartClinicManagementSystem/app/src/main/resources/static/js/updateAppointment.js index 81811d9..c7fd7f5 100644 --- a/SmartClinicManagementSystem/app/src/main/resources/static/js/updateAppointment.js +++ b/SmartClinicManagementSystem/app/src/main/resources/static/js/updateAppointment.js @@ -15,7 +15,7 @@ async function initializePage() { const appointmentDate = urlParams.get("appointmentDate"); const appointmentTime = urlParams.get("appointmentTime"); - console.log(doctorId) + console.log(doctorId); if (!token || !patientId) { alert("Missing session data, redirecting to appointments page."); window.location.href = "/pages/patientAppointments.html"; diff --git a/SmartClinicManagementSystem/eslint.config.js b/SmartClinicManagementSystem/eslint.config.js new file mode 100644 index 0000000..0c53f01 --- /dev/null +++ b/SmartClinicManagementSystem/eslint.config.js @@ -0,0 +1,11 @@ +// eslint.config.js +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + { + rules: { + semi: "error", + "prefer-const": "error", + }, + }, +]); \ No newline at end of file diff --git a/SmartClinicManagementSystem/stylelint.config.mjs b/SmartClinicManagementSystem/stylelint.config.mjs new file mode 100644 index 0000000..2a94948 --- /dev/null +++ b/SmartClinicManagementSystem/stylelint.config.mjs @@ -0,0 +1,10 @@ +/** @type {import('stylelint').Config} */ +export default { + extends: ["stylelint-config-standard"], + rules: { + "selector-class-pattern": null, + "keyframes-name-pattern": null, + "selector-id-pattern": null, + "no-descending-specificity": null + } +}; \ No newline at end of file