bootsy 1.0.0 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Rakefile +4 -7
- data/app/assets/images/bootsy/ajax-loader.gif +0 -0
- data/app/assets/javascripts/bootsy.js +1 -0
- data/app/assets/javascripts/bootsy/bootstrap-wysihtml5.js +2 -2
- data/app/assets/javascripts/bootsy/bootstrap.file-input.js +122 -0
- data/app/assets/javascripts/bootsy/bootsy.js +55 -2
- data/app/assets/javascripts/bootsy/locales/bootstrap-wysihtml5.pt-BR.js +1 -1
- data/app/assets/stylesheets/bootsy/bootsy.css +41 -1
- data/app/views/bootsy/images/_index.html.erb +44 -38
- data/app/views/bootsy/images/_modal.html.erb +6 -5
- data/app/views/bootsy/images/_new.html.erb +6 -4
- data/app/views/bootsy/images/destroy.js.erb +1 -1
- data/config/locales/en.yml +7 -3
- data/lib/bootsy/version.rb +1 -1
- metadata +17 -15
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: d39459ba06843f6310669394df4e9e02390e83a3
         | 
| 4 | 
            +
              data.tar.gz: 7a3bf0f12f9d4c8b14a4ccc6c5cb035d51d309ff
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 2ad8bb69fa7cdb0c75624e220ee4b64ae4b343e6601f8bc290a3518e39f8d08cedddaaae3812559bfce82486cef7d2daf4717be64cbc5c7a3938bd265a5aad38
         | 
| 7 | 
            +
              data.tar.gz: 7624652a602ce80baf4a2b2d724c6fe54960d072386bcc7ff8ab3b97accdaecc8f0a9e7cf3e091925a495dd65f89c076ac5de99dba44a978c402299ec7ed6b96
         | 
    
        data/Rakefile
    CHANGED
    
    | @@ -28,14 +28,11 @@ require 'coveralls/rake/task' | |
| 28 28 |  | 
| 29 29 | 
             
            Coveralls::RakeTask.new
         | 
| 30 30 |  | 
| 31 | 
            -
            task default: [:spec | 
| 31 | 
            +
            task default: [:spec, :cucumber, 'coveralls:push']
         | 
| 32 32 |  | 
| 33 33 | 
             
            RSpec::Core::RakeTask.new(:spec)
         | 
| 34 34 |  | 
| 35 | 
            -
            Cucumber::Rake::Task.new | 
| 36 | 
            -
               | 
| 35 | 
            +
            Cucumber::Rake::Task.new do |t|
         | 
| 36 | 
            +
              # Uncomment this line when cucumber/multi_test work with minitest.
         | 
| 37 | 
            +
              # t.cucumber_opts = %w{--format pretty -s}
         | 
| 37 38 | 
             
            end
         | 
| 38 | 
            -
             | 
| 39 | 
            -
            Cucumber::Rake::Task.new(:wip) do |t|
         | 
| 40 | 
            -
              t.cucumber_opts = ["-t","@wip","features"]
         | 
| 41 | 
            -
            end
         | 
| Binary file | 
| @@ -34,8 +34,8 @@ | |
| 34 34 | 
             
                          "<div class='btn-group'>" +
         | 
| 35 35 | 
             
                            "<a class='btn" + size + "' data-wysihtml5-command='insertUnorderedList' title='" + locale.lists.unordered + "' tabindex='-1'><i class='icon-list'></i></a>" +
         | 
| 36 36 | 
             
                            "<a class='btn" + size + "' data-wysihtml5-command='insertOrderedList' title='" + locale.lists.ordered + "' tabindex='-1'><i class='icon-th-list'></i></a>" +
         | 
| 37 | 
            -
                            "<a class='btn" + size + "' data-wysihtml5-command='Outdent' title='" + locale.lists.outdent + "' tabindex='-1'><i class='icon-indent- | 
| 38 | 
            -
                            "<a class='btn" + size + "' data-wysihtml5-command='Indent' title='" + locale.lists.indent + "' tabindex='-1'><i class='icon-indent- | 
| 37 | 
            +
                            "<a class='btn" + size + "' data-wysihtml5-command='Outdent' title='" + locale.lists.outdent + "' tabindex='-1'><i class='icon-indent-left'></i></a>" +
         | 
| 38 | 
            +
                            "<a class='btn" + size + "' data-wysihtml5-command='Indent' title='" + locale.lists.indent + "' tabindex='-1'><i class='icon-indent-right'></i></a>" +
         | 
| 39 39 | 
             
                          "</div>" +
         | 
| 40 40 | 
             
                        "</li>";
         | 
| 41 41 | 
             
                    },
         | 
| @@ -0,0 +1,122 @@ | |
| 1 | 
            +
            /*
         | 
| 2 | 
            +
              Bootstrap - File Input
         | 
| 3 | 
            +
              ======================
         | 
| 4 | 
            +
             | 
| 5 | 
            +
              This is meant to convert all file input tags into a set of elements that displays consistently in all browsers.
         | 
| 6 | 
            +
             | 
| 7 | 
            +
              Converts all
         | 
| 8 | 
            +
              <input type="file">
         | 
| 9 | 
            +
              into Bootstrap buttons
         | 
| 10 | 
            +
              <a class="btn">Browse</a>
         | 
| 11 | 
            +
             | 
| 12 | 
            +
            */
         | 
