smithycms 0.6.10 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (189) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/smithy/application.js +1 -0
  3. data/app/assets/javascripts/smithy/layout.coffee +13 -0
  4. data/app/assets/stylesheets/smithy/application.scss +3 -0
  5. data/app/assets/stylesheets/smithy/layout.scss +32 -13
  6. data/app/assets/stylesheets/smithy/tabs.scss +3 -0
  7. data/app/controllers/smithy/assets_controller.rb +1 -1
  8. data/app/controllers/smithy/content_resources_controller.rb +1 -1
  9. data/app/controllers/smithy/pages_controller.rb +15 -1
  10. data/app/models/smithy/page.rb +14 -1
  11. data/app/models/smithy/permitted_params.rb +1 -1
  12. data/app/views/layouts/smithy/application.html.erb +16 -9
  13. data/app/views/smithy/pages/_content_tab.html.erb +14 -0
  14. data/app/views/smithy/pages/_form.html.erb +16 -32
  15. data/app/views/smithy/pages/_meta_tab.html.erb +8 -0
  16. data/app/views/smithy/pages/_page_related.html.erb +1 -0
  17. data/app/views/smithy/pages/_seo_tab.html.erb +5 -0
  18. data/config/routes.rb +3 -0
  19. data/lib/smithy/version.rb +1 -1
  20. data/vendor/cache/CFPropertyList-2.3.2.gem +0 -0
  21. data/vendor/cache/actionmailer-4.1.10.gem +0 -0
  22. data/vendor/cache/actionpack-4.1.10.gem +0 -0
  23. data/vendor/cache/actionview-4.1.10.gem +0 -0
  24. data/vendor/cache/activemodel-4.1.10.gem +0 -0
  25. data/vendor/cache/activerecord-4.1.10.gem +0 -0
  26. data/vendor/cache/activesupport-4.1.10.gem +0 -0
  27. data/vendor/cache/addressable-2.3.8.gem +0 -0
  28. data/vendor/cache/arel-5.0.1.20140414130214.gem +0 -0
  29. data/vendor/cache/autoprefixer-rails-6.3.5.gem +0 -0
  30. data/vendor/cache/awesome_nested_set-3.0.3.gem +0 -0
  31. data/vendor/cache/aws-sdk-2.2.31.gem +0 -0
  32. data/vendor/cache/aws-sdk-core-2.2.31.gem +0 -0
  33. data/vendor/cache/aws-sdk-resources-2.2.31.gem +0 -0
  34. data/vendor/cache/bcrypt-3.1.10.gem +0 -0
  35. data/vendor/cache/bootstrap-sass-3.2.0.2.gem +0 -0
  36. data/vendor/cache/builder-3.2.2.gem +0 -0
  37. data/vendor/cache/byebug-4.0.5.gem +0 -0
  38. data/vendor/cache/capybara-2.4.4.gem +0 -0
  39. data/vendor/cache/celluloid-0.16.0.gem +0 -0
  40. data/vendor/cache/coderay-1.1.0.gem +0 -0
  41. data/vendor/cache/coffee-rails-4.1.1.gem +0 -0
  42. data/vendor/cache/coffee-script-2.4.1.gem +0 -0
  43. data/vendor/cache/coffee-script-source-1.10.0.gem +0 -0
  44. data/vendor/cache/columnize-0.9.0.gem +0 -0
  45. data/vendor/cache/concurrent-ruby-1.0.1.gem +0 -0
  46. data/vendor/cache/coveralls-0.7.12.gem +0 -0
  47. data/vendor/cache/crass-1.0.2.gem +0 -0
  48. data/vendor/cache/database_cleaner-1.4.1.gem +0 -0
  49. data/vendor/cache/diff-lcs-1.2.5.gem +0 -0
  50. data/vendor/cache/docile-1.1.5.gem +0 -0
  51. data/vendor/cache/domain_name-0.5.23.gem +0 -0
  52. data/vendor/cache/dotenv-2.0.1.gem +0 -0
  53. data/vendor/cache/dotenv-rails-2.0.1.gem +0 -0
  54. data/vendor/cache/em-websocket-0.5.1.gem +0 -0
  55. data/vendor/cache/erubis-2.7.0.gem +0 -0
  56. data/vendor/cache/eventmachine-1.0.7.gem +0 -0
  57. data/vendor/cache/excon-0.49.0.gem +0 -0
  58. data/vendor/cache/execjs-2.6.0.gem +0 -0
  59. data/vendor/cache/factory_girl-4.5.0.gem +0 -0
  60. data/vendor/cache/factory_girl_rails-4.5.0.gem +0 -0
  61. data/vendor/cache/fakeweb-1.3.0.gem +0 -0
  62. data/vendor/cache/ffaker-2.0.0.gem +0 -0
  63. data/vendor/cache/ffi-1.9.8.gem +0 -0
  64. data/vendor/cache/fission-0.5.0.gem +0 -0
  65. data/vendor/cache/fog-1.38.0.gem +0 -0
  66. data/vendor/cache/fog-aliyun-0.1.0.gem +0 -0
  67. data/vendor/cache/fog-atmos-0.1.0.gem +0 -0
  68. data/vendor/cache/fog-aws-0.9.2.gem +0 -0
  69. data/vendor/cache/fog-brightbox-0.10.1.gem +0 -0
  70. data/vendor/cache/fog-cloudatcost-0.1.2.gem +0 -0
  71. data/vendor/cache/fog-core-1.36.0.gem +0 -0
  72. data/vendor/cache/fog-dynect-0.0.3.gem +0 -0
  73. data/vendor/cache/fog-ecloud-0.3.0.gem +0 -0
  74. data/vendor/cache/fog-google-0.1.0.gem +0 -0
  75. data/vendor/cache/fog-json-1.0.2.gem +0 -0
  76. data/vendor/cache/fog-local-0.3.0.gem +0 -0
  77. data/vendor/cache/fog-openstack-0.1.2.gem +0 -0
  78. data/vendor/cache/fog-powerdns-0.1.1.gem +0 -0
  79. data/vendor/cache/fog-profitbricks-0.0.5.gem +0 -0
  80. data/vendor/cache/fog-rackspace-0.1.1.gem +0 -0
  81. data/vendor/cache/fog-radosgw-0.0.5.gem +0 -0
  82. data/vendor/cache/fog-riakcs-0.1.0.gem +0 -0
  83. data/vendor/cache/fog-sakuracloud-1.7.5.gem +0 -0
  84. data/vendor/cache/fog-serverlove-0.1.2.gem +0 -0
  85. data/vendor/cache/fog-softlayer-1.1.0.gem +0 -0
  86. data/vendor/cache/fog-storm_on_demand-0.1.1.gem +0 -0
  87. data/vendor/cache/fog-terremark-0.1.0.gem +0 -0
  88. data/vendor/cache/fog-vmfusion-0.1.0.gem +0 -0
  89. data/vendor/cache/fog-voxel-0.1.0.gem +0 -0
  90. data/vendor/cache/fog-vsphere-0.6.3.gem +0 -0
  91. data/vendor/cache/fog-xenserver-0.2.3.gem +0 -0
  92. data/vendor/cache/fog-xml-0.1.2.gem +0 -0
  93. data/vendor/cache/font-awesome-sass-4.5.0.gem +0 -0
  94. data/vendor/cache/formatador-0.2.5.gem +0 -0
  95. data/vendor/cache/formtastic-3.1.4.gem +0 -0
  96. data/vendor/cache/formtastic-bootstrap-3.1.1.gem +0 -0
  97. data/vendor/cache/friendly_id-5.0.5.gem +0 -0
  98. data/vendor/cache/fuubar-2.0.0.gem +0 -0
  99. data/vendor/cache/guard-2.12.5.gem +0 -0
  100. data/vendor/cache/guard-compat-1.2.1.gem +0 -0
  101. data/vendor/cache/guard-livereload-2.4.0.gem +0 -0
  102. data/vendor/cache/guard-rspec-4.5.0.gem +0 -0
  103. data/vendor/cache/hitimes-1.2.2.gem +0 -0
  104. data/vendor/cache/http-cookie-1.0.2.gem +0 -0
  105. data/vendor/cache/http_parser.rb-0.6.0.gem +0 -0
  106. data/vendor/cache/httparty-0.13.7.gem +0 -0
  107. data/vendor/cache/i18n-0.7.0.gem +0 -0
  108. data/vendor/cache/inflecto-0.0.2.gem +0 -0
  109. data/vendor/cache/ipaddress-0.8.3.gem +0 -0
  110. data/vendor/cache/jmespath-1.1.3.gem +0 -0
  111. data/vendor/cache/jquery-rails-3.1.4.gem +0 -0
  112. data/vendor/cache/json-1.8.2.gem +0 -0
  113. data/vendor/cache/kaminari-0.16.3.gem +0 -0
  114. data/vendor/cache/kramdown-1.10.0.gem +0 -0
  115. data/vendor/cache/launchy-2.4.3.gem +0 -0
  116. data/vendor/cache/letter_opener-1.3.0.gem +0 -0
  117. data/vendor/cache/liquid-2.6.3.gem +0 -0
  118. data/vendor/cache/listen-2.10.0.gem +0 -0
  119. data/vendor/cache/lumberjack-1.0.9.gem +0 -0
  120. data/vendor/cache/mail-2.6.4.gem +0 -0
  121. data/vendor/cache/method_source-0.8.2.gem +0 -0
  122. data/vendor/cache/mime-types-2.4.3.gem +0 -0
  123. data/vendor/cache/mini_magick-4.5.1.gem +0 -0
  124. data/vendor/cache/mini_portile-0.6.2.gem +0 -0
  125. data/vendor/cache/minitest-5.5.1.gem +0 -0
  126. data/vendor/cache/multi_json-1.11.0.gem +0 -0
  127. data/vendor/cache/multi_xml-0.5.5.gem +0 -0
  128. data/vendor/cache/mysql2-0.3.18.gem +0 -0
  129. data/vendor/cache/nenv-0.2.0.gem +0 -0
  130. data/vendor/cache/netrc-0.10.3.gem +0 -0
  131. data/vendor/cache/nokogiri-1.6.6.2.gem +0 -0
  132. data/vendor/cache/nokogumbo-1.4.7.gem +0 -0
  133. data/vendor/cache/notiffany-0.0.6.gem +0 -0
  134. data/vendor/cache/pg-0.18.1.gem +0 -0
  135. data/vendor/cache/pry-0.10.1.gem +0 -0
  136. data/vendor/cache/rack-1.5.2.gem +0 -0
  137. data/vendor/cache/rack-cache-1.6.1.gem +0 -0
  138. data/vendor/cache/rack-livereload-0.3.15.gem +0 -0
  139. data/vendor/cache/rack-protection-1.5.3.gem +0 -0
  140. data/vendor/cache/rack-test-0.6.3.gem +0 -0
  141. data/vendor/cache/rails-4.1.10.gem +0 -0
  142. data/vendor/cache/railties-4.1.10.gem +0 -0
  143. data/vendor/cache/rake-10.4.2.gem +0 -0
  144. data/vendor/cache/rb-fsevent-0.9.4.gem +0 -0
  145. data/vendor/cache/rb-inotify-0.9.5.gem +0 -0
  146. data/vendor/cache/rbvmomi-1.8.2.gem +0 -0
  147. data/vendor/cache/refile-0.6.2.gem +0 -0
  148. data/vendor/cache/refile-mini_magick-0.2.0.gem +0 -0
  149. data/vendor/cache/refile-s3-0.2.0.gem +0 -0
  150. data/vendor/cache/remotipart-1.2.1.gem +0 -0
  151. data/vendor/cache/rest-client-1.8.0.gem +0 -0
  152. data/vendor/cache/rinku-1.7.3.gem +0 -0
  153. data/vendor/cache/rspec-3.2.0.gem +0 -0
  154. data/vendor/cache/rspec-core-3.2.2.gem +0 -0
  155. data/vendor/cache/rspec-expectations-3.2.0.gem +0 -0
  156. data/vendor/cache/rspec-mocks-3.2.1.gem +0 -0
  157. data/vendor/cache/rspec-rails-3.2.1.gem +0 -0
  158. data/vendor/cache/rspec-support-3.2.2.gem +0 -0
  159. data/vendor/cache/ruby-oembed-0.8.14.gem +0 -0
  160. data/vendor/cache/ruby-progressbar-1.7.5.gem +0 -0
  161. data/vendor/cache/sanitize-4.0.1.gem +0 -0
  162. data/vendor/cache/sass-3.4.22.gem +0 -0
  163. data/vendor/cache/sass-rails-5.0.4.gem +0 -0
  164. data/vendor/cache/shellany-0.0.1.gem +0 -0
  165. data/vendor/cache/shoulda-matchers-2.8.0.gem +0 -0
  166. data/vendor/cache/simplecov-0.9.2.gem +0 -0
  167. data/vendor/cache/simplecov-html-0.9.0.gem +0 -0
  168. data/vendor/cache/sinatra-1.4.7.gem +0 -0
  169. data/vendor/cache/slodown-0.1.3.gem +0 -0
  170. data/vendor/cache/slop-3.6.0.gem +0 -0
  171. data/vendor/cache/smithycms-auth-0.4.2.gem +0 -0
  172. data/vendor/cache/sprockets-3.5.2.gem +0 -0
  173. data/vendor/cache/sprockets-rails-2.3.3.gem +0 -0
  174. data/vendor/cache/sqlite3-1.3.10.gem +0 -0
  175. data/vendor/cache/term-ansicolor-1.3.0.gem +0 -0
  176. data/vendor/cache/terminal-notifier-guard-1.6.4.gem +0 -0
  177. data/vendor/cache/thor-0.19.1.gem +0 -0
  178. data/vendor/cache/thread_safe-0.3.5.gem +0 -0
  179. data/vendor/cache/tilt-2.0.2.gem +0 -0
  180. data/vendor/cache/timers-4.0.1.gem +0 -0
  181. data/vendor/cache/tins-1.3.5.gem +0 -0
  182. data/vendor/cache/trollop-2.1.2.gem +0 -0
  183. data/vendor/cache/tzinfo-1.2.2.gem +0 -0
  184. data/vendor/cache/unf-0.1.4.gem +0 -0
  185. data/vendor/cache/unf_ext-0.0.6.gem +0 -0
  186. data/vendor/cache/xml-simple-1.1.5.gem +0 -0
  187. data/vendor/cache/xpath-2.0.0.gem +0 -0
  188. metadata +176 -4
  189. data/app/views/layouts/smithy/wide.html.erb +0 -27
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a2e7e48128896913a10004670f400ca8529be8fb
4
- data.tar.gz: 2774df6156688fc67a89bce6d59cf8d359e60a52
3
+ metadata.gz: 8e488b0b840e5746ecfb42f5afdc5c406759a13d
4
+ data.tar.gz: 981f62d7db553a5328609359a3d4a0af906cc68c
5
5
  SHA512:
