Management API: POST/DELETE /materials/{id}/files (attach.Store, 50 MB, 20 files), DELETE /materials/{id} removes files; download keeps the file name

This commit is contained in:
Jakub Zych
2026-10-17 17:53:22 +02:00
parent 584d15257c
commit 996b4d1542
44 changed files with 463 additions and 56 deletions

View File

@@ -197,7 +197,9 @@ The calendar is RFC 5545 (CRLF lines folded at 75 octets, escaped TEXT) with tim
| GET | `/api/v1/bm/materials/{id}` | read, materials | One material, draft or not, with its public `files`. 404 when unknown. |
| POST | `/api/v1/bm/materials` | write, materials | Upsert on `title` + `course_id`: 201 `{"data", "created": true}` for a new material, 200 `{"data", "created": false}` for an updated one. |
| PUT | `/api/v1/bm/materials/{id}` | write, materials | The same body applied to that material, so the title or course can change. 404 when unknown; 422 on `title` when another material already has the new title and course. |
| DELETE | `/api/v1/bm/materials/{id}` | write, materials | 204; 404 when unknown. |
| DELETE | `/api/v1/bm/materials/{id}` | write, materials | 204, with the material's files (rows, then blobs); 404 when unknown. |
| POST | `/api/v1/bm/materials/{id}/files` | write, materials | Multipart body, parts named `file`: each is stored as a public file of the material, after the ones it has. 201 with the material as GET shows it; 404 when unknown; 422 on `file` when there is no file part, a type is not allowed, a file is over 50 MB or the material would hold more than 20 files (nothing is stored then); 413 over the body cap (`body.limit`, 51 MB, so one large file per request). |
| DELETE | `/api/v1/bm/materials/{id}/files/{file}` | write, materials | 204: the file row, then its blob and thumbnails; 404 when the material or a file of it is unknown. |
| POST | `/api/v1/bm/seed?dry_run=&prune=` | write, courses + schedule + materials | `bm:seed` over HTTP: the body is the seed document, the answer the summary table. |
The material body (POST and PUT), unknown keys are a 422:
@@ -212,7 +214,7 @@ The material body (POST and PUT), unknown keys are a 422:
- `course_id`: null or an existing course. `body`, `source` and `url` are replaced as sent (absent means null).
- `published_at`: absent publishes a new material now and keeps an existing one as it is; `null` makes it a draft; otherwise a time as in the seed file.
- `tags`: absent keeps the tags; otherwise the list of names replaces them, and unknown tags are created (slug from the name, Polish letters folded).
- Files are not uploaded through this API; attach them in the admin.
- Files go through `POST /materials/{id}/files` (`attach.Store`: the default document and image extensions, content type sniffed from the bytes, a random disk name; `file_name` keeps the client's name). The file `url` is under `storage.uploads.public_path_prefix`, served by the application when `storage.uploads.serve` is true (the app's `config/storage.yaml` sets it): GET only, `is_public` rows only, anything but a raster image as `Content-Disposition: attachment`.
## Student app

View File

