Skip to content

Commit 6824a94

Browse files
committed
perf: 优化 job 配置页面中选择机器人的方式
1 parent 60b22f5 commit 6824a94

File tree

3 files changed

+92
-72
lines changed

3 files changed

+92
-72
lines changed

src/main/java/io/jenkins/plugins/DingTalkJobProperty.java

+5-15
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,9 @@
44
import hudson.model.Job;
55
import hudson.model.JobProperty;
66
import hudson.model.JobPropertyDescriptor;
7-
import io.jenkins.plugins.DingTalkNotifierConfig.DingTalkNotifierConfigDescriptor;
87
import java.util.ArrayList;
98
import java.util.List;
109
import java.util.stream.Collectors;
11-
import jenkins.model.Jenkins;
1210
import lombok.NoArgsConstructor;
1311
import lombok.ToString;
1412
import org.kohsuke.stapler.DataBoundConstructor;
@@ -30,28 +28,27 @@ public class DingTalkJobProperty extends JobProperty<Job<?, ?>> {
3028
* @return 机器人配置列表
3129
*/
3230
public ArrayList<DingTalkNotifierConfig> getNotifierConfigs() {
33-
34-
ArrayList<DingTalkNotifierConfig> notifierConfigsList = new ArrayList<>();
31+
ArrayList<DingTalkNotifierConfig> notifierConfigList = new ArrayList<>();
3532
ArrayList<DingTalkRobotConfig> robotConfigs = DingTalkGlobalConfig.getInstance()
3633
.getRobotConfigs();
3734

3835
for (DingTalkRobotConfig robotConfig : robotConfigs) {
3936
String id = robotConfig.getId();
4037
DingTalkNotifierConfig newNotifierConfig = new DingTalkNotifierConfig(robotConfig);
4138

42-
if (notifierConfigs != null && !notifierConfigs.isEmpty()) {
43-
for (DingTalkNotifierConfig notifierConfig : notifierConfigs) {
39+
if (this.notifierConfigs != null) {
40+
for (DingTalkNotifierConfig notifierConfig : this.notifierConfigs) {
4441
String robotId = notifierConfig.getRobotId();
4542
if (id.equals(robotId)) {
4643
newNotifierConfig.copy(notifierConfig);
4744
}
4845
}
4946
}
5047

51-
notifierConfigsList.add(newNotifierConfig);
48+
notifierConfigList.add(newNotifierConfig);
5249
}
5350

54-
return notifierConfigsList;
51+
return notifierConfigList;
5552
}
5653

5754
/**
@@ -79,13 +76,6 @@ public boolean isApplicable(Class<? extends Job> jobType) {
7976
return super.isApplicable(jobType);
8077
}
8178

82-
/**
83-
* 通知配置页面
84-
*/
85-
public DingTalkNotifierConfigDescriptor getDingTalkNotifierConfigDescriptor() {
86-
return Jenkins.get().getDescriptorByType(DingTalkNotifierConfigDescriptor.class);
87-
}
88-
8979
/**
9080
* 默认的配置项列表
9181
*

src/main/resources/io/jenkins/plugins/DingTalkJobProperty/config.jelly

+50-18
Original file line numberDiff line numberDiff line change
@@ -5,28 +5,60 @@
55
xmlns:d="jelly:define"
66
xmlns:l="/lib/layout"
77
xmlns:t="/lib/hudson"
8-
xmlns:f="/lib/form">
9-
<j:set var="notifierConfigDescriptor"
10-
value="${descriptor.getDingTalkNotifierConfigDescriptor()}"/>
8+
xmlns:f="/lib/form"
9+
xmlns:local="local">
10+
<st:adjunct includes="lib.form.hetero-list.hetero-list"/>
11+
1112
<j:set var="notifierConfigs"
1213
value="${instance == null ? descriptor.getDefaultNotifierConfigs() : instance.getNotifierConfigs()}"/>
14+
<j:set var="checkedNotifierConfigs"
15+
value="${instance.getCheckedNotifierConfigs()}"/>
1316

17+
<d:taglib uri="local">
18+
<d:tag name="body">
19+
<f:repeatableDeleteButton/>
20+
<f:class-entry descriptor="${descriptor}"/>
21+
<d:invokeBody/>
22+
</d:tag>
23+
</d:taglib>
1424

15-
<!-- <f:descriptorList title="钉钉机器人"-->
16-
<!-- descriptors="配置机器人进行构建通知">-->
1725
<f:entry title="钉钉机器人">
18-
<f:repeatable
19-
header=""
20-
name="notifierConfigs"
21-
noAddButton="true"
22-
var="instance"
23-
items="${notifierConfigs}">
24-
<j:scope>
25-
<j:set var="descriptor" value="${notifierConfigDescriptor}"/>
26-
<st:include page="config.jelly" class="${descriptor.clazz}"/>
27-
</j:scope>
28-
</f:repeatable>
26+
<div
27+
class="jenkins-form-item hetero-list-container one-each">
28+
<!-- display existing items -->
29+
<j:forEach var="config"
30+
items="${checkedNotifierConfigs}">
31+
<j:set var="instance" value="${config}"/>
32+
<j:set var="descriptor" value="${config.descriptor}"/>
33+
<div class="repeated-chunk" name="notifierConfigs" title="${config.robotName}"
34+
descriptorId="${config.robotId}">
35+
<local:body title="${config.robotName}" instance="${config}">
36+
<st:include from="${descriptor}"
37+
page="${descriptor.configPage}" optional="true"/>
38+
</local:body>
39+
</div>
40+
</j:forEach>
41+
<div class="repeatable-insertion-point"/>
42+
<div class="prototypes to-be-removed">
43+
<j:forEach var="config" items="${notifierConfigs}" varStatus="loop">
44+
<j:set var="instance" value="${config}" />
45+
<j:set var="descriptor" value="${config.descriptor}"/>
46+
<div name="notifierConfigs" title="${config.robotName}" descriptorId="${config.robotId}">
47+
<local:body title="${config.robotName}">
48+
<l:renderOnDemand tag="div" clazz="config-page" capture="descriptor,it,instance">
49+
<l:ajax>
50+
<st:include from="${descriptor}"
51+
page="${descriptor.configPage}" optional="true"/>
52+
</l:ajax>
53+
</l:renderOnDemand>
54+
</local:body>
55+
</div>
56+
</j:forEach>
57+
</div>
58+
<div>
59+
<input type="button" value="添加机器人" class="hetero-list-add"
60+
/>
61+
</div>
62+
</div>
2963
</f:entry>
30-
<!-- </f:descriptorList>-->
31-
3264
</j:jelly>

src/main/resources/io/jenkins/plugins/DingTalkNotifierConfig/config.jelly

+37-39
Original file line numberDiff line numberDiff line change
@@ -5,43 +5,41 @@
55
<!-- 通知时机列表 -->
66
<j:set var="noticeOccasionTypes" value="${descriptor.getNoticeOccasionTypes()}"/>
77

8-
<f:optionalBlock
9-
title="${instance.getRobotName()}"
10-
field="checked"
11-
inline="true"
12-
checked="${instance.isChecked()}">
13-
<f:advanced>
14-
<f:entry title="通知时机" field="noticeOccasions">
15-
<j:forEach var="noticeOccasionTypeItem"
16-
items="${noticeOccasionTypes}">
17-
<j:scope>
18-
<j:set var="name" value="${noticeOccasionTypeItem.name()}"/>
19-
<j:set var="desc" value="${noticeOccasionTypeItem.getDesc()}"/>
20-
<label>
21-
<f:checkbox
22-
json="${name}"
23-
name="noticeOccasions"
24-
checked="${instance.noticeOccasions.contains(name)}"
25-
/>
26-
${desc}
27-
</label>
28-
</j:scope>
29-
</j:forEach>
30-
</f:entry>
31-
<f:entry title="通知人" field="at">
32-
<f:checkbox title="atAll" field="atAll"/>
33-
<f:textarea field="atMobile"/>
34-
</f:entry>
35-
<f:entry field="content" title="自定义内容">
36-
<f:textarea/>
37-
</f:entry>
38-
</f:advanced>
39-
40-
<f:invisibleEntry>
41-
<input type="hidden" name="robotId" value="${instance.getRobotId()}"/>
42-
</f:invisibleEntry>
43-
<f:invisibleEntry>
44-
<input type="hidden" name="robotName" value="${instance.getRobotName()}"/>
45-
</f:invisibleEntry>
46-
</f:optionalBlock>
8+
<f:entry title="${instance.getRobotName()}">
9+
<f:advanced>
10+
<f:entry title="通知时机" field="noticeOccasions">
11+
<j:forEach var="noticeOccasionTypeItem"
12+
items="${noticeOccasionTypes}">
13+
<j:scope>
14+
<j:set var="name" value="${noticeOccasionTypeItem.name()}"/>
15+
<j:set var="desc" value="${noticeOccasionTypeItem.getDesc()}"/>
16+
<label>
17+
<f:checkbox
18+
json="${name}"
19+
name="noticeOccasions"
20+
checked="${instance.noticeOccasions.contains(name)}"
21+
/>
22+
${desc}
23+
</label>
24+
</j:scope>
25+
</j:forEach>
26+
</f:entry>
27+
<f:entry title="通知人" field="at">
28+
<f:checkbox title="atAll" field="atAll"/>
29+
<f:textarea field="atMobile"/>
30+
</f:entry>
31+
<f:entry field="content" title="自定义内容">
32+
<f:textarea/>
33+
</f:entry>
34+
</f:advanced>
35+
</f:entry>
36+
<f:invisibleEntry>
37+
<input type="hidden" name="robotId" value="${instance.getRobotId()}"/>
38+
</f:invisibleEntry>
39+
<f:invisibleEntry>
40+
<input type="hidden" name="robotName" value="${instance.getRobotName()}"/>
41+
</f:invisibleEntry>
42+
<f:invisibleEntry>
43+
<input type="hidden" name="checked" value="true"/>
44+
</f:invisibleEntry>
4745
</j:jelly>

0 commit comments

Comments
 (0)