Signed-off-by: brookjeynes me@brookjeynes.dev
+74
-17
Diff
round #0
+15
-5
internal/server/handlers/study-session.go
+15
-5
internal/server/handlers/study-session.go
···
435
435
return resource.Status != db.Deleted
436
436
})
437
437
438
+
prePopulated := views.NewStudySessionQueryParams{
439
+
LanguageCode: r.URL.Query().Get("language_code"),
440
+
DurationHours: r.URL.Query().Get("duration_hours"),
441
+
DurationMinutes: r.URL.Query().Get("duration_minutes"),
442
+
DurationSeconds: r.URL.Query().Get("duration_seconds"),
443
+
Description: r.URL.Query().Get("description"),
444
+
ActivityId: r.URL.Query().Get("activity_id"),
445
+
}
446
+
438
447
views.NewStudySessionPage(views.NewStudySessionPageParams{
439
-
User: user,
440
-
Profile: profile,
441
-
Activities: activeActivities,
442
-
Resources: activeResources,
443
-
SortedLanguages: profile.Languages,
448
+
User: user,
449
+
Profile: profile,
450
+
Activities: activeActivities,
451
+
Resources: activeResources,
452
+
SortedLanguages: profile.Languages,
453
+
PrePopulatedFormData: prePopulated,
444
454
}).Render(r.Context(), w)
445
455
case http.MethodPost:
446
456
newStudySession, err := h.parseStudySessionForm(r)
+44
-7
internal/server/views/new-study-session.templ
+44
-7
internal/server/views/new-study-session.templ
···
1
1
package views
2
2
3
3
import (
4
+
"fmt"
5
+
6
+
"strconv"
4
7
"yoten.app/internal/server/views/layouts"
5
8
"yoten.app/internal/server/views/partials"
6
9
)
···
12
15
if len(params.Profile.Languages) == 1 {
13
16
initialLangCode = string(params.Profile.Languages[0].Code)
14
17
}
18
+
19
+
activityName := "Select an activity"
20
+
if params.PrePopulatedFormData.ActivityId != "" {
21
+
for _, a := range params.Activities {
22
+
activityId, err := strconv.ParseInt(params.PrePopulatedFormData.ActivityId, 10, 64)
23
+
if err != nil {
24
+
continue
25
+
}
26
+
if int64(a.ID) == activityId {
27
+
activityName = a.Name
28
+
}
29
+
}
30
+
}
15
31
}}
16
32
@layouts.Base(layouts.BaseParams{Title: "new study session"}) {
17
33
@partials.Header(partials.HeaderProps{User: params.User})
···
279
295
<p class="font-medium text-sm">Duration</p>
280
296
<div class="flex gap-2">
281
297
<div class="flex flex-col gap-1 w-full">
282
-
<div x-data="{ hours: 0, maxHours: 24 }">
298
+
{{
299
+
hoursStr := params.PrePopulatedFormData.DurationHours
300
+
hours := "0"
301
+
if hoursStr != "" {
302
+
hours = hoursStr
303
+
}
304
+
}}
305
+
<div x-data={ fmt.Sprintf("{ hours: %s, maxHours: 60 }", hours) }>
283
306
<input
284
307
type="number"
285
308
id="duration-hours"
···
295
318
<label for="duration-minutes" class="text-xs text-text-muted">Hours</label>
296
319
</div>
297
320
<div class="flex flex-col gap-1 w-full">
298
-
<div x-data="{ minutes: 0, maxMinutes: 60 }">
321
+
{{
322
+
minutesStr := params.PrePopulatedFormData.DurationMinutes
323
+
minutes := "0"
324
+
if minutesStr != "" {
325
+
minutes = minutesStr
326
+
}
327
+
}}
328
+
<div x-data={ fmt.Sprintf("{ minutes: %s, maxMinutes: 60 }", minutes) }>
299
329
<input
300
330
type="number"
301
331
id="duration-minutes"
···
311
341
<label for="duration-minutes" class="text-xs text-text-muted">Minutes</label>
312
342
</div>
313
343
<div class="flex flex-col gap-1 w-full">
314
-
<div x-data="{ seconds: 0, maxSeconds: 60 }">
344
+
{{
345
+
secondsStr := params.PrePopulatedFormData.DurationSeconds
346
+
seconds := "0"
347
+
if secondsStr != "" {
348
+
seconds = secondsStr
349
+
}
350
+
}}
351
+
<div x-data={ fmt.Sprintf("{ seconds: %s, maxSeconds: 60 }", seconds) }>
315
352
<input
316
353
type="number"
317
354
id="duration-seconds"
···
366
403
>
367
404
Description (optional)
368
405
</label>
369
-
<div x-data="{ text: '' }">
406
+
<div x-data={ fmt.Sprintf("{ text: '%s' }", templ.EscapeString(params.PrePopulatedFormData.Description)) }>
370
407
<textarea
371
408
x-model="text"
372
409
id="description"
···
413
450
414
451
activitiesSearchQuery: '',
415
452
activities: {{ params.Activities }} || [],
416
-
selectedActivityName: 'Select an activity',
417
-
selectedActivityId: '',
453
+
selectedActivityName: {{ activityName }},
454
+
selectedActivityId: {{ params.PrePopulatedFormData.ActivityId }},
418
455
activitiesIsOpen: false,
419
456
420
457
resourcesSearchQuery: '',
···
423
460
selectedResourceId: '',
424
461
resourcesIsOpen: false,
425
462
426
-
selectedLanguage: {{ initialLangCode }} || '',
463
+
selectedLanguage: {{ params.PrePopulatedFormData.LanguageCode }} || {{ initialLangCode }} || '',
427
464
428
465
get filteredActivities() {
429
466
if (this.activitiesSearchQuery === '') {
+15
-5
internal/server/views/views.go
+15
-5
internal/server/views/views.go
···
44
44
45
45
type NotFoundPageParams struct{}
46
46
47
+
type NewStudySessionQueryParams struct {
48
+
LanguageCode string
49
+
DurationHours string
50
+
DurationMinutes string
51
+
DurationSeconds string
52
+
Description string
53
+
ActivityId string
54
+
}
55
+
47
56
type NewStudySessionPageParams struct {
48
57
// The current logged in user.
49
-
User *types.User
50
-
Profile db.Profile
51
-
Activities []db.Activity
52
-
Resources []db.Resource
53
-
SortedLanguages []db.Language
58
+
User *types.User
59
+
Profile db.Profile
60
+
Activities []db.Activity
61
+
Resources []db.Resource
62
+
SortedLanguages []db.Language
63
+
PrePopulatedFormData NewStudySessionQueryParams
54
64
}
55
65
56
66
type EditStudySessionPageParams struct {
History
2 rounds
0 comments
brookjeynes.dev
submitted
#1
1 commit
expand
collapse
feat(new-study-session): add query params for prefilled data
Signed-off-by: brookjeynes <me@brookjeynes.dev>
expand 0 comments
pull request successfully merged
brookjeynes.dev
submitted
#0
1 commit
expand
collapse
feat(new-study-session): add query params for prefilled data
Signed-off-by: brookjeynes <me@brookjeynes.dev>