Created responsive GUI for central and right panel;

Overwritten bootstrap css for form field;
Updated h2 dependency at 1.4.198. This version should remove the lock.db issue

git-svn-id: https://svn.d4science.research-infrastructures.eu/gcube/trunk/portlets/user/performfish-analytics-portlet@178569 82a268e6-3cf1-43bd-a215-b396298e98cf
This commit is contained in:
Francesco Mangiacrapa 2019-03-13 14:39:05 +00:00
parent d518ab14c1
commit db00155c2f
20 changed files with 70 additions and 419 deletions

View File

@ -114,7 +114,7 @@
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.3.170</version>
<version>1.4.198</version>
<scope>compile</scope>
</dependency>

View File

@ -107,12 +107,13 @@ public class PerformFishAnalyticsViewController {
tree = new CellTree(customTreeModel, null);
//tree.setKeyboardSelectionPolicy(KeyboardSelectionPolicy.ENABLED);
westPanel.add(form);
estPanel.add(recapPage);
//estPanel.add(recapPage);
//bodyPage.add(form);
//tree.setWidth("600px");
//tree.setSize("600px", "800px");
batchIDAndListKPI.add(tree);
bodyPage.add(batchIDAndListKPI);
bodyPage.addWidget(batchIDAndListKPI);
bodyPage.addWidget(recapPage);
}
/**
@ -133,8 +134,8 @@ public class PerformFishAnalyticsViewController {
headerPage.add(new PortletTitle("PerformFISH Statistical Analysis"));
//baseDockLayoutPanel.addNorth(headerPage, 60);
baseDockLayoutPanel.addWest(westPanel, 600);
baseDockLayoutPanel.addEast(estPanel, 500);
baseDockLayoutPanel.addWest(westPanel, 500);
//baseDockLayoutPanel.addEast(estPanel, 250);
baseDockLayoutPanel.add(bodyPage);
tabPanel.getTabCreateRequestPanel().add(baseDockLayoutPanel);

View File

@ -7,7 +7,9 @@ import com.github.gwtbootstrap.client.ui.Alert;
import com.github.gwtbootstrap.client.ui.constants.AlertType;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;
// TODO: Auto-generated Javadoc
/**
@ -23,6 +25,9 @@ public class BodyPanel extends VerticalPanel{
/** The panel error. */
private FlowPanel panelError = new FlowPanel();
/** The hp. */
private HorizontalPanel hp = new HorizontalPanel();
/**
* Instantiates a new body page.
@ -30,6 +35,10 @@ public class BodyPanel extends VerticalPanel{
public BodyPanel() {
this.init();
add(panelError);
getElement().getStyle().setProperty("width", "98%");
add(hp);
hp.addStyleName("the-central-table");
}
/**
@ -39,6 +48,15 @@ public class BodyPanel extends VerticalPanel{
add(loader);
loader.setVisible(false);
}
/**
* Adds the widget.
*
* @param w the w
*/
public void addWidget(Widget w){
hp.add(w);
}
/**
* Sets the loading.

View File

@ -1,67 +0,0 @@
/**
*
*/
package org.gcube.portlets.user.performfishanalytics.client.view.totest;
import com.google.gwt.cell.client.TextCell;
import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.user.cellview.client.CellTree;
import com.google.gwt.user.client.ui.RootLayoutPanel;
import com.google.gwt.view.client.ListDataProvider;
import com.google.gwt.view.client.TreeViewModel;
/**
*
* @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it
* Mar 4, 2019
*/
public class CellTreeExample implements EntryPoint {
/**
* The model that defines the nodes in the tree.
*/
private static class CustomTreeModel implements TreeViewModel {
/**
* Get the {@link NodeInfo} that provides the children of the specified
* value.
*/
public <T> NodeInfo<?> getNodeInfo(T value) {
/*
* Create some data in a data provider. Use the parent value as a prefix
* for the next level.
*/
ListDataProvider<String> dataProvider = new ListDataProvider<String>();
for (int i = 0; i < 2; i++) {
dataProvider.getList().add(value + "." + String.valueOf(i));
}
// Return a node info that pairs the data with a cell.
return new DefaultNodeInfo<String>(dataProvider, new TextCell());
}
/**
* Check if the specified value represents a leaf node. Leaf nodes cannot be
* opened.
*/
public boolean isLeaf(Object value) {
// The maximum length of a value is ten characters.
return value.toString().length() > 10;
}
}
public void onModuleLoad() {
// Create a model for the tree.
TreeViewModel model = new CustomTreeModel();
/*
* Create the tree using the model. We specify the default value of the
* hidden root node as "Item 1".
*/
CellTree tree = new CellTree(model, "Item 1");
// Add the tree to the root layout panel.
RootLayoutPanel.get().add(tree);
}
}

