diff --git a/ChangeLog b/ChangeLog index 0839fd77e95..62d791a670a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -126,6 +126,115 @@ FIX: When saving an action it didn't save the label based on the type of event i FIX: when STOCK_CALCULATE_ON_SHIPMENT_NEW: is set, deleting a "closed" shipment now increases stock as expected FIX: wrong path sociales/index.php doesnt exist anymore + +***** ChangeLog for 10.0.1 compared to 10.0.0 ***** +FIX: #10930 +FIX: #10984 +FIX: reposition on "Build backup" button +FIX: #11400 +FIX: #11412 +FIX: #11460 +FIX: #11463 +FIX: #11466 +FIX: #11492 +FIX: #11498 +FIX: #11505 +FIX: #11506 +FIX: #11507 +FIX: #11509 +FIX: #11537 +FIX: #11543 +FIX: #11553 +FIX: #11576 +FIX: #11584 +FIX: #11590 +FIX: accounting mode must be taken from global conf, because there's no way to choose a mode with interface +FIX: Add message from public interface +FIX: add missing hook calls +FIX: Add warning when setup is strange +FIX: ajax call for line positioning when CSRFCHECK_WITH_TOKEN is on +FIX: API return 404 sometimes even if API exists +FIX: Attachment was lost when we validate an expense report +FIX: avoid conflict with "$classname" in card.php +FIX: Bad sql request +FIX: better compatibility with multicompany transverse mode +FIX: Better PHP compatibility +FIX: Block to link with tickets +FIX: Can't submit a ticket from public interface +FIX: categories import: prevent mismatch between category type and object type +FIX: Closing ticket from public interface +FIX: Column 'paid' missing in expense report +FIX: compatibility mysql 8. rank is reserved +FIX: Computed field were not calculated into lists. +FIX: Content of email for subscription +FIX: correct error in files with multiple spaces +FIX: CVE-2019-11199 +FIX: delete of links between objects +FIX: div not balanced +FIX: do not return formatted prices in json string +FIX: duplicate on the check (TODO field $onetrtd not used ?) +FIX: element name in update_price +FIX: empty product_use_units in product configuration +FIX: expedition card: infinite loop for printObjectLine hook if return > 0 +FIX: extrafield loading bug due to assumption that an object is a third party while it may be a contact if MAIN_USE_COMPANY_NAME_OF_CONTACT is set. +FIX: Fatal error on dol_htmloutput_mesg with corrupted array +FIX: Fatal situation if payment removed on expense report. Action +FIX: FEC Format - Missing date_creation in general ledger when you add a new transaction +FIX: FEC Format - Save translation of the journal label in database & nowrap on amount +FIX: floating point precision errors in the triggers of the workflow module +FIX: for #11232 +FIX: format of field with type timestamp +FIX: fournrprice log for insert +FIX: help text +FIX: import filter error +FIX: __INFOS__ tag not exists +FIX: issue #9300: install error with PostgreSQL when using custom table prefix +FIX: Language key +FIX: Limit of uploaded files (max_post_size was not used) +FIX: list of balance of leaves +FIX: minor spelling issues +FIX: missing "dropdown-icon" replacement +FIX: Missing field "Conciliated" into bank transaction export +FIX: missing filter by current contact +FIX: missing token +FIX: Missing where on entity +FIX: move sql request in INNER JOIN +FIX: name was able to be in field but went back to new line +FIX: Nowrap on amount +FIX: Online payment +FIX: on shipment delete confirm dialog, a new checkbox allows the user to choose if they want their stock re-incremented after the deletion. +FIX: option EXPORT_LABEL_FOR_SELECT to restore compatibility in export +FIX: Option THIRDPARTY_SUGGEST_ALSO_ADDRESS_CREATION +FIX: outdated phpdoc +FIX: Permission for BOM menu +FIX: permission to delete a draft purchase order +FIX: phpcs +FIX: Position was lost when we edit the line of template invoice +FIX: product_use_units was set to 0 each time a conf in block other was set +FIX: propal createFrom hook: undefined parameter attached +FIX: Responsive of public interface of ticket +FIX: search by phone pro +FIX: Setup of TakePos was not possible after a clean install +FIX: Show list of events on tickets +FIX: socpeople assigned list in action com list +FIX: SQL problem on donation & nowrap on amount +FIX: stock increase on shipment deletion if STOCK_CALCULATE_ON_SHIPMENT_NEW: is set +FIX: stripe webhook ID constant set +FIX: summary of time spent in preview tab of projects +FIX: the feature to bill time spent was not enabled. +FIX: The new feature to attach document on lines was not correclty +FIX: The proposed new supplier code does not work +FIX: this function can not be private +FIX: tk9877 - PDF rouget requires product.lib.php (otherwise measuring_units_string() is not defined) +FIX: Update the file index table when we validate/rename a ref. +FIX: use rounding to compare the amounts +FIX: We must save code instead of value in database for template invoice modelpdf +FIX: we need to be able to add freeline with qty between 0 & 1 in supplierorder line +FIX: We should remove property comments only for project and task api. +FIX: When saving an action it didn't save the label based on the type of event if the label is empty and the type is customized +FIX: when STOCK_CALCULATE_ON_SHIPMENT_NEW: is set, deleting a "closed" shipment now increases stock as expected +FIX: wrong path sociales/index.php doesnt exist anymore + ***** ChangeLog for 10.0.0 compared to 9.0.0 ***** For Users: NEW: Module "Ticket" is available as a stable module. diff --git a/htdocs/core/boxes/box_task.php b/htdocs/core/boxes/box_task.php index d07792dc991..3a0b2c67af9 100644 --- a/htdocs/core/boxes/box_task.php +++ b/htdocs/core/boxes/box_task.php @@ -31,10 +31,10 @@ require_once DOL_DOCUMENT_ROOT."/core/lib/date.lib.php"; */ class box_task extends ModeleBoxes { - public $boxcode="projet"; + public $boxcode="projettask"; public $boximg="object_projecttask"; public $boxlabel; - //public $depends = array("projet"); + public $depends = array("projet"); /** * @var DoliDB Database handler. @@ -42,7 +42,7 @@ class box_task extends ModeleBoxes public $db; public $param; - public $enabled = 0; // Disabled because bugged. + public $enabled = 1; // enable because fixed ;-). public $info_box_head = array(); public $info_box_contents = array(); @@ -78,54 +78,110 @@ class box_task extends ModeleBoxes global $conf, $user, $langs, $db; $this->max=$max; - - $totalMnt = 0; - $totalnb = 0; - $totalDuree=0; - $totalplannedtot=0; - $totaldurationtot=0; - include_once DOL_DOCUMENT_ROOT."/projet/class/task.class.php"; + include_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php'; + require_once DOL_DOCUMENT_ROOT."/core/lib/project.lib.php"; + $projectstatic = new Project($this->db); $taskstatic=new Task($db); + $form= new Form($db); + $cookie_name='boxfilter_task'; + $boxcontent=''; + + $textHead = $langs->trans("CurentlyOpenedTasks"); + + $filterValue='all'; + if(in_array(GETPOST($cookie_name), array('all','im_project_contact','im_task_contact'))){ + $filterValue = GETPOST($cookie_name); + } + elseif(!empty($_COOKIE[$cookie_name])){ + $filterValue = $_COOKIE[$cookie_name]; + } - $textHead = $langs->trans("Tasks")." ".date("Y"); - $this->info_box_head = array('text' => $textHead, 'limit'=> dol_strlen($textHead)); + if($filterValue == 'im_task_contact'){ + $textHead.= ' : '.$langs->trans("WhichIamLinkedTo"); + } + elseif($filterValue == 'im_project_contact'){ + $textHead.= ' : '.$langs->trans("WhichIamLinkedToProject"); + } + + + $this->info_box_head = array( + 'text' => $textHead, + 'limit'=> dol_strlen($textHead), + 'sublink'=>'', + 'subtext'=>$langs->trans("Filter"), + 'subpicto'=>'filter.png', + 'subclass'=>'linkobject boxfilter', + 'target'=>'none' // Set '' to get target="_blank" + ); // list the summary of the orders if ($user->rights->projet->lire) { - // FIXME fk_statut on a task is not be used. We use the percent. This means this box is useless. - $sql = "SELECT pt.fk_statut, count(DISTINCT pt.rowid) as nb, sum(ptt.task_duration) as durationtot, sum(pt.planned_workload) as plannedtot"; - $sql.= " FROM ".MAIN_DB_PREFIX."projet_task as pt, ".MAIN_DB_PREFIX."projet_task_time as ptt"; - $sql.= " WHERE pt.datec BETWEEN '".$this->db->idate(dol_get_first_day(date("Y"), 1))."' AND '".$this->db->idate(dol_get_last_day(date("Y"), 12))."'"; - $sql.= " AND pt.rowid = ptt.fk_task"; - $sql.= " GROUP BY pt.fk_statut "; - $sql.= " ORDER BY pt.fk_statut DESC"; + $boxcontent.= '
'."\n"; + $boxcontent.= '
'."\n"; + $boxcontent.= '
boxcode.'">'."\n"; + $boxcontent.= ''."\n"; + $selectArray = array('all' => $langs->trans("NoFilter"), 'im_task_contact' => $langs->trans("WhichIamLinkedTo"), 'im_project_contact' => $langs->trans("WhichIamLinkedToProject")); + $boxcontent.= $form->selectArray($cookie_name, $selectArray, $filterValue); + $boxcontent.= ''; + $boxcontent.= '
'."\n"; + $boxcontent.= '
'."\n"; + $boxcontent.= ''; + + + + $sql = "SELECT pt.rowid, pt.ref, pt.fk_projet, pt.fk_task_parent, pt.datec, pt.dateo, pt.datee, pt.datev, pt.label, pt.description, pt.duration_effective, pt.planned_workload, pt.progress"; + $sql.= ", p.rowid project_id, p.ref project_ref, p.title project_title"; + + $sql.= " FROM ".MAIN_DB_PREFIX."projet_task as pt"; + $sql.= " JOIN ".MAIN_DB_PREFIX."projet as p ON (pt.fk_projet = p.rowid)"; + + if($filterValue === 'im_task_contact') { + $sql .= " JOIN " . MAIN_DB_PREFIX . "element_contact as ec ON (ec.element_id = pt.rowid AND ec.fk_socpeople = '" . $user->id . "' )"; + $sql .= " JOIN " . MAIN_DB_PREFIX . "c_type_contact as tc ON (ec.fk_c_type_contact = tc.rowid AND tc.element = 'project_task' AND tc.source = 'internal' )"; + } + elseif($filterValue === 'im_project_contact') { + $sql .= " JOIN " . MAIN_DB_PREFIX . "element_contact as ec ON (ec.element_id = p.rowid AND ec.fk_socpeople = '" . $user->id . "' )"; + $sql .= " JOIN " . MAIN_DB_PREFIX . "c_type_contact as tc ON (ec.fk_c_type_contact = tc.rowid AND tc.element = 'project' AND tc.source = 'internal' )"; + } + + $sql.= " WHERE "; + $sql.= " pt.entity = ".$conf->entity; + $sql.= " AND p.fk_statut = ".Project::STATUS_VALIDATED; + $sql.= " AND (pt.progress < 100 OR pt.progress IS NULL ) "; // 100% is done and not displayed + + $sql.= " ORDER BY pt.datee ASC, pt.dateo ASC"; $sql.= $db->plimit($max, 0); $result = $db->query($sql); $i = 0; if ($result) { $num = $db->num_rows($result); - while ($i < $num) { - $objp = $db->fetch_object($result); - $this->info_box_contents[$i][] = array( - 'td' => '', - 'text' =>$langs->trans("Task")." ".$taskstatic->LibStatut($objp->fk_statut, 0), - ); + while ($objp = $db->fetch_object($result)) { - $this->info_box_contents[$i][] = array( - 'td' => 'class="right"', - 'text' => $objp->nb." ".$langs->trans("Tasks"), - 'url' => DOL_URL_ROOT."/projet/tasks/list.php?leftmenu=projects&viewstatut=".$objp->fk_statut, - ); - $totalnb += $objp->nb; - $this->info_box_contents[$i][] = array('td' => 'class="right"', 'text' => ConvertSecondToTime($objp->plannedtot, 'all', 25200, 5)); - $totalplannedtot += $objp->plannedtot; - $this->info_box_contents[$i][] = array('td' => 'class="right"', 'text' => ConvertSecondToTime($objp->durationtot, 'all', 25200, 5)); - $totaldurationtot += $objp->durationtot; + $taskstatic->id=$objp->rowid; + $taskstatic->ref=$objp->ref; + $taskstatic->label=$objp->label; + $taskstatic->progress = $objp->progress; + $taskstatic->fk_statut = $objp->fk_statut; + $taskstatic->date_end = $objp->datee; + $taskstatic->planned_workload= $objp->planned_workload; + $taskstatic->duration_effective= $objp->duration_effective; - $this->info_box_contents[$i][] = array('td' => 'class="right" width="18"', 'text' => $taskstatic->LibStatut($objp->fk_statut, 3)); + $projectstatic->id = $objp->project_id; + $projectstatic->ref = $objp->project_ref; + $projectstatic->title = $objp->project_title; + + $label = $projectstatic->getNomUrl(1).' '.$taskstatic->getNomUrl(1).' '.dol_htmlentities($taskstatic->label); + + $boxcontent.= getTaskProgressView($taskstatic, $label, true, false, true); $i++; } @@ -134,12 +190,15 @@ class box_task extends ModeleBoxes } } - // Add the sum at the bottom of the boxes - $this->info_box_contents[$i][] = array('tr' => 'class="liste_total"', 'td' => '', 'text' => $langs->trans("Total")." ".$textHead); - $this->info_box_contents[$i][] = array('td' => 'class="right" ', 'text' => number_format($totalnb, 0, ',', ' ')." ".$langs->trans("Tasks")); - $this->info_box_contents[$i][] = array('td' => 'class="right" ', 'text' => ConvertSecondToTime($totalplannedtot, 'all', 25200, 5)); - $this->info_box_contents[$i][] = array('td' => 'class="right" ', 'text' => ConvertSecondToTime($totaldurationtot, 'all', 25200, 5)); - $this->info_box_contents[$i][] = array('td' => '', 'text' => ""); + // set cookie by js + if(empty($i)){ + $boxcontent.=''; + } + + $this->info_box_contents[0][] = array( + 'td' => '', + 'text' => $boxcontent, + ); } /** diff --git a/htdocs/core/lib/project.lib.php b/htdocs/core/lib/project.lib.php index a1b93cb0280..91b2e27eeeb 100644 --- a/htdocs/core/lib/project.lib.php +++ b/htdocs/core/lib/project.lib.php @@ -457,6 +457,9 @@ function projectLinesa(&$inc, $parent, &$lines, &$level, $var, $showproject, &$t $taskstatic->progress = $lines[$i]->progress; $taskstatic->fk_statut = $lines[$i]->status; $taskstatic->datee = $lines[$i]->date_end; + $taskstatic->planned_workload= $lines[$i]->planned_workload; + $taskstatic->duration_effective= $lines[$i]->duration; + if ($showproject) { @@ -556,10 +559,15 @@ function projectLinesa(&$inc, $parent, &$lines, &$level, $var, $showproject, &$t print ''; if ($lines[$i]->progress != '') { - print $lines[$i]->progress.' %'; + print getTaskProgressBadge($taskstatic); } print ''; + // resume + print ''; + print getTaskProgressView($taskstatic, false, false); + print ''; + if ($showbilltime) { // Time not billed @@ -1943,3 +1951,164 @@ function print_projecttasks_array($db, $form, $socid, $projectsListId, $mytasks print ''; } } + +/** + * @param task $task Task the task object + * @param label $label bool|string true = auto, false = dont display, string = replace output + * @param progressNumber $progressNumber bool|string true = auto, false = dont display, string = replace output + * @param hideOnProgressNull $hideOnProgressNull bool hide if progress is null + * @param spaced $spaced bool used to add space at bottom (made by css) + * @return string + */ +function getTaskProgressView($task, $label = true, $progressNumber = true, $hideOnProgressNull = false, $spaced = false) +{ + global $langs, $conf; + + $out = ''; + + $plannedworkloadoutputformat='allhourmin'; + $timespentoutputformat='allhourmin'; + if (! empty($conf->global->PROJECT_PLANNED_WORKLOAD_FORMAT)) $plannedworkloadoutputformat=$conf->global->PROJECT_PLANNED_WORKLOAD_FORMAT; + if (! empty($conf->global->PROJECT_TIMES_SPENT_FORMAT)) $timespentoutputformat=$conf->global->PROJECT_TIME_SPENT_FORMAT; + + if(empty($task->progress) && !empty($hideOnProgressNull)){ + return ''; + } + + $spaced = !empty($spaced)?'spaced':''; + + $diff = ''; + + // define progress color according to time spend vs workload + $progressBarClass = 'progress-bar-info'; + if ($task->planned_workload){ + $progressCalculated = round(100 * doubleval($task->duration_effective) / doubleval($task->planned_workload), 2); + + // this conf is actually hidden, by default we use 1% for "be carefull or warning" + $warningRatio = !empty($conf->global->PROJECT_TIME_SPEND_WARNING_PERCENT) ? (1 + $conf->global->PROJECT_TIME_SPEND_WARNING_PERCENT / 100) : 1.01; + + $diffTitle = '
'.$langs->trans('ProgressDeclared').' : '.$task->progress.'%'; + $diffTitle.= '
'.$langs->trans('ProgressCalculated').' : '.$progressCalculated.'%'; + + if($progressCalculated > doubleval($task->progress)){ + $progressBarClass = 'progress-bar-danger'; + $title = $langs->trans('TheReportedProgressIsLessThanTheCalculatedProgressionByX', abs($task->progress-$progressCalculated).'%'); + $diff = ' '.($task->progress-$progressCalculated).'%'; + } + elseif($progressCalculated * $warningRatio >= doubleval($task->progress)){ // warning if close at 1% + $progressBarClass = 'progress-bar-warning'; + $title = $langs->trans('TheReportedProgressIsLessThanTheCalculatedProgressionByX', abs($task->progress-$progressCalculated).'%'); + $diff = ' '.($task->progress-$progressCalculated).'%'; + } + else{ + $progressBarClass = 'progress-bar-success'; + $title = $langs->trans('TheReportedProgressIsMoreThanTheCalculatedProgressionByX', ($task->progress-$progressCalculated).'%'); + $diff = ' '.($task->progress-$progressCalculated).'%'; + } + } + + $out.= '
'; + + if($label !== false) + { + $out.= ' '; + + if($label!==true){ + $out.= $label; // replace label by param + } + else{ + $out.= $task->getNomUrl(1).' '.dol_htmlentities($task->label); + } + $out.= ' '; + } + + + if($progressNumber !== false) + { + $out.= ' '; + if($progressNumber!==true){ + $out.= $progressNumber; // replace label by param + } + else{ + if ($task->hasDelay()) $out.= img_warning($langs->trans("Late")).' '; + + $out.= !empty($diff) ? $diff.' ':''; + + $out.= ''; + if ($task->duration_effective) $out.= convertSecondToTime($task->duration_effective, $timespentoutputformat); + else $out.= '--:--'; + $out.= ''; + + $out.= '/'; + + $out.= ''; + if ($task->planned_workload) $out.= convertSecondToTime($task->planned_workload, $plannedworkloadoutputformat); + else $out.= '--:--'; + } + $out.= ' '; + } + + + + $out.= ''; + $out.= '
'; + $out.= '
'; + $out.= '
'; + $out.= '
'; + + + + return $out; +} +/** + * @param task $task Task the task object + * @param label $label string empty = auto (progress), string = replace output + * @param tooltip $tooltip string empty = auto , string = replace output + * @return string + */ +function getTaskProgressBadge($task, $label = '', $tooltip = '') +{ + global $conf; + + $out = ''; + $badgeClass = ''; + if ($task->progress != '') + { + // TODO : manage 100% + + // define color according to time spend vs workload + $badgeClass = 'badge '; + if ($task->planned_workload){ + $progressCalculated = round(100 * doubleval($task->duration_effective) / doubleval($task->planned_workload), 2); + + // this conf is actually hidden, by default we use 1% for "be carefull or warning" + $warningRatio = !empty($conf->global->PROJECT_TIME_SPEND_WARNING_PERCENT) ? (1 + $conf->global->PROJECT_TIME_SPEND_WARNING_PERCENT / 100) : 1.01; + + if($progressCalculated > doubleval($task->progress)){ + $badgeClass.= 'badge-danger'; + } + elseif($progressCalculated * $warningRatio >= doubleval($task->progress)){ // warning if close at 1% + $badgeClass.= 'badge-warning'; + } + else{ + $badgeClass.= 'badge-success'; + } + } + } + + $title = ''; + if(!empty($tooltip)){ + $badgeClass.= ' classfortooltip'; + $title = 'title="'.dol_htmlentities($tooltip).'"'; + } + + if(empty($label)){ + $label = $task->progress.' %'; + } + + if(!empty($label)){ + $out = ''.$label.''; + } + + return $out; +} diff --git a/htdocs/langs/en_US/projects.lang b/htdocs/langs/en_US/projects.lang index ca9a1e2452f..4b4a787b6ad 100644 --- a/htdocs/langs/en_US/projects.lang +++ b/htdocs/langs/en_US/projects.lang @@ -76,7 +76,13 @@ MyProjects=My projects MyProjectsArea=My projects Area DurationEffective=Effective duration ProgressDeclared=Declared progress +TaskProgressSummary=Task progress +CurentlyOpenedTasks=Curently opened tasks +TheReportedProgressIsLessThanTheCalculatedProgressionByX=The declared progress is less %s than the calculated progression +TheReportedProgressIsMoreThanTheCalculatedProgressionByX=The declared progress is more %s than the calculated progression ProgressCalculated=Calculated progress +WhichIamLinkedTo=which I'm linked to +WhichIamLinkedToProject=which I'm linked to project Time=Time ListOfTasks=List of tasks GoToListOfTimeConsumed=Go to list of time consumed diff --git a/htdocs/projet/tasks.php b/htdocs/projet/tasks.php index b8ac9fb7e02..b1b802ee25c 100644 --- a/htdocs/projet/tasks.php +++ b/htdocs/projet/tasks.php @@ -746,9 +746,12 @@ elseif ($id > 0 || ! empty($ref)) print ''; print ''; - print ''; - print ''; - print ''; + print ''; + print ''; + print ''; + + // progress resume not searchable + print ''; if ($object->bill_time) { @@ -778,6 +781,7 @@ elseif ($id > 0 || ! empty($ref)) print_liste_field_titre("TimeSpent", $_SERVER["PHP_SELF"], "", '', '', '', $sortfield, $sortorder, 'right '); print_liste_field_titre("ProgressCalculated", $_SERVER["PHP_SELF"], "", '', '', '', $sortfield, $sortorder, 'right '); print_liste_field_titre("ProgressDeclared", $_SERVER["PHP_SELF"], "", '', '', '', $sortfield, $sortorder, 'right '); + print_liste_field_titre("TaskProgressSummary", $_SERVER["PHP_SELF"], "", '', '', '', $sortfield, $sortorder, 'right '); if ($object->bill_time) { print_liste_field_titre("TimeToBill", $_SERVER["PHP_SELF"], "", '', '', '', $sortfield, $sortorder, 'right '); diff --git a/htdocs/theme/eldy/global.inc.php b/htdocs/theme/eldy/global.inc.php index 7638b083a97..810c27051c8 100644 --- a/htdocs/theme/eldy/global.inc.php +++ b/htdocs/theme/eldy/global.inc.php @@ -405,6 +405,16 @@ textarea.centpercent { .small, small { font-size: 85%; } + +.h1 .small, .h1 small, .h2 .small, .h2 small, .h3 .small, .h3 small, h1 .small, h1 small, h2 .small, h2 small, h3 .small, h3 small { + font-size: 65%; +} +.h1 .small, .h1 small, .h2 .small, .h2 small, .h3 .small, .h3 small, .h4 .small, .h4 small, .h5 .small, .h5 small, .h6 .small, .h6 small, h1 .small, h1 small, h2 .small, h2 small, h3 .small, h3 small, h4 .small, h4 small, h5 .small, h5 small, h6 .small, h6 small { + font-weight: 400; + line-height: 1; + color: #777; +} + .center { text-align: center; margin: 0px auto; @@ -483,6 +493,24 @@ textarea.centpercent { opacity: 0.7; } +.text-warning{ + color : +} +body[class*="colorblind-"] .text-warning{ + color : +} +.text-success{ + color : +} +body[class*="colorblind-"] .text-success{ + color : +} + +.text-danger{ + color : +} + + /* Themes for badges */ @@ -3209,10 +3237,6 @@ span.boxstatsindicator { flex-grow: 1; } - - - - span.dashboardlineindicator, span.dashboardlineindicatorlate { font-size: 130%; font-weight: normal; @@ -5773,4 +5797,4 @@ div.tabsElem a.tab { +/*