diff --git a/web/styles/portico/portico.css b/web/styles/portico/portico.css
index e563b75521..aedbdefb7b 100644
--- a/web/styles/portico/portico.css
+++ b/web/styles/portico/portico.css
@@ -1439,3 +1439,41 @@ label.label-title {
text-decoration: underline;
}
}
+
+.events-table-link {
+ line-height: 100%;
+ font-size: 0.7rem;
+ font-weight: 600;
+}
+
+.events-table {
+ column-count: 4;
+ column-gap: 10px;
+ margin: 15px 0 0 10px !important;
+
+ & div {
+ margin-bottom: 7px !important;
+ }
+}
+
+@media (width <= 1100px) {
+ .events-table {
+ column-count: 3;
+ }
+}
+
+@media (width <= 600px) {
+ .events-table {
+ column-count: 2;
+ }
+}
+
+@media (width <= 420px) {
+ .events-table {
+ column-count: 1;
+ }
+}
+
+.events-table-ops {
+ margin-left: 12px !important;
+}
diff --git a/zerver/lib/markdown/api_return_values_table_generator.py b/zerver/lib/markdown/api_return_values_table_generator.py
index 91b982603b..020bfe33b3 100644
--- a/zerver/lib/markdown/api_return_values_table_generator.py
+++ b/zerver/lib/markdown/api_return_values_table_generator.py
@@ -1,6 +1,7 @@
import copy
import json
import re
+from collections import OrderedDict
from typing import Any, Dict, List, Mapping, Optional
import markdown
@@ -198,18 +199,30 @@ class APIReturnValuesTablePreprocessor(Preprocessor):
'
\n{description}\n\n\n"
)
+ table_link_template = (
+ ''
+ )
+ events_table: OrderedDict[str, List[str]] = OrderedDict()
for events in events_dict["oneOf"]:
event_type: Dict[str, Any] = events["properties"]["type"]
event_type_str: str = event_type["enum"][0]
# Internal hyperlink name
h3_id: str = event_type_str
+ event_name: str = event_type_str
event_type_str = f' {event_type_str}'
op: Optional[Dict[str, Any]] = events["properties"].pop("op", None)
op_str: str = ""
if op is not None:
op_str = op["enum"][0]
h3_id += "-" + op_str
+ op_type: str = op_str
op_str = f'op: {op_str}'
+ if event_name in events_table:
+ events_table[event_name] += [op_type]
+ else:
+ events_table[event_name] = [op_type]
+ else:
+ events_table[event_name] = []
description = events["description"]
text.append(
argument_template.format(
@@ -223,6 +236,27 @@ class APIReturnValuesTablePreprocessor(Preprocessor):
example = json.dumps(events["example"], indent=4, sort_keys=True)
text.append(example)
text.append("```\n\n")
+
+ # Creates table of links for events
+ events_table_str: List[str] = ['']
+ sorted_events_table: OrderedDict[str, List[str]] = OrderedDict(sorted(events_table.items()))
+ for event_name, ops in sorted_events_table.items():
+ if not ops:
+ events_table_str.append(
+ table_link_template.format(link_name=event_name, url=event_name)
+ )
+ else:
+ events_table_str.append(f'
{event_name}:
')
+ events_table_str.append("
")
+ ops.sort()
+ op_list = [
+ table_link_template.format(link_name=op, url=f"{event_name}-{op}") for op in ops
+ ]
+ events_table_str.extend(op_list)
+ events_table_str.append("
")
+ events_table_str.append("
")
+
+ text = events_table_str + text
return text