| 13 | 
            +
            $(function() {
         | 
| 14 | 
            +
             | 
| 15 | 
            +
            $.fn.bootstrapFileInput = function() {
         | 
| 16 | 
            +
             | 
| 17 | 
            +
              this.each(function(i,elem){
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                var $elem = $(elem);
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                // Maybe some fields don't need to be standardized.
         | 
| 22 | 
            +
                if (typeof $elem.attr('data-bfi-disabled') != 'undefined') {
         | 
| 23 | 
            +
                  return;
         | 
| 24 | 
            +
                }
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                // Set the word to be displayed on the button
         | 
| 27 | 
            +
                var buttonWord = 'Browse';
         | 
| 28 | 
            +
             | 
| 29 | 
            +
                if (typeof $elem.attr('title') != 'undefined') {
         | 
| 30 | 
            +
                  buttonWord = $elem.attr('title');
         | 
| 31 | 
            +
                }
         | 
| 32 | 
            +
             | 
| 33 | 
            +
                // Start by getting the HTML of the input element.
         | 
| 34 | 
            +
                // Thanks for the tip http://stackoverflow.com/a/1299069
         | 
| 35 | 
            +
                var input = $('<div>').append( $elem.eq(0).clone() ).html();
         | 
| 36 | 
            +
                var className = '';
         | 
| 37 | 
            +
             | 
| 38 | 
            +
                if (!!$elem.attr('class')) {
         | 
| 39 | 
            +
                  className = ' ' + $elem.attr('class');
         | 
| 40 | 
            +
                }
         | 
| 41 | 
            +
             | 
| 42 | 
            +
                // Now we're going to replace that input field with a Bootstrap button.
         | 
| 43 | 
            +
                // The input will actually still be there, it will just be float above and transparent (done with the CSS).
         | 
| 44 | 
            +
                $elem.replaceWith('<a class="file-input-wrapper btn' + className + '">'+buttonWord+input+'</a>');
         | 
| 45 | 
            +
              })
         | 
| 46 | 
            +
             | 
| 47 | 
            +
              // After we have found all of the file inputs let's apply a listener for tracking the mouse movement.
         | 
| 48 | 
            +
              // This is important because the in order to give the illusion that this is a button in FF we actually need to move the button from the file input under the cursor. Ugh.
         | 
| 49 | 
            +
              .promise().done( function(){
         | 
| 50 | 
            +
             | 
| 51 | 
            +
                // As the cursor moves over our new Bootstrap button we need to adjust the position of the invisible file input Browse button to be under the cursor.
         | 
| 52 | 
            +
                // This gives us the pointer cursor that FF denies us
         | 
| 53 | 
            +
                $('.file-input-wrapper').mousemove(function(cursor) {
         | 
| 54 | 
            +
             | 
| 55 | 
            +
                  var input, wrapper,
         | 
| 56 | 
            +
                    wrapperX, wrapperY,
         | 
| 57 | 
            +
                    inputWidth, inputHeight,
         | 
| 58 | 
            +
                    cursorX, cursorY;
         | 
| 59 | 
            +
             | 
| 60 | 
            +
                  // This wrapper element (the button surround this file input)
         | 
| 61 | 
            +
                  wrapper = $(this);
         | 
| 62 | 
            +
                  // The invisible file input element
         | 
| 63 | 
            +
                  input = wrapper.find("input");
         | 
| 64 | 
            +
                  // The left-most position of the wrapper
         | 
| 65 | 
            +
                  wrapperX = wrapper.offset().left;
         | 
| 66 | 
            +
                  // The top-most position of the wrapper
         | 
| 67 | 
            +
                  wrapperY = wrapper.offset().top;
         | 
| 68 | 
            +
                  // The with of the browsers input field
         | 
| 69 | 
            +
                  inputWidth= input.width();
         | 
| 70 | 
            +
                  // The height of the browsers input field
         | 
| 71 | 
            +
                  inputHeight= input.height();
         | 
| 72 | 
            +
                  //The position of the cursor in the wrapper
         | 
| 73 | 
            +
                  cursorX = cursor.pageX;
         | 
| 74 | 
            +
                  cursorY = cursor.pageY;
         | 
| 75 | 
            +
             | 
| 76 | 
            +
                  //The positions we are to move the invisible file input
         | 
| 77 | 
            +
                  // The 20 at the end is an arbitrary number of pixels that we can shift the input such that cursor is not pointing at the end of the Browse button but somewhere nearer the middle
         | 
| 78 | 
            +
                  moveInputX = cursorX - wrapperX - inputWidth + 20;
         | 
| 79 | 
            +
                  // Slides the invisible input Browse button to be positioned middle under the cursor
         | 
| 80 | 
            +
                  moveInputY = cursorY- wrapperY - (inputHeight/2);
         | 
| 81 | 
            +
             | 
| 82 | 
            +
                  // Apply the positioning styles to actually move the invisible file input
         | 
| 83 | 
            +
                  input.css({
         | 
| 84 | 
            +
                    left:moveInputX,
         | 
| 85 | 
            +
                    top:moveInputY
         | 
| 86 | 
            +
                  });
         | 
| 87 | 
            +
                });
         | 
| 88 | 
            +
             | 
| 89 | 
            +
                $('.file-input-wrapper input[type=file]').change(function(){
         | 
| 90 | 
            +
             | 
| 91 | 
            +
                  var fileName;
         | 
| 92 | 
            +
                  fileName = $(this).val();
         | 
| 93 | 
            +
             | 
| 94 | 
            +
                  // Remove any previous file names
         | 
| 95 | 
            +
                  $(this).parent().next('.file-input-name').remove();
         | 
| 96 | 
            +
                  if (!!$(this).prop('files') && $(this).prop('files').length > 1) {
         | 
| 97 | 
            +
                    fileName = $(this)[0].files.length+' files';
         | 
| 98 | 
            +
                    //$(this).parent().after('<span class="file-input-name">'+$(this)[0].files.length+' files</span>');
         | 
| 99 | 
            +
                  }
         | 
| 100 | 
            +
                  else {
         | 
| 101 | 
            +
                    // var fakepath = 'C:\\fakepath\\';
         | 
| 102 | 
            +
                    // fileName = $(this).val().replace('C:\\fakepath\\','');
         | 
| 103 | 
            +
                    fileName = fileName.substring(fileName.lastIndexOf('\\')+1,fileName.length);
         | 
| 104 | 
            +
                  }
         | 
| 105 | 
            +
             | 
| 106 | 
            +
                  $(this).parent().after('<span class="file-input-name">'+fileName+'</span>');
         | 
| 107 | 
            +
                });
         | 
| 108 | 
            +
             | 
| 109 | 
            +
              });
         | 
| 110 | 
            +
             | 
| 111 | 
            +
            };
         | 
| 112 | 
            +
             | 
| 113 | 
            +
            // Add the styles before the first stylesheet
         | 
| 114 | 
            +
            // This ensures they can be easily overridden with developer styles
         | 
| 115 | 
            +
            var cssHtml = '<style>'+
         | 
| 116 | 
            +
              '.file-input-wrapper { overflow: hidden; position: relative; cursor: pointer; z-index: 1; }'+
         | 
| 117 | 
            +
              '.file-input-wrapper input[type=file], .file-input-wrapper input[type=file]:focus, .file-input-wrapper input[type=file]:hover { position: absolute; top: 0; left: 0; cursor: pointer; opacity: 0; filter: alpha(opacity=0); z-index: 99; outline: 0; }'+
         | 
| 118 | 
            +
              '.file-input-name { margin-left: 8px; }'+
         | 
| 119 | 
            +
              '</style>';
         | 
| 120 | 
            +
            $('link[rel=stylesheet]').eq(0).before(cssHtml);
         | 
| 121 | 
            +
             | 
| 122 | 
            +
            });
         | 
