Skip to content

Commit cd64ed0

Browse files
committed
Filter on the client side
1 parent 7656c32 commit cd64ed0

File tree

3 files changed

+49
-58
lines changed

3 files changed

+49
-58
lines changed

src/main.rs

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,7 @@ async fn serve_req(req: Request<Body>, ctx: Arc<Context>) -> Result<Response<Bod
2121
let params = matcher.params();
2222
let owner = params.find("owner");
2323
let repo = params.find("repo");
24-
let filter = if let Some(q) = req.uri.query() {
25-
let pair = url::form_urlencoded::parse(q.as_bytes()).find(|(k, _)| k == "q");
26-
pair.map(|(_, filter)| filter.to_string())
27-
} else {
28-
None
29-
};
30-
31-
return triagebot::triage::pulls(ctx, owner.unwrap(), repo.unwrap(), filter).await;
24+
return triagebot::triage::pulls(ctx, owner.unwrap(), repo.unwrap()).await;
3225
} else {
3326
return triagebot::triage::index();
3427
}

src/triage.rs

Lines changed: 2 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ pub async fn pulls(
2121
ctx: Arc<Context>,
2222
owner: &str,
2323
repo: &str,
24-
filter: Option<String>,
2524
) -> Result<Response<Body>, hyper::Error> {
2625
let octocrab = &ctx.octocrab;
2726
let res = octocrab
@@ -52,24 +51,6 @@ pub async fn pulls(
5251
next_page = page.next;
5352
}
5453

55-
let mut label_filter = Vec::new();
56-
let mut author_filter = Vec::new();
57-
let mut assignee_filter = Vec::new();
58-
if let Some(filter) = filter.clone() {
59-
let kvs: Vec<&str> = filter.split_whitespace().collect();
60-
for kv in kvs {
61-
match kv.split_once(':') {
62-
Some((k, v)) if !v.is_empty() => match k {
63-
"label" => label_filter.push(v.to_string()),
64-
"author" => author_filter.push(v.to_string()),
65-
"assignee" => assignee_filter.push(v.to_string()),
66-
_ => {}
67-
},
68-
_ => {}
69-
}
70-
}
71-
}
72-
7354
let mut pulls: Vec<Value> = Vec::new();
7455
for base_pull in base_pulls.into_iter() {
7556
let assignee = base_pull.assignee.map_or("".to_string(), |v| v.login);
@@ -90,39 +71,20 @@ pub async fn pulls(
9071
(Utc::now() - base_pull.created_at).num_days()
9172
};
9273

93-
let labels = base_pull.labels.map_or(Vec::new(), |labels| {
74+
let labels = base_pull.labels.map_or("".to_string(), |labels| {
9475
labels
9576
.iter()
9677
.map(|label| label.name.clone())
9778
.collect::<Vec<_>>()
79+
.join(", ")
9880
});
99-
if !label_filter.is_empty() {
100-
let mut flg = false;
101-
for filter in label_filter.iter() {
102-
if !labels.iter().any(|label| *label == *filter) {
103-
flg = true;
104-
}
105-
}
106-
if flg {
107-
continue;
108-
}
109-
}
110-
111-
let labels = labels.join(", ");
11281
let wait_for_author = labels.contains("S-waiting-on-author");
11382
let wait_for_review = labels.contains("S-waiting-on-review");
11483
let html_url = base_pull.html_url;
11584
let number = base_pull.number;
11685
let title = base_pull.title;
11786
let author = base_pull.user.login;
11887

119-
if !author_filter.is_empty() && !author_filter.iter().all(|s| *s == author) {
120-
continue;
121-
}
122-
if !assignee_filter.is_empty() && !assignee_filter.iter().all(|s| *s == assignee) {
123-
continue;
124-
}
125-
12688
let pull = PullRequest {
12789
html_url,
12890
number,
@@ -143,11 +105,6 @@ pub async fn pulls(
143105
context.insert("pulls", &pulls);
144106
context.insert("owner", &owner);
145107
context.insert("repo", &repo);
146-
if let Some(filter) = filter {
147-
context.insert("filter", &filter);
148-
} else {
149-
context.insert("filter", "");
150-
}
151108

152109
let tera = tera::Tera::new("templates/triage/**/*").unwrap();
153110
let body = Body::from(tera.render("pulls.html", &context).unwrap());

templates/triage/pulls.html

Lines changed: 46 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -38,15 +38,56 @@
3838
border-radius:2;
3939
}
4040
</style>
41+
<script>
42+
function filter() {
43+
var input, filter, table, tr, i, txtValue;
44+
input = document.getElementById("filter-input");
45+
filter = input.value;
46+
table = document.getElementById("pr-table");
47+
tr = table.getElementsByTagName("tr");
48+
49+
filters = filter.split(' ').map(function(x) {
50+
return x.split(':');
51+
});
52+
53+
54+
for (i = 0; i < tr.length; i++) {
55+
filters.forEach(function(flt) {
56+
if (flt.length == 2) {
57+
var td;
58+
switch (flt[0]) {
59+
case 'label':
60+
td = tr[i].getElementsByTagName("td")[6];
61+
break;
62+
case 'assignee':
63+
td = tr[i].getElementsByTagName("td")[5];
64+
break;
65+
case 'author':
66+
td = tr[i].getElementsByTagName("td")[4];
67+
break;
68+
}
69+
if (td) {
70+
txtValue = td.textContent || td.innerText;
71+
if (txtValue.indexOf(flt[1]) > -1) {
72+
tr[i].style.display = "";
73+
} else {
74+
tr[i].style.display = "none";
75+
}
76+
}
77+
} else {
78+
tr[i].style.display = "";
79+
}
80+
});
81+
}
82+
}
83+
</script>
4184
</head>
4285

4386
<body>
4487
<h1>Triage dashboard - <a href="https://github.com/{{ owner }}/{{ repo }}">{{ owner }}/{{ repo }}</a></h1>
45-
<form action="/triage/{{ owner }}/{{ repo }}" method="get">
46-
<input type="search" name="q" value="{{ filter }}" style="width: 400px;">
47-
<input type="submit" value="filter">
48-
</form>
49-
<table>
88+
<input id="filter-input" type="search" style="width: 400px;">
89+
<input type="submit" value="filter" onclick="filter()">
90+
<table id="pr-table">
5091
<thead>
5192
<tr>
5293
<th>#</th>

0 commit comments

Comments
 (0)