tomify 0.0.9 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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