@@ -14,6 +14,7 @@ import (
"git.golem15.com/golem15/summercms/modules/bouncer"
"git.golem15.com/golem15/summercms/modules/phrasebook"
"git.golem15.com/golem15/summercms/modules/wire"
"gocloud.dev/blob"
"gorm.io/gorm"
)
@@ -33,6 +34,9 @@ type Handlers struct {
PerPage int
// DashboardLimit is the number of sessions and deadlines on /dashboard.
DashboardLimit int
// Bucket returns the uploads bucket for material files, or nil while
// none is published.
Bucket func() *blob.Bucket
// PublicURL is the absolute base URL of the application
// (jz.bm.public_url), used for the calendar feed URL and the links in
// it. Empty means the scheme and Host of the request.

View File

@@ -465,6 +465,12 @@ func (h *Handlers) ManagedMaterial(w http.ResponseWriter, r *http.Request) {
writeNotFound(w)
return
}
h.writeMaterialDetail(w, db, uint(id), http.StatusOK)
}
// writeMaterialDetail answers with the material id as GET /materials/{id}
// shows it, or 404 when there is none.
func (h *Handlers) writeMaterialDetail(w http.ResponseWriter, db *gorm.DB, id uint, status int) {
var m models.Material
res := preloadMaterial(db).Where("jz_bm_materials.id = ?", id).Limit(1).Find(&m)
if res.Error != nil {
@@ -476,10 +482,7 @@ func (h *Handlers) ManagedMaterial(w http.ResponseWriter, r *http.Request) {
return
}
var files []attach.File
err := db.Where("attachment_type = ? AND attachment_id = ? AND field = ?", m.MorphName(), strconv.FormatUint(uint64(m.ID), 10), models.MaterialFilesField).
Order("sort_order, id").
Find(&files).Error
if err != nil {
if err := materialFiles(db, m).Order("sort_order, id").Find(&files).Error; err != nil {
writeOpaque500(w)
return
}
@@ -491,7 +494,7 @@ func (h *Handlers) ManagedMaterial(w http.ResponseWriter, r *http.Request) {
}
out.Files = append(out.Files, fileJSON{ID: f.ID, URL: f.URL(), Name: f.FileName, Size: f.FileSize, Mime: f.ContentType})
}
writeData(w, out)
wire.WriteJSON(w, status, map[string]any{"data": out})
}
// DeleteMaterial answers DELETE /materials/{id}.
@@ -505,15 +508,33 @@ func (h *Handlers) DeleteMaterial(w http.ResponseWriter, r *http.Request) {
writeNotFound(w)
return
}
res := db.Where("id = ?", id).Delete(&models.Material{})
if res.Error != nil {
var keys []string
found := false
err := lagoon.Transaction(r.Context(), db, func(_ context.Context, tx *gorm.DB) error {
res := tx.Where("id = ?", id).Delete(&models.Material{})
if res.Error != nil || res.RowsAffected == 0 {
return res.Error
}
found = true
return attach.DeleteForOwner(tx, models.Material{}, strconv.FormatInt(id, 10), func(k []string) error {
keys = k
return nil
})
})
switch {
case err != nil:
writeOpaque500(w)
return
}
if res.RowsAffected == 0 {
case !found:
writeNotFound(w)
return
}
// The files go with the material: rows in the transaction, blobs after it.
if b := h.Bucket; b != nil && len(keys) > 0 {
if bucket := b(); bucket != nil {
_ = attach.DeleteKeys(r.Context(), bucket, keys)
}
}
w.WriteHeader(http.StatusNoContent)
}

View File

@@ -0,0 +1,221 @@
package api
import (
"context"
"errors"
"io"
"mime/multipart"
"net/http"
"strconv"
"git.golem15.com/golem15/summercms/modules/lagoon"
"git.golem15.com/golem15/summercms/modules/lagoon/attach"
"git.golem15.com/golem15/summercms/modules/surf"
"git.golem15.com/golem15/summercms/modules/wire"
"git.golem15.com/jakub/sm-bm-plugin/models"
"gocloud.dev/blob"
"gorm.io/gorm"
)
// MaterialFileMaxBytes is the largest file the management API stores, the
// admin form's maxFilesize (50 MB).
const MaterialFileMaxBytes = 50 << 20
// MaterialFilesBodyLimit is the body cap of POST /materials/{id}/files: one
// file of MaterialFileMaxBytes plus the multipart framing.
const MaterialFilesBodyLimit = MaterialFileMaxBytes + 1<<20
// MaterialFilesMax is the most files a material holds, the admin form's
// maxFiles.
const MaterialFilesMax = 20
// fileLimits are the attach.Store rules of a material file: the default
// document and image extensions, up to MaterialFileMaxBytes.
var fileLimits = attach.Limits{MaxBytes: MaterialFileMaxBytes}
func (h *Handlers) bucket(w http.ResponseWriter) (*blob.Bucket, bool) {
var b *blob.Bucket
if h.Bucket != nil {
b = h.Bucket()
}
if b == nil {
writeOpaque500(w)
return nil, false
}
return b, true
}
func materialFiles(db *gorm.DB, m models.Material) *gorm.DB {
return db.Where("attachment_type = ? AND attachment_id = ? AND field = ?",
m.MorphName(), strconv.FormatUint(uint64(m.ID), 10), models.MaterialFilesField)
}
// findMaterial loads the material of the {id} path parameter and answers 404
// itself when there is none.
func findMaterial(w http.ResponseWriter, r *http.Request, db *gorm.DB) (models.Material, bool) {
var m models.Material
id, ok := surf.IntParam(r, "id")
if !ok {
writeNotFound(w)
return m, false
}
res := db.Where("id = ?", id).Limit(1).Find(&m)
if res.Error != nil {
writeOpaque500(w)
return m, false
}
if res.RowsAffected == 0 {
writeNotFound(w)
return m, false
}
return m, true
}
// AttachMaterialFiles answers POST /materials/{id}/files: a multipart body
// whose "file" parts are stored as public files of the material, after the
// ones it has. Every part is checked by attach.Store (type, size); one
// refused part refuses the request and stores nothing. The answer is the
// material as GET /materials/{id} shows it, 201.
func (h *Handlers) AttachMaterialFiles(w http.ResponseWriter, r *http.Request) {
db, ok := h.db(w, r)
if !ok {
return
}
bucket, ok := h.bucket(w)
if !ok {
return
}
m, ok := findMaterial(w, r, db)
if !ok {
return
}
mr, err := r.MultipartReader()
if err != nil {
writeInvalid(w, "Send the files as multipart/form-data in parts named \"file\".")
return
}
var refusal string
// The blobs written are deleted again when the transaction did not commit.
stored, err := h.storeParts(r.Context(), db, bucket, m, mr, &refusal)
if err != nil || refusal != "" {
if len(stored) > 0 {
_ = attach.DeleteKeys(context.WithoutCancel(r.Context()), bucket, stored)
}
var tooLarge *http.MaxBytesError
switch {
case refusal != "":
writeValidation(w, map[string][]string{"file": {refusal}})
case errors.As(err, &tooLarge):
wire.WriteJSON(w, http.StatusRequestEntityTooLarge, map[string]any{"error": true, "message": "Request body too large."})
default:
writeOpaque500(w)
}
return
}
h.writeMaterialDetail(w, db, m.ID, http.StatusCreated)
}
// storeParts stores and binds every "file" part in one transaction. A
// refusal (no file, too many, a type or size attach.Store turns down) is
// set in *refusal and rolls back; the returned keys are the blobs written.
func (h *Handlers) storeParts(ctx context.Context, db *gorm.DB, bucket *blob.Bucket, m models.Material, mr *multipart.Reader, refusal *string) ([]string, error) {
var keys []string
errRefused := errors.New("refused")
err := lagoon.Transaction(ctx, db, func(_ context.Context, tx *gorm.DB) error {
var have int64
if err := materialFiles(tx.Model(&attach.File{}), m).Count(&have).Error; err != nil {
return err
}
added := 0
for {
part, err := mr.NextPart()
if err == io.EOF {
break
}
if err != nil {
return err
}
if part.FormName() != "file" || part.FileName() == "" {
part.Close()
continue
}
if int(have)+added >= MaterialFilesMax {
part.Close()
*refusal = "A material holds at most " + strconv.Itoa(MaterialFilesMax) + " files."
return errRefused
}
f, err := attach.Store(ctx, tx, bucket, attach.Upload{FileName: part.FileName(), Body: part, Public: true}, fileLimits)
part.Close()
switch {
case errors.Is(err, attach.ErrTooLarge):
*refusal = part.FileName() + ": the file is larger than 50 MB."
return errRefused
case errors.Is(err, attach.ErrFileType), errors.Is(err, attach.ErrMIMEType):
*refusal = part.FileName() + ": this file type is not allowed."
return errRefused
case err != nil:
return err
}
keys = append(keys, attach.BlobKeys(*f)...)
err = tx.Model(&attach.File{}).Where("id = ?", f.ID).Updates(map[string]any{
"attachment_type": m.MorphName(),
"attachment_id": strconv.FormatUint(uint64(m.ID), 10),
"field": models.MaterialFilesField,
}).Error
if err != nil {
return err
}
added++
}
if added == 0 {
*refusal = "No file: send at least one multipart part named \"file\"."
return errRefused
}
return nil
})
if errors.Is(err, errRefused) {
err = nil
}
return keys, err
}
// DetachMaterialFile answers DELETE /materials/{id}/files/{file}: the file
// row goes, then its blob and thumbnails. A file of another material is a
// 404.
func (h *Handlers) DetachMaterialFile(w http.ResponseWriter, r *http.Request) {
db, ok := h.db(w, r)
if !ok {
return
}
bucket, ok := h.bucket(w)
if !ok {
return
}
m, ok := findMaterial(w, r, db)
if !ok {
return
}
fileID, ok := surf.IntParam(r, "file")
if !ok {
writeNotFound(w)
return
}
var f attach.File
res := materialFiles(db, m).Where("id = ?", fileID).Limit(1).Find(&f)
if res.Error != nil {
writeOpaque500(w)
return
}
if res.RowsAffected == 0 {
writeNotFound(w)
return
}
if err := db.Where("id = ?", f.ID).Delete(&attach.File{}).Error; err != nil {
writeOpaque500(w)
return
}
// The row is gone, so the file is no longer served; a blob left behind
// by a failed delete is only disk space.
_ = attach.DeleteKeys(r.Context(), bucket, attach.BlobKeys(f))
w.WriteHeader(http.StatusNoContent)
}

2
go.mod
View File

@@ -9,6 +9,7 @@ require (
github.com/jackc/pgx/v5 v5.10.0
github.com/testcontainers/testcontainers-go v0.44.0
github.com/testcontainers/testcontainers-go/modules/postgres v0.44.0
gocloud.dev v0.46.0
gorm.io/gorm v1.31.2
)
@@ -102,7 +103,6 @@ require (
go.opentelemetry.io/otel/sdk/metric v1.44.0 // indirect
go.opentelemetry.io/otel/trace v1.44.0 // indirect
go.yaml.in/yaml/v3 v3.0.5 // indirect
gocloud.dev v0.46.0 // indirect
golang.org/x/crypto v0.57.0 // indirect
golang.org/x/image v0.46.0 // indirect
golang.org/x/net v0.58.0 // indirect

View File

@@ -4,6 +4,7 @@ import (
"bytes"
"encoding/json"
"io"
"mime/multipart"
"net/http"
"net/http/httptest"
"strconv"
@@ -12,6 +13,8 @@ import (
userclasses "git.golem15.com/golem15/sm-user-plugin/classes"
"git.golem15.com/golem15/summercms/modules/surf"
"gocloud.dev/blob"
_ "gocloud.dev/blob/memblob"
)
func TestManagementAPIUsesSharedTokenAndCurrentUserPermissions(t *testing.T) {
@@ -203,3 +206,143 @@ RETURNING id`).Scan(&groupID).Error; err != nil {
t.Errorf("show after delete = %d", rec.Code)
}
}
// TestManagementMaterialFiles uploads files to a material through the
// management API, refuses a disallowed type, detaches one file and deletes
// the material with the other, checking rows and blobs.
func TestManagementMaterialFiles(t *testing.T) {
app, plugins, db := migrated(t)
bucket, err := blob.OpenBucket(t.Context(), "mem://")
if err != nil {
t.Fatal(err)
}
t.Cleanup(func() { bucket.Close() })
if err := app.Publish(bucket); err != nil {
t.Fatal(err)
}
var userID uint
if err := db.Raw(`
INSERT INTO users (email, password, must_change_password)
VALUES ('bm-files-token@example.test', '', false)
RETURNING id`).Scan(&userID).Error; err != nil {
t.Fatal(err)
}
var groupID uint
if err := db.Raw(`
INSERT INTO user_groups (name, code, permissions, created_at, updated_at)
VALUES ('BM files', 'bm-files', '{"jz.bm.access_materials":1}', NOW(), NOW())
RETURNING id`).Scan(&groupID).Error; err != nil {
t.Fatal(err)
}
if err := db.Exec(`INSERT INTO users_groups (user_id, user_group_id) VALUES (?, ?)`, userID, groupID).Error; err != nil {
t.Fatal(err)
}
secret, token, err := userclasses.MintAPIToken("usr_", userID, "BM files", []string{"read", "write"}, nil, nil)
if err != nil {
t.Fatal(err)
}
if err := db.Create(token).Error; err != nil {
t.Fatal(err)
}
handler, err := surf.Assemble(app, plugins)
if err != nil {
t.Fatal(err)
}
do := func(req *http.Request) (*httptest.ResponseRecorder, map[string]any) {
t.Helper()
req.Header.Set("Authorization", "Bearer "+secret)
rec := httptest.NewRecorder()
handler.ServeHTTP(rec, req)
var out map[string]any
if rec.Body.Len() > 0 {
_ = json.Unmarshal(rec.Body.Bytes(), &out)
}
return rec, out
}
upload := func(path string, files map[string][]byte) (*httptest.ResponseRecorder, map[string]any) {
t.Helper()
var buf bytes.Buffer
mw := multipart.NewWriter(&buf)
for name, content := range files {
fw, err := mw.CreateFormFile("file", name)
if err != nil {
t.Fatal(err)
}
fw.Write(content)
}
mw.Close()
req := httptest.NewRequest(http.MethodPost, path, &buf)
req.Header.Set("Content-Type", mw.FormDataContentType())
return do(req)
}
countFiles := func() int64 {
var n int64
if err := db.Table("system_files").Where("field = 'files'").Count(&n).Error; err != nil {
t.Fatal(err)
}
return n
}
raw, _ := json.Marshal(map[string]any{"title": "Podręcznik", "type": "pdf"})
req := httptest.NewRequest(http.MethodPost, "/api/v1/bm/materials", bytes.NewReader(raw))
req.Header.Set("Content-Type", "application/json")
rec, out := do(req)
if rec.Code != http.StatusCreated {
t.Fatalf("create = %d %s", rec.Code, rec.Body.String())
}
id := strconv.Itoa(int(out["data"].(map[string]any)["id"].(float64)))
base := "/api/v1/bm/materials/" + id
pdf := []byte("%PDF-1.4\n1 0 obj << >> endobj\ntrailer << >>\n%%EOF\n")
rec, out = upload(base+"/files", map[string][]byte{"wojna.pdf": pdf})
if rec.Code != http.StatusCreated {
t.Fatalf("upload = %d %s", rec.Code, rec.Body.String())
}
rec, out = upload(base+"/files", map[string][]byte{"plan.txt": []byte("plan zajęć\n")})
if rec.Code != http.StatusCreated {
t.Fatalf("second upload = %d %s", rec.Code, rec.Body.String())
}
files, _ := out["data"].(map[string]any)["files"].([]any)
if len(files) != 2 {
t.Fatalf("files after two uploads = %v", out["data"])
}
first := files[0].(map[string]any)
if first["name"] != "wojna.pdf" || first["mime"] != "application/pdf" || !strings.HasSuffix(first["url"].(string), ".pdf") {
t.Errorf("first file = %v", first)
}
if rec, _ := upload(base+"/files", map[string][]byte{"x.exe": []byte("MZ")}); rec.Code != http.StatusUnprocessableEntity {
t.Errorf("disallowed type = %d %s", rec.Code, rec.Body.String())
}
if rec, _ := upload(base+"/files", nil); rec.Code != http.StatusUnprocessableEntity {
t.Errorf("no file = %d %s", rec.Code, rec.Body.String())
}
if rec, _ := upload("/api/v1/bm/materials/999999/files", map[string][]byte{"a.pdf": pdf}); rec.Code != http.StatusNotFound {
t.Errorf("unknown material = %d %s", rec.Code, rec.Body.String())
}
if n := countFiles(); n != 2 {
t.Fatalf("system_files rows = %d after refusals, want 2", n)
}
fileID := strconv.Itoa(int(first["id"].(float64)))
if rec, _ := do(httptest.NewRequest(http.MethodDelete, "/api/v1/bm/materials/999999/files/"+fileID, nil)); rec.Code != http.StatusNotFound {
t.Errorf("detach through another material = %d", rec.Code)
}
if rec, _ := do(httptest.NewRequest(http.MethodDelete, base+"/files/"+fileID, nil)); rec.Code != http.StatusNoContent {
t.Fatalf("detach = %d %s", rec.Code, rec.Body.String())
}
if n := countFiles(); n != 1 {
t.Errorf("system_files rows = %d after detach, want 1", n)
}
if rec, _ := do(httptest.NewRequest(http.MethodDelete, base, nil)); rec.Code != http.StatusNoContent {
t.Fatalf("delete material = %d %s", rec.Code, rec.Body.String())
}
if n := countFiles(); n != 0 {
t.Errorf("system_files rows = %d after deleting the material, want 0", n)
}
iter := bucket.List(nil)
if obj, err := iter.Next(t.Context()); err != io.EOF {
t.Errorf("a blob is left in the bucket: %v %v", obj, err)
}
}

View File

@@ -124,6 +124,8 @@ func TestRoutes(t *testing.T) {
"POST /api/v1/bm/materials",
"PUT /api/v1/bm/materials/{id}",
"DELETE /api/v1/bm/materials/{id}",
"POST /api/v1/bm/materials/{id}/files",
"DELETE /api/v1/bm/materials/{id}/files/{file}",
"POST /api/v1/bm/seed",
}
var got []string

File diff suppressed because one or more lines are too long

View File

@@ -1 +1 @@
import{_ as C}from"./PageHead.vue_vue_type_script_setup_true_lang-87_LQUHg.js";import{_ as w}from"./LoadState.vue_vue_type_script_setup_true_lang-DmeM0AV0.js";import{_ as B}from"./ElectiveBar.vue_vue_type_script_setup_true_lang-DWtGRCWo.js";import{d as z,p as $,C as x,q as S,c as t,h as m,i as k,b as r,o as s,a as o,F as c,y as v,e as n,r as V,s as h,k as E,t as a,B as F,D as N,m as _}from"./index-BjjbG2NZ.js";import{F as j,c as f}from"./format-bcE-cYHJ.js";const L={key:0,class:"chips",role:"group","aria-label":"Semestr"},D=["aria-pressed"],M=["aria-pressed","onClick"],P={key:1,class:"stack",style:{"margin-top":"10px"}},R={class:"row-main"},T={class:"badge"},q={class:"muted small",style:{margin:"0 0 6px"}},A={key:0},O={key:1},U={key:2},W={class:"small",style:{margin:"0"}},G={key:0,class:"badge alert"},H={class:"muted"},I={key:2,class:"empty"},se=z({__name:"CoursesView",setup(J){const i=$(),g=x(),l=V(null);S(()=>{i.loadCourses()});const p=h(()=>[...new Set((i.courses??[]).map(u=>u.semester))].sort((u,d)=>u-d)),y=h(()=>i.visibleCourses.filter(u=>l.value===null||u.semester===l.value));return(u,d)=>{const b=E("router-link");return s(),t("div",null,[m(C,{eyebrow:"Program studiów",title:"Przedmioty"}),m(w,{ready:r(i).loaded.courses,error:r(i).error,onRetry:d[1]||(d[1]=e=>r(i).retry())},{default:k(()=>[m(B),p.value.length>1?(s(),t("div",L,[o("button",{class:"chip",type:"button","aria-pressed":l.value===null,onClick:d[0]||(d[0]=e=>l.value=null)},"Wszystkie",8,D),(s(!0),t(c,null,v(p.value,e=>(s(),t("button",{key:e,class:"chip",type:"button","aria-pressed":l.value===e,onClick:K=>l.value=e},"Semestr "+a(e),9,M))),128))])):n("",!0),y.value.length?(s(),t("div",P,[(s(!0),t(c,null,v(y.value,e=>(s(),F(b,{key:e.id,to:`/przedmioty/${e.id}`,class:"card link"},{default:k(()=>[o("div",R,[o("h3",null,a(e.name),1),o("span",T,a(r(j)[e.form]),1)]),o("p",q,[e.lecturer?(s(),t("span",A,a(e.lecturer),1)):n("",!0),e.ects?(s(),t("span",O," · "+a(e.ects)+" ECTS",1)):n("",!0),e.assessment?(s(),t("span",U," · "+a(e.assessment),1)):n("",!0)]),o("p",W,[r(N)(e,r(g).choices)?(s(),t("span",G,"do wyboru")):n("",!0),o("span",H,[_(a(r(f)(e.counts.sessions,"zajęcia","zajęcia","zajęć")),1),e.counts.readings?(s(),t(c,{key:0},[_(" · lektury "+a(e.counts.readings_read)+"/"+a(e.counts.readings),1)],64)):n("",!0),e.counts.materials?(s(),t(c,{key:1},[_(" · "+a(r(f)(e.counts.materials,"materiał","materiały","materiałów")),1)],64)):n("",!0)])])]),_:2},1032,["to"]))),128))])):(s(),t("p",I,"Brak przedmiotów."))]),_:1},8,["ready","error"])])}}});export{se as default};
import{_ as C}from"./PageHead.vue_vue_type_script_setup_true_lang-4URWY3a8.js";import{_ as w}from"./LoadState.vue_vue_type_script_setup_true_lang-BlmCGQyT.js";import{_ as B}from"./ElectiveBar.vue_vue_type_script_setup_true_lang-uCbzryQF.js";import{d as z,p as $,C as x,q as S,c as t,h as m,i as k,b as r,o as s,a as o,F as c,y as v,e as n,r as V,s as h,k as E,t as a,B as F,D as N,m as _}from"./index-CcCE3P1z.js";import{F as j,c as f}from"./format-bcE-cYHJ.js";const L={key:0,class:"chips",role:"group","aria-label":"Semestr"},D=["aria-pressed"],M=["aria-pressed","onClick"],P={key:1,class:"stack",style:{"margin-top":"10px"}},R={class:"row-main"},T={class:"badge"},q={class:"muted small",style:{margin:"0 0 6px"}},A={key:0},O={key:1},U={key:2},W={class:"small",style:{margin:"0"}},G={key:0,class:"badge alert"},H={class:"muted"},I={key:2,class:"empty"},se=z({__name:"CoursesView",setup(J){const i=$(),g=x(),l=V(null);S(()=>{i.loadCourses()});const p=h(()=>[...new Set((i.courses??[]).map(u=>u.semester))].sort((u,d)=>u-d)),y=h(()=>i.visibleCourses.filter(u=>l.value===null||u.semester===l.value));return(u,d)=>{const b=E("router-link");return s(),t("div",null,[m(C,{eyebrow:"Program studiów",title:"Przedmioty"}),m(w,{ready:r(i).loaded.courses,error:r(i).error,onRetry:d[1]||(d[1]=e=>r(i).retry())},{default:k(()=>[m(B),p.value.length>1?(s(),t("div",L,[o("button",{class:"chip",type:"button","aria-pressed":l.value===null,onClick:d[0]||(d[0]=e=>l.value=null)},"Wszystkie",8,D),(s(!0),t(c,null,v(p.value,e=>(s(),t("button",{key:e,class:"chip",type:"button","aria-pressed":l.value===e,onClick:K=>l.value=e},"Semestr "+a(e),9,M))),128))])):n("",!0),y.value.length?(s(),t("div",P,[(s(!0),t(c,null,v(y.value,e=>(s(),F(b,{key:e.id,to:`/przedmioty/${e.id}`,class:"card link"},{default:k(()=>[o("div",R,[o("h3",null,a(e.name),1),o("span",T,a(r(j)[e.form]),1)]),o("p",q,[e.lecturer?(s(),t("span",A,a(e.lecturer),1)):n("",!0),e.ects?(s(),t("span",O," · "+a(e.ects)+" ECTS",1)):n("",!0),e.assessment?(s(),t("span",U," · "+a(e.assessment),1)):n("",!0)]),o("p",W,[r(N)(e,r(g).choices)?(s(),t("span",G,"do wyboru")):n("",!0),o("span",H,[_(a(r(f)(e.counts.sessions,"zajęcia","zajęcia","zajęć")),1),e.counts.readings?(s(),t(c,{key:0},[_(" · lektury "+a(e.counts.readings_read)+"/"+a(e.counts.readings),1)],64)):n("",!0),e.counts.materials?(s(),t(c,{key:1},[_(" · "+a(r(f)(e.counts.materials,"materiał","materiały","materiałów")),1)],64)):n("",!0)])])]),_:2},1032,["to"]))),128))])):(s(),t("p",I,"Brak przedmiotów."))]),_:1},8,["ready","error"])])}}});export{se as default};

File diff suppressed because one or more lines are too long

View File

@@ -1 +1 @@
import{_ as x}from"./PageHead.vue_vue_type_script_setup_true_lang-87_LQUHg.js";import{_ as C}from"./LoadState.vue_vue_type_script_setup_true_lang-DmeM0AV0.js";import{_ as B}from"./ElectiveBar.vue_vue_type_script_setup_true_lang-DWtGRCWo.js";import{d as $,p as N,q as T,c as t,h as u,i as f,b as s,r as h,o,F as p,y as k,a as n,t as a,e as _,s as g,k as V,x as L,m as v}from"./index-BjjbG2NZ.js";import{d as w,r as M,b as D,a as E,K as b,c as F}from"./format-bcE-cYHJ.js";const K={key:0,class:"rows card"},P={class:"row-main"},S={class:"title"},j={class:"muted small"},q={class:"badge"},A={key:0,class:"small",style:{margin:"6px 0 0"}},I={key:1,class:"empty"},R={key:2,class:"section"},U=["aria-pressed"],Z={key:0,class:"rows card past",style:{"margin-top":"10px"}},G={class:"row-main"},H={class:"title"},J={class:"when"},O={class:"muted small"},ae=$({__name:"DeadlinesView",setup(Q){const r=N(),i=h(new Date),d=h(!1);T(()=>{i.value=new Date,Promise.all([r.loadDeadlines(),r.loadCourses()])});const y=g(()=>r.deadlines.filter(c=>Date.parse(c.due_at)>=i.value.getTime())),m=g(()=>r.deadlines.filter(c=>Date.parse(c.due_at)<i.value.getTime()).reverse());return(c,l)=>{const z=V("router-link");return o(),t("div",null,[u(x,{eyebrow:"Zaliczenia, egzaminy, sprawy organizacyjne",title:"Terminarz"}),u(C,{ready:s(r).loaded.deadlines&&s(r).loaded.courses,error:s(r).error,onRetry:l[1]||(l[1]=e=>s(r).retry())},{default:f(()=>[u(B),y.value.length?(o(),t("ul",K,[(o(!0),t(p,null,k(y.value,e=>(o(),t("li",{key:e.id},[n("div",P,[n("span",S,a(e.title),1),n("span",{class:L(["badge",{alert:s(w)(e.due_at,i.value)<=3}])},a(s(M)(e.due_at,i.value)),3)]),n("div",j,[v(a(s(D)(e.due_at))+", "+a(s(E)(e.due_at))+" · ",1),n("span",q,a(s(b)[e.kind]),1),e.course?(o(),t(p,{key:0},[l[2]||(l[2]=v(" · ",-1)),u(z,{to:`/przedmioty/${e.course.id}`},{default:f(()=>[v(a(e.course.name),1)]),_:2},1032,["to"])],64)):_("",!0)]),e.description?(o(),t("p",A,a(e.description),1)):_("",!0)]))),128))])):(o(),t("p",I,"Brak nadchodzących terminów.")),m.value.length?(o(),t("div",R,[n("button",{class:"chip",type:"button","aria-pressed":d.value,onClick:l[0]||(l[0]=e=>d.value=!d.value)},"Minione ("+a(m.value.length)+")",9,U),d.value?(o(),t("ul",Z,[(o(!0),t(p,null,k(m.value,e=>(o(),t("li",{key:e.id},[n("div",G,[n("span",H,a(e.title),1),n("span",J,a(s(F)(Math.abs(s(w)(e.due_at,i.value)),"dzień","dni","dni"))+" temu",1)]),n("div",O,a(s(D)(e.due_at))+" · "+a(s(b)[e.kind]),1)]))),128))])):_("",!0)])):_("",!0)]),_:1},8,["ready","error"])])}}});export{ae as default};
import{_ as x}from"./PageHead.vue_vue_type_script_setup_true_lang-4URWY3a8.js";import{_ as C}from"./LoadState.vue_vue_type_script_setup_true_lang-BlmCGQyT.js";import{_ as B}from"./ElectiveBar.vue_vue_type_script_setup_true_lang-uCbzryQF.js";import{d as $,p as N,q as T,c as t,h as u,i as f,b as s,r as h,o,F as p,y as k,a as n,t as a,e as _,s as g,k as V,x as L,m as v}from"./index-CcCE3P1z.js";import{d as w,r as M,b as D,a as E,K as b,c as F}from"./format-bcE-cYHJ.js";const K={key:0,class:"rows card"},P={class:"row-main"},S={class:"title"},j={class:"muted small"},q={class:"badge"},A={key:0,class:"small",style:{margin:"6px 0 0"}},I={key:1,class:"empty"},R={key:2,class:"section"},U=["aria-pressed"],Z={key:0,class:"rows card past",style:{"margin-top":"10px"}},G={class:"row-main"},H={class:"title"},J={class:"when"},O={class:"muted small"},ae=$({__name:"DeadlinesView",setup(Q){const r=N(),i=h(new Date),d=h(!1);T(()=>{i.value=new Date,Promise.all([r.loadDeadlines(),r.loadCourses()])});const y=g(()=>r.deadlines.filter(c=>Date.parse(c.due_at)>=i.value.getTime())),m=g(()=>r.deadlines.filter(c=>Date.parse(c.due_at)<i.value.getTime()).reverse());return(c,l)=>{const z=V("router-link");return o(),t("div",null,[u(x,{eyebrow:"Zaliczenia, egzaminy, sprawy organizacyjne",title:"Terminarz"}),u(C,{ready:s(r).loaded.deadlines&&s(r).loaded.courses,error:s(r).error,onRetry:l[1]||(l[1]=e=>s(r).retry())},{default:f(()=>[u(B),y.value.length?(o(),t("ul",K,[(o(!0),t(p,null,k(y.value,e=>(o(),t("li",{key:e.id},[n("div",P,[n("span",S,a(e.title),1),n("span",{class:L(["badge",{alert:s(w)(e.due_at,i.value)<=3}])},a(s(M)(e.due_at,i.value)),3)]),n("div",j,[v(a(s(D)(e.due_at))+", "+a(s(E)(e.due_at))+" · ",1),n("span",q,a(s(b)[e.kind]),1),e.course?(o(),t(p,{key:0},[l[2]||(l[2]=v(" · ",-1)),u(z,{to:`/przedmioty/${e.course.id}`},{default:f(()=>[v(a(e.course.name),1)]),_:2},1032,["to"])],64)):_("",!0)]),e.description?(o(),t("p",A,a(e.description),1)):_("",!0)]))),128))])):(o(),t("p",I,"Brak nadchodzących terminów.")),m.value.length?(o(),t("div",R,[n("button",{class:"chip",type:"button","aria-pressed":d.value,onClick:l[0]||(l[0]=e=>d.value=!d.value)},"Minione ("+a(m.value.length)+")",9,U),d.value?(o(),t("ul",Z,[(o(!0),t(p,null,k(m.value,e=>(o(),t("li",{key:e.id},[n("div",G,[n("span",H,a(e.title),1),n("span",J,a(s(F)(Math.abs(s(w)(e.due_at,i.value)),"dzień","dni","dni"))+" temu",1)]),n("div",O,a(s(D)(e.due_at))+" · "+a(s(b)[e.kind]),1)]))),128))])):_("",!0)])):_("",!0)]),_:1},8,["ready","error"])])}}});export{ae as default};

View File

@@ -1 +1 @@
import{d as l,C as d,p as u,b as e,o as a,c as r,m as i,t as m,h as y,i as w,e as n,a as h,s as _,k}from"./index-BjjbG2NZ.js";import{c as b}from"./format-bcE-cYHJ.js";const g={key:0,class:"stack",style:{"margin-bottom":"16px"}},v={key:0,class:"notice"},z={key:1,class:"chips wrap"},C=["aria-pressed"],V=l({__name:"ElectiveBar",setup(f){const t=d(),o=u(),c=_(()=>b(o.pendingElectives.length,"grupa przedmiotów do wyboru","grupy przedmiotów do wyboru","grup przedmiotów do wyboru"));return(x,s)=>{const p=k("router-link");return e(o).pendingElectives.length||e(t).hasChoices?(a(),r("div",g,[e(o).pendingElectives.length?(a(),r("p",v,[i(" Masz "+m(c.value)+". Do czasu wyboru widać wszystkie alternatywy. ",1),y(p,{to:{name:"profile",hash:"#wybor"}},{default:w(()=>[...s[1]||(s[1]=[i("Wybierz",-1)])]),_:1})])):n("",!0),e(t).hasChoices?(a(),r("div",z,[h("button",{class:"chip",type:"button","aria-pressed":e(t).showAll,onClick:s[0]||(s[0]=E=>e(t).setShowAll(!e(t).showAll))},"Pokaż wszystkie przedmioty do wyboru",8,C)])):n("",!0)])):n("",!0)}}});export{V as _};
import{d as l,C as d,p as u,b as e,o as a,c as r,m as i,t as m,h as y,i as w,e as n,a as h,s as _,k}from"./index-CcCE3P1z.js";import{c as b}from"./format-bcE-cYHJ.js";const g={key:0,class:"stack",style:{"margin-bottom":"16px"}},v={key:0,class:"notice"},z={key:1,class:"chips wrap"},C=["aria-pressed"],V=l({__name:"ElectiveBar",setup(f){const t=d(),o=u(),c=_(()=>b(o.pendingElectives.length,"grupa przedmiotów do wyboru","grupy przedmiotów do wyboru","grup przedmiotów do wyboru"));return(x,s)=>{const p=k("router-link");return e(o).pendingElectives.length||e(t).hasChoices?(a(),r("div",g,[e(o).pendingElectives.length?(a(),r("p",v,[i(" Masz "+m(c.value)+". Do czasu wyboru widać wszystkie alternatywy. ",1),y(p,{to:{name:"profile",hash:"#wybor"}},{default:w(()=>[...s[1]||(s[1]=[i("Wybierz",-1)])]),_:1})])):n("",!0),e(t).hasChoices?(a(),r("div",z,[h("button",{class:"chip",type:"button","aria-pressed":e(t).showAll,onClick:s[0]||(s[0]=E=>e(t).setShowAll(!e(t).showAll))},"Pokaż wszystkie przedmioty do wyboru",8,C)])):n("",!0)])):n("",!0)}}});export{V as _};

View File

@@ -1 +1 @@
import{d as f,c as t,a,g as y,t as n,e as m,w as _,v as k,h as w,i as b,r,k as h,o,m as g,n as x}from"./index-BjjbG2NZ.js";import{f as V}from"./forms-LHF4n69U.js";const B={class:"auth"},C={key:0,class:"notice",role:"status"},N={key:0,class:"notice error",role:"alert",style:{"margin-bottom":"14px"}},W={class:"field"},j={key:0,class:"error-text"},M=["disabled"],z={class:"auth-links"},I=f({__name:"ForgotView",setup(A){const l=r(""),i=r(!1),u=r(!1),s=r(null);async function c(){i.value=!0,s.value=null;try{await x.forgotPassword(l.value.trim()),u.value=!0}catch(d){s.value=V(d)}finally{i.value=!1}}return(d,e)=>{const p=h("router-link");return o(),t("div",B,[e[3]||(e[3]=a("header",{class:"page-head"},[a("span",{class:"eyebrow"},"BM II° · UWr"),a("h1",null,"Przypomnij hasło")],-1)),u.value?(o(),t("p",C,"Jeśli konto o tym adresie istnieje, wysłaliśmy na nie wiadomość z linkiem do ustawienia nowego hasła.")):(o(),t("form",{key:1,onSubmit:y(c,["prevent"]),novalidate:""},[s.value?.message?(o(),t("div",N,n(s.value.message),1)):m("",!0),a("div",W,[e[1]||(e[1]=a("label",{for:"email"},"Adres e-mail",-1)),_(a("input",{id:"email","onUpdate:modelValue":e[0]||(e[0]=v=>l.value=v),type:"email",autocomplete:"email",inputmode:"email",required:"",autofocus:""},null,512),[[k,l.value]]),s.value?.fields.email?(o(),t("p",j,n(s.value.fields.email),1)):m("",!0)]),a("button",{class:"btn primary block",type:"submit",disabled:i.value||!l.value},n(i.value?"Wysyłanie…":"Wyślij link"),9,M)],32)),a("div",z,[w(p,{to:"/logowanie"},{default:b(()=>[...e[2]||(e[2]=[g("Wróć do logowania",-1)])]),_:1})])])}}});export{I as default};
import{d as f,c as t,a,g as y,t as n,e as m,w as _,v as k,h as w,i as b,r,k as h,o,m as g,n as x}from"./index-CcCE3P1z.js";import{f as V}from"./forms-CldYEw0_.js";const B={class:"auth"},C={key:0,class:"notice",role:"status"},N={key:0,class:"notice error",role:"alert",style:{"margin-bottom":"14px"}},W={class:"field"},j={key:0,class:"error-text"},M=["disabled"],z={class:"auth-links"},I=f({__name:"ForgotView",setup(A){const l=r(""),i=r(!1),u=r(!1),s=r(null);async function c(){i.value=!0,s.value=null;try{await x.forgotPassword(l.value.trim()),u.value=!0}catch(d){s.value=V(d)}finally{i.value=!1}}return(d,e)=>{const p=h("router-link");return o(),t("div",B,[e[3]||(e[3]=a("header",{class:"page-head"},[a("span",{class:"eyebrow"},"BM II° · UWr"),a("h1",null,"Przypomnij hasło")],-1)),u.value?(o(),t("p",C,"Jeśli konto o tym adresie istnieje, wysłaliśmy na nie wiadomość z linkiem do ustawienia nowego hasła.")):(o(),t("form",{key:1,onSubmit:y(c,["prevent"]),novalidate:""},[s.value?.message?(o(),t("div",N,n(s.value.message),1)):m("",!0),a("div",W,[e[1]||(e[1]=a("label",{for:"email"},"Adres e-mail",-1)),_(a("input",{id:"email","onUpdate:modelValue":e[0]||(e[0]=v=>l.value=v),type:"email",autocomplete:"email",inputmode:"email",required:"",autofocus:""},null,512),[[k,l.value]]),s.value?.fields.email?(o(),t("p",j,n(s.value.fields.email),1)):m("",!0)]),a("button",{class:"btn primary block",type:"submit",disabled:i.value||!l.value},n(i.value?"Wysyłanie…":"Wyślij link"),9,M)],32)),a("div",z,[w(p,{to:"/logowanie"},{default:b(()=>[...e[2]||(e[2]=[g("Wróć do logowania",-1)])]),_:1})])])}}});export{I as default};

View File

@@ -1 +1 @@
import{d as n,c as r,m as l,t as i,a as o,T as d,o as s}from"./index-BjjbG2NZ.js";const y={key:0,class:"notice error",role:"alert"},c={key:1,class:"stack","aria-busy":"true","aria-label":"Wczytywanie"},m=n({__name:"LoadState",props:{loading:{type:Boolean},error:{},ready:{type:Boolean}},emits:["retry"],setup(e){return(a,t)=>e.error&&!e.ready?(s(),r("div",y,[l(i(e.error)+" ",1),o("button",{class:"linkish",type:"button",onClick:t[0]||(t[0]=u=>a.$emit("retry"))},"Spróbuj ponownie")])):e.ready?d(a.$slots,"default",{},void 0,void 0,2):(s(),r("div",c,[...t[1]||(t[1]=[o("div",{class:"skeleton"},null,-1),o("div",{class:"skeleton"},null,-1),o("div",{class:"skeleton"},null,-1)])]))}});export{m as _};
import{d as n,c as r,m as l,t as i,a as o,T as d,o as s}from"./index-CcCE3P1z.js";const y={key:0,class:"notice error",role:"alert"},c={key:1,class:"stack","aria-busy":"true","aria-label":"Wczytywanie"},m=n({__name:"LoadState",props:{loading:{type:Boolean},error:{},ready:{type:Boolean}},emits:["retry"],setup(e){return(a,t)=>e.error&&!e.ready?(s(),r("div",y,[l(i(e.error)+" ",1),o("button",{class:"linkish",type:"button",onClick:t[0]||(t[0]=u=>a.$emit("retry"))},"Spróbuj ponownie")])):e.ready?d(a.$slots,"default",{},void 0,void 0,2):(s(),r("div",c,[...t[1]||(t[1]=[o("div",{class:"skeleton"},null,-1),o("div",{class:"skeleton"},null,-1),o("div",{class:"skeleton"},null,-1)])]))}});export{m as _};

View File

@@ -1 +1 @@
import{d as j,u as V,c as o,a as s,b as C,e as d,t as m,w as v,v as b,f as N,g as q,h as w,i as k,j as B,r as l,k as M,l as U,o as r,m as _}from"./index-BjjbG2NZ.js";import{s as Z,f as z}from"./forms-LHF4n69U.js";const R={class:"auth"},S={key:0,class:"notice",role:"status"},A={key:0,class:"notice error",role:"alert",style:{"margin-bottom":"14px"}},D={class:"field"},E={key:0,class:"error-text"},I={class:"field"},L={key:0,class:"error-text"},T={class:"check",style:{"margin-bottom":"16px"}},H=["disabled"],P={class:"auth-links"},J=j({__name:"LoginView",setup(W){const g=V(),c=B(),x=U(),i=l(""),u=l(""),p=l(!0),n=l(!1),t=l(null);async function h(){n.value=!0,t.value=null;try{await g.login(i.value.trim(),u.value,p.value),await x.replace(Z(c.query.redirect))}catch(f){t.value=z(f)}finally{n.value=!1}}return(f,e)=>{const y=M("router-link");return r(),o("div",R,[e[8]||(e[8]=s("header",{class:"page-head"},[s("span",{class:"eyebrow"},"BM II° · UWr"),s("h1",null,"Zaloguj się")],-1)),C(c).query.expired?(r(),o("p",S,"Sesja wygasła. Zaloguj się ponownie.")):d("",!0),s("form",{onSubmit:q(h,["prevent"]),novalidate:""},[t.value?.message?(r(),o("div",A,m(t.value.message),1)):d("",!0),s("div",D,[e[3]||(e[3]=s("label",{for:"email"},"Adres e-mail",-1)),v(s("input",{id:"email","onUpdate:modelValue":e[0]||(e[0]=a=>i.value=a),type:"email",autocomplete:"username",inputmode:"email",required:"",autofocus:""},null,512),[[b,i.value]]),t.value?.fields.email?(r(),o("p",E,m(t.value.fields.email),1)):d("",!0)]),s("div",I,[e[4]||(e[4]=s("label",{for:"password"},"Hasło",-1)),v(s("input",{id:"password","onUpdate:modelValue":e[1]||(e[1]=a=>u.value=a),type:"password",autocomplete:"current-password",required:""},null,512),[[b,u.value]]),t.value?.fields.password?(r(),o("p",L,m(t.value.fields.password),1)):d("",!0)]),s("label",T,[v(s("input",{"onUpdate:modelValue":e[2]||(e[2]=a=>p.value=a),type:"checkbox"},null,512),[[N,p.value]]),e[5]||(e[5]=s("span",null,"Pamiętaj mnie na tym urządzeniu",-1))]),s("button",{class:"btn primary block",type:"submit",disabled:n.value||!i.value||!u.value},m(n.value?"Logowanie…":"Zaloguj się"),9,H)],32),s("div",P,[w(y,{to:"/przypomnij-haslo"},{default:k(()=>[...e[6]||(e[6]=[_("Nie pamiętam hasła",-1)])]),_:1}),w(y,{to:"/rejestracja"},{default:k(()=>[...e[7]||(e[7]=[_("Załóż konto",-1)])]),_:1})])])}}});export{J as default};
import{d as j,u as V,c as o,a as s,b as C,e as d,t as m,w as v,v as b,f as N,g as q,h as w,i as k,j as B,r as l,k as M,l as U,o as r,m as _}from"./index-CcCE3P1z.js";import{s as Z,f as z}from"./forms-CldYEw0_.js";const R={class:"auth"},S={key:0,class:"notice",role:"status"},A={key:0,class:"notice error",role:"alert",style:{"margin-bottom":"14px"}},D={class:"field"},E={key:0,class:"error-text"},I={class:"field"},L={key:0,class:"error-text"},T={class:"check",style:{"margin-bottom":"16px"}},H=["disabled"],P={class:"auth-links"},J=j({__name:"LoginView",setup(W){const g=V(),c=B(),x=U(),i=l(""),u=l(""),p=l(!0),n=l(!1),t=l(null);async function h(){n.value=!0,t.value=null;try{await g.login(i.value.trim(),u.value,p.value),await x.replace(Z(c.query.redirect))}catch(f){t.value=z(f)}finally{n.value=!1}}return(f,e)=>{const y=M("router-link");return r(),o("div",R,[e[8]||(e[8]=s("header",{class:"page-head"},[s("span",{class:"eyebrow"},"BM II° · UWr"),s("h1",null,"Zaloguj się")],-1)),C(c).query.expired?(r(),o("p",S,"Sesja wygasła. Zaloguj się ponownie.")):d("",!0),s("form",{onSubmit:q(h,["prevent"]),novalidate:""},[t.value?.message?(r(),o("div",A,m(t.value.message),1)):d("",!0),s("div",D,[e[3]||(e[3]=s("label",{for:"email"},"Adres e-mail",-1)),v(s("input",{id:"email","onUpdate:modelValue":e[0]||(e[0]=a=>i.value=a),type:"email",autocomplete:"username",inputmode:"email",required:"",autofocus:""},null,512),[[b,i.value]]),t.value?.fields.email?(r(),o("p",E,m(t.value.fields.email),1)):d("",!0)]),s("div",I,[e[4]||(e[4]=s("label",{for:"password"},"Hasło",-1)),v(s("input",{id:"password","onUpdate:modelValue":e[1]||(e[1]=a=>u.value=a),type:"password",autocomplete:"current-password",required:""},null,512),[[b,u.value]]),t.value?.fields.password?(r(),o("p",L,m(t.value.fields.password),1)):d("",!0)]),s("label",T,[v(s("input",{"onUpdate:modelValue":e[2]||(e[2]=a=>p.value=a),type:"checkbox"},null,512),[[N,p.value]]),e[5]||(e[5]=s("span",null,"Pamiętaj mnie na tym urządzeniu",-1))]),s("button",{class:"btn primary block",type:"submit",disabled:n.value||!i.value||!u.value},m(n.value?"Logowanie…":"Zaloguj się"),9,H)],32),s("div",P,[w(y,{to:"/przypomnij-haslo"},{default:k(()=>[...e[6]||(e[6]=[_("Nie pamiętam hasła",-1)])]),_:1}),w(y,{to:"/rejestracja"},{default:k(()=>[...e[7]||(e[7]=[_("Załóż konto",-1)])]),_:1})])])}}});export{J as default};

View File

@@ -1,6 +0,0 @@
import{_ as C}from"./PageHead.vue_vue_type_script_setup_true_lang-87_LQUHg.js";import{_ as E}from"./LoadState.vue_vue_type_script_setup_true_lang-DmeM0AV0.js";import{d as L,q as V,A as z,c as u,h as k,i as g,r as B,E as A,G as H,o as l,F as y,b,m as j,a as d,B as W,t as f,e as h,y as M,s as N,k as D}from"./index-BjjbG2NZ.js";import{T as F,i as P,j as G}from"./format-bcE-cYHJ.js";const O={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"};function _(o){return o.replace(/[&<>"']/g,t=>O[t])}function T(o){const t=o.trim().replace(/[\u0000-\u001f\u007f\s]+/g,"");return/^https?:\/\/[^/]/i.test(t)||/^mailto:[^\s]+$/i.test(t)||t.startsWith("/")&&!t.startsWith("//")||t.startsWith("#")?t:null}function w(o){const t=[],s=i=>`\0${t.push(i)-1}\0`;let e=o.replace(/\u0000/g,"");return e=e.replace(/`([^`\n]+)`/g,(i,c)=>s(`<code>${_(c)}</code>`)),e=e.replace(/\[([^\]\n]+)\]\(([^()\s]*(?:\([^()\s]*\)[^()\s]*)*)\)/g,(i,c,r)=>{const p=T(r),a=S(_(c));if(!p)return s(a);const n=/^https?:/i.test(p)?' target="_blank" rel="noopener noreferrer nofollow"':"";return s(`<a href="${_(p)}"${n}>${a}</a>`)}),e=S(_(e)),e.replace(/\u0000(\d+)\u0000/g,(i,c)=>t[Number(c)]??"")}function S(o){return o.replace(/\*\*([^*\n]+)\*\*/g,"<strong>$1</strong>").replace(/(^|[\s(])\*([^*\n]+)\*(?=$|[\s).,;:!?])/g,"$1<em>$2</em>").replace(/(^|[\s(])_([^_\n]+)_(?=$|[\s).,;:!?])/g,"$1<em>$2</em>")}function q(o){if(!o)return"";const t=o.replace(/\r\n?/g,`
`).split(`
`),s=[];let e=0;const i=r=>r.trim()==="",c=r=>/^(#{1,6})\s/.test(r)||/^```/.test(r)||/^>\s?/.test(r)||/^\s*([-*+]|\d+[.)])\s+/.test(r)||/^(-{3,}|\*{3,}|_{3,})\s*$/.test(r);for(;e<t.length;){const r=t[e];if(i(r)){e++;continue}if(/^```/.test(r)){const n=[];for(e++;e<t.length&&!/^```/.test(t[e]);)n.push(t[e++]);e++,s.push(`<pre><code>${_(n.join(`
`))}</code></pre>`);continue}const p=/^(#{1,6})\s+(.*?)\s*#*\s*$/.exec(r);if(p){const n=Math.min(p[1].length+1,6);s.push(`<h${n}>${w(p[2])}</h${n}>`),e++;continue}if(/^(-{3,}|\*{3,}|_{3,})\s*$/.test(r)){s.push("<hr>"),e++;continue}if(/^>\s?/.test(r)){const n=[];for(;e<t.length&&/^>\s?/.test(t[e]);)n.push(t[e++].replace(/^>\s?/,""));s.push(`<blockquote>${q(n.join(`
`))}</blockquote>`);continue}const a=/^\s*([-*+]|\d+[.)])\s+(.*)$/.exec(r);if(a){const n=/\d/.test(a[1]),v=[];for(;e<t.length;){const $=/^\s*([-*+]|\d+[.)])\s+(.*)$/.exec(t[e]);if(!$||/\d/.test($[1])!==n)break;let x=$[2];for(e++;e<t.length&&/^\s{2,}\S/.test(t[e])&&!/^\s*([-*+]|\d+[.)])\s+/.test(t[e]);)x+=" "+t[e++].trim();v.push(`<li>${w(x)}</li>`)}s.push(n?`<ol>${v.join("")}</ol>`:`<ul>${v.join("")}</ul>`);continue}const m=[r];for(e++;e<t.length&&!i(t[e])&&!c(t[e]);)m.push(t[e++]);s.push(`<p>${m.map(n=>w(n.trim())).join(" ")}</p>`)}return s.join(`
`)}const R={class:"muted small"},U={key:1},Y={key:0},I={key:1},J=["href"],K=["innerHTML"],Q={key:3,class:"section","aria-labelledby":"files-h"},X={class:"rows"},Z=["href"],ee={class:"when"},oe=L({__name:"MaterialView",props:{id:{}},setup(o){const t=o,s=B(null),e=B("");async function i(){s.value=null,e.value="";try{s.value=await A.material(Number(t.id))}catch(p){e.value=H(p)}}V(i),z(()=>t.id,i);const c=N(()=>q(s.value?.body)),r=N(()=>s.value?.url?T(s.value.url):null);return(p,a)=>{const m=D("router-link");return l(),u("div",null,[k(E,{ready:!!s.value,error:e.value,onRetry:a[0]||(a[0]=n=>i())},{default:g(()=>[s.value?(l(),u(y,{key:0},[k(C,{eyebrow:`${b(F)[s.value.type]}${s.value.published_at?" · "+b(P)(s.value.published_at):""}`,title:s.value.title},{default:g(()=>[k(m,{class:"btn small ghost",to:"/materialy"},{default:g(()=>[...a[1]||(a[1]=[j("← Materiały",-1)])]),_:1})]),_:1},8,["eyebrow","title"]),d("p",R,[s.value.course?(l(),W(m,{key:0,to:`/przedmioty/${s.value.course.id}`},{default:g(()=>[j(f(s.value.course.name),1)]),_:1},8,["to"])):h("",!0),s.value.source?(l(),u("span",U," · "+f(s.value.source),1)):h("",!0)]),s.value.tags.length?(l(),u("p",Y,[(l(!0),u(y,null,M(s.value.tags,n=>(l(),u("span",{key:n.id,class:"badge",style:{"margin-right":"4px"}},f(n.name),1))),128))])):h("",!0),r.value?(l(),u("p",I,[d("a",{class:"btn small",href:r.value,target:"_blank",rel:"noopener noreferrer"},"Otwórz link",8,J)])):h("",!0),c.value?(l(),u("div",{key:2,class:"prose card",innerHTML:c.value},null,8,K)):h("",!0),s.value.files.length?(l(),u("section",Q,[a[2]||(a[2]=d("div",{class:"section-head"},[d("h2",{id:"files-h"},"Pliki")],-1)),d("ul",X,[(l(!0),u(y,null,M(s.value.files,n=>(l(),u("li",{key:n.id,class:"row-main"},[d("a",{href:n.url,target:"_blank",rel:"noopener noreferrer",download:""},f(n.name),9,Z),d("span",ee,f(b(G)(n.size)),1)]))),128))])])):h("",!0)],64)):h("",!0)]),_:1},8,["ready","error"])])}}});export{oe as default};

