// SimpleViews — News, Talks, Service, Awards, Patents.
const XV = window.WINTELAcademicDesignSystem_045d4f;
function NewsItem({ item }) {
const [open, setOpen] = React.useState(false);
const hasEmbed = !!item.embed;
const hasVideo = !!item.video;
const expandable = hasEmbed || hasVideo;
return (
setOpen((v) => !v) : undefined}
role={expandable ? 'button' : undefined}
aria-expanded={expandable ? open : undefined}
style={{ display: 'flex', alignItems: 'flex-start', gap: '1rem', padding: '1rem 0', cursor: expandable ? 'pointer' : 'default' }}>
{item.date}
{item.title}
{expandable ? (
{hasVideo ? (
) : (
)}
) : null}
{expandable && open ? (
) : null}
);
}
function NewsView({ data }) {
return (
{data.news.map((n, i) => )}
);
}
function TalkItem({ t }) {
const topics = t.tags
? t.tags.map((l) => (window.TOPICS || []).find((x) => x.label === l)).filter(Boolean)
: (window.topicsFor ? window.topicsFor({ t: t.title, v: t.meta }) : []);
const flag = window.flagForText ? window.flagForText(t.meta) : null;
return (
[{t.id}]
{t.title}
{t.with ? (
{t.with.split('A. Celik').map((seg, j, arr) => (
{seg}{j < arr.length - 1 ? A. Celik : null}
))}
) : null}
{t.meta}{flag ? {flag} : null}
{topics.length ? (
{topics.map((tp) => window.TopicTag ? : null)}
) : null}
);
}
function talkYear(meta) {
const m = (meta || '').match(/(20\d{2})/g);
return m ? m[m.length - 1] : 'Undated';
}
function groupTalksByYear(items) {
const g = {};
items.forEach((it) => { const y = talkYear(it.meta); (g[y] = g[y] || []).push(it); });
return Object.keys(g)
.sort((a, b) => (a === 'Undated' ? 1 : b === 'Undated' ? -1 : Number(b) - Number(a)))
.map((y) => ({ year: y, items: g[y] }));
}
// Geography across ALL dissemination: talks (every group) + conference presentations.
function dissemGeo(data) {
const R = window.resolveCity;
if (!R) return { countries: [], cities: [] };
const counts = {}; const cities = {};
const add = (c) => {
if (!c) return;
counts[c.iso] = counts[c.iso] || { iso: c.iso, name: c.country, n: 0 }; counts[c.iso].n += 1;
cities[c.key] = cities[c.key] || { key: c.key, lon: c.lon, lat: c.lat, country: c.country, n: 0 }; cities[c.key].n += 1;
};
(data.talks || []).forEach((grp) => grp.items.forEach((it) => add(R({ v: it.meta }))));
const P = window.WINTEL_PUBLICATIONS;
if (P) (P.proceedings || []).forEach((p) => add(R(p)));
const geo = { countries: Object.values(counts), cities: Object.values(cities) };
return window.mergeExtraGeo ? window.mergeExtraGeo(geo) : { countries: geo.countries.sort((a, b) => b.n - a.n), cities: geo.cities };
}
const TYPE_SHORT = { 'Invited Talks & Seminars': 'Seminars' };
function DissemStats({ data }) {
const SB = window.StatBox;
const geo = React.useMemo(() => dissemGeo(data), [data]);
const P = window.WINTEL_PUBLICATIONS;
const confN = P ? (P.proceedings || []).length : 0;
const byGroup = {};
(data.talks || []).forEach((g) => { byGroup[g.group] = g.items.length; });
const total = (data.talks || []).reduce((s, g) => s + g.items.length, 0) + confN;
return (
{SB ? : null}
{SB ? : null}
{SB ? : null}
{SB ? : null}
{SB ? : null}
{SB ? : null}
);
}
function DissemGraphs({ data }) {
const HBar = window.HBarChart; const WMap = window.WorldMap; const accent = (window.chartAccent ? window.chartAccent() : '#2563eb');
const geo = React.useMemo(() => dissemGeo(data), [data]);
const P = window.WINTEL_PUBLICATIONS;
const confN = P ? (P.proceedings || []).length : 0;
const typeRows = [
...(data.talks || []).map((g) => ({ key: TYPE_SHORT[g.group] || g.group, n: g.items.length })),
{ key: 'Conferences', n: confN },
].sort((a, b) => b.n - a.n);
const countryRows = geo.countries.map((c) => ({ key: c.name, full: c.name, n: c.n }));
return (
{WMap ?
: null}
{HBar ? accent} /> : null}
{HBar ? accent} /> : null}
);
}
function TalksView({ data }) {
const ORDER = ['Keynotes', 'Panels', 'Invited Talks & Seminars', 'Tutorials'];
const LABELS = { 'Invited Talks & Seminars': 'Invited Talks' };
const tabs = [...data.talks].sort((a, b) => {
const ia = ORDER.indexOf(a.group); const ib = ORDER.indexOf(b.group);
return (ia === -1 ? 99 : ia) - (ib === -1 ? 99 : ib);
}).map((g) => ({ key: g.group, label: LABELS[g.group] || g.group, items: g.items }));
const [active, setActive] = React.useState(tabs[0].key);
const [showStats, setShowStats] = React.useState(false);
const current = tabs.find((t) => t.key === active) || tabs[0];
const grouped = groupTalksByYear(current.items);
return (
setShowStats((v) => !v)} aria-expanded={showStats} aria-label="Toggle analytics"
style={{ display: 'inline-flex', alignItems: 'center', gap: '0.4rem', padding: '0.4rem 0.75rem', background: showStats ? 'var(--surface-muted)' : 'var(--accent)', border: '1px solid ' + (showStats ? 'var(--border-default)' : 'var(--accent)'), borderRadius: 'var(--radius-full)', cursor: 'pointer', color: showStats ? 'var(--text-primary)' : 'var(--text-inverse, #fff)', font: 'inherit', fontSize: 'var(--text-sm)', fontWeight: 'var(--weight-medium)', whiteSpace: 'nowrap', transition: 'all var(--duration-base) var(--ease-standard)' }}>
{showStats ? 'Hide analytics' : 'Analytics'}
{showStats ? : null}
{tabs.map((t) => (
setActive(t.key)}>
{t.label}
{t.items.length}
))}
{grouped.map((g) => (
{g.year}
{g.items.length}
{g.items.map((t, i) => )}
))}
);
}
function SvcSection({ title, count, children }) {
return (
{title}
{count != null ? {count} : null}
{children}
);
}
function SvcSubList({ items }) {
// one nesting level: each item may have `years` and/or `sub`
return (
);
}
function SvcConfGroup({ g }) {
const [open, setOpen] = React.useState(false);
const hasItems = g.items && g.items.length;
return (
setOpen((v) => !v) : undefined} role={hasItems ? 'button' : undefined} aria-expanded={hasItems ? open : undefined}
style={{ display: 'flex', alignItems: 'flex-start', gap: '1rem', padding: '0.85rem 0', cursor: hasItems ? 'pointer' : 'default' }}>
{g.conf}
{g.years ? {g.years} : null}
{hasItems ? (
{g.items.length}
) : null}
{hasItems && open ?
: null}
);
}
function ServiceView({ data }) {
const s = data.service || {};
return (
{(s.editors || []).map((e, i) => (
Editor {e.venue}
{e.years}
))}
{(s.phdExaminer || []).map((p, i) => (
{p.name}
{p.inst} · {p.date}
{p.title}
{p.supervisors ?
Supervisor(s): {p.supervisors}
: null}
))}
{(s.chairing || []).map((c, i) => (
{c.event}
{c.role}
{c.url ? (
link
) : null}
))}
{(s.tpc || []).map((g, i) => )}
{(s.sessionChairing || []).map((g, i) => )}
);
}
const AWARD_ICONS = {
trophy: 'ri-trophy-line',
'medal-1': 'ri-medal-line',
'medal-2': 'ri-medal-line',
'medal-3': 'ri-medal-line',
badge: 'ri-award-line',
award: 'ri-award-line',
};
function AwardMediaTrigger({ a, open, setOpen }) {
const hasVideo = !!a.video;
if (!hasVideo && !a.embed) return null;
return (
setOpen((v) => !v)} aria-expanded={open}
style={{ display: 'inline-flex', alignItems: 'center', gap: '0.4rem', background: 'none', border: '1px solid var(--border-default)', borderRadius: 'var(--radius-md)', padding: '0.2rem 0.55rem', cursor: 'pointer', color: 'var(--text-body)', fontSize: 'var(--text-xs)', fontFamily: 'var(--font-mono)', letterSpacing: '0.02em', flexShrink: 0, lineHeight: 1.4 }}>
{hasVideo ? : }
{hasVideo ? 'Watch talk' : 'View post'}
);
}
function AwardMediaPanel({ a, open }) {
const hasVideo = !!a.video;
if (!open || (!hasVideo && !a.embed)) return null;
return (
);
}
function AwardRow({ a }) {
const [open, setOpen] = React.useState(false);
const hasMedia = !!(a.video || a.embed);
// Anchor the media trigger to the last detail line so it sits inline on the right.
const anchor = a.advisors ? 'advisors' : 'org';
return (
{a.place ? (
{a.place}
) : null}
{a.title}
{a.url ? (
link
) : null}
{a.year}
{a.org ? (
{a.org}
{hasMedia && anchor === 'org' ?
: null}
) : null}
{a.team ?
Team: {a.team}
: null}
{a.members ?
Members: {a.members}
: null}
{a.advisors ? (
Advisors: {' '}
{a.advisors.split('A. Celik').map((seg, j, arr) => (
{seg}{j < arr.length - 1 ? A. Celik : null}
))}
{hasMedia && anchor === 'advisors' ?
: null}
) : null}
);
}
function AwardsView({ data }) {
const byYear = (x, y) => parseInt(y.year, 10) - parseInt(x.year, 10);
const individual = (data.awards || []).filter((a) => a.cat === 'individual').sort(byYear);
const team = (data.awards || []).filter((a) => a.cat === 'team').sort(byYear);
return (
{individual.length ? (
Individual Honors
{individual.length}
{individual.map((a, i) => )}
) : null}
{team.length ? (
Research Team Awards
{team.length}
Awards earned by mentored students/teams
{team.map((a, i) => )}
) : null}
);
}
function PatentItem({ p }) {
const topics = (p.tags || []).map((l) => (window.TOPICS || []).find((x) => x.label === l)).filter(Boolean);
return (
[{p.id}]
{p.title}
{(p.authors || '').split('A. Celik').map((seg, j, arr) => (
{seg}{j < arr.length - 1 ? A. Celik : null}
))}
{p.venue} {p.date ? · {p.date} : null}
{p.url ? (
Patent
) : null}
{p.assignee ? (
{p.assignee}
) : null}
{topics.map((t) => window.TopicTag ? : null)}
);
}
function PatentsView({ data }) {
const list = data.patents || [];
const granted = list.filter((p) => p.url);
const filed = list.filter((p) => !p.url);
const Group = ({ title, items }) => items.length ? (
{title}
{items.length}
{items.map((p, i) => )}
) : null;
return (
{list.length === 0 ? (
Patent listings coming soon.
) : (
)}
);
}
Object.assign(window, { NewsView, NewsItem, TalksView, ServiceView, AwardsView, PatentsView });