Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
119 commits
Select commit Hold shift + click to select a range
25f95a6
Revert "Measurement dialog"
ivopisarovic Aug 14, 2025
1f10b4d
Revert "Measurements frontend"
ivopisarovic Aug 14, 2025
29d92a1
Revert "Frontend demo"
ivopisarovic Aug 14, 2025
24f33b9
get users methods, get information about user
Magdiis Aug 16, 2025
1f3c837
fetching users form backend
Magdiis Aug 16, 2025
0c5c9c5
added comments. Member can be changed in card
Magdiis Aug 16, 2025
da75116
added card timer
Magdiis Aug 16, 2025
1bcda38
filtering cards
Magdiis Aug 16, 2025
fcf0b46
charts in summary
Magdiis Aug 16, 2025
d711615
eslint code refactor
Magdiis Aug 16, 2025
4a5ffd1
change list name
Magdiis Aug 16, 2025
2303a22
Creating new component board-lists. Remove component files.
Magdiis Aug 16, 2025
41ddebe
delete column in board
Magdiis Aug 18, 2025
9ac23fe
bugfix: card cannot open
Magdiis Aug 18, 2025
42783e3
vuetify update
Magdiis Aug 18, 2025
fd625a2
created TimePicker and DatePicker components.
Magdiis Aug 18, 2025
1d1967e
time record form UI
Magdiis Aug 18, 2025
2b8b80f
Delete time record from table
Magdiis Aug 19, 2025
4530e27
close time picker after selecting time
Magdiis Aug 19, 2025
cc3c7f2
bugFix: max and min time if the start and end days are same
Magdiis Aug 19, 2025
2d65506
save time record function
Magdiis Aug 19, 2025
2a45138
if user select one of the day and the other is empty, the other day i…
Magdiis Aug 19, 2025
b1ca3df
bugFix: user can update minutes
Magdiis Aug 19, 2025
8b5c6ba
bugfix: update timer after adding/removing from time records
Magdiis Aug 19, 2025
9120393
Merge branch 'xklimeso/manual_create_time_record' into 'dev'
Aug 25, 2025
d1dd241
Measurements page
Aug 25, 2025
6f1b8da
Revert "Measurements page"
Aug 25, 2025
dccfbea
Measurement form component
Aug 25, 2025
98d2207
measurement.ts store
Aug 25, 2025
5e7d129
Measurements page
Aug 25, 2025
5ff235f
Time fix
Aug 26, 2025
1864461
BoardListContent - undefined projects, watch import, safe initials an…
Aug 26, 2025
5b0d16a
Reservations
Aug 26, 2025
cb761a2
Reservations: page + detail karticky + views: tydenni/denni/rezervace
Aug 31, 2025
38a94b7
Reservations - detail card
Aug 31, 2025
d659e7a
Measurements - template generator
Aug 31, 2025
eaf0a4f
Revert "Measurements - template generator"
Sep 1, 2025
60031c1
Revert "Reservations - detail card"
Sep 1, 2025
febf7d8
Revert "Reservations: page + detail karticky + views: tydenni/denni/r…
Sep 1, 2025
9bb103b
Reservations page
Sep 1, 2025
ddf50c8
Google calendar like design on Reservations
Sep 1, 2025
bf715dc
Reservations - demo drag and drop event
Sep 2, 2025
50b24fa
smoother drag and drop and click on detail
Sep 2, 2025
18c6dca
add localStorage persistence of calendar state
Sep 8, 2025
1722a97
code cleanup + unified time helpers + improved layout & DnD UX
Sep 8, 2025
02dcce3
fix(project-members): add explicit typing for projectMembers to resol…
Sep 8, 2025
b9cff42
unify full edit into single PATCH (title, time, device, owner, note)
Sep 8, 2025
46a7c1f
unify full edit into single PATCH (title, time, device, owner, note)
Sep 8, 2025
1c9c5e7
split into components
Sep 18, 2025
08de958
Revert "split into components"
Sep 18, 2025
433d736
Measurements - revert
Sep 18, 2025
2980a3a
bugfix: fixing the slight difference of the time (calendar)
Sep 18, 2025
2e3be7b
Daily list view component
Oct 1, 2025
ced34d6
Reservations components for each view
Oct 1, 2025
a2aeca0
Dialog components and left navigation bar update
Oct 1, 2025
f46127b
Scroll behaviour component fix
Oct 1, 2025
bbd5337
Scroll behaviour fix
Oct 1, 2025
b9f4ba2
edit dialog component
Oct 1, 2025
77938b1
split into components, logic fixes for scroll inside calendar and uni…
Oct 5, 2025
783f877
type ref unused removal
Oct 5, 2025
b7665d6
deleting template logic update
Oct 5, 2025
a178ba4
universal parser demo, multi-block import & preview + ui for mapping +
Nov 15, 2025
1ec87b8
universal parser phase 2 - types, auto detecting headers plus fallbac…
Nov 16, 2025
55bd531
parser refining
Nov 16, 2025
718adc9
cleaning code
Nov 16, 2025
bcc26a6
parser p.3 - wizard, picking, delimeter, more accurate headers
Nov 17, 2025
f9f7765
import template wizard & picked blocks editor
Nov 17, 2025
09607ee
components for parsing .csv support
Nov 17, 2025
d99f3e0
templates overview dialog altering after new parsing methods
Nov 17, 2025
02174e0
Vizualizace + design statistik, detail new design demo
Nov 19, 2025
8d385fc
Design of chart panel, toggles for mean, hover and grid, basic statis…
Nov 20, 2025
5106ac7
fe store + helpers for new multiseries support
Nov 21, 2025
0de6897
multi-series chart panel
Nov 21, 2025
97350e4
new MeasurementCreateDialog supporting multiseries
Nov 21, 2025
7bc8959
chart panel fix
Nov 21, 2025
04446a8
MeasurementDetailDialog lint cleanup (remove unused imports, computed)
Nov 21, 2025
b58e80d
eslint cleanup
Nov 22, 2025
e8f9ad1
new template formulars integrated into templates overview editing
Nov 22, 2025
0f30916
scatterpoint + scatterseries for multi-record comparison
Nov 22, 2025
a623aa0
Revert "scatterpoint + scatterseries for multi-record comparison"
Nov 22, 2025
9b34772
scatterpoint + scatterseries for multi-record comparison"
Nov 22, 2025
decd4c2
lbocks for each record integration, new device
Nov 29, 2025
55556f4
support parsing and import
Dec 1, 2025
939d92d
chart panel histogram - variable visibility
Dec 1, 2025
ccd8a21
Revert "chart panel histogram - variable visibility"
Dec 1, 2025
d2b2fc1
input logic 1.0
Dec 2, 2025
d9c7a27
wizard and create measurement importing design 1.0
Dec 2, 2025
9e43955
copying reservations with drag+hold ctrl
Dec 4, 2025
0347b4e
confirming of a color
Dec 4, 2025
e4804a4
automatic search without the need of reloading
Dec 4, 2025
9680afc
device create dialog, edit dialog
Dec 4, 2025
0480e28
reservation resizing (time interval change)
Dec 9, 2025
8223fe0
device dialogs
Jan 14, 2026
ab5155e
statistics and visualizer
Jan 14, 2026
17cd2b9
importing logic
Jan 14, 2026
14af390
ui components and composables
Jan 14, 2026
db909e4
measurement import component parts and logic
Jan 14, 2026
ff27317
import tests and helpers
Jan 14, 2026
5a111b4
reducing to components
Jan 15, 2026
c6c4af2
file upload, measurement parts
Jan 15, 2026
162a99b
measuerement
Jan 15, 2026
2669d8d
measurement template bug fix
Jan 16, 2026
b888bbe
comments on measurement, import func
Jan 16, 2026
5987db0
styling
Jan 16, 2026
f77d6d0
styling
Jan 16, 2026
218609b
collisions bug fix 1.0
Jan 16, 2026
a1e7433
reservation series fix, editing bug
Jan 16, 2026
e438217
log/lin regressions
Jan 17, 2026
1c7641a
es lint fixes
Jan 19, 2026
66dc656
es lint fixes
Jan 20, 2026
a70387c
es lint fixes
Jan 20, 2026
2bb4e69
es lint fixes
Jan 20, 2026
bb9761f
Revert "es lint fixes"
Jan 22, 2026
06baf78
Revert fix
Jan 22, 2026
38ace9e
code cleanup
Jan 22, 2026
f8fb699
refactor: unify measurements and reservations components
Jan 24, 2026
3d61b42
Merge branch 'reservations' into xnazarja/measurements
Feb 18, 2026
bf63ada
docs: add professional README with project overview, architecture, an…
Mar 31, 2026
79cb11d
docs: add live Canva presentation link to README
Apr 1, 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
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -21,3 +21,4 @@ pnpm-debug.log*
*.njsproj
*.sln
*.sw?
.agent/*.md
248 changes: 198 additions & 50 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,81 +1,229 @@
# Vuetify (Default)
<p align="center">
<img src="docs/images/banner.png" alt="LIM — Laboratory Information Management System" width="100%"/>
</p>

<h1 align="center">🔬 LIM — Laboratory Information Management</h1>

<p align="center">
<strong>A modern web-based system for managing laboratory measurements, device reservations, and research data — built as a Master's thesis project.</strong>
</p>

<p align="center">
<img src="https://img.shields.io/badge/Vue.js-3.4-4FC08D?logo=vuedotjs&logoColor=white" alt="Vue 3" />
<img src="https://img.shields.io/badge/TypeScript-5.6-3178C6?logo=typescript&logoColor=white" alt="TypeScript" />
<img src="https://img.shields.io/badge/Vuetify-3.9-1867C0?logo=vuetify&logoColor=white" alt="Vuetify" />
<img src="https://img.shields.io/badge/Vite-5.4-646CFF?logo=vite&logoColor=white" alt="Vite" />
<img src="https://img.shields.io/badge/Pinia-2.1-FFD859?logo=pinia&logoColor=black" alt="Pinia" />
<img src="https://img.shields.io/badge/Keycloak-26-4D4D4D?logo=keycloak&logoColor=white" alt="Keycloak" />
<img src="https://img.shields.io/badge/Docker-Ready-2496ED?logo=docker&logoColor=white" alt="Docker" />
</p>

---

## 📋 About

**LIM** (Laboratory Information Management) is a full-featured web administration frontend developed as part of a Master's thesis at [Mendel University in Brno](https://mendelu.cz). It provides researchers and lab staff with a unified platform to:

- 📊 **Record & visualize measurements** with advanced charting and statistical analysis
- 📅 **Reserve laboratory devices** via a rich calendar system with conflict detection
- 🔬 **Manage research projects** with Kanban boards and team collaboration
- 📤 **Publish datasets to Zenodo** for open-access research data sharing
- 📥 **Import data** from CSV/Excel with smart template-based column mapping

> 🎓 **Thesis context:** This application serves the agricultural research center [CeNAgriVeT](https://cenagrivet.mendelu.cz/) at Mendel University, streamlining how researchers handle experimental data and shared lab equipment.

---

## ✨ Key Features

### 📊 Measurements & Data Analysis
- Create structured measurements from customizable templates (text, number, boolean, date, select, rating fields)
- Interactive **Chart.js** visualizations with logarithmic/linear scale switching
- **Linear & logarithmic regression** analysis with R² statistics
- Side-by-side measurement comparison
- CSV/Excel import with intelligent header mapping wizard
- Full-text search, filtering, and sorting

### 📅 Device Reservation System
- **Week / Day / Month** calendar views
- **Recurring events** (daily, weekly, monthly, yearly with custom rules)
- Real-time **conflict detection** across overlapping reservations
- Color-coded event cards per device
- Reservation editing with series scope handling (single / this & future / all)
- Machine-grouped daily view for lab managers

### 🗂️ Project Management
- Multi-project workspace with role-based access
- **Kanban board** with drag-and-drop task management and filtering
- Project summary dashboard
- Team member assignment

### 📤 Zenodo Integration
- Publish measurement datasets directly to [Zenodo](https://zenodo.org/) open-access repository
- DOI generation for citable research data
- Metadata editing (creators, keywords, license, communities)
- Sandbox mode for testing before real publication

### 🔬 Device Management
- Full CRUD for laboratory devices with detailed specs
- Device-measurement linking
- Device selection in reservations with capacity tracking

### 📥 Smart Data Import
- Template-based import wizard with visual column mapping
- CSV and Excel file support via **PapaParse** and **SheetJS**
- Block selection for partial imports
- Repeat-set controls for batch data entry

---

## 🏗️ Architecture

This is the official scaffolding tool for Vuetify, designed to give you a head start in building your new Vuetify application. It sets up a base template with all the necessary configurations and standard directory structure, enabling you to begin development without the hassle of setting up the project from scratch.
```
src/
├── components/ # Reusable Vue components
│ ├── board/ # Kanban board (lists, cards, filters)
│ ├── chart/ # Chart visualization & regression
│ ├── device/ # Device CRUD dialogs
│ ├── editor/ # Rich text editor (Markdown)
│ ├── import/ # Data import wizard
│ ├── measurement/ # Measurement CRUD, compare, export
│ ├── reservations/ # Calendar views & reservation editor
│ └── ui/ # Shared UI primitives
├── composables/ # Vue composables (reusable logic)
├── layouts/ # Page layout templates
├── models/ # TypeScript data models
├── pages/ # Route-level page components
├── plugins/ # Vuetify & app plugins
├── router/ # Vue Router config with auth guards
├── services/ # API layer & Zenodo integration
├── stores/ # Pinia state management
├── types/ # TypeScript type definitions
├── utils/ # Helper utilities
├── views/ # View-specific logic
└── workers/ # Web Workers for heavy parsing
```

## ❗️ Important Links
---

- 📄 [Docs](https://vuetifyjs.com/)
- 🚨 [Issues](https://issues.vuetifyjs.com/)
- 🏬 [Store](https://store.vuetifyjs.com/)
- 🎮 [Playground](https://play.vuetifyjs.com/)
- 💬 [Discord](https://community.vuetifyjs.com)
## 🧰 Tech Stack

## 💿 Install
| Layer | Technology |
|-------|-----------|
| **Framework** | [Vue 3](https://vuejs.org/) (Composition API) |
| **Language** | [TypeScript 5.6](https://www.typescriptlang.org/) |
| **UI Library** | [Vuetify 3](https://vuetifyjs.com/) + Material Design Icons |
| **State** | [Pinia](https://pinia.vuejs.org/) |
| **Routing** | [Vue Router 4](https://router.vuejs.org/) (auto-generated routes) |
| **Build** | [Vite 5](https://vitejs.dev/) |
| **Charts** | [Chart.js 4](https://www.chartjs.org/) |
| **Drag & Drop** | [vue-draggable-next](https://github.com/anish2690/vue-draggable-next) |
| **Statistics** | [simple-statistics](https://simplestatistics.org/) |
| **PDF Export** | [jsPDF](https://github.com/parallax/jsPDF) + jspdf-autotable |
| **Data Import** | [PapaParse](https://www.papaparse.com/) (CSV) + [SheetJS](https://sheetjs.com/) (Excel) |
| **Rich Text** | [md-editor-v3](https://github.com/imzbf/md-editor-v3) |
| **Auth** | [Keycloak JS](https://www.keycloak.org/) (SSO / OAuth 2.0) |
| **Testing** | [Vitest](https://vitest.dev/) + [Vue Test Utils](https://test-utils.vuejs.org/) |
| **Deploy** | Docker + Docker Compose + Traefik |

Set up your project using your preferred package manager. Use the corresponding command to install the dependencies:
---

| Package Manager | Command |
|---------------------------------------------------------------|----------------|
| [yarn](https://yarnpkg.com/getting-started) | `yarn install` |
| [npm](https://docs.npmjs.com/cli/v7/commands/npm-install) | `npm install` |
| [pnpm](https://pnpm.io/installation) | `pnpm install` |
| [bun](https://bun.sh/#getting-started) | `bun install` |
## 🚀 Getting Started

After completing the installation, your environment is ready for Vuetify development.
### Prerequisites

## ✨ Features
- **Node.js** ≥ 18
- **npm** (comes with Node.js)
- A running backend API (Java-based)
- A [Keycloak](https://www.keycloak.org/) instance for authentication

- 🖼️ **Optimized Front-End Stack**: Leverage the latest Vue 3 and Vuetify 3 for a modern, reactive UI development experience. [Vue 3](https://v3.vuejs.org/) | [Vuetify 3](https://vuetifyjs.com/en/)
- 🗃️ **State Management**: Integrated with [Pinia](https://pinia.vuejs.org/), the intuitive, modular state management solution for Vue.
- 🚦 **Routing and Layouts**: Utilizes Vue Router for SPA navigation and vite-plugin-vue-layouts for organizing Vue file layouts. [Vue Router](https://router.vuejs.org/) | [vite-plugin-vue-layouts](https://github.com/JohnCampionJr/vite-plugin-vue-layouts)
- 💻 **Enhanced Development Experience**: Benefit from TypeScript's static type checking and the ESLint plugin suite for Vue, ensuring code quality and consistency. [TypeScript](https://www.typescriptlang.org/) | [ESLint Plugin Vue](https://eslint.vuejs.org/)
- ⚡ **Next-Gen Tooling**: Powered by Vite, experience fast cold starts and instant HMR (Hot Module Replacement). [Vite](https://vitejs.dev/)
- 🧩 **Automated Component Importing**: Streamline your workflow with unplugin-vue-components, automatically importing components as you use them. [unplugin-vue-components](https://github.com/antfu/unplugin-vue-components)
- 🛠️ **Strongly-Typed Vue**: Use vue-tsc for type-checking your Vue components, and enjoy a robust development experience. [vue-tsc](https://github.com/johnsoncodehk/volar/tree/master/packages/vue-tsc)
### Installation

These features are curated to provide a seamless development experience from setup to deployment, ensuring that your Vuetify application is both powerful and maintainable.
```bash
# Clone the repository
git clone https://github.com/krisssix/lim.git
cd lim

## 💡 Usage
# Install dependencies
npm install

# Configure environment
cp .env-example .env.development.local
```

This section covers how to start the development server and build your project for production.
Edit `.env.development.local` with your backend and auth server URLs:

### Starting the Development Server
```env
VITE_SERVER_URL=http://localhost:8080/api
VITE_AUTH_SERVER_URL=https://your-keycloak-server.com
VITE_AUTH_REALM=your-realm
```

To start the development server with hot-reload, run the following command. The server will be accessible at [http://localhost:3000](http://localhost:3000):
### Development

```bash
yarn dev
# Start dev server on http://localhost:3000
npm run dev
```

(Repeat for npm, pnpm, and bun with respective commands.)
### Build for Production

> Add NODE_OPTIONS='--no-warnings' to suppress the JSON import warnings that happen as part of the Vuetify import mapping. If you are on Node [v21.3.0](https://nodejs.org/en/blog/release/v21.3.0) or higher, you can change this to NODE_OPTIONS='--disable-warning=5401'. If you don't mind the warning, you can remove this from your package.json dev script.
```bash
npm run build
```

### Building for Production
### Docker Deployment

To build your project for production, use:
```bash
docker-compose up --build
```

### Testing

```bash
yarn build
# Run tests
npm run test

# Watch mode
npm run test:watch
```

(Repeat for npm, pnpm, and bun with respective commands.)
---

## 📐 Project Structure Highlights

- **Measurement Templates** — Dynamic form generation from JSON schema (text, number, boolean, date, select, rating fields)
- **Reservation Conflict Engine** — Real-time detection of overlapping reservations with conflict resolution dialog
- **Recurring Events** — Full RFC-5545 inspired recurrence rule support (daily, weekly, monthly, yearly with intervals, end dates, and exception handling)
- **Web Workers** — File parsing offloaded to background threads for smooth UI during large CSV/Excel imports
- **Auto-imports** — Components and APIs are auto-imported via `unplugin-vue-components` and `unplugin-auto-import`

---

## 📎 Documentation & Live Demo

> 📑 **A full interactive presentation with live demonstrations** of the system is available online:
>
> ### [🎬 View Live Presentation →](https://nazarjanova.my.canva.site/lims)
>
> The presentation covers system architecture, feature walk-throughs, and real-time demos of measurements, reservations, and data import workflows.

---

## 👤 Author

Once the build process is completed, your application will be ready for deployment in a production environment.
**Kristýna Nazarjanová**
- 🎓 Master's Student — [Mendel University in Brno](https://mendelu.cz)
- 🐙 GitHub: [@krisssix](https://github.com/krisssix)

## 💪 Support Vuetify Development
---

This project is built with [Vuetify](https://vuetifyjs.com/en/), a UI Library with a comprehensive collection of Vue components. Vuetify is an MIT licensed Open Source project that has been made possible due to the generous contributions by our [sponsors and backers](https://vuetifyjs.com/introduction/sponsors-and-backers/). If you are interested in supporting this project, please consider:
## 📝 License

- [Requesting Enterprise Support](https://support.vuetifyjs.com/)
- [Sponsoring John on Github](https://github.com/users/johnleider/sponsorship)
- [Sponsoring Kael on Github](https://github.com/users/kaelwd/sponsorship)
- [Supporting the team on Open Collective](https://opencollective.com/vuetify)
- [Becoming a sponsor on Patreon](https://www.patreon.com/vuetify)
- [Becoming a subscriber on Tidelift](https://tidelift.com/subscription/npm/vuetify)
- [Making a one-time donation with Paypal](https://paypal.me/vuetify)
This project was developed as part of a university thesis. Please contact the author for usage permissions.

## 📑 License
[MIT](http://opensource.org/licenses/MIT)
---

Copyright (c) 2016-present Vuetify, LLC
<p align="center">
<sub>Built with ❤️ using Vue 3 + Vuetify + TypeScript</sub>
</p>
Binary file added docs/images/banner.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading