simplec 0.1.0 → 0.1.1
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 +4 -4
- metadata +2 -40
- data/MIT-LICENSE +0 -20
- data/README.md +0 -258
- data/Rakefile +0 -36
- data/app/assets/config/simplec_manifest.js +0 -2
- data/app/assets/fonts/simplec/summernote.eot +0 -0
- data/app/assets/fonts/simplec/summernote.ttf +0 -0
- data/app/assets/fonts/simplec/summernote.woff +0 -0
- data/app/assets/javascripts/simplec/application.js +0 -13
- data/app/assets/javascripts/simplec/summernote-config.js +0 -82
- data/app/assets/javascripts/simplec/summernote.js +0 -7046
- data/app/assets/stylesheets/simplec/application.css +0 -15
- data/app/assets/stylesheets/simplec/summernote.scss +0 -691
- data/app/constraints/simplec/subdomains.rb +0 -23
- data/app/controllers/simplec/application_controller.rb +0 -9
- data/app/controllers/simplec/pages_controller.rb +0 -19
- data/app/helpers/simplec/application_helper.rb +0 -4
- data/app/jobs/simplec/application_job.rb +0 -4
- data/app/mailers/simplec/application_mailer.rb +0 -6
- data/app/models/simplec/application_record.rb +0 -5
- data/app/models/simplec/embedded_image.rb +0 -15
- data/app/models/simplec/page.rb +0 -203
- data/app/models/simplec/subdomain.rb +0 -30
- data/app/views/simplec/fields/_editor.html.erb +0 -5
- data/app/views/simplec/fields/_image.html.erb +0 -14
- data/app/views/simplec/fields/_string.html.erb +0 -4
- data/app/views/simplec/fields/_text.html.erb +0 -4
- data/app/views/simplec/pages/show.html.erb +0 -2
- data/config/routes.rb +0 -8
- data/db/migrate/20170809204353_create_simplec_pages.rb +0 -30
- data/db/migrate/20170809204511_create_simplec_subdomains.rb +0 -12
- data/db/migrate/20170809210304_create_simplec_embedded_images.rb +0 -15
- data/lib/simplec.rb +0 -5
- data/lib/simplec/action_controller/extensions.rb +0 -56
- data/lib/simplec/action_view/helper.rb +0 -118
- data/lib/simplec/embedded_image_actions.rb +0 -37
- data/lib/simplec/engine.rb +0 -18
- data/lib/simplec/version.rb +0 -3
- data/lib/tasks/simplec_tasks.rake +0 -4
@@ -1,23 +0,0 @@
|
|
1
|
-
module Simplec
|
2
|
-
class Subdomains
|
3
|
-
def self.matches?(request)
|
4
|
-
present = request.subdomain.present?
|
5
|
-
not_admin = request.subdomain != 'admin'
|
6
|
-
subdomain = Simplec::Subdomain.find_by(name: request.subdomain)
|
7
|
-
|
8
|
-
match = present && not_admin && subdomain
|
9
|
-
|
10
|
-
if match
|
11
|
-
Thread.current[:simplec_subdomain] = subdomain
|
12
|
-
else
|
13
|
-
Rails.logger.info <<-LOG unless match
|
14
|
-
Simplec Subdomain '#{request.subdomain}' was not found.
|
15
|
-
ActionDispatch::Request#original_url: #{request.original_url}
|
16
|
-
'admin' subdomain bypass: #{!not_admin}
|
17
|
-
LOG
|
18
|
-
end
|
19
|
-
|
20
|
-
match
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
@@ -1,19 +0,0 @@
|
|
1
|
-
require_dependency "simplec/application_controller"
|
2
|
-
|
3
|
-
module Simplec
|
4
|
-
class PagesController < ApplicationController
|
5
|
-
|
6
|
-
def show
|
7
|
-
@page = page("/#{params[:path]}")
|
8
|
-
render layout: layout(@page)
|
9
|
-
end
|
10
|
-
|
11
|
-
private
|
12
|
-
|
13
|
-
def layout(page)
|
14
|
-
[page.layout, page.subdomain.default_layout, 'public']. # TODO allow config for public
|
15
|
-
reject(&:blank?).first
|
16
|
-
end
|
17
|
-
|
18
|
-
end
|
19
|
-
end
|
@@ -1,15 +0,0 @@
|
|
1
|
-
module Simplec
|
2
|
-
class EmbeddedImage < ApplicationRecord
|
3
|
-
belongs_to :embeddable,
|
4
|
-
polymorphic: true
|
5
|
-
|
6
|
-
dragonfly_accessor :asset
|
7
|
-
|
8
|
-
def url
|
9
|
-
return unless self.asset
|
10
|
-
return self.asset.url unless persisted?
|
11
|
-
self.asset.url(ei: Base64.urlsafe_encode64(self.id.to_s))
|
12
|
-
end
|
13
|
-
|
14
|
-
end
|
15
|
-
end
|
data/app/models/simplec/page.rb
DELETED
@@ -1,203 +0,0 @@
|
|
1
|
-
# Simplec::Page
|
2
|
-
#
|
3
|
-
# This class represents a page in the system.
|
4
|
-
#
|
5
|
-
# Each page has a class located in:
|
6
|
-
# app/models/page/NAME.html.erb
|
7
|
-
#
|
8
|
-
# Each page has a partial template in:
|
9
|
-
# app/views/pages/_NAME.html.erb
|
10
|
-
#
|
11
|
-
# Where NAME is the demodulized, snake-case name of the Page Subclasss. For
|
12
|
-
# example:
|
13
|
-
#
|
14
|
-
# class Page::Home < Page
|
15
|
-
# field :h1
|
16
|
-
# end
|
17
|
-
#
|
18
|
-
# Would live in app/models/page/home.html.erb and have a template in
|
19
|
-
# app/views/pages/_home.html.erb.
|
20
|
-
#
|
21
|
-
# Each page has the following attributes by default:
|
22
|
-
# - page.title
|
23
|
-
#
|
24
|
-
# Read the documentation below for the class method .field, it is the most
|
25
|
-
# used method.
|
26
|
-
#
|
27
|
-
#
|
28
|
-
module Simplec
|
29
|
-
class Page < ApplicationRecord
|
30
|
-
|
31
|
-
|
32
|
-
# TODO Document FILE_FIELDS constant
|
33
|
-
#
|
34
|
-
FILE_FIELDS = [:file, :image].freeze
|
35
|
-
|
36
|
-
belongs_to :subdomain,
|
37
|
-
optional: false
|
38
|
-
belongs_to :parent,
|
39
|
-
class_name: 'Page',
|
40
|
-
optional: true
|
41
|
-
has_many :childern,
|
42
|
-
class_name: 'Page',
|
43
|
-
foreign_key: :parent_id
|
44
|
-
has_many :embedded_images,
|
45
|
-
as: :embeddable,
|
46
|
-
dependent: :delete_all
|
47
|
-
|
48
|
-
validates :type,
|
49
|
-
presence: true
|
50
|
-
validates :path,
|
51
|
-
presence: true,
|
52
|
-
uniqueness: { scope: :subdomain_id }
|
53
|
-
validates :layout,
|
54
|
-
inclusion: {in: :layouts, allow_blank: true}
|
55
|
-
validates :title,
|
56
|
-
presence: true
|
57
|
-
|
58
|
-
before_validation :match_parent_subdomain
|
59
|
-
before_validation :build_path
|
60
|
-
after_save :link_embedded_images!
|
61
|
-
|
62
|
-
# Define a field on the page.
|
63
|
-
#
|
64
|
-
# - name - name of field
|
65
|
-
# - options[:type] - :string (default), :text, :editor, [:file], :image
|
66
|
-
# :string - yields a text input
|
67
|
-
# :text - yields a textarea
|
68
|
-
# :editor - yields a summernote editor
|
69
|
-
# :file - yields a file field
|
70
|
-
# :image - yields a file field with image preview
|
71
|
-
#
|
72
|
-
# There is as template for each type for customization located in:
|
73
|
-
# app/views/shared/fields/_TYPE.html.erb
|
74
|
-
#
|
75
|
-
# Defines a field on a subclass. This creates a getter and setter for the
|
76
|
-
# name passed in. The options are used when building the administration forms.
|
77
|
-
#
|
78
|
-
# Regular dragonfly validations are available on :file and :image fields.
|
79
|
-
# http://markevans.github.io/dragonfly/models#validations
|
80
|
-
#
|
81
|
-
def self.field(name, options={})
|
82
|
-
fields[name] = {name: name, type: :string}.merge(options)
|
83
|
-
if FILE_FIELDS.member?(fields[name][:type])
|
84
|
-
dragonfly_accessor name
|
85
|
-
data_field :"#{name}_uid"
|
86
|
-
data_field :"#{name}_name"
|
87
|
-
else
|
88
|
-
data_field(name)
|
89
|
-
end
|
90
|
-
end
|
91
|
-
|
92
|
-
# List fields
|
93
|
-
#
|
94
|
-
def self.fields
|
95
|
-
@fields ||= Hash.new
|
96
|
-
end
|
97
|
-
|
98
|
-
# Return a constantized type, whitelisted by known subclasses.
|
99
|
-
#
|
100
|
-
def self.type(type)
|
101
|
-
::Page rescue raise '::Page not defined, define it in app/models'
|
102
|
-
raise 'Unsupported Page Type; define in app/models/page/' unless ::Page.subclasses.map(&:name).
|
103
|
-
member?(type)
|
104
|
-
type.constantize
|
105
|
-
end
|
106
|
-
|
107
|
-
# Return names of fields.
|
108
|
-
#
|
109
|
-
# type: :file, is the only option
|
110
|
-
#
|
111
|
-
def self.field_names(type=nil)
|
112
|
-
_fields = case type
|
113
|
-
when :file
|
114
|
-
fields.select {|k, v| FILE_FIELDS.member?(v[:type])}
|
115
|
-
else
|
116
|
-
fields
|
117
|
-
end
|
118
|
-
_fields.keys
|
119
|
-
end
|
120
|
-
|
121
|
-
# Return field options for building forms.
|
122
|
-
#
|
123
|
-
def field_options
|
124
|
-
self.class.fields.values
|
125
|
-
end
|
126
|
-
|
127
|
-
# List parents, closest to furthest.
|
128
|
-
#
|
129
|
-
def parents
|
130
|
-
page, parents = self, Array.new
|
131
|
-
while page.parent
|
132
|
-
page = page.parent
|
133
|
-
parents << page
|
134
|
-
end
|
135
|
-
parents
|
136
|
-
end
|
137
|
-
|
138
|
-
# Before validation hook.
|
139
|
-
#
|
140
|
-
# Build the path of the page to be used in routing.
|
141
|
-
#
|
142
|
-
def build_path
|
143
|
-
_pages = self.parents.reverse + [self]
|
144
|
-
self.path = "/#{_pages.map(&:slug).reject(&:blank?).join('/')}"
|
145
|
-
end
|
146
|
-
|
147
|
-
# Before validation hook
|
148
|
-
#
|
149
|
-
# All pages need to have a matching subdomain to parent page
|
150
|
-
#
|
151
|
-
def match_parent_subdomain
|
152
|
-
return unless self.parent
|
153
|
-
self.subdomain = self.parent.subdomain
|
154
|
-
end
|
155
|
-
|
156
|
-
def find_embedded_images
|
157
|
-
text = self.fields.values.join(' ')
|
158
|
-
matches = text.scan(/ei=([^&]*)/)
|
159
|
-
encoded_ids = matches.map(&:first)
|
160
|
-
ids = encoded_ids.map { |eid| Base64.urlsafe_decode64(URI.unescape(eid)) }
|
161
|
-
EmbeddedImage.includes(:embeddable).find(ids)
|
162
|
-
end
|
163
|
-
|
164
|
-
def link_embedded_images!
|
165
|
-
images = self.find_embedded_images
|
166
|
-
images.each do |image|
|
167
|
-
raise AlreadyLinkedEmbeddedImage if image.embeddable &&
|
168
|
-
image.embeddable != self
|
169
|
-
image.update!(embeddable: self)
|
170
|
-
end
|
171
|
-
end
|
172
|
-
|
173
|
-
def layouts
|
174
|
-
@layouts ||= Subdomain.new.layouts
|
175
|
-
end
|
176
|
-
|
177
|
-
module Normalizers
|
178
|
-
def slug=(val)
|
179
|
-
val = val ? val.to_s.split('/').reject(&:blank?).join('/') : val
|
180
|
-
super val
|
181
|
-
end
|
182
|
-
|
183
|
-
def slug
|
184
|
-
if self.parent_id && self.parent.nil?
|
185
|
-
self.path.to_s.split('/').reject(&:blank?).join('/')
|
186
|
-
else
|
187
|
-
super
|
188
|
-
end
|
189
|
-
end
|
190
|
-
end
|
191
|
-
prepend Normalizers
|
192
|
-
|
193
|
-
class AlreadyLinkedEmbeddedImage < StandardError; end
|
194
|
-
|
195
|
-
private
|
196
|
-
|
197
|
-
def self.data_field(name)
|
198
|
-
define_method(name) { fields[name.to_s] }
|
199
|
-
define_method("#{name}=") { |val| fields[name.to_s] = val }
|
200
|
-
end
|
201
|
-
end
|
202
|
-
end
|
203
|
-
|
@@ -1,30 +0,0 @@
|
|
1
|
-
module Simplec
|
2
|
-
class Subdomain < ApplicationRecord
|
3
|
-
has_many :pages
|
4
|
-
has_and_belongs_to_many :document_sets
|
5
|
-
has_and_belongs_to_many :documents
|
6
|
-
|
7
|
-
validates :name,
|
8
|
-
presence: true,
|
9
|
-
exclusion: { in: %w(admin) }
|
10
|
-
validates :default_layout,
|
11
|
-
inclusion: {in: :layouts, allow_blank: true}
|
12
|
-
|
13
|
-
def layouts
|
14
|
-
@layouts ||= Dir[Rails.root.join('app/views/layouts').to_s + "/*.html.*"].
|
15
|
-
map{|n| File.basename(n).split('.', 2).first }.
|
16
|
-
reject{|n| n =~ /\A_/ || n =~ /mailer/ || n =~ /application/ || n =~ /sessions/}.
|
17
|
-
sort
|
18
|
-
end
|
19
|
-
|
20
|
-
module Normalizers
|
21
|
-
|
22
|
-
# Force lowercase name
|
23
|
-
#
|
24
|
-
def name=(val)
|
25
|
-
super (val ? val.to_s.strip.downcase : val)
|
26
|
-
end
|
27
|
-
end
|
28
|
-
prepend Normalizers
|
29
|
-
end
|
30
|
-
end
|
@@ -1,14 +0,0 @@
|
|
1
|
-
<div class="form-group">
|
2
|
-
<% if f.object.send(name) %>
|
3
|
-
<%= image_tag f.object.send(name).thumb('100x').url %>
|
4
|
-
<div class="checkbox">
|
5
|
-
<label>
|
6
|
-
<%= f.check_box :"remove_#{name}" %>
|
7
|
-
Remove
|
8
|
-
</label>
|
9
|
-
</div>
|
10
|
-
<% end %>
|
11
|
-
<%= f.label name %>
|
12
|
-
<%= f.file_field name %>
|
13
|
-
<%= f.hidden_field :"retained_#{name}" %>
|
14
|
-
</div>
|
data/config/routes.rb
DELETED
@@ -1,30 +0,0 @@
|
|
1
|
-
class CreateSimplecPages < ActiveRecord::Migration[5.0]
|
2
|
-
def change
|
3
|
-
create_table :simplec_pages, id: :uuid, default: 'gen_random_uuid()' do |t|
|
4
|
-
t.string :type
|
5
|
-
t.uuid :subdomain_id
|
6
|
-
t.uuid :parent_id
|
7
|
-
t.string :path
|
8
|
-
t.string :slug
|
9
|
-
t.string :title
|
10
|
-
t.string :meta_description
|
11
|
-
t.jsonb :fields
|
12
|
-
t.string :layout
|
13
|
-
|
14
|
-
t.timestamps
|
15
|
-
end
|
16
|
-
|
17
|
-
add_index :simplec_pages, :type
|
18
|
-
add_index :simplec_pages, :subdomain_id
|
19
|
-
add_index :simplec_pages, :parent_id
|
20
|
-
add_index :simplec_pages, :path
|
21
|
-
add_index :simplec_pages, [:subdomain_id, :path], unique: true
|
22
|
-
|
23
|
-
reversible do |dir|
|
24
|
-
dir.up {
|
25
|
-
execute "ALTER TABLE simplec_pages ALTER COLUMN fields SET DEFAULT '{}'::JSONB"
|
26
|
-
}
|
27
|
-
end
|
28
|
-
|
29
|
-
end
|
30
|
-
end
|
@@ -1,12 +0,0 @@
|
|
1
|
-
class CreateSimplecSubdomains < ActiveRecord::Migration[5.0]
|
2
|
-
def change
|
3
|
-
create_table :simplec_subdomains, id: :uuid, default: 'gen_random_uuid()' do |t|
|
4
|
-
t.string :name
|
5
|
-
t.string :default_layout
|
6
|
-
|
7
|
-
t.timestamps
|
8
|
-
end
|
9
|
-
|
10
|
-
add_index :simplec_subdomains, :name, unique: true
|
11
|
-
end
|
12
|
-
end
|
@@ -1,15 +0,0 @@
|
|
1
|
-
class CreateSimplecEmbeddedImages < ActiveRecord::Migration[5.0]
|
2
|
-
def change
|
3
|
-
create_table :simplec_embedded_images, id: :uuid, default: 'gen_random_uuid()' do |t|
|
4
|
-
t.string :embeddable_type
|
5
|
-
t.integer :embeddable_id
|
6
|
-
t.string :asset_uid
|
7
|
-
t.string :asset_name
|
8
|
-
|
9
|
-
t.timestamps
|
10
|
-
end
|
11
|
-
|
12
|
-
add_index :simplec_embedded_images, [:embeddable_type, :embeddable_id],
|
13
|
-
name: 'simplec_embedded_images_type_id_index'
|
14
|
-
end
|
15
|
-
end
|