feat: Add description field in iterations view (OD-2420)

This commit is contained in:
Robin Shen 2025-05-12 21:56:00 +08:00
parent 9ac90063f2
commit c40271c01b
4 changed files with 78 additions and 30 deletions

View File

@ -0,0 +1,12 @@
package io.onedev.server.web.component.iteration.list;
import io.onedev.server.web.page.base.BaseDependentCssResourceReference;
public class IterationListCssResourceReference extends BaseDependentCssResourceReference {
private static final long serialVersionUID = 1L;
public IterationListCssResourceReference() {
super(IterationListCssResourceReference.class, "iteration-list.css");
}
}

View File

@ -1,5 +1,41 @@
package io.onedev.server.web.component.iteration.list;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.annotation.Nullable;
import org.apache.wicket.Component;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.AjaxLink;
import org.apache.wicket.behavior.AttributeAppender;
import org.apache.wicket.extensions.markup.html.repeater.data.grid.ICellPopulator;
import org.apache.wicket.extensions.markup.html.repeater.data.table.AbstractColumn;
import org.apache.wicket.extensions.markup.html.repeater.data.table.DataTable;
import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
import org.apache.wicket.extensions.markup.html.repeater.util.SortableDataProvider;
import org.apache.wicket.markup.head.CssHeaderItem;
import org.apache.wicket.markup.head.IHeaderResponse;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.link.BookmarkablePageLink;
import org.apache.wicket.markup.html.link.Link;
import org.apache.wicket.markup.html.panel.Fragment;
import org.apache.wicket.markup.html.panel.GenericPanel;
import org.apache.wicket.markup.repeater.Item;
import org.apache.wicket.model.AbstractReadOnlyModel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.LoadableDetachableModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.request.cycle.RequestCycle;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.hibernate.criterion.Restrictions;
import io.onedev.commons.utils.StringUtils;
import io.onedev.server.OneDev;
import io.onedev.server.entitymanager.IssueManager;
import io.onedev.server.entitymanager.IterationManager;
@ -18,45 +54,21 @@ import io.onedev.server.web.WebSession;
import io.onedev.server.web.component.datatable.DefaultDataTable;
import io.onedev.server.web.component.floating.FloatingPanel;
import io.onedev.server.web.component.issue.statestats.StateStatsBar;
import io.onedev.server.web.component.iteration.IterationDateLabel;
import io.onedev.server.web.component.iteration.actions.IterationActionsPanel;
import io.onedev.server.web.component.link.ActionablePageLink;
import io.onedev.server.web.component.link.ViewStateAwarePageLink;
import io.onedev.server.web.component.menu.MenuItem;
import io.onedev.server.web.component.menu.MenuLink;
import io.onedev.server.web.component.iteration.IterationDateLabel;
import io.onedev.server.web.component.iteration.actions.IterationActionsPanel;
import io.onedev.server.web.page.project.issues.iteration.IterationIssuesPage;
import io.onedev.server.web.page.project.issues.iteration.NewIterationPage;
import io.onedev.server.web.util.LoadableDetachableDataProvider;
import io.onedev.server.web.util.paginghistory.PagingHistorySupport;
import org.apache.wicket.Component;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.AjaxLink;
import org.apache.wicket.behavior.AttributeAppender;
import org.apache.wicket.extensions.markup.html.repeater.data.grid.ICellPopulator;
import org.apache.wicket.extensions.markup.html.repeater.data.table.AbstractColumn;
import org.apache.wicket.extensions.markup.html.repeater.data.table.DataTable;
import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
import org.apache.wicket.extensions.markup.html.repeater.util.SortableDataProvider;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.link.BookmarkablePageLink;
import org.apache.wicket.markup.html.link.Link;
import org.apache.wicket.markup.html.panel.Fragment;
import org.apache.wicket.markup.html.panel.GenericPanel;
import org.apache.wicket.markup.repeater.Item;
import org.apache.wicket.model.AbstractReadOnlyModel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.LoadableDetachableModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.request.cycle.RequestCycle;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.hibernate.criterion.Restrictions;
import javax.annotation.Nullable;
import java.util.*;
public class IterationListPanel extends GenericPanel<Project> {
private static final int MAX_DESC_DISP_LEN = 64;
private boolean closed;
private IterationSort sort;
@ -258,6 +270,21 @@ public class IterationListPanel extends GenericPanel<Project> {
}
});
columns.add(new AbstractColumn<>(Model.of("Description")) {
@Override
public String getCssClass() {
return "description d-none d-lg-table-cell align-middle";
}
@Override
public void populateItem(Item<ICellPopulator<Iteration>> cellItem, String componentId,
IModel<Iteration> rowModel) {
cellItem.add(new Label(componentId, StringUtils.abbreviate(rowModel.getObject().getDescription(), MAX_DESC_DISP_LEN)));
}
});
columns.add(new AbstractColumn<>(Model.of("Issue Stats")) {
@ -390,6 +417,12 @@ public class IterationListPanel extends GenericPanel<Project> {
return getModelObject();
}
@Override
public void renderHead(IHeaderResponse response) {
super.renderHead(response);
response.render(CssHeaderItem.forReference(new IterationListCssResourceReference()));
}
protected void onSortChanged(AjaxRequestTarget target, IterationSort sort) {
}

View File

@ -0,0 +1,3 @@
.iteration-list .issue-stats {
min-width: 200px;
}

View File

@ -1029,6 +1029,8 @@ public class Translation_zh_CN extends TranslationResourceBundle {
"如果未检索到成员资格信息,可选择将新认证的用户添加到指定组");
m.put("Optionally add newly authenticated user to specified group if membership information is not retrieved",
"如果未检索到成员资格信息,可选择将新认证的用户添加到指定组");
m.put("Optionally choose required builds. You may also input jobs not listed here, and press ENTER to add them",
"可选:选择所需验证的任务。您也可以在此处输入未列出的任务,并按回车添加它们");
m.put("Optionally configure proxy to access remote repository. Proxy should be in the format of &lt;proxy host&gt;:&lt;proxy port&gt;",
"可选择为访问远程仓库配置代理。代理应为 <i>&lt;代理主机&gt;:&lt;代理端口&gt;</i> 格式");
m.put("Optionally define a unique key for the project with two or more upper case letters. This key can be used to reference issues, builds, and pull requests with a stable and short form <code>&lt;project key&gt;-&lt;number&gt;</code> instead of <code>&lt;project path&gt;#&lt;number&gt;</code>",
@ -2232,8 +2234,6 @@ public class Translation_zh_CN extends TranslationResourceBundle {
m.put("new field","新字段");
m.put("root","");
m.put("true","");
m.put("Optionally choose required builds. You may also input jobs not listed here, and press ENTER to add them",
"可选:选择所需验证的任务。您也可以在此处输入未列出的任务,并按回车添加它们");
// Manually added keys
m.put("Create Administrator Account", "创建管理员账户");