View File

@@ -0,0 +1,6 @@
import{_ as C}from"./PageHead.vue_vue_type_script_setup_true_lang-4URWY3a8.js";import{_ as E}from"./LoadState.vue_vue_type_script_setup_true_lang-BlmCGQyT.js";import{d as L,q as V,A as z,c as u,h as k,i as v,r as B,E as A,G as H,o as l,F as y,b as w,m as j,a as p,B as W,t as f,e as h,y as M,s as N,k as D}from"./index-CcCE3P1z.js";import{T as F,i as P,j as G}from"./format-bcE-cYHJ.js";const O={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"};function _(a){return a.replace(/[&<>"']/g,t=>O[t])}function T(a){const t=a.trim().replace(/[\u0000-\u001f\u007f\s]+/g,"");return/^https?:\/\/[^/]/i.test(t)||/^mailto:[^\s]+$/i.test(t)||t.startsWith("/")&&!t.startsWith("//")||t.startsWith("#")?t:null}function b(a){const t=[],s=i=>`\0${t.push(i)-1}\0`;let e=a.replace(/\u0000/g,"");return e=e.replace(/`([^`\n]+)`/g,(i,c)=>s(`<code>${_(c)}</code>`)),e=e.replace(/\[([^\]\n]+)\]\(([^()\s]*(?:\([^()\s]*\)[^()\s]*)*)\)/g,(i,c,r)=>{const d=T(r),o=S(_(c));if(!d)return s(o);const n=/^https?:/i.test(d)?' target="_blank" rel="noopener noreferrer nofollow"':"";return s(`<a href="${_(d)}"${n}>${o}</a>`)}),e=S(_(e)),e.replace(/\u0000(\d+)\u0000/g,(i,c)=>t[Number(c)]??"")}function S(a){return a.replace(/\*\*([^*\n]+)\*\*/g,"<strong>$1</strong>").replace(/(^|[\s(])\*([^*\n]+)\*(?=$|[\s).,;:!?])/g,"$1<em>$2</em>").replace(/(^|[\s(])_([^_\n]+)_(?=$|[\s).,;:!?])/g,"$1<em>$2</em>")}function q(a){if(!a)return"";const t=a.replace(/\r\n?/g,`
`).split(`
`),s=[];let e=0;const i=r=>r.trim()==="",c=r=>/^(#{1,6})\s/.test(r)||/^```/.test(r)||/^>\s?/.test(r)||/^\s*([-*+]|\d+[.)])\s+/.test(r)||/^(-{3,}|\*{3,}|_{3,})\s*$/.test(r);for(;e<t.length;){const r=t[e];if(i(r)){e++;continue}if(/^```/.test(r)){const n=[];for(e++;e<t.length&&!/^```/.test(t[e]);)n.push(t[e++]);e++,s.push(`<pre><code>${_(n.join(`
`))}</code></pre>`);continue}const d=/^(#{1,6})\s+(.*?)\s*#*\s*$/.exec(r);if(d){const n=Math.min(d[1].length+1,6);s.push(`<h${n}>${b(d[2])}</h${n}>`),e++;continue}if(/^(-{3,}|\*{3,}|_{3,})\s*$/.test(r)){s.push("<hr>"),e++;continue}if(/^>\s?/.test(r)){const n=[];for(;e<t.length&&/^>\s?/.test(t[e]);)n.push(t[e++].replace(/^>\s?/,""));s.push(`<blockquote>${q(n.join(`
`))}</blockquote>`);continue}const o=/^\s*([-*+]|\d+[.)])\s+(.*)$/.exec(r);if(o){const n=/\d/.test(o[1]),$=[];for(;e<t.length;){const g=/^\s*([-*+]|\d+[.)])\s+(.*)$/.exec(t[e]);if(!g||/\d/.test(g[1])!==n)break;let x=g[2];for(e++;e<t.length&&/^\s{2,}\S/.test(t[e])&&!/^\s*([-*+]|\d+[.)])\s+/.test(t[e]);)x+=" "+t[e++].trim();$.push(`<li>${b(x)}</li>`)}s.push(n?`<ol>${$.join("")}</ol>`:`<ul>${$.join("")}</ul>`);continue}const m=[r];for(e++;e<t.length&&!i(t[e])&&!c(t[e]);)m.push(t[e++]);s.push(`<p>${m.map(n=>b(n.trim())).join(" ")}</p>`)}return s.join(`
`)}const R={class:"muted small"},U={key:1},Y={key:0},I={key:1},J=["href"],K=["innerHTML"],Q={key:3,class:"section","aria-labelledby":"files-h"},X={class:"rows"},Z=["href","download"],ee={class:"when"},ae=L({__name:"MaterialView",props:{id:{}},setup(a){const t=a,s=B(null),e=B("");async function i(){s.value=null,e.value="";try{s.value=await A.material(Number(t.id))}catch(d){e.value=H(d)}}V(i),z(()=>t.id,i);const c=N(()=>q(s.value?.body)),r=N(()=>s.value?.url?T(s.value.url):null);return(d,o)=>{const m=D("router-link");return l(),u("div",null,[k(E,{ready:!!s.value,error:e.value,onRetry:o[0]||(o[0]=n=>i())},{default:v(()=>[s.value?(l(),u(y,{key:0},[k(C,{eyebrow:`${w(F)[s.value.type]}${s.value.published_at?" · "+w(P)(s.value.published_at):""}`,title:s.value.title},{default:v(()=>[k(m,{class:"btn small ghost",to:"/materialy"},{default:v(()=>[...o[1]||(o[1]=[j("← Materiały",-1)])]),_:1})]),_:1},8,["eyebrow","title"]),p("p",R,[s.value.course?(l(),W(m,{key:0,to:`/przedmioty/${s.value.course.id}`},{default:v(()=>[j(f(s.value.course.name),1)]),_:1},8,["to"])):h("",!0),s.value.source?(l(),u("span",U," · "+f(s.value.source),1)):h("",!0)]),s.value.tags.length?(l(),u("p",Y,[(l(!0),u(y,null,M(s.value.tags,n=>(l(),u("span",{key:n.id,class:"badge",style:{"margin-right":"4px"}},f(n.name),1))),128))])):h("",!0),r.value?(l(),u("p",I,[p("a",{class:"btn small",href:r.value,target:"_blank",rel:"noopener noreferrer"},"Otwórz link",8,J)])):h("",!0),c.value?(l(),u("div",{key:2,class:"prose card",innerHTML:c.value},null,8,K)):h("",!0),s.value.files.length?(l(),u("section",Q,[o[2]||(o[2]=p("div",{class:"section-head"},[p("h2",{id:"files-h"},"Pliki")],-1)),p("ul",X,[(l(!0),u(y,null,M(s.value.files,n=>(l(),u("li",{key:n.id,class:"row-main"},[p("a",{href:n.url,download:n.name},f(n.name),9,Z),p("span",ee,f(w(G)(n.size)),1)]))),128))])])):h("",!0)],64)):h("",!0)]),_:1},8,["ready","error"])])}}});export{ae as default};