6
- metadata.gz: f13faaa540821280269ad9a0a9f12b813d09304ec6b96dbf0fe0d93fba9da23937b94db4ac19b1aac709a528d45dfb3f0e3817a6a8a204c78de7346824d4eb57
7
- data.tar.gz: 9fab5b50e447552d95ac1c3a5edf1f3c513673b03ca78e3ec6d7a1a9aba098972f34469961ea7733c77c0fb94539d1b776c62cb137d63ce4cac8c11cab4cd920
6
+ metadata.gz: 612329465b66651222def0240823a9504d5675cca25f04cb1bd857cad8272bf505e0e7706111b55e616ad20ba7d56ff7623337bd122838c625589b94e2f57fa8
7
+ data.tar.gz: 33550ffcc8c8cbff5e6a11776f30729b23a025841442124db7d96d14d6dee4239d7acbaed6cdcdb99d8f5e83fef0571f8e013cd22e52657af8e90f5c982450b0
@@ -20,4 +20,5 @@
20
20
  //= require zeroclipboard-2.2.0/ZeroClipboard.min.js
21
21
  //= require refile
22
22
  //= require smithy/smithy_editor
23
+ //= require smithy/layout
23
24
  //= require_tree .
@@ -0,0 +1,13 @@
1
+ setLayoutHeight = ->
2
+ $('#content.with-sidebar').css('min-height', $('#side').prop('scrollHeight') - $('#main').height() - 48)
3
+ $('#side').css('max-height', $(window).height()).affix('checkPosition')
4
+
5
+ $ ->
6
+ $('#side').affix
7
+ offset:
8
+ top: ->
9
+ this.top = $('.navbar').outerHeight(true)
10
+ setLayoutHeight()
11
+
12
+ $(window).on 'load resize', (e) ->
13
+ setLayoutHeight()
@@ -19,6 +19,8 @@
19
19
  *= depend_on smithy/templates.scss
