tomify 0.0.9 → 0.1.0

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 (36) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/tomify/default/array.coffee +1 -0
  3. data/app/assets/javascripts/tomify/dynamic/react/components/admin/pages.coffee.erb +8 -0
  4. data/app/assets/javascripts/tomify/dynamic/react/components/admin/settings.coffee +1 -1
  5. data/app/assets/javascripts/tomify/dynamic/react/components/layout/admin_navbar.coffee +18 -5
  6. data/app/assets/javascripts/tomify/dynamic/react/components/layout/public_navbar.coffee +11 -10
  7. data/app/assets/javascripts/tomify/dynamic/react/components/public/profile.coffee +7 -9
  8. data/app/assets/javascripts/tomify/dynamic/react/components/public/sessions/show.coffee +19 -21
  9. data/app/assets/javascripts/tomify/dynamic/react/components/public/subscription.coffee +13 -15
  10. data/app/assets/stylesheets/tomify/_default.scss +34 -1
  11. data/app/controllers/tomify/api/admin/pages_controller.rb +14 -0
  12. data/app/controllers/tomify/api/admin/settings_controller.rb +7 -0
  13. data/app/controllers/tomify/api/admin/sidebars_controller.rb +3 -0
  14. data/app/controllers/tomify/api/admin/uploads_controller.rb +3 -0
  15. data/app/controllers/tomify/api/admin/users_controller.rb +14 -5
  16. data/app/controllers/tomify/api/public/users_controller.rb +4 -0
  17. data/app/controllers/tomify/concerns/api/admin.rb +0 -4
  18. data/app/controllers/tomify/concerns/api/helpers.rb +37 -17
  19. data/app/controllers/tomify/concerns/api/json.rb +9 -4
  20. data/app/controllers/tomify/concerns/api/public.rb +0 -4
  21. data/app/controllers/tomify/concerns/default/env_helper.rb +3 -31
  22. data/app/controllers/tomify/concerns/default/navbar_helper.rb +76 -0
  23. data/app/controllers/tomify/concerns/default.rb +1 -0
  24. data/app/helpers/tomify/carrierwave_helper.rb +2 -2
  25. data/app/models/tomify/concerns/page.rb +11 -13
  26. data/app/models/tomify/concerns/sidebar.rb +0 -6
  27. data/app/models/tomify/concerns/upload.rb +0 -6
  28. data/app/models/tomify/concerns/user.rb +0 -15
  29. data/app/models/tomify/setting.rb +2 -7
  30. data/app/uploaders/tomify/setting_uploader.rb +24 -1
  31. data/app/views/templates/contact.haml +1 -1
  32. data/app/views/templates/default.haml +1 -1
  33. data/app/views/tomify/defaults/_container.haml +1 -1
  34. data/app/views/tomify/defaults/_meta.haml +20 -17
  35. data/lib/tomify/version.rb +1 -1
  36. metadata +3 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f9da0a49b63fcfccfb5a385fe3c09ce92ce8f426
4
- data.tar.gz: fc523774e05c2622f0f442421d190fb859f3a1f4
3
+ metadata.gz: d7adedc7c0800596d7cb43f4fa62d73f062c60de
4
+ data.tar.gz: 22f4e06750d3eff48a100d576de05fc0c6f36368
5
5
  SHA512:
6
- metadata.gz: 2e96cb8c60cdf77201dca2a2977d394b5c64b27891791241d3a2d2b21cd85827a6530087749b6015c30a241a80affd9be4d5bf3ce6260e663594d6c0e1ef8c33
7
- data.tar.gz: 290e8c20b5bac654f3d935b02406f41b31d78aed6def226aafd3573b7f076493f47fc3650c61f1b5dd8493c2f0a3c25a42e4f378d7de7fc0c6646dccc1929626
6
+ metadata.gz: 4f317a362b20c86647022e24a3bec525f70ff0b724c84df451d1d723d1de61a80e3e92fcb349fa2c2731bfbb8812f203865cd2a25e2fabc3188b531ba2d47651
7
+ data.tar.gz: ac43203ca348e0da245ed209dba4c2520adbe84c29f988dc5e207cccb4f94406cd43e9a2996c758946d34292c328b0b8ef2df4a5bf46788ad5924d6a10628bc3
@@ -1,4 +1,5 @@
1
1
  Object.defineProperties Array.prototype, {
2
+ compact: { get: -> x for x in @ when x },
2
3
  first: { get: -> @[0] },
3
4
  last: { get: -> @[@length - 1] }
4
5
  }
