Gridstack: перетаскивание виджета из одной сетки в другую, вложенную - PullRequest
6 голосов
/ 23 апреля 2019

Я пытаюсь создать это поведение и не уверен, поддерживает ли это Gridstack или нет. У меня есть 3 сетки Gridstack: Grid1 , Grid2 и Grid3 . Сетка1 является автономной сеткой, а Сетка3 вложена в Сетка2 . Мне нужно иметь возможность перетаскивать виджеты из Grid1 как в Grid2 (внешняя сетка), так и в Grid3 (вложенная сетка). Следуя примерам, я смог перетащить виджеты между 2 сетками верхнего уровня и создать вложенную сетку, но не комбинируя эти 2 вместе. Если это поддерживается - любые указатели приветствуются.

Примечание: развернуть фрагмент до полного экрана

$(document).ready(function() {
  $('.grid-stack').gridstack();
});
.grid-stack {
  background: lightgoldenrodyellow;
}

.grid-stack-item-content {
  color: #2c3e50;
  text-align: center;
  background-color: #18bc9c;
}

.grid-stack .grid-stack {
  /*margin: 0 -10px;*/
  background: rgba(255, 255, 255, 0.3);
}

.grid-stack .grid-stack .grid-stack-item-content {
  background: lightpink;
}
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css">
<link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/gridstack.js/0.4.0/gridstack.min.css" />


<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.11.0/jquery-ui.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/3.5.0/lodash.min.js"></script>
<script type="text/javascript" src='//cdnjs.cloudflare.com/ajax/libs/gridstack.js/0.4.0/gridstack.min.js'></script>
<script type="text/javascript" src='//cdnjs.cloudflare.com/ajax/libs/gridstack.js/0.4.0/gridstack.jQueryUI.min.js'></script>


<div class="container-fluid">
  <h1> Multilevel Nested grids demo</h1>
  <div class="grid-stack" id="container-stack">
    <div class="grid-stack-item" data-gs-x="0" data-gs-y="0" data-gs-width="4" data-gs-height="4">
      <div class="grid-stack-item-content">
        <span>Grid One</span>
        <div class="grid-stack" id="grid-one">
          <div class="grid-stack-item widget" data-gs-x="0" data-gs-y="0" data-gs-width="3" data-gs-height="1">
            <div class="grid-stack-item-content">1</div>
          </div>
          <div class="grid-stack-item widget" data-gs-x="3" data-gs-y="0" data-gs-width="3" data-gs-height="1">
            <div class="grid-stack-item-content">2</div>
          </div>
        </div>
      </div>
    </div>
    <div class="grid-stack-item" data-gs-x="4" data-gs-y="0" data-gs-width="8" data-gs-height="4">
      <div class="grid-stack-item-content">
        <span>Grid Two</span>
        <div class="grid-stack" id="grid-two">
          <div class="grid-stack-item widget" data-gs-x="0" data-gs-y="0" data-gs-width="3" data-gs-height="1">
            <div class="grid-stack-item-content">3</div>
          </div>
          <div class="grid-stack-item widget" data-gs-x="3" data-gs-y="0" data-gs-width="3" data-gs-height="1">
            <div class="grid-stack-item-content">4</div>
          </div>
          <div class="grid-stack-item" data-gs-x="6" data-gs-y="0" data-gs-width="6" data-gs-height="3">
            <div class="grid-stack-item-content">
              <span>Grid Three</span>
              <div class="grid-stack" id="grid-three">
                <div class="grid-stack-item widget" data-gs-x="0" data-gs-y="0" data-gs-width="6" data-gs-height="1">
                  <div class="grid-stack-item-content">5</div>
                </div>
                <div class="grid-stack-item widget" data-gs-x="6" data-gs-y="0" data-gs-width="6" data-gs-height="1">
                  <div class="grid-stack-item-content">6</div>
                </div>
              </div>
            </div>
          </div>

        </div>

      </div>
    </div>
  </div>