View File

@@ -1 +1 @@
import{d as V,p as j,q as $,E as D,G as E,A as P,c as a,h as A,a as l,w as N,H as B,F as c,y as v,b as y,g as F,e as d,m as L,t as n,I as W,r as m,s as M,o as s,k as q,B as U,i as G}from"./index-BjjbG2NZ.js";import{_ as H}from"./PageHead.vue_vue_type_script_setup_true_lang-87_LQUHg.js";import{T as S,i as I,c as O}from"./format-bcE-cYHJ.js";const R={class:"field"},Y=["value"],J={class:"field"},K=["value"],Q={key:0,class:"chips wrap",role:"group","aria-label":"Tagi",style:{"margin-bottom":"12px"}},X=["aria-pressed","onClick"],Z={key:2,class:"notice error",role:"alert"},ee={key:3,class:"stack","aria-busy":"true"},te=["aria-busy"],se={class:"row-main"},ae={class:"badge"},le={class:"muted small",style:{margin:"0"}},oe={key:0},ne={key:1},ie={key:2},re={key:0,style:{margin:"6px 0 0"}},ue={key:1,class:"empty",style:{"margin-top":"12px"}},de={key:2,class:"btn-row",style:{"margin-top":"16px","justify-content":"space-between","align-items":"center"},"aria-label":"Strony"},pe=["disabled"],ce={class:"muted small nums"},ve=["disabled"],fe=V({__name:"MaterialsView",setup(ye){const h=j(),o=W({course:"",type:"",tag:""}),i=m(1),u=m(null),b=m(!1),g=m(""),k=m(new Map);$(()=>{h.loadCourses(),_()});let f=0;async function _(){const r=++f;b.value=!0,g.value="";try{const t=await D.materials({course:o.course?Number(o.course):null,type:o.type||null,tag:o.tag||null,page:i.value});if(r!==f)return;u.value=t;for(const w of t.data)for(const e of w.tags)k.value.set(e.slug,e);k.value=new Map(k.value)}catch(t){r===f&&(g.value=E(t))}finally{r===f&&(b.value=!1)}}P(o,()=>{i.value=1,_()});function C(r){i.value=r,_(),window.scrollTo({top:0})}const x=M(()=>[...k.value.values()].sort((r,t)=>r.name.localeCompare(t.name,"pl"))),z=M(()=>!!(o.course||o.type||o.tag)),T=()=>Object.assign(o,{course:"",type:"",tag:""});return(r,t)=>{const w=q("router-link");return s(),a("div",null,[A(H,{eyebrow:"Notatki, PDF-y, linki",title:"Materiały"}),l("form",{class:"grid-2",style:{"margin-bottom":"8px"},onSubmit:t[2]||(t[2]=F(()=>{},["prevent"]))},[l("div",R,[t[7]||(t[7]=l("label",{for:"f-course"},"Przedmiot",-1)),N(l("select",{id:"f-course","onUpdate:modelValue":t[0]||(t[0]=e=>o.course=e)},[t[6]||(t[6]=l("option",{value:""},"Wszystkie",-1)),(s(!0),a(c,null,v(y(h).visibleCourses,e=>(s(),a("option",{key:e.id,value:String(e.id)},n(e.name)+" ("+n(e.form==="wyklad"?"wykład":e.form==="cwiczenia"?"ćwiczenia":e.form)+")",9,Y))),128))],512),[[B,o.course]])]),l("div",J,[t[9]||(t[9]=l("label",{for:"f-type"},"Rodzaj",-1)),N(l("select",{id:"f-type","onUpdate:modelValue":t[1]||(t[1]=e=>o.type=e)},[t[8]||(t[8]=l("option",{value:""},"Wszystkie",-1)),(s(!0),a(c,null,v(y(S),(e,p)=>(s(),a("option",{key:p,value:p},n(e),9,K))),128))],512),[[B,o.type]])])],32),x.value.length?(s(),a("div",Q,[(s(!0),a(c,null,v(x.value,e=>(s(),a("button",{key:e.slug,class:"chip",type:"button","aria-pressed":o.tag===e.slug,onClick:p=>o.tag=o.tag===e.slug?"":e.slug},n(e.name),9,X))),128))])):d("",!0),z.value?(s(),a("button",{key:1,class:"linkish small",type:"button",onClick:T},"Wyczyść filtry")):d("",!0),g.value?(s(),a("div",Z,[L(n(g.value)+" ",1),l("button",{class:"linkish",type:"button",onClick:t[3]||(t[3]=e=>_())},"Spróbuj ponownie")])):u.value?(s(),a(c,{key:4},[u.value.data.length?(s(),a("div",{key:0,class:"stack",style:{"margin-top":"12px"},"aria-busy":b.value},[(s(!0),a(c,null,v(u.value.data,e=>(s(),U(w,{key:e.id,to:`/materialy/${e.id}`,class:"card link"},{default:G(()=>[l("div",se,[l("h3",null,n(e.title),1),l("span",ae,n(y(S)[e.type]),1)]),l("p",le,[e.course?(s(),a("span",oe,n(e.course.name),1)):d("",!0),e.published_at?(s(),a("span",ne," · "+n(y(I)(e.published_at)),1)):d("",!0),e.files_count?(s(),a("span",ie," · "+n(y(O)(e.files_count,"plik","pliki","plików")),1)):d("",!0)]),e.tags.length?(s(),a("p",re,[(s(!0),a(c,null,v(e.tags,p=>(s(),a("span",{key:p.id,class:"badge",style:{"margin-right":"4px"}},n(p.name),1))),128))])):d("",!0)]),_:2},1032,["to"]))),128))],8,te)):(s(),a("p",ue,n(z.value?"Nic nie pasuje do filtrów.":"Nie ma jeszcze żadnych materiałów."),1)),u.value.meta.last_page>1?(s(),a("nav",de,[l("button",{class:"btn small",type:"button",disabled:i.value<=1,onClick:t[4]||(t[4]=e=>C(i.value-1))},"← Poprzednia",8,pe),l("span",ce,n(i.value)+" / "+n(u.value.meta.last_page),1),l("button",{class:"btn small",type:"button",disabled:i.value>=u.value.meta.last_page,onClick:t[5]||(t[5]=e=>C(i.value+1))},"Następna →",8,ve)])):d("",!0)],64)):(s(),a("div",ee,[...t[10]||(t[10]=[l("div",{class:"skeleton"},null,-1),l("div",{class:"skeleton"},null,-1)])]))])}}});export{fe as default};
import{d as V,p as j,q as $,E as D,G as E,A as P,c as a,h as A,a as l,w as N,H as B,F as c,y as v,b as y,g as F,e as d,m as L,t as n,I as W,r as m,s as M,o as s,k as q,B as U,i as G}from"./index-CcCE3P1z.js";import{_ as H}from"./PageHead.vue_vue_type_script_setup_true_lang-4URWY3a8.js";import{T as S,i as I,c as O}from"./format-bcE-cYHJ.js";const R={class:"field"},Y=["value"],J={class:"field"},K=["value"],Q={key:0,class:"chips wrap",role:"group","aria-label":"Tagi",style:{"margin-bottom":"12px"}},X=["aria-pressed","onClick"],Z={key:2,class:"notice error",role:"alert"},ee={key:3,class:"stack","aria-busy":"true"},te=["aria-busy"],se={class:"row-main"},ae={class:"badge"},le={class:"muted small",style:{margin:"0"}},oe={key:0},ne={key:1},ie={key:2},re={key:0,style:{margin:"6px 0 0"}},ue={key:1,class:"empty",style:{"margin-top":"12px"}},de={key:2,class:"btn-row",style:{"margin-top":"16px","justify-content":"space-between","align-items":"center"},"aria-label":"Strony"},pe=["disabled"],ce={class:"muted small nums"},ve=["disabled"],fe=V({__name:"MaterialsView",setup(ye){const h=j(),o=W({course:"",type:"",tag:""}),i=m(1),u=m(null),b=m(!1),g=m(""),k=m(new Map);$(()=>{h.loadCourses(),_()});let f=0;async function _(){const r=++f;b.value=!0,g.value="";try{const t=await D.materials({course:o.course?Number(o.course):null,type:o.type||null,tag:o.tag||null,page:i.value});if(r!==f)return;u.value=t;for(const w of t.data)for(const e of w.tags)k.value.set(e.slug,e);k.value=new Map(k.value)}catch(t){r===f&&(g.value=E(t))}finally{r===f&&(b.value=!1)}}P(o,()=>{i.value=1,_()});function C(r){i.value=r,_(),window.scrollTo({top:0})}const x=M(()=>[...k.value.values()].sort((r,t)=>r.name.localeCompare(t.name,"pl"))),z=M(()=>!!(o.course||o.type||o.tag)),T=()=>Object.assign(o,{course:"",type:"",tag:""});return(r,t)=>{const w=q("router-link");return s(),a("div",null,[A(H,{eyebrow:"Notatki, PDF-y, linki",title:"Materiały"}),l("form",{class:"grid-2",style:{"margin-bottom":"8px"},onSubmit:t[2]||(t[2]=F(()=>{},["prevent"]))},[l("div",R,[t[7]||(t[7]=l("label",{for:"f-course"},"Przedmiot",-1)),N(l("select",{id:"f-course","onUpdate:modelValue":t[0]||(t[0]=e=>o.course=e)},[t[6]||(t[6]=l("option",{value:""},"Wszystkie",-1)),(s(!0),a(c,null,v(y(h).visibleCourses,e=>(s(),a("option",{key:e.id,value:String(e.id)},n(e.name)+" ("+n(e.form==="wyklad"?"wykład":e.form==="cwiczenia"?"ćwiczenia":e.form)+")",9,Y))),128))],512),[[B,o.course]])]),l("div",J,[t[9]||(t[9]=l("label",{for:"f-type"},"Rodzaj",-1)),N(l("select",{id:"f-type","onUpdate:modelValue":t[1]||(t[1]=e=>o.type=e)},[t[8]||(t[8]=l("option",{value:""},"Wszystkie",-1)),(s(!0),a(c,null,v(y(S),(e,p)=>(s(),a("option",{key:p,value:p},n(e),9,K))),128))],512),[[B,o.type]])])],32),x.value.length?(s(),a("div",Q,[(s(!0),a(c,null,v(x.value,e=>(s(),a("button",{key:e.slug,class:"chip",type:"button","aria-pressed":o.tag===e.slug,onClick:p=>o.tag=o.tag===e.slug?"":e.slug},n(e.name),9,X))),128))])):d("",!0),z.value?(s(),a("button",{key:1,class:"linkish small",type:"button",onClick:T},"Wyczyść filtry")):d("",!0),g.value?(s(),a("div",Z,[L(n(g.value)+" ",1),l("button",{class:"linkish",type:"button",onClick:t[3]||(t[3]=e=>_())},"Spróbuj ponownie")])):u.value?(s(),a(c,{key:4},[u.value.data.length?(s(),a("div",{key:0,class:"stack",style:{"margin-top":"12px"},"aria-busy":b.value},[(s(!0),a(c,null,v(u.value.data,e=>(s(),U(w,{key:e.id,to:`/materialy/${e.id}`,class:"card link"},{default:G(()=>[l("div",se,[l("h3",null,n(e.title),1),l("span",ae,n(y(S)[e.type]),1)]),l("p",le,[e.course?(s(),a("span",oe,n(e.course.name),1)):d("",!0),e.published_at?(s(),a("span",ne," · "+n(y(I)(e.published_at)),1)):d("",!0),e.files_count?(s(),a("span",ie," · "+n(y(O)(e.files_count,"plik","pliki","plików")),1)):d("",!0)]),e.tags.length?(s(),a("p",re,[(s(!0),a(c,null,v(e.tags,p=>(s(),a("span",{key:p.id,class:"badge",style:{"margin-right":"4px"}},n(p.name),1))),128))])):d("",!0)]),_:2},1032,["to"]))),128))],8,te)):(s(),a("p",ue,n(z.value?"Nic nie pasuje do filtrów.":"Nie ma jeszcze żadnych materiałów."),1)),u.value.meta.last_page>1?(s(),a("nav",de,[l("button",{class:"btn small",type:"button",disabled:i.value<=1,onClick:t[4]||(t[4]=e=>C(i.value-1))},"← Poprzednia",8,pe),l("span",ce,n(i.value)+" / "+n(u.value.meta.last_page),1),l("button",{class:"btn small",type:"button",disabled:i.value>=u.value.meta.last_page,onClick:t[5]||(t[5]=e=>C(i.value+1))},"Następna →",8,ve)])):d("",!0)],64)):(s(),a("div",ee,[...t[10]||(t[10]=[l("div",{class:"skeleton"},null,-1),l("div",{class:"skeleton"},null,-1)])]))])}}});export{fe as default};

View File

@@ -1 +1 @@
import{_ as b}from"./PageHead.vue_vue_type_script_setup_true_lang-87_LQUHg.js";import{d as h,u as k,M as _,N as z,c as s,h as i,a as t,F as w,y as g,b as n,e as f,t as l,s as v,o,B as j,i as P,k as x,_ as u}from"./index-BjjbG2NZ.js";const C={class:"stack"},N={class:"row-main",style:{"align-items":"center"}},B={class:"muted small"},D={class:"row-main",style:{"align-items":"center"}},W=h({__name:"MoreView",setup(F){const r=k(),c=_(),d=z(),m=[{to:"/terminarz",label:"Terminarz",hint:"Zaliczenia, egzaminy, sprawy organizacyjne",icon:"flag"},{to:"/przedmioty",label:"Przedmioty",hint:"Program studiów, prowadzący, materiały",icon:"grad"},{to:"/materialy",label:"Materiały",hint:"Notatki, PDF-y, linki",icon:"file"},{to:"/sylabusy",label:"Sylabusy",hint:"Karty przedmiotów do pobrania (PDF)",icon:"file"},{to:"/moje-prezentacje",label:"Moje prezentacje",hint:"Wersje prelegenta i linki publiczne",icon:"slides"},{to:"/profil",label:"Profil",hint:"Dane, hasło, wybór przedmiotów",icon:"user"}],p=v(()=>d?[{to:"/pilot",label:"Pilot",hint:"Ostatnia prezentacja otwierana na tym urządzeniu",icon:"slides"},...m]:m);return(M,e)=>{const y=x("router-link");return o(),s("div",null,[i(b,{eyebrow:"Pozostałe",title:"Więcej"}),t("div",C,[(o(!0),s(w,null,g(p.value,a=>(o(),j(y,{key:a.to,to:a.to,class:"card link"},{default:P(()=>[t("div",N,[t("div",null,[t("h3",null,l(a.label),1),t("span",B,l(a.hint),1)]),i(u,{name:"chevron",style:{width:"20px",height:"20px"}})])]),_:2},1032,["to"]))),128)),n(c).canInstall?(o(),s("button",{key:0,type:"button",class:"card link",onClick:e[0]||(e[0]=a=>n(c).install())},[t("div",D,[e[2]||(e[2]=t("div",null,[t("h3",null,"Zainstaluj aplikację"),t("span",{class:"muted small"},"Ikona na ekranie głównym i szybki dostęp do pilota")],-1)),i(u,{name:"chevron",style:{width:"20px",height:"20px"}})])])):f("",!0),t("button",{class:"btn miss",type:"button",onClick:e[1]||(e[1]=a=>n(r).logout())},"Wyloguj ("+l(n(r).displayName)+")",1)])])}}});export{W as default};
import{_ as b}from"./PageHead.vue_vue_type_script_setup_true_lang-4URWY3a8.js";import{d as h,u as k,M as _,N as z,c as s,h as i,a as t,F as w,y as g,b as n,e as f,t as l,s as v,o,B as j,i as P,k as x,_ as u}from"./index-CcCE3P1z.js";const C={class:"stack"},N={class:"row-main",style:{"align-items":"center"}},B={class:"muted small"},D={class:"row-main",style:{"align-items":"center"}},W=h({__name:"MoreView",setup(F){const r=k(),c=_(),d=z(),m=[{to:"/terminarz",label:"Terminarz",hint:"Zaliczenia, egzaminy, sprawy organizacyjne",icon:"flag"},{to:"/przedmioty",label:"Przedmioty",hint:"Program studiów, prowadzący, materiały",icon:"grad"},{to:"/materialy",label:"Materiały",hint:"Notatki, PDF-y, linki",icon:"file"},{to:"/sylabusy",label:"Sylabusy",hint:"Karty przedmiotów do pobrania (PDF)",icon:"file"},{to:"/moje-prezentacje",label:"Moje prezentacje",hint:"Wersje prelegenta i linki publiczne",icon:"slides"},{to:"/profil",label:"Profil",hint:"Dane, hasło, wybór przedmiotów",icon:"user"}],p=v(()=>d?[{to:"/pilot",label:"Pilot",hint:"Ostatnia prezentacja otwierana na tym urządzeniu",icon:"slides"},...m]:m);return(M,e)=>{const y=x("router-link");return o(),s("div",null,[i(b,{eyebrow:"Pozostałe",title:"Więcej"}),t("div",C,[(o(!0),s(w,null,g(p.value,a=>(o(),j(y,{key:a.to,to:a.to,class:"card link"},{default:P(()=>[t("div",N,[t("div",null,[t("h3",null,l(a.label),1),t("span",B,l(a.hint),1)]),i(u,{name:"chevron",style:{width:"20px",height:"20px"}})])]),_:2},1032,["to"]))),128)),n(c).canInstall?(o(),s("button",{key:0,type:"button",class:"card link",onClick:e[0]||(e[0]=a=>n(c).install())},[t("div",D,[e[2]||(e[2]=t("div",null,[t("h3",null,"Zainstaluj aplikację"),t("span",{class:"muted small"},"Ikona na ekranie głównym i szybki dostęp do pilota")],-1)),i(u,{name:"chevron",style:{width:"20px",height:"20px"}})])])):f("",!0),t("button",{class:"btn miss",type:"button",onClick:e[1]||(e[1]=a=>n(r).logout())},"Wyloguj ("+l(n(r).displayName)+")",1)])])}}});export{W as default};

View File

@@ -1 +1 @@
import{d as g,q as b,c as a,h as p,e as y,i as _,j as v,l as h,r as u,G as x,o as n,F as N,y as $,a as o,t as f,m as l,k as C}from"./index-BjjbG2NZ.js";import{_ as V}from"./PageHead.vue_vue_type_script_setup_true_lang-87_LQUHg.js";import{_ as q}from"./LoadState.vue_vue_type_script_setup_true_lang-DmeM0AV0.js";import{p as M}from"./presentations-C1CriPMF.js";import{c as P}from"./format-bcE-cYHJ.js";const R={key:0,class:"notice error",role:"alert"},T={key:0,class:"stack"},B={class:"small muted",style:{display:"flex","flex-wrap":"wrap","align-items":"center",gap:"8px",margin:"4px 0 0"}},O={key:0,class:"badge online"},D={key:1,class:"badge"},F={style:{display:"flex","flex-wrap":"wrap",gap:"8px","margin-top":"14px"}},L=["href"],A=["href"],E={key:1,class:"muted small",style:{margin:"0"}},G={key:1,class:"empty"},Q=g({__name:"MyPresentationsView",setup(H){const c=v(),k=h(),r=u(null),i=u(""),d=u(!1);function j(t){const e=P(t.slide_count,"slajd","slajdy","slajdów");return t.total_seconds===0?e:`${e} · ${Math.round(t.total_seconds/60)} min`}function w(t){return`/moje-prezentacje/${encodeURIComponent(t)}`}async function m(){i.value="";try{r.value=await M.mine()}catch(t){r.value=null,i.value=x(t)}}return b(()=>{if(c.query.denied==="1"){d.value=!0;const t={...c.query};delete t.denied,k.replace({name:"my-presentations",query:t})}m()}),(t,e)=>{const z=C("router-link");return n(),a("div",null,[p(V,{eyebrow:"Dla prelegenta",title:"Moje prezentacje"}),d.value?(n(),a("p",R," Nie masz dostępu do tej prezentacji albo taka prezentacja nie istnieje. Poniżej są prezentacje przypisane do Twojego konta. ")):y("",!0),p(q,{ready:r.value!==null,error:i.value,onRetry:e[0]||(e[0]=s=>m())},{default:_(()=>[r.value?.length?(n(),a("div",T,[(n(!0),a(N,null,$(r.value,s=>(n(),a("article",{key:s.slug,class:"card accent"},[o("h3",null,f(s.title),1),o("p",B,[o("span",null,f(j(s)),1),s.is_published?(n(),a("span",O,"Opublikowana")):(n(),a("span",D,"Nieopublikowana"))]),o("div",F,[o("a",{class:"btn primary",href:w(s.slug),target:"_blank",rel:"opener"},[...e[1]||(e[1]=[l(" Otwórz wersję prelegenta ",-1),o("span",{class:"sr-only"},"(otwiera się w nowej karcie)",-1)])],8,L),s.is_published&&s.public_path?(n(),a("a",{key:0,class:"btn",href:s.public_path,target:"_blank",rel:"noopener noreferrer"},[...e[2]||(e[2]=[l(" Otwórz wersję publiczną ",-1),o("span",{class:"sr-only"},"(otwiera się w nowej karcie)",-1)])],8,A)):s.is_published?y("",!0):(n(),a("p",E,"Link publiczny zacznie działać po opublikowaniu prezentacji.")),p(z,{class:"btn",to:{name:"presentation-remote",params:{slug:s.slug}}},{default:_(()=>[...e[3]||(e[3]=[l(" Pilot ",-1),o("span",{class:"sr-only"},"(otwórz na telefonie)",-1)])]),_:1},8,["to"])])]))),128))])):(n(),a("p",G,[...e[4]||(e[4]=[o("span",{class:"title",style:{display:"block",color:"var(--ink)"}},"Nie masz jeszcze żadnych prezentacji.",-1),l(" Pojawią się tutaj, gdy administrator przypisze prezentację do Twojego konta. ",-1)])]))]),_:1},8,["ready","error"])])}}});export{Q as default};
import{d as g,q as b,c as a,h as p,e as y,i as _,j as v,l as h,r as u,G as x,o as n,F as N,y as $,a as o,t as f,m as l,k as C}from"./index-CcCE3P1z.js";import{_ as V}from"./PageHead.vue_vue_type_script_setup_true_lang-4URWY3a8.js";import{_ as q}from"./LoadState.vue_vue_type_script_setup_true_lang-BlmCGQyT.js";import{p as M}from"./presentations-CfZEeG4U.js";import{c as P}from"./format-bcE-cYHJ.js";const R={key:0,class:"notice error",role:"alert"},T={key:0,class:"stack"},B={class:"small muted",style:{display:"flex","flex-wrap":"wrap","align-items":"center",gap:"8px",margin:"4px 0 0"}},O={key:0,class:"badge online"},D={key:1,class:"badge"},F={style:{display:"flex","flex-wrap":"wrap",gap:"8px","margin-top":"14px"}},L=["href"],A=["href"],E={key:1,class:"muted small",style:{margin:"0"}},G={key:1,class:"empty"},Q=g({__name:"MyPresentationsView",setup(H){const c=v(),k=h(),r=u(null),i=u(""),d=u(!1);function j(t){const e=P(t.slide_count,"slajd","slajdy","slajdów");return t.total_seconds===0?e:`${e} · ${Math.round(t.total_seconds/60)} min`}function w(t){return`/moje-prezentacje/${encodeURIComponent(t)}`}async function m(){i.value="";try{r.value=await M.mine()}catch(t){r.value=null,i.value=x(t)}}return b(()=>{if(c.query.denied==="1"){d.value=!0;const t={...c.query};delete t.denied,k.replace({name:"my-presentations",query:t})}m()}),(t,e)=>{const z=C("router-link");return n(),a("div",null,[p(V,{eyebrow:"Dla prelegenta",title:"Moje prezentacje"}),d.value?(n(),a("p",R," Nie masz dostępu do tej prezentacji albo taka prezentacja nie istnieje. Poniżej są prezentacje przypisane do Twojego konta. ")):y("",!0),p(q,{ready:r.value!==null,error:i.value,onRetry:e[0]||(e[0]=s=>m())},{default:_(()=>[r.value?.length?(n(),a("div",T,[(n(!0),a(N,null,$(r.value,s=>(n(),a("article",{key:s.slug,class:"card accent"},[o("h3",null,f(s.title),1),o("p",B,[o("span",null,f(j(s)),1),s.is_published?(n(),a("span",O,"Opublikowana")):(n(),a("span",D,"Nieopublikowana"))]),o("div",F,[o("a",{class:"btn primary",href:w(s.slug),target:"_blank",rel:"opener"},[...e[1]||(e[1]=[l(" Otwórz wersję prelegenta ",-1),o("span",{class:"sr-only"},"(otwiera się w nowej karcie)",-1)])],8,L),s.is_published&&s.public_path?(n(),a("a",{key:0,class:"btn",href:s.public_path,target:"_blank",rel:"noopener noreferrer"},[...e[2]||(e[2]=[l(" Otwórz wersję publiczną ",-1),o("span",{class:"sr-only"},"(otwiera się w nowej karcie)",-1)])],8,A)):s.is_published?y("",!0):(n(),a("p",E,"Link publiczny zacznie działać po opublikowaniu prezentacji.")),p(z,{class:"btn",to:{name:"presentation-remote",params:{slug:s.slug}}},{default:_(()=>[...e[3]||(e[3]=[l(" Pilot ",-1),o("span",{class:"sr-only"},"(otwórz na telefonie)",-1)])]),_:1},8,["to"])])]))),128))])):(n(),a("p",G,[...e[4]||(e[4]=[o("span",{class:"title",style:{display:"block",color:"var(--ink)"}},"Nie masz jeszcze żadnych prezentacji.",-1),l(" Pojawią się tutaj, gdy administrator przypisze prezentację do Twojego konta. ",-1)])]))]),_:1},8,["ready","error"])])}}});export{Q as default};

View File

@@ -1 +1 @@
import{_ as s}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{o as a,c as r,a as t,h as n,i as l,m as c,k as i}from"./index-BjjbG2NZ.js";const d={},p={class:"stack"};function _(m,e){const o=i("router-link");return a(),r("div",p,[e[1]||(e[1]=t("header",{class:"page-head"},[t("span",{class:"eyebrow"},"404"),t("h1",null,"Nie ma takiej strony")],-1)),t("p",null,[n(o,{to:"/"},{default:l(()=>[...e[0]||(e[0]=[c("Wróć na pulpit",-1)])]),_:1})])])}const k=s(d,[["render",_]]);export{k as default};
import{_ as s}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{o as a,c as r,a as t,h as n,i as l,m as c,k as i}from"./index-CcCE3P1z.js";const d={},p={class:"stack"};function _(m,e){const o=i("router-link");return a(),r("div",p,[e[1]||(e[1]=t("header",{class:"page-head"},[t("span",{class:"eyebrow"},"404"),t("h1",null,"Nie ma takiej strony")],-1)),t("p",null,[n(o,{to:"/"},{default:l(()=>[...e[0]||(e[0]=[c("Wróć na pulpit",-1)])]),_:1})])])}const k=s(d,[["render",_]]);export{k as default};

View File

@@ -1 +1 @@
import{d as r,c as s,t as o,e as c,a as t,T as d,o as a}from"./index-BjjbG2NZ.js";const l={class:"page-head"},i={key:0,class:"eyebrow"},_={class:"row"},h={class:"btn-row"},u=r({__name:"PageHead",props:{eyebrow:{},title:{}},setup(e){return(n,m)=>(a(),s("header",l,[e.eyebrow?(a(),s("span",i,o(e.eyebrow),1)):c("",!0),t("div",_,[t("h1",null,o(e.title),1),t("div",h,[d(n.$slots,"default")])])]))}});export{u as _};
import{d as r,c as s,t as o,e as c,a as t,T as d,o as a}from"./index-CcCE3P1z.js";const l={class:"page-head"},i={key:0,class:"eyebrow"},_={class:"row"},h={class:"btn-row"},u=r({__name:"PageHead",props:{eyebrow:{},title:{}},setup(e){return(n,m)=>(a(),s("header",l,[e.eyebrow?(a(),s("span",i,o(e.eyebrow),1)):c("",!0),t("div",_,[t("h1",null,o(e.title),1),t("div",h,[d(n.$slots,"default")])])]))}});export{u as _};

View File

@@ -1 +1 @@
import{d as h,A as k,q as b,U as g,B as w,r as u,o as _,S as l}from"./index-BjjbG2NZ.js";import{p as y}from"./presentations-C1CriPMF.js";import{_ as E}from"./DeckViewer.vue_vue_type_style_index_0_lang-CtdLSbAV.js";/* empty css */const x="Sprawdź połączenie z internetem i spróbuj ponownie.",z="Za dużo żądań w krótkim czasie. Odczekaj minutę i spróbuj ponownie.",j="Prezentacja · BM II°",T=h({__name:"PresentationPublicView",props:{slugHash:{}},setup(f){const d=f,n=u("pending"),a=u(null),o=u("");let s=0,r=0;function c(){s&&window.clearTimeout(s),s=0}async function m(t){const i=++r;c(),document.title=j,n.value="pending",a.value=null,o.value="",s=window.setTimeout(()=>{i===r&&n.value==="pending"&&(n.value="loading")},200);try{const e=await y.publicDeck(t);if(i!==r)return;c();const p=e.slides??[];a.value={...e,slides:p},e.title&&(document.title=e.title),n.value=p.length===0?"empty":"ready"}catch(e){if(i!==r)return;if(c(),e instanceof l&&e.status===404){n.value="notfound";return}e instanceof l&&e.status===429?o.value=z:e instanceof l&&e.message?o.value=e.message:o.value=x,n.value="error"}}function v(){m(d.slugHash)}return k(()=>d.slugHash,t=>{m(t)},{immediate:!0}),b(()=>{if(document.documentElement.classList.add("deck-public"),!document.querySelector('meta[data-deck-public="1"]')){const t=document.createElement("meta");t.name="robots",t.content="noindex",t.dataset.deckPublic="1",document.head.appendChild(t)}}),g(()=>{r+=1,c(),document.documentElement.classList.remove("deck-public"),document.querySelector('meta[data-deck-public="1"]')?.remove()}),(t,i)=>(_(),w(E,{phase:n.value,deck:a.value,error:o.value,"extra-css":a.value?.css,theme:a.value?.theme,onRetry:v},null,8,["phase","deck","error","extra-css","theme"]))}});export{T as default};
import{d as h,A as k,q as b,U as g,B as w,r as u,o as _,S as l}from"./index-CcCE3P1z.js";import{p as y}from"./presentations-CfZEeG4U.js";import{_ as E}from"./DeckViewer.vue_vue_type_style_index_0_lang-v_Gmwa2F.js";/* empty css */const x="Sprawdź połączenie z internetem i spróbuj ponownie.",z="Za dużo żądań w krótkim czasie. Odczekaj minutę i spróbuj ponownie.",j="Prezentacja · BM II°",T=h({__name:"PresentationPublicView",props:{slugHash:{}},setup(f){const d=f,n=u("pending"),a=u(null),o=u("");let s=0,r=0;function c(){s&&window.clearTimeout(s),s=0}async function m(t){const i=++r;c(),document.title=j,n.value="pending",a.value=null,o.value="",s=window.setTimeout(()=>{i===r&&n.value==="pending"&&(n.value="loading")},200);try{const e=await y.publicDeck(t);if(i!==r)return;c();const p=e.slides??[];a.value={...e,slides:p},e.title&&(document.title=e.title),n.value=p.length===0?"empty":"ready"}catch(e){if(i!==r)return;if(c(),e instanceof l&&e.status===404){n.value="notfound";return}e instanceof l&&e.status===429?o.value=z:e instanceof l&&e.message?o.value=e.message:o.value=x,n.value="error"}}function v(){m(d.slugHash)}return k(()=>d.slugHash,t=>{m(t)},{immediate:!0}),b(()=>{if(document.documentElement.classList.add("deck-public"),!document.querySelector('meta[data-deck-public="1"]')){const t=document.createElement("meta");t.name="robots",t.content="noindex",t.dataset.deckPublic="1",document.head.appendChild(t)}}),g(()=>{r+=1,c(),document.documentElement.classList.remove("deck-public"),document.querySelector('meta[data-deck-public="1"]')?.remove()}),(t,i)=>(_(),w(E,{phase:n.value,deck:a.value,error:o.value,"extra-css":a.value?.css,theme:a.value?.theme,onRetry:v},null,8,["phase","deck","error","extra-css","theme"]))}});export{T as default};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1 +1 @@
import{_ as g}from"./PageHead.vue_vue_type_script_setup_true_lang-87_LQUHg.js";import{_ as w}from"./LoadState.vue_vue_type_script_setup_true_lang-DmeM0AV0.js";import{q as z,_ as x}from"./quizzes-BoORoN8D.js";import{d as j,q as B,c as s,h as d,i as k,r as m,G as N,o as t,F as p,y as V,B as $,a as o,t as n,e as l,m as _,b as h,k as b}from"./index-BjjbG2NZ.js";import{c as f}from"./format-bcE-cYHJ.js";const C={key:0,class:"stack"},F={key:0,class:"muted small",style:{margin:"0 0 8px"}},Q={class:"small",style:{margin:"0"}},T={key:1,class:"empty"},A={key:2,class:"section","aria-labelledby":"hist-h"},D={class:"card"},R=j({__name:"QuizzesView",setup(E){const i=m(null),c=m([]),u=m("");async function y(){u.value="";try{const[r,a]=await Promise.all([z.list(),z.attempts()]);i.value=r,c.value=a.data}catch(r){u.value=N(r)}}return B(y),(r,a)=>{const v=b("router-link");return t(),s("div",null,[d(g,{eyebrow:"Fiszki i testy",title:"Quizy"}),d(w,{ready:i.value!==null,error:u.value,onRetry:a[0]||(a[0]=e=>y())},{default:k(()=>[i.value?.length?(t(),s("div",C,[(t(!0),s(p,null,V(i.value,e=>(t(),$(v,{key:e.id,to:`/quizy/${e.slug}`,class:"card link accent"},{default:k(()=>[o("h3",null,n(e.title),1),e.description?(t(),s("p",F,n(e.description),1)):l("",!0),o("p",Q,[_(n(h(f)(e.question_count,"pytanie","pytania","pytań")),1),e.round_size?(t(),s(p,{key:0},[_(" · rundy po "+n(e.round_size),1)],64)):l("",!0),e.attempts_count?(t(),s(p,{key:1},[_(" · "+n(h(f)(e.attempts_count,"zakończone podejście","zakończone podejścia","zakończonych podejść")),1)],64)):l("",!0)])]),_:2},1032,["to"]))),128))])):(t(),s("p",T,"Nie ma jeszcze żadnych quizów.")),c.value.length?(t(),s("section",A,[a[1]||(a[1]=o("div",{class:"section-head"},[o("h2",{id:"hist-h"},"Historia podejść")],-1)),o("div",D,[d(x,{attempts:c.value,"show-quiz":""},null,8,["attempts"])])])):l("",!0)]),_:1},8,["ready","error"])])}}});export{R as default};
import{_ as g}from"./PageHead.vue_vue_type_script_setup_true_lang-4URWY3a8.js";import{_ as w}from"./LoadState.vue_vue_type_script_setup_true_lang-BlmCGQyT.js";import{q as z,_ as x}from"./quizzes-a80XeEqs.js";import{d as j,q as B,c as s,h as d,i as k,r as m,G as N,o as t,F as p,y as V,B as $,a as o,t as n,e as l,m as _,b as h,k as b}from"./index-CcCE3P1z.js";import{c as f}from"./format-bcE-cYHJ.js";const C={key:0,class:"stack"},F={key:0,class:"muted small",style:{margin:"0 0 8px"}},Q={class:"small",style:{margin:"0"}},T={key:1,class:"empty"},A={key:2,class:"section","aria-labelledby":"hist-h"},D={class:"card"},R=j({__name:"QuizzesView",setup(E){const i=m(null),c=m([]),u=m("");async function y(){u.value="";try{const[r,a]=await Promise.all([z.list(),z.attempts()]);i.value=r,c.value=a.data}catch(r){u.value=N(r)}}return B(y),(r,a)=>{const v=b("router-link");return t(),s("div",null,[d(g,{eyebrow:"Fiszki i testy",title:"Quizy"}),d(w,{ready:i.value!==null,error:u.value,onRetry:a[0]||(a[0]=e=>y())},{default:k(()=>[i.value?.length?(t(),s("div",C,[(t(!0),s(p,null,V(i.value,e=>(t(),$(v,{key:e.id,to:`/quizy/${e.slug}`,class:"card link accent"},{default:k(()=>[o("h3",null,n(e.title),1),e.description?(t(),s("p",F,n(e.description),1)):l("",!0),o("p",Q,[_(n(h(f)(e.question_count,"pytanie","pytania","pytań")),1),e.round_size?(t(),s(p,{key:0},[_(" · rundy po "+n(e.round_size),1)],64)):l("",!0),e.attempts_count?(t(),s(p,{key:1},[_(" · "+n(h(f)(e.attempts_count,"zakończone podejście","zakończone podejścia","zakończonych podejść")),1)],64)):l("",!0)])]),_:2},1032,["to"]))),128))])):(t(),s("p",T,"Nie ma jeszcze żadnych quizów.")),c.value.length?(t(),s("section",A,[a[1]||(a[1]=o("div",{class:"section-head"},[o("h2",{id:"hist-h"},"Historia podejść")],-1)),o("div",D,[d(x,{attempts:c.value,"show-quiz":""},null,8,["attempts"])])])):l("",!0)]),_:1},8,["ready","error"])])}}});export{R as default};

