focomy 0.1.108__tar.gz → 0.1.110__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (209) hide show
  1. {focomy-0.1.108 → focomy-0.1.110}/PKG-INFO +1 -1
  2. {focomy-0.1.108 → focomy-0.1.110}/core/utils.py +7 -5
  3. {focomy-0.1.108 → focomy-0.1.110}/pyproject.toml +1 -1
  4. {focomy-0.1.108 → focomy-0.1.110}/.gitignore +0 -0
  5. {focomy-0.1.108 → focomy-0.1.110}/LICENSE +0 -0
  6. {focomy-0.1.108 → focomy-0.1.110}/README.md +0 -0
  7. {focomy-0.1.108 → focomy-0.1.110}/core/__init__.py +0 -0
  8. {focomy-0.1.108 → focomy-0.1.110}/core/admin/__init__.py +0 -0
  9. {focomy-0.1.108 → focomy-0.1.110}/core/admin/routes.py +0 -0
  10. {focomy-0.1.108 → focomy-0.1.110}/core/admin/url.py +0 -0
  11. {focomy-0.1.108 → focomy-0.1.110}/core/api/__init__.py +0 -0
  12. {focomy-0.1.108 → focomy-0.1.110}/core/api/auth.py +0 -0
  13. {focomy-0.1.108 → focomy-0.1.110}/core/api/comments.py +0 -0
  14. {focomy-0.1.108 → focomy-0.1.110}/core/api/entities.py +0 -0
  15. {focomy-0.1.108 → focomy-0.1.110}/core/api/forms.py +0 -0
  16. {focomy-0.1.108 → focomy-0.1.110}/core/api/media.py +0 -0
  17. {focomy-0.1.108 → focomy-0.1.110}/core/api/relations.py +0 -0
  18. {focomy-0.1.108 → focomy-0.1.110}/core/api/revisions.py +0 -0
  19. {focomy-0.1.108 → focomy-0.1.110}/core/api/schema.py +0 -0
  20. {focomy-0.1.108 → focomy-0.1.110}/core/api/search.py +0 -0
  21. {focomy-0.1.108 → focomy-0.1.110}/core/api/seo.py +0 -0
  22. {focomy-0.1.108 → focomy-0.1.110}/core/cli.py +0 -0
  23. {focomy-0.1.108 → focomy-0.1.110}/core/config.py +0 -0
  24. {focomy-0.1.108 → focomy-0.1.110}/core/content_types/__init__.py +0 -0
  25. {focomy-0.1.108 → focomy-0.1.110}/core/content_types/audit_log.yaml +0 -0
  26. {focomy-0.1.108 → focomy-0.1.110}/core/content_types/category.yaml +0 -0
  27. {focomy-0.1.108 → focomy-0.1.110}/core/content_types/channel.yaml +0 -0
  28. {focomy-0.1.108 → focomy-0.1.110}/core/content_types/comment.yaml +0 -0
  29. {focomy-0.1.108 → focomy-0.1.110}/core/content_types/edit_lock.yaml +0 -0
  30. {focomy-0.1.108 → focomy-0.1.110}/core/content_types/form.yaml +0 -0
  31. {focomy-0.1.108 → focomy-0.1.110}/core/content_types/form_submission.yaml +0 -0
  32. {focomy-0.1.108 → focomy-0.1.110}/core/content_types/menu_item.yaml +0 -0
  33. {focomy-0.1.108 → focomy-0.1.110}/core/content_types/news.yaml +0 -0
  34. {focomy-0.1.108 → focomy-0.1.110}/core/content_types/page.yaml +0 -0
  35. {focomy-0.1.108 → focomy-0.1.110}/core/content_types/plugin.yaml +0 -0
  36. {focomy-0.1.108 → focomy-0.1.110}/core/content_types/plugin_developer.yaml +0 -0
  37. {focomy-0.1.108 → focomy-0.1.110}/core/content_types/plugin_review.yaml +0 -0
  38. {focomy-0.1.108 → focomy-0.1.110}/core/content_types/post.yaml +0 -0
  39. {focomy-0.1.108 → focomy-0.1.110}/core/content_types/redirect.yaml +0 -0
  40. {focomy-0.1.108 → focomy-0.1.110}/core/content_types/scheduled_action.yaml +0 -0
  41. {focomy-0.1.108 → focomy-0.1.110}/core/content_types/series.yaml +0 -0
  42. {focomy-0.1.108 → focomy-0.1.110}/core/content_types/site_setting.yaml +0 -0
  43. {focomy-0.1.108 → focomy-0.1.110}/core/content_types/tag.yaml +0 -0
  44. {focomy-0.1.108 → focomy-0.1.110}/core/content_types/user.yaml +0 -0
  45. {focomy-0.1.108 → focomy-0.1.110}/core/content_types/widget.yaml +0 -0
  46. {focomy-0.1.108 → focomy-0.1.110}/core/content_types/workflow_history.yaml +0 -0
  47. {focomy-0.1.108 → focomy-0.1.110}/core/database.py +0 -0
  48. {focomy-0.1.108 → focomy-0.1.110}/core/engine/__init__.py +0 -0
  49. {focomy-0.1.108 → focomy-0.1.110}/core/engine/routes.py +0 -0
  50. {focomy-0.1.108 → focomy-0.1.110}/core/main.py +0 -0
  51. {focomy-0.1.108 → focomy-0.1.110}/core/migrations/env.py +0 -0
  52. {focomy-0.1.108 → focomy-0.1.110}/core/migrations/script.py.mako +0 -0
  53. {focomy-0.1.108 → focomy-0.1.110}/core/migrations/versions/2038bdf6693b_add_import_jobs_table.py +0 -0
  54. {focomy-0.1.108 → focomy-0.1.110}/core/migrations/versions/3a1b2c3d4e5f_add_file_hash_to_media.py +0 -0
  55. {focomy-0.1.108 → focomy-0.1.110}/core/models/__init__.py +0 -0
  56. {focomy-0.1.108 → focomy-0.1.110}/core/models/auth.py +0 -0
  57. {focomy-0.1.108 → focomy-0.1.110}/core/models/entity.py +0 -0
  58. {focomy-0.1.108 → focomy-0.1.110}/core/models/import_job.py +0 -0
  59. {focomy-0.1.108 → focomy-0.1.110}/core/models/media.py +0 -0
  60. {focomy-0.1.108 → focomy-0.1.110}/core/models/relation.py +0 -0
  61. {focomy-0.1.108 → focomy-0.1.110}/core/models/revision.py +0 -0
  62. {focomy-0.1.108 → focomy-0.1.110}/core/plugins/__init__.py +0 -0
  63. {focomy-0.1.108 → focomy-0.1.110}/core/plugins/base.py +0 -0
  64. {focomy-0.1.108 → focomy-0.1.110}/core/plugins/hooks.py +0 -0
  65. {focomy-0.1.108 → focomy-0.1.110}/core/plugins/loader.py +0 -0
  66. {focomy-0.1.108 → focomy-0.1.110}/core/plugins/manager.py +0 -0
  67. {focomy-0.1.108 → focomy-0.1.110}/core/rate_limit.py +0 -0
  68. {focomy-0.1.108 → focomy-0.1.110}/core/relations.yaml +0 -0
  69. {focomy-0.1.108 → focomy-0.1.110}/core/scaffold/.env.template +0 -0
  70. {focomy-0.1.108 → focomy-0.1.110}/core/scaffold/.gitignore.template +0 -0
  71. {focomy-0.1.108 → focomy-0.1.110}/core/scaffold/__init__.py +0 -0
  72. {focomy-0.1.108 → focomy-0.1.110}/core/scaffold/config.yaml.template +0 -0
  73. {focomy-0.1.108 → focomy-0.1.110}/core/scaffold/themes/default/templates/archive.html +0 -0
  74. {focomy-0.1.108 → focomy-0.1.110}/core/scaffold/themes/default/templates/base.html +0 -0
  75. {focomy-0.1.108 → focomy-0.1.110}/core/scaffold/themes/default/templates/category.html +0 -0
  76. {focomy-0.1.108 → focomy-0.1.110}/core/scaffold/themes/default/templates/home.html +0 -0
  77. {focomy-0.1.108 → focomy-0.1.110}/core/scaffold/themes/default/templates/post.html +0 -0
  78. {focomy-0.1.108 → focomy-0.1.110}/core/scaffold/themes/default/templates/search.html +0 -0
  79. {focomy-0.1.108 → focomy-0.1.110}/core/scaffold/themes/default/theme.yaml +0 -0
  80. {focomy-0.1.108 → focomy-0.1.110}/core/schemas/__init__.py +0 -0
  81. {focomy-0.1.108 → focomy-0.1.110}/core/schemas/import_schema.py +0 -0
  82. {focomy-0.1.108 → focomy-0.1.110}/core/seo/__init__.py +0 -0
  83. {focomy-0.1.108 → focomy-0.1.110}/core/services/__init__.py +0 -0
  84. {focomy-0.1.108 → focomy-0.1.110}/core/services/api_auth.py +0 -0
  85. {focomy-0.1.108 → focomy-0.1.110}/core/services/assets.py +0 -0
  86. {focomy-0.1.108 → focomy-0.1.110}/core/services/audit.py +0 -0
  87. {focomy-0.1.108 → focomy-0.1.110}/core/services/auth.py +0 -0
  88. {focomy-0.1.108 → focomy-0.1.110}/core/services/block_converter.py +0 -0
  89. {focomy-0.1.108 → focomy-0.1.110}/core/services/bulk.py +0 -0
  90. {focomy-0.1.108 → focomy-0.1.110}/core/services/cache.py +0 -0
  91. {focomy-0.1.108 → focomy-0.1.110}/core/services/cleanup.py +0 -0
  92. {focomy-0.1.108 → focomy-0.1.110}/core/services/comment.py +0 -0
  93. {focomy-0.1.108 → focomy-0.1.110}/core/services/config_priority.py +0 -0
  94. {focomy-0.1.108 → focomy-0.1.110}/core/services/deployment.py +0 -0
  95. {focomy-0.1.108 → focomy-0.1.110}/core/services/edit_lock.py +0 -0
  96. {focomy-0.1.108 → focomy-0.1.110}/core/services/entity.py +0 -0
  97. {focomy-0.1.108 → focomy-0.1.110}/core/services/export.py +0 -0
  98. {focomy-0.1.108 → focomy-0.1.110}/core/services/field.py +0 -0
  99. {focomy-0.1.108 → focomy-0.1.110}/core/services/formula.py +0 -0
  100. {focomy-0.1.108 → focomy-0.1.110}/core/services/i18n.py +0 -0
  101. {focomy-0.1.108 → focomy-0.1.110}/core/services/index.py +0 -0
  102. {focomy-0.1.108 → focomy-0.1.110}/core/services/invite.py +0 -0
  103. {focomy-0.1.108 → focomy-0.1.110}/core/services/link_validator.py +0 -0
  104. {focomy-0.1.108 → focomy-0.1.110}/core/services/logging.py +0 -0
  105. {focomy-0.1.108 → focomy-0.1.110}/core/services/mail.py +0 -0
  106. {focomy-0.1.108 → focomy-0.1.110}/core/services/marketplace.py +0 -0
  107. {focomy-0.1.108 → focomy-0.1.110}/core/services/marketplace_verify.py +0 -0
  108. {focomy-0.1.108 → focomy-0.1.110}/core/services/media.py +0 -0
  109. {focomy-0.1.108 → focomy-0.1.110}/core/services/media_cleanup.py +0 -0
  110. {focomy-0.1.108 → focomy-0.1.110}/core/services/menu.py +0 -0
  111. {focomy-0.1.108 → focomy-0.1.110}/core/services/migration_helpers.py +0 -0
  112. {focomy-0.1.108 → focomy-0.1.110}/core/services/oauth.py +0 -0
  113. {focomy-0.1.108 → focomy-0.1.110}/core/services/pagination.py +0 -0
  114. {focomy-0.1.108 → focomy-0.1.110}/core/services/plugin_resolver.py +0 -0
  115. {focomy-0.1.108 → focomy-0.1.110}/core/services/plugin_sandbox.py +0 -0
  116. {focomy-0.1.108 → focomy-0.1.110}/core/services/preview.py +0 -0
  117. {focomy-0.1.108 → focomy-0.1.110}/core/services/query_optimizer.py +0 -0
  118. {focomy-0.1.108 → focomy-0.1.110}/core/services/rbac.py +0 -0
  119. {focomy-0.1.108 → focomy-0.1.110}/core/services/redirect.py +0 -0
  120. {focomy-0.1.108 → focomy-0.1.110}/core/services/relation.py +0 -0
  121. {focomy-0.1.108 → focomy-0.1.110}/core/services/revision.py +0 -0
  122. {focomy-0.1.108 → focomy-0.1.110}/core/services/routing.py +0 -0
  123. {focomy-0.1.108 → focomy-0.1.110}/core/services/sanitizer.py +0 -0
  124. {focomy-0.1.108 → focomy-0.1.110}/core/services/schedule.py +0 -0
  125. {focomy-0.1.108 → focomy-0.1.110}/core/services/search.py +0 -0
  126. {focomy-0.1.108 → focomy-0.1.110}/core/services/sentry.py +0 -0
  127. {focomy-0.1.108 → focomy-0.1.110}/core/services/seo.py +0 -0
  128. {focomy-0.1.108 → focomy-0.1.110}/core/services/settings.py +0 -0
  129. {focomy-0.1.108 → focomy-0.1.110}/core/services/spam_filter.py +0 -0
  130. {focomy-0.1.108 → focomy-0.1.110}/core/services/storage.py +0 -0
  131. {focomy-0.1.108 → focomy-0.1.110}/core/services/theme.py +0 -0
  132. {focomy-0.1.108 → focomy-0.1.110}/core/services/theme_inheritance.py +0 -0
  133. {focomy-0.1.108 → focomy-0.1.110}/core/services/thumbnail.py +0 -0
  134. {focomy-0.1.108 → focomy-0.1.110}/core/services/update.py +0 -0
  135. {focomy-0.1.108 → focomy-0.1.110}/core/services/widget.py +0 -0
  136. {focomy-0.1.108 → focomy-0.1.110}/core/services/wordpress_import/__init__.py +0 -0
  137. {focomy-0.1.108 → focomy-0.1.110}/core/services/wordpress_import/acf.py +0 -0
  138. {focomy-0.1.108 → focomy-0.1.110}/core/services/wordpress_import/analyzer.py +0 -0
  139. {focomy-0.1.108 → focomy-0.1.110}/core/services/wordpress_import/constants.py +0 -0
  140. {focomy-0.1.108 → focomy-0.1.110}/core/services/wordpress_import/content_sanitizer.py +0 -0
  141. {focomy-0.1.108 → focomy-0.1.110}/core/services/wordpress_import/diff_detector.py +0 -0
  142. {focomy-0.1.108 → focomy-0.1.110}/core/services/wordpress_import/dry_run.py +0 -0
  143. {focomy-0.1.108 → focomy-0.1.110}/core/services/wordpress_import/error_collector.py +0 -0
  144. {focomy-0.1.108 → focomy-0.1.110}/core/services/wordpress_import/id_resolver.py +0 -0
  145. {focomy-0.1.108 → focomy-0.1.110}/core/services/wordpress_import/import_service.py +0 -0
  146. {focomy-0.1.108 → focomy-0.1.110}/core/services/wordpress_import/importer.py +0 -0
  147. {focomy-0.1.108 → focomy-0.1.110}/core/services/wordpress_import/link_fixer.py +0 -0
  148. {focomy-0.1.108 → focomy-0.1.110}/core/services/wordpress_import/media.py +0 -0
  149. {focomy-0.1.108 → focomy-0.1.110}/core/services/wordpress_import/preview.py +0 -0
  150. {focomy-0.1.108 → focomy-0.1.110}/core/services/wordpress_import/redirects.py +0 -0
  151. {focomy-0.1.108 → focomy-0.1.110}/core/services/wordpress_import/rest_client.py +0 -0
  152. {focomy-0.1.108 → focomy-0.1.110}/core/services/wordpress_import/rollback.py +0 -0
  153. {focomy-0.1.108 → focomy-0.1.110}/core/services/wordpress_import/verification.py +0 -0
  154. {focomy-0.1.108 → focomy-0.1.110}/core/services/wordpress_import/wxr_parser.py +0 -0
  155. {focomy-0.1.108 → focomy-0.1.110}/core/services/workflow.py +0 -0
  156. {focomy-0.1.108 → focomy-0.1.110}/core/templates/admin/backup.html +0 -0
  157. {focomy-0.1.108 → focomy-0.1.110}/core/templates/admin/base.html +0 -0
  158. {focomy-0.1.108 → focomy-0.1.110}/core/templates/admin/comments.html +0 -0
  159. {focomy-0.1.108 → focomy-0.1.110}/core/templates/admin/components/editor.html +0 -0
  160. {focomy-0.1.108 → focomy-0.1.110}/core/templates/admin/customize.html +0 -0
  161. {focomy-0.1.108 → focomy-0.1.110}/core/templates/admin/dashboard.html +0 -0
  162. {focomy-0.1.108 → focomy-0.1.110}/core/templates/admin/entity_form.html +0 -0
  163. {focomy-0.1.108 → focomy-0.1.110}/core/templates/admin/entity_list.html +0 -0
  164. {focomy-0.1.108 → focomy-0.1.110}/core/templates/admin/forgot_password.html +0 -0
  165. {focomy-0.1.108 → focomy-0.1.110}/core/templates/admin/import.html +0 -0
  166. {focomy-0.1.108 → focomy-0.1.110}/core/templates/admin/link_validator.html +0 -0
  167. {focomy-0.1.108 → focomy-0.1.110}/core/templates/admin/login.html +0 -0
  168. {focomy-0.1.108 → focomy-0.1.110}/core/templates/admin/media.html +0 -0
  169. {focomy-0.1.108 → focomy-0.1.110}/core/templates/admin/menus.html +0 -0
  170. {focomy-0.1.108 → focomy-0.1.110}/core/templates/admin/plugins.html +0 -0
  171. {focomy-0.1.108 → focomy-0.1.110}/core/templates/admin/redirects.html +0 -0
  172. {focomy-0.1.108 → focomy-0.1.110}/core/templates/admin/reset_password.html +0 -0
  173. {focomy-0.1.108 → focomy-0.1.110}/core/templates/admin/settings.html +0 -0
  174. {focomy-0.1.108 → focomy-0.1.110}/core/templates/admin/sitemap.html +0 -0
  175. {focomy-0.1.108 → focomy-0.1.110}/core/templates/admin/system.html +0 -0
  176. {focomy-0.1.108 → focomy-0.1.110}/core/templates/admin/themes.html +0 -0
  177. {focomy-0.1.108 → focomy-0.1.110}/core/templates/admin/widgets.html +0 -0
  178. {focomy-0.1.108 → focomy-0.1.110}/core/themes/__init__.py +0 -0
  179. {focomy-0.1.108 → focomy-0.1.110}/core/themes/customizer.py +0 -0
  180. {focomy-0.1.108 → focomy-0.1.110}/core/themes/manager.py +0 -0
  181. {focomy-0.1.108 → focomy-0.1.110}/core/themes/marketplace.py +0 -0
  182. {focomy-0.1.108 → focomy-0.1.110}/static/favicon.svg +0 -0
  183. {focomy-0.1.108 → focomy-0.1.110}/themes/blog/templates/base.html +0 -0
  184. {focomy-0.1.108 → focomy-0.1.110}/themes/blog/templates/home.html +0 -0
  185. {focomy-0.1.108 → focomy-0.1.110}/themes/blog/templates/post.html +0 -0
  186. {focomy-0.1.108 → focomy-0.1.110}/themes/blog/theme.yaml +0 -0
  187. {focomy-0.1.108 → focomy-0.1.110}/themes/corporate/templates/base.html +0 -0
  188. {focomy-0.1.108 → focomy-0.1.110}/themes/corporate/templates/home.html +0 -0
  189. {focomy-0.1.108 → focomy-0.1.110}/themes/corporate/templates/page.html +0 -0
  190. {focomy-0.1.108 → focomy-0.1.110}/themes/corporate/theme.yaml +0 -0
  191. {focomy-0.1.108 → focomy-0.1.110}/themes/default/templates/404.html +0 -0
  192. {focomy-0.1.108 → focomy-0.1.110}/themes/default/templates/500.html +0 -0
  193. {focomy-0.1.108 → focomy-0.1.110}/themes/default/templates/archive.html +0 -0
  194. {focomy-0.1.108 → focomy-0.1.110}/themes/default/templates/base.html +0 -0
  195. {focomy-0.1.108 → focomy-0.1.110}/themes/default/templates/category.html +0 -0
  196. {focomy-0.1.108 → focomy-0.1.110}/themes/default/templates/channel.html +0 -0
  197. {focomy-0.1.108 → focomy-0.1.110}/themes/default/templates/form.html +63 -63
  198. {focomy-0.1.108 → focomy-0.1.110}/themes/default/templates/form_success.html +0 -0
  199. {focomy-0.1.108 → focomy-0.1.110}/themes/default/templates/home.html +0 -0
  200. {focomy-0.1.108 → focomy-0.1.110}/themes/default/templates/page.html +0 -0
  201. {focomy-0.1.108 → focomy-0.1.110}/themes/default/templates/post.html +0 -0
  202. {focomy-0.1.108 → focomy-0.1.110}/themes/default/templates/search.html +0 -0
  203. {focomy-0.1.108 → focomy-0.1.110}/themes/default/templates/series.html +0 -0
  204. {focomy-0.1.108 → focomy-0.1.110}/themes/default/theme.yaml +0 -0
  205. {focomy-0.1.108 → focomy-0.1.110}/themes/minimal/templates/base.html +0 -0
  206. {focomy-0.1.108 → focomy-0.1.110}/themes/minimal/templates/home.html +0 -0
  207. {focomy-0.1.108 → focomy-0.1.110}/themes/minimal/templates/page.html +0 -0
  208. {focomy-0.1.108 → focomy-0.1.110}/themes/minimal/templates/post.html +0 -0
  209. {focomy-0.1.108 → focomy-0.1.110}/themes/minimal/theme.yaml +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: focomy
