{% extends "base.html" %} {% block title %}Factcat — Events{% endblock %} {% block extra_head %} {% endblock %} {% block extra_css %} main.workspace { display: grid; grid-template-columns: 22rem 1fr; flex: 1; min-height: 0; } .filters { background: var(--fc-snow); padding: 1.25rem; border-right: 1px solid var(--fc-line); overflow-y: auto; min-height: 0; } .results { display: flex; flex-direction: column; gap: 0.5rem; padding: 0.5rem; min-height: 0; overflow: hidden; background: var(--fc-paper); } .pane { background: var(--fc-snow); border: 1px solid var(--fc-line); display: flex; flex-direction: column; min-height: 0; } .pane h2 { margin: 0; padding: 0.45rem 0.75rem; border-bottom: 1px solid var(--fc-line); font-size: 0.7rem; } .pane-body { flex: 1; overflow: auto; padding: 0.75rem; min-height: 0; } .pane-chart { flex: 2; min-height: 12rem; } .pane-table { flex: 1; min-height: 8rem; } .pane-sql { flex: 0 1 9rem; min-height: 7rem; } .pane-sql .pane-body { padding: 0; } .empty { color: var(--fc-slate); font-size: 0.85rem; margin: 0; } .chart-body { position: relative; } .chart-body canvas { width: 100% !important; height: 100% !important; } .empty-state { display: flex; flex-direction: column; align-items: center; justify-content: center; min-height: 16rem; color: var(--fc-slate); font-size: 0.9rem; text-align: center; margin: 0; } .empty-state[hidden], canvas[hidden] { display: none; } .empty-state img { width: 10rem; height: 10rem; object-fit: contain; margin-bottom: 0.75rem; } #sql { margin: 0; min-height: 100%; box-sizing: border-box; } .summary { font-size: 0.75rem; color: var(--fc-slate); margin: 0 0 0.75rem; } .pane-head { display: flex; align-items: center; justify-content: space-between; gap: 0.5rem; padding-right: 0.5rem; } .pane-head h2 { border-bottom: none; padding: 0.45rem 0.75rem; } .pane-actions { display: flex; align-items: center; gap: 0.35rem; flex-wrap: wrap; } .pane-actions button, .pane-actions select { margin: 0; padding: 0.2rem 0.5rem; font-size: 0.7rem; width: auto; } .pane-actions label { margin: 0; font-weight: 400; display: flex; align-items: center; gap: 0.25rem; } .chart-title { flex: 1; min-width: 8rem; margin: 0; padding: 0.35rem 0.75rem; border: none; border-bottom: 1px solid var(--fc-line); font-size: 0.8rem; font-weight: 600; background: transparent; } #exact-wrap[hidden] { display: none !important; } #run-row { display: flex; align-items: center; gap: 0.5rem; margin-top: 0.75rem; flex-wrap: wrap; } #run-row button { margin-top: 0; } #run-status, #run-estimate { font-size: 0.8rem; color: var(--fc-slate); } #run-estimate-wrap { display: inline-flex; align-items: center; gap: 0.4rem; } #run-estimate-wrap[hidden] { display: none !important; } #run-estimate-bar { display: inline-block; width: 3.2rem; height: 0.45rem; background: var(--fc-line); border-radius: 2px; overflow: hidden; vertical-align: middle; } #run-estimate-fill { display: block; height: 100%; width: 0; background: var(--fc-ok); } #run-estimate-wrap.warn #run-estimate-fill { background: var(--fc-ochre); } #run-estimate-wrap.hot #run-estimate-fill, #run-estimate-wrap.over-cap #run-estimate-fill { background: var(--fc-alert); } #run-estimate-wrap.over-cap #run-estimate { color: var(--fc-alert); font-weight: 600; } .format-pop { position: relative; font-size: 0.7rem; } .format-pop > summary { cursor: pointer; list-style: none; padding: 0.2rem 0.5rem; border: 1px solid var(--fc-line); border-radius: 0.2rem; } .format-pop > summary::-webkit-details-marker { display: none; } .format-pop[open] > .format-body { position: absolute; right: 0; top: calc(100% + 0.2rem); z-index: 8; background: var(--fc-snow); border: 1px solid var(--fc-line); padding: 0.65rem 0.75rem; min-width: 14rem; box-shadow: 0 4px 14px rgba(28, 25, 23, .08); } .format-body label { display: flex; justify-content: space-between; align-items: center; gap: 0.6rem; margin: 0.4rem 0; font-weight: 400; font-size: 0.7rem; } .format-body select { width: auto; font-size: 0.7rem; padding: 0.15rem 0.3rem; } .icon-btn { display: inline-flex; align-items: center; justify-content: center; width: 1.75rem; height: 1.75rem; padding: 0; margin: 0; background: var(--fc-snow); border: 1px solid var(--fc-line); border-radius: 0.25rem; cursor: pointer; color: var(--fc-slate); } .icon-btn svg { width: 0.95rem; height: 0.95rem; display: block; } .icon-btn:hover { color: var(--fc-ink); border-color: var(--fc-ochre); } .icon-btn.copied { color: var(--fc-ok); border-color: var(--fc-ok); } .format-pop > summary.icon-btn { list-style: none; } .format-pop > summary.icon-btn::-webkit-details-marker { display: none; } .pane-limit { display: flex; align-items: center; gap: 0.3rem; margin: 0; font-size: 0.7rem; font-weight: 400; color: var(--fc-slate); } .pane-limit input { width: 3.5rem; padding: 0.15rem 0.3rem; font-size: 0.7rem; } #cap-override { display: flex; align-items: center; gap: 0.35rem; font-size: 0.75rem; color: var(--fc-alert); } #cap-override[hidden] { display: none !important; } #cap-override input[type="number"] { width: 4rem; padding: 0.15rem 0.3rem; } #result-table { table-layout: fixed; width: 100%; } #result-table th { position: relative; cursor: pointer; user-select: none; min-width: 4rem; border-right: 1px solid var(--fc-line); padding-right: 0.9rem; } #result-table th .sort { font-size: 0.65rem; color: var(--fc-slate); margin-left: 0.25rem; } #result-table th.sorted .sort { color: var(--fc-ink); } #result-table th .grip { position: absolute; right: 0; top: 0; width: 8px; height: 100%; cursor: col-resize; background: linear-gradient(to right, transparent 2px, var(--fc-slate) 2px, var(--fc-slate) 3px, transparent 3px); } #result-table th .grip:hover { background: var(--fc-ochre); } #custom-range label { display: inline-block; width: auto; margin-right: 0.35rem; } #custom-range input { width: auto; } .range-row { display: flex; gap: 0.4rem; align-items: center; margin-top: 0.35rem; } .range-row[hidden], #range-include[hidden], #custom-range[hidden], #custom-absolute[hidden], #custom-relative[hidden] { display: none !important; } .range-row input[type="number"] { width: 4.5rem; } #breakdown-extra[hidden] { display: none !important; } #breakdown-extra .range-row { margin-top: 0.5rem; } #top_n { width: 4.5rem; } .incomplete-note { font-size: 0.75rem; color: var(--fc-slate); margin: 0.35rem 0 0; } #result-table tr.incomplete td { color: var(--fc-slate); font-style: italic; } #custom-snap-hint { margin: 0.35rem 0 0; } .linkish { background: none; border: none; padding: 0; margin-left: 0.5rem; color: var(--fc-ochre-deep); text-decoration: underline; font-size: 0.75rem; font-weight: 400; cursor: pointer; } {% endblock %} {% block body %} Events {{ config.table }} · {{ config.entity_label or "User" }} ({{ config.entity }}) · {{ config.event_time }} Event Refresh list Time grain Day Week Month Date range Last {% if config.grain == "week" %}weeks{% elif config.grain == "month" %}months{% else %}days{% endif %} Include this week Specific dates Relative From To From days ago To days ago 0 = this day. Measure Volume Unique {{ config.entity_label_plural or "Users" }} Average per {{ config.entity_label or "User" }} Exact unique counts Same bytes scanned; more CPU. Off is HyperLogLog (faster). Break down by SQL expression Fills the spec expression. Does not replace it with a property store. Value on each event in this date range. First/last for an entity (chart window vs all history vs cohort) is a later control — it is not this dropdown. Top N Show (other) Run Override cap GB this run Auto Line Area Bar Values Auto Integer 1 decimal 2 decimals Compact (1.2k) Scientific Data labels X-axis labels Y-axis labels Grid Off Major Major and minor No rows yet. The cat is waiting. Table Run to see rows. Day Break down Volume SQL Run to see generated SQL. {% endblock %}
{{ config.table }} · {{ config.entity_label or "User" }} ({{ config.entity }}) · {{ config.event_time }}
0 = this day.
No rows yet. The cat is waiting.
Run to see rows.
Run to see generated SQL.