person-form.html 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. {% extends "base.html" %}
  2. {% block title %}{% if action == 'add' %}Add Person{% else %}Edit {{ person.name }}{% endif %} - astro-mcp{% endblock %}
  3. {% block content %}
  4. <h1>{% if action == 'add' %}Add Person{% else %}Edit {{ person.name }}{% endif %}</h1>
  5. <div class="toolbar">
  6. {% if action == 'edit' %}
  7. <a href="/dashboard/persons/{{ person.id }}" class="btn btn-ghost">← Back</a>
  8. {% else %}
  9. <a href="/dashboard/persons" class="btn btn-ghost">← Back</a>
  10. {% endif %}
  11. </div>
  12. <form method="post" id="person-form"
  13. {% if action == 'add' %}
  14. action="/dashboard/persons"
  15. {% else %}
  16. action="/dashboard/persons/{{ person.id }}"
  17. {% endif %}
  18. >
  19. <div class="card">
  20. <h2>Identity</h2>
  21. <div class="form-row">
  22. <div class="form-group">
  23. <label for="name">Full Name *</label>
  24. <input type="text" id="name" name="name" required
  25. value="{{ person.name if person else '' }}">
  26. </div>
  27. <div class="form-group">
  28. <label for="nickname">Nickname</label>
  29. <input type="text" id="nickname" name="nickname"
  30. value="{{ person.nickname if person else '' }}">
  31. <div class="form-hint">Short name for quick lookup</div>
  32. </div>
  33. </div>
  34. <div class="form-group">
  35. <label for="description">Description</label>
  36. <input type="text" id="description" name="description"
  37. value="{{ person.description if person else '' }}"
  38. placeholder="e.g. My sister, Client A, Famous person...">
  39. </div>
  40. <div class="form-row">
  41. <div class="form-group">
  42. <label for="gender">Gender</label>
  43. <select id="gender" name="gender">
  44. <option value="" {% if not person or not person.gender %}selected{% endif %}>—</option>
  45. <option value="male" {% if person and person.gender == 'male' %}selected{% endif %}>male</option>
  46. <option value="female" {% if person and person.gender == 'female' %}selected{% endif %}>female</option>
  47. <option value="other" {% if person and person.gender == 'other' %}selected{% endif %}>other</option>
  48. </select>
  49. </div>
  50. <div class="form-group">
  51. <label for="alive">Status</label>
  52. <select id="alive" name="alive">
  53. <option value="true" {% if not person or person.alive %}selected{% endif %}>Alive</option>
  54. <option value="false" {% if person and not person.alive %}selected{% endif %}>Deceased</option>
  55. </select>
  56. </div>
  57. <div class="form-group">
  58. <label for="private">Visibility</label>
  59. <select id="private" name="private">
  60. <option value="false" {% if not person or not person.private %}selected{% endif %}>Visible</option>
  61. <option value="true" {% if person and person.private %}selected{% endif %}>Private</option>
  62. </select>
  63. </div>
  64. </div>
  65. </div>
  66. <div class="card">
  67. <h2>Birth Data *</h2>
  68. <div class="form-row">
  69. <div class="form-group">
  70. <label for="birth_date">Birth Date *</label>
  71. <input type="date" id="birth_date" required
  72. value="{{ person.birth_datetime[:10] if person and person.birth_datetime else '' }}">
  73. </div>
  74. <div class="form-group">
  75. <label for="birth_time">Birth Time *</label>
  76. {% if is_24h | default(true) %}
  77. <input type="time" id="birth_time" required step="1"
  78. value="{{ person.birth_datetime[11:16] if person and person.birth_datetime else '' }}">
  79. <div class="form-hint">HH:MM (24h format)</div>
  80. {% else %}
  81. <div style="display:flex;gap:0.5rem;align-items:center">
  82. <input type="text" id="birth_time" name="birth_time" required
  83. value="{{ person.birth_datetime[11:16] if person and person.birth_datetime else '' }}"
  84. placeholder="HH:MM" pattern="[0-9]{1,2}:[0-9]{2}" style="max-width:100px">
  85. <select id="birth_ampm" name="birth_ampm" style="width:80px">
  86. <option value="AM">AM</option>
  87. <option value="PM">PM</option>
  88. </select>
  89. </div>
  90. <div class="form-hint">HH:MM AM/PM (12h format)</div>
  91. {% endif %}
  92. </div>
  93. <div class="form-group">
  94. <label for="tz">Timezone *</label>
  95. <select id="tz" name="tz" required>
  96. <option value="">— select —</option>
  97. <optgroup label="Europe">
  98. <option value="Europe/Vienna" {% if person and person.timezone == 'Europe/Vienna' %}selected{% endif %}>Europe/Vienna (CET/CEST)</option>
  99. <option value="Europe/Berlin" {% if person and person.timezone == 'Europe/Berlin' %}selected{% endif %}>Europe/Berlin (CET/CEST)</option>
  100. <option value="Europe/Zurich" {% if person and person.timezone == 'Europe/Zurich' %}selected{% endif %}>Europe/Zurich (CET/CEST)</option>
  101. <option value="Europe/London" {% if person and person.timezone == 'Europe/London' %}selected{% endif %}>Europe/London (GMT/BST)</option>
  102. <option value="Europe/Paris" {% if person and person.timezone == 'Europe/Paris' %}selected{% endif %}>Europe/Paris (CET/CEST)</option>
  103. <option value="Europe/Amsterdam" {% if person and person.timezone == 'Europe/Amsterdam' %}selected{% endif %}>Europe/Amsterdam (CET/CEST)</option>
  104. <option value="Europe/Brussels" {% if person and person.timezone == 'Europe/Brussels' %}selected{% endif %}>Europe/Brussels (CET/CEST)</option>
  105. <option value="Europe/Madrid" {% if person and person.timezone == 'Europe/Madrid' %}selected{% endif %}>Europe/Madrid (CET/CEST)</option>
  106. <option value="Europe/Rome" {% if person and person.timezone == 'Europe/Rome' %}selected{% endif %}>Europe/Rome (CET/CEST)</option>
  107. <option value="Europe/Stockholm" {% if person and person.timezone == 'Europe/Stockholm' %}selected{% endif %}>Europe/Stockholm (CET/CEST)</option>
  108. <option value="Europe/Oslo" {% if person and person.timezone == 'Europe/Oslo' %}selected{% endif %}>Europe/Oslo (CET/CEST)</option>
  109. <option value="Europe/Copenhagen" {% if person and person.timezone == 'Europe/Copenhagen' %}selected{% endif %}>Europe/Copenhagen (CET/CEST)</option>
  110. <option value="Europe/Warsaw" {% if person and person.timezone == 'Europe/Warsaw' %}selected{% endif %}>Europe/Warsaw (CET/CEST)</option>
  111. <option value="Europe/Prague" {% if person and person.timezone == 'Europe/Prague' %}selected{% endif %}>Europe/Prague (CET/CEST)</option>
  112. <option value="Europe/Budapest" {% if person and person.timezone == 'Europe/Budapest' %}selected{% endif %}>Europe/Budapest (CET/CEST)</option>
  113. <option value="Europe/Athens" {% if person and person.timezone == 'Europe/Athens' %}selected{% endif %}>Europe/Athens (EET/EEST)</option>
  114. <option value="Europe/Helsinki" {% if person and person.timezone == 'Europe/Helsinki' %}selected{% endif %}>Europe/Helsinki (EET/EEST)</option>
  115. <option value="Europe/Moscow" {% if person and person.timezone == 'Europe/Moscow' %}selected{% endif %}>Europe/Moscow (MSK)</option>
  116. <option value="Europe/Istanbul" {% if person and person.timezone == 'Europe/Istanbul' %}selected{% endif %}>Europe/Istanbul (TRT)</option>
  117. <option value="Europe/Lisbon" {% if person and person.timezone == 'Europe/Lisbon' %}selected{% endif %}>Europe/Lisbon (WET/WEST)</option>
  118. <option value="Europe/Dublin" {% if person and person.timezone == 'Europe/Dublin' %}selected{% endif %}>Europe/Dublin (GMT/IST)</option>
  119. <option value="Europe/Zagreb" {% if person and person.timezone == 'Europe/Zagreb' %}selected{% endif %}>Europe/Zagreb (CET/CEST)</option>
  120. <option value="Europe/Bucharest" {% if person and person.timezone == 'Europe/Bucharest' %}selected{% endif %}>Europe/Bucharest (EET/EEST)</option>
  121. <option value="Europe/Sofia" {% if person and person.timezone == 'Europe/Sofia' %}selected{% endif %}>Europe/Sofia (EET/EEST)</option>
  122. </optgroup>
  123. <optgroup label="Americas">
  124. <option value="America/New_York" {% if person and person.timezone == 'America/New_York' %}selected{% endif %}>America/New_York (ET)</option>
  125. <option value="America/Chicago" {% if person and person.timezone == 'America/Chicago' %}selected{% endif %}>America/Chicago (CT)</option>
  126. <option value="America/Denver" {% if person and person.timezone == 'America/Denver' %}selected{% endif %}>America/Denver (MT)</option>
  127. <option value="America/Los_Angeles" {% if person and person.timezone == 'America/Los_Angeles' %}selected{% endif %}>America/Los_Angeles (PT)</option>
  128. <option value="America/Toronto" {% if person and person.timezone == 'America/Toronto' %}selected{% endif %}>America/Toronto (ET)</option>
  129. <option value="America/Vancouver" {% if person and person.timezone == 'America/Vancouver' %}selected{% endif %}>America/Vancouver (PT)</option>
  130. <option value="America/Mexico_City" {% if person and person.timezone == 'America/Mexico_City' %}selected{% endif %}>America/Mexico_City (CT)</option>
  131. <option value="America/Sao_Paulo" {% if person and person.timezone == 'America/Sao_Paulo' %}selected{% endif %}>America/Sao_Paulo (BRT)</option>
  132. <option value="America/Buenos_Aires" {% if person and person.timezone == 'America/Buenos_Aires' %}selected{% endif %}>America/Buenos_Aires (ART)</option>
  133. <option value="America/Bogota" {% if person and person.timezone == 'America/Bogota' %}selected{% endif %}>America/Bogota (COT)</option>
  134. </optgroup>
  135. <optgroup label="Asia & Oceania">
  136. <option value="Asia/Tokyo" {% if person and person.timezone == 'Asia/Tokyo' %}selected{% endif %}>Asia/Tokyo (JST)</option>
  137. <option value="Asia/Shanghai" {% if person and person.timezone == 'Asia/Shanghai' %}selected{% endif %}>Asia/Shanghai (CST)</option>
  138. <option value="Asia/Hong_Kong" {% if person and person.timezone == 'Asia/Hong_Kong' %}selected{% endif %}>Asia/Hong_Kong (HKT)</option>
  139. <option value="Asia/Singapore" {% if person and person.timezone == 'Asia/Singapore' %}selected{% endif %}>Asia/Singapore (SGT)</option>
  140. <option value="Asia/Kolkata" {% if person and person.timezone == 'Asia/Kolkata' %}selected{% endif %}>Asia/Kolkata (IST)</option>
  141. <option value="Asia/Dubai" {% if person and person.timezone == 'Asia/Dubai' %}selected{% endif %}>Asia/Dubai (GST)</option>
  142. <option value="Asia/Bangkok" {% if person and person.timezone == 'Asia/Bangkok' %}selected{% endif %}>Asia/Bangkok (ICT)</option>
  143. <option value="Asia/Seoul" {% if person and person.timezone == 'Asia/Seoul' %}selected{% endif %}>Asia/Seoul (KST)</option>
  144. <option value="Australia/Sydney" {% if person and person.timezone == 'Australia/Sydney' %}selected{% endif %}>Australia/Sydney (AEST/AEDT)</option>
  145. <option value="Australia/Melbourne" {% if person and person.timezone == 'Australia/Melbourne' %}selected{% endif %}>Australia/Melbourne (AEST/AEDT)</option>
  146. <option value="Australia/Perth" {% if person and person.timezone == 'Australia/Perth' %}selected{% endif %}>Australia/Perth (AWST)</option>
  147. <option value="Pacific/Auckland" {% if person and person.timezone == 'Pacific/Auckland' %}selected{% endif %}>Pacific/Auckland (NZST/NZDT)</option>
  148. </optgroup>
  149. <optgroup label="Africa & Middle East">
  150. <option value="Africa/Cairo" {% if person and person.timezone == 'Africa/Cairo' %}selected{% endif %}>Africa/Cairo (EET)</option>
  151. <option value="Africa/Johannesburg" {% if person and person.timezone == 'Africa/Johannesburg' %}selected{% endif %}>Africa/Johannesburg (SAST)</option>
  152. <option value="Africa/Lagos" {% if person and person.timezone == 'Africa/Lagos' %}selected{% endif %}>Africa/Lagos (WAT)</option>
  153. <option value="Asia/Jerusalem" {% if person and person.timezone == 'Asia/Jerusalem' %}selected{% endif %}>Asia/Jerusalem (IST/IDT)</option>
  154. <option value="Asia/Riyadh" {% if person and person.timezone == 'Asia/Riyadh' %}selected{% endif %}>Asia/Riyadh (AST)</option>
  155. <option value="Asia/Tehran" {% if person and person.timezone == 'Asia/Tehran' %}selected{% endif %}>Asia/Tehran (IRST/IRDT)</option>
  156. </optgroup>
  157. <optgroup label="UTC">
  158. <option value="UTC" {% if person and person.timezone == 'UTC' %}selected{% endif %}>UTC</option>
  159. </optgroup>
  160. </select>
  161. </div>
  162. </div>
  163. <div id="utc-offset-display" class="form-hint" style="margin-top:-0.5rem;margin-bottom:0.5rem"></div>
  164. <div class="form-group">
  165. <label for="birthplace">Birthplace *</label>
  166. <input type="text" id="birthplace" name="birthplace" required
  167. value="{{ person.birthplace if person else '' }}"
  168. placeholder="Start typing a city name..."
  169. autocomplete="off">
  170. <div id="birthplace-results" class="autocomplete-dropdown" style="display:none"></div>
  171. <div id="birthplace-status" class="form-hint"></div>
  172. </div>
  173. <div class="form-row">
  174. <div class="form-group">
  175. <label for="latitude">Latitude *</label>
  176. <input type="number" id="latitude" name="latitude" step="any" required
  177. value="{{ person.latitude if person else '' }}"
  178. placeholder="47.07">
  179. </div>
  180. <div class="form-group">
  181. <label for="longitude">Longitude *</label>
  182. <input type="number" id="longitude" name="longitude" step="any" required
  183. value="{{ person.longitude if person else '' }}"
  184. placeholder="15.42">
  185. </div>
  186. <div class="form-group">
  187. <label for="elevation">Elevation (m)</label>
  188. <input type="number" id="elevation" name="elevation" step="any"
  189. value="{{ person.elevation if person else '0' }}">
  190. </div>
  191. </div>
  192. <div class="form-row">
  193. <div class="form-group">
  194. <label for="birth_time_known">Birth Time Known?</label>
  195. <select id="birth_time_known" name="birth_time_known">
  196. <option value="true" {% if not person or person.birth_time_known %}selected{% endif %}>Yes, accurate</option>
  197. <option value="false" {% if person and not person.birth_time_known %}selected{% endif %}>Unknown / approximate</option>
  198. </select>
  199. </div>
  200. </div>
  201. </div>
  202. <div class="card">
  203. <h2>Notes</h2>
  204. <div class="form-group">
  205. <textarea id="notes" name="notes"
  206. placeholder="Freeform notes about this person..."
  207. >{{ person.notes if person else '' }}</textarea>
  208. </div>
  209. </div>
  210. <div class="form-actions">
  211. <button type="submit" class="btn btn-primary">
  212. {% if action == 'add' %}Add Person{% else %}Save Changes{% endif %}
  213. </button>
  214. {% if action == 'edit' %}
  215. <a href="/dashboard/persons/{{ person.id }}" class="btn btn-ghost">Cancel</a>
  216. {% else %}
  217. <a href="/dashboard/persons" class="btn btn-ghost">Cancel</a>
  218. {% endif %}
  219. </div>
  220. </form>
  221. {% endblock %}