Browse Source

Fix #834: Correct clearing of file preview including zoom cache

Kartik Visweswaran 8 years ago
parent
commit
adbfaf3813
5 changed files with 192 additions and 143 deletions
  1. 4 3
      CHANGE.md
  2. 134 127
      examples/index.html
  3. 7 3
      js/fileinput.js
  4. 0 0
      js/fileinput.min.js
  5. 47 10
      sass/fileinput.scss

+ 4 - 3
CHANGE.md

@@ -19,9 +19,10 @@ Change Log: `bootstrap-fileinput`
 11. (enh #828): Allow drag sort of single uploaded thumbnails with `initialPreview` config set (post upload).
 11. (enh #828): Allow drag sort of single uploaded thumbnails with `initialPreview` config set (post upload).
 12. (enh #831): Update Finnish Translations.
 12. (enh #831): Update Finnish Translations.
 13. (bug #833): Correct validation and defaults init for `allowedPreviewTypes`.
 13. (bug #833): Correct validation and defaults init for `allowedPreviewTypes`.
-14. (enh #835): Update Polish Translations.
-15. (enh #837): Update Czech Translations.
-16. (bug #839): Correct `initialPreview` generation and sortable behavior for async uploads.
+14. (bug #834): Correct clearing of file preview including zoom cache.
+15. (enh #835): Update Polish Translations.
+16. (enh #837): Update Czech Translations.
+17. (bug #839): Correct `initialPreview` generation and sortable behavior for async uploads.
 
 
 ## version 4.3.6
 ## version 4.3.6
 
 

+ 134 - 127
examples/index.html

@@ -1,161 +1,168 @@
 <!DOCTYPE html>
 <!DOCTYPE html>
 <!-- release v4.3.7, copyright 2014 - 2017 Kartik Visweswaran -->
 <!-- release v4.3.7, copyright 2014 - 2017 Kartik Visweswaran -->
+<!--suppress JSUnresolvedLibraryURL -->
 <html lang="en">
 <html lang="en">
-    <head>
-        <meta charset="UTF-8"/>
-        <title>Krajee JQuery Plugins - &copy; Kartik</title>
-        <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css" rel="stylesheet">
-        <link href="../css/fileinput.css" media="all" rel="stylesheet" type="text/css" />
-        <script src="http://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
-        <script src="../js/fileinput.js" type="text/javascript"></script>
-        <script src="../js/fileinput_locale_fr.js" type="text/javascript"></script>
-        <script src="../js/fileinput_locale_es.js" type="text/javascript"></script>
-        <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/js/bootstrap.min.js" type="text/javascript"></script>
-    </head>
-    <body>
-        <div class="container kv-main">
-            <div class="page-header">
-            <h1>Bootstrap File Input Example <small><a href="https://github.com/kartik-v/bootstrap-fileinput-samples"><i class="glyphicon glyphicon-download"></i> Download Sample Files</a></small></h1>
-            </div>
-            <form enctype="multipart/form-data">
-                <input id="file-0a" class="file" type="file" multiple data-min-file-count="1">
-                <br>
-                <button type="submit" class="btn btn-primary">Submit</button>
-                <button type="reset" class="btn btn-default">Reset</button>
-            </form>
-            <hr>
-            <form enctype="multipart/form-data">
-                <label>Test invalid input type</label>
-                <input id="file-0b" class="file" type="text" multiple data-min-file-count="1">
-                <script>
-                $(document).on('ready', function(){$("#file-0b").fileinput();});
-                </script>
-            </form>
-            <hr>
-            <form enctype="multipart/form-data">
-                <input id="file-0a" class="file" type="file" multiple data-min-file-count="3">
-                <hr>
-                 <div class="form-group">
-                    <input id="file-0b" class="file" type="file">
-                </div>
-                <hr>
-                <div class="form-group">
-                    <input id="file-1" type="file" multiple class="file" data-overwrite-initial="false" data-min-file-count="2">
-                </div>
-                <hr>
-                <div class="form-group">
-                    <input id="file-2" type="file" class="file" readonly data-show-upload="false">
-                </div> 
-                <hr>
-                <div class="form-group">
-                    <label>Preview File Icon</label>
-                    <input id="file-3" type="file" multiple=true>
-                </div>
-                <hr>
-                <div class="form-group">
-                    <input id="file-4" type="file" class="file" data-upload-url="#">
-                </div>
-                <hr>
-                <div class="form-group">
-                    <button class="btn btn-warning" type="button">Disable Test</button>
-                    <button class="btn btn-info" type="reset">Refresh Test</button>
-                    <button class="btn btn-primary">Submit</button>
-                    <button class="btn btn-default" type="reset">Reset</button>
-                </div>
-                <hr>
-                <div class="form-group">
-                    <input type="file" class="file" id="test-upload" multiple>
-                    <div id="errorBlock" class="help-block"></div>
-                </div>
-                <hr>
-                <div class="form-group">
-                    <input id="file-5" class="file" type="file" multiple data-preview-file-type="any" data-upload-url="#">
-                </div>
-            </form>
-            
-            
-            <hr>
-            <h4>Multi Language Inputs</h4>
-            <form enctype="multipart/form-data">
-                <label>French Input</label>
-                <input id="file-fr" name="file-fr[]" type="file" multiple>
-                <hr style="border: 2px dotted">
-                <label>Spanish Input</label>
-                <input id="file-es" name="file-es[]" type="file" multiple>
-            </form>
-            <hr>
-            <br>
+<head>
+    <meta charset="UTF-8"/>
+    <title>Krajee JQuery Plugins - &copy; Kartik</title>
+    <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
+    <link href="../css/fileinput.css" media="all" rel="stylesheet" type="text/css"/>
+    <script src="http://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
+    <script src="../js/fileinput.js" type="text/javascript"></script>
+    <script src="../js/fileinput_locale_fr.js" type="text/javascript"></script>
+    <script src="../js/fileinput_locale_es.js" type="text/javascript"></script>
+    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" type="text/javascript"></script>
+</head>
+<body>
+<div class="container kv-main">
+    <div class="page-header">
+        <h1>Bootstrap File Input Example
+            <small><a href="https://github.com/kartik-v/bootstrap-fileinput-samples"><i
+                    class="glyphicon glyphicon-download"></i> Download Sample Files</a></small>
+        </h1>
+    </div>
+    <form enctype="multipart/form-data">
+        <input id="file-0a" class="file" type="file" multiple data-min-file-count="1">
+        <br>
+        <button type="submit" class="btn btn-primary">Submit</button>
+        <button type="reset" class="btn btn-default">Reset</button>
+    </form>
+    <hr>
+    <form enctype="multipart/form-data">
+        <label for="file-0b">Test invalid input type</label>
+        <input id="file-0b" name="file-0b" class="file" type="text" multiple data-min-file-count="1">
+        <script>
+            $(document).on('ready', function () {
+                $("#file-0b").fileinput();
+            });
+        </script>
+    </form>
+    <hr>
+    <form enctype="multipart/form-data">
+        <input id="file-0c" class="file" type="file" multiple data-min-file-count="3">
+        <hr>
+        <div class="form-group">
+            <input id="file-0d" class="file" type="file">
         </div>
         </div>
-    </body>
-	<script>
+        <hr>
+        <div class="form-group">
+            <input id="file-1" type="file" multiple class="file" data-overwrite-initial="false" data-min-file-count="2">
+        </div>
+        <hr>
+        <div class="form-group">
+            <input id="file-2" type="file" class="file" readonly data-show-upload="false">
+        </div>
+        <hr>
+        <div class="form-group">
+            <label>Preview File Icon</label>
+            <input id="file-3" type="file" multiple>
+        </div>
+        <hr>
+        <div class="form-group">
+            <input id="file-4" type="file" class="file" data-upload-url="#">
+        </div>
+        <hr>
+        <div class="form-group">
+            <button class="btn btn-warning" type="button">Disable Test</button>
+            <button class="btn btn-info" type="reset">Refresh Test</button>
+            <button class="btn btn-primary">Submit</button>
+            <button class="btn btn-default" type="reset">Reset</button>
+        </div>
+        <hr>
+        <div class="form-group">
+            <input type="file" class="file" id="test-upload" multiple>
+            <div id="errorBlock" class="help-block"></div>
+        </div>
+        <hr>
+        <div class="form-group">
+            <input id="file-5" class="file" type="file" multiple data-preview-file-type="any" data-upload-url="#">
+        </div>
+    </form>
+
+
+    <hr>
+    <h4>Multi Language Inputs</h4>
+    <form enctype="multipart/form-data">
+        <label>French Input</label>
+        <input id="file-fr" name="file-fr[]" type="file" multiple>
+        <hr style="border: 2px dotted">
+        <label>Spanish Input</label>
+        <input id="file-es" name="file-es[]" type="file" multiple>
+    </form>
+    <hr>
+    <br>
+</div>
+</body>
+<script>
     $('#file-fr').fileinput({
     $('#file-fr').fileinput({
         language: 'fr',
         language: 'fr',
         uploadUrl: '#',
         uploadUrl: '#',
-        allowedFileExtensions : ['jpg', 'png','gif'],
+        allowedFileExtensions: ['jpg', 'png', 'gif']
     });
     });
     $('#file-es').fileinput({
     $('#file-es').fileinput({
         language: 'es',
         language: 'es',
         uploadUrl: '#',
         uploadUrl: '#',
-        allowedFileExtensions : ['jpg', 'png','gif'],
+        allowedFileExtensions: ['jpg', 'png', 'gif']
     });
     });
     $("#file-0").fileinput({
     $("#file-0").fileinput({
-        'allowedFileExtensions' : ['jpg', 'png','gif'],
+        'allowedFileExtensions': ['jpg', 'png', 'gif']
     });
     });
     $("#file-1").fileinput({
     $("#file-1").fileinput({
         uploadUrl: '#', // you must set a valid URL here else you will get an error
         uploadUrl: '#', // you must set a valid URL here else you will get an error
-        allowedFileExtensions : ['jpg', 'png','gif'],
+        allowedFileExtensions: ['jpg', 'png', 'gif'],
         overwriteInitial: false,
         overwriteInitial: false,
         maxFileSize: 1000,
         maxFileSize: 1000,
         maxFilesNum: 10,
         maxFilesNum: 10,
         //allowedFileTypes: ['image', 'video', 'flash'],
         //allowedFileTypes: ['image', 'video', 'flash'],
-        slugCallback: function(filename) {
+        slugCallback: function (filename) {
             return filename.replace('(', '_').replace(']', '_');
             return filename.replace('(', '_').replace(']', '_');
         }
         }
-	});
-    /*
-    $(".file").on('fileselect', function(event, n, l) {
-        alert('File Selected. Name: ' + l + ', Num: ' + n);
     });
     });
-    */
-	$("#file-3").fileinput({
-		showUpload: false,
-		showCaption: false,
-		browseClass: "btn btn-primary btn-lg",
-		fileType: "any",
+    /*
+     $(".file").on('fileselect', function(event, n, l) {
+     alert('File Selected. Name: ' + l + ', Num: ' + n);
+     });
+     */
+    $("#file-3").fileinput({
+        showUpload: false,
+        showCaption: false,
+        browseClass: "btn btn-primary btn-lg",
+        fileType: "any",
         previewFileIcon: "<i class='glyphicon glyphicon-king'></i>"
         previewFileIcon: "<i class='glyphicon glyphicon-king'></i>"
-	});
-	$("#file-4").fileinput({
-		uploadExtraData: {kvId: '10'}
-	});
-    $(".btn-warning").on('click', function() {
-        if ($('#file-4').attr('disabled')) {
-            $('#file-4').fileinput('enable');
+    });
+    $("#file-4").fileinput({
+        uploadExtraData: {kvId: '10'}
+    });
+    $(".btn-warning").on('click', function () {
+        var $el = $("#file-4");
+        if ($el.attr('disabled')) {
+            $el.fileinput('enable');
         } else {
         } else {
-            $('#file-4').fileinput('disable');
+            $el.fileinput('disable');
         }
         }
-    });    
-    $(".btn-info").on('click', function() {
-        $('#file-4').fileinput('refresh', {previewClass:'bg-info'});
     });
     });
-    /*
-    $('#file-4').on('fileselectnone', function() {
-        alert('Huh! You selected no files.');
+    $(".btn-info").on('click', function () {
+        $("#file-4").fileinput('refresh', {previewClass: 'bg-info'});
     });
     });
-    $('#file-4').on('filebrowse', function() {
-        alert('File browse clicked for #file-4');
-    });
-    */
-    $(document).ready(function() {
+    /*
+     $('#file-4').on('fileselectnone', function() {
+     alert('Huh! You selected no files.');
+     });
+     $('#file-4').on('filebrowse', function() {
+     alert('File browse clicked for #file-4');
+     });
+     */
+    $(document).ready(function () {
         $("#test-upload").fileinput({
         $("#test-upload").fileinput({
-            'showPreview' : false,
-            'allowedFileExtensions' : ['jpg', 'png','gif'],
+            'showPreview': false,
+            'allowedFileExtensions': ['jpg', 'png', 'gif'],
             'elErrorContainer': '#errorBlock'
             'elErrorContainer': '#errorBlock'
         });
         });
         /*
         /*
-        $("#test-upload").on('fileloaded', function(event, file, previewId, index) {
-            alert('i = ' + index + ', id = ' + previewId + ', file = ' + file.name);
-        });
-        */
+         $("#test-upload").on('fileloaded', function(event, file, previewId, index) {
+         alert('i = ' + index + ', id = ' + previewId + ', file = ' + file.name);
+         });
+         */
     });
     });
-	</script>
+</script>
 </html>
 </html>

+ 7 - 3
js/fileinput.js

@@ -1052,9 +1052,13 @@
             return !self._abort({});
             return !self._abort({});
         },
         },
         _clearPreview: function () {
         _clearPreview: function () {
-            var self = this, $thumbs = !self.showUploadedThumbs ? self.$preview.find(FRAMES) :
-                self.$preview.find(FRAMES + ':not(.file-preview-success)');
-            $thumbs.remove();
+            var self = this, $p = self.$preview,
+                $thumbs = self.showUploadedThumbs ? $p.find(FRAMES + ':not(.file-preview-success)') : $p.find(FRAMES);
+            $thumbs.each(function() {
+                var $thumb = $(this), $cache = $p.find('#zoom-' + $thumb.attr('id')).closest('.kv-zoom-cache');
+                $thumb.remove();
+                $cache.remove();
+            });
             if (!self.$preview.find(FRAMES).length || !self.showPreview) {
             if (!self.$preview.find(FRAMES).length || !self.showPreview) {
                 self._resetUpload();
                 self._resetUpload();
             }
             }

File diff suppressed because it is too large
+ 0 - 0
js/fileinput.min.js


+ 47 - 10
sass/fileinput.scss

@@ -8,8 +8,6 @@
  * Licensed under the BSD 3-Clause
  * Licensed under the BSD 3-Clause
  * https://github.com/kartik-v/bootstrap-fileinput/blob/master/LICENSE.md
  * https://github.com/kartik-v/bootstrap-fileinput/blob/master/LICENSE.md
  */
  */
-$image-path: "'../img" !default;
-$preview-size: 160px !default;
 
 
 .file-loading {
 .file-loading {
   top: 0;
   top: 0;
@@ -19,7 +17,7 @@ $preview-size: 160px !default;
   font-size: 999px;
   font-size: 999px;
   text-align: right;
   text-align: right;
   color: #fff;
   color: #fff;
-  background: transparent url('#{$image-path}/loading.gif') top left no-repeat;
+  background: transparent url('../img/loading.gif') top left no-repeat;
   border: none;
   border: none;
 }
 }
 
 
@@ -31,7 +29,6 @@ $preview-size: 160px !default;
 .btn-file {
 .btn-file {
   position: relative;
   position: relative;
   overflow: hidden;
   overflow: hidden;
-
   input[type=file] {
   input[type=file] {
     position: absolute;
     position: absolute;
     top: 0;
     top: 0;
@@ -95,7 +92,7 @@ $preview-size: 160px !default;
   position: relative;
   position: relative;
   display: table;
   display: table;
   margin: 8px;
   margin: 8px;
-  height: $preview-size;
+  height: 160px;
   border: 1px solid #ddd;
   border: 1px solid #ddd;
   box-shadow: 1px 1px 5px 0 #a2958a;
   box-shadow: 1px 1px 5px 0 #a2958a;
   padding: 6px;
   padding: 6px;
@@ -109,6 +106,7 @@ $preview-size: 160px !default;
 
 
 .file-preview-image {
 .file-preview-image {
   vertical-align: middle;
   vertical-align: middle;
+  image-orientation: from-image;
 }
 }
 
 
 .file-preview-text {
 .file-preview-text {
@@ -154,6 +152,7 @@ $preview-size: 160px !default;
 }
 }
 
 
 /* noinspection CssOverwrittenProperties */
 /* noinspection CssOverwrittenProperties */
+
 .file-zoom-dialog .file-other-icon {
 .file-zoom-dialog .file-other-icon {
   font-size: 8em;
   font-size: 8em;
   font-size: 55vmin;
   font-size: 55vmin;
@@ -171,8 +170,21 @@ $preview-size: 160px !default;
   }
   }
 }
 }
 
 
+.file-caption-main {
+  width: 100%;
+}
+
+.file-input-ajax-new .no-browse .input-group-btn, .file-input-new .no-browse .input-group-btn {
+  display: none;
+}
+
+.file-input-ajax-new .no-browse .form-control, .file-input-new .no-browse .form-control {
+  border-top-right-radius: 4px;
+  border-bottom-right-radius: 4px;
+}
+
 .file-thumb-loading {
 .file-thumb-loading {
-  background: transparent url('#{$image-path}/loading.gif') no-repeat scroll center center content-box !important;
+  background: transparent url('../img/loading.gif') no-repeat scroll center center content-box !important;
 }
 }
 
 
 .file-actions {
 .file-actions {
@@ -199,7 +211,7 @@ $preview-size: 160px !default;
   white-space: nowrap;
   white-space: nowrap;
   overflow: hidden;
   overflow: hidden;
   text-overflow: ellipsis;
   text-overflow: ellipsis;
-  width: $preview-size;
+  width: 160px;
   text-align: center;
   text-align: center;
   padding-top: 4px;
   padding-top: 4px;
   font-size: 11px;
   font-size: 11px;
@@ -228,8 +240,27 @@ $preview-size: 160px !default;
 
 
 .file-drop-zone-title {
 .file-drop-zone-title {
   color: #aaa;
   color: #aaa;
-  font-size: 40px;
+  font-size: 1.6em;
   padding: 85px 10px;
   padding: 85px 10px;
+  cursor: default;
+}
+
+.file-preview .clickable, .clickable .file-drop-zone-title {
+  cursor: pointer;
+}
+
+.file-drop-zone {
+  &.clickable {
+    &:hover {
+      border: 2px dashed #999;
+    }
+    &:focus {
+      border: 2px solid #5acde2;
+    }
+  }
+  .file-preview-thumbnails {
+    cursor: default;
+  }
 }
 }
 
 
 .file-highlighted {
 .file-highlighted {
@@ -238,7 +269,7 @@ $preview-size: 160px !default;
 }
 }
 
 
 .file-uploading {
 .file-uploading {
-  background: url('#{$image-path}/loading-sm.gif') no-repeat center bottom 10px;
+  background: url('../img/loading-sm.gif') no-repeat center bottom 10px;
   opacity: 0.65;
   opacity: 0.65;
 }
 }
 
 
@@ -345,8 +376,14 @@ $preview-size: 160px !default;
   display: inline;
   display: inline;
   margin-right: 2px;
   margin-right: 2px;
   font-size: 16px;
   font-size: 16px;
+  opacity: 0.6;
+  cursor: not-allowed;
+}
+
+.file-sortable .file-drag-handle {
   cursor: move;
   cursor: move;
   cursor: -webkit-grabbing;
   cursor: -webkit-grabbing;
+  opacity: 1;
   &:hover {
   &:hover {
     opacity: 0.7;
     opacity: 0.7;
   }
   }
@@ -370,4 +407,4 @@ $preview-size: 160px !default;
 .btn-file ::-ms-browse {
 .btn-file ::-ms-browse {
   width: 100%;
   width: 100%;
   height: 100%;
   height: 100%;
-}
+}

Some files were not shown because too many files changed in this diff