← Back to team overview

launchpad-reviewers team mailing list archive

[Merge] ~ines-almeida/launchpad:social-accounts-display-view into launchpad:master

 

Ines Almeida has proposed merging ~ines-almeida/launchpad:social-accounts-display-view into launchpad:master with ~ines-almeida/launchpad:social-accounts-edit-view as a prerequisite.

Commit message:
Update display social accounts view

Requested reviews:
  Launchpad code reviewers (launchpad-reviewers)

For more details, see:
https://code.launchpad.net/~ines-almeida/launchpad/+git/launchpad/+merge/458730
-- 
Your team Launchpad code reviewers is requested to review the proposed merge of ~ines-almeida/launchpad:social-accounts-display-view into launchpad:master.
diff --git a/lib/canonical/launchpad/icing/css/components/_index.scss b/lib/canonical/launchpad/icing/css/components/_index.scss
index 3facac8..59e25ed 100644
--- a/lib/canonical/launchpad/icing/css/components/_index.scss
+++ b/lib/canonical/launchpad/icing/css/components/_index.scss
@@ -6,4 +6,5 @@
         'bug_listing',
         'portlets',
         'sharing',
+        'social_accounts',
         'yui_picker';
diff --git a/lib/canonical/launchpad/icing/css/components/social_accounts.scss b/lib/canonical/launchpad/icing/css/components/social_accounts.scss
new file mode 100644
index 0000000..8284e29
--- /dev/null
+++ b/lib/canonical/launchpad/icing/css/components/social_accounts.scss
@@ -0,0 +1,12 @@
+.social_accounts {
+    &__icon {
+        margin-right: 0.5em;
+        height: 1.4em;
+        width: 1.4em;
+        margin-bottom: -0.3em;
+    }
+
+    & a.action-icon {
+        padding-bottom: 0;
+    }
+}
diff --git a/lib/canonical/launchpad/images/social-irc.png b/lib/canonical/launchpad/images/social-irc.png
new file mode 100644
index 0000000..2676869
Binary files /dev/null and b/lib/canonical/launchpad/images/social-irc.png differ
diff --git a/lib/canonical/launchpad/images/social-jabber.png b/lib/canonical/launchpad/images/social-jabber.png
new file mode 100644
index 0000000..9303f48
Binary files /dev/null and b/lib/canonical/launchpad/images/social-jabber.png differ
diff --git a/lib/canonical/launchpad/images/social-matrix.png b/lib/canonical/launchpad/images/social-matrix.png
new file mode 100644
index 0000000..1004d71
Binary files /dev/null and b/lib/canonical/launchpad/images/social-matrix.png differ
diff --git a/lib/canonical/launchpad/images/src/social-irc.svg b/lib/canonical/launchpad/images/src/social-irc.svg
new file mode 100644
index 0000000..099302d
--- /dev/null
+++ b/lib/canonical/launchpad/images/src/social-irc.svg
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   version="1.1"
+   viewBox="0 0 31.933693 32.009163"
+   id="svg334"
+   width="31.933693"
+   height="32.009163"
+   xml:space="preserve"
+   xmlns="http://www.w3.org/2000/svg";
+   xmlns:svg="http://www.w3.org/2000/svg";><defs
+     id="defs338" /><title
+     id="title324">IRC logo</title><path
+     style="fill:none;stroke:#000000;stroke-width:1.074;stroke-dasharray:none"
+     d="m 27.310407,29.54155 c 0,0 -0.35044,1.07703 -1.82255,0.359306 -0.92858,-0.45246 -6.07272,-3.001609 -9.748575,-4.824457 H 8.8533222 c -4.429365,0 -8.02035103,-3.590692 -8.02035103,-8.020356 V 9.6253625 c 0,-4.4293681 3.59098603,-8.0203563 8.02035103,-8.0203563 H 22.993417 c 4.42936,0 8.02036,3.5909882 8.02036,8.0203563 v 7.4306805 c 0,3.258297 -1.94321,6.063248 -4.73397,7.318305 z"
+     id="path620" /><path
+     d="m 18.894617,16.559403 -0.87765,3.777002 h -2.613422 l 0.877072,-3.777002 h -2.0494 l -0.853864,3.777002 H 10.810342 L 11.64191,16.559403 H 8.9808932 V 14.492537 H 12.112526 L 12.609062,12.47689 H 9.7886582 v -2.085846 h 3.2693308 l 0.877665,-3.7956822 h 2.612803 l -0.876758,3.7956822 h 2.095488 l 0.87736,-3.7956822 h 2.56762 l -0.87706,3.7956822 h 2.6827 v 2.085846 h -3.15452 l -0.49624,2.015647 h 2.8891 v 2.066866 z m -2.11898,-2.066866 0.49652,-2.015647 h -2.071979 l -0.496831,2.015647 z"
+     style="opacity:0.9;fill:#000000;stroke-width:0.301292"
+     id="path622" /></svg>
diff --git a/lib/canonical/launchpad/images/src/social-jabber.svg b/lib/canonical/launchpad/images/src/social-jabber.svg
new file mode 100644
index 0000000..93f7090
--- /dev/null
+++ b/lib/canonical/launchpad/images/src/social-jabber.svg
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   version="1.1"
+   viewBox="0 0 31.933697 32.009163"
+   id="svg334"
+   width="31.933697"
+   height="32.009163"
+   xml:space="preserve"
+   xmlns="http://www.w3.org/2000/svg";
+   xmlns:svg="http://www.w3.org/2000/svg";><defs
+     id="defs338" /><title
+     id="title324">Jabber logo</title><g
+     style="fill:#000000"
+     id="g495"
+     transform="matrix(1.3240641,0,0,1.3240641,-0.32920441,0.12153848)"><path
+       d="m 9.597,11.737 c 0,-0.35 -0.065,-0.732 -0.268,-1.025 -0.408,-0.588 -1.283,-0.775 -1.892,-0.405 -0.308,0.188 -0.48,0.515 -0.576,0.851 -0.191,0.668 -0.104,1.43 0.03,2.1 0.043,0.214 0.088,0.428 0.148,0.639 0.021,0.076 0.031,0.186 0.08,0.25 0.087,0.11 0.297,0.141 0.426,0.12 0.387,-0.065 0.291,-0.703 0.278,-0.974 -0.03,-0.634 -0.218,-1.25 -0.036,-1.881 0.076,-0.268 0.225,-0.568 0.494,-0.684 0.244,-0.105 0.49,0.023 0.586,0.261 0.156,0.385 0.117,0.83 0.215,1.23 0.033,0.137 0.07,0.272 0.131,0.399 0.018,0.037 0.043,0.113 0.094,0.108 0.126,-0.011 0.304,-0.22 0.398,-0.298 0.304,-0.25 0.616,-0.52 0.965,-0.705 0.165,-0.088 0.435,-0.23 0.603,-0.08 a 0.612,0.612 0 0 1 0.108,0.13 c 0.198,0.31 0.002,0.55 -0.127,0.845 -0.166,0.38 -0.336,0.758 -0.577,1.098 -0.207,0.293 -0.49,0.549 -0.655,0.869 -0.107,0.205 -0.167,0.43 -0.123,0.663 0.036,0.188 0.181,0.301 0.373,0.257 0.143,-0.033 0.24,-0.156 0.322,-0.269 0.146,-0.202 0.281,-0.412 0.426,-0.615 0.28,-0.393 0.61,-0.76 0.846,-1.183 a 3.41,3.41 0 0 0 0.42,-1.664 c 0,-0.474 -0.171,-1.198 -0.723,-1.298 a 0.974,0.974 0 0 0 -0.326,0.01 1.432,1.432 0 0 0 -0.374,0.12 2.715,2.715 0 0 0 -0.818,0.637 c -0.146,0.16 -0.276,0.363 -0.449,0.495 M 9.078,0.016 C 8.643,0.074 8.2,0.068 7.763,0.136 6.925,0.265 6.123,0.525 5.338,0.839 5.052,0.953 4.77,1.08 4.493,1.215 4.39,1.265 4.233,1.305 4.15,1.385 4.107,1.426 4.111,1.524 4.106,1.58 4.092,1.736 4.072,1.893 4.056,2.05 3.998,2.655 3.956,3.279 4.043,3.884 4.071,4.079 4.133,4.434 4.373,4.471 4.742,4.529 5.029,4.074 5.21,3.823 5.634,3.237 6.115,2.691 6.81,2.429 7.627,2.121 8.563,2.048 9.428,1.989 c 2.426,-0.167 5.078,0.277 6.865,2.064 0.254,0.254 0.495,0.524 0.7,0.82 0.8,1.159 1.223,2.477 1.427,3.86 0.096,0.65 0.161,1.308 0.013,1.955 -0.257,1.122 -0.932,2.1 -1.706,2.931 -0.53,0.57 -1.128,1.084 -1.749,1.552 -0.347,0.261 -0.736,0.483 -1.062,0.768 -0.375,0.329 -0.688,0.74 -0.925,1.179 -0.639,1.181 -0.81,2.602 -0.622,3.92 0.038,0.27 0.073,0.542 0.134,0.809 0.018,0.08 0.022,0.217 0.073,0.282 0.097,0.122 0.36,0.189 0.508,0.196 0.154,0.007 0.256,-0.11 0.294,-0.249 0.064,-0.236 0.026,-0.498 -0.012,-0.736 -0.076,-0.487 -0.147,-0.977 -0.125,-1.471 a 3.71,3.71 0 0 1 1.026,-2.425 c 0.643,-0.673 1.512,-1.061 2.243,-1.625 1.474,-1.136 2.794,-2.668 3.301,-4.492 A 5.194,5.194 0 0 0 19.97,9.312 C 19.865,8.463 19.555,7.615 19.262,6.815 18.37,4.378 16.84,2.06 14.411,0.945 13.447,0.502 12.438,0.3 11.395,0.155 10.905,0.087 10.415,0.045 9.923,0.023 9.649,0.011 9.351,-0.019 9.078,0.017 M 5.277,15.796 c -0.473,0.068 -0.61,0.447 -0.523,0.876 0.112,0.548 0.543,0.965 0.97,1.295 a 6.03,6.03 0 0 0 3.884,1.238 c 0.538,-0.023 1.124,-0.112 1.617,-0.34 0.265,-0.122 0.542,-0.563 0.181,-0.751 A 0.59,0.59 0 0 0 11.237,18.063 C 11.08,18.037 10.904,18.104 10.755,18.147 10.492,18.222 10.229,18.3 9.958,18.343 9.15,18.473 8.275,18.288 7.606,17.809 7.064,17.422 6.626,16.911 6.213,16.394 5.96,16.078 5.731,15.731 5.277,15.796 m -0.615,2.678 c -0.12,0.016 -0.259,0.011 -0.362,0.087 -0.215,0.158 0.022,0.476 0.135,0.62 0.328,0.417 0.76,0.763 1.192,1.068 a 7.832,7.832 0 0 0 4.03,1.442 c 0.421,0.03 0.85,0 1.267,-0.07 0.152,-0.026 0.342,-0.037 0.482,-0.103 0.399,-0.186 0.284,-0.939 -0.072,-1.106 -0.155,-0.073 -0.404,0.023 -0.567,0.046 -0.385,0.054 -0.771,0.06 -1.158,0.05 C 8.594,20.483 7.513,20.17 6.629,19.677 A 5.589,5.589 0 0 1 5.663,18.984 C 5.482,18.824 5.295,18.564 5.06,18.482 4.95,18.445 4.776,18.459 4.662,18.474 M 4.903,20.73 A 0.638,0.638 0 0 0 4.49,20.966 c -0.078,0.088 -0.152,0.167 -0.197,0.278 -0.246,0.609 0.41,1.183 0.864,1.47 0.504,0.32 1.055,0.558 1.616,0.758 1.266,0.45 2.752,0.739 4.066,0.336 0.391,-0.12 0.778,-0.338 1.062,-0.634 0.16,-0.167 0.27,-0.419 -0.024,-0.526 -0.174,-0.063 -0.385,0.098 -0.543,0.162 a 4.57,4.57 0 0 1 -1.158,0.312 C 9.649,23.186 9.175,23.07 8.668,22.943 A 11.982,11.982 0 0 1 7.377,22.57 4.457,4.457 0 0 1 6.351,22.057 C 6.257,21.991 6.145,21.932 6.069,21.846 5.819,21.564 5.63,21.234 5.362,20.966 5.246,20.85 5.081,20.71 4.903,20.73"
+       id="path486" /></g></svg>
diff --git a/lib/canonical/launchpad/images/src/social-matrix.svg b/lib/canonical/launchpad/images/src/social-matrix.svg
new file mode 100644
index 0000000..747f705
--- /dev/null
+++ b/lib/canonical/launchpad/images/src/social-matrix.svg
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   version="1.1"
+   viewBox="0 0 31.933697 32.009163"
+   id="svg334"
+   width="31.933697"
+   height="32.009163"
+   xml:space="preserve"
+   xmlns="http://www.w3.org/2000/svg";
+   xmlns:svg="http://www.w3.org/2000/svg";><defs
+     id="defs338" /><title
+     id="title324">Matrix (protocol) logo</title><g
+     transform="translate(2.0261671,0.05164569)"
+     fill="#040404"
+     id="g460"><path
+       d="M 27.1,31.2 V 0.7 h -2.19 v -0.732 h 3.04 v 32 h -3.04 v -0.732 z"
+       id="path454" /><path
+       d="m 8.23,10.4 v 1.54 h 0.044 c 0.385,-0.564 0.893,-1.03 1.49,-1.37 0.58,-0.323 1.25,-0.485 1.99,-0.485 0.72,0 1.38,0.14 1.97,0.42 0.595,0.279 1.05,0.771 1.36,1.48 0.338,-0.5 0.796,-0.941 1.38,-1.32 0.58,-0.383 1.27,-0.574 2.06,-0.574 0.602,0 1.16,0.074 1.67,0.22 0.514,0.148 0.954,0.383 1.32,0.707 0.366,0.323 0.653,0.746 0.859,1.27 0.205,0.522 0.308,1.15 0.308,1.89 v 7.63 h -3.13 v -6.46 c 0,-0.383 -0.015,-0.743 -0.044,-1.08 -0.0209,-0.307 -0.103,-0.607 -0.242,-0.882 -0.133,-0.251 -0.336,-0.458 -0.584,-0.596 -0.257,-0.146 -0.606,-0.22 -1.05,-0.22 -0.44,0 -0.796,0.085 -1.07,0.253 -0.272,0.17 -0.485,0.39 -0.639,0.662 -0.159,0.287 -0.264,0.602 -0.308,0.927 -0.052,0.347 -0.078,0.697 -0.078,1.05 v 6.35 h -3.13 v -6.4 c 0,-0.338 -0.007,-0.673 -0.021,-1 -0.0114,-0.314 -0.0749,-0.623 -0.188,-0.916 -0.108,-0.277 -0.3,-0.512 -0.55,-0.673 -0.258,-0.168 -0.636,-0.253 -1.14,-0.253 -0.198,0.0083 -0.394,0.042 -0.584,0.1 -0.258,0.0745 -0.498,0.202 -0.705,0.374 -0.228,0.184 -0.422,0.449 -0.584,0.794 -0.161,0.346 -0.242,0.798 -0.242,1.36 v 6.62 h -3.13 v -11.4 z"
+       id="path456" /><path
+       d="m 0.936,0.732 v 30.5 h 2.19 v 0.732 h -3.04 v -32 h 3.03 v 0.732 z"
+       id="path458" /></g></svg>
diff --git a/lib/lp/app/browser/configure.zcml b/lib/lp/app/browser/configure.zcml
index 9391c39..70e44d9 100644
--- a/lib/lp/app/browser/configure.zcml
+++ b/lib/lp/app/browser/configure.zcml
@@ -669,6 +669,13 @@
       />
 
   <adapter
