Draggable, Sortable & Tabs: Getting Draggables onto a Sortable when Tab is activated
Basically I have two Draggables: Tab One Elements, Tab Two Elements
I also have two Sortables: Tab One Display, Tab Two Display
The initial Tab One combination works fine but when Tab Two is activated, along with Tab Two Elements, the elements are Draggable but not received by the associated Sortable.
Here's the Demo:
Draggable, Sortable, Tabs: Broken Demo
Here's the Script:
- $(document).ready(function() {
- /* */
- function contentPaneTabs(wrapper, tabs, pane) {
- var panes = wrapper + " > " + pane;
- $(panes).hide();
- $(tabs + " li:first").addClass("active").show(); //Activate first tab
- $(panes + ":first").show(); //Show first tab content
- $('#detail-element-pane').hide();
- //On Click Event
- $(tabs + " li").click(function() {
- $(tabs + " li").removeClass("active"); //Remove any "active" class
- $(this).addClass("active"); //Add "active" class to selected tab
- $(panes).hide(); //Hide all tab content
- var activeTab = $(this).find("a").attr("href"); //Find the href attribute value to identify the active tab + content
- if (activeTab == '#item-pane') {$('#detail-element-pane').hide();$('#item-element-pane').show();itemContentPane();}
- else if (activeTab == '#detail-pane') {$('#item-element-pane').hide();$('#detail-element-pane').show();detailContentPane();}
- $(activeTab).fadeIn(); //Fade in the active ID content
- return false;
- });
- }
- function itemContentPane() {
- //Generate IDs for each available content element
- var autoElementId = 0;
- $('#item-element-pane .elem-drag').each(function(intIndex) {$(this).attr('id', "element" + intIndex);});
- $("#item-content-list").sortable({
- receive: function(e,ui) {
- var disableThis = '#item-element-pane #' + $(ui.item).attr('id');
- $(disableThis).addClass('disabled').draggable( "option", "disabled", true );
- var elementCount = $('#item-content-list > .elem-drag').size();
- if (elementCount > 0) {$('#item-pane .drag-note').addClass('bottom');}
- else if (elementCount <= 0) {$('#item-pane drag-note.bottom').removeClass('bottom');}
- }
- ,update: function() {var order = $('#item-content-list').sortable('serialize');}
- });
- }
- function detailContentPane() {
- var autoElementId = 0;
- $('#detail-element-pane .elem-drag').each(function(intIndex) {$(this).attr('id', "element" + intIndex);});
- $("#detail-content-list").sortable({
- receive: function(e,ui) {
- var disableThis = '#detail-element-pane #' + $(ui.item).attr('id');
- $(disableThis).addClass('disabled').draggable( "option", "disabled", true );
- var elementCount = $('#detail-content-list .elem-drag').size();
- if (elementCount > 0) {$('#detail-pane .drag-note').addClass('bottom');}
- else if (elementCount <= 0) {$('#detail-pane drag-note.bottom').removeClass('bottom');}
- }
- ,update: function() {var order = $('#detail-content-list').sortable('serialize');}
- });
- $('.drag-note').sortable({ disable:true });
-
- }
- function itemElementPane() {
- $("#item-element-pane .elem-drag").draggable({
- connectToSortable: '#item-content-list'
- , snap: '#item-content-list'
- , snapMode: 'inner'
- , snapTolerance: 25
- , opacity: 0.7
- , helper: 'clone'
- , revert: 'invalid'
- });
- }
- function detailElementPane() {
- $("#detail-element-pane .elem-drag").draggable({
- connectToSortable: '#detail-content-list'
- , snap: '#detail-content-list'
- , snapMode: 'inner'
- , snapTolerance: 25
- , opacity: 0.7
- , helper: 'clone'
- , revert: 'invalid'
- });
- }
-
- function trashElements() {
- $('.trash').droppable({ drop: function(ev,ui) { $(ui.draggable).remove();
- } });
- }
- contentPaneTabs('#build-pane', '#content-pane-tabs', '.drop-pane');
- itemContentPane();
- detailContentPane();
- itemElementPane();
- detailElementPane();
- trashElements();
-
- });
Here's the Markup:
- <div style="width:960px;margin:30px auto;">
- <!- ### ITEM ELEMENT PANE -->
- <div id="item-element-pane" class="element-pane">
- <h2>Tab One - Elements</h2>
- <!-- ## CONTENT ELEMENTS -->
- <div id="content-elements" class="group">
- <h3>Draggable Elements</h3>
- <div class="elements">
- <div class="elem-drag"><a id="ctl00_ctl00_Content_Content_Content_Title" >Element - One</a></div>
- <div class="elem-drag"><a id="ctl00_ctl00_Content_Content_Content_Item" >Element - Two</a> </div>
- <div class="elem-drag"><a id="ctl00_ctl00_Content_Content_Content_Image" >Element - Three</a></div>
- </div>
- </div>
- </div>
- <!-- /# ITEM ELEMENT PANE -->
- <!- ### DETAIL ELEMENT PANE -->
- <div id="detail-element-pane" class="element-pane">
- <h2>Tab Two - Elements</h2>
-
-
-
- <!-- ## CONTENT ELEMENTS -->
- <div id="content-elements" class="group">
- <h3>Draggable Elements</h3>
- <div class="elements">
- <div class="elem-drag"><a id="ctl00_ctl00_Content_Content_Content_Title" >Element - One</a></div>
- <div class="elem-drag"><a id="ctl00_ctl00_Content_Content_Content_Item" >Element - Two</a> </div>
- <div class="elem-drag"><a id="ctl00_ctl00_Content_Content_Content_Image" >Element - Three</a></div>
- </div>
- </div>
-
- </div>
- <!-- /# DETAIL ELEMENT PANE -->
- <!-- ### BUILD PANE -->
- <div id="build-pane" class="show-list">
- <h2 class="label-pane">Sortable Lists</h2>
- <!-- ## PANE TABS -->
- <ul id="content-pane-tabs">
- <li class="choose-list"><a href='#item-pane'>Tab - One - Display</a> </li>
- <li class="choose-detail"><a href='#detail-pane'>Tab - Two - Display</a> </li>
-
-
- </ul>
- <!-- ## ITEM LIST PANE -->
- <div id="item-pane" class="drop-pane" >
- <div id="item-content-list" class="content-element-list"><!-- //// Drop Zone --></div>
- <div class="drag-note">Drag an Element Here to Add</div>
- <div class="trash">Drag an Element Here to Delete</div>
-
- </div>
- <!-- ## DETAIL LIST PANE -->
- <div id="detail-pane" class="drop-pane" >
- <div id="item-content-list" class="content-element-list"><!-- //// Drop Zone --></div>
- <div class="drag-note">Drag an Element Here to Add</div>
- <div class="trash">Drag an Element Here to Delete</div>
- </div>
- <!-- ### FORM CONTROLS -->
- <div class="content-pane-buttons">
- <input name="ClearButton" value="Clear" id="ClearButton" type="submit" />
- <input name="CommitButton" value="Commit Changes" id="CommitButton" type="submit" />
- </div>
- </div>
- <!-- /# BUILD PANE -->
-
- </div>
Thanks for having a look