Add sections based on templates
This commit is contained in:
parent
79e3e79b12
commit
3a41506fb5
|
@ -181,3 +181,7 @@ footer {
|
||||||
margin: 0 auto;
|
margin: 0 auto;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.subsections {
|
||||||
|
margin: .5em;
|
||||||
|
}
|
||||||
|
|
|
@ -15,6 +15,7 @@ class CharacterSheetSectionsController < ApplicationController
|
||||||
end
|
end
|
||||||
|
|
||||||
def new
|
def new
|
||||||
|
@templates = Template.game_system(@character.game_system)
|
||||||
if params[:parent_section_id].present?
|
if params[:parent_section_id].present?
|
||||||
@parent_section = @character.character_sheet_sections.find_by(id: params[:parent_section_id])
|
@parent_section = @character.character_sheet_sections.find_by(id: params[:parent_section_id])
|
||||||
end
|
end
|
||||||
|
@ -22,7 +23,16 @@ class CharacterSheetSectionsController < ApplicationController
|
||||||
end
|
end
|
||||||
|
|
||||||
def create
|
def create
|
||||||
|
@templates = Template.game_system(@character.game_system)
|
||||||
|
if params[:template_id].present?
|
||||||
|
@section = CharacterSheetSection.new_from_template(
|
||||||
|
template: Template.find(params[:template_id]),
|
||||||
|
params: character_sheet_section_params,
|
||||||
|
character: @character,
|
||||||
|
)
|
||||||
|
else
|
||||||
@section = @character.character_sheet_sections.new(character_sheet_section_params)
|
@section = @character.character_sheet_sections.new(character_sheet_section_params)
|
||||||
|
end
|
||||||
@editable = true
|
@editable = true
|
||||||
unless @section.save
|
unless @section.save
|
||||||
@parent_section = @section.parent_section
|
@parent_section = @section.parent_section
|
||||||
|
|
|
@ -14,7 +14,7 @@ class CharactersController < ApplicationController
|
||||||
def create
|
def create
|
||||||
@character = Current.user.characters.new(character_params)
|
@character = Current.user.characters.new(character_params)
|
||||||
if @character.save
|
if @character.save
|
||||||
redirect_to @character, notice: t(".success")
|
redirect_to @character, notice: t(".success", name: @character.name)
|
||||||
else
|
else
|
||||||
flash.now[:alert] = t(".error")
|
flash.now[:alert] = t(".error")
|
||||||
render :new, status: :unprocessable_entity
|
render :new, status: :unprocessable_entity
|
||||||
|
|
|
@ -18,6 +18,13 @@ class CharacterSheetSection < ApplicationRecord
|
||||||
|
|
||||||
scope :top_level, -> { where.missing(:parent_section) }
|
scope :top_level, -> { where.missing(:parent_section) }
|
||||||
|
|
||||||
|
def self.new_from_template(template:, character:, params:)
|
||||||
|
section = CharacterSheetSection.deserialize(JSON.parse(template.content))
|
||||||
|
section.assign_attributes(params)
|
||||||
|
section.character = character
|
||||||
|
section
|
||||||
|
end
|
||||||
|
|
||||||
def lowest_order_index
|
def lowest_order_index
|
||||||
character_sheet_features.minimum(:order_index) || 1
|
character_sheet_features.minimum(:order_index) || 1
|
||||||
end
|
end
|
||||||
|
|
|
@ -9,4 +9,6 @@ class Template < ApplicationRecord
|
||||||
validates :content, presence: true
|
validates :content, presence: true
|
||||||
validates :klass, presence: true,
|
validates :klass, presence: true,
|
||||||
length: { maximum: 200 }
|
length: { maximum: 200 }
|
||||||
|
|
||||||
|
scope :game_system, ->(game_system) { where(game_system:) }
|
||||||
end
|
end
|
||||||
|
|
|
@ -14,4 +14,8 @@
|
||||||
</div>
|
</div>
|
||||||
<% end %>
|
<% end %>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div id="<%= dom_id(character_sheet_section) %>_subsections" class="subsections">
|
||||||
|
<%= render character_sheet_section.character_sheet_subsections %>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -6,6 +6,10 @@
|
||||||
<%= f.text_field :name %>
|
<%= f.text_field :name %>
|
||||||
<%= display_form_errors(@section, :name) %>
|
<%= display_form_errors(@section, :name) %>
|
||||||
|
|
||||||
|
<%= label_tag :template_id, t(".template") %>
|
||||||
|
<%= collection_select nil, :template_id, @templates, :id, :name, include_blank: " " %>
|
||||||
|
<%= display_form_errors(@section, :template) %>
|
||||||
|
|
||||||
<%= f.submit button_text %>
|
<%= f.submit button_text %>
|
||||||
<% end %>
|
<% end %>
|
||||||
</section>
|
</section>
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
<% content_target = @section.parent_section.present? ? "#{dom_id(@section.parent_section)}_sections"
|
<% content_target = @section.parent_section.present? ? "#{dom_id(@section.parent_section)}_subsections"
|
||||||
: "character_sheet" %>
|
: "character_sheet" %>
|
||||||
<%= turbo_stream.append(content_target) do %>
|
<%= turbo_stream.append(content_target) do %>
|
||||||
<%= render @section %>
|
<%= render @section %>
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
|
|
||||||
<% form_target = "#{dom_id(@section)}_add_section" %>
|
<% form_target = "#{dom_id(@section)}_add_section" %>
|
||||||
<%= turbo_stream.replace(form_target) do %>
|
<%= turbo_stream.replace(form_target) do %>
|
||||||
<div id="<% dom_id(@section) %>_add_section">
|
<div id="<%= dom_id(@section) %>_add_section">
|
||||||
<%= render partial: "character_sheet_sections/edit_links", locals: { section: @section, parent: @section.parent_section, id: nil} %>
|
<%= render partial: "character_sheet_sections/edit_links", locals: { section: @section, parent: @section.parent_section, id: nil} %>
|
||||||
</div>
|
</div>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|
|
@ -75,6 +75,8 @@ en:
|
||||||
add_section: Add section
|
add_section: Add section
|
||||||
new:
|
new:
|
||||||
create_section: Create section
|
create_section: Create section
|
||||||
|
form:
|
||||||
|
template: From template (leave blank for none)
|
||||||
characters:
|
characters:
|
||||||
index:
|
index:
|
||||||
my_characters: My characters
|
my_characters: My characters
|
||||||
|
|
33
todo.md
33
todo.md
|
@ -1,20 +1,39 @@
|
||||||
- Templates
|
Character sheets
|
||||||
- Add from template
|
= Must haves
|
||||||
- Edit/delete templates
|
- Refer to stat in roll (Skill in Troika)
|
||||||
- Lists
|
- Lists
|
||||||
- request invite
|
- Reorganise sections
|
||||||
|
- Edit additional roll types
|
||||||
- improve dice roll parsing to allow e.g. choose highest
|
- improve dice roll parsing to allow e.g. choose highest
|
||||||
|
= Nice to haves
|
||||||
|
- Calculate from result - e.g. troika damage roll should calc. damage amount from die roll:w
|
||||||
|
- Add min/max when creating stats
|
||||||
|
- Better sheet layout (multiple small sections per line)
|
||||||
|
- Display empty text fields prettier
|
||||||
|
- Rename to SectionTemplate
|
||||||
- Easy add amount to stat
|
- Easy add amount to stat
|
||||||
- icons on features
|
|
||||||
- auto save text fields
|
- auto save text fields
|
||||||
- indicate save status on titlebar
|
- indicate save status on titlebar
|
||||||
|
- icons on features
|
||||||
|
- Cancel adding subsection, stat etc.
|
||||||
|
- add manual dice roll
|
||||||
|
- request/respond to specific dice roll
|
||||||
|
|
||||||
|
Templates
|
||||||
|
- Template accessibility level
|
||||||
|
- Users can add their own, "official" ones are always available
|
||||||
|
- Unofficial ones can be added to a local list of favourites
|
||||||
|
- Edit/delete templates
|
||||||
|
- Sheet section color
|
||||||
|
|
||||||
|
Misc
|
||||||
|
- arbitrary dice rolls
|
||||||
|
- request invite
|
||||||
- Character avatars
|
- Character avatars
|
||||||
- default avatars
|
- default avatars
|
||||||
- add uuid/slug to characters and any other url-visible ids
|
- add uuid/slug to characters and any other url-visible ids
|
||||||
- shared/private notes
|
- shared/private notes
|
||||||
- NPCs
|
- NPCs
|
||||||
- Character sheets prototypes
|
|
||||||
- notifications
|
|
||||||
- chat
|
- chat
|
||||||
- maps
|
- maps
|
||||||
- show errors from invalid sheet bits
|
- show errors from invalid sheet bits
|
||||||
|
|
Loading…
Reference in New Issue