iron-cms 0.1.0
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.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/README.md +174 -0
- data/Rakefile +8 -0
- data/app/assets/builds/iron.css +2 -0
- data/app/assets/config/iron_manifest.js +1 -0
- data/app/assets/images/iron/icons/sprite.svg +9425 -0
- data/app/assets/tailwind/iron/actiontext.css +550 -0
- data/app/assets/tailwind/iron/application.css +66 -0
- data/app/assets/tailwind/iron/components/button.css +74 -0
- data/app/assets/tailwind/iron/components/dropdown.css +42 -0
- data/app/assets/tailwind/iron/components/fieldset.css +18 -0
- data/app/assets/tailwind/iron/components/form.css +14 -0
- data/app/assets/tailwind/iron/components/icon-picker.css +9 -0
- data/app/assets/tailwind/iron/components/input.css +44 -0
- data/app/assets/tailwind/iron/components/page.css +7 -0
- data/app/assets/tailwind/iron/components/select.css +36 -0
- data/app/assets/tailwind/iron/components/sidebar.css +21 -0
- data/app/assets/tailwind/iron/components/textarea.css +27 -0
- data/app/controllers/concerns/iron/authentication.rb +66 -0
- data/app/controllers/concerns/iron/authorization.rb +11 -0
- data/app/controllers/concerns/iron/locale_aware.rb +20 -0
- data/app/controllers/concerns/iron/web_page.rb +18 -0
- data/app/controllers/iron/application_controller.rb +7 -0
- data/app/controllers/iron/block_definitions/field_definitions_controller.rb +8 -0
- data/app/controllers/iron/block_definitions_controller.rb +52 -0
- data/app/controllers/iron/blocks_controller.rb +12 -0
- data/app/controllers/iron/content_types/field_definitions_controller.rb +8 -0
- data/app/controllers/iron/content_types_controller.rb +52 -0
- data/app/controllers/iron/entries_controller.rb +103 -0
- data/app/controllers/iron/field_definitions_controller.rb +55 -0
- data/app/controllers/iron/first_runs_controller.rb +29 -0
- data/app/controllers/iron/home_controller.rb +6 -0
- data/app/controllers/iron/icons_controller.rb +10 -0
- data/app/controllers/iron/locales_controller.rb +52 -0
- data/app/controllers/iron/passwords_controller.rb +36 -0
- data/app/controllers/iron/references_controller.rb +11 -0
- data/app/controllers/iron/schemas_controller.rb +32 -0
- data/app/controllers/iron/sessions_controller.rb +32 -0
- data/app/controllers/iron/settings_controller.rb +23 -0
- data/app/controllers/iron/users_controller.rb +66 -0
- data/app/helpers/iron/application_helper.rb +25 -0
- data/app/helpers/iron/avatar_helper.rb +35 -0
- data/app/helpers/iron/block_helper.rb +4 -0
- data/app/helpers/iron/buttons_helper.rb +14 -0
- data/app/helpers/iron/components/badge_helper.rb +70 -0
- data/app/helpers/iron/components/dropdown_helper.rb +161 -0
- data/app/helpers/iron/content_types_helper.rb +11 -0
- data/app/helpers/iron/entries_helper.rb +13 -0
- data/app/helpers/iron/field_definitions_helper.rb +5 -0
- data/app/helpers/iron/form_builder.rb +43 -0
- data/app/helpers/iron/icons_helper.rb +30 -0
- data/app/helpers/iron/image_helper.rb +50 -0
- data/app/javascript/iron/application.js +6 -0
- data/app/javascript/iron/controllers/application.js +9 -0
- data/app/javascript/iron/controllers/element_controller.js +11 -0
- data/app/javascript/iron/controllers/file_upload_controller.js +18 -0
- data/app/javascript/iron/controllers/form_controller.js +7 -0
- data/app/javascript/iron/controllers/handle_controller.js +27 -0
- data/app/javascript/iron/controllers/icon_picker_controller.js +48 -0
- data/app/javascript/iron/controllers/index.js +4 -0
- data/app/javascript/iron/controllers/sortable_list_controller.js +125 -0
- data/app/javascript/iron/controllers/toggle_controller.js +14 -0
- data/app/javascript/iron/controllers/trix_controller.js +19 -0
- data/app/javascript/iron/lib/lexorank.js +51 -0
- data/app/jobs/iron/application_job.rb +4 -0
- data/app/jobs/iron/generate_entry_routes_job.rb +15 -0
- data/app/mailers/iron/application_mailer.rb +6 -0
- data/app/mailers/passwords_mailer.rb +6 -0
- data/app/models/concerns/iron/csv_serializable.rb +28 -0
- data/app/models/iron/account/joinable.rb +16 -0
- data/app/models/iron/account.rb +13 -0
- data/app/models/iron/application_record.rb +5 -0
- data/app/models/iron/block_definition/portable.rb +20 -0
- data/app/models/iron/block_definition.rb +10 -0
- data/app/models/iron/content_type/field_queryable.rb +101 -0
- data/app/models/iron/content_type/portable.rb +30 -0
- data/app/models/iron/content_type/titlable.rb +13 -0
- data/app/models/iron/content_type/web_publishable.rb +47 -0
- data/app/models/iron/content_type.rb +39 -0
- data/app/models/iron/content_types/collection.rb +6 -0
- data/app/models/iron/content_types/single.rb +9 -0
- data/app/models/iron/current.rb +12 -0
- data/app/models/iron/entry/deep_validation.rb +32 -0
- data/app/models/iron/entry/presentable.rb +40 -0
- data/app/models/iron/entry/schemable.rb +16 -0
- data/app/models/iron/entry/titlable.rb +35 -0
- data/app/models/iron/entry/web_publishable.rb +85 -0
- data/app/models/iron/entry.rb +16 -0
- data/app/models/iron/field/belongs_to_entry.rb +29 -0
- data/app/models/iron/field.rb +20 -0
- data/app/models/iron/field_definition/portable.rb +36 -0
- data/app/models/iron/field_definition.rb +42 -0
- data/app/models/iron/field_definitions/block.rb +23 -0
- data/app/models/iron/field_definitions/block_list.rb +8 -0
- data/app/models/iron/field_definitions/boolean.rb +7 -0
- data/app/models/iron/field_definitions/date.rb +7 -0
- data/app/models/iron/field_definitions/file.rb +67 -0
- data/app/models/iron/field_definitions/number.rb +7 -0
- data/app/models/iron/field_definitions/reference.rb +8 -0
- data/app/models/iron/field_definitions/reference_list.rb +8 -0
- data/app/models/iron/field_definitions/rich_text_area.rb +4 -0
- data/app/models/iron/field_definitions/text_area.rb +7 -0
- data/app/models/iron/field_definitions/text_field.rb +25 -0
- data/app/models/iron/fields/block.rb +40 -0
- data/app/models/iron/fields/block_list.rb +16 -0
- data/app/models/iron/fields/boolean.rb +7 -0
- data/app/models/iron/fields/date.rb +7 -0
- data/app/models/iron/fields/file.rb +29 -0
- data/app/models/iron/fields/number.rb +7 -0
- data/app/models/iron/fields/reference.rb +14 -0
- data/app/models/iron/fields/reference_list.rb +17 -0
- data/app/models/iron/fields/rich_text_area.rb +9 -0
- data/app/models/iron/fields/text_area.rb +7 -0
- data/app/models/iron/fields/text_field.rb +19 -0
- data/app/models/iron/first_run.rb +13 -0
- data/app/models/iron/icon_catalog.rb +45 -0
- data/app/models/iron/locale.rb +30 -0
- data/app/models/iron/reference.rb +8 -0
- data/app/models/iron/schema_archive.rb +71 -0
- data/app/models/iron/schema_exporter.rb +15 -0
- data/app/models/iron/schema_importer.rb +278 -0
- data/app/models/iron/session.rb +5 -0
- data/app/models/iron/user/role.rb +21 -0
- data/app/models/iron/user.rb +37 -0
- data/app/views/active_storage/blobs/_blob.html.erb +14 -0
- data/app/views/iron/block_definitions/_block_definition.html.erb +21 -0
- data/app/views/iron/block_definitions/_form.html.erb +46 -0
- data/app/views/iron/block_definitions/edit.html.erb +8 -0
- data/app/views/iron/block_definitions/index.html.erb +18 -0
- data/app/views/iron/block_definitions/new.html.erb +8 -0
- data/app/views/iron/block_definitions/show.html.erb +34 -0
- data/app/views/iron/blocks/new.turbo_stream.erb +6 -0
- data/app/views/iron/content_types/_content_type.html.erb +21 -0
- data/app/views/iron/content_types/_form.html.erb +137 -0
- data/app/views/iron/content_types/edit.html.erb +8 -0
- data/app/views/iron/content_types/index.html.erb +28 -0
- data/app/views/iron/content_types/new.html.erb +8 -0
- data/app/views/iron/content_types/show.html.erb +49 -0
- data/app/views/iron/entries/_entry.html.erb +17 -0
- data/app/views/iron/entries/_entry_option.html.erb +19 -0
- data/app/views/iron/entries/_form.html.erb +63 -0
- data/app/views/iron/entries/edit.html.erb +52 -0
- data/app/views/iron/entries/entry.html.erb +21 -0
- data/app/views/iron/entries/fields/_block.html.erb +92 -0
- data/app/views/iron/entries/fields/_block_list.html.erb +45 -0
- data/app/views/iron/entries/fields/_boolean.html.erb +13 -0
- data/app/views/iron/entries/fields/_date.html.erb +11 -0
- data/app/views/iron/entries/fields/_file.html.erb +60 -0
- data/app/views/iron/entries/fields/_number.html.erb +11 -0
- data/app/views/iron/entries/fields/_reference.html.erb +12 -0
- data/app/views/iron/entries/fields/_reference_item.html.erb +28 -0
- data/app/views/iron/entries/fields/_reference_list.html.erb +44 -0
- data/app/views/iron/entries/fields/_rich_text_area.html.erb +13 -0
- data/app/views/iron/entries/fields/_text_area.html.erb +11 -0
- data/app/views/iron/entries/fields/_text_field.html.erb +28 -0
- data/app/views/iron/entries/index.html.erb +21 -0
- data/app/views/iron/entries/new.html.erb +8 -0
- data/app/views/iron/entries/search.html.erb +33 -0
- data/app/views/iron/field_definitions/_field_definition.html.erb +37 -0
- data/app/views/iron/field_definitions/block/_form.html.erb +16 -0
- data/app/views/iron/field_definitions/block_list/_form.html.erb +13 -0
- data/app/views/iron/field_definitions/boolean/_form.html.erb +2 -0
- data/app/views/iron/field_definitions/date/_form.html.erb +2 -0
- data/app/views/iron/field_definitions/edit.html.erb +16 -0
- data/app/views/iron/field_definitions/file/_form.html.erb +40 -0
- data/app/views/iron/field_definitions/index.html.erb +14 -0
- data/app/views/iron/field_definitions/layouts/_form.html.erb +47 -0
- data/app/views/iron/field_definitions/new.html.erb +22 -0
- data/app/views/iron/field_definitions/number/_form.html.erb +2 -0
- data/app/views/iron/field_definitions/reference/_form.html.erb +13 -0
- data/app/views/iron/field_definitions/reference_list/_form.html.erb +13 -0
- data/app/views/iron/field_definitions/rich_text_area/_form.html.erb +2 -0
- data/app/views/iron/field_definitions/text_area/_form.html.erb +2 -0
- data/app/views/iron/field_definitions/text_field/_form.html.erb +17 -0
- data/app/views/iron/first_runs/show.html.erb +44 -0
- data/app/views/iron/home/show.html.erb +2 -0
- data/app/views/iron/icons/index.html.erb +21 -0
- data/app/views/iron/locales/_form.html.erb +24 -0
- data/app/views/iron/locales/_locale.html.erb +15 -0
- data/app/views/iron/locales/edit.html.erb +8 -0
- data/app/views/iron/locales/index.html.erb +12 -0
- data/app/views/iron/locales/new.html.erb +8 -0
- data/app/views/iron/passwords/edit.html.erb +7 -0
- data/app/views/iron/passwords/new.html.erb +26 -0
- data/app/views/iron/passwords_mailer/reset.html.erb +4 -0
- data/app/views/iron/passwords_mailer/reset.text.erb +2 -0
- data/app/views/iron/published_pages/show.html.erb +10 -0
- data/app/views/iron/references/new.turbo_stream.erb +6 -0
- data/app/views/iron/schemas/new.html.erb +57 -0
- data/app/views/iron/sessions/new.html.erb +36 -0
- data/app/views/iron/settings/show.html.erb +38 -0
- data/app/views/iron/shared/_icon_picker.html.erb +60 -0
- data/app/views/iron/users/_form.html.erb +21 -0
- data/app/views/iron/users/_user.html.erb +27 -0
- data/app/views/iron/users/edit.html.erb +12 -0
- data/app/views/iron/users/index.html.erb +21 -0
- data/app/views/iron/users/new.html.erb +29 -0
- data/app/views/iron/users/show.html.erb +21 -0
- data/app/views/layouts/action_text/contents/_content.html.erb +3 -0
- data/app/views/layouts/iron/_sidebar.html.erb +83 -0
- data/app/views/layouts/iron/_sidebar_item.html.erb +14 -0
- data/app/views/layouts/iron/_toast.html.erb +29 -0
- data/app/views/layouts/iron/application.html.erb +46 -0
- data/app/views/layouts/iron/authentication.html.erb +41 -0
- data/config/importmap.rb +9 -0
- data/config/routes.rb +40 -0
- data/db/migrate/20250422131656_initial_iron_schema.rb +105 -0
- data/db/migrate/20250427100754_create_iron_accounts.rb +10 -0
- data/db/migrate/20250427104020_add_role_to_iron_users.rb +5 -0
- data/db/migrate/20250428094923_add_default_iron_locale_to_iron_account.rb +5 -0
- data/db/migrate/20250504144731_create_join_table_content_types_field_definitions.rb +25 -0
- data/db/migrate/20250505090716_add_title_field_definition_to_iron_content_types.rb +5 -0
- data/db/migrate/20250512210352_create_iron_references.rb +11 -0
- data/db/migrate/20250524220355_add_referenced_entry_id_to_iron_fields.rb +5 -0
- data/db/migrate/20250529211703_add_metadata_to_iron_field_definitions.rb +5 -0
- data/db/migrate/20250529211704_add_value_boolean_to_iron_fields.rb +5 -0
- data/db/migrate/20250531172837_add_type_to_iron_content_types.rb +5 -0
- data/db/migrate/20250601080146_add_icon_to_iron_content_types.rb +5 -0
- data/db/migrate/20250609091605_add_web_publishing_to_iron_content_types.rb +7 -0
- data/db/migrate/20250609091813_add_route_to_iron_entries.rb +6 -0
- data/lib/generators/iron/pages/pages_generator.rb +34 -0
- data/lib/generators/iron/pages/templates/pages_controller.rb +14 -0
- data/lib/generators/iron/pages/templates/show.html.erb +9 -0
- data/lib/generators/iron/template/template_generator.rb +35 -0
- data/lib/generators/iron/template/templates/content_type.html.erb +5 -0
- data/lib/iron/cva.rb +69 -0
- data/lib/iron/engine.rb +42 -0
- data/lib/iron/image_analyzer.rb +26 -0
- data/lib/iron/lexorank/exceptions.rb +4 -0
- data/lib/iron/lexorank/rankable.rb +185 -0
- data/lib/iron/lexorank/rebalance_rank_job.rb +10 -0
- data/lib/iron/lexorank/utils.rb +77 -0
- data/lib/iron/lexorank.rb +7 -0
- data/lib/iron/routing.rb +66 -0
- data/lib/iron/sdk.rb +19 -0
- data/lib/iron/version.rb +3 -0
- data/lib/iron.rb +8 -0
- data/lib/puma/plugin/iron_tailwindcss.rb +78 -0
- metadata +458 -0
@@ -0,0 +1,21 @@
|
|
1
|
+
<% content_for :title, "Entries" %>
|
2
|
+
|
3
|
+
<div class="space-y-8">
|
4
|
+
<div class="flex justify-between items-center">
|
5
|
+
<h1 class="page-title"><%= @content_type.name %>
|
6
|
+
entries</h1>
|
7
|
+
<%= link_to "New #{@content_type.name}",
|
8
|
+
new_content_type_entry_path,
|
9
|
+
class: "btn" %>
|
10
|
+
</div>
|
11
|
+
|
12
|
+
<div
|
13
|
+
id="entries"
|
14
|
+
class="
|
15
|
+
bg-white dark:bg-stone-800/50 rounded-lg shadow-sm divide-y divide-stone-200
|
16
|
+
dark:divide-stone-700/20 overflow-hidden
|
17
|
+
"
|
18
|
+
>
|
19
|
+
<%= render @entries %>
|
20
|
+
</div>
|
21
|
+
</div>
|
@@ -0,0 +1,8 @@
|
|
1
|
+
<% content_for :title, "New entry" %>
|
2
|
+
|
3
|
+
<div class="">
|
4
|
+
<%= back_button_to "#{@content_type.name} entries", content_type_entries_path(@content_type) %>
|
5
|
+
<h1 class="page-title">New <%= @content_type.name %></h1>
|
6
|
+
|
7
|
+
<%= render "form", entry: @entry, locale: @locale %>
|
8
|
+
</div>
|
@@ -0,0 +1,33 @@
|
|
1
|
+
<%= turbo_frame_tag "entries_picker" do %>
|
2
|
+
<div class="p-2">
|
3
|
+
<%= form_with url: entries_search_path, method: :get, data: { turbo_frame: "entries_search_results" } do |form| %>
|
4
|
+
<%= form.search_field :q,
|
5
|
+
value: params[:q],
|
6
|
+
id: "search_input_#{@reference_list_dom_id}",
|
7
|
+
oninput: "this.form.requestSubmit()",
|
8
|
+
placeholder: "Search entries",
|
9
|
+
autocomplete: "off",
|
10
|
+
data: {
|
11
|
+
controller: "element",
|
12
|
+
action: "turbo:frame-load@window->element#focus",
|
13
|
+
} %>
|
14
|
+
<%= form.hidden_field :reference_list_field_definition_id, value: @reference_list_field_definition_id %>
|
15
|
+
<%= form.hidden_field :form_field_name, value: @form_field_name %>
|
16
|
+
<%= form.hidden_field :reference_list_dom_id, value: @reference_list_dom_id %>
|
17
|
+
<% end %>
|
18
|
+
<%= turbo_frame_tag "entries_search_results" do %>
|
19
|
+
<div
|
20
|
+
id="entries"
|
21
|
+
class="rounded-lg shadow-sm divide-y divide-stone-200 dark:divide-stone-700/20 overflow-hidden mt-2"
|
22
|
+
>
|
23
|
+
<%= render partial: "entry_option",
|
24
|
+
collection: @entries,
|
25
|
+
as: :entry,
|
26
|
+
locals: {
|
27
|
+
reference_list_dom_id: @reference_list_dom_id,
|
28
|
+
form_field_name: @form_field_name
|
29
|
+
} %>
|
30
|
+
</div>
|
31
|
+
<% end %>
|
32
|
+
</div>
|
33
|
+
<% end %>
|
@@ -0,0 +1,37 @@
|
|
1
|
+
<li
|
2
|
+
id="<%= dom_id field_definition %>"
|
3
|
+
class="relative"
|
4
|
+
data-sortable-list-target="item"
|
5
|
+
>
|
6
|
+
<%= form_with model: field_definition.becomes(Iron::FieldDefinition),
|
7
|
+
data: { controller: "form", action: "change->form#submit" } do |form| %>
|
8
|
+
|
9
|
+
<%= form.hidden_field :rank, data: { sortable_list_target: "rank" } %>
|
10
|
+
|
11
|
+
<button
|
12
|
+
class="absolute left-2 top-1/2 -translate-y-1/2"
|
13
|
+
data-variant="plain"
|
14
|
+
data-sortable-list-target="handle"
|
15
|
+
>
|
16
|
+
<%= icon "grip-vertical", class: "text-stone-400" %>
|
17
|
+
</button>
|
18
|
+
|
19
|
+
<%= link_to edit_field_definition_path(field_definition), class: "block pl-16 pr-6 py-4 hover:bg-stone-50 dark:hover:bg-stone-800/50 transition-colors" do %>
|
20
|
+
<div class="flex items-center justify-between gap-4">
|
21
|
+
<div class="flex flex-col sm:flex-row sm:items-center sm:gap-8 min-w-0 flex-1">
|
22
|
+
<div class="flex items-center gap-3 shrink-0">
|
23
|
+
<h3 class="text-base font-semibold text-stone-900 dark:text-white truncate"><%= field_definition.name %></h3>
|
24
|
+
<%= badge field_definition.humanized_type,
|
25
|
+
color: :blue,
|
26
|
+
class: "hidden sm:inline-flex" %>
|
27
|
+
</div>
|
28
|
+
</div>
|
29
|
+
|
30
|
+
<div class="flex items-center gap-4">
|
31
|
+
<%= badge field_definition.humanized_type, color: :blue, class: "sm:hidden" %>
|
32
|
+
<%= icon "chevron-right", class: "text-stone-400 dark:text-stone-500" %>
|
33
|
+
</div>
|
34
|
+
</div>
|
35
|
+
<% end %>
|
36
|
+
<% end %>
|
37
|
+
</li>
|
@@ -0,0 +1,16 @@
|
|
1
|
+
<%= render layout: "iron/field_definitions/layouts/form", locals: { field_definition: field_definition } do |form| %>
|
2
|
+
<div class="my-2">
|
3
|
+
<%= form.label "supported_block_definition_id", "BlockDefinition" %>
|
4
|
+
<div class="max-w-2xs">
|
5
|
+
<%= form.collection_select :supported_block_definition_id,
|
6
|
+
Iron::BlockDefinition.all,
|
7
|
+
:id, :name,
|
8
|
+
{ prompt: "Select a block definition" },
|
9
|
+
{
|
10
|
+
name: "field_definition[supported_block_definition_ids][]",
|
11
|
+
class: "select"
|
12
|
+
} %>
|
13
|
+
|
14
|
+
</div>
|
15
|
+
</div>
|
16
|
+
<% end %>
|
@@ -0,0 +1,13 @@
|
|
1
|
+
<%= render layout: "iron/field_definitions/layouts/form", locals: { field_definition: field_definition } do |form| %>
|
2
|
+
<div class="field-definition">
|
3
|
+
<%= form.label :supported_block_definition_ids, "Supported blocks definitions" %>
|
4
|
+
<div class="flex flex-col">
|
5
|
+
<%= form.collection_check_boxes :supported_block_definition_ids, Iron::BlockDefinition.all, :id, :name do |b| %>
|
6
|
+
<div class="flex items-center space-x-2">
|
7
|
+
<%= b.check_box %>
|
8
|
+
<%= b.label %>
|
9
|
+
</div>
|
10
|
+
<% end %>
|
11
|
+
</div>
|
12
|
+
</div>
|
13
|
+
<% end %>
|
@@ -0,0 +1,16 @@
|
|
1
|
+
<% content_for :title, "Editing field" %>
|
2
|
+
|
3
|
+
<div class="">
|
4
|
+
<%= back_button_to @field_definition.schemable.name, @field_definition.schemable %>
|
5
|
+
<h1 class="page-title">Editing field</h1>
|
6
|
+
|
7
|
+
<%= render "iron/field_definitions/#{@field_definition.type_handle}/form",
|
8
|
+
field_definition: @field_definition %>
|
9
|
+
<%= button_to "Destroy",
|
10
|
+
field_definition_path(@field_definition),
|
11
|
+
method: :delete,
|
12
|
+
class: "btn mt-2",
|
13
|
+
data: {
|
14
|
+
color: "destructive",
|
15
|
+
} %>
|
16
|
+
</div>
|
@@ -0,0 +1,40 @@
|
|
1
|
+
<%= render layout: "iron/field_definitions/layouts/form", locals: { field_definition: field_definition } do |form| %>
|
2
|
+
<div class="space-y-6">
|
3
|
+
<fieldset class="field-definition">
|
4
|
+
<legend class="block text-sm font-medium leading-6 mb-2">
|
5
|
+
File type validation
|
6
|
+
</legend>
|
7
|
+
<div class="">
|
8
|
+
<div class="peer flex items-center">
|
9
|
+
<%= form.radio_button :file_scope, "specific", class: "mr-2" %>
|
10
|
+
<%= form.label :file_scope_specific, "Accept specific file types" %>
|
11
|
+
</div>
|
12
|
+
|
13
|
+
<div class="pl-4 hidden peer-has-[:checked]:block">
|
14
|
+
<% Iron::FieldDefinitions::File::FILE_TYPE_PRESETS.each do |preset_key, preset_config| %>
|
15
|
+
<label class="flex items-center">
|
16
|
+
<%= form.check_box :selected_presets,
|
17
|
+
{
|
18
|
+
multiple: true,
|
19
|
+
class: "mr-2",
|
20
|
+
checked:
|
21
|
+
field_definition.selected_presets.include?(preset_key),
|
22
|
+
},
|
23
|
+
preset_key,
|
24
|
+
nil %>
|
25
|
+
<span class="font-medium capitalize"><%= preset_key %></span>
|
26
|
+
<span class="text-xs text-stone-500 ml-2">
|
27
|
+
<%= preset_config[:extensions].first(3).join(", ") %><%= ", ..." if preset_config[:extensions].size > 3 %>
|
28
|
+
</span>
|
29
|
+
</label>
|
30
|
+
<% end %>
|
31
|
+
</div>
|
32
|
+
|
33
|
+
<div class="flex items-center">
|
34
|
+
<%= form.radio_button :file_scope, "all", class: "mr-2" %>
|
35
|
+
<%= form.label :file_scope_all, "Accept all file types" %>
|
36
|
+
</div>
|
37
|
+
</div>
|
38
|
+
</fieldset>
|
39
|
+
</div>
|
40
|
+
<% end %>
|
@@ -0,0 +1,14 @@
|
|
1
|
+
<% content_for :title, "Fields" %>
|
2
|
+
|
3
|
+
<h1>Fields</h1>
|
4
|
+
|
5
|
+
<div id="field_definitions">
|
6
|
+
<% @field_definitions.each do |field_definition| %>
|
7
|
+
<%= render field_definition %>
|
8
|
+
<p>
|
9
|
+
<%= link_to "Show this field", field_definition %>
|
10
|
+
</p>
|
11
|
+
<% end %>
|
12
|
+
</div>
|
13
|
+
|
14
|
+
<%= link_to "New field", new_field_definition_path %>
|
@@ -0,0 +1,47 @@
|
|
1
|
+
<%= form_with(
|
2
|
+
model: field_definition.persisted? ? field_definition.becomes(Iron::FieldDefinition) : [ field_definition.schemable, field_definition.becomes(Iron::FieldDefinition) ]
|
3
|
+
) do |form| %>
|
4
|
+
|
5
|
+
<% form.object = field_definition.becomes(field_definition.class) %>
|
6
|
+
|
7
|
+
<%= form.hidden_field :type %>
|
8
|
+
|
9
|
+
<div class="space-y-6">
|
10
|
+
<div
|
11
|
+
class="grid grid-cols-1 gap-6 sm:grid-cols-2"
|
12
|
+
data-controller="handle"
|
13
|
+
data-handle-automatic-value="<%= field_definition.new_record? %>"
|
14
|
+
>
|
15
|
+
<div class="field-definition">
|
16
|
+
<%= form.label :name %>
|
17
|
+
<div>
|
18
|
+
<%= form.text_field :name,
|
19
|
+
data: {
|
20
|
+
handle_target: "source",
|
21
|
+
action: "handle#handleize",
|
22
|
+
"1p-ignore": "",
|
23
|
+
} %>
|
24
|
+
<%= form.error_for :name %>
|
25
|
+
</div>
|
26
|
+
</div>
|
27
|
+
|
28
|
+
<div class="field-definition">
|
29
|
+
<%= form.label :handle %>
|
30
|
+
<div>
|
31
|
+
<%= form.text_field :handle,
|
32
|
+
data: {
|
33
|
+
handle_target: "destination",
|
34
|
+
action: "handle#edit",
|
35
|
+
} %>
|
36
|
+
<%= form.error_for :handle %>
|
37
|
+
</div>
|
38
|
+
</div>
|
39
|
+
</div>
|
40
|
+
|
41
|
+
<%= yield form %>
|
42
|
+
|
43
|
+
<div class="pt-2">
|
44
|
+
<%= form.submit form.object.persisted? ? "Update" : "Create" %>
|
45
|
+
</div>
|
46
|
+
</div>
|
47
|
+
<% end %>
|
@@ -0,0 +1,22 @@
|
|
1
|
+
<% content_for :title, "New field" %>
|
2
|
+
|
3
|
+
<div class="">
|
4
|
+
<%= back_button_to @field_definition.schemable.name, @field_definition.schemable %>
|
5
|
+
<h1 class="page-title">New field</h1>
|
6
|
+
|
7
|
+
<div class="max-w-2xl">
|
8
|
+
<div class="mt-6 mb-2 w-64">
|
9
|
+
<%= form_with(method: :get) do |form| %>
|
10
|
+
<%= form.select :type,
|
11
|
+
options_for_select(field_definition_type_options, @field_definition.type_handle),
|
12
|
+
{},
|
13
|
+
{ onchange: "this.form.requestSubmit()", class: "select" }
|
14
|
+
%>
|
15
|
+
<% end %>
|
16
|
+
</div>
|
17
|
+
|
18
|
+
<%= render "iron/field_definitions/#{@field_definition.type_handle}/form", field_definition: @field_definition %>
|
19
|
+
</div>
|
20
|
+
</div>
|
21
|
+
|
22
|
+
|
@@ -0,0 +1,13 @@
|
|
1
|
+
<%= render layout: "iron/field_definitions/layouts/form", locals: { field_definition: field_definition } do |form| %>
|
2
|
+
<div class="field-definition">
|
3
|
+
<%= form.label :supported_content_type_ids, "Supported content types" %>
|
4
|
+
<div class="flex flex-col">
|
5
|
+
<%= form.collection_check_boxes :supported_content_type_ids, Iron::ContentType.all, :id, :name do |b| %>
|
6
|
+
<div class="flex items-center space-x-2">
|
7
|
+
<%= b.check_box %>
|
8
|
+
<%= b.label %>
|
9
|
+
</div>
|
10
|
+
<% end %>
|
11
|
+
</div>
|
12
|
+
</div>
|
13
|
+
<% end %>
|
@@ -0,0 +1,13 @@
|
|
1
|
+
<%= render layout: "iron/field_definitions/layouts/form", locals: { field_definition: field_definition } do |form| %>
|
2
|
+
<div class="field-definition">
|
3
|
+
<%= form.label :supported_content_type_ids, "Supported content types" %>
|
4
|
+
<div class="flex flex-col">
|
5
|
+
<%= form.collection_check_boxes :supported_content_type_ids, Iron::ContentType.all, :id, :name do |b| %>
|
6
|
+
<div class="flex items-center space-x-2">
|
7
|
+
<%= b.check_box %>
|
8
|
+
<%= b.label %>
|
9
|
+
</div>
|
10
|
+
<% end %>
|
11
|
+
</div>
|
12
|
+
</div>
|
13
|
+
<% end %>
|
@@ -0,0 +1,17 @@
|
|
1
|
+
<%= render layout: "iron/field_definitions/layouts/form", locals: { field_definition: field_definition } do |form| %>
|
2
|
+
<div class="field-definition">
|
3
|
+
<%= form.check_box :required, class: "rounded border-stone-300" %>
|
4
|
+
<%= form.label :required, "Field is required" %>
|
5
|
+
</div>
|
6
|
+
|
7
|
+
<div class="field-definition">
|
8
|
+
<%= form.label :allowed_values_text, "Allowed values" %>
|
9
|
+
<div>
|
10
|
+
<%= form.text_area :allowed_values_text,
|
11
|
+
value: field_definition.allowed_values_text,
|
12
|
+
rows: 3,
|
13
|
+
class: "input" %>
|
14
|
+
<p class="text-xs text-stone-500">One value per line, leave blank to allow any value</p>
|
15
|
+
</div>
|
16
|
+
</div>
|
17
|
+
<% end %>
|
@@ -0,0 +1,44 @@
|
|
1
|
+
<div>
|
2
|
+
<div class="mb-8 text-center">
|
3
|
+
<h1 class="text-2xl font-semibold tracking-tight">Create your account</h1>
|
4
|
+
<p class="mt-2 text-sm text-stone-600 dark:text-stone-400">Start managing your content with Iron CMS</p>
|
5
|
+
</div>
|
6
|
+
|
7
|
+
<%= form_with(model: @user, url: first_run_path, class: "space-y-6") do |form| %>
|
8
|
+
<% if @user.errors.any? %>
|
9
|
+
<div class="rounded-md bg-red-50 p-4 dark:bg-red-900/50">
|
10
|
+
<div class="flex">
|
11
|
+
<div class="ml-3">
|
12
|
+
<h3 class="text-sm font-medium text-red-800 dark:text-red-200">
|
13
|
+
<%= pluralize(@user.errors.count, "error") %> prohibited this user from being saved:
|
14
|
+
</h3>
|
15
|
+
<div class="mt-2 text-sm text-red-700 dark:text-red-200">
|
16
|
+
<ul class="list-disc space-y-1 pl-5">
|
17
|
+
<% @user.errors.full_messages.each do |message| %>
|
18
|
+
<li><%= message %></li>
|
19
|
+
<% end %>
|
20
|
+
</ul>
|
21
|
+
</div>
|
22
|
+
</div>
|
23
|
+
</div>
|
24
|
+
</div>
|
25
|
+
<% end %>
|
26
|
+
|
27
|
+
<div>
|
28
|
+
<%= form.label :email_address %>
|
29
|
+
<%= form.email_field :email_address, required: true, autofocus: true, autocomplete: "email" %>
|
30
|
+
</div>
|
31
|
+
|
32
|
+
<div>
|
33
|
+
<%= form.label :password %>
|
34
|
+
<%= form.password_field :password, required: true, autocomplete: "new-password" %>
|
35
|
+
</div>
|
36
|
+
|
37
|
+
<div>
|
38
|
+
<%= form.label :password_confirmation %>
|
39
|
+
<%= form.password_field :password_confirmation, required: true, autocomplete: "new-password" %>
|
40
|
+
</div>
|
41
|
+
|
42
|
+
<%= form.submit "Create account" %>
|
43
|
+
<% end %>
|
44
|
+
</div>
|
@@ -0,0 +1,21 @@
|
|
1
|
+
<%= turbo_frame_tag "icon_picker_grid_#{params[:frame_id]}" do %>
|
2
|
+
<% cache Iron::IconCatalog.cache_key do %>
|
3
|
+
<div class="grid grid-cols-8 gap-2">
|
4
|
+
<% @icons.each do |icon_name| %>
|
5
|
+
<button
|
6
|
+
type="button"
|
7
|
+
class="
|
8
|
+
p-2 rounded hover:bg-stone-700 focus:outline-none focus:ring-2
|
9
|
+
focus:ring-stone-500 transition-colors
|
10
|
+
"
|
11
|
+
data-icon-name="<%= icon_name %>"
|
12
|
+
data-action="click->icon-picker#select"
|
13
|
+
data-icon-picker-target="icon"
|
14
|
+
title="<%= icon_name.humanize %>"
|
15
|
+
>
|
16
|
+
<%= icon icon_name, class: "size-6" %>
|
17
|
+
</button>
|
18
|
+
<% end %>
|
19
|
+
</div>
|
20
|
+
<% end %>
|
21
|
+
<% end %>
|
@@ -0,0 +1,24 @@
|
|
1
|
+
<%= form_with(model: locale, class: "max-w-80") do |form| %>
|
2
|
+
<div class="field-group">
|
3
|
+
<div class="field">
|
4
|
+
<%= form.label :code %>
|
5
|
+
<div>
|
6
|
+
<%= form.text_field :code %>
|
7
|
+
<%= form.error_for :code %>
|
8
|
+
</div>
|
9
|
+
</div>
|
10
|
+
|
11
|
+
<div class="field">
|
12
|
+
<%= form.label :name %>
|
13
|
+
<div>
|
14
|
+
<%= form.text_field :name, autocomplete: "new-password" %>
|
15
|
+
<%= form.error_for :name %>
|
16
|
+
</div>
|
17
|
+
</div>
|
18
|
+
</div>
|
19
|
+
|
20
|
+
<div class="mt-4">
|
21
|
+
<%= form.submit %>
|
22
|
+
</div>
|
23
|
+
<% end %>
|
24
|
+
|
@@ -0,0 +1,15 @@
|
|
1
|
+
<div id="<%= dom_id locale %>" class="rounded-lg bg-stone-800/50 relative">
|
2
|
+
<%= link_to edit_locale_path(locale), class: "block p-4 hover:bg-stone-700/30 no-underline text-white transition-colors rounded-lg" do %>
|
3
|
+
<div class="flex items-center justify-between pr-8">
|
4
|
+
<div class="flex items-center gap-2">
|
5
|
+
<span class="font-medium"><%= locale.name %></span>
|
6
|
+
<%= badge "default" if locale.default? %>
|
7
|
+
</div>
|
8
|
+
<%= badge locale.code, color: :blue %>
|
9
|
+
</div>
|
10
|
+
<% end %>
|
11
|
+
<%= button_to locale_path(locale), method: :delete, class: "absolute right-2 top-1/2 -translate-y-1/2", data: { variant: "plain" } do %>
|
12
|
+
<%= icon "trash", class: "text-stone-400 size-4" %>
|
13
|
+
<span class="sr-only">Delete</span>
|
14
|
+
<% end %>
|
15
|
+
</div>
|
@@ -0,0 +1,12 @@
|
|
1
|
+
<% content_for :title, "All locales" %>
|
2
|
+
|
3
|
+
<div class="space-y-8">
|
4
|
+
<div class="flex justify-between items-center">
|
5
|
+
<h1 class="page-title">Locales</h1>
|
6
|
+
<%= link_to "New locale", new_locale_path, class: "btn" %>
|
7
|
+
</div>
|
8
|
+
|
9
|
+
<div id="locales" class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4">
|
10
|
+
<%= render @locales %>
|
11
|
+
</div>
|
12
|
+
</div>
|
@@ -0,0 +1,7 @@
|
|
1
|
+
<h1>Update your password</h1>
|
2
|
+
|
3
|
+
<%= form_with url: password_path(params[:token]), method: :put do |form| %>
|
4
|
+
<%= form.password_field :password, required: true, autocomplete: "new-password", placeholder: "Enter new password", maxlength: 72 %><br>
|
5
|
+
<%= form.password_field :password_confirmation, required: true, autocomplete: "new-password", placeholder: "Repeat new password", maxlength: 72 %><br>
|
6
|
+
<%= form.submit "Save" %>
|
7
|
+
<% end %>
|
@@ -0,0 +1,26 @@
|
|
1
|
+
<div>
|
2
|
+
<div class="mb-8 text-center">
|
3
|
+
<h1 class="text-2xl font-semibold tracking-tight">Reset your password</h1>
|
4
|
+
<p class="mt-2 text-sm text-stone-600 dark:text-stone-400">Enter your email address and we'll send you instructions</p>
|
5
|
+
</div>
|
6
|
+
|
7
|
+
<%= form_with url: passwords_path, class: "space-y-6" do |form| %>
|
8
|
+
<div>
|
9
|
+
<%= form.label :email_address, "Email address", class: "sr-only" %>
|
10
|
+
<%= form.email_field :email_address,
|
11
|
+
class: "block w-full rounded-md border-0 py-2 px-3 text-stone-900 shadow-xs ring-1 ring-inset ring-stone-300 placeholder:text-stone-400 focus:ring-2 focus:ring-inset focus:ring-stone-600 dark:bg-stone-800 dark:text-white dark:ring-stone-700 dark:placeholder:text-stone-500 dark:focus:ring-stone-500 sm:text-sm sm:leading-6",
|
12
|
+
required: true,
|
13
|
+
autofocus: true,
|
14
|
+
autocomplete: "username",
|
15
|
+
placeholder: "Enter your email address",
|
16
|
+
value: params[:email_address] %>
|
17
|
+
</div>
|
18
|
+
|
19
|
+
<%= form.submit "Send reset instructions" %>
|
20
|
+
<% end %>
|
21
|
+
|
22
|
+
<div class="mt-8 text-center text-sm">
|
23
|
+
<%= link_to "Back to sign in", sign_in_path,
|
24
|
+
class: "text-stone-600 hover:text-stone-900 dark:text-stone-400 dark:hover:text-stone-300" %>
|
25
|
+
</div>
|
26
|
+
</div>
|
@@ -0,0 +1,10 @@
|
|
1
|
+
<div class="mx-auto max-w-4xl px-4 py-8">
|
2
|
+
<h1 class="text-4xl font-bold"><%= @entry._metadata.web.title %></h1>
|
3
|
+
|
4
|
+
<div class="mt-8 p-4 bg-gray-100 rounded">
|
5
|
+
<p class="text-sm text-gray-600">
|
6
|
+
This is the default Iron CMS view. To create a custom view for this content type, run:
|
7
|
+
</p>
|
8
|
+
<pre class="mt-2 p-2 bg-white rounded text-sm"><code>bin/rails g iron:resources <%= @content_type.handle %></code></pre>
|
9
|
+
</div>
|
10
|
+
</div>
|
@@ -0,0 +1,6 @@
|
|
1
|
+
<%= turbo_stream.append @reference_list_dom_id do %>
|
2
|
+
<%= fields_for "#{@form_field_name}[#{unique_id}]", @reference do |builder| %>
|
3
|
+
<%= render "iron/entries/fields/reference_item", builder: builder, reference: @reference %>
|
4
|
+
<%= builder.hidden_field :id %>
|
5
|
+
<% end %>
|
6
|
+
<% end %>
|
@@ -0,0 +1,57 @@
|
|
1
|
+
<% content_for :title, "Import Schema" %>
|
2
|
+
|
3
|
+
<div class="">
|
4
|
+
<%= back_button_to "Content Types", content_types_path %>
|
5
|
+
<h1 class="page-title">Import Schema</h1>
|
6
|
+
<p class="mt-2 text-sm text-stone-500">Upload a schema tar file to import content types, fields, and blocks.</p>
|
7
|
+
|
8
|
+
<%= form_with url: import_schema_path, multipart: true, class: "mt-8 max-w-2xl", data: { turbo: false } do |form| %>
|
9
|
+
<div class="field-group">
|
10
|
+
<div class="field">
|
11
|
+
<%= form.label :schema_file, "Schema File" %>
|
12
|
+
<div>
|
13
|
+
<%= form.file_field :schema_file,
|
14
|
+
accept: ".tar",
|
15
|
+
required: true,
|
16
|
+
class: "input" %>
|
17
|
+
<p class="mt-2 text-sm text-stone-500">Select a .tar file exported from Iron CMS</p>
|
18
|
+
</div>
|
19
|
+
</div>
|
20
|
+
|
21
|
+
<div class="field">
|
22
|
+
<%= form.label :import_mode, "Import Mode" %>
|
23
|
+
<div class="space-y-4">
|
24
|
+
<% @import_modes.each do |mode| %>
|
25
|
+
<div class="flex items-start">
|
26
|
+
<div class="flex h-6 items-center">
|
27
|
+
<%= form.radio_button :import_mode, mode,
|
28
|
+
checked: mode == "merge",
|
29
|
+
class: "h-4 w-4 border-stone-300 text-blue-600 focus:ring-blue-600" %>
|
30
|
+
</div>
|
31
|
+
<div class="ml-3">
|
32
|
+
<%= form.label "import_mode_#{mode}", class: "text-sm font-medium text-stone-700" do %>
|
33
|
+
<%= mode.capitalize %>
|
34
|
+
<% end %>
|
35
|
+
<p class="text-sm text-stone-500">
|
36
|
+
<% case mode %>
|
37
|
+
<% when "merge" %>
|
38
|
+
Add new items and update existing ones by handle
|
39
|
+
<% when "replace" %>
|
40
|
+
Clear existing schema and import fresh (destructive)
|
41
|
+
<% when "safe" %>
|
42
|
+
Only add new items, skip existing handles
|
43
|
+
<% end %>
|
44
|
+
</p>
|
45
|
+
</div>
|
46
|
+
</div>
|
47
|
+
<% end %>
|
48
|
+
</div>
|
49
|
+
</div>
|
50
|
+
</div>
|
51
|
+
|
52
|
+
<div class="mt-6 flex items-center gap-x-3">
|
53
|
+
<%= form.submit "Import Schema", class: "btn" %>
|
54
|
+
<%= link_to "Cancel", content_types_path, class: "btn", data: { variant: "plain" } %>
|
55
|
+
</div>
|
56
|
+
<% end %>
|
57
|
+
</div>
|