+      for="lp.registry.interfaces.socialaccount.ISocialAccount"
+      provides="zope.traversing.interfaces.IPathAdapter"
+      factory="lp.app.browser.tales.SocialAccountFormatterAPI"
+      name="fmt"
+      />
+
+  <adapter
       for="datetime.timedelta"
       provides="zope.traversing.interfaces.IPathAdapter"
       factory="lp.app.browser.tales.DurationFormatterAPI"
diff --git a/lib/lp/app/browser/tales.py b/lib/lp/app/browser/tales.py
index eb5cad2..9ec03a3 100644
--- a/lib/lp/app/browser/tales.py
+++ b/lib/lp/app/browser/tales.py
@@ -55,6 +55,7 @@ from lp.registry.interfaces.distributionsourcepackage import (
 from lp.registry.interfaces.person import IPerson
 from lp.registry.interfaces.product import IProduct
 from lp.registry.interfaces.projectgroup import IProjectGroup
+from lp.registry.interfaces.socialaccount import SOCIAL_PLATFORM_TYPES_MAP
 from lp.services.compat import tzname
 from lp.services.utils import round_half_up
 from lp.services.webapp.authorization import check_permission
@@ -3049,3 +3050,32 @@ class IRCNicknameFormatterAPI(ObjectFormatterAPI):
             self._context.nickname,
             self._context.network,
         ).escapedtext