View File

@@ -1 +1 @@
import{i as d}from"./format-bcE-cYHJ.js";import{d as c,o as a,c as t,a as n,m as g,t as r,e as i,b as m}from"./index-BjjbG2NZ.js";const u={class:"reading"},h=["checked"],k={class:"text"},f={key:0,class:"muted"},b={key:1,class:"muted mono"},y=["href","aria-label"],z=c({__name:"ReadingItem",props:{reading:{}},emits:["toggle"],setup(e){return(o,l)=>(a(),t("li",u,[n("label",null,[n("input",{type:"checkbox",checked:!!e.reading.read_at,onChange:l[0]||(l[0]=s=>o.$emit("toggle",s.target.checked))},null,40,h),n("span",k,[g(r(e.reading.title)+" ",1),e.reading.author||e.reading.source?(a(),t("small",f," · "+r([e.reading.author,e.reading.source].filter(Boolean).join(", ")),1)):i("",!0),e.reading.read_at?(a(),t("small",b," · przeczytano "+r(m(d)(e.reading.read_at)),1)):i("",!0)])]),e.reading.url?(a(),t("a",{key:0,href:e.reading.url,target:"_blank",rel:"noopener noreferrer",class:"small","aria-label":`Otwórz: ${e.reading.title}`},"link",8,y)):i("",!0)]))}});export{z as _};
import{i as d}from"./format-bcE-cYHJ.js";import{d as c,o as a,c as t,a as n,m as g,t as r,e as i,b as m}from"./index-CcCE3P1z.js";const u={class:"reading"},h=["checked"],k={class:"text"},f={key:0,class:"muted"},b={key:1,class:"muted mono"},y=["href","aria-label"],z=c({__name:"ReadingItem",props:{reading:{}},emits:["toggle"],setup(e){return(o,l)=>(a(),t("li",u,[n("label",null,[n("input",{type:"checkbox",checked:!!e.reading.read_at,onChange:l[0]||(l[0]=s=>o.$emit("toggle",s.target.checked))},null,40,h),n("span",k,[g(r(e.reading.title)+" ",1),e.reading.author||e.reading.source?(a(),t("small",f," · "+r([e.reading.author,e.reading.source].filter(Boolean).join(", ")),1)):i("",!0),e.reading.read_at?(a(),t("small",b," · przeczytano "+r(m(d)(e.reading.read_at)),1)):i("",!0)])]),e.reading.url?(a(),t("a",{key:0,href:e.reading.url,target:"_blank",rel:"noopener noreferrer",class:"small","aria-label":`Otwórz: ${e.reading.title}`},"link",8,y)):i("",!0)]))}});export{z as _};

View File

@@ -1 +1 @@
import{_ as q}from"./PageHead.vue_vue_type_script_setup_true_lang-87_LQUHg.js";import{_ as x}from"./LoadState.vue_vue_type_script_setup_true_lang-DmeM0AV0.js";import{_ as T}from"./ElectiveBar.vue_vue_type_script_setup_true_lang-DWtGRCWo.js";import{_ as b}from"./ReadingItem.vue_vue_type_script_setup_true_lang-BcQ0jlF2.js";import{d as $,p as B,q as R,c as l,h as m,i as w,b as i,o as n,a as t,t as r,z as C,F as _,y as h,e as g,r as V,s as v,k as F,m as L,B as z}from"./index-BjjbG2NZ.js";import{c as M,F as N}from"./format-bcE-cYHJ.js";const S={class:"card","aria-label":"Postęp czytania"},D={style:{margin:"0 0 8px"}},P={class:"big-num nums"},E={class:"muted"},O={class:"muted small"},j=["aria-valuenow"],A={class:"chips wrap",style:{"margin-top":"12px"}},G=["aria-pressed"],I=["aria-labelledby"],U={class:"section-head"},W=["id"],H={class:"badge",style:{"margin-left":"8px"}},J={class:"muted small nums"},K={class:"subhead"},Q={class:"rows"},X={class:"subhead"},Y={class:"rows"},Z={key:0,class:"empty",style:{"margin-top":"16px"}},le=$({__name:"ReadingsView",setup(ee){const s=B(),c=V(!1);R(()=>{Promise.all([s.loadReadings(),s.loadCourses()])});const f=v(()=>{const p=new Map;for(const o of s.readings)p.set(o.course_id,[...p.get(o.course_id)??[],o]);const u=o=>s.courseById.get(o)?.sort_order??0;return[...p].sort(([o],[e])=>u(o)-u(e)).map(([,o])=>{const e=c.value?o.filter(a=>!a.read_at):o;return{course:o[0].course,required:e.filter(a=>a.is_required),optional:e.filter(a=>!a.is_required),read:o.filter(a=>a.read_at).length,total:o.length}}).filter(o=>o.required.length+o.optional.length>0)}),d=v(()=>s.readingStats),k=v(()=>d.value.requiredTotal?Math.round(d.value.requiredRead/d.value.requiredTotal*100):0);return(p,u)=>{const o=F("router-link");return n(),l("div",null,[m(q,{eyebrow:"Do przeczytania",title:"Lektury"}),m(x,{ready:i(s).loaded.readings&&i(s).loaded.courses,error:i(s).error,onRetry:u[1]||(u[1]=e=>i(s).retry())},{default:w(()=>[m(T),t("section",S,[t("p",D,[t("span",P,r(d.value.requiredRead),1),t("span",E," z "+r(d.value.requiredTotal)+" obowiązkowych",1),t("span",O," · łącznie "+r(d.value.read)+" z "+r(d.value.total),1)]),t("div",{class:"progress-bar",role:"progressbar","aria-valuenow":k.value,"aria-valuemin":"0","aria-valuemax":"100","aria-label":"Przeczytane lektury obowiązkowe"},[t("span",{style:C({width:k.value+"%"})},null,4)],8,j)]),t("div",A,[t("button",{class:"chip",type:"button","aria-pressed":c.value,onClick:u[0]||(u[0]=e=>c.value=!c.value)},"Tylko nieprzeczytane",8,G)]),(n(!0),l(_,null,h(f.value,e=>(n(),l("section",{key:e.course.id,class:"section","aria-labelledby":`c${e.course.id}`},[t("div",U,[t("h2",{id:`c${e.course.id}`},[m(o,{to:`/przedmioty/${e.course.id}`,style:{color:"inherit","text-decoration":"none"}},{default:w(()=>[L(r(e.course.name),1)]),_:2},1032,["to"]),t("span",H,r(i(N)[e.course.form]),1)],8,W),t("span",J,r(e.read)+"/"+r(e.total),1)]),e.required.length?(n(),l(_,{key:0},[t("h3",K,"Obowiązkowe · "+r(e.required.length),1),t("ul",Q,[(n(!0),l(_,null,h(e.required,a=>(n(),z(b,{key:a.id,reading:a,onToggle:y=>i(s).toggleReading(a.id,y)},null,8,["reading","onToggle"]))),128))])],64)):g("",!0),e.optional.length?(n(),l(_,{key:1},[t("h3",X,"Dodatkowe · "+r(e.optional.length),1),t("ul",Y,[(n(!0),l(_,null,h(e.optional,a=>(n(),z(b,{key:a.id,reading:a,onToggle:y=>i(s).toggleReading(a.id,y)},null,8,["reading","onToggle"]))),128))])],64)):g("",!0)],8,I))),128)),f.value.length?g("",!0):(n(),l("p",Z,r(c.value?"Wszystko przeczytane. Gratulacje!":i(M)(0,"lektura","lektury","lektur")+" do wyświetlenia."),1))]),_:1},8,["ready","error"])])}}});export{le as default};
import{_ as q}from"./PageHead.vue_vue_type_script_setup_true_lang-4URWY3a8.js";import{_ as x}from"./LoadState.vue_vue_type_script_setup_true_lang-BlmCGQyT.js";import{_ as T}from"./ElectiveBar.vue_vue_type_script_setup_true_lang-uCbzryQF.js";import{_ as b}from"./ReadingItem.vue_vue_type_script_setup_true_lang-DwAOXYUn.js";import{d as $,p as B,q as R,c as l,h as m,i as w,b as i,o as n,a as t,t as r,z as C,F as _,y as h,e as g,r as V,s as v,k as F,m as L,B as z}from"./index-CcCE3P1z.js";import{c as M,F as N}from"./format-bcE-cYHJ.js";const S={class:"card","aria-label":"Postęp czytania"},D={style:{margin:"0 0 8px"}},P={class:"big-num nums"},E={class:"muted"},O={class:"muted small"},j=["aria-valuenow"],A={class:"chips wrap",style:{"margin-top":"12px"}},G=["aria-pressed"],I=["aria-labelledby"],U={class:"section-head"},W=["id"],H={class:"badge",style:{"margin-left":"8px"}},J={class:"muted small nums"},K={class:"subhead"},Q={class:"rows"},X={class:"subhead"},Y={class:"rows"},Z={key:0,class:"empty",style:{"margin-top":"16px"}},le=$({__name:"ReadingsView",setup(ee){const s=B(),c=V(!1);R(()=>{Promise.all([s.loadReadings(),s.loadCourses()])});const f=v(()=>{const p=new Map;for(const o of s.readings)p.set(o.course_id,[...p.get(o.course_id)??[],o]);const u=o=>s.courseById.get(o)?.sort_order??0;return[...p].sort(([o],[e])=>u(o)-u(e)).map(([,o])=>{const e=c.value?o.filter(a=>!a.read_at):o;return{course:o[0].course,required:e.filter(a=>a.is_required),optional:e.filter(a=>!a.is_required),read:o.filter(a=>a.read_at).length,total:o.length}}).filter(o=>o.required.length+o.optional.length>0)}),d=v(()=>s.readingStats),k=v(()=>d.value.requiredTotal?Math.round(d.value.requiredRead/d.value.requiredTotal*100):0);return(p,u)=>{const o=F("router-link");return n(),l("div",null,[m(q,{eyebrow:"Do przeczytania",title:"Lektury"}),m(x,{ready:i(s).loaded.readings&&i(s).loaded.courses,error:i(s).error,onRetry:u[1]||(u[1]=e=>i(s).retry())},{default:w(()=>[m(T),t("section",S,[t("p",D,[t("span",P,r(d.value.requiredRead),1),t("span",E," z "+r(d.value.requiredTotal)+" obowiązkowych",1),t("span",O," · łącznie "+r(d.value.read)+" z "+r(d.value.total),1)]),t("div",{class:"progress-bar",role:"progressbar","aria-valuenow":k.value,"aria-valuemin":"0","aria-valuemax":"100","aria-label":"Przeczytane lektury obowiązkowe"},[t("span",{style:C({width:k.value+"%"})},null,4)],8,j)]),t("div",A,[t("button",{class:"chip",type:"button","aria-pressed":c.value,onClick:u[0]||(u[0]=e=>c.value=!c.value)},"Tylko nieprzeczytane",8,G)]),(n(!0),l(_,null,h(f.value,e=>(n(),l("section",{key:e.course.id,class:"section","aria-labelledby":`c${e.course.id}`},[t("div",U,[t("h2",{id:`c${e.course.id}`},[m(o,{to:`/przedmioty/${e.course.id}`,style:{color:"inherit","text-decoration":"none"}},{default:w(()=>[L(r(e.course.name),1)]),_:2},1032,["to"]),t("span",H,r(i(N)[e.course.form]),1)],8,W),t("span",J,r(e.read)+"/"+r(e.total),1)]),e.required.length?(n(),l(_,{key:0},[t("h3",K,"Obowiązkowe · "+r(e.required.length),1),t("ul",Q,[(n(!0),l(_,null,h(e.required,a=>(n(),z(b,{key:a.id,reading:a,onToggle:y=>i(s).toggleReading(a.id,y)},null,8,["reading","onToggle"]))),128))])],64)):g("",!0),e.optional.length?(n(),l(_,{key:1},[t("h3",X,"Dodatkowe · "+r(e.optional.length),1),t("ul",Y,[(n(!0),l(_,null,h(e.optional,a=>(n(),z(b,{key:a.id,reading:a,onToggle:y=>i(s).toggleReading(a.id,y)},null,8,["reading","onToggle"]))),128))])],64)):g("",!0)],8,I))),128)),f.value.length?g("",!0):(n(),l("p",Z,r(c.value?"Wszystko przeczytane. Gratulacje!":i(M)(0,"lektura","lektury","lektur")+" do wyświetlenia."),1))]),_:1},8,["ready","error"])])}}});export{le as default};

View File

@@ -1 +1 @@
import{d as q,u as N,c as o,a as s,t as n,h as _,i as g,g as B,e as u,w as d,v as m,r as l,k as C,o as i,m as x,l as I}from"./index-BjjbG2NZ.js";import{f as M}from"./forms-LHF4n69U.js";const h={class:"auth"},j={key:0,class:"stack"},S={class:"notice",role:"status"},Z={key:0,class:"notice error",role:"alert",style:{"margin-bottom":"14px"}},A={class:"field"},D={key:0,class:"error-text"},E={class:"field"},P={key:0,class:"error-text"},R={class:"field"},T={key:0,class:"error-text"},H={class:"field"},K={key:0,class:"error-text"},W={class:"field"},F=["disabled"],G={class:"auth-links"},Q=q({__name:"RegisterView",setup(J){const V=N(),z=I(),v=l(""),f=l(""),w=l(""),c=l(""),y=l(""),p=l(!1),t=l(null),k=l("");async function U(){p.value=!0,t.value=null;try{const r=await V.register({name:v.value.trim(),surname:f.value.trim(),email:w.value.trim(),password:c.value,password_confirmation:y.value},!0);r.signedIn?await z.replace("/"):k.value=r.message||"Konto zostało utworzone. Sprawdź pocztę, aby je aktywować."}catch(r){t.value=M(r)}finally{p.value=!1}}return(r,e)=>{const b=C("router-link");return i(),o("div",h,[e[12]||(e[12]=s("header",{class:"page-head"},[s("span",{class:"eyebrow"},"BM II° · UWr"),s("h1",null,"Załóż konto")],-1)),k.value?(i(),o("div",j,[s("p",S,n(k.value),1),_(b,{class:"btn",to:"/logowanie"},{default:g(()=>[...e[5]||(e[5]=[x("Przejdź do logowania",-1)])]),_:1})])):(i(),o("form",{key:1,onSubmit:B(U,["prevent"]),novalidate:""},[t.value?.message?(i(),o("div",Z,n(t.value.message),1)):u("",!0),s("div",A,[e[6]||(e[6]=s("label",{for:"name"},"Imię",-1)),d(s("input",{id:"name","onUpdate:modelValue":e[0]||(e[0]=a=>v.value=a),type:"text",autocomplete:"given-name",required:""},null,512),[[m,v.value]]),t.value?.fields.name?(i(),o("p",D,n(t.value.fields.name),1)):u("",!0)]),s("div",E,[e[7]||(e[7]=s("label",{for:"surname"},"Nazwisko",-1)),d(s("input",{id:"surname","onUpdate:modelValue":e[1]||(e[1]=a=>f.value=a),type:"text",autocomplete:"family-name",required:""},null,512),[[m,f.value]]),t.value?.fields.surname?(i(),o("p",P,n(t.value.fields.surname),1)):u("",!0)]),s("div",R,[e[8]||(e[8]=s("label",{for:"email"},"Adres e-mail",-1)),d(s("input",{id:"email","onUpdate:modelValue":e[2]||(e[2]=a=>w.value=a),type:"email",autocomplete:"email",inputmode:"email",required:""},null,512),[[m,w.value]]),t.value?.fields.email?(i(),o("p",T,n(t.value.fields.email),1)):u("",!0)]),s("div",H,[e[9]||(e[9]=s("label",{for:"password"},"Hasło (min. 8 znaków)",-1)),d(s("input",{id:"password","onUpdate:modelValue":e[3]||(e[3]=a=>c.value=a),type:"password",autocomplete:"new-password",required:""},null,512),[[m,c.value]]),t.value?.fields.password?(i(),o("p",K,n(t.value.fields.password),1)):u("",!0)]),s("div",W,[e[10]||(e[10]=s("label",{for:"confirmation"},"Powtórz hasło",-1)),d(s("input",{id:"confirmation","onUpdate:modelValue":e[4]||(e[4]=a=>y.value=a),type:"password",autocomplete:"new-password",required:""},null,512),[[m,y.value]])]),s("button",{class:"btn primary block",type:"submit",disabled:p.value},n(p.value?"Zakładanie…":"Załóż konto"),9,F)],32)),s("div",G,[_(b,{to:"/logowanie"},{default:g(()=>[...e[11]||(e[11]=[x("Mam już konto",-1)])]),_:1})])])}}});export{Q as default};
import{d as q,u as N,c as o,a as s,t as n,h as _,i as g,g as B,e as u,w as d,v as m,r as l,k as C,o as i,m as x,l as I}from"./index-CcCE3P1z.js";import{f as M}from"./forms-CldYEw0_.js";const h={class:"auth"},j={key:0,class:"stack"},S={class:"notice",role:"status"},Z={key:0,class:"notice error",role:"alert",style:{"margin-bottom":"14px"}},A={class:"field"},D={key:0,class:"error-text"},E={class:"field"},P={key:0,class:"error-text"},R={class:"field"},T={key:0,class:"error-text"},H={class:"field"},K={key:0,class:"error-text"},W={class:"field"},F=["disabled"],G={class:"auth-links"},Q=q({__name:"RegisterView",setup(J){const V=N(),z=I(),v=l(""),f=l(""),w=l(""),c=l(""),y=l(""),p=l(!1),t=l(null),k=l("");async function U(){p.value=!0,t.value=null;try{const r=await V.register({name:v.value.trim(),surname:f.value.trim(),email:w.value.trim(),password:c.value,password_confirmation:y.value},!0);r.signedIn?await z.replace("/"):k.value=r.message||"Konto zostało utworzone. Sprawdź pocztę, aby je aktywować."}catch(r){t.value=M(r)}finally{p.value=!1}}return(r,e)=>{const b=C("router-link");return i(),o("div",h,[e[12]||(e[12]=s("header",{class:"page-head"},[s("span",{class:"eyebrow"},"BM II° · UWr"),s("h1",null,"Załóż konto")],-1)),k.value?(i(),o("div",j,[s("p",S,n(k.value),1),_(b,{class:"btn",to:"/logowanie"},{default:g(()=>[...e[5]||(e[5]=[x("Przejdź do logowania",-1)])]),_:1})])):(i(),o("form",{key:1,onSubmit:B(U,["prevent"]),novalidate:""},[t.value?.message?(i(),o("div",Z,n(t.value.message),1)):u("",!0),s("div",A,[e[6]||(e[6]=s("label",{for:"name"},"Imię",-1)),d(s("input",{id:"name","onUpdate:modelValue":e[0]||(e[0]=a=>v.value=a),type:"text",autocomplete:"given-name",required:""},null,512),[[m,v.value]]),t.value?.fields.name?(i(),o("p",D,n(t.value.fields.name),1)):u("",!0)]),s("div",E,[e[7]||(e[7]=s("label",{for:"surname"},"Nazwisko",-1)),d(s("input",{id:"surname","onUpdate:modelValue":e[1]||(e[1]=a=>f.value=a),type:"text",autocomplete:"family-name",required:""},null,512),[[m,f.value]]),t.value?.fields.surname?(i(),o("p",P,n(t.value.fields.surname),1)):u("",!0)]),s("div",R,[e[8]||(e[8]=s("label",{for:"email"},"Adres e-mail",-1)),d(s("input",{id:"email","onUpdate:modelValue":e[2]||(e[2]=a=>w.value=a),type:"email",autocomplete:"email",inputmode:"email",required:""},null,512),[[m,w.value]]),t.value?.fields.email?(i(),o("p",T,n(t.value.fields.email),1)):u("",!0)]),s("div",H,[e[9]||(e[9]=s("label",{for:"password"},"Hasło (min. 8 znaków)",-1)),d(s("input",{id:"password","onUpdate:modelValue":e[3]||(e[3]=a=>c.value=a),type:"password",autocomplete:"new-password",required:""},null,512),[[m,c.value]]),t.value?.fields.password?(i(),o("p",K,n(t.value.fields.password),1)):u("",!0)]),s("div",W,[e[10]||(e[10]=s("label",{for:"confirmation"},"Powtórz hasło",-1)),d(s("input",{id:"confirmation","onUpdate:modelValue":e[4]||(e[4]=a=>y.value=a),type:"password",autocomplete:"new-password",required:""},null,512),[[m,y.value]])]),s("button",{class:"btn primary block",type:"submit",disabled:p.value},n(p.value?"Zakładanie…":"Załóż konto"),9,F)],32)),s("div",G,[_(b,{to:"/logowanie"},{default:g(()=>[...e[11]||(e[11]=[x("Mam już konto",-1)])]),_:1})])])}}});export{Q as default};