3
- Version: 0.1.108
3
+ Version: 0.1.110
4
4
  Summary: The Most Beautiful CMS - A metadata-driven, zero-duplicate-code content management system
5
5
  Project-URL: Homepage, https://github.com/focomy/focomy
6
6
  Project-URL: Documentation, https://focomy.dev/docs
@@ -48,7 +48,8 @@ def require_feature(feature: str) -> None:
48
48
  async def is_feature_enabled_async(feature: str, db) -> bool:
49
49
  """Check if a feature is enabled (async version, DB-first).
50
50
 
51
- Priority: DB settings > config.yaml > False
51
+ Priority: DB settings > code default (True)
52
+ Note: config.yaml is ignored for features to allow DB override without restart.
52
53
 
53
54
  Args:
54
55
  feature: Feature name (e.g., 'form', 'comment')
@@ -57,10 +58,11 @@ async def is_feature_enabled_async(feature: str, db) -> bool:
57
58
  Returns:
58
59
  True if feature is enabled, False otherwise
59
60
  """
60
- from .services.settings import SettingsService
61
+ from .services.settings import SettingsService, DEFAULT_SETTINGS
61
62
 
62
63
  settings_svc = SettingsService(db)
63
- db_value = await settings_svc.get(f"features.{feature}")
64
+ # Check DB directly (not through get() which includes config.yaml)
65
+ db_value = await settings_svc._get_db_value(f"features.{feature}")
64
66
 
