documentation 1.0.1 → 1.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a6a7eb85e7b85787e4d484056de4034f93aea7b8
4
- data.tar.gz: 235d5670da70ba8f1b7468dac9584eb2fdfe52cb
3
+ metadata.gz: 7ee69981e399c23b45190208a36587d22ef937fa
4
+ data.tar.gz: c681d1aa01d8d237697e5fd742cfb26620f11f74
5
5
  SHA512:
6
- metadata.gz: cfc40c753fe359e3697e9fedd1cd30245c0e73f5df68e8aa4f0f17f416a7bec369a71d441bf3adfdef9401e37715269ab48c23ec540e1d45909be3ca74b9f918
7
- data.tar.gz: e2a26c2538c3bdaccce81624ad5bee3d3566bfd6b3ad7ba5e8ee243880037c272a75c3281076f79e5819e0aeabec881674b551e420ffc9f3b993d323bd70893f
6
+ metadata.gz: b73915ea29d76182c81f0b8f2aee4986bdbbf0794c08a4571817df2539405cabe4658521c31f963c053f81dac9dbc490eac724446c85f18f995a2f966b44c670
7
+ data.tar.gz: ac5424d483dff52ec3e1ec9dcb5a05a7e3c99a1e34282009667626972bcb59cda977251506465ac7b26c2e9492db45f3fc8bda33d152329cfc3a7493e10887b1
@@ -2,6 +2,7 @@
2
2
  #= require jquery_ujs
3
3
  #= require documentation/jquery-ui
4
4
  #= require documentation/jquery.autosize
5
+ #= require nifty/dialog
5
6
 
6
7
  $ ->
7
8
  $('form.pageForm textarea').autosize({append: '\n\n'})
@@ -11,4 +12,67 @@ $ ->
11
12
  form = $(this).parents('form')
12
13
  url = form.attr('action')
13
14
  $.post(url, form.serialize());