20
20
  */
21
21
 
22
+ $tag-orange: #faa61a;
23
+ $tag-red: #C6311D;
22
24
  @import 'bootstrap_and_overrides';
23
25
  @import 'datatables/dataTables.bootstrap';
24
26
  @import 'datatables-responsive';
@@ -26,6 +28,7 @@
26
28
  @import 'forms';
27
29
  @import 'guides';
28
30
  @import 'pages';
31
+ @import 'tabs';
29
32
  @import 'templates';
30
33
  @import 'content_blocks';
31
34
  @import 'assets';
@@ -14,12 +14,9 @@ body { background:#444; padding:0; }
14
14
  }
15
15
 
16
16
  #side {
17
- // float:left; width:20%;
18
- position:relative;
19
17
  .actions { padding:16px 15px 0 15px ; }
20
18
  .nav-list {
21
19
  border-top:1px solid #393939;
22
- margin:16px 0 0 0;
23
20
  padding:0;
24
21
  .nav-list { margin:0; }
25
22
  li + .nav-header {
@@ -61,11 +58,38 @@ body { background:#444; padding:0; }
61
58
  }
62
59
  }
63
60
  }
61
+ #body {
62
+ @include clearfix(); position:relative;
63
+ #main { @extend .col-xs-12; }
64
+ &.with-sidebar {
65
+ #side {
66
+ @extend .col-xs-5;
67
+ @extend .col-sm-3;
68
+ @extend .col-md-2;
69
+ overflow:auto; padding-top:$grid-gutter-width/2; padding-bottom:$grid-gutter-width/2;
70
+ @media screen and (min-width: $screen-sm-min) {
71
+ position:absolute; top:0;
72
+ &.affix { position:fixed; }
73
+ &.affix-top { bottom: auto; }
74
+ }
75
+ }
76
+ #main {
77
+ @extend .col-xs-7;
78
+ @extend .col-sm-9;
79
+ @extend .col-md-10;
80
+ @extend .col-sm-offset-3;
81
+ @extend .col-md-offset-2;
82
+ }
83
+ }
84
+
85
+ #content { @extend .col-md-12; }
86
+ &.with-related {
87
+ #content { @extend .col-md-9; }
88
+ #related { @extend .col-md-3; }
89
+ }
90
+ }
64
91
  #main {
