Issue #1206: Implement new album manager

This commit is contained in:
Zacharie
2020-08-10 10:38:22 +02:00
committed by plegall
parent cf4a861bdf
commit 7eece49c4f
5 changed files with 237 additions and 281 deletions

View File

@@ -161,7 +161,7 @@ elseif (isset($_POST['submitAdd']))
$output_create = create_virtual_category(
$_POST['virtual_name'],
@$_GET['parent_id']
);
);
invalidate_user_cache();
if (isset($output_create['error']))
@@ -174,86 +174,6 @@ elseif (isset($_POST['submitAdd']))
$page['infos'][] = $output_create['info'].' <a class="icon-pencil" href="'.$edit_url.'">'.l10n('Edit album').'</a>';
}
}
// save manual category ordering
elseif (isset($_POST['submitManualOrder']))
{
asort($_POST['catOrd'], SORT_NUMERIC);
save_categories_order(array_keys($_POST['catOrd']));
$page['infos'][] = l10n('Album manual order was saved');
}
elseif (isset($_POST['submitAutoOrder']))
{
if (!isset($sort_orders[ $_POST['order_by'] ]))
{
die('Invalid sort order');
}
$query = '
SELECT id
FROM '.CATEGORIES_TABLE.'
WHERE id_uppercat '.
(!isset($_GET['parent_id']) ? 'IS NULL' : '= '.$_GET['parent_id']).'
;';
$category_ids = array_from_query($query, 'id');
if (isset($_POST['recursive']))
{
$category_ids = get_subcat_ids($category_ids);
}
$categories = array();
$sort = array();
list($order_by_field, $order_by_asc) = explode(' ', $_POST['order_by']);
$order_by_date = false;
if (strpos($order_by_field, 'date_') === 0)
{
$order_by_date = true;
$ref_dates = get_categories_ref_date(
$category_ids,
$order_by_field,
'ASC' == $order_by_asc ? 'min' : 'max'
);
}
$query = '
SELECT id, name, id_uppercat
FROM '.CATEGORIES_TABLE.'
WHERE id IN ('.implode(',', $category_ids).')
;';
$result = pwg_query($query);
while ($row = pwg_db_fetch_assoc($result))
{
if ($order_by_date)
{
$sort[] = $ref_dates[ $row['id'] ];
}
else
{
$sort[] = remove_accents($row['name']);
}
$categories[] = array(
'id' => $row['id'],
'id_uppercat' => $row['id_uppercat'],
);
}
array_multisort(
$sort,
SORT_REGULAR,
'ASC' == $order_by_asc ? SORT_ASC : SORT_DESC,
$categories
);
save_categories_order($categories);
$page['infos'][] = l10n('Albums automatically sorted');
}
// +-----------------------------------------------------------------------+
// | Navigation path |
// +-----------------------------------------------------------------------+

View File

