rails_com 1.2.1 → 1.2.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (68) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +165 -0
  3. data/README.md +18 -26
  4. data/Rakefile +6 -9
  5. data/app/assets/config/rails_com_manifest.js +2 -0
  6. data/app/assets/javascripts/controllers/active_storage_ext/videos/show.ready.js +1 -0
  7. data/app/assets/javascripts/rails_com/common.js +3 -0
  8. data/app/assets/javascripts/rails_com/fetch_xhr_script.js +3 -2
  9. data/app/assets/stylesheets/controllers/active_storage_ext/videos/show.css +7 -0
  10. data/app/assets/stylesheets/controllers/active_storage_ext/videos/transfer.css +4 -0
  11. data/app/controllers/active_storage/attachments_controller.rb +13 -0
  12. data/app/controllers/active_storage_ext/videos_controller.rb +25 -0
  13. data/app/controllers/concerns/the_common_api.rb +7 -1
  14. data/app/helpers/rails_com/active_helper.rb +14 -10
  15. data/app/helpers/rails_com/assets_helper.rb +40 -14
  16. data/app/helpers/rails_com/format_helper.rb +37 -0
  17. data/app/models/state_machine.rb +10 -6
  18. data/app/views/active_storage/attachments/_image_item.html.erb +6 -0
  19. data/app/views/active_storage/attachments/_list.html.erb +28 -0
  20. data/app/views/active_storage/attachments/_list_edit.html.erb +25 -0
  21. data/app/views/active_storage/attachments/_list_form.html.erb +28 -0
  22. data/app/views/active_storage/attachments/_video_item.html.erb +6 -0
  23. data/app/views/active_storage/attachments/destroy.js.erb +1 -0
  24. data/app/views/active_storage_ext/videos/show.html.erb +6 -0
  25. data/app/views/kaminari/_next_page.html.erb +1 -1
  26. data/app/views/kaminari/_prev_page.html.erb +1 -1
  27. data/app/views/shared/_error_messages.html.erb +1 -1
  28. data/config/locales/en.yml +5 -0
  29. data/config/locales/zh.yml +5 -0
  30. data/config/routes.rb +10 -5
  31. data/lib/assets/javascripts/input-attachment.js +83 -22
  32. data/lib/mina/git2.rb +59 -0
  33. data/lib/rails_com.rb +22 -12
  34. data/lib/rails_com/config.rb +3 -1
  35. data/lib/rails_com/core_ext/array.rb +35 -17
  36. data/lib/rails_com/core_ext/date.rb +24 -0
  37. data/lib/rails_com/core_ext/numeric.rb +11 -0
  38. data/lib/rails_com/core_ext/string.rb +15 -0
  39. data/lib/rails_com/engine.rb +23 -11
  40. data/lib/rails_com/{controller_helper.rb → helpers/controller_helper.rb} +0 -20
  41. data/lib/rails_com/{model_helper.rb → helpers/model_helper.rb} +3 -3
  42. data/lib/rails_com/{controllers.rb → meta/controllers.rb} +0 -0
  43. data/lib/rails_com/{models.rb → meta/models.rb} +1 -0
  44. data/lib/rails_com/{routes.rb → meta/routes.rb} +9 -0
  45. data/lib/rails_com/rails_ext/activestorage_attached.rb +5 -5
  46. data/lib/rails_com/rails_ext/attachment_transfer.rb +40 -0
  47. data/lib/rails_com/rails_ext/named_base.rb +9 -0
  48. data/lib/rails_com/rails_ext/template_renderer.rb +18 -1
  49. data/lib/rails_com/rails_ext/video_response.rb +28 -0
  50. data/lib/{utils → rails_com/utils}/ip_helper.rb +0 -0
  51. data/lib/rails_com/{helpers → utils}/jobber.rb +0 -0
  52. data/lib/rails_com/utils/num_helper.rb +45 -0
  53. data/lib/rails_com/{setting.rb → utils/setting.rb} +0 -0
  54. data/lib/rails_com/utils/time_helper.rb +58 -0
  55. data/lib/rails_com/{helpers → utils}/uid_helper.rb +0 -0
  56. data/lib/rails_com/version.rb +1 -1
  57. data/lib/templates/erb/scaffold/_form.html.erb.tt +2 -2
  58. data/lib/templates/erb/scaffold/index.html.erb.tt +21 -13
  59. data/lib/templates/erb/scaffold/show.html.erb.tt +14 -5
  60. data/lib/templates/rails/scaffold_controller/api_controller.rb.tt +48 -0
  61. data/lib/templates/rails/scaffold_controller/controller.rb.tt +16 -15
  62. metadata +45 -35
  63. data/MIT-LICENSE +0 -20
  64. data/app/controllers/common_controller.rb +0 -10
  65. data/app/controllers/the_guards_controller.rb +0 -18
  66. data/app/helpers/rails_com/common_helper.rb +0 -13
  67. data/app/views/the_guards/index.html.erb +0 -18
  68. data/lib/utils/time_helper.rb +0 -37