65
67
  if db_value is not None:
66
68
  # DB value exists, use it
@@ -70,8 +72,8 @@ async def is_feature_enabled_async(feature: str, db) -> bool:
70
72
  return db_value.lower() in ("true", "1", "yes")
71
73
  return bool(db_value)
72
74
 
73
- # Fallback to config.yaml
74
- return is_feature_enabled(feature)
75
+ # Fallback to code default (ignore config.yaml)
76
+ return DEFAULT_SETTINGS.get("features", {}).get(feature, True)
75
77
 
76
78
 
77
79
  async def require_feature_async(feature: str, db) -> None:
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "focomy"
7
- version = "0.1.108"
7
+ version = "0.1.110"
8
8
  description = "The Most Beautiful CMS - A metadata-driven, zero-duplicate-code content management system"
9
9
  readme = "README.md"
10
10
  license = "MIT"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -1,68 +1,5 @@
1
1
  {% extends "base.html" %}
2
2
 
3
- {% block title %}{{ form.title }} - {{ site_name }}{% endblock %}
4
-
5
- {% block content %}
6
- <div class="form-page">
7
- <header class="form-header">
8
- <h1>{{ form.title }}</h1>
9
- {% if form.description %}
10
- <p class="form-description">{{ form.description }}</p>
11
- {% endif %}
12
- </header>
13
-
14
- <form id="dynamic-form" method="POST" action="/forms/{{ form.slug }}" class="dynamic-form">
15
- <input type="hidden" name="csrf_token" value="{{ csrf_token }}">
16
-
17
- {% if steps and steps|length > 1 %}
18
- <!-- ウィザード形式 -->
19
- <div class="wizard">
20
- <div class="wizard-progress">
21
- {% for step in steps %}
22
- <div class="wizard-step {% if loop.first %}active{% endif %}" data-step="{{ loop.index }}">
23
- <span class="step-number">{{ loop.index }}</span>
24
- <span class="step-title">{{ step.title }}</span>
25
- </div>
26
- {% endfor %}
27
- </div>
28
-
29
- {% for step in steps %}
30
- <div class="wizard-panel {% if loop.first %}active{% endif %}" data-step="{{ loop.index }}">
31
- <h2 class="step-heading">{{ step.title }}</h2>
32
- {% for field in fields %}
33
- {% if field.name in step.fields %}
34
- {{ render_field(field) }}
35
- {% endif %}
36
- {% endfor %}
37
-
38
- <div class="wizard-nav">
39
- {% if not loop.first %}
40
- <button type="button" class="btn btn-secondary prev-step">戻る</button>
41
- {% endif %}
42
- {% if loop.last %}
43
- <button type="submit" class="btn btn-primary">{{ form.submit_label or '送信する' }}</button>
44
- {% else %}
45
- <button type="button" class="btn btn-primary next-step">次へ</button>
46
- {% endif %}
47
- </div>
48
- </div>
49
- {% endfor %}
50
- </div>
51
- {% else %}
52
- <!-- 通常フォーム -->
53
- <div class="form-fields">
54
- {% for field in fields %}
55
- {{ render_field(field) }}
56
- {% endfor %}
57
- </div>
58
-
59
- <div class="form-actions">
60
- <button type="submit" class="btn btn-primary">{{ form.submit_label or '送信する' }}</button>
61
- </div>
62
- {% endif %}
63
- </form>
64
- </div>
65
-
66
3
  {% macro render_field(field) %}