+
+
+@implementer(ITraversable)
+class SocialAccountFormatterAPI(ObjectFormatterAPI):
+    """Adapter from social account objects to a formatted string."""
+
+    traversable_names = {
+        "formatted_display": "formatted_display",
+    }
+
+    def getPlatformClass(self):
+        return SOCIAL_PLATFORM_TYPES_MAP.get(self._context.platform)
+
+    def icon(self, platform):
+        return (
+            f'<img class="social_accounts__icon" alt="{platform.title}" '
+            f'title="{platform.title}" src="/@@/{platform.icon}" />'
+        )
+
+    def formatted_display(self, view_name=None):
+        platform = self.getPlatformClass()
+        icon = self.icon(platform)
+        text_display = platform.display_format.format(**self._context.identity)
+
+        if platform.url:
+            url = platform.url.format(**self._context.identity)
+            text_display = f'<a href={url} target="_blank">{text_display}</a>'
+
+        return structured(f"{icon} {text_display}").escapedtext
diff --git a/lib/lp/registry/browser/person.py b/lib/lp/registry/browser/person.py
index 139b687..fa176a5 100644
--- a/lib/lp/registry/browser/person.py
+++ b/lib/lp/registry/browser/person.py
@@ -156,6 +156,7 @@ from lp.registry.interfaces.product import InvalidProductName, IProduct
 from lp.registry.interfaces.socialaccount import (
     ISocialAccountSet,
     MatrixPlatform,
+    SocialPlatformType,
 )
 from lp.registry.interfaces.ssh import ISSHKeySet, SSHKeyAdditionError
 from lp.registry.interfaces.teammembership import (
@@ -1680,6 +1681,17 @@ class PersonView(LaunchpadView, FeedsMixin, ContactViaWebLinksMixin):
         )
 
     @property
