From: <jon...@us...> - 2012-02-24 20:07:20
|
Revision: 39946 http://tikiwiki.svn.sourceforge.net/tikiwiki/?rev=39946&view=rev Author: jonnybradley Date: 2012-02-24 20:07:13 +0000 (Fri, 24 Feb 2012) Log Message: ----------- [ENH] structure admin: Drag and drop interface for structure management, part two. Page layout improvements and draggable list of pages for adding new ones (always adds to the end of the structure so far - fix needed in nestedSortable i think). Modified Paths: -------------- trunk/css/admin.css trunk/lib/structures/structlib.php trunk/lib/structures/tiki-edit_structure.js trunk/templates/structures_toc-leaf.tpl trunk/templates/tiki-edit_structure.tpl trunk/tiki-edit_structure.php Modified: trunk/css/admin.css =================================================================== --- trunk/css/admin.css 2012-02-24 18:59:23 UTC (rev 39945) +++ trunk/css/admin.css 2012-02-24 20:07:13 UTC (rev 39946) @@ -488,4 +488,26 @@ padding-right: .2em; } +.admintoclevel .actions input { + margin-right: 2em; + font-style: italic; + background-color: #f8f8f8; + color: #666; + border: solid 1px #ddd; + width: 15em; +} + +#page_list_container { + list-style: none; + max-height: 20em; + overflow-y: auto; + overflow-x: hidden; + padding: 0; +} + +#page_list_container li { + list-style: none; + margin: .2em; + padding: .2em; +} /* end structures tiki 9 */ \ No newline at end of file Modified: trunk/lib/structures/structlib.php =================================================================== --- trunk/lib/structures/structlib.php 2012-02-24 18:59:23 UTC (rev 39945) +++ trunk/lib/structures/structlib.php 2012-02-24 20:07:13 UTC (rev 39946) @@ -199,7 +199,7 @@ global $user; if (!empty($data)) { - $structure_info = $this->s_get_structure_info($data[count($data)-1]->item_id); + $structure_info = $this->s_get_structure_info($data[1]->item_id); // not "root" if (TikiLib::lib('tiki')->user_has_perm_on_object($user,$structure_info['pageName'],'wiki page','tiki_p_edit_structures')) { @@ -216,14 +216,22 @@ $orders[$node->depth]++; } $node->parent_id = $node->parent_id == 'root' ? $structure_info['page_ref_id'] : $node->parent_id; - $conditions['page_ref_id'] = (int) $node->item_id; - $tiki_structures->update( - array( - 'parent_id' => $node->parent_id, - 'pos' => $orders[$node->depth], - ), - $conditions + $fields = array( + 'parent_id' => $node->parent_id, + 'pos' => $orders[$node->depth], + 'page_alias' => $node->page_alias, ); + if ($node->item_id < 1000000) { + $conditions['page_ref_id'] = (int) $node->item_id; + $tiki_structures->update( + $fields, + $conditions + ); + } else { // new nodes with id > 1000000 + $fields['page_id'] = TikiLib::lib('tiki')->get_page_id_from_name($node->page_name); + $fields['structure_id'] = $structure_id; + $tiki_structures->insert($fields); + } } } Modified: trunk/lib/structures/tiki-edit_structure.js =================================================================== --- trunk/lib/structures/tiki-edit_structure.js 2012-02-24 18:59:23 UTC (rev 39945) +++ trunk/lib/structures/tiki-edit_structure.js 2012-02-24 20:07:13 UTC (rev 39946) @@ -43,18 +43,73 @@ }, start: function (event, ui) { // $(this).addClass("ui-state-active"); - }, - receive: function(event, ui) { + } + }).droppable({ + hoverClass: "ui-state-active", + drop: function(event, ui) { + if (!$(ui.draggable).hasClass("admintoclevel")) { + var pageName = $.trim($(ui.draggable).text()); + $(this).append( + $('<li class="ui-state-default admintoclevel new"><div>' + + '<div class="actions"><input type="text" class="page-alias-input" value="" placeholder="Page alias..."></div>' + + pageName +'</div></li>') + ); + $(".save_structure a").show("fast").parent().show("fast"); + tocDirty = true; + } + } + }) + .disableSelection(); - } + $(".page-alias-input").change( function () { + $(".save_structure a").show("fast").parent().show("fast"); + tocDirty = true; }); + + $("#page_list_container li").each(function() { + var el = this; + $(this).draggable({ + connectToSortable: ".admintoc:first", + revert: "invalid", + helper: "clone", + start: function (event, ui) { + $(this).css("z-index", 1000); + }, + stop: function (event, ui) { + $("#save_structure").show("fast").data("dragged", $(el).attr("id")); + $(this).css("z-index", "auto"); + } + }).mouseover(function(event, ui) { // sortable gets muddled when dragging so disable it + $(".admintoc:first").sortable("option", "disabled", true); + }).mouseout(function(event, ui) { + $(".admintoc:first").sortable("option", "disabled", false); + }).disableSelection(); + }); + $(".save_structure").click(function(){ + var $sortable = $(this).parent().find(".admintoc:first"); + $sortable.modal(tr("Saving...")); + + var fakeId = 1000000; + $(".admintoclevel.new").each(function() { + $(this).attr("id", "node_" + fakeId); + fakeId++; + }); + var ary = $sortable.nestedSortable('toArray', {startDepthCount: 0, listType:"ol"}); - $sortable.modal(tr("Saving...")); + for (var i = 1; i < ary.length; i++ ) { + if (ary[i]["item_id"] != "root") { + ary[i]["page_alias"] = $(".page-alias-input", "#node_" + ary[i]["item_id"]).val(); + if (ary[i]["item_id"] >= 1000000) { // new pages + ary[i]["page_name"] = $("#node_" + ary[i]["item_id"] + " > div").text(); + } + } + } + $.getJSON($.service("wiki", "save_structure", {data: $.toJSON(ary)}), function (data) { $sortable.modal(); if (data) { @@ -66,3 +121,15 @@ }); }); + +function movePageToStructure(element) { + var id = $(element).parents(".admintoclevel:first").attr("id").match(/\d*$/); + if (id) { + id = id[0]; + } + $("input[name=page_ref_id]", "#move_dialog").val(id); + $("#move_dialog").dialog({ + title: tr("Move page") + }); +} + Modified: trunk/templates/structures_toc-leaf.tpl =================================================================== --- trunk/templates/structures_toc-leaf.tpl 2012-02-24 18:59:23 UTC (rev 39945) +++ trunk/templates/structures_toc-leaf.tpl 2012-02-24 20:07:13 UTC (rev 39946) @@ -4,6 +4,7 @@ <div> {if $toc_type eq 'admin'} <div class="actions"> + <input type="text" class="page-alias-input" value="{$structure_tree.page_alias|escape}" placeholder="{tr}Page alias...{/tr}" /> {self_link _script='tiki-index.php' page=$structure_tree.pageName structure=$structure_name _title="{tr}View{/tr}" _noauto="y"} {icon _id='magnifier' alt="{tr}View{/tr}"} {/self_link} @@ -27,6 +28,9 @@ {icon _id='page_edit' alt='{tr}Edit page{/tr}'} {/self_link} {/if} + {self_link _onclick="movePageToStructure(this);return false;"} + {icon _id='arrow_right' alt='{tr}Move{/tr}'} + {/self_link} {self_link page_ref_id=$structure_tree.page_ref_id remove=$structure_tree.page_ref_id} {icon _id='cross' alt='{tr}Delete{/tr}' page_ref_id=$structure_tree.page_ref_id remove=$structure_tree.page_ref_id} {/self_link} @@ -55,7 +59,7 @@ {$structure_tree.description|escape} {/if}"> {if $hilite}<strong>{/if} - {if $structure_tree.page_alias|escape} + {if $structure_tree.page_alias|escape and $toc+type neq 'admin'} {$structure_tree.page_alias|escape} {else} {$structure_tree.pageName|escape} Modified: trunk/templates/tiki-edit_structure.tpl =================================================================== --- trunk/templates/tiki-edit_structure.tpl 2012-02-24 18:59:23 UTC (rev 39945) +++ trunk/templates/tiki-edit_structure.tpl 2012-02-24 20:07:13 UTC (rev 39946) @@ -66,85 +66,59 @@ {/if} <h2>{tr}Structure Layout{/tr}</h2> -<div class="structure-container">{$nodelist}</div> +<div class="structure-container"> + {self_link page_ref_id=$structure_id} + {if $structure_id eq $page_ref_id}<strong>{/if} + {tr}Top{/tr} + {if $structure_id eq $page_ref_id}</strong>{/if} + {/self_link} + {$nodelist} +</div> {button _text="{tr}Save{/tr}" _style="display:none;" _class="save_structure" _ajax="n" _auto_args="save_structure,page_ref_id"} - {if $editable == 'y'} +<div id="move_dialog" style="display: none;"> + <form action="tiki-edit_structure.php" method="post"> + <input type="hidden" name="page_ref_id" value="{$page_ref_id}"/> + <div class="clearfix" style="margin-bottom: 1em;"> + <label for="structure_id">{tr}Move to another structure:{/tr}</label> + <select name="structure_id" id="structure_id"{if $structures|@count eq '1'} disabled="disabled"{/if}> + {section name=ix loop=$structures} + {if $structures[ix].page_ref_id ne $structure_id} + <option value="{$structures[ix].page_ref_id}">{$structures[ix].pageName}</option> + {/if} + {if $structures|@count eq '1'} + <option value="">{tr}None{/tr}</option> + {/if} + {/section} + </select> + </div> + <label class="floatleft" for="begin1">{tr}at the beginning{/tr}</label> + <div class="floatleft"><input type="radio" id="begin1" name="begin" value="1" checked="checked" {if $structures|@count eq '1'} disabled="disabled"{/if} /></div> + <label class="floatleft" for="begin2">{tr}at the end{/tr}</label> + <div class="floatleft"><input type="radio" id="begin2" name="begin" value="0" {if $structures|@count eq '1'}disabled="disabled"{/if} /></div> + <hr /> + <div class="floatleft input_submit_container"> + <input type="submit" name="move_to" value="{tr}Move{/tr}" {if $structures|@count eq '1'} disabled="disabled"{/if} /> + </div> + </form> +</div> <form action="tiki-edit_structure.php" method="post"> <input type="hidden" name="page_ref_id" value="{$page_ref_id}"/> + <h3>{tr}Add pages{/tr}</h3> - <h2>{tr}Current Node:{/tr} {$pageName}</h2> <table class="formcolor"> <tr> - <td><label for="pageAlias">{tr}Page alias:{/tr}</label></td> <td> - <input type="text" name="pageAlias" id="pageAlias" value="{$pageAlias}"/> <input type="submit" - name="create" - value="{tr}Update{/tr}"/> - </td> - </tr> - {autocomplete element='#pageAlias' type='pagename'} - <tr> - <td>{tr}Move in this structure{/tr}</td> - <td> - <a href='tiki-edit_structure.php?page_ref_id={$page_ref_id}&move_node=1'>{icon _id='resultset_previous' alt="{tr}Promote{/tr}"}</a> - <a href='tiki-edit_structure.php?page_ref_id={$page_ref_id}&move_node=4'>{icon _id='resultset_next' alt="{tr}Demote{/tr}"}</a> - <a href='tiki-edit_structure.php?page_ref_id={$page_ref_id}&move_node=2'>{icon _id='resultset_up' alt="{tr}Previous{/tr}"}</a> - <a href='tiki-edit_structure.php?page_ref_id={$page_ref_id}&move_node=3'>{icon _id='resultset_down' style="margin-right:10px;" alt="{tr}Next{/tr}"}</a> - </td> - </tr> - <tr> - <td><label for="structure_id">{tr}Move to another structure:{/tr}</label></td> - <td> - <select name="structure_id" id="structure_id"{if $structures|@count eq '1'} disabled="disabled"{/if}> - {section name=ix loop=$structures} - {if $structures[ix].page_ref_id ne $page_ref_id} - <option value="{$structures[ix].page_ref_id}">{$structures[ix].pageName}</option> - {/if} - {if $structures|@count eq '1'} - <option value="">{tr}None{/tr}</option> - {/if} + <label for="page_list_container">{tr}Use pre-existing page by dragging into the structure above{/tr}</label> + <ul id="page_list_container"> + {section name=list loop=$listpages} + <li class="ui-state-default"> + {$listpages[list].pageName|truncate:40:"(...)":true} + </li> {/section} - </select> - <label for="begin1">{tr}at the beginning{/tr}</label> - <input type="radio" id="begin1" name="begin" value="1" checked="checked" - {if $structures|@count eq '1'} disabled="disabled"{/if} /> - <label for="begin2">{tr}at the end{/tr}</label> - <input type="radio" id="begin2" name="begin" value="0" - {if $structures|@count eq '1'}disabled="disabled"{/if} /> - <input type="submit" name="move_to" value="{tr}Move{/tr}" - {if $structures|@count eq '1'} disabled="disabled"{/if} /> - </td> - </tr> - </table> - <h3>{tr}Add pages to current node:{/tr}</h3> - <table class="formcolor"> - <tr> - <td> - <label for="after_ref_id">{tr}After page:{/tr}</label> - </td> - <td> - <select name="after_ref_id" id="after_ref_id"> - {section name=ix loop=$subpages} - <option value="{$subpages[ix].page_ref_id}" - {if $insert_after eq $subpages[ix].page_ref_id}selected="selected"{/if}>{$subpages[ix].pageName}</option> - {/section} - </select> - </td> - </tr> - <tr> - <td> - <label for="name">{tr}Create Page:{/tr}</label> - </td> - <td> - <input type="text" name="name" id="name"/> - {autocomplete element='#name' type='pagename'} - </td> - </tr> - <tr> - <td> - <label for="name2">{tr}Use pre-existing page:{/tr}</label><br/><br/> + </ul> + <label for="find_objects" style="display: inline-block;">{tr}Find:{/tr}</label> <input type="text" name="find_objects" id="find_objects" value="{$find_objects|escape}"/> <input type="submit" value="{tr}Filter{/tr}" name="search_objects"/> {autocomplete element='#find_objects' type='pagename'} @@ -154,39 +128,41 @@ <option value='' {if $find_categId eq ''}selected="selected"{/if}>{tr}any category{/tr}</option> {section name=ix loop=$categories} <option value="{$categories[ix].categId|escape}" - {if $find_categId eq $categories[ix].categId}selected="selected"{/if}>{tr}{$categories[ix].categpath}{/tr}</option> + {if !empty($find_categId) and $find_categId eq $categories[ix].categId}selected="selected"{/if}>{tr}{$categories[ix].categpath}{/tr}</option> {/section} </select> {/if} </td> - <td> - <select id="name2" name="name2[]" multiple="multiple" size="8"> - {section name=list loop=$listpages} - <option value="{$listpages[list].pageName|escape}">{$listpages[list].pageName|truncate:40:"(...)":true}</option> - {/section} - </select> - </td> </tr> <tr> - <td> </td> <td> + <h3>{tr}Create a new page in current node:{/tr} {$pageName}</h3> + <label for="name">{tr}Create Page:{/tr}</label> + <input type="text" name="name" id="name"/> + {autocomplete element='#name' type='pagename'} + <label for="after_ref_id">{tr}After page:{/tr}</label> + <select name="after_ref_id" id="after_ref_id"> + {section name=ix loop=$subpages} + <option value="{$subpages[ix].page_ref_id}" + {if $insert_after eq $subpages[ix].page_ref_id}selected="selected"{/if}>{$subpages[ix].pageName}</option> + {/section} + </select> <input type="submit" name="create" value="{tr}Update{/tr}"/> </td> </tr> </table> </form> {if $prefs.feature_wiki_categorize_structure == 'y' && $all_editable == 'y'} - <form action="tiki-edit_structure.php" method="post"> - <input type="hidden" name="page_ref_id" value="{$page_ref_id}"/> + <form action="tiki-edit_structure.php" method="post"> + <input type="hidden" name="page_ref_id" value="{$page_ref_id}"/> - <h3>{tr}Categorize all pages in structure together:{/tr}</h3> - <table class="normal"> - {include file='categorize.tpl'} - </table> - <input type="submit" name="recategorize" value="{tr}Update{/tr}"/> - {tr}Remove existing categories from ALL pages before recategorizing:{/tr} <input type="checkbox" - name="cat_override"/> - </form> + <h3>{tr}Categorize all pages in structure together:{/tr}</h3> + <table class="normal"> + {include file='categorize.tpl'} + </table> + <input type="submit" name="recategorize" value="{tr}Update{/tr}"/> + {tr}Remove existing categories from ALL pages before recategorizing:{/tr} <input type="checkbox" + name="cat_override"/> + </form> {/if} -<br/> {/if}{* end of if structure editable *} Modified: trunk/tiki-edit_structure.php =================================================================== --- trunk/tiki-edit_structure.php 2012-02-24 18:59:23 UTC (rev 39945) +++ trunk/tiki-edit_structure.php 2012-02-24 20:07:13 UTC (rev 39946) @@ -214,9 +214,10 @@ $filter = ''; if (!empty($_REQUEST['categId'])) { $filter['categId'] = $_REQUEST['categId']; - $smarty->assign_by_ref('find_categId', $_REQUEST['categId']); + $smarty->assign('find_categId', $_REQUEST['categId']); +} else { + $smarty->assign('find_categId', ''); } - // Get all wiki pages for the dropdown menu $listpages = $tikilib->list_pages(0, -1, 'pageName_asc', $find_objects, '', false, true, false, false, $filter); $smarty->assign_by_ref('listpages', $listpages["data"]); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |