card-mod-carrierwave 0.14.2 → 0.15.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ba199fce5967f2189a0557f6bdec4eb84bc8f13afc275686e08cb3deba4c69cb
4
- data.tar.gz: dd4765366027d1bca28d7f9fc648e143d5da2d2422eff2df91e1f055db34e922
3
+ metadata.gz: a249b3cb9824547e04d317283684d5c36e27824cf9ed6dc8b8a1754ebe00f161
4
+ data.tar.gz: 0a6b53cec1fa1132f36b0753c0b7812fbc1beb92ec5c56a9b9f3c54b7a54410a
5
5
  SHA512:
6
- metadata.gz: 3ac1f9e1200c825c9604ad8edead3010e552e20ae64cabf1e4752f2e0a5043bdaaaca6f2dac446c0b30ce41f28095c646aec6e8a0e88eba565bf89b5a82da747
7
- data.tar.gz: 354e99adfc7e7d3b6d96d2d65880d5c607a8560439b7b6affb8c11ffb57c9a0c0de63941d4aed3e6c0b9cdaf50461dc24d9a25be93fab6ce94f72c3feef11916
6
+ metadata.gz: f50f32137fd27d10eebcf066ddb08d2d3f4d9ad7e2502209985ff75986c2d4827e83488432fecba7650cc7594fb1f1bf0a277c7ee5017c1c1419ce7a8b563136
7
+ data.tar.gz: '0819efe2f7570fc0a5494e69dd463eb6696351a7435bcb28f7f1998ffa45f4405d5e1cace72ae6056a0b7dabb68e50d171656f735eec4fa3af1fd0f0c798cec1'
@@ -0,0 +1,72 @@
1
+ decko.editors.init[".file-upload"] = -> decko.upload_file(this)
2
+
3
+ $.extend decko,
4
+ upload_file: (fileupload) ->
5
+ # for file as a subcard in a form,
6
+ # excess parameters are included in the request which cause errors.
7
+ # only the file, type_id and attachment_card_name are needed
8
+ # attachment_card_name is the original card name,
9
+ # ex: card[subcards][+logo][image], card[file]
10
+ $(fileupload).on 'fileuploadsubmit', (e,data) ->
11
+ $_this = $(this)
12
+ card_name = $_this.siblings(".attachment_card_name:first").attr("name")
13
+ type_id = $_this.siblings("#attachment_type_id").val()
14
+ data.formData = {
15
+ "card[type_id]": type_id,
16
+ "attachment_upload": card_name
17
+ }
18
+ $_fileupload = $(fileupload)
19
+ if $_fileupload.closest("form").attr("action").indexOf("update") > -1
20
+ url = "card/update/"+$(fileupload).siblings("#file_card_name").val()
21
+ else
22
+ url = "card/create"
23
+ $(fileupload).fileupload(
24
+ url: decko.path(url),
25
+ dataType: 'html',
26
+ done: decko.doneFile,
27
+ add: decko.chooseFile,
28
+ progressall: decko.progressallFile
29
+ )#, forceIframeTransport: true )
30
+
31
+ chooseFile: (e, data) ->
32
+ data.form.find('button[type=submit]').attr('disabled',true)
33
+ editor = $(this).closest '.card-editor'
34
+ $('#progress').show()
35
+ editor.append '<input type="hidden" class="extra_upload_param" ' +
36
+ 'value="true" name="attachment_upload">'
37
+ editor.append '<input type="hidden" class="extra_upload_param" ' +
38
+ 'value="preview_editor" name="view">'
39
+ data.submit()
40
+ editor.find('.choose-file').hide()
41
+ # editor.find(".file-upload").prop "disabled", true
42
+ editor.find('.extra_upload_param').remove()
43
+
44
+ progressallFile: (e, data) ->
45
+ progress = parseInt(data.loaded / data.total * 100, 10)
46
+ $('#progress .progress-bar').css('width', progress + '%')
47
+
48
+ doneFile: (e, data) ->
49
+ editor = $(this).closest '.card-editor'
50
+ editor.find('.chosen-file').replaceWith data.result
51
+ data.form.find('button[type=submit]').attr('disabled',false)
52
+
53
+ $(window).ready ->
54
+ $('body').on 'click', '.cancel-upload', ->
55
+ editor = $(this).closest '.card-editor'
56
+ editor.find('.choose-file').show()
57
+ # editor.find(".file-upload").prop "disabled", false
58
+ editor.find('.chosen-file').empty()
59
+ editor.find('.progress').show()
60
+ editor.find('#progress .progress-bar').css('width', '0%')
61
+ editor.find('#progress').hide()
62
+
63
+ $('body').on "submit", "form", ->
64
+ disableUploader this, true
65
+
66
+ $("body").on "ajax:complete", "form", ->
67
+ disableUploader this, false
68
+
69
+ disableUploader = (form, toggle) ->
70
+ uploader = $(form).find ".file-upload[type=file]"
71
+ if uploader[0]
72
+ uploader.prop "disabled", toggle
@@ -0,0 +1,30 @@
1
+ /* -- file upload -- */
2
+ .fileupload-buttonbar .btn, .fileupload-buttonbar .toggle {
3
+ margin-bottom: 5px;
4
+ }
5
+
6
+ .fileinput-button {
7
+ position: relative;
8
+ overflow: hidden;
9
+ display: inline-block;
10
+ input {
11
+ position: absolute;
12
+ top: 0;
13
+ right: 0;
14
+ margin: 0;
15
+ opacity: 0;
16
+ -ms-filter: 'alpha(opacity=0)';
17
+ font-size: 200px;
18
+ direction: ltr;
19
+ cursor: pointer;
20
+ }
21
+ }
22
+
23
+ .TYPE-image {
24
+ .d0-card-content, .d0-card-body, &.d0-card-content {
25
+ img {
26
+ max-width: 100%;
27
+ max-height: 100%;
28
+ }
29
+ }
30
+ }
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -0,0 +1 @@
1
+ file1
@@ -0,0 +1 @@
1
+ file2
@@ -0,0 +1 @@
1
+ file3, man.
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" style="min-width:65px;min-height:45px;margin-top:-12px;margin-bottom:-14px" version="1.1" viewBox="0 0 242 218"><title>b&amp;w_logo</title><desc>Created with Sketch.</desc><defs><rect id="path-1" width="157.28" height="190.607" x="35.33" y="10.485" rx="12.491"/><filter id="filter-2" width="125.4%" height="121%" x="-12.1%" y="-10.5%" filterUnits="objectBoundingBox"><feMorphology in="SourceAlpha" operator="dilate" radius="1" result="shadowSpreadOuter1"/><feOffset dx="1" dy="0" in="shadowSpreadOuter1" result="shadowOffsetOuter1"/><feGaussianBlur in="shadowOffsetOuter1" result="shadowBlurOuter1" stdDeviation="5.5"/><feColorMatrix in="shadowBlurOuter1" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.1 0"/></filter><rect id="path-3" width="123.953" height="171.161" x="51.988" y="19.404" rx="9.689"/><filter id="filter-4" width="132.3%" height="123.4%" x="-15.3%" y="-11.7%" filterUnits="objectBoundingBox"><feMorphology in="SourceAlpha" operator="dilate" radius="1" result="shadowSpreadOuter1"/><feOffset dx="1" dy="0" in="shadowSpreadOuter1" result="shadowOffsetOuter1"/><feGaussianBlur in="shadowOffsetOuter1" result="shadowBlurOuter1" stdDeviation="5.5"/><feColorMatrix in="shadowBlurOuter1" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.1 0"/></filter><path id="path-5" d="M70.1050368,35.6666109 L159.089911,35.6666109 L159.089911,35.6666109 C163.678051,35.6666109 167.397473,39.386033 167.397473,43.9741728 L167.397473,87.717145 L167.397473,166.808436 L167.397473,166.808436 C167.397473,171.396576 163.678051,175.115998 159.089911,175.115998 L70.1050368,175.115998 L70.1050368,175.115998 C65.516897,175.115998 61.7974749,171.396576 61.7974749,166.808436 L61.7974749,43.9741728 L61.7974749,43.9741728 C61.7974749,39.386033 65.516897,35.6666109 70.1050368,35.6666109 Z"/><filter id="filter-6" width="137.9%" height="128.7%" x="-18%" y="-14.3%" filterUnits="objectBoundingBox"><feMorphology in="SourceAlpha" operator="dilate" radius="1" result="shadowSpreadOuter1"/><feOffset dx="1" dy="0" in="shadowSpreadOuter1" result="shadowOffsetOuter1"/><feGaussianBlur in="shadowOffsetOuter1" result="shadowBlurOuter1" stdDeviation="5.5"/><feColorMatrix in="shadowBlurOuter1" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.1 0"/></filter><rect id="path-7" width="92.149" height="107.187" x="70.764" y="49.853" rx="7.866"/><filter id="filter-8" width="143.4%" height="137.3%" x="-20.6%" y="-18.7%" filterUnits="objectBoundingBox"><feMorphology in="SourceAlpha" operator="dilate" radius="1" result="shadowSpreadOuter1"/><feOffset dx="1" dy="0" in="shadowSpreadOuter1" result="shadowOffsetOuter1"/><feGaussianBlur in="shadowOffsetOuter1" result="shadowBlurOuter1" stdDeviation="5.5"/><feColorMatrix in="shadowBlurOuter1" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.102553216 0"/></filter></defs><g id="Page-3" fill="none" fill-rule="evenodd" stroke="none" stroke-width="1"><g id="b&amp;w_logo" fill-rule="nonzero"><g id="Decko-Logo-" transform="translate(7.000000, 4.000000)"><g id="g5642"><g id="svg-card-1" transform="translate(113.969540, 105.788552) scale(-1, 1) rotate(105.855860) translate(-113.969540, -105.788552)"><use fill="#000" fill-opacity="1" filter="url(#filter-2)" xlink:href="#path-1"/><use fill="#4D4D4D" fill-rule="evenodd" xlink:href="#path-1"/></g><g id="svg-card-2" opacity=".88" transform="translate(113.964538, 104.984820) scale(-1, 1) rotate(117.480003) translate(-113.964538, -104.984820)"><use fill="#000" fill-opacity="1" filter="url(#filter-4)" xlink:href="#path-3"/><use fill="#FFF" fill-rule="evenodd" xlink:href="#path-3"/></g><g id="svg-card-3" transform="translate(114.597474, 105.391304) scale(-1, 1) rotate(133.539993) translate(-114.597474, -105.391304)"><use fill="#000" fill-opacity="1" filter="url(#filter-6)" xlink:href="#path-5"/><use fill="#4C4C4C" fill-rule="evenodd" xlink:href="#path-5"/></g><g id="svg-card-4" opacity=".88" transform="translate(116.838368, 103.446228) scale(-1, 1) rotate(142.690002) translate(-116.838368, -103.446228)"><use fill="#000" fill-opacity="1" filter="url(#filter-8)" xlink:href="#path-7"/><use fill="#FFF" fill-rule="evenodd" xlink:href="#path-7"/></g></g></g></g></g></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" style="min-width:65px;min-height:45px;margin-top:-12px;margin-bottom:-14px" version="1.1" viewBox="0 0 242 218"><title>b&amp;w_logo</title><desc>Created with Sketch.</desc><defs><rect id="path-1" width="157.28" height="190.607" x="35.33" y="10.485" rx="12.491"/><filter id="filter-2" width="125.4%" height="121%" x="-12.1%" y="-10.5%" filterUnits="objectBoundingBox"><feMorphology in="SourceAlpha" operator="dilate" radius="1" result="shadowSpreadOuter1"/><feOffset dx="1" dy="0" in="shadowSpreadOuter1" result="shadowOffsetOuter1"/><feGaussianBlur in="shadowOffsetOuter1" result="shadowBlurOuter1" stdDeviation="5.5"/><feColorMatrix in="shadowBlurOuter1" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.1 0"/></filter><rect id="path-3" width="123.953" height="171.161" x="51.988" y="19.404" rx="9.689"/><filter id="filter-4" width="132.3%" height="123.4%" x="-15.3%" y="-11.7%" filterUnits="objectBoundingBox"><feMorphology in="SourceAlpha" operator="dilate" radius="1" result="shadowSpreadOuter1"/><feOffset dx="1" dy="0" in="shadowSpreadOuter1" result="shadowOffsetOuter1"/><feGaussianBlur in="shadowOffsetOuter1" result="shadowBlurOuter1" stdDeviation="5.5"/><feColorMatrix in="shadowBlurOuter1" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.1 0"/></filter><path id="path-5" d="M70.1050368,35.6666109 L159.089911,35.6666109 L159.089911,35.6666109 C163.678051,35.6666109 167.397473,39.386033 167.397473,43.9741728 L167.397473,87.717145 L167.397473,166.808436 L167.397473,166.808436 C167.397473,171.396576 163.678051,175.115998 159.089911,175.115998 L70.1050368,175.115998 L70.1050368,175.115998 C65.516897,175.115998 61.7974749,171.396576 61.7974749,166.808436 L61.7974749,43.9741728 L61.7974749,43.9741728 C61.7974749,39.386033 65.516897,35.6666109 70.1050368,35.6666109 Z"/><filter id="filter-6" width="137.9%" height="128.7%" x="-18%" y="-14.3%" filterUnits="objectBoundingBox"><feMorphology in="SourceAlpha" operator="dilate" radius="1" result="shadowSpreadOuter1"/><feOffset dx="1" dy="0" in="shadowSpreadOuter1" result="shadowOffsetOuter1"/><feGaussianBlur in="shadowOffsetOuter1" result="shadowBlurOuter1" stdDeviation="5.5"/><feColorMatrix in="shadowBlurOuter1" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.1 0"/></filter><rect id="path-7" width="92.149" height="107.187" x="70.764" y="49.853" rx="7.866"/><filter id="filter-8" width="143.4%" height="137.3%" x="-20.6%" y="-18.7%" filterUnits="objectBoundingBox"><feMorphology in="SourceAlpha" operator="dilate" radius="1" result="shadowSpreadOuter1"/><feOffset dx="1" dy="0" in="shadowSpreadOuter1" result="shadowOffsetOuter1"/><feGaussianBlur in="shadowOffsetOuter1" result="shadowBlurOuter1" stdDeviation="5.5"/><feColorMatrix in="shadowBlurOuter1" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.102553216 0"/></filter></defs><g id="Page-3" fill="none" fill-rule="evenodd" stroke="none" stroke-width="1"><g id="b&amp;w_logo" fill-rule="nonzero"><g id="Decko-Logo-" transform="translate(7.000000, 4.000000)"><g id="g5642"><g id="svg-card-1" transform="translate(113.969540, 105.788552) scale(-1, 1) rotate(105.855860) translate(-113.969540, -105.788552)"><use fill="#000" fill-opacity="1" filter="url(#filter-2)" xlink:href="#path-1"/><use fill="#4D4D4D" fill-rule="evenodd" xlink:href="#path-1"/></g><g id="svg-card-2" opacity=".88" transform="translate(113.964538, 104.984820) scale(-1, 1) rotate(117.480003) translate(-113.964538, -104.984820)"><use fill="#000" fill-opacity="1" filter="url(#filter-4)" xlink:href="#path-3"/><use fill="#FFF" fill-rule="evenodd" xlink:href="#path-3"/></g><g id="svg-card-3" transform="translate(114.597474, 105.391304) scale(-1, 1) rotate(133.539993) translate(-114.597474, -105.391304)"><use fill="#000" fill-opacity="1" filter="url(#filter-6)" xlink:href="#path-5"/><use fill="#4C4C4C" fill-rule="evenodd" xlink:href="#path-5"/></g><g id="svg-card-4" opacity=".88" transform="translate(116.838368, 103.446228) scale(-1, 1) rotate(142.690002) translate(-116.838368, -103.446228)"><use fill="#000" fill-opacity="1" filter="url(#filter-8)" xlink:href="#path-7"/><use fill="#FFF" fill-rule="evenodd" xlink:href="#path-7"/></g></g></g></g></g></svg>
Binary file
@@ -0,0 +1,2 @@
1
+ // upload.js.coffee
2
+ (function(){var e;decko.editors.init[".file-upload"]=function(){return decko.upload_file(this)},$.extend(decko,{upload_file:function(e){var t;return $(e).on("fileuploadsubmit",function(e,t){var r,i,a;return i=(r=$(this)).siblings(".attachment_card_name:first").attr("name"),a=r.siblings("#attachment_type_id").val(),t.formData={"card[type_id]":a,attachment_upload:i}}),t=$(e).closest("form").attr("action").indexOf("update")>-1?"card/update/"+$(e).siblings("#file_card_name").val():"card/create",$(e).fileupload({url:decko.path(t),dataType:"html",done:decko.doneFile,add:decko.chooseFile,progressall:decko.progressallFile})},chooseFile:function(e,t){var r;return t.form.find("button[type=submit]").attr("disabled",!0),r=$(this).closest(".card-editor"),$("#progress").show(),r.append('<input type="hidden" class="extra_upload_param" value="true" name="attachment_upload">'),r.append('<input type="hidden" class="extra_upload_param" value="preview_editor" name="view">'),t.submit(),r.find(".choose-file").hide(),r.find(".extra_upload_param").remove()},progressallFile:function(e,t){var r;return r=parseInt(t.loaded/t.total*100,10),$("#progress .progress-bar").css("width",r+"%")},doneFile:function(e,t){return $(this).closest(".card-editor").find(".chosen-file").replaceWith(t.result),t.form.find("button[type=submit]").attr("disabled",!1)}}),$(window).ready(function(){return $("body").on("click",".cancel-upload",function(){var e;return(e=$(this).closest(".card-editor")).find(".choose-file").show(),e.find(".chosen-file").empty(),e.find(".progress").show(),e.find("#progress .progress-bar").css("width","0%"),e.find("#progress").hide()}),$("body").on("submit","form",function(){return e(this,!0)}),$("body").on("ajax:complete","form",function(){return e(this,!1)})}),e=function(e,t){var r;if((r=$(e).find(".file-upload[type=file]"))[0])return r.prop("disabled",t)}}).call(this);
Binary file
data/data/real.yml ADDED
@@ -0,0 +1,118 @@
1
+ #---
2
+ - :name: File
3
+ :type: :cardtype
4
+ :codename: file
5
+ :fields:
6
+ :description: |-
7
+ <p>
8
+ Upload images to these cards and include them anywhere.
9
+ [[http://decko.org/Image|more]]
10
+ </p>
11
+
12
+ - :name: Image
13
+ :type: :cardtype
14
+ :codename: image
15
+ :fields:
16
+ :description: |-
17
+ <p>
18
+ File cards are for uploading and downloading files.
19
+ [[http://decko.org/File|more]]
20
+ </p>
21
+ - :name:
22
+ - :image
23
+ - :right
24
+ - :default
25
+ :type: :image
26
+
27
+ - :name: "*logo"
28
+ :type: :image
29
+ :codename: logo
30
+ :storage_type: :coded
31
+ :image: logo.svg
32
+ :fields:
33
+ :self:
34
+ :fields:
35
+ :read: Anyone
36
+ - :name: "*favicon"
37
+ :type: :image
38
+ :codename: favicon
39
+ :image: favicon.png
40
+ :storage_type: :coded
41
+
42
+
43
+ - :name: "*new file"
44
+ :type: :file
45
+ :codename: new_file
46
+ :skip: validate_file_exist
47
+ - :name: "*new image"
48
+ :type: :image
49
+ :codename: new_image
50
+ :skip: validate_file_exist
51
+
52
+ # TODO: move to code. should not be editable
53
+ # Probably not in this mod, though. Needed to come after :image for eating, but it would
54
+ # probably make more sense to have this in the format mod in code.
55
+ - :name:
56
+ - :credit
57
+ - :image
58
+ :type: :html
59
+ :content: |-
60
+ <svg style="width:18px; height:14px;" viewBox="0 0 242 220" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
61
+ <!-- Generator: Sketch 46.2 (44496) - http://www.bohemiancoding.com/sketch -->
62
+ <title>b&amp;w_logo</title>
63
+ <desc>Created with Sketch.</desc>
64
+ <defs>
65
+ <rect id="path-1" x="35.3297422" y="10.484836" width="157.279595" height="190.607432" rx="12.491335"></rect>
66
+ <filter x="-12.1%" y="-10.5%" width="125.4%" height="121.0%" filterUnits="objectBoundingBox" id="filter-2">
67
+ <feMorphology radius="1" operator="dilate" in="SourceAlpha" result="shadowSpreadOuter1"></feMorphology>
68
+ <feOffset dx="1" dy="0" in="shadowSpreadOuter1" result="shadowOffsetOuter1"></feOffset>
69
+ <feGaussianBlur stdDeviation="5.5" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
70
+ <feColorMatrix values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.1 0" type="matrix" in="shadowBlurOuter1"></feColorMatrix>
71
+ </filter>
72
+ <rect id="path-3" x="51.9878879" y="19.404077" width="123.9533" height="171.161486" rx="9.6888466"></rect>
73
+ <filter x="-15.3%" y="-11.7%" width="132.3%" height="123.4%" filterUnits="objectBoundingBox" id="filter-4">
74
+ <feMorphology radius="1" operator="dilate" in="SourceAlpha" result="shadowSpreadOuter1"></feMorphology>
75
+ <feOffset dx="1" dy="0" in="shadowSpreadOuter1" result="shadowOffsetOuter1"></feOffset>
76
+ <feGaussianBlur stdDeviation="5.5" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
77
+ <feColorMatrix values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.1 0" type="matrix" in="shadowBlurOuter1"></feColorMatrix>
78
+ </filter>
79
+ <path d="M70.1050368,35.6666109 L159.089911,35.6666109 L159.089911,35.6666109 C163.678051,35.6666109 167.397473,39.386033 167.397473,43.9741728 L167.397473,87.717145 L167.397473,166.808436 L167.397473,166.808436 C167.397473,171.396576 163.678051,175.115998 159.089911,175.115998 L70.1050368,175.115998 L70.1050368,175.115998 C65.516897,175.115998 61.7974749,171.396576 61.7974749,166.808436 L61.7974749,43.9741728 L61.7974749,43.9741728 C61.7974749,39.386033 65.516897,35.6666109 70.1050368,35.6666109 Z" id="path-5"></path>
80
+ <filter x="-18.0%" y="-14.3%" width="137.9%" height="128.7%" filterUnits="objectBoundingBox" id="filter-6">
81
+ <feMorphology radius="1" operator="dilate" in="SourceAlpha" result="shadowSpreadOuter1"></feMorphology>
82
+ <feOffset dx="1" dy="0" in="shadowSpreadOuter1" result="shadowOffsetOuter1"></feOffset>
83
+ <feGaussianBlur stdDeviation="5.5" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
84
+ <feColorMatrix values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.1 0" type="matrix" in="shadowBlurOuter1"></feColorMatrix>
85
+ </filter>
86
+ <rect id="path-7" x="70.7637805" y="49.8525134" width="92.149175" height="107.18743" rx="7.8659801"></rect>
87
+ <filter x="-20.6%" y="-18.7%" width="143.4%" height="137.3%" filterUnits="objectBoundingBox" id="filter-8">
88
+ <feMorphology radius="1" operator="dilate" in="SourceAlpha" result="shadowSpreadOuter1"></feMorphology>
89
+ <feOffset dx="1" dy="0" in="shadowSpreadOuter1" result="shadowOffsetOuter1"></feOffset>
90
+ <feGaussianBlur stdDeviation="5.5" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
91
+ <feColorMatrix values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.102553216 0" type="matrix" in="shadowBlurOuter1"></feColorMatrix>
92
+ </filter>
93
+ </defs>
94
+ <g id="Page-3" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
95
+ <g id="b&amp;w_logo" fill-rule="nonzero">
96
+ <g id="Decko-Logo-" transform="translate(7.000000, 4.000000)">
97
+ <g id="g5642">
98
+ <g id="svg-card-1" transform="translate(113.969540, 105.788552) scale(-1, 1) rotate(105.855860) translate(-113.969540, -105.788552) ">
99
+ <use fill="black" fill-opacity="1" filter="url(#filter-2)" xlink:href="#path-1"></use>
100
+ <use fill="#4D4D4D" fill-rule="evenodd" xlink:href="#path-1"></use>
101
+ </g>
102
+ <g id="svg-card-2" opacity="0.879999995" transform="translate(113.964538, 104.984820) scale(-1, 1) rotate(117.480003) translate(-113.964538, -104.984820) ">
103
+ <use fill="black" fill-opacity="1" filter="url(#filter-4)" xlink:href="#path-3"></use>
104
+ <use fill="#FFFFFF" fill-rule="evenodd" xlink:href="#path-3"></use>
105
+ </g>
106
+ <g id="svg-card-3" transform="translate(114.597474, 105.391304) scale(-1, 1) rotate(133.539993) translate(-114.597474, -105.391304) ">
107
+ <use fill="black" fill-opacity="1" filter="url(#filter-6)" xlink:href="#path-5"></use>
108
+ <use fill="#4C4C4C" fill-rule="evenodd" xlink:href="#path-5"></use>
109
+ </g>
110
+ <g id="svg-card-4" opacity="0.879999995" transform="translate(116.838368, 103.446228) scale(-1, 1) rotate(142.690002) translate(-116.838368, -103.446228) ">
111
+ <use fill="black" fill-opacity="1" filter="url(#filter-8)" xlink:href="#path-7"></use>
112
+ <use fill="#FFFFFF" fill-rule="evenodd" xlink:href="#path-7"></use>
113
+ </g>
114
+ </g>
115
+ </g>
116
+ </g>
117
+ </g>
118
+ </svg>
@@ -0,0 +1,6 @@
1
+ Cardio::Railtie.config.tap do |config|
2
+ config.files_web_path = "files"
3
+ config.file_storage = :local
4
+ config.file_buckets = {}
5
+ config.file_default_bucket = nil
6
+ end
@@ -81,11 +81,11 @@ module CarrierWave
81
81
 
82
82
  def assign_file file
83
83
  db_column = _mounter(:#{column}).serialization_column
84
- send(:"\#{db_column}_will_change!") # unless attribute_is_changing? db_column
84
+ send(:"\#{db_column}_will_change!") unless duplicate?
85
85
  if web?
86
86
  self.content = file
87
87
  else
88
- send(:"#{column}_will_change!")
88
+ send(:"#{column}_will_change!") unless duplicate?
89
89
  yield
90
90
  end
91
91
  end
@@ -0,0 +1,8 @@
1
+ module CarrierWave
2
+ # Helper module for making test files in carrierwave available to tests
3
+ module TestFile
4
+ def self.path filename
5
+ Cardio::Mod.fetch("carrierwave").subpath "data", "files", filename
6
+ end
7
+ end
8
+ end
data/locales/en.yml CHANGED
@@ -11,3 +11,9 @@ en:
11
11
  carrierwave_replace_item: Replace %{attachment_name}...
12
12
  carrierwave_unknown_storage_type: unknown storage type %{new_storage_type}
13
13
  carrierwave_url_is_missing: url is missing
14
+
15
+ # carrierwave_task_move_files_link_text: "Move Files"
16
+ # carrierwave_task_move_files_description: "Move Files!"
17
+
18
+ carrierwave_task_delete_upload_tmp_files_link_text: "Delete upload tmp files"
19
+ carrierwave_task_delete_upload_tmp_files_description: "Delete upload tmp files!"
@@ -1,3 +1,5 @@
1
+ Card.action_specific_attributes << :duplicate_file
2
+
1
3
  attr_writer :empty_ok
2
4
 
3
5
  def self.included host_class
@@ -21,7 +23,7 @@ event :save_original_filename, :prepare_to_store, on: :save, when: :file_ready_t
21
23
  @current_action.update! comment: original_filename
22
24
  end
23
25
 
24
- event :validate_file_exist, :validate, on: :create do
26
+ event :validate_file_exist, :validate, on: :create, skip: :allowed do
25
27
  return if empty_ok?
26
28
 
27
29
  if web?
@@ -80,10 +82,21 @@ end
80
82
  def assign_set_specific_attributes
81
83
  @attaching = set_specific[attachment_name].present?
82
84
  # reset content if we really have something to upload
83
- self.content = nil if @attaching
85
+ self.content = nil if @attaching && !duplicate?
84
86
  super
85
87
  end
86
88
 
89
+ # FIXME: this is weak duplicate detection and currently only catches duplicate
90
+ # updates to coded cards. Tried #read but wasn't getting the same value on both
91
+ # files even when they were definitely duplicates.
92
+ def duplicate?
93
+ real? &&
94
+ storage_type == :coded &&
95
+ (old = attachment.file) &&
96
+ (new = set_specific[attachment_name]) &&
97
+ old.size == new.size
98
+ end
99
+
87
100
  def delete_files_for_action action
88
101
  with_selected_action_id(action.id) do
89
102
  attachment.file.delete
@@ -1,8 +1,10 @@
1
+ # TODO: move to lib
2
+ # eg, create new Card::File class in lib/card/file
1
3
  module ClassMethods
2
- def update_all_storage_locations
3
- Card.search(type_id: ["in", Card::FileID, Card::ImageID])
4
- .each(&:update_storage_location!)
5
- end
4
+ # def update_all_storage_locations
5
+ # Card.search(type_id: ["in", Card::FileID, Card::ImageID])
6
+ # .each(&:update_storage_location!)
7
+ # end
6
8
 
7
9
  def delete_tmp_files_of_cached_uploads
8
10
  cards_with_disposable_attachments do |card, action|
data/set/self/admin.rb CHANGED
@@ -1,22 +1,8 @@
1
- basket[:tasks] += [
2
- {
3
- name: :update_file_storage_locations,
4
- execute_policy: -> { Card.update_all_storage_locations },
5
- stats: {
6
- title: "cards with attachment",
7
- count: -> { Card.count_cards_with_attachment }
8
- # link_text: "update storage locations",
9
- # task: "update_file_storage_locations"
10
- }
11
- },
12
- {
13
- name: :delete_upload_tmp_files,
14
- execute_policy: -> { Card.delete_tmp_files_of_cached_uploads },
15
- stats: {
16
- title: "tmp files of canceled uploads",
17
- count: -> { ::Card.draft_actions_with_attachment },
18
- link_text: "delete tmp files",
19
- task: "delete_tmp_files_of_cached_uploads"
20
- }
21
- }
22
- ]
1
+ basket[:tasks][:delete_upload_tmp_files] = {
2
+ mod: :carrierwave,
3
+ execute_policy: -> { Card.delete_tmp_files_of_cached_uploads }
4
+ }
5
+
6
+ # { name: :move_files,
7
+ # mod: :carrierwave,
8
+ # execute_policy: -> { Card.update_all_storage_locations } },
@@ -0,0 +1,8 @@
1
+ format :json do
2
+ view :image_complete, cache: :never do
3
+ complete_or_match_search(start_only: false,
4
+ additional_cql: { type: :image }).map do |item|
5
+ { id: item, href: item.url_key, text: goto_item_label(item) }
6
+ end
7
+ end
8
+ end
@@ -1,19 +1,15 @@
1
1
  .chosen-file
2
2
  %input{ name: cached_upload_card_name, type: "hidden", value: card.selected_action_id }
3
- %table.table.table-striped{ role: "presentation" }
4
- %tbody.files
5
- %tr.template-download.fade.show
6
- %td
7
- %span.preview
8
- = preview
9
- %td
10
- %p.name
11
- = card.original_filename
12
- %td
13
- %span.size
14
- = number_to_human_size card.attachment.size
15
- %td.float-right
16
- %button.btn.btn-danger.delete.cancel-upload{ "data-type": "DELETE" }
17
- = icon_tag :delete
18
- %span
19
- = preview_editor_delete_text
3
+ .d-flex
4
+ = preview
5
+ .d-flex.flex-column.justify-content-between.ml-2.w-100
6
+ %div
7
+ %p.name
8
+ = card.original_filename
9
+ %span.size
10
+ = number_to_human_size card.attachment.size
11
+ .align-self-end
12
+ %button.btn.btn-danger.delete.cancel-upload{ "data-type": "DELETE" }
13
+ = icon_tag :delete
14
+ %span
15
+ = preview_editor_delete_text
@@ -3,7 +3,7 @@ format :html do
3
3
 
4
4
  # core HTML image view.
5
5
  view :core do
6
- return card.attachment.read if card.svg?
6
+ return card.attachment.read.html_safe if svg?
7
7
 
8
8
  with_valid_source do |source|
9
9
  image_tag source, alt: card.name
@@ -76,4 +76,8 @@ format :html do
76
76
  Card::Content::Diff.render_added_chunk _render_core
77
77
  end
78
78
  end
79
+
80
+ def goto_autocomplete_icon
81
+ render :core, size: :small
82
+ end
79
83
  end
data/set/type/image.rb CHANGED
@@ -12,6 +12,7 @@ end
12
12
 
13
13
  format do
14
14
  include File::Format
15
+ delegate :svg?, to: :card
15
16
 
16
17
  view :one_line_content do
17
18
  _render_core size: :icon
@@ -32,10 +33,12 @@ format do
32
33
 
33
34
  def selected_version
34
35
  size = determine_image_size
35
- if size && size != :original
36
- card.image.versions[size]
36
+ image = card.image
37
+
38
+ if size && size != :original && !svg?
39
+ image.versions[size]
37
40
  else
38
- card.image
41
+ image
39
42
  end
40
43
  end
41
44
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: card-mod-carrierwave
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.14.2
4
+ version: 0.15.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ethan McCutchen
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2022-01-08 00:00:00.000000000 Z
13
+ date: 2023-01-04 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: card
@@ -18,14 +18,14 @@ dependencies:
18
18
  requirements:
19
19
  - - '='
20
20
  - !ruby/object:Gem::Version
21
- version: 1.104.2
21
+ version: 1.105.0
22
22
  type: :runtime
23
23
  prerelease: false
24
24
  version_requirements: !ruby/object:Gem::Requirement
25
25
  requirements:
26
26
  - - '='
27
27
  - !ruby/object:Gem::Version
28
- version: 1.104.2
28
+ version: 1.105.0
29
29
  - !ruby/object:Gem::Dependency
30
30
  name: carrierwave
31
31
  requirement: !ruby/object:Gem::Requirement
@@ -54,34 +54,48 @@ dependencies:
54
54
  - - "~>"
55
55
  - !ruby/object:Gem::Version
56
56
  version: '4.2'
57
+ - !ruby/object:Gem::Dependency
58
+ name: ssrf_filter
59
+ requirement: !ruby/object:Gem::Requirement
60
+ requirements:
61
+ - - "~>"
62
+ - !ruby/object:Gem::Version
63
+ version: 1.0.7
64
+ type: :runtime
65
+ prerelease: false
66
+ version_requirements: !ruby/object:Gem::Requirement
67
+ requirements:
68
+ - - "~>"
69
+ - !ruby/object:Gem::Version
70
+ version: 1.0.7
57
71
  - !ruby/object:Gem::Dependency
58
72
  name: card-mod-history
59
73
  requirement: !ruby/object:Gem::Requirement
60
74
  requirements:
61
75
  - - '='
62
76
  - !ruby/object:Gem::Version
63
- version: 0.14.2
77
+ version: 0.15.0
64
78
  type: :runtime
65
79
  prerelease: false
66
80
  version_requirements: !ruby/object:Gem::Requirement
67
81
  requirements:
68
82
  - - '='
69
83
  - !ruby/object:Gem::Version
70
- version: 0.14.2
84
+ version: 0.15.0
71
85
  - !ruby/object:Gem::Dependency
72
86
  name: card-mod-permissions
73
87
  requirement: !ruby/object:Gem::Requirement
74
88
  requirements:
75
89
  - - '='
76
90
  - !ruby/object:Gem::Version
77
- version: 0.14.2
91
+ version: 0.15.0
78
92
  type: :runtime
79
93
  prerelease: false
80
94
  version_requirements: !ruby/object:Gem::Requirement
81
95
  requirements:
82
96
  - - '='
83
97
  - !ruby/object:Gem::Version
84
- version: 0.14.2
98
+ version: 0.15.0
85
99
  description: ''
86
100
  email:
87
101
  - info@decko.org
@@ -89,12 +103,31 @@ executables: []
89
103
  extensions: []
90
104
  extra_rdoc_files: []
91
105
  files:
106
+ - assets/script/upload.js.coffee
107
+ - assets/style/file.scss
108
+ - data/files/favicon.png
109
+ - data/files/favicon/image-icon.png
110
+ - data/files/favicon/image-large.png
111
+ - data/files/favicon/image-medium.png
112
+ - data/files/favicon/image-original.png
113
+ - data/files/favicon/image-small.png
114
+ - data/files/file1.txt
115
+ - data/files/file2.txt
116
+ - data/files/file3.txt
117
+ - data/files/logo.svg
118
+ - data/files/logo/image-original.svg
119
+ - data/files/mao2.jpg
120
+ - data/files/mod_carrierwave_script_asset_output/file.js
121
+ - data/files/rails.gif
122
+ - data/real.yml
92
123
  - init/early/carrierwave.rb
93
124
  - init/early/mini_magick.rb
125
+ - lib/card/mod/carrierwave.rb
94
126
  - lib/carrier_wave/card_mount.rb
95
127
  - lib/carrier_wave/file_card_uploader.rb
96
128
  - lib/carrier_wave/file_card_uploader/path.rb
97
129
  - lib/carrier_wave/image_card_uploader.rb
130
+ - lib/carrier_wave/test_file.rb
98
131
  - locales/de.yml
99
132
  - locales/en.yml
100
133
  - set/abstract/attachment.rb
@@ -110,6 +143,7 @@ files:
110
143
  - set/self/favicon.rb
111
144
  - set/self/new_file.rb
112
145
  - set/self/new_image.rb
146
+ - set/self/search.rb
113
147
  - set/type/file.rb
114
148
  - set/type/file/core.haml
115
149
  - set/type/file/file_chooser.haml
@@ -126,6 +160,7 @@ metadata:
126
160
  wiki_uri: https://decko.org
127
161
  documentation_url: http://docs.decko.org/
128
162
  card-mod: carrierwave
163
+ card-mod-group: gem-defaults
129
164
  post_install_message:
130
165
  rdoc_options: []
131
166
  require_paths:
@@ -141,7 +176,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
141
176
  - !ruby/object:Gem::Version
142
177
  version: '0'
143
178
  requirements: []
144
- rubygems_version: 3.2.15
179
+ rubygems_version: 3.3.11
145
180
  signing_key:
146
181
  specification_version: 4
147
182
  summary: File and Image handling