@@ -1,31 +1,57 @@
1
1
  # frozen_string_literal: true
2
2
  module RailsCom::AssetsHelper
3
3
 
4
- def js_load(filename = nil, root: nil, **options)
4
+ def js_load(filename = nil, **options)
5
5
  filename ||= "controllers/#{controller_path}/#{action_name}"
6
- root ||= @_rendered_from || Rails.root
7
- path = root + 'app/assets/javascripts' + filename.to_s
8
- if File.exist?(path.to_s + '.js') || File.exist?(path.to_s + '.js.erb')
6
+ paths = assets_load_path(filename)
7
+
8
+ if paths.any? { |path| File.exist?(path) }
9
9
  javascript_include_tag filename, options
10
10
  end
11
11
  end
12
12
 
13
- def css_load(filename = nil, root: nil, **options)
13
+ def css_load(filename = nil, **options)
14
14
  filename ||= "controllers/#{controller_path}/#{action_name}"
15
- root ||= @_rendered_from || Rails.root
16
- path = root + 'app/assets/stylesheets' + filename.to_s
17
- if File.exist?(path.to_s + '.css')
15
+ paths = assets_load_path(filename, relative_path: 'app/assets/stylesheets', ext: ['.css', '.css.erb'])
16
+
17
+ if paths.any? { |path| File.exist?(path) }
18
18
  stylesheet_link_tag filename, options
19
19
  end
20
20
  end
21
21
 
22
- def js_ready(filename = nil, root: nil, **options)
23
- filename ||= "controllers/#{controller_path}/#{action_name}.ready"
24
- root ||= @_rendered_from || Rails.root
25
- path = root + 'app/assets/javascripts' + filename.to_s
26
- if File.exist?(path.to_s + '.js') || File.exist?(path.to_s + '.js.erb')
27
- javascript_include_tag filename, options
22
+ def js_pack(filename = nil, **options)
23
+ filename ||= "controllers/#{controller_path}/#{action_name}"
24
+ paths = assets_load_path(filename, relative_path: 'app/javascript/packs', **options)
25
+
26
+ if paths.any? { |path| File.exist?(path) }
27
+ javascript_pack_tag filename, options
28
28
  end
29
29
  end
30
30
 
31
+ def js_ready(**options)
32
+ js_load("controllers/#{controller_path}/#{action_name}.ready", **options)
33
+ end
34
+
35
+ def js_pack_ready(**options)
36
+ js_pack("controllers/#{controller_path}/#{action_name}-ready", **options)
37
+ end
38
+
39
+ def assets_load_path(filename, relative_path: 'app/assets/javascripts', ext: ['.js', '.js.erb'])
40
+ paths = []
41
+
42
+ file_path = Pathname.new(relative_path).join filename
43
+ rails_path = Rails.root.join file_path
44
+ ext.each do |name|
45
+ paths << rails_path.to_s + name
46
+ end
47
+ if @_rendered_from
48
+ engine_path = @_rendered_from.join file_path
49
+ ext.each do |name|
50
+ paths << engine_path.to_s + name
51
+ end
52
+ end
53
+
54
+ paths
55
+ end
56
+
31
57
  end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+ module RailsCom::FormatHelper