@@ -6,6 +6,14 @@ model.columns = [
6
6
  { name: "sidebar_id", value: (r) -> r.sidebar?.name ? "None" },
7
7
  { name: "name" },
8
8
  { name: "path" },
9
+ { name: "cover_image", value: (r) ->
10
+ return "None" unless r.cover_image.url
11
+ <a href={r.cover_image.url} target="_blank">View</a>
12
+ },
13
+ { name: "share_image", value: (r) ->
14
+ return "None" unless r.share_image.url
15
+ <a href={r.share_image.url} target="_blank">View</a>
16
+ },
9
17
  { name: "updated_at", value: (r) -> r.updated_at.date() },
10
18
  { name: "actions", edit: true, destroy: true, view: (r) ->
11
19
  <a key="visit" href="/#{r.path}" target="_blank">Visit</a>
@@ -4,7 +4,7 @@ model.columns = [
4
4
  { name: "public", value: (r) -> if r.public then "Yes" else "No" },
5
5
  { name: "type", value: (r) -> r.type.split("::").last },
6
6
  { name: "value", value: (r) ->
7
- return unless r.value?
7
+ return "None" unless r.value?
8
8
  switch type = r.type.split("::").last
9
9
  when "Boolean" then "#{r.value}"
10
10
  when "Uploader"
@@ -2,8 +2,12 @@ Component.create "Layout.AdminNavbar",
2
2
  followStores: ["user", pages: "Navbar.Admin"]
3
3
  componentWillInitialize: ->
4
4
  env = Store.find "Env"
5
- Store.create "Navbar.Admin", env.get().navbar.admin || []
6
- @follow env.on "change", -> pages.set(env.get().navbar.admin)
5
+ pages = Store.create "Navbar.Admin", env.get().navbar.admin || []
6
+ @follow env.on "change", -> pages.set env.get().navbar.public
7
+ link: (page) ->
8
+ <li key={page.name}>
9
+ <a href={page.url} target={"_blank" if page.external}>{page.name}</a>
10
+ </li>
7
11
  render: ->
8
12
  return <div /> unless @state.user.admin
9
13
  <div className="brand-navbar navbar navbar-default center">
@@ -19,9 +23,18 @@ Component.create "Layout.AdminNavbar",
19
23
  <div id="admin-navbar" className="navbar-collapse collapse">
20
24
  <ul className="nav navbar-nav">
21
25
  {for page in @state.pages
22
- <li key={page.name}>
23
- <a href="/#{page.path}">{page.name}</a>
24
- </li>
26
+ if page.children[0]
27
+ <li key={page.name} className="dropdown">
28
+ <a href="#" className="dropdown-toggle" data-toggle="dropdown">
29
+ {page.name} <i className="fa fa-caret-down" />
30
+ </a>
31
+ <ul className="dropdown-menu">
32
+ {@link(page) if page.url}
33
+ {@link(child) for child in page.children}
34
+ </ul>
35
+ </li>
36
+ else
37
+ @link(page)
25
38
  }
26
39
  </ul>
27
40
  </div>
@@ -2,8 +2,8 @@ Component.create "Layout.PublicNavbar",
2
2
  followStores: ["user", pages: "Navbar.Public"]
3
3
  componentWillInitialize: ->
4
4
  env = Store.find "Env"
5
- Store.create "Navbar.Public", env.get().navbar.public || []
6
- @follow env.on "change", -> pages.set(env.get().navbar.public)
5
+ pages = Store.create "Navbar.Public", env.get().navbar.public || []
6
+ @follow env.on "change", -> pages.set env.get().navbar.public
7
7
  logout: (e) ->
8
8
  e.preventDefault()
9
9
  Model.find("Public.Session").destroy().then (response) ->
@@ -11,10 +11,10 @@ Component.create "Layout.PublicNavbar",
11
11
  message type: response.type, text: response.message
12
12
  link: (page) ->
13
13
  <li key={page.name}>
14
- <a href="/#{page.path}">{page.name}</a>
14
+ <a href={page.url} target={"_blank" if page.external}>{page.name}</a>
15
15
  </li>
16
16
  render: ->
17
- root = @state.pages.find (page) -> page.root
17
+ root = Store.find("Pages").get().find (page) -> page.root
18
18
  <div className="navbar navbar-default center">
19
19
  <div className="container-fluid">
20
20
  <div className="navbar-header">
@@ -27,19 +27,20 @@ Component.create "Layout.PublicNavbar",
27
27
  </div>
28
28
  <div id="navbar" className="navbar-collapse collapse">
29
29
  <ul className="nav navbar-nav">
30
- {if @state.user.id
31
- @link(name: "Profile", path: "profile")
32
- else if setting "allow_signup"
33
- @link(name: "Login", path: "session")
30
+ {if setting "allow_signup"
31
+ if @state.user.id
32
+ @link(name: "Login", url: "/session")
33
+ else
34
+ @link(name: "Profile", url: "/profile")
34
35
  }
35
- {for page in @state.pages when page.active
36
+ {for page in @state.pages
36
37
  if page.children[0]
37
38
  <li key={page.name} className="dropdown">
38
39
  <a href="#" className="dropdown-toggle" data-toggle="dropdown">
39
40
  {page.name} <i className="fa fa-caret-down" />
40
41
  </a>
41
42
  <ul className="dropdown-menu">
42
- {@link(page)}
43
+ {@link(page) if page.url}
43
44
  {@link(child) for child in page.children}
44
45
  </ul>
45
46
  </li>
@@ -13,14 +13,12 @@ Component.create "Public.Profile",
13
13
  e.preventDefault()
14
14
  Model.findOrCreate("Public.User").edit()
15
15
  render: ->
16
- <div className="container-fluid">
17
- <div className="row text-center">
18
- <div className="col-md-4 col-md-offset-4">
19
- {if @state.edit
20
- <Public.Users.Edit />
21
- else
22
- <Public.Users.Show />
23
- }
24
- </div>
16
+ <div className="row text-center">
17
+ <div className="dynamic-sm">
18
+ {if @state.edit
19
+ <Public.Users.Edit />
20
+ else
21
+ <Public.Users.Show />
22
+ }
25
23
  </div>
26
24
  </div>
@@ -7,27 +7,25 @@ Component.create "Public.Sessions.Show",
7
7
  newPassword: ->
8
8
  @setState(newPassword: true)
9
9
  render: ->
10
- <div className="container-fluid">
11
- <div className="row text-center">
12
- {if @state.newPassword
13
- <div className="col-md-4 col-md-offset-4">
14
- <Public.Passwords.New />
15
- </div>
16
- else if setting "allow_signup"
17
- <div className="col-md-8 col-md-offset-2">
18
- <div className="row">
19
- <div className="col-md-6">
20
- <Public.Sessions.New />
21
- </div>
22
- <div className="col-md-6">
23
- <Public.Users.New />
24
- </div>
10
+ <div className="row text-center">
11
+ {if @state.newPassword
12
+ <div className="dynamic-sm">
13
+ <Public.Passwords.New />
14
+ </div>
15
+ else if setting "allow_signup"
16
+ <div className="dynamic-lg">
17
+ <div className="row">
18
+ <div className="col-md-6">
19
+ <Public.Sessions.New />
20
+ </div>
21
+ <div className="col-md-6">
22
+ <Public.Users.New />
25
23
  </div>
26
24
  </div>
27
- else
28
- <div className="col-md-4 col-md-offset-4">
29
- <Public.Sessions.New />
30
- </div>
31
- }
32
- </div>
25
+ </div>
26
+ else
27
+ <div className="dynamic-sm">
28
+ <Public.Sessions.New />
29
+ </div>
30
+ }
33
31
  </div>
@@ -13,20 +13,18 @@ Component.create "Public.Subscription",
13
13
  e.preventDefault()
14
14
  @model.destroy subscription: { email: @state.email }
15
15
  render: ->
16
- <div className="container-fluid">
17
- <div className="row text-center">
18
- <div className="col-md-4 col-md-offset-4">
19
- <h3>Unsubscribe</h3>
20
- {if @state.unsubscribed
21
- <p>{@state.message}</p>
22
- else
23
- <div>
24
- <p>
25
- By clicking Submit, <strong>{@state.email}</strong> will be no longer recieve the majority of emails from {setting "name"}.
26
- </p>
27
- <a href="#" onClick={@destroy} className="btn btn-danger" data-confirm="Are you sure?">Submit</a>
28
- </div>
29
- }
30
- </div>
16
+ <div className="row text-center">
17
+ <div className="dynamic-sm">
18
+ <h3>Unsubscribe</h3>
19
+ {if @state.unsubscribed
20
+ <p>{@state.message}</p>
21
+ else
22
+ <div>
23
+ <p>
24
+ By clicking Submit, <strong>{@state.email}</strong> will be no longer recieve the majority of emails from {setting "name"}.
25
+ </p>
26
+ <a href="#" onClick={@destroy} className="btn btn-danger" data-confirm="Are you sure?">Submit</a>
27
+ </div>
28
+ }
31
29
  </div>
32
30
  </div>
@@ -21,6 +21,39 @@ em { font-size: 24px; }
21
21
  .panel-heading {
22
22
  h4 {
23
23
  display: inline-block;
24
- a { margin-left: 10px; }
24
+ .btn { margin-left: 10px; }
25
+ }
26
+ }
27
+
28
+ .with-sidebar {
29
+ .dynamic-sm {
30
+ @include make-md-column(8);
31
+ @include make-md-column-offset(2);
32
+ }
33
+
34
+ .dynamic-md {
35
+ @include make-md-column(10);
36
+ @include make-md-column-offset(1);
37
+ }
38
+
39
+ .dynamic-lg {
40
+ @include make-md-column(12);
41
+ }
42
+ }
43
+
44
+ .without-sidebar {
45
+ .dynamic-sm {
46
+ @include make-md-column(4);
47
+ @include make-md-column-offset(4);
48
+ }
49
+
50
+ .dynamic-md {
51
+ @include make-md-column(6);
52
+ @include make-md-column-offset(3);
53
+ }
54
+
55
+ .dynamic-lg {
56
+ @include make-md-column(8);
57
+ @include make-md-column-offset(2);
25
58
  }
26
59
  }
@@ -1,2 +1,16 @@
1
1
  class Tomify::Api::Admin::PagesController < Tomify.controllers.admin_api
2
+ def permitted_attributes
3
+ [
4
+ :parent_id, :sidebar_id,
5
+ :active, :root, :rank,
6
+ :path, :name, :template,
7
+ :title, :description,
8
+ :cover_image, :share_image,
9
+ :text
10
+ ]
11
+ end
12
+
13
+ def serializable_options
14
+ { include: [:parent, :sidebar] }
15
+ end
2
16
  end
@@ -1,2 +1,9 @@
1
1
  class Tomify::Api::Admin::SettingsController < Tomify.controllers.admin_api
2
+ def permitted_attributes
3
+ [:type, :name, :public, :value, json: {}]
4
+ end
5
+
6
+ def serializable_options
7
+ { methods: [:type] }
8
+ end
2
9
  end
@@ -1,2 +1,5 @@
1
1
  class Tomify::Api::Admin::SidebarsController < Tomify.controllers.admin_api
2
+ def permitted_attributes
3
+ [:active, :name, :heading, :template, :text]
4
+ end
2
5
  end
@@ -1,2 +1,5 @@
1
1
  class Tomify::Api::Admin::UploadsController < Tomify.controllers.admin_api
2
+ def permitted_attributes
3
+ [:uuid, :name, :file, :size, :content_type]
4
+ end
2
5
  end
@@ -1,16 +1,25 @@
1
1
  class Tomify::Api::Admin::UsersController < Tomify.controllers.admin_api
2
2
  before_action :not_allowed, only: [:update, :destroy]
3
3
 
4
+ def not_allowed
5
+ find_record
6
+ if @record.email == "tom@tomify.me" || @record.id == current_user.id
7
+ render json: { type: :danger, message: "You shall not pass" }
8
+ end
9
+ end
10
+
11
+ private
12
+ def permitted_attributes
13
+ [:admin, :email, :first_name, :last_name]
14
+ end
15
+
4
16
  def record_params
5
17
  attributes = super
6
18
  attributes[:invited] = true if action_name == "create"
7
19
  attributes
8
20
  end
9
21
 
10
- def not_allowed
11
- find_record
12
- if @record.email == "tom@tomify.me" || @record.id == current_user.id
13
- render json: { type: :danger, message: "You shall not pass" }
14
- end
22
+ def serializable_options
23
+ { methods: [:name] }
15
24
  end
16
25
  end
@@ -28,6 +28,10 @@ class Tomify::Api::Public::UsersController < Tomify.controllers.public_api
28
28
  end
29
29
 
30
30
  private
31
+ def permitted_attributes
32
+ [:email, :first_name, :last_name, :password, :password_confirmation]
33
+ end
34
+
31
35
  def set_record
32
36
  @record = current_user
33
37
  end
@@ -2,8 +2,4 @@ module Tomify::Concerns::Api::Admin
2
2
  extend ActiveSupport::Concern
3
3
 
4
4
  include Tomify::Concerns::Api::JSON
5
-
6
- def record_params
7
- params.require(model_param).permit(model.admin_params)
8
- end
9
5
  end
@@ -1,6 +1,6 @@
1
1
  module Tomify::Concerns::Api::Helpers
2
2
  def find_records
3
- @records ||= model.where(search_params)
3
+ @records ||= model.where(search_options)
4
4
  end
5
5
 
6
6
  def find_record
@@ -12,27 +12,23 @@ module Tomify::Concerns::Api::Helpers
12
12
  end
13
13
 
14
14
  def update_record
15
- @record.update!(record_params)
15
+ record.update!(record_params)
16
16
  end
17
17
 
18
18
  def destroy_record
19
- @record.destroy!
19
+ record.destroy!
20
20
  end
21
21
 
22
- def record_params
23
- params.require(model_param).permit(model.default_params)
24
- end
22
+ # Helpers
23
+ def date_range(start_date, end_date = nil)
24
+ start_date = DateTime.strptime(start_date, "%D")
25
+ end_date = end_date ? DateTime.strptime(end_date, "%D") : DateTime.now
25
26
 
26
- def search_params
27
- @search_params = {}
28
- @search_params[:created_at] = date_range(params[:created_at]) if params[:created_at]
29
- @search_params[:updated_at] = date_range(params[:updated_at]) if params[:updated_at]
30
- @search_params
27
+ (start_date.beginning_of_day)..(end_date.end_of_day)
31
28
  end
32
29
 
33
30
  def model
34
- return @model if @model
35
- @model = model_name.constantize rescue nil
31
+ @model ||= model_name.constantize rescue nil
36
32
  @model ||= "Tomify::#{model_name}".constantize
37
33
  end
38
34
 
@@ -44,10 +40,34 @@ module Tomify::Concerns::Api::Helpers
44
40
  @model_param ||= controller_name.chomp("s")
45
41
  end
46
42
 
47
- def date_range(start_date, end_date = nil)
48
- start_date = DateTime.strptime(start_date, "%D")
49
- end_date = end_date ? DateTime.strptime(end_date, "%D") : DateTime.now
43
+ def record
44
+ @record
45
+ end
50
46
 
51
- (start_date.beginning_of_day)..(end_date.end_of_day)
47
+ def records
48
+ @records
49
+ end
50
+
51
+ def record_params
52
+ @record_params ||= params.require(model_param).permit(permitted_attributes)
53
+ end
54
+
55
+ def recursive_options(association, base, depth)
56
+ return base if depth.zero?
57
+ options = base.dup
58
+ options[:include] ||= []
59
+ options[:include] << { association => recursive_options(association, base, depth - 1) }
60
+ options
61
+ end
62
+
63
+ def search_options
64
+ @search_options = {}
65
+ @search_options[:created_at] = date_range(params[:created_at]) if params[:created_at]
66
+ @search_options[:updated_at] = date_range(params[:updated_at]) if params[:updated_at]
67
+ @search_options
68
+ end
69
+
70
+ def serializable_options
71
+ @serializable_options ||= {}
52
72
  end
53
73
  end
@@ -19,23 +19,23 @@ module Tomify::Concerns::Api::JSON
19
19
 
20
20
  def index
21
21
  find_records
22
- render json: { type: :success, data: @records }
22
+ render json: { type: :success, data: data }
23
23
  end
24
24
 
25
25
  def show
26
26
  find_record
27
- render json: { type: :success, data: @record }
27
+ render json: { type: :success, data: data }
28
28
  end
29
29
 
30
30
  def create
31
31
  create_record
32
- render json: { type: :success, data: @record, message: "#{model_name} Created" }
32
+ render json: { type: :success, data: data, message: "#{model_name} Created" }
33
33
  end
34
34
 
35
35
  def update
36
36
  find_record
37
37
  update_record
38
- render json: { type: :success, data: @record, message: "#{model_name} Updated" }
38
+ render json: { type: :success, data: data, message: "#{model_name} Updated" }
39
39
  end
40
40
 
41
41
  def destroy
@@ -43,4 +43,9 @@ module Tomify::Concerns::Api::JSON
43
43
  destroy_record
44
44
  render json: { type: :danger, message: "#{model_name} Deleted" }
45
45
  end
46
+
47
+ private
48
+ def data
49
+ @data ||= (record || records).as_json(serializable_options)
50
+ end
46
51
  end
@@ -2,8 +2,4 @@ module Tomify::Concerns::Api::Public
2
2
  extend ActiveSupport::Concern
3
3
 
4
4
  include Tomify::Concerns::Api::JSON
5
-
6
- def record_params
7
- params.require(model_param).permit(model.public_params)
8
- end
9
5
  end
@@ -2,38 +2,10 @@ module Tomify::Concerns::Default::EnvHelper
2
2
  def js_env
3
3
  {
4
4
  messages: flash.collect { |key, value| { type: key, text: value }},
5
- navbar: {
6
- admin: admin_pages,
7
- public: public_pages
8
- },
9
- pages: pages,
10
- settings: public_settings,
5
+ navbar: navbar,
6
+ pages: Tomify.models.page.for_env,
7
+ settings: Tomify.models.setting.for_env,
11
8
  user: current_user
12
9
  }
13
10
  end
14
-
15
- def admin_pages
16
- [
17
- { name: "App", path: "admin/settings" },
18
- { name: "Pages", path: "admin/pages" },
19
- { name: "Sidebars", path: "admin/sidebars" },
20
- { name: "Uploads", path: "admin/uploads" },
21
- { name: "Users", path: "admin/users" }
22
- ]
23
- end
24
-
25
- def pages
26
- Tomify.models.page.all.as_json(only: [:active, :name, :path, :root, :template, :parent_id])
27
- end
28
-
29
- def public_pages
30
- Tomify.models.page.where(parent_id: nil).as_json(
31
- only: [:active, :name, :path, :root],
32
- include: [children: { only: [:active, :name, :path] }]
33
- )
34
- end
35
-
36
- def public_settings
37
- Tomify.models.setting.where(public: true).as_json(only: [:name, :value])
38
- end
39
11
  end
@@ -0,0 +1,76 @@
1
+ module Tomify::Concerns::Default::NavbarHelper
2
+ extend ActiveSupport::Concern
3
+
4
+ included do
5
+ class_attribute :_navbar, instance_accessor: false
6
+ self._navbar = {}
7
+
8
+ add_to_navbar :public, Proc.new { Tomify.models.page.for_navbar }
9
+ add_to_navbar :admin, [
10
+ { name: "App", path: "admin/settings" },
11
+ { name: "Pages", path: "admin/pages" },
12
+ { name: "Sidebars", path: "admin/sidebars" },
13
+ { name: "Uploads", path: "admin/uploads" },
14
+ { name: "Users", path: "admin/users" }
15
+ ]
16
+ end
17
+
18
+ class_methods do
19
+ def add_to_navbar(type, *pages)
20
+ self._navbar[type] ||= []
21
+ pages.each do |item|
22
+ self._navbar[type] << item
23
+ end
24
+ end
25
+
26
+ def prepend_to_navbar(type, *pages)
27
+ self._navbar[type] ||= []
28
+ pages.each do |item|
29
+ self._navbar[type].unshift item
30
+ end
31
+ end
32
+ end
33
+
34
+ def navbar
35
+ types = {}
36
+
37
+ self.class._navbar.each do |type, pages|
38
+ types[type] = []
39
+ pages.each do |item|
40
+ types[type].concat navbar_pages_from(item)
41
+ end
42
+ types[type].flatten!
43
+ end
44
+
45
+ types
46
+ end
47
+
48
+ private
49
+ def navbar_pages_from(item)
50
+ case item
51
+ when Proc
52
+ navbar_pages_from item.call
53
+ when Hash
54
+ navbar_pages_from_hash item
55
+ when Array
56
+ navbar_pages_from_array item
57
+ else
58
+ []
59
+ end
60
+ end
61
+
62
+ def navbar_pages_from_hash(hash)
63
+ hash.symbolize_keys!
64
+ return [] if hash[:active] == false
65
+ page = hash.slice(:children, :external, :name, :url)
66
+ page[:children] = navbar_pages_from page[:children]
67
+ page[:url] ||= "/#{hash[:path]}" if page[:children].empty?
68
+ [page]
69
+ end
70
+
71
+ def navbar_pages_from_array(array)
72
+ pages = []
73
+ array.each { |item| pages.concat navbar_pages_from(item) }
74
+ pages
75
+ end
76
+ end
@@ -4,6 +4,7 @@ module Tomify::Concerns::Default
4
4
  include Tomify::Concerns::Default::Helper
5
5
  include Tomify::Concerns::Default::AuthHelper
6
6
  include Tomify::Concerns::Default::EnvHelper
7
+ include Tomify::Concerns::Default::NavbarHelper
7
8
  include Tomify::Concerns::Default::ReactHelper
8
9
 
9
10
  included do
@@ -4,8 +4,8 @@ module Tomify::CarrierwaveHelper
4
4
  return unless settings = Tomify.setting(:aws)
5
5
 
6
6
  descendants = CarrierWave::Uploader::Base.descendants
7
- descendants.push CarrierWave::Uploader::Base
8
- descendants.push CarrierWave
7
+ descendants << CarrierWave::Uploader::Base
8
+ descendants << CarrierWave
9
9
  descendants.each do |klass|
10
10
  klass.configure do |config|
11
11
  config.fog_provider = "fog/aws"
@@ -2,6 +2,9 @@ module Tomify::Concerns::Page
2
2
  extend ActiveSupport::Concern
3
3
 
4
4
  included do
5
+ mount_uploader :cover_image, Tomify.uploaders.setting
6
+ mount_uploader :share_image, Tomify.uploaders.setting
7
+
5
8
  belongs_to :sidebar, class_name: Tomify.models.sidebar.to_s, optional: true
6
9
  belongs_to :parent, class_name: self.to_s, optional: true
7
10
  has_many :children, class_name: self.to_s, foreign_key: :parent_id
@@ -35,21 +38,16 @@ module Tomify::Concerns::Page
35
38
  @files.sort_by! { |f| f == "default" ? "" : f } # Default First
36
39
  end
37
40
 
38
- def admin_params
39
- [
40
- :parent_id, :sidebar_id,
41
- :active, :root, :rank,
42
- :path, :name, :template,
43
- :title, :description,
44
- :cover_image, :share_image,
45
- :text
46
- ]
41
+ def for_env
42
+ all.as_json(only: [:active, :name, :path, :root, :template, :parent_id])
47
43
  end
48
- end
49
44
 
50
- def serializable_hash(options = nil)
51
- options = { include: [:parent, :sidebar] } if options.blank?
52
- super(options)
45
+ def for_navbar
46
+ where(parent_id: nil).as_json(
47
+ only: [:active, :name, :path],
48
+ include: [children: { only: [:active, :name, :path] }]
49
+ )
50
+ end
53
51
  end
54
52
 
55
53
  private
@@ -10,10 +10,4 @@ module Tomify::Concerns::Sidebar
10
10
 
11
11
  to_html :text
12
12
  end
13
-
14
- class_methods do
15
- def admin_params
16
- [:active, :name, :heading, :template, :text]
17
- end
18
- end
19
13
  end
@@ -17,12 +17,6 @@ module Tomify::Concerns::Upload
17
17
  uuid
18
18
  end
19
19
 
20
- class_methods do
21
- def admin_params
22
- [:uuid, :name, :file, :size, :content_type]
23
- end
24
- end
25
-
26
20
  private
27
21
  def set_model
28
22
  self.uuid ||= SecureRandom.uuid
@@ -21,16 +21,6 @@ module Tomify::Concerns::User
21
21
  scope :admin, -> { where(admin: true) }
22
22
  end
23
23
 
24
- class_methods do
25
- def admin_params
26
- [:admin, :email, :first_name, :last_name]
27
- end
28
-
29
- def public_params
30
- [:email, :first_name, :last_name, :password, :password_confirmation]
31
- end
32
- end
33
-
34
24
  def name
35
25
  "#{first_name} #{last_name}"
36
26
  end
@@ -43,11 +33,6 @@ module Tomify::Concerns::User
43
33
  tokens.find_or_create_by(name: name)
44
34
  end
45
35
 
46
- def serializable_hash(options = nil)
47
- options = { methods: [:name] } if options.blank?
48
- super options
49
- end
50
-
51
36
  private
52
37
  def format_email
53
38
  self.email = email.try(:strip).try(:downcase)
@@ -13,13 +13,8 @@ class Tomify::Setting < Tomify.models.base
13
13
  ["allow_signup", "aws", "name", "email", "timezone"]
14
14
  end
15
15
 
16
- def self.admin_params
17
- [:type, :name, :public, :value, json: {}]
18
- end
19
-
20
- def serializable_hash(options = nil)
21
- options ||= {}
22
- super({ methods: [:type] }.update(options))
16
+ def self.for_env
17
+ Tomify.models.setting.where(public: true).as_json(only: [:name, :value])
23
18
  end
24
19
 
25
20
  private
@@ -1,3 +1,26 @@
1
1
  class Tomify::SettingUploader < Tomify.uploaders.base
2
- process resize_to_fit: [1000000000, 100]
2
+ def self.width
3
+ Proc.new do |uploader|
4
+ uploader.setting["width"] || 1000000000
5
+ end
6
+ end
7
+
8
+ def self.height
9
+ Proc.new do |uploader|
10
+ uploader.setting["height"] || 1000000000
11
+ end
12
+ end
13
+
14
+ process resize_to_fit: [width, height]
15
+
16
+ def setting_key
17
+ [
18
+ model.class.name.split("::").last.underscore,
19
+ mounted_as, "dimensions"
20
+ ].join("_")
21
+ end
22
+
23
+ def setting
24
+ Tomify.setting(setting_key) || { "width" => width, "height" => height }
25
+ end
3
26
  end
@@ -1,6 +1,6 @@
1
1
  .container-fluid
2
2
  .row.text-center
3
- .col-md-8.col-md-offset-2
3
+ .dynamic-md
4
4
  .page= record.text_to_html
5
5
  - if contact_email = setting(:contact_email)
6
6
  %p
@@ -1,4 +1,4 @@
1
1
  .container-fluid
2
2
  .row.text-center
3
- .col-md-8.col-md-offset-2
3
+ .dynamic-md
4
4
  .page= record.text_to_html
@@ -1,5 +1,5 @@
1
1
  - sidebar = @page.sidebar if @page&.sidebar&.active
2
- .container-fluid
2
+ .container-fluid{class: "with#{"out" unless sidebar }-sidebar"}
3
3
  .row
4
4
  - if sidebar
5
5
  .col-md-8= yield
@@ -1,17 +1,20 @@
1
- %link(rel="apple-touch-icon" sizes="57x57" href="/apple-icon-57x57.png")
2
- %link(rel="apple-touch-icon" sizes="60x60" href="/apple-icon-60x60.png")
3
- %link(rel="apple-touch-icon" sizes="72x72" href="/apple-icon-72x72.png")
4
- %link(rel="apple-touch-icon" sizes="76x76" href="/apple-icon-76x76.png")
5
- %link(rel="apple-touch-icon" sizes="114x114" href="/apple-icon-114x114.png")
6
- %link(rel="apple-touch-icon" sizes="120x120" href="/apple-icon-120x120.png")
7
- %link(rel="apple-touch-icon" sizes="144x144" href="/apple-icon-144x144.png")
8
- %link(rel="apple-touch-icon" sizes="152x152" href="/apple-icon-152x152.png")
9
- %link(rel="apple-touch-icon" sizes="180x180" href="/apple-icon-180x180.png")
10
- %link(rel="icon" type="image/png" sizes="192x192" href="/android-icon-192x192.png")
11
- %link(rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png")
12
- %link(rel="icon" type="image/png" sizes="96x96" href="/favicon-96x96.png")
13
- %link(rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png")
14
- %link(rel="manifest" href="/manifest.json")
15
- %meta(name="msapplication-TileColor" content="#ffffff")
16
- %meta(name="msapplication-TileImage" content="/ms-icon-144x144.png")
17
- %meta(name="theme-color" content="#ffffff")
1
+ - if meta = setting(:meta)
2
+ - if meta["favicon"] == "ready"
3
+ %link(rel="apple-touch-icon" sizes="57x57" href="/apple-icon-57x57.png")
4
+ %link(rel="apple-touch-icon" sizes="60x60" href="/apple-icon-60x60.png")
5
+ %link(rel="apple-touch-icon" sizes="72x72" href="/apple-icon-72x72.png")
6
+ %link(rel="apple-touch-icon" sizes="76x76" href="/apple-icon-76x76.png")
7
+ %link(rel="apple-touch-icon" sizes="114x114" href="/apple-icon-114x114.png")
8
+ %link(rel="apple-touch-icon" sizes="120x120" href="/apple-icon-120x120.png")
9
+ %link(rel="apple-touch-icon" sizes="144x144" href="/apple-icon-144x144.png")
10
+ %link(rel="apple-touch-icon" sizes="152x152" href="/apple-icon-152x152.png")
11
+ %link(rel="apple-touch-icon" sizes="180x180" href="/apple-icon-180x180.png")
12
+ %link(rel="icon" type="image/png" sizes="192x192" href="/android-icon-192x192.png")
13
+ %link(rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png")
14
+ %link(rel="icon" type="image/png" sizes="96x96" href="/favicon-96x96.png")
15
+ %link(rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png")
16
+ %meta(name="msapplication-TileColor" content="#ffffff")
17
+ %meta(name="msapplication-TileImage" content="/ms-icon-144x144.png")
18
+ %meta(name="theme-color" content="#ffffff")
19
+ - if meta["manifest"] == "ready"
20
+ %link(rel="manifest" href="/manifest.json")
@@ -1,3 +1,3 @@
1
1
  module Tomify
2
- VERSION = "0.0.9"
2
+ VERSION = "0.1.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tomify
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.9
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tom Prats
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-05-11 00:00:00.000000000 Z
11
+ date: 2017-06-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -334,6 +334,7 @@ files:
334
334
  - app/controllers/tomify/concerns/default/auth_helper.rb
335
335
  - app/controllers/tomify/concerns/default/env_helper.rb
336
336
  - app/controllers/tomify/concerns/default/helper.rb
337
+ - app/controllers/tomify/concerns/default/navbar_helper.rb
337
338
  - app/controllers/tomify/concerns/default/react_helper.rb
338
339
  - app/controllers/tomify/public/controller.rb
339
340
  - app/controllers/tomify/public/pages_controller.rb