View File

@ -1,122 +0,0 @@
/**
*
*/
package org.gcube.portlets.user.performfishanalytics.client.view.totest;
import java.util.List;
import org.gcube.portlets.user.performfishanalytics.client.controllers.PerformFishAnalyticsController;
import org.gcube.portlets.user.performfishanalytics.client.event.SelectedKPIEvent;
import org.gcube.portlets.user.performfishanalytics.client.view.KPICell;
import org.gcube.portlets.user.performfishanalytics.shared.KPI;
import com.google.gwt.cell.client.Cell;
import com.google.gwt.cell.client.CheckboxCell;
import com.google.gwt.cell.client.CompositeCell;
import com.google.gwt.cell.client.FieldUpdater;
import com.google.gwt.cell.client.HasCell;
import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.Element;
import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
import com.google.gwt.view.client.SingleSelectionModel;
/**
* The Class LeafCell.
*
* @author Francesco Mangiacrapa at ISTI-CNR (francesco.mangiacrapa@isti.cnr.it)
* Mar 4, 2019
*/
public class LeafCell extends CompositeCell<KPI> {
private final SingleSelectionModel<KPI> multiSelectionModel =
new SingleSelectionModel<KPI>();
private List<HasCell<KPI, ?>> hasCells;
/**
* @param hasCells
*/
public LeafCell(List<HasCell<KPI, ?>> hasCells) {
super(hasCells);
this.hasCells = hasCells;
hasCells.add(new HasCell<KPI, Boolean>() {
private CheckboxCell cell = new CheckboxCell(true, true);
public Cell<Boolean> getCell() {
return cell;
}
public FieldUpdater<KPI, Boolean> getFieldUpdater() {
return new FieldUpdater<KPI, Boolean>() {
@Override
public void update(int index, KPI object, Boolean value) {
// TODO Auto-generated method stub
GWT.log("Checked: " + object.getName() + " value: " +
value);
PerformFishAnalyticsController.eventBus.fireEvent(new SelectedKPIEvent(
null, object, value));
// cell.set(value);
// dataGrid.redraw();
}
};
}
public Boolean getValue(KPI object) {
return multiSelectionModel.isSelected(object);
}
});
hasCells.add(new HasCell<KPI, KPI>() {
private KPICell cell = new KPICell(null);
public Cell<KPI> getCell() {
return cell;
}
public FieldUpdater<KPI, KPI> getFieldUpdater() {
return null;
}
public KPI getValue(KPI object) {
return object;
}
});
// TODO Auto-generated constructor stub
}
@Override
public void render(Context context, KPI value, SafeHtmlBuilder sb) {
sb.appendHtmlConstant("<table><tbody><tr>");
sb.appendHtmlConstant(value.getName());
sb.appendHtmlConstant("</tr></tbody></table>");
}
@Override
protected Element getContainerElement(Element parent) {
// Return the first TR element in the table.
return parent.getFirstChildElement().getFirstChildElement().getFirstChildElement();
}
@Override
protected <X> void render(
Context context, KPI value, SafeHtmlBuilder sb, HasCell<KPI, X> hasCell) {
Cell<X> cell = hasCell.getCell();
sb.appendHtmlConstant("<td>");
cell.render(context, hasCell.getValue(value), sb);
sb.appendHtmlConstant("</td>");
}
}

View File