3
+
4
+ def simple_format_hash(hash_text, html_options = {}, options = {})
5
+ wrapper_tag = options.fetch(:wrapper_tag, :p)
6
+
7
+ hash_text.map do |k, v|
8
+ if k.to_s.rstrip.end_with?(':')
9
+ text = k.to_s + ' ' + v.to_s
10
+ else
11
+ text = k.to_s + ': ' + v.to_s
12
+ end
13
+
14
+ content_tag(wrapper_tag, text, html_options)
15
+ end.join("\n\n").html_safe
16
+ end
17
+
18
+ def simple_format(text, html_options = {}, options = {})
19
+ if text.is_a?(Hash)
20
+ return simple_format_hash(text, html_options, options)
21
+ end
22
+
23
+ if text.is_a?(Array)
24
+ begin
25
+ hash_text = text.to_h
26
+ return simple_format_hash(hash_text, html_options, options)
27
+ rescue TypeError
28
+ return content_tag(:span, text, html_options)
29
+ end
30
+ end
31
+
32
+ text = text.to_s
33
+
34
+ super
35
+ end
36
+
37
+ end
@@ -3,12 +3,12 @@ module StateMachine
3
3
  # to defined next_xxx_states in class
4
4
 
5
5
  # obj.next_to state: 'xxx'
6
- def next_to(options = {})
6
+ def next_to(options = {}, &block)
7
7
  options.each do |column, value|
8
8
  if self.class.method_defined? "next_#{column}_states"
9
9
  _next_state = self.send("next_#{column}_states").first
10
10
  else
11
- _next_state = next_state(column)
11
+ _next_state = next_state(column, &block)
12
12
  end
13
13
 
14
14
  if _next_state == value.to_s
@@ -21,17 +21,17 @@ module StateMachine
21
21
  end
22
22
  end
23
23
 
24
- def next_to!(options = {})
24
+ def next_to!(options = {}, &block)
25
25
  self.next_to(options, &block)
26
26
  self.save!
27
27
  end
28
28
 
29
- def trigger_to(options = {})
29
+ def trigger_to(options = {}, &block)
30
30
  options.each do |column, value|
31
31
  if self.class.method_defined? "next_#{column}_states"
32
32
  _next_states = self.send "next_#{column}_states"
33
33
  else
34
- _next_states = next_states(column)
34
+ _next_states = next_states(column, &block)
35
35
  end
36
36
 
37
37
  if _next_states.include?(value.to_s)
@@ -44,11 +44,15 @@ module StateMachine
44
44
  end
45
45
  end
46
46
 
47
- def trigger_to!(options = {})
47
+ def trigger_to!(options = {}, &block)
48
48
  self.trigger_to(options, &block)
49
49
  self.save!
50
50
  end
51
51
 
52
+ def next_state(state_name, &block)
53
+ next_states(state_name, &block).first
54
+ end
55
+
52
56
  # obj.next_states(:state) do |result|
53
57
  # result.reject
54
58
  # end