+    def should_show_matrix_accounts_section(self):
+        """Should the matrix accounts section be shown?
+
+        It's shown when the person has social accounts for the Matrix platform
+        registered or has rights to register new ones.
+        """
+        return bool(self.matrix_accounts) or (
+            check_permission("launchpad.Edit", self.context)
+        )
+
+    @property
     def should_show_sshkeys_section(self):
         """Should the 'SSH keys' section be shown?
 
@@ -1707,6 +1719,10 @@ class PersonView(LaunchpadView, FeedsMixin, ContactViaWebLinksMixin):
         return self.context.gpg_keys
 
     @cachedproperty
+    def matrix_accounts(self):
+        return self.context.getSocialAccounts(SocialPlatformType.MATRIX)
+
+    @cachedproperty
     def is_probationary_or_invalid_user(self):
         """True when the user is not active or does not have karma.
 
diff --git a/lib/lp/registry/interfaces/socialaccount.py b/lib/lp/registry/interfaces/socialaccount.py
index 6d1ff92..f4d9523 100644
--- a/lib/lp/registry/interfaces/socialaccount.py
+++ b/lib/lp/registry/interfaces/socialaccount.py
@@ -104,12 +104,23 @@ class SocialPlatform:
     title = ""
     identity_fields = []
     platform_type = None
