Merge pull request #11643 from atm-john/develop_new_dashboard

NEW dashboard for opened elements
This commit is contained in:
Laurent Destailleur 2019-08-18 01:27:03 +02:00 committed by GitHub
commit c4361c7737
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
26 changed files with 1370 additions and 229 deletions

View File

@ -2315,6 +2315,7 @@ class Adherent extends CommonObject
$response = new WorkboardResponse();
$response->warning_delay=$conf->adherent->subscription->warning_delay/60/60/24;
$response->label=$langs->trans("MembersWithSubscriptionToReceive");
$response->labelShort=$langs->trans("MembersWithSubscriptionToReceiveShort");
$response->url=DOL_URL_ROOT.'/adherents/list.php?mainmenu=members&statut=1&filter=outofdate';
$response->img=img_object('', "user");

View File

@ -1103,6 +1103,7 @@ class ActionComm extends CommonObject
$response = new WorkboardResponse();
$response->warning_delay = $conf->agenda->warning_delay/60/60/24;
$response->label = $langs->trans("ActionsToDo");
$response->labelShort = $langs->trans("ActionsToDoShort");
$response->url = DOL_URL_ROOT.'/comm/action/list.php?actioncode=0&status=todo&mainmenu=agenda';
if ($user->rights->agenda->allactions->read) $response->url.='&filtert=-1';
$response->img = img_object('', "action", 'class="inline-block valigntextmiddle"');

View File

@ -3268,21 +3268,24 @@ class Propal extends CommonObject
$delay_warning = 0;
$statut = 0;
$label = '';
$label = $labelShort = '';
if ($mode == 'opened') {
$delay_warning=$conf->propal->cloture->warning_delay;
$statut = self::STATUS_VALIDATED;
$label = $langs->trans("PropalsToClose");
$labelShort = $langs->trans("ToClose");
}
if ($mode == 'signed') {
$delay_warning=$conf->propal->facturation->warning_delay;
$statut = self::STATUS_SIGNED;
$label = $langs->trans("PropalsToBill"); // We set here bill but may be billed or ordered
$labelShort = $langs->trans("ToBill");
}
$response = new WorkboardResponse();
$response->warning_delay = $delay_warning/60/60/24;
$response->label = $label;
$response->labelShort = $labelShort;
$response->url = DOL_URL_ROOT.'/comm/propal/list.php?viewstatut='.$statut.'&mainmenu=commercial&leftmenu=propals';
$response->url_late = DOL_URL_ROOT.'/comm/propal/list.php?viewstatut='.$statut.'&mainmenu=commercial&leftmenu=propals&sortfield=p.datep&sortorder=asc';
$response->img = img_object('', "propal");

View File

@ -3412,6 +3412,7 @@ class Commande extends CommonOrder
$response = new WorkboardResponse();
$response->warning_delay=$conf->commande->client->warning_delay/60/60/24;
$response->label=$langs->trans("OrdersToProcess");
$response->labelShort = $langs->trans("ToProcess");
$response->url=DOL_URL_ROOT.'/commande/list.php?viewstatut=-3&mainmenu=commercial&leftmenu=orders';
$response->img=img_object('', "order");

View File

@ -3924,6 +3924,7 @@ class Facture extends CommonInvoice
$response = new WorkboardResponse();
$response->warning_delay=$conf->facture->client->warning_delay/60/60/24;
$response->label=$langs->trans("CustomerBillsUnpaid");
$response->labelShort=$langs->trans("Unpaid");
$response->url=DOL_URL_ROOT.'/compta/facture/list.php?search_status=1&mainmenu=billing&leftmenu=customers_bills';
$response->img=img_object('', "bill");

View File

@ -2186,23 +2186,27 @@ class Contrat extends CommonObject
if ($mode == 'inactive') {
$warning_delay = $conf->contrat->services->inactifs->warning_delay;
$label = $langs->trans("BoardNotActivatedServices");
$labelShort = $langs->trans("BoardNotActivatedServicesShort");
$url = DOL_URL_ROOT.'/contrat/services_list.php?mainmenu=commercial&leftmenu=contracts&mode=0&sortfield=cd.date_fin_validite&sortorder=asc';
}
elseif ($mode == 'expired') {
$warning_delay = $conf->contrat->services->expires->warning_delay;
$url = DOL_URL_ROOT.'/contrat/services_list.php?mainmenu=commercial&leftmenu=contracts&mode=4&filter=expired&sortfield=cd.date_fin_validite&sortorder=asc';
$label = $langs->trans("BoardExpiredServices");
$labelShort = $langs->trans("BoardExpiredServicesShort");
} else {
$warning_delay = $conf->contrat->services->expires->warning_delay;
$url = DOL_URL_ROOT.'/contrat/services_list.php?mainmenu=commercial&leftmenu=contracts&mode=4&sortfield=cd.date_fin_validite&sortorder=asc';
//$url.= '&op2day='.$arraydatetouse['mday'].'&op2month='.$arraydatetouse['mon'].'&op2year='.$arraydatetouse['year'];
//if ($warning_delay >= 0) $url.='&filter=expired';
$label = $langs->trans("BoardRunningServices");
$labelShort = $langs->trans("BoardRunningServicesShort");
}
$response = new WorkboardResponse();
$response->warning_delay = $warning_delay/60/60/24;
$response->label = $label;
$response->labelShort = $labelShort;
$response->url = $url;
$response->img = img_object('', "contract");

View File

