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.
Files changed (40) hide show
  1. checksums.yaml +4 -4
  2. metadata +2 -40
  3. data/MIT-LICENSE +0 -20
  4. data/README.md +0 -258
  5. data/Rakefile +0 -36
  6. data/app/assets/config/simplec_manifest.js +0 -2
  7. data/app/assets/fonts/simplec/summernote.eot +0 -0
  8. data/app/assets/fonts/simplec/summernote.ttf +0 -0
  9. data/app/assets/fonts/simplec/summernote.woff +0 -0
  10. data/app/assets/javascripts/simplec/application.js +0 -13
  11. data/app/assets/javascripts/simplec/summernote-config.js +0 -82
  12. data/app/assets/javascripts/simplec/summernote.js +0 -7046
  13. data/app/assets/stylesheets/simplec/application.css +0 -15
  14. data/app/assets/stylesheets/simplec/summernote.scss +0 -691
  15. data/app/constraints/simplec/subdomains.rb +0 -23
  16. data/app/controllers/simplec/application_controller.rb +0 -9
  17. data/app/controllers/simplec/pages_controller.rb +0 -19
  18. data/app/helpers/simplec/application_helper.rb +0 -4
  19. data/app/jobs/simplec/application_job.rb +0 -4
  20. data/app/mailers/simplec/application_mailer.rb +0 -6
  21. data/app/models/simplec/application_record.rb +0 -5
  22. data/app/models/simplec/embedded_image.rb +0 -15
  23. data/app/models/simplec/page.rb +0 -203
  24. data/app/models/simplec/subdomain.rb +0 -30
  25. data/app/views/simplec/fields/_editor.html.erb +0 -5
  26. data/app/views/simplec/fields/_image.html.erb +0 -14
  27. data/app/views/simplec/fields/_string.html.erb +0 -4
  28. data/app/views/simplec/fields/_text.html.erb +0 -4
  29. data/app/views/simplec/pages/show.html.erb +0 -2
  30. data/config/routes.rb +0 -8
  31. data/db/migrate/20170809204353_create_simplec_pages.rb +0 -30
  32. data/db/migrate/20170809204511_create_simplec_subdomains.rb +0 -12
  33. data/db/migrate/20170809210304_create_simplec_embedded_images.rb +0 -15
  34. data/lib/simplec.rb +0 -5
  35. data/lib/simplec/action_controller/extensions.rb +0 -56
  36. data/lib/simplec/action_view/helper.rb +0 -118
  37. data/lib/simplec/embedded_image_actions.rb +0 -37
  38. data/lib/simplec/engine.rb +0 -18
  39. data/lib/simplec/version.rb +0 -3
  40. 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,9 +0,0 @@
1
- module Simplec
2
- class ApplicationController < ::ActionController::Base
3
- protect_from_forgery with: :exception
4
-
5
- after_action do
6
- Thread.current[:simplec_subdomain] = nil
7
- end
8
- end
9
- 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,4 +0,0 @@
1
- module Simplec
2
- module ApplicationHelper
3
- end
4
- end
@@ -1,4 +0,0 @@
1
- module Simplec
2
- class ApplicationJob < ActiveJob::Base
3
- end
4
- end
@@ -1,6 +0,0 @@
1
- module Simplec
2
- class ApplicationMailer < ActionMailer::Base
3
- default from: 'from@example.com'
4
- layout 'mailer'
5
- end
6
- end
@@ -1,5 +0,0 @@
1
- module Simplec
2
- class ApplicationRecord < ActiveRecord::Base
3
- self.abstract_class = true
4
- end
5
- 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
@@ -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,5 +0,0 @@
1
- <div class="form-group">
2
- <%= f.label name, class: 'control-label' %>
3
- <%= f.hidden_field name, id: "#{name}-#{f.object.object_id}"%>
4
- <%= tag :div, class: 'editor-field', data: {input: "##{name}-#{f.object.object_id}"} %></div>
5
- </div>
@@ -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>
@@ -1,4 +0,0 @@
1
- <div class="form-group">
2
- <%= f.label name, class: 'control-label' %>
3
- <%= f.text_field name, class: 'form-control' %>
4
- </div>
@@ -1,4 +0,0 @@
1
- <div class="form-group">
2
- <%= f.label name, class: 'control-label' %>
3
- <%= f.text_area name, class: 'form-control' %>
4
- </div>
@@ -1,2 +0,0 @@
1
- <%= head @page %>
2
- <%= template @page %>
data/config/routes.rb DELETED
@@ -1,8 +0,0 @@
1
- Simplec::Engine.routes.draw do
2
-
3
- scope constraints: Simplec::Subdomains do
4
- root 'pages#show'
5
- get '*path', to: 'pages#show'
6
- end
7
-
8
- end
@@ -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