@@ -0,0 +1,6 @@
1
+ <div class="ui small image">
2
+ <%= link_to rails_attachment_path(image.id), method: :delete, data: {confirm: 'Are you sure?'}, remote: true, class: 'ui grey right corner mini label' do %>
3
+ <i class="times icon"></i>
4
+ <% end %>
5
+ <%= image_tag image, id: "attachment_#{image.id}", data: { target: 'attachment.src' }, style: 'max-width: 100%' %>
6
+ </div>
@@ -0,0 +1,28 @@
1
+ <% if target.is_a?(ActiveStorage::Attached::One) && target.attached? %>
2
+ <% if target.content_type.to_s.start_with?('image') %>
3
+ <%= image_tag target, style: 'max-width: 100%', class: 'ui small image' %>
4
+ <% elsif target.content_type.to_s.start_with?('video') %>
5
+ <%= link_to target.filename, rails_video_path(video), target: '_blank' %>
6
+ <% else %>
7
+ <p id="attachment_<%= target.id %>">
8
+ <%= link_to target.filename, rails_blob_path(target) %>
9
+ </p>
10
+ <% end %>
11
+ <% elsif target.is_a?(ActiveStorage::Attached::Many) %>
12
+ <% target.each do |file| %>
13
+ <% if file.content_type.to_s.start_with?('image') %>
14
+ <%= image_tag file, style: 'max-width: 100%', class: 'ui small image' %>
15
+ <% elsif file.content_type.to_s.start_with?('video') %>
16
+ <p id="attachment_<%= file.id %>">
17
+ <%= link_to file.filename, rails_video_path(file), target: '_blank' %>
18
+ </p>
19
+ <% else %>
20
+ <p id="attachment_<%= file.id %>">
21
+ <%= link_to file.filename, rails_blob_path(file) %>
22
+ </p>
23
+ <% end %>
24
+ <% end %>
25
+ <% end %>
26
+
27
+
28
+
@@ -0,0 +1,25 @@
1
+ <% if target.is_a?(ActiveStorage::Attached::One) && target.attached? %>
2
+ <% if target.content_type.to_s.start_with?('image') %>
3
+ <%= render partial: 'active_storage/attachments/image_item', locals: { image: target } %>
4
+ <% elsif target.content_type.to_s.start_with?('video') %>
5
+ <%= render partial: 'active_storage/attachments/video_item', locals: { video: target } %>
6
+ <% else %>
7
+ <p id="attachment_<%= target.id %>">
8
+ <%= link_to target.filename, rails_blob_path(target) %>
9
+ <%= link_to 'x', rails_attachment_path(target.id), method: :delete, data: {confirm: 'Are you sure?'}, remote: true %>
10
+ </p>
11
+ <% end %>
12
+ <% elsif target.is_a?(ActiveStorage::Attached::Many) %>
13
+ <% target.each do |file| %>
14
+ <% if file.content_type.to_s.start_with?('image') %>
15
+ <%= render partial: 'active_storage/attachments/image_item', locals: { image: file } %>
16
+ <% elsif file.content_type.to_s.start_with?('video') %>
17
+ <%= render partial: 'active_storage/attachments/video_item', locals: { video: file } %>
18
+ <% else %>
19
+ <p id="attachment_<%= file.id %>">
20
+ <%= link_to file.filename, rails_blob_path(file) %>
21
+ <%= link_to 'x', rails_attachment_path(file.id), method: :delete, data: {confirm: 'Are you sure?'}, remote: true %>
22
+ </p>
23
+ <% end %>
24
+ <% end %>
25
+ <% end %>
@@ -0,0 +1,28 @@
1
+ <div class="top attached inline fields" id="<%= "#{target.record.class.name.underscore}_attachments_#{target.record.id}" %>">
2
+ <div class="six wide field"></div>
3
+ <div class="field" id="file_preview" data-controller="attachment">
4
+ <% if target.is_a?(ActiveStorage::Attached::One) && target.attached? %>
5
+ <% if target.content_type.to_s.start_with?('image') %>
6
+ <%= render partial: 'active_storage/attachments/image_item', locals: { image: target } %>
7
+ <% else %>
8
+ <p id="attachment_<%= target.id %>">
9
+ <%= link_to target.filename, rails_blob_path(target) %>
10
+ <%= link_to 'x', rails_attachment_path(target.id), method: :delete, data: {confirm: 'Are you sure?'}, remote: true %>
11
+ </p>
12
+ <% end %>
13
+ <% elsif target.is_a?(ActiveStorage::Attached::Many) %>
14
+ <% target.each do |file| %>
15
+ <% if file.content_type.to_s.start_with?('image') %>
16
+ <%= render partial: 'active_storage/attachments/image_item', locals: { image: file } %>
17
+ <% else %>
18
+ <p id="attachment_<%= file.id %>">
19
+ <%= link_to file.filename, rails_blob_path(file) %>
20
+ <%= link_to 'x', rails_attachment_path(file.id), method: :delete, data: {confirm: 'Are you sure?'}, remote: true %>
21
+ </p>
22
+ <% end %>
23
+ <% end %>
24
+ <% end %>
25
+ </div>
26
+ </div>
27
+
28
+
@@ -0,0 +1,6 @@
1
+ <p id="attachment_<%= video.id %>">
2
+ <%= link_to video.filename, rails_video_path(video), target: '_blank' %>
3
+ <%= link_to 'transfer', transfer_rails_video_path(video.id), method: :put, data: { confirm: 'are you sure?' }, class: 'ui label' %>
4
+ <%= link_to 'x', rails_attachment_path(video.id), method: :delete, data: {confirm: 'Are you sure?'}, remote: true %>
5
+ </p>
6
+
@@ -0,0 +1 @@
1
+ $('#attachment_<%= @attachment.id %>').remove();
@@ -0,0 +1,6 @@
1
+ <div class="ui basic center aligned segment">
2
+ <%= video_tag @video.service_url(disposition: params[:disposition]),
3
+ controls: true,
4
+ preload: 'auto'
5
+ %>
6
+ </div>
@@ -1,3 +1,3 @@
1
1
  <%= link_to url, class: 'item', title: t('views.pagination.next'), remote: remote do %>
