Files
intotheeast-com-content/pages/02.post/post-form.md
T
m038 bf5b5c2f3c feat(post-form): client-side HEIC->JPEG photo picker (U4)
Replace /post's managed filepond field with a controlled 'photos' field
(theme forms/fields/photos) + picker logic in post-form.js: magic-byte
sniff (ISO-BMFF ftyp brands, not filename/MIME), lazy import('heic-to')
only for real HEIC (deferred 3MB chunk via ESM splitting), per-thumbnail
converting/uploading/done/error states, in-flight counter gating Submit,
and fail-closed skip on conversion failure. Converted JPEGs POST to Grav's
AJAX file-upload route into the form flash (the only path copyFiles reads),
so add-page-by-form attaches them on submit. Web-format photos pass through.

Refs R8, R9, R16, R17, AE1, AE4, KTD4.
2026-07-04 16:38:13 +02:00

173 lines
4.3 KiB
Markdown

---
title: 'New Entry'
template: post-form
access:
site.login: true
# Parent (write target) is injected server-side from site.active_trip by the
# cache-on-save plugin (onFormValidationProcessed) — no manual sync needed.
pageconfig:
slug_field: 'date,title'
overwrite_mode: false
pagefrontmatter:
template: entry
published: true
form:
name: new-entry
action: /post
enctype: multipart/form-data
fields:
-
name: title
label: Title
type: text
autofocus: true
validate:
required: true
-
name: date
label: Date & Time
type: datetime
default: now
format: 'Y-m-d H:i'
validate:
required: true
-
name: content
label: "What happened today?"
type: textarea
rows: 10
validate:
required: true
-
name: photos
label: Photos (max 4)
# Custom controlled picker (theme: forms/fields/photos) — replaces
# filepond so post-form.js can convert HEIC before upload (U4). The
# destination/accept/limit below are still read server-side by the
# form's AJAX uploadFiles() handler.
type: photos
multiple: true
destination: '@self'
limit: 4
accept:
- 'image/*'
-
name: lat
label: Latitude
type: text
placeholder: 'tap "Get Location" below'
-
name: lng
label: Longitude
type: text
placeholder: ''
-
name: location_city
label: City
type: text
placeholder: 'e.g. Kyoto'
-
name: location_country
label: Country
type: text
placeholder: 'e.g. Japan'
-
name: weather_desc
label: Weather Condition
type: select
default: ''
options:
'': '— none —'
'Sunny': '☀️ Sunny'
'Partly cloudy': '⛅ Partly cloudy'
'Cloudy': '☁️ Cloudy'
'Foggy': '🌫️ Foggy'
'Drizzle': '🌦️ Drizzle'
'Rain': '🌧️ Rain'
'Snow': '❄️ Snow'
'Thunderstorm': '⛈️ Thunderstorm'
-
name: weather_temp_c
label: 'Temperature (°C)'
type: number
placeholder: 'tap "Get Weather" or type it'
validate:
min: -60
max: 60
-
name: transport_mode
label: 'How I got here'
type: select
default: ''
options:
'': '— not specified —'
'walking': '🚶 Walking'
'bicycle': '🚲 Bicycle'
'bus': '🚌 Bus'
'train': '🚆 Train'
'car': '🚗 Car'
'plane': '✈️ Plane'
# Advanced fields — collapsed behind "More options" (see U5)
-
name: hero_image
label: Hero Image Filename
type: text
classes: advanced-field
placeholder: 'photo.jpg'
help: 'Filename of the hero/header image. Leave blank to use the first uploaded photo.'
-
name: force_connect
label: Force connector line
type: toggle
classes: advanced-field
highlight: 0
default: 0
options:
1: 'Yes'
0: 'No'
validate:
type: bool
-
name: featured
label: Featured highlight
type: toggle
classes: advanced-field
highlight: 0
default: 0
options:
1: 'Yes'
0: 'No'
validate:
type: bool
novalidate: true
buttons:
-
type: submit
value: Post Daily
classes: btn-post
process:
add_page: true
upload: true
message: 'Entry posted successfully!'
reset: true
---