View File

@@ -1 +1 @@
import{d as _,r as t,c as a,a as o,h as g,i as x,g as V,t as m,e as v,b as q,w as c,v as f,j as z,k as N,o as l,m as h,n as B}from"./index-BjjbG2NZ.js";import{f as C}from"./forms-LHF4n69U.js";const U={class:"auth"},M={key:0,class:"stack"},Z={key:0,class:"notice error",role:"alert",style:{"margin-bottom":"14px"}},j={key:1,class:"field"},D={class:"field"},E={key:0,class:"error-text"},I={class:"field"},P=["disabled"],A=_({__name:"ResetView",setup(R){const u=z(),i=t(typeof u.query.code=="string"?u.query.code:""),n=t(""),p=t(""),d=t(!1),w=t(!1),s=t(null);async function b(){d.value=!0,s.value=null;try{await B.resetPassword({code:i.value.trim(),password:n.value,password_confirmation:p.value}),w.value=!0}catch(y){s.value=C(y)}finally{d.value=!1}}return(y,e)=>{const k=N("router-link");return l(),a("div",U,[e[8]||(e[8]=o("header",{class:"page-head"},[o("span",{class:"eyebrow"},"BM II° · UWr"),o("h1",null,"Nowe hasło")],-1)),w.value?(l(),a("div",M,[e[4]||(e[4]=o("p",{class:"notice",role:"status"},"Hasło zostało zmienione.",-1)),g(k,{class:"btn primary",to:"/logowanie"},{default:x(()=>[...e[3]||(e[3]=[h("Zaloguj się",-1)])]),_:1})])):(l(),a("form",{key:1,onSubmit:V(b,["prevent"]),novalidate:""},[s.value?.message?(l(),a("div",Z,m(s.value.message),1)):v("",!0),q(u).query.code?v("",!0):(l(),a("div",j,[e[5]||(e[5]=o("label",{for:"code"},"Kod z wiadomości",-1)),c(o("input",{id:"code","onUpdate:modelValue":e[0]||(e[0]=r=>i.value=r),type:"text",autocomplete:"one-time-code",required:""},null,512),[[f,i.value]])])),o("div",D,[e[6]||(e[6]=o("label",{for:"password"},"Nowe hasło (min. 8 znaków)",-1)),c(o("input",{id:"password","onUpdate:modelValue":e[1]||(e[1]=r=>n.value=r),type:"password",autocomplete:"new-password",required:""},null,512),[[f,n.value]]),s.value?.fields.password?(l(),a("p",E,m(s.value.fields.password),1)):v("",!0)]),o("div",I,[e[7]||(e[7]=o("label",{for:"confirmation"},"Powtórz hasło",-1)),c(o("input",{id:"confirmation","onUpdate:modelValue":e[2]||(e[2]=r=>p.value=r),type:"password",autocomplete:"new-password",required:""},null,512),[[f,p.value]])]),o("button",{class:"btn primary block",type:"submit",disabled:d.value||!i.value||!n.value},m(d.value?"Zapisywanie…":"Zapisz hasło"),9,P)],32))])}}});export{A as default};
import{d as _,r as t,c as a,a as o,h as g,i as x,g as V,t as m,e as v,b as q,w as c,v as f,j as z,k as N,o as l,m as h,n as B}from"./index-CcCE3P1z.js";import{f as C}from"./forms-CldYEw0_.js";const U={class:"auth"},M={key:0,class:"stack"},Z={key:0,class:"notice error",role:"alert",style:{"margin-bottom":"14px"}},j={key:1,class:"field"},D={class:"field"},E={key:0,class:"error-text"},I={class:"field"},P=["disabled"],A=_({__name:"ResetView",setup(R){const u=z(),i=t(typeof u.query.code=="string"?u.query.code:""),n=t(""),p=t(""),d=t(!1),w=t(!1),s=t(null);async function b(){d.value=!0,s.value=null;try{await B.resetPassword({code:i.value.trim(),password:n.value,password_confirmation:p.value}),w.value=!0}catch(y){s.value=C(y)}finally{d.value=!1}}return(y,e)=>{const k=N("router-link");return l(),a("div",U,[e[8]||(e[8]=o("header",{class:"page-head"},[o("span",{class:"eyebrow"},"BM II° · UWr"),o("h1",null,"Nowe hasło")],-1)),w.value?(l(),a("div",M,[e[4]||(e[4]=o("p",{class:"notice",role:"status"},"Hasło zostało zmienione.",-1)),g(k,{class:"btn primary",to:"/logowanie"},{default:x(()=>[...e[3]||(e[3]=[h("Zaloguj się",-1)])]),_:1})])):(l(),a("form",{key:1,onSubmit:V(b,["prevent"]),novalidate:""},[s.value?.message?(l(),a("div",Z,m(s.value.message),1)):v("",!0),q(u).query.code?v("",!0):(l(),a("div",j,[e[5]||(e[5]=o("label",{for:"code"},"Kod z wiadomości",-1)),c(o("input",{id:"code","onUpdate:modelValue":e[0]||(e[0]=r=>i.value=r),type:"text",autocomplete:"one-time-code",required:""},null,512),[[f,i.value]])])),o("div",D,[e[6]||(e[6]=o("label",{for:"password"},"Nowe hasło (min. 8 znaków)",-1)),c(o("input",{id:"password","onUpdate:modelValue":e[1]||(e[1]=r=>n.value=r),type:"password",autocomplete:"new-password",required:""},null,512),[[f,n.value]]),s.value?.fields.password?(l(),a("p",E,m(s.value.fields.password),1)):v("",!0)]),o("div",I,[e[7]||(e[7]=o("label",{for:"confirmation"},"Powtórz hasło",-1)),c(o("input",{id:"confirmation","onUpdate:modelValue":e[2]||(e[2]=r=>p.value=r),type:"password",autocomplete:"new-password",required:""},null,512),[[f,p.value]])]),o("button",{class:"btn primary block",type:"submit",disabled:d.value||!i.value||!n.value},m(d.value?"Zapisywanie…":"Zapisz hasło"),9,P)],32))])}}});export{A as default};

File diff suppressed because one or more lines are too long

View File

@@ -1 +1 @@
import{d as y,o as i,c as u,a as l,w as g,a0 as c,x as s,t as a,m as n,e as k,F as v}from"./index-BjjbG2NZ.js";const p={key:0,class:"tools",role:"group","aria-label":"Sterowanie prezentacją"},C={class:"tools-group"},j=["disabled","title"],m={class:"tools-group"},z=["aria-pressed"],$=["aria-pressed"],P=["aria-pressed"],S=["aria-pressed"],w={class:"tools-group tools-end"},F={key:0,class:"tools-pilot",role:"status",title:"Telefon steruje tą kartą"},T={key:1,class:"tools-pilot elsewhere",role:"status",title:"Kliknij tę kartę albo naciśnij klawisz, aby przejąć pilota"},f=["aria-pressed"],H=["aria-pressed"],B="Zegar ruszy przy pierwszej zmianie slajdu",r="Klik lub T: pauza · R: zeruj · C: schowaj",O=y({__name:"SpeakerTools",props:{clock:{},panel:{},special:{type:Boolean},hasSpecial:{type:Boolean},fullscreenEnabled:{type:Boolean},fullscreenOn:{type:Boolean},toolbarHidden:{type:Boolean},togglePanel:{type:Function},toggleSpecial:{type:Function},toggleToolbar:{type:Function},toggleFullscreen:{type:Function},light:{type:Boolean},toggleScheme:{type:Function},pilot:{}},emits:["pause","reset","toggleHidden","close"],setup(e,{emit:b}){const d=b;return(Z,t)=>(i(),u(v,null,[e.toolbarHidden?k("",!0):(i(),u("div",p,[l("div",C,[g(l("button",{id:"speaker-clock",type:"button",class:s(["docked",{paused:e.clock.paused}]),title:r,"aria-label":"Zegar prelegenta",onClick:t[0]||(t[0]=o=>d("pause"))},[t[14]||(t[14]=l("span",null,"slajd",-1)),l("b",{class:s(["clk-slide",{over:e.clock.slideOver}])},a(e.clock.slide),3),t[15]||(t[15]=l("span",null,"całość",-1)),l("b",{class:s(["clk-total",{over:e.clock.totalOver}])},a(e.clock.total),3),l("span",{class:s(["clk-pace",{late:e.clock.late}])},a(e.clock.pace),3)],2),[[c,!e.clock.hidden]]),l("button",{type:"button","aria-keyshortcuts":"T",disabled:e.clock.idle,title:e.clock.idle?B:void 0,onClick:t[1]||(t[1]=o=>d("pause"))},[n(a(e.clock.paused?"Wznów":"Pauza")+" ",1),t[16]||(t[16]=l("kbd",null,"T",-1))],8,j),l("button",{type:"button","aria-keyshortcuts":"R",onClick:t[2]||(t[2]=o=>d("reset"))},[...t[17]||(t[17]=[n(" Zeruj ",-1),l("kbd",null,"R",-1)])]),l("button",{type:"button","aria-keyshortcuts":"C",onClick:t[3]||(t[3]=o=>d("toggleHidden"))},[n(a(e.clock.hidden?"Pokaż zegar":"Ukryj zegar")+" ",1),t[18]||(t[18]=l("kbd",null,"C",-1))])]),l("div",m,[l("button",{type:"button","aria-pressed":e.panel==="say","aria-keyshortcuts":"P",onClick:t[4]||(t[4]=o=>e.togglePanel("say"))},[...t[19]||(t[19]=[n(" Powiedz ",-1),l("kbd",null,"P",-1)])],8,z),l("button",{type:"button","aria-pressed":e.panel==="notes","aria-keyshortcuts":"N",onClick:t[5]||(t[5]=o=>e.togglePanel("notes"))},[...t[20]||(t[20]=[n(" Notatki ",-1),l("kbd",null,"N",-1)])],8,$),l("button",{type:"button","aria-pressed":e.panel==="srcs","aria-keyshortcuts":"Z",onClick:t[6]||(t[6]=o=>e.togglePanel("srcs"))},[...t[21]||(t[21]=[n(" Źródła ",-1),l("kbd",null,"Z",-1)])],8,P),l("button",{type:"button",class:s(["tool-s",{unavailable:!e.hasSpecial}]),"aria-pressed":e.special,"aria-keyshortcuts":"S",onClick:t[7]||(t[7]=o=>e.toggleSpecial())},[...t[22]||(t[22]=[n(" Slajd specjalny ",-1),l("kbd",null,"S",-1)])],10,S)]),l("div",w,[e.pilot==="active"?(i(),u("span",F,[...t[23]||(t[23]=[l("i",{class:"tools-pilot-dot","aria-hidden":"true"},null,-1),n("Pilot",-1)])])):e.pilot==="elsewhere"?(i(),u("span",T,"Pilot steruje inną kartą")):k("",!0),l("button",{type:"button","aria-pressed":e.light,"aria-keyshortcuts":"J",onClick:t[8]||(t[8]=o=>e.toggleScheme())},[...t[24]||(t[24]=[n(" Jasny ",-1),l("kbd",null,"J",-1)])],8,f),e.fullscreenEnabled?(i(),u("button",{key:2,type:"button","aria-pressed":e.fullscreenOn,"aria-keyshortcuts":"F",onClick:t[9]||(t[9]=o=>e.toggleFullscreen())},[...t[25]||(t[25]=[n(" Pełny ekran ",-1),l("kbd",null,"F",-1)])],8,H)):k("",!0),l("button",{type:"button","aria-keyshortcuts":"H",onClick:t[10]||(t[10]=o=>e.toggleToolbar())},[...t[26]||(t[26]=[n(" Ukryj pasek ",-1),l("kbd",null,"H",-1)])]),l("button",{type:"button",onClick:t[11]||(t[11]=o=>d("close"))},"Zamknij")])])),e.toolbarHidden&&!e.clock.hidden?(i(),u("button",{key:1,id:"speaker-clock",type:"button",class:s(["floating",{paused:e.clock.paused}]),title:r,"aria-label":"Zegar prelegenta",onClick:t[12]||(t[12]=o=>d("pause"))},[t[27]||(t[27]=l("span",null,"slajd",-1)),l("b",{class:s(["clk-slide",{over:e.clock.slideOver}])},a(e.clock.slide),3),t[28]||(t[28]=l("span",null,"całość",-1)),l("b",{class:s(["clk-total",{over:e.clock.totalOver}])},a(e.clock.total),3),l("span",{class:s(["clk-pace",{late:e.clock.late}])},a(e.clock.pace),3)],2)):k("",!0),e.toolbarHidden?(i(),u("button",{key:2,type:"button",class:"tools-show","aria-keyshortcuts":"H",onClick:t[13]||(t[13]=o=>e.toggleToolbar())},[...t[29]||(t[29]=[n(" Pokaż pasek ",-1),l("kbd",null,"H",-1)])])):k("",!0)],64))}});export{O as default};
import{d as y,o as i,c as u,a as l,w as g,a0 as c,x as s,t as a,m as n,e as k,F as v}from"./index-CcCE3P1z.js";const p={key:0,class:"tools",role:"group","aria-label":"Sterowanie prezentacją"},C={class:"tools-group"},j=["disabled","title"],m={class:"tools-group"},z=["aria-pressed"],$=["aria-pressed"],P=["aria-pressed"],S=["aria-pressed"],w={class:"tools-group tools-end"},F={key:0,class:"tools-pilot",role:"status",title:"Telefon steruje tą kartą"},T={key:1,class:"tools-pilot elsewhere",role:"status",title:"Kliknij tę kartę albo naciśnij klawisz, aby przejąć pilota"},f=["aria-pressed"],H=["aria-pressed"],B="Zegar ruszy przy pierwszej zmianie slajdu",r="Klik lub T: pauza · R: zeruj · C: schowaj",O=y({__name:"SpeakerTools",props:{clock:{},panel:{},special:{type:Boolean},hasSpecial:{type:Boolean},fullscreenEnabled:{type:Boolean},fullscreenOn:{type:Boolean},toolbarHidden:{type:Boolean},togglePanel:{type:Function},toggleSpecial:{type:Function},toggleToolbar:{type:Function},toggleFullscreen:{type:Function},light:{type:Boolean},toggleScheme:{type:Function},pilot:{}},emits:["pause","reset","toggleHidden","close"],setup(e,{emit:b}){const d=b;return(Z,t)=>(i(),u(v,null,[e.toolbarHidden?k("",!0):(i(),u("div",p,[l("div",C,[g(l("button",{id:"speaker-clock",type:"button",class:s(["docked",{paused:e.clock.paused}]),title:r,"aria-label":"Zegar prelegenta",onClick:t[0]||(t[0]=o=>d("pause"))},[t[14]||(t[14]=l("span",null,"slajd",-1)),l("b",{class:s(["clk-slide",{over:e.clock.slideOver}])},a(e.clock.slide),3),t[15]||(t[15]=l("span",null,"całość",-1)),l("b",{class:s(["clk-total",{over:e.clock.totalOver}])},a(e.clock.total),3),l("span",{class:s(["clk-pace",{late:e.clock.late}])},a(e.clock.pace),3)],2),[[c,!e.clock.hidden]]),l("button",{type:"button","aria-keyshortcuts":"T",disabled:e.clock.idle,title:e.clock.idle?B:void 0,onClick:t[1]||(t[1]=o=>d("pause"))},[n(a(e.clock.paused?"Wznów":"Pauza")+" ",1),t[16]||(t[16]=l("kbd",null,"T",-1))],8,j),l("button",{type:"button","aria-keyshortcuts":"R",onClick:t[2]||(t[2]=o=>d("reset"))},[...t[17]||(t[17]=[n(" Zeruj ",-1),l("kbd",null,"R",-1)])]),l("button",{type:"button","aria-keyshortcuts":"C",onClick:t[3]||(t[3]=o=>d("toggleHidden"))},[n(a(e.clock.hidden?"Pokaż zegar":"Ukryj zegar")+" ",1),t[18]||(t[18]=l("kbd",null,"C",-1))])]),l("div",m,[l("button",{type:"button","aria-pressed":e.panel==="say","aria-keyshortcuts":"P",onClick:t[4]||(t[4]=o=>e.togglePanel("say"))},[...t[19]||(t[19]=[n(" Powiedz ",-1),l("kbd",null,"P",-1)])],8,z),l("button",{type:"button","aria-pressed":e.panel==="notes","aria-keyshortcuts":"N",onClick:t[5]||(t[5]=o=>e.togglePanel("notes"))},[...t[20]||(t[20]=[n(" Notatki ",-1),l("kbd",null,"N",-1)])],8,$),l("button",{type:"button","aria-pressed":e.panel==="srcs","aria-keyshortcuts":"Z",onClick:t[6]||(t[6]=o=>e.togglePanel("srcs"))},[...t[21]||(t[21]=[n(" Źródła ",-1),l("kbd",null,"Z",-1)])],8,P),l("button",{type:"button",class:s(["tool-s",{unavailable:!e.hasSpecial}]),"aria-pressed":e.special,"aria-keyshortcuts":"S",onClick:t[7]||(t[7]=o=>e.toggleSpecial())},[...t[22]||(t[22]=[n(" Slajd specjalny ",-1),l("kbd",null,"S",-1)])],10,S)]),l("div",w,[e.pilot==="active"?(i(),u("span",F,[...t[23]||(t[23]=[l("i",{class:"tools-pilot-dot","aria-hidden":"true"},null,-1),n("Pilot",-1)])])):e.pilot==="elsewhere"?(i(),u("span",T,"Pilot steruje inną kartą")):k("",!0),l("button",{type:"button","aria-pressed":e.light,"aria-keyshortcuts":"J",onClick:t[8]||(t[8]=o=>e.toggleScheme())},[...t[24]||(t[24]=[n(" Jasny ",-1),l("kbd",null,"J",-1)])],8,f),e.fullscreenEnabled?(i(),u("button",{key:2,type:"button","aria-pressed":e.fullscreenOn,"aria-keyshortcuts":"F",onClick:t[9]||(t[9]=o=>e.toggleFullscreen())},[...t[25]||(t[25]=[n(" Pełny ekran ",-1),l("kbd",null,"F",-1)])],8,H)):k("",!0),l("button",{type:"button","aria-keyshortcuts":"H",onClick:t[10]||(t[10]=o=>e.toggleToolbar())},[...t[26]||(t[26]=[n(" Ukryj pasek ",-1),l("kbd",null,"H",-1)])]),l("button",{type:"button",onClick:t[11]||(t[11]=o=>d("close"))},"Zamknij")])])),e.toolbarHidden&&!e.clock.hidden?(i(),u("button",{key:1,id:"speaker-clock",type:"button",class:s(["floating",{paused:e.clock.paused}]),title:r,"aria-label":"Zegar prelegenta",onClick:t[12]||(t[12]=o=>d("pause"))},[t[27]||(t[27]=l("span",null,"slajd",-1)),l("b",{class:s(["clk-slide",{over:e.clock.slideOver}])},a(e.clock.slide),3),t[28]||(t[28]=l("span",null,"całość",-1)),l("b",{class:s(["clk-total",{over:e.clock.totalOver}])},a(e.clock.total),3),l("span",{class:s(["clk-pace",{late:e.clock.late}])},a(e.clock.pace),3)],2)):k("",!0),e.toolbarHidden?(i(),u("button",{key:2,type:"button",class:"tools-show","aria-keyshortcuts":"H",onClick:t[13]||(t[13]=o=>e.toggleToolbar())},[...t[29]||(t[29]=[n(" Pokaż pasek ",-1),l("kbd",null,"H",-1)])])):k("",!0)],64))}});export{O as default};

