binda 0.1.6 → 0.1.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +13 -6
- data/app/assets/javascripts/binda/components/fileupload.js +38 -4
- data/app/assets/javascripts/binda/dist/binda.bundle.js +26 -3
- data/app/assets/stylesheets/binda/components/fileupload.scss +11 -2
- data/app/controllers/binda/audios_controller.rb +71 -0
- data/app/controllers/binda/users/audios_controller.rb +71 -0
- data/app/controllers/concerns/binda/fieldable_helpers.rb +26 -6
- data/app/models/binda/audio.rb +8 -0
- data/app/models/binda/field_setting.rb +8 -3
- data/app/models/concerns/binda/fieldable_association_helpers.rb +51 -0
- data/app/models/concerns/binda/fieldable_associations.rb +3 -1
- data/app/uploaders/binda/audio/audio_uploader.rb +27 -0
- data/app/views/binda/fieldable/_form_item_audio.html.erb +33 -0
- data/app/views/binda/fieldable/_form_item_date.html.erb +1 -1
- data/app/views/binda/fieldable/_form_item_image.html.erb +2 -2
- data/app/views/binda/fieldable/_form_item_relation.html.erb +2 -2
- data/app/views/binda/fieldable/_form_item_string.html.erb +1 -1
- data/app/views/binda/fieldable/_form_item_text.html.erb +1 -1
- data/app/views/binda/fieldable/_form_item_video.html.erb +2 -3
- data/app/views/binda/fieldable/_form_section.html.erb +5 -66
- data/app/views/binda/fieldable/_form_section_repeater.html.erb +9 -61
- data/config/initializers/simple_form__fileupload.rb +18 -7
- data/config/locales/en.yml +1 -0
- data/config/routes.rb +6 -2
- data/db/migrate/1_create_binda_tables.rb +1 -0
- data/lib/binda/version.rb +1 -1
- metadata +9 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7306f9f3f6f6d3c51e9bf2375d21a6ab8a3bb5db
|
4
|
+
data.tar.gz: 5bda27c8b2065709e5bbd092fc0e4d0931f91785
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 76deea4419854210f65bdb53a2f5e819c22ac25ace53e2a88a7030aebcfb97a62f4be81990f8cb484a7851c464f4d64b1616f116dacf1b31407a50b8d80441d2
|
7
|
+
data.tar.gz: 4dd2f2a7d51f343e1886499b3b1fcb3ce175935a23c12d55626188a2d1413c868e48ec9f81ca6faa8333d41e9320bfddebf498a01af7c6073cb61e6f546c10a3
|
data/README.md
CHANGED
@@ -365,6 +365,7 @@ Here below a list of field types available and their use:
|
|
365
365
|
| text | Store a text. TinyMCE let's you format the text as you like. | [source](http://www.rubydoc.info/gems/binda/Binda/Text) |
|
366
366
|
| image | Store image. | [source](http://www.rubydoc.info/gems/binda/Binda/Image) |
|
367
367
|
| video | Store video. | [source](http://www.rubydoc.info/gems/binda/Binda/Video) |
|
368
|
+
| audio | Store audio. | [source](http://www.rubydoc.info/gems/binda/Binda/Audio) |
|
368
369
|
| date | Store a date. | [source](http://www.rubydoc.info/gems/binda/Binda/Date) |
|
369
370
|
| radio | Select one choice amongst a custom set. | [source](http://www.rubydoc.info/gems/binda/Binda/Radio) |
|
370
371
|
| selection | Select one or more choices amongst a custom set. | [source](http://www.rubydoc.info/gems/binda/Binda/Selection) |
|
@@ -441,7 +442,10 @@ You can retrieve field content from a instance of `Binda::Component`, `Binda::Bo
|
|
441
442
|
|`get_image_mime_type`| Returns the mime type of the image. | [source](http://www.rubydoc.info/gems/binda/Binda/FieldableAssociationHelpers:get_image_mime_type) |
|
442
443
|
|`has_video`| Returns `true/false`.| [source](http://www.rubydoc.info/gems/binda/Binda/FieldableAssociationHelpers:has_video) |
|
443
444
|
|`get_video_url`| Returns the url of the video. | [source](http://www.rubydoc.info/gems/binda/Binda/FieldableAssociationHelpers:get_video_url) |
|
444
|
-
|`get_video_path`| Returns the path of the video. | [source](http://www.rubydoc.info/gems/binda/Binda/FieldableAssociationHelpers:
|
445
|
+
|`get_video_path`| Returns the path of the video. | [source](http://www.rubydoc.info/gems/binda/Binda/FieldableAssociationHelpers:get_video_path) |
|
446
|
+
|`has_audio`| Returns `true/false`.| [source](http://www.rubydoc.info/gems/binda/Binda/FieldableAssociationHelpers:has_audio) |
|
447
|
+
|`get_audio_url`| Returns the url of the audio. | [source](http://www.rubydoc.info/gems/binda/Binda/FieldableAssociationHelpers:get_audio_url) |
|
448
|
+
|`get_audio_path`| Returns the path of the audio. | [source](http://www.rubydoc.info/gems/binda/Binda/FieldableAssociationHelpers:get_audio_path) |
|
445
449
|
|`has_date`| Returns `true/false` | [source](http://www.rubydoc.info/gems/binda/Binda/FieldableAssociationHelpers:has_date) |
|
446
450
|
|`get_date`| Returns the date in `datetime` format. Use [`strftime`](https://apidock.com/rails/ActiveSupport/TimeWithZone/strftime) to change date format. | [source](http://www.rubydoc.info/gems/binda/Binda/FieldableAssociationHelpers:get_date) |
|
447
451
|
|`has_repeaters`| Returns `true/false`| [source](http://www.rubydoc.info/gems/binda/Binda/FieldableAssociationHelpers:has_repeaters) |
|
@@ -577,8 +581,6 @@ To change appereance and behaviour of the page add your styles to `app/assets/st
|
|
577
581
|
|
578
582
|
# Field settings and field groups
|
579
583
|
|
580
|
-
---
|
581
|
-
|
582
584
|
## Orphans
|
583
585
|
|
584
586
|
Sometime playing with Rails console you might end up creating orphans, which basically are components without a field setting parent. They might cause errors in some queries and they hard to track down.
|
@@ -881,16 +883,21 @@ npm install --global geckodriver
|
|
881
883
|
Some specs are run against the database. If you haven't installed Binda on the dummy application yet run:
|
882
884
|
|
883
885
|
```bash
|
884
|
-
rails db:migrate
|
886
|
+
RAILS_ENV=test rails db:migrate
|
885
887
|
```
|
886
888
|
|
887
889
|
The above command might generate an error. This is probably because you have previously installed Binda and the generator finds migration both in `binda/db/migrate` and `binda/spec/dummy/db/migrate`. To solve the issue, remove the `spec/dummy/db/migrate` folder and run the previous command again. Here below the oneliner (be aware that this destroy both development and test databases of the dummy app):
|
888
890
|
|
889
891
|
```bash
|
890
|
-
rm -rf
|
892
|
+
cd spec/dummy && rm -rf db/migrate && rails db:drop && rails db:create && RAILS_ENV=test rails db:migrate
|
893
|
+
```
|
894
|
+
|
895
|
+
In case you are creating new migrations or modifing the default one:
|
896
|
+
|
897
|
+
```bash
|
898
|
+
cd spec/dummy && rm -r db/schema.rb && rails db:drop && rails db:create && RAILS_ENV=test rails db:migrate
|
891
899
|
```
|
892
900
|
|
893
|
-
In case you are creating new migrations or modifing the default one, consider running the above command to refresh the `schema.rb` file while updating both databases.
|
894
901
|
|
895
902
|
If in the future you need to clean your dummy app code, simply run:
|
896
903
|
|
@@ -116,6 +116,8 @@ function updateFileuploadField(data, id) {
|
|
116
116
|
setup_image_preview(data, id);
|
117
117
|
} else if (data.type == "video") {
|
118
118
|
setup_video_preview(data, id);
|
119
|
+
} else if (data.type == "audio") {
|
120
|
+
setup_audio_preview(data, id);
|
119
121
|
} else {
|
120
122
|
alert("Something went wrong. No preview has been received.");
|
121
123
|
}
|
@@ -183,14 +185,15 @@ function setup_image_preview(data, id) {
|
|
183
185
|
function setup_video_preview(data, id) {
|
184
186
|
let $parent = $("#fileupload-" + id);
|
185
187
|
let $preview = $("#fileupload-" + id + " .fileupload--preview");
|
188
|
+
let uploadedClass = "fileupload--preview--uploaded";
|
186
189
|
|
187
190
|
$preview
|
188
|
-
.removeClass(
|
191
|
+
.removeClass(uploadedClass)
|
189
192
|
.find("video")
|
190
193
|
.attr("id", "video-" + id)
|
191
194
|
.find("source")
|
192
195
|
.attr("src", data.url)
|
193
|
-
.attr("type",
|
196
|
+
.attr("type", data.contentType);
|
194
197
|
|
195
198
|
// If video source isn't blank load it (consider that a video tag is always present)
|
196
199
|
if (typeof $preview.find("video source").attr("src") != undefined) {
|
@@ -201,11 +204,42 @@ function setup_video_preview(data, id) {
|
|
201
204
|
}
|
202
205
|
|
203
206
|
// Remove and add class to trigger css animation
|
207
|
+
$preview.addClass(uploadedClass);
|
208
|
+
|
209
|
+
// Update details
|
210
|
+
$parent.find(".fileupload--filesize").text(data.size);
|
211
|
+
$parent.find(".fileupload--filename").text(data.name);
|
212
|
+
$parent.find(".fileupload--previewlink a").attr("href", data.url);
|
213
|
+
}
|
214
|
+
|
215
|
+
function setup_audio_preview(data, id) {
|
216
|
+
let $parent = $("#fileupload-" + id);
|
217
|
+
let $preview = $("#fileupload-" + id + " .fileupload--preview");
|
204
218
|
let uploadedClass = "fileupload--preview--uploaded";
|
205
|
-
|
219
|
+
|
220
|
+
$preview
|
221
|
+
.removeClass(uploadedClass)
|
222
|
+
.find("audio")
|
223
|
+
.attr("id", "audio-" + id)
|
224
|
+
.find("source")
|
225
|
+
.attr("src", data.url)
|
226
|
+
.attr("type", data.contentType);
|
227
|
+
|
228
|
+
// If video source isn't blank load it (consider that a video tag is always present)
|
229
|
+
if (typeof $preview.find("audio source").attr("src") != undefined) {
|
230
|
+
$preview
|
231
|
+
.find("audio")
|
232
|
+
.get(0)
|
233
|
+
.load();
|
234
|
+
}
|
235
|
+
|
236
|
+
// Remove and add class to trigger css animation
|
237
|
+
$preview
|
238
|
+
.addClass(uploadedClass)
|
239
|
+
.addClass("fileupload--preview--hidden")
|
206
240
|
|
207
241
|
// Update details
|
208
242
|
$parent.find(".fileupload--filesize").text(data.size);
|
209
243
|
$parent.find(".fileupload--filename").text(data.name);
|
210
|
-
$parent.find(".fileupload--
|
244
|
+
$parent.find(".fileupload--previewlink a").attr("href", data.url);
|
211
245
|
}
|
@@ -681,6 +681,8 @@ function updateFileuploadField(data, id) {
|
|
681
681
|
setup_image_preview(data, id);
|
682
682
|
} else if (data.type == "video") {
|
683
683
|
setup_video_preview(data, id);
|
684
|
+
} else if (data.type == "audio") {
|
685
|
+
setup_audio_preview(data, id);
|
684
686
|
} else {
|
685
687
|
alert("Something went wrong. No preview has been received.");
|
686
688
|
}
|
@@ -739,8 +741,9 @@ function setup_image_preview(data, id) {
|
|
739
741
|
function setup_video_preview(data, id) {
|
740
742
|
var $parent = $("#fileupload-" + id);
|
741
743
|
var $preview = $("#fileupload-" + id + " .fileupload--preview");
|
744
|
+
var uploadedClass = "fileupload--preview--uploaded";
|
742
745
|
|
743
|
-
$preview.removeClass(
|
746
|
+
$preview.removeClass(uploadedClass).find("video").attr("id", "video-" + id).find("source").attr("src", data.url).attr("type", data.contentType);
|
744
747
|
|
745
748
|
// If video source isn't blank load it (consider that a video tag is always present)
|
746
749
|
if (_typeof($preview.find("video source").attr("src")) != undefined) {
|
@@ -748,13 +751,33 @@ function setup_video_preview(data, id) {
|
|
748
751
|
}
|
749
752
|
|
750
753
|
// Remove and add class to trigger css animation
|
754
|
+
$preview.addClass(uploadedClass);
|
755
|
+
|
756
|
+
// Update details
|
757
|
+
$parent.find(".fileupload--filesize").text(data.size);
|
758
|
+
$parent.find(".fileupload--filename").text(data.name);
|
759
|
+
$parent.find(".fileupload--previewlink a").attr("href", data.url);
|
760
|
+
}
|
761
|
+
|
762
|
+
function setup_audio_preview(data, id) {
|
763
|
+
var $parent = $("#fileupload-" + id);
|
764
|
+
var $preview = $("#fileupload-" + id + " .fileupload--preview");
|
751
765
|
var uploadedClass = "fileupload--preview--uploaded";
|
752
|
-
|
766
|
+
|
767
|
+
$preview.removeClass(uploadedClass).find("audio").attr("id", "audio-" + id).find("source").attr("src", data.url).attr("type", data.contentType);
|
768
|
+
|
769
|
+
// If video source isn't blank load it (consider that a video tag is always present)
|
770
|
+
if (_typeof($preview.find("audio source").attr("src")) != undefined) {
|
771
|
+
$preview.find("audio").get(0).load();
|
772
|
+
}
|
773
|
+
|
774
|
+
// Remove and add class to trigger css animation
|
775
|
+
$preview.addClass(uploadedClass).addClass("fileupload--preview--hidden");
|
753
776
|
|
754
777
|
// Update details
|
755
778
|
$parent.find(".fileupload--filesize").text(data.size);
|
756
779
|
$parent.find(".fileupload--filename").text(data.name);
|
757
|
-
$parent.find(".fileupload--
|
780
|
+
$parent.find(".fileupload--previewlink a").attr("href", data.url);
|
758
781
|
}
|
759
782
|
|
760
783
|
/***/ }),
|
@@ -47,7 +47,7 @@
|
|
47
47
|
}
|
48
48
|
}
|
49
49
|
|
50
|
-
.fileupload--
|
50
|
+
.fileupload--field {
|
51
51
|
float: left;
|
52
52
|
|
53
53
|
.control-label-wrap {
|
@@ -55,6 +55,10 @@
|
|
55
55
|
}
|
56
56
|
}
|
57
57
|
|
58
|
+
.fileupload--dashboard {
|
59
|
+
float: left;
|
60
|
+
}
|
61
|
+
|
58
62
|
.fileupload input {
|
59
63
|
position: absolute;
|
60
64
|
z-index: -1;
|
@@ -112,10 +116,15 @@
|
|
112
116
|
display: none;
|
113
117
|
}
|
114
118
|
|
115
|
-
.standard-form--video .fileupload--dimension
|
119
|
+
.standard-form--video .fileupload--dimension,
|
120
|
+
.standard-form--audio .fileupload--dimension {
|
116
121
|
display: none;
|
117
122
|
}
|
118
123
|
|
119
124
|
.standard-form--image .fileupload--videolink {
|
120
125
|
display: none;
|
121
126
|
}
|
127
|
+
|
128
|
+
.fileupload--preview--hidden {
|
129
|
+
display: none;
|
130
|
+
}
|
@@ -0,0 +1,71 @@
|
|
1
|
+
require_dependency "binda/application_controller"
|
2
|
+
|
3
|
+
module Binda
|
4
|
+
class AudiosController < ApplicationController
|
5
|
+
before_action :set_audio, only: [:show, :edit, :update, :destroy, :remove_audio]
|
6
|
+
|
7
|
+
# GET /audios
|
8
|
+
def index
|
9
|
+
@audios = Audio.all
|
10
|
+
end
|
11
|
+
|
12
|
+
# GET /audios/1
|
13
|
+
def show
|
14
|
+
end
|
15
|
+
|
16
|
+
# GET /audios/new
|
17
|
+
def new
|
18
|
+
@audio = Audio.new
|
19
|
+
end
|
20
|
+
|
21
|
+
# GET /audios/1/edit
|
22
|
+
def edit
|
23
|
+
end
|
24
|
+
|
25
|
+
# POST /audios
|
26
|
+
def create
|
27
|
+
@audio = Audio.new(audio_params)
|
28
|
+
|
29
|
+
if @audio.save
|
30
|
+
redirect_to audio_path( @audio.id ), notice: 'Audio was successfully created.'
|
31
|
+
else
|
32
|
+
render :new
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
# PATCH/PUT /audios/1
|
37
|
+
def update
|
38
|
+
if @audio.update(audio_params)
|
39
|
+
redirect_to audio_path( @audio.id ), notice: 'Audio was successfully updated.'
|
40
|
+
else
|
41
|
+
render :edit
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
# DELETE /audios/1
|
46
|
+
def destroy
|
47
|
+
@audio.destroy
|
48
|
+
redirect_to audios_url, notice: 'Audio was successfully destroyed.'
|
49
|
+
end
|
50
|
+
|
51
|
+
def remove_audio
|
52
|
+
@audio.remove_audio!
|
53
|
+
if @audio.save
|
54
|
+
head :ok
|
55
|
+
else
|
56
|
+
render json: @audio.errors.full_messages, status: 400
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
private
|
61
|
+
# Use callbacks to share common setup or constraints between actions.
|
62
|
+
def set_audio
|
63
|
+
@audio = Audio.find(params[:id])
|
64
|
+
end
|
65
|
+
|
66
|
+
# Only allow a trusted parameter "white list" through.
|
67
|
+
def audio_params
|
68
|
+
params.require(:audio).permit( :audio, :name )
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
require_dependency "binda/application_controller"
|
2
|
+
|
3
|
+
module Binda
|
4
|
+
class AudiosController < ApplicationController
|
5
|
+
before_action :set_audio, only: [:show, :edit, :update, :destroy, :remove_audio]
|
6
|
+
|
7
|
+
# GET /audios
|
8
|
+
def index
|
9
|
+
@audios = Audio.all
|
10
|
+
end
|
11
|
+
|
12
|
+
# GET /audios/1
|
13
|
+
def show
|
14
|
+
end
|
15
|
+
|
16
|
+
# GET /audios/new
|
17
|
+
def new
|
18
|
+
@audio = Audio.new
|
19
|
+
end
|
20
|
+
|
21
|
+
# GET /audios/1/edit
|
22
|
+
def edit
|
23
|
+
end
|
24
|
+
|
25
|
+
# POST /audios
|
26
|
+
def create
|
27
|
+
@audio = Audio.new(audio_params)
|
28
|
+
|
29
|
+
if @audio.save
|
30
|
+
redirect_to audio_path( @audio.id ), notice: 'Audio was successfully created.'
|
31
|
+
else
|
32
|
+
render :new
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
# PATCH/PUT /audios/1
|
37
|
+
def update
|
38
|
+
if @audio.update(audio_params)
|
39
|
+
redirect_to audio_path( @audio.id ), notice: 'Audio was successfully updated.'
|
40
|
+
else
|
41
|
+
render :edit
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
# DELETE /audios/1
|
46
|
+
def destroy
|
47
|
+
@audio.destroy
|
48
|
+
redirect_to audios_url, notice: 'Audio was successfully destroyed.'
|
49
|
+
end
|
50
|
+
|
51
|
+
def remove_audio
|
52
|
+
@audio.remove_audio!
|
53
|
+
if @audio.save
|
54
|
+
head :ok
|
55
|
+
else
|
56
|
+
render json: @audio.errors.full_messages, status: 400
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
private
|
61
|
+
# Use callbacks to share common setup or constraints between actions.
|
62
|
+
def set_audio
|
63
|
+
@audio = Audio.find(params[:id])
|
64
|
+
end
|
65
|
+
|
66
|
+
# Only allow a trusted parameter "white list" through.
|
67
|
+
def audio_params
|
68
|
+
params.require(:audio).permit( :audio, :name )
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -9,6 +9,7 @@ module Binda
|
|
9
9
|
strings_attributes: [ :id, :field_setting_id, :fieldable_type, :fieldable_id, :content ],
|
10
10
|
images_attributes: [ :id, :field_setting_id, :fieldable_type, :fieldable_id, :image, :image_cache ],
|
11
11
|
videos_attributes: [ :id, :field_setting_id, :fieldable_type, :fieldable_id, :video, :video_cache ],
|
12
|
+
audios_attributes: [ :id, :field_setting_id, :fieldable_type, :fieldable_id, :audio, :audio_cache ],
|
12
13
|
dates_attributes: [ :id, :field_setting_id, :fieldable_type, :fieldable_id, :date ],
|
13
14
|
galleries_attributes: [ :id, :field_setting_id, :fieldable_type, :fieldable_id ],
|
14
15
|
radios_attributes: [ :id, :field_setting_id, :fieldable_type, :fieldable_id, :choice_ids ],
|
@@ -20,6 +21,7 @@ module Binda
|
|
20
21
|
strings_attributes: [ :id, :field_setting_id, :fieldable_type, :fieldable_id, :content ],
|
21
22
|
images_attributes: [ :id, :field_setting_id, :fieldable_type, :fieldable_id, :image, :image_cache ],
|
22
23
|
videos_attributes: [ :id, :field_setting_id, :fieldable_type, :fieldable_id, :video, :video_cache ],
|
24
|
+
audios_attributes: [ :id, :field_setting_id, :fieldable_type, :fieldable_id, :audio, :audio_cache ],
|
23
25
|
dates_attributes: [ :id, :field_setting_id, :fieldable_type, :fieldable_id, :date ],
|
24
26
|
galleries_attributes: [ :id, :field_setting_id, :fieldable_type, :fieldable_id ],
|
25
27
|
relations_attributes: [ :id, :field_setting_id, :fieldable_type, :fieldable_id, dependent_component_ids: [], dependent_board_ids: [] ],
|
@@ -43,9 +45,11 @@ module Binda
|
|
43
45
|
{categories_attributes: [ :id, :category_id ]},
|
44
46
|
{images_attributes: [ :id, :field_setting_id, :fieldable_type, :fieldable_id, :image, :image_cache ]},
|
45
47
|
{videos_attributes: [ :id, :field_setting_id, :fieldable_type, :fieldable_id, :video, :video_cache ]},
|
48
|
+
{audios_attributes: [ :id, :field_setting_id, :fieldable_type, :fieldable_id, :audio, :audio_cache ]},
|
46
49
|
{repeaters_attributes: [ :id, :field_setting_id, :fieldable_type, :fieldable_id,
|
47
50
|
images_attributes: [ :id, :field_setting_id, :fieldable_type, :fieldable_id, :image, :image_cache ],
|
48
|
-
videos_attributes: [ :id, :field_setting_id, :fieldable_type, :fieldable_id, :video, :video_cache ]
|
51
|
+
videos_attributes: [ :id, :field_setting_id, :fieldable_type, :fieldable_id, :video, :video_cache ],
|
52
|
+
audios_attributes: [ :id, :field_setting_id, :fieldable_type, :fieldable_id, :audio, :audio_cache ]]})
|
49
53
|
end
|
50
54
|
|
51
55
|
# Uploads a details for a fieldable instance (component or board)
|
@@ -70,14 +74,14 @@ module Binda
|
|
70
74
|
# Therefore get the latest uploaded asset
|
71
75
|
asset = Asset.order('updated_at').last
|
72
76
|
|
73
|
-
if asset.image.present?
|
74
|
-
raise "The record Binda::Asset with id=#{asset.id} has both image and video attached. This might have been caused by updating the record outside Binda's interface. Please make sure this record has either an image or a video."
|
75
|
-
elsif asset.image.present?
|
77
|
+
if asset.image.present?
|
76
78
|
return_image_details(asset)
|
77
79
|
elsif asset.video.present?
|
78
80
|
return_video_details(asset)
|
81
|
+
elsif asset.audio.present?
|
82
|
+
return_audio_details(asset)
|
79
83
|
else
|
80
|
-
raise "The record Binda::Asset with id=#{asset.id} doesn't have any image or
|
84
|
+
raise "The record Binda::Asset with id=#{asset.id} doesn't have any image, video or audio attached. This might be due to a bug. Please report it in Binda official Github page."
|
81
85
|
end
|
82
86
|
end
|
83
87
|
|
@@ -117,7 +121,23 @@ module Binda
|
|
117
121
|
name: asset.video_identifier,
|
118
122
|
size: "#{bytes_to_megabytes( asset.video.size )}MB",
|
119
123
|
url: asset.video.url,
|
120
|
-
|
124
|
+
contentType: asset.content_type
|
125
|
+
}
|
126
|
+
end
|
127
|
+
|
128
|
+
|
129
|
+
# Return audio details
|
130
|
+
#
|
131
|
+
# This helper is used internally by the `upload_details` method
|
132
|
+
# to retrieve and return the necessary details to be displayed on
|
133
|
+
# the editor.
|
134
|
+
def return_audio_details asset
|
135
|
+
return {
|
136
|
+
type: 'audio',
|
137
|
+
name: asset.audio_identifier,
|
138
|
+
size: "#{bytes_to_megabytes( asset.audio.size )}MB",
|
139
|
+
url: asset.audio.url,
|
140
|
+
contentType: asset.content_type
|
121
141
|
}
|
122
142
|
end
|
123
143
|
|
@@ -6,7 +6,7 @@ module Binda
|
|
6
6
|
# An array of all classes which represent fields associated to Binda::FieldSetting
|
7
7
|
# This definition must stay on the top of the file
|
8
8
|
def self.get_field_classes
|
9
|
-
%w( String Text Date Image Video Repeater Radio Selection Checkbox Relation )
|
9
|
+
%w( String Text Date Image Video Audio Repeater Radio Selection Checkbox Relation )
|
10
10
|
end
|
11
11
|
|
12
12
|
# ASSOCIATIONS
|
@@ -27,6 +27,7 @@ module Binda
|
|
27
27
|
has_many :assets, as: :fieldable
|
28
28
|
has_many :images, as: :fieldable
|
29
29
|
has_many :videos, as: :fieldable
|
30
|
+
has_many :audios, as: :fieldable
|
30
31
|
has_many :repeaters, as: :fieldable
|
31
32
|
has_many :radios, as: :fieldable
|
32
33
|
has_many :selections, as: :fieldable
|
@@ -48,6 +49,7 @@ module Binda
|
|
48
49
|
has_many :assets, dependent: :destroy
|
49
50
|
has_many :images, dependent: :destroy
|
50
51
|
has_many :videos, dependent: :destroy
|
52
|
+
has_many :audios, dependent: :destroy
|
51
53
|
|
52
54
|
# We don't want to run callbacks for choices!
|
53
55
|
# If you run a callback the last choice will throw a error
|
@@ -59,7 +61,7 @@ module Binda
|
|
59
61
|
has_and_belongs_to_many :accepted_structures, class_name: 'Binda::Structure'
|
60
62
|
|
61
63
|
accepts_nested_attributes_for :accepted_structures, :texts, :strings, :dates, :galleries,
|
62
|
-
:assets, :images, :videos, :repeaters, :radios, :selections,
|
64
|
+
:assets, :images, :videos, :audios, :repeaters, :radios, :selections,
|
63
65
|
:checkboxes, :relations, :choices, allow_destroy: true, reject_if: :is_rejected
|
64
66
|
|
65
67
|
# Sets the validation rules to accept and save an attribute
|
@@ -78,12 +80,12 @@ module Binda
|
|
78
80
|
|
79
81
|
after_save do
|
80
82
|
add_choice_if_allow_null_is_false
|
83
|
+
create_field_instances
|
81
84
|
end
|
82
85
|
|
83
86
|
after_create do
|
84
87
|
self.class.reset_field_settings_array
|
85
88
|
convert_allow_null__nil_to_false
|
86
|
-
create_field_instances
|
87
89
|
set_default_position
|
88
90
|
end
|
89
91
|
|
@@ -249,7 +251,10 @@ module Binda
|
|
249
251
|
# A similar script runs after saving components and boards which makes sure
|
250
252
|
# a field instance is always present no matter if the component has been created
|
251
253
|
# before the field setting or the other way around.
|
254
|
+
#
|
255
|
+
# TODO this MUST be optimized
|
252
256
|
def create_field_instances
|
257
|
+
FieldSetting.remove_orphan_fields
|
253
258
|
# Get the structure
|
254
259
|
structure = self.structures.includes(:board, components: [:repeaters]).first
|
255
260
|
structure.components.each do |component|
|
@@ -241,6 +241,57 @@ module Binda
|
|
241
241
|
end
|
242
242
|
end
|
243
243
|
|
244
|
+
|
245
|
+
# Check if the field has an attached audio
|
246
|
+
#
|
247
|
+
# @param field_slug [string] The slug of the field setting
|
248
|
+
# @return [boolean]
|
249
|
+
def has_audio(field_slug)
|
250
|
+
obj = self.audios.find{ |t| t.field_setting_id == FieldSetting.get_id( field_slug ) }
|
251
|
+
# Alternative query
|
252
|
+
# obj = Image.where(field_setting_id: FieldSetting.get_id( field_slug ), fieldable_id: self.id, fieldable_type: self.class.to_s ).first
|
253
|
+
raise ArgumentError, "There isn't any audio associated to the current slug (#{field_slug}) on instance (#{self.class.name} ##{self.id}).", caller if obj.nil?
|
254
|
+
return obj.audio.present?
|
255
|
+
end
|
256
|
+
|
257
|
+
# Get the audio url based on the size provided,
|
258
|
+
# default is Carrierwave default (usually the real size)
|
259
|
+
#
|
260
|
+
# @param field_slug [string] The slug of the field setting
|
261
|
+
# @param size [string] The size. It can be 'thumb' 200x200 cropped,
|
262
|
+
# 'medium' 700x700 max size, 'large' 1400x1400 max size, or blank
|
263
|
+
# @return [string] The url of the audio
|
264
|
+
def get_audio_url(field_slug)
|
265
|
+
get_audio_info( field_slug, 'url' )
|
266
|
+
end
|
267
|
+
|
268
|
+
# Get the audio path based on the size provided,
|
269
|
+
# default is Carrierwave default (usually the real size)
|
270
|
+
#
|
271
|
+
# @param field_slug [string] The slug of the field setting
|
272
|
+
# @param size [string] The size. It can be 'thumb' 200x200 cropped,
|
273
|
+
# 'medium' 700x700 max size, 'large' 1400x1400 max size, or blank
|
274
|
+
# @return [string] The url of the audio
|
275
|
+
def get_audio_path(field_slug)
|
276
|
+
get_audio_info( field_slug, 'path' )
|
277
|
+
end
|
278
|
+
|
279
|
+
# Get the object related to that field setting
|
280
|
+
#
|
281
|
+
# @param field_slug [string] The slug of the field setting
|
282
|
+
# @param info [string] String of the info to be retrieved
|
283
|
+
# @return [string] The info requested if present
|
284
|
+
# @return [boolean] Returns false if no info is found or if image isn't found
|
285
|
+
def get_audio_info(field_slug, info)
|
286
|
+
obj = self.audios.find{ |t| t.field_setting_id == FieldSetting.get_id( field_slug ) }
|
287
|
+
# Alternative query
|
288
|
+
# obj = audio.where(field_setting_id: FieldSetting.get_id( field_slug ), fieldable_id: self.id, fieldable_type: self.class.to_s ).first
|
289
|
+
raise ArgumentError, "There isn't any audio associated to the current slug (#{field_slug}) on instance (#{self.class.name} ##{self.id}).", caller if obj.nil?
|
290
|
+
if obj.audio.present?
|
291
|
+
obj.audio.send(info)
|
292
|
+
end
|
293
|
+
end
|
294
|
+
|
244
295
|
# Check if the field has an attached date
|
245
296
|
#
|
246
297
|
# @param field_slug [string] The slug of the field setting
|
@@ -25,6 +25,7 @@ module Binda
|
|
25
25
|
has_many :assets, as: :fieldable, dependent: :delete_all
|
26
26
|
has_many :images, as: :fieldable, dependent: :delete_all
|
27
27
|
has_many :videos, as: :fieldable, dependent: :delete_all
|
28
|
+
has_many :audios, as: :fieldable, dependent: :delete_all
|
28
29
|
has_many :radios, as: :fieldable, dependent: :delete_all
|
29
30
|
has_many :selections, as: :fieldable, dependent: :delete_all
|
30
31
|
has_many :checkboxes, as: :fieldable, dependent: :delete_all
|
@@ -52,7 +53,7 @@ module Binda
|
|
52
53
|
source: :owner
|
53
54
|
|
54
55
|
|
55
|
-
accepts_nested_attributes_for :texts, :strings, :dates, :assets, :images, :videos, :galleries, :repeaters, :radios, :selections, :checkboxes, :relations, allow_destroy: true
|
56
|
+
accepts_nested_attributes_for :texts, :strings, :dates, :assets, :images, :videos, :audios, :galleries, :repeaters, :radios, :selections, :checkboxes, :relations, allow_destroy: true
|
56
57
|
|
57
58
|
validates_associated :texts
|
58
59
|
validates_associated :strings
|
@@ -60,6 +61,7 @@ module Binda
|
|
60
61
|
validates_associated :assets
|
61
62
|
validates_associated :images
|
62
63
|
validates_associated :videos
|
64
|
+
validates_associated :audios
|
63
65
|
validates_associated :repeaters
|
64
66
|
validates_associated :radios
|
65
67
|
validates_associated :selections
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Binda
|
2
|
+
class Audio::AudioUploader < CarrierWave::Uploader::Base
|
3
|
+
|
4
|
+
process :register_details
|
5
|
+
|
6
|
+
# Override the directory where uploaded files will be stored.
|
7
|
+
# This is a sensible default for uploaders that are meant to be mounted:
|
8
|
+
def store_dir
|
9
|
+
"uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
|
10
|
+
end
|
11
|
+
|
12
|
+
# Add a white list of extensions which are allowed to be uploaded.
|
13
|
+
# For images you might use something like this:
|
14
|
+
def extension_whitelist
|
15
|
+
%w(mp3 m4a m4b ra ram wav ogg oga mid midi wma wax mka)
|
16
|
+
end
|
17
|
+
|
18
|
+
# @see https://github.com/carrierwaveuploader/carrierwave/wiki/how-to:-store-the-uploaded-file-size-and-content-type
|
19
|
+
def register_details
|
20
|
+
if file && model
|
21
|
+
model.content_type = file.content_type if file.content_type
|
22
|
+
model.file_size = file.size
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
<div id="standard-form--audio-<%= field_setting.id %>" class="standard-form--audio form-item">
|
2
|
+
<div id="fileupload-<%= ff.object.id %>"
|
3
|
+
class="fileupload form-group"
|
4
|
+
data-message="<%= t('binda.upload_loading_message') %>"
|
5
|
+
data-error="<%= t('binda.upload_error_message')%>">
|
6
|
+
|
7
|
+
<p class="control-label"><%= field_setting.name %></p>
|
8
|
+
|
9
|
+
<div class="fileupload--field">
|
10
|
+
|
11
|
+
<%= ff.input :audio,
|
12
|
+
label: "<i class=\"fa fa-upload\" aria-hidden=\"true\"></i> #{t('binda.choose_file_button')}".html_safe,
|
13
|
+
hint: field_setting.description.nil? ? false : field_setting.description.html_safe,
|
14
|
+
url: url_for([ff.object, action: :remove_audio]).html_safe,
|
15
|
+
object: ff.object,
|
16
|
+
wrapper: false,
|
17
|
+
input_html: {
|
18
|
+
class: 'form-item--audio--uploader',
|
19
|
+
'data-url': url_for([@instance.structure, @instance, action: :upload]),
|
20
|
+
'data-id': ff.object.id,
|
21
|
+
} %>
|
22
|
+
|
23
|
+
</div>
|
24
|
+
|
25
|
+
<%= ff.input :audio_cache, as: :hidden %>
|
26
|
+
<%= ff.input :field_setting_id, as: :hidden, input_html: { value: field_setting.id } %>
|
27
|
+
<%= ff.input :id, as: :hidden, input_html: { value: ff.object.id } %>
|
28
|
+
<%= ff.input :fieldable_id, as: :hidden %>
|
29
|
+
<%= ff.input :fieldable_type, as: :hidden %>
|
30
|
+
<div class="clearfix"></div>
|
31
|
+
|
32
|
+
</div>
|
33
|
+
</div>
|
@@ -3,7 +3,7 @@
|
|
3
3
|
as: :date,
|
4
4
|
start_year: Date.today.year - 200,
|
5
5
|
end_year: Date.today.year + 200,
|
6
|
-
hint: field_setting.description,
|
6
|
+
hint: field_setting.description.nil? ? false : field_setting.description.html_safe,
|
7
7
|
label: field_setting.name,
|
8
8
|
input_html: { class: 'select2-item' } %>
|
9
9
|
<%= ff.input :field_setting_id, as: :hidden, input_html: { value: field_setting.id } %>
|
@@ -7,10 +7,10 @@
|
|
7
7
|
<%= field_setting.name %>
|
8
8
|
</p>
|
9
9
|
<% image = ff.object.image.thumb.url if ff.object.image.present? %>
|
10
|
-
<div class="fileupload--
|
10
|
+
<div class="fileupload--field">
|
11
11
|
<%= ff.input :image,
|
12
12
|
label: "<i class=\"fa fa-upload\" aria-hidden=\"true\"></i> #{t('binda.choose_file_button')}".html_safe,
|
13
|
-
hint: field_setting.description,
|
13
|
+
hint: field_setting.description.nil? ? false : field_setting.description.html_safe,
|
14
14
|
url: url_for([ff.object, action: :remove_image]).html_safe,
|
15
15
|
object: ff.object,
|
16
16
|
wrapper: false,
|
@@ -7,7 +7,7 @@
|
|
7
7
|
as: :select,
|
8
8
|
input_html: { multiple: true, class: 'select2-item' },
|
9
9
|
label: field_setting.name,
|
10
|
-
hint: field_setting.description,
|
10
|
+
hint: field_setting.description.nil? ? false : field_setting.description.html_safe,
|
11
11
|
value_method: :id,
|
12
12
|
checked: ff.object.dependent_component_ids,
|
13
13
|
include_blank: true,
|
@@ -20,7 +20,7 @@
|
|
20
20
|
as: :select,
|
21
21
|
input_html: { multiple: true, class: 'select2-item' },
|
22
22
|
label: field_setting.name,
|
23
|
-
hint: field_setting.description,
|
23
|
+
hint: field_setting.description.nil? ? false : field_setting.description.html_safe,
|
24
24
|
value_method: :id,
|
25
25
|
checked: ff.object.dependent_board_ids,
|
26
26
|
include_blank: true,
|
@@ -3,7 +3,7 @@
|
|
3
3
|
<%= ff.input :content,
|
4
4
|
input_html: { value: ff.object.content },
|
5
5
|
as: :string,
|
6
|
-
hint: field_setting.description,
|
6
|
+
hint: field_setting.description.nil? ? false : field_setting.description.html_safe,
|
7
7
|
label: field_setting.name %>
|
8
8
|
|
9
9
|
<%= ff.input :field_setting_id, as: :hidden, input_html: { value: field_setting.id } %>
|
@@ -3,7 +3,7 @@
|
|
3
3
|
<%= ff.input :content,
|
4
4
|
input_html: { value: ff.object.content, class: 'tinymce' },
|
5
5
|
as: :text,
|
6
|
-
hint: field_setting.description,
|
6
|
+
hint: field_setting.description.nil? ? false : field_setting.description.html_safe,
|
7
7
|
label: field_setting.name %>
|
8
8
|
|
9
9
|
<%= ff.input :field_setting_id, as: :hidden, input_html: { value: field_setting.id } %>
|
@@ -6,11 +6,11 @@
|
|
6
6
|
|
7
7
|
<p class="control-label"><%= field_setting.name %></p>
|
8
8
|
|
9
|
-
<div class="fileupload--
|
9
|
+
<div class="fileupload--field">
|
10
10
|
|
11
11
|
<%= ff.input :video,
|
12
12
|
label: "<i class=\"fa fa-upload\" aria-hidden=\"true\"></i> #{t('binda.choose_file_button')}".html_safe,
|
13
|
-
hint: field_setting.description,
|
13
|
+
hint: field_setting.description.nil? ? false : field_setting.description.html_safe,
|
14
14
|
url: url_for([ff.object, action: :remove_video]).html_safe,
|
15
15
|
object: ff.object,
|
16
16
|
wrapper: false,
|
@@ -19,7 +19,6 @@
|
|
19
19
|
'data-url': url_for([@instance.structure, @instance, action: :upload]),
|
20
20
|
'data-id': ff.object.id,
|
21
21
|
} %>
|
22
|
-
|
23
22
|
|
24
23
|
</div>
|
25
24
|
|
@@ -1,75 +1,14 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
<% current = @instance.find_or_create_a_field_by( field_setting.id, 'text' ) %>
|
6
|
-
<%= f.simple_fields_for "texts_attributes[]", current do |ff| %>
|
7
|
-
<%= render 'binda/fieldable/form_item_text', f: f, ff: ff, field_setting: field_setting %>
|
1
|
+
<% if %w(text string date image video audio relation).include? field_setting.field_type %>
|
2
|
+
<% current = @instance.find_or_create_a_field_by( field_setting.id, field_setting.field_type) %>
|
3
|
+
<%= f.simple_fields_for "#{field_setting.field_type}s_attributes[]", current do |ff| %>
|
4
|
+
<%= render "binda/fieldable/form_item_#{field_setting.field_type}", f: f, ff: ff, field_setting: field_setting %>
|
8
5
|
<% end %>
|
9
6
|
|
10
|
-
|
11
|
-
<%# - - - - - - - - - - - - %>
|
12
|
-
<%# STRING %>
|
13
|
-
<%# - - - - - - - - - - - - %>
|
14
|
-
<% elsif field_setting.field_type == 'string' %>
|
15
|
-
<% current = @instance.find_or_create_a_field_by( field_setting.id, 'string' ) %>
|
16
|
-
<%= f.simple_fields_for "strings_attributes[]", current do |ff| %>
|
17
|
-
<%= render 'binda/fieldable/form_item_string', f: f, ff: ff, field_setting: field_setting %>
|
18
|
-
<% end %>
|
19
|
-
|
20
|
-
|
21
|
-
<%# - - - - - - - - - - - - %>
|
22
|
-
<%# DATE %>
|
23
|
-
<%# - - - - - - - - - - - - %>
|
24
|
-
<% elsif field_setting.field_type == 'date' %>
|
25
|
-
<% current = @instance.find_or_create_a_field_by( field_setting.id, 'date' ) %>
|
26
|
-
<%= f.simple_fields_for "dates_attributes[]", current do |ff| %>
|
27
|
-
<%= render 'binda/fieldable/form_item_date', ff: ff, field_setting: field_setting %>
|
28
|
-
<% end %>
|
29
|
-
|
30
|
-
|
31
|
-
<%# - - - - - - - - - - - - %>
|
32
|
-
<%# IMAGE %>
|
33
|
-
<%# - - - - - - - - - - - - %>
|
34
|
-
<% elsif field_setting.field_type == 'image' %>
|
35
|
-
<% current = @instance.find_or_create_a_field_by( field_setting.id, 'image' ) %>
|
36
|
-
<%= f.simple_fields_for "images_attributes[]", current do |ff| %>
|
37
|
-
<%= render 'binda/fieldable/form_item_image', ff: ff, field_setting: field_setting %>
|
38
|
-
<% end %>
|
39
|
-
|
40
|
-
|
41
|
-
<%# - - - - - - - - - - - - %>
|
42
|
-
<%# VIDEO %>
|
43
|
-
<%# - - - - - - - - - - - - %>
|
44
|
-
<% elsif field_setting.field_type == 'video' %>
|
45
|
-
<% current = @instance.find_or_create_a_field_by( field_setting.id, 'video' ) %>
|
46
|
-
<%= f.simple_fields_for "videos_attributes[]", current do |ff| %>
|
47
|
-
<%= render 'binda/fieldable/form_item_video', ff: ff, field_setting: field_setting %>
|
48
|
-
<% end %>
|
49
|
-
|
50
|
-
|
51
|
-
<%# - - - - - - - - - - - - %>
|
52
|
-
<%# RELATED_FIELD %>
|
53
|
-
<%# - - - - - - - - - - - - %>
|
54
|
-
<% elsif field_setting.field_type == 'relation' %>
|
55
|
-
<% current = @instance.find_or_create_a_field_by( field_setting.id, 'relation' ) %>
|
56
|
-
<%= f.simple_fields_for "relations_attributes[]", current do |ff| %>
|
57
|
-
<%= render 'binda/fieldable/form_item_relation', ff: ff, field_setting: field_setting %>
|
58
|
-
<% end %>
|
59
|
-
|
60
|
-
<%# - - - - - - - - - - - - %>
|
61
|
-
<%# SELECTION TYPES %>
|
62
|
-
<%# - - - - - - - - - - - - %>
|
63
|
-
<% elsif ['radio', 'selection', 'checkbox'].include? field_setting.field_type %>
|
7
|
+
<% elsif %w(radio selection checkbox).include? field_setting.field_type %>
|
64
8
|
<%= render 'binda/fieldable/form_item_selections', f: f, field_setting: field_setting %>
|
65
9
|
|
66
|
-
|
67
|
-
<%# - - - - - - - - - - - - %>
|
68
|
-
<%# REPEATER %>
|
69
|
-
<%# - - - - - - - - - - - - %>
|
70
10
|
<% elsif field_setting.field_type == 'repeater' %>
|
71
11
|
<% repeaters = @instance.repeaters.where( field_setting: field_setting ).order('position ASC') %>
|
72
12
|
<%= render 'binda/fieldable/form_item_repeater', f: f, repeater_setting: field_setting, repeaters: repeaters %>
|
73
13
|
|
74
|
-
|
75
14
|
<% end %>
|
@@ -1,67 +1,15 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
<% current = @instance.repeaters.select{|r| r.id == f.object.id}.first.find_or_create_a_field_by( repeater_setting_child.id, 'text' ) %>
|
6
|
-
<%= f.simple_fields_for "texts_attributes[]", current do |ff| %>
|
7
|
-
<%= render 'binda/fieldable/form_item_text', f: f, ff: ff, field_setting: repeater_setting_child %>
|
1
|
+
<% if %w(text string date image video audio relation).include? repeater_setting_child.field_type %>
|
2
|
+
<% current = @instance.repeaters.select{|r| r.id == f.object.id}.first.find_or_create_a_field_by( repeater_setting_child.id, repeater_setting_child.field_type ) %>
|
3
|
+
<%= f.simple_fields_for "#{repeater_setting_child.field_type}s_attributes[]", current do |ff| %>
|
4
|
+
<%= render "binda/fieldable/form_item_#{repeater_setting_child.field_type}", f: f, ff: ff, field_setting: repeater_setting_child %>
|
8
5
|
<% end %>
|
9
6
|
|
10
|
-
|
11
|
-
<%# - - - - - - - - - - - - %>
|
12
|
-
<%# STRING %>
|
13
|
-
<%# - - - - - - - - - - - - %>
|
14
|
-
<% elsif repeater_setting_child.field_type == 'string' %>
|
15
|
-
<% current = @instance.repeaters.select{|r| r.id == f.object.id}.first.find_or_create_a_field_by( repeater_setting_child.id, 'string' ) %>
|
16
|
-
<%= f.simple_fields_for "strings_attributes[]", current do |ff| %>
|
17
|
-
<%= render 'binda/fieldable/form_item_string', f: f, ff: ff, field_setting: repeater_setting_child %>
|
18
|
-
<% end %>
|
19
|
-
|
20
|
-
|
21
|
-
<%# - - - - - - - - - - - - %>
|
22
|
-
<%# DATE %>
|
23
|
-
<%# - - - - - - - - - - - - %>
|
24
|
-
<% elsif repeater_setting_child.field_type == 'date' %>
|
25
|
-
<% current = @instance.repeaters.select{|r| r.id == f.object.id}.first.find_or_create_a_field_by( repeater_setting_child.id, 'date' ) %>
|
26
|
-
<%= f.simple_fields_for "dates_attributes[]", current do |ff| %>
|
27
|
-
<%= render 'binda/fieldable/form_item_date', ff: ff, field_setting: repeater_setting_child %>
|
28
|
-
<% end %>
|
29
|
-
|
30
|
-
|
31
|
-
<%# - - - - - - - - - - - - %>
|
32
|
-
<%# IMAGE %>
|
33
|
-
<%# - - - - - - - - - - - - %>
|
34
|
-
<% elsif repeater_setting_child.field_type == 'image' %>
|
35
|
-
<% current = @instance.repeaters.select{|r| r.id == f.object.id}.first.find_or_create_a_field_by( repeater_setting_child.id, 'image' ) %>
|
36
|
-
<%= f.simple_fields_for "images_attributes[]", current do |ff| %>
|
37
|
-
<%= render 'binda/fieldable/form_item_image', ff: ff, field_setting: repeater_setting_child %>
|
38
|
-
<% end %>
|
39
|
-
|
40
|
-
|
41
|
-
<%# - - - - - - - - - - - - %>
|
42
|
-
<%# VIDEO %>
|
43
|
-
<%# - - - - - - - - - - - - %>
|
44
|
-
<% elsif repeater_setting_child.field_type == 'video' %>
|
45
|
-
<% current = @instance.repeaters.select{|r| r.id == f.object.id}.first.find_or_create_a_field_by( repeater_setting_child.id, 'video' ) %>
|
46
|
-
<%= f.simple_fields_for "videos_attributes[]", current do |ff| %>
|
47
|
-
<%= render 'binda/fieldable/form_item_video', ff: ff, field_setting: repeater_setting_child %>
|
48
|
-
<% end %>
|
49
|
-
|
50
|
-
|
51
|
-
<%# - - - - - - - - - - - - %>
|
52
|
-
<%# RELATED_FIELD %>
|
53
|
-
<%# - - - - - - - - - - - - %>
|
54
|
-
<% elsif repeater_setting_child.field_type == 'relation' %>
|
55
|
-
<% current = @instance.repeaters.select{|r| r.id == f.object.id}.first.find_or_create_a_field_by( repeater_setting_child.id, 'relation' ) %>
|
56
|
-
<%= f.simple_fields_for "relations_attributes[]", current do |ff| %>
|
57
|
-
<%= render 'binda/fieldable/form_item_relation', ff: ff, field_setting: repeater_setting_child %>
|
58
|
-
<% end %>
|
59
|
-
|
60
|
-
<%# - - - - - - - - - - - - %>
|
61
|
-
<%# SELECTABLES %>
|
62
|
-
<%# - - - - - - - - - - - - %>
|
63
|
-
<% elsif ['radio', 'selection', 'checkbox'].include? repeater_setting_child.field_type %>
|
7
|
+
<% elsif %w(radio selection checkbox).include? repeater_setting_child.field_type %>
|
64
8
|
<%# current = f.object.find_or_create_a_field_by( repeater_setting_child.id, 'radio' ) %>
|
65
9
|
<%= render 'binda/fieldable/form_item_selections', f: f, field_setting: repeater_setting_child %>
|
66
10
|
|
11
|
+
<% elsif repeater_setting_child.field_type == 'repeater' %>
|
12
|
+
<% repeaters = @instance.repeaters.where( field_setting: field_setting ).order('position ASC') %>
|
13
|
+
<%= render 'binda/fieldable/form_item_repeater', f: f, repeater_setting: field_setting, repeaters: repeaters %>
|
14
|
+
|
67
15
|
<% end %>
|
@@ -8,13 +8,15 @@ module SimpleForm
|
|
8
8
|
def preview(wrapper_options = nil)
|
9
9
|
@preview ||= begin
|
10
10
|
# open a div tag for the file preview
|
11
|
-
html = '<div class="fileupload--preview'
|
11
|
+
html = '<div class="fileupload--preview'
|
12
12
|
|
13
13
|
# add preview image if it's set
|
14
14
|
if options[:object].image.present?
|
15
15
|
html << " fileupload--preview--uploaded\" style=\"background-image: url(#{options[:object].image.url})"
|
16
16
|
elsif options[:object].video.present?
|
17
|
-
html << " fileupload--preview--uploaded"
|
17
|
+
html << " fileupload--preview--uploaded"
|
18
|
+
elsif options[:object].audio.present?
|
19
|
+
html << " fileupload--preview--uploaded fileupload--preview--hidden"
|
18
20
|
end
|
19
21
|
|
20
22
|
# Add no-preview text
|
@@ -23,9 +25,15 @@ module SimpleForm
|
|
23
25
|
# Add video tag
|
24
26
|
if options[:object].video.present?
|
25
27
|
html << "<video id=\"video-#{options[:object].id}\" class=\"form-item--video--video\">"
|
26
|
-
html << "<source src=\"#{options[:object].video.url}\" type=\"
|
28
|
+
html << "<source src=\"#{options[:object].video.url}\" type=\"#{options[:object].video.content_type}\"></video>"
|
29
|
+
html << "<audio class=\"form-item--audio--audio\"><source></audio>"
|
30
|
+
elsif options[:object].audio.present?
|
31
|
+
html << "<audio id=\"audio-#{options[:object].id}\" class=\"from-item--audio--audio\">"
|
32
|
+
html << "<source src=\"#{options[:object].audio.url}\" type=\"#{options[:object].audio.content_type}\"></audio>"
|
33
|
+
html << "<video class=\"form-item--video--video\"><source></video>"
|
27
34
|
else
|
28
35
|
html << "<video class=\"form-item--video--video\"><source></video>"
|
36
|
+
html << "<audio class=\"form-item--audio--audio\"><source></audio>"
|
29
37
|
end
|
30
38
|
|
31
39
|
# Close preview container
|
@@ -46,7 +54,7 @@ module SimpleForm
|
|
46
54
|
obj = options[:object]
|
47
55
|
url = options[:url]
|
48
56
|
html = '<a class="b-btn b-btn-outline-danger fileupload--remove-image-btn'
|
49
|
-
html << ' fileupload--remove-image-btn--hidden' unless obj.image.present? || obj.video.present?
|
57
|
+
html << ' fileupload--remove-image-btn--hidden' unless obj.image.present? || obj.video.present? || obj.audio.present?
|
50
58
|
html << '" href="'
|
51
59
|
html << url
|
52
60
|
html << '" data-method="delete" data-remote="true" data-confirm="'
|
@@ -73,12 +81,13 @@ module SimpleForm
|
|
73
81
|
obj = options[:object]
|
74
82
|
|
75
83
|
html = '<div class="fileupload--details'
|
76
|
-
html << ' fileupload--details--hidden' unless obj.image.present? || obj.video.present?
|
84
|
+
html << ' fileupload--details--hidden' unless obj.image.present? || obj.video.present? || obj.audio.present?
|
77
85
|
html << '"><p class="fileupload--name">'
|
78
86
|
html << "<strong>#{t 'binda.filename'}:</strong> "
|
79
87
|
html << '<span class="fileupload--filename">'
|
80
88
|
html << File.basename(obj.image.path).to_s if obj.image.present?
|
81
89
|
html << File.basename(obj.video.path).to_s if obj.video.present?
|
90
|
+
html << File.basename(obj.audio.path).to_s if obj.audio.present?
|
82
91
|
html << '</span></p>'
|
83
92
|
html << '<p class="fileupload--size">'
|
84
93
|
html << "<strong>#{t 'binda.filesize'}:</strong> "
|
@@ -92,10 +101,12 @@ module SimpleForm
|
|
92
101
|
html << '</span> x <span class="fileupload--height">'
|
93
102
|
html << obj.file_height.round.to_s unless obj.file_height.blank?
|
94
103
|
html << '</span> px</p>'
|
95
|
-
html << '<p class="fileupload--
|
104
|
+
html << '<p class="fileupload--previewlink"><a href="'
|
96
105
|
html << obj.video.url if obj.video.present?
|
106
|
+
html << obj.audio.url if obj.audio.present?
|
97
107
|
html << '" target="_blank"><i class="fas fa-external-link-alt"></i> <strong>'
|
98
|
-
html << t('binda.filevideolink')
|
108
|
+
html << t('binda.filevideolink') if obj.class.name.demodulize == 'Video'
|
109
|
+
html << t('binda.fileaudiolink') if obj.class.name.demodulize == 'Audio'
|
99
110
|
html << '</strong></a></p>'
|
100
111
|
|
101
112
|
html << '</div>'
|
data/config/locales/en.yml
CHANGED
data/config/routes.rb
CHANGED
@@ -69,13 +69,17 @@ Binda::Engine.routes.draw do
|
|
69
69
|
end
|
70
70
|
|
71
71
|
resources :choices, only: [:destroy]
|
72
|
-
|
72
|
+
|
73
|
+
resources :audios do
|
74
|
+
member do
|
75
|
+
delete 'remove_audio'
|
76
|
+
end
|
77
|
+
end
|
73
78
|
resources :videos do
|
74
79
|
member do
|
75
80
|
delete 'remove_video'
|
76
81
|
end
|
77
82
|
end
|
78
|
-
|
79
83
|
resources :images do
|
80
84
|
member do
|
81
85
|
delete 'remove_image'
|
data/lib/binda/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: binda
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alessandro Barbieri
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-03-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -539,7 +539,7 @@ dependencies:
|
|
539
539
|
version: '1.6'
|
540
540
|
- - "<"
|
541
541
|
- !ruby/object:Gem::Version
|
542
|
-
version: '2'
|
542
|
+
version: '2.1'
|
543
543
|
type: :development
|
544
544
|
prerelease: false
|
545
545
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -549,7 +549,7 @@ dependencies:
|
|
549
549
|
version: '1.6'
|
550
550
|
- - "<"
|
551
551
|
- !ruby/object:Gem::Version
|
552
|
-
version: '2'
|
552
|
+
version: '2.1'
|
553
553
|
- !ruby/object:Gem::Dependency
|
554
554
|
name: travis
|
555
555
|
requirement: !ruby/object:Gem::Requirement
|
@@ -668,6 +668,7 @@ files:
|
|
668
668
|
- app/assets/stylesheets/scaffolds.scss
|
669
669
|
- app/controllers/binda/application_controller.rb
|
670
670
|
- app/controllers/binda/assets_controller.rb
|
671
|
+
- app/controllers/binda/audios_controller.rb
|
671
672
|
- app/controllers/binda/boards_controller.rb
|
672
673
|
- app/controllers/binda/categories_controller.rb
|
673
674
|
- app/controllers/binda/choices_controller.rb
|
@@ -679,6 +680,7 @@ files:
|
|
679
680
|
- app/controllers/binda/manage/users_controller.rb
|
680
681
|
- app/controllers/binda/repeaters_controller.rb
|
681
682
|
- app/controllers/binda/structures_controller.rb
|
683
|
+
- app/controllers/binda/users/audios_controller.rb
|
682
684
|
- app/controllers/binda/users/confirmations_controller.rb
|
683
685
|
- app/controllers/binda/users/omniauth_callbacks_controller.rb
|
684
686
|
- app/controllers/binda/users/passwords_controller.rb
|
@@ -704,6 +706,7 @@ files:
|
|
704
706
|
- app/mailers/binda/application_mailer.rb
|
705
707
|
- app/models/binda/application_record.rb
|
706
708
|
- app/models/binda/asset.rb
|
709
|
+
- app/models/binda/audio.rb
|
707
710
|
- app/models/binda/b.rb
|
708
711
|
- app/models/binda/board.rb
|
709
712
|
- app/models/binda/category.rb
|
@@ -732,6 +735,7 @@ files:
|
|
732
735
|
- app/models/concerns/binda/fieldable_association_helpers.rb
|
733
736
|
- app/models/concerns/binda/fieldable_associations.rb
|
734
737
|
- app/models/concerns/binda/fields.rb
|
738
|
+
- app/uploaders/binda/audio/audio_uploader.rb
|
735
739
|
- app/uploaders/binda/image/image_uploader.rb
|
736
740
|
- app/uploaders/binda/video/video_uploader.rb
|
737
741
|
- app/views/binda/assets/_form.html.erb
|
@@ -774,6 +778,7 @@ files:
|
|
774
778
|
- app/views/binda/field_settings/index.html.erb
|
775
779
|
- app/views/binda/field_settings/new.html.erb
|
776
780
|
- app/views/binda/fieldable/_form_body.html.erb
|
781
|
+
- app/views/binda/fieldable/_form_item_audio.html.erb
|
777
782
|
- app/views/binda/fieldable/_form_item_date.html.erb
|
778
783
|
- app/views/binda/fieldable/_form_item_gallery.html.erb
|
779
784
|
- app/views/binda/fieldable/_form_item_image.html.erb
|