@ -1,111 +0,0 @@
/**
*
*/
package org.gcube.portlets.user.performfishanalytics.client.view.totest;
import java.util.ArrayList;
import java.util.List;
import org.gcube.portlets.user.performfishanalytics.client.view.KPICell;
import org.gcube.portlets.user.performfishanalytics.shared.KPI;
import org.gcube.portlets.user.performfishanalytics.shared.PopulationType;
import com.google.gwt.cell.client.AbstractCell;
import com.google.gwt.cell.client.HasCell;
import com.google.gwt.cell.client.TextCell;
import com.google.gwt.core.shared.GWT;
import com.google.gwt.view.client.ListDataProvider;
import com.google.gwt.view.client.TreeViewModel;
/**
*
* @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it
* Mar 4, 2019
*/
public class NewCustomTreeModel implements TreeViewModel {
private ListDataProvider<KPI> populationTypeProvider = new ListDataProvider<KPI>();
public void setNewBatchType(PopulationType populationType) {
//GWT.log("Displayng KPI for: " + populationType.toString());
if (this.populationTypeProvider != null) {
//removing all data from base data provider
this.populationTypeProvider.getList().clear();
this.populationTypeProvider.getList().addAll(populationType.getListKPI());
}
}
/**
* Get the {@link NodeInfo} that provides the children of the specified
* value.
*/
public <T> NodeInfo<?> getNodeInfo(T value) {
GWT.log("Get Node Info fired: " + value);
if (value == null) {
// LEVEL 0.
// We passed null as the root value. Create a fake root KPIs
PopulationType rootKPI = new PopulationType("", "KPIs", "", "", null);
rootKPI.setListKPI(rootKPI.getListKPI());
ListDataProvider<String> dataProvider = new ListDataProvider<String>();
dataProvider.getList().add("KPIs");
TextCell textCell = new TextCell();
return new DefaultNodeInfo<String>(dataProvider, textCell);
}
else if (value instanceof PopulationType) {
// LEVEL 1.
// We want the children of PopulationType. Getting its list of KPI.
//
//PopulationTypeCell populatioCell = new PopulationTypeCell(null);
// ListDataProvider<KPI> dataProvider = new ListDataProvider<KPI>();
// dataProvider.getList().addAll(listOfKpi);
//List<KPI> listOfKpi = ((PopulationType) value).getListKPI();
KPICell kpi = new KPICell(null);
PopulationType populationType = (PopulationType) value;
GWT.log("populationType: "+populationType);
List<KPI> listOfKpi = populationType.getListKPI();
populationTypeProvider.getList().addAll(listOfKpi);
return new DefaultNodeInfo<KPI>(populationTypeProvider, kpi);
}
else if (value instanceof KPI) {
// LEVEL 2 - LEAF.
// We want the children of the KPI. Return them.
KPI kpiValue = (KPI) value;
List<KPI> listOfKpi = kpiValue.getListKPI();
//populationTypeProvider.getList().addAll(listOfKpi);
//GWT.log("KPI type listOfKpi: " + listOfKpi.toString());
ListDataProvider<KPI> kpiProvider = new ListDataProvider<KPI>(listOfKpi);
AbstractCell<KPI> cell = null;
if(kpiValue.isLeaf()){
List<HasCell<KPI, ?>> hasCells = new ArrayList<HasCell<KPI, ?>>();
cell = new LeafCell(hasCells);
}else{
cell = new KPICell(null);
}
return new DefaultNodeInfo<KPI>(kpiProvider, cell);
}
return null;
}
/**
* Check if the specified value represents a leaf node. Leaf nodes cannot be
* opened.
*/
public boolean isLeaf(Object value) {
// The leaf nodes are the songs, which are Strings.
if (value instanceof KPI) {
KPI toKPI = (KPI) value;
return toKPI.isLeaf();
}
return false;
}
}

View File

@ -1,60 +0,0 @@
/**
*
*/
package org.gcube.portlets.user.performfishanalytics.client.view.totest;
import org.gcube.portlets.user.performfishanalytics.shared.PopulationType;
import com.google.gwt.cell.client.AbstractCell;
import com.google.gwt.resources.client.ImageResource;
import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
import com.google.gwt.user.client.ui.AbstractImagePrototype;
/**
* @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it Jan 18, 2019
*/
public class PopulationTypeCell extends AbstractCell<PopulationType> {
/**
* The html of the image used for contacts.
*/
private String imageHtml;
public PopulationTypeCell(ImageResource image) {
if (image == null)
return;
this.imageHtml = AbstractImagePrototype.create(image).getHTML();
}
/*
* (non-Javadoc)
* @see
* com.google.gwt.cell.client.AbstractCell#render(com.google.gwt.cell.client
* .Cell.Context, java.lang.Object,
* com.google.gwt.safehtml.shared.SafeHtmlBuilder)
*/
@Override
public void render(
com.google.gwt.cell.client.Cell.Context context, PopulationType value,
SafeHtmlBuilder sb) {
// Value can be null, so do a null check..
if (value == null) {
return;
}
sb.appendHtmlConstant("<table>");
// Add the contact image.
sb.appendHtmlConstant("<tr>");
// sb.appendHtmlConstant("<td rowspan='3'>");
// sb.appendHtmlConstant(imageHtml);
// sb.appendHtmlConstant("</td>");
// Add the name and address.
sb.appendHtmlConstant("<td style='font-size:95%;'>");
sb.appendEscaped(value.getName());
sb.appendHtmlConstant("</td></tr>");
// sb.appendEscaped(value.getAddress());
sb.appendHtmlConstant("</table>");
}
}

