tinymce-rails-imageupload 3.5.6.4 → 3.5.8.0

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG.markdown CHANGED
@@ -1,3 +1,10 @@
1
+ ## 3.5.8.0 (February 1, 2013)
2
+
3
+ * Tested with tinymce-rails 3.5.8
4
+ * Handle errors from the server, both in the JSON, and from the server (HTTP 5xx and so on)
5
+ * Don't submit the form without a file selected (fixes #1)
6
+ * Display a spinner when uploading (fixes #2)
7
+
1
8
  ## 3.5.6.4 (December 10, 2012)
2
9
 
3
10
  * Convert CoffeeScript to JavaScript to avoid depending on CoffeeScript (#19). Thanks to sobrinho (Gabriel Sobrinho)
data/README.markdown CHANGED
@@ -5,7 +5,7 @@
5
5
 
6
6
  This plugin borrows heavily from work done by [Peter Shoukry](http://77effects.com/).
7
7
 
8
- The icon used for the button comes from the icon set [Silk by famfamfam](http://www.famfamfam.com/lab/icons/silk/)
8
+ The icon used for the button comes from the icon set [Silk by famfamfam](http://www.famfamfam.com/lab/icons/silk/) and the spinner image from [ajaxload.info](http://ajaxload.info/).
9
9
 
10
10
  ## Requirements
11
11
 
@@ -56,6 +56,15 @@
56
56
 
57
57
  If the JSON response contains a `width` and/or `height` key, those will be used in the inserted HTML (`<img src="..." width="..." height="...">`), but if those are not present, the inserted HTML is just `<img src="...">`.
58
58
 
59
+ ## Error handling
60
+
61
+ To notify the uploader that an error occurred, return JSON containing a `error` key with a `message`.
62
+ The message gets show in a paragraph with the ID `error_message`, and the input label gets the class `invalid`.
63
+
64
+ Example response:
65
+
66
+ "{"error": {"message": "Invalid file type. Only .jpg, .png and .gif allowed"}}"
67
+
59
68
  ## Internationalization
60
69
 
61
70
  I18n is taken care of by `tinymce-rails`. This gem includes strings for english, norwegian, russian and portugese.
@@ -82,6 +91,10 @@ The available strings are listed below:
82
91
  title: 'Insert image',
83
92
  header: "Insert image",
84
93
  input: "Choose an image",
94
+ uploading: "Uploading…",
95
+ blank_input: "Must choose a file",
96
+ bad_response: "Got a bad response from the server",
97
+ blank_response: "Didn't get a response from the server",
85
98
  insert: "Insert",
86
99
  cancel: "Cancel"
87
100
  });
@@ -1,7 +1,7 @@
1
1
  module Tinymce
2
2
  module Rails
3
3
  module Imageupload
4
- VERSION = "3.5.6.4"
4
+ VERSION = "3.5.8.0"
5
5
  end
6
6
  end
7
7
  end
@@ -1,84 +1,131 @@
1
1
  <!DOCTYPE html>
2
2
  <html>
3
3
  <head>
4
+ <meta charset="utf-8">
4
5
  <title>{#uploadimage_dlg.title}</title>
6
+ <style type="text/css">
7
+ form { margin-top: 0.5em; }
8
+ label { margin-bottom: 0.5em; }
9
+ p#error_message { color: #E00; }
10
+ #upload_spinner { padding-top: 4px; padding-left: 3px; }
11
+ #upload_spinner.inactive { display: none; }
12
+ </style>
5
13
  <script type="text/javascript" src="../../tiny_mce_popup.js"></script>
6
14
  <script type="text/javascript">
7
15
  tinyMCEPopup.requireLangPack();
8
16
 
9
- function getFrameByName(name)
10
- {
11
- for (var i = 0; i < frames.length; i++)
12
- if (frames[i].name == name)
13
- return frames[i];
17
+ var UploadImageDialog = {
14
18
 
15
- return null;
16
- }
19
+ init: function() {
20
+ this.f = document.forms[0];
21
+ this.f.action = tinyMCEPopup.getParam("uploadimage_form_url", "/tinymce_assets");
22
+ document.getElementById("hint").value = tinyMCEPopup.getParam("uploadimage_hint", "");
23
+ document.getElementById("authenticity_token").value = this.getMetaContents('csrf-token');
17
24
 
18
- function getMetaContents(mn)
19
- {
20
- var m = (window.opener || window.parent).document.getElementsByTagName('meta');
25
+ this.iframe = document.getElementById("hidden_upload");
26
+ if(this.iframe.attachEvent)
27
+ this.iframe.attachEvent('onload', UploadImageDialog.uploadDone);
28
+ else
29
+ this.iframe.addEventListener('load', UploadImageDialog.uploadDone, false);
30
+ },
21
31
 
22
- for(var i in m)
23
- if(m[i].name == mn)
24
- return m[i].content;
32
+ insert: function() {
33
+ var input = document.getElementById("file_upload");
25
34
 
26
- return null;
27
- }
35
+ if(input.value != "") {
36
+ document.getElementById("upload_spinner").className = '';
37
+ this.f.submit();
38
+ } else
39
+ this.handleError(tinyMCEPopup.getLang("uploadimage_dlg.blank_input", "Must choose a file"));
40
+ },
41
+
42
+ uploadDone: function() {
43
+ document.getElementById("upload_spinner").className = 'inactive';
28
44
 
29
- function uploadDone(name)
30
- {
31
- var frame = getFrameByName(name);
32
- if(frame) {
33
- ret = frame.document.getElementsByTagName("body")[0].innerHTML;
45
+ if(this.document || this.contentDocument) {
46
+ var doc = this.document ? this.document : this.contentDocument;
47
+ UploadImageDialog.handleResponse(doc.getElementsByTagName("body")[0].innerHTML);
48
+ } else
49
+ UploadImageDialog.handleError(tinyMCEPopup.getLang("uploadimage_dlg.blank_response", "Didn't get a response from the server"));
50
+ },
34
51
 
35
- if(ret.length) {
52
+ handleResponse: function(ret) {
53
+ try {
36
54
  var json = JSON.parse(ret);
37
- var imgstr = "<br><img src='" + json["image"]["url"] + "'";
38
55
 
39
- if(json["image"]["height"])
40
- imgstr += " height='" + json["image"]["height"] + "'";
41
- if(json["image"]["width"])
42
- imgstr += " width='" + json["image"]["width"] + "'";
56
+ if(json["error"])
57
+ UploadImageDialog.handleError(json["error"]["message"]);
58
+ else {
59
+ tinyMCE.execCommand('mceInsertContent', false, UploadImageDialog.buildHTML(json));
60
+ tinyMCEPopup.close();
61
+ }
62
+ } catch(e) {
63
+ UploadImageDialog.handleError(tinyMCEPopup.getLang("uploadimage_dlg.bad_response", "Got a bad response from the server"));
64
+ }
65
+ },
43
66
 
44
- imgstr += "/>";
67
+ buildHTML: function(json) {
68
+ var imgstr = "<br><img src='" + json["image"]["url"] + "'";
45
69
 
46
- tinyMCE.execCommand('mceInsertContent', false, imgstr);
47
- tinyMCEPopup.close();
48
- }
49
- }
50
- }
70
+ if(json["image"]["height"])
71
+ imgstr += " height='" + json["image"]["height"] + "'";
72
+ if(json["image"]["width"])
73
+ imgstr += " width='" + json["image"]["width"] + "'";
51
74
 
52
- var UploadImageDialog = {
75
+ imgstr += "/>";
53
76
 
54
- init: function() {
55
- this.f = document.forms[0];
56
- this.f.action = tinyMCEPopup.getParam("uploadimage_form_url", "/tinymce_assets");
57
- document.getElementById("hint").value = tinyMCEPopup.getParam("uploadimage_hint", "");
58
- document.getElementById("authenticity_token").value = getMetaContents('csrf-token');
77
+ return imgstr;
59
78
  },
60
79
 
61
- insert: function() {
62
- this.f.submit();
63
- }
80
+ handleError: function(error) {
81
+ var className = 'invalid';
82
+ var label = document.getElementById("file_upload_label");
83
+ var message = document.getElementById("error_message");
84
+
85
+ if(message)
86
+ message.innerHTML = error;
87
+
88
+ // Add the 'invalid' class, avoiding duplicates
89
+ if(label) {
90
+ var cn = label.className;
91
+ if(cn.indexOf(className) == -1) {
92
+ if(cn != '')
93
+ className = ' ' + className;
94
+ label.className = cn + className;
95
+ }
96
+ }
97
+ },
98
+
99
+ getMetaContents: function(mn) {
100
+ var m = (window.opener || window.parent).document.getElementsByTagName('meta');
101
+
102
+ for(var i in m)
103
+ if(m[i].name == mn)
104
+ return m[i].content;
105
+
106
+ return null;
107
+ },
64
108
  };
65
109
 
66
110
  tinyMCEPopup.onInit.add(UploadImageDialog.init, UploadImageDialog);
67
111
  </script>
68
112
  </head>
69
113
  <body>
114
+ <h1>{#uploadimage_dlg.header}</h1>
70
115
 
71
116
  <form method="post" enctype='multipart/form-data' accept-charset="UTF-8" target="hidden_upload" action='#replaceme' name="uploadimageForm">
72
117
  <input type="hidden" name="utf8" value="✓">
73
118
  <input type="hidden" name="authenticity_token" id="authenticity_token" value="#replaceme">
74
119
  <input type="hidden" name="hint" id="hint" value="#replaceme">
75
- <iframe id="hidden_upload" name="hidden_upload" src='' onload='uploadDone("hidden_upload")' style='width:0;height:0;border:0px solid #fff'></iframe>
120
+ <iframe id="hidden_upload" name="hidden_upload" src="" style='width:0;height:0;border:0px solid #fff'></iframe>
76
121
 
77
- <h1>{#uploadimage_dlg.header}</h1>
78
- <p>{#uploadimage_dlg.input}: <input type="file" name='file' class="file_upload"></p>
122
+ <label id='file_upload_label' for='file_upload'>{#uploadimage_dlg.input}:</label>
123
+ <input type='file' name='file' id='file_upload'>
124
+ <p id="error_message"></p>
79
125
 
80
126
  <div class="mceActionPanel">
81
127
  <input type="button" id="insert" name="insert" value="{#uploadimage_dlg.insert}" onclick="UploadImageDialog.insert();"/>
128
+ <img src="img/spinner.gif" alt="#{uploadimage_dlg.uploading}" id="upload_spinner" height="16" width="16" class="inactive">
82
129
  <input type="button" id="cancel" name="cancel" value="{#uploadimage_dlg.cancel}" onclick="tinyMCEPopup.close();" />
83
130
  </div>
84
131
  </form>
@@ -2,6 +2,10 @@ tinyMCE.addI18n('en.uploadimage_dlg', {
2
2
  title: 'Insert image',
3
3
  header: "Insert image",
4
4
  input: "Choose an image",
5
+ uploading: "Uploading…",
6
+ blank_input: "Must choose a file",
7
+ bad_response: "Got a bad response from the server",
8
+ blank_response: "Didn't get a response from the server",
5
9
  insert: "Insert",
6
10
  cancel: "Cancel"
7
11
  });
@@ -2,6 +2,10 @@ tinyMCE.addI18n('nb.uploadimage_dlg', {
2
2
  title: 'Sett inn bilde',
3
3
  header: "Sett inn bilde",
4
4
  input: "Velg et bilde",
5
+ uploading: "Laster opp…",
6
+ blank_input: "M\u00e5 velge en fil",
7
+ bad_response: "Fikk et ugyldig svar fra serveren",
8
+ blank_response: "Fikk ikke svar fra serveren",
5
9
  insert: "Sett inn",
6
10
  cancel: "Avbryt"
7
11
  });
@@ -2,6 +2,10 @@ tinyMCE.addI18n('pt.uploadimage_dlg', {
2
2
  title: 'Inserir imagem',
3
3
  header: "Inserir imagem",
4
4
  input: "Escolher uma imagem",
5
+ uploading: "A enviar…",
6
+ blank_input: "É necessário seleccionar um ficheiro",
7
+ bad_response: "Resposta inesperada do servidor",
8
+ blank_response: "Não foi obtida uma resposta do servidor",
5
9
  insert: "Inserir",
6
10
  cancel: "Cancelar"
7
11
  });
@@ -2,6 +2,10 @@ tinyMCE.addI18n('ru.uploadimage_dlg', {
2
2
  title: 'Вставить изображение',
3
3
  header: "Вставить изображение",
4
4
  input: "Выберите изображение",
5
+ uploading: "Загрузка…",
6
+ blank_input: "Необходимо выбрать файл",
7
+ bad_response: "Получен некорректный ответ с сервера",
8
+ blank_response: "Не получен ответ с сервера",
5
9
  insert: "Вставить",
6
10
  cancel: "Отмена"
7
- });
11
+ });
metadata CHANGED
@@ -1,80 +1,80 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tinymce-rails-imageupload
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.5.6.4
5
4
  prerelease:
5
+ version: 3.5.8.0
6
6
  platform: ruby
7
7
  authors:
8
8
  - Per Christian B. Viken
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-12-10 00:00:00.000000000 Z
12
+ date: 2013-02-01 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: railties
16
- prerelease: false
16
+ type: :runtime
17
17
  requirement: !ruby/object:Gem::Requirement
18
+ none: false
18
19
  requirements:
19
20
  - - ! '>='
20
21
  - !ruby/object:Gem::Version
21
22
  version: '3.1'
22
- none: false
23
- type: :runtime
23
+ prerelease: false
24
24
  version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
25
26
  requirements:
26
27
  - - ! '>='
27
28
  - !ruby/object:Gem::Version
28
29
  version: '3.1'
29
- none: false
30
30
  - !ruby/object:Gem::Dependency
31
31
  name: tinymce-rails
32
- prerelease: false
32
+ type: :runtime
33
33
  requirement: !ruby/object:Gem::Requirement
34
+ none: false
34
35
  requirements:
35
36
  - - ! '>='
36
37
  - !ruby/object:Gem::Version
37
38
  version: 3.4.9
38
- none: false
39
- type: :runtime
39
+ prerelease: false
40
40
  version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
41
42
  requirements:
42
43
  - - ! '>='
43
44
  - !ruby/object:Gem::Version
44
45
  version: 3.4.9
45
- none: false
46
46
  - !ruby/object:Gem::Dependency
47
47
  name: bundler
48
- prerelease: false
48
+ type: :development
49
49
  requirement: !ruby/object:Gem::Requirement
50
+ none: false
50
51
  requirements:
51
52
  - - ~>
52
53
  - !ruby/object:Gem::Version
53
54
  version: 1.0.0
54
- none: false
55
- type: :development
55
+ prerelease: false
56
56
  version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
57
58
  requirements:
58
59
  - - ~>
59
60
  - !ruby/object:Gem::Version
60
61
  version: 1.0.0
61
- none: false
62
62
  - !ruby/object:Gem::Dependency
63
63
  name: rails
64
- prerelease: false
64
+ type: :development
65
65
  requirement: !ruby/object:Gem::Requirement
66
+ none: false
66
67
  requirements:
67
68
  - - ! '>='
68
69
  - !ruby/object:Gem::Version
69
70
  version: '3.1'
70
- none: false
71
- type: :development
71
+ prerelease: false
72
72
  version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
73
74
  requirements:
74
75
  - - ! '>='
75
76
  - !ruby/object:Gem::Version
76
77
  version: '3.1'
77
- none: false
78
78
  description: TinyMCE plugin for taking image uploads in Rails >= 3.1
79
79
  email:
80
80
  - perchr@northblue.org
@@ -95,6 +95,7 @@ files:
95
95
  - tinymce-rails-imageupload.gemspec
96
96
  - vendor/assets/javascripts/tinymce/plugins/uploadimage/dialog.html
97
97
  - vendor/assets/javascripts/tinymce/plugins/uploadimage/editor_plugin.js
98
+ - vendor/assets/javascripts/tinymce/plugins/uploadimage/img/spinner.gif
98
99
  - vendor/assets/javascripts/tinymce/plugins/uploadimage/img/uploadimage.png
99
100
  - vendor/assets/javascripts/tinymce/plugins/uploadimage/langs/en.js
100
101
  - vendor/assets/javascripts/tinymce/plugins/uploadimage/langs/en_dlg.js
@@ -111,17 +112,17 @@ rdoc_options: []
111
112
  require_paths:
112
113
  - lib
113
114
  required_ruby_version: !ruby/object:Gem::Requirement
115
+ none: false
114
116
  requirements:
115
117
  - - ! '>='
116
118
  - !ruby/object:Gem::Version
117
119
  version: '0'
118
- none: false
119
120
  required_rubygems_version: !ruby/object:Gem::Requirement
121
+ none: false
120
122
  requirements:
121
123
  - - ! '>='
122
124
  - !ruby/object:Gem::Version
123
125
  version: '0'
124
- none: false
125
126
  requirements: []
126
127
  rubyforge_project:
127
128
  rubygems_version: 1.8.24