65
- // float:left; width:80%;
66
92
  background:#f9f9f9; margin:-12px 0 0 0; padding:0 0 24px 0; position:relative;
67
- -webkit-border-radius: 10px 0px 0px 10px;
68
- border-radius: 10px 0px 0px 10px;
69
93
  -webkit-box-shadow: 0px 0px 18px 0px rgba(0, 0, 0, 0.4);
70
94
  box-shadow: 0px 0px 18px 0px rgba(0, 0, 0, 0.4);
71
95
  > h1 { padding:24px 0 0 12px; }
@@ -74,14 +98,9 @@ body { background:#444; padding:0; }
74
98
  #related {}
75
99
  }
76
100
 
77
- .wide #main {
78
- > .container-fluid { padding-right:20px; }
79
- #content { border-right:0; }
80
- }
81
-
82
101
  #main-wide { background:#f9f9f9; padding:0 0 24px 0; position:relative; }
83
102
 
84
103
  #footer {
85
- color:#BBB; font-size:12px; text-align:right; padding:1em;
86
- a { color:#EEE; }
104
+ color:#BBB; font-size:12px; text-align:right; padding:1em; a { color:#EEE; }
105
+ a { color:$tag-orange; }
87
106
  }
@@ -0,0 +1,3 @@
1
+ .tab-content {
2
+ background:#fff; padding:$grid-gutter-width/2; border:1px solid $navbar-default-border; border-top:0;
3
+ }
@@ -8,7 +8,7 @@ module Smithy
8
8
 
