package com.constellio.app.ui.framework.components.table.columns; import java.io.IOException; import java.io.Serializable; import java.util.ArrayList; import java.util.Collection; import java.util.List; import com.constellio.app.services.factories.ConstellioFactories; import com.constellio.app.ui.application.ConstellioUI; import com.constellio.app.ui.entities.UserVO; import com.constellio.app.ui.pages.base.SessionContext; import com.constellio.model.entities.records.wrappers.User; import com.constellio.model.services.factories.ModelLayerFactory; import com.constellio.model.services.records.RecordServices; import com.constellio.model.services.records.RecordServicesException; import com.constellio.model.services.users.UserServices; import com.vaadin.ui.Table; import com.vaadin.ui.Table.ColumnCollapseEvent; import com.vaadin.ui.Table.ColumnCollapseListener; import com.vaadin.ui.Table.ColumnReorderEvent; import com.vaadin.ui.Table.ColumnReorderListener; public class TableColumnsManager implements Serializable { protected ConstellioFactories constellioFactories; protected ModelLayerFactory modelLayerFactory; protected transient RecordServices recordServices; protected transient UserServices userServices; protected transient User currentUser; public TableColumnsManager() { initTransientObjects(); } public TableColumnsManager(Table table, String tableId) { initTransientObjects(); manage(table, tableId); } private void readObject(java.io.ObjectInputStream stream) throws IOException, ClassNotFoundException { stream.defaultReadObject(); initTransientObjects(); } private void initTransientObjects() { SessionContext sessionContext = ConstellioUI.getCurrentSessionContext(); constellioFactories = ConstellioUI.getCurrent().getConstellioFactories(); modelLayerFactory = constellioFactories.getModelLayerFactory(); recordServices = modelLayerFactory.newRecordServices(); userServices = modelLayerFactory.newUserServices(); String collection = sessionContext.getCurrentCollection(); UserVO currentUserVO = sessionContext.getCurrentUser(); String username = currentUserVO.getUsername(); currentUser = userServices.getUserInCollection(username, collection); } public void manage(final Table table, final String tableId) { table.setColumnCollapsingAllowed(true); table.setColumnReorderingAllowed(true); List<String> visibleColumnIdsForUser = getVisibleColumnIdsForCurrentUser(table, tableId); Collection<?> propertyIds = table.getContainerPropertyIds(); for (Object propertyId : propertyIds) { String columnId = toColumnId(propertyId); boolean collapsed = !visibleColumnIdsForUser.contains(columnId); if (!collapsed || table.isColumnCollapsible(columnId)) { table.setColumnCollapsed(propertyId, collapsed); } } table.addColumnCollapseListener(new ColumnCollapseListener() { @Override public void columnCollapseStateChange(ColumnCollapseEvent event) { Object propertyId = event.getPropertyId(); String columnId = toColumnId(propertyId); boolean collapsed = table.isColumnCollapsed(propertyId); List<String> visibleColumnIdsForUser = getVisibleColumnIdsForCurrentUser(table, tableId); if (collapsed) { visibleColumnIdsForUser.remove(columnId); } else if (!visibleColumnIdsForUser.contains(columnId)) { visibleColumnIdsForUser.add(columnId); } currentUser.setVisibleTableColumns(tableId, visibleColumnIdsForUser); try { recordServices.update(currentUser); } catch (RecordServicesException e) { notifyException(e); } } }); table.addColumnReorderListener(new ColumnReorderListener() { @Override public void columnReorder(ColumnReorderEvent event) { Object[] visibleColumnIds = table.getVisibleColumns(); List<String> visibleColumnIdsForUser = new ArrayList<>(); for (Object visiblePropertyId : visibleColumnIds) { String columnId = toColumnId(visiblePropertyId); if (!table.isColumnCollapsed(visiblePropertyId)) { visibleColumnIdsForUser.add(columnId); } } currentUser.setVisibleTableColumns(tableId, visibleColumnIdsForUser); try { recordServices.update(currentUser); } catch (RecordServicesException e) { notifyException(e); } } }); } protected void notifyException(Exception e) { } private List<String> getVisibleColumnIdsForCurrentUser(Table table, String tableId) { List<String> visibleColumnIds = currentUser.getVisibleTableColumnsFor(tableId); if (visibleColumnIds == null) { visibleColumnIds = new ArrayList<>(); } if (visibleColumnIds.isEmpty()) { visibleColumnIds = getDefaultVisibleColumnIds(table); } return visibleColumnIds; } protected List<String> getDefaultVisibleColumnIds(Table table) { List<String> visibleColumnIds = new ArrayList<String>(); Object[] visibleColumns = table.getVisibleColumns(); for (Object visibleColumn : visibleColumns) { visibleColumnIds.add(toColumnId(visibleColumn)); } return visibleColumnIds; } protected String toColumnId(Object propertyId) { return propertyId.toString(); } }