| @@ -2,9 +2,11 @@ window.Bootsy = window.Bootsy || {}; | |
| 2 2 |  | 
| 3 3 | 
             
            window.Bootsy.Area = function ($el) {
         | 
| 4 4 | 
             
              var self = this;
         | 
| 5 | 
            +
              self.bootsyUploadInit = false; // this flag tells the refreshGallery method whether there was a new upload or not
         | 
| 5 6 |  | 
| 6 7 | 
             
              this.progressBar = function () {
         | 
| 7 | 
            -
                 | 
| 8 | 
            +
                // Show loading spinner
         | 
| 9 | 
            +
                $('.bootsy-spinner img').fadeIn(200);
         | 
| 8 10 | 
             
              };
         | 
| 9 11 |  | 
| 10 12 | 
             
              this.setImageGalleryId = function (id) {
         | 
| @@ -12,6 +14,16 @@ window.Bootsy.Area = function ($el) { | |
| 12 14 | 
             
                $('input.bootsy_image_gallery_id').val(id);
         | 
| 13 15 | 
             
              };
         | 
| 14 16 |  | 
| 17 | 
            +
              this.deleteImage = function (id) {
         | 
| 18 | 
            +
                self.imageGalleryModal.find("ul.thumbnails").find("[data-id='" + id + "']").hide(200, function(){
         | 
| 19 | 
            +
                  $(this).remove();
         | 
| 20 | 
            +
                  // Put message back if 0 images
         | 
| 21 | 
            +
                  if ( self.imageGalleryModal.find('.thumbnails li').length == 0 ) {
         | 
| 22 | 
            +
                    self.imageGalleryModal.find('.alert').fadeIn(200);
         | 
| 23 | 
            +
                  }
         | 
| 24 | 
            +
                });
         | 
| 25 | 
            +
              };
         | 
| 26 | 
            +
             | 
| 15 27 | 
             
              this.refreshGallery = function () {
         | 
| 16 28 | 
             
                self.progressBar();
         | 
| 17 29 | 
             
                $.ajax({
         | 
| @@ -23,8 +35,48 @@ window.Bootsy.Area = function ($el) { | |
| 23 35 | 
             
                  },
         | 
| 24 36 | 
             
                  dataType: 'json',
         | 
| 25 37 | 
             
                  success: function (data) {
         | 
| 26 | 
            -
                     | 
| 38 | 
            +
                    // Hide loading spinner
         | 
| 39 | 
            +
                    $('.bootsy-spinner img').fadeOut(200);
         | 
| 40 | 
            +
                    
         | 
| 41 | 
            +
                    // Cache the returned data
         | 
| 42 | 
            +
                    var $data = $(data.partial);
         | 
| 43 | 
            +
             | 
| 44 | 
            +
                    // Retrieve the last added li from the cached data
         | 
| 45 | 
            +
                    img = $data.find('ul.thumbnails > li').last();
         | 
| 46 | 
            +
             | 
| 47 | 
            +
                    if ( img.length ) {
         | 
| 48 | 
            +
                      // Thumbnails currently exist in the retrieved data, so hide the message
         | 
| 49 | 
            +
                      $('.alert').hide();
         | 
| 50 | 
            +
                    } else {
         | 
| 51 | 
            +
                      // Thumbnails do not exist in the retrieved data, so show the message
         | 
| 52 | 
            +
                      $('.thumbnails li').hide();
         | 
| 53 | 
            +
                      $('.alert').fadeIn(100);
         | 
| 54 | 
            +
                    }
         | 
| 55 | 
            +
                    
         | 
| 56 | 
            +
                    if ( self.imageGalleryModal.find('.modal-body').children().length == 0 ) {
         | 
| 57 | 
            +
                      // Init the modal content (only loads first time)
         | 
| 58 | 
            +
                      self.imageGalleryModal.find('.modal-content').html($data).hide().fadeIn(200);
         | 
| 59 | 
            +
                      // Nicer file input
         | 
| 60 | 
            +
                      $('.modal-footer #image_image_file').bootstrapFileInput();
         | 
| 61 | 
            +
                    } else if ( self.bootsyUploadInit == true ) {
         | 
| 62 | 
            +
                      self.bootsyUploadInit = false;
         | 
| 63 | 
            +
                      $(img).hide().appendTo(self.imageGalleryModal.find('.modal-body .thumbnails')).fadeIn(200);
         | 
| 64 | 
            +
                    } else {
         | 
| 65 | 
            +
                      // do nothing
         | 
| 66 | 
            +
                    }
         | 
| 67 | 
            +
             | 
| 27 68 | 
             
                    self.imageGalleryModal.find('a.refresh-btn').hide();
         | 
| 69 | 
            +
                    self.imageGalleryModal.find('#refresh-gallery').hide();
         | 
| 70 | 
            +
                    self.imageGalleryModal.find('input#upload_submit').hide();
         | 
| 71 | 
            +
             | 
| 72 | 
            +
             | 
| 73 | 
            +
                    // Autosubmit on image selection
         | 
| 74 | 
            +
                    $('.modal-footer #image_image_file').on('change', function(){
         | 
| 75 | 
            +
                      self.progressBar();
         | 
| 76 | 
            +
                      self.bootsyUploadInit = true;
         | 
| 77 | 
            +
                      $(this).closest('form').submit();
         | 
| 78 | 
            +
                    });
         | 
| 79 | 
            +
             | 
| 28 80 | 
             
                  },
         | 
| 29 81 | 
             
                  error: function (e) {
         | 
| 30 82 | 
             
                    alert(Bootsy.translations[self.locale].error);
         | 
| @@ -119,6 +171,7 @@ window.Bootsy.Area = function ($el) { | |
| 119 171 | 
             
                  };
         | 
| 120 172 |  | 
| 121 173 | 
             
                  this.imageGalleryModal = $('#bootsy_image_gallery');
         | 
| 174 | 
            +
                  this.imageGalleryModal.find('a.refresh-btn').hide();
         | 
| 122 175 |  | 
| 123 176 | 
             
                  this.imageGalleryModal.parents('form').after(this.imageGalleryModal);
         | 
| 124 177 |  | 
| @@ -129,4 +129,44 @@ blockquote:after { | |
| 129 129 |  | 
| 130 130 | 
             
            textarea.bootsy:required:invalid {
         | 
| 131 131 | 
             
              color: inherit;
         | 
| 132 | 
            -
            }
         | 
| 132 | 
            +
            }
         | 
| 133 | 
            +
             | 
| 134 | 
            +
            /*Allow dropdown menus to show be displayed if they overflow the footer or modal*/
         | 
| 135 | 
            +
            #bootsy_image_gallery .modal { overflow: visible; }
         | 
| 136 | 
            +
            #bootsy_image_gallery .modal-body { overflow-y: visible; }
         | 
| 137 | 
            +
             | 
| 138 | 
            +
            /*Modal Design Styles*/
         | 
| 139 | 
            +
            #bootsy_image_gallery form { margin-bottom: 0px; } /*remove default bottom margin*/
         | 
| 140 | 
            +
            #bootsy_image_gallery .file-input-name {display: none;}  /*Hide the input file name from showing as it's not needed and ruins design*/
         | 
| 141 | 
            +
            /*Set a min-height on the modal body to prevent jumping up and down of modal when adding content*/
         | 
| 142 | 
            +
            #bootsy_image_gallery .modal-body {
         | 
| 143 | 
            +
              min-height: 78px;
         | 
| 144 | 
            +
              margin-bottom: 0;
         | 
| 145 | 
            +
              padding-bottom: 7px;
         | 
| 146 | 
            +
            }
         | 
| 147 | 
            +
            #bootsy_image_gallery .modal-body .thumbnails {
         | 
| 148 | 
            +
              margin-left: -10px;
         | 
| 149 | 
            +
              margin-bottom: 0;
         | 
| 150 | 
            +
            }
         | 
| 151 | 
            +
            #bootsy_image_gallery .modal-body .thumbnails > li {
         | 
| 152 | 
            +
              margin-left: 7px;
         | 
| 153 | 
            +
              margin-bottom: 8px;
         | 
| 154 | 
            +
            }
         | 
| 155 | 
            +
             | 
| 156 | 
            +
            #bootsy_image_gallery .modal-body .thumbnails > li.alert {
         | 
| 157 | 
            +
              width: 100%;
         | 
| 158 | 
            +
              margin-right: 8px;
         | 
| 159 | 
            +
            }
         | 
| 160 | 
            +
            .bootsy-spinner {
         | 
| 161 | 
            +
              display: inline-block;
         | 
| 162 | 
            +
              padding-right: 5px;
         | 
| 163 | 
            +
            }
         | 
| 164 | 
            +
            .bootsy-spinner img {
         | 
| 165 | 
            +
              display: none;
         | 
| 166 | 
            +
            }
         | 
| 167 | 
            +
             | 
| 168 | 
            +
            /*The below code is needed for capybara to be able to find the input, as it*/
         | 
| 169 | 
            +
            /*does not work*/
         | 
| 170 | 
            +
            .file-input-wrapper input[type=file], .file-input-wrapper input[type=file]:focus, .file-input-wrapper input[type=file]:hover {
         | 
| 171 | 
            +
              opacity: .01;
         | 
| 172 | 
            +
            }
         | 
| @@ -1,42 +1,48 @@ | |
| 1 | 
            -
            < | 
| 2 | 
            -
              <% gallery.images. | 
| 3 | 
            -
                < | 
| 4 | 
            -
                  <%= link_to image_tag(image.image_file.thumb.url), '#', :class => 'thumbnail', data: { toggle: 'dropdown'} %>
         | 
| 5 | 
            -
                  <ul class="dropdown-menu" role="menu">
         | 
| 6 | 
            -
                    <li class="nav-header"><%= t 'bootsy.image.size' %></li>
         | 
| 7 | 
            -
                    <% Bootsy.image_versions_available.each do |size| %>
         | 
| 8 | 
            -
                      <li class="dropdown-submenu">
         | 
| 9 | 
            -
                        <%= link_to '#' do %>
         | 
| 10 | 
            -
                          <i class="icon-picture"></i>
         | 
| 11 | 
            -
                          <%= t "bootsy.image.#{size}" %>
         | 
| 12 | 
            -
                        <% end %>
         | 
| 13 | 
            -
                        <ul class="dropdown-menu">
         | 
| 14 | 
            -
                          <% [:left, :right, :inline].each do |position| %>
         | 
| 15 | 
            -
                            <li>
         | 
| 16 | 
            -
                              <%= link_to '#', :class => 'insert', tabindex: '-1', data: { :'image-size' => size.to_s, position: position.to_s} do %>
         | 
| 17 | 
            -
                                <%= t "bootsy.image.position.#{position}" %>
         | 
| 18 | 
            -
                              <% end %>
         | 
| 19 | 
            -
                            </li>
         | 
| 20 | 
            -
                          <% end %>
         | 
| 21 | 
            -
                        </ul>
         | 
| 22 | 
            -
                      </li>
         | 
| 23 | 
            -
                    <% end %>
         | 
| 24 | 
            -
                    <% if Bootsy.allow_destroy %>
         | 
| 25 | 
            -
                      <li class="divider"></li>
         | 
| 26 | 
            -
                      <li>
         | 
| 27 | 
            -
                        <%= link_to image, method: :delete, remote: true, data: { confirm: t('bootsy.image.confirm.destroy')}, tabindex: '-1', :class => 'destroy_btn' do %>
         | 
| 28 | 
            -
                          <i class="icon-trash"></i>
         | 
| 29 | 
            -
                          <%= t 'bootsy.action.destroy' %>
         | 
| 30 | 
            -
                        <% end %>
         | 
| 31 | 
            -
                      </li>
         | 
| 32 | 
            -
                    <% end %>
         | 
| 33 | 
            -
                  </ul>
         | 
| 34 | 
            -
                </li>
         | 
| 1 | 
            +
            <div class="modal-body">
         | 
| 2 | 
            +
              <% if gallery.images.count == 0 %>
         | 
| 3 | 
            +
                <p class='alert'><%= t 'bootsy.no_images_uploaded' %></p>
         | 
| 35 4 | 
             
              <% end %>
         | 
| 36 | 
            -
            </ul>
         | 
| 37 5 |  | 
| 38 | 
            -
             | 
| 6 | 
            +
              <ul class="thumbnails">
         | 
| 7 | 
            +
                <% gallery.images.each do |image| %>
         | 
| 8 | 
            +
                  <li class="dropdown" data-id="<%= image.id %>">
         | 
| 9 | 
            +
                    <%= link_to image_tag(image.image_file.thumb.url), '#', :class => 'thumbnail', data: { toggle: 'dropdown'} %>
         | 
| 10 | 
            +
                    <ul class="dropdown-menu" role="menu">
         | 
| 11 | 
            +
                      <li class="nav-header"><%= t 'bootsy.image.size' %></li>
         | 
| 12 | 
            +
                      <% Bootsy.image_versions_available.each do |size| %>
         | 
| 13 | 
            +
                        <li class="dropdown-submenu">
         | 
| 14 | 
            +
                          <%= link_to '#' do %>
         | 
| 15 | 
            +
                            <i class="icon-picture"></i>
         | 
| 16 | 
            +
                            <%= t "bootsy.image.#{size}" %>
         | 
| 17 | 
            +
                          <% end %>
         | 
| 18 | 
            +
                          <ul class="dropdown-menu">
         | 
| 19 | 
            +
                            <% [:left, :right, :inline].each do |position| %>
         | 
| 20 | 
            +
                              <li>
         | 
| 21 | 
            +
                                <%= link_to '#', :class => 'insert', tabindex: '-1', data: { :'image-size' => size.to_s, position: position.to_s} do %>
         | 
| 22 | 
            +
                                  <%= t "bootsy.image.position.#{position}" %>
         | 
| 23 | 
            +
                                <% end %>
         | 
| 24 | 
            +
                              </li>
         | 
| 25 | 
            +
                            <% end %>
         | 
| 26 | 
            +
                          </ul>
         | 
| 27 | 
            +
                        </li>
         | 
| 28 | 
            +
                      <% end %>
         | 
| 29 | 
            +
                      <% if Bootsy.allow_destroy %>
         | 
| 30 | 
            +
                        <li class="divider"></li>
         | 
| 31 | 
            +
                        <li>
         | 
| 32 | 
            +
                          <%= link_to image, method: :delete, remote: true, data: { confirm: t('bootsy.image.confirm.destroy')}, tabindex: '-1', :class => 'destroy_btn' do %>
         | 
| 33 | 
            +
                            <i class="icon-trash"></i>
         | 
| 34 | 
            +
                            <%= t('bootsy.action.destroy') %>
         | 
| 35 | 
            +
                          <% end %>
         | 
| 36 | 
            +
                        </li>
         | 
| 37 | 
            +
                      <% end %>
         | 
| 38 | 
            +
                    </ul>
         | 
| 39 | 
            +
                  </li>
         | 
| 40 | 
            +
                <% end %>
         | 
| 41 | 
            +
              </ul>
         | 
| 39 42 |  | 
| 40 | 
            -
             | 
| 43 | 
            +
              <%= refresh_btn %>
         | 
| 41 44 |  | 
| 42 | 
            -
             | 
| 45 | 
            +
            </div>
         | 
| 46 | 
            +
            <div class="modal-footer">
         | 
| 47 | 
            +
              <%= render 'bootsy/images/new', {image: (defined?(image) && image.errors.any?) ? image : gallery.images.new } %>
         | 
| 48 | 
            +
            </div>
         | 
| @@ -1,12 +1,13 @@ | |
| 1 1 | 
             
            <div class="modal hide fade" id="bootsy_image_gallery" data-no-turbolink data-bootsy-gallery-id="<%= container.bootsy_image_gallery_id %>">
         | 
| 2 2 | 
             
              <div class="modal-header">
         | 
| 3 3 | 
             
                <button type="button" class="close" data-dismiss="modal">×</button>
         | 
| 4 | 
            -
                < | 
| 5 | 
            -
              </div>
         | 
| 6 | 
            -
              <div class="modal-body">
         | 
| 4 | 
            +
                <h3><%= t 'bootsy.image.p' %></h3>
         | 
| 7 5 | 
             
                <%= refresh_btn %>
         | 
| 8 6 | 
             
              </div>
         | 
| 9 | 
            -
              <div class="modal- | 
| 10 | 
            -
                < | 
| 7 | 
            +
              <div class="modal-content">
         | 
| 8 | 
            +
                <div class="modal-body">
         | 
| 9 | 
            +
                </div>
         | 
| 10 | 
            +
                <div class="modal-footer">
         | 
| 11 | 
            +
                </div>
         | 
| 11 12 | 
             
              </div>
         | 
| 12 13 | 
             
            </div>
         | 
| @@ -1,5 +1,3 @@ | |
| 1 | 
            -
            <h3><%= t 'bootsy.image.new' %></h3>
         | 
| 2 | 
            -
             | 
| 3 1 | 
             
            <%= form_for [bootsy, resource_or_nil(image.image_gallery), image], remote: true, html: {:class => 'bootsy form-inline'} do |f| %>
         | 
| 4 2 | 
             
              <%= hidden_field_tag :authenticity_token, form_authenticity_token %>
         | 
| 5 3 | 
             
              <% if image.errors.any? %>
         | 
| @@ -8,7 +6,11 @@ | |
| 8 6 | 
             
                <% end %>
         | 
| 9 7 | 
             
              <% end %>
         | 
| 10 8 |  | 
| 11 | 
            -
               | 
| 9 | 
            +
              <div class="bootsy-spinner">
         | 
| 10 | 
            +
                <%= image_tag "bootsy/ajax-loader.gif" %>
         | 
| 11 | 
            +
              </div>
         | 
| 12 | 
            +
              
         | 
| 13 | 
            +
              <%= f.file_field :image_file, title: t('bootsy.action.upload') %>
         | 
| 12 14 |  | 
| 13 | 
            -
              <%= f.submit t('bootsy.action.load'), :class => 'btn btn-primary' %>
         | 
| 15 | 
            +
              <%= f.submit t('bootsy.action.load'), id: 'upload_submit', :class => 'btn btn-primary' %>
         | 
| 14 16 | 
             
            <% end %>
         | 
| @@ -1 +1 @@ | |
| 1 | 
            -
            Bootsy.areas[0]. | 
| 1 | 
            +
            Bootsy.areas[0].deleteImage(<%= @image.id %>);
         | 
    
        data/config/locales/en.yml
    CHANGED
    
    | @@ -2,9 +2,10 @@ en: | |
| 2 2 | 
             
              bootsy:
         | 
| 3 3 | 
             
                action:
         | 
| 4 4 | 
             
                  refresh: Refresh
         | 
| 5 | 
            -
                  destroy:  | 
| 5 | 
            +
                  destroy: Delete
         | 
| 6 6 | 
             
                  close: Close
         | 
| 7 7 | 
             
                  load: Load
         | 
| 8 | 
            +
                  upload: Upload New Image
         | 
| 8 9 | 
             
                image_gallery: Image Gallery
         | 
| 9 10 | 
             
                image:
         | 
| 10 11 | 
             
                  s: Image
         | 
| @@ -16,8 +17,11 @@ en: | |
| 16 17 | 
             
                  original: Original
         | 
| 17 18 | 
             
                  new: New image
         | 
| 18 19 | 
             
                  confirm:
         | 
| 19 | 
            -
                    destroy: Are you sure you want  | 
| 20 | 
            +
                    destroy: Are you sure you want to delete this image?
         | 
| 20 21 | 
             
                  position:
         | 
| 21 22 | 
             
                    left: Left
         | 
| 22 23 | 
             
                    right: Right
         | 
| 23 | 
            -
                    inline: Inline
         | 
| 24 | 
            +
                    inline: Inline
         | 
| 25 | 
            +
                no_images_uploaded: There are currently no uploaded images.
         | 
| 26 | 
            +
                js:
         | 
| 27 | 
            +
                  alert_unsaved: You have unsaved changes.
         | 
    
        data/lib/bootsy/version.rb
    CHANGED
    
    
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: bootsy
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 1. | 
| 4 | 
            +
              version: 1.1.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Volmer Soares
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2013- | 
| 11 | 
            +
            date: 2013-08-14 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: mini_magick
         | 
| @@ -30,42 +30,42 @@ dependencies: | |
| 30 30 | 
             
                requirements:
         | 
| 31 31 | 
             
                - - ~>
         | 
| 32 32 | 
             
                  - !ruby/object:Gem::Version
         | 
| 33 | 
            -
                    version: 0. | 
| 33 | 
            +
                    version: 0.9.0
         | 
| 34 34 | 
             
              type: :runtime
         | 
| 35 35 | 
             
              prerelease: false
         | 
| 36 36 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 37 37 | 
             
                requirements:
         | 
| 38 38 | 
             
                - - ~>
         | 
| 39 39 | 
             
                  - !ruby/object:Gem::Version
         | 
| 40 | 
            -
                    version: 0. | 
| 40 | 
            +
                    version: 0.9.0
         | 
| 41 41 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 42 42 | 
             
              name: remotipart
         | 
| 43 43 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 44 44 | 
             
                requirements:
         | 
| 45 45 | 
             
                - - ~>
         | 
| 46 46 | 
             
                  - !ruby/object:Gem::Version
         | 
| 47 | 
            -
                    version: 1.1 | 
| 47 | 
            +
                    version: 1.2.1
         | 
| 48 48 | 
             
              type: :runtime
         | 
| 49 49 | 
             
              prerelease: false
         | 
| 50 50 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 51 51 | 
             
                requirements:
         | 
| 52 52 | 
             
                - - ~>
         | 
| 53 53 | 
             
                  - !ruby/object:Gem::Version
         | 
| 54 | 
            -
                    version: 1.1 | 
| 54 | 
            +
                    version: 1.2.1
         | 
| 55 55 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 56 56 | 
             
              name: rspec-rails
         | 
| 57 57 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 58 58 | 
             
                requirements:
         | 
| 59 59 | 
             
                - - ~>
         | 
| 60 60 | 
             
                  - !ruby/object:Gem::Version
         | 
| 61 | 
            -
                    version: '2. | 
| 61 | 
            +
                    version: '2.14'
         | 
| 62 62 | 
             
              type: :development
         | 
| 63 63 | 
             
              prerelease: false
         | 
| 64 64 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 65 65 | 
             
                requirements:
         | 
| 66 66 | 
             
                - - ~>
         | 
| 67 67 | 
             
                  - !ruby/object:Gem::Version
         | 
| 68 | 
            -
                    version: '2. | 
| 68 | 
            +
                    version: '2.14'
         | 
| 69 69 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 70 70 | 
             
              name: factory_girl_rails
         | 
| 71 71 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| @@ -86,14 +86,14 @@ dependencies: | |
| 86 86 | 
             
                requirements:
         | 
| 87 87 | 
             
                - - ~>
         | 
| 88 88 | 
             
                  - !ruby/object:Gem::Version
         | 
| 89 | 
            -
                    version:  | 
| 89 | 
            +
                    version: 1.0.1
         | 
| 90 90 | 
             
              type: :development
         | 
| 91 91 | 
             
              prerelease: false
         | 
| 92 92 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 93 93 | 
             
                requirements:
         | 
| 94 94 | 
             
                - - ~>
         | 
| 95 95 | 
             
                  - !ruby/object:Gem::Version
         | 
| 96 | 
            -
                    version:  | 
| 96 | 
            +
                    version: 1.0.1
         | 
| 97 97 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 98 98 | 
             
              name: cucumber-rails
         | 
| 99 99 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| @@ -114,28 +114,28 @@ dependencies: | |
| 114 114 | 
             
                requirements:
         | 
| 115 115 | 
             
                - - ~>
         | 
| 116 116 | 
             
                  - !ruby/object:Gem::Version
         | 
| 117 | 
            -
                    version: '2. | 
| 117 | 
            +
                    version: '2.2'
         | 
| 118 118 | 
             
              type: :development
         | 
| 119 119 | 
             
              prerelease: false
         | 
| 120 120 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 121 121 | 
             
                requirements:
         | 
| 122 122 | 
             
                - - ~>
         | 
| 123 123 | 
             
                  - !ruby/object:Gem::Version
         | 
| 124 | 
            -
                    version: '2. | 
| 124 | 
            +
                    version: '2.2'
         | 
| 125 125 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 126 126 | 
             
              name: selenium-webdriver
         | 
| 127 127 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 128 128 | 
             
                requirements:
         | 
| 129 129 | 
             
                - - ~>
         | 
| 130 130 | 
             
                  - !ruby/object:Gem::Version
         | 
| 131 | 
            -
                    version: '2. | 
| 131 | 
            +
                    version: '2.35'
         | 
| 132 132 | 
             
              type: :development
         | 
| 133 133 | 
             
              prerelease: false
         | 
| 134 134 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 135 135 | 
             
                requirements:
         | 
| 136 136 | 
             
                - - ~>
         | 
| 137 137 | 
             
                  - !ruby/object:Gem::Version
         | 
| 138 | 
            -
                    version: '2. | 
| 138 | 
            +
                    version: '2.35'
         | 
| 139 139 | 
             
            description: A beautiful WYSIWYG editor with image uploads for Rails.
         | 
| 140 140 | 
             
            email:
         | 
| 141 141 | 
             
            - volmerius@gmail.com
         | 
| @@ -143,7 +143,9 @@ executables: [] | |
| 143 143 | 
             
            extensions: []
         | 
| 144 144 | 
             
            extra_rdoc_files: []
         | 
| 145 145 | 
             
            files:
         | 
| 146 | 
            +
            - app/assets/images/bootsy/ajax-loader.gif
         | 
| 146 147 | 
             
            - app/assets/javascripts/bootsy/bootstrap-wysihtml5.js
         | 
| 148 | 
            +
            - app/assets/javascripts/bootsy/bootstrap.file-input.js
         | 
| 147 149 | 
             
            - app/assets/javascripts/bootsy/bootsy.js
         | 
| 148 150 | 
             
            - app/assets/javascripts/bootsy/editor_options.js
         | 
| 149 151 | 
             
            - app/assets/javascripts/bootsy/init.js
         | 
| @@ -207,7 +209,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement | |
| 207 209 | 
             
                  version: '0'
         | 
| 208 210 | 
             
            requirements: []
         | 
| 209 211 | 
             
            rubyforge_project: 
         | 
| 210 | 
            -
            rubygems_version: 2.0. | 
| 212 | 
            +
            rubygems_version: 2.0.5
         | 
| 211 213 | 
             
            signing_key: 
         | 
| 212 214 | 
             
            specification_version: 4
         | 
| 213 215 | 
             
            summary: A beautiful WYSIWYG editor with image uploads for Rails.
         |