push_type_wysiwyg 0.2.0.beta2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE.md +20 -0
  3. data/README.md +3 -0
  4. data/app/assets/javascripts/push_type/froala_overrides/file_upload.js +133 -0
  5. data/app/assets/javascripts/push_type/froala_overrides/froala_editor.js +34 -0
  6. data/app/assets/javascripts/push_type/froala_overrides/image_editor.js +215 -0
  7. data/app/assets/javascripts/push_type/froala_overrides/media_manager.js +184 -0
  8. data/app/assets/javascripts/push_type/media_styles.js.coffee.erb +5 -0
  9. data/app/assets/javascripts/push_type/wysiwyg.js.coffee +50 -0
  10. data/app/assets/stylesheets/push_type/froala_overrides.scss +77 -0
  11. data/app/assets/stylesheets/push_type/pt_theme.scss +373 -0
  12. data/app/assets/stylesheets/push_type/wysiwyg.scss +36 -0
  13. data/app/controllers/push_type/wysiwyg_media_controller.rb +43 -0
  14. data/app/fields/push_type/wysiwyg_field.rb +10 -0
  15. data/app/helpers/push_type/wysiwyg_media_helper.rb +34 -0
  16. data/config/routes.rb +3 -0
  17. data/lib/push_type/wysiwyg/engine.rb +16 -0
  18. data/lib/push_type/wysiwyg.rb +14 -0
  19. data/lib/push_type_wysiwyg.rb +2 -0
  20. data/lib/tasks/push_type_tasks.rake +4 -0
  21. data/test/controllers/push_type/wysiwyg_media_controller_test.rb +58 -0
  22. data/test/dummy/README.rdoc +28 -0
  23. data/test/dummy/Rakefile +6 -0
  24. data/test/dummy/app/assets/javascripts/application.js +16 -0
  25. data/test/dummy/app/assets/stylesheets/application.css +15 -0
  26. data/test/dummy/app/controllers/application_controller.rb +5 -0
  27. data/test/dummy/app/helpers/application_helper.rb +2 -0
  28. data/test/dummy/app/models/page.rb +10 -0
  29. data/test/dummy/app/views/layouts/application.html.erb +14 -0
  30. data/test/dummy/app/views/nodes/page.html.erb +3 -0
  31. data/test/dummy/bin/bundle +3 -0
  32. data/test/dummy/bin/rails +4 -0
  33. data/test/dummy/bin/rake +4 -0
  34. data/test/dummy/bin/setup +29 -0
  35. data/test/dummy/config/application.rb +14 -0
  36. data/test/dummy/config/boot.rb +4 -0
  37. data/test/dummy/config/database.yml +85 -0
  38. data/test/dummy/config/environment.rb +5 -0
  39. data/test/dummy/config/environments/development.rb +41 -0
  40. data/test/dummy/config/environments/production.rb +79 -0
  41. data/test/dummy/config/environments/test.rb +42 -0
  42. data/test/dummy/config/initializers/assets.rb +11 -0
  43. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  44. data/test/dummy/config/initializers/cookies_serializer.rb +3 -0
  45. data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  46. data/test/dummy/config/initializers/inflections.rb +16 -0
  47. data/test/dummy/config/initializers/mime_types.rb +4 -0
  48. data/test/dummy/config/initializers/push_type.rb +15 -0
  49. data/test/dummy/config/initializers/session_store.rb +3 -0
  50. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  51. data/test/dummy/config/locales/en.yml +23 -0
  52. data/test/dummy/config/routes.rb +59 -0
  53. data/test/dummy/config/secrets.yml +22 -0
  54. data/test/dummy/config.ru +4 -0
  55. data/test/dummy/db/migrate/20150208150336_create_push_type_users.push_type.rb +13 -0
  56. data/test/dummy/db/migrate/20150208150337_create_push_type_nodes.push_type.rb +25 -0
  57. data/test/dummy/db/migrate/20150208150338_create_push_type_node_hierarchies.push_type.rb +17 -0
  58. data/test/dummy/db/migrate/20150208150339_create_push_type_assets.push_type.rb +19 -0
  59. data/test/dummy/db/schema.rb +67 -0
  60. data/test/dummy/db/seeds.rb +7 -0
  61. data/test/dummy/log/test.log +1309 -0
  62. data/test/dummy/public/404.html +67 -0
  63. data/test/dummy/public/422.html +67 -0
  64. data/test/dummy/public/500.html +66 -0
  65. data/test/dummy/public/favicon.ico +0 -0
  66. data/test/dummy/public/robots.txt +5 -0
  67. data/test/dummy/tmp/cache/assets/test/sprockets/0a170bcd46595a69e9181ea5eb52ec6f +0 -0
  68. data/test/dummy/tmp/cache/assets/test/sprockets/853c1095ab6e7f4eba1f3406f0f3bba6 +0 -0
  69. data/test/helpers/push_type/wysiwyg_media_helper_test.rb +41 -0
  70. data/test/models/push_type/wysiwyg_field_test.rb +9 -0
  71. data/test/test_helper.rb +21 -0
  72. data/vendor/assets/javascripts/jquery.simplePagination.js +334 -0
  73. metadata +252 -0