@@ -102,7 +102,7 @@ TEXTAREA { cursor:text; font-size: 13px; }
ul.thumbnails input { color:#666; font-size:10px; margin:0; background-color:#bbb; text-align: center;}
.throw { font-size: 120%; line-height: 26px; padding-top: 10px; font-weight: bold; }
label { cursor:pointer }
.categoryLi, .menuLi { background: #F3F3F3; }
.menuLi { background: #F3F3F3; }
.menuLi_hidden { background: #ccc !important; }
a.Piwigo {
font-family: verdana, arial, helvetica, sans-serif !important;
@@ -113,10 +113,6 @@ a.Piwigo:hover span.Piwigo {
}
TABLE.table2 { border: 2px solid #dddddd; }
.categoryUl>li:not(.virtual_cat) {
background:url(images/stripe-cat.png);
}
*, *:focus, *:active, input:active, a:active, input:focus, a:focus { outline: none; -moz-outline-width: 0px; }
A{
color:#3A3A3A;
@@ -666,13 +662,6 @@ table.dataTable thead th, table.dataTable.no-footer {
background-color:#fff;
}
FORM#categoryOrdering p.albumTitle a { color: #5B5B5B; }
FORM#categoryOrdering p.albumActions a { border-left:1px solid #D6D6D6; background-color: #E8E8E8;}
.albumInfos {color: #999999;}
FORM#categoryOrdering p.albumActions a:hover {background-color: #FFA844; color: #3A3A3A;}
FORM#categoryOrdering p.albumActions .userSeparator {border: 1px solid #E1E1E1;}
#addAlbumOpen, #autoOrderOpen {border: 1px solid #D6D6D6; color: #5B5B5B;}
#addAlbumOpen:hover, #autoOrderOpen:hover {border: 1px solid #aaa; text-decoration: none;}
.afterUploadActions a {color: #3C3C3C; font-weight: bold; background-color: #FFA646;}
.afterUploadActions a:hover {text-decoration: none; background-color: #ff7700;}
.font-checkbox:hover {color: #FFA844;}
@@ -738,6 +727,46 @@ li.plupload_delete a:hover {background: url("images/cancelhover.svg")!important;
#batchManagerGlobal .ui-slider-range.ui-widget-header.ui-corner-all {border: 1px solid #ffaf58;}
#batchManagerGlobal .font-checkbox.selected {color: #777;}
/* Category List */
.categoryContainer {
margin: 0;
}
.categoryBox, .addAlbum{
background-color: #fafafa;
box-shadow: 0px 2px 5px #00000024;
}
.addAlbumHead p {
color: #3C3C3C;
}
.addAlbum form input {
background-color: white;
border: 1px solid #d5d5d5;
}
.albumTitle {
color: #3c3c3c;
}
.albumInfos {
color: #aaa;
}
.albumActions a {
color: #848484;
}
.albumActions a:hover {
color: #3c3c3c;
text-decoration: none;
}
.albumActions > span {
color: #c6c6c6;
}
.icon-red {
background-color: #ffcfcf;
color: #ff5252;

View File

@@ -2,158 +2,55 @@
{footer_script require='jquery.ui.sortable'}{literal}
jQuery(document).ready(function(){
jQuery(".drag_button").show();
jQuery(".categoryLi").css("cursor","move");
jQuery(".categoryUl").sortable({
axis: "y",
opacity: 0.8,
update : function() {
jQuery("#manualOrder").show();
jQuery("#notManualOrder").hide();
jQuery("#formAutoOrder").hide();
jQuery("#formCreateAlbum").hide();
}
});
jQuery("#categoryOrdering").submit(function(){
ar = jQuery('.categoryUl').sortable('toArray');
for(i=0;i<ar.length;i++) {
cat = ar[i].split('cat_');
document.getElementsByName('catOrd[' + cat[1] + ']')[0].value = i;
}
});
jQuery("input[name=order_type]").click(function () {
jQuery("#automatic_order_params").hide();
if (jQuery("input[name=order_type]:checked").val() == "automatic") {
jQuery("#automatic_order_params").show();
}
});
jQuery("#addAlbumOpen").click(function(){
jQuery("#formCreateAlbum").toggle();
jQuery("input[name=virtual_name]").focus();
jQuery("#formAutoOrder").hide();
});
jQuery("#addAlbumClose").click(function(){
jQuery("#formCreateAlbum").hide();
});
jQuery("#autoOrderOpen").click(function(){
jQuery("#formAutoOrder").toggle();
jQuery("#formCreateAlbum").hide();
});
jQuery("#autoOrderClose").click(function(){
jQuery("#formAutoOrder").hide();
});
jQuery("#cancelManualOrder").click(function(){
jQuery(".categoryUl").sortable("cancel");
jQuery("#manualOrder").hide();
jQuery("#notManualOrder").show();
});
});
{/literal}{/footer_script}
<div class="selectedAlbum cat-list-album-path"><span class="icon-sitemap">{$CATEGORIES_NAV}</span></div>
<p class="showCreateAlbum" id="notManualOrder">
<a href="#" id="addAlbumOpen" class="icon-plus">{'create a new album'|@translate}</a>
{if count($categories)}<span class="userSeparator">&middot;</span><a href="#" id="autoOrderOpen" class="icon-sort-alt-down">{'apply automatic sort order'|@translate}</a>{/if}
{if ($PARENT_EDIT)}<span class="userSeparator">&middot;</span><a href="{$PARENT_EDIT}" class="icon-pencil"></span>{'edit'|@translate}</a>{/if}
</p>
<form id="formCreateAlbum" action="{$F_ACTION}" method="post" style="display:none;">
<fieldset class="with-border">
<legend>{'create a new album'|@translate}</legend>
<div class="selectedAlbum cat-list-album-path"><span class="icon-red icon-sitemap">{$CATEGORIES_NAV}</span></div>
{assign var='color_tab' value=["icon-red", "icon-blue", "icon-yellow", "icon-purple", "icon-green"]}
<div class="categoryContainer">
<div class="addAlbum">
<div class="addAlbumHead" onclick="$('.addAlbum').addClass('input-mode');">
<span class="icon-plus-circled icon-blue"></span>
<p>{"Add Album"|@translate}
</div>
<form action="{$F_ACTION}" method="post">
<input type="hidden" name="pwg_token" value="{$PWG_TOKEN}">
<p>
<strong>{'Album name'|@translate}</strong><br>
<input type="text" name="virtual_name" maxlength="255">
</p>
<p class="actionButtons">
<button name="submitAdd" type="submit" class="buttonLike">
<i class="icon-plus-circled"></i> {'Create'|translate}
<label for="virtual_name">{"Album Name"|@translate}</label>
<input type="text" name="virtual_name" placeholder="{"Portraits..."|@translate}">
<button name="submitAdd" type="submit" class="buttonLike">
<i class="icon-plus"></i> {"Create"|@translate}
</button>
<a href="#" id="addAlbumClose" class="icon-cancel-circled">{'Cancel'|@translate}</a>
</p>
</fieldset>
</form>
{if count($categories)}
<form id="formAutoOrder" action="{$F_ACTION}" method="post" style="display:none;">
<fieldset class="with-border">
<legend>{'Automatic sort order'|@translate}</legend>
<input type="hidden" name="pwg_token" value="{$PWG_TOKEN}">
<a onclick="$('.addAlbum').removeClass('input-mode');">{"Cancel"|@translate}</a>
</form>
</div>
{if count($categories)}
{foreach from=$categories item=category}
<div class="categoryBox{if $category.IS_VIRTUAL} virtual_cat{/if}" id="cat_{$category.ID}">
<p><strong>{'Sort order'|@translate}</strong>
{foreach from=$sort_orders key=sort_code item=sort_label}
<br>
<label class="font-checkbox">
<span class="icon-dot-circled"></span>
<input type="radio" value="{$sort_code}" name="order_by" {if $sort_code eq $sort_order_checked}checked="checked"{/if}> {$sort_label}
</label>
{/foreach}
</p>
<p>
<label class="font-checkbox">
<span class="icon-check"></span>
<input type="checkbox" name="recursive"> <strong>{'Apply to sub-albums'|@translate}</strong>
</label>
</p>
<p class="actionButtons">
<button name="submitAutoOrder" type="submit" class="buttonLike">
<i class="icon-floppy"></i> {'Save order'|translate}
</button>
<a href="#" id="autoOrderClose" class="icon-cancel-circled">{'Cancel'|@translate}</a>
</p>
</fieldset>
</form>
{/if}
<div class="albumIcon">
<span class="
{if $category.NB_SUB_ALBUMS == 0}icon-flow-tree{else}icon-folder-open{/if}
{$color_tab[$category.ID % 5]}
"> </span>
</div>
<div class="albumTitle">
{$category.NAME}
</div>
<span class="albumInfos"><p>{$category.NB_PHOTOS|translate_dec:'%d photo':'%d photos'}</p> <p>{$category.NB_SUB_PHOTOS|translate_dec:'%d photo':'%d photos'} {$category.NB_SUB_ALBUMS|translate_dec:'in %d sub-album':'in %d sub-albums'}</p></span>
<form id="categoryOrdering" action="{$F_ACTION}" method="post">
<input type="hidden" name="pwg_token" value="{$PWG_TOKEN}">
<p id="manualOrder" style="display:none">
<input class="submit" name="submitManualOrder" type="submit" value="{'Save manual order'|@translate}">
{'... or '|@translate} <a href="#" id="cancelManualOrder">{'cancel manual order'|@translate}</a>
</p>
{if count($categories)}
<ul class="categoryUl">
{foreach from=$categories item=category}
<li class="categoryLi{if $category.IS_VIRTUAL} virtual_cat{/if}" id="cat_{$category.ID}">
<!-- category {$category.ID} -->
<div class="albumBlock">
<div class="albumLineBlock">
<p class="albumTitle">
<i class="icon-arrow-combo" title="{'Drag to re-order'|translate}"></i>
<strong>{$category.NAME}</strong>
</p>
<span class="albumInfos"><span class="userSeparator">&middot;</span> {$category.NB_PHOTOS|translate_dec:'%d photo':'%d photos'} <span class="userSeparator">&middot;</span> {$category.NB_SUB_PHOTOS|translate_dec:'%d photo':'%d photos'} {$category.NB_SUB_ALBUMS|translate_dec:'in %d sub-album':'in %d sub-albums'}</span>
</div>
<input type="hidden" name="catOrd[{$category.ID}]" value="{$category.RANK}">
<p class="albumActions">
<a href="{$category.U_EDIT}"><span class="icon-pencil"></span>{'Edit'|@translate}</a>
<a href="{$category.U_CHILDREN}" class="actionTitle"><span class="icon-flow-tree"></span><span>{'sub-albums'|@translate}</span></a>
{if isset($category.U_SYNC) }
<a href="{$category.U_SYNC}"><span class="icon-exchange"></span>{'Synchronize'|@translate}</a>
{/if}
{if cat_admin_access($category.ID)}
<a href="{$category.U_JUMPTO}"><span class="icon-eye">{'Visit Gallery'|@translate} </a>
{/if}
<a href="{$category.U_ADD_PHOTOS_ALBUM}"><span class="icon-plus">{'Add Photos'|@translate} </a>
</p>
</div>
</li>
<div class="albumActions">
<a href="{$category.U_EDIT}" title="{'Edit'|@translate}"><span class="icon-pencil"></span>{'Edit'|@translate}</a>
<a href="{$category.U_CHILDREN}" class="actionTitle" title="{'sub-albums'|@translate}"><span class="icon-flow-tree"></span>{'sub-albums'|@translate}</a>
{if cat_admin_access($category.ID)}
<a href="{$category.U_JUMPTO}" title="{'Visit Gallery'|@translate}"><span class="icon-eye"></span>{'Visit Gallery'|@translate} </a>
{else}
<span href="{$category.U_JUMPTO}" title="{'This album is private'|@translate}"><span class="icon-eye"></span>{'Visit Gallery'|@translate} </span>
{/if}
<a href="{$category.U_ADD_PHOTOS_ALBUM}" title="{'Add Photos'|@translate}"><span class="icon-plus"></span>{'Add Photos'|@translate}</a>
</div>
</div>
{/foreach}
</ul>
{/if}
</form>
{/if}
</div>

View File

@@ -152,36 +152,165 @@ TABLE.plugins TR TD { padding: 4px 10px; }
TABLE.languages TR TD { padding: 7px 20px; }
/* categoryOrdering */
FORM#categoryOrdering .orderParams {
line-height:30px;
margin-bottom:10px;
/* Category List */
.categoryContainer {
display: flex;
flex-wrap: wrap;
justify-content: center;
}
SELECT.categoryList {
width: 100%;
.categoryBox, .addAlbum {
position: relative;
text-align: left;
height: 300px;
width: 220px;
margin: 15px;
border-radius: 10px;
}
FORM#categoryOrdering p {
text-align: left;
/* margin-top: 1em; */
/* margin-bottom: 1em; */
}
UL.categoryUl {
list-style: none;
padding: 0;
margin: 1em;
.albumIcon {
height: 80px;
display: flex;
align-items: center;
justify-content: center;
}
LI.categoryLi {
/*
width: 100%;
*/
margin-bottom: 20px;
border-radius:5px;
.albumIcon span{
font-size: 19px;
width: 27px;
padding: 10px;
border-radius: 30px;
}
.albumTitle {
font-size: 16px;
padding: 0px 15px;
font-weight: bold;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
text-align: center;
}
.albumInfos {
text-align: center;
color: #aaa;
font-weight: 600;
}
.albumInfos p {
margin: 0;
}
.albumActions {
position: absolute;
bottom: 5px;
display: flex;
flex-direction: column;
width: 90%;
overflow: hidden;
margin-left: 20px;
margin-bottom: 10px;
}
.albumActions a, .albumActions span {
margin: 5px;
font-size: 14px;
text-transform: capitalize;
font-weight: bold;
transition: 0.2s ease;
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
}
.albumActions a span, .albumActions span span{
margin: 10px;
}
.addAlbum {
display: flex;
flex-direction: column;
justify-content: space-around;
cursor: pointer;
}
.addAlbum.input-mode {
cursor: auto;
}
.addAlbum label {
margin: 0;
border-radius: 5px 5px 0 0;
padding: 2px;
position: absolute;
left: 16px;
font-size: 14px;
color: #3C3C3C;
}
.addAlbumHead {
font-size: 16px;
display: flex;
flex-direction: column;
align-items: center;
margin-top: -10px;
transform: translateY(75px);
transition: 0.4s ease;
transition-delay: 0.4s;
padding: 110px 0px;
}
.addAlbum.input-mode .addAlbumHead {
transition-delay: 0s;
padding: 0px;
}
.addAlbumHead span {
font-size: 19px;
width: 27px;
height: 27px;
padding: 10px;
border-radius: 30px;
margin: 10px auto;
}
.addAlbumHead p {
font-weight: 700;
margin: 0;
}
.addAlbum form {
opacity: 0;
pointer-events: none;
transition: 0.4s ease;
transition-delay: 0s;
}
.addAlbum form input {
margin: 10px;
padding: 10px;
display: inline-block;
width: 159px;
margin-top: 20px;
}
.addAlbum button, .addAlbum a {
display: table;
margin: 10px auto;
font-weight: bold;
}
.addAlbum.input-mode .addAlbumHead{
transform: translateY(0px);
}
.addAlbum.input-mode form {
opacity: 1;
pointer-events: all;
transition-delay: 0.4s;
}
/* menuOrdering */
FORM#menuOrdering {
padding-left: 1em;
@@ -2995,7 +3124,6 @@ ul.jqtree-tree .jqtree-element {
#addAlbumOpen, #autoOrderOpen {padding: 7px 15px; font-weight: bold; font-size: 11px;}
.afterUploadActions {text-align: center; margin-bottom: 30px !important;}
.afterUploadActions a {justify-content: center; margin: 35px; font-weight: bold; font-size: 14px; padding: 10px 12px;}
#addAlbumOpen::before ,#autoOrderOpen::before {margin-right: 10px; font-weight: bold; font-size: 15px;}
#autoOrder p, #createAlbum p {text-align:left; margin:0 0 1em 0;}
#autoOrder p.actionButtons, #createAlbum p.actionButtons {margin-bottom:0;}
@@ -4202,7 +4330,6 @@ fieldset#environment legend i[class*="icon-"] {
#permissions {display: none!important;}
#permissions, .selectFiles {margin-top: 35px; margin-bottom: 20px;}
.selectAlbumBlock {display: flex; margin-left: 10px; margin-top: 10px;}
.albumActions a:last-child {border-radius: 0 5px 5px 0;}
.icon-plus.cboxElement {
padding: 8px; box-shadow: 0 1px 2px rgba(0, 0, 0, 0.16); font-size: 15px; margin-bottom: 8px; transition: all 125ms ease-out;
}
@@ -4389,9 +4516,5 @@ li.plupload_delete a:hover {background: url("images/cancelhover.svg")!important;
/* album manager */
.selectedAlbum.cat-list-album-path {
margin: 40px 0 30px 0;
margin: 30px 0 30px 0;
}
.selectedAlbum.cat-list-album-path span {
background-color: transparent;
}

View File

@@ -97,7 +97,7 @@ INPUT[type="submit"]:hover , INPUT[type="reset"]:hover { cursor: pointer; }
INPUT.bigbutton:hover { background-color: #222; color:#f33; border: 0; }
.throw { font-size: 120%; line-height: 26px; padding-top: 10px; font-weight: bold; color: #ff3363; }
label { cursor:pointer }
.categoryLi, .menuLi { background: #333 }
.menuLi { background: #333 }
.menuLi_hidden { background: #333 !important; }
a.Piwigo {
font-family: verdana, arial, helvetica, sans-serif !important;
@@ -107,10 +107,6 @@ a.Piwigo:hover span.Piwigo {
border-bottom: 1px solid #FF3363;
}
.categoryUl>li:not(.virtual_cat) {
background:url(images/stripe-cat.png);
}
/* RADU - I comment this because it makes FF form controls activation very slow)
*, *:focus, *:active, input:active, a:active, input:focus, a:focus { outline: none; -moz-outline-width: 0px; }
*/
@@ -777,21 +773,12 @@ table.qsearch_help_table td {
#wImg {border-color:#555;}
FORM#categoryOrdering p.albumTitle a { color: #c0c0c0; }
FORM#categoryOrdering p.albumActions a { border-left:1px solid #555; }
.albumInfos {color: #808080;}
FORM#categoryOrdering p.albumActions a:hover {background-color: #ffa646; color: #3A3A3A;}
FORM#categoryOrdering p.albumActions .userSeparator {border: 1px solid #d5d5d5;}
#addAlbumOpen, #autoOrderOpen {border: 1px solid #777; color: #c0c0c0;}
#addAlbumOpen:hover, #autoOrderOpen:hover {border: 1px solid #aaa; text-decoration: none;}
.afterUploadActions a {color: #3C3C3C; font-weight: bold; background-color: #FFA646;}
.afterUploadActions a:hover {text-decoration: none; background-color: #ff7700;}
.font-checkbox {color: #898888;}
.font-checkbox:hover {color: #ffa646;}
.with-border legend, .with-border strong {color: #c0c0c0;}
.font-checkbox.selected {color: #ffa646;}
#formCreateAlbum input[name="virtual_name"] {border: 1px solid #7e7e7e; color: #F8F8F8; transition: all 125ms ease-out;}
#formCreateAlbum input[name="virtual_name"]:hover {border-color: #A5A5A5;}
LEGEND {color: #c1c1c1;}
a#showPermissions {color: #D6D6D6; border: 1px solid #D6D6D6; background-color: #414141;}