View File

@ -210,38 +210,8 @@ public class PerformFishAnalitycsFormView extends Composite {
}
});
// KPI kpi = new KPI("", "", "Number fish/FTE employees in 2nd year", "", null, null, 1);
// getKPIForName("Number fish/FTE employees in 2nd year", Arrays.asList(kpi));
}
// /**
// * Gets the KPI for name.
// *
// * @param name the name
// * @return the KPI for name
// */
// public KPI getKPIForName(String name, List<KPI> selectedKPIs){
//
// //GWT.log("Selected KPIs: "+selectedKPIs);
// GWT.log("Searching name: "+name);
// KPI foundKPI = null;
// String purgedName = name.replace("\\", "\\\\");
// GWT.log("Purged name: "+purgedName);
// //String purgedName = name.trim();
// for (KPI kpi : selectedKPIs) {
// String purgedKPIName = kpi.getName().replace("\\", "\\\\");
// GWT.log("Purged Selected KPI name: "+purgedName);
// //String purgedKPIName = kpi.getName().trim();
// if(purgedKPIName.compareToIgnoreCase(purgedName)==0) {
// foundKPI = kpi;
// break;
// }
//
// }
// GWT.log("FOUND KPI: "+foundKPI);
// return foundKPI;
// }
/**
* Select all fields.
*

View File

@ -15,15 +15,14 @@ import org.gcube.portlets.user.performfishanalytics.shared.KPI;
import com.github.gwtbootstrap.client.ui.Alert;
import com.github.gwtbootstrap.client.ui.Button;
import com.github.gwtbootstrap.client.ui.Label;
import com.github.gwtbootstrap.client.ui.constants.AlertType;
import com.github.gwtbootstrap.client.ui.constants.LabelType;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;
@ -58,7 +57,7 @@ public class RecapSubmitPage extends Composite {
VerticalPanel errorPanelSubmit;
private HashMap<String, KPI> mapSelected = new HashMap<String, KPI>();
private HashMap<String, Label> mapLabel = new HashMap<String, Label>();
private HashMap<String, HTML> mapLabel = new HashMap<String, HTML>();
/**
* The Interface RecapSubmitPageUiBinder.
@ -83,6 +82,8 @@ public class RecapSubmitPage extends Composite {
public RecapSubmitPage() {
initWidget(uiBinder.createAndBindUi(this));
recapPanel.getElement().getStyle().setProperty("width", "98%");
uib_butt_descriptive_statistics.addClickHandler(new ClickHandler() {
@ -232,8 +233,9 @@ public class RecapSubmitPage extends Composite {
*/
private void addSelected(KPI kpi){
errorPanelSubmit.clear();
Label label = new Label(kpi.getName());
label.setType(LabelType.INFO);
HTML label = new HTML("* "+kpi.getName());
// Label label = new Label(kpi.getName());
// label.setType(LabelType.INFO);
recapPanel.add(label);
mapSelected.put(kpi.getId(), kpi);
mapLabel.put(kpi.getId(), label);
@ -245,7 +247,7 @@ public class RecapSubmitPage extends Composite {
*/
private void removeSelected(KPI kpi){
Label label = mapLabel.get(kpi.getId());
HTML label = mapLabel.get(kpi.getId());
mapSelected.remove(kpi.getId());
try{

View File

@ -13,7 +13,7 @@
</ui:style>
<g:HTMLPanel>
<g:VerticalPanel ui:field="recapPanel">
<g:Label styleName="{style.thetitle}">
<g:Label styleName="{style.thetitle}" addStyleNames="selected-kpi-panel">
Selected KPIs
</g:Label>
</g:VerticalPanel>

View File

@ -329,10 +329,10 @@ public class PerformFishAnalyticsServiceImpl extends RemoteServiceServlet
public PerformFishInitParameter validParameters(PerformFishInitParameter initParams) throws Exception{
Map<String, String> inputParameters = initParams.getParameters();
String farmID = inputParameters.get(PerformFishAnalyticsConstant.FARMID_PARAM);
/*String farmID = inputParameters.get(PerformFishAnalyticsConstant.FARMID_PARAM);
boolean grantAccess = checkGrantToAccessFarmID(farmID);
if(!grantAccess)
throw new Exception("You have no rights to access to this FARM. You does not belong to it.");
throw new Exception("You have no rights to access to this FARM. You does not belong to it.");*/
return initParams;

View File

@ -151,7 +151,7 @@ public class EntityManagerFactoryCreator {
public static String getJDBCConnectionUrl(boolean localMode) throws SessionExpired, Exception{
if(localMode){
log.warn("DB EMBEDDED MODE ACTIVATED");
log.info("DB EMBEDDED MODE ACTIVATED");
return "jdbc:h2:"+getPersistenceFolderPath()+"/H2AnalyticsDB;create=true";
}

View File

@ -1,12 +1,12 @@
KPI CODE,KPI NAME LEVEL 1,KPI NAME LEVEL 2,KPI NAME LEVEL 3
KPI CODE,KPI NAME - LEVEL 1,KPI NAME - LEVEL 2,KPI NAME - LEVEL 3
,Dependency on treatments KPIs
,,G9,,,Total number of antiparasitic treatments
,,G10,,,Total number of antibiotic treatments
,,G11,,,Amount of active compounds - antiparasitic
,,G12,,,Amount of active compounds - antibiotic
G9,,Total number of antiparasitic treatments
G10,,Total number of antibiotic treatments
G11,,Amount of active compounds - antiparasitic
G12,,Amount of active compounds - antibiotic
,Grow-out Productivity KPIs
,,G20,,,Biomass produced per number of FTE employees
,,G21,,,Biomass produced per volumes of sea water used
G20,,Biomass produced per number of FTE employees
G21,,Biomass produced per volumes of sea water used
,Environmental KPIs
,,Preservation of biodiversity and habitats KPIs
G22,,,Oxygen depletion persistence days
@ -20,4 +20,4 @@ G30,,,Freshwater use
G31,,,Energy used
G32,,,Fuel (Diesel) used for transport
G33,,,Fuel (Diesel) used for other uses
G35,,,Use of renewable energy
G35,,,Use of renewable energy

1 KPI CODE,KPI NAME – LEVEL 1,KPI NAME – LEVEL 2,KPI NAME – LEVEL 3 KPI CODE,KPI NAME - LEVEL 1,KPI NAME - LEVEL 2,KPI NAME - LEVEL 3
2 ,Dependency on treatments KPIs ,Dependency on treatments KPIs
3 ,,G9,,,Total number of antiparasitic treatments G9,,Total number of antiparasitic treatments
4 ,,G10,,,Total number of antibiotic treatments G10,,Total number of antibiotic treatments
5 ,,G11,,,Amount of active compounds - antiparasitic G11,,Amount of active compounds - antiparasitic
6 ,,G12,,,Amount of active compounds - antibiotic G12,,Amount of active compounds - antibiotic
7 ,Grow-out Productivity KPIs ,Grow-out Productivity KPIs
8 ,,G20,,,Biomass produced per number of FTE employees G20,,Biomass produced per number of FTE employees
9 ,,G21,,,Biomass produced per volumes of sea water used G21,,Biomass produced per volumes of sea water used
10 ,Environmental KPIs ,Environmental KPIs
11 ,,Preservation of biodiversity and habitats KPIs ,,Preservation of biodiversity and habitats KPIs
12 G22,,,Oxygen depletion persistence days G22,,,Oxygen depletion persistence days
20 G31,,,Energy used G31,,,Energy used
21 G32,,,Fuel (Diesel) used for transport G32,,,Fuel (Diesel) used for transport
22 G33,,,Fuel (Diesel) used for other uses G33,,,Fuel (Diesel) used for other uses
23 G35,,,Use of renewable energy G35,,,Use of renewable energy

View File

@ -1,4 +1,4 @@
KPI CODE,KPI NAME LEVEL 1,KPI NAME LEVEL 2,KPI NAME LEVEL 3
KPI CODE,KPI NAME - LEVEL 1,KPI NAME - LEVEL 2,KPI NAME - LEVEL 3
,Fish Losses KPIs
,,Mortalities - total
G1_1,,,Mortalities - Stocking-50g (%)

1 KPI CODE,KPI NAME – LEVEL 1,KPI NAME – LEVEL 2,KPI NAME – LEVEL 3 KPI CODE,KPI NAME - LEVEL 1,KPI NAME - LEVEL 2,KPI NAME - LEVEL 3
2 ,Fish Losses KPIs
3 ,,Mortalities - total
4 G1_1,,,Mortalities - Stocking-50g (%)

View File

@ -1,4 +1,4 @@
KPI CODE,KPI NAME LEVEL 1,KPI NAME LEVEL 2,KPI NAME LEVEL 3
KPI CODE,KPI NAME - LEVEL 1,KPI NAME - LEVEL 2,KPI NAME - LEVEL 3
,Fish Losses KPIs
,,Mortalities - total
G1_1,,,Mortalities - Stocking-50g (%)

1 KPI CODE,KPI NAME – LEVEL 1,KPI NAME – LEVEL 2,KPI NAME – LEVEL 3 KPI CODE,KPI NAME - LEVEL 1,KPI NAME - LEVEL 2,KPI NAME - LEVEL 3
2 ,Fish Losses KPIs
3 ,,Mortalities - total
4 G1_1,,,Mortalities - Stocking-50g (%)

View File

@ -1,4 +1,4 @@
KPI CODE,KPI NAME LEVEL 1,KPI NAME LEVEL 2,KPI NAME LEVEL 3
KPI CODE,KPI NAME - LEVEL 1,KPI NAME - LEVEL 2,KPI NAME - LEVEL 3
,Hatchery Total Productivity KPIs
,,Weaned fish
H1,,,Weaned fish (%)

1 KPI CODE,KPI NAME – LEVEL 1,KPI NAME – LEVEL 2,KPI NAME – LEVEL 3 KPI CODE,KPI NAME - LEVEL 1,KPI NAME - LEVEL 2,KPI NAME - LEVEL 3
2 ,Hatchery Total Productivity KPIs
3 ,,Weaned fish
4 H1,,,Weaned fish (%)

View File

@ -1,4 +1,4 @@
KPI CODE,KPI NAME LEVEL 1,KPI NAME LEVEL 2,KPI NAME LEVEL 3
KPI CODE,KPI NAME - LEVEL 1,KPI NAME - LEVEL 2,KPI NAME - LEVEL 3
,Hatchery Total Productivity KPIs,,
,,Weaned fish,
H1,,,Weaned fish (%)

1 KPI CODE KPI NAME – LEVEL 1 KPI NAME - LEVEL 1 KPI NAME – LEVEL 2 KPI NAME - LEVEL 2 KPI NAME – LEVEL 3 KPI NAME - LEVEL 3
2 Hatchery Total Productivity KPIs
3 Weaned fish
4 H1 Weaned fish (%)

View File

@ -1,4 +1,4 @@
KPI CODE,KPI NAME LEVEL 1,KPI NAME LEVEL 2,KPI NAME LEVEL 3
KPI CODE,KPI NAME - LEVEL 1,KPI NAME - LEVEL 2,KPI NAME - LEVEL 3
,Pre-grow Total Productivity KPIs,,
,,Deformed fish,
P1,,,Deformed fish (%)

1 KPI CODE KPI NAME – LEVEL 1 KPI NAME - LEVEL 1 KPI NAME – LEVEL 2 KPI NAME - LEVEL 2 KPI NAME – LEVEL 3 KPI NAME - LEVEL 3
2 Pre-grow Total Productivity KPIs
3 Deformed fish
4 P1 Deformed fish (%)

View File

@ -1,4 +1,4 @@
KPI CODE,KPI NAME LEVEL 1,KPI NAME LEVEL 2,KPI NAME LEVEL 3
KPI CODE,KPI NAME - LEVEL 1,KPI NAME - LEVEL 2,KPI NAME - LEVEL 3
,Pre-grow Total Productivity KPIs,,
,,Deformed fish,
P1,,,Deformed fish (%)

1 KPI CODE KPI NAME – LEVEL 1 KPI NAME - LEVEL 1 KPI NAME – LEVEL 2 KPI NAME - LEVEL 2 KPI NAME – LEVEL 3 KPI NAME - LEVEL 3
2 Pre-grow Total Productivity KPIs
3 Deformed fish
4 P1 Deformed fish (%)

View File

@ -170,3 +170,23 @@ table.fixedtable td {
margin-left: 20px;
}
.selected-kpi-panel{
overflow-wrap: break-word;
}
.form-horizontal .controls{
margin-left: 100px !important;
}
.form-horizontal .control-label{
width: 90px !important;
}
.the-central-table {
width: 100%;
}
the-central-table td {
padding: 2px;
}