9
9
  def index
10
10
  @asset_source = AssetSource.first
11
- respond_with @assets, :layout => 'smithy/wide' do |format|
11
+ respond_with @assets do |format|
12
12
  format.html
13
13
  format.json { render json: ::Smithy::AssetsDatatable.new(view_context, params[:type]) }
14
14
  end
@@ -11,7 +11,7 @@ class Smithy::ContentResourcesController < Smithy::BaseController
11
11
 
12
12
  def index
13
13
  @records = find_records
14
- respond_with @records, :layout => 'smithy/wide'
14
+ respond_with @records
15
15
  end
16
16
 
17
17
  def show
@@ -6,7 +6,7 @@ module Smithy
6
6
  include Smithy::Liquid::Rendering
7
7
  before_filter :load_page_from_path, :only => [ :show ]
8
8
  before_filter :initialize_page, :only => [ :new, :create ]
9
- before_filter :load_page, :only => [ :edit, :update, :destroy ]
9
+ before_filter :load_page, :only => [ :edit, :update, :destroy, :duplicate ]
10
10
  before_filter :load_parent, :except => [ :index, :show, :order, :selector_modal ]
11
11
  before_filter :load_root, :only => [ :index ]
12
12
  respond_to :html, :json
@@ -50,6 +50,20 @@ module Smithy
50
50
  respond_with @page.parent ? @page.parent : @page