@ -37,6 +37,18 @@ class WorkboardResponse
*/
public $label;
/**
* Short Label of the warning
* @var string
*/
public $labelShort;
/**
* infoKey of the warning
* @var string
*/
public $infoKey = 'todo';
/**
* URL to list to do items
* @var string

View File

@ -2333,12 +2333,14 @@ class ExpenseReport extends CommonObject
{
$response->warning_delay=$conf->expensereport->approve->warning_delay/60/60/24;
$response->label=$langs->trans("ExpenseReportsToApprove");
$response->labelShort=$langs->trans("ToApprove");
$response->url=DOL_URL_ROOT.'/expensereport/list.php?mainmenu=hrm&statut=2';
}
else
{
$response->warning_delay=$conf->expensereport->payment->warning_delay/60/60/24;
$response->label=$langs->trans("ExpenseReportsToPay");
$response->labelShort=$langs->trans("ToPay");
$response->url=DOL_URL_ROOT.'/expensereport/list.php?mainmenu=hrm&statut=5';
}
$response->img=img_object('', "trip");

View File

@ -2835,6 +2835,7 @@ class CommandeFournisseur extends CommonOrder
$response = new WorkboardResponse();
$response->warning_delay=$conf->commande->fournisseur->warning_delay/60/60/24;
$response->label=$langs->trans("SuppliersOrdersToProcess");
$response->labelShort=$langs->trans("ToProcess");
$response->url=DOL_URL_ROOT.'/fourn/commande/list.php?statut=1,2,3&mainmenu=commercial&leftmenu=orders_suppliers';
$response->img=img_object('', "order");

View File

@ -2203,6 +2203,7 @@ class FactureFournisseur extends CommonInvoice
$response = new WorkboardResponse();
$response->warning_delay=$conf->facture->fournisseur->warning_delay/60/60/24;
$response->label=$langs->trans("SupplierBillsToPay");
$response->labelShort=$langs->trans("ToPay");
$response->url=DOL_URL_ROOT.'/fourn/facture/list.php?search_status=1&mainmenu=billing&leftmenu=suppliers_bills';
$response->img=img_object($langs->trans("Bills"), "bill");

View File

@ -2228,6 +2228,7 @@ class Holiday extends CommonObject
$response = new WorkboardResponse();
$response->warning_delay=$conf->holiday->approve->warning_delay/60/60/24;
$response->label=$langs->trans("HolidaysToApprove");
$response->labelShort=$langs->trans("ToApprove");
$response->url=DOL_URL_ROOT.'/holiday/list.php?search_statut=2&mainmenu=hrm&leftmenu=holiday';
$response->img=img_object('', "holiday");

View File

@ -100,7 +100,7 @@ if (! empty($conf->global->MAIN_MOTD))
}
print '<div class="fichecenter"><div class="fichethirdleft">';
/*
@ -112,7 +112,7 @@ $boxstat='';
// Load translation files required by page
$langs->loadLangs(array('commercial', 'bills', 'orders', 'contracts'));
if (empty($user->societe_id))
if (empty($user->societe_id) && empty($conf->global->MAIN_DISABLE_GLOBAL_BOXSTATS))
{
$boxstat.='<div class="box">';
$boxstat.='<table summary="'.dol_escape_htmltag($langs->trans("DolibarrStateBoard")).'" class="noborder boxtable boxtablenobottom nohover" width="100%">';
@ -313,6 +313,7 @@ if (empty($user->societe_id))
// Loop and displays each line of table
$boardloaded=array();
foreach ($keys as $key=>$val)
{
if ($conditions[$key])
@ -359,9 +360,8 @@ if (empty($user->societe_id))
$boxstat.='</table>';
$boxstat.='</div>';
}
//print $boxstat;
print '</div><div class="fichetwothirdright"><div class="ficheaddleft">';
/*
@ -380,8 +380,7 @@ if (! empty($conf->agenda->enabled) && $user->rights->agenda->myactions->read)
{
include_once DOL_DOCUMENT_ROOT.'/comm/action/class/actioncomm.class.php';
$board=new ActionComm($db);
$dashboardlines[] = $board->load_board($user);
$dashboardlines[$board->element] = $board->load_board($user);
}
// Number of project opened
@ -389,7 +388,7 @@ if (! empty($conf->projet->enabled) && $user->rights->projet->lire)
{
include_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php';
$board=new Project($db);
$dashboardlines[] = $board->load_board($user);
$dashboardlines[$board->element] = $board->load_board($user);
}
// Number of tasks to do (late)
@ -397,7 +396,7 @@ if (! empty($conf->projet->enabled) && empty($conf->global->PROJECT_HIDE_TASKS)
{
include_once DOL_DOCUMENT_ROOT.'/projet/class/task.class.php';
$board=new Task($db);
$dashboardlines[] = $board->load_board($user);
$dashboardlines[$board->element] = $board->load_board($user);
}
// Number of commercial proposals opened (expired)
@ -405,9 +404,9 @@ if (! empty($conf->propal->enabled) && $user->rights->propale->lire)
{
include_once DOL_DOCUMENT_ROOT.'/comm/propal/class/propal.class.php';
$board=new Propal($db);
$dashboardlines[] = $board->load_board($user, "opened");
$dashboardlines[$board->element.'_opened'] = $board->load_board($user, "opened");
// Number of commercial proposals CLOSED signed (billed)
$dashboardlines[] = $board->load_board($user, "signed");
$dashboardlines[$board->element.'_signed'] = $board->load_board($user, "signed");
}
// Number of commercial proposals opened (expired)
@ -415,9 +414,9 @@ if (! empty($conf->supplier_proposal->enabled) && $user->rights->supplier_propos
{
include_once DOL_DOCUMENT_ROOT.'/supplier_proposal/class/supplier_proposal.class.php';
$board=new SupplierProposal($db);
$dashboardlines[] = $board->load_board($user, "opened");
$dashboardlines[$board->element.'_opened'] = $board->load_board($user, "opened");
// Number of commercial proposals CLOSED signed (billed)
$dashboardlines[] = $board->load_board($user, "signed");
$dashboardlines[$board->element.'_signed'] = $board->load_board($user, "signed");
}
// Number of customer orders a deal
@ -425,7 +424,7 @@ if (! empty($conf->commande->enabled) && $user->rights->commande->lire)
{
include_once DOL_DOCUMENT_ROOT.'/commande/class/commande.class.php';
$board=new Commande($db);
$dashboardlines[] = $board->load_board($user);
$dashboardlines[$board->element] = $board->load_board($user);
}
// Number of suppliers orders a deal
@ -433,7 +432,7 @@ if (! empty($conf->supplier_order->enabled) && $user->rights->fournisseur->comma
{
include_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.commande.class.php';
$board=new CommandeFournisseur($db);
$dashboardlines[] = $board->load_board($user);
$dashboardlines[$board->element] = $board->load_board($user);
}
// Number of services enabled (delayed)
@ -441,16 +440,16 @@ if (! empty($conf->contrat->enabled) && $user->rights->contrat->lire)
{
include_once DOL_DOCUMENT_ROOT.'/contrat/class/contrat.class.php';
$board=new Contrat($db);
$dashboardlines[] = $board->load_board($user, "inactive");
$dashboardlines[$board->element.'_inactive'] = $board->load_board($user, "inactive");
// Number of active services (expired)
$dashboardlines[] = $board->load_board($user, "active");
$dashboardlines[$board->element.'_active'] = $board->load_board($user, "active");
}
// Number of invoices customers (has paid)
if (! empty($conf->facture->enabled) && $user->rights->facture->lire)
{
include_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture.class.php';
$board=new Facture($db);
$dashboardlines[] = $board->load_board($user);
$dashboardlines[$board->element] = $board->load_board($user);
}
// Number of supplier invoices (has paid)
@ -458,7 +457,7 @@ if (! empty($conf->supplier_invoice->enabled) && ! empty($user->rights->fourniss
{
include_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.facture.class.php';
$board=new FactureFournisseur($db);
$dashboardlines[] = $board->load_board($user);
$dashboardlines[$board->element] = $board->load_board($user);
}
// Number of transactions to conciliate
@ -469,7 +468,7 @@ if (! empty($conf->banque->enabled) && $user->rights->banque->lire && ! $user->s
$nb = $board::countAccountToReconcile(); // Get nb of account to reconciliate
if ($nb > 0)
{
$dashboardlines[] = $board->load_board($user);
$dashboardlines[$board->element] = $board->load_board($user);
}
}
@ -478,7 +477,7 @@ if (! empty($conf->banque->enabled) && $user->rights->banque->lire && ! $user->s
{
include_once DOL_DOCUMENT_ROOT.'/compta/paiement/cheque/class/remisecheque.class.php';
$board=new RemiseCheque($db);
$dashboardlines[] = $board->load_board($user);
$dashboardlines['RemiseCheque'] = $board->load_board($user);
}
// Number of foundation members
@ -486,7 +485,7 @@ if (! empty($conf->adherent->enabled) && $user->rights->adherent->lire && ! $use
{
include_once DOL_DOCUMENT_ROOT.'/adherents/class/adherent.class.php';
$board=new Adherent($db);
$dashboardlines[] = $board->load_board($user);
$dashboardlines['Adherent'] = $board->load_board($user);
}
// Number of expense reports to approve
@ -494,7 +493,7 @@ if (! empty($conf->expensereport->enabled) && $user->rights->expensereport->appr
{
include_once DOL_DOCUMENT_ROOT.'/expensereport/class/expensereport.class.php';
$board=new ExpenseReport($db);
$dashboardlines[] = $board->load_board($user, 'toapprove');
$dashboardlines['ExpenseReport'] = $board->load_board($user, 'toapprove');
}
// Number of expense reports to pay
@ -502,7 +501,7 @@ if (! empty($conf->expensereport->enabled) && $user->rights->expensereport->to_p
{
include_once DOL_DOCUMENT_ROOT.'/expensereport/class/expensereport.class.php';
$board=new ExpenseReport($db);
$dashboardlines[] = $board->load_board($user, 'topay');
$dashboardlines['ExpenseReport'] = $board->load_board($user, 'topay');
}
// Number of holidays to approve
@ -510,7 +509,7 @@ if (! empty($conf->holiday->enabled) && $user->rights->holiday->approve)
{
include_once DOL_DOCUMENT_ROOT.'/holiday/class/holiday.class.php';
$board=new Holiday($db);
$dashboardlines[] = $board->load_board($user);
$dashboardlines['Holiday'] = $board->load_board($user);
}
$object=new stdClass();
@ -521,28 +520,134 @@ if ($reshook == 0) {
$dashboardlines = array_merge($dashboardlines, $hookmanager->resArray);
}
/* grouping dashboard stats */
$dashboardgroup = array (
'action' =>
array (
'groupName' => 'Agenda',
'stats' => array ('action'),
),
'project' =>
array (
'groupName' => 'Projects',
'stats' => array ('project','project_task'),
),
'propal' =>
array (
'groupName' => 'Proposals',
'stats' =>
array ('propal_opened','propal_signed'),
),
'supplier_proposal' =>
array (
'groupName' => 'SupplierProposals',
'stats' =>
array ('supplier_proposal_opened','supplier_proposal_signed'),
),
'commande' =>
array (
'groupName' => 'Orders',
'stats' =>
array ('commande'),
),
'order_supplier' =>
array (
'groupName' => 'SuppliersOrders',
'stats' =>
array ('order_supplier'),
),
'contrat' =>
array (
'groupName' => 'Contracts',
'stats' =>
array ('contrat_inactive','contrat_active'),
),
'facture' =>
array (
'groupName' => 'Invoices',
'stats' =>
array ('facture'),
),
'invoice_supplier' =>
array (
'groupName' => 'BillsSuppliers',
'stats' =>
array ('invoice_supplier'),
),
'bank_account' =>
array (
'groupName' => 'BankAccount',
'stats' =>
array ('bank_account','RemiseCheque'),
),
/*'RemiseCheque' =>
array (
'groupName' => 'BankChecks',
'stats' =>
array ('RemiseCheque'),
),*/
'Adherent' =>
array (
'groupName' => 'Members',
'stats' =>
array ('Adherent'),
),
'ExpenseReport' =>
array (
'groupName' => 'ExpenseReport',
'stats' =>
array ('ExpenseReport'),
),
'Holiday' =>
array (
'groupName' => 'Holidays',
'stats' =>
array ('Holiday'),
),
);
$object=new stdClass();
$parameters=array(
'dashboardgroup' => $dashboardgroup
);
$reshook=$hookmanager->executeHooks('addOpenElementsDashboardGroup', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
if ($reshook == 0) {
$dashboardgroup = array_merge($dashboardgroup, $hookmanager->resArray);
}
// Calculate total nb of late
$totallate=$totaltodo=0;
//Remove any invalid response
//load_board can return an integer if failed or WorkboardResponse if OK
$valid_dashboardlines=array();
foreach($dashboardlines as $tmp)
foreach($dashboardlines as $infoKey => $tmp)
{
if ($tmp instanceof WorkboardResponse) $valid_dashboardlines[] = $tmp;
if ($tmp instanceof WorkboardResponse) $valid_dashboardlines[$infoKey] = $tmp;
}
// We calculate $totallate. Must be defined before start of next loop because it is show in first fetch on next loop
foreach($valid_dashboardlines as $board)
{
if ($board->nbtodolate > 0) {
if(!empty($conf->global->MAIN_USE_METEO_WITH_PERCENTAGE)) $totaltodo += $board->nbtodo;
$totaltodo += $board->nbtodo;
$totallate += $board->nbtodolate;
}
}
//var_dump($totallate, $totaltodo);
if(!empty($conf->global->MAIN_USE_METEO_WITH_PERCENTAGE) && !empty($totaltodo)) $totallate = round($totallate / $totaltodo * 100, 2);
//var_dump($totallate);
$openedDashBoardSize = 'info-box-sm'; // use sm by default
foreach ($dashboardgroup as $dashbordelement){
if(is_array($dashbordelement['stats']) && count($dashbordelement['stats'])>2){
$openedDashBoardSize = ''; // use default info box size : big
break;
}
}
$totalLateNumber = $totallate;
$totallatePercentage = !empty($totaltodo) ? round($totallate / $totaltodo * 100, 2) : 0;
if(!empty($conf->global->MAIN_USE_METEO_WITH_PERCENTAGE)) $totallate = $totallatePercentage;
$boxwork='';
$boxwork.='<div class="box">';
$boxwork.='<table summary="'.dol_escape_htmltag($langs->trans("WorkingBoard")).'" class="noborder boxtable boxtablenobottom boxworkingboard" width="100%">'."\n";
@ -577,23 +682,144 @@ $boxwork.='</tr>'."\n";
// Show dashboard
$nbworkboardempty=0;
if (! empty($valid_dashboardlines))
$isIntopOpenedDashBoard = array();
if (!empty($valid_dashboardlines))
{
$openedDashBoard = '';
$boxwork.='<tr class="nobottom nohover"><td class="tdboxstats nohover flexcontainer centpercent"><div style="display: flex: flex-wrap: wrap">';
foreach($valid_dashboardlines as $board)
foreach($dashboardgroup as $groupKey => $groupElement) {
$boards = array();
if(!empty($conf->global->MAIN_DISPLAY_NEW_OPENED_DASH_BOARD) || !empty($conf->global->MAIN_FEATURES_LEVEL))
{
foreach ($groupElement['stats'] as $infoKey)
{
if(!empty($valid_dashboardlines[$infoKey]))
{
$boards[] = $valid_dashboardlines[$infoKey];
$isIntopOpenedDashBoard[]=$infoKey;
}
}
}
if(!empty($boards))
{
$groupName = $langs->trans($groupElement['groupName']);
$groupKeyLowerCase = strtolower($groupKey);
$openedDashBoard.= '<div class="box-flex-item">'."\n";
$openedDashBoard.= ' <div class="info-box '.$openedDashBoardSize.'">'."\n";
$openedDashBoard.= ' <span class="info-box-icon bg-infoxbox-'.$groupKeyLowerCase.'"><i class="fa fa-dol-'.$groupKeyLowerCase.'"></i></span>'."\n";
$openedDashBoard.= ' <div class="info-box-content">'."\n";
$openedDashBoard .= ' <span class="info-box-title" title="'.strip_tags($groupName).'">'.$groupName.'</span>' . "\n";
foreach($boards as $board) {
if(!empty($board->labelShort)){
$infoName = '<span title="'.$board->label.'">'.$board->labelShort.'</span>';
}
else{
$infoName = $board->label ;
}
$textLateTitle = $langs->trans("NActionsLate", $board->nbtodolate);
$textLateTitle.= ' ('.$langs->trans("Late").' = '.$langs->trans("DateReference").' > '.$langs->trans("DateToday").' '.(ceil($board->warning_delay) >= 0 ? '+' : '').ceil($board->warning_delay).' '.$langs->trans("days").')';
$textLate = '';
if($board->nbtodolate>0)
{
$textLate .= ' <span title="'.dol_htmlentities($textLateTitle).'" class="classfortooltip badge badge-danger">';
$textLate .= '<i class="fa fa-exclamation-triangle"></i> '.$board->nbtodolate;
$textLate .= '</span>';
}
$nbtodClass = '';
if($board->nbtodo>0){
$nbtodClass = 'badge badge-info';
}
$openedDashBoard .= ' <a href="'.$board->url.'" class="info-box-text">'.$infoName.' : <span class="'.$nbtodClass.' classfortooltip" title="'.$board->label.'" >'.$board->nbtodo.'</span>'.$textLate.'</a>' . "\n";
if ($board->total > 0 && ! empty($conf->global->MAIN_WORKBOARD_SHOW_TOTAL_WO_TAX)){
$openedDashBoard .= '<a href="'.$board->url.'" class="info-box-text">'.$langs->trans('Total').' : '.price($board->total) .'</a>';
}
}
$openedDashBoard.= ' </div><!-- /.info-box-content -->'."\n";
$openedDashBoard.= ' </div><!-- /.info-box -->'."\n";
$openedDashBoard.= '</div><!-- /.box-flex-item -->'."\n";
$openedDashBoard.="\n";
}
}
if ($showweather && !empty($isIntopOpenedDashBoard))
{
$appendClass = $conf->global->MAIN_DISABLE_METEO == 2 ?' hideonsmartphone' : '';
$weather = getWeatherStatus($totallate);
$text='';
if ($totallate > 0) $text=$langs->transnoentitiesnoconv("WarningYouHaveAtLeastOneTaskLate").' ('.$langs->transnoentitiesnoconv("NActionsLate", $totallate.(!empty($conf->global->MAIN_USE_METEO_WITH_PERCENTAGE) ? '%' : '')).')';
else $text=$langs->transnoentitiesnoconv("NoItemLate");
$text.='. '.$langs->transnoentitiesnoconv("LateDesc");
$weatherDashBoard= '<div class="box-flex-item '.$appendClass.'">'."\n";
$weatherDashBoard.= ' <div class="info-box '.$openedDashBoardSize.' info-box-weather info-box-weather-level'.$weather->level.'">'."\n";
$weatherDashBoard.= ' <span class="info-box-icon"><i class="fa fa-weather-level'.$weather->level.'"></i></span>'."\n";
$weatherDashBoard.= ' <div class="info-box-content">'."\n";
$weatherDashBoard.= ' <span class="info-box-title">'.$langs->trans('GlobalOpenedElemView').'</span>' . "\n";
if($totallatePercentage>0 && !empty($conf->global->MAIN_USE_METEO_WITH_PERCENTAGE)){
$weatherDashBoard.= ' <span class="info-box-number">'.$langs->transnoentitiesnoconv("NActionsLate", price($totallatePercentage).'%').'</span>' . "\n";
$weatherDashBoard.= ' <span class="progress-description">'.$langs->trans('NActionsLate', $totalLateNumber).'</span>' . "\n";
}
else{
$weatherDashBoard.= ' <span class="info-box-number">'.$langs->transnoentitiesnoconv("NActionsLate", $totalLateNumber).'</span>' . "\n";
if($totallatePercentage>0){
$weatherDashBoard.= ' <span class="progress-description">'.$langs->trans('NActionsLate', price($totallatePercentage).'%').'</span>' . "\n";
}
}
$weatherDashBoard.= ' </div><!-- /.info-box-content -->'."\n";
$weatherDashBoard.= ' </div><!-- /.info-box -->'."\n";
$weatherDashBoard.= '</div><!-- /.box-flex-item -->'."\n";
$weatherDashBoard.="\n";
$openedDashBoard=$weatherDashBoard.$openedDashBoard;
}
if(!empty($isIntopOpenedDashBoard))
{
for ($i = 1; $i <= 10; $i++) {
$openedDashBoard .= '<div class="box-flex-item filler"></div>';
}
}
$nbworkboardcount=0;
foreach($valid_dashboardlines as $infoKey => $board)
{
if (empty($board->nbtodo)) $nbworkboardempty++;
if(in_array($infoKey, $isIntopOpenedDashBoard)) {
// skip if info is present on top
continue;
}
$textlate = $langs->trans("NActionsLate", $board->nbtodolate);
$textlate.= ' ('.$langs->trans("Late").' = '.$langs->trans("DateReference").' > '.$langs->trans("DateToday").' '.(ceil($board->warning_delay) >= 0 ? '+' : '').ceil($board->warning_delay).' '.$langs->trans("days").')';
if (empty($board->nbtodo)) $nbworkboardempty++;
$nbworkboardcount++;
$boxwork .='<div class="boxstatsindicator thumbstat150 nobold nounderline"><div class="boxstats130 boxstatsborder">';
$textlate = $langs->trans("NActionsLate", $board->nbtodolate);
$textlate.= ' ('.$langs->trans("Late").' = '.$langs->trans("DateReference").' > '.$langs->trans("DateToday").' '.(ceil($board->warning_delay) >= 0 ? '+' : '').ceil($board->warning_delay).' '.$langs->trans("days").')';
$boxwork .='<div class="boxstatsindicator thumbstat150 nobold nounderline"><div class="boxstats130 boxstatsborder">';
$boxwork .= '<div class="boxstatscontent">';
$sep=($conf->dol_use_jmobile?'<br>':' ');
$boxwork .= '<span class="boxstatstext" title="'.dol_escape_htmltag($board->label).'">'.$board->img.' '.$board->label.'</span><br>';
$boxwork .= '<a class="valignmiddle dashboardlineindicator" href="'.$board->url.'"><span class="dashboardlineindicator'.(($board->nbtodo == 0)?' dashboardlineok':'').'">'.$board->nbtodo.'</span></a>';
if ($board->total > 0 && ! empty($conf->global->MAIN_WORKBOARD_SHOW_TOTAL_WO_TAX))
if ($board->total > 0 && !empty($conf->global->MAIN_WORKBOARD_SHOW_TOTAL_WO_TAX))
{
$boxwork .= '&nbsp;/&nbsp;<a class="valignmiddle dashboardlineindicator" href="'.$board->url.'"><span class="dashboardlineindicator'.(($board->nbtodo == 0)?' dashboardlineok':'').'">'.price($board->total) .'</span></a>';
}
@ -636,7 +862,14 @@ $boxwork.='</td></tr>';
$boxwork.='</table>'; // End table array of working board
$boxwork.='</div>';
print '</div></div></div><div class="clearboth"></div>';
if(!empty($isIntopOpenedDashBoard)) {
print '<div class="fichecenter">';
print '<div class="opened-dash-board-wrap"><div class="box-flex-container">' . $openedDashBoard . '</div></div>';
print '</div>';
}
print '<div class="clearboth"></div>';
print '<div class="fichecenter fichecenterbis">';
@ -648,8 +881,11 @@ print '<div class="fichecenter fichecenterbis">';
$boxlist.='<div class="twocolumns">';
$boxlist.='<div class="firstcolumn fichehalfleft boxhalfleft" id="boxhalfleft">';
if(!empty($nbworkboardcount))
{
$boxlist.=$boxwork;
}
$boxlist.=$boxwork;
$boxlist.=$resultboxes['boxlista'];
$boxlist.= '</div>';
@ -726,33 +962,68 @@ function showWeather($totallate, $text, $options, $morecss = '')
{
global $conf;
$out='';
$offset=0;
$factor=10; // By default
$used_conf = !empty($conf->global->MAIN_USE_METEO_WITH_PERCENTAGE) ? 'MAIN_METEO_PERCENTAGE_LEVEL' : 'MAIN_METEO_LEVEL';
$level0=$offset;
if (! empty($conf->global->{$used_conf.'0'})) {
$level0=$conf->global->{$used_conf.'0'};
}
$level1=$offset+1*$factor;
if (! empty($conf->global->{$used_conf.'1'})) {
$level1=$conf->global->{$used_conf.'1'};
}
$level2=$offset+2*$factor;
if (! empty($conf->global->{$used_conf.'2'})) {
$level2=$conf->global->{$used_conf.'2'};
}
$level3=$offset+3*$factor;
if (! empty($conf->global->{$used_conf.'3'})) {
$level3=$conf->global->{$used_conf.'3'};
}
if ($totallate <= $level0) $out.=img_weather($text, 'weather-clear.png', $options, 0, $morecss);
elseif ($totallate > $level0 && $totallate <= $level1) $out.=img_weather($text, 'weather-few-clouds.png', $options, 0, $morecss);
elseif ($totallate > $level1 && $totallate <= $level2) $out.=img_weather($text, 'weather-clouds.png', $options, 0, $morecss);
elseif ($totallate > $level2 && $totallate <= $level3) $out.=img_weather($text, 'weather-many-clouds.png', $options, 0, $morecss);
elseif ($totallate > $level3) $out.=img_weather($text, 'weather-storm.png', $options, 0, $morecss);
return $out;
$weather = getWeatherStatus($totallate);
return img_weather($text, $weather->picto, $options, 0, $morecss);
}
/**
* get weather level
* $conf->global->MAIN_METEO_LEVELx
*
* @param int $totallate Nb of element late
* @return string Return img tag of weather
*/
function getWeatherStatus($totallate)
{
global $conf;
$weather = new stdClass();
$weather->picto = '';
$offset=0;
$factor=10; // By default
$used_conf = !empty($conf->global->MAIN_USE_METEO_WITH_PERCENTAGE) ? 'MAIN_METEO_PERCENTAGE_LEVEL' : 'MAIN_METEO_LEVEL';
$level0=$offset;
$weather->level=0;
if (! empty($conf->global->{$used_conf.'0'})) {
$level0=$conf->global->{$used_conf.'0'};
}
$level1=$offset+1*$factor;
if (! empty($conf->global->{$used_conf.'1'})) {
$level1=$conf->global->{$used_conf.'1'};
}
$level2=$offset+2*$factor;
if (! empty($conf->global->{$used_conf.'2'})) {
$level2=$conf->global->{$used_conf.'2'};
}
$level3=$offset+3*$factor;
if (! empty($conf->global->{$used_conf.'3'})) {
$level3=$conf->global->{$used_conf.'3'};
}
if ($totallate <= $level0){
$weather->picto = 'weather-clear.png';
$weather->level=0;
}
elseif ($totallate <= $level1){
$weather->picto = 'weather-few-clouds.png';
$weather->level=1;
}
elseif ($totallate <= $level2){
$weather->picto = 'weather-clouds.png';
$weather->level=2;
}
elseif ($totallate <= $level3){
$weather->picto = 'weather-many-clouds.png';
$weather->level=3;
}
else{
$weather->picto = 'weather-storm.png';
$weather->level=4;
}
return $weather;
}

View File

@ -51,6 +51,7 @@ ListOfClosedServices=List of closed services
ListOfRunningServices=List of running services
NotActivatedServices=Inactive services (among validated contracts)
BoardNotActivatedServices=Services to activate among validated contracts
BoardNotActivatedServicesShort=Services to activate
LastContracts=Latest %s contracts
LastModifiedServices=Latest %s modified services
ContractStartDate=Start date
@ -65,7 +66,9 @@ DateEndReal=Real end date
DateEndRealShort=Real end date
CloseService=Close service
BoardRunningServices=Services running
BoardRunningServicesShort=Services running
BoardExpiredServices=Services expired
BoardExpiredServicesShort=Services expired
ServiceStatus=Status of service
DraftContracts=Drafts contracts
CloseRefusedBecauseOneServiceActive=Contract can't be closed as there is at least one open service on it

View File

@ -983,5 +983,9 @@ PaymentInformation=Payment information
ValidFrom=Valid from
ValidUntil=Valid until
NoRecordedUsers=No users
ToClose=To close
ToProcess=To process
ToApprove=To approve
GlobalOpenedElemView=Global view
NoArticlesFoundForTheKeyword=No article found for the keyword '<strong>%s</strong>'
NoArticlesFoundForTheCategory=No article found for the category
NoArticlesFoundForTheCategory=No article found for the category

View File

@ -29,6 +29,7 @@ MenuMembersUpToDate=Up to date members
MenuMembersNotUpToDate=Out of date members
MenuMembersResiliated=Terminated members
MembersWithSubscriptionToReceive=Members with subscription to receive
MembersWithSubscriptionToReceiveShort=Subscription to receive
DateSubscription=Subscription date
DateEndSubscription=Subscription end date
EndSubscription=End subscription

View File

@ -1796,6 +1796,7 @@ class Project extends CommonObject
$response = new WorkboardResponse();
$response->warning_delay = $conf->projet->warning_delay/60/60/24;
$response->label = $langs->trans("OpenedProjects");
$response->labelShort = $langs->trans("Opened");
if ($user->rights->projet->all->lire) $response->url = DOL_URL_ROOT.'/projet/list.php?search_status=1&mainmenu=project';
else $response->url = DOL_URL_ROOT.'/projet/list.php?search_project_user=-1&search_status=1&mainmenu=project';
$response->img = img_object('', "projectpub");

View File

@ -2274,20 +2274,24 @@ class SupplierProposal extends CommonObject
$resql=$this->db->query($sql);
if ($resql)
{
$label = $labelShort = '';
if ($mode == 'opened') {
$delay_warning=$conf->supplier_proposal->cloture->warning_delay;
$statut = self::STATUS_VALIDATED;
$label = $langs->trans("SupplierProposalsToClose");
$labelShort = $langs->trans("ToClose");
}
if ($mode == 'signed') {
$delay_warning=$conf->supplier_proposal->facturation->warning_delay;
$statut = self::STATUS_SIGNED;
$label = $langs->trans("SupplierProposalsToProcess"); // May be billed or ordered
$labelShort = $langs->trans("ToProcess");
}
$response = new WorkboardResponse();
$response->warning_delay = $delay_warning/60/60/24;
$response->label = $label;
$response->labelShort = $labelShort;
$response->url = DOL_URL_ROOT.'/supplier_proposal/list.php?viewstatut='.$statut;
$response->img = img_object('', "propal");

View File

@ -3206,7 +3206,13 @@ span.boxstatsindicator {
font-size: 130%;
font-weight: normal;
line-height: 29px;
flex-grow: 1;
}
span.dashboardlineindicator, span.dashboardlineindicatorlate {
font-size: 130%;
font-weight: normal;
@ -5758,3 +5764,5 @@ div.tabsElem a.tab {
<?php
include dol_buildpath($path.'/theme/'.$theme.'/dropdown.inc.php', 0);
include dol_buildpath($path.'/theme/'.$theme.'/info-box.inc.php', 0);

Binary file not shown.

After

Width:  |  Height:  |  Size: 570 B

View File

@ -0,0 +1,268 @@
<?php
if (! defined('ISLOADEDBYSTEELSHEET'))  die('Must be call by steelsheet'); ?>
/* <style type="text/css" > */
/*
* Component: Info Box
* -------------------
*/
.info-box {
display: block;
min-height: 90px;
background: #fff;
width: 100%;
box-shadow: 1px 1px 4px rgba(0, 0, 0, 0.2), 0px 0px 2px rgba(0, 0, 0, 0.1);
border-radius: 2px;
margin-bottom: 15px;
}
.info-box.info-box-sm{
min-height: 70px;
margin-bottom: 10px;
}
.info-box small {
font-size: 14px;
}
.info-box .progress {
background: rgba(0, 0, 0, 0.2);
margin: 5px -10px 5px -10px;
height: 2px;
}
.info-box .progress,
.info-box .progress .progress-bar {
border-radius: 0;
}
.info-box .progress .progress-bar {
float: left;
width: 0;
height: 100%;
font-size: 12px;
line-height: 20px;
color: #fff;
text-align: center;
background-color: #337ab7;
-webkit-box-shadow: inset 0 -1px 0 rgba(0,0,0,.15);
box-shadow: inset 0 -1px 0 rgba(0,0,0,.15);
-webkit-transition: width .6s ease;
-o-transition: width .6s ease;
transition: width .6s ease;
}
.info-box-icon {
border-top-left-radius: 2px;
border-top-right-radius: 0;
border-bottom-right-radius: 0;
border-bottom-left-radius: 2px;
display: block;
float: left;
height: 90px;
width: 90px;
text-align: center;
font-size: 45px;
line-height: 90px;
background: rgba(0, 0, 0, 0.2);
}
.info-box-sm .info-box-icon{
height: 70px;
width: 70px;
font-size: 25px;
line-height: 70px;
}
.info-box-icon > img {
max-width: 100%;
}
.info-box-content {
padding: 5px 10px;
margin-left: 90px;
}
.info-box-sm .info-box-content{
margin-left: 70px;
}
.info-box-number {
display: block;
font-weight: bold;
font-size: 18px;
}
.progress-description,
.info-box-text,
.info-box-title{
display: block;
font-size: 12px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.info-box-title{
text-transform: uppercase;
font-weight: bold;
}
.info-box-text:first-letter{text-transform: uppercase}
a.info-box-text{ text-decoration: none;}
.info-box-more {
display: block;
}
.progress-description {
margin: 0;
}
/* ICONS */
.info-box-icon {
color: #fff !important;
}
.bg-infoxbox-project{
background-color: #605ca8 !important;
}
.bg-infoxbox-action{
background-color: #d81b60 !important;
}
.bg-infoxbox-propal,
.bg-infoxbox-facture,
.bg-infoxbox-commande{
background-color: #dd4b39 !important;
}
.bg-infoxbox-supplier_proposal,
.bg-infoxbox-invoice_supplier,
.bg-infoxbox-order_supplier{
background-color: #00c0ef !important;
}
.bg-infoxbox-contrat{
background-color: #00a65a !important;
}
.bg-infoxbox-bank_account{
background-color: #f39c12 !important;
}
.bg-infoxbox-adherent{
//background-color: #f39c12 !important;
}
.bg-infoxbox-expensereport{
background-color: #a55114 !important;
}
.bg-infoxbox-holiday{
background-color: #cbd81b !important;
}
.fa-dol-action:before {
content: "\f073";
}
.fa-dol-propal:before,
.fa-dol-supplier_proposal:before {
content: "\f2b5";
}
.fa-dol-facture:before,
.fa-dol-invoice_supplier:before {
content: "\f571";
}
.fa-dol-project:before {
content: "\f0e8";
}
.fa-dol-commande:before,
.fa-dol-order_supplier:before {
content: "\f570";
}
.fa-dol-contrat:before {
content: "\f1e6";
}
.fa-dol-bank_account:before {
content: "\f19c";
}
.fa-dol-adherent:before {
content: "\f0c0";
}
.fa-dol-expensereport:before {
content: "\f555";
}
.fa-dol-holiday:before {
content: "\f5ca";
}
/* USING FONTAWESOME FOR WEATHER */
.info-box-weather .info-box-icon{
background: rgba(0, 0, 0, 0); !important;
}
.fa-weather-level0:before{
content: "\f185";
color : #cccccc;
}
.fa-weather-level1:before{
content: "\f6c4";
color : #cccccc;
}
.fa-weather-level2:before{
content: "\f0c2";
color : #cccccc;
}
.fa-weather-level3:before{
content: "\f740";
color : #cccccc;
}
.fa-weather-level4:before{
content: "\f0e7";
color : #b91f1f;
}
/* USING IMAGES FOR WEATHER INTEAD OF FONT AWESOME */
/* For other themes just uncomment this part */
/*.info-box-weather-level0,
.info-box-weather-level1,
.info-box-weather-level2,
.info-box-weather-level3,
.info-box-weather-level4 {
background-position: 15px 50%;
background-repeat: no-repeat;
}
.info-box-weather .info-box-icon{
display: none !important;
}
.info-box-weather-level0 {
background-image: url("img/weather/weather-clear.png");
}
.info-box-weather-level1 {
background-image: url("img/weather/weather-few-clouds.png");
}
.info-box-weather-level2 {
background-image: url("img/weather/weather-clouds.png");
}
.info-box-weather-level3 {
background-image: url("img/weather/weather-many-clouds.png");
}
.info-box-weather-level4 {
background-image: url("img/weather/weather-storm.png");
}*/
.box-flex-container{
display: flex; /* or inline-flex */
flex-direction: row;
flex-wrap: wrap;
width: 100%;
margin: 0 0 0 -15px;
/*justify-content: space-between;*/
}
.box-flex-item{
flex-grow : 1;
flex-shrink: 1;
flex-basis: auto;
width: 280px;
margin: 5px 0px 0px 15px;
}
.box-flex-item.filler{
margin: 0px 0px 0px 15px !important;
height: 0;
}
.box{
overflow: visible;
}

View File

@ -0,0 +1,204 @@
<?php
if (! defined('ISLOADEDBYSTEELSHEET')) die('Must be call by steelsheet'); ?>
/* <style type="text/css" > */
/*
Badge style is based on boostrap framework
*/
.badge {
display: inline-block;
padding: .1em .35em;
font-size: 80%;
font-weight: 700 !important;
line-height: 1;
text-align: center;
white-space: nowrap;
vertical-align: baseline;
border-radius: .25rem;
transition: color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;
border-width: 2px;
border-style: solid;
border-color: rgba(255,255,255,0);
box-sizing: border-box;
}
/* Themes for badges */
.badge-pill, .tabs .badge {
padding-right: .5em;
padding-left: .5em;
border-radius: 0.25rem;
}
.badge-dot {
padding: 0;
border-radius: 50%;
padding: 0.25rem;
vertical-align: middle;
}
a.badge:focus, a.badge:hover {
text-decoration: none;
}
.liste_titre .badge {
background-color: <?php print $badgeSecondary; ?>;
color: #fff;
}
/* PRIMARY */
.badge-primary{
color: #fff !important;
background-color: <?php print $badgePrimary; ?>;
}
a.badge-primary.focus, a.badge-primary:focus {
outline: 0;
box-shadow: 0 0 0 0.2rem <?php print colorHexToRgb($badgePrimary, 0.5); ?>;
}
a.badge-primary:focus, a.badge-primary:hover {
color: #fff !important;
background-color: <?php print colorDarker($badgePrimary, 10); ?>;
}
/* SECONDARY */
.badge-secondary, .tabs .badge {
color: #fff !important;
background-color: <?php print $badgeSecondary; ?>;
}
a.badge-secondary.focus, a.badge-secondary:focus {
outline: 0;
box-shadow: 0 0 0 0.2rem <?php print colorHexToRgb($badgeSecondary, 0.5); ?>;
}
a.badge-secondary:focus, a.badge-secondary:hover {
color: #fff !important;
background-color: <?php print colorDarker($badgeSecondary, 10); ?>;
}
/* SUCCESS */
.badge-success {
color: #fff !important;
background-color: <?php print $badgeSuccess; ?>;
}
a.badge-success.focus, a.badge-success:focus {
outline: 0;
box-shadow: 0 0 0 0.2rem <?php print colorHexToRgb($badgeSuccess, 0.5); ?>;
}
a.badge-success:focus, a.badge-success:hover {
color: #fff !important;
background-color: <?php print colorDarker($badgeSuccess, 10); ?>;
}
/* DANGER */
.badge-danger {
color: #fff !important;
background-color: <?php print $badgeDanger; ?>;
}
a.badge-danger.focus, a.badge-danger:focus {
outline: 0;
box-shadow: 0 0 0 0.2rem <?php print colorHexToRgb($badgeDanger, 0.5); ?>;
}
a.badge-danger:focus, a.badge-danger:hover {
color: #fff !important;
background-color: <?php print colorDarker($badgeDanger, 10); ?>;
}
/* WARNING */
.badge-warning {
color: #212529 !important;
background-color: <?php print $badgeWarning; ?>;
}
a.badge-warning.focus, a.badge-warning:focus {
outline: 0;
box-shadow: 0 0 0 0.2rem <?php print colorHexToRgb($badgeWarning, 0.5); ?>;
}
a.badge-warning:focus, a.badge-warning:hover {
color: #212529 !important;
background-color: <?php print colorDarker($badgeWarning, 10); ?>;
}
/* INFO */
.badge-info {
color: #fff !important;
background-color: <?php print $badgeInfo; ?>;
}
a.badge-info.focus, a.badge-info:focus {
outline: 0;
box-shadow: 0 0 0 0.2rem <?php print colorHexToRgb($badgeInfo, 0.5); ?>;
}
a.badge-info:focus, a.badge-info:hover {
color: #fff !important;
background-color: <?php print colorDarker($badgeInfo, 10); ?>;
}
/* LIGHT */
.badge-light {
color: #212529 !important;
background-color: <?php print $badgeLight; ?>;
}
a.badge-light.focus, a.badge-light:focus {
outline: 0;
box-shadow: 0 0 0 0.2rem <?php print colorHexToRgb($badgeLight, 0.5); ?>;
}
a.badge-light:focus, a.badge-light:hover {
color: #212529 !important;
background-color: <?php print colorDarker($badgeLight, 10); ?>;
}
/* DARK */
.badge-dark {
color: #fff !important;
background-color: <?php print $badgeDark; ?>;
}
a.badge-dark.focus, a.badge-dark:focus {
outline: 0;
box-shadow: 0 0 0 0.2rem <?php print colorHexToRgb($badgeDark, 0.5); ?>;
}
a.badge-dark:focus, a.badge-dark:hover {
color: #fff !important;
background-color: <?php print colorDarker($badgeDark, 10); ?>;
}
/*
* STATUS BADGES
*/
/* Default Status */
<?php for ($i = 0; $i <= 9; $i++){
print "\n/* STATUS".$i." */\n";
$thisBadgeBackgroundColor = $thisBadgeBorderColor = ${'badgeStatus'.$i};
$TBadgeBorderOnly = array(0,3,5,7);
$thisBadgeTextColor = colorIsLight(${'badgeStatus'.$i})?'#212529':'#ffffff';
if(in_array($i, $TBadgeBorderOnly)){
$thisBadgeTextColor = '#212529';
$thisBadgeBackgroundColor = "#fff";
}
print ".badge-status".$i." {\n";
print " color: ".$thisBadgeTextColor." !important;\n";
if(in_array($i, $TBadgeBorderOnly)){
print " border-color: ".$thisBadgeBorderColor.";\n";
}
print " background-color: ".$thisBadgeBackgroundColor.";\n";
print "}\n";
print ".badge-status".$i.".focus, .badge-status".$i.":focus {\n";
print " outline: 0;\n";
print " box-shadow: 0 0 0 0.2rem ".colorHexToRgb($thisBadgeBackgroundColor, 0.5).";\n";
print "}\n";
print ".badge-status".$i.":focus, .badge-status".$i.":hover {\n";
print " color: ".$thisBadgeTextColor." !important;\n";
print " background-color: ".colorDarker($thisBadgeBackgroundColor, 10).";\n";
if(in_array($i, $TBadgeBorderOnly)){
print " border-color: ".colorDarker($thisBadgeBorderColor, 10).";\n";
}
print "}\n";
}

235
htdocs/theme/md/btn.inc.php Normal file
View File

@ -0,0 +1,235 @@
<?php
if (! defined('ISLOADEDBYSTEELSHEET')) die('Must be call by steelsheet'); ?>
/* <style type="text/css" > */
/* ============================================================================== */
/* Buttons for actions */
/* ============================================================================== */
div.divButAction {
margin-bottom: 1.4em;
vertical-align: top;
}
div.tabsAction > a.butAction, div.tabsAction > a.butActionRefused {
margin-bottom: 1.4em !important;
}
span.butAction, span.butActionDelete {
cursor: pointer;
}
.button, .butAction, .butActionDelete, .butActionRefused, .butActionNewRefused {
border-color: rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.25);
display: inline-block;
padding: 0.4em <?php echo ($dol_optimize_smallscreen?'0.4':'0.7'); ?>em;
margin: 0em <?php echo ($dol_optimize_smallscreen?'0.7':'0.9'); ?>em;
line-height: 20px;
text-align: center;
vertical-align: middle;
cursor: pointer;
color: #333333 !important;
text-decoration: none !important;
text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75);
background-color: #f5f5f5;
background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6);
background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6));
background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6);
background-image: -o-linear-gradient(top, #ffffff, #e6e6e6);
background-image: linear-gradient(to bottom, #ffffff, #e6e6e6);
background-repeat: repeat-x;
border-color: #e6e6e6 #e6e6e6 #bfbfbf;
border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
border: 1px solid #bbbbbb;
border-bottom-color: #a2a2a2;
-webkit-border-radius: 2px;
border-radius: 2px;
-webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
}
.butActionNew, .butActionNewRefused, .butActionNew:link, .butActionNew:visited, .butActionNew:hover, .butActionNew:active {
text-decoration: none;
/* border-color: rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.25); */
display: inline-block;
padding: 0.2em <?php echo ($dol_optimize_smallscreen?'0.4':'0.7'); ?>em;
margin: 0em <?php echo ($dol_optimize_smallscreen?'0.7':'0.9'); ?>em;
line-height: 20px;
/* text-align: center; New button are on right of screen */
vertical-align: middle;
cursor: pointer;
/* color: #ffffff !important; */
/* text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); */
-webkit-border-radius: 2px;
border-radius: 2px;
/* -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); */
/* background-color: #006dcc;
background-image: -moz-linear-gradient(top, #0088cc, #0044cc);
background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc));
background-image: -webkit-linear-gradient(top, #0088cc, #0044cc);
background-image: -o-linear-gradient(top, #0088cc, #0044cc);
background-image: linear-gradient(to bottom, #0088cc, #0044cc);
background-repeat: repeat-x; */
}
a.butActionNew>span.fa-plus-circle { padding-left: 6px; font-size: 1.5em; }
a.butActionNewRefused>span.fa-plus-circle { padding-left: 6px; font-size: 1.5em; }
.button, .butAction {
color: #ffffff !important;
text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
background-color: #006dcc;
background-image: -moz-linear-gradient(top, #0088cc, #0044cc);
background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc));
background-image: -webkit-linear-gradient(top, #0088cc, #0044cc);
background-image: -o-linear-gradient(top, #0088cc, #0044cc);
background-image: linear-gradient(to bottom, #0088cc, #0044cc);
background-repeat: repeat-x;
border-color: #0044cc #0044cc #002a80;
border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
}
.button:disabled, .butAction:disabled {
color: #666 !important;
text-shadow: none;
border-color: #555;
cursor: not-allowed;
background-color: #f5f5f5;
background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6);
background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6));
background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6);
background-image: -o-linear-gradient(top, #ffffff, #e6e6e6);
background-image: linear-gradient(to bottom, #ffffff, #e6e6e6);
background-repeat: repeat-x
}
button.ui-button {
padding-top: 5px;
}
.butActionDelete, .buttonDelete {
color: #ffffff !important;
text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
background-color: #cc6d00;
background-image: -moz-linear-gradient(top, #cc8800, #cc4400);
background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#cc8800), to(#cc4400));
background-image: -webkit-linear-gradient(top, #cc8800, #cc4400);
background-image: -o-linear-gradient(top, #cc8800, #cc4400);
background-image: linear-gradient(to bottom, #cc8800, #cc4400);
background-repeat: repeat-x;
border-color: #cc4400 #cc4400 #802a00;
border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
}
a.butAction:link, a.butAction:visited, a.butAction:hover, a.butAction:active {
color: #FFFFFF;
}
.butActionRefused, .butActionNewRefused {
color: #AAAAAA !important;
cursor: not-allowed !important;
}
a.butAction:hover, a.butActionDelete:hover, a.butActionRefused:hover {
text-decoration: none;
}
a.butActionNewRefused:hover {
border-color: unset !important;
border: 1px solid #bbbbbb;
}
a.butAction:hover, a.butActionNew:hover, a.butActionDelete:hover {
opacity: 0.9;
}
.butActionTransparent {
color: #222 ! important;
background-color: transparent ! important;
}
/*
TITLE BUTTON
*/
.btnTitle, a.btnTitle {
display: inline-block;
padding: 6px 12px;
font-size: 14px
font-weight: 400;
line-height: 1.4;
text-align: center;
white-space: nowrap;
vertical-align: middle;
-ms-touch-action: manipulation;
touch-action: manipulation;
cursor: pointer;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
box-shadow: none;
text-decoration: none;
position: relative;
margin: 0 0 0 10px;
min-width: 80px;
text-align: center;
color: rgb(<?php print $colortextlink; ?>);
border: none;
font-size: 12px;
font-weight: 300;
background-color: #fbfbfb;
}
.btnTitle > .btnTitle-icon{
}
.btnTitle > .btnTitle-label{
color: #666666;
}
.btnTitle:hover, a.btnTitle:hover {
border-radius: 3px;
position: relative;
margin: 0 0 0 10px;
text-align: center;
color: #ffffff;
background-color: rgb(<?php print $colortextlink; ?>);
font-size: 12px;
text-decoration: none;
box-shadow: none;
}
.btnTitle.refused, a.btnTitle.refused, .btnTitle.refused:hover, a.btnTitle.refused:hover {
color: #8a8a8a;
cursor: not-allowed;
background-color: #fbfbfb;
background: repeating-linear-gradient( 45deg, #ffffff, #f1f1f1 4px, #f1f1f1 4px, #f1f1f1 4px );
}
.btnTitle:hover .btnTitle-label{
color: #ffffff;
}
div.pagination .btnTitle:hover .btnTitle-label{
color: rgb(<?php print $colortextlink; ?>);
}
.btnTitle.refused .btnTitle-label, .btnTitle.refused:hover .btnTitle-label{
color: #8a8a8a;
}
.btnTitle>.fa {
font-size: 20px;
display: block;
}
<?php if (! empty($conf->global->MAIN_BUTTON_HIDE_UNAUTHORIZED) && (! $user->admin)) { ?>
.butActionRefused, .butActionNewRefused, .btnTitle.refused {
display: none !important;
}
<?php }

Binary file not shown.

After

Width:  |  Height:  |  Size: 570 B

View File

@ -0,0 +1,245 @@
<?php
if (! defined('ISLOADEDBYSTEELSHEET'))  die('Must be call by steelsheet'); ?>
/* <style type="text/css" > */
/*
* Component: Info Box
* -------------------
*/
.info-box {
display: block;
min-height: 90px;
background: #fff;
width: 100%;
margin-bottom: 15px;
border: 1px solid #ddd;
}
.info-box small {
font-size: 14px;
}
.info-box .progress {
background: rgba(0, 0, 0, 0.2);
margin: 5px -10px 5px -10px;
height: 2px;
}
.info-box .progress,
.info-box .progress .progress-bar {
border-radius: 0;
}
.info-box .progress .progress-bar {
float: left;
width: 0;
height: 100%;
font-size: 12px;
line-height: 20px;
color: #fff;
text-align: center;
background-color: #337ab7;
-webkit-box-shadow: inset 0 -1px 0 rgba(0,0,0,.15);
box-shadow: inset 0 -1px 0 rgba(0,0,0,.15);
-webkit-transition: width .6s ease;
-o-transition: width .6s ease;
transition: width .6s ease;
}
.info-box-icon {
display: block;
float: left;
height: 90px;
width: 90px;
text-align: center;
font-size: 45px;
line-height: 90px;
background: #eee;
}
.info-box-icon > img {
max-width: 100%;
}
.info-box-content {
padding: 5px 10px;
margin-left: 90px;
}
.info-box-number {
display: block;
font-weight: bold;
font-size: 18px;
}
.progress-description,
.info-box-text,
.info-box-title{
display: block;
font-size: 12px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.info-box-title{
text-transform: uppercase;
font-weight: bold;
}
.info-box-text:first-letter{text-transform: uppercase}
a.info-box-text{ text-decoration: none;}
.info-box-more {
display: block;
}
.progress-description {
margin: 0;
}
/* ICONS */
.info-box-icon {
color: #000 !important;
}
/*
.bg-infoxbox-project{
background-color: #605ca8 !important;
}
.bg-infoxbox-action{
background-color: #d81b60 !important;
}
.bg-infoxbox-propal,
.bg-infoxbox-facture,
.bg-infoxbox-commande{
background-color: #dd4b39 !important;
}
.bg-infoxbox-supplier_proposal,
.bg-infoxbox-invoice_supplier,
.bg-infoxbox-order_supplier{
background-color: #00c0ef !important;
}
.bg-infoxbox-contrat{
background-color: #00a65a !important;
}
.bg-infoxbox-bank_account{
background-color: #f39c12 !important;
}
.bg-infoxbox-adherent{
//background-color: #f39c12 !important;
}
.bg-infoxbox-expensereport{
background-color: #a55114 !important;
}
.bg-infoxbox-holiday{
background-color: #cbd81b !important;
}
*/
.fa-dol-action:before {
content: "\f073";
}
.fa-dol-propal:before,
.fa-dol-supplier_proposal:before {
content: "\f2b5";
}
.fa-dol-facture:before,
.fa-dol-invoice_supplier:before {
content: "\f571";
}
.fa-dol-project:before {
content: "\f0e8";
}
.fa-dol-commande:before,
.fa-dol-order_supplier:before {
content: "\f570";
}
.fa-dol-contrat:before {
content: "\f1e6";
}
.fa-dol-bank_account:before {
content: "\f19c";
}
.fa-dol-adherent:before {
content: "\f0c0";
}
.fa-dol-expensereport:before {
content: "\f555";
}
.fa-dol-holiday:before {
content: "\f5ca";
}
/* USING FONTAWESOME FOR WEATHER */
.info-box-weather .info-box-icon{
background: rgba(0, 0, 0, 0); !important;
}
.fa-weather-level0:before{
content: "\f185";
color : #000000;
}
.fa-weather-level1:before{
content: "\f6c4";
color : #000000;
}
.fa-weather-level2:before{
content: "\f0c2";
color : #000000;
}
.fa-weather-level3:before{
content: "\f740";
color : #000000;
}
.fa-weather-level4:before{
content: "\f0e7";
color : #000000;
}
/* USING IMAGES FOR WEATHER INTEAD OF FONT AWESOME */
/* For other themes just uncomment this part */
/*.info-box-weather-level0,
.info-box-weather-level1,
.info-box-weather-level2,
.info-box-weather-level3,
.info-box-weather-level4 {
background-position: 15px 50%;
background-repeat: no-repeat;
}
.info-box-weather .info-box-icon{
display: none !important;
}
.info-box-weather-level0 {
background-image: url("img/weather/weather-clear.png");
}
.info-box-weather-level1 {
background-image: url("img/weather/weather-few-clouds.png");
}
.info-box-weather-level2 {
background-image: url("img/weather/weather-clouds.png");
}
.info-box-weather-level3 {
background-image: url("img/weather/weather-many-clouds.png");
}
.info-box-weather-level4 {
background-image: url("img/weather/weather-storm.png");
}*/
.box-flex-container{
display: flex; /* or inline-flex */
flex-direction: row;
flex-wrap: wrap;
width: 100%;
margin: 0 0 0 -15px;
/*justify-content: space-between;*/
}
.box-flex-item{
flex-grow : 1;
flex-shrink: 1;
flex-basis: auto;
width: 280px;
margin: 5px 0px 0px 15px;
}
.box-flex-item.filler{
margin: 0px 0px 0px 15px !important;
height: 0;
}

View File

@ -691,20 +691,7 @@ textarea.centpercent {
}
/* Themes for badges */
.badge {
display: inline-block;
min-width: 10px;
padding: 2px 5px;
font-size: 10px;
font-weight: 700;
line-height: 1em;
color: #fff;
text-align: center;
white-space: nowrap;
vertical-align: baseline;
background-color: #777;
border-radius: 10px;
}
<?php include dol_buildpath($path.'/theme/'.$theme.'/badges.inc.php', 0); ?>
.borderrightlight
{
@ -2512,150 +2499,7 @@ span.tabspan {
/* ============================================================================== */
/* Buttons for actions */
/* ============================================================================== */
div.divButAction {
margin-bottom: 1.4em;
vertical-align: top;
}
div.tabsAction > a.butAction, div.tabsAction > a.butActionRefused {
margin-bottom: 1.4em !important;
}
span.butAction, span.butActionDelete {
cursor: pointer;
}
.button, .butAction, .butActionDelete, .butActionRefused, .butActionNewRefused {
border-color: rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.25);
display: inline-block;
padding: 0.4em <?php echo ($dol_optimize_smallscreen?'0.4':'0.7'); ?>em;
margin: 0em <?php echo ($dol_optimize_smallscreen?'0.7':'0.9'); ?>em;
line-height: 20px;
text-align: center;
vertical-align: middle;
cursor: pointer;
color: #333333 !important;
text-decoration: none !important;
text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75);
background-color: #f5f5f5;
background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6);
background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6));
background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6);
background-image: -o-linear-gradient(top, #ffffff, #e6e6e6);
background-image: linear-gradient(to bottom, #ffffff, #e6e6e6);
background-repeat: repeat-x;
border-color: #e6e6e6 #e6e6e6 #bfbfbf;
border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
border: 1px solid #bbbbbb;
border-bottom-color: #a2a2a2;
-webkit-border-radius: 2px;
border-radius: 2px;
-webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
}
.butActionNew, .butActionNewRefused, .butActionNew:link, .butActionNew:visited, .butActionNew:hover, .butActionNew:active {
text-decoration: none;
/* border-color: rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.25); */
display: inline-block;
padding: 0.2em <?php echo ($dol_optimize_smallscreen?'0.4':'0.7'); ?>em;
margin: 0em <?php echo ($dol_optimize_smallscreen?'0.7':'0.9'); ?>em;
line-height: 20px;
/* text-align: center; New button are on right of screen */
vertical-align: middle;
cursor: pointer;
/* color: #ffffff !important; */
/* text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); */
-webkit-border-radius: 2px;
border-radius: 2px;
/* -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); */
/* background-color: #006dcc;
background-image: -moz-linear-gradient(top, #0088cc, #0044cc);
background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc));
background-image: -webkit-linear-gradient(top, #0088cc, #0044cc);
background-image: -o-linear-gradient(top, #0088cc, #0044cc);
background-image: linear-gradient(to bottom, #0088cc, #0044cc);
background-repeat: repeat-x; */
}
a.butActionNew>span.fa-plus-circle { padding-left: 6px; font-size: 1.5em; }
a.butActionNewRefused>span.fa-plus-circle { padding-left: 6px; font-size: 1.5em; }
.button, .butAction {
color: #ffffff !important;
text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
background-color: #006dcc;
background-image: -moz-linear-gradient(top, #0088cc, #0044cc);
background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc));
background-image: -webkit-linear-gradient(top, #0088cc, #0044cc);
background-image: -o-linear-gradient(top, #0088cc, #0044cc);
background-image: linear-gradient(to bottom, #0088cc, #0044cc);
background-repeat: repeat-x;
border-color: #0044cc #0044cc #002a80;
border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
}
.button:disabled, .butAction:disabled {
color: #666 !important;
text-shadow: none;
border-color: #555;
cursor: not-allowed;
background-color: #f5f5f5;
background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6);
background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6));
background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6);
background-image: -o-linear-gradient(top, #ffffff, #e6e6e6);
background-image: linear-gradient(to bottom, #ffffff, #e6e6e6);
background-repeat: repeat-x
}
button.ui-button {
padding-top: 5px;
}
.butActionDelete, .buttonDelete {
color: #ffffff !important;
text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
background-color: #cc6d00;
background-image: -moz-linear-gradient(top, #cc8800, #cc4400);
background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#cc8800), to(#cc4400));
background-image: -webkit-linear-gradient(top, #cc8800, #cc4400);
background-image: -o-linear-gradient(top, #cc8800, #cc4400);
background-image: linear-gradient(to bottom, #cc8800, #cc4400);
background-repeat: repeat-x;
border-color: #cc4400 #cc4400 #802a00;
border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
}
a.butAction:link, a.butAction:visited, a.butAction:hover, a.butAction:active {
color: #FFFFFF;
}
.butActionRefused, .butActionNewRefused {
color: #AAAAAA !important;
cursor: not-allowed !important;
}
a.butAction:hover, a.butActionDelete:hover, a.butActionRefused:hover {
text-decoration: none;
}
a.butActionNewRefused:hover {
border-color: unset !important;
border: 1px solid #bbbbbb;
}
a.butAction:hover, a.butActionNew:hover, a.butActionDelete:hover {
opacity: 0.9;
}
.butActionTransparent {
color: #222 ! important;
background-color: transparent ! important;
}
<?php if (! empty($conf->global->MAIN_BUTTON_HIDE_UNAUTHORIZED)) { ?>
.butActionRefused, .butActionNewRefused {
display: none;
}
<?php } ?>
<?php include dol_buildpath($path.'/theme/'.$theme.'/btn.inc.php', 0); ?>
@ -5863,6 +5707,6 @@ border-top-right-radius: 6px;
include dol_buildpath($path.'/theme/'.$theme.'/dropdown.inc.php', 0);
include dol_buildpath($path.'/theme/'.$theme.'/info-box.inc.php', 0);
if (is_object($db)) $db->close();

View File

@ -66,3 +66,28 @@ $colortext='0,0,0';
$colortextlink='0,0,120';
$fontsize='14';
$fontsizesmaller='11';
// Badges colors
$badgePrimary ='#007bff';
$badgeSecondary ='#999999';
$badgeSuccess ='#28a745';
$badgeDanger ='#8c4446';
$badgeWarning ='#ffc107';
$badgeInfo ='#17a2b8';
$badgeDark ='#343a40';
$badgeLight ='#f8f9fa';
/* default color for status : After a quick check, somme status can have oposite function according to objects
* So this badges status uses default value according to theme eldy status img
* TODO: use color definition vars above for define badges color status X -> expemple $badgeStatusValidate, $badgeStatusClosed, $badgeStatusActive ....
*/
$badgeStatus0='#cbd3d3';
$badgeStatus1='#bc9526';
$badgeStatus2='#e6f0f0';
$badgeStatus3='#bca52b';
$badgeStatus4='#277d1e';
$badgeStatus5='#cad2d2';
$badgeStatus6='#cad2d2';
$badgeStatus7='#baa32b';
$badgeStatus8='#be3013';
$badgeStatus9='#e7f0f0';