Merge ~pappacena/launchpad:delete-message-revision-ui into launchpad:master

Proposed by Thiago F. Pappacena
Status: Needs review
Proposed branch: ~pappacena/launchpad:delete-message-revision-ui
Merge into: launchpad:master
Diff against target: 161 lines (+79/-5)
3 files modified
lib/canonical/launchpad/icing/css/base.scss (+7/-0)
lib/lp/answers/templates/questionmessage-display.pt (+5/-1)
lib/lp/services/messages/javascript/messages.edit.js (+67/-4)
Reviewer Review Type Date Requested Status
Launchpad code reviewers Pending
Review via email: mp+403471@code.launchpad.net

Commit message

Allowing users to delete message revision history

To post a comment you must log in.
Revision history for this message
Thiago F. Pappacena (pappacena) wrote (last edit ):

We are missing some tests (and applying the <a> tag to bug comments and code review), but this works fine the way it is on question messages.

Unmerged commits

6546c93... by Thiago F. Pappacena

Allowing users to delete message revisions

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1diff --git a/lib/canonical/launchpad/icing/css/base.scss b/lib/canonical/launchpad/icing/css/base.scss
2index 1e33ca7..cff195c 100644
3--- a/lib/canonical/launchpad/icing/css/base.scss
4+++ b/lib/canonical/launchpad/icing/css/base.scss
5@@ -624,6 +624,13 @@ body {
6 display: none;
7 padding-left: 20px;
8 padding-bottom: 10px;
9+
10+ // If the content was deleted, we show a default message with
11+ // this CSS class.
12+ .deleted-content {
13+ padding: 5px;
14+ opacity: 50%;
15+ }
16 }
17 }
18
19diff --git a/lib/lp/answers/templates/questionmessage-display.pt b/lib/lp/answers/templates/questionmessage-display.pt
20index c1ed29a..346f11b 100644
21--- a/lib/lp/answers/templates/questionmessage-display.pt
22+++ b/lib/lp/answers/templates/questionmessage-display.pt
23@@ -8,7 +8,8 @@
24 tal:define="css_classes view/getBoardCommentCSSClass"
25 tal:attributes="class string:${css_classes};
26 id string:comment-${context/index};
27- data-baseurl context/fmt:url">
28+ data-baseurl context/fmt:url;
29+ data-i-can-edit view/can_edit">
30 <div class="boardCommentDetails">
31 <table>
32 <tbody>
33@@ -23,6 +24,9 @@
34 <script type="text/template">
35 <div class='message-revision-item'>
36 <div class='message-revision-title'>
37+ <a class="sprite remove action-icon message-revision-del-btn">
38+ Remove
39+ </a>
40 <a class="js-action">
41 Revision #{revision}, created at {date_created}
42 </a>
43diff --git a/lib/lp/services/messages/javascript/messages.edit.js b/lib/lp/services/messages/javascript/messages.edit.js
44index c6e79b6..5c565bd 100644
45--- a/lib/lp/services/messages/javascript/messages.edit.js
46+++ b/lib/lp/services/messages/javascript/messages.edit.js
47@@ -7,6 +7,7 @@
48 * - A div container with the class .editable-message containing everything
49 * else related to the message
50 * - A data-baseurl="/path/to/msg" on the .editable-message container
51+ * - A data-i-can-edit="True|False" on the .editable-message container
52 * - A .editable-message-body container with the original msg content
53 * - A .editable-message-edit-btn element inside the main container, that will
54 * switch the view to edit form when clicked.
55@@ -39,6 +40,20 @@ YUI.add('lp.services.messages.edit', function(Y) {
56 "Please try again in a few minutes."
57 );
58
59+ module.confirm_delete_revision_msg = (
60+ "Are you sure you want to delete this revision content?");
61+
62+ module.deleted_content_msg = (
63+ "<span class='deleted-content'>" +
64+ " Content deleted by the user." +
65+ "</span>"
66+ );
67+
68+ // Making it easier to mock on tests.
69+ module.confirm = function(msg) {
70+ return confirm(msg)
71+ };
72+
73 module.htmlify_msg = function(text) {
74 text = text.replace(/&/g, "&amp;");
75 text = text.replace(/</g, "&lt;");
76@@ -182,6 +197,7 @@ YUI.add('lp.services.messages.edit', function(Y) {
77 module.fillMessageRevisions = function(elements, revisions) {
78 // Position the message revision list element.
79 revisions = revisions.reverse();
80+ var i_can_edit = elements.container.getData('i-can-edit') === "True";
81 var revisions_container = elements.container.one(
82 ".message-revision-container");
83 var last_edit_el = elements.last_edit.getDOMNode();
84@@ -198,16 +214,28 @@ YUI.add('lp.services.messages.edit', function(Y) {
85 revisions_container.setStyle('display', 'none');
86 });
87
88- var content = "";
89+ nodes_holder.getDOMNode().innerHTML = "";
90 revisions.forEach(function(rev) {
91 var attrs = rev.getAttrs();
92 var date_created = new Date(attrs.date_created);
93 attrs.date_created = date_created.toLocaleString();
94- attrs.content = module.htmlify_msg(attrs.content);
95- content += Y.Lang.sub(template, attrs);
96+ if (!attrs.date_deleted) {
97+ attrs.content = module.htmlify_msg(attrs.content);
98+ }
99+ else {
100+ attrs.content = module.deleted_content_msg;
101+ }
102+ var node = Y.DOM.create(Y.Lang.sub(template, attrs));
103+ node.dataset['revision_url'] = attrs.self_link;
104+ nodes_holder.appendChild(node);
105+
106+ if(attrs.date_deleted || !i_can_edit) {
107+ // If it was already deleted or I don't have permission to
108+ // delete it, remove the "delete button".
109+ module.removeDeleteRevisionButton(Y.Node(node));
110+ }
111 });
112
113- nodes_holder.getDOMNode().innerHTML = content;
114 nodes_holder.all(".message-revision-item").each(function(rev_item) {
115 rev_item.one(".message-revision-title").on('click', function() {
116 nodes_holder.all('.message-revision-body').setStyle(
117@@ -220,9 +248,44 @@ YUI.add('lp.services.messages.edit', function(Y) {
118 'active');
119 rev_item.addClass('active');
120 });
121+
122+ var delete_btn = rev_item.one(".message-revision-del-btn");
123+ if (delete_btn) {
124+ delete_btn.on('click', function() {
125+ module.deleteMessageRevisionContent(rev_item);
126+ });
127+ }
128 });
129 };
130
131+ module.removeDeleteRevisionButton = function(rev_item_node) {
132+ var delete_btn = rev_item_node.one('.message-revision-del-btn');
133+ if (delete_btn) {
134+ var node_to_remove = delete_btn.getDOMNode();
135+ node_to_remove.parentNode.removeChild(node_to_remove);
136+ }
137+ };
138+
139+ module.deleteMessageRevisionContent = function(rev_item) {
140+ var revision_url = rev_item.getData('revision_url');
141+ if (module.confirm(module.confirm_delete_revision_msg)) {
142+ var config = {
143+ on: {
144+ success: function() {
145+ var body_dom = rev_item.one(
146+ '.message-revision-body').getDOMNode();
147+ body_dom.innerHTML = module.deleted_content_msg;
148+ module.removeDeleteRevisionButton(rev_item);
149+ },
150+ failure: function(err) {
151+ alert("There was an error. Please try again.");
152+ }
153+ }
154+ };
155+ this.lp_client.named_post(revision_url, 'deleteContent', config);
156+ }
157+ };
158+
159 module.onLastEditClick = function(elements, baseurl) {
160 // Hide all open revision containers.
161 Y.all('.message-revision-container').each(function(container) {