</div>

Ответы [ 2 ]

5 голосов
/ 26 апреля 2019

Следуя примерам, я смог перетащить виджеты между 2 сетками верхнего уровня и создать вложенную сетку, но не объединяя эти 2 вместе. Если это поддерживается

Грустно, но это правда, невозможно . По крайней мере, не с gridstack.

Ключ за этим механизмом перетаскивания выполняется с помощью опции acceptWidgets . Но это не может обрабатывать многоуровневый элемент .grid-stack. Следовательно, появляется ошибка.

Вы можете попытаться изменить скрипт, добавленный во фрагменте, примерно так:

$("#container-stack").gridstack({
   acceptWidgets: '.grid-stack-item'
})

Но, к сожалению, это приведет к ошибке , как только вы начнете перетаскивать любой виджет. Но он работает с одноуровневым вложением, что не совсем то, что вы ищете.

В документации также вообще ничего не говорится о перетаскивании вложенных уровней.

Но причина, по которой я предполагаю, что это невозможно, заключается в том, что выпуск , а также этот .

Полагаю, это (почти) именно то, что вы хотели. но нет никакого ответа от любых чиновников. Кроме того, ему три года. Еще один недостаток, который указывает на то, что этот проект умирает, - когда вы пытаетесь получить доступ к некоторым их файлам, таким как script , вы получаете предупреждение безопасности, которое помешало мне добавить этот фрагмент на некоторое время.


Поэтому , если бы я был тобой, я бы пошел на jqueryUI и набрал код пользователя.


Обновление

Вот фрагмент чего-то похожего на то, что вы ожидали, я думаю, дайте мне знать, если это правильно, тогда я улучшу это еще раз, например добавлю изменение размера, привязку к виджетам родного брата и еще несколько вещей:

Еще раз проверьте фрагмент в полноэкранном режиме.

$("#gridThree").draggable({
  snap: '#gridTwo',
  snapMode: 'inner',
  zIndex: 5,
  containment: 'parent'
});

$(".widgetInOne, .widgetInTwo, .widgetInThree").draggable({
  snap: '#gridOne, #gridTwo, #gridThree',
  snapMode: 'inner',
  zIndex: false,
  stack: 'div',
  cursor: 'grab',
  // grid: [ 100, 100 ]
});

$("#gridOne, #gridTwo, #gridThree").droppable({
  accept: '.widgetInOne, .widgetInTwo, .widgetInThree',
  drop: function(event, ui) {
    if ($(event.target).find($(event.toElement)).length == 0) {
      $(event.toElement).css({
        'left': '',
        top: ''
      });
      $(event.target).append($(event.toElement));
    }
  }
});
* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}

#gridOne {
  background: #cecece;
  width: 40%;
  height: 400px;
  display: inline-block;
  margin-right: 4%;
  vertical-align: top;
}

.widgetInOne,
.widgetInTwo,
.widgetInThree {
  width: 100px;
  height: 100px;
  padding: 0.5em;
}

#gridTwo {
  background: #bfe9f3;
  width: 50%;
  height: 400px;
  display: inline-block;
  margin-left: 4%;
  vertical-align: top;
  position: relative;
}

#gridThree {
  background: #ffdda9;
  width: 300px;
  height: 300px;
  display: inline-block;
  vertical-align: top;
  position: absolute;
  right: 100px;
  top: 0;
}
<link rel="stylesheet" href="https://code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
<link rel="stylesheet" href="https://jqueryui.com/resources/demos/style.css">
<script src="https://code.jquery.com/jquery-1.12.4.js"></script>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>



<div id="gridOne">
  <div class="ui-widget-content widgetInOne">
    <p>One</p>
  </div>
</div>


<div id="gridTwo">
  <div class="ui-widget-content widgetInTwo">
    <p>Two</p>
  </div>
  <div id="gridThree">
    <div class="ui-widget-content widgetInThree">
      <p>Three</p>
    </div>
  </div>
