diff --git a/src/website/shared/tests/test_github_sync.py b/src/website/shared/tests/test_github_sync.py
index aa3b9348..d18ff6ae 100644
--- a/src/website/shared/tests/test_github_sync.py
+++ b/src/website/shared/tests/test_github_sync.py
@@ -9,6 +9,7 @@
from django.conf import settings
from django.contrib.auth.models import User
from django.test import TestCase
+
from shared.auth import isadmin, iscommitter
from shared.auth.github_state import GithubState, set_groups_for_new_user
from shared.auth.github_webhook import handle_webhook
diff --git a/src/website/webview/static/style.css b/src/website/webview/static/style.css
index b4fb2dad..ae9aa21b 100644
--- a/src/website/webview/static/style.css
+++ b/src/website/webview/static/style.css
@@ -746,7 +746,8 @@ article .nixpkgs-packages {
display: none;
}
-.nixpkgs-package {
+.nixpkgs-package,
+.nixpkg {
flex-grow: 1;
border: 1px solid var(--grey);
border-radius: 5px;
@@ -830,9 +831,8 @@ article .nixpkgs-packages {
margin-top: 1em;
}
-.maintainers ul {
+.maintainers article {
margin: 0;
- list-style: none;
padding-left: 1em;
}
@@ -850,6 +850,56 @@ a:focus {
text-decoration: underline;
}
+.maintainers-list {
+ display: flex;
+ flex-direction: column;
+ margin-left: 1em;
+}
+
+.maintainer-container {
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ height: 2em;
+}
+
+.maintainer-container input {
+ margin: 0;
+ appearance: none;
+ width: 2em;
+ height: 2em;
+ cursor: pointer;
+}
+
+.maintainer-container input::after {
+ position: relative;
+ top: -0.2em;
+ content: "↺";
+ text-align: center;
+ font-weight: 700;
+ font-size: 1.5em;
+ color: var(--grey);
+}
+
+.maintainer-container input:checked::after {
+ position: relative;
+ top: 0.2em;
+ content: "🗑";
+ text-align: center;
+ font-size: 1.2em;
+ color: var(--dark-grey);
+}
+
+.maintainer-container input ~ article {
+ margin: 0;
+ padding: 0;
+}
+
+.maintainer-container input:not(:checked) ~ article {
+ color: var(--grey);
+ text-decoration: line-through;
+}
+
.suggestion .change-issue-state {
display: flex;
justify-content: space-between;
diff --git a/src/website/webview/templates/components/maintainer.html b/src/website/webview/templates/components/maintainer.html
new file mode 100644
index 00000000..57ba61eb
--- /dev/null
+++ b/src/website/webview/templates/components/maintainer.html
@@ -0,0 +1,7 @@
+
+ @{{ maintainer.github }}
+ {{ maintainer.name }}
+ {% if maintainer.email %}
+ <{{ maintainer.email }}>
+ {% endif %}
+
diff --git a/src/website/webview/templates/components/maintainers_list.html b/src/website/webview/templates/components/maintainers_list.html
index 97d71eb7..fed51401 100644
--- a/src/website/webview/templates/components/maintainers_list.html
+++ b/src/website/webview/templates/components/maintainers_list.html
@@ -1,18 +1,28 @@
+{% load viewutils %}
+
{% if maintainers %}
Notify package maintainers: {{ maintainers | length }}
-
{% endif %}
diff --git a/src/website/webview/templates/components/nixpkgs_package_list.html b/src/website/webview/templates/components/nixpkgs_package_list.html
index b1f3f69c..60bd002a 100644
--- a/src/website/webview/templates/components/nixpkgs_package_list.html
+++ b/src/website/webview/templates/components/nixpkgs_package_list.html
@@ -1,9 +1,20 @@
{% load viewutils %}
- {% for attribute_name, pdata in packages.items %}
+ {% for attribute, pdata in packages.items %}
- {% nixpkgs_package attribute_name pdata %}
+ {% if selectable %}
+
+ {% endif %}
+ {% nixpkgs_package attribute pdata %}
{% endfor %}
diff --git a/src/website/webview/templates/components/selectable_nixpkgs_package_list.html b/src/website/webview/templates/components/selectable_nixpkgs_package_list.html
deleted file mode 100644
index 9427e501..00000000
--- a/src/website/webview/templates/components/selectable_nixpkgs_package_list.html
+++ /dev/null
@@ -1,18 +0,0 @@
-{% load viewutils %}
-
-
- {% for attribute, pdata in packages.items %}
-
-
- {% nixpkgs_package attribute pdata %}
-
- {% endfor %}
-
diff --git a/src/website/webview/templates/components/suggestion.html b/src/website/webview/templates/components/suggestion.html
index 338cadd0..a993f036 100644
--- a/src/website/webview/templates/components/suggestion.html
+++ b/src/website/webview/templates/components/suggestion.html
@@ -49,7 +49,11 @@
{% nixpkgs_package_list cached_suggestion.packages %}
{% endif %}
- {% maintainers_list cached_suggestion.maintainers %}
+ {% if status_filter == "accepted" %}
+ {% selectable_maintainers_list cached_suggestion.maintainers %}
+ {% else %}
+ {% maintainers_list cached_suggestion.maintainers %}
+ {% endif %}
{% if user|is_maintainer_or_admin %}
diff --git a/src/website/webview/templatetags/viewutils.py b/src/website/webview/templatetags/viewutils.py
index e402afed..2840c487 100644
--- a/src/website/webview/templatetags/viewutils.py
+++ b/src/website/webview/templatetags/viewutils.py
@@ -40,6 +40,7 @@ class PackageList(TypedDict):
class PackageListContext(TypedDict):
packages: PackageList
+ selectable: bool
class AffectedContext(TypedDict):
@@ -59,6 +60,15 @@ class Maintainer(TypedDict):
github_id: int
+class MaintainerContext(TypedDict):
+ maintainer: Maintainer
+
+
+class MaintainersListContext(TypedDict):
+ maintainers: list[Maintainer]
+ selectable: bool
+
+
@register.filter
def getitem(dictionary: dict, key: str) -> Any | None:
return dictionary.get(key)
@@ -145,7 +155,7 @@ def nixpkgs_package(attribute_name: str, pdata: Package) -> PackageContext:
return {"attribute_name": attribute_name, "pdata": pdata}
-@register.inclusion_tag("components/selectable_nixpkgs_package_list.html")
+@register.inclusion_tag("components/nixpkgs_package_list.html")
def selectable_nixpkgs_package_list(packages: PackageList) -> PackageListContext:
"""Renders the nixpkgs package list with additional checkboxes to have packages selectable.
@@ -160,6 +170,7 @@ def selectable_nixpkgs_package_list(packages: PackageList) -> PackageListContext
"""
return {
"packages": packages,
+ "selectable": True,
}
@@ -178,6 +189,7 @@ def nixpkgs_package_list(packages: PackageList) -> PackageListContext:
"""
return {
"packages": packages,
+ "selectable": False,
}
@@ -196,6 +208,20 @@ def suggestion_activity_log(
@register.inclusion_tag("components/maintainers_list.html")
def maintainers_list(
- maintainers: list[dict],
-) -> dict[str, list[dict]]:
- return {"maintainers": maintainers}
+ maintainers: list[Maintainer],
+) -> MaintainersListContext:
+ return {"maintainers": maintainers, "selectable": False}
+
+
+@register.inclusion_tag("components/maintainers_list.html")
+def selectable_maintainers_list(
+ maintainers: list[Maintainer],
+) -> MaintainersListContext:
+ return {"maintainers": maintainers, "selectable": True}
+
+
+@register.inclusion_tag("components/maintainer.html")
+def maintainer(
+ maintainer: Maintainer,
+) -> MaintainerContext:
+ return {"maintainer": maintainer}