tomify 0.0.9 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/assets/javascripts/tomify/default/array.coffee +1 -0
- data/app/assets/javascripts/tomify/dynamic/react/components/admin/pages.coffee.erb +8 -0
- data/app/assets/javascripts/tomify/dynamic/react/components/admin/settings.coffee +1 -1
- data/app/assets/javascripts/tomify/dynamic/react/components/layout/admin_navbar.coffee +18 -5
- data/app/assets/javascripts/tomify/dynamic/react/components/layout/public_navbar.coffee +11 -10
- data/app/assets/javascripts/tomify/dynamic/react/components/public/profile.coffee +7 -9
- data/app/assets/javascripts/tomify/dynamic/react/components/public/sessions/show.coffee +19 -21
- data/app/assets/javascripts/tomify/dynamic/react/components/public/subscription.coffee +13 -15
- data/app/assets/stylesheets/tomify/_default.scss +34 -1
- data/app/controllers/tomify/api/admin/pages_controller.rb +14 -0
- data/app/controllers/tomify/api/admin/settings_controller.rb +7 -0
- data/app/controllers/tomify/api/admin/sidebars_controller.rb +3 -0
- data/app/controllers/tomify/api/admin/uploads_controller.rb +3 -0
- data/app/controllers/tomify/api/admin/users_controller.rb +14 -5
- data/app/controllers/tomify/api/public/users_controller.rb +4 -0
- data/app/controllers/tomify/concerns/api/admin.rb +0 -4
- data/app/controllers/tomify/concerns/api/helpers.rb +37 -17
- data/app/controllers/tomify/concerns/api/json.rb +9 -4
- data/app/controllers/tomify/concerns/api/public.rb +0 -4
- data/app/controllers/tomify/concerns/default/env_helper.rb +3 -31
- data/app/controllers/tomify/concerns/default/navbar_helper.rb +76 -0
- data/app/controllers/tomify/concerns/default.rb +1 -0
- data/app/helpers/tomify/carrierwave_helper.rb +2 -2
- data/app/models/tomify/concerns/page.rb +11 -13
- data/app/models/tomify/concerns/sidebar.rb +0 -6
- data/app/models/tomify/concerns/upload.rb +0 -6
- data/app/models/tomify/concerns/user.rb +0 -15
- data/app/models/tomify/setting.rb +2 -7
- data/app/uploaders/tomify/setting_uploader.rb +24 -1
- data/app/views/templates/contact.haml +1 -1
- data/app/views/templates/default.haml +1 -1
- data/app/views/tomify/defaults/_container.haml +1 -1
- data/app/views/tomify/defaults/_meta.haml +20 -17
- data/lib/tomify/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d7adedc7c0800596d7cb43f4fa62d73f062c60de
|
4
|
+
data.tar.gz: 22f4e06750d3eff48a100d576de05fc0c6f36368
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4f317a362b20c86647022e24a3bec525f70ff0b724c84df451d1d723d1de61a80e3e92fcb349fa2c2731bfbb8812f203865cd2a25e2fabc3188b531ba2d47651
|
7
|
+
data.tar.gz: ac43203ca348e0da245ed209dba4c2520adbe84c29f988dc5e207cccb4f94406cd43e9a2996c758946d34292c328b0b8ef2df4a5bf46788ad5924d6a10628bc3
|
@@ -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
|
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
|
-
|
23
|
-
<
|
24
|
-
|
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
|
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=
|
14
|
+
<a href={page.url} target={"_blank" if page.external}>{page.name}</a>
|
15
15
|
</li>
|
16
16
|
render: ->
|
17
|
-
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
|
31
|
-
@
|
32
|
-
|
33
|
-
|
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
|
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="
|
17
|
-
<div className="
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
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="
|
11
|
-
|
12
|
-
|
13
|
-
<
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
<div className="
|
18
|
-
<div className="
|
19
|
-
<
|
20
|
-
|
21
|
-
|
22
|
-
<
|
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
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
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="
|
17
|
-
<div className="
|
18
|
-
<
|
19
|
-
|
20
|
-
{
|
21
|
-
|
22
|
-
|
23
|
-
<
|
24
|
-
<
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
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
|
-
|
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,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
|
11
|
-
|
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
|
@@ -1,6 +1,6 @@
|
|
1
1
|
module Tomify::Concerns::Api::Helpers
|
2
2
|
def find_records
|
3
|
-
@records ||= model.where(
|
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
|
-
|
15
|
+
record.update!(record_params)
|
16
16
|
end
|
17
17
|
|
18
18
|
def destroy_record
|
19
|
-
|
19
|
+
record.destroy!
|
20
20
|
end
|
21
21
|
|
22
|
-
|
23
|
-
|
24
|
-
|
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
|
-
|
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
|
-
|
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
|
48
|
-
|
49
|
-
|
43
|
+
def record
|
44
|
+
@record
|
45
|
+
end
|
50
46
|
|
51
|
-
|
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:
|
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:
|
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:
|
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:
|
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,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
|
-
|
7
|
-
|
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
|
8
|
-
descendants
|
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
|
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
|
-
|
51
|
-
|
52
|
-
|
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
|
@@ -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.
|
17
|
-
|
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
|
-
|
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,17 +1,20 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
%link(rel="apple-touch-icon" sizes="
|
4
|
-
%link(rel="apple-touch-icon" sizes="
|
5
|
-
%link(rel="apple-touch-icon" sizes="
|
6
|
-
%link(rel="apple-touch-icon" sizes="
|
7
|
-
%link(rel="apple-touch-icon" sizes="
|
8
|
-
%link(rel="apple-touch-icon" sizes="
|
9
|
-
%link(rel="apple-touch-icon" sizes="
|
10
|
-
%link(rel="icon"
|
11
|
-
%link(rel="icon"
|
12
|
-
%link(rel="icon" type="image/png" sizes="
|
13
|
-
%link(rel="icon" type="image/png" sizes="
|
14
|
-
%link(rel="
|
15
|
-
%
|
16
|
-
%meta(name="msapplication-
|
17
|
-
%meta(name="
|
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")
|
data/lib/tomify/version.rb
CHANGED
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
|
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-
|
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
|