card-mod-carrierwave 0.14.1 → 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: a9f40c24667705b62968b1a43a7934b3579fc7d67e3442c73182c4c9c85a4242
4
- data.tar.gz: 84f324d97c7d194785b5566a64799e0533334d560f91450f1a9517d6bd70cf42
3
+ metadata.gz: a249b3cb9824547e04d317283684d5c36e27824cf9ed6dc8b8a1754ebe00f161
4
+ data.tar.gz: 0a6b53cec1fa1132f36b0753c0b7812fbc1beb92ec5c56a9b9f3c54b7a54410a
5
5
  SHA512:
6
- metadata.gz: 85e5549724e44cb356b0c19290f0eb4941e7b2507b1f582f14d8b20ffce5e43b77954351b590393dbfc1d3815ae5739ccc795fceb661f91213c8aaed4023d7c4
7
- data.tar.gz: 9c3818ab31b033e689adc355779c36481c781f6f2468a633ca0d5666908ed7be1734dafc10d483445e27afecfb22b5ad8cc27498b2200aee5824445c3e1e56c4
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!"
@@ -46,24 +46,59 @@ def storage_type
46
46
  @storage_type ||= new_card? ? storage_type_from_config : storage_type_from_content
47
47
  end
48
48
 
49
- def storage_type_from_config
50
- valid_storage_type ENV["FILE_STORAGE"] || Cardio.config.file_storage
49
+ def storage_changed?
50
+ (storage_type != current.storage_type) ||
51
+ (bucket != current.bucket) ||
52
+ (mod != current.mod)
51
53
  end
52
54
 
53
- def valid_storage_type storage_type
54
- storage_type.to_sym.tap do |type|
55
- invalid_storage_type! type unless type.in? valid_storage_type_list
55
+ def known_storage_type?
56
+ storage_type.in? CarrierWave::FileCardUploader::STORAGE_TYPES
57
+ end
58
+
59
+ def unknown_storage_type
60
+ t :carrierwave_unknown_storage_type, new_storage_type: storage_type
61
+ end
62
+
63
+ def file_updated_at
64
+ if coded?
65
+ File.mtime file.path
66
+ else
67
+ updated_at
56
68
  end
69
+ rescue Errno::ENOENT # no file at path
70
+ nil
57
71
  end
58
72
 
59
- def valid_storage_type_list
60
- CarrierWave::FileCardUploader::STORAGE_TYPES
73
+ private
74
+
75
+ def storage_type_from_config
76
+ storage = Cardio.config.file_storage
77
+ # valid_storage_type(storage) && configured_storage_type(storage) && storage
78
+ valid_storage_type(storage) && storage
61
79
  end
62
80
 
63
- def invalid_storage_type! type
81
+ # FIXME: storage type should really be validated at load time:
82
+
83
+ def valid_storage_type storage_type
84
+ return true if storage_type.in? CarrierWave::FileCardUploader::STORAGE_TYPES
85
+
64
86
  raise Card::Error, t(:carrierwave_error_invalid_storage_type, type: type)
65
87
  end
66
88
 
89
+ # TODO: finish this idea:
90
+ # def configured_storage_type storage_type
91
+ # case storage_type
92
+ # when :local
93
+ # # require existent files directory with write permissions
94
+ # when :cloud
95
+ # unless Cardio.config.deck_host
96
+ # raise Card::Error, t(:carrierwave_error_host_required)
97
+ # end
98
+ # end
99
+ # storage_type
100
+ # end
101
+
67
102
  def storage_type_from_content
68
103
  @storage_type_from_content ||=
69
104
  case content
@@ -79,27 +114,3 @@ def storage_type_from_content
79
114
  end
80
115
  end
81
116
  end
82
-
83
- def storage_changed?
84
- (storage_type != current.storage_type) ||
85
- (bucket != current.bucket) ||
86
- (mod != current.mod)
87
- end
88
-
89
- def known_storage_type?
90
- storage_type.in? CarrierWave::FileCardUploader::STORAGE_TYPES
91
- end
92
-
93
- def unknown_storage_type
94
- t :carrierwave_unknown_storage_type, new_storage_type: storage_type
95
- end
96
-
97
- def file_updated_at
98
- if coded?
99
- File.mtime file.path
100
- else
101
- updated_at
102
- end
103
- rescue Errno::ENOENT # no file at path
104
- nil
105
- end
@@ -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.1
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-04 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.1
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.1
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.1
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.1
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.1
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.1
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