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}