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:
@@ -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
|
||||
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
|
||||
221
controllers/api/manage_files.go
Normal file
221
controllers/api/manage_files.go
Normal 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
2
go.mod
@@ -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
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
@@ -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
@@ -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};
|
||||
File diff suppressed because one or more lines are too long
@@ -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 _};
|
||||
@@ -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};
|
||||
@@ -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 _};
|
||||
@@ -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};
|
||||
@@ -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={"&":"&","<":"<",">":">",'"':""","'":"'"};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};
|
||||
6
public/assets/MaterialView-DsIAl7oy.js
Normal file
6
public/assets/MaterialView-DsIAl7oy.js
Normal 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={"&":"&","<":"<",">":">",'"':""","'":"'"};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};
|
||||
@@ -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};
|
||||
@@ -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};
|
||||
@@ -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};
|
||||
@@ -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};
|
||||
@@ -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 _};
|
||||
@@ -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
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -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};
|
||||
@@ -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 _};
|
||||
@@ -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};
|
||||
@@ -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};
|
||||
@@ -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
@@ -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};
|
||||
@@ -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};
|
||||
@@ -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
@@ -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};
|
||||
@@ -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
@@ -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>
|
||||
|
||||
@@ -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.
|
||||
|
||||
14
routes.go
14
routes.go
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user