@@ -0,0 +1,77 @@
1
+ .froala-editor .froala-popup div.f-popup-line[class*="f-image-"] label {
2
+ width: 35px;
3
+ }
4
+
5
+ .froala-editor .froala-popup div.f-popup-line select {
6
+ font-family: inherit;
7
+ font-size: 12px;
8
+ width: 160px;
9
+ border: solid 1px $input-border-color;
10
+ margin: 0 5px !important;
11
+ height: 25px;
12
+ line-height: 21px;
13
+ display: block;
14
+ padding: 2px;
15
+ float: left;
16
+ -webkit-box-sizing: border-box;
17
+ -moz-box-sizing: border-box;
18
+ box-sizing: border-box;
19
+ border-radius: 0;
20
+ -moz-border-radius: 0;
21
+ -webkit-border-radius: 0;
22
+ -moz-background-clip: padding;
23
+ -webkit-background-clip: padding-box;
24
+ background-clip: padding-box;
25
+ box-shadow: none;
26
+ -moz-box-shadow: none;
27
+ -webkit-box-shadow: none;
28
+ outline: 0;
29
+ }
30
+
31
+ .froala-editor .froala-popup div.f-popup-line select:focus {
32
+ border: solid 1px #54acd2;
33
+ }
34
+
35
+ .froala-modal .f-modal-wrapper h4 {
36
+ background: $silver;
37
+ margin: 0;
38
+ padding: 1rem;
39
+ }
40
+
41
+ .froala-modal .f-modal-wrapper div.f-image-list {
42
+ position: relative;
43
+ list-style-type: none;
44
+ margin: 0;
45
+ padding: 1.25rem 0.5rem 1rem;
46
+ column-count: 1;
47
+ -moz-column-count: 1;
48
+ -webkit-column-count: 1;
49
+ column-gap: 0;
50
+ -moz-column-gap: 0;
51
+ -webkit-column-gap: 0;
52
+ width: 640px;
53
+ }
54
+ .froala-modal .f-modal-wrapper div.f-image-list div {
55
+ box-sizing: border-box;
56
+ -webkit-box-sizing: border-box;
57
+ -moz-box-sizing: border-box;
58
+ width: 25%;
59
+ display: inline;
60
+ float: left;
61
+ margin-bottom: 1rem;
62
+ padding-left: 0.5rem;
63
+ padding-right: 0.5rem;
64
+ }
65
+ .froala-modal .f-modal-wrapper div.f-image-list img {
66
+ border: 1px solid $silver;
67
+ }
68
+ .froala-modal .f-modal-wrapper div.f-image-list span.f-media-title {
69
+ display: block;
70
+ text-align: center;
71
+ height: 40px;
72
+ margin-bottom: 0;
73
+ padding: 3px 0;
74
+ overflow: hidden;
75
+ font-size: 14px;
76
+ line-height: 20px;
77
+ }
@@ -0,0 +1,373 @@
1
+ .pt-theme.froala-box {
2
+ margin-bottom: 1.25rem;
3
+ }
4
+ .pt-theme.froala-box.focus {
5
+ box-shadow: $input-box-shadow;
6
+ background: $input-focus-bg-color;
7
+ border-color: $input-focus-border-color;
8
+ }
9
+ .pt-theme.froala-box .froala-element {
10
+ box-shadow: inset 0 1px 2px rgba(0,0,0,0.1);
11
+ }
12
+ .pt-theme.froala-box .html-switch {
13
+ border-color: #aaaaaa;
14
+ }
15
+ .pt-theme.froala-box .froala-element hr {
16
+ border-top-color: $input-border-color;
17
+ }
18
+ .pt-theme.froala-box .froala-element.f-placeholder:before {
19
+ color: $input-border-color;
20
+ }
21
+ .pt-theme.froala-box .froala-element pre {
22
+ border: solid 1px $input-border-color;
23
+ background: #fcfcfc;
24
+ border-radius: 4px;
25
+ -moz-border-radius: 4px;
26
+ -webkit-border-radius: 4px;
27
+ -moz-background-clip: padding;
28
+ -webkit-background-clip: padding-box;
29
+ background-clip: padding-box;
30
+ }
31
+ .pt-theme.froala-box .froala-element blockquote {
32
+ border-left: solid 5px $input-border-color;
33
+ }
34
+ .pt-theme.froala-box .froala-element img {
35
+ min-width: 32px !important;
36
+ min-height: 32px !important;
37
+ }
38
+ .pt-theme.froala-box .froala-element img.fr-fil {
39
+ padding: 10px 10px 10px 3px;
40
+ }
41
+ .pt-theme.froala-box .froala-element img.fr-fir {
42
+ padding: 10px 3px 10px 10px;
43
+ }
44
+ .pt-theme.froala-box .froala-element img.fr-fin {
45
+ padding: 10px 0;
46
+ }
47
+ .pt-theme.froala-box .froala-element img::selection {
48
+ color: #ffffff;
49
+ }
50
+ .pt-theme.froala-box .froala-element img::-moz-selection {
51
+ color: #ffffff;
52
+ }
53
+ .pt-theme.froala-box .froala-element span.f-img-editor:before {
54
+ border: solid 2px #ffffff !important;
55
+ outline: solid 1px $input-border-color !important;
56
+ }
57
+ .pt-theme.froala-box .froala-element span.f-img-editor.fr-fil {
58
+ margin: 10px 10px 10px 3px;
59
+ }
60
+ .pt-theme.froala-box .froala-element span.f-img-editor.fr-fir {
61
+ margin: 10px 3px 10px 10px;
62
+ }
63
+ .pt-theme.froala-box .froala-element span.f-img-editor.fr-fin {
64
+ margin: 10px 0;
65
+ }
66
+ .pt-theme.froala-box .froala-element span.f-img-handle {
67
+ height: 13px;
68
+ width: 13px;
69
+ border: solid 1px $input-border-color !important;
70
+ background: #ffffff;
71
+ }
72
+ .pt-theme.froala-box .froala-element span.f-video-editor.active:after {
73
+ border: solid 1px $input-border-color;
74
+ }
75
+ .pt-theme.froala-box .froala-wrapper {
76
+ border: solid 1px $input-border-color;
77
+ }
78
+ .pt-theme.froala-box .froala-element.f-basic {
79
+ //border: solid 1px $input-border-color;
80
+ background: transparent;
81
+ color: '#444';
82
+ }
83
+ .pt-theme.froala-box .froala-element.f-basic a {
84
+ color: inherit;
85
+ }
86
+ .pt-theme.froala-box .froala-element table td {
87
+ border: solid 1px $input-border-color;
88
+ }
89
+ .pt-theme.froala-box.f-html .froala-element {
90
+ background: #202020;
91
+ color: #ffffff;
92
+ font-family: 'Courier New', Monospace;
93
+ font-size: 13px;
94
+ }
95
+ .pt-theme.froala-editor {
96
+ background: #ffffff;
97
+ border: solid 1px $input-border-color;
98
+ border-top: solid 1px $input-border-color;
99
+ }
100
+ .pt-theme.froala-editor hr {
101
+ border-top-color: $input-border-color;
102
+ }
103
+ .pt-theme.froala-editor span.f-sep {
104
+ border-right: solid 1px $input-border-color;
105
+ height: 35px;
106
+ }
107
+ .pt-theme.froala-editor button.fr-bttn,
108
+ .pt-theme.froala-editor button.fr-trigger {
109
+ background: transparent;
110
+ color: $primary-color;
111
+ font-size: 16px;
112
+ line-height: 35px;
113
+ width: 40px;
114
+ }
115
+ .pt-theme.froala-editor button.fr-bttn img,
116
+ .pt-theme.froala-editor button.fr-trigger img {
117
+ max-width: 40px;
118
+ max-height: 35px;
119
+ }
120
+ .pt-theme.froala-editor button.fr-bttn:disabled,
121
+ .pt-theme.froala-editor button.fr-trigger:disabled {
122
+ color: #aaaaaa !important;
123
+ }
124
+ .pt-theme.froala-editor button.fr-bttn:disabled:after,
125
+ .pt-theme.froala-editor button.fr-trigger:disabled:after {
126
+ border-top-color: #aaaaaa !important;
127
+ }
128
+ .pt-theme.froala-editor.ie8 button.fr-bttn:hover,
129
+ .pt-theme.froala-editor.ie8 button.fr-trigger:hover {
130
+ background: $primary-color;
131
+ color: #ffffff;
132
+ }
133
+ .pt-theme.froala-editor.ie8 button.fr-bttn:hover:after,
134
+ .pt-theme.froala-editor.ie8 button.fr-trigger:hover:after {
135
+ border-top-color: #ffffff;
136
+ }
137
+ .pt-theme.froala-editor .bttn-wrapper:not(.touch) button.fr-bttn:hover,
138
+ .pt-theme.froala-editor .froala-popup button.fr-bttn:hover,
139
+ .pt-theme.froala-editor .bttn-wrapper:not(.touch) button.fr-trigger:hover,
140
+ .pt-theme.froala-editor .froala-popup button.fr-trigger:hover {
141
+ background: $primary-color;
142
+ color: #ffffff;
143
+ }
144
+ .pt-theme.froala-editor .bttn-wrapper:not(.touch) button.fr-bttn:hover:after,
145
+ .pt-theme.froala-editor .froala-popup button.fr-bttn:hover:after,
146
+ .pt-theme.froala-editor .bttn-wrapper:not(.touch) button.fr-trigger:hover:after,
147
+ .pt-theme.froala-editor .froala-popup button.fr-trigger:hover:after {
148
+ border-top-color: #ffffff;
149
+ }
150
+ .pt-theme.froala-editor .fr-bttn.active {
151
+ color: $primary-color;
152
+ background: transparent;
153
+ }
154
+ .pt-theme.froala-editor .fr-trigger:after {
155
+ border-top-color: $primary-color;
156
+ }
157
+ .pt-theme.froala-editor .fr-trigger.active {
158
+ color: #ffffff;
159
+ background: $primary-color;
160
+ }
161
+ .pt-theme.froala-editor .fr-trigger.active:after {
162
+ border-top-color: #ffffff !important;
163
+ }
164
+ .pt-theme.froala-editor .fr-dropdown .fr-trigger {
165
+ width: calc(38px);
166
+ }
167
+ .pt-theme.froala-editor .fr-dropdown .fr-dropdown-menu {
168
+ background: #ffffff;
169
+ border: solid 1px $input-border-color;
170
+ }
171
+ .pt-theme.froala-editor .fr-dropdown .fr-dropdown-menu li.active a {
172
+ background: $primary-color !important;
173
+ color: #ffffff !important;
174
+ }
175
+ .pt-theme.froala-editor .fr-dropdown .fr-dropdown-menu li a {
176
+ color: $primary-color;
177
+ }
178
+ .pt-theme.froala-editor .fr-dropdown .fr-dropdown-menu li a:hover {
179
+ background: $primary-color !important;
180
+ color: #ffffff !important;
181
+ }
182
+ .pt-theme.froala-editor .fr-dropdown .fr-dropdown-menu.fr-table > li:hover > a,
183
+ .pt-theme.froala-editor .fr-dropdown .fr-dropdown-menu.fr-table > li.hover > a {
184
+ background: $primary-color;
185
+ color: #ffffff;
186
+ }
187
+ .pt-theme.froala-editor .fr-dropdown .fr-dropdown-menu.fr-table > li > ul {
188
+ background: #ffffff;
189
+ color: $primary-color;
190
+ border: solid 1px $input-border-color;
191
+ }
192
+ .pt-theme.froala-editor .fr-dropdown .fr-dropdown-menu.fr-table > li > div {
193
+ background: #ffffff;
194
+ color: $primary-color;
195
+ border: solid 1px $input-border-color;
196
+ }
197
+ .pt-theme.froala-editor .fr-dropdown .fr-dropdown-menu.fr-table > li > div > span > span {
198
+ border: solid 1px $input-border-color;
199
+ }
200
+ .pt-theme.froala-editor .fr-dropdown .fr-dropdown-menu.fr-table > li > div > span:hover > span,
201
+ .pt-theme.froala-editor .fr-dropdown .fr-dropdown-menu.fr-table > li > div > span.hover > span {
202
+ background: rgba(61, 142, 185, 0.3);
203
+ border: solid 1px #3d8eb9;
204
+ }
205
+ .pt-theme.froala-editor .fr-dropdown .fr-dropdown-menu.fr-table > hr {
206
+ border-top: solid 1px $input-border-color;
207
+ }
208
+ .pt-theme.froala-editor .fr-dropdown.fr-color-picker .fr-dropdown-menu p {
209
+ color: #444444;
210
+ }
211
+ .pt-theme.froala-editor .fr-dropdown.fr-color-picker .fr-dropdown-menu p a.fr-bttn {
212
+ color: #444444;
213
+ }
214
+ .pt-theme.froala-editor .fr-dropdown.fr-color-picker .fr-dropdown-menu p a.fr-bttn:hover {
215
+ color: $primary-color;
216
+ }
217
+ .pt-theme.froala-editor .fr-dropdown.fr-color-picker .fr-dropdown-menu .fr-color-bttn.active {
218
+ outline: solid 1px $input-border-color;
219
+ }
220
+ .pt-theme.froala-editor .fr-dropdown.fr-color-picker .fr-dropdown-menu .fr-color-bttn.active:after {
221
+ color: #ffffff;
222
+ }
223
+ .pt-theme.froala-editor .fr-dropdown.fr-color-picker .fr-dropdown-menu .fr-color-bttn:hover:not(:focus):not(:active) {
224
+ outline: solid 1px $input-border-color;
225
+ }
226
+ .pt-theme.froala-editor .froala-popup {
227
+ background: #ffffff;
228
+ }
229
+ .pt-theme.froala-editor .froala-popup h4 {
230
+ color: #444444;
231
+ }
232
+ .pt-theme.froala-editor .froala-popup h4 i {
233
+ color: $input-border-color;
234
+ }
235
+ .pt-theme.froala-editor .froala-popup h4 i.fa-external-link {
236
+ color: #444444;
237
+ }
238
+ .pt-theme.froala-editor .froala-popup h4 i.fa-external-link:hover {
239
+ color: $primary-color;
240
+ }
241
+ .pt-theme.froala-editor .froala-popup h4 i:hover {
242
+ color: #444444;
243
+ }
244
+ .pt-theme.froala-editor .froala-popup button:not(.fr-bttn):not(.fr-trigger) {
245
+ color: #ffffff;
246
+ }
247
+ .pt-theme.froala-editor .froala-popup button:not(.fr-bttn):not(.fr-trigger).f-ok {
248
+ background: #2c82c9;
249
+ color: #ffffff;
250
+ }
251
+ .pt-theme.froala-editor .froala-popup button:not(.fr-bttn):not(.fr-trigger).f-unlink {
252
+ background: #b8312f;
253
+ color: #ffffff;
254
+ }
255
+ .pt-theme.froala-editor .froala-popup button:not(.fr-bttn):not(.fr-trigger).f-unlink:hover {
256
+ background: #353535;
257
+ color: #ffffff;
258
+ }
259
+ .pt-theme.froala-editor .froala-popup button:not(.fr-bttn):not(.fr-trigger):hover,
260
+ .pt-theme.froala-editor .froala-popup button:not(.fr-bttn):not(.fr-trigger):focus {
261
+ background: #353535;
262
+ color: #ffffff;
263
+ }
264
+ .pt-theme.froala-editor .froala-popup div.f-popup-line.f-popup-toolbar {
265
+ background: #ffffff;
266
+ }
267
+ .pt-theme.froala-editor .froala-popup div.f-popup-line label {
268
+ color: #444444;
269
+ }
270
+ .pt-theme.froala-editor .froala-popup div.f-popup-line input[type="text"] {
271
+ border: solid 1px $input-border-color;
272
+ }
273
+ .pt-theme.froala-editor .froala-popup div.f-popup-line input[type="text"]:focus {
274
+ border: solid 1px #54acd2;
275
+ }
276
+ .pt-theme.froala-editor .froala-popup div.f-popup-line input[type="text"]:disabled {
277
+ background: #ffffff;
278
+ color: #aaaaaa;
279
+ }
280
+ .pt-theme.froala-editor .froala-popup div.f-popup-line textarea {
281
+ border: solid 1px $input-border-color;
282
+ }
283
+ .pt-theme.froala-editor .froala-popup div.f-popup-line textarea:focus {
284
+ border: solid 1px #54acd2;
285
+ }
286
+ .pt-theme.froala-editor .froala-popup.froala-image-editor-popup div.f-popup-line + div.f-popup-line {
287
+ border-top: solid 1px $input-border-color;
288
+ }
289
+ .pt-theme.froala-editor .froala-popup.froala-video-popup p.or {
290
+ color: #444444;
291
+ }
292
+ .pt-theme.froala-editor .froala-popup.froala-image-popup div.f-popup-line.drop-upload div.f-upload {
293
+ color: #444444;
294
+ border: dashed 2px $input-border-color;
295
+ }
296
+ .pt-theme.froala-editor .froala-popup.froala-image-popup div.f-popup-line.drop-upload div.f-upload:hover {
297
+ border: dashed 2px #353535;
298
+ }
299
+ .pt-theme.froala-editor .froala-popup.froala-image-popup div.f-popup-line.drop-upload div.f-upload.f-hover {
300
+ border: dashed 2px #61bd6d;
301
+ }
302
+ .pt-theme.froala-editor .froala-popup.froala-image-popup div.f-popup-line button.f-browse {
303
+ background: #475577;
304
+ color: #ffffff;
305
+ }
306
+ .pt-theme.froala-editor .froala-popup.froala-image-popup div.f-popup-line button.f-browse:hover {
307
+ background: #353535;
308
+ color: #ffffff;
309
+ }
310
+ .pt-theme.froala-editor .froala-popup.froala-image-popup div.f-popup-line + div.f-popup-line {
311
+ border-top: solid 1px $input-border-color;
312
+ }
313
+ .pt-theme.froala-editor .froala-popup.froala-image-popup p.f-progress {
314
+ background-color: #61bd6d;
315
+ }
316
+ .pt-theme.froala-editor .froala-popup.froala-image-popup p.f-progress span {
317
+ background-color: #61bd6d;
318
+ color: #ffffff;
319
+ }
320
+ .pt-theme.froala-editor .froala-popup.froala-link-popup div.f-popup-line .f-browse-links {
321
+ background: #475577;
322
+ color: #ffffff;
323
+ }
324
+ .pt-theme.froala-editor .froala-popup.froala-link-popup div.f-popup-line .f-browse-links:hover {
325
+ background: #353535;
326
+ color: #ffffff;
327
+ }
328
+ .pt-theme.froala-editor .froala-popup.froala-link-popup div.f-popup-line ul {
329
+ background: #ffffff;
330
+ border: solid 1px $input-border-color;
331
+ }
332
+ .pt-theme.froala-editor .froala-popup.froala-link-popup div.f-popup-line ul li {
333
+ color: $primary-color;
334
+ }
335
+ .pt-theme.froala-editor .froala-popup.froala-link-popup div.f-popup-line ul li + li {
336
+ border-top: solid 1px $input-border-color;
337
+ }
338
+ .pt-theme.froala-editor .froala-popup.froala-link-popup div.f-popup-line ul li:hover {
339
+ background: $primary-color;
340
+ color: #ffffff;
341
+ }
342
+ .pt-theme.froala-modal .f-modal-wrapper {
343
+ background: #ffffff;
344
+ border: solid 1px $input-border-color;
345
+ border-top: solid 1px $input-border-color;
346
+ }
347
+ .pt-theme.froala-modal .f-modal-wrapper h4 {
348
+ color: #444444;
349
+ }
350
+ .pt-theme.froala-modal .f-modal-wrapper h4 i {
351
+ color: $input-border-color;
352
+ }
353
+ .pt-theme.froala-modal .f-modal-wrapper h4 i:hover {
354
+ color: #444444;
355
+ }
356
+ .pt-theme.froala-modal .f-modal-wrapper div.f-image-list div.f-empty {
357
+ background: $input-border-color;
358
+ }
359
+ .pt-theme.froala-modal .f-modal-wrapper div.f-image-list div .f-delete-img {
360
+ background: #b8312f;
361
+ color: #ffffff;
362
+ }
363
+ .pt-theme.froala-modal .f-modal-wrapper div.f-image-list div .f-delete-img:hover {
364
+ background: #353535;
365
+ color: #ffffff;
366
+ }
367
+ .pt-theme.froala-modal .f-modal-wrapper div.f-image-list:not(.f-touch) div:hover .f-delete-img:hover {
368
+ background: #353535;
369
+ color: #ffffff;
370
+ }
371
+ .froala-overlay {
372
+ background: #000000;
373
+ }
@@ -0,0 +1,36 @@
1
+ /*
2
+ * This is a manifest file that'll be compiled into application.css, which will include all the files
3
+ * listed below.
4
+ *
5
+ * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
6
+ * or vendor/assets/stylesheets of plugins, if any, can be referenced here using a relative path.
7
+ *
8
+ * You're free to add application-wide styles to this file and they'll appear at the bottom of the
9
+ * compiled file so the styles you add here take precedence over styles defined in any styles
10
+ * defined in the other CSS/SCSS files in this directory. It is generally better to create a new
11
+ * file per style scope.
12
+ *
13
+ *= require froala_editor.min
14
+ *= require froala_style.min
15
+ *= require font-awesome
16
+ *= require_self
17
+ */
18
+
19
+ $white: #fff;
20
+ $silver: #EFEFEF;
21
+ $primary-color: #008CBA;
22
+ $input-box-shadow: inset 0 1px 2px rgba(0,0,0,0.1);
23
+ $input-focus-bg-color: $white;
24
+ $input-border-color: scale-color($white, $lightness: -20%);
25
+ $input-focus-border-color: scale-color($white, $lightness: -40%);
26
+
27
+ @import 'pt_theme';
28
+ @import 'froala_overrides';
29
+
30
+ .simple-pagination {
31
+ background: $silver;
32
+ padding: 1rem;
33
+ .pagination {
34
+ margin: 0;
35
+ }
36
+ }
@@ -0,0 +1,43 @@
1
+ require_dependency "push_type/admin_controller"
2
+
3
+ module PushType
4
+ class WysiwygMediaController < AdminController
5
+
6
+ before_filter :load_assets, only: :index
7
+ before_filter :build_asset, only: :create
8
+
9
+ def index
10
+ respond_to do |format|
11
+ format.json { render json: view_context.wysiwyg_assets_hash(@assets) }
12
+ end
13
+ end
14
+
15
+ def create
16
+ respond_to do |format|
17
+ format.json do
18
+ if @asset.save
19
+ render json: { link: main_app.media_url(@asset.file_uid) }
20
+ else
21
+ render json: { error: @asset.errors.full_messages.first }
22
+ end
23
+ end
24
+ end
25
+ end
26
+
27
+ private
28
+
29
+ def load_assets
30
+ query = PushType::Asset.not_trash.page(params[:page]).per(12)
31
+ @assets = params[:filter] == 'image' ? query.image : query.not_image
32
+ end
33
+
34
+ def build_asset
35
+ @asset = PushType::Asset.new asset_params.merge(uploader: push_type_user)
36
+ end
37
+
38
+ def asset_params
39
+ params.fetch(:asset, {}).permit(:file)
40
+ end
41
+
42
+ end
43
+ end
@@ -0,0 +1,10 @@
1
+ module PushType
2
+ class WysiwygField < PushType::FieldType
3
+ def form_helper
4
+ :text_area
5
+ end
6
+ def html_options
7
+ super.merge(class: 'froala')
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,34 @@
1
+ module PushType
2
+ module WysiwygMediaHelper
3
+
4
+ include PushType::AssetsHelper
5
+
6
+ def wysiwyg_assets_hash(assets)
7
+ {
8
+ assets: assets.map { |a| wysiwyg_asset_hash(a) },
9
+ meta: wysiwyg_assets_meta(assets)
10
+ }
11
+ end
12
+
13
+ def wysiwyg_assets_meta(assets)
14
+ {
15
+ current_page: assets.current_page,
16
+ total_pages: assets.total_pages
17
+ }
18
+ end
19
+
20
+ def wysiwyg_asset_hash(asset)
21
+ {
22
+ src: asset_preview_thumb_url(asset),
23
+ info: {
24
+ id: asset.id,
25
+ kind: asset.kind,
26
+ src: main_app.media_url(asset.file_uid),
27
+ title: asset.description_or_file_name
28
+ }
29
+ }
30
+ end
31
+
32
+
33
+ end
34
+ end
data/config/routes.rb ADDED
@@ -0,0 +1,3 @@
1
+ PushType::Core::Engine.routes.draw do
2
+ resources :wysiwyg_media, only: [:index, :create]
3
+ end
@@ -0,0 +1,16 @@
1
+ module PushType
2
+ module Wysiwyg
3
+ class Engine < ::Rails::Engine
4
+ isolate_namespace PushType
5
+ engine_name 'push_type_rich_text'
6
+
7
+ config.admin_assets.register 'push_type/wysiwyg' if defined?(PushType::Admin::Assets)
8
+
9
+ config.generators do |g|
10
+ g.assets false
11
+ g.helper false
12
+ g.test_framework :minitest, spec: true, fixture: false
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,14 @@
1
+ require 'push_type_core'
2
+ require 'push_type_admin'
3
+
4
+ require 'wysiwyg-rails'
5
+ require 'font-awesome-rails'
6
+
7
+
8
+ module PushType
9
+
10
+ module Wysiwyg
11
+ end
12
+ end
13
+
14
+ require 'push_type/wysiwyg/engine'
@@ -0,0 +1,2 @@
1
+ require 'push_type/wysiwyg'
2
+
@@ -0,0 +1,4 @@
1
+ # desc "Explaining what the task does"
2
+ # task :push_type do
3
+ # # Task goes here
4
+ # end
@@ -0,0 +1,58 @@
1
+ require "test_helper"
2
+
3
+ module PushType
4
+ describe WysiwygMediaController do
5
+
6
+ let(:json_response) { JSON.parse(response.body) }
7
+ let(:asset_attrs) { FactoryGirl.attributes_for(:asset) }
8
+
9
+ describe 'GET #index' do
10
+ before :all do
11
+ 5.times { FactoryGirl.create :image_asset }
12
+ 13.times { FactoryGirl.create :document_asset }
13
+ end
14
+ describe 'filtering for images' do
15
+ before { get :index, format: :json, filter: 'image' }
16
+ it { response.must_respond_with :success }
17
+ it { json_response['assets'].size.must_equal 5 }
18
+ it { json_response['meta']['current_page'].must_equal 1 }
19
+ it { json_response['meta']['total_pages'].must_equal 1 }
20
+ end
21
+ describe 'filtering for files' do
22
+ before { get :index, format: :json, filter: 'file' }
23
+ it { response.must_respond_with :success }
24
+ it { json_response['assets'].size.must_equal 12 }
25
+ it { json_response['meta']['current_page'].must_equal 1 }
26
+ it { json_response['meta']['total_pages'].must_equal 2 }
27
+ end
28
+ describe 'with pagination' do
29
+ before { get :index, format: :json, filter: 'file', page: 2 }
30
+ it { response.must_respond_with :success }
31
+ it { json_response['assets'].size.must_equal 1 }
32
+ it { json_response['meta']['current_page'].must_equal 2 }
33
+ it { json_response['meta']['total_pages'].must_equal 2 }
34
+ end
35
+ end
36
+
37
+ describe 'POST #create' do
38
+ let(:action!) { post :create, format: :json, asset: asset_attrs }
39
+ describe 'with valid asset' do
40
+ before { action! }
41
+ it { response.must_respond_with :success }
42
+ it { json_response['link'].must_be :present? }
43
+ it { json_response['error'].wont_be :present? }
44
+ end
45
+ describe 'asset count' do
46
+ it { proc { action! }.must_change 'Asset.count', 1 }
47
+ end
48
+ describe 'with in-valid asset' do
49
+ let(:asset_attrs) { {} }
50
+ before { action! }
51
+ it { response.must_respond_with :success }
52
+ it { json_response['link'].wont_be :present? }
53
+ it { json_response['error'].must_be :present? }
54
+ end
55
+ end
56
+
57
+ end
58
+ end