2
- <i class="right arrow icon"></i>
2
+ <i class="step forward icon"></i>
3
3
  <% end %>
@@ -1,3 +1,3 @@
1
1
  <%= link_to url, class: 'item', title: t('views.pagination.previous'), remote: remote do %>
2
- <i class="left arrow icon"></i>
2
+ <i class="step backward icon"></i>
3
3
  <% end %>
@@ -1,7 +1,7 @@
1
1
  <% if target.errors.any? %>
2
2
  <div class="ui negative message">
3
3
  <i class="close icon"></i>
4
- <div class="header">有 <%= target.errors.count %> 处问题导至无法提交:</div>
4
+ <div class="header"><%= target.errors.count %> <% if target.errors.count == 1 %> error <% else %> errors <% end %>: </div>
5
5
  <ul class="list">
6
6
  <% target.errors.full_messages.each do |msg| %>
7
7
  <li><%= msg %></li>
@@ -1,4 +1,9 @@
1
1
  en:
2
+ controller:
3
+ show: Show
4
+ edit: Edit
5
+ destroy: Delete
6
+ search: Search
2
7
  views:
3
8
  pagination:
4
9
  first: First
@@ -1,4 +1,9 @@
1
1
  zh:
2
+ controller:
3
+ show: 详情
4
+ edit: 编辑
5
+ destroy: 删除
6
+ search: 搜索
2
7
  errors:
3
8
  format: "%{attribute} %{message}"
4
9
  messages:
data/config/routes.rb CHANGED
@@ -1,8 +1,13 @@
1
1
  Rails.application.routes.draw do
2
-
3
- resources :the_guards
4
- controller :common do
5
- get :locales
2
+
3
+ scope :rails, as: 'rails', module: 'active_storage' do
4
+ resources :attachments, only: [:destroy]
5
+ end
6
+
7
+ scope :rails, as: 'rails', module: 'active_storage_ext' do
8
+ resources :videos, only: [:show] do
9
+ put :transfer, on: :member
10
+ end
6
11
  end
7
12
 
8
- end
13
+ end
@@ -4,7 +4,7 @@
4
4
  /*
5
5
  * Input Field with Attachment
6
6
  * Fork and Inspired by inlineAttachment(https://github.com/Rovak/InlineAttachment)
7
- * Author: 覃明圆
7
+ * Author: mingyuan.qin
8
8
  * Contact: mingyuan0715@foxmail.com
9
9
  */
10
10
 
@@ -14,7 +14,6 @@
14
14
  var InputAttachment = function(options) {
15
15
  this.settings = InputAttachment.util.merge(options, InputAttachment.defaults);
16
16
  this.editor = InputAttachment.editors.initEditor(this.settings['editor']);
17
- this.fileInput = InputAttachment.editors.initEditor(this.settings['fileInput']);
18
17
  this.filenameTag = '{filename}';
19
18
  this.lastValue = null;
20
19
  };
@@ -83,8 +82,8 @@
83
82
  /**
84
83
  * Inserts the given value at the current cursor position of the textarea element
85
84
  *
86
- * @param {HtmlElement} el
87
- * @param {String} value Text which will be inserted at the cursor position
85
+ * @param {HTMLElement} el
86
+ * @param {String} text Text which will be inserted at the cursor position
88
87
  */
