From: Maxim Cournoyer <maxim.cournoyer@gmail.com>
To: 68680@debbugs.gnu.org
Cc: rekado@elephly.net, arunisaac@systemreboot.net,
Maxim Cournoyer <maxim.cournoyer@gmail.com>
Subject: [bug#68680] [PATCH mumi v2 3/3] html: Add a button to copy a Message-ID to the clipboard.
Date: Thu, 25 Jan 2024 12:00:15 -0500 [thread overview]
Message-ID: <20240125170042.12022-4-maxim.cournoyer@gmail.com> (raw)
In-Reply-To: <20240125170042.12022-1-maxim.cournoyer@gmail.com>
* mumi/web/view/html.scm (issue-page)
<copy-message-id-button>: New HTML element.
(layout): Bump timestamp on .css and .js files to force reload.
* mumi/web/view/utils.scm (download-icon): Update source. Use 'rem'
as size unit.
(copy-icon): New variable.
(display-message-body) <download-part>: Add IDs to buttons. Add to
"message-button" class.
* assets/mumi.scss: Refactor spacing of message header buttons via a
flex display. Add a shrinking animation to message buttons on hover.
* assets/js/mumi.js (mumi): Register an event for it that copies the
Message-ID to the clipboard. Add js-indent-level prop line.
* mumi/web/view/html.scm
---
Changes in v2:
- Add timestamp to CSS and JavaScript file names to force reload
assets/js/mumi.js | 31 ++++++++++++++++++++++++++++-
assets/mumi.scss | 23 ++++++++++++++++++---
mumi/web/view/html.scm | 24 ++++++++++++++++------
mumi/web/view/utils.scm | 44 +++++++++++++++++++++++++++--------------
4 files changed, 97 insertions(+), 25 deletions(-)
diff --git a/assets/js/mumi.js b/assets/js/mumi.js
index ab29f08..0d25c5a 100644
--- a/assets/js/mumi.js
+++ b/assets/js/mumi.js
@@ -1,4 +1,4 @@
-// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3.0-or-later
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3.0-or-later -*- js-indent-level: 2; -*-
var mumi = (function () {
const possibleTokens = [
{ text: 'is:open' },
@@ -129,12 +129,41 @@ var mumi = (function () {
var init = function () {
initTokenInput ();
};
+
+ // Copy a message Message-ID to the clipboard.
+ var setupMessageIdButtonHandler = function () {
+
+ let messageIdClickHandler = (evt) => {
+ messageIdButton = evt.currentTarget;
+ originalTooltip = messageIdButton.dataset.tooltip;
+ var messageId = messageIdButton.dataset.messageId;
+ if (!window.isSecureContext) {
+ console.log("not in a secure context -- " +
+ "cannot copy message-id to clipboard\n" +
+ "tip: for testing, open via http://localhost:1234");
+ return;
+ }
+ // Update button's tooltip for the next 3 s.
+ messageIdButton.dataset.tooltip = "Copied!";
+ setTimeout(() => { messageIdButton.dataset.tooltip = originalTooltip; },
+ 3000);
+ navigator.clipboard.writeText(messageId);
+ console.log("copied Message-ID " + messageId + " to clipboard");
+ };
+
+ var messageIdButton = document.getElementById("copy-message-id-button");
+ if (messageIdButton === null) { return; }
+ messageIdButton.addEventListener("click", messageIdClickHandler);
+ };
+
return({
'init': init,
'lines': setupLineHandler,
+ 'messageIdButtonHandler': setupMessageIdButtonHandler,
});
})();
window.addEventListener ("load", mumi.init);
window.addEventListener ("DOMContentLoaded", mumi.lines);
+window.addEventListener ("DOMContentLoaded", mumi.messageIdButtonHandler);
// @license-end
diff --git a/assets/mumi.scss b/assets/mumi.scss
index 822f110..60dabb1 100644
--- a/assets/mumi.scss
+++ b/assets/mumi.scss
@@ -506,11 +506,28 @@ details {
margin-right: 0.2em;
}
-.download-message,
.download-part {
float: right;
- font-size: 0.8em;
- font-style: italic;
+}
+
+.header-buttons {
+ display: flex;
+ flex-direction: row;
+ float: right;
+ justify-content: flex-end;
+ }
+
+.header-buttons > * {
+ margin: 0 0 0 0.5rem;
+ // Custom buttons: undo the Pico CSS default style.
+ background: revert;
+ border: revert;
+ color: revert;
+ padding: revert;
+}
+
+.message-button:hover {
+ transform: scale(0.95);
}
@media (min-width: 768px) {
diff --git a/mumi/web/view/html.scm b/mumi/web/view/html.scm
index 8f06a36..b9603ec 100644
--- a/mumi/web/view/html.scm
+++ b/mumi/web/view/html.scm
@@ -1,6 +1,7 @@
;;; mumi -- Mediocre, uh, mail interface
;;; Copyright © 2016, 2017, 2018, 2019, 2020, 2021, 2022 Ricardo Wurmus <rekado@elephly.net>
;;; Copyright © 2018, 2019, 2023 Arun Isaac <arunisaac@systemreboot.net>
+;;; Copyright © 2024 Maxim Cournoyer <maxim.cournoyer@gmail.com>
;;;
;;; This program is free software: you can redistribute it and/or
;;; modify it under the terms of the GNU Affero General Public License
@@ -62,11 +63,11 @@
(@ (rel "stylesheet")
(media "screen")
(type "text/css")
- (href "/css/mumi.css?20221231000000")))
+ (href "/css/mumi.css?20240125000000")))
(script
(@ (src "/js/tokeninput.js")))
(script
- (@ (src "/js/mumi.js")))
+ (@ (src "/js/mumi.js?20240125000000")))
,@head)
(body (script
(@ (src "/js/theme-switcher.js")))
@@ -612,6 +613,7 @@ currently disabled."))
(not (bug-archived bug)))
mailer-form
disabled-mailer)))
+
(define (show-message message-number message previous-subject)
`((div
(a (@ (class "message-anchor")
@@ -642,10 +644,20 @@ currently disabled."))
message-number)))
(title ,(date->string (date message))))
,(time->string (date message)))))
- (div (@ (class "download-message"))
- (a (@ (href ,(format #f "/issue/~a/raw/~a"
- id message-number)))
- ,download-icon))
+ (div (@ (class "header-buttons"))
+ (div (@ (id "copy-message-id-button")
+ (class "message-button")
+ (role "button") ;specific to Pico CSS
+ (data-tooltip "Copy Message-ID")
+ (data-message-id ,(message-id message)))
+ ,copy-icon)
+ (div (@ (id "download-raw-message-button")
+ (class "message-button")
+ (role "button")
+ (data-tooltip "Download raw message"))
+ (a (@ (href ,(format #f "/issue/~a/raw/~a"
+ id message-number)))
+ ,download-icon)))
,@(if (string-suffix? previous-subject (subject message))
'()
`((div (@ (class "subject")) ,(subject message))))
diff --git a/mumi/web/view/utils.scm b/mumi/web/view/utils.scm
index 1ce7b64..ed83d15 100644
--- a/mumi/web/view/utils.scm
+++ b/mumi/web/view/utils.scm
@@ -2,6 +2,7 @@
;;; Copyright © 2017, 2018, 2019, 2020 Ricardo Wurmus <rekado@elephly.net>
;;; Copyright © 2018, 2019 Arun Isaac <arunisaac@systemreboot.net>
;;; Copyright © 2018 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2024 Maxim Cournoyer <maxim.cournoyer@gmail.com>
;;;
;;; This program is free software: you can redistribute it and/or
;;; modify it under the terms of the GNU Affero General Public License
@@ -35,6 +36,7 @@
#:use-module (web uri)
#:export (prettify
avatar-color
+ copy-icon
download-icon
display-message-body
time->string))
@@ -215,23 +217,31 @@ numbers with the given MESSAGE-NUMBER."
;; https://icons.getbootstrap.com/icons/download/
(define download-icon
'(svg (@ (class "bi bi-download")
- (width "1em")
- (height "1em")
+ (width "1rem")
+ (height "1rem")
+ (viewBox "0 0 16 16")
+ (fill "currentColor")
+ (xmlns "http://www.w3.org/2000/svg"))
+ (path (@ (d "M.5 9.9a.5.5 0 0 1 .5.5v2.5a1 1 0 0 0 1 1h12a1 \
+1 0 0 0 1-1v-2.5a.5.5 0 0 1 1 0v2.5a2 2 0 0 1-2 2H2a2 2 0 0 \
+1-2-2v-2.5a.5.5 0 0 1 .5-.5")))
+ (path (@ (d "M7.646 11.854a.5.5 0 0 0 .708 0l3-3a.5.5 0 0 \
+0-.708-.708L8.5 10.293V1.5a.5.5 0 0 0-1 0v8.793L5.354 8.146a.5.5 0 \
+1 0-.708.708z")))))
+
+;; https://icons.getbootstrap.com/icons/copy/
+(define copy-icon
+ '(svg (@ (class "bi bi-copy")
+ (width "1rem")
+ (height "1rem")
(viewBox "0 0 16 16")
(fill "currentColor")
(xmlns "http://www.w3.org/2000/svg"))
- (title "Download")
- (path (@ (fill-rule "evenodd")
- (clip-rule "evenodd")
- (d "M.5 8a.5.5 0 01.5.5V12a1 1 0 001 1h12a1 1 0 001-1\
-V8.5a.5.5 0 011 0V12a2 2 0 01-2 2H2a2 2 0 01-2-2V8.5A.5.5 0 01.5 8z")) "")
- (path (@ (fill-rule "evenodd")
- (clip-rule "evenodd")
- (d "M5 7.5a.5.5 0 01.707 0L8 9.793 10.293 7.5a.5.5 0 \
-11.707.707l-2.646 2.647a.5.5 0 01-.708 0L5 8.207A.5.5 0 015 7.5z")) "")
(path (@ (fill-rule "evenodd")
- (clip-rule "evenodd")
- (d "M8 1a.5.5 0 01.5.5v8a.5.5 0 01-1 0v-8A.5.5 0 018 1z")) "")))
+ (d "M4 2a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2H6a2 \
+2 0 0 1-2-2zm2-1a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h8a1 1 0 0 0 1-1V2a1 1 0 0 \
+0-1-1zM2 5a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h8a1 1 0 0 0 1-1v-1h1v1a2 2 0 0 1-2 \
+2H2a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h1v1z")))))
(define* (display-message-body bug-num message-number message #:optional plain?)
"Convenience procedure to render MESSAGE (part of bug with number
@@ -285,7 +295,9 @@ lines when PLAIN? is #T."
"")))
((string-suffix? ".scm" attachment-name)
`(div (@ (class "multipart scheme"))
- (div (@ (class "download-part"))
+ (div (@ (id "download-scheme-part-button")
+ (class "download-part message-button")
+ (data-tooltip "Download Scheme file"))
(a (@ (href ,(attachment-url)))
,download-icon))
,(highlights->sxml (highlight lex-scheme body))))
@@ -294,7 +306,9 @@ lines when PLAIN? is #T."
(list "multipart" (or (and content-type
(content-type->css-class content-type))
"")))))
- (div (@ (class "download-part"))
+ (div (@ (id "download-part-button")
+ (class "download-part message-button")
+ (data-tooltip "Download MIME part"))
(a (@ (href ,(attachment-url)))
,download-icon))
,(cond
--
2.41.0
next prev parent reply other threads:[~2024-01-25 17:02 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-01-24 2:15 [bug#68680] [PATCH mumi 0/3] Add a button to copy a message Message-ID to the clipboard Maxim Cournoyer
2024-01-24 2:20 ` [bug#68680] [PATCH mumi 1/3] README.org: Add new sections to help newcomers get started Maxim Cournoyer
2024-01-24 2:20 ` [bug#68680] [PATCH mumi 2/3] .gitignore: Register mumi.xapian and signing-key files Maxim Cournoyer
2024-01-24 2:20 ` [bug#68680] [PATCH mumi 3/3] html: Add a button to copy a Message-ID to the clipboard Maxim Cournoyer
2024-01-24 2:29 ` [bug#68680] [PATCH mumi 0/3] Add a button to copy a message " Maxim Cournoyer
2024-01-25 17:00 ` [bug#68680] [PATCH mumi v2 " Maxim Cournoyer
2024-01-25 17:00 ` [bug#68680] [PATCH mumi v2 1/3] README.org: Add new sections to help newcomers get started Maxim Cournoyer
2024-01-26 21:18 ` Arun Isaac
2024-01-27 3:55 ` Maxim Cournoyer
2024-01-25 17:00 ` [bug#68680] [PATCH mumi v2 2/3] .gitignore: Register mumi.xapian and signing-key files Maxim Cournoyer
2024-01-25 17:00 ` Maxim Cournoyer [this message]
2024-01-26 21:21 ` [bug#68680] [PATCH mumi v2 0/3] Add a button to copy a message Message-ID to the clipboard Arun Isaac
2024-01-26 21:24 ` Arun Isaac
2024-01-27 3:57 ` bug#68680: " Maxim Cournoyer
2024-01-27 3:04 ` [bug#68680] " Maxim Cournoyer
2024-01-27 10:06 ` Arun Isaac
2024-01-27 12:20 ` Ricardo Wurmus
2024-01-29 23:41 ` Arun Isaac
2024-01-26 2:26 ` [bug#68680] [PATCH mumi v3 0/4] " Maxim Cournoyer
2024-01-26 2:26 ` [bug#68680] [PATCH mumi v3 1/4] README.org: Add new sections to help newcomers get started Maxim Cournoyer
2024-01-26 2:26 ` [bug#68680] [PATCH mumi v3 2/4] .gitignore: Register mumi.xapian and signing-key files Maxim Cournoyer
2024-01-26 2:26 ` [bug#68680] [PATCH mumi v3 3/4] Add .patman configuration file Maxim Cournoyer
2024-01-26 2:26 ` [bug#68680] [PATCH mumi v3 4/4] html: Add a button to copy a Message-ID to the clipboard Maxim Cournoyer
2024-01-26 17:13 ` [bug#68680] [PATCH mumi v4 0/4] Add a button to copy a message " Maxim Cournoyer
2024-01-26 17:13 ` [bug#68680] [PATCH mumi v4 1/4] README.org: Add new sections to help newcomers get started Maxim Cournoyer
2024-01-26 17:13 ` [bug#68680] [PATCH mumi v4 2/4] .gitignore: Register mumi.xapian and signing-key files Maxim Cournoyer
2024-01-26 17:13 ` [bug#68680] [PATCH mumi v4 3/4] Add .patman configuration file Maxim Cournoyer
2024-01-26 17:13 ` [bug#68680] [PATCH mumi v4 4/4] html: Add a button to copy a Message-ID to the clipboard Maxim Cournoyer
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://guix.gnu.org/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20240125170042.12022-4-maxim.cournoyer@gmail.com \
--to=maxim.cournoyer@gmail.com \
--cc=68680@debbugs.gnu.org \
--cc=arunisaac@systemreboot.net \
--cc=rekado@elephly.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/guix.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).