67
4
  <div class="form-group">
68
5
  <label for="{{ field.name }}">
@@ -134,6 +71,69 @@
134
71
  </div>
135
72
  {% endmacro %}
136
73
 
74
+ {% block title %}{{ form.title }} - {{ site_name }}{% endblock %}
75
+
76
+ {% block content %}
77
+ <div class="form-page">
78
+ <header class="form-header">
79
+ <h1>{{ form.title }}</h1>
80
+ {% if form.description %}
81
+ <p class="form-description">{{ form.description }}</p>
82
+ {% endif %}
83
+ </header>
84
+
85
+ <form id="dynamic-form" method="POST" action="/forms/{{ form.slug }}" class="dynamic-form">
86
+ <input type="hidden" name="csrf_token" value="{{ csrf_token }}">
87
+
88
+ {% if steps and steps|length > 1 %}
89
+ <!-- ウィザード形式 -->
90
+ <div class="wizard">
91
+ <div class="wizard-progress">
92
+ {% for step in steps %}
93
+ <div class="wizard-step {% if loop.first %}active{% endif %}" data-step="{{ loop.index }}">
94
+ <span class="step-number">{{ loop.index }}</span>
95
+ <span class="step-title">{{ step.title }}</span>
96
+ </div>
97
+ {% endfor %}
98
+ </div>
99
+
100
+ {% for step in steps %}
101
+ <div class="wizard-panel {% if loop.first %}active{% endif %}" data-step="{{ loop.index }}">
102
+ <h2 class="step-heading">{{ step.title }}</h2>
103
+ {% for field in fields %}
104
+ {% if field.name in step.fields %}
105
+ {{ render_field(field) }}
106
+ {% endif %}
107
+ {% endfor %}
108
+
109
+ <div class="wizard-nav">
110
+ {% if not loop.first %}
111
+ <button type="button" class="btn btn-secondary prev-step">戻る</button>
112
+ {% endif %}
113
+ {% if loop.last %}
114
+ <button type="submit" class="btn btn-primary">{{ form.submit_label or '送信する' }}</button>
115
+ {% else %}
116
+ <button type="button" class="btn btn-primary next-step">次へ</button>
117
+ {% endif %}
118
+ </div>
119
+ </div>
120
+ {% endfor %}
121
+ </div>
122
+ {% else %}
123
+ <!-- 通常フォーム -->
124
+ <div class="form-fields">
125
+ {% for field in fields %}
126
+ {{ render_field(field) }}
127
+ {% endfor %}
128
+ </div>
129
+
130
+ <div class="form-actions">
131
+ <button type="submit" class="btn btn-primary">{{ form.submit_label or '送信する' }}</button>
132
+ </div>
133
+ {% endif %}
134
+ </form>
135
+ </div>
136
+
137
137
  <style>
138
138
  .form-page {
139
139
  max-width: 600px;