89
88
  insertTextAtCursor: function(el, text) {
90
89
  var scrollPos = el.scrollTop,
@@ -93,17 +92,17 @@
93
92
  range;
94
93
 
95
94
  if ((el.selectionStart || el.selectionStart === '0')) {
96
- browser = "ff";
95
+ browser = 'ff';
97
96
  } else if (document.selection) {
98
- browser = "ie";
97
+ browser = 'ie';
99
98
  }
100
99
 
101
- if (browser === "ie") {
100
+ if (browser === 'ie') {
102
101
  el.focus();
103
102
  range = document.selection.createRange();
104
103
  range.moveStart('character', -el.value.length);
105
104
  strPos = range.text.length;
106
- } else if (browser === "ff") {
105
+ } else if (browser === 'ff') {
107
106
  strPos = el.selectionStart;
108
107
  }
109
108
 
@@ -111,7 +110,7 @@
111
110
  var back = (el.value).substring(strPos, el.value.length);
112
111
  el.value = front + text + back;
113
112
  strPos = strPos + text.length;
114
- if (browser === "ie") {
113
+ if (browser === 'ie') {
115
114
  el.focus();
116
115
  range = document.selection.createRange();
117
116
  range.moveStart('character', -el.value.length);
@@ -150,6 +149,8 @@
150
149
 
151
150
  uploadFileInput: '',
152
151
 
152
+ previewDiv: 'file_preview',
153
+
153
154
  /**
154
155
  * Extension which will be used when a file extension could not
155
156
  * be detected
@@ -187,7 +188,7 @@
187
188
  /**
188
189
  * Text which will be used when uploading has failed
189
190
  */
190
- errorText: "Error uploading file",
191
+ errorText: 'Error uploading file',
191
192
 
192
193
  /**
193
194
  * Extra parameters which will be send when uploading a file
@@ -231,7 +232,7 @@
231
232
  },
232
233
 
233
234
  /**
234
- * When a file has succesfully been uploaded
235
+ * When a file has successfully been uploaded
235
236
  */
236
237
  onFileUploaded: function() {}
237
238
  };
@@ -262,14 +263,14 @@
262
263
  }
263
264
  }
264
265
 
265
- var remoteFilename = "image-" + Date.now() + "." + extension;
266
+ var remoteFilename = 'image-' + Date.now() + '.' + extension;
266
267
  if (typeof settings.remoteFilename === 'function') {
267
268
  remoteFilename = settings.remoteFilename(file);
268
269
  }
269
270
 
270
271
  formData.append(settings.uploadFieldName, file, remoteFilename);
271
272
 
272
- // Append the extra parameters to the formdata
273
+ // Append the extra parameters to the form data
273
274
  if (typeof settings.extraParams === "object") {
274
275
  for (var key in settings.extraParams) {
275
276
  if (settings.extraParams.hasOwnProperty(key)) {
@@ -281,7 +282,7 @@
281
282
  xhr.open('POST', settings.uploadUrl);
282
283
 
283
284
  // Add any available extra headers
284
- if (typeof settings.extraHeaders === "object") {
285
+ if (typeof settings.extraHeaders === 'object') {
285
286
  for (var header in settings.extraHeaders) {
286
287
  if (settings.extraHeaders.hasOwnProperty(header)) {
287
288
  xhr.setRequestHeader(header, settings.extraHeaders[header]);
@@ -303,10 +304,43 @@
303
304
  return xhr;
304
305
  };
305
306
 
307
+ InputAttachment.prototype.previewFile = function(file, obj) {
308
+ var fileList = document.getElementById(this.settings.previewDiv),
309
+ img = new Image();
310
+ img.classList.add('ui', 'small', 'image');
311
+
312
+ if(window.URL){
313
+ //File API
314
+ img.src = window.URL.createObjectURL(file); //创建一个object URL,并不是你的本地路径
315
+ img.onload = function(e) {
316
+ window.URL.revokeObjectURL(this.src); //图片加载后,释放object URL
317
+ }
318
+ } else if(window.FileReader){
319
+ //opera不支持createObjectURL/revokeObjectURL方法。我们用FileReader对象来处理
320
+ var reader = new FileReader();
321
+ reader.readAsDataURL(file);
322
+ reader.onload = function(e){
323
+ img.src = this.result;
324
+ }
325
+ }else{
326
+ //ie
327
+ obj.select();
328
+ obj.blur();
329
+ var nfile = document.selection.createRange().text;
330
+ document.selection.empty();
331
+ img.src = nfile;
332
+ img.onload=function(e){
333
+
334
+ }
335
+ }
336
+
337
+ fileList.appendChild(img);
338
+ };
339
+
306
340
  /**
307
341
  * Returns if the given file is allowed to handle
308
342
  *
309
- * @param {File} clipboard data file
343
+ * @param {File} file clipboard data file
310
344
  */
311
345
  InputAttachment.prototype.isFileAllowed = function(file) {
312
346
  if (file.kind === 'string') { return false; }
@@ -321,7 +355,7 @@
321
355
  * Handles upload response
322
356
  *
323
357
  * @param {XMLHttpRequest} xhr
324
- * @return {Void}
358
+ * @return {void}
325
359
  */
326
360
  InputAttachment.prototype.onFileUploadResponse = function(xhr) {
327
361
  if (this.settings.onFileUploadResponse.call(this, xhr) !== false) {
@@ -337,7 +371,7 @@
337
371
  }
338
372
  var text = this.editor.getValue().replace(this.lastValue, newValue);
339
373
  this.editor.setValue(text);
340
- this.settings.onFileUploaded.call(this, filename);
374
+ this.settings.onFileUploaded.call(this, filename, result);
341
375
  }
342
376
  }
343
377
  };
@@ -347,7 +381,7 @@
347
381
  * Called when a file has failed to upload
348
382
  *
349
383
  * @param {XMLHttpRequest} xhr
350
- * @return {Void}
384
+ * @return {void}
351
385
  */
352
386
  InputAttachment.prototype.onFileUploadError = function(xhr) {
353
387
  if (this.settings.onFileUploadError.call(this, xhr) !== false) {
@@ -360,7 +394,7 @@
360
394
  * Called when a file has been inserted, either by drop or paste
361
395
  *
362
396
  * @param {File} file
363
- * @return {Void}
397
+ * @return {void}
364
398
  */
365
399
  InputAttachment.prototype.onFileInserted = function(file) {
366
400
  if (this.settings.onFileReceived.call(this, file) !== false) {
@@ -369,9 +403,8 @@
369
403
  }
370
404
  };
371
405
 
372
-
373
406
  /**
374
- * Called when a paste event occured
407
+ * Called when a paste event occurred
375
408
  * @param {Event} e
376
409
  * @return {Boolean} if the event was handled
377
410
  */
@@ -380,7 +413,7 @@
380
413
  clipboardData = e.clipboardData,
381
414
  items;
382
415
 
383
- if (typeof clipboardData === "object") {
416
+ if (typeof clipboardData === 'object') {
384
417
  items = clipboardData.items || clipboardData.files || [];
385
418
 
386
419
  for (var i = 0; i < items.length; i++) {
@@ -430,6 +463,20 @@
430
463
  return result;
431
464
  };
432
465
 
466
+ InputAttachment.prototype.imagePreview = function(e){
467
+ var result = false;
468
+
469
+ for (var i = 0; i < e.target.files.length; i++) {
470
+ var file = e.target.files[i];
471
+ if (this.isFileAllowed(file)) {
472
+ result = true;
473
+ this.previewFile(file, e.target);
474
+ }
475
+ }
476
+
477
+ return result;
478
+ };
479
+
433
480
  InputAttachment.prototype.onFileInputClick = function(e) {
434
481
  console.log('fileInputClick', e)
435
482
  };
@@ -476,6 +523,20 @@
476
523
  }
477
524
  }
478
525
 
526
+ function attachToPreview(options) {
527
+ options = options || {};
528
+ var fileInput = document.getElementById(options['fileInput']);
529
+ options['fileInput'] = fileInput;
530
+ var inlineattach = new InputAttachment(options);
531
+
532
+ if (fileInput) {
533
+ fileInput.addEventListener('change', function(e) {
534
+ inlineattach.imagePreview(e)
535
+ }, false);
536
+ }
537
+ }
538
+
479
539
  window.attachToInput = attachToInput;
540
+ window.attachToPreview = attachToPreview;
480
541
 
481
542
  })(document, window);