51
51
  end
52
52
 
53
+ def duplicate
54
+ old_page = @page
55
+ @page = old_page.dup
56
+ @page.duplicate_page = old_page.id
57
+ @page.title << " (Copy)"
58
+ @page.permalink.clear
59
+ @page.browser_title.clear
60
+ @page.keywords.clear
61
+ @page.description.clear
62
+ respond_with @page do |format|
63
+ format.html { render(action: :new) }
64
+ end
65
+ end
66
+
53
67
  def order
54
68
  first = Smithy::Page.find(params[:order].shift)
55
69
  @parent = first.parent
@@ -3,6 +3,7 @@ module Smithy
3
3
  validates_presence_of :template, :title
4
4
  validate :validate_one_root
5
5
  validate :validate_exclusion_of_reserved_words
6
+ validate :validate_duplicate_page_exists
6
7
 
7
8
  belongs_to :template
8
9
  has_many :containers, :through => :template
@@ -14,13 +15,14 @@ module Smithy
14
15
 
15
16
  before_save :build_permalink
16
17
  before_save :set_published_at
18
+ before_save :copy_content_from_duplicate, on: :create, if: -> { self.duplicate_page.present? }
17
19
 
18
20
  accepts_nested_attributes_for :contents, :reject_if => lambda {|a| a['label'].blank? || a['container'].blank? || a['content_block'].blank? }, :allow_destroy => true
19
21
 
20
22
  scope :included_in_navigation, -> { where("show_in_navigation=? AND published_at <= ?", true, Time.now) }
21
23
  scope :published, -> { where('published_at <= ?', Time.now) }
22
24
 
23
- attr_accessor :publish
25
+ attr_accessor :publish, :duplicate_page
24
26
  attr_reader :liquid_context
25
27
 
26
28
  def self.page_selector_options
@@ -96,11 +98,22 @@ module Smithy
96
98
  self.permalink = self.root? ? title.parameterize : path.split('/').last unless self.permalink?
97
99
  end
98
100
 
101
+ def copy_content_from_duplicate
102
+ duplicate_page = Page.find(self.duplicate_page)
103
+ duplicate_page.contents.each do |content|
104
+ self.contents << content.dup
105
+ end
106
+ end
107
+
99
108
  def set_published_at
100
109
  self.published_at = Time.now if self.publish.present?
101
110
  self.published_at = nil if self.publish == false
102
111
  end
103
112
 
113
+ def validate_duplicate_page_exists
114
+ errors.add(:duplicate_page, "this page could not be found. Please choose another and try again.") if self.duplicate_page.present? && Page.find_by(id: self.duplicate_page).blank?
115
+ end
116
+
104
117
  def validate_exclusion_of_reserved_words
105
118
  reserved = %w(index new edit session login logout users smithy)
106
119
  errors.add(:title, "cannot contain reserved words (#{reserved.join(', ')})") if reserved.include?(self.title.to_s.parameterize)
@@ -38,7 +38,7 @@ module Smithy
38
38
  end
39
39
 
40
40
  def page_attributes
41
- [ :browser_title, :cache_length, :description, :external_link, :keywords, :permalink, :publish, :published_at, :show_in_navigation, :title, :parent_id, :template_id ]
41
+ [ :browser_title, :cache_length, :description, :external_link, :keywords, :permalink, :publish, :published_at, :show_in_navigation, :title, :parent_id, :template_id, :duplicate_page ]
42
42
  end
43
43
 
44
44
  def page_content_attributes
@@ -2,24 +2,31 @@
2
2
  <body>
