with YAML-defined defaults. Add admin page for editing global settings. Add "site_description" setting that would show as a paragraph on the frontpageclosed-social-glitch-2
@ -1,3 +1,8 @@ | |||
//= require jquery | |||
//= require jquery_ujs | |||
//= require extras | |||
//= require best_in_place | |||
$(function () { | |||
$(".best_in_place").best_in_place(); | |||
}); |
@ -0,0 +1,25 @@ | |||
# frozen_string_literal: true | |||
class Admin::SettingsController < ApplicationController | |||
before_action :require_admin! | |||
layout 'admin' | |||
def index | |||
@settings = Setting.all_as_records | |||
end | |||
def update | |||
@setting = Setting.where(var: params[:id]).first_or_initialize(var: params[:id]) | |||
if @setting.value != params[:setting][:value] | |||
@setting.value = params[:setting][:value] | |||
@setting.save | |||
end | |||
respond_to do |format| | |||
format.html { redirect_to admin_settings_path } | |||
format.json { respond_with_bip(@setting) } | |||
end | |||
end | |||
end |
@ -0,0 +1,10 @@ | |||
# frozen_string_literal: true | |||
class HashObject | |||
def initialize(hash) | |||
hash.each do |k, v| | |||
instance_variable_set("@#{k}", v) | |||
self.class.send(:define_method, k, proc { instance_variable_get("@#{k}") }) | |||
end | |||
end | |||
end |
@ -0,0 +1,31 @@ | |||
# frozen_string_literal: true | |||
class Setting < RailsSettings::Base | |||
source Rails.root.join('config/settings.yml') | |||
namespace Rails.env | |||
def to_param | |||
var | |||
end | |||
class << self | |||
def all_as_records | |||
vars = thing_scoped | |||
records = vars.map { |r| [r.var, r] }.to_h | |||
default_settings.each do |key, default_value| | |||
next if records.key?(key) || default_value.is_a?(Hash) | |||
records[key] = Setting.new(var: key, value: default_value) | |||
end | |||
records | |||
end | |||
private | |||
def default_settings | |||
return {} unless RailsSettings::Default.enabled? | |||
RailsSettings::Default.instance | |||
end | |||
end | |||
end |
@ -0,0 +1,22 @@ | |||
- content_for :page_title do | |||
Site Settings | |||
%table.table | |||
%colgroup | |||
%col{ width: '35%' }/ | |||
%thead | |||
%tr | |||
%th Setting | |||
%th Click to edit | |||
%tbody | |||
%tr | |||
%td | |||
%strong Site description | |||
%br/ | |||
Displayed as a paragraph on the frontpage and used as a meta tag. | |||
%br/ | |||
You can use HTML tags, in particular | |||
%code= '<a>' | |||
and | |||
%code= '<em>' | |||
%td= best_in_place @settings['site_description'], :value, as: :textarea, url: admin_setting_path(@settings['site_description']) |
@ -0,0 +1,23 @@ | |||
# config/app.yml for rails-settings-cached | |||
defaults: &defaults | |||
site_description: '' | |||
site_contact_username: '' | |||
site_contact_email: '' | |||
notification_emails: | |||
follow: false | |||
reblog: false | |||
favourite: false | |||
mention: false | |||
follow_request: true | |||
interactions: | |||
must_be_follower: false | |||
must_be_following: false | |||
development: | |||
<<: *defaults | |||
test: | |||
<<: *defaults | |||
production: | |||
<<: *defaults |
@ -0,0 +1,19 @@ | |||
class MigrateSettings < ActiveRecord::Migration | |||
def up | |||
remove_index :settings, [:target_type, :target_id, :var] | |||
rename_column :settings, :target_id, :thing_id | |||
rename_column :settings, :target_type, :thing_type | |||
change_column :settings, :thing_id, :integer, null: true, default: nil | |||
change_column :settings, :thing_type, :string, null: true, default: nil | |||
add_index :settings, [:thing_type, :thing_id, :var], unique: true | |||
end | |||
def down | |||
remove_index :settings, [:thing_type, :thing_id, :var] | |||
rename_column :settings, :thing_id, :target_id | |||
rename_column :settings, :thing_type, :target_type | |||
change_column :settings, :target_id, :integer, null: false | |||
change_column :settings, :target_type, :string, null: false, default: '' | |||
add_index :settings, [:target_type, :target_id, :var], unique: true | |||
end | |||
end |