Add Boards management to sitesettings (#107)

This commit is contained in:
Riccardo Graziosi
2022-05-08 16:36:35 +02:00
committed by GitHub
parent 7b8a4d6709
commit 6be2394dc5
44 changed files with 1464 additions and 112 deletions

View File

@@ -1,16 +1,8 @@
class Board < ApplicationRecord
has_many :posts, dependent: :destroy
include Orderable
after_initialize :set_order_to_last
has_many :posts, dependent: :destroy
validates :name, presence: true, uniqueness: true
validates :description, length: { in: 0..1024 }, allow_nil: true
def set_order_to_last
return unless new_record?
return unless order.nil?
order_last = Board.maximum(:order) || 0
self.order = order_last + 1
end
end

View File

@@ -0,0 +1,35 @@
# An Orderable model is a model with an 'order' column
# 1) An new Orderable entity gets, by default, an
# 'order' equal to current maximum order + 1
# 2) When an Orderable entity gets deleted
# all other entities are reordered to be consistent
# Note: update is not handled by the Orderable concern,
# but rather in the entity controller action "update_order"
module Orderable
extend ActiveSupport::Concern
included do
after_initialize :set_order_to_last
after_destroy :ensure_coherent_order
validates :order, presence: true, numericality: { only_integer: true, greater_than_or_equal_to: 0 }
def set_order_to_last
return unless new_record?
return unless order.nil?
order_last = self.class.maximum(:order) || -1
self.order = order_last + 1
end
def ensure_coherent_order
EnsureCoherentOrderingWorkflow.new(
entity_classname: self.class,
column_name: 'order'
).run
end
end
end

View File

@@ -1,12 +1,10 @@
class PostStatus < ApplicationRecord
has_many :posts, dependent: :nullify
include Orderable
after_initialize :set_random_color, :set_order_to_last
after_destroy :ensure_coherent_order
has_many :posts, dependent: :nullify
validates :name, presence: true, uniqueness: true
validates :color, format: { with: /\A#(?:[0-9a-fA-F]{3}){1,2}\z/ }
validates :order, presence: true, numericality: { only_integer: true, greater_than_or_equal_to: 0 }
class << self
def find_roadmap
@@ -14,26 +12,4 @@ class PostStatus < ApplicationRecord
.order(order: :asc)
end
end
def set_random_color
return unless new_record?
return unless color.nil?
self.color = '#' + Random.bytes(3).unpack1('H*')
end
def set_order_to_last
return unless new_record?
return unless order.nil?
order_last = PostStatus.maximum(:order) || -1
self.order = order_last + 1
end
def ensure_coherent_order
EnsureCoherentOrderingWorkflow.new(
entity_classname: PostStatus,
column_name: 'order'
).run
end
end