View File

@@ -1 +1 @@
import{_ as y}from"./PageHead.vue_vue_type_script_setup_true_lang-87_LQUHg.js";import{d as c,p,q as f,c as a,h as m,F as b,y as Z,s as M,o as l,a as t,t as u,e as n}from"./index-BjjbG2NZ.js";const B=[{file:"sylabus_2026_27-Z_26-BM-Z2-E01-AW-PL.pdf",url:"/sylabusy/sylabus_2026_27-Z_26-BM-Z2-E01-AW-PL.pdf",size:50255},{file:"sylabus_2026_27-Z_26-BM-Z2-E01-GR-PL.pdf",url:"/sylabusy/sylabus_2026_27-Z_26-BM-Z2-E01-GR-PL.pdf",size:57715},{file:"sylabus_2026_27-Z_26-BM-Z2-E01-KWP-PL.pdf",url:"/sylabusy/sylabus_2026_27-Z_26-BM-Z2-E01-KWP-PL.pdf",size:51902},{file:"sylabus_2026_27-Z_26-BM-Z2-E01-PHT-PL.pdf",url:"/sylabusy/sylabus_2026_27-Z_26-BM-Z2-E01-PHT-PL.pdf",size:58646},{file:"sylabus_2026_27-Z_26-BM-Z2-E01-TMNB-PL.pdf",url:"/sylabusy/sylabus_2026_27-Z_26-BM-Z2-E01-TMNB-PL.pdf",size:75386},{file:"sylabus_2026_27-Z_26-BM-Z2-E01-WBM-PL.pdf",url:"/sylabusy/sylabus_2026_27-Z_26-BM-Z2-E01-WBM-PL.pdf",size:64288},{file:"sylabus_2026_27-Z_26-BM-Z2-E01-WKM-PL.pdf",url:"/sylabusy/sylabus_2026_27-Z_26-BM-Z2-E01-WKM-PL.pdf",size:55064}],P={key:0,class:"stack"},E=["href","download"],L={class:"row-main"},h={class:"muted small",style:{margin:"0"}},z={key:0},k={key:1},w={key:1,class:"empty"},v=c({__name:"SyllabiView",setup(W){const d=p();f(()=>{d.loadCourses()});const r=/^sylabus_(\d{4})_(\d{2})-([ZL])_(.+?)-([A-Z]{2})\.pdf$/i,i=M(()=>{const o=new Map;for(const e of d.courses??[])e.code&&!o.has(e.code)&&o.set(e.code,e.name);return B.map(e=>{const s=r.exec(e.file),_=s?.[4]??null;return{...e,code:_,title:_&&o.get(_)||_||e.file,term:s?`${s[1]}/${s[2]} · ${s[3].toUpperCase()==="Z"?"zima":"lato"}`:"",kb:Math.max(1,Math.round(e.size/1024))}}).sort((e,s)=>e.title.localeCompare(s.title,"pl"))});return(o,e)=>(l(),a("div",null,[m(y,{eyebrow:"Karty przedmiotów z USOS",title:"Sylabusy"}),i.value.length?(l(),a("div",P,[(l(!0),a(b,null,Z(i.value,s=>(l(),a("a",{key:s.file,href:s.url,download:s.file,class:"card link"},[t("div",L,[t("h3",null,u(s.title),1),e[0]||(e[0]=t("span",{class:"badge"},"PDF",-1))]),t("p",h,[s.code?(l(),a("span",z,u(s.code),1)):n("",!0),s.term?(l(),a("span",k," · "+u(s.term),1)):n("",!0),t("span",null," · "+u(s.kb)+" KB",1)])],8,E))),128))])):(l(),a("p",w,"Nie ma jeszcze żadnych sylabusów."))]))}});export{v as default};
import{_ as y}from"./PageHead.vue_vue_type_script_setup_true_lang-4URWY3a8.js";import{d as c,p,q as f,c as a,h as m,F as b,y as Z,s as M,o as l,a as t,t as u,e as n}from"./index-CcCE3P1z.js";const B=[{file:"sylabus_2026_27-Z_26-BM-Z2-E01-AW-PL.pdf",url:"/sylabusy/sylabus_2026_27-Z_26-BM-Z2-E01-AW-PL.pdf",size:50255},{file:"sylabus_2026_27-Z_26-BM-Z2-E01-GR-PL.pdf",url:"/sylabusy/sylabus_2026_27-Z_26-BM-Z2-E01-GR-PL.pdf",size:57715},{file:"sylabus_2026_27-Z_26-BM-Z2-E01-KWP-PL.pdf",url:"/sylabusy/sylabus_2026_27-Z_26-BM-Z2-E01-KWP-PL.pdf",size:51902},{file:"sylabus_2026_27-Z_26-BM-Z2-E01-PHT-PL.pdf",url:"/sylabusy/sylabus_2026_27-Z_26-BM-Z2-E01-PHT-PL.pdf",size:58646},{file:"sylabus_2026_27-Z_26-BM-Z2-E01-TMNB-PL.pdf",url:"/sylabusy/sylabus_2026_27-Z_26-BM-Z2-E01-TMNB-PL.pdf",size:75386},{file:"sylabus_2026_27-Z_26-BM-Z2-E01-WBM-PL.pdf",url:"/sylabusy/sylabus_2026_27-Z_26-BM-Z2-E01-WBM-PL.pdf",size:64288},{file:"sylabus_2026_27-Z_26-BM-Z2-E01-WKM-PL.pdf",url:"/sylabusy/sylabus_2026_27-Z_26-BM-Z2-E01-WKM-PL.pdf",size:55064}],P={key:0,class:"stack"},E=["href","download"],L={class:"row-main"},h={class:"muted small",style:{margin:"0"}},z={key:0},k={key:1},w={key:1,class:"empty"},v=c({__name:"SyllabiView",setup(W){const d=p();f(()=>{d.loadCourses()});const r=/^sylabus_(\d{4})_(\d{2})-([ZL])_(.+?)-([A-Z]{2})\.pdf$/i,i=M(()=>{const o=new Map;for(const e of d.courses??[])e.code&&!o.has(e.code)&&o.set(e.code,e.name);return B.map(e=>{const s=r.exec(e.file),_=s?.[4]??null;return{...e,code:_,title:_&&o.get(_)||_||e.file,term:s?`${s[1]}/${s[2]} · ${s[3].toUpperCase()==="Z"?"zima":"lato"}`:"",kb:Math.max(1,Math.round(e.size/1024))}}).sort((e,s)=>e.title.localeCompare(s.title,"pl"))});return(o,e)=>(l(),a("div",null,[m(y,{eyebrow:"Karty przedmiotów z USOS",title:"Sylabusy"}),i.value.length?(l(),a("div",P,[(l(!0),a(b,null,Z(i.value,s=>(l(),a("a",{key:s.file,href:s.url,download:s.file,class:"card link"},[t("div",L,[t("h3",null,u(s.title),1),e[0]||(e[0]=t("span",{class:"badge"},"PDF",-1))]),t("p",h,[s.code?(l(),a("span",z,u(s.code),1)):n("",!0),s.term?(l(),a("span",k," · "+u(s.term),1)):n("",!0),t("span",null," · "+u(s.kb)+" KB",1)])],8,E))),128))])):(l(),a("p",w,"Nie ma jeszcze żadnych sylabusów."))]))}});export{v as default};

View File

@@ -1 +1 @@
import{S as o}from"./index-BjjbG2NZ.js";function a(s){if(s instanceof o){const e={};for(const[r,t]of Object.entries(s.errors))t.length&&(e[r]=t[0]);return{message:Object.keys(e).length&&Object.values(e).includes(s.message)?"":s.message,fields:e}}return{message:"Coś poszło nie tak. Spróbuj ponownie.",fields:{}}}function f(s){return typeof s=="string"&&s.startsWith("/")&&!s.startsWith("//")&&!s.startsWith("/\\")?s:"/"}export{a as f,f as s};
import{S as o}from"./index-CcCE3P1z.js";function a(s){if(s instanceof o){const e={};for(const[r,t]of Object.entries(s.errors))t.length&&(e[r]=t[0]);return{message:Object.keys(e).length&&Object.values(e).includes(s.message)?"":s.message,fields:e}}return{message:"Coś poszło nie tak. Spróbuj ponownie.",fields:{}}}function f(s){return typeof s=="string"&&s.startsWith("/")&&!s.startsWith("//")&&!s.startsWith("/\\")?s:"/"}export{a as f,f as s};

File diff suppressed because one or more lines are too long

View File

@@ -1 +1 @@
import{$ as m,L as n}from"./index-BjjbG2NZ.js";const o="/_presentations/api/v1",c={publicDeck:e=>n.request(`${o}/public/${encodeURIComponent(e)}`,{auth:!1}),mine:()=>n.request(`${o}/mine`),speaker:e=>n.request(`${o}/mine/${encodeURIComponent(e)}`),speakerImage:(e,t)=>n.blob(`${o}/mine/${encodeURIComponent(e)}/images/${encodeURIComponent(t)}`),remote:(e,t)=>n.request(`${o}/mine/${encodeURIComponent(e)}/remote`,{method:"POST",body:t}),remoteState:(e,t)=>n.request(`${o}/mine/${encodeURIComponent(e)}/remote/state`,{method:"POST",body:t}),remoteStateBeacon(e,t){const a={Accept:"application/json","Content-Type":"application/json"},i=m.get();i&&(a.Authorization=`Bearer ${i}`);try{fetch(`${o}/mine/${encodeURIComponent(e)}/remote/state`,{method:"POST",headers:a,body:JSON.stringify(t),keepalive:!0}).catch(()=>{})}catch{}}};export{c as p};
import{$ as m,L as n}from"./index-CcCE3P1z.js";const o="/_presentations/api/v1",c={publicDeck:e=>n.request(`${o}/public/${encodeURIComponent(e)}`,{auth:!1}),mine:()=>n.request(`${o}/mine`),speaker:e=>n.request(`${o}/mine/${encodeURIComponent(e)}`),speakerImage:(e,t)=>n.blob(`${o}/mine/${encodeURIComponent(e)}/images/${encodeURIComponent(t)}`),remote:(e,t)=>n.request(`${o}/mine/${encodeURIComponent(e)}/remote`,{method:"POST",body:t}),remoteState:(e,t)=>n.request(`${o}/mine/${encodeURIComponent(e)}/remote/state`,{method:"POST",body:t}),remoteStateBeacon(e,t){const a={Accept:"application/json","Content-Type":"application/json"},i=m.get();i&&(a.Authorization=`Bearer ${i}`);try{fetch(`${o}/mine/${encodeURIComponent(e)}/remote/state`,{method:"POST",headers:a,body:JSON.stringify(t),keepalive:!0}).catch(()=>{})}catch{}}};export{c as p};

View File

@@ -1 +1 @@
import{e as p}from"./format-bcE-cYHJ.js";import{d as z,o,c as a,F as c,y as h,a as d,m,t as n,b as _,x as q,e as l,L as r}from"./index-BjjbG2NZ.js";const y={class:"rows"},$={class:"row-main"},k={class:"title"},w=["aria-label"],f={key:1,class:"badge"},b={class:"muted small"},S=z({__name:"AttemptList",props:{attempts:{},showQuiz:{type:Boolean}},setup(e){const s=u=>`${Math.round(u.score_points)}/${Math.round(u.max_points)}`;return(u,g)=>(o(),a("ul",y,[(o(!0),a(c,null,h(e.attempts,t=>(o(),a("li",{key:t.id},[d("div",$,[d("span",k,[e.showQuiz?(o(),a(c,{key:0},[m(n(t.quiz_title),1)],64)):(o(),a(c,{key:1},[m(n(_(p)(t.started_at)),1)],64))]),t.completed_at?(o(),a("span",{key:0,class:q(["badge",t.passed?"online":""]),"aria-label":`Wynik ${s(t)}`},n(s(t)),11,w)):(o(),a("span",f,"niezakończona"))]),d("div",b,[e.showQuiz?(o(),a(c,{key:0},[m(n(_(p)(t.started_at))+" · ",1)],64)):l("",!0),t.category?(o(),a(c,{key:1},[m(n(t.category)+" · ",1)],64)):l("",!0),m(" odpowiedzi: "+n(t.answered_count),1),t.completed_at&&t.score_percent!==null?(o(),a(c,{key:2},[m(" · "+n(String(t.score_percent).replace(".",","))+"% puli",1)],64)):l("",!0)])]))),128))]))}}),i="/_quizzes/api/v1",T={list:e=>r.request(`${i}/quizzes`,{query:{context:e}}),quiz:(e,s)=>r.request(`${i}/quizzes/${encodeURIComponent(e)}`,{query:{category:s}}),start:(e,s)=>r.request(`${i}/quizzes/${encodeURIComponent(e)}/attempts`,{method:"POST",body:s?{category:s}:{}}),answer:(e,s)=>r.request(`${i}/attempts/${e}/answers`,{method:"POST",body:s}),finish:e=>r.request(`${i}/attempts/${e}/finish`,{method:"POST"}),attempt:e=>r.request(`${i}/attempts/${e}`),attempts:(e,s)=>r.raw(`${i}/attempts`,{query:{quiz:e,page:s}})};export{S as _,T as q};
import{e as p}from"./format-bcE-cYHJ.js";import{d as z,o,c as a,F as c,y as h,a as d,m,t as n,b as _,x as q,e as l,L as r}from"./index-CcCE3P1z.js";const y={class:"rows"},$={class:"row-main"},k={class:"title"},w=["aria-label"],f={key:1,class:"badge"},b={class:"muted small"},S=z({__name:"AttemptList",props:{attempts:{},showQuiz:{type:Boolean}},setup(e){const s=u=>`${Math.round(u.score_points)}/${Math.round(u.max_points)}`;return(u,g)=>(o(),a("ul",y,[(o(!0),a(c,null,h(e.attempts,t=>(o(),a("li",{key:t.id},[d("div",$,[d("span",k,[e.showQuiz?(o(),a(c,{key:0},[m(n(t.quiz_title),1)],64)):(o(),a(c,{key:1},[m(n(_(p)(t.started_at)),1)],64))]),t.completed_at?(o(),a("span",{key:0,class:q(["badge",t.passed?"online":""]),"aria-label":`Wynik ${s(t)}`},n(s(t)),11,w)):(o(),a("span",f,"niezakończona"))]),d("div",b,[e.showQuiz?(o(),a(c,{key:0},[m(n(_(p)(t.started_at))+" · ",1)],64)):l("",!0),t.category?(o(),a(c,{key:1},[m(n(t.category)+" · ",1)],64)):l("",!0),m(" odpowiedzi: "+n(t.answered_count),1),t.completed_at&&t.score_percent!==null?(o(),a(c,{key:2},[m(" · "+n(String(t.score_percent).replace(".",","))+"% puli",1)],64)):l("",!0)])]))),128))]))}}),i="/_quizzes/api/v1",T={list:e=>r.request(`${i}/quizzes`,{query:{context:e}}),quiz:(e,s)=>r.request(`${i}/quizzes/${encodeURIComponent(e)}`,{query:{category:s}}),start:(e,s)=>r.request(`${i}/quizzes/${encodeURIComponent(e)}/attempts`,{method:"POST",body:s?{category:s}:{}}),answer:(e,s)=>r.request(`${i}/attempts/${e}/answers`,{method:"POST",body:s}),finish:e=>r.request(`${i}/attempts/${e}/finish`,{method:"POST"}),attempt:e=>r.request(`${i}/attempts/${e}`),attempts:(e,s)=>r.raw(`${i}/attempts`,{query:{quiz:e,page:s}})};export{S as _,T as q};

File diff suppressed because one or more lines are too long

View File

@@ -14,7 +14,7 @@
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-title" content="BM II°" />
<meta name="apple-mobile-web-app-status-bar-style" content="default" />
<script type="module" crossorigin src="/assets/index-BjjbG2NZ.js"></script>
<script type="module" crossorigin src="/assets/index-CcCE3P1z.js"></script>
<link rel="stylesheet" crossorigin href="/assets/index-DnBiKx4V.css">
</head>
<body>

View File

@@ -1,4 +1,4 @@
const BUILD = '9957d2881d78'
const BUILD = '3ce237944e1d'
// The service worker of the BM student app. The Vite plugin bm-service-worker
// (vite.config.ts) emits this file as /sw.js and replaces the build id above,
// so every build that changes an asset gets a fresh cache and an update prompt.

View File

@@ -14,6 +14,7 @@ import (
"git.golem15.com/golem15/summercms/modules/surf"
"git.golem15.com/jakub/sm-bm-plugin/controllers"
"git.golem15.com/jakub/sm-bm-plugin/controllers/api"
"gocloud.dev/blob"
"gorm.io/gorm"
)
@@ -123,6 +124,12 @@ func (p *Plugin) Routes(r pact.Router) error {
g.Where("id", "[0-9]+")
g.Delete("/materials/{id}", h.DeleteMaterial, "user.scope:write", "user.permission:"+controllers.PermMaterials)
g.Where("id", "[0-9]+")
g.Post("/materials/{id}/files", h.AttachMaterialFiles, "user.scope:write", "user.permission:"+controllers.PermMaterials,
"body.limit:"+strconv.Itoa(api.MaterialFilesBodyLimit))
g.Where("id", "[0-9]+")
g.Delete("/materials/{id}/files/{file}", h.DetachMaterialFile, "user.scope:write", "user.permission:"+controllers.PermMaterials)
g.Where("id", "[0-9]+")
g.Where("file", "[0-9]+")
g.Post("/seed", h.ApplySeed, "user.scope:write",
"user.permission:"+controllers.PermCourses,
"user.permission:"+controllers.PermSchedule,
@@ -189,6 +196,13 @@ func (p *Plugin) handlers() *api.Handlers {
db, _ := p.app.Lookup[*gorm.DB]()
return db
},
Bucket: func() *blob.Bucket {
if p.app == nil {
return nil
}
b, _ := p.app.Lookup[*blob.Bucket]()
return b
},
Translator: func() *phrasebook.Translator {
if p.app == nil {
return nil