+    icon = ""
+    display_format = ""
+    url = None
 
 
 class MatrixPlatform(SocialPlatform):
     title = "Matrix"
     identity_fields = ["username", "homeserver"]
     platform_type = SocialPlatformType.MATRIX
+    icon = "social-matrix"
+    display_format = "<strong>@{username}:{homeserver}</strong>"
+    url = "https://matrix.to//#/@{username}:{homeserver}";
+
+
+SOCIAL_PLATFORM_TYPES_MAP = {
+    SocialPlatformType.MATRIX: MatrixPlatform,
+}
 
 
 @error_status(http.client.BAD_REQUEST)
diff --git a/lib/lp/registry/templates/person-portlet-contact-details.pt b/lib/lp/registry/templates/person-portlet-contact-details.pt
index e9b37b2..8202097 100644
--- a/lib/lp/registry/templates/person-portlet-contact-details.pt
+++ b/lib/lp/registry/templates/person-portlet-contact-details.pt
@@ -170,38 +170,54 @@
              class="sprite maybe action-icon">Karma help</a>
       </dd>
     </dl>
-  </div>
-
-  <div class="yui-u two-column-list">
-    <dt>Social Accounts:</dt>
-    <dl tal:condition="view/should_show_ircnicknames_section">
-      <dt>IRC:
-        <a tal:replace="structure overview_menu/editircnicknames/fmt:icon" />
-      </dt>
-      <dd tal:repeat="ircnick context/ircnicknames">
-        <span tal:replace="structure ircnick/fmt:formatted_displayname"/>
-      </dd>
-      <dd tal:condition="not: context/ircnicknames">
-        No IRC nicknames registered.
-      </dd>
-    </dl>
-
-    <dl tal:condition="view/should_show_jabberids_section" id="jabber-ids">
-      <dt>Jabber:
-        <a tal:replace="structure overview_menu/editjabberids/fmt:icon" />
-      </dt>
-      <dd>
-        <tal:block repeat="jabberid context/jabberids">
-          <span tal:replace="jabberid/jabberid/fmt:obfuscate-email"
-            /><span tal:condition="not: repeat/jabberid/end">,</span>
-        </tal:block>
-        <div tal:condition="context/jabberids/is_empty">
-          No Jabber IDs registered.
-        </div>
-      </dd>
-    </dl>
-  </div>
+</div>
 
