CCM NG/ccm-cms: Vaadion prototype of folder browser
git-svn-id: https://svn.libreccm.org/ccm/ccm_ng@5010 8810af33-2d31-482b-a856-94f89814c4df
parent
6393741280
commit
2bcf8737af
|
|
@ -1,112 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (C) 2017 LibreCCM Foundation.
|
|
||||||
*
|
|
||||||
* This library is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
|
||||||
* License as published by the Free Software Foundation; either
|
|
||||||
* version 2.1 of the License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This library is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* Lesser General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Lesser General Public
|
|
||||||
* License along with this library; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
|
||||||
* MA 02110-1301 USA
|
|
||||||
*/
|
|
||||||
package org.librecms.ui;
|
|
||||||
|
|
||||||
import com.vaadin.ui.CustomComponent;
|
|
||||||
import com.vaadin.ui.Grid;
|
|
||||||
import com.vaadin.ui.HorizontalSplitPanel;
|
|
||||||
import com.vaadin.ui.ItemCollapseAllowedProvider;
|
|
||||||
import com.vaadin.ui.Tree;
|
|
||||||
import org.librecms.contentsection.Folder;
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
|
||||||
*/
|
|
||||||
public class BrowseDocuments extends CustomComponent {
|
|
||||||
|
|
||||||
private static final long serialVersionUID = -7241214812224026430L;
|
|
||||||
|
|
||||||
private static final String COL_DOCUMENT_CREATED = "created";
|
|
||||||
private static final String COL_DOCUMENT_LAST_MODIFIED = "lastmodified";
|
|
||||||
private static final String COL_DOCUMENT_NAME = "name";
|
|
||||||
private static final String COL_DOCUMENT_TITLE = "title";
|
|
||||||
private static final String COL_DOCUMENT_TYPE = "ttype";
|
|
||||||
|
|
||||||
private final ContentSectionViewController controller;
|
|
||||||
|
|
||||||
private final Tree<Folder> folderTree;
|
|
||||||
private final Grid<BrowseDocumentsItem> documentsGrid;
|
|
||||||
private final BrowseDocumentsDataProvider documentsDataProvider;
|
|
||||||
private final BrowseDocumentsFolderTreeDataProvider folderTreeDataProvider;
|
|
||||||
|
|
||||||
public BrowseDocuments(final ContentSectionViewController controller) {
|
|
||||||
|
|
||||||
super();
|
|
||||||
|
|
||||||
this.controller = controller;
|
|
||||||
|
|
||||||
folderTreeDataProvider = controller.getFolderTreeDataProvider();
|
|
||||||
folderTree = new Tree<>(folderTreeDataProvider);
|
|
||||||
folderTree.setItemCaptionGenerator(folder -> {
|
|
||||||
return controller
|
|
||||||
.getGlobalizationHelper()
|
|
||||||
.getValueFromLocalizedString(folder.getTitle());
|
|
||||||
});
|
|
||||||
|
|
||||||
documentsGrid = new Grid<>();
|
|
||||||
documentsGrid
|
|
||||||
.addColumn(BrowseDocumentsItem::getName)
|
|
||||||
.setCaption("Name")
|
|
||||||
.setId(COL_DOCUMENT_NAME);
|
|
||||||
documentsGrid
|
|
||||||
.addColumn(BrowseDocumentsItem::getTitle)
|
|
||||||
.setCaption("Title")
|
|
||||||
.setId(COL_DOCUMENT_TITLE);
|
|
||||||
documentsGrid
|
|
||||||
.addColumn(BrowseDocumentsItem::getType)
|
|
||||||
.setCaption("Type")
|
|
||||||
.setId(COL_DOCUMENT_TYPE);
|
|
||||||
documentsGrid
|
|
||||||
.addColumn(BrowseDocumentsItem::getCreationDate)
|
|
||||||
.setCaption("Created")
|
|
||||||
.setId(COL_DOCUMENT_CREATED);
|
|
||||||
documentsGrid
|
|
||||||
.addColumn(BrowseDocumentsItem::getLastModified)
|
|
||||||
.setCaption("Last modified")
|
|
||||||
.setId(COL_DOCUMENT_LAST_MODIFIED);
|
|
||||||
documentsDataProvider = controller.getBrowseDocumentsDataProvider();
|
|
||||||
documentsGrid.setDataProvider(documentsDataProvider);
|
|
||||||
documentsGrid.setWidth("100%");
|
|
||||||
documentsGrid.setHeight("100%");
|
|
||||||
|
|
||||||
folderTree.addItemClickListener(event -> {
|
|
||||||
documentsDataProvider.setCurrentFolder(event.getItem());
|
|
||||||
documentsDataProvider.refreshAll();
|
|
||||||
});
|
|
||||||
folderTree.setItemCollapseAllowedProvider(folder -> {
|
|
||||||
return folder.getParentCategory() != null;
|
|
||||||
});
|
|
||||||
|
|
||||||
final HorizontalSplitPanel splitPanel = new HorizontalSplitPanel(
|
|
||||||
folderTree, documentsGrid);
|
|
||||||
splitPanel.setSplitPosition(17.5f, Unit.PERCENTAGE);
|
|
||||||
splitPanel.setHeight("100%");
|
|
||||||
super.setCompositionRoot(splitPanel);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Tree<Folder> getFolderTree() {
|
|
||||||
return folderTree;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Grid<BrowseDocumentsItem> getDocumentsGrid() {
|
|
||||||
return documentsGrid;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
@ -21,12 +21,12 @@ package org.librecms.ui;
|
||||||
import com.vaadin.cdi.CDIView;
|
import com.vaadin.cdi.CDIView;
|
||||||
import com.vaadin.navigator.View;
|
import com.vaadin.navigator.View;
|
||||||
import com.vaadin.navigator.ViewChangeListener;
|
import com.vaadin.navigator.ViewChangeListener;
|
||||||
|
import com.vaadin.ui.Component;
|
||||||
import com.vaadin.ui.CustomComponent;
|
import com.vaadin.ui.CustomComponent;
|
||||||
import com.vaadin.ui.Label;
|
import com.vaadin.ui.Label;
|
||||||
import com.vaadin.ui.Panel;
|
import com.vaadin.ui.Panel;
|
||||||
import com.vaadin.ui.TabSheet;
|
import com.vaadin.ui.TabSheet;
|
||||||
import com.vaadin.ui.VerticalLayout;
|
import com.vaadin.ui.VerticalLayout;
|
||||||
import com.vaadin.ui.themes.ValoTheme;
|
|
||||||
import org.librecms.contentsection.ContentSection;
|
import org.librecms.contentsection.ContentSection;
|
||||||
import org.librecms.contentsection.ContentSectionRepository;
|
import org.librecms.contentsection.ContentSectionRepository;
|
||||||
|
|
||||||
|
|
@ -46,6 +46,14 @@ class ContentSectionView extends CustomComponent implements View {
|
||||||
|
|
||||||
public static final String VIEWNAME = "ContentSection";
|
public static final String VIEWNAME = "ContentSection";
|
||||||
|
|
||||||
|
private static final String TAB_DOCUMENTS = "tab_documents";
|
||||||
|
private static final String TAB_SEARCH = "tab_search";
|
||||||
|
private static final String TAB_MEDIA = "tab_media";
|
||||||
|
private static final String TAB_ROLES = "tab_roles";
|
||||||
|
private static final String TAB_WORKFLOWS = "tab_workflows";
|
||||||
|
private static final String TAB_LIFECYCLES = "tab_lifecycles";
|
||||||
|
private static final String TAB_DOCUMENT_TYPES = "tab_document_types";
|
||||||
|
|
||||||
private final ContentSectionViewController controller;
|
private final ContentSectionViewController controller;
|
||||||
|
|
||||||
private ContentSection selectedSection;
|
private ContentSection selectedSection;
|
||||||
|
|
@ -53,6 +61,8 @@ class ContentSectionView extends CustomComponent implements View {
|
||||||
private final TabSheet tabSheet;
|
private final TabSheet tabSheet;
|
||||||
private final Panel noSectionPanel;
|
private final Panel noSectionPanel;
|
||||||
|
|
||||||
|
private final FolderBrowser folderBrowser;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
ContentSectionView(final ContentSectionViewController controller) {
|
ContentSectionView(final ContentSectionViewController controller) {
|
||||||
|
|
||||||
|
|
@ -60,26 +70,63 @@ class ContentSectionView extends CustomComponent implements View {
|
||||||
|
|
||||||
this.controller = controller;
|
this.controller = controller;
|
||||||
|
|
||||||
final BrowseDocuments browseDocuments = new BrowseDocuments(controller);
|
folderBrowser = new FolderBrowser(controller);
|
||||||
|
final VerticalLayout folderBrowserLayout = new VerticalLayout();
|
||||||
|
folderBrowserLayout.setHeight("100%");
|
||||||
|
folderBrowserLayout.addComponentsAndExpand(folderBrowser);
|
||||||
|
|
||||||
tabSheet = new TabSheet();
|
tabSheet = new TabSheet();
|
||||||
tabSheet.addTab(browseDocuments, "Documents");
|
tabSheet
|
||||||
tabSheet.addTab(new Label("Search placeholder"), "Search");
|
.addTab(folderBrowser, "Documents")
|
||||||
tabSheet.addTab(new Label("Media & Records placeholder"),
|
.setId(TAB_DOCUMENTS);
|
||||||
"Media & Records");
|
tabSheet
|
||||||
tabSheet.addTab(new Label("Roles placeholder"), "Roles");
|
.addTab(new Label("Search placeholder"), "Search")
|
||||||
tabSheet.addTab(new Label("Workflows Placeholder"), "Workflows");
|
.setId(TAB_SEARCH);
|
||||||
tabSheet.addTab(new Label("Lifecycles placeholder"), "Lifecycles");
|
tabSheet
|
||||||
tabSheet.addTab(new Label("Document types placeholder"),
|
.addTab(new Label("Media & Records placeholder"), "Media & Records")
|
||||||
"Documents types");
|
.setId(TAB_MEDIA);
|
||||||
|
tabSheet
|
||||||
|
.addTab(new Label("Roles placeholder"), "Roles")
|
||||||
|
.setId(TAB_ROLES);
|
||||||
|
tabSheet
|
||||||
|
.addTab(new Label("Workflows Placeholder"), "Workflows")
|
||||||
|
.setId(TAB_WORKFLOWS);
|
||||||
|
tabSheet
|
||||||
|
.addTab(new Label("Lifecycles placeholder"), "Lifecycles")
|
||||||
|
.setId(TAB_LIFECYCLES);
|
||||||
|
tabSheet
|
||||||
|
.addTab(new Label("Document types placeholder"), "Documents types")
|
||||||
|
.setId(TAB_DOCUMENT_TYPES);
|
||||||
|
|
||||||
|
tabSheet.addSelectedTabChangeListener(event -> {
|
||||||
|
|
||||||
|
final Component selectedTab = event.getTabSheet().getSelectedTab();
|
||||||
|
|
||||||
|
if (TAB_DOCUMENTS.equals(selectedTab.getId())) {
|
||||||
|
|
||||||
|
final FolderBrowser browser = (FolderBrowser) selectedTab;
|
||||||
|
|
||||||
|
browser
|
||||||
|
.getFolderTree()
|
||||||
|
.expand(controller
|
||||||
|
.getContentSectionViewState()
|
||||||
|
.getSelectedContentSection()
|
||||||
|
.getRootDocumentsFolder());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
tabSheet.setHeight("100%");
|
||||||
|
|
||||||
noSectionPanel = new Panel();
|
noSectionPanel = new Panel();
|
||||||
noSectionPanel.setVisible(false);
|
noSectionPanel.setVisible(false);
|
||||||
|
|
||||||
final VerticalLayout layout = new VerticalLayout(tabSheet,
|
final VerticalLayout layout = new VerticalLayout();
|
||||||
noSectionPanel);
|
layout.addComponentsAndExpand(tabSheet, noSectionPanel);
|
||||||
|
layout.setHeight("100%");
|
||||||
|
layout.addStyleName("content-section-view-layout");
|
||||||
|
|
||||||
super.setCompositionRoot(layout);
|
super.setCompositionRoot(layout);
|
||||||
|
super.setHeight("100%");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
@ -104,6 +151,13 @@ class ContentSectionView extends CustomComponent implements View {
|
||||||
controller
|
controller
|
||||||
.getContentSectionViewState()
|
.getContentSectionViewState()
|
||||||
.setSelectedContentSection(selectedSection);
|
.setSelectedContentSection(selectedSection);
|
||||||
|
|
||||||
|
folderBrowser
|
||||||
|
.getFolderTree()
|
||||||
|
.expand(controller
|
||||||
|
.getContentSectionViewState()
|
||||||
|
.getSelectedContentSection()
|
||||||
|
.getRootDocumentsFolder());
|
||||||
} else {
|
} else {
|
||||||
tabSheet.setVisible(false);
|
tabSheet.setVisible(false);
|
||||||
noSectionPanel.setCaption(String
|
noSectionPanel.setCaption(String
|
||||||
|
|
|
||||||
|
|
@ -36,10 +36,10 @@ import javax.inject.Inject;
|
||||||
public class ContentSectionViewController {
|
public class ContentSectionViewController {
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
private BrowseDocumentsDataProvider browseDocumentsDataProvider;
|
private FolderBrowserDataProvider browseDocumentsDataProvider;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
private BrowseDocumentsFolderTreeDataProvider folderTreeDataProvider;
|
private FolderBrowserFolderTreeDataProvider folderTreeDataProvider;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
private ContentTypesManager contentTypesManager;
|
private ContentTypesManager contentTypesManager;
|
||||||
|
|
@ -59,11 +59,11 @@ public class ContentSectionViewController {
|
||||||
@Inject
|
@Inject
|
||||||
private ContentSectionViewState contentSectionViewState;
|
private ContentSectionViewState contentSectionViewState;
|
||||||
|
|
||||||
protected BrowseDocumentsDataProvider getBrowseDocumentsDataProvider() {
|
protected FolderBrowserDataProvider getBrowseDocumentsDataProvider() {
|
||||||
return browseDocumentsDataProvider;
|
return browseDocumentsDataProvider;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected BrowseDocumentsFolderTreeDataProvider getFolderTreeDataProvider() {
|
protected FolderBrowserFolderTreeDataProvider getFolderTreeDataProvider() {
|
||||||
return folderTreeDataProvider;
|
return folderTreeDataProvider;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -19,17 +19,20 @@
|
||||||
package org.librecms.ui;
|
package org.librecms.ui;
|
||||||
|
|
||||||
import com.vaadin.icons.VaadinIcons;
|
import com.vaadin.icons.VaadinIcons;
|
||||||
import com.vaadin.navigator.Navigator;
|
|
||||||
import com.vaadin.ui.Button;
|
import com.vaadin.ui.Button;
|
||||||
import com.vaadin.ui.Component;
|
import com.vaadin.ui.Component;
|
||||||
|
import com.vaadin.ui.FormLayout;
|
||||||
import com.vaadin.ui.Grid;
|
import com.vaadin.ui.Grid;
|
||||||
import com.vaadin.ui.HorizontalLayout;
|
import com.vaadin.ui.HorizontalLayout;
|
||||||
import com.vaadin.ui.Label;
|
import com.vaadin.ui.Label;
|
||||||
|
import com.vaadin.ui.TextField;
|
||||||
|
import com.vaadin.ui.Window;
|
||||||
import com.vaadin.ui.components.grid.HeaderCell;
|
import com.vaadin.ui.components.grid.HeaderCell;
|
||||||
import com.vaadin.ui.components.grid.HeaderRow;
|
import com.vaadin.ui.components.grid.HeaderRow;
|
||||||
import com.vaadin.ui.themes.ValoTheme;
|
import com.vaadin.ui.themes.ValoTheme;
|
||||||
import org.libreccm.security.PermissionChecker;
|
import org.libreccm.security.PermissionChecker;
|
||||||
import org.librecms.contentsection.ContentSection;
|
import org.librecms.contentsection.ContentSection;
|
||||||
|
import org.librecms.contentsection.Folder;
|
||||||
import org.librecms.contentsection.privileges.AdminPrivileges;
|
import org.librecms.contentsection.privileges.AdminPrivileges;
|
||||||
import org.librecms.contentsection.privileges.ItemPrivileges;
|
import org.librecms.contentsection.privileges.ItemPrivileges;
|
||||||
|
|
||||||
|
|
@ -55,9 +58,6 @@ class ContentSectionsGrid extends Grid<ContentSection> {
|
||||||
|
|
||||||
this.controller = controller;
|
this.controller = controller;
|
||||||
|
|
||||||
final PermissionChecker permissionChecker = controller
|
|
||||||
.getPermissionChecker();
|
|
||||||
|
|
||||||
addComponentColumn(this::buildSectionLink)
|
addComponentColumn(this::buildSectionLink)
|
||||||
.setId(COL_LABEL)
|
.setId(COL_LABEL)
|
||||||
.setCaption("Content Section");
|
.setCaption("Content Section");
|
||||||
|
|
@ -68,6 +68,8 @@ class ContentSectionsGrid extends Grid<ContentSection> {
|
||||||
.setId(COL_DELETE)
|
.setId(COL_DELETE)
|
||||||
.setCaption("Delete");
|
.setCaption("Delete");
|
||||||
|
|
||||||
|
setSelectionMode(SelectionMode.NONE);
|
||||||
|
|
||||||
setDataProvider(controller.getSectionsDataProvider());
|
setDataProvider(controller.getSectionsDataProvider());
|
||||||
|
|
||||||
if (controller.getPermissionChecker().isPermitted("admin")) {
|
if (controller.getPermissionChecker().isPermitted("admin")) {
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,252 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2017 LibreCCM Foundation.
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||||
|
* MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
package org.librecms.ui;
|
||||||
|
|
||||||
|
import com.vaadin.icons.VaadinIcons;
|
||||||
|
import com.vaadin.ui.Button;
|
||||||
|
import com.vaadin.ui.Component;
|
||||||
|
import com.vaadin.ui.CustomComponent;
|
||||||
|
import com.vaadin.ui.FormLayout;
|
||||||
|
import com.vaadin.ui.Grid;
|
||||||
|
import com.vaadin.ui.HorizontalLayout;
|
||||||
|
import com.vaadin.ui.HorizontalSplitPanel;
|
||||||
|
import com.vaadin.ui.TextField;
|
||||||
|
import com.vaadin.ui.Tree;
|
||||||
|
import com.vaadin.ui.VerticalLayout;
|
||||||
|
import com.vaadin.ui.Window;
|
||||||
|
import com.vaadin.ui.components.grid.HeaderCell;
|
||||||
|
import com.vaadin.ui.components.grid.HeaderRow;
|
||||||
|
import com.vaadin.ui.renderers.DateRenderer;
|
||||||
|
import com.vaadin.ui.themes.ValoTheme;
|
||||||
|
import org.librecms.contentsection.Folder;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||||
|
*/
|
||||||
|
public class FolderBrowser extends CustomComponent {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = -7241214812224026430L;
|
||||||
|
|
||||||
|
private static final String COL_DOCUMENT_CREATED = "created";
|
||||||
|
private static final String COL_DOCUMENT_LAST_MODIFIED = "lastmodified";
|
||||||
|
private static final String COL_DOCUMENT_NAME = "name";
|
||||||
|
private static final String COL_DOCUMENT_TITLE = "title";
|
||||||
|
private static final String COL_DOCUMENT_TYPE = "ttype";
|
||||||
|
|
||||||
|
private final ContentSectionViewController controller;
|
||||||
|
|
||||||
|
private final Tree<Folder> folderTree;
|
||||||
|
private final Grid<FolderBrowserItem> documentsGrid;
|
||||||
|
|
||||||
|
private final Button renameCurrentFolderButton;
|
||||||
|
|
||||||
|
private final FolderBrowserDataProvider documentsDataProvider;
|
||||||
|
private final FolderBrowserFolderTreeDataProvider folderTreeDataProvider;
|
||||||
|
|
||||||
|
public FolderBrowser(final ContentSectionViewController controller) {
|
||||||
|
|
||||||
|
super();
|
||||||
|
|
||||||
|
this.controller = controller;
|
||||||
|
|
||||||
|
folderTreeDataProvider = controller.getFolderTreeDataProvider();
|
||||||
|
folderTree = new Tree<>(folderTreeDataProvider);
|
||||||
|
folderTree.setItemCaptionGenerator(folder -> {
|
||||||
|
return controller
|
||||||
|
.getGlobalizationHelper()
|
||||||
|
.getValueFromLocalizedString(folder.getTitle());
|
||||||
|
});
|
||||||
|
|
||||||
|
documentsGrid = new Grid<>();
|
||||||
|
documentsGrid
|
||||||
|
.addComponentColumn(item -> buildFolderItemLink(item))
|
||||||
|
.setCaption("Name")
|
||||||
|
.setId(COL_DOCUMENT_NAME);
|
||||||
|
documentsGrid
|
||||||
|
.addColumn(FolderBrowserItem::getTitle)
|
||||||
|
.setCaption("Title")
|
||||||
|
.setId(COL_DOCUMENT_TITLE);
|
||||||
|
documentsGrid
|
||||||
|
.addColumn(FolderBrowserItem::getType)
|
||||||
|
.setCaption("Type")
|
||||||
|
.setId(COL_DOCUMENT_TYPE);
|
||||||
|
documentsGrid
|
||||||
|
.addColumn(FolderBrowserItem::getCreationDate,
|
||||||
|
new DateRenderer("%tF"))
|
||||||
|
.setCaption("Created")
|
||||||
|
.setId(COL_DOCUMENT_CREATED);
|
||||||
|
documentsGrid
|
||||||
|
.addColumn(FolderBrowserItem::getLastModified,
|
||||||
|
new DateRenderer("%tF"))
|
||||||
|
.setCaption("Last modified")
|
||||||
|
.setId(COL_DOCUMENT_LAST_MODIFIED);
|
||||||
|
documentsDataProvider = controller.getBrowseDocumentsDataProvider();
|
||||||
|
documentsGrid.setDataProvider(documentsDataProvider);
|
||||||
|
documentsGrid.setSelectionMode(Grid.SelectionMode.MULTI);
|
||||||
|
documentsGrid.setWidth("100%");
|
||||||
|
documentsGrid.setHeight("100%");
|
||||||
|
|
||||||
|
final Button createSubFolderButton = new Button("New subfolder",
|
||||||
|
VaadinIcons.PLUS_CIRCLE_O);
|
||||||
|
createSubFolderButton.addStyleName(ValoTheme.BUTTON_TINY);
|
||||||
|
renameCurrentFolderButton = new Button("Rename current folder",
|
||||||
|
VaadinIcons.EDIT);
|
||||||
|
renameCurrentFolderButton.addStyleName(ValoTheme.BUTTON_TINY);
|
||||||
|
renameCurrentFolderButton.setEnabled(false);
|
||||||
|
renameCurrentFolderButton.setVisible(false);
|
||||||
|
final HeaderRow headerRow = documentsGrid.prependHeaderRow();
|
||||||
|
final HeaderCell actionsCell = headerRow.join(COL_DOCUMENT_NAME,
|
||||||
|
COL_DOCUMENT_TITLE,
|
||||||
|
COL_DOCUMENT_TYPE,
|
||||||
|
COL_DOCUMENT_CREATED,
|
||||||
|
COL_DOCUMENT_LAST_MODIFIED);
|
||||||
|
actionsCell.setComponent(new HorizontalLayout(createSubFolderButton,
|
||||||
|
renameCurrentFolderButton));
|
||||||
|
|
||||||
|
folderTree.addItemClickListener(event -> {
|
||||||
|
// documentsDataProvider.setCurrentFolder(event.getItem());
|
||||||
|
// documentsDataProvider.refreshAll();
|
||||||
|
setCurrentFolder(event.getItem());
|
||||||
|
});
|
||||||
|
folderTree.setItemCollapseAllowedProvider(folder -> {
|
||||||
|
return folder.getParentCategory() != null;
|
||||||
|
});
|
||||||
|
|
||||||
|
// final Button root = new Button("/ ");
|
||||||
|
// root.addStyleName(ValoTheme.BUTTON_LINK);
|
||||||
|
// root.addClickListener(event -> {
|
||||||
|
// folderTree.getSelectionModel().deselectAll();
|
||||||
|
// documentsDataProvider.setCurrentFolder(null);
|
||||||
|
// documentsDataProvider.refreshAll();
|
||||||
|
// });
|
||||||
|
// final VerticalLayout folders = new VerticalLayout(root, folderTree);
|
||||||
|
final VerticalLayout folderTreeLayout = new VerticalLayout(folderTree);
|
||||||
|
|
||||||
|
final VerticalLayout documentsGridLayout = new VerticalLayout();
|
||||||
|
documentsGridLayout.addComponentsAndExpand(documentsGrid);
|
||||||
|
|
||||||
|
final HorizontalSplitPanel splitPanel = new HorizontalSplitPanel(
|
||||||
|
folderTreeLayout, documentsGridLayout);
|
||||||
|
splitPanel.setSplitPosition(17.5f, Unit.PERCENTAGE);
|
||||||
|
splitPanel.setHeight("100%");
|
||||||
|
final VerticalLayout layout = new VerticalLayout();
|
||||||
|
layout.addComponentsAndExpand(splitPanel);
|
||||||
|
super.setCompositionRoot(layout);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Component buildFolderItemLink(final FolderBrowserItem item) {
|
||||||
|
|
||||||
|
final Button itemLink = new Button();
|
||||||
|
itemLink.setCaption(item.getName());
|
||||||
|
itemLink.setStyleName(ValoTheme.BUTTON_LINK);
|
||||||
|
itemLink.addClickListener(event -> folderBrowserItemClicked(event,
|
||||||
|
item));
|
||||||
|
if (item.isFolder()) {
|
||||||
|
itemLink.setIcon(VaadinIcons.FOLDER);
|
||||||
|
}
|
||||||
|
|
||||||
|
return itemLink;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void folderBrowserItemClicked(final Button.ClickEvent event,
|
||||||
|
final FolderBrowserItem item) {
|
||||||
|
|
||||||
|
if (item.isFolder()) {
|
||||||
|
final Folder folder = controller
|
||||||
|
.getFolderRepository()
|
||||||
|
.findById(item.getItemId())
|
||||||
|
.orElseThrow(() -> new IllegalArgumentException(String.format(
|
||||||
|
"No Folder with ID %d in the database.",
|
||||||
|
item.getItemId())));
|
||||||
|
// folderTree.expand(folder);
|
||||||
|
// documentsDataProvider.setCurrentFolder(folder);
|
||||||
|
// documentsDataProvider.refreshAll();
|
||||||
|
setCurrentFolder(folder);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setCurrentFolder(final Folder folder) {
|
||||||
|
folderTree.expand(folder);
|
||||||
|
documentsDataProvider.setCurrentFolder(folder);
|
||||||
|
documentsDataProvider.refreshAll();
|
||||||
|
|
||||||
|
renameCurrentFolderButton.setEnabled(folder.getParentCategory() != null);
|
||||||
|
renameCurrentFolderButton.setVisible(folder.getParentCategory() != null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Tree<Folder> getFolderTree() {
|
||||||
|
return folderTree;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Grid<FolderBrowserItem> getDocumentsGrid() {
|
||||||
|
return documentsGrid;
|
||||||
|
}
|
||||||
|
|
||||||
|
private class FolderDialog extends Window {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = -6767403288966354533L;
|
||||||
|
|
||||||
|
private final TextField nameField;
|
||||||
|
private final TextField titleField;
|
||||||
|
private final Button submitButton;
|
||||||
|
|
||||||
|
private Folder currentFolder;
|
||||||
|
|
||||||
|
public FolderDialog() {
|
||||||
|
super();
|
||||||
|
|
||||||
|
nameField = new TextField("Name");
|
||||||
|
nameField.setDescription("The name (URL-Fragment) of the folder.");
|
||||||
|
nameField.setRequiredIndicatorVisible(true);
|
||||||
|
nameField.setMaxLength(256);
|
||||||
|
|
||||||
|
titleField = new TextField("Title");
|
||||||
|
titleField.setDescription("The title of the folder.");
|
||||||
|
titleField.setRequiredIndicatorVisible(true);
|
||||||
|
titleField.setMaxLength(256);
|
||||||
|
|
||||||
|
final Button cancelButton = new Button("Cancel");
|
||||||
|
cancelButton.addClickListener(event -> close());
|
||||||
|
|
||||||
|
submitButton = new Button("Submit");
|
||||||
|
submitButton.addClickListener(event -> save());
|
||||||
|
|
||||||
|
final FormLayout layout = new FormLayout(nameField,
|
||||||
|
titleField,
|
||||||
|
cancelButton,
|
||||||
|
submitButton);
|
||||||
|
|
||||||
|
super.setContent(layout);
|
||||||
|
}
|
||||||
|
|
||||||
|
public FolderDialog(final Folder folder) {
|
||||||
|
this();
|
||||||
|
|
||||||
|
currentFolder = folder;
|
||||||
|
nameField.setValue(currentFolder.getName());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void save() {
|
||||||
|
this.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -47,8 +47,8 @@ import javax.transaction.Transactional;
|
||||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||||
*/
|
*/
|
||||||
@ViewScoped
|
@ViewScoped
|
||||||
class BrowseDocumentsDataProvider
|
class FolderBrowserDataProvider
|
||||||
extends AbstractBackEndDataProvider<BrowseDocumentsItem, String> {
|
extends AbstractBackEndDataProvider<FolderBrowserItem, String> {
|
||||||
|
|
||||||
private static final long serialVersionUID = 7693820518000376630L;
|
private static final long serialVersionUID = 7693820518000376630L;
|
||||||
|
|
||||||
|
|
@ -77,8 +77,8 @@ class BrowseDocumentsDataProvider
|
||||||
|
|
||||||
@Transactional(Transactional.TxType.REQUIRED)
|
@Transactional(Transactional.TxType.REQUIRED)
|
||||||
@Override
|
@Override
|
||||||
protected Stream<BrowseDocumentsItem> fetchFromBackEnd(
|
protected Stream<FolderBrowserItem> fetchFromBackEnd(
|
||||||
final Query<BrowseDocumentsItem, String> query) {
|
final Query<FolderBrowserItem, String> query) {
|
||||||
|
|
||||||
final Folder folder;
|
final Folder folder;
|
||||||
if (currentFolder == null) {
|
if (currentFolder == null) {
|
||||||
|
|
@ -157,9 +157,9 @@ class BrowseDocumentsDataProvider
|
||||||
.map(this::buildRow);
|
.map(this::buildRow);
|
||||||
}
|
}
|
||||||
|
|
||||||
private BrowseDocumentsItem buildRow(final CcmObject object) {
|
private FolderBrowserItem buildRow(final CcmObject object) {
|
||||||
|
|
||||||
final BrowseDocumentsItem row = new BrowseDocumentsItem();
|
final FolderBrowserItem row = new FolderBrowserItem();
|
||||||
if (object instanceof Folder) {
|
if (object instanceof Folder) {
|
||||||
|
|
||||||
final Folder folder = (Folder) object;
|
final Folder folder = (Folder) object;
|
||||||
|
|
@ -198,7 +198,7 @@ class BrowseDocumentsDataProvider
|
||||||
@Transactional(Transactional.TxType.REQUIRED)
|
@Transactional(Transactional.TxType.REQUIRED)
|
||||||
@Override
|
@Override
|
||||||
protected int sizeInBackEnd(
|
protected int sizeInBackEnd(
|
||||||
final Query<BrowseDocumentsItem, String> query) {
|
final Query<FolderBrowserItem, String> query) {
|
||||||
|
|
||||||
final Folder folder;
|
final Folder folder;
|
||||||
if (currentFolder == null) {
|
if (currentFolder == null) {
|
||||||
|
|
@ -382,10 +382,10 @@ class BrowseDocumentsDataProvider
|
||||||
// .getResultList();
|
// .getResultList();
|
||||||
// }
|
// }
|
||||||
//
|
//
|
||||||
// private BrowseDocumentsItem createBrowseDocumentsItem(
|
// private FolderBrowserItem createBrowseDocumentsItem(
|
||||||
// final Folder fromFolder) {
|
// final Folder fromFolder) {
|
||||||
//
|
//
|
||||||
// final BrowseDocumentsItem item = new BrowseDocumentsItem();
|
// final FolderBrowserItem item = new FolderBrowserItem();
|
||||||
// item.setItemId(fromFolder.getObjectId());
|
// item.setItemId(fromFolder.getObjectId());
|
||||||
// item.setName(fromFolder.getName());
|
// item.setName(fromFolder.getName());
|
||||||
// item.setTitle(fromFolder
|
// item.setTitle(fromFolder
|
||||||
|
|
@ -396,10 +396,10 @@ class BrowseDocumentsDataProvider
|
||||||
// return item;
|
// return item;
|
||||||
// }
|
// }
|
||||||
//
|
//
|
||||||
// private BrowseDocumentsItem createBrowseDocumentsItem(
|
// private FolderBrowserItem createBrowseDocumentsItem(
|
||||||
// final ContentItem fromItem) {
|
// final ContentItem fromItem) {
|
||||||
//
|
//
|
||||||
// final BrowseDocumentsItem item = new BrowseDocumentsItem();
|
// final FolderBrowserItem item = new FolderBrowserItem();
|
||||||
// item.setCreationDate(fromItem.getCreationDate());
|
// item.setCreationDate(fromItem.getCreationDate());
|
||||||
// item.setFolder(false);
|
// item.setFolder(false);
|
||||||
// item.setItemId(fromItem.getObjectId());
|
// item.setItemId(fromItem.getObjectId());
|
||||||
|
|
@ -42,7 +42,7 @@ import javax.transaction.Transactional;
|
||||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||||
*/
|
*/
|
||||||
@ViewScoped
|
@ViewScoped
|
||||||
public class BrowseDocumentsFolderTreeDataProvider
|
public class FolderBrowserFolderTreeDataProvider
|
||||||
extends AbstractBackEndHierarchicalDataProvider<Folder, String> {
|
extends AbstractBackEndHierarchicalDataProvider<Folder, String> {
|
||||||
|
|
||||||
private static final long serialVersionUID = 5330319780008907163L;
|
private static final long serialVersionUID = 5330319780008907163L;
|
||||||
|
|
@ -87,6 +87,7 @@ public class BrowseDocumentsFolderTreeDataProvider
|
||||||
return result.stream();
|
return result.stream();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// return folderRepo.findSubFolders(parent).stream();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Transactional(Transactional.TxType.REQUIRED)
|
@Transactional(Transactional.TxType.REQUIRED)
|
||||||
|
|
@ -103,22 +104,24 @@ public class BrowseDocumentsFolderTreeDataProvider
|
||||||
.orElseThrow(() -> new IllegalArgumentException(String
|
.orElseThrow(() -> new IllegalArgumentException(String
|
||||||
.format("No folder with ID %d in the database.",
|
.format("No folder with ID %d in the database.",
|
||||||
selectedParent.get().getObjectId())));
|
selectedParent.get().getObjectId())));
|
||||||
} else {
|
|
||||||
final ContentSection section = sectionRepo
|
|
||||||
.findById(contentSectionViewState
|
|
||||||
.getSelectedContentSection()
|
|
||||||
.getObjectId())
|
|
||||||
.orElseThrow(() -> new UnexpectedErrorException(String
|
|
||||||
.format("No ContentSection with ID %d in the database.",
|
|
||||||
contentSectionViewState
|
|
||||||
.getSelectedContentSection()
|
|
||||||
.getObjectId())));
|
|
||||||
|
|
||||||
parent = section.getRootDocumentsFolder();
|
return (int) folderRepo.countSubFolders(parent);
|
||||||
|
} else {
|
||||||
|
// final ContentSection section = sectionRepo
|
||||||
|
// .findById(contentSectionViewState
|
||||||
|
// .getSelectedContentSection()
|
||||||
|
// .getObjectId())
|
||||||
|
// .orElseThrow(() -> new UnexpectedErrorException(String
|
||||||
|
// .format("No ContentSection with ID %d in the database.",
|
||||||
|
// contentSectionViewState
|
||||||
|
// .getSelectedContentSection()
|
||||||
|
// .getObjectId())));
|
||||||
|
//
|
||||||
|
// parent = section.getRootDocumentsFolder();
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
return (int) folderRepo.countSubFolders(parent);
|
// return (int) folderRepo.countSubFolders(parent);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
@ -25,8 +25,8 @@ import java.util.Objects;
|
||||||
*
|
*
|
||||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||||
*/
|
*/
|
||||||
public final class BrowseDocumentsItem implements
|
public final class FolderBrowserItem implements
|
||||||
Comparable<BrowseDocumentsItem> {
|
Comparable<FolderBrowserItem> {
|
||||||
|
|
||||||
private long itemId;
|
private long itemId;
|
||||||
|
|
||||||
|
|
@ -111,7 +111,7 @@ public final class BrowseDocumentsItem implements
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int compareTo(final BrowseDocumentsItem other) {
|
public int compareTo(final FolderBrowserItem other) {
|
||||||
|
|
||||||
int result = title.compareTo(other.getTitle());
|
int result = title.compareTo(other.getTitle());
|
||||||
if (result != 0) {
|
if (result != 0) {
|
||||||
|
|
@ -157,10 +157,10 @@ public final class BrowseDocumentsItem implements
|
||||||
if (obj == null) {
|
if (obj == null) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (!(obj instanceof BrowseDocumentsItem)) {
|
if (!(obj instanceof FolderBrowserItem)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
final BrowseDocumentsItem other = (BrowseDocumentsItem) obj;
|
final FolderBrowserItem other = (FolderBrowserItem) obj;
|
||||||
if (itemId != other.getItemId()) {
|
if (itemId != other.getItemId()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
Loading…
Reference in New Issue