5

I have created Demo by using packery and draggabilly where I have five grids.I can sort them using the draggable.After I make my sort.I need to save the sorted grid.Here the grids are not moving when I inspect in dev only the position is changing not the grid exactly.

As I've passed ids,but of no use.Due to the issue mentioned above.

Is there any way of saving the sort order ? I don't want to use localStorage

My code follows

HTML

<h1>Image sort</h1>
<div class="packery">
  <div class="item w2 h2 i1" tabindex="0">A</div>
  <div class="item w2 h2 i2" tabindex="1">B</div>
  <div class="item w2 h2 i3" tabindex="2">C</div>
  <div class="item w2 h2 i4" tabindex="3">D</div>
  <div class="item w2 h2 i5" tabindex="4">E</div>
</div>

JS

// http://packery.metafizzy.co/packery.pkgd.js and 
// http://draggabilly.desandro.com/draggabilly.pkgd.js added as external resource

// ----- text helper ----- //

$(function() {

  var $container = $('.packery').packery({
    columnWidth: 100,
    rowHeight: 180,
    // disable initial layout
    isInitLayout: false
  });

  var pckry = $container.data('packery');


  // ----- packery setup ----- //

  // trigger initial layout
  $container.packery();

  var itemElems = $container.packery('getItemElements');
  // for each item element
  $( itemElems ).each( function( i, itemElem ) {
    // make element draggable with Draggabilly
    var draggie = new Draggabilly( itemElem );
    // bind Draggabilly events to Packery
    $container.packery( 'bindDraggabillyEvents', draggie );
  });   

CSS

* {
  -webkit-box-sizing: border-box;
     -moz-box-sizing: border-box;
          box-sizing: border-box;
}

body { font-family: sans-serif; }

.packery {
  background: #FDD;
  background: hsla(45, 100%, 40%, 0.2);
  max-width: 460px;
}

/* clearfix */
.packery:after {
  content: ' ';
  display: block;
  clear: both;
}

.item {
  width: 240px;
  height: 140px;
  float: left;
  background: #C09;
  border: 4px solid #333;
  border-color: hsla(0, 0%, 0%, 0.3);
  font-size: 20px;
  color: white;
  padding: 10px;
}

.item:hover {
  border-color: white;
  cursor: move;
}


.item.w2 { width:   400px;  }
.item.h2 { height:  140px;  }

.item.w2.i1 { background: #ffff00; }
.item.w2.i2 { background: #ff6633; }
.item.w2.i3 { background: #00c6d7; }
.item.w2.i4 { background: #990099; }
.item.w2.i5 { background: #EEEEEE; }

.item.is-dragging,
.item.is-positioning-post-drag {
  border-color: white;
  background: #09F;
  z-index: 2;
}
Raviteja
  • 3,399
  • 23
  • 42
  • 69
  • You can save the sort order either on the client side (using localStorage for example) or on the server side. Note that the new HTML (according to the new sort order) will have to be produced on the server side or on the client side (via creating the HTML dynamically) – Amnon Feb 04 '16 at 07:16
  • Packery is giving you back the list of elements in correct sorted order. So, your sortedOrder array has tabIndexes in correct order. What exactly is going wrong? – Prashant Feb 07 '16 at 07:13
  • I want to save the order as the User chooses to. – Raviteja Feb 08 '16 at 04:00
  • So you want to save the previous order of the grid before the drag events?? – dvenkatsagar Feb 09 '16 at 04:30
  • Once the user makes his sort.The latest order I need to save.For eg: If it has order A,B,C,D,E.Then he changes to B,C,D,E,A.I need save the latest order. – Raviteja Feb 09 '16 at 04:32
  • Save in the sense....?? For me your code works fine and the sortOrder is changing each time the user drags, if you want a copy of the new order you can use `sortOrder.slice(0)` and save it to another variable..... if that is what you are asking.... ? – dvenkatsagar Feb 09 '16 at 04:35
  • In my demo I am using `localStorage`.I don't need that.Is there any other approach to save the order ? – Raviteja Feb 09 '16 at 04:38
  • Can you give clear justification what do you mean by 'save' like you want to save the values to a DB to use it later or copy the value to another variable(if you refresh the page, it will reset) ..... ?? – dvenkatsagar Feb 09 '16 at 04:42
  • I wan't save the values to db.When the user revisits.He should see the last saved order. – Raviteja Feb 09 '16 at 04:43
  • Let us [continue this discussion in chat](http://chat.stackoverflow.com/rooms/102950/discussion-between-dvenkatsagar-and-raviteja). – dvenkatsagar Feb 09 '16 at 04:45

3 Answers3

3

Well 'save' can mean two things.

  • Saving the values temporarily like localStorage/Cookies as you mentioned in the question. The thing is that, it will solve your problem of saving the order in the client, even if the user refreshes the page and comes back, he/she can check these values and reorder them accordingly. Disadvantage is that, if the user deletes his/her cache and history, the data might not be there when he/she revisits the page.
  • And the other alternative would be to use traditional approach, that is, to use a Ajax call and send data to a back-end script(PHP or Nodejs) that will save the values to a DB. This way, if there exists a login system of sorts, you can just post the values to a database and proceed in that manner.

Here is a simple code to give you an idea (using PHP):

JS

$.ajax({
    url: 'test.php',
    type: 'POST',
    data: {order : sortOrder},
    success: function(result){
          // do something
       }
 });

test.php

$order = $_REQUEST['order'];
echo $order;
// Do something here that will store the values to the database

For Nodejs, you can do something similar to this: How to send array of ids correctly in express

Hope it helps...

Community
  • 1
  • 1
dvenkatsagar
  • 936
  • 7
  • 22
2

Found this codepen which seems very similar to your example.

Packery.prototype.sortItems = function( keys, getSortKey ) {
  // copy items
  //var _items = this.items.slice(0);
  var itemsBySortKey = {};
  var key, item;
  for ( var i=0, len = this.items.length; i < len; i++ ) {
    item = this.items[i];
    key = getSortKey( item );
    itemsBySortKey[ key ] = item;
  }

  i=0;
  len = keys.length;
  var sortedItems = [];
  for ( ; i < len; i++ ) {
    key = keys[i];
    item = itemsBySortKey[ key ];
    this.items[i] = item;
  }  
};

var storedSortOrder = localStorage.getItem('sortOrder')
if ( storedSortOrder ) {
  storedSortOrder = JSON.parse( storedSortOrder );
  pckry.sortItems( storedSortOrder, function( item ) {
    return item.element.getAttribute('tabindex');
  });
}
Jaydo
  • 1,830
  • 2
  • 16
  • 21
  • In fact I extracted my question using that.But that is sorted out using local storage.I don't need that. – Raviteja Feb 09 '16 at 04:23
  • You said you wanted to save it but what do you actually want to do? – Jaydo Feb 09 '16 at 04:26
  • I will change the postion of grids.I need to save that order. – Raviteja Feb 09 '16 at 04:28
  • The codepen I linked saves the order to localStorage. If you try changing the order and then refreshing the page you'll see the order that was saved to localStorage has been loaded. – Jaydo Feb 09 '16 at 04:32
  • I don't want to store that order in the local storage. – Raviteja Feb 09 '16 at 04:33
  • 3
    Then what do you want? Do you want to use cookies? Post it to a server? You need to be more specific. – Jaydo Feb 09 '16 at 04:34
1

It might not be a full answer, but might be helpful, you could create a function from it

    var saved_order = {};

    Object.keys(object_to_sort)
        .sort()
        .forEach(function(key, i) {
            console.log('new order: ' + key, ':', object_to_sort[key]);
            saved_order[key] = object_to_sort[key];
        });
Magor Menessy
  • 381
  • 4
  • 13