</div>

Несколько заметных вещей здесь:

  • Когда вы перетаскиваете виджет в сетку, элемент виджета фактически перемещается в этой сетке (в структуре DOM), поэтому любой зависимый от родителей селектор css может здесь не работать. применять только CSS с классом виджета.
  • На данный момент виджеты привязываются только к внутренним краям сетки (не к внешней стороне других виджетов), чтобы найти дополнительную проверку: здесь Я не смог найти другой вариант, кроме как используйте // grid: [ 100, 100 ] для этого.

  • Опция Resizable еще не добавлена, надеюсь, вы можете настроить ее по мере необходимости

3 голосов
/ 30 апреля 2019

Это код из старой скрипки перетаскивания, которую я написал (век назад!), С областями, которые можно перетаскивать и сбрасывать. Предметы, которые можно перетаскивать в любую из областей, подлежащих сбросу, можно снова перетаскивать из одной области в другую и перетаскивать вверх и вниз. Хотя размер элементов не такой, как в вашем примере, это говорит о том, что тот же пользовательский опыт может быть достигнут с помощью простого jquery / jquery-ui без привязки к гридстеку. Вы можете сэкономить некоторые трудоемкие часы, работая вне сетки! ;)

Надеюсь, это поможет

скрипка

$("#launchPad").height($(window).height() - 20);
var dropSpace = $(window).width() - $("#launchPad").width();
$("#dropZone").width(dropSpace - 70);
$("#dropZone").height($("#launchPad").height());

$(".card").draggable({
  appendTo: "#launchPad",
  cursor: "move",
  helper: 'clone',
  revert: "invalid",

});

$("#launchPad").droppable({
  tolerance: "intersect",
  accept: ".card",
  activeClass: "ui-state-default",
  hoverClass: "ui-state-hover",
  drop: function(event, ui) {
    $("#launchPad").append($(ui.draggable));
  }
});

$(".stackDrop1").droppable({
  tolerance: "intersect",
  accept: ".card",
  activeClass: "ui-state-default",
  hoverClass: "ui-state-hover",
  drop: function(event, ui) {
    $(this).append($(ui.draggable));
  }
});

$(".stackDrop2").droppable({
  tolerance: "intersect",
  accept: ".card",
  activeClass: "ui-state-default",
  hoverClass: "ui-state-hover",
  drop: function(event, ui) {
    $(this).append($(ui.draggable));
  }
});
body {
  margin: 0;
}

#launchPad {
  width: 200px;
  float: left;
  border: 1px solid #eaeaea;
  background-color: #f5f5f5;
}

#dropZone {
  float: right;
  border: 1px solid #eaeaea;
  background-color: #ffffcc;
}

.card {
  width: 150px;
  padding: 5px 10px;
  margin: 5px;
  border: 1px solid #ccc;
  background-color: #eaeaea;
}

.stack {
  width: 180px;
  border: 1px solid #ccc;
  background-color: #f5f5f5;
  margin: 20px;
}

.stackHdr {
  background-color: #eaeaea;
  border: 1px solid #fff;
  padding: 5px
}

.stackDrop1,
.stackDrop2 {
  min-height: 100px;
  padding: 15px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.0/jquery.min.js"></script>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>




<body>
  <div id="launchPad">
    <div class="card draggable">
      apple
    </div>
    <div class="card draggable">
      orange
    </div>
    <div class="card draggable">
      banana
    </div>
    <div class="card draggable">
      car
    </div>
    <div class="card draggable">
      bus
    </div>
  </div>

  <div id="dropZone">
    <div class="stack">
      <div class="stackHdr">
        Drop here
      </div>
      <div class="stackDrop1 droppable">

      </div>
    </div>

    <div class="stack">
      <div class="stackHdr">
        Or here
      </div>
      <div class="stackDrop2 droppable">

      </div>
    </div>
  </div>
...