+    <div class="yui-u social_accounts">
+      <dl id="social-accounts"> 
+        <dt>Social accounts:</dt>
+
+        <dd class="social_accounts__item" tal:repeat="ircnick context/ircnicknames">
+          <img class="social_accounts__icon" alt="IRC" title="IRC" src="/@@/social-irc"/>
+          <span tal:replace="structure ircnick/fmt:formatted_displayname"/>
+          <a tal:replace="structure overview_menu/editircnicknames/fmt:icon"/>
+        </dd>
+
+        <dd class="social_accounts__item" tal:repeat="jabberid context/jabberids">
+          <img class="social_accounts__icon" alt="Jabber" title="Jabber" src="/@@/social-jabber" />
+          <span tal:replace="jabberid/jabberid/fmt:obfuscate-email"/>
+          <a tal:replace="structure overview_menu/editjabberids/fmt:icon"/>
+        </dd>
+
+        <dd class="social_accounts__item" tal:repeat="social_account view/matrix_accounts">
+          <span tal:replace="structure social_account/fmt:formatted_display"/>
+          <a tal:replace="structure overview_menu/editmatrixaccounts/fmt:icon" />
+        </dd>
+
+        <tal:irc condition="view/should_show_ircnicknames_section">
+          <dd class="social_accounts__item" tal:condition="not: context/ircnicknames">
+            <img class="social_accounts__icon" alt="IRC" title="IRC" src="/@@/social-irc"/>
+            <span>No IRC nicknames registered.</span>
+            <a tal:replace="structure overview_menu/editircnicknames/fmt:icon"/>
+          </dd>
+        </tal:irc>
+
+        <tal:jabber condition="view/should_show_jabberids_section">
+          <dd class="social_accounts__item" tal:condition="context/jabberids/is_empty">
+            <img class="social_accounts__icon" alt="Jabber" title="Jabber" src="/@@/social-jabber" />
+            <span>No Jabber IDs registered.</span>
+            <a tal:replace="structure overview_menu/editjabberids/fmt:icon" />
+          </dd>
+        </tal:jabber>
+
+        <tal:matrix condition="view/should_show_matrix_accounts_section">
+          <dd class="social_accounts__item" tal:condition="not: view/matrix_accounts">
+            <span>No matrix accounts registered.</span>
+            <a tal:replace="structure overview_menu/editmatrixaccounts/fmt:icon" />
+          </dd>
+        </tal:matrix>
+
+      </dl>
+    </div>
 </div>
 
 </tal:root>

Follow ups