Signed-off-by: brookjeynes me@brookjeynes.dev
+15
-5
internal/server/handlers/study-session.go
+15
-5
internal/server/handlers/study-session.go
···
435
return resource.Status != db.Deleted
436
})
437
438
views.NewStudySessionPage(views.NewStudySessionPageParams{
439
-
User: user,
440
-
Profile: profile,
441
-
Activities: activeActivities,
442
-
Resources: activeResources,
443
-
SortedLanguages: profile.Languages,
444
}).Render(r.Context(), w)
445
case http.MethodPost:
446
newStudySession, err := h.parseStudySessionForm(r)
···
435
return resource.Status != db.Deleted
436
})
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
+
447
views.NewStudySessionPage(views.NewStudySessionPageParams{
448
+
User: user,
449
+
Profile: profile,
450
+
Activities: activeActivities,
451
+
Resources: activeResources,
452
+
SortedLanguages: profile.Languages,
453
+
PrePopulatedFormData: prePopulated,
454
}).Render(r.Context(), w)
455
case http.MethodPost:
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
package views
2
3
import (
4
"yoten.app/internal/server/views/layouts"
5
"yoten.app/internal/server/views/partials"
6
)
···
12
if len(params.Profile.Languages) == 1 {
13
initialLangCode = string(params.Profile.Languages[0].Code)
14
}
15
}}
16
@layouts.Base(layouts.BaseParams{Title: "new study session"}) {
17
@partials.Header(partials.HeaderProps{User: params.User})
···
279
<p class="font-medium text-sm">Duration</p>
280
<div class="flex gap-2">
281
<div class="flex flex-col gap-1 w-full">
282
-
<div x-data="{ hours: 0, maxHours: 24 }">
283
<input
284
type="number"
285
id="duration-hours"
···
295
<label for="duration-minutes" class="text-xs text-text-muted">Hours</label>
296
</div>
297
<div class="flex flex-col gap-1 w-full">
298
-
<div x-data="{ minutes: 0, maxMinutes: 60 }">
299
<input
300
type="number"
301
id="duration-minutes"
···
311
<label for="duration-minutes" class="text-xs text-text-muted">Minutes</label>
312
</div>
313
<div class="flex flex-col gap-1 w-full">
314
-
<div x-data="{ seconds: 0, maxSeconds: 60 }">
315
<input
316
type="number"
317
id="duration-seconds"
···
366
>
367
Description (optional)
368
</label>
369
-
<div x-data="{ text: '' }">
370
<textarea
371
x-model="text"
372
id="description"
···
413
414
activitiesSearchQuery: '',
415
activities: {{ params.Activities }} || [],
416
-
selectedActivityName: 'Select an activity',
417
-
selectedActivityId: '',
418
activitiesIsOpen: false,
419
420
resourcesSearchQuery: '',
···
423
selectedResourceId: '',
424
resourcesIsOpen: false,
425
426
-
selectedLanguage: {{ initialLangCode }} || '',
427
428
get filteredActivities() {
429
if (this.activitiesSearchQuery === '') {
···
1
package views
2
3
import (
4
+
"fmt"
5
+
6
+
"strconv"
7
"yoten.app/internal/server/views/layouts"
8
"yoten.app/internal/server/views/partials"
9
)
···
15
if len(params.Profile.Languages) == 1 {
16
initialLangCode = string(params.Profile.Languages[0].Code)
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
+
}
31
}}
32
@layouts.Base(layouts.BaseParams{Title: "new study session"}) {
33
@partials.Header(partials.HeaderProps{User: params.User})
···
295
<p class="font-medium text-sm">Duration</p>
296
<div class="flex gap-2">
297
<div class="flex flex-col gap-1 w-full">
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) }>
306
<input
307
type="number"
308
id="duration-hours"
···
318
<label for="duration-minutes" class="text-xs text-text-muted">Hours</label>
319
</div>
320
<div class="flex flex-col gap-1 w-full">
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) }>
329
<input
330
type="number"
331
id="duration-minutes"
···
341
<label for="duration-minutes" class="text-xs text-text-muted">Minutes</label>
342
</div>
343
<div class="flex flex-col gap-1 w-full">
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) }>
352
<input
353
type="number"
354
id="duration-seconds"
···
403
>
404
Description (optional)
405
</label>
406
+
<div x-data={ fmt.Sprintf("{ text: '%s' }", templ.EscapeString(params.PrePopulatedFormData.Description)) }>
407
<textarea
408
x-model="text"
409
id="description"
···
450
451
activitiesSearchQuery: '',
452
activities: {{ params.Activities }} || [],
453
+
selectedActivityName: {{ activityName }},
454
+
selectedActivityId: {{ params.PrePopulatedFormData.ActivityId }},
455
activitiesIsOpen: false,
456
457
resourcesSearchQuery: '',
···
460
selectedResourceId: '',
461
resourcesIsOpen: false,
462
463
+
selectedLanguage: {{ params.PrePopulatedFormData.LanguageCode }} || {{ initialLangCode }} || '',
464
465
get filteredActivities() {
466
if (this.activitiesSearchQuery === '') {
+15
-5
internal/server/views/views.go
+15
-5
internal/server/views/views.go
···
44
45
type NotFoundPageParams struct{}
46
47
type NewStudySessionPageParams struct {
48
// 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
54
}
55
56
type EditStudySessionPageParams struct {
···
44
45
type NotFoundPageParams struct{}
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
+
56
type NewStudySessionPageParams struct {
57
// The current logged in user.
58
+
User *types.User
59
+
Profile db.Profile
60
+
Activities []db.Activity
61
+
Resources []db.Resource
62
+
SortedLanguages []db.Language
63
+
PrePopulatedFormData NewStudySessionQueryParams
64
}
65
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>