feat: add demo seed data, update Makefile, and fix .gitignore
This commit is contained in:
20
.gitignore
vendored
20
.gitignore
vendored
@@ -1,3 +1,23 @@
|
||||
.gemini
|
||||
.worktrees/
|
||||
docs/
|
||||
|
||||
# Node
|
||||
node_modules/
|
||||
dist/
|
||||
.svelte-kit/
|
||||
build/
|
||||
.env*
|
||||
!.env.example
|
||||
|
||||
# Rust
|
||||
target/
|
||||
Cargo.lock
|
||||
debug/
|
||||
release/
|
||||
|
||||
# Databases
|
||||
*.db
|
||||
*.db-journal
|
||||
*.db-shm
|
||||
*.db-wal
|
||||
|
||||
10
GEMINI.md
10
GEMINI.md
@@ -2,6 +2,15 @@
|
||||
|
||||
TutorTool is a full-stack web application for tracking student attendance in tutoring sessions. It features a Rust backend and a SvelteKit frontend.
|
||||
|
||||
<!-- SLM-START -->
|
||||
## SuperLocalMemory (SLM)
|
||||
- **Mandate**: Use SLM for all project-related memories, decisions, and context.
|
||||
- **Workflow**:
|
||||
- **Recall**: At the start of every session or when context is missing, use the `recall` tool with relevant keywords (e.g., `tutortool`, `architecture`).
|
||||
- **Remember**: After implementing features, fixing bugs, or establishing new patterns, use the `remember` tool with appropriate tags.
|
||||
- **Tools**: `remember`, `recall`, `list`, `get_status`.
|
||||
<!-- SLM-END -->
|
||||
|
||||
## Project Overview
|
||||
|
||||
- **Architecture**: Monorepo with a Rust backend (Axum) and a SvelteKit 5 frontend.
|
||||
@@ -13,6 +22,7 @@ TutorTool is a full-stack web application for tracking student attendance in tut
|
||||
- **Frontend**:
|
||||
- **Framework**: SvelteKit 5 using Svelte Runes (`$state`, `$derived`, etc.).
|
||||
- **Build Tool**: Vite.
|
||||
- **Package Manager**: pnpm (preferred over npm).
|
||||
- **Styling**: Vanilla CSS (based on design handoff).
|
||||
- **API**: Centralized fetch wrapper in `src/lib/api.ts`.
|
||||
|
||||
|
||||
10
Makefile
10
Makefile
@@ -1,4 +1,4 @@
|
||||
.PHONY: dev dev-backend dev-frontend build test compose-up
|
||||
.PHONY: dev dev-backend dev-frontend build test compose-up seed-demo
|
||||
|
||||
dev:
|
||||
@echo "Starting backend and frontend in parallel..."
|
||||
@@ -8,10 +8,10 @@ dev-backend:
|
||||
cd backend && cargo run
|
||||
|
||||
dev-frontend:
|
||||
cd frontend && npm run dev
|
||||
cd frontend && pnpm dev
|
||||
|
||||
build:
|
||||
cd frontend && npm run build
|
||||
cd frontend && pnpm build
|
||||
cd backend && cargo build --release
|
||||
|
||||
test:
|
||||
@@ -19,3 +19,7 @@ test:
|
||||
|
||||
compose-up:
|
||||
docker-compose up --build
|
||||
|
||||
seed-demo:
|
||||
@echo "Seeding demo data..."
|
||||
sqlite3 $${DATABASE_URL#sqlite:} < backend/migrations/demo_seed.sql
|
||||
|
||||
2850
backend/Cargo.lock
generated
2850
backend/Cargo.lock
generated
File diff suppressed because it is too large
Load Diff
44
backend/migrations/demo_seed.sql
Normal file
44
backend/migrations/demo_seed.sql
Normal file
@@ -0,0 +1,44 @@
|
||||
-- Demo Seed Data
|
||||
-- Tutor/Admin Account (Password: admin)
|
||||
INSERT OR IGNORE INTO tutors (id, name, email, password_hash)
|
||||
VALUES (1, 'Demo Admin', 'admin@tutortool.com', '$2b$12$ted9u9ZsxbjhnWvTYsijMul138qhIKQG1RVsY8wGA3RFKZl8EaAsm');
|
||||
|
||||
-- Courses
|
||||
INSERT OR IGNORE INTO courses (id, name, semester)
|
||||
VALUES (1, 'Demo Course 101', 'Summer 2026');
|
||||
|
||||
-- Link Tutor to Course
|
||||
INSERT OR IGNORE INTO tutor_courses (tutor_id, course_id)
|
||||
VALUES (1, 1);
|
||||
|
||||
-- Rooms
|
||||
INSERT OR IGNORE INTO rooms (id, name, layout_json)
|
||||
VALUES (1, 'Room A (Small)', '[
|
||||
{"id": "t1", "label": "T1", "x": 100, "y": 100, "width": 120, "height": 60, "type": "table"},
|
||||
{"id": "s1", "label": "1", "x": 110, "y": 110, "width": 40, "height": 40, "type": "seat"},
|
||||
{"id": "s2", "label": "2", "x": 170, "y": 110, "width": 40, "height": 40, "type": "seat"},
|
||||
{"id": "t2", "label": "T2", "x": 300, "y": 100, "width": 120, "height": 60, "type": "table"},
|
||||
{"id": "s3", "label": "3", "x": 310, "y": 110, "width": 40, "height": 40, "type": "seat"},
|
||||
{"id": "s4", "label": "4", "x": 370, "y": 110, "width": 40, "height": 40, "type": "seat"},
|
||||
{"id": "d1", "label": "Door", "x": 10, "y": 10, "width": 60, "height": 10, "type": "door"}
|
||||
]');
|
||||
|
||||
-- Students
|
||||
INSERT OR IGNORE INTO students (id, course_id, name) VALUES (1, 1, 'Alice Smith');
|
||||
INSERT OR IGNORE INTO students (id, course_id, name) VALUES (2, 1, 'Bob Jones');
|
||||
INSERT OR IGNORE INTO students (id, course_id, name) VALUES (3, 1, 'Charlie Brown');
|
||||
INSERT OR IGNORE INTO students (id, course_id, name) VALUES (4, 1, 'David Wilson');
|
||||
INSERT OR IGNORE INTO students (id, course_id, name) VALUES (5, 1, 'Eve Taylor');
|
||||
INSERT OR IGNORE INTO students (id, course_id, name) VALUES (6, 1, 'Frank Miller');
|
||||
INSERT OR IGNORE INTO students (id, course_id, name) VALUES (7, 1, 'Grace Lee');
|
||||
INSERT OR IGNORE INTO students (id, course_id, name) VALUES (8, 1, 'Heidi Davis');
|
||||
INSERT OR IGNORE INTO students (id, course_id, name) VALUES (9, 1, 'Ivan Garcia');
|
||||
INSERT OR IGNORE INTO students (id, course_id, name) VALUES (10, 1, 'Judy Martinez');
|
||||
|
||||
-- Session (Today)
|
||||
INSERT OR IGNORE INTO sessions (id, course_id, week_nr, date)
|
||||
VALUES (1, 1, 1, date('now'));
|
||||
|
||||
-- Slot (Active Demo Slot)
|
||||
INSERT OR IGNORE INTO slots (id, session_id, room_id, tutor_id, start_time, end_time, status, code)
|
||||
VALUES (1, 1, 1, 1, '08:00', '18:00', 'open', 'demo123');
|
||||
39
conductor/demo-plan.md
Normal file
39
conductor/demo-plan.md
Normal file
@@ -0,0 +1,39 @@
|
||||
# Demo Preparation & Seed Data Plan
|
||||
|
||||
## Objective
|
||||
Create an isolated, reproducible demo environment for presenting TutorTool on a Surface Pro 5 (Arch Linux) using Docker. This includes a robust set of seed data to simulate a live application state, which can also be utilized for local end-to-end testing.
|
||||
|
||||
## Key Files & Context
|
||||
- **Environment**: `docker-compose.yml` (existing)
|
||||
- **Database**: SQLite (`data/attendance.db`)
|
||||
- **New Files**:
|
||||
- `backend/migrations/demo_seed.sql`: A standalone SQL script containing isolated test data.
|
||||
- **Modified Files**:
|
||||
- `Makefile`: Update to include a `seed-demo` target for easy execution.
|
||||
|
||||
## Implementation Steps
|
||||
|
||||
### 1. Workspace Isolation via Git Worktree
|
||||
When implementing this plan, the Gemini CLI will automatically utilize its Git worktree feature to spawn a new isolated workspace (e.g., `feature/demo-seed`). This ensures the backend tooling modifications do not interfere with the `frontend-design-overhaul` worktree or the main branch.
|
||||
|
||||
### 2. Create the Seed Data Script (`backend/migrations/demo_seed.sql`)
|
||||
Create a SQL script that safely injects realistic demo data. It will use `INSERT OR IGNORE` or handle conflicts to ensure it can be run cleanly for both demo and testing purposes.
|
||||
- **Admin/Tutor Account**:
|
||||
- Name: "Demo Admin"
|
||||
- Email: `admin@tutortool.com`
|
||||
- Password Hash: A pre-calculated bcrypt hash for the password `admin`.
|
||||
- **Course**: "Demo Course 101" (Semester: "Current").
|
||||
- **Room Layout**: A valid JSON SVG layout representing a small classroom with a few tables and seats.
|
||||
- **Students**: Generate ~10 distinct student names linked to the course.
|
||||
- **Session & Slot**: Create a session for the current date and an "open" slot linked to the demo room, ensuring the check-in feature can be demonstrated immediately without setup.
|
||||
|
||||
### 3. Update Makefile
|
||||
Add a `seed-demo` target to the existing `Makefile`.
|
||||
- The target will execute the SQLite CLI to run `demo_seed.sql` against the local development database defined by the `DATABASE_URL` environment variable (defaulting to `sqlite:./dev.db` for local dev).
|
||||
|
||||
### 4. Demo Run Guide
|
||||
Provide a short set of instructions on how to start the environment using `docker-compose up` and the new seed command on the Surface Pro 5.
|
||||
|
||||
## Verification & Testing
|
||||
- **Execution**: Run `make seed-demo` against a fresh SQLite database to ensure no foreign key or syntax errors occur.
|
||||
- **Authentication**: Verify that logging in with `admin@tutortool.com` / `admin` succeeds against the seeded database.
|
||||
440
frontend/.svelte-kit/ambient.d.ts
vendored
440
frontend/.svelte-kit/ambient.d.ts
vendored
@@ -1,440 +0,0 @@
|
||||
|
||||
// this file is generated — do not edit it
|
||||
|
||||
|
||||
/// <reference types="@sveltejs/kit" />
|
||||
|
||||
/**
|
||||
* This module provides access to environment variables that are injected _statically_ into your bundle at build time and are limited to _private_ access.
|
||||
*
|
||||
* | | Runtime | Build time |
|
||||
* | ------- | -------------------------------------------------------------------------- | ------------------------------------------------------------------------ |
|
||||
* | Private | [`$env/dynamic/private`](https://svelte.dev/docs/kit/$env-dynamic-private) | [`$env/static/private`](https://svelte.dev/docs/kit/$env-static-private) |
|
||||
* | Public | [`$env/dynamic/public`](https://svelte.dev/docs/kit/$env-dynamic-public) | [`$env/static/public`](https://svelte.dev/docs/kit/$env-static-public) |
|
||||
*
|
||||
* Static environment variables are [loaded by Vite](https://vitejs.dev/guide/env-and-mode.html#env-files) from `.env` files and `process.env` at build time and then statically injected into your bundle at build time, enabling optimisations like dead code elimination.
|
||||
*
|
||||
* **_Private_ access:**
|
||||
*
|
||||
* - This module cannot be imported into client-side code
|
||||
* - This module only includes variables that _do not_ begin with [`config.kit.env.publicPrefix`](https://svelte.dev/docs/kit/configuration#env) _and do_ start with [`config.kit.env.privatePrefix`](https://svelte.dev/docs/kit/configuration#env) (if configured)
|
||||
*
|
||||
* For example, given the following build time environment:
|
||||
*
|
||||
* ```env
|
||||
* ENVIRONMENT=production
|
||||
* PUBLIC_BASE_URL=http://site.com
|
||||
* ```
|
||||
*
|
||||
* With the default `publicPrefix` and `privatePrefix`:
|
||||
*
|
||||
* ```ts
|
||||
* import { ENVIRONMENT, PUBLIC_BASE_URL } from '$env/static/private';
|
||||
*
|
||||
* console.log(ENVIRONMENT); // => "production"
|
||||
* console.log(PUBLIC_BASE_URL); // => throws error during build
|
||||
* ```
|
||||
*
|
||||
* The above values will be the same _even if_ different values for `ENVIRONMENT` or `PUBLIC_BASE_URL` are set at runtime, as they are statically replaced in your code with their build time values.
|
||||
*/
|
||||
declare module '$env/static/private' {
|
||||
export const SHELL: string;
|
||||
export const npm_command: string;
|
||||
export const UV_CACHE_DIR: string;
|
||||
export const npm_config_userconfig: string;
|
||||
export const COLORTERM: string;
|
||||
export const HYPRLAND_CMD: string;
|
||||
export const XDG_CONFIG_DIRS: string;
|
||||
export const npm_config_cache: string;
|
||||
export const LESS: string;
|
||||
export const GREP_COLOR: string;
|
||||
export const XDG_MENU_PREFIX: string;
|
||||
export const XDG_BACKEND: string;
|
||||
export const CLUTTER_BACKEND: string;
|
||||
export const QT_WAYLAND_DISABLE_WINDOWDECORATION: string;
|
||||
export const NODE: string;
|
||||
export const SCIKIT_LEARN_DATA: string;
|
||||
export const LC_ADDRESS: string;
|
||||
export const SSH_AUTH_SOCK: string;
|
||||
export const XDG_DATA_HOME: string;
|
||||
export const XDG_CONFIG_HOME: string;
|
||||
export const MEMORY_PRESSURE_WRITE: string;
|
||||
export const COLOR: string;
|
||||
export const npm_config_local_prefix: string;
|
||||
export const DIFFPROG: string;
|
||||
export const LC_MONETARY: string;
|
||||
export const SSH_AGENT_PID: string;
|
||||
export const ELECTRON_OZONE_PLATFORM_HINT: string;
|
||||
export const HL_INITIAL_WORKSPACE_TOKEN: string;
|
||||
export const KITTY_PID: string;
|
||||
export const GREP_COLORS: string;
|
||||
export const npm_config_globalconfig: string;
|
||||
export const XCURSOR_SIZE: string;
|
||||
export const EDITOR: string;
|
||||
export const XDG_SEAT: string;
|
||||
export const PWD: string;
|
||||
export const XDG_SESSION_DESKTOP: string;
|
||||
export const LOGNAME: string;
|
||||
export const QT_QPA_PLATFORMTHEME: string;
|
||||
export const XDG_SESSION_TYPE: string;
|
||||
export const npm_config_init_module: string;
|
||||
export const SYSTEMD_EXEC_PID: string;
|
||||
export const _: string;
|
||||
export const KITTY_PUBLIC_KEY: string;
|
||||
export const MOTD_SHOWN: string;
|
||||
export const HOME: string;
|
||||
export const LC_PAPER: string;
|
||||
export const LANG: string;
|
||||
export const _JAVA_AWT_WM_NONREPARENTING: string;
|
||||
export const LS_COLORS: string;
|
||||
export const XDG_CURRENT_DESKTOP: string;
|
||||
export const npm_package_version: string;
|
||||
export const MEMORY_PRESSURE_WATCH: string;
|
||||
export const WAYLAND_DISPLAY: string;
|
||||
export const KITTY_WINDOW_ID: string;
|
||||
export const MANROFFOPT: string;
|
||||
export const INVOCATION_ID: string;
|
||||
export const MANAGERPID: string;
|
||||
export const INIT_CWD: string;
|
||||
export const UWSM_WAIT_VARNAMES: string;
|
||||
export const QT_QPA_PLATFORM: string;
|
||||
export const XDG_CACHE_HOME: string;
|
||||
export const npm_lifecycle_script: string;
|
||||
export const npm_config_npm_version: string;
|
||||
export const ANDROID_HOME: string;
|
||||
export const TERM: string;
|
||||
export const TERMINFO: string;
|
||||
export const npm_package_name: string;
|
||||
export const LESS_TERMCAP_mb: string;
|
||||
export const LESS_TERMCAP_me: string;
|
||||
export const LESS_TERMCAP_md: string;
|
||||
export const npm_config_prefix: string;
|
||||
export const ZDOTDIR: string;
|
||||
export const USER: string;
|
||||
export const GIT_PAGER: string;
|
||||
export const SDL_VIDEODRIVER: string;
|
||||
export const HYPRLAND_INSTANCE_SIGNATURE: string;
|
||||
export const MANPAGER: string;
|
||||
export const NOTIFY_SOCKET: string;
|
||||
export const DISPLAY: string;
|
||||
export const npm_lifecycle_event: string;
|
||||
export const SHLVL: string;
|
||||
export const LESS_TERMCAP_ue: string;
|
||||
export const MOZ_ENABLE_WAYLAND: string;
|
||||
export const LESS_TERMCAP_us: string;
|
||||
export const PAGER: string;
|
||||
export const LC_TELEPHONE: string;
|
||||
export const ANDROID_SDK_ROOT: string;
|
||||
export const LC_MESSAGES: string;
|
||||
export const LC_MEASUREMENT: string;
|
||||
export const XDG_VTNR: string;
|
||||
export const XDG_SESSION_ID: string;
|
||||
export const MANAGERPIDFDID: string;
|
||||
export const npm_config_user_agent: string;
|
||||
export const ROCM_PATH: string;
|
||||
export const XDG_STATE_HOME: string;
|
||||
export const npm_execpath: string;
|
||||
export const LD_LIBRARY_PATH: string;
|
||||
export const LC_CTYPE: string;
|
||||
export const XDG_RUNTIME_DIR: string;
|
||||
export const KITTY_LISTEN_ON: string;
|
||||
export const GRIMBLAST_EDITOR: string;
|
||||
export const GEMINI_CLI: string;
|
||||
export const DEBUGINFOD_URLS: string;
|
||||
export const npm_package_json: string;
|
||||
export const LC_TIME: string;
|
||||
export const HYPRCURSOR_THEME: string;
|
||||
export const GEMINI_CLI_NO_RELAUNCH: string;
|
||||
export const JOURNAL_STREAM: string;
|
||||
export const LC_COLLATE: string;
|
||||
export const XCURSOR_THEME: string;
|
||||
export const XDG_DATA_DIRS: string;
|
||||
export const GDK_BACKEND: string;
|
||||
export const npm_config_noproxy: string;
|
||||
export const PATH: string;
|
||||
export const npm_config_node_gyp: string;
|
||||
export const HSA_OVERRIDE_GFX_VERSION: string;
|
||||
export const DBUS_SESSION_BUS_ADDRESS: string;
|
||||
export const FZF_DEFAULT_OPTS: string;
|
||||
export const npm_config_global_prefix: string;
|
||||
export const HG: string;
|
||||
export const MAIL: string;
|
||||
export const UWSM_FINALIZE_VARNAMES: string;
|
||||
export const KITTY_INSTALLATION_DIR: string;
|
||||
export const npm_node_execpath: string;
|
||||
export const LC_NUMERIC: string;
|
||||
export const OLDPWD: string;
|
||||
export const HYPRCURSOR_SIZE: string;
|
||||
export const NODE_ENV: string;
|
||||
}
|
||||
|
||||
/**
|
||||
* This module provides access to environment variables that are injected _statically_ into your bundle at build time and are _publicly_ accessible.
|
||||
*
|
||||
* | | Runtime | Build time |
|
||||
* | ------- | -------------------------------------------------------------------------- | ------------------------------------------------------------------------ |
|
||||
* | Private | [`$env/dynamic/private`](https://svelte.dev/docs/kit/$env-dynamic-private) | [`$env/static/private`](https://svelte.dev/docs/kit/$env-static-private) |
|
||||
* | Public | [`$env/dynamic/public`](https://svelte.dev/docs/kit/$env-dynamic-public) | [`$env/static/public`](https://svelte.dev/docs/kit/$env-static-public) |
|
||||
*
|
||||
* Static environment variables are [loaded by Vite](https://vitejs.dev/guide/env-and-mode.html#env-files) from `.env` files and `process.env` at build time and then statically injected into your bundle at build time, enabling optimisations like dead code elimination.
|
||||
*
|
||||
* **_Public_ access:**
|
||||
*
|
||||
* - This module _can_ be imported into client-side code
|
||||
* - **Only** variables that begin with [`config.kit.env.publicPrefix`](https://svelte.dev/docs/kit/configuration#env) (which defaults to `PUBLIC_`) are included
|
||||
*
|
||||
* For example, given the following build time environment:
|
||||
*
|
||||
* ```env
|
||||
* ENVIRONMENT=production
|
||||
* PUBLIC_BASE_URL=http://site.com
|
||||
* ```
|
||||
*
|
||||
* With the default `publicPrefix` and `privatePrefix`:
|
||||
*
|
||||
* ```ts
|
||||
* import { ENVIRONMENT, PUBLIC_BASE_URL } from '$env/static/public';
|
||||
*
|
||||
* console.log(ENVIRONMENT); // => throws error during build
|
||||
* console.log(PUBLIC_BASE_URL); // => "http://site.com"
|
||||
* ```
|
||||
*
|
||||
* The above values will be the same _even if_ different values for `ENVIRONMENT` or `PUBLIC_BASE_URL` are set at runtime, as they are statically replaced in your code with their build time values.
|
||||
*/
|
||||
declare module '$env/static/public' {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* This module provides access to environment variables set _dynamically_ at runtime and that are limited to _private_ access.
|
||||
*
|
||||
* | | Runtime | Build time |
|
||||
* | ------- | -------------------------------------------------------------------------- | ------------------------------------------------------------------------ |
|
||||
* | Private | [`$env/dynamic/private`](https://svelte.dev/docs/kit/$env-dynamic-private) | [`$env/static/private`](https://svelte.dev/docs/kit/$env-static-private) |
|
||||
* | Public | [`$env/dynamic/public`](https://svelte.dev/docs/kit/$env-dynamic-public) | [`$env/static/public`](https://svelte.dev/docs/kit/$env-static-public) |
|
||||
*
|
||||
* Dynamic environment variables are defined by the platform you're running on. For example if you're using [`adapter-node`](https://github.com/sveltejs/kit/tree/main/packages/adapter-node) (or running [`vite preview`](https://svelte.dev/docs/kit/cli)), this is equivalent to `process.env`.
|
||||
*
|
||||
* **_Private_ access:**
|
||||
*
|
||||
* - This module cannot be imported into client-side code
|
||||
* - This module includes variables that _do not_ begin with [`config.kit.env.publicPrefix`](https://svelte.dev/docs/kit/configuration#env) _and do_ start with [`config.kit.env.privatePrefix`](https://svelte.dev/docs/kit/configuration#env) (if configured)
|
||||
*
|
||||
* > [!NOTE] In `dev`, `$env/dynamic` includes environment variables from `.env`. In `prod`, this behavior will depend on your adapter.
|
||||
*
|
||||
* > [!NOTE] To get correct types, environment variables referenced in your code should be declared (for example in an `.env` file), even if they don't have a value until the app is deployed:
|
||||
* >
|
||||
* > ```env
|
||||
* > MY_FEATURE_FLAG=
|
||||
* > ```
|
||||
* >
|
||||
* > You can override `.env` values from the command line like so:
|
||||
* >
|
||||
* > ```sh
|
||||
* > MY_FEATURE_FLAG="enabled" npm run dev
|
||||
* > ```
|
||||
*
|
||||
* For example, given the following runtime environment:
|
||||
*
|
||||
* ```env
|
||||
* ENVIRONMENT=production
|
||||
* PUBLIC_BASE_URL=http://site.com
|
||||
* ```
|
||||
*
|
||||
* With the default `publicPrefix` and `privatePrefix`:
|
||||
*
|
||||
* ```ts
|
||||
* import { env } from '$env/dynamic/private';
|
||||
*
|
||||
* console.log(env.ENVIRONMENT); // => "production"
|
||||
* console.log(env.PUBLIC_BASE_URL); // => undefined
|
||||
* ```
|
||||
*/
|
||||
declare module '$env/dynamic/private' {
|
||||
export const env: {
|
||||
SHELL: string;
|
||||
npm_command: string;
|
||||
UV_CACHE_DIR: string;
|
||||
npm_config_userconfig: string;
|
||||
COLORTERM: string;
|
||||
HYPRLAND_CMD: string;
|
||||
XDG_CONFIG_DIRS: string;
|
||||
npm_config_cache: string;
|
||||
LESS: string;
|
||||
GREP_COLOR: string;
|
||||
XDG_MENU_PREFIX: string;
|
||||
XDG_BACKEND: string;
|
||||
CLUTTER_BACKEND: string;
|
||||
QT_WAYLAND_DISABLE_WINDOWDECORATION: string;
|
||||
NODE: string;
|
||||
SCIKIT_LEARN_DATA: string;
|
||||
LC_ADDRESS: string;
|
||||
SSH_AUTH_SOCK: string;
|
||||
XDG_DATA_HOME: string;
|
||||
XDG_CONFIG_HOME: string;
|
||||
MEMORY_PRESSURE_WRITE: string;
|
||||
COLOR: string;
|
||||
npm_config_local_prefix: string;
|
||||
DIFFPROG: string;
|
||||
LC_MONETARY: string;
|
||||
SSH_AGENT_PID: string;
|
||||
ELECTRON_OZONE_PLATFORM_HINT: string;
|
||||
HL_INITIAL_WORKSPACE_TOKEN: string;
|
||||
KITTY_PID: string;
|
||||
GREP_COLORS: string;
|
||||
npm_config_globalconfig: string;
|
||||
XCURSOR_SIZE: string;
|
||||
EDITOR: string;
|
||||
XDG_SEAT: string;
|
||||
PWD: string;
|
||||
XDG_SESSION_DESKTOP: string;
|
||||
LOGNAME: string;
|
||||
QT_QPA_PLATFORMTHEME: string;
|
||||
XDG_SESSION_TYPE: string;
|
||||
npm_config_init_module: string;
|
||||
SYSTEMD_EXEC_PID: string;
|
||||
_: string;
|
||||
KITTY_PUBLIC_KEY: string;
|
||||
MOTD_SHOWN: string;
|
||||
HOME: string;
|
||||
LC_PAPER: string;
|
||||
LANG: string;
|
||||
_JAVA_AWT_WM_NONREPARENTING: string;
|
||||
LS_COLORS: string;
|
||||
XDG_CURRENT_DESKTOP: string;
|
||||
npm_package_version: string;
|
||||
MEMORY_PRESSURE_WATCH: string;
|
||||
WAYLAND_DISPLAY: string;
|
||||
KITTY_WINDOW_ID: string;
|
||||
MANROFFOPT: string;
|
||||
INVOCATION_ID: string;
|
||||
MANAGERPID: string;
|
||||
INIT_CWD: string;
|
||||
UWSM_WAIT_VARNAMES: string;
|
||||
QT_QPA_PLATFORM: string;
|
||||
XDG_CACHE_HOME: string;
|
||||
npm_lifecycle_script: string;
|
||||
npm_config_npm_version: string;
|
||||
ANDROID_HOME: string;
|
||||
TERM: string;
|
||||
TERMINFO: string;
|
||||
npm_package_name: string;
|
||||
LESS_TERMCAP_mb: string;
|
||||
LESS_TERMCAP_me: string;
|
||||
LESS_TERMCAP_md: string;
|
||||
npm_config_prefix: string;
|
||||
ZDOTDIR: string;
|
||||
USER: string;
|
||||
GIT_PAGER: string;
|
||||
SDL_VIDEODRIVER: string;
|
||||
HYPRLAND_INSTANCE_SIGNATURE: string;
|
||||
MANPAGER: string;
|
||||
NOTIFY_SOCKET: string;
|
||||
DISPLAY: string;
|
||||
npm_lifecycle_event: string;
|
||||
SHLVL: string;
|
||||
LESS_TERMCAP_ue: string;
|
||||
MOZ_ENABLE_WAYLAND: string;
|
||||
LESS_TERMCAP_us: string;
|
||||
PAGER: string;
|
||||
LC_TELEPHONE: string;
|
||||
ANDROID_SDK_ROOT: string;
|
||||
LC_MESSAGES: string;
|
||||
LC_MEASUREMENT: string;
|
||||
XDG_VTNR: string;
|
||||
XDG_SESSION_ID: string;
|
||||
MANAGERPIDFDID: string;
|
||||
npm_config_user_agent: string;
|
||||
ROCM_PATH: string;
|
||||
XDG_STATE_HOME: string;
|
||||
npm_execpath: string;
|
||||
LD_LIBRARY_PATH: string;
|
||||
LC_CTYPE: string;
|
||||
XDG_RUNTIME_DIR: string;
|
||||
KITTY_LISTEN_ON: string;
|
||||
GRIMBLAST_EDITOR: string;
|
||||
GEMINI_CLI: string;
|
||||
DEBUGINFOD_URLS: string;
|
||||
npm_package_json: string;
|
||||
LC_TIME: string;
|
||||
HYPRCURSOR_THEME: string;
|
||||
GEMINI_CLI_NO_RELAUNCH: string;
|
||||
JOURNAL_STREAM: string;
|
||||
LC_COLLATE: string;
|
||||
XCURSOR_THEME: string;
|
||||
XDG_DATA_DIRS: string;
|
||||
GDK_BACKEND: string;
|
||||
npm_config_noproxy: string;
|
||||
PATH: string;
|
||||
npm_config_node_gyp: string;
|
||||
HSA_OVERRIDE_GFX_VERSION: string;
|
||||
DBUS_SESSION_BUS_ADDRESS: string;
|
||||
FZF_DEFAULT_OPTS: string;
|
||||
npm_config_global_prefix: string;
|
||||
HG: string;
|
||||
MAIL: string;
|
||||
UWSM_FINALIZE_VARNAMES: string;
|
||||
KITTY_INSTALLATION_DIR: string;
|
||||
npm_node_execpath: string;
|
||||
LC_NUMERIC: string;
|
||||
OLDPWD: string;
|
||||
HYPRCURSOR_SIZE: string;
|
||||
NODE_ENV: string;
|
||||
[key: `PUBLIC_${string}`]: undefined;
|
||||
[key: `${string}`]: string | undefined;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* This module provides access to environment variables set _dynamically_ at runtime and that are _publicly_ accessible.
|
||||
*
|
||||
* | | Runtime | Build time |
|
||||
* | ------- | -------------------------------------------------------------------------- | ------------------------------------------------------------------------ |
|
||||
* | Private | [`$env/dynamic/private`](https://svelte.dev/docs/kit/$env-dynamic-private) | [`$env/static/private`](https://svelte.dev/docs/kit/$env-static-private) |
|
||||
* | Public | [`$env/dynamic/public`](https://svelte.dev/docs/kit/$env-dynamic-public) | [`$env/static/public`](https://svelte.dev/docs/kit/$env-static-public) |
|
||||
*
|
||||
* Dynamic environment variables are defined by the platform you're running on. For example if you're using [`adapter-node`](https://github.com/sveltejs/kit/tree/main/packages/adapter-node) (or running [`vite preview`](https://svelte.dev/docs/kit/cli)), this is equivalent to `process.env`.
|
||||
*
|
||||
* **_Public_ access:**
|
||||
*
|
||||
* - This module _can_ be imported into client-side code
|
||||
* - **Only** variables that begin with [`config.kit.env.publicPrefix`](https://svelte.dev/docs/kit/configuration#env) (which defaults to `PUBLIC_`) are included
|
||||
*
|
||||
* > [!NOTE] In `dev`, `$env/dynamic` includes environment variables from `.env`. In `prod`, this behavior will depend on your adapter.
|
||||
*
|
||||
* > [!NOTE] To get correct types, environment variables referenced in your code should be declared (for example in an `.env` file), even if they don't have a value until the app is deployed:
|
||||
* >
|
||||
* > ```env
|
||||
* > MY_FEATURE_FLAG=
|
||||
* > ```
|
||||
* >
|
||||
* > You can override `.env` values from the command line like so:
|
||||
* >
|
||||
* > ```sh
|
||||
* > MY_FEATURE_FLAG="enabled" npm run dev
|
||||
* > ```
|
||||
*
|
||||
* For example, given the following runtime environment:
|
||||
*
|
||||
* ```env
|
||||
* ENVIRONMENT=production
|
||||
* PUBLIC_BASE_URL=http://example.com
|
||||
* ```
|
||||
*
|
||||
* With the default `publicPrefix` and `privatePrefix`:
|
||||
*
|
||||
* ```ts
|
||||
* import { env } from '$env/dynamic/public';
|
||||
* console.log(env.ENVIRONMENT); // => undefined, not public
|
||||
* console.log(env.PUBLIC_BASE_URL); // => "http://example.com"
|
||||
* ```
|
||||
*
|
||||
* ```
|
||||
*
|
||||
* ```
|
||||
*/
|
||||
declare module '$env/dynamic/public' {
|
||||
export const env: {
|
||||
[key: `PUBLIC_${string}`]: string | undefined;
|
||||
}
|
||||
}
|
||||
@@ -1,48 +0,0 @@
|
||||
export { matchers } from './matchers.js';
|
||||
|
||||
export const nodes = [
|
||||
() => import('./nodes/0'),
|
||||
() => import('./nodes/1'),
|
||||
() => import('./nodes/2'),
|
||||
() => import('./nodes/3'),
|
||||
() => import('./nodes/4'),
|
||||
() => import('./nodes/5'),
|
||||
() => import('./nodes/6'),
|
||||
() => import('./nodes/7'),
|
||||
() => import('./nodes/8'),
|
||||
() => import('./nodes/9'),
|
||||
() => import('./nodes/10'),
|
||||
() => import('./nodes/11'),
|
||||
() => import('./nodes/12')
|
||||
];
|
||||
|
||||
export const server_loads = [];
|
||||
|
||||
export const dictionary = {
|
||||
"/": [3],
|
||||
"/admin": [4,[2]],
|
||||
"/admin/attendance": [5,[2]],
|
||||
"/admin/courses": [6,[2]],
|
||||
"/admin/export": [7,[2]],
|
||||
"/admin/notes": [8,[2]],
|
||||
"/admin/rooms": [9,[2]],
|
||||
"/admin/sessions": [10,[2]],
|
||||
"/login": [11],
|
||||
"/s/[code]": [12]
|
||||
};
|
||||
|
||||
export const hooks = {
|
||||
handleError: (({ error }) => { console.error(error) }),
|
||||
|
||||
reroute: (() => {}),
|
||||
transport: {}
|
||||
};
|
||||
|
||||
export const decoders = Object.fromEntries(Object.entries(hooks.transport).map(([k, v]) => [k, v.decode]));
|
||||
export const encoders = Object.fromEntries(Object.entries(hooks.transport).map(([k, v]) => [k, v.encode]));
|
||||
|
||||
export const hash = false;
|
||||
|
||||
export const decode = (type, value) => decoders[type](value);
|
||||
|
||||
export { default as root } from '../root.js';
|
||||
@@ -1 +0,0 @@
|
||||
export const matchers = {};
|
||||
@@ -1 +0,0 @@
|
||||
export { default as component } from "../../../../src/routes/+layout.svelte";
|
||||
@@ -1 +0,0 @@
|
||||
export { default as component } from "../../../../node_modules/@sveltejs/kit/src/runtime/components/svelte-5/error.svelte";
|
||||
@@ -1 +0,0 @@
|
||||
export { default as component } from "../../../../src/routes/admin/sessions/+page.svelte";
|
||||
@@ -1 +0,0 @@
|
||||
export { default as component } from "../../../../src/routes/login/+page.svelte";
|
||||
@@ -1 +0,0 @@
|
||||
export { default as component } from "../../../../src/routes/s/[code]/+page.svelte";
|
||||
@@ -1 +0,0 @@
|
||||
export { default as component } from "../../../../src/routes/admin/+layout.svelte";
|
||||
@@ -1 +0,0 @@
|
||||
export { default as component } from "../../../../src/routes/+page.svelte";
|
||||
@@ -1 +0,0 @@
|
||||
export { default as component } from "../../../../src/routes/admin/+page.svelte";
|
||||
@@ -1 +0,0 @@
|
||||
export { default as component } from "../../../../src/routes/admin/attendance/+page.svelte";
|
||||
@@ -1 +0,0 @@
|
||||
export { default as component } from "../../../../src/routes/admin/courses/+page.svelte";
|
||||
@@ -1 +0,0 @@
|
||||
export { default as component } from "../../../../src/routes/admin/export/+page.svelte";
|
||||
@@ -1 +0,0 @@
|
||||
export { default as component } from "../../../../src/routes/admin/notes/+page.svelte";
|
||||
@@ -1 +0,0 @@
|
||||
export { default as component } from "../../../../src/routes/admin/rooms/+page.svelte";
|
||||
@@ -1,48 +0,0 @@
|
||||
export { matchers } from './matchers.js';
|
||||
|
||||
export const nodes = [
|
||||
() => import('./nodes/0'),
|
||||
() => import('./nodes/1'),
|
||||
() => import('./nodes/2'),
|
||||
() => import('./nodes/3'),
|
||||
() => import('./nodes/4'),
|
||||
() => import('./nodes/5'),
|
||||
() => import('./nodes/6'),
|
||||
() => import('./nodes/7'),
|
||||
() => import('./nodes/8'),
|
||||
() => import('./nodes/9'),
|
||||
() => import('./nodes/10'),
|
||||
() => import('./nodes/11'),
|
||||
() => import('./nodes/12')
|
||||
];
|
||||
|
||||
export const server_loads = [];
|
||||
|
||||
export const dictionary = {
|
||||
"/": [3],
|
||||
"/admin": [4,[2]],
|
||||
"/admin/attendance": [5,[2]],
|
||||
"/admin/courses": [6,[2]],
|
||||
"/admin/export": [7,[2]],
|
||||
"/admin/notes": [8,[2]],
|
||||
"/admin/rooms": [9,[2]],
|
||||
"/admin/sessions": [10,[2]],
|
||||
"/login": [11],
|
||||
"/s/[code]": [12]
|
||||
};
|
||||
|
||||
export const hooks = {
|
||||
handleError: (({ error }) => { console.error(error) }),
|
||||
|
||||
reroute: (() => {}),
|
||||
transport: {}
|
||||
};
|
||||
|
||||
export const decoders = Object.fromEntries(Object.entries(hooks.transport).map(([k, v]) => [k, v.decode]));
|
||||
export const encoders = Object.fromEntries(Object.entries(hooks.transport).map(([k, v]) => [k, v.encode]));
|
||||
|
||||
export const hash = false;
|
||||
|
||||
export const decode = (type, value) => decoders[type](value);
|
||||
|
||||
export { default as root } from '../root.js';
|
||||
@@ -1 +0,0 @@
|
||||
export const matchers = {};
|
||||
@@ -1 +0,0 @@
|
||||
export { default as component } from "../../../../src/routes/+layout.svelte";
|
||||
@@ -1 +0,0 @@
|
||||
export { default as component } from "../../../../node_modules/@sveltejs/kit/src/runtime/components/svelte-5/error.svelte";
|
||||
@@ -1 +0,0 @@
|
||||
export { default as component } from "../../../../src/routes/admin/sessions/+page.svelte";
|
||||
@@ -1 +0,0 @@
|
||||
export { default as component } from "../../../../src/routes/login/+page.svelte";
|
||||
@@ -1 +0,0 @@
|
||||
export { default as component } from "../../../../src/routes/s/[code]/+page.svelte";
|
||||
@@ -1 +0,0 @@
|
||||
export { default as component } from "../../../../src/routes/admin/+layout.svelte";
|
||||
@@ -1 +0,0 @@
|
||||
export { default as component } from "../../../../src/routes/+page.svelte";
|
||||
@@ -1 +0,0 @@
|
||||
export { default as component } from "../../../../src/routes/admin/+page.svelte";
|
||||
@@ -1 +0,0 @@
|
||||
export { default as component } from "../../../../src/routes/admin/attendance/+page.svelte";
|
||||
@@ -1 +0,0 @@
|
||||
export { default as component } from "../../../../src/routes/admin/courses/+page.svelte";
|
||||
@@ -1 +0,0 @@
|
||||
export { default as component } from "../../../../src/routes/admin/export/+page.svelte";
|
||||
@@ -1 +0,0 @@
|
||||
export { default as component } from "../../../../src/routes/admin/notes/+page.svelte";
|
||||
@@ -1 +0,0 @@
|
||||
export { default as component } from "../../../../src/routes/admin/rooms/+page.svelte";
|
||||
@@ -1,3 +0,0 @@
|
||||
import { asClassComponent } from 'svelte/legacy';
|
||||
import Root from './root.svelte';
|
||||
export default asClassComponent(Root);
|
||||
@@ -1,80 +0,0 @@
|
||||
<!-- This file is generated by @sveltejs/kit — do not edit it! -->
|
||||
<svelte:options runes={true} />
|
||||
<script>
|
||||
import { setContext, onMount, tick } from 'svelte';
|
||||
import { browser } from '$app/environment';
|
||||
|
||||
// stores
|
||||
let { stores, page, constructors, components = [], form, data_0 = null, data_1 = null, data_2 = null } = $props();
|
||||
|
||||
if (!browser) {
|
||||
// svelte-ignore state_referenced_locally
|
||||
setContext('__svelte__', stores);
|
||||
}
|
||||
|
||||
if (browser) {
|
||||
$effect.pre(() => stores.page.set(page));
|
||||
} else {
|
||||
// svelte-ignore state_referenced_locally
|
||||
stores.page.set(page);
|
||||
}
|
||||
$effect(() => {
|
||||
stores;page;constructors;components;form;data_0;data_1;data_2;
|
||||
stores.page.notify();
|
||||
});
|
||||
|
||||
let mounted = $state(false);
|
||||
let navigated = $state(false);
|
||||
let title = $state(null);
|
||||
|
||||
onMount(() => {
|
||||
const unsubscribe = stores.page.subscribe(() => {
|
||||
if (mounted) {
|
||||
navigated = true;
|
||||
tick().then(() => {
|
||||
title = document.title || 'untitled page';
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
mounted = true;
|
||||
return unsubscribe;
|
||||
});
|
||||
|
||||
const Pyramid_2=$derived(constructors[2])
|
||||
</script>
|
||||
|
||||
{#if constructors[1]}
|
||||
{@const Pyramid_0 = constructors[0]}
|
||||
<!-- svelte-ignore binding_property_non_reactive -->
|
||||
<Pyramid_0 bind:this={components[0]} data={data_0} {form} params={page.params}>
|
||||
{#if constructors[2]}
|
||||
{@const Pyramid_1 = constructors[1]}
|
||||
<!-- svelte-ignore binding_property_non_reactive -->
|
||||
<Pyramid_1 bind:this={components[1]} data={data_1} {form} params={page.params}>
|
||||
<!-- svelte-ignore binding_property_non_reactive -->
|
||||
<Pyramid_2 bind:this={components[2]} data={data_2} {form} params={page.params} />
|
||||
</Pyramid_1>
|
||||
|
||||
{:else}
|
||||
{@const Pyramid_1 = constructors[1]}
|
||||
<!-- svelte-ignore binding_property_non_reactive -->
|
||||
<Pyramid_1 bind:this={components[1]} data={data_1} {form} params={page.params} />
|
||||
|
||||
{/if}
|
||||
</Pyramid_0>
|
||||
|
||||
{:else}
|
||||
{@const Pyramid_0 = constructors[0]}
|
||||
<!-- svelte-ignore binding_property_non_reactive -->
|
||||
<Pyramid_0 bind:this={components[0]} data={data_0} {form} params={page.params} />
|
||||
|
||||
{/if}
|
||||
|
||||
{#if mounted}
|
||||
<div id="svelte-announcer" aria-live="assertive" aria-atomic="true" style="position: absolute; left: 0; top: 0; clip: rect(0 0 0 0); clip-path: inset(50%); overflow: hidden; white-space: nowrap; width: 1px; height: 1px">
|
||||
{#if navigated}
|
||||
{title}
|
||||
{/if}
|
||||
</div>
|
||||
{/if}
|
||||
@@ -1,54 +0,0 @@
|
||||
|
||||
import root from '../root.js';
|
||||
import { set_building, set_prerendering } from '__sveltekit/environment';
|
||||
import { set_assets } from '$app/paths/internal/server';
|
||||
import { set_manifest, set_read_implementation } from '__sveltekit/server';
|
||||
import { set_private_env, set_public_env } from '../../../node_modules/@sveltejs/kit/src/runtime/shared-server.js';
|
||||
|
||||
export const options = {
|
||||
app_template_contains_nonce: false,
|
||||
async: false,
|
||||
csp: {"mode":"auto","directives":{"upgrade-insecure-requests":false,"block-all-mixed-content":false},"reportOnly":{"upgrade-insecure-requests":false,"block-all-mixed-content":false}},
|
||||
csrf_check_origin: true,
|
||||
csrf_trusted_origins: [],
|
||||
embedded: false,
|
||||
env_public_prefix: 'PUBLIC_',
|
||||
env_private_prefix: '',
|
||||
hash_routing: false,
|
||||
hooks: null, // added lazily, via `get_hooks`
|
||||
preload_strategy: "modulepreload",
|
||||
root,
|
||||
service_worker: false,
|
||||
service_worker_options: undefined,
|
||||
server_error_boundaries: false,
|
||||
templates: {
|
||||
app: ({ head, body, assets, nonce, env }) => "<!DOCTYPE html>\n<html lang=\"en\">\n\t<head>\n\t\t<meta charset=\"utf-8\" />\n\t\t<link rel=\"icon\" href=\"" + assets + "/favicon.png\" />\n\t\t<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n\t\t" + head + "\n\t</head>\n\t<body data-sveltekit-preload-data=\"hover\">\n\t\t<div style=\"display: contents\">" + body + "</div>\n\t</body>\n</html>\n",
|
||||
error: ({ status, message }) => "<!doctype html>\n<html lang=\"en\">\n\t<head>\n\t\t<meta charset=\"utf-8\" />\n\t\t<title>" + message + "</title>\n\n\t\t<style>\n\t\t\tbody {\n\t\t\t\t--bg: white;\n\t\t\t\t--fg: #222;\n\t\t\t\t--divider: #ccc;\n\t\t\t\tbackground: var(--bg);\n\t\t\t\tcolor: var(--fg);\n\t\t\t\tfont-family:\n\t\t\t\t\tsystem-ui,\n\t\t\t\t\t-apple-system,\n\t\t\t\t\tBlinkMacSystemFont,\n\t\t\t\t\t'Segoe UI',\n\t\t\t\t\tRoboto,\n\t\t\t\t\tOxygen,\n\t\t\t\t\tUbuntu,\n\t\t\t\t\tCantarell,\n\t\t\t\t\t'Open Sans',\n\t\t\t\t\t'Helvetica Neue',\n\t\t\t\t\tsans-serif;\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tjustify-content: center;\n\t\t\t\theight: 100vh;\n\t\t\t\tmargin: 0;\n\t\t\t}\n\n\t\t\t.error {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tmax-width: 32rem;\n\t\t\t\tmargin: 0 1rem;\n\t\t\t}\n\n\t\t\t.status {\n\t\t\t\tfont-weight: 200;\n\t\t\t\tfont-size: 3rem;\n\t\t\t\tline-height: 1;\n\t\t\t\tposition: relative;\n\t\t\t\ttop: -0.05rem;\n\t\t\t}\n\n\t\t\t.message {\n\t\t\t\tborder-left: 1px solid var(--divider);\n\t\t\t\tpadding: 0 0 0 1rem;\n\t\t\t\tmargin: 0 0 0 1rem;\n\t\t\t\tmin-height: 2.5rem;\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t}\n\n\t\t\t.message h1 {\n\t\t\t\tfont-weight: 400;\n\t\t\t\tfont-size: 1em;\n\t\t\t\tmargin: 0;\n\t\t\t}\n\n\t\t\t@media (prefers-color-scheme: dark) {\n\t\t\t\tbody {\n\t\t\t\t\t--bg: #222;\n\t\t\t\t\t--fg: #ddd;\n\t\t\t\t\t--divider: #666;\n\t\t\t\t}\n\t\t\t}\n\t\t</style>\n\t</head>\n\t<body>\n\t\t<div class=\"error\">\n\t\t\t<span class=\"status\">" + status + "</span>\n\t\t\t<div class=\"message\">\n\t\t\t\t<h1>" + message + "</h1>\n\t\t\t</div>\n\t\t</div>\n\t</body>\n</html>\n"
|
||||
},
|
||||
version_hash: "eq7x7d"
|
||||
};
|
||||
|
||||
export async function get_hooks() {
|
||||
let handle;
|
||||
let handleFetch;
|
||||
let handleError;
|
||||
let handleValidationError;
|
||||
let init;
|
||||
|
||||
|
||||
let reroute;
|
||||
let transport;
|
||||
|
||||
|
||||
return {
|
||||
handle,
|
||||
handleFetch,
|
||||
handleError,
|
||||
handleValidationError,
|
||||
init,
|
||||
reroute,
|
||||
transport
|
||||
};
|
||||
}
|
||||
|
||||
export { set_assets, set_building, set_manifest, set_prerendering, set_private_env, set_public_env, set_read_implementation };
|
||||
53
frontend/.svelte-kit/non-ambient.d.ts
vendored
53
frontend/.svelte-kit/non-ambient.d.ts
vendored
@@ -1,53 +0,0 @@
|
||||
|
||||
// this file is generated — do not edit it
|
||||
|
||||
|
||||
declare module "svelte/elements" {
|
||||
export interface HTMLAttributes<T> {
|
||||
'data-sveltekit-keepfocus'?: true | '' | 'off' | undefined | null;
|
||||
'data-sveltekit-noscroll'?: true | '' | 'off' | undefined | null;
|
||||
'data-sveltekit-preload-code'?:
|
||||
| true
|
||||
| ''
|
||||
| 'eager'
|
||||
| 'viewport'
|
||||
| 'hover'
|
||||
| 'tap'
|
||||
| 'off'
|
||||
| undefined
|
||||
| null;
|
||||
'data-sveltekit-preload-data'?: true | '' | 'hover' | 'tap' | 'off' | undefined | null;
|
||||
'data-sveltekit-reload'?: true | '' | 'off' | undefined | null;
|
||||
'data-sveltekit-replacestate'?: true | '' | 'off' | undefined | null;
|
||||
}
|
||||
}
|
||||
|
||||
export {};
|
||||
|
||||
|
||||
declare module "$app/types" {
|
||||
type MatcherParam<M> = M extends (param : string) => param is (infer U extends string) ? U : string;
|
||||
|
||||
export interface AppTypes {
|
||||
RouteId(): "/" | "/admin" | "/admin/attendance" | "/admin/courses" | "/admin/export" | "/admin/notes" | "/admin/rooms" | "/admin/sessions" | "/login" | "/s" | "/s/[code]";
|
||||
RouteParams(): {
|
||||
"/s/[code]": { code: string }
|
||||
};
|
||||
LayoutParams(): {
|
||||
"/": { code?: string };
|
||||
"/admin": Record<string, never>;
|
||||
"/admin/attendance": Record<string, never>;
|
||||
"/admin/courses": Record<string, never>;
|
||||
"/admin/export": Record<string, never>;
|
||||
"/admin/notes": Record<string, never>;
|
||||
"/admin/rooms": Record<string, never>;
|
||||
"/admin/sessions": Record<string, never>;
|
||||
"/login": Record<string, never>;
|
||||
"/s": { code?: string };
|
||||
"/s/[code]": { code: string }
|
||||
};
|
||||
Pathname(): "/" | "/admin" | "/admin/attendance" | "/admin/courses" | "/admin/export" | "/admin/notes" | "/admin/rooms" | "/admin/sessions" | "/login" | `/s/${string}` & {};
|
||||
ResolvedPathname(): `${"" | `/${string}`}${ReturnType<AppTypes['Pathname']>}`;
|
||||
Asset(): string & {};
|
||||
}
|
||||
}
|
||||
@@ -1,300 +0,0 @@
|
||||
{
|
||||
".svelte-kit/generated/client-optimized/app.js": {
|
||||
"file": "_app/immutable/entry/app.CYjzVzWt.js",
|
||||
"name": "entry/app",
|
||||
"src": ".svelte-kit/generated/client-optimized/app.js",
|
||||
"isEntry": true,
|
||||
"imports": [
|
||||
"_egdMPJ-g.js",
|
||||
"_DXhpcOT6.js",
|
||||
"_BMRk7WTg.js"
|
||||
],
|
||||
"dynamicImports": [
|
||||
".svelte-kit/generated/client-optimized/nodes/0.js",
|
||||
".svelte-kit/generated/client-optimized/nodes/1.js",
|
||||
".svelte-kit/generated/client-optimized/nodes/2.js",
|
||||
".svelte-kit/generated/client-optimized/nodes/3.js",
|
||||
".svelte-kit/generated/client-optimized/nodes/4.js",
|
||||
".svelte-kit/generated/client-optimized/nodes/5.js",
|
||||
".svelte-kit/generated/client-optimized/nodes/6.js",
|
||||
".svelte-kit/generated/client-optimized/nodes/7.js",
|
||||
".svelte-kit/generated/client-optimized/nodes/8.js",
|
||||
".svelte-kit/generated/client-optimized/nodes/9.js",
|
||||
".svelte-kit/generated/client-optimized/nodes/10.js",
|
||||
".svelte-kit/generated/client-optimized/nodes/11.js",
|
||||
".svelte-kit/generated/client-optimized/nodes/12.js"
|
||||
]
|
||||
},
|
||||
".svelte-kit/generated/client-optimized/nodes/0.js": {
|
||||
"file": "_app/immutable/nodes/0.Ddm7H9s-.js",
|
||||
"name": "nodes/0",
|
||||
"src": ".svelte-kit/generated/client-optimized/nodes/0.js",
|
||||
"isEntry": true,
|
||||
"imports": [
|
||||
"_egdMPJ-g.js",
|
||||
"_BMRk7WTg.js",
|
||||
"_Dt4wv1ei.js"
|
||||
]
|
||||
},
|
||||
".svelte-kit/generated/client-optimized/nodes/1.js": {
|
||||
"file": "_app/immutable/nodes/1.DFtas2MP.js",
|
||||
"name": "nodes/1",
|
||||
"src": ".svelte-kit/generated/client-optimized/nodes/1.js",
|
||||
"isEntry": true,
|
||||
"imports": [
|
||||
"_egdMPJ-g.js",
|
||||
"_DKRuQnts.js",
|
||||
"_BMRk7WTg.js"
|
||||
]
|
||||
},
|
||||
".svelte-kit/generated/client-optimized/nodes/10.js": {
|
||||
"file": "_app/immutable/nodes/10.BLeYuhst.js",
|
||||
"name": "nodes/10",
|
||||
"src": ".svelte-kit/generated/client-optimized/nodes/10.js",
|
||||
"isEntry": true,
|
||||
"imports": [
|
||||
"_egdMPJ-g.js",
|
||||
"_BMRk7WTg.js",
|
||||
"_DNBIa2Bh.js"
|
||||
],
|
||||
"css": [
|
||||
"_app/immutable/assets/10.BhkUjvVr.css"
|
||||
]
|
||||
},
|
||||
".svelte-kit/generated/client-optimized/nodes/11.js": {
|
||||
"file": "_app/immutable/nodes/11.DB6yXGVc.js",
|
||||
"name": "nodes/11",
|
||||
"src": ".svelte-kit/generated/client-optimized/nodes/11.js",
|
||||
"isEntry": true,
|
||||
"imports": [
|
||||
"_egdMPJ-g.js",
|
||||
"_DKRuQnts.js",
|
||||
"_vL8MaPP-.js",
|
||||
"_BMRk7WTg.js",
|
||||
"_Dt4wv1ei.js",
|
||||
"_DNBIa2Bh.js",
|
||||
"_CS5Tuebd.js"
|
||||
],
|
||||
"css": [
|
||||
"_app/immutable/assets/11.LkBq3xGq.css"
|
||||
]
|
||||
},
|
||||
".svelte-kit/generated/client-optimized/nodes/12.js": {
|
||||
"file": "_app/immutable/nodes/12.5DAleB6K.js",
|
||||
"name": "nodes/12",
|
||||
"src": ".svelte-kit/generated/client-optimized/nodes/12.js",
|
||||
"isEntry": true,
|
||||
"imports": [
|
||||
"_egdMPJ-g.js",
|
||||
"_DKRuQnts.js",
|
||||
"_BMRk7WTg.js",
|
||||
"_BYEkGdSH.js",
|
||||
"_DNBIa2Bh.js"
|
||||
],
|
||||
"css": [
|
||||
"_app/immutable/assets/12.BboNMIwd.css"
|
||||
]
|
||||
},
|
||||
".svelte-kit/generated/client-optimized/nodes/2.js": {
|
||||
"file": "_app/immutable/nodes/2.BZoTn0Qw.js",
|
||||
"name": "nodes/2",
|
||||
"src": ".svelte-kit/generated/client-optimized/nodes/2.js",
|
||||
"isEntry": true,
|
||||
"imports": [
|
||||
"_egdMPJ-g.js",
|
||||
"_DKRuQnts.js",
|
||||
"_vL8MaPP-.js",
|
||||
"_BMRk7WTg.js",
|
||||
"_Dt4wv1ei.js",
|
||||
"_CS5Tuebd.js"
|
||||
],
|
||||
"css": [
|
||||
"_app/immutable/assets/2.BQQYIMLK.css"
|
||||
]
|
||||
},
|
||||
".svelte-kit/generated/client-optimized/nodes/3.js": {
|
||||
"file": "_app/immutable/nodes/3.CTDAi9vF.js",
|
||||
"name": "nodes/3",
|
||||
"src": ".svelte-kit/generated/client-optimized/nodes/3.js",
|
||||
"isEntry": true,
|
||||
"imports": [
|
||||
"_egdMPJ-g.js",
|
||||
"_DKRuQnts.js",
|
||||
"_vL8MaPP-.js",
|
||||
"_BMRk7WTg.js",
|
||||
"_Dt4wv1ei.js",
|
||||
"_CS5Tuebd.js"
|
||||
],
|
||||
"css": [
|
||||
"_app/immutable/assets/3.Dzrf4zX4.css"
|
||||
]
|
||||
},
|
||||
".svelte-kit/generated/client-optimized/nodes/4.js": {
|
||||
"file": "_app/immutable/nodes/4.DmI7a2Dc.js",
|
||||
"name": "nodes/4",
|
||||
"src": ".svelte-kit/generated/client-optimized/nodes/4.js",
|
||||
"isEntry": true,
|
||||
"imports": [
|
||||
"_egdMPJ-g.js",
|
||||
"_BMRk7WTg.js",
|
||||
"_DNBIa2Bh.js"
|
||||
],
|
||||
"css": [
|
||||
"_app/immutable/assets/4.b2bZrlfC.css"
|
||||
]
|
||||
},
|
||||
".svelte-kit/generated/client-optimized/nodes/5.js": {
|
||||
"file": "_app/immutable/nodes/5.CFS15qnw.js",
|
||||
"name": "nodes/5",
|
||||
"src": ".svelte-kit/generated/client-optimized/nodes/5.js",
|
||||
"isEntry": true,
|
||||
"imports": [
|
||||
"_egdMPJ-g.js",
|
||||
"_BMRk7WTg.js",
|
||||
"_DNBIa2Bh.js"
|
||||
],
|
||||
"css": [
|
||||
"_app/immutable/assets/5.DDTZ5v3E.css"
|
||||
]
|
||||
},
|
||||
".svelte-kit/generated/client-optimized/nodes/6.js": {
|
||||
"file": "_app/immutable/nodes/6.yU_a9j7E.js",
|
||||
"name": "nodes/6",
|
||||
"src": ".svelte-kit/generated/client-optimized/nodes/6.js",
|
||||
"isEntry": true,
|
||||
"imports": [
|
||||
"_egdMPJ-g.js",
|
||||
"_BMRk7WTg.js",
|
||||
"_DNBIa2Bh.js"
|
||||
],
|
||||
"css": [
|
||||
"_app/immutable/assets/6.Bfx4fGBa.css"
|
||||
]
|
||||
},
|
||||
".svelte-kit/generated/client-optimized/nodes/7.js": {
|
||||
"file": "_app/immutable/nodes/7.CN50pfZX.js",
|
||||
"name": "nodes/7",
|
||||
"src": ".svelte-kit/generated/client-optimized/nodes/7.js",
|
||||
"isEntry": true,
|
||||
"imports": [
|
||||
"_egdMPJ-g.js",
|
||||
"_BMRk7WTg.js",
|
||||
"_DNBIa2Bh.js"
|
||||
],
|
||||
"css": [
|
||||
"_app/immutable/assets/7.DkoPrtit.css"
|
||||
]
|
||||
},
|
||||
".svelte-kit/generated/client-optimized/nodes/8.js": {
|
||||
"file": "_app/immutable/nodes/8.Bs7k9fxR.js",
|
||||
"name": "nodes/8",
|
||||
"src": ".svelte-kit/generated/client-optimized/nodes/8.js",
|
||||
"isEntry": true,
|
||||
"imports": [
|
||||
"_egdMPJ-g.js",
|
||||
"_BMRk7WTg.js",
|
||||
"_BYEkGdSH.js",
|
||||
"_DNBIa2Bh.js"
|
||||
],
|
||||
"css": [
|
||||
"_app/immutable/assets/8.DigLoqRm.css"
|
||||
]
|
||||
},
|
||||
".svelte-kit/generated/client-optimized/nodes/9.js": {
|
||||
"file": "_app/immutable/nodes/9.wReU4Q8t.js",
|
||||
"name": "nodes/9",
|
||||
"src": ".svelte-kit/generated/client-optimized/nodes/9.js",
|
||||
"isEntry": true,
|
||||
"imports": [
|
||||
"_egdMPJ-g.js",
|
||||
"_BMRk7WTg.js",
|
||||
"_BYEkGdSH.js",
|
||||
"_DNBIa2Bh.js"
|
||||
],
|
||||
"css": [
|
||||
"_app/immutable/assets/9.C7KB5jd4.css"
|
||||
]
|
||||
},
|
||||
"_BMRk7WTg.js": {
|
||||
"file": "_app/immutable/chunks/BMRk7WTg.js",
|
||||
"name": "disclose-version"
|
||||
},
|
||||
"_BYEkGdSH.js": {
|
||||
"file": "_app/immutable/chunks/BYEkGdSH.js",
|
||||
"name": "RoomCanvas",
|
||||
"imports": [
|
||||
"_egdMPJ-g.js",
|
||||
"_BMRk7WTg.js"
|
||||
],
|
||||
"css": [
|
||||
"_app/immutable/assets/RoomCanvas.DJ9xbYNe.css"
|
||||
]
|
||||
},
|
||||
"_CS5Tuebd.js": {
|
||||
"file": "_app/immutable/chunks/CS5Tuebd.js",
|
||||
"name": "auth",
|
||||
"imports": [
|
||||
"_egdMPJ-g.js",
|
||||
"_ChnYctHm.js"
|
||||
]
|
||||
},
|
||||
"_ChnYctHm.js": {
|
||||
"file": "_app/immutable/chunks/ChnYctHm.js",
|
||||
"name": "index-client",
|
||||
"imports": [
|
||||
"_egdMPJ-g.js"
|
||||
]
|
||||
},
|
||||
"_DKRuQnts.js": {
|
||||
"file": "_app/immutable/chunks/DKRuQnts.js",
|
||||
"name": "client",
|
||||
"imports": [
|
||||
"_egdMPJ-g.js",
|
||||
"_ChnYctHm.js"
|
||||
]
|
||||
},
|
||||
"_DNBIa2Bh.js": {
|
||||
"file": "_app/immutable/chunks/DNBIa2Bh.js",
|
||||
"name": "api",
|
||||
"imports": [
|
||||
"_egdMPJ-g.js",
|
||||
"_ChnYctHm.js",
|
||||
"_CS5Tuebd.js"
|
||||
]
|
||||
},
|
||||
"_DXhpcOT6.js": {
|
||||
"file": "_app/immutable/chunks/DXhpcOT6.js",
|
||||
"name": "preload-helper"
|
||||
},
|
||||
"_Dt4wv1ei.js": {
|
||||
"file": "_app/immutable/chunks/Dt4wv1ei.js",
|
||||
"name": "legacy",
|
||||
"imports": [
|
||||
"_egdMPJ-g.js"
|
||||
]
|
||||
},
|
||||
"_RoomCanvas.DJ9xbYNe.css": {
|
||||
"file": "_app/immutable/assets/RoomCanvas.DJ9xbYNe.css",
|
||||
"src": "_RoomCanvas.DJ9xbYNe.css"
|
||||
},
|
||||
"_egdMPJ-g.js": {
|
||||
"file": "_app/immutable/chunks/egdMPJ-g.js",
|
||||
"name": "index-client"
|
||||
},
|
||||
"_vL8MaPP-.js": {
|
||||
"file": "_app/immutable/chunks/vL8MaPP-.js",
|
||||
"name": "navigation",
|
||||
"imports": [
|
||||
"_DKRuQnts.js"
|
||||
]
|
||||
},
|
||||
"node_modules/@sveltejs/kit/src/runtime/client/entry.js": {
|
||||
"file": "_app/immutable/entry/start.DNbyqWQO.js",
|
||||
"name": "entry/start",
|
||||
"src": "node_modules/@sveltejs/kit/src/runtime/client/entry.js",
|
||||
"isEntry": true,
|
||||
"imports": [
|
||||
"_DKRuQnts.js"
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -1 +0,0 @@
|
||||
.course-selector.svelte-1x3d7ra{border-bottom:1px solid #eee;margin-bottom:20px;padding-bottom:20px}.add-session.svelte-1x3d7ra{background:#f8f9fa;border-radius:8px;margin-bottom:20px;padding:15px}.form-row.svelte-1x3d7ra{gap:10px;display:flex}.sessions-grid.svelte-1x3d7ra{grid-template-columns:repeat(auto-fill,minmax(250px,1fr));gap:20px;display:grid}.session-block.svelte-1x3d7ra{border:1px solid #ddd;border-radius:8px;overflow:hidden}.session-header.svelte-1x3d7ra{background:#eee;justify-content:space-between;align-items:center;padding:10px;display:flex}.slots-list.svelte-1x3d7ra{padding:10px}.slot-item.svelte-1x3d7ra{border-bottom:1px solid #f0f0f0;justify-content:space-between;padding:5px 0;display:flex}.delete-btn.svelte-1x3d7ra{color:#dc3545;cursor:pointer;background:0 0;border:none;font-weight:700}.modal-overlay.svelte-1x3d7ra{background:#00000080;justify-content:center;align-items:center;display:flex;position:fixed;inset:0}.modal.svelte-1x3d7ra{background:#fff;border-radius:8px;width:400px;padding:30px}.field.svelte-1x3d7ra{margin-bottom:15px}.field.svelte-1x3d7ra label:where(.svelte-1x3d7ra){margin-bottom:5px;display:block}.field.svelte-1x3d7ra input:where(.svelte-1x3d7ra),.field.svelte-1x3d7ra select:where(.svelte-1x3d7ra){width:100%;padding:8px}.modal-actions.svelte-1x3d7ra{justify-content:flex-end;gap:10px;margin-top:20px;display:flex}.primary.svelte-1x3d7ra{color:#fff;background:#007bff;border:none;border-radius:4px;padding:8px 16px}
|
||||
@@ -1 +0,0 @@
|
||||
.login-container.svelte-1x05zx6{border:1px solid #ccc;border-radius:8px;max-width:400px;margin:100px auto;padding:20px}.field.svelte-1x05zx6{margin-bottom:15px}label.svelte-1x05zx6{margin-bottom:5px;display:block}input.svelte-1x05zx6{box-sizing:border-box;width:100%;padding:8px}.error.svelte-1x05zx6{color:red;margin-bottom:15px}button.svelte-1x05zx6{color:#fff;cursor:pointer;background:#007bff;border:none;border-radius:4px;width:100%;padding:10px}button.svelte-1x05zx6:disabled{background:#ccc}
|
||||
@@ -1 +0,0 @@
|
||||
.checkin-page.svelte-1gdz5lm{text-align:center;max-width:800px;margin:40px auto}.identity-selector.svelte-1gdz5lm{background:#f8f9fa;border-radius:8px;margin-bottom:20px;padding:20px}select.svelte-1gdz5lm{padding:8px;font-size:1.1em}.error.svelte-1gdz5lm{color:red}.success.svelte-1gdz5lm{color:#28a745;font-size:1.2em}.warning.svelte-1gdz5lm{color:#856404;background:#fff3cd;border-radius:4px;padding:10px}.map-container.svelte-1gdz5lm{margin-top:30px}
|
||||
@@ -1 +0,0 @@
|
||||
nav.svelte-1qg5d05{background:#f8f9fa;border-bottom:1px solid #dee2e6;padding:10px 20px}.nav-content.svelte-1qg5d05{justify-content:space-between;align-items:center;max-width:1200px;margin:0 auto;display:flex}.links.svelte-1qg5d05 a:where(.svelte-1qg5d05){color:#333;margin-right:20px;text-decoration:none}.links.svelte-1qg5d05 a:where(.svelte-1qg5d05):hover{color:#007bff}main.svelte-1qg5d05{max-width:1200px;margin:20px auto;padding:0 20px}
|
||||
@@ -1 +0,0 @@
|
||||
.welcome.svelte-1uha8ag{text-align:center;background:#f8f9fa;border-radius:12px;max-width:600px;margin:100px auto;padding:40px}h1.svelte-1uha8ag{color:#333;margin-bottom:10px;font-size:2.5em}p.svelte-1uha8ag{color:#666;font-size:1.2em}.actions.svelte-1uha8ag{margin-top:40px}.btn.svelte-1uha8ag{color:#fff;background:#007bff;border-radius:6px;padding:12px 30px;font-weight:700;text-decoration:none}.footer.svelte-1uha8ag{color:#888;margin-top:60px;font-size:.9em}
|
||||
@@ -1 +0,0 @@
|
||||
.course-selector.svelte-1jef3w8{margin-bottom:20px}.session-card.svelte-1jef3w8{border:1px solid #ddd;border-radius:8px;margin-bottom:15px;padding:15px}.slot-row.svelte-1jef3w8{border-top:1px solid #eee;justify-content:space-between;align-items:center;padding:10px 0;display:flex}.status-badge.svelte-1jef3w8{text-transform:uppercase;border-radius:12px;margin-right:10px;padding:2px 8px;font-size:.8em}.status-badge.closed.svelte-1jef3w8{color:#fff;background:#6c757d}.status-badge.open.svelte-1jef3w8{color:#fff;background:#28a745}.status-badge.locked.svelte-1jef3w8{color:#000;background:#ffc107}.checkin-code.svelte-1jef3w8{background:#f0f0f0;border-radius:4px;margin-left:10px;padding:2px 5px}.actions.svelte-1jef3w8 button:where(.svelte-1jef3w8){margin-left:5px}
|
||||
@@ -1 +0,0 @@
|
||||
.selectors.svelte-190s2eg{margin-bottom:20px}select.svelte-190s2eg{margin-right:10px;padding:5px}.matrix-container.svelte-190s2eg{overflow-x:auto}table.svelte-190s2eg{border-collapse:collapse;background:#fff;width:100%}th.svelte-190s2eg,td.svelte-190s2eg{text-align:center;border:1px solid #ddd;padding:10px}th.svelte-190s2eg{background:#f8f9fa}.cell.svelte-190s2eg{cursor:pointer;width:60px;height:40px}.cell.svelte-190s2eg:hover{background:#f0f0f0}.cell.present.svelte-190s2eg{color:#155724;background:#d4edda;font-weight:700}
|
||||
@@ -1 +0,0 @@
|
||||
.management-grid.svelte-nbog41{grid-template-columns:300px 1fr;gap:30px;display:grid}.course-item.svelte-nbog41{cursor:pointer;border:1px solid #eee;border-radius:4px;margin-bottom:5px;padding:10px}.course-item.selected.svelte-nbog41{background:#e7f1ff;border-color:#007bff}.student-actions.svelte-nbog41{background:#f8f9fa;border-radius:8px;margin-bottom:20px;padding:15px}.import-box.svelte-nbog41{margin-top:10px;font-size:.9em}table.svelte-nbog41{border-collapse:collapse;width:100%}th.svelte-nbog41,td.svelte-nbog41{text-align:left;border-bottom:1px solid #eee;padding:10px}input.svelte-nbog41{margin-right:5px;padding:6px}
|
||||
@@ -1 +0,0 @@
|
||||
.export-grid.svelte-128ylb7{grid-template-columns:1fr 1fr;gap:40px;margin-top:20px;display:grid}.export-card.svelte-128ylb7{background:#f8f9fa;border:1px solid #dee2e6;border-radius:8px;margin:15px 0;padding:20px}.btn-group.svelte-128ylb7{gap:10px;display:flex}button.svelte-128ylb7{cursor:pointer;padding:8px 16px}button.small.svelte-128ylb7{padding:4px 8px;font-size:.9em}.session-export-row.svelte-128ylb7{border-bottom:1px solid #eee;justify-content:space-between;align-items:center;padding:8px 0;display:flex}select.svelte-128ylb7{width:100%;margin-bottom:10px;padding:8px}
|
||||
@@ -1 +0,0 @@
|
||||
.selectors.svelte-1do7mxm{margin-bottom:20px}select.svelte-1do7mxm{margin-right:10px;padding:5px}.notes-container.svelte-1do7mxm{grid-template-columns:1fr 300px;gap:20px;display:grid}.note-editor.svelte-1do7mxm{background:#f8f9fa;border-radius:8px;padding:20px}textarea.svelte-1do7mxm{width:100%;height:100px;margin:10px 0}.primary.svelte-1do7mxm{color:#fff;background:#007bff;border:none;border-radius:4px;padding:8px 16px}.note-item.svelte-1do7mxm{border-bottom:1px solid #ddd;padding:5px 0;font-size:.9em}.note-item.svelte-1do7mxm p:where(.svelte-1do7mxm){margin:5px 0}
|
||||
@@ -1 +0,0 @@
|
||||
.management-grid.svelte-2e9svb{grid-template-columns:200px 1fr;gap:20px;display:grid}.room-item.svelte-2e9svb{cursor:pointer;border:1px solid #eee;border-radius:4px;margin-bottom:5px;padding:10px}.room-item.selected.svelte-2e9svb{background:#e7f1ff;border-color:#007bff}.editor-header.svelte-2e9svb{justify-content:space-between;align-items:center;margin-bottom:10px;display:flex}.toolbar.svelte-2e9svb button:where(.svelte-2e9svb){margin-right:5px}.save-btn.svelte-2e9svb{color:#fff;background:#28a745;border:none;border-radius:4px;padding:5px 15px}.canvas-container.svelte-2e9svb{gap:20px;display:flex}.properties-panel.svelte-2e9svb{background:#f8f9fa;border-radius:8px;width:200px;padding:15px}.field.svelte-2e9svb{margin-bottom:10px}.field.svelte-2e9svb label:where(.svelte-2e9svb){color:#666;font-size:.8em;display:block}.field.svelte-2e9svb input:where(.svelte-2e9svb){width:100%;padding:4px}.delete-btn.svelte-2e9svb{color:red;width:100%;margin-top:10px}
|
||||
@@ -1 +0,0 @@
|
||||
.room-canvas.svelte-1i40qao{-webkit-user-select:none;user-select:none;background:#fff;border:1px solid #ccc}.room-canvas.editable.svelte-1i40qao{cursor:crosshair}.element.svelte-1i40qao{cursor:pointer}.element.seat.svelte-1i40qao rect:where(.svelte-1i40qao){fill:#fff;stroke:#007bff;stroke-width:2px}.element.seat.svelte-1i40qao text:where(.svelte-1i40qao){fill:#007bff;font-size:14px;font-weight:700}.element.seat.occupied.svelte-1i40qao rect:where(.svelte-1i40qao){fill:#e7f1ff;stroke:#6c757d}.element.seat.occupied.svelte-1i40qao text:where(.svelte-1i40qao){fill:#6c757d}.element.seat.is-mine.svelte-1i40qao rect:where(.svelte-1i40qao){fill:#28a745;stroke:#1e7e34}.element.seat.is-mine.svelte-1i40qao text:where(.svelte-1i40qao){fill:#fff}.element.selected.svelte-1i40qao rect:where(.svelte-1i40qao){stroke:#ffc107;stroke-width:3px}.student-name.svelte-1i40qao{fill:#333;font-size:10px}
|
||||
@@ -1 +0,0 @@
|
||||
typeof window<`u`&&((window.__svelte??={}).v??=new Set).add(`5`);
|
||||
@@ -1 +0,0 @@
|
||||
import{$ as e,B as t,D as n,E as r,F as i,I as a,J as o,L as s,Q as c,R as l,S as u,T as d,V as f,Y as p,_ as m,f as h,g,h as _,i as v,j as y,u as b,v as x,w as S,y as C}from"./egdMPJ-g.js";import"./BMRk7WTg.js";var w=u(`<defs><pattern id="grid" patternUnits="userSpaceOnUse"><path fill="none" stroke="#eee" stroke-width="1"></path></pattern></defs><rect width="100%" height="100%" fill="url(#grid)"></rect>`,1),T=u(`<text text-anchor="middle" class="student-name svelte-1i40qao"> </text>`),E=u(`<rect rx="4" class="svelte-1i40qao"></rect><text text-anchor="middle" dominant-baseline="middle" class="svelte-1i40qao"> </text><!>`,1),D=u(`<rect fill="#e9ecef" stroke="#dee2e6" class="svelte-1i40qao"></rect>`),O=u(`<rect fill="#ffeeba" stroke="#ffe082" class="svelte-1i40qao"></rect><text text-anchor="middle" dominant-baseline="middle" style="font-size: 10px;" class="svelte-1i40qao">DOOR</text>`,1),k=u(`<g><!></g>`),A=u(`<svg width="800" height="600"><!><!></svg>`);function j(u,S){p(S,!0);let j=v(S,`elements`,31,()=>l([])),M=v(S,`editable`,3,!1),N=v(S,`selectedId`,3,null),P=v(S,`occupiedSeatIds`,19,()=>[]),F=v(S,`mySeatId`,3,null),I=v(S,`studentNames`,19,()=>({})),L=f(null),R=0,z=0;function B(e,n){if(!M()){S.onElementClick?.(n);return}t(L,n.id,!0),R=e.clientX-n.x*40,z=e.clientY-n.y*40}function V(e){if(!n(L)||!M())return;let t=j().findIndex(e=>e.id===n(L));if(t===-1)return;let r=Math.round((e.clientX-R)/10)*10/40,i=Math.round((e.clientY-z)/10)*10/40;j(j()[t]={...j()[t],x:r,y:i},!0)}function H(){n(L)&&M()&&S.onLayoutChange?.(j()),t(L,null)}var U=A();let W;var G=i(U),K=t=>{var n=w(),r=a(n),o=i(r);b(o,`width`,40),b(o,`height`,40),b(i(o),`d`,`M 40 0 L 0 0 0 40`),e(o),e(r),c(),C(t,n)};m(G,e=>{M()&&e(K)}),_(s(G),17,j,g,(t,r)=>{var o=k();let c;var l=i(o),u=t=>{var o=E(),c=a(o),l=s(c),u=i(l,!0);e(l);var d=s(l),f=t=>{var a=T(),o=i(a,!0);e(a),y(()=>{b(a,`x`,n(r).width*40/2),b(a,`y`,n(r).height*40+15),x(o,I()[n(r).id])}),C(t,a)};m(d,e=>{I()[n(r).id]&&e(f)}),y(()=>{b(c,`width`,n(r).width*40),b(c,`height`,n(r).height*40),b(l,`x`,n(r).width*40/2),b(l,`y`,n(r).height*40/2),x(u,n(r).label)}),C(t,o)},f=e=>{var t=D();y(()=>{b(t,`width`,n(r).width*40),b(t,`height`,n(r).height*40)}),C(e,t)},p=e=>{var t=O(),i=a(t),o=s(i);y(()=>{b(i,`width`,n(r).width*40),b(i,`height`,n(r).height*40),b(o,`x`,n(r).width*40/2),b(o,`y`,n(r).height*40/2)}),C(e,t)};m(l,e=>{n(r).type===`seat`?e(u):n(r).type===`table`?e(f,1):n(r).type===`door`&&e(p,2)}),e(o),y(e=>{b(o,`transform`,`translate(${n(r).x*40}, ${n(r).y*40})`),c=h(o,0,`element ${n(r).type??``}`,`svelte-1i40qao`,c,e)},[()=>({selected:N()===n(r).id,occupied:n(r).type===`seat`&&P().includes(n(r).id),"is-mine":n(r).id===F()})]),d(`mousedown`,o,e=>B(e,n(r))),C(t,o)}),e(U),y(()=>W=h(U,0,`room-canvas svelte-1i40qao`,null,W,{editable:M()})),d(`mousemove`,U,V),d(`mouseup`,U,H),r(`mouseleave`,U,H),C(u,U),o()}S([`mousemove`,`mouseup`,`mousedown`]);export{j as t};
|
||||
@@ -1 +0,0 @@
|
||||
import{K as e}from"./egdMPJ-g.js";import"./ChnYctHm.js";var t=e(localStorage.getItem(`token`));t.subscribe(e=>{e?localStorage.setItem(`token`,e):localStorage.removeItem(`token`)});function n(){t.set(null)}export{t as n,n as t};
|
||||
@@ -1 +0,0 @@
|
||||
import"./egdMPJ-g.js";
|
||||
File diff suppressed because one or more lines are too long
@@ -1 +0,0 @@
|
||||
import{G as e}from"./egdMPJ-g.js";import"./ChnYctHm.js";import{n as t}from"./CS5Tuebd.js";var n=`/api`;async function r(r,i){let a=e(t),o=await fetch(n+r,{...i,headers:{"Content-Type":`application/json`,...a?{Authorization:`Bearer ${a}`}:{},...i?.headers}});if(o.status,!o.ok){let e=await o.json().catch(()=>({error:o.statusText}));throw Error(e.error||o.statusText)}return o.status===204?{}:o.json()}var i={auth:{login:(e,t)=>r(`/auth/login`,{method:`POST`,body:JSON.stringify({email:e,password:t})})},admin:{courses:{list:()=>r(`/admin/courses`),create:(e,t)=>r(`/admin/courses`,{method:`POST`,body:JSON.stringify({name:e,semester:t})}),listStudents:e=>r(`/admin/courses/${e}/students`),addStudent:(e,t)=>r(`/admin/courses/${e}/students`,{method:`POST`,body:JSON.stringify({name:t})}),importStudents:(r,i)=>{let a=new FormData;return a.append(`file`,i),fetch(`${n}/admin/courses/${r}/students/import`,{method:`POST`,headers:{Authorization:`Bearer ${e(t)}`},body:a}).then(e=>e.json())}},students:{delete:e=>r(`/admin/students/${e}`,{method:`DELETE`}),getAttendance:e=>r(`/admin/students/${e}/attendance`),getNotes:e=>r(`/admin/students/${e}/notes`)},rooms:{list:()=>r(`/admin/rooms`),create:(e,t)=>r(`/admin/rooms`,{method:`POST`,body:JSON.stringify({name:e,layout:t})}),get:e=>r(`/admin/rooms/${e}`),updateLayout:(e,t)=>r(`/admin/rooms/${e}/layout`,{method:`PUT`,body:JSON.stringify(t)})},sessions:{list:e=>r(`/admin/sessions?course_id=${e}`),create:(e,t,n)=>r(`/admin/sessions`,{method:`POST`,body:JSON.stringify({course_id:e,week_nr:t,date:n})}),getAttendance:e=>r(`/admin/sessions/${e}/attendance`)},slots:{create:(e,t,n,i,a)=>r(`/admin/slots`,{method:`POST`,body:JSON.stringify({session_id:e,tutor_id:t,start_time:n,end_time:i,room_id:a})}),updateStatus:(e,t)=>r(`/admin/slots/${e}/status`,{method:`PATCH`,body:JSON.stringify({status:t})}),delete:e=>r(`/admin/slots/${e}`,{method:`DELETE`}),addAttendance:(e,t)=>r(`/admin/slots/${e}/attendance`,{method:`POST`,body:JSON.stringify({student_id:t})}),deleteAttendance:(e,t)=>r(`/admin/slots/${e}/attendance/${t}`,{method:`DELETE`}),getNotes:e=>r(`/admin/slots/${e}/notes`),upsertNote:(e,t,n)=>r(`/admin/slots/${e}/notes/${t}`,{method:`PUT`,body:JSON.stringify({content:n})})},export:{sessionCsv:e=>`${n}/admin/export/session/${e}/csv`,sessionMd:e=>`${n}/admin/export/session/${e}/md`,courseCsv:e=>`${n}/admin/export/course/${e}/csv`,courseMd:e=>`${n}/admin/export/course/${e}/md`,backup:()=>`${n}/admin/backup`}},checkin:{getInfo:e=>r(`/api/checkin/${e}`),getStudents:e=>r(`/api/checkin/${e}/students`),post:(e,t,n)=>r(`/api/checkin`,{method:`POST`,body:JSON.stringify({code:e,student_id:t,seat_id:n})})}};export{i as t};
|
||||
@@ -1 +0,0 @@
|
||||
var e=`modulepreload`,t=function(e){return`/`+e},n={},r=function(r,i,a){let o=Promise.resolve();if(i&&i.length>0){let r=document.getElementsByTagName(`link`),s=document.querySelector(`meta[property=csp-nonce]`),c=s?.nonce||s?.getAttribute(`nonce`);function l(e){return Promise.all(e.map(e=>Promise.resolve(e).then(e=>({status:`fulfilled`,value:e}),e=>({status:`rejected`,reason:e}))))}o=l(i.map(i=>{if(i=t(i,a),i in n)return;n[i]=!0;let o=i.endsWith(`.css`),s=o?`[rel="stylesheet"]`:``;if(a)for(let e=r.length-1;e>=0;e--){let t=r[e];if(t.href===i&&(!o||t.rel===`stylesheet`))return}else if(document.querySelector(`link[href="${i}"]${s}`))return;let l=document.createElement(`link`);if(l.rel=o?`stylesheet`:e,o||(l.as=`script`),l.crossOrigin=``,l.href=i,c&&l.setAttribute(`nonce`,c),document.head.appendChild(l),o)return new Promise((e,t)=>{l.addEventListener(`load`,e),l.addEventListener(`error`,()=>t(Error(`Unable to preload CSS for ${i}`)))})}))}function s(e){let t=new Event(`vite:preloadError`,{cancelable:!0});if(t.payload=e,window.dispatchEvent(t),!t.defaultPrevented)throw e}return o.then(e=>{for(let t of e||[])t.status===`rejected`&&s(t.reason);return r().catch(s)})};export{r as t};
|
||||
@@ -1 +0,0 @@
|
||||
import{Z as e}from"./egdMPJ-g.js";e();
|
||||
File diff suppressed because one or more lines are too long
@@ -1 +0,0 @@
|
||||
import"./DKRuQnts.js";
|
||||
@@ -1,2 +0,0 @@
|
||||
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["_app/immutable/nodes/0.Ddm7H9s-.js","_app/immutable/chunks/egdMPJ-g.js","_app/immutable/chunks/BMRk7WTg.js","_app/immutable/chunks/Dt4wv1ei.js","_app/immutable/nodes/1.DFtas2MP.js","_app/immutable/chunks/DKRuQnts.js","_app/immutable/chunks/ChnYctHm.js","_app/immutable/nodes/2.BZoTn0Qw.js","_app/immutable/chunks/vL8MaPP-.js","_app/immutable/chunks/CS5Tuebd.js","_app/immutable/assets/2.BQQYIMLK.css","_app/immutable/nodes/3.CTDAi9vF.js","_app/immutable/assets/3.Dzrf4zX4.css","_app/immutable/nodes/4.DmI7a2Dc.js","_app/immutable/chunks/DNBIa2Bh.js","_app/immutable/assets/4.b2bZrlfC.css","_app/immutable/nodes/5.CFS15qnw.js","_app/immutable/assets/5.DDTZ5v3E.css","_app/immutable/nodes/6.yU_a9j7E.js","_app/immutable/assets/6.Bfx4fGBa.css","_app/immutable/nodes/7.CN50pfZX.js","_app/immutable/assets/7.DkoPrtit.css","_app/immutable/nodes/8.Bs7k9fxR.js","_app/immutable/chunks/BYEkGdSH.js","_app/immutable/assets/RoomCanvas.DJ9xbYNe.css","_app/immutable/assets/8.DigLoqRm.css","_app/immutable/nodes/9.wReU4Q8t.js","_app/immutable/assets/9.C7KB5jd4.css","_app/immutable/nodes/10.BLeYuhst.js","_app/immutable/assets/10.BhkUjvVr.css","_app/immutable/nodes/11.DB6yXGVc.js","_app/immutable/assets/11.LkBq3xGq.css","_app/immutable/nodes/12.5DAleB6K.js","_app/immutable/assets/12.BboNMIwd.css"])))=>i.map(i=>d[i]);
|
||||
import{$ as e,B as t,C as n,D as r,F as i,H as a,I as o,J as s,L as c,M as l,N as u,V as d,Y as f,_ as p,b as m,i as h,j as g,k as _,n as v,p as y,r as b,s as x,v as S,x as C,y as w}from"../chunks/egdMPJ-g.js";import{t as T}from"../chunks/DXhpcOT6.js";import"../chunks/BMRk7WTg.js";var E={},D=C(`<div id="svelte-announcer" aria-live="assertive" aria-atomic="true" style="position: absolute; left: 0; top: 0; clip: rect(0 0 0 0); clip-path: inset(50%); overflow: hidden; white-space: nowrap; width: 1px; height: 1px"><!></div>`),O=C(`<!> <!>`,1);function k(b,C){f(C,!0);let T=h(C,`components`,23,()=>[]),E=h(C,`data_0`,3,null),k=h(C,`data_1`,3,null),A=h(C,`data_2`,3,null);u(()=>C.stores.page.set(C.page)),l(()=>{C.stores,C.page,C.constructors,T(),C.form,E(),k(),A(),C.stores.page.notify()});let j=d(!1),M=d(!1),N=d(null);v(()=>{let e=C.stores.page.subscribe(()=>{r(j)&&(t(M,!0),_().then(()=>{t(N,document.title||`untitled page`,!0)}))});return t(j,!0),e});let P=a(()=>C.constructors[2]);var F=O(),I=o(F),L=e=>{let t=a(()=>C.constructors[0]);var n=m();y(o(n),()=>r(t),(e,t)=>{x(t(e,{get data(){return E()},get form(){return C.form},get params(){return C.page.params},children:(e,t)=>{var n=m(),i=o(n),s=e=>{let t=a(()=>C.constructors[1]);var n=m();y(o(n),()=>r(t),(e,t)=>{x(t(e,{get data(){return k()},get form(){return C.form},get params(){return C.page.params},children:(e,t)=>{var n=m();y(o(n),()=>r(P),(e,t)=>{x(t(e,{get data(){return A()},get form(){return C.form},get params(){return C.page.params}}),e=>T()[2]=e,()=>T()?.[2])}),w(e,n)},$$slots:{default:!0}}),e=>T()[1]=e,()=>T()?.[1])}),w(e,n)},c=e=>{let t=a(()=>C.constructors[1]);var n=m();y(o(n),()=>r(t),(e,t)=>{x(t(e,{get data(){return k()},get form(){return C.form},get params(){return C.page.params}}),e=>T()[1]=e,()=>T()?.[1])}),w(e,n)};p(i,e=>{C.constructors[2]?e(s):e(c,-1)}),w(e,n)},$$slots:{default:!0}}),e=>T()[0]=e,()=>T()?.[0])}),w(e,n)},R=e=>{let t=a(()=>C.constructors[0]);var n=m();y(o(n),()=>r(t),(e,t)=>{x(t(e,{get data(){return E()},get form(){return C.form},get params(){return C.page.params}}),e=>T()[0]=e,()=>T()?.[0])}),w(e,n)};p(I,e=>{C.constructors[1]?e(L):e(R,-1)});var z=c(I,2),B=t=>{var a=D(),o=i(a),s=e=>{var t=n();g(()=>S(t,r(N))),w(e,t)};p(o,e=>{r(M)&&e(s)}),e(a),w(t,a)};p(z,e=>{r(j)&&e(B)}),w(b,F),s()}var A=b(k),j=[()=>T(()=>import(`../nodes/0.Ddm7H9s-.js`),__vite__mapDeps([0,1,2,3])),()=>T(()=>import(`../nodes/1.DFtas2MP.js`),__vite__mapDeps([4,1,5,6,2])),()=>T(()=>import(`../nodes/2.BZoTn0Qw.js`),__vite__mapDeps([7,1,5,6,8,2,3,9,10])),()=>T(()=>import(`../nodes/3.CTDAi9vF.js`),__vite__mapDeps([11,1,5,6,8,2,3,9,12])),()=>T(()=>import(`../nodes/4.DmI7a2Dc.js`),__vite__mapDeps([13,1,2,14,6,9,15])),()=>T(()=>import(`../nodes/5.CFS15qnw.js`),__vite__mapDeps([16,1,2,14,6,9,17])),()=>T(()=>import(`../nodes/6.yU_a9j7E.js`),__vite__mapDeps([18,1,2,14,6,9,19])),()=>T(()=>import(`../nodes/7.CN50pfZX.js`),__vite__mapDeps([20,1,2,14,6,9,21])),()=>T(()=>import(`../nodes/8.Bs7k9fxR.js`),__vite__mapDeps([22,1,2,23,24,14,6,9,25])),()=>T(()=>import(`../nodes/9.wReU4Q8t.js`),__vite__mapDeps([26,1,2,23,24,14,6,9,27])),()=>T(()=>import(`../nodes/10.BLeYuhst.js`),__vite__mapDeps([28,1,2,14,6,9,29])),()=>T(()=>import(`../nodes/11.DB6yXGVc.js`),__vite__mapDeps([30,1,5,6,8,2,3,14,9,31])),()=>T(()=>import(`../nodes/12.5DAleB6K.js`),__vite__mapDeps([32,1,5,6,2,23,24,14,9,33]))],M=[],N={"/":[3],"/admin":[4,[2]],"/admin/attendance":[5,[2]],"/admin/courses":[6,[2]],"/admin/export":[7,[2]],"/admin/notes":[8,[2]],"/admin/rooms":[9,[2]],"/admin/sessions":[10,[2]],"/login":[11],"/s/[code]":[12]},P={handleError:(({error:e})=>{console.error(e)}),reroute:(()=>{}),transport:{}},F=Object.fromEntries(Object.entries(P.transport).map(([e,t])=>[e,t.decode])),I=Object.fromEntries(Object.entries(P.transport).map(([e,t])=>[e,t.encode])),L=!1,R=(e,t)=>F[e](t);export{R as decode,F as decoders,N as dictionary,I as encoders,L as hash,P as hooks,E as matchers,j as nodes,A as root,M as server_loads};
|
||||
@@ -1 +0,0 @@
|
||||
import{n as e,s as t}from"../chunks/DKRuQnts.js";export{t as load_css,e as start};
|
||||
@@ -1 +0,0 @@
|
||||
import{I as e,b as t,m as n,y as r}from"../chunks/egdMPJ-g.js";import"../chunks/BMRk7WTg.js";import"../chunks/Dt4wv1ei.js";function i(i,a){var o=t();n(e(o),a,`default`,{},null),r(i,o)}export{i as component};
|
||||
@@ -1 +0,0 @@
|
||||
import{$ as e,F as t,I as n,J as r,L as i,Y as a,j as o,v as s,x as c,y as l}from"../chunks/egdMPJ-g.js";import{a as u,i as d,r as f}from"../chunks/DKRuQnts.js";import"../chunks/BMRk7WTg.js";var p={get data(){return u.data},get error(){return u.error},get form(){return u.form},get params(){return u.params},get route(){return u.route},get state(){return u.state},get status(){return u.status},get url(){return u.url}};Object.defineProperty({get from(){return d.current?d.current.from:null},get to(){return d.current?d.current.to:null},get type(){return d.current?d.current.type:null},get willUnload(){return d.current?d.current.willUnload:null},get delta(){return d.current?d.current.delta:null},get complete(){return d.current?d.current.complete:null}},`current`,{get(){throw Error(`Replace navigating.current.<prop> with navigating.<prop>`)}}),f.updated.check;var m=p,h=c(`<h1> </h1> <p> </p>`,1);function g(c,u){a(u,!0);var d=h(),f=n(d),p=t(f,!0);e(f);var g=i(f,2),_=t(g,!0);e(g),o(()=>{s(p,m.status),s(_,m.error?.message)}),l(c,d),r()}export{g as component};
|
||||
@@ -1 +0,0 @@
|
||||
import{$ as e,B as t,D as n,F as r,I as i,J as a,L as o,M as s,R as c,T as l,V as u,Y as d,_ as f,c as p,d as m,g as h,h as g,j as _,l as v,n as y,v as b,w as x,x as S,y as C}from"../chunks/egdMPJ-g.js";import"../chunks/BMRk7WTg.js";import{t as w}from"../chunks/DNBIa2Bh.js";var T=S(`<option> </option>`),E=S(`<div class="slot-item svelte-1x3d7ra"><span> </span> <button class="delete-btn svelte-1x3d7ra">×</button></div>`),D=S(`<div class="session-block svelte-1x3d7ra"><div class="session-header svelte-1x3d7ra"><strong> </strong> <button>+ Add Slot</button></div> <div class="slots-list svelte-1x3d7ra"></div></div>`),O=S(`<option> </option>`),k=S(`<div class="modal-overlay svelte-1x3d7ra"><div class="modal svelte-1x3d7ra"><h2>Add Slot to Session</h2> <div class="field svelte-1x3d7ra"><label class="svelte-1x3d7ra">Tutor ID (Mock: 1)</label> <input type="number" placeholder="Tutor ID" class="svelte-1x3d7ra"/></div> <div class="field svelte-1x3d7ra"><label class="svelte-1x3d7ra">Room (Optional)</label> <select class="svelte-1x3d7ra"><option>None</option><!></select></div> <div class="field svelte-1x3d7ra"><label class="svelte-1x3d7ra">Start Time</label> <input type="time" class="svelte-1x3d7ra"/></div> <div class="field svelte-1x3d7ra"><label class="svelte-1x3d7ra">End Time</label> <input type="time" class="svelte-1x3d7ra"/></div> <div class="modal-actions svelte-1x3d7ra"><button>Cancel</button> <button class="primary svelte-1x3d7ra">Create Slot</button></div></div></div>`),A=S(`<h1>Schedule Sessions & Slots</h1> <div class="management-grid"><div class="sessions-list"><div class="course-selector svelte-1x3d7ra"><label>Course:</label> <select></select></div> <div class="add-session svelte-1x3d7ra"><h3>Add Session</h3> <div class="form-row svelte-1x3d7ra"><input type="number" placeholder="Week" style="width: 60px"/> <input type="date"/> <button>Add</button></div></div> <div class="sessions-grid svelte-1x3d7ra"></div></div> <!></div>`,1);function j(x,S){d(S,!0);let j=u(c([])),M=u(null),N=u(c([])),P=u(c([])),F=u(1),I=u(c(new Date().toISOString().split(`T`)[0])),L=u(null),R=u(null),z=u(null),B=u(`09:00`),V=u(`11:00`);y(async()=>{t(j,await w.admin.courses.list(),!0),t(N,await w.admin.rooms.list(),!0),n(j).length>0&&t(M,n(j)[0].id,!0)}),s(()=>{n(M)&&H(n(M))});async function H(e){t(P,await w.admin.sessions.list(e),!0)}async function U(){if(n(M))try{await w.admin.sessions.create(n(M),n(F),n(I)),H(n(M))}catch(e){alert(e)}}async function ee(){if(!(!n(L)||!n(R)))try{await w.admin.slots.create(n(L),n(R),n(B),n(V),n(z)||void 0),n(M)&&H(n(M)),t(L,null)}catch(e){alert(e)}}async function te(e){if(confirm(`Are you sure?`))try{await w.admin.slots.delete(e),n(M)&&H(n(M))}catch(e){alert(e)}}var W=A(),G=o(i(W),2),K=r(G),q=r(K),J=o(r(q),2);g(J,21,()=>n(j),h,(t,i)=>{var a=T(),o=r(a,!0);e(a);var s={};_(()=>{b(o,n(i).name),s!==(s=n(i).id)&&(a.value=(a.__value=n(i).id)??``)}),C(t,a)}),e(J),e(q);var Y=o(q,2),X=o(r(Y),2),Z=r(X);v(Z);var Q=o(Z,2);v(Q);var ne=o(Q,2);e(X),e(Y);var $=o(Y,2);g($,21,()=>n(P),h,(i,a)=>{var s=D(),c=r(s),u=r(c),d=r(u);e(u);var f=o(u),p=o(f);e(c);var m=o(c,2);g(m,21,()=>n(a).slots||[],h,(t,i)=>{var a=E(),s=r(a),c=r(s);e(s);var u=o(s,2);e(a),_(()=>b(c,`${n(i).start_time??``}-${n(i).end_time??``}`)),l(`click`,u,()=>te(n(i).id)),C(t,a)}),e(m),e(s),_(()=>{b(d,`Week ${n(a).week_nr??``}`),b(f,` (${n(a).date??``}) `)}),l(`click`,p,()=>t(L,n(a).id,!0)),C(i,s)}),e($),e(K);var re=o(K,2),ie=i=>{var a=k(),s=r(a),c=o(r(s),2),u=o(r(c),2);v(u),e(c);var d=o(c,2),f=o(r(d),2),y=r(f);y.value=(y.__value=null,``),g(o(y),17,()=>n(N),h,(t,i)=>{var a=O(),o=r(a,!0);e(a);var s={};_(()=>{b(o,n(i).name),s!==(s=n(i).id)&&(a.value=(a.__value=n(i).id)??``)}),C(t,a)}),e(f),e(d);var x=o(d,2),S=o(r(x),2);v(S),e(x);var w=o(x,2),T=o(r(w),2);v(T),e(w);var E=o(w,2),D=r(E),A=o(D,2);e(E),e(s),e(a),p(u,()=>n(R),e=>t(R,e)),m(f,()=>n(z),e=>t(z,e)),p(S,()=>n(B),e=>t(B,e)),p(T,()=>n(V),e=>t(V,e)),l(`click`,D,()=>t(L,null)),l(`click`,A,ee),C(i,a)};f(re,e=>{n(L)&&e(ie)}),e(G),m(J,()=>n(M),e=>t(M,e)),p(Z,()=>n(F),e=>t(F,e)),p(Q,()=>n(I),e=>t(I,e)),l(`click`,ne,U),C(x,W),a()}x([`click`]);export{j as component};
|
||||
@@ -1 +0,0 @@
|
||||
import{$ as e,B as t,D as n,E as r,F as i,J as a,L as o,Y as s,_ as c,a as l,c as u,j as d,l as f,o as p,v as m,x as h,y as g,z as _}from"../chunks/egdMPJ-g.js";import{t as v}from"../chunks/DKRuQnts.js";import"../chunks/BMRk7WTg.js";import"../chunks/Dt4wv1ei.js";import{n as y}from"../chunks/CS5Tuebd.js";import"../chunks/vL8MaPP-.js";import{t as b}from"../chunks/DNBIa2Bh.js";var x=h(`<p class="error svelte-1x05zx6"> </p>`),S=h(`<div class="login-container svelte-1x05zx6"><h1>Tutor Login</h1> <form><div class="field svelte-1x05zx6"><label for="email" class="svelte-1x05zx6">Email</label> <input id="email" type="email" required="" class="svelte-1x05zx6"/></div> <div class="field svelte-1x05zx6"><label for="password" class="svelte-1x05zx6">Password</label> <input id="password" type="password" required="" class="svelte-1x05zx6"/></div> <!> <button type="submit" class="svelte-1x05zx6"> </button></form></div>`);function C(h,C){s(C,!1);let w=_(``),T=_(``),E=_(``),D=_(!1);async function O(){t(D,!0),t(E,``);try{let e=await b.auth.login(n(w),n(T));y.set(e.token),v(`/admin`)}catch(e){t(E,e.message||`Invalid credentials`)}finally{t(D,!1)}}l();var k=S(),A=o(i(k),2),j=i(A),M=o(i(j),2);f(M),e(j);var N=o(j,2),P=o(i(N),2);f(P),e(N);var F=o(N,2),I=t=>{var r=x(),a=i(r,!0);e(r),d(()=>m(a,n(E))),g(t,r)};c(F,e=>{n(E)&&e(I)});var L=o(F,2),R=i(L,!0);e(L),e(A),e(k),d(()=>{L.disabled=n(D),m(R,n(D)?`Logging in...`:`Login`)}),u(M,()=>n(w),e=>t(w,e)),u(P,()=>n(T),e=>t(T,e)),r(`submit`,A,p(O)),g(h,k),a()}export{C as component};
|
||||
@@ -1 +0,0 @@
|
||||
import{$ as e,B as t,D as n,F as r,H as i,I as a,J as o,L as s,R as c,U as l,V as u,W as d,Y as f,_ as p,d as m,g as h,h as g,j as _,n as v,v as y,x as b,y as x}from"../chunks/egdMPJ-g.js";import{r as S}from"../chunks/DKRuQnts.js";import"../chunks/BMRk7WTg.js";import{t as C}from"../chunks/DNBIa2Bh.js";import{t as w}from"../chunks/BYEkGdSH.js";var T=()=>{let e=S;return{page:{subscribe:e.page.subscribe},navigating:{subscribe:e.navigating.subscribe},updated:e.updated}},E={subscribe(e){return T().page.subscribe(e)}},D=b(`<p>Loading...</p>`),O=b(`<p class="error svelte-1gdz5lm"> </p>`),k=b(`<p class="warning svelte-1gdz5lm">Check-in is currently locked by the tutor.</p>`),A=b(`<option> </option>`),j=b(`<div class="identity-selector svelte-1gdz5lm"><label for="student">I am:</label> <select id="student" class="svelte-1gdz5lm"><option>Select your name...</option><!></select></div>`),M=b(`<p class="success svelte-1gdz5lm">You are checked in as <strong> </strong></p>`),N=b(`<h1> </h1> <!> <!> <div class="map-container svelte-1gdz5lm"><p>Select a seat to check in:</p> <!></div>`,1),P=b(`<div class="checkin-page svelte-1gdz5lm"><!></div>`);function F(b,S){f(S,!0);let T=()=>d(E,`$page`,F),[F,I]=l(),L=T().params.code,R=u(null),z=u(c([])),B=u(c([])),V=u(c([])),H=u(null),U=i(()=>n(B).find(e=>e.is_mine)),W=u(!0),G=u(``);v(async()=>{try{await K(),!n(U)&&n(R)?.status===`open`&&t(V,await C.checkin.getStudents(L),!0)}catch(e){t(G,e.message,!0)}finally{t(W,!1)}});async function K(){let e=await C.checkin.getInfo(L);t(R,e.slot,!0),t(z,e.layout||[],!0),t(B,e.attendances||[],!0)}async function q(e){if(!n(R)||n(R).status!==`open`||e.type!==`seat`||n(U)?.seat_id===e.id)return;let t=n(U)?.student_id||n(H);if(!t){alert(`Please select your name first`);return}try{await C.checkin.post(L,t,e.id),await K()}catch(e){alert(e.message)}}let J=i(()=>n(B).map(e=>e.seat_id).filter(e=>e!==null));var Y=P(),X=r(Y),Z=e=>{x(e,D())},Q=t=>{var i=O(),a=r(i,!0);e(i),_(()=>y(a,n(G))),x(t,i)},$=o=>{var c=N(),l=a(c),u=r(l);e(l);var d=s(l,2),f=e=>{x(e,k())};p(d,e=>{n(R).status===`locked`&&e(f)});var v=s(d,2),b=i=>{var a=j(),o=s(r(a),2),c=r(o);c.value=(c.__value=null,``),g(s(c),17,()=>n(V),h,(t,i)=>{var a=A(),o=r(a,!0);e(a);var s={};_(()=>{y(o,n(i).name),s!==(s=n(i).id)&&(a.value=(a.__value=n(i).id)??``)}),x(t,a)}),e(o),e(a),m(o,()=>n(H),e=>t(H,e)),x(i,a)},S=t=>{var i=M(),a=s(r(i)),o=r(a,!0);e(a),e(i),_(e=>y(o,e),[()=>n(V).find(e=>e.id===n(U).student_id)?.name||`Student`]),x(t,i)};p(v,e=>{!n(U)&&n(R).status===`open`?e(b):n(U)&&e(S,1)});var C=s(v,2),T=s(r(C),2);{let e=i(()=>n(U)?.seat_id);w(T,{get elements(){return n(z)},get occupiedSeatIds(){return n(J)},get mySeatId(){return n(e)},onElementClick:q})}e(C),_(()=>y(u,`Check-in: ${n(R).start_time??``} - ${n(R).end_time??``}`)),x(o,c)};p(X,e=>{n(W)?e(Z):n(G)?e(Q,1):n(R)&&e($,2)}),e(Y),x(b,Y),o(),I()}export{F as component};
|
||||
@@ -1 +0,0 @@
|
||||
import{$ as e,E as t,F as n,I as r,J as i,L as a,U as o,W as s,Y as c,_ as l,a as u,b as d,m as f,n as p,x as m,y as h}from"../chunks/egdMPJ-g.js";import{t as g}from"../chunks/DKRuQnts.js";import"../chunks/BMRk7WTg.js";import"../chunks/Dt4wv1ei.js";import{n as _,t as v}from"../chunks/CS5Tuebd.js";import"../chunks/vL8MaPP-.js";var y=m(`<nav class="svelte-1qg5d05"><div class="nav-content svelte-1qg5d05"><div class="links svelte-1qg5d05"><a href="/admin" class="svelte-1qg5d05">Dashboard</a> <a href="/admin/courses" class="svelte-1qg5d05">Courses</a> <a href="/admin/rooms" class="svelte-1qg5d05">Rooms</a> <a href="/admin/sessions" class="svelte-1qg5d05">Sessions</a> <a href="/admin/attendance" class="svelte-1qg5d05">Attendance</a> <a href="/admin/notes" class="svelte-1qg5d05">Notes</a> <a href="/admin/export" class="svelte-1qg5d05">Export</a></div> <button>Logout</button></div></nav> <main class="svelte-1qg5d05"><!></main>`,1);function b(m,b){c(b,!1);let x=()=>s(_,`$token`,S),[S,C]=o();p(()=>{x()||g(`/login`)});function w(){v(),g(`/login`)}u();var T=d(),E=r(T),D=i=>{var o=y(),s=r(o),c=n(s),l=a(n(c),2);e(c),e(s);var u=a(s,2);f(n(u),b,`default`,{},null),e(u),t(`click`,l,w),h(i,o)};l(E,e=>{x()&&e(D)}),h(m,T),i(),C()}export{b as component};
|
||||
@@ -1 +0,0 @@
|
||||
import{J as e,U as t,W as n,Y as r,a as i,n as a,x as o,y as s}from"../chunks/egdMPJ-g.js";import{t as c}from"../chunks/DKRuQnts.js";import"../chunks/BMRk7WTg.js";import"../chunks/Dt4wv1ei.js";import{n as l}from"../chunks/CS5Tuebd.js";import"../chunks/vL8MaPP-.js";var u=o(`<div class="welcome svelte-1uha8ag"><h1 class="svelte-1uha8ag">FPTutor Attendance</h1> <p class="svelte-1uha8ag">Efficiently tracking attendance and student observations.</p> <div class="actions svelte-1uha8ag"><a href="/login" class="btn svelte-1uha8ag">Tutor Login</a></div> <div class="footer svelte-1uha8ag"><p class="svelte-1uha8ag">Students: Please use the link provided by your tutor during the session.</p></div></div>`);function d(o,d){r(d,!1);let f=()=>n(l,`$token`,p),[p,m]=t();a(()=>{f()&&c(`/admin`)}),i(),s(o,u()),e(),m()}export{d as component};
|
||||
@@ -1 +0,0 @@
|
||||
import{$ as e,B as t,D as n,F as r,I as i,J as a,L as o,M as s,R as c,T as l,V as u,Y as d,_ as f,b as p,d as m,f as h,g,h as _,j as v,n as y,v as b,w as x,x as S,y as C}from"../chunks/egdMPJ-g.js";import"../chunks/BMRk7WTg.js";import{t as w}from"../chunks/DNBIa2Bh.js";var T=S(`<option> </option>`),E=S(`<p>Loading sessions...</p>`),D=S(`<code class="checkin-code svelte-1jef3w8"> </code>`),O=S(`<button class="svelte-1jef3w8">Open</button>`),k=S(`<button class="svelte-1jef3w8">Copy Link</button> <button class="svelte-1jef3w8">Lock</button> <button class="svelte-1jef3w8">Close</button>`,1),A=S(`<button class="svelte-1jef3w8">Unlock</button> <button class="svelte-1jef3w8">Close</button>`,1),j=S(`<div class="slot-row svelte-1jef3w8"><div class="slot-info"><span> </span> <strong> </strong> <!></div> <div class="actions svelte-1jef3w8"><!></div></div>`),M=S(`<p>No slots scheduled.</p>`),N=S(`<div class="session-card svelte-1jef3w8"><h2> </h2> <div class="slots"><!></div></div>`),P=S(`<div class="sessions"></div>`),F=S(`<h1>Admin Dashboard</h1> <div class="course-selector svelte-1jef3w8"><label for="course">Select Course:</label> <select id="course"></select></div> <!>`,1);function I(x,S){d(S,!0);let I=u(c([])),L=u(null),R=u(c([])),z=u(!1);y(async()=>{t(z,!0);try{t(I,await w.admin.courses.list(),!0),n(I).length>0&&t(L,n(I)[0].id,!0)}catch(e){console.error(e)}finally{t(z,!1)}}),s(()=>{n(L)!==null&&B(n(L))});async function B(e){t(z,!0);try{t(R,await w.admin.sessions.list(e),!0)}catch(e){console.error(e)}finally{t(z,!1)}}async function V(e,t){try{await w.admin.slots.updateStatus(e,t),n(L)&&B(n(L))}catch(e){alert(e)}}function H(e){let t=`${window.location.origin}/s/${e}`;navigator.clipboard.writeText(t),alert(`Link copied to clipboard`)}var U=F(),W=o(i(U),2),G=o(r(W),2);_(G,21,()=>n(I),g,(t,i)=>{var a=T(),o=r(a);e(a);var s={};v(()=>{b(o,`${n(i).name??``} (${n(i).semester??``})`),s!==(s=n(i).id)&&(a.value=(a.__value=n(i).id)??``)}),C(t,a)}),e(G),e(W);var K=o(W,2),q=e=>{C(e,E())},J=t=>{var a=P();_(a,21,()=>n(R),g,(t,a)=>{var s=N(),c=r(s),u=r(c);e(c);var d=o(c,2),m=r(d),y=t=>{var s=p();_(i(s),17,()=>n(a).slots,g,(t,a)=>{var s=j(),c=r(s),u=r(c),d=r(u,!0);e(u);var p=o(u,2),m=r(p);e(p);var g=o(p,2),_=t=>{var i=D(),o=r(i,!0);e(i),v(()=>b(o,n(a).code)),C(t,i)};f(g,e=>{n(a).code&&e(_)}),e(c);var y=o(c,2),x=r(y),S=e=>{var t=O();l(`click`,t,()=>V(n(a).id,`open`)),C(e,t)},w=e=>{var t=k(),r=i(t),s=o(r,2),c=o(s,2);l(`click`,r,()=>H(n(a).code)),l(`click`,s,()=>V(n(a).id,`locked`)),l(`click`,c,()=>V(n(a).id,`closed`)),C(e,t)},T=e=>{var t=A(),r=i(t),s=o(r,2);l(`click`,r,()=>V(n(a).id,`open`)),l(`click`,s,()=>V(n(a).id,`closed`)),C(e,t)};f(x,e=>{n(a).status===`closed`?e(S):n(a).status===`open`?e(w,1):n(a).status===`locked`&&e(T,2)}),e(y),e(s),v(()=>{h(u,1,`status-badge ${n(a).status??``}`,`svelte-1jef3w8`),b(d,n(a).status),b(m,`${n(a).start_time??``} - ${n(a).end_time??``}`)}),C(t,s)}),C(t,s)},x=e=>{C(e,M())};f(m,e=>{n(a).slots&&n(a).slots.length>0?e(y):e(x,-1)}),e(d),e(s),v(()=>b(u,`Week ${n(a).week_nr??``} - ${n(a).date??``}`)),C(t,s)}),e(a),C(t,a)};f(K,e=>{n(z)&&n(R).length===0?e(q):e(J,-1)}),m(G,()=>n(L),e=>t(L,e)),C(x,U),a()}x([`click`]);export{I as component};
|
||||
@@ -1 +0,0 @@
|
||||
import{$ as e,B as t,D as n,F as r,H as i,I as a,J as o,L as s,M as c,R as l,T as u,V as d,Y as f,_ as p,d as m,f as h,g,h as _,j as v,n as y,v as b,w as x,x as S,y as C}from"../chunks/egdMPJ-g.js";import"../chunks/BMRk7WTg.js";import{t as w}from"../chunks/DNBIa2Bh.js";var T=S(`<option> </option>`),E=S(`<option> </option>`),D=S(`<select class="svelte-190s2eg"></select>`),O=S(`<th class="svelte-190s2eg"> </th>`),k=S(`<td> </td>`),A=S(`<tr><td class="svelte-190s2eg"> </td><!></tr>`),j=S(`<div class="matrix-container svelte-190s2eg"><table class="svelte-190s2eg"><thead><tr><th class="svelte-190s2eg">Student</th><!></tr></thead><tbody></tbody></table></div>`),M=S(`<p>Loading matrix...</p>`),N=S(`<h1>Attendance Matrix</h1> <div class="selectors svelte-190s2eg"><select class="svelte-190s2eg"></select> <!></div> <!>`,1);function P(x,S){f(S,!0);let P=d(l([])),F=d(null),I=d(l([])),L=d(null),R=d(null);y(async()=>{t(P,await w.admin.courses.list(),!0),n(P).length>0&&t(F,n(P)[0].id,!0)}),c(()=>{n(F)&&w.admin.sessions.list(n(F)).then(e=>{t(I,e,!0),n(I).length>0&&t(L,n(I)[0].id,!0)})}),c(()=>{n(L)&&w.admin.sessions.getAttendance(n(L)).then(e=>t(R,e,!0))});async function z(e,r){if(!n(R))return;let i=n(R).attendances.find(t=>t.slot_id===e&&t.student_id===r);try{i?await w.admin.slots.deleteAttendance(e,r):await w.admin.slots.addAttendance(e,r),t(R,await w.admin.sessions.getAttendance(n(L)),!0)}catch(e){alert(e)}}var B=N(),V=s(a(B),2),H=r(V);_(H,21,()=>n(P),g,(t,i)=>{var a=T(),o=r(a,!0);e(a);var s={};v(()=>{b(o,n(i).name),s!==(s=n(i).id)&&(a.value=(a.__value=n(i).id)??``)}),C(t,a)}),e(H);var U=s(H,2),W=i=>{var a=D();_(a,21,()=>n(I),g,(t,i)=>{var a=E(),o=r(a);e(a);var s={};v(()=>{b(o,`Week ${n(i).week_nr??``} (${n(i).date??``})`),s!==(s=n(i).id)&&(a.value=(a.__value=n(i).id)??``)}),C(t,a)}),e(a),m(a,()=>n(L),e=>t(L,e)),C(i,a)};p(U,e=>{n(I).length>0&&e(W)}),e(V);var G=s(V,2),K=t=>{var a=j(),o=r(a),c=r(o),l=r(c);_(s(r(l)),17,()=>n(R).slots,g,(t,i)=>{var a=O(),o=r(a,!0);e(a),v(()=>b(o,n(i).start_time)),C(t,a)}),e(l),e(c);var d=s(c);_(d,21,()=>n(R).students,g,(t,a)=>{var o=A(),c=r(o),l=r(c,!0);e(c),_(s(c),17,()=>n(R).slots,g,(t,o)=>{let s=i(()=>n(R).attendances.some(e=>e.slot_id===n(o).id&&e.student_id===n(a).id));var c=k();let l;var d=r(c,!0);e(c),v(()=>{l=h(c,1,`cell svelte-190s2eg`,null,l,{present:n(s)}),b(d,n(s)?`✓`:``)}),u(`click`,c,()=>z(n(o).id,n(a).id)),C(t,c)}),e(o),v(()=>b(l,n(a).name)),C(t,o)}),e(d),e(o),e(a),C(t,a)},q=e=>{C(e,M())};p(G,e=>{n(R)?e(K):e(q,-1)}),m(H,()=>n(F),e=>t(F,e)),C(x,B),o()}x([`click`]);export{P as component};
|
||||
@@ -1 +0,0 @@
|
||||
import{$ as e,B as t,D as n,E as r,F as i,H as a,I as o,J as s,L as c,M as l,Q as u,R as d,T as f,V as p,Y as m,_ as h,c as g,f as _,g as v,h as y,j as b,l as x,n as S,s as C,v as w,w as T,x as E,y as D}from"../chunks/egdMPJ-g.js";import"../chunks/BMRk7WTg.js";import{t as O}from"../chunks/DNBIa2Bh.js";var k=E(`<div><strong> </strong> </div>`),A=E(`<tr><td class="svelte-nbog41"> </td><td class="svelte-nbog41"> </td><td class="svelte-nbog41"><button>Delete</button></td></tr>`),j=E(`<h2> </h2> <div class="student-actions svelte-nbog41"><form style="display: inline-block;"><input placeholder="Student Name" required="" class="svelte-nbog41"/> <button type="submit">Add Student</button></form> <div class="import-box svelte-nbog41"><span>Import CSV (name header):</span> <input type="file" accept=".csv" class="svelte-nbog41"/></div></div> <table class="svelte-nbog41"><thead><tr><th class="svelte-nbog41">ID</th><th class="svelte-nbog41">Name</th><th class="svelte-nbog41">Actions</th></tr></thead><tbody></tbody></table>`,1),M=E(`<p>Select a course to manage students.</p>`),N=E(`<h1>Courses & Students</h1> <div class="management-grid svelte-nbog41"><div class="courses-panel"><h2>Manage Courses</h2> <form><input placeholder="Course Name (e.g. FP)" required="" class="svelte-nbog41"/> <input placeholder="Semester (e.g. SS2026)" required="" class="svelte-nbog41"/> <button type="submit">Create Course</button></form> <div class="course-list"></div></div> <div class="students-panel"><!></div></div>`,1);function P(T,E){m(E,!0);let P=p(d([])),F=p(null),I=p(d([])),L=p(``),R=p(``),z=p(``);S(async()=>{await B()});async function B(){t(P,await O.admin.courses.list(),!0),n(P).length>0&&n(F)===null&&t(F,n(P)[0].id,!0)}l(()=>{n(F)!==null&&V(n(F))});async function V(e){t(I,await O.admin.courses.listStudents(e),!0)}async function H(){try{let e=await O.admin.courses.create(n(L),n(R));t(L,``),t(R,``),await B(),t(F,e.id,!0)}catch(e){alert(e)}}async function U(){if(n(F))try{await O.admin.courses.addStudent(n(F),n(z)),t(z,``),await V(n(F))}catch(e){alert(e)}}async function W(e){if(confirm(`Are you sure?`))try{await O.admin.students.delete(e),n(F)&&await V(n(F))}catch(e){alert(e)}}let G;async function ee(){if(!(!n(F)||!G.files?.[0]))try{await O.admin.courses.importStudents(n(F),G.files[0]),await V(n(F)),G.value=``}catch(e){alert(e)}}var K=N(),q=c(o(K),2),J=i(q),Y=c(i(J),2),X=i(Y);x(X);var Z=c(X,2);x(Z),u(2),e(Y);var Q=c(Y,2);y(Q,21,()=>n(P),v,(r,a)=>{var o=k();let s;var l=i(o),u=i(l,!0);e(l);var d=c(l);e(o),b(()=>{s=_(o,1,`course-item svelte-nbog41`,null,s,{selected:n(F)===n(a).id}),w(u,n(a).name),w(d,` (${n(a).semester??``})`)}),f(`click`,o,()=>t(F,n(a).id,!0)),D(r,o)}),e(Q),e(J);var $=c(J,2),te=i($),ne=s=>{let l=a(()=>n(P).find(e=>e.id===n(F)));var d=j(),p=o(d),m=i(p);e(p);var h=c(p,2),_=i(h),S=i(_);x(S),u(2),e(_);var T=c(_,2),E=c(i(T),2);C(E,e=>G=e,()=>G),e(T),e(h);var O=c(h,2),k=c(i(O));y(k,21,()=>n(I),v,(t,r)=>{var a=A(),o=i(a),s=i(o,!0);e(o);var l=c(o),u=i(l,!0);e(l);var d=c(l),p=i(d);e(d),e(a),b(()=>{w(s,n(r).id),w(u,n(r).name)}),f(`click`,p,()=>W(n(r).id)),D(t,a)}),e(k),e(O),b(()=>w(m,`Students in ${n(l)?.name??``}`)),r(`submit`,_,U),g(S,()=>n(z),e=>t(z,e)),f(`change`,E,ee),D(s,d)},re=e=>{D(e,M())};h(te,e=>{n(F)?e(ne):e(re,-1)}),e($),e(q),r(`submit`,Y,H),g(X,()=>n(L),e=>t(L,e)),g(Z,()=>n(R),e=>t(R,e)),D(T,K),s()}T([`click`,`change`]);export{P as component};
|
||||
@@ -1 +0,0 @@
|
||||
import{$ as e,B as t,D as n,F as r,I as i,J as a,L as o,M as s,R as c,T as l,V as u,Y as d,_ as f,d as p,g as m,h,j as g,n as _,v,w as y,x as b,y as x}from"../chunks/egdMPJ-g.js";import"../chunks/BMRk7WTg.js";import{t as S}from"../chunks/DNBIa2Bh.js";var C=b(`<option> </option>`),w=b(`<div class="session-export-row svelte-128ylb7"><span> </span> <div class="btn-group svelte-128ylb7"><button class="small svelte-128ylb7">CSV</button> <button class="small svelte-128ylb7">MD</button></div></div>`),T=b(`<div class="export-card svelte-128ylb7"><h3>Full Attendance Matrix</h3> <p>All weeks, all students, includes bonus point calculation.</p> <div class="btn-group svelte-128ylb7"><button class="svelte-128ylb7">CSV</button> <button class="svelte-128ylb7">Markdown</button></div></div> <h3>Weekly Exports</h3> <div class="sessions-list"></div>`,1),E=b(`<h1>Export Data</h1> <div class="export-grid svelte-128ylb7"><div class="export-section"><h2>Global</h2> <div class="export-card svelte-128ylb7"><h3>Full Database Backup</h3> <p>Download the latest SQLite database file.</p> <button class="svelte-128ylb7">Download .sqlite</button></div></div> <div class="export-section"><h2>Per Course</h2> <select class="svelte-128ylb7"></select> <!></div></div>`,1);function D(y,b){d(b,!0);let D=u(c([])),O=u(null),k=u(c([]));_(async()=>{t(D,await S.admin.courses.list(),!0),n(D).length>0&&t(O,n(D)[0].id,!0)}),s(()=>{n(O)&&S.admin.sessions.list(n(O)).then(e=>t(k,e,!0))});var A=E(),j=o(i(A),2),M=r(j),N=o(r(M),2),P=o(r(N),4);e(N),e(M);var F=o(M,2),I=o(r(F),2);h(I,21,()=>n(D),m,(t,i)=>{var a=C(),o=r(a,!0);e(a);var s={};g(()=>{v(o,n(i).name),s!==(s=n(i).id)&&(a.value=(a.__value=n(i).id)??``)}),x(t,a)}),e(I);var L=o(I,2),R=t=>{var a=T(),s=i(a),c=o(r(s),4),u=r(c),d=o(u,2);e(c),e(s);var f=o(s,4);h(f,21,()=>n(k),m,(t,i)=>{var a=w(),s=r(a),c=r(s);e(s);var u=o(s,2),d=r(u),f=o(d,2);e(u),e(a),g(()=>v(c,`Week ${n(i).week_nr??``} (${n(i).date??``})`)),l(`click`,d,()=>window.open(S.admin.export.sessionCsv(n(i).id),`_blank`)),l(`click`,f,()=>window.open(S.admin.export.sessionMd(n(i).id),`_blank`)),x(t,a)}),e(f),l(`click`,u,()=>window.open(S.admin.export.courseCsv(n(O)),`_blank`)),l(`click`,d,()=>window.open(S.admin.export.courseMd(n(O)),`_blank`)),x(t,a)};f(L,e=>{n(O)&&e(R)}),e(F),e(j),l(`click`,P,()=>window.open(S.admin.export.backup(),`_blank`)),p(I,()=>n(O),e=>t(O,e)),x(y,A),a()}y([`click`]);export{D as component};
|
||||
@@ -1 +0,0 @@
|
||||
import{$ as e,B as t,D as n,F as r,H as i,I as a,J as o,L as s,M as c,P as l,R as u,T as d,V as f,Y as p,_ as m,c as ee,d as h,g,h as _,j as v,n as y,v as b,w as x,x as S,y as C}from"../chunks/egdMPJ-g.js";import"../chunks/BMRk7WTg.js";import{t as w}from"../chunks/DNBIa2Bh.js";import{t as T}from"../chunks/BYEkGdSH.js";var E=S(`<option> </option>`),te=S(`<option> </option>`),ne=S(`<option> </option>`),D=S(`<textarea placeholder="Enter observations..." class="svelte-1do7mxm"></textarea> <button class="primary svelte-1do7mxm">Save Note</button>`,1),re=S(`<p>Select a seat occupied by a student to leave a note.</p>`),O=S(`<h3> </h3> <!> <button>Cancel</button>`,1),k=S(`<p>Click a seat on the map to add or view notes.</p>`),A=S(`<div class="note-item svelte-1do7mxm"><strong> </strong> <p class="svelte-1do7mxm"> </p></div>`),ie=S(`<h1>Seat Notes</h1> <div class="selectors svelte-1do7mxm"><select class="svelte-1do7mxm"></select> <select class="svelte-1do7mxm"></select> <select class="svelte-1do7mxm"></select></div> <div class="notes-container svelte-1do7mxm"><div class="map-view"><!></div> <div class="note-editor svelte-1do7mxm"><!> <div class="existing-notes"><h3>Recent Notes</h3> <!></div></div></div>`,1);function j(x,S){p(S,!0);let j=f(u([])),M=f(null),N=f(u([])),P=f(null),F=f(u([])),I=f(null),L=f(u([])),R=f(u([])),z=f(u([])),B=f(u([]));y(async()=>{t(j,await w.admin.courses.list(),!0),n(j).length>0&&t(M,n(j)[0].id,!0)}),c(()=>{n(M)&&(w.admin.sessions.list(n(M)).then(e=>{t(N,e,!0),n(N).length>0&&t(P,n(N)[0].id,!0)}),w.admin.courses.listStudents(n(M)).then(e=>t(z,e,!0)))}),c(()=>{n(P)&&(t(F,n(N).find(e=>e.id===n(P))?.slots||[],!0),n(F).length>0&&t(I,n(F)[0].id,!0))}),c(()=>{if(n(I)){let e=n(F).find(e=>e.id===n(I));e?.room_id?w.admin.rooms.get(e.room_id).then(e=>t(L,e.layout,!0)):t(L,[],!0),w.admin.slots.getNotes(n(I)).then(e=>t(R,e,!0)),w.admin.sessions.getAttendance(n(P)).then(e=>{t(B,e.attendances.filter(e=>e.slot_id===n(I)),!0)})}});let V=f(null),H=f(``);function ae(e){if(e.type!==`seat`)return;t(V,e.id,!0);let r=n(B).find(t=>t.seat_id===e.id)?.student_id;r?t(H,n(R).find(e=>e.student_id===r)?.content||``,!0):t(H,``)}async function oe(){if(!n(I)||!n(V))return;let e=n(B).find(e=>e.seat_id===n(V))?.student_id;if(!e){alert(`No student at this seat`);return}try{await w.admin.slots.upsertNote(n(I),e,n(H)),t(R,await w.admin.slots.getNotes(n(I)),!0),t(V,null)}catch(e){alert(e)}}let U=i(()=>{let e={};return n(B).forEach(t=>{if(t.seat_id){let r=n(z).find(e=>e.id===t.student_id);e[t.seat_id]=r?.name||`Unknown`}}),e}),se=i(()=>n(B).map(e=>e.seat_id).filter(e=>e!==null));var W=ie(),G=s(a(W),2),K=r(G);_(K,21,()=>n(j),g,(t,i)=>{var a=E(),o=r(a,!0);e(a);var s={};v(()=>{b(o,n(i).name),s!==(s=n(i).id)&&(a.value=(a.__value=n(i).id)??``)}),C(t,a)}),e(K);var q=s(K,2);_(q,21,()=>n(N),g,(t,i)=>{var a=te(),o=r(a);e(a);var s={};v(()=>{b(o,`Week ${n(i).week_nr??``}`),s!==(s=n(i).id)&&(a.value=(a.__value=n(i).id)??``)}),C(t,a)}),e(q);var J=s(q,2);_(J,21,()=>n(F),g,(t,i)=>{var a=ne(),o=r(a);e(a);var s={};v(()=>{b(o,`${n(i).start_time??``} - ${n(i).end_time??``}`),s!==(s=n(i).id)&&(a.value=(a.__value=n(i).id)??``)}),C(t,a)}),e(J),e(G);var Y=s(G,2),X=r(Y);T(r(X),{get elements(){return n(L)},get occupiedSeatIds(){return n(se)},get selectedId(){return n(V)},get studentNames(){return n(U)},onElementClick:ae}),e(X);var Z=s(X,2),Q=r(Z),ce=o=>{let c=i(()=>n(U)[n(V)]);var u=O(),f=a(u),p=r(f);e(f);var h=s(f,2),g=e=>{var r=D(),i=a(r);l(i);var o=s(i,2);ee(i,()=>n(H),e=>t(H,e)),d(`click`,o,oe),C(e,r)},_=e=>{C(e,re())};m(h,e=>{n(c)?e(g):e(_,-1)});var y=s(h,2);v(()=>b(p,`Note for ${(n(c)||`Empty Seat`)??``}`)),d(`click`,y,()=>t(V,null)),C(o,u)},le=e=>{C(e,k())};m(Q,e=>{n(V)?e(ce):e(le,-1)});var $=s(Q,2);_(s(r($),2),17,()=>n(R),g,(t,i)=>{var a=A(),o=r(a),c=r(o);e(o);var l=s(o,2),u=r(l,!0);e(l),e(a),v(e=>{b(c,`${e??``}:`),b(u,n(i).content)},[()=>n(z).find(e=>e.id===n(i).student_id)?.name]),C(t,a)}),e($),e(Z),e(Y),h(K,()=>n(M),e=>t(M,e)),h(q,()=>n(P),e=>t(P,e)),h(J,()=>n(I),e=>t(I,e)),C(x,W),o()}x([`click`]);export{j as component};
|
||||
@@ -1 +0,0 @@
|
||||
import{$ as e,B as t,D as n,E as r,F as i,H as a,I as o,J as s,L as c,M as l,Q as u,R as d,T as f,V as p,Y as m,_ as h,c as g,f as _,g as v,h as y,j as b,l as x,n as S,v as C,w,x as T,y as E}from"../chunks/egdMPJ-g.js";import"../chunks/BMRk7WTg.js";import{t as D}from"../chunks/DNBIa2Bh.js";import{t as O}from"../chunks/BYEkGdSH.js";var k=T(`<div> </div>`),A=T(`<div class="field svelte-2e9svb"><label class="svelte-2e9svb">Label</label> <input class="svelte-2e9svb"/></div> <div class="field svelte-2e9svb"><label class="svelte-2e9svb">Width</label> <input type="number" step="0.5" class="svelte-2e9svb"/></div> <div class="field svelte-2e9svb"><label class="svelte-2e9svb">Height</label> <input type="number" step="0.5" class="svelte-2e9svb"/></div> <button class="delete-btn svelte-2e9svb">Delete Element</button>`,1),j=T(`<p>Select an element to edit properties.</p>`),M=T(`<div class="editor-header svelte-2e9svb"><h2> </h2> <div class="toolbar svelte-2e9svb"><button class="svelte-2e9svb">Add Seat</button> <button class="svelte-2e9svb">Add Table</button> <button class="svelte-2e9svb">Add Door</button> <button class="save-btn svelte-2e9svb">Save Layout</button></div></div> <div class="canvas-container svelte-2e9svb"><!> <div class="properties-panel svelte-2e9svb"><h3>Properties</h3> <!></div></div>`,1),N=T(`<p>Select a room to edit its layout.</p>`),P=T(`<h1>Room Layouts</h1> <div class="management-grid svelte-2e9svb"><div class="rooms-panel"><h2>Rooms</h2> <form><input placeholder="Room Name" required=""/> <button type="submit">Create</button></form> <div class="room-list"></div></div> <div class="editor-panel"><!></div></div>`,1);function F(w,T){m(T,!0);let F=p(d([])),I=p(null),L=p(null),R=p(``);S(async()=>{await z()});async function z(){t(F,await D.admin.rooms.list(),!0)}l(()=>{n(I)&&D.admin.rooms.get(n(I)).then(e=>t(L,e,!0))});async function B(){let e=[{id:`s1`,label:`1`,x:2,y:2,width:1,height:1,type:`seat`}];try{let r=await D.admin.rooms.create(n(R),e);t(R,``),await z(),t(I,r.id,!0)}catch(e){alert(e)}}async function V(){if(n(L))try{await D.admin.rooms.updateLayout(n(L).id,n(L).layout),alert(`Layout saved`)}catch(e){alert(e)}}function H(e){if(!n(L))return;let t={id:Math.random().toString(36).substr(2,9),label:e===`seat`?(n(L).layout.filter(e=>e.type===`seat`).length+1).toString():``,x:0,y:0,width:e===`table`?2:1,height:1,type:e};n(L).layout=[...n(L).layout,t]}let U=p(null),W=a(()=>n(L)?.layout.find(e=>e.id===n(U)));function G(){!n(L)||!n(U)||(n(L).layout=n(L).layout.filter(e=>e.id!==n(U)),t(U,null))}var K=P(),q=c(o(K),2),J=i(q),Y=c(i(J),2),X=i(Y);x(X),u(2),e(Y);var Z=c(Y,2);y(Z,21,()=>n(F),v,(r,a)=>{var o=k();let s;var c=i(o,!0);e(o),b(()=>{s=_(o,1,`room-item svelte-2e9svb`,null,s,{selected:n(I)===n(a).id}),C(c,n(a).name)}),f(`click`,o,()=>t(I,n(a).id,!0)),E(r,o)}),e(Z),e(J);var Q=c(J,2),$=i(Q),ee=r=>{var a=M(),s=o(a),l=i(s),u=i(l);e(l);var d=c(l,2),p=i(d),m=c(p,2),_=c(m,2),v=c(_,2);e(d),e(s);var y=c(s,2),S=i(y);O(S,{editable:!0,get selectedId(){return n(U)},onElementClick:e=>t(U,e.id,!0),get elements(){return n(L).layout},set elements(e){n(L).layout=e}});var w=c(S,2),T=c(i(w),2),D=t=>{var r=A(),a=o(r),s=c(i(a),2);x(s),e(a);var l=c(a,2),u=c(i(l),2);x(u),e(l);var d=c(l,2),p=c(i(d),2);x(p),e(d);var m=c(d,2);g(s,()=>n(W).label,e=>n(W).label=e),g(u,()=>n(W).width,e=>n(W).width=e),g(p,()=>n(W).height,e=>n(W).height=e),f(`click`,m,G),E(t,r)},k=e=>{E(e,j())};h(T,e=>{n(W)?e(D):e(k,-1)}),e(w),e(y),b(()=>C(u,`Editing: ${n(L).name??``}`)),f(`click`,p,()=>H(`seat`)),f(`click`,m,()=>H(`table`)),f(`click`,_,()=>H(`door`)),f(`click`,v,V),E(r,a)},te=e=>{E(e,N())};h($,e=>{n(L)?e(ee):e(te,-1)}),e(Q),e(q),r(`submit`,Y,B),g(X,()=>n(R),e=>t(R,e)),E(w,K),s()}w([`click`]);export{F as component};
|
||||
@@ -1 +0,0 @@
|
||||
{"version":"1777346369869"}
|
||||
@@ -1 +0,0 @@
|
||||
export const env={}
|
||||
@@ -1,322 +0,0 @@
|
||||
{
|
||||
".svelte-kit/generated/server/internal.js": {
|
||||
"file": "internal.js",
|
||||
"name": "internal",
|
||||
"src": ".svelte-kit/generated/server/internal.js",
|
||||
"isEntry": true,
|
||||
"imports": [
|
||||
"_environment.js",
|
||||
"_internal.js"
|
||||
]
|
||||
},
|
||||
"_RoomCanvas.BEv49FWI.css": {
|
||||
"file": "_app/immutable/assets/RoomCanvas.BEv49FWI.css",
|
||||
"src": "_RoomCanvas.BEv49FWI.css"
|
||||
},
|
||||
"_RoomCanvas.js": {
|
||||
"file": "chunks/RoomCanvas.js",
|
||||
"name": "RoomCanvas",
|
||||
"imports": [
|
||||
"_dev.js"
|
||||
],
|
||||
"css": [
|
||||
"_app/immutable/assets/RoomCanvas.BEv49FWI.css"
|
||||
]
|
||||
},
|
||||
"_api.js": {
|
||||
"file": "chunks/api.js",
|
||||
"name": "api",
|
||||
"imports": [
|
||||
"_dev.js",
|
||||
"_index-server2.js",
|
||||
"_auth.js"
|
||||
]
|
||||
},
|
||||
"_auth.js": {
|
||||
"file": "chunks/auth.js",
|
||||
"name": "auth",
|
||||
"imports": [
|
||||
"_dev.js",
|
||||
"_index-server2.js"
|
||||
]
|
||||
},
|
||||
"_client.js": {
|
||||
"file": "chunks/client.js",
|
||||
"name": "client",
|
||||
"imports": [
|
||||
"_index-server.js",
|
||||
"_environment.js",
|
||||
"_internal.js",
|
||||
"_exports.js",
|
||||
"_shared.js",
|
||||
"_dev.js",
|
||||
"_index-server2.js"
|
||||
]
|
||||
},
|
||||
"_dev.js": {
|
||||
"file": "chunks/dev.js",
|
||||
"name": "dev"
|
||||
},
|
||||
"_environment.js": {
|
||||
"file": "chunks/environment.js",
|
||||
"name": "environment"
|
||||
},
|
||||
"_exports.js": {
|
||||
"file": "chunks/exports.js",
|
||||
"name": "exports"
|
||||
},
|
||||
"_index-server.js": {
|
||||
"file": "chunks/index-server.js",
|
||||
"name": "index-server",
|
||||
"imports": [
|
||||
"_dev.js"
|
||||
]
|
||||
},
|
||||
"_index-server2.js": {
|
||||
"file": "chunks/index-server2.js",
|
||||
"name": "index-server",
|
||||
"imports": [
|
||||
"_dev.js"
|
||||
]
|
||||
},
|
||||
"_internal.js": {
|
||||
"file": "chunks/internal.js",
|
||||
"name": "internal",
|
||||
"imports": [
|
||||
"_index-server.js",
|
||||
"_environment.js",
|
||||
"_dev.js"
|
||||
]
|
||||
},
|
||||
"_navigation.js": {
|
||||
"file": "chunks/navigation.js",
|
||||
"name": "navigation",
|
||||
"imports": [
|
||||
"_client.js"
|
||||
]
|
||||
},
|
||||
"_shared.js": {
|
||||
"file": "chunks/shared.js",
|
||||
"name": "shared",
|
||||
"imports": [
|
||||
"_index-server.js"
|
||||
]
|
||||
},
|
||||
"_utils.js": {
|
||||
"file": "chunks/utils.js",
|
||||
"name": "utils",
|
||||
"imports": [
|
||||
"_environment.js",
|
||||
"_shared.js"
|
||||
]
|
||||
},
|
||||
"node_modules/@sveltejs/kit/src/runtime/app/server/remote/index.js": {
|
||||
"file": "remote-entry.js",
|
||||
"name": "remote-entry",
|
||||
"src": "node_modules/@sveltejs/kit/src/runtime/app/server/remote/index.js",
|
||||
"isEntry": true,
|
||||
"imports": [
|
||||
"_environment.js",
|
||||
"_utils.js",
|
||||
"_shared.js"
|
||||
]
|
||||
},
|
||||
"node_modules/@sveltejs/kit/src/runtime/components/svelte-5/error.svelte": {
|
||||
"file": "entries/fallbacks/error.svelte.js",
|
||||
"name": "entries/fallbacks/error.svelte",
|
||||
"src": "node_modules/@sveltejs/kit/src/runtime/components/svelte-5/error.svelte",
|
||||
"isEntry": true,
|
||||
"imports": [
|
||||
"_index-server.js",
|
||||
"_client.js",
|
||||
"_dev.js"
|
||||
]
|
||||
},
|
||||
"node_modules/@sveltejs/kit/src/runtime/server/index.js": {
|
||||
"file": "index.js",
|
||||
"name": "index",
|
||||
"src": "node_modules/@sveltejs/kit/src/runtime/server/index.js",
|
||||
"isEntry": true,
|
||||
"imports": [
|
||||
"_environment.js",
|
||||
"_internal.js",
|
||||
"_utils.js",
|
||||
"_exports.js",
|
||||
"_shared.js",
|
||||
"_dev.js",
|
||||
"_index-server2.js"
|
||||
]
|
||||
},
|
||||
"src/routes/+layout.svelte": {
|
||||
"file": "entries/pages/_layout.svelte.js",
|
||||
"name": "entries/pages/_layout.svelte",
|
||||
"src": "src/routes/+layout.svelte",
|
||||
"isEntry": true,
|
||||
"imports": [
|
||||
"_dev.js"
|
||||
]
|
||||
},
|
||||
"src/routes/+page.svelte": {
|
||||
"file": "entries/pages/_page.svelte.js",
|
||||
"name": "entries/pages/_page.svelte",
|
||||
"src": "src/routes/+page.svelte",
|
||||
"isEntry": true,
|
||||
"imports": [
|
||||
"_index-server.js",
|
||||
"_navigation.js",
|
||||
"_client.js",
|
||||
"_dev.js",
|
||||
"_auth.js"
|
||||
],
|
||||
"css": [
|
||||
"_app/immutable/assets/_page.Dzrf4zX4.css"
|
||||
]
|
||||
},
|
||||
"src/routes/admin/+layout.svelte": {
|
||||
"file": "entries/pages/admin/_layout.svelte.js",
|
||||
"name": "entries/pages/admin/_layout.svelte",
|
||||
"src": "src/routes/admin/+layout.svelte",
|
||||
"isEntry": true,
|
||||
"imports": [
|
||||
"_index-server.js",
|
||||
"_navigation.js",
|
||||
"_client.js",
|
||||
"_dev.js",
|
||||
"_auth.js"
|
||||
],
|
||||
"css": [
|
||||
"_app/immutable/assets/_layout.BQQYIMLK.css"
|
||||
]
|
||||
},
|
||||
"src/routes/admin/+page.svelte": {
|
||||
"file": "entries/pages/admin/_page.svelte.js",
|
||||
"name": "entries/pages/admin/_page.svelte",
|
||||
"src": "src/routes/admin/+page.svelte",
|
||||
"isEntry": true,
|
||||
"imports": [
|
||||
"_index-server.js",
|
||||
"_dev.js",
|
||||
"_api.js"
|
||||
],
|
||||
"css": [
|
||||
"_app/immutable/assets/_page.b2bZrlfC.css"
|
||||
]
|
||||
},
|
||||
"src/routes/admin/attendance/+page.svelte": {
|
||||
"file": "entries/pages/admin/attendance/_page.svelte.js",
|
||||
"name": "entries/pages/admin/attendance/_page.svelte",
|
||||
"src": "src/routes/admin/attendance/+page.svelte",
|
||||
"isEntry": true,
|
||||
"imports": [
|
||||
"_index-server.js",
|
||||
"_dev.js",
|
||||
"_api.js"
|
||||
],
|
||||
"css": [
|
||||
"_app/immutable/assets/_page.DDTZ5v3E.css"
|
||||
]
|
||||
},
|
||||
"src/routes/admin/courses/+page.svelte": {
|
||||
"file": "entries/pages/admin/courses/_page.svelte.js",
|
||||
"name": "entries/pages/admin/courses/_page.svelte",
|
||||
"src": "src/routes/admin/courses/+page.svelte",
|
||||
"isEntry": true,
|
||||
"imports": [
|
||||
"_index-server.js",
|
||||
"_dev.js",
|
||||
"_api.js"
|
||||
],
|
||||
"css": [
|
||||
"_app/immutable/assets/_page.Bfx4fGBa.css"
|
||||
]
|
||||
},
|
||||
"src/routes/admin/export/+page.svelte": {
|
||||
"file": "entries/pages/admin/export/_page.svelte.js",
|
||||
"name": "entries/pages/admin/export/_page.svelte",
|
||||
"src": "src/routes/admin/export/+page.svelte",
|
||||
"isEntry": true,
|
||||
"imports": [
|
||||
"_index-server.js",
|
||||
"_dev.js",
|
||||
"_api.js"
|
||||
],
|
||||
"css": [
|
||||
"_app/immutable/assets/_page.DkoPrtit.css"
|
||||
]
|
||||
},
|
||||
"src/routes/admin/notes/+page.svelte": {
|
||||
"file": "entries/pages/admin/notes/_page.svelte.js",
|
||||
"name": "entries/pages/admin/notes/_page.svelte",
|
||||
"src": "src/routes/admin/notes/+page.svelte",
|
||||
"isEntry": true,
|
||||
"imports": [
|
||||
"_index-server.js",
|
||||
"_dev.js",
|
||||
"_RoomCanvas.js",
|
||||
"_api.js"
|
||||
],
|
||||
"css": [
|
||||
"_app/immutable/assets/_page.DigLoqRm.css"
|
||||
]
|
||||
},
|
||||
"src/routes/admin/rooms/+page.svelte": {
|
||||
"file": "entries/pages/admin/rooms/_page.svelte.js",
|
||||
"name": "entries/pages/admin/rooms/_page.svelte",
|
||||
"src": "src/routes/admin/rooms/+page.svelte",
|
||||
"isEntry": true,
|
||||
"imports": [
|
||||
"_index-server.js",
|
||||
"_dev.js",
|
||||
"_RoomCanvas.js",
|
||||
"_api.js"
|
||||
],
|
||||
"css": [
|
||||
"_app/immutable/assets/_page.C7KB5jd4.css"
|
||||
]
|
||||
},
|
||||
"src/routes/admin/sessions/+page.svelte": {
|
||||
"file": "entries/pages/admin/sessions/_page.svelte.js",
|
||||
"name": "entries/pages/admin/sessions/_page.svelte",
|
||||
"src": "src/routes/admin/sessions/+page.svelte",
|
||||
"isEntry": true,
|
||||
"imports": [
|
||||
"_index-server.js",
|
||||
"_dev.js",
|
||||
"_api.js"
|
||||
],
|
||||
"css": [
|
||||
"_app/immutable/assets/_page.BhkUjvVr.css"
|
||||
]
|
||||
},
|
||||
"src/routes/login/+page.svelte": {
|
||||
"file": "entries/pages/login/_page.svelte.js",
|
||||
"name": "entries/pages/login/_page.svelte",
|
||||
"src": "src/routes/login/+page.svelte",
|
||||
"isEntry": true,
|
||||
"imports": [
|
||||
"_navigation.js",
|
||||
"_dev.js",
|
||||
"_api.js",
|
||||
"_auth.js"
|
||||
],
|
||||
"css": [
|
||||
"_app/immutable/assets/_page.LkBq3xGq.css"
|
||||
]
|
||||
},
|
||||
"src/routes/s/[code]/+page.svelte": {
|
||||
"file": "entries/pages/s/_code_/_page.svelte.js",
|
||||
"name": "entries/pages/s/_code_/_page.svelte",
|
||||
"src": "src/routes/s/[code]/+page.svelte",
|
||||
"isEntry": true,
|
||||
"imports": [
|
||||
"_index-server.js",
|
||||
"_client.js",
|
||||
"_dev.js",
|
||||
"_RoomCanvas.js",
|
||||
"_api.js"
|
||||
],
|
||||
"css": [
|
||||
"_app/immutable/assets/_page.BboNMIwd.css"
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -1 +0,0 @@
|
||||
.room-canvas.svelte-1i40qao{user-select:none;background:#fff;border:1px solid #ccc}.room-canvas.editable.svelte-1i40qao{cursor:crosshair}.element.svelte-1i40qao{cursor:pointer}.element.seat.svelte-1i40qao rect:where(.svelte-1i40qao){fill:#fff;stroke:#007bff;stroke-width:2px}.element.seat.svelte-1i40qao text:where(.svelte-1i40qao){fill:#007bff;font-size:14px;font-weight:700}.element.seat.occupied.svelte-1i40qao rect:where(.svelte-1i40qao){fill:#e7f1ff;stroke:#6c757d}.element.seat.occupied.svelte-1i40qao text:where(.svelte-1i40qao){fill:#6c757d}.element.seat.is-mine.svelte-1i40qao rect:where(.svelte-1i40qao){fill:#28a745;stroke:#1e7e34}.element.seat.is-mine.svelte-1i40qao text:where(.svelte-1i40qao){fill:#fff}.element.selected.svelte-1i40qao rect:where(.svelte-1i40qao){stroke:#ffc107;stroke-width:3px}.student-name.svelte-1i40qao{fill:#333;font-size:10px}
|
||||
@@ -1 +0,0 @@
|
||||
nav.svelte-1qg5d05{background:#f8f9fa;border-bottom:1px solid #dee2e6;padding:10px 20px}.nav-content.svelte-1qg5d05{justify-content:space-between;align-items:center;max-width:1200px;margin:0 auto;display:flex}.links.svelte-1qg5d05 a:where(.svelte-1qg5d05){color:#333;margin-right:20px;text-decoration:none}.links.svelte-1qg5d05 a:where(.svelte-1qg5d05):hover{color:#007bff}main.svelte-1qg5d05{max-width:1200px;margin:20px auto;padding:0 20px}
|
||||
@@ -1 +0,0 @@
|
||||
.checkin-page.svelte-1gdz5lm{text-align:center;max-width:800px;margin:40px auto}.identity-selector.svelte-1gdz5lm{background:#f8f9fa;border-radius:8px;margin-bottom:20px;padding:20px}select.svelte-1gdz5lm{padding:8px;font-size:1.1em}.error.svelte-1gdz5lm{color:red}.success.svelte-1gdz5lm{color:#28a745;font-size:1.2em}.warning.svelte-1gdz5lm{color:#856404;background:#fff3cd;border-radius:4px;padding:10px}.map-container.svelte-1gdz5lm{margin-top:30px}
|
||||
@@ -1 +0,0 @@
|
||||
.management-grid.svelte-nbog41{grid-template-columns:300px 1fr;gap:30px;display:grid}.course-item.svelte-nbog41{cursor:pointer;border:1px solid #eee;border-radius:4px;margin-bottom:5px;padding:10px}.course-item.selected.svelte-nbog41{background:#e7f1ff;border-color:#007bff}.student-actions.svelte-nbog41{background:#f8f9fa;border-radius:8px;margin-bottom:20px;padding:15px}.import-box.svelte-nbog41{margin-top:10px;font-size:.9em}table.svelte-nbog41{border-collapse:collapse;width:100%}th.svelte-nbog41,td.svelte-nbog41{text-align:left;border-bottom:1px solid #eee;padding:10px}input.svelte-nbog41{margin-right:5px;padding:6px}
|
||||
@@ -1 +0,0 @@
|
||||
.course-selector.svelte-1x3d7ra{border-bottom:1px solid #eee;margin-bottom:20px;padding-bottom:20px}.add-session.svelte-1x3d7ra{background:#f8f9fa;border-radius:8px;margin-bottom:20px;padding:15px}.form-row.svelte-1x3d7ra{gap:10px;display:flex}.sessions-grid.svelte-1x3d7ra{grid-template-columns:repeat(auto-fill,minmax(250px,1fr));gap:20px;display:grid}.session-block.svelte-1x3d7ra{border:1px solid #ddd;border-radius:8px;overflow:hidden}.session-header.svelte-1x3d7ra{background:#eee;justify-content:space-between;align-items:center;padding:10px;display:flex}.slots-list.svelte-1x3d7ra{padding:10px}.slot-item.svelte-1x3d7ra{border-bottom:1px solid #f0f0f0;justify-content:space-between;padding:5px 0;display:flex}.delete-btn.svelte-1x3d7ra{color:#dc3545;cursor:pointer;background:0 0;border:none;font-weight:700}.modal-overlay.svelte-1x3d7ra{background:#00000080;justify-content:center;align-items:center;display:flex;position:fixed;inset:0}.modal.svelte-1x3d7ra{background:#fff;border-radius:8px;width:400px;padding:30px}.field.svelte-1x3d7ra{margin-bottom:15px}.field.svelte-1x3d7ra label:where(.svelte-1x3d7ra){margin-bottom:5px;display:block}.field.svelte-1x3d7ra input:where(.svelte-1x3d7ra),.field.svelte-1x3d7ra select:where(.svelte-1x3d7ra){width:100%;padding:8px}.modal-actions.svelte-1x3d7ra{justify-content:flex-end;gap:10px;margin-top:20px;display:flex}.primary.svelte-1x3d7ra{color:#fff;background:#007bff;border:none;border-radius:4px;padding:8px 16px}
|
||||
@@ -1 +0,0 @@
|
||||
.management-grid.svelte-2e9svb{grid-template-columns:200px 1fr;gap:20px;display:grid}.room-item.svelte-2e9svb{cursor:pointer;border:1px solid #eee;border-radius:4px;margin-bottom:5px;padding:10px}.room-item.selected.svelte-2e9svb{background:#e7f1ff;border-color:#007bff}.editor-header.svelte-2e9svb{justify-content:space-between;align-items:center;margin-bottom:10px;display:flex}.toolbar.svelte-2e9svb button:where(.svelte-2e9svb){margin-right:5px}.save-btn.svelte-2e9svb{color:#fff;background:#28a745;border:none;border-radius:4px;padding:5px 15px}.canvas-container.svelte-2e9svb{gap:20px;display:flex}.properties-panel.svelte-2e9svb{background:#f8f9fa;border-radius:8px;width:200px;padding:15px}.field.svelte-2e9svb{margin-bottom:10px}.field.svelte-2e9svb label:where(.svelte-2e9svb){color:#666;font-size:.8em;display:block}.field.svelte-2e9svb input:where(.svelte-2e9svb){width:100%;padding:4px}.delete-btn.svelte-2e9svb{color:red;width:100%;margin-top:10px}
|
||||
@@ -1 +0,0 @@
|
||||
.selectors.svelte-190s2eg{margin-bottom:20px}select.svelte-190s2eg{margin-right:10px;padding:5px}.matrix-container.svelte-190s2eg{overflow-x:auto}table.svelte-190s2eg{border-collapse:collapse;background:#fff;width:100%}th.svelte-190s2eg,td.svelte-190s2eg{text-align:center;border:1px solid #ddd;padding:10px}th.svelte-190s2eg{background:#f8f9fa}.cell.svelte-190s2eg{cursor:pointer;width:60px;height:40px}.cell.svelte-190s2eg:hover{background:#f0f0f0}.cell.present.svelte-190s2eg{color:#155724;background:#d4edda;font-weight:700}
|
||||
@@ -1 +0,0 @@
|
||||
.selectors.svelte-1do7mxm{margin-bottom:20px}select.svelte-1do7mxm{margin-right:10px;padding:5px}.notes-container.svelte-1do7mxm{grid-template-columns:1fr 300px;gap:20px;display:grid}.note-editor.svelte-1do7mxm{background:#f8f9fa;border-radius:8px;padding:20px}textarea.svelte-1do7mxm{width:100%;height:100px;margin:10px 0}.primary.svelte-1do7mxm{color:#fff;background:#007bff;border:none;border-radius:4px;padding:8px 16px}.note-item.svelte-1do7mxm{border-bottom:1px solid #ddd;padding:5px 0;font-size:.9em}.note-item.svelte-1do7mxm p:where(.svelte-1do7mxm){margin:5px 0}
|
||||
@@ -1 +0,0 @@
|
||||
.export-grid.svelte-128ylb7{grid-template-columns:1fr 1fr;gap:40px;margin-top:20px;display:grid}.export-card.svelte-128ylb7{background:#f8f9fa;border:1px solid #dee2e6;border-radius:8px;margin:15px 0;padding:20px}.btn-group.svelte-128ylb7{gap:10px;display:flex}button.svelte-128ylb7{cursor:pointer;padding:8px 16px}button.small.svelte-128ylb7{padding:4px 8px;font-size:.9em}.session-export-row.svelte-128ylb7{border-bottom:1px solid #eee;justify-content:space-between;align-items:center;padding:8px 0;display:flex}select.svelte-128ylb7{width:100%;margin-bottom:10px;padding:8px}
|
||||
@@ -1 +0,0 @@
|
||||
.welcome.svelte-1uha8ag{text-align:center;background:#f8f9fa;border-radius:12px;max-width:600px;margin:100px auto;padding:40px}h1.svelte-1uha8ag{color:#333;margin-bottom:10px;font-size:2.5em}p.svelte-1uha8ag{color:#666;font-size:1.2em}.actions.svelte-1uha8ag{margin-top:40px}.btn.svelte-1uha8ag{color:#fff;background:#007bff;border-radius:6px;padding:12px 30px;font-weight:700;text-decoration:none}.footer.svelte-1uha8ag{color:#888;margin-top:60px;font-size:.9em}
|
||||
@@ -1 +0,0 @@
|
||||
.login-container.svelte-1x05zx6{border:1px solid #ccc;border-radius:8px;max-width:400px;margin:100px auto;padding:20px}.field.svelte-1x05zx6{margin-bottom:15px}label.svelte-1x05zx6{margin-bottom:5px;display:block}input.svelte-1x05zx6{box-sizing:border-box;width:100%;padding:8px}.error.svelte-1x05zx6{color:red;margin-bottom:15px}button.svelte-1x05zx6{color:#fff;cursor:pointer;background:#007bff;border:none;border-radius:4px;width:100%;padding:10px}button.svelte-1x05zx6:disabled{background:#ccc}
|
||||
@@ -1 +0,0 @@
|
||||
.course-selector.svelte-1jef3w8{margin-bottom:20px}.session-card.svelte-1jef3w8{border:1px solid #ddd;border-radius:8px;margin-bottom:15px;padding:15px}.slot-row.svelte-1jef3w8{border-top:1px solid #eee;justify-content:space-between;align-items:center;padding:10px 0;display:flex}.status-badge.svelte-1jef3w8{text-transform:uppercase;border-radius:12px;margin-right:10px;padding:2px 8px;font-size:.8em}.status-badge.closed.svelte-1jef3w8{color:#fff;background:#6c757d}.status-badge.open.svelte-1jef3w8{color:#fff;background:#28a745}.status-badge.locked.svelte-1jef3w8{color:#000;background:#ffc107}.checkin-code.svelte-1jef3w8{background:#f0f0f0;border-radius:4px;margin-left:10px;padding:2px 5px}.actions.svelte-1jef3w8 button:where(.svelte-1jef3w8){margin-left:5px}
|
||||
@@ -1,43 +0,0 @@
|
||||
import { H as escape_html, V as attr, a as ensure_array_like, l as stringify, n as attr_class, r as bind_props } from "./dev.js";
|
||||
//#region src/lib/RoomCanvas.svelte
|
||||
function RoomCanvas($$renderer, $$props) {
|
||||
$$renderer.component(($$renderer) => {
|
||||
let { elements = [], editable = false, onElementClick, onLayoutChange, selectedId = null, occupiedSeatIds = [], mySeatId = null, studentNames = {} } = $$props;
|
||||
const GRID_SIZE = 40;
|
||||
$$renderer.push(`<svg width="800" height="600"${attr_class("room-canvas svelte-1i40qao", void 0, { "editable": editable })}>`);
|
||||
if (editable) {
|
||||
$$renderer.push("<!--[0-->");
|
||||
$$renderer.push(`<defs><pattern id="grid"${attr("width", GRID_SIZE)}${attr("height", GRID_SIZE)} patternUnits="userSpaceOnUse"><path${attr("d", `M ${stringify(GRID_SIZE)} 0 L 0 0 0 ${stringify(GRID_SIZE)}`)} fill="none" stroke="#eee" stroke-width="1"></path></pattern></defs><rect width="100%" height="100%" fill="url(#grid)"></rect>`);
|
||||
} else $$renderer.push("<!--[-1-->");
|
||||
$$renderer.push(`<!--]--><!--[-->`);
|
||||
const each_array = ensure_array_like(elements);
|
||||
for (let $$index = 0, $$length = each_array.length; $$index < $$length; $$index++) {
|
||||
let el = each_array[$$index];
|
||||
$$renderer.push(`<g${attr("transform", `translate(${stringify(el.x * GRID_SIZE)}, ${stringify(el.y * GRID_SIZE)})`)}${attr_class(`element ${stringify(el.type)}`, "svelte-1i40qao", {
|
||||
"selected": selectedId === el.id,
|
||||
"occupied": el.type === "seat" && occupiedSeatIds.includes(el.id),
|
||||
"is-mine": el.id === mySeatId
|
||||
})}>`);
|
||||
if (el.type === "seat") {
|
||||
$$renderer.push("<!--[0-->");
|
||||
$$renderer.push(`<rect${attr("width", el.width * GRID_SIZE)}${attr("height", el.height * GRID_SIZE)} rx="4" class="svelte-1i40qao"></rect><text${attr("x", el.width * GRID_SIZE / 2)}${attr("y", el.height * GRID_SIZE / 2)} text-anchor="middle" dominant-baseline="middle" class="svelte-1i40qao">${escape_html(el.label)}</text>`);
|
||||
if (studentNames[el.id]) {
|
||||
$$renderer.push("<!--[0-->");
|
||||
$$renderer.push(`<text${attr("x", el.width * GRID_SIZE / 2)}${attr("y", el.height * GRID_SIZE + 15)} text-anchor="middle" class="student-name svelte-1i40qao">${escape_html(studentNames[el.id])}</text>`);
|
||||
} else $$renderer.push("<!--[-1-->");
|
||||
$$renderer.push(`<!--]-->`);
|
||||
} else if (el.type === "table") {
|
||||
$$renderer.push("<!--[1-->");
|
||||
$$renderer.push(`<rect${attr("width", el.width * GRID_SIZE)}${attr("height", el.height * GRID_SIZE)} fill="#e9ecef" stroke="#dee2e6" class="svelte-1i40qao"></rect>`);
|
||||
} else if (el.type === "door") {
|
||||
$$renderer.push("<!--[2-->");
|
||||
$$renderer.push(`<rect${attr("width", el.width * GRID_SIZE)}${attr("height", el.height * GRID_SIZE)} fill="#ffeeba" stroke="#ffe082" class="svelte-1i40qao"></rect><text${attr("x", el.width * GRID_SIZE / 2)}${attr("y", el.height * GRID_SIZE / 2)} text-anchor="middle" dominant-baseline="middle" style="font-size: 10px;" class="svelte-1i40qao">DOOR</text>`);
|
||||
} else $$renderer.push("<!--[-1-->");
|
||||
$$renderer.push(`<!--]--></g>`);
|
||||
}
|
||||
$$renderer.push(`<!--]--></svg>`);
|
||||
bind_props($$props, { elements });
|
||||
});
|
||||
}
|
||||
//#endregion
|
||||
export { RoomCanvas as t };
|
||||
@@ -1,138 +0,0 @@
|
||||
import { D as get } from "./dev.js";
|
||||
import "./index-server2.js";
|
||||
import { t as token } from "./auth.js";
|
||||
//#region src/lib/api.ts
|
||||
var BASE = "/api";
|
||||
async function request(path, init) {
|
||||
const $token = get(token);
|
||||
const res = await fetch(BASE + path, {
|
||||
...init,
|
||||
headers: {
|
||||
"Content-Type": "application/json",
|
||||
...$token ? { Authorization: `Bearer ${$token}` } : {},
|
||||
...init?.headers
|
||||
}
|
||||
});
|
||||
if (res.status === 401 && false);
|
||||
if (!res.ok) {
|
||||
const error = await res.json().catch(() => ({ error: res.statusText }));
|
||||
throw new Error(error.error || res.statusText);
|
||||
}
|
||||
if (res.status === 204) return {};
|
||||
return res.json();
|
||||
}
|
||||
var api = {
|
||||
auth: { login: (email, password) => request("/auth/login", {
|
||||
method: "POST",
|
||||
body: JSON.stringify({
|
||||
email,
|
||||
password
|
||||
})
|
||||
}) },
|
||||
admin: {
|
||||
courses: {
|
||||
list: () => request("/admin/courses"),
|
||||
create: (name, semester) => request("/admin/courses", {
|
||||
method: "POST",
|
||||
body: JSON.stringify({
|
||||
name,
|
||||
semester
|
||||
})
|
||||
}),
|
||||
listStudents: (course_id) => request(`/admin/courses/${course_id}/students`),
|
||||
addStudent: (course_id, name) => request(`/admin/courses/${course_id}/students`, {
|
||||
method: "POST",
|
||||
body: JSON.stringify({ name })
|
||||
}),
|
||||
importStudents: (course_id, file) => {
|
||||
const formData = new FormData();
|
||||
formData.append("file", file);
|
||||
return fetch(`${BASE}/admin/courses/${course_id}/students/import`, {
|
||||
method: "POST",
|
||||
headers: { "Authorization": `Bearer ${get(token)}` },
|
||||
body: formData
|
||||
}).then((res) => res.json());
|
||||
}
|
||||
},
|
||||
students: {
|
||||
delete: (id) => request(`/admin/students/${id}`, { method: "DELETE" }),
|
||||
getAttendance: (id) => request(`/admin/students/${id}/attendance`),
|
||||
getNotes: (id) => request(`/admin/students/${id}/notes`)
|
||||
},
|
||||
rooms: {
|
||||
list: () => request("/admin/rooms"),
|
||||
create: (name, layout) => request("/admin/rooms", {
|
||||
method: "POST",
|
||||
body: JSON.stringify({
|
||||
name,
|
||||
layout
|
||||
})
|
||||
}),
|
||||
get: (id) => request(`/admin/rooms/${id}`),
|
||||
updateLayout: (id, layout) => request(`/admin/rooms/${id}/layout`, {
|
||||
method: "PUT",
|
||||
body: JSON.stringify(layout)
|
||||
})
|
||||
},
|
||||
sessions: {
|
||||
list: (course_id) => request(`/admin/sessions?course_id=${course_id}`),
|
||||
create: (course_id, week_nr, date) => request("/admin/sessions", {
|
||||
method: "POST",
|
||||
body: JSON.stringify({
|
||||
course_id,
|
||||
week_nr,
|
||||
date
|
||||
})
|
||||
}),
|
||||
getAttendance: (id) => request(`/admin/sessions/${id}/attendance`)
|
||||
},
|
||||
slots: {
|
||||
create: (session_id, tutor_id, start_time, end_time, room_id) => request("/admin/slots", {
|
||||
method: "POST",
|
||||
body: JSON.stringify({
|
||||
session_id,
|
||||
tutor_id,
|
||||
start_time,
|
||||
end_time,
|
||||
room_id
|
||||
})
|
||||
}),
|
||||
updateStatus: (id, status) => request(`/admin/slots/${id}/status`, {
|
||||
method: "PATCH",
|
||||
body: JSON.stringify({ status })
|
||||
}),
|
||||
delete: (id) => request(`/admin/slots/${id}`, { method: "DELETE" }),
|
||||
addAttendance: (id, student_id) => request(`/admin/slots/${id}/attendance`, {
|
||||
method: "POST",
|
||||
body: JSON.stringify({ student_id })
|
||||
}),
|
||||
deleteAttendance: (slot_id, student_id) => request(`/admin/slots/${slot_id}/attendance/${student_id}`, { method: "DELETE" }),
|
||||
getNotes: (id) => request(`/admin/slots/${id}/notes`),
|
||||
upsertNote: (slot_id, student_id, content) => request(`/admin/slots/${slot_id}/notes/${student_id}`, {
|
||||
method: "PUT",
|
||||
body: JSON.stringify({ content })
|
||||
})
|
||||
},
|
||||
export: {
|
||||
sessionCsv: (id) => `${BASE}/admin/export/session/${id}/csv`,
|
||||
sessionMd: (id) => `${BASE}/admin/export/session/${id}/md`,
|
||||
courseCsv: (id) => `${BASE}/admin/export/course/${id}/csv`,
|
||||
courseMd: (id) => `${BASE}/admin/export/course/${id}/md`,
|
||||
backup: () => `${BASE}/admin/backup`
|
||||
}
|
||||
},
|
||||
checkin: {
|
||||
getInfo: (code) => request(`/api/checkin/${code}`),
|
||||
getStudents: (code) => request(`/api/checkin/${code}/students`),
|
||||
post: (code, student_id, seat_id) => request("/api/checkin", {
|
||||
method: "POST",
|
||||
body: JSON.stringify({
|
||||
code,
|
||||
student_id,
|
||||
seat_id
|
||||
})
|
||||
})
|
||||
}
|
||||
};
|
||||
//#endregion
|
||||
export { api as t };
|
||||
@@ -1,6 +0,0 @@
|
||||
import { k as writable } from "./dev.js";
|
||||
import "./index-server2.js";
|
||||
//#region src/lib/auth.ts
|
||||
var token = writable(null);
|
||||
//#endregion
|
||||
export { token as t };
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,47 +0,0 @@
|
||||
//#region node_modules/@sveltejs/kit/src/runtime/app/paths/internal/server.js
|
||||
var base = "";
|
||||
var assets = base;
|
||||
var app_dir = "_app";
|
||||
var initial = {
|
||||
base,
|
||||
assets
|
||||
};
|
||||
initial.base;
|
||||
/**
|
||||
* @param {{ base: string, assets: string }} paths
|
||||
*/
|
||||
function override(paths) {
|
||||
base = paths.base;
|
||||
assets = paths.assets;
|
||||
}
|
||||
function reset() {
|
||||
base = initial.base;
|
||||
assets = initial.assets;
|
||||
}
|
||||
/** @param {string} path */
|
||||
function set_assets(path) {
|
||||
assets = initial.assets = path;
|
||||
}
|
||||
/**
|
||||
* `$env/dynamic/public`
|
||||
* @type {Record<string, string>}
|
||||
*/
|
||||
var public_env = {};
|
||||
/** @param {any} error */
|
||||
var fix_stack_trace = (error) => error?.stack;
|
||||
/** @type {(environment: Record<string, string>) => void} */
|
||||
function set_private_env(environment) {}
|
||||
/** @type {(environment: Record<string, string>) => void} */
|
||||
function set_public_env(environment) {
|
||||
public_env = environment;
|
||||
}
|
||||
//#endregion
|
||||
//#region \0virtual:__sveltekit/environment
|
||||
var version = "1777346369869";
|
||||
var prerendering = false;
|
||||
function set_building() {}
|
||||
function set_prerendering() {
|
||||
prerendering = true;
|
||||
}
|
||||
//#endregion
|
||||
export { fix_stack_trace as a, set_public_env as c, base as d, override as f, version as i, app_dir as l, set_assets as m, set_building as n, public_env as o, reset as p, set_prerendering as r, set_private_env as s, prerendering as t, assets as u };
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user