Skip to content

Commit de250cd

Browse files
authored
Remove YUI (#38)
1 parent b2bd564 commit de250cd

File tree

7 files changed

+106
-120
lines changed

7 files changed

+106
-120
lines changed

src/main/java/hudson/plugins/sectioned_view/FolderViewSection.java

+13-20
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,16 @@ public FolderViewSection(String name, Width width, Positioning alignment, int vi
5959
this.setRegexFilter(regexFilter);
6060
}
6161

62+
public boolean isChecked(Folder folder, ItemGroup itemGroup) {
63+
Collection<TopLevelItem> selectedItems = getItems(itemGroup);
64+
for (TopLevelItem item: selectedItems) {
65+
if (folder == item) {
66+
return true;
67+
}
68+
}
69+
return false;
70+
}
71+
6272
public List<List<Node>> getColumnsWithContent(ItemGroup<? extends TopLevelItem> itemGroup, int baseFolderLevel) {
6373
List<List<Node>> columns = new ArrayList<List<Node>>();
6474
for (int i = 0; i < viewColumns; i++) {
@@ -220,26 +230,9 @@ public FormValidation doCheckFolderLevels(@QueryParameter String value) {
220230
return FormValidation.error("Levels must be a number greater than 0");
221231
}
222232

223-
public boolean isFolder(TopLevelItem item) {
224-
return item instanceof Folder;
225-
}
226-
227-
public int baseFolderLevel(SectionedView sectionedView) {
228-
return calculateBaseFolderLevel(sectionedView);
229-
}
230-
231-
public List<Folder> getAvailableFolders(ItemGroup itemGroup, SectionedView sectionedView) {
232-
Collection<Item> items = itemGroup.getItems();
233-
List<Folder> folders = new ArrayList<Folder>();
234-
int baseFolderLevel = baseFolderLevel(sectionedView);
235-
for (Item item : items) {
236-
if (item instanceof Folder) {
237-
if (folderLevel(item.getFullName()) == (0 + baseFolderLevel)) {
238-
folders.add((Folder)item);
239-
}
240-
}
241-
}
242-
return folders;
233+
public Collection<Item> getAllFolders(ItemGroup<Item> itemGroup) {
234+
Collection<Item> items = itemGroup.getItems(item -> item instanceof Folder);
235+
return items;
243236
}
244237
}
245238

src/main/java/hudson/plugins/sectioned_view/ViewListingSection.java

+4-12
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@
3232
import hudson.model.View;
3333
import hudson.model.ViewGroup;
3434
import hudson.util.FormValidation;
35+
import java.util.logging.Level;
36+
import java.util.logging.Logger;
3537
import net.sf.json.JSONObject;
3638

3739
import org.apache.commons.lang.StringUtils;
@@ -60,18 +62,8 @@ public List<String> getViews() {
6062
return views;
6163
}
6264

63-
/**
64-
* Used for generating the config UI.
65-
*/
66-
public String getViewsString() {
67-
if (views == null || views.isEmpty()) return "";
68-
69-
char delim = ',';
70-
// Build string connected with delimiter, quoting as needed
71-
StringBuilder buf = new StringBuilder();
72-
for (String value : views)
73-
buf.append(delim).append(value);
74-
return buf.substring(1);
65+
public boolean isChecked(String viewName) {
66+
return views.contains(viewName);
7567
}
7668

7769
public void setColumns(int columns) {

src/main/resources/hudson/model/View/index.jelly

+2-4
Original file line numberDiff line numberDiff line change
@@ -51,10 +51,8 @@ THE SOFTWARE.
5151
</l:main-panel>
5252
<l:header>
5353
<!-- for screen resolution detection -->
54-
<l:yui module="cookie" />
55-
<script>
56-
YAHOO.util.Cookie.set("screenResolution", screen.width+"x"+screen.height);
57-
</script>
54+
<script id="screenResolution-script" data-use-secure-cookie="${request.secure}"/>
55+
<st:adjunct includes="hudson.model.View.screen-resolution"/>
5856
</l:header>
5957
</l:layout>
6058
</st:compress>

src/main/resources/hudson/plugins/sectioned_view/FolderViewSection/config.jelly

+25-46
Original file line numberDiff line numberDiff line change
@@ -22,20 +22,30 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
2222
THE SOFTWARE.
2323
-->
2424
<?jelly escape-by-default='true'?>
25-
<j:jelly xmlns:j="jelly:core" xmlns:st="jelly:stapler" xmlns:d="jelly:define" xmlns:l="/lib/layout" xmlns:t="/lib/hudson" xmlns:f="/lib/form" xmlns:i="jelly:fmt" xmlns:local="local">
26-
25+
<j:jelly xmlns:j="jelly:core" xmlns:st="jelly:stapler" xmlns:d="jelly:define" xmlns:sv="/lib/sectioned_view" xmlns:f="/lib/form" xmlns:local="local" xmlns:l="/lib/layout">
26+
<st:adjunct includes="hudson.plugins.sectioned_view.sectioned-view-config"/>
2727
<d:taglib uri="local">
28-
<d:tag name="add-children">
29-
<j:forEach var="item" items="${items}">
30-
<j:if test="${descriptor.isFolder(item)}">
31-
<j:set var="itemName" value="${prefix == ''?'':prefix+'$'}${item.name}"/>
32-
<j:set var="name" value="sections.${descriptor.escapeJobName(h.getRelativeNameFrom(item, it.ownerItemGroup, false))}"/>
33-
items['${itemName}'] = new YAHOO.widget.HTMLNode('&lt;input type="checkbox" name="${name}" '+has("${itemName}")+'/&gt;&lt;label class="attach-previous"&gt;${h.jsStringEscape(item.name)}&lt;/label&gt;', ${parentNode}, false);
34-
<j:if test="${item.items != null}">
35-
<local:add-children parentNode="items['${itemName}']" items="${item.items}" prefix="${itemName}"/>
36-
</j:if>
28+
<d:tag name="tree-view">
29+
<j:forEach var="item" items="${items}">
30+
<div class="sectioned-view-tree__container">
31+
<j:set var="name" value="sections.${descriptor.escapeJobName(h.getRelativeNameFrom(item, it.ownerItemGroup, false))}"/>
32+
<j:set var="subItems" value="${descriptor.getAllFolders(item)}"/>
33+
<div class="sectioned-view-tree__row">
34+
<f:checkbox name="${name}" title="${item.name}" checked="${instance.isChecked(item, it.ownerItemGroup)}"/>
35+
<j:if test="${subItems.size() gt 0}">
36+
<button type="button" class="jenkins-button sectioned-view-tree__button" data-hidden="true">
37+
<l:icon src="symbol-chevron-down" class="icon-sm"/>
38+
</button>
39+
</j:if>
40+
</div>
41+
42+
<j:if test="${subItems.size() gt 0}">
43+
<div class="jenkins-!-margin-left-3 sectioned-view-tree jenkins-hidden" data-hidden="true">
44+
<local:tree-view items="${subItems}"/>
45+
</div>
3746
</j:if>
38-
</j:forEach>
47+
</div>
48+
</j:forEach>
3949
</d:tag>
4050
</d:taglib>
4151

@@ -44,40 +54,9 @@ THE SOFTWARE.
4454
<f:textbox name="sections.name" value="${instance.name}"/>
4555
</f:entry>
4656
<f:entry title="Folders">
47-
<div class="yahooTree folders-tree" style="border: 1px solid #ccc; height: 20em; overflow:auto;" values="${instance.getSelectedFoldersString(it.ownerItemGroup)}"/>
48-
<script>
49-
hudsonRules["DIV.folders-tree"] = function(e) {
50-
var tree = new YAHOO.widget.TreeView(e);
51-
var rootNode = tree.getRoot();
52-
53-
var values = (e.getAttribute("values") || "").split(",");
54-
55-
function has(v) {
56-
return values.includes(v) ? 'checked="true" ' : "";
57-
}
58-
var items = {};
59-
60-
<local:add-children parentNode="rootNode" items="${descriptor.getAvailableFolders(it.ownerItemGroup, it)}" prefix=""/>
61-
62-
tree.draw();
63-
<!--
64-
force the rendering of HTML, so that input fields are there
65-
even when the form is submitted without this tree expanded.
66-
-->
67-
tree.expandAll();
68-
tree.collapseAll();
69-
70-
<!--
71-
cancel the event.
72-
73-
from http://yuilibrary.com/forum/viewtopic.php?f=89&t=8209&p=26239&hilit=HTMLNode#p26239
74-
"To prevent toggling and allow the link to work, add a listener to the clickEvent on that tree and simply return false"
75-
-->
76-
tree.subscribe("clickEvent", function(node) {
77-
return false;
78-
});
79-
};
80-
</script>
57+
<div class="jenkins-input sectioned-view-tree">
58+
<local:tree-view items="${descriptor.getAllFolders(it.ownerItemGroup)}"/>
59+
</div>
8160
</f:entry>
8261
<f:advanced>
8362
<f:entry field="alignment" title="${%Align}">

src/main/resources/hudson/plugins/sectioned_view/ViewListingSection/config.jelly

+23-38
Original file line numberDiff line numberDiff line change
@@ -24,54 +24,39 @@ THE SOFTWARE.
2424
<?jelly escape-by-default='true'?>
2525
<j:jelly xmlns:j="jelly:core" xmlns:st="jelly:stapler" xmlns:d="jelly:define" xmlns:l="/lib/layout" xmlns:t="/lib/hudson" xmlns:f="/lib/form" xmlns:i="jelly:fmt" xmlns:local="local">
2626
<d:taglib uri="local">
27-
<d:tag name="add-children">
27+
<d:tag name="tree-view">
2828
<j:forEach var="view" items="${views}">
29-
<j:set var="viewName" value="${prefix == ''?'':prefix+'$'}${view.viewName}"/>
30-
views['${viewName}'] = new YAHOO.widget.HTMLNode('&lt;input type="checkbox" name="views" json="${viewName}" '+has("${viewName}")+'/&gt;&lt;label class="attach-previous"&gt;${h.jsStringEscape(view.viewName)}&lt;/label&gt;', ${parentView}, false);
31-
<j:if test="${view.views != null}">
32-
<local:add-children parentView="views['${viewName}']" views="${view.views}" prefix="${viewName}"/>
33-
</j:if>
29+
<div class="sectioned-view-tree__container">
30+
<j:set var="viewName" value="${prefix == ''?'':prefix+'$'}${view.viewName}"/>
31+
<j:set var="subViews" value="${view.views}"/>
32+
<div class="sectioned-view-tree__row">
33+
<f:checkbox name="views" title="${view.viewName}" checked="${instance.isChecked(viewName)}" json="${viewName}"/>
34+
<j:if test="${subViews.size() gt 0}">
35+
<button type="button" class="jenkins-button sectioned-view-tree__button" data-hidden="true">
36+
<l:icon src="symbol-chevron-down" class="icon-sm"/>
37+
</button>
38+
</j:if>
39+
</div>
40+
41+
<j:if test="${subViews.size() gt 0}">
42+
<div class="jenkins-!-margin-left-3 sectioned-view-tree jenkins-hidden" data-hidden="true">
43+
<local:tree-view views="${view.views}" prefix="${viewName}"/>
44+
</div>
45+
</j:if>
46+
</div>
3447
</j:forEach>
3548
</d:tag>
49+
3650
</d:taglib>
3751

3852
<f:nested>
3953
<f:entry title="Name">
4054
<f:textbox name="sections.name" value="${instance.name}"/>
4155
</f:entry>
4256
<f:entry title="${%Views}" field="views">
43-
<div class="yahooTree views-tree" style="border: 1px solid gray; height: 10em; overflow:auto;" values="${instance.viewsString}" />
44-
<script>
45-
hudsonRules["DIV.views-tree"] = function(e) {
46-
var tree = new YAHOO.widget.TreeView(e);
47-
var root = tree.getRoot();
48-
49-
var values = (e.getAttribute("values") || "").split(",");
50-
function has(v) {
51-
return values.includes(v) ? 'checked="checked" ' : "";
52-
}
53-
var views = {};
54-
<local:add-children parentView="root" views="${it.owner.views}" prefix=""/>
55-
56-
tree.draw();
57-
<!--
58-
force the rendering of HTML, so that input fields are there
59-
even when the form is submitted without this tree expanded.
60-
-->
61-
tree.expandAll();
62-
tree.collapseAll();
63-
64-
<!--
65-
cancel the event.
66-
67-
from http://yuilibrary.com/forum/viewtopic.php?f=89&t=8209&p=26239&hilit=HTMLNode#p26239
68-
"To prevent toggling and allow the link to work, add a listener to the clickEvent on that tree and simply return false"
69-
-->
70-
tree.subscribe("clickEvent", function(node) {
71-
return false;
72-
});
73-
};
74-
</script>
57+
<div class="jenkins-input sectioned-view-tree">
58+
<local:tree-view views="${it.owner.views}" prefix=""/>
59+
</div>
7560
</f:entry>
7661
<f:advanced>
7762
<f:entry field="alignment" title="${%Align}">
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
.sectioned-view-tree, .sectioned-view-tree__container {
2+
display: flex;
3+
gap: 5px;
4+
flex-direction: column;
5+
max-height: 400px;
6+
overflow: auto;
7+
}
8+
9+
.sectioned-view-tree__button {
10+
min-height: 20px;
11+
height: 20px;
12+
padding: 0.5rem 0.3rem
13+
}
14+
15+
.sectioned-view-tree__row {
16+
display: flex;
17+
gap: 5px;
18+
align-items: center;
19+
}
20+
21+
.sectioned-view-tree__button[data-hidden=false] {
22+
rotate: 180deg;
23+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
Behaviour.specify(".sectioned-view-tree__button", "sectioned-view__button", 0, function(btn) {
2+
btn.addEventListener("click", function(evt) {
3+
const container = btn.closest(".sectioned-view-tree__container");
4+
if (container) {
5+
const labelList = container.querySelector(".sectioned-view-tree");
6+
if (labelList) {
7+
labelList.classList.toggle("jenkins-hidden");
8+
if (btn.dataset.hidden === "true") {
9+
btn.dataset.hidden = "false";
10+
} else {
11+
btn.dataset.hidden = "true";
12+
}
13+
}
14+
}
15+
});
16+
});

0 commit comments

Comments
 (0)