datalog-theme 0.10.0 → 0.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +133 -0
- data/CITATION.cff +2 -2
- data/README.md +4 -2
- data/_data/i18n/en.yml +55 -3
- data/_data/i18n/es.yml +55 -3
- data/_data/i18n/pt.yml +55 -3
- data/_includes/analytics/dashboard.html +24 -9
- data/_includes/components/academic-dashboard.html +168 -133
- data/_includes/components/author-bio.html +7 -5
- data/_includes/components/author-list.html +6 -5
- data/_includes/components/citation-tools.html +2 -1
- data/_includes/components/content-provenance.html +19 -1
- data/_includes/components/correction-report.html +15 -8
- data/_includes/components/hero.html +22 -15
- data/_includes/components/package-index.html +121 -0
- data/_includes/components/package-install.html +27 -50
- data/_includes/components/post-list.html +14 -0
- data/_includes/components/responsive-image.html +15 -21
- data/_includes/footer.html +1 -1
- data/_includes/head.html +70 -11
- data/_includes/layouts/default/article.html +76 -46
- data/_includes/meta/dataset-json.html +171 -0
- data/_includes/meta/math-config.html +15 -1
- data/_includes/meta/package-json.html +69 -0
- data/_includes/meta/person-json.html +36 -13
- data/_includes/meta/publisher.html +15 -0
- data/_includes/meta/schema.html +108 -23
- data/_includes/meta/scholarly.html +10 -5
- data/_includes/post/related-posts.html +17 -43
- data/_includes/scripts.html +2 -2
- data/_includes/search/index-data.json +10 -1
- data/_includes/search/page.html +11 -6
- data/_layouts/archive.html +67 -0
- data/_layouts/dataset.html +2 -1
- data/_layouts/default.html +13 -11
- data/_layouts/docs.html +53 -0
- data/_layouts/home.html +30 -1
- data/_layouts/notebook.html +5 -1
- data/_layouts/package.html +38 -21
- data/_layouts/portfolio.html +1 -0
- data/_layouts/post.html +21 -62
- data/_layouts/project.html +2 -1
- data/_layouts/research.html +14 -2
- data/_plugins/analytics_dashboard.rb +4 -1
- data/_plugins/archive.rb +114 -0
- data/_plugins/authors.rb +50 -1
- data/_plugins/citation_exports.rb +12 -1
- data/_plugins/config_validator.rb +77 -2
- data/_plugins/correction_fallback.rb +110 -0
- data/_plugins/image_optimizer.rb +129 -22
- data/_plugins/math_preprocessor.rb +7 -48
- data/_plugins/notebook_converter.rb +44 -5
- data/_plugins/packages.rb +84 -0
- data/_plugins/page_dates.rb +37 -0
- data/_plugins/references.rb +16 -2
- data/_plugins/related_posts.rb +149 -0
- data/_plugins/search_sections.rb +110 -0
- data/_plugins/site_identity.rb +42 -0
- data/_plugins/social_cards.rb +17 -0
- data/_sass/_academic-dashboard.scss +18 -30
- data/_sass/_base.scss +2 -0
- data/_sass/_components.scss +21 -23
- data/_sass/_docs.scss +143 -0
- data/_sass/_features.scss +6 -0
- data/_sass/_layout.scss +65 -6
- data/_sass/_mathematical.scss +61 -19
- data/_sass/_notebooks.scss +1 -32
- data/_sass/_package-docs.scss +6 -9
- data/_sass/_post-components.scss +23 -23
- data/_sass/_print.scss +1 -1
- data/_sass/_search-page.scss +75 -0
- data/_sass/_search.scss +17 -26
- data/_sass/_syntax-highlighting.scss +23 -1
- data/_sass/_theme.scss +1 -0
- data/_sass/_utilities.scss +87 -40
- data/_sass/_variables.scss +31 -29
- data/assets/css/main.scss +2 -1
- data/assets/js/dist/academic.js +1 -1
- data/assets/js/dist/analytics-dashboard.js +1 -1
- data/assets/js/dist/chunks/chunk-TNVD6UAM.js +1 -0
- data/assets/js/dist/comments.js +1 -1
- data/assets/js/dist/contact.js +1 -1
- data/assets/js/dist/core.js +1 -1
- data/assets/js/dist/corrections.js +5 -1
- data/assets/js/dist/loader.js +1 -1
- data/assets/js/dist/math.js +2 -1
- data/assets/js/dist/moderation.js +1 -1
- data/assets/js/dist/reactions.js +1 -1
- data/assets/js/dist/search.js +1 -1
- data/assets/js/dist/sources.json +20 -16
- data/assets/js/dist/subscriptions.js +1 -1
- data/assets/js/loader.js +6 -2
- data/datalog-theme.gemspec +1 -1
- data/lib/datalog/audit/checks.rb +269 -0
- data/lib/datalog/audit/known_keys.rb +61 -0
- data/lib/datalog/audit/site_reader.rb +118 -0
- data/lib/datalog/audit/source_file.rb +85 -0
- data/lib/datalog/audit.rb +145 -0
- data/lib/datalog/citations/bibtex.rb +200 -0
- data/lib/datalog/citations/entry.rb +333 -0
- data/lib/datalog/citations/markup.rb +79 -0
- data/lib/datalog/cli.rb +164 -89
- data/lib/datalog/critical_css.rb +126 -21
- data/lib/datalog/latex_speech/words.json +88 -0
- data/lib/datalog/latex_speech.rb +355 -0
- data/lib/datalog/packages/command.rb +51 -0
- data/lib/datalog/packages/refresh.rb +187 -0
- data/lib/datalog/packages.rb +177 -0
- data/lib/datalog/plugin_system.rb +5 -0
- data/lib/datalog/plugins/citations.rb +325 -109
- data/lib/datalog/site_config.rb +26 -0
- data/lib/datalog/social_cards/font.rb +286 -0
- data/lib/datalog/social_cards/fonts/IBMPlexSans-Regular.ttf +0 -0
- data/lib/datalog/social_cards/fonts/IBMPlexSerif-SemiBold.ttf +0 -0
- data/lib/datalog/social_cards/fonts/OFL.txt +92 -0
- data/lib/datalog/social_cards/geometry.rb +51 -0
- data/lib/datalog/social_cards/outline.rb +54 -0
- data/lib/datalog/social_cards/plain_text.rb +258 -0
- data/lib/datalog/social_cards/template.rb +322 -0
- data/lib/datalog/social_cards/template.svg +17 -0
- data/lib/datalog/social_cards/typesetter.rb +178 -0
- data/lib/datalog/social_cards.rb +369 -0
- data/lib/datalog/theme/updater.rb +307 -0
- data/lib/datalog/theme/version.rb +1 -1
- metadata +46 -9
- data/_includes/components/enhanced-code-block.html +0 -212
- data/_includes/components/performance-monitor.html +0 -170
- data/_includes/components/viz-table-fallback.html +0 -19
- data/_plugins/datalog_bibliography.rb +0 -21
- data/assets/js/dist/chunks/chunk-WIRUK3OZ.js +0 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{% assign analytics = site.data.analytics_dashboard | default: {} %}
|
|
2
|
-
<div class="analytics-dashboard" data-status="{{ analytics.status | default: 'unavailable' }}">
|
|
2
|
+
<div class="analytics-dashboard" data-status="{{ analytics.status | default: 'unavailable' }}" data-stale="{{ analytics.stale | default: false }}" data-chart-unavailable="{% t 'analytics.dashboard.chart_unavailable' fallback: 'Chart unavailable; use the data table below.' %}" data-no-chart-data="{% t 'analytics.dashboard.no_chart_data' fallback: 'No chart data available.' %}">
|
|
3
3
|
<div class="analytics-header">
|
|
4
4
|
<div>
|
|
5
5
|
<h2 class="analytics-title">{% t 'analytics.dashboard.title' fallback: 'Analytics Overview' %}</h2>
|
|
@@ -12,9 +12,15 @@
|
|
|
12
12
|
</p>
|
|
13
13
|
</div>
|
|
14
14
|
<div class="analytics-meta">
|
|
15
|
+
<span class="analytics-state" role="status" data-empty-label="{% t 'analytics.dashboard.empty' fallback: 'No results yet' %}">
|
|
16
|
+
{% if analytics.stale %}{% t 'analytics.dashboard.stale' fallback: 'Cached results' %}
|
|
17
|
+
{% elsif analytics.status == 'ok' %}{% t 'analytics.dashboard.current' fallback: 'Current results' %}
|
|
18
|
+
{% elsif analytics.status == 'missing_configuration' or analytics.status == 'missing_credentials' or analytics.status == 'missing_dependency' %}{% t 'analytics.dashboard.setup_needed' fallback: 'Setup needed' %}
|
|
19
|
+
{% else %}{% t 'analytics.dashboard.unavailable' fallback: 'Unavailable' %}{% endif %}
|
|
20
|
+
</span>
|
|
15
21
|
<span class="analytics-refresh">
|
|
16
22
|
{% assign fetched = analytics.fetched_at %}
|
|
17
|
-
{% if fetched %}
|
|
23
|
+
{% if fetched and analytics.status == 'ok' %}
|
|
18
24
|
{% t 'analytics.dashboard.last_updated' fallback: 'Last updated' %}: <time datetime="{{ fetched }}">{{ fetched | date: '%Y-%m-%d %H:%M' }}</time>
|
|
19
25
|
{% else %}
|
|
20
26
|
{% t 'analytics.dashboard.last_updated_unknown' fallback: 'Last updated: pending' %}
|
|
@@ -24,17 +30,18 @@
|
|
|
24
30
|
</div>
|
|
25
31
|
</div>
|
|
26
32
|
|
|
27
|
-
{%
|
|
28
|
-
<div class="analytics-alert">
|
|
29
|
-
<p>{{ analytics.message | default: "Configure GA4 credentials via GA4_PROPERTY_ID and GA4_CREDENTIALS_JSON." }}</p>
|
|
33
|
+
{% if analytics.stale or analytics.status != 'ok' %}
|
|
34
|
+
<div class="analytics-alert" role="status">
|
|
35
|
+
<p>{% if analytics.stale %}{% t 'analytics.dashboard.stale_note' fallback: 'GA4 is unavailable. Showing the last successful cached results.' %}{% else %}{{ analytics.message | default: "Configure GA4 credentials via GA4_PROPERTY_ID and GA4_CREDENTIALS_JSON." }}{% endif %}</p>
|
|
30
36
|
</div>
|
|
31
|
-
{%
|
|
37
|
+
{% endif %}
|
|
32
38
|
|
|
33
39
|
<div class="analytics-grid">
|
|
34
40
|
<section class="analytics-card">
|
|
35
41
|
<header>
|
|
36
42
|
<h3>{% t 'analytics.dashboard.top_posts' fallback: 'Top posts' %}</h3>
|
|
37
43
|
</header>
|
|
44
|
+
<div class="analytics-table-scroll" role="region" tabindex="0" aria-label="{% t 'analytics.dashboard.top_posts' fallback: 'Top posts' %}">
|
|
38
45
|
<table class="analytics-table" aria-live="polite">
|
|
39
46
|
<thead>
|
|
40
47
|
<tr>
|
|
@@ -49,12 +56,14 @@
|
|
|
49
56
|
</tr>
|
|
50
57
|
</tbody>
|
|
51
58
|
</table>
|
|
59
|
+
</div>
|
|
52
60
|
</section>
|
|
53
61
|
|
|
54
62
|
<section class="analytics-card">
|
|
55
63
|
<header>
|
|
56
64
|
<h3>{% t 'analytics.dashboard.search_terms' fallback: 'Search queries' %}</h3>
|
|
57
65
|
</header>
|
|
66
|
+
<div class="analytics-table-scroll" role="region" tabindex="0" aria-label="{% t 'analytics.dashboard.search_terms' fallback: 'Search queries' %}">
|
|
58
67
|
<table class="analytics-table" aria-live="polite">
|
|
59
68
|
<thead>
|
|
60
69
|
<tr>
|
|
@@ -68,20 +77,23 @@
|
|
|
68
77
|
</tr>
|
|
69
78
|
</tbody>
|
|
70
79
|
</table>
|
|
80
|
+
</div>
|
|
71
81
|
</section>
|
|
72
82
|
|
|
73
83
|
<section class="analytics-card analytics-card--wide">
|
|
74
84
|
<header>
|
|
75
85
|
<h3>{% t 'analytics.dashboard.visitor_trends' fallback: 'Visitor trends' %}</h3>
|
|
76
86
|
</header>
|
|
77
|
-
<canvas id="analytics-visitors-chart" height="240" role="img" aria-label="{% t 'analytics.dashboard.visitor_trends' fallback: 'Visitor trends' %}"></canvas>
|
|
87
|
+
<div class="analytics-chart"><canvas id="analytics-visitors-chart" height="240" role="img" aria-label="{% t 'analytics.dashboard.visitor_trends' fallback: 'Visitor trends' %}"></canvas><p class="analytics-chart-status" role="status">{% t 'analytics.dashboard.loading' fallback: 'Loading analytics…' %}</p></div>
|
|
88
|
+
<details class="analytics-chart-data" hidden><summary>{% t 'analytics.dashboard.view_data' fallback: 'View data table' %}</summary><div class="analytics-table-scroll" role="region" tabindex="0" aria-label="{% t 'analytics.dashboard.visitor_trends' fallback: 'Visitor trends' %}"><table class="analytics-table"><thead></thead><tbody></tbody></table></div></details>
|
|
78
89
|
</section>
|
|
79
90
|
|
|
80
91
|
<section class="analytics-card analytics-card--wide">
|
|
81
92
|
<header>
|
|
82
93
|
<h3>{% t 'analytics.dashboard.engagement' fallback: 'Engagement by post' %}</h3>
|
|
83
94
|
</header>
|
|
84
|
-
<canvas id="analytics-engagement-chart" height="240" role="img" aria-label="{% t 'analytics.dashboard.engagement' fallback: 'Engagement by post' %}"></canvas>
|
|
95
|
+
<div class="analytics-chart"><canvas id="analytics-engagement-chart" height="240" role="img" aria-label="{% t 'analytics.dashboard.engagement' fallback: 'Engagement by post' %}"></canvas><p class="analytics-chart-status" role="status">{% t 'analytics.dashboard.loading' fallback: 'Loading analytics…' %}</p></div>
|
|
96
|
+
<details class="analytics-chart-data" hidden><summary>{% t 'analytics.dashboard.view_data' fallback: 'View data table' %}</summary><div class="analytics-table-scroll" role="region" tabindex="0" aria-label="{% t 'analytics.dashboard.engagement' fallback: 'Engagement by post' %}"><table class="analytics-table"><thead></thead><tbody></tbody></table></div></details>
|
|
85
97
|
</section>
|
|
86
98
|
|
|
87
99
|
<section class="analytics-card">
|
|
@@ -111,13 +123,15 @@
|
|
|
111
123
|
<dd data-field="scholar-i10-index">—</dd>
|
|
112
124
|
</div>
|
|
113
125
|
</dl>
|
|
114
|
-
<canvas id="analytics-scholar-chart" height="200" role="img" aria-label="{% t 'analytics.dashboard.scholar_trend' fallback: 'Citations by year' %}"></canvas>
|
|
126
|
+
<div class="analytics-chart"><canvas id="analytics-scholar-chart" height="200" role="img" aria-label="{% t 'analytics.dashboard.scholar_trend' fallback: 'Citations by year' %}"></canvas><p class="analytics-chart-status" role="status">{% t 'analytics.dashboard.loading' fallback: 'Loading analytics…' %}</p></div>
|
|
127
|
+
<details class="analytics-chart-data" hidden><summary>{% t 'analytics.dashboard.view_data' fallback: 'View data table' %}</summary><div class="analytics-table-scroll" role="region" tabindex="0" aria-label="{% t 'analytics.dashboard.scholar_trend' fallback: 'Citations by year' %}"><table class="analytics-table"><thead></thead><tbody></tbody></table></div></details>
|
|
115
128
|
</section>
|
|
116
129
|
|
|
117
130
|
<section class="analytics-card analytics-card--wide">
|
|
118
131
|
<header>
|
|
119
132
|
<h3>{% t 'analytics.dashboard.monthly_reports' fallback: 'Monthly reports' %}</h3>
|
|
120
133
|
</header>
|
|
134
|
+
<div class="analytics-table-scroll" role="region" tabindex="0" aria-label="{% t 'analytics.dashboard.monthly_reports' fallback: 'Monthly reports' %}">
|
|
121
135
|
<table class="analytics-table" aria-live="polite">
|
|
122
136
|
<thead>
|
|
123
137
|
<tr>
|
|
@@ -134,6 +148,7 @@
|
|
|
134
148
|
</tr>
|
|
135
149
|
</tbody>
|
|
136
150
|
</table>
|
|
151
|
+
</div>
|
|
137
152
|
</section>
|
|
138
153
|
</div>
|
|
139
154
|
|
|
@@ -1,70 +1,98 @@
|
|
|
1
|
-
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
{% for metric_pair in citation_metrics %}
|
|
11
|
-
{% assign metric_key = metric_pair[0] %}
|
|
12
|
-
{% if metric_key contains 'since_' %}
|
|
13
|
-
{% assign since_stats = metric_pair[1] %}
|
|
14
|
-
{% assign since_period = metric_key | remove: 'since_' %}
|
|
15
|
-
{% break %}
|
|
16
|
-
{% endif %}
|
|
17
|
-
{% endfor %}
|
|
18
|
-
{% endif %}
|
|
19
|
-
{% if since_period == nil or since_period == '' %}
|
|
20
|
-
{% assign since_period = academic.citations.reporting_period %}
|
|
21
|
-
{% endif %}
|
|
22
|
-
<section class="academic-dashboard">
|
|
23
|
-
<header class="academic-dashboard__header">
|
|
24
|
-
<h1>{% t 'academic_dashboard.header.title' %}</h1>
|
|
25
|
-
<p>{% t 'academic_dashboard.header.description' %}</p>
|
|
26
|
-
</header>
|
|
1
|
+
{%- comment -%}
|
|
2
|
+
---
|
|
3
|
+
optional:
|
|
4
|
+
- academic
|
|
5
|
+
---
|
|
6
|
+
The academic operations dashboard: profiles, citation metrics, the
|
|
7
|
+
bibliography export, submissions, peer review and collaborations, the academic
|
|
8
|
+
calendar, funding, collaboration opportunities, mentorship, open-science
|
|
9
|
+
badges and networking, each section shown only when the data has it.
|
|
27
10
|
|
|
11
|
+
It reads `_data/academic.yml`, or the map passed as `academic`, in the same
|
|
12
|
+
shape; citation metrics come from `_data/publications.yml` when the site
|
|
13
|
+
generates them there and no map is passed. The page supplies the heading: the
|
|
14
|
+
sections start at h2. assets/js/academic.js fills in the metrics and runs the
|
|
15
|
+
submission and calendar filters. The demo renders it at /academic/.
|
|
16
|
+
{%- endcomment -%}
|
|
17
|
+
{%- assign academic = include.academic | default: site.data.academic -%}
|
|
18
|
+
{%- assign publication_data = site.data.publications -%}
|
|
19
|
+
{%- if include.academic -%}
|
|
20
|
+
{%- assign citation_metrics = academic.citations.metrics -%}
|
|
21
|
+
{%- else -%}
|
|
22
|
+
{%- assign citation_metrics = publication_data.metrics | default: academic.citations.metrics -%}
|
|
23
|
+
{%- endif -%}
|
|
24
|
+
{%- assign localization_config = site.theme_options.localization -%}
|
|
25
|
+
{%- assign date_format = localization_config.date_format | default: 'long' -%}
|
|
26
|
+
{%- assign datetime_format = localization_config.datetime_format | default: 'datetime' -%}
|
|
27
|
+
{%- assign since_stats = nil -%}
|
|
28
|
+
{%- assign since_period = nil -%}
|
|
29
|
+
{%- if citation_metrics -%}
|
|
30
|
+
{%- for metric_pair in citation_metrics -%}
|
|
31
|
+
{%- assign metric_key = metric_pair[0] -%}
|
|
32
|
+
{%- if metric_key contains 'since_' -%}
|
|
33
|
+
{%- assign since_stats = metric_pair[1] -%}
|
|
34
|
+
{%- assign since_period = metric_key | remove: 'since_' -%}
|
|
35
|
+
{%- break -%}
|
|
36
|
+
{%- endif -%}
|
|
37
|
+
{%- endfor -%}
|
|
38
|
+
{%- endif -%}
|
|
39
|
+
{%- if since_period == nil or since_period == '' -%}
|
|
40
|
+
{%- assign since_period = academic.citations.reporting_period -%}
|
|
41
|
+
{%- endif -%}
|
|
42
|
+
{%- comment -%} The profiles are the site owner's, so they say rel="me", as the author card's do {%- endcomment -%}
|
|
43
|
+
{%- assign profile_rel = site.author | author_profile_rel | escape -%}
|
|
44
|
+
<div class="academic-dashboard">
|
|
45
|
+
{%- if academic.profiles %}
|
|
28
46
|
<section class="academic-dashboard__profiles" aria-labelledby="academic-profiles-heading">
|
|
29
47
|
<h2 id="academic-profiles-heading">{% t 'academic_dashboard.profiles.title' %}</h2>
|
|
30
48
|
<div class="academic-profiles__grid">
|
|
31
|
-
{
|
|
32
|
-
|
|
33
|
-
|
|
49
|
+
{%- comment -%} A for loop takes no filter on its collection: this list never rendered while it had one {%- endcomment -%}
|
|
50
|
+
{%- assign profile_keys = 'google_scholar|orcid|researchgate|academia' | split: '|' -%}
|
|
51
|
+
{%- for key in profile_keys %}
|
|
52
|
+
{%- assign profile = academic.profiles[key] -%}
|
|
53
|
+
{%- if profile %}
|
|
54
|
+
{%- case key -%}
|
|
55
|
+
{%- when 'google_scholar' -%}{%- assign profile_name = 'Google Scholar' -%}
|
|
56
|
+
{%- when 'orcid' -%}{%- assign profile_name = 'ORCID' -%}
|
|
57
|
+
{%- when 'researchgate' -%}{%- assign profile_name = 'ResearchGate' -%}
|
|
58
|
+
{%- else -%}{%- assign profile_name = 'Academia.edu' -%}
|
|
59
|
+
{%- endcase %}
|
|
34
60
|
<article class="academic-profile" data-profile="{{ key }}">
|
|
35
61
|
<header>
|
|
36
|
-
<h3>{{ profile.label | default:
|
|
37
|
-
{% if profile.url %}<a class="academic-profile__link" href="{{ profile.url }}" target="_blank" rel="
|
|
62
|
+
<h3>{{ profile.label | default: profile_name }}</h3>
|
|
63
|
+
{% if profile.url %}<a class="academic-profile__link" href="{{ profile.url }}" target="_blank" rel="{{ profile_rel }}">{% t 'academic_dashboard.profiles.view_profile' %}</a>{% endif %}
|
|
38
64
|
</header>
|
|
39
65
|
<dl class="academic-profile__meta">
|
|
40
|
-
{
|
|
66
|
+
{%- if key == 'google_scholar' %}
|
|
41
67
|
{% if profile.user_id %}<div><dt>{% t 'academic_dashboard.profiles.user_id' %}</dt><dd>{{ profile.user_id }}</dd></div>{% endif %}
|
|
42
|
-
{% if
|
|
43
|
-
{% if
|
|
44
|
-
{% if
|
|
45
|
-
{
|
|
46
|
-
{
|
|
47
|
-
<div><dt>{% t 'academic_dashboard.profiles.sync_scope' %}</dt><dd>{{ profile.sync.scope | join: ', ' }}</dd></div>
|
|
48
|
-
<div><dt>{% t 'academic_dashboard.profiles.last_synced' %}</dt><dd data-profile-last-synced>{{ profile.sync.last_synced | localize_date: date_format }}</dd></div>
|
|
49
|
-
{
|
|
50
|
-
{
|
|
51
|
-
{% if profile.projects %}<div><dt>{% t 'academic_dashboard.profiles.featured_projects' %}</dt><dd>{{ profile.projects |
|
|
52
|
-
{% if profile.collections %}<div><dt>{% t 'academic_dashboard.profiles.collections' %}</dt><dd>{{ profile.collections |
|
|
53
|
-
{
|
|
54
|
-
{% if profile.auto_update %}<div><dt>{% t 'academic_dashboard.profiles.auto_update' %}</dt><dd>{
|
|
68
|
+
{% if citation_metrics.total %}<div><dt>{% t 'academic_dashboard.profiles.total_citations' %}</dt><dd data-citation-metric="total">{{ citation_metrics.total }}</dd></div>{% endif %}
|
|
69
|
+
{% if citation_metrics.h_index %}<div><dt>{% t 'academic_dashboard.profiles.h_index' %}</dt><dd data-citation-metric="h_index">{{ citation_metrics.h_index }}</dd></div>{% endif %}
|
|
70
|
+
{% if citation_metrics.i10_index %}<div><dt>{% t 'academic_dashboard.profiles.i10_index' %}</dt><dd data-citation-metric="i10_index">{{ citation_metrics.i10_index }}</dd></div>{% endif %}
|
|
71
|
+
{%- endif %}
|
|
72
|
+
{%- if key == 'orcid' and profile.sync %}
|
|
73
|
+
{% if profile.sync.scope %}<div><dt>{% t 'academic_dashboard.profiles.sync_scope' %}</dt><dd>{{ profile.sync.scope | join: ', ' }}</dd></div>{% endif %}
|
|
74
|
+
{% if profile.sync.last_synced %}<div><dt>{% t 'academic_dashboard.profiles.last_synced' %}</dt><dd data-profile-last-synced>{{ profile.sync.last_synced | localize_date: date_format }}</dd></div>{% endif %}
|
|
75
|
+
{%- endif %}
|
|
76
|
+
{%- if key != 'google_scholar' and key != 'orcid' %}
|
|
77
|
+
{% if profile.projects %}<div><dt>{% t 'academic_dashboard.profiles.featured_projects' %}</dt><dd>{{ profile.projects | join: ', ' }}</dd></div>{% endif %}
|
|
78
|
+
{% if profile.collections %}<div><dt>{% t 'academic_dashboard.profiles.collections' %}</dt><dd>{{ profile.collections | join: ', ' }}</dd></div>{% endif %}
|
|
79
|
+
{%- endif %}
|
|
80
|
+
{% if profile.auto_update %}<div><dt>{% t 'academic_dashboard.profiles.auto_update' %}</dt><dd>{% t 'academic_dashboard.profiles.auto_update_on' %}</dd></div>{% endif %}
|
|
55
81
|
</dl>
|
|
56
82
|
</article>
|
|
57
|
-
{
|
|
58
|
-
{
|
|
83
|
+
{%- endif %}
|
|
84
|
+
{%- endfor %}
|
|
59
85
|
</div>
|
|
60
86
|
</section>
|
|
87
|
+
{%- endif %}
|
|
61
88
|
|
|
62
|
-
{
|
|
89
|
+
{%- comment -%} The publications generator counts zeros for a site with no publications {%- endcomment -%}
|
|
90
|
+
{%- if academic.citations.metrics or citation_metrics.total > 0 %}
|
|
63
91
|
<section class="academic-dashboard__citations" aria-labelledby="citation-metrics-heading">
|
|
64
92
|
<h2 id="citation-metrics-heading">{% t 'academic_dashboard.citations.title' %}</h2>
|
|
65
93
|
<div class="citation-metrics">
|
|
66
|
-
<
|
|
67
|
-
<div class="metric"
|
|
94
|
+
<dl class="citation-metrics__totals">
|
|
95
|
+
<div class="metric">
|
|
68
96
|
<dt>{% t 'academic_dashboard.citations.total' %}</dt>
|
|
69
97
|
<dd data-citation-metric="total">{{ citation_metrics.total | default: 0 }}</dd>
|
|
70
98
|
</div>
|
|
@@ -76,67 +104,70 @@
|
|
|
76
104
|
<dt>{% t 'academic_dashboard.citations.i10_index' %}</dt>
|
|
77
105
|
<dd data-citation-metric="i10_index">{{ citation_metrics.i10_index | default: 0 }}</dd>
|
|
78
106
|
</div>
|
|
79
|
-
</
|
|
80
|
-
|
|
81
|
-
|
|
107
|
+
</dl>
|
|
108
|
+
{%- if since_stats or academic.citations.per_publication %}
|
|
109
|
+
<div class="citation-metrics__details">
|
|
110
|
+
{%- if since_stats %}
|
|
82
111
|
<h3>{% t 'academic_dashboard.citations.since_title' period: since_period %}</h3>
|
|
83
112
|
<ul>
|
|
84
113
|
<li><strong>{% t 'academic_dashboard.citations.total_label' %}</strong> <span data-citation-metric="since_total">{{ since_stats.total }}</span></li>
|
|
85
114
|
<li><strong>{% t 'academic_dashboard.citations.h_index_label' %}</strong> <span data-citation-metric="since_h_index">{{ since_stats.h_index }}</span></li>
|
|
86
115
|
<li><strong>{% t 'academic_dashboard.citations.i10_index_label' %}</strong> <span data-citation-metric="since_i10">{{ since_stats.i10_index }}</span></li>
|
|
87
116
|
</ul>
|
|
88
|
-
{
|
|
89
|
-
{
|
|
117
|
+
{%- endif %}
|
|
118
|
+
{%- if academic.citations.per_publication %}
|
|
90
119
|
<details>
|
|
91
120
|
<summary>{% t 'academic_dashboard.citations.per_publication' %}</summary>
|
|
92
121
|
<ul class="citation-metrics__per-publication">
|
|
93
|
-
{
|
|
122
|
+
{%- for keyval in academic.citations.per_publication %}
|
|
94
123
|
<li>
|
|
95
124
|
<span class="citation-metrics__pub-id">{{ keyval[0] }}</span>
|
|
96
125
|
<span class="citation-metrics__pub-value" data-publication-citations="{{ keyval[0] }}">{{ keyval[1].total }}</span>
|
|
97
|
-
{
|
|
98
|
-
{
|
|
126
|
+
{%- if keyval[1].last_updated %}
|
|
127
|
+
{%- assign publication_updated = keyval[1].last_updated | localize_date: date_format %}
|
|
99
128
|
<span class="citation-metrics__pub-updated">{% t 'academic_dashboard.citations.updated' date: publication_updated %}</span>
|
|
100
|
-
{
|
|
129
|
+
{%- endif %}
|
|
101
130
|
</li>
|
|
102
|
-
{
|
|
131
|
+
{%- endfor %}
|
|
103
132
|
</ul>
|
|
104
133
|
</details>
|
|
105
|
-
{
|
|
106
|
-
</
|
|
107
|
-
{
|
|
134
|
+
{%- endif %}
|
|
135
|
+
</div>
|
|
136
|
+
{%- endif %}
|
|
137
|
+
{%- if academic.citations.yearly_totals %}
|
|
108
138
|
<div class="citation-metrics__timeline" data-citation-timeline>
|
|
109
139
|
<h3>{% t 'academic_dashboard.citations.timeline' %}</h3>
|
|
110
140
|
<ul>
|
|
111
|
-
{
|
|
141
|
+
{%- for year in academic.citations.yearly_totals %}
|
|
112
142
|
<li data-year="{{ year[0] }}"><span>{{ year[0] }}</span><span data-year-total>{{ year[1] }}</span></li>
|
|
113
|
-
{
|
|
143
|
+
{%- endfor %}
|
|
114
144
|
</ul>
|
|
115
145
|
</div>
|
|
116
|
-
{
|
|
146
|
+
{%- endif %}
|
|
117
147
|
</div>
|
|
118
148
|
</section>
|
|
119
|
-
{
|
|
149
|
+
{%- endif %}
|
|
150
|
+
|
|
151
|
+
{%- if publication_data.bibliography and include.academic == nil %}
|
|
152
|
+
{%- capture blank_line %}
|
|
120
153
|
|
|
121
|
-
|
|
154
|
+
{% endcapture %}
|
|
122
155
|
<section class="academic-dashboard__bibliography" aria-labelledby="bibliography-heading">
|
|
123
156
|
<h2 id="bibliography-heading">{% t 'academic_dashboard.bibliography.title' %}</h2>
|
|
124
157
|
<p>{% t 'academic_dashboard.bibliography.description' %}</p>
|
|
125
158
|
<div class="bibliography-export">
|
|
126
|
-
<textarea readonly id="bibliography-export" data-bibliography>{{ publication_data.bibliography | join:
|
|
159
|
+
<textarea readonly id="bibliography-export" aria-labelledby="bibliography-heading" data-bibliography>{{ publication_data.bibliography | join: blank_line }}</textarea>
|
|
127
160
|
<div class="bibliography-export__actions">
|
|
128
161
|
<button type="button" class="btn" data-copy-bibliography data-target="bibliography-export">{% t 'academic_dashboard.bibliography.copy' %}</button>
|
|
129
|
-
{
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
{% endfor %}
|
|
133
|
-
{% endif %}
|
|
162
|
+
{%- for export in academic.bibliography.exports %}
|
|
163
|
+
<a class="btn btn--ghost" href="{{ '/assets/publications/' | append: export.filename | relative_url }}" download>{% t 'academic_dashboard.bibliography.download' format: export.format | upcase %}</a>
|
|
164
|
+
{%- endfor %}
|
|
134
165
|
</div>
|
|
135
166
|
</div>
|
|
136
167
|
</section>
|
|
137
|
-
{
|
|
168
|
+
{%- endif %}
|
|
138
169
|
|
|
139
|
-
{
|
|
170
|
+
{%- if academic.submissions and academic.submissions.size > 0 %}
|
|
140
171
|
<section class="academic-dashboard__submissions" id="submission-tracker" aria-labelledby="submission-tracker-heading">
|
|
141
172
|
<h2 id="submission-tracker-heading">{% t 'academic_dashboard.submissions.title' %}</h2>
|
|
142
173
|
<p>{% t 'academic_dashboard.submissions.description' %}</p>
|
|
@@ -144,76 +175,76 @@
|
|
|
144
175
|
<label for="submission-filter">{% t 'academic_dashboard.submissions.filter_label' %}</label>
|
|
145
176
|
<select id="submission-filter" data-submission-filter>
|
|
146
177
|
<option value="">{% t 'academic_dashboard.submissions.all_statuses' %}</option>
|
|
147
|
-
{
|
|
148
|
-
{
|
|
178
|
+
{%- assign statuses = academic.submissions | map: 'status' | uniq %}
|
|
179
|
+
{%- for status in statuses %}
|
|
149
180
|
<option value="{{ status | slugify }}">{{ status }}</option>
|
|
150
|
-
{
|
|
181
|
+
{%- endfor %}
|
|
151
182
|
</select>
|
|
152
183
|
</div>
|
|
153
184
|
<ul class="submission-list">
|
|
154
|
-
{
|
|
185
|
+
{%- for submission in academic.submissions %}
|
|
155
186
|
<li class="submission-card" data-submission-status="{{ submission.status | slugify }}">
|
|
156
187
|
<article>
|
|
157
188
|
<header>
|
|
158
189
|
<h3>{{ submission.title | escape }}</h3>
|
|
159
|
-
<p class="submission-venue">{{ submission.venue }} · <span class="submission-type">{{ submission.type | capitalize }}</span
|
|
190
|
+
<p class="submission-venue">{{ submission.venue }}{% if submission.type %} · <span class="submission-type">{{ submission.type | capitalize }}</span>{% endif %}</p>
|
|
160
191
|
</header>
|
|
161
192
|
<dl class="submission-meta">
|
|
162
193
|
{% if submission.deadline %}<div><dt>{% t 'academic_dashboard.submissions.deadline' %}</dt><dd>{{ submission.deadline | localize_date: date_format }}</dd></div>{% endif %}
|
|
163
194
|
{% if submission.status %}<div><dt>{% t 'academic_dashboard.submissions.status' %}</dt><dd><span class="status-badge">{{ submission.status }}</span></dd></div>{% endif %}
|
|
164
195
|
{% if submission.submitted %}<div><dt>{% t 'academic_dashboard.submissions.submitted' %}</dt><dd>{{ submission.submitted | localize_date: date_format }}</dd></div>{% endif %}
|
|
165
|
-
{% if submission.collaborators %}<div><dt>{% t 'academic_dashboard.submissions.collaborators' %}</dt><dd>{{ submission.collaborators |
|
|
196
|
+
{% if submission.collaborators %}<div><dt>{% t 'academic_dashboard.submissions.collaborators' %}</dt><dd>{{ submission.collaborators | join: ', ' }}</dd></div>{% endif %}
|
|
166
197
|
</dl>
|
|
167
198
|
{% if submission.notes %}<p class="submission-notes">{{ submission.notes }}</p>{% endif %}
|
|
168
199
|
</article>
|
|
169
200
|
</li>
|
|
170
|
-
{
|
|
201
|
+
{%- endfor %}
|
|
171
202
|
</ul>
|
|
172
203
|
</section>
|
|
173
|
-
{
|
|
204
|
+
{%- endif %}
|
|
174
205
|
|
|
175
|
-
{
|
|
206
|
+
{%- if academic.workflow.peer_review or academic.workflow.collaborations %}
|
|
176
207
|
<section class="academic-dashboard__workflow" aria-labelledby="workflow-heading">
|
|
177
208
|
<h2 id="workflow-heading">{% t 'academic_dashboard.workflow.title' %}</h2>
|
|
178
209
|
<div class="workflow-grid">
|
|
179
|
-
{
|
|
210
|
+
{%- if academic.workflow.peer_review %}
|
|
180
211
|
<article class="workflow-panel" aria-label="{% t 'academic_dashboard.workflow.peer_review.aria_label' %}">
|
|
181
212
|
<h3>{% t 'academic_dashboard.workflow.peer_review.title' %}</h3>
|
|
182
213
|
<ul class="workflow-list">
|
|
183
|
-
{
|
|
214
|
+
{%- for review in academic.workflow.peer_review %}
|
|
184
215
|
<li>
|
|
185
216
|
<strong>{{ review.title | escape }}</strong>
|
|
186
217
|
<p>{{ review.journal }}</p>
|
|
187
218
|
<p>{% t 'academic_dashboard.workflow.peer_review.status_label' %} <span class="status-badge">{{ review.status }}</span></p>
|
|
188
|
-
{
|
|
189
|
-
{
|
|
219
|
+
{%- assign assigned_label = review.assigned_date | localize_date: date_format %}
|
|
220
|
+
{%- assign due_label = review.due_date | localize_date: date_format %}
|
|
190
221
|
<p>{% t 'academic_dashboard.workflow.peer_review.dates' assigned: assigned_label, due: due_label %}</p>
|
|
191
222
|
{% if review.notes %}<p class="workflow-notes">{{ review.notes }}</p>{% endif %}
|
|
192
223
|
</li>
|
|
193
|
-
{
|
|
224
|
+
{%- endfor %}
|
|
194
225
|
</ul>
|
|
195
226
|
</article>
|
|
196
|
-
{
|
|
197
|
-
{
|
|
227
|
+
{%- endif %}
|
|
228
|
+
{%- if academic.workflow.collaborations %}
|
|
198
229
|
<article class="workflow-panel" aria-label="{% t 'academic_dashboard.workflow.collaborations.aria_label' %}">
|
|
199
230
|
<h3>{% t 'academic_dashboard.workflow.collaborations.title' %}</h3>
|
|
200
231
|
<ul class="workflow-list">
|
|
201
|
-
{
|
|
232
|
+
{%- for collab in academic.workflow.collaborations %}
|
|
202
233
|
<li>
|
|
203
234
|
<strong>{{ collab.name }}</strong>
|
|
204
235
|
<p>{{ collab.role }} · {{ collab.stage }}</p>
|
|
205
236
|
{% if collab.contact %}<p>{% t 'academic_dashboard.workflow.collaborations.contact' %} <a href="mailto:{{ collab.contact }}">{{ collab.contact }}</a></p>{% endif %}
|
|
206
237
|
{% if collab.notes %}<p class="workflow-notes">{{ collab.notes }}</p>{% endif %}
|
|
207
238
|
</li>
|
|
208
|
-
{
|
|
239
|
+
{%- endfor %}
|
|
209
240
|
</ul>
|
|
210
241
|
</article>
|
|
211
|
-
{
|
|
242
|
+
{%- endif %}
|
|
212
243
|
</div>
|
|
213
244
|
</section>
|
|
214
|
-
{
|
|
245
|
+
{%- endif %}
|
|
215
246
|
|
|
216
|
-
{
|
|
247
|
+
{%- if academic.calendar.events and academic.calendar.events.size > 0 %}
|
|
217
248
|
<section class="academic-dashboard__calendar" aria-labelledby="academic-calendar-heading">
|
|
218
249
|
<h2 id="academic-calendar-heading">{% t 'academic_dashboard.calendar.title' %}</h2>
|
|
219
250
|
{% if academic.calendar.description %}<p>{{ academic.calendar.description }}</p>{% endif %}
|
|
@@ -221,42 +252,46 @@
|
|
|
221
252
|
<label for="calendar-filter">{% t 'academic_dashboard.calendar.filter_label' %}</label>
|
|
222
253
|
<select id="calendar-filter" data-calendar-filter>
|
|
223
254
|
<option value="">{% t 'academic_dashboard.calendar.all_types' %}</option>
|
|
224
|
-
{
|
|
225
|
-
{
|
|
255
|
+
{%- assign event_types = academic.calendar.events | map: 'type' | uniq %}
|
|
256
|
+
{%- for type in event_types %}
|
|
226
257
|
<option value="{{ type | slugify }}">{{ type | capitalize }}</option>
|
|
227
|
-
{
|
|
258
|
+
{%- endfor %}
|
|
228
259
|
</select>
|
|
229
260
|
</div>
|
|
230
261
|
<ul class="calendar-list" data-academic-calendar>
|
|
231
|
-
{
|
|
262
|
+
{%- for event in academic.calendar.events %}
|
|
232
263
|
<li data-event-type="{{ event.type | slugify }}">
|
|
233
264
|
<article>
|
|
234
265
|
<header>
|
|
235
266
|
<h3>{{ event.name }}</h3>
|
|
236
|
-
<p class="calendar-event__type">{{ event.type | capitalize }} · {{ event.location }}</p>
|
|
267
|
+
<p class="calendar-event__type">{{ event.type | capitalize }}{% if event.location %} · {{ event.location }}{% endif %}</p>
|
|
237
268
|
</header>
|
|
269
|
+
{%- comment -%} A time only where the data gives one: a date alone read "00:00" {%- endcomment -%}
|
|
270
|
+
{%- assign event_times = event.start_date | append: event.end_date | append: event.submission_deadline -%}
|
|
271
|
+
{%- assign event_format = date_format -%}
|
|
272
|
+
{%- if event_times contains ':' -%}{%- assign event_format = datetime_format -%}{%- endif %}
|
|
238
273
|
<dl class="calendar-event__meta">
|
|
239
|
-
<div><dt>{% t 'academic_dashboard.calendar.starts' %}</dt><dd>{{ event.start_date | localize_date:
|
|
240
|
-
<div><dt>{% t 'academic_dashboard.calendar.ends' %}</dt><dd>{{ event.end_date | localize_date:
|
|
241
|
-
{% if event.submission_deadline %}<div><dt>{% t 'academic_dashboard.calendar.submission_deadline' %}</dt><dd>{{ event.submission_deadline | localize_date:
|
|
274
|
+
{% if event.start_date %}<div><dt>{% t 'academic_dashboard.calendar.starts' %}</dt><dd>{{ event.start_date | localize_date: event_format }}</dd></div>{% endif %}
|
|
275
|
+
{% if event.end_date %}<div><dt>{% t 'academic_dashboard.calendar.ends' %}</dt><dd>{{ event.end_date | localize_date: event_format }}</dd></div>{% endif %}
|
|
276
|
+
{% if event.submission_deadline %}<div><dt>{% t 'academic_dashboard.calendar.submission_deadline' %}</dt><dd>{{ event.submission_deadline | localize_date: event_format }}</dd></div>{% endif %}
|
|
242
277
|
</dl>
|
|
243
278
|
</article>
|
|
244
279
|
</li>
|
|
245
|
-
{
|
|
280
|
+
{%- endfor %}
|
|
246
281
|
</ul>
|
|
247
282
|
</section>
|
|
248
|
-
{
|
|
283
|
+
{%- endif %}
|
|
249
284
|
|
|
250
|
-
{
|
|
285
|
+
{%- if academic.funding and academic.funding.size > 0 %}
|
|
251
286
|
<section class="academic-dashboard__funding" aria-labelledby="funding-heading">
|
|
252
287
|
<h2 id="funding-heading">{% t 'academic_dashboard.funding.title' %}</h2>
|
|
253
288
|
<ul class="funding-list">
|
|
254
|
-
{
|
|
289
|
+
{%- for grant in academic.funding %}
|
|
255
290
|
<li>
|
|
256
291
|
<article>
|
|
257
292
|
<header>
|
|
258
293
|
<h3>{{ grant.title | escape }}</h3>
|
|
259
|
-
<p>{{ grant.agency }} · {{ grant.role }}</p>
|
|
294
|
+
<p>{{ grant.agency }}{% if grant.role %} · {{ grant.role }}{% endif %}</p>
|
|
260
295
|
</header>
|
|
261
296
|
<dl class="funding-meta">
|
|
262
297
|
{% if grant.amount %}<div><dt>{% t 'academic_dashboard.funding.amount' %}</dt><dd>{{ grant.amount }}</dd></div>{% endif %}
|
|
@@ -266,36 +301,36 @@
|
|
|
266
301
|
{% if grant.focus %}<p class="funding-focus">{{ grant.focus }}</p>{% endif %}
|
|
267
302
|
</article>
|
|
268
303
|
</li>
|
|
269
|
-
{
|
|
304
|
+
{%- endfor %}
|
|
270
305
|
</ul>
|
|
271
306
|
</section>
|
|
272
|
-
{
|
|
307
|
+
{%- endif %}
|
|
273
308
|
|
|
274
|
-
{
|
|
309
|
+
{%- if academic.collaboration_opportunities and academic.collaboration_opportunities.size > 0 %}
|
|
275
310
|
<section class="academic-dashboard__opportunities" aria-labelledby="collaboration-heading">
|
|
276
311
|
<h2 id="collaboration-heading">{% t 'academic_dashboard.opportunities.title' %}</h2>
|
|
277
312
|
<ul class="opportunity-list">
|
|
278
|
-
{
|
|
313
|
+
{%- for opportunity in academic.collaboration_opportunities %}
|
|
279
314
|
<li>
|
|
280
315
|
<article>
|
|
281
316
|
<header>
|
|
282
317
|
<h3>{{ opportunity.title | escape }}</h3>
|
|
283
|
-
{% if opportunity.tags %}<p class="opportunity-tags">{{ opportunity.tags |
|
|
318
|
+
{% if opportunity.tags %}<p class="opportunity-tags">{{ opportunity.tags | join: ', ' }}</p>{% endif %}
|
|
284
319
|
</header>
|
|
285
320
|
<p>{{ opportunity.description }}</p>
|
|
286
321
|
{% if opportunity.contact %}<p class="opportunity-contact"><a href="mailto:{{ opportunity.contact }}">{{ opportunity.contact }}</a></p>{% endif %}
|
|
287
322
|
</article>
|
|
288
323
|
</li>
|
|
289
|
-
{
|
|
324
|
+
{%- endfor %}
|
|
290
325
|
</ul>
|
|
291
326
|
</section>
|
|
292
|
-
{
|
|
327
|
+
{%- endif %}
|
|
293
328
|
|
|
294
|
-
{
|
|
329
|
+
{%- if academic.mentorship and academic.mentorship.size > 0 %}
|
|
295
330
|
<section class="academic-dashboard__mentorship" aria-labelledby="mentorship-heading">
|
|
296
331
|
<h2 id="mentorship-heading">{% t 'academic_dashboard.mentorship.title' %}</h2>
|
|
297
332
|
<ul class="mentorship-list">
|
|
298
|
-
{
|
|
333
|
+
{%- for program in academic.mentorship %}
|
|
299
334
|
<li>
|
|
300
335
|
<article>
|
|
301
336
|
<header>
|
|
@@ -310,38 +345,38 @@
|
|
|
310
345
|
{% if program.contact %}<p><a href="mailto:{{ program.contact }}">{{ program.contact }}</a></p>{% endif %}
|
|
311
346
|
</article>
|
|
312
347
|
</li>
|
|
313
|
-
{
|
|
348
|
+
{%- endfor %}
|
|
314
349
|
</ul>
|
|
315
350
|
</section>
|
|
316
|
-
{
|
|
351
|
+
{%- endif %}
|
|
317
352
|
|
|
318
353
|
{% include components/open-science-badges.html badges=academic.badges %}
|
|
319
354
|
|
|
320
|
-
{
|
|
355
|
+
{%- if academic.networking.platforms or academic.networking.mentorship_channels %}
|
|
321
356
|
<section class="academic-dashboard__networking" aria-labelledby="networking-heading">
|
|
322
357
|
<h2 id="networking-heading">{% t 'academic_dashboard.networking.title' %}</h2>
|
|
323
358
|
<div class="networking-grid">
|
|
324
|
-
{
|
|
359
|
+
{%- if academic.networking.platforms %}
|
|
325
360
|
<article>
|
|
326
361
|
<h3>{% t 'academic_dashboard.networking.communities' %}</h3>
|
|
327
362
|
<ul>
|
|
328
|
-
{
|
|
329
|
-
<li><a href="{{ platform.url }}" target="_blank" rel="noopener">{{ platform.name }}</a> · {{ platform.role }}</li>
|
|
330
|
-
{
|
|
363
|
+
{%- for platform in academic.networking.platforms %}
|
|
364
|
+
<li><a href="{{ platform.url }}" target="_blank" rel="noopener noreferrer">{{ platform.name }}</a>{% if platform.role %} · {{ platform.role }}{% endif %}</li>
|
|
365
|
+
{%- endfor %}
|
|
331
366
|
</ul>
|
|
332
367
|
</article>
|
|
333
|
-
{
|
|
334
|
-
{
|
|
368
|
+
{%- endif %}
|
|
369
|
+
{%- if academic.networking.mentorship_channels %}
|
|
335
370
|
<article>
|
|
336
371
|
<h3>{% t 'academic_dashboard.networking.mentorship_channels' %}</h3>
|
|
337
372
|
<ul>
|
|
338
|
-
{
|
|
373
|
+
{%- for channel in academic.networking.mentorship_channels %}
|
|
339
374
|
<li><strong>{{ channel.channel }}</strong>: {{ channel.description }}</li>
|
|
340
|
-
{
|
|
375
|
+
{%- endfor %}
|
|
341
376
|
</ul>
|
|
342
377
|
</article>
|
|
343
|
-
{
|
|
378
|
+
{%- endif %}
|
|
344
379
|
</div>
|
|
345
380
|
</section>
|
|
346
|
-
{
|
|
347
|
-
</
|
|
381
|
+
{%- endif %}
|
|
382
|
+
</div>
|