3
3
  <%= render :partial => "layouts/smithy/shared/nav" %>
4
4
  <div class="container-fluid">
5
- <div class="row">
6
- <nav id="side" class="col-xs-5 col-sm-3 col-md-2">
7
- <%= yield :secondary_nav %>
8
- </nav>
9
- <div id="main" class="col-xs-7 col-sm-9 col-md-10">
5
+ <%- classes = 'row' -%>
6
+ <%- classes += ' with-sidebar' if content_for?(:secondary_nav) -%>
7
+ <%- classes += ' with-related' if content_for?(:related) -%>
8
+ <div id="body" class="<%= classes %>">
9
+ <% if content_for? :secondary_nav %>
10
+ <nav id="side" class="">
11
+ <%= yield :secondary_nav %>
12
+ </nav>
13
+ <% end %>
14
+ <div id="main">
10
15
  <% if content_for? :title %><h1><%= yield :title %></h1><% end %>
11
16
  <%= render :partial => "layouts/smithy/shared/flash", :locals => { flash: flash } %>
12
17
  <%= yield :top_content %>
13
18
  <div class="container-fluid">
14
19
  <section class="row" id="content-container">
15
20
 
16
- <article id="content" class="col-md-9">
21
+ <article id="content">
17
22
  <%= yield %>
18
23
  </article>
19
24
 
20
- <aside id="related" class="col-md-3">
21
- <%= yield :related %>
22
- </aside>
25
+ <% if content_for? :related %>
26
+ <aside id="related">
27
+ <%= yield :related %>
28
+ </aside>
29
+ <% end %>
23
30
 
24
31
  </section>
25
32
  </div>
@@ -0,0 +1,14 @@
1
+ <%= f.input :title %>
2
+ <%= f.input :parent, :include_blank => false, :collection => tree_for_select unless !@page.parent_id? %>
3
+ <%= f.input :show_in_navigation, :label => "Show page in site navigation" %>
4
+ <%= f.input :template, :as => :select, :collection => Smithy::Template.templates, :include_blank => false %>
5
+
6
+ <% if @page.persisted? && @page.external_link.blank? %>
7
+ <%= render :partial => "container", :collection => @page.containers, :locals => { :f => f } %>
8
+ <% elsif @page.external_link? %>
9
+ <%= f.inputs "Redirect" do %>
10
+ <%= f.input :external_link, :hint => "This page is currently being redirected to #{link_to @page.external_link, @page.external_link}".html_safe %>
11
+ <% end %>
12
+ <% else %>
13
+ <%= f.input :duplicate_page, as: :select, label: "Copy Content From", collection: tree_for_select %>
14
+ <% end %>
@@ -13,38 +13,22 @@
13
13
  <% end %>
14
14
 
15
15
  <%= semantic_form_for @page, :url => ( @page.persisted? ? page_path(@page.id) : pages_path ) do |f| %>
