)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":8648,"name":"Radomir Dopieralski","email":"openstack@dopieralski.pl","username":"thesheep"},"change_message_id":"9de179bcc2ce93537516bcad8b0efc9b80694eea","unresolved":true,"context_lines":[{"line_number":4,"context_line":"Commit:     Owen McGonagle \u003comcgonag@redhat.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2025-11-11 21:01:34 -0500"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"de-angularize Key Pairs"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Change-Id: Id5e0a7a75fb42499b605e91f9b6ddfea9b7a002e"},{"line_number":10,"context_line":"Signed-off-by: Owen McGonagle \u003comcgonag@redhat.com\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":15,"id":"53b82c5d_d73e0a8d","line":7,"updated":"2025-11-12 08:29:58.000000000","message":"We probably want a better commit message before we merge this. Please mention that we are doing this to make the python version of this page have the same functionality as the angularjs version.","commit_id":"7958b5dbbb07c492d4b4f3a4bb85c2f279ff3829"},{"author":{"_account_id":32432,"name":"Owen McGonagle","email":"omcgonag@redhat.com","username":"omcgonag"},"change_message_id":"52d21fa685c704518fdd7e28cb37821655164a39","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Owen McGonagle \u003comcgonag@redhat.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2025-11-11 21:01:34 -0500"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"de-angularize Key Pairs"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Change-Id: Id5e0a7a75fb42499b605e91f9b6ddfea9b7a002e"},{"line_number":10,"context_line":"Signed-off-by: Owen McGonagle \u003comcgonag@redhat.com\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":15,"id":"d245f893_435b7ff5","line":7,"in_reply_to":"53b82c5d_d73e0a8d","updated":"2025-11-12 15:35:07.000000000","message":"Done","commit_id":"7958b5dbbb07c492d4b4f3a4bb85c2f279ff3829"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":32432,"name":"Owen McGonagle","email":"omcgonag@redhat.com","username":"omcgonag"},"change_message_id":"62b4017c57b6fa59ac05f662d93ca7a5e4a66dd8","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"4b601de6_95667d81","updated":"2025-11-11 03:57:27.000000000","message":"I am still investigating if the changes for Patchset 7 are the best option(s) we have.","commit_id":"bccf1b95938d2d4b65ace95dd3e5093cb3bf734b"},{"author":{"_account_id":32432,"name":"Owen McGonagle","email":"omcgonag@redhat.com","username":"omcgonag"},"change_message_id":"efef979a2896f3b3da7479dbd7500961b3640b08","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":18,"id":"40e7f978_d6e4e8f8","updated":"2025-11-13 02:52:32.000000000","message":"recheck","commit_id":"f0ceabc668e0e9f991dfa1fe77513368abee7fa3"},{"author":{"_account_id":6914,"name":"Tatiana Ovchinnikova","email":"t.v.ovtchinnikova@gmail.com","username":"tmazur"},"change_message_id":"9a97fb1f4c5dcb3b99c7cd6dd421823db83a06b7","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":21,"id":"450b6bc6_0ecdd0f3","updated":"2025-11-20 15:26:08.000000000","message":"Please don\u0027t +1 patches that are already merged. It adds nothing but confusion.","commit_id":"94212eea53a5f40b7bfc6ba1cf86267b34913b5e"},{"author":{"_account_id":6914,"name":"Tatiana Ovchinnikova","email":"t.v.ovtchinnikova@gmail.com","username":"tmazur"},"change_message_id":"4020ff58ddd935e5fc764567b55111019097e5dd","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":21,"id":"f09155ea_38628171","updated":"2025-11-17 16:36:24.000000000","message":"Thank you for the patch! As we discussed before, the chevron logic should be moved from key pairs to horizon library, so we can reuse it for another tables. It can be done in the next patch, so I am ok to merge this one.\nAlso, row borders seem to be of inconsistent width. I\u0027ve tested this table on two different environments, and on the first one we had thicker borders over the top and bottom row, and on the second env the thicker borders are everywhere except the bottom row. Again, this can be fixed in a follow up patch.","commit_id":"94212eea53a5f40b7bfc6ba1cf86267b34913b5e"}],"openstack_dashboard/dashboards/project/key_pairs/tables.py":[{"author":{"_account_id":32432,"name":"Owen McGonagle","email":"omcgonag@redhat.com","username":"omcgonag"},"change_message_id":"62b4017c57b6fa59ac05f662d93ca7a5e4a66dd8","unresolved":true,"context_lines":[{"line_number":122,"context_line":"    "},{"line_number":123,"context_line":"    def render(self):"},{"line_number":124,"context_line":"        # Generate unique chevron ID using the datum\u0027s unique identifier"},{"line_number":125,"context_line":"        object_id \u003d self.table.get_object_id(self.datum)"},{"line_number":126,"context_line":"        chevron_id \u003d \"%s_chevron_%s\" % (self.table.name, object_id)"},{"line_number":127,"context_line":"        return render_to_string(\"key_pairs/expandable_row.html\","},{"line_number":128,"context_line":"                                {\"row\": self, \"chevron_id\": chevron_id})"}],"source_content_type":"text/x-python","patch_set":7,"id":"3965cd06_f0157383","line":125,"updated":"2025-11-11 03:57:27.000000000","message":"this does seem to give us a unique id - that can also be used below wen rendering the chevron columnm.","commit_id":"bccf1b95938d2d4b65ace95dd3e5093cb3bf734b"},{"author":{"_account_id":32432,"name":"Owen McGonagle","email":"omcgonag@redhat.com","username":"omcgonag"},"change_message_id":"0bc62687cfecd6de3f1747916161b90451e35105","unresolved":true,"context_lines":[{"line_number":122,"context_line":"    "},{"line_number":123,"context_line":"    def render(self):"},{"line_number":124,"context_line":"        # Generate unique chevron ID using the datum\u0027s unique identifier"},{"line_number":125,"context_line":"        object_id \u003d self.table.get_object_id(self.datum)"},{"line_number":126,"context_line":"        chevron_id \u003d \"%s_chevron_%s\" % (self.table.name, object_id)"},{"line_number":127,"context_line":"        return render_to_string(\"key_pairs/expandable_row.html\","},{"line_number":128,"context_line":"                                {\"row\": self, \"chevron_id\": chevron_id})"}],"source_content_type":"text/x-python","patch_set":7,"id":"89f868a0_71c32279","line":125,"in_reply_to":"3965cd06_f0157383","updated":"2025-11-11 15:06:20.000000000","message":"we now need to get it so that chevron rotates.","commit_id":"bccf1b95938d2d4b65ace95dd3e5093cb3bf734b"},{"author":{"_account_id":32432,"name":"Owen McGonagle","email":"omcgonag@redhat.com","username":"omcgonag"},"change_message_id":"368d8cd83c53c0c6c7865e54e1abde87b013c831","unresolved":false,"context_lines":[{"line_number":122,"context_line":"    "},{"line_number":123,"context_line":"    def render(self):"},{"line_number":124,"context_line":"        # Generate unique chevron ID using the datum\u0027s unique identifier"},{"line_number":125,"context_line":"        object_id \u003d self.table.get_object_id(self.datum)"},{"line_number":126,"context_line":"        chevron_id \u003d \"%s_chevron_%s\" % (self.table.name, object_id)"},{"line_number":127,"context_line":"        return render_to_string(\"key_pairs/expandable_row.html\","},{"line_number":128,"context_line":"                                {\"row\": self, \"chevron_id\": chevron_id})"}],"source_content_type":"text/x-python","patch_set":7,"id":"4bb79954_77535e7e","line":125,"in_reply_to":"89f868a0_71c32279","updated":"2025-11-11 15:22:54.000000000","message":"added collapse class - chevron now rotates.","commit_id":"bccf1b95938d2d4b65ace95dd3e5093cb3bf734b"},{"author":{"_account_id":8648,"name":"Radomir Dopieralski","email":"openstack@dopieralski.pl","username":"thesheep"},"change_message_id":"b4a0b54052233f2dd87499114d5942da8b9adab5","unresolved":true,"context_lines":[{"line_number":123,"context_line":"    def render(self):"},{"line_number":124,"context_line":"        # Generate unique chevron ID using the datum\u0027s unique identifier"},{"line_number":125,"context_line":"        object_id \u003d self.table.get_object_id(self.datum)"},{"line_number":126,"context_line":"        chevron_id \u003d \"%s_chevron_%s\" % (self.table.name, object_id)"},{"line_number":127,"context_line":"        return render_to_string(\"key_pairs/expandable_row.html\","},{"line_number":128,"context_line":"                                {\"row\": self, \"chevron_id\": chevron_id})"},{"line_number":129,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"3519da9c_5b720b0e","line":126,"updated":"2025-11-11 12:39:15.000000000","message":"it looks like those two lines could be moved to a function, something like `get_chevron_id`, so that we don\u0027t accidentally introduce differences with how the id is generated in both cases, the function could take `table` and `datum` as arguments.","commit_id":"bccf1b95938d2d4b65ace95dd3e5093cb3bf734b"},{"author":{"_account_id":32432,"name":"Owen McGonagle","email":"omcgonag@redhat.com","username":"omcgonag"},"change_message_id":"1c8d42c146fd61022ec4bc967123095db11ef949","unresolved":false,"context_lines":[{"line_number":123,"context_line":"    def render(self):"},{"line_number":124,"context_line":"        # Generate unique chevron ID using the datum\u0027s unique identifier"},{"line_number":125,"context_line":"        object_id \u003d self.table.get_object_id(self.datum)"},{"line_number":126,"context_line":"        chevron_id \u003d \"%s_chevron_%s\" % (self.table.name, object_id)"},{"line_number":127,"context_line":"        return render_to_string(\"key_pairs/expandable_row.html\","},{"line_number":128,"context_line":"                                {\"row\": self, \"chevron_id\": chevron_id})"},{"line_number":129,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"5c356fbc_ad2bcdc2","line":126,"in_reply_to":"3519da9c_5b720b0e","updated":"2025-11-11 14:11:37.000000000","message":"function added","commit_id":"bccf1b95938d2d4b65ace95dd3e5093cb3bf734b"},{"author":{"_account_id":8648,"name":"Radomir Dopieralski","email":"openstack@dopieralski.pl","username":"thesheep"},"change_message_id":"1d0b744d692dd9ad8e54e58aea78ad8a56a4bc3e","unresolved":true,"context_lines":[{"line_number":157,"context_line":"        return render_to_string("},{"line_number":158,"context_line":"            \"key_pairs/_chevron_column.html\","},{"line_number":159,"context_line":"            {\"chevron_id\": chevron_id}"},{"line_number":160,"context_line":"        )"},{"line_number":161,"context_line":""},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"class KeyPairsTable(tables.DataTable):"}],"source_content_type":"text/x-python","patch_set":11,"id":"e0a8e457_0e9741c1","line":160,"updated":"2025-11-11 16:36:58.000000000","message":"We probably want to give it a different class name than \"normal_column sortable\", and maybe prevent it from being sortable too.","commit_id":"4eef0d84c78eb15304924d5defc65d8c4bca31ab"},{"author":{"_account_id":32432,"name":"Owen McGonagle","email":"omcgonag@redhat.com","username":"omcgonag"},"change_message_id":"bc48b7a61843fe37914e3322745b6ce278f8a65a","unresolved":false,"context_lines":[{"line_number":157,"context_line":"        return render_to_string("},{"line_number":158,"context_line":"            \"key_pairs/_chevron_column.html\","},{"line_number":159,"context_line":"            {\"chevron_id\": chevron_id}"},{"line_number":160,"context_line":"        )"},{"line_number":161,"context_line":""},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"class KeyPairsTable(tables.DataTable):"}],"source_content_type":"text/x-python","patch_set":11,"id":"6f94e08a_3469a2fc","line":160,"in_reply_to":"e0a8e457_0e9741c1","updated":"2025-11-12 00:57:00.000000000","message":"We now see chevron_column normal_column and sorter-false                                                                                                   \n                                                                                                                                                           \n\u003cth class\u003d\"chevron_column normal_column tablesorter-header sorter-false\" data-column\u003d\"1\" tabindex\u003d\"0\"\u003e\n  \u003cdiv class\u003d\"tablesorter-header-inner\"\u003e\n        \u003ci class\u003d\"table-sort-indicator tablesorter-icon\"\u003e\u003c/i\u003e\u003c/div\u003e\n  \u003c/div\u003e\n\u003c/th\u003e","commit_id":"4eef0d84c78eb15304924d5defc65d8c4bca31ab"},{"author":{"_account_id":32432,"name":"Owen McGonagle","email":"omcgonag@redhat.com","username":"omcgonag"},"change_message_id":"1c14a489e9d212b3176c304e4fa2742af31da099","unresolved":true,"context_lines":[{"line_number":25,"context_line":"from openstack_dashboard import api"},{"line_number":26,"context_line":"from openstack_dashboard.usage import quotas"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"class DeleteKeyPairs(tables.DeleteAction):"},{"line_number":30,"context_line":"    policy_rules \u003d ((\"compute\", \"os_compute_api:os-keypairs:delete\"),)"},{"line_number":31,"context_line":"    help_text \u003d _(\"Removing a key pair can leave OpenStack resources orphaned.\""}],"source_content_type":"text/x-python","patch_set":13,"id":"93147b4d_7a466911","line":28,"updated":"2025-11-12 02:00:44.000000000","message":"H306: imports not in alphabetical order (django.urls, django.template.loader.render_to_string)\n\nfix: (ur)ls comes after (t)emplate.loader and before (ut)ils.text","commit_id":"aecefda7941b5f2889e73865a841f3a48ab16f37"},{"author":{"_account_id":32432,"name":"Owen McGonagle","email":"omcgonag@redhat.com","username":"omcgonag"},"change_message_id":"cf4b6f64a12196d9606da91de88ba34788bc3ed9","unresolved":false,"context_lines":[{"line_number":25,"context_line":"from openstack_dashboard import api"},{"line_number":26,"context_line":"from openstack_dashboard.usage import quotas"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"class DeleteKeyPairs(tables.DeleteAction):"},{"line_number":30,"context_line":"    policy_rules \u003d ((\"compute\", \"os_compute_api:os-keypairs:delete\"),)"},{"line_number":31,"context_line":"    help_text \u003d _(\"Removing a key pair can leave OpenStack resources orphaned.\""}],"source_content_type":"text/x-python","patch_set":13,"id":"a1a7476b_58a17bc9","line":28,"in_reply_to":"7a6f1da2_8e073bcb","updated":"2025-11-12 02:02:44.000000000","message":"resolved","commit_id":"aecefda7941b5f2889e73865a841f3a48ab16f37"},{"author":{"_account_id":32432,"name":"Owen McGonagle","email":"omcgonag@redhat.com","username":"omcgonag"},"change_message_id":"012ea8bc15f3c0006a0a5d82799b2e0085003e8c","unresolved":true,"context_lines":[{"line_number":25,"context_line":"from openstack_dashboard import api"},{"line_number":26,"context_line":"from openstack_dashboard.usage import quotas"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"class DeleteKeyPairs(tables.DeleteAction):"},{"line_number":30,"context_line":"    policy_rules \u003d ((\"compute\", \"os_compute_api:os-keypairs:delete\"),)"},{"line_number":31,"context_line":"    help_text \u003d _(\"Removing a key pair can leave OpenStack resources orphaned.\""}],"source_content_type":"text/x-python","patch_set":13,"id":"7a6f1da2_8e073bcb","line":28,"in_reply_to":"93147b4d_7a466911","updated":"2025-11-12 02:02:08.000000000","message":"fixed","commit_id":"aecefda7941b5f2889e73865a841f3a48ab16f37"}],"openstack_dashboard/dashboards/project/templates/key_pairs/_chevron_column.html":[{"author":{"_account_id":32432,"name":"Owen McGonagle","email":"omcgonag@redhat.com","username":"omcgonag"},"change_message_id":"62b4017c57b6fa59ac05f662d93ca7a5e4a66dd8","unresolved":true,"context_lines":[{"line_number":2,"context_line":"\u003ca role\u003d\"button\""},{"line_number":3,"context_line":"   class\u003d\"chevron-toggle\""},{"line_number":4,"context_line":"   href\u003d\"#\""},{"line_number":5,"context_line":"   onclick\u003d\"return horizon.key_pairs.toggleDetailRow(this, \u0027{{ chevron_id }}\u0027);\""},{"line_number":6,"context_line":"   aria-expanded\u003d\"false\""},{"line_number":7,"context_line":"   aria-controls\u003d\"{{ chevron_id }}\""},{"line_number":8,"context_line":"   aria-label\u003d\"{% trans \u0027Toggle key pair details\u0027 %}\"\u003e"}],"source_content_type":"text/html","patch_set":7,"id":"72948738_a1914351","line":5,"updated":"2025-11-11 03:57:27.000000000","message":"I need to do a bit more investigation if this onclick method is best for controlling our chevron operations in terms of \"collapse\" control. I know we talked about other ways to program this collapse. There are other changes (js) that seem to implement control that may be available in a much cleaner way.","commit_id":"bccf1b95938d2d4b65ace95dd3e5093cb3bf734b"},{"author":{"_account_id":8648,"name":"Radomir Dopieralski","email":"openstack@dopieralski.pl","username":"thesheep"},"change_message_id":"b4a0b54052233f2dd87499114d5942da8b9adab5","unresolved":true,"context_lines":[{"line_number":2,"context_line":"\u003ca role\u003d\"button\""},{"line_number":3,"context_line":"   class\u003d\"chevron-toggle\""},{"line_number":4,"context_line":"   href\u003d\"#\""},{"line_number":5,"context_line":"   onclick\u003d\"return horizon.key_pairs.toggleDetailRow(this, \u0027{{ chevron_id }}\u0027);\""},{"line_number":6,"context_line":"   aria-expanded\u003d\"false\""},{"line_number":7,"context_line":"   aria-controls\u003d\"{{ chevron_id }}\""},{"line_number":8,"context_line":"   aria-label\u003d\"{% trans \u0027Toggle key pair details\u0027 %}\"\u003e"}],"source_content_type":"text/html","patch_set":7,"id":"a9a38542_8c68b830","line":5,"in_reply_to":"72948738_a1914351","updated":"2025-11-11 12:39:15.000000000","message":"See https://getbootstrap.com/docs/3.4/javascript/#collapse","commit_id":"bccf1b95938d2d4b65ace95dd3e5093cb3bf734b"},{"author":{"_account_id":32432,"name":"Owen McGonagle","email":"omcgonag@redhat.com","username":"omcgonag"},"change_message_id":"0ec3f84eba3546779bb349b971b4e26cf3204d63","unresolved":false,"context_lines":[{"line_number":2,"context_line":"\u003ca role\u003d\"button\""},{"line_number":3,"context_line":"   class\u003d\"chevron-toggle\""},{"line_number":4,"context_line":"   href\u003d\"#\""},{"line_number":5,"context_line":"   onclick\u003d\"return horizon.key_pairs.toggleDetailRow(this, \u0027{{ chevron_id }}\u0027);\""},{"line_number":6,"context_line":"   aria-expanded\u003d\"false\""},{"line_number":7,"context_line":"   aria-controls\u003d\"{{ chevron_id }}\""},{"line_number":8,"context_line":"   aria-label\u003d\"{% trans \u0027Toggle key pair details\u0027 %}\"\u003e"}],"source_content_type":"text/html","patch_set":7,"id":"f21ddc6a_c7552e02","line":5,"in_reply_to":"a9a38542_8c68b830","updated":"2025-11-11 15:01:25.000000000","message":"getbootstrap collapse added.","commit_id":"bccf1b95938d2d4b65ace95dd3e5093cb3bf734b"}],"openstack_dashboard/dashboards/project/templates/key_pairs/_keypairs_table.html":[{"author":{"_account_id":32432,"name":"Owen McGonagle","email":"omcgonag@redhat.com","username":"omcgonag"},"change_message_id":"8b69c528c3b3d8970089b86eb7b84967465a6a63","unresolved":true,"context_lines":[{"line_number":20,"context_line":"  transform: rotate(90deg);"},{"line_number":21,"context_line":"}"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"/* Remove padding, line-height, and border from detail row cells to eliminate gap when collapsed */"},{"line_number":24,"context_line":"tr.keypair-detail-row td {"},{"line_number":25,"context_line":"  padding: 0 !important;"},{"line_number":26,"context_line":"  line-height: 0;"}],"source_content_type":"text/html","patch_set":18,"id":"53b38eb1_d8ff5242","line":23,"updated":"2025-11-13 02:20:59.000000000","message":"I tried this simpler change initially (below)\n\nAnd then found/experimented with the \"tr.keypair-detail-row td .collapse:not(.in)\"\n\nNot sure if this is the best/cleanest approach.","commit_id":"f0ceabc668e0e9f991dfa1fe77513368abee7fa3"},{"author":{"_account_id":8648,"name":"Radomir Dopieralski","email":"openstack@dopieralski.pl","username":"thesheep"},"change_message_id":"15e71ce3601d0a1b9ef9895b1c5fb9e59e13e868","unresolved":true,"context_lines":[{"line_number":20,"context_line":"  transform: rotate(90deg);"},{"line_number":21,"context_line":"}"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"/* Remove padding, line-height, and border from detail row cells to eliminate gap when collapsed */"},{"line_number":24,"context_line":"tr.keypair-detail-row td {"},{"line_number":25,"context_line":"  padding: 0 !important;"},{"line_number":26,"context_line":"  line-height: 0;"}],"source_content_type":"text/html","patch_set":18,"id":"a0512c34_f1c3f360","line":23,"in_reply_to":"03b8cb22_76e7f114","updated":"2025-11-13 15:58:20.000000000","message":"I played with it a bit and simplified it. Got rid of the !important by making the selector more specific than the one that added the padding. The other rules seem to be unnecessary. We want to see the horizontal line when the extra info is expanded, so instead of removing it, I added a 1px negative margin, so when collapsed the two lines now overlap.","commit_id":"f0ceabc668e0e9f991dfa1fe77513368abee7fa3"},{"author":{"_account_id":32432,"name":"Owen McGonagle","email":"omcgonag@redhat.com","username":"omcgonag"},"change_message_id":"4ced50f260a72f36e71788c5b2ee1aa3f85dc8fc","unresolved":true,"context_lines":[{"line_number":20,"context_line":"  transform: rotate(90deg);"},{"line_number":21,"context_line":"}"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"/* Remove padding, line-height, and border from detail row cells to eliminate gap when collapsed */"},{"line_number":24,"context_line":"tr.keypair-detail-row td {"},{"line_number":25,"context_line":"  padding: 0 !important;"},{"line_number":26,"context_line":"  line-height: 0;"}],"source_content_type":"text/html","patch_set":18,"id":"03b8cb22_76e7f114","line":23,"in_reply_to":"53b38eb1_d8ff5242","updated":"2025-11-13 14:55:14.000000000","message":"forgot to include the initial approach - this did not do it all - thus the update with the more complicated/additional css markers.\n\nIf we are good with this change (it does fix the extra empty line issue) - let me know.\n\ntr.keypair-detail-row td {\n  padding: 0;\n  line-height: 0;\n  border-top: 0;\n}\n\ntr.keypair-detail-row td div.keypair-details {\n  margin: 8px;\n  line-height: normal;\n}","commit_id":"f0ceabc668e0e9f991dfa1fe77513368abee7fa3"},{"author":{"_account_id":32432,"name":"Owen McGonagle","email":"omcgonag@redhat.com","username":"omcgonag"},"change_message_id":"45fabe463d0d9feffd9700c62dceaf5a1b06aac2","unresolved":false,"context_lines":[{"line_number":20,"context_line":"  transform: rotate(90deg);"},{"line_number":21,"context_line":"}"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"/* Remove padding, line-height, and border from detail row cells to eliminate gap when collapsed */"},{"line_number":24,"context_line":"tr.keypair-detail-row td {"},{"line_number":25,"context_line":"  padding: 0 !important;"},{"line_number":26,"context_line":"  line-height: 0;"}],"source_content_type":"text/html","patch_set":18,"id":"d89d95b3_6e10fa4c","line":23,"in_reply_to":"6b9c9cf4_13f77727","updated":"2025-11-14 15:15:25.000000000","message":"we will stick with this implemntation - if we get a different or better/cleaner solution moving forward with these de-angularize tasks, we can revisit then.","commit_id":"f0ceabc668e0e9f991dfa1fe77513368abee7fa3"},{"author":{"_account_id":32432,"name":"Owen McGonagle","email":"omcgonag@redhat.com","username":"omcgonag"},"change_message_id":"24edd5818060e7401855a36e17d2f974eacb853b","unresolved":true,"context_lines":[{"line_number":20,"context_line":"  transform: rotate(90deg);"},{"line_number":21,"context_line":"}"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"/* Remove padding, line-height, and border from detail row cells to eliminate gap when collapsed */"},{"line_number":24,"context_line":"tr.keypair-detail-row td {"},{"line_number":25,"context_line":"  padding: 0 !important;"},{"line_number":26,"context_line":"  line-height: 0;"}],"source_content_type":"text/html","patch_set":18,"id":"6b9c9cf4_13f77727","line":23,"in_reply_to":"a0512c34_f1c3f360","updated":"2025-11-13 23:17:09.000000000","message":"I found a fix which applies `width: 1%` to Chevron and Name columns, forcing\ntight spacing that matches the AngularJS layout.\n\nI also found a fix that updates the CSS in _keypairs_table.html to distribute widths:\nChevron/Name (1%), Type (15%), Fingerprint (40%), Actions (auto).\n\nI need to review and study this new scheme (technology) a bit more...\n\nIn the meantime columns now remain stable during expand/collapse transitions.\n\nWe can either go with this, or leave alone, and stay with the 1-2 column shift.","commit_id":"f0ceabc668e0e9f991dfa1fe77513368abee7fa3"}],"openstack_dashboard/dashboards/project/templates/key_pairs/expandable_row.html":[{"author":{"_account_id":32432,"name":"Owen McGonagle","email":"omcgonag@redhat.com","username":"omcgonag"},"change_message_id":"62b4017c57b6fa59ac05f662d93ca7a5e4a66dd8","unresolved":true,"context_lines":[{"line_number":1,"context_line":"{% load i18n %}"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"{% include \"horizon/common/_data_table_row.html\" %}"},{"line_number":4,"context_line":""}],"source_content_type":"text/html","patch_set":7,"id":"c04967ee_2a50e7b4","line":1,"updated":"2025-11-11 03:57:27.000000000","message":"related to my other comment on using \u0027onclick\u0027 to manager chevron operations. I am still analyzing this method. I would think there is a better method/class that does this for us - without having to write special code.","commit_id":"bccf1b95938d2d4b65ace95dd3e5093cb3bf734b"},{"author":{"_account_id":32432,"name":"Owen McGonagle","email":"omcgonag@redhat.com","username":"omcgonag"},"change_message_id":"0bc62687cfecd6de3f1747916161b90451e35105","unresolved":false,"context_lines":[{"line_number":1,"context_line":"{% load i18n %}"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"{% include \"horizon/common/_data_table_row.html\" %}"},{"line_number":4,"context_line":""}],"source_content_type":"text/html","patch_set":7,"id":"8339e6a8_a334a5c3","line":1,"in_reply_to":"c04967ee_2a50e7b4","updated":"2025-11-11 15:06:20.000000000","message":"getbootstrap collapse code working.","commit_id":"bccf1b95938d2d4b65ace95dd3e5093cb3bf734b"},{"author":{"_account_id":8648,"name":"Radomir Dopieralski","email":"openstack@dopieralski.pl","username":"thesheep"},"change_message_id":"1d0b744d692dd9ad8e54e58aea78ad8a56a4bc3e","unresolved":true,"context_lines":[{"line_number":29,"context_line":"/* Chevron rotation for key pair expandable rows"},{"line_number":30,"context_line":"   Uses Bootstrap\u0027s automatic .collapsed class management */"},{"line_number":31,"context_line":".chevron-toggle {"},{"line_number":32,"context_line":"  transition: all 0.3s ease;"},{"line_number":33,"context_line":"}"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":".chevron-toggle .fa-chevron-right {"}],"source_content_type":"text/html","patch_set":11,"id":"13d54747_be2e38f6","line":32,"updated":"2025-11-11 16:36:58.000000000","message":"add `color: inherit;` here to make the chevron the color of normal text","commit_id":"4eef0d84c78eb15304924d5defc65d8c4bca31ab"},{"author":{"_account_id":32432,"name":"Owen McGonagle","email":"omcgonag@redhat.com","username":"omcgonag"},"change_message_id":"c363bb1534743862518e2180628c341ea400411a","unresolved":false,"context_lines":[{"line_number":29,"context_line":"/* Chevron rotation for key pair expandable rows"},{"line_number":30,"context_line":"   Uses Bootstrap\u0027s automatic .collapsed class management */"},{"line_number":31,"context_line":".chevron-toggle {"},{"line_number":32,"context_line":"  transition: all 0.3s ease;"},{"line_number":33,"context_line":"}"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":".chevron-toggle .fa-chevron-right {"}],"source_content_type":"text/html","patch_set":11,"id":"fa3b0c1f_d0512da8","line":32,"in_reply_to":"13d54747_be2e38f6","updated":"2025-11-12 01:13:36.000000000","message":"added","commit_id":"4eef0d84c78eb15304924d5defc65d8c4bca31ab"},{"author":{"_account_id":8648,"name":"Radomir Dopieralski","email":"openstack@dopieralski.pl","username":"thesheep"},"change_message_id":"54511435b2975e6b341b3003e8ce8a0fc49e8916","unresolved":true,"context_lines":[{"line_number":40,"context_line":"/* Rotate chevron 90 degrees when row is expanded (not collapsed) */"},{"line_number":41,"context_line":".chevron-toggle:not(.collapsed) .fa-chevron-right {"},{"line_number":42,"context_line":"  transform: rotate(90deg);"},{"line_number":43,"context_line":"}"},{"line_number":44,"context_line":"\u003c/style\u003e"},{"line_number":45,"context_line":""}],"source_content_type":"text/html","patch_set":11,"id":"9cf9a894_d4bd10a0","line":43,"updated":"2025-11-11 16:28:57.000000000","message":"I would add something like:\n\ntr.keypair-detail-row td { padding: 0 };\ntr.keypair-detail-row tod div.keypair-details { margin: 8px };\n\nto the style, to get rid of that gap when the details are collapsed.","commit_id":"4eef0d84c78eb15304924d5defc65d8c4bca31ab"},{"author":{"_account_id":32432,"name":"Owen McGonagle","email":"omcgonag@redhat.com","username":"omcgonag"},"change_message_id":"dfe2b0fd1de689a0098bfe311cf39ffef1f769b9","unresolved":false,"context_lines":[{"line_number":40,"context_line":"/* Rotate chevron 90 degrees when row is expanded (not collapsed) */"},{"line_number":41,"context_line":".chevron-toggle:not(.collapsed) .fa-chevron-right {"},{"line_number":42,"context_line":"  transform: rotate(90deg);"},{"line_number":43,"context_line":"}"},{"line_number":44,"context_line":"\u003c/style\u003e"},{"line_number":45,"context_line":""}],"source_content_type":"text/html","patch_set":11,"id":"1315fede_e049ea13","line":43,"in_reply_to":"9cf9a894_d4bd10a0","updated":"2025-11-12 01:15:17.000000000","message":"done","commit_id":"4eef0d84c78eb15304924d5defc65d8c4bca31ab"},{"author":{"_account_id":8648,"name":"Radomir Dopieralski","email":"openstack@dopieralski.pl","username":"thesheep"},"change_message_id":"ad0e7267c1c89cf735d5e7fedb5af4cd8d835832","unresolved":true,"context_lines":[{"line_number":52,"context_line":"tr.keypair-detail-row td div.keypair-details {"},{"line_number":53,"context_line":"  margin: 8px;"},{"line_number":54,"context_line":"}"},{"line_number":55,"context_line":"\u003c/style\u003e"},{"line_number":56,"context_line":""}],"source_content_type":"text/html","patch_set":15,"id":"73e07e22_8d966788","line":55,"updated":"2025-11-12 08:28:36.000000000","message":"One last thing, I\u0027m sorry I didn\u0027t notice this earlier. This `\u003cstyle\u003e` tag is repeated for every single row. We want it to only appear once on the web page. I can think of two ways of doing that: either put it in the template of the view, or override the template for the entire table and put it there (the same way we do here, by including the original template, and then adding the style part). I\u0027m not a fan of either way.","commit_id":"7958b5dbbb07c492d4b4f3a4bb85c2f279ff3829"},{"author":{"_account_id":32432,"name":"Owen McGonagle","email":"omcgonag@redhat.com","username":"omcgonag"},"change_message_id":"2ec07a6face1985265c635fbac2855c3dd6c2778","unresolved":false,"context_lines":[{"line_number":52,"context_line":"tr.keypair-detail-row td div.keypair-details {"},{"line_number":53,"context_line":"  margin: 8px;"},{"line_number":54,"context_line":"}"},{"line_number":55,"context_line":"\u003c/style\u003e"},{"line_number":56,"context_line":""}],"source_content_type":"text/html","patch_set":15,"id":"0aa5e050_8085c0f9","line":55,"in_reply_to":"73e07e22_8d966788","updated":"2025-11-12 22:41:56.000000000","message":"Implemented your second suggestion. Created key_pairs/_keypairs_table.html that\nincludes the base table template plus a single `\u003cstyle\u003e` block.\nThe style now appears once after the table instead of being repeated per row.","commit_id":"7958b5dbbb07c492d4b4f3a4bb85c2f279ff3829"},{"author":{"_account_id":32432,"name":"Owen McGonagle","email":"omcgonag@redhat.com","username":"omcgonag"},"change_message_id":"c7b5c6e5d344cf1e46756e8ee13aafde7b22912d","unresolved":true,"context_lines":[{"line_number":1,"context_line":"{% load i18n %}"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"{% include \"horizon/common/_data_table_row.html\" %}"},{"line_number":4,"context_line":""},{"line_number":5,"context_line":"{# Detail row - shows key pair information #}"},{"line_number":6,"context_line":"\u003ctr class\u003d\"keypair-detail-row\"\u003e"},{"line_number":7,"context_line":"  \u003ctd colspan\u003d\"{{ row.cells|length }}\"\u003e"}],"source_content_type":"text/html","patch_set":17,"id":"a9367f15_c1a82014","line":4,"updated":"2025-11-13 01:46:41.000000000","message":"I am seeing white space between rows.\nDjango templates preserve literal whitespace/newlines in the output HTML.\nremove this blank line.","commit_id":"a54acd61aedc8e68d1b4bda64e84f6a3bc0911b0"},{"author":{"_account_id":32432,"name":"Owen McGonagle","email":"omcgonag@redhat.com","username":"omcgonag"},"change_message_id":"7e5f5693aa61afbf3b2487f82b29481456adc302","unresolved":true,"context_lines":[{"line_number":1,"context_line":"{% load i18n %}"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"{% include \"horizon/common/_data_table_row.html\" %}"},{"line_number":4,"context_line":""},{"line_number":5,"context_line":"{# Detail row - shows key pair information #}"},{"line_number":6,"context_line":"\u003ctr class\u003d\"keypair-detail-row\"\u003e"},{"line_number":7,"context_line":"  \u003ctd colspan\u003d\"{{ row.cells|length }}\"\u003e"}],"source_content_type":"text/html","patch_set":17,"id":"e1c74761_9b87b4c0","line":4,"in_reply_to":"a9367f15_c1a82014","updated":"2025-11-13 02:15:52.000000000","message":"blank line removed, but we still see a blank line between rows","commit_id":"a54acd61aedc8e68d1b4bda64e84f6a3bc0911b0"},{"author":{"_account_id":32432,"name":"Owen McGonagle","email":"omcgonag@redhat.com","username":"omcgonag"},"change_message_id":"24edd5818060e7401855a36e17d2f974eacb853b","unresolved":false,"context_lines":[{"line_number":1,"context_line":"{% load i18n %}"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"{% include \"horizon/common/_data_table_row.html\" %}"},{"line_number":4,"context_line":""},{"line_number":5,"context_line":"{# Detail row - shows key pair information #}"},{"line_number":6,"context_line":"\u003ctr class\u003d\"keypair-detail-row\"\u003e"},{"line_number":7,"context_line":"  \u003ctd colspan\u003d\"{{ row.cells|length }}\"\u003e"}],"source_content_type":"text/html","patch_set":17,"id":"2b55c5aa_9f86f5f2","line":4,"in_reply_to":"e1c74761_9b87b4c0","updated":"2025-11-13 23:17:09.000000000","message":"Done","commit_id":"a54acd61aedc8e68d1b4bda64e84f6a3bc0911b0"}]}
