/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package ro.nextreports.server.web.dashboard; import java.util.List; import java.util.Map; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.AjaxSelfUpdatingTimerBehavior; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.list.ListItem; import org.apache.wicket.markup.html.list.ListView; import org.apache.wicket.markup.html.panel.GenericPanel; import org.apache.wicket.model.IModel; import org.apache.wicket.model.LoadableDetachableModel; import org.apache.wicket.spring.injection.annot.SpringBean; import org.apache.wicket.util.time.Duration; import org.odlabs.wiquery.ui.sortable.SortableBehavior; import ro.nextreports.server.exception.NotFoundException; import ro.nextreports.server.service.DashboardService; import ro.nextreports.server.util.WidgetUtil; import ro.nextreports.server.web.dashboard.model.WidgetModel; /** * @author Decebal Suiu */ class DashboardColumnPanel extends GenericPanel<DashboardColumn> { private static final long serialVersionUID = 1L; private WebMarkupContainer columnContainer; private StopSortableAjaxBehavior stopSortableAjaxBehavior; @SpringBean private DashboardService dashboardService; public DashboardColumnPanel(String id, IModel<DashboardColumn> model) { super(id, model); setOutputMarkupId(true); final int columnIndex = getDashboardColumn().getIndex(); columnContainer = new WebMarkupContainer("columnContainer"); columnContainer.setOutputMarkupId(true); columnContainer.setMarkupId("column-" + columnIndex); ListView<Widget> listView = new ListView<Widget>("widgetList", new WidgetsModel()) { private static final long serialVersionUID = 1L; @Override protected void populateItem(ListItem<Widget> item) { final Widget widget = item.getModelObject(); if (widget.isCollapsed()) { WidgetPanel widgetPanel = createWidgetPanel("widget", widget, new WidgetModel(widget.getId())); item.add(widgetPanel); } else { // item.add(new WidgetLoadingPanel("widget", new WidgetModel(widget.getId()))); item.add(createWidgetPanel("widget", widget, new WidgetModel(widget.getId()))); } item.setOutputMarkupId(true); item.setMarkupId("widget-" + widget.getId()); } }; columnContainer.add(listView); add(columnContainer); stopSortableAjaxBehavior = addSortableBehavior(columnContainer); } public DashboardColumn getDashboardColumn() { return getModelObject(); } public SortableBehavior getSortableBehavior() { return stopSortableAjaxBehavior.getSortableBehavior(); } public WebMarkupContainer getColumnContainer() { return columnContainer; } private StopSortableAjaxBehavior addSortableBehavior(WebMarkupContainer column) { StopSortableAjaxBehavior stopSortableAjaxBehavior = new StopSortableAjaxBehavior() { private static final long serialVersionUID = 1L; @Override public void saveLayout(Map<String, WidgetLocation> widgets, AjaxRequestTarget target) { DashboardPanel dashboardPanel = findParent(DashboardPanel.class); if (!dashboardPanel.hasWritePermission()) { System.out.println("Widget locations will be not updated (no permission)"); return; } String dashboardId = dashboardPanel.getDashboard().getId(); try { dashboardService.updateWidgetLocations(dashboardId, widgets); } catch (NotFoundException e) { // never happening throw new RuntimeException(e); } } }; SortableBehavior sortableBehavior = stopSortableAjaxBehavior.getSortableBehavior(); sortableBehavior.setConnectWith(".column"); sortableBehavior.setHandle(".dragbox-header"); sortableBehavior.setCursor("move"); sortableBehavior.setForcePlaceholderSize(true); sortableBehavior.setPlaceholder("placeholder"); sortableBehavior.setOpacity(0.4f); column.add(stopSortableAjaxBehavior); return stopSortableAjaxBehavior; } private WidgetPanel createWidgetPanel(String id, Widget widget, WidgetModel widgetModel) { WidgetPanel widgetPanel = new WidgetPanel(id, widgetModel); int refreshTime = WidgetUtil.getRefreshTime(dashboardService, widget); if (refreshTime > 0) { widgetPanel.add(new AjaxSelfUpdatingTimerBehavior(Duration.seconds(refreshTime))); } return widgetPanel; } class WidgetsModel extends LoadableDetachableModel<List<Widget>> { private static final long serialVersionUID = 1L; @Override protected List<Widget> load() { return getDashboardColumn().getWidgets(); } } // class WidgetLoadingPanel extends AjaxLazyLoadPanel { // // private static final long serialVersionUID = 1L; // // public WidgetLoadingPanel(String id, IModel<Widget> model) { // super(id,model); // } // // @Override // public Component getLazyLoadComponent(String id) { // Widget widget = (Widget)this.getDefaultModelObject(); // return createWidgetPanel(id, widget, (WidgetModel)this.getDefaultModel()); // } // // public Component getLoadingComponent(final String markupId) { // Widget widget = (Widget) this.getDefaultModelObject(); // int height = 330; // if (widget instanceof AlarmWidget) { // height = 110; // } else if (widget instanceof IndicatorWidget) { // height = 220; // } // // return new Label(markupId, // "<div class=\"dragbox\" style=\"width:99%;height:" + height + "px;margin-right: .9%;\">" + // "<h3 style=\"text-align:center;padding-top:" + (height/2-10) + "px;\">Widget '" + widget.getTitle() + // "' is loading ..." + // "</h3></div>"). // setEscapeModelStrings(false); // } // // } }