14
-
15
+
16
+ $('.js-screenshot').on 'click', (e)->
17
+ e.preventDefault()
18
+ openUploadDialog()
19
+
20
+ $('.edit-article').on 'drop', (e)->
21
+ e.stopPropagation()
22
+ e.preventDefault()
23
+
24
+ file = e.originalEvent.dataTransfer.files[0]
25
+
26
+ openUploadDialog(file)
27
+
28
+ openUploadDialog = (file)->
29
+ editForm = $('.edit-article').find('form')
30
+ contentArea = editForm.find('#page_content')
31
+ caretPosition = contentArea.get(0).selectionStart
32
+ content = contentArea.val()
33
+
34
+ uploadFormUrl = editForm.find('.js-screenshot').attr('href')
35
+ uploadFormUrl = uploadFormUrl + "?filename=#{file.name}" if file?
36
+
37
+ Nifty.Dialog.open
38
+ url: uploadFormUrl
39
+ afterLoad: (dialog)->
40
+ form = dialog.find('form')
41
+ form.find('#screenshot_alt_text').focus()
42
+
43
+ dialog.on 'submit', 'form', (e)->
44
+ form = $(this)
45
+ formData = new FormData(form.get(0))
46
+
47
+ if file?
48
+ filename = file.name
49
+ formData.append('screenshot[upload_file]', file)
50
+ else
51
+ filename = form.find('#screenshot_upload_file').val()
52
+
53
+ fileExt = filename.split('.').pop().toLowerCase()
54
+ if $.inArray(fileExt, ['gif','png','jpg','jpeg']) == -1
55
+ alert("Invalid file extension (allowed: gif, png, jpg, jpeg)")
56
+ return false
57
+
58
+ $.ajax
59
+ url: form.attr('action')
60
+ type: form.attr('method')
61
+ data: formData
62
+ processData: false
63
+ contentType: false
64
+ success: (data)->
65
+ screenshotLink = "![#{data.title}*centre](#{data.path})"
66
+ newContent = content.substring(0, caretPosition) + screenshotLink + content.substring(caretPosition)
67
+ newCaretPosition = (content.substring(0, caretPosition) + screenshotLink).length
68
+ contentArea.val(newContent)
69
+
70
+ contentArea.focus()
71
+ contentArea.get(0).setSelectionRange(newCaretPosition, newCaretPosition)
72
+
73
+ Nifty.Dialog.closeTopDialog()
74
+
75
+ error: (xhr, status, errorThrown)->
76
+ console.log xhr.responseText
77
+
78
+ false
@@ -1,5 +1,6 @@
1
1
  /*
2
2
  *= require documentation/reset
3
+ *= require nifty/dialog
3
4
  *= require_self
4
5
  *= require documentation/markdown
5
6
  *= require documentation/page_form
@@ -193,6 +194,7 @@ a.button, input.button {
193
194
  border-radius:5px;
194
195
  margin-left:5px;
195
196
  appearance:none;
197
+ vertical-align:middle;
196
198
  &.delete {
197
199
  color:#F6744F;
198
200
  border-color:lighten(#F6744F, 20%);
@@ -30,6 +30,7 @@ form.pageForm {
30
30
  dt { width:120px; float:left; color:#999;padding-top:6px;}
31
31
  dd { margin-left:160px; }
32
32
  dd input { width:100%; font-size:1.1em;}
33
+ dd.padded { padding-top: 6px; }
33
34
  }
34
35
 
35
36
  p.submit {
@@ -9,6 +9,12 @@ module Documentation
9
9
  render :template => 'documentation/shared/not_found', :layout => false
10
10
  end
11
11
 
12
+ before_filter do
13
+ unless authorizer.can_use_ui?
14
+ render :template => 'documentation/shared/not_found', :layout => false
15
+ end
16
+ end
17
+
12
18
  private
13
19
 
14
20
  def authorizer
@@ -44,6 +44,21 @@ module Documentation
44
44
  redirect_to @page.parent ? page_path(@page.parent.full_permalink) : root_path, :notice => "Page has been removed successfully."
45
45
  end
46
46
 
47
+ def screenshot
48
+ authorizer.check! :upload, @page
49
+ if request.post?
50
+ @screenshot = Screenshot.new(screenshot_params)
51
+ if @screenshot.save
52
+ render :json => { :id => @screenshot.id, :title => @screenshot.alt_text, :path => @screenshot.upload.path }, :status => :created
53
+ else
54
+ render :json => { :errors => @screenshot.errors }, :status => :unprocessible_entity
55
+ end
56
+ else
57
+ @screenshot = Screenshot.new
58
+ render 'screenshot', :layout => false
59
+ end
60
+ end
61
+
47
62
  def positioning
48
63
  authorizer.check! :reposition_page, @page
49
64
  @pages = @page ? @page.children : Page.roots
@@ -70,5 +85,9 @@ module Documentation
70
85
  params.require(:page).permit(:title, :permalink, :content, :favourite)
71
86
  end
72
87
 
88
+ def screenshot_params
89
+ params.require(:screenshot).permit(:upload_file, :alt_text)
90
+ end
91
+
73
92
  end
74
93
  end
@@ -0,0 +1,14 @@
1
+ module Documentation
2
+ class Screenshot < ActiveRecord::Base
3
+
4
+ attachment :upload
5
+
6
+ before_validation do
7
+ if self.upload_file && self.alt_text.blank?
8
+ self.alt_text = self.upload_file.original_filename
9
+ end
10
+ true
11
+ end
12
+
13
+ end
14
+ end
@@ -1,6 +1,6 @@
1
1
  - @page_title = @page.breadcrumb.reverse.map(&:title).join(" - ")
2
2
 
3
- %section.content
3
+ %section.content.edit-article
4
4
  = documentation_breadcrumb_for @page
5
5
  = form_for @page, :url => @page.new_record? ? new_page_path(@page.parent ? @page.parent.full_permalink : nil) : edit_page_path(@page.full_permalink), :html => {:class => 'pageForm'} do |f|
6
6
  = error_messages_for @page
@@ -9,4 +9,8 @@
9
9
  %dl
10
10
  %dt= f.label :permalink
11
11
  %dd= f.text_field :permalink, :placeholder => t('.permalink_placeholder')
12
- %p.submit= f.submit t('.save'), :class => 'button'
12
+
13
+ %p.submit
14
+ - if authorizer.can_upload?(@page)
15
+ = link_to t('.add_screenshot'), upload_screenshot_path, :class => 'button preview js-screenshot'
16
+ = f.submit t('.save'), :class => 'button'
@@ -0,0 +1,15 @@
1
+ = form_for @screenshot, :url => upload_screenshot_path, :html => {:class => 'pageForm'} do |f|
2
+ %dl
3
+ %dt= f.label :upload_file, "Upload File"
4
+ %dd.padded
5
+ - if params[:filename]
6
+ = params[:filename]
7
+ - else
8
+ = f.file_field :upload_file
9
+
10
+ %dl
11
+ %dt= f.label :alt_text, "Screenshot Title"
12
+ %dd= f.text_field :alt_text
13
+
14
+ %p.submit
15
+ = f.submit "Upload Screenshot", :class => 'button'
@@ -47,6 +47,7 @@ en:
47
47
  title_placeholder: Enter a title for this page
48
48
  content_placeholder: 'Use Markdown to enter page content'
49
49
  permalink_placeholder: Automatically generated if left blank
50
+ add_screenshot: Add Screenshot
50
51
  save: Save Page
51
52
 
52
53
  positioning:
@@ -4,6 +4,7 @@ Documentation::Engine.routes.draw do
4
4
  match 'positioning(/*path)', :to => 'pages#positioning', :as => 'page_positioning', :via => [:get, :post]
5
5
  match 'edit(/*path)', :to => 'pages#edit', :as => 'edit_page', :via => [:get, :patch]
6
6
  match 'delete(/*path)', :to => 'pages#destroy', :as => 'delete_page', :via => [:delete]
7
+ match 'screenshot', :to => 'pages#screenshot', :as => 'upload_screenshot', :via => [:get, :post]
7
8
  get 'search', :to => 'pages#search', :as => 'search'
8
9
  get '*path' => 'pages#show', :as => 'page'
9
10
  root :to => 'pages#index'
@@ -0,0 +1,16 @@
1
+ class CreateNiftyAttachmentsTable < ActiveRecord::Migration
2
+
3
+ def up
4
+ create_table :nifty_attachments do |t|
5
+ t.integer :parent_id
6
+ t.string :parent_type, :token, :digest, :role, :file_name, :file_type
7
+ t.binary :data, :limit => 10.megabytes
8
+ t.timestamps
9
+ end
10
+ end
11
+
12
+ def down
13
+ drop_table :nifty_attachments
14
+ end
15
+
16
+ end
@@ -0,0 +1,7 @@
1
+ class CreateDocumentationScreenshots < ActiveRecord::Migration
2
+ def change
3
+ create_table :documentation_screenshots do |t|
4
+ t.string :alt_text
5
+ end
6
+ end
7
+ end
@@ -4,6 +4,8 @@ require 'sass-rails'
4
4
  require 'jquery-rails'
5
5
  require 'dynamic_form'
6
6
  require 'ostruct'
7
+ require 'nifty/attachments'
8
+ require 'nifty/dialog'
7
9
 
8
10
  require 'documentation/version'
9
11
  require 'documentation/errors'
@@ -25,10 +25,18 @@ module Documentation
25
25
  true
26
26
  end
27
27
 
28
+ def can_upload?(page)
29
+ true
30
+ end
31
+
28
32
  def can_search?
29
33
  true
30
34
  end
31
35
 
36
+ def can_use_ui?
37
+ true
38
+ end
39
+
32
40
  def check!(action, object = :none)
33
41
  action_method_name = "can_#{action}?"
34
42
  if self.respond_to?(action_method_name)
@@ -1,3 +1,3 @@
1
1
  module Documentation
2
- VERSION = '1.0.1'
2
+ VERSION = '1.0.2'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: documentation
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Adam Cooke
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-07-23 00:00:00.000000000 Z
11
+ date: 2014-07-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -166,6 +166,34 @@ dependencies:
166
166
  - - "<"
167
167
  - !ruby/object:Gem::Version
168
168
  version: '1.0'
169
+ - !ruby/object:Gem::Dependency
170
+ name: nifty-attachments
171
+ requirement: !ruby/object:Gem::Requirement
172
+ requirements:
173
+ - - ">="
174
+ - !ruby/object:Gem::Version
175
+ version: 1.0.3
176
+ type: :runtime
177
+ prerelease: false
178
+ version_requirements: !ruby/object:Gem::Requirement
179
+ requirements:
180
+ - - ">="
181
+ - !ruby/object:Gem::Version
182
+ version: 1.0.3
183
+ - !ruby/object:Gem::Dependency
184
+ name: nifty-dialog
185
+ requirement: !ruby/object:Gem::Requirement
186
+ requirements:
187
+ - - "~>"
188
+ - !ruby/object:Gem::Version
189
+ version: '1'
190
+ type: :runtime
191
+ prerelease: false
192
+ version_requirements: !ruby/object:Gem::Requirement
193
+ requirements:
194
+ - - "~>"
195
+ - !ruby/object:Gem::Version
196
+ version: '1'
169
197
  - !ruby/object:Gem::Dependency
170
198
  name: sqlite3
171
199
  requirement: !ruby/object:Gem::Requirement
@@ -207,10 +235,12 @@ files:
207
235
  - app/controllers/documentation/pages_controller.rb
208
236
  - app/helpers/documentation/application_helper.rb
209
237
  - app/models/documentation/page.rb
238
+ - app/models/documentation/screenshot.rb
210
239
  - app/views/documentation/pages/_admin_buttons.html.haml
211
240
  - app/views/documentation/pages/form.html.haml
212
241
  - app/views/documentation/pages/index.html.haml
213
242
  - app/views/documentation/pages/positioning.html.haml
243
+ - app/views/documentation/pages/screenshot.html.haml
214
244
  - app/views/documentation/pages/search.html.haml
215
245
  - app/views/documentation/pages/show.html.haml
216
246
  - app/views/documentation/shared/access_denied.html.haml
@@ -221,6 +251,8 @@ files:
221
251
  - config/locales/en.yml
222
252
  - config/routes.rb
223
253
  - db/migrate/20140711185212_create_documentation_pages.rb
254
+ - db/migrate/20140724111844_create_nifty_attachments_table.rb
255
+ - db/migrate/20140724114255_create_documentation_screenshots.rb
224
256
  - db/seeds.rb
225
257
  - lib/documentation.rb
226
258
  - lib/documentation/authorizer.rb