16
- <%= f.inputs "Page Information" do %>
17
- <%= f.input :title %>
18
- <%= f.input :permalink, :hint => "This will be auto-created if blank. Only fill it in if you know what you're doing" %>
19
- <%= f.input :parent, :include_blank => false, :collection => tree_for_select unless !@page.parent_id? %>
20
- <%= f.input :show_in_navigation, :label => "Show page in site navigation" %>
21
- <%= f.input :template, :as => :select, :collection => Smithy::Template.templates, :include_blank => false %>
22
- <%= render :partial => "smithy/pages/page_fields", :locals => { :f => f } if File.exists?(Rails.root.join('app', 'views', 'smithy', 'pages', '_page_fields.html.erb')) %>
23
- <% end %>
24
- <% if @page.persisted? && @page.external_link.blank? %>
25
- <h3>Content</h3>
26
- <%= render :partial => "container", :collection => @page.containers, :locals => { :f => f } %>
27
- <% elsif @page.external_link? %>
28
- <%= f.inputs "Redirect" do %>
29
- <%= f.input :external_link, :hint => "This page is currently being redirected to #{link_to @page.external_link, @page.external_link}".html_safe %>
30
- <% end %>
31
- <% end %>
32
- <h3 data-toggle="collapse" data-target="#page-meta">Meta <i class="fa fa-caret-down"></i></h3>
33
- <%= content_tag :div, :id => "page-meta", :class => "collapse" do %>
34
- <%= f.inputs do %>
35
- <%= f.input(:external_link) unless @page.external_link? %>
36
- <%= f.input :cache_length, :hint => "In seconds (eg. 600 is 10 minutes)" %>
37
- <%= render :partial => "smithy/pages/meta_fields", :locals => { :f => f } if File.exists?(Rails.root.join('app', 'views', 'smithy', 'pages', '_meta_fields.html.erb')) %>
38
- <% end %>
39
- <% end %>
40
- <h3 data-toggle="collapse" data-target="#page-seo">SEO <i class="fa fa-caret-down"></i></h3>
41
- <%= content_tag :div, :id => "page-seo", :class => "collapse" do %>
42
- <%= f.inputs do %>
43
- <%= f.input :browser_title %>
44
- <%= f.input :keywords, as: :string, input_html: { maxlength: nil } %>
45
- <%= f.input :description %>
46
- <% end %>
47
- <% end %>
16
+ <ul class="nav nav-tabs" role="tablist">
17
+ <li class="active"><a href="#page_content" role="tab" data-toggle="tab">Content</a></li>
18
+ <li><a href="#meta" role="tab" data-toggle="tab">Meta</a></li>
19
+ <li><a href="#seo" role="tab" data-toggle="tab">SEO</a></li>
20
+ </ul>
21
+ <div class="tab-content">
22
+ <div role="tabpanel" class="tab-pane active" id="page_content">
23
+ <%= render partial: 'smithy/pages/content_tab', locals: { f: f } %>
24
+ </div>
25
+ <div role="tabpanel" class="tab-pane" id="meta">
26
+ <%= render partial: 'smithy/pages/meta_tab', locals: { f: f } %>
27
+ </div>
28
+ <div role="tabpanel" class="tab-pane" id="seo">
29
+ <%= render partial: 'smithy/pages/seo_tab', locals: { f: f } %>
30
+ </div>
31
+ </div>
48
32
 
49
33
  <%= f.actions do %>
50
34
  <% if @page.published? %>
@@ -0,0 +1,8 @@
1
+ <%= f.inputs do %>
2
+ <%= f.input :permalink, :hint => "This will be auto-created if blank. Only fill it in if you know what you're doing" %>
3
+ <%= render :partial => "smithy/pages/page_fields", :locals => { :f => f } if File.exists?(Rails.root.join('app', 'views', 'smithy', 'pages', '_page_fields.html.erb')) %>
4
+
5
+ <%= f.input(:external_link) unless @page.external_link? %>
6
+ <%= f.input :cache_length, :hint => "In seconds (eg. 600 is 10 minutes)" %>
7
+ <%= render :partial => "smithy/pages/meta_fields", :locals => { :f => f } if File.exists?(Rails.root.join('app', 'views', 'smithy', 'pages', '_meta_fields.html.erb')) %>
8
+ <% end %>
@@ -19,4 +19,5 @@
19
19
 
20
20
  <%= content_tag :p, link_to("View Page", @page.path, class: 'btn btn-primary') if @page.persisted? && @page.published? %></p>
21
21
  <%= content_tag :p, link_to("Delete Page", page_path(@page.id), method: :delete, data: { confirm: "Are you sure you want to delete this page?" }, class: 'btn btn-danger') if @page.persisted? %></p>
22
+ <%= content_tag :p, link_to("Duplicate", duplicate_page_path(@page.id), method: :post, class: 'btn btn-info') if @page.persisted? %></p>
22
23
  <% end %>
@@ -0,0 +1,5 @@
1
+ <%= f.inputs do %>
2
+ <%= f.input :browser_title %>
3
+ <%= f.input :keywords, as: :string, input_html: { maxlength: nil } %>
4
+ <%= f.input :description %>
5
+ <% end %>
data/config/routes.rb CHANGED
@@ -19,6 +19,9 @@ Smithy::Engine.routes.draw do
19
19
  resources :content_blocks
20
20
  resources :guides, :only => :show
21
21
  resources :pages do
22
+ member do
23
+ post :duplicate
24
+ end
22
25
  collection do
23
26
  get :order
24
27
  get :selector_modal
@@ -1,3 +1,3 @@
1
1
  module Smithy
2
- VERSION = "0.6.10"
2
+ VERSION = "0.7.0"
3
3
  end
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file