Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

## Unreleased
### Added
- Offer applicable link, content, chart-only, and table-only choices in the native Smart Picker search results for Analytics reports and panoramas without the redundant Analytics group heading, preserving explicit chart/table selections when reports gain another view; content previews render live charts, tables, KPIs, text, and pictures with ten-row table pages, bottom-only pagination, and chart libraries loaded only for chart previews.
- Add a V4 API endpoint for deleting legacy dataset rows through structured filters, including dynamic date variables.
- Configure tables interactively with a seven-row live preview independent of report pagination, column formatting, layout controls with accurate empty-field placeholders, shared section navigation with linked documentation and an active-section underline that follows scrolling, a left settings panel paired with a live preview, and draft Apply/Cancel actions; use alternating rows by default in previews and live tables, keep section headings visible when navigating, immediately mark the chosen compact header button for column formatting, prevent Appearance controls from scrolling the dialog shell blank, use report headers as the sole persisted sort control, and support DataTables 3 column metadata.
- New interactive chart configuration with flexible field mapping and a live-data preview in the shared options-dialog layout.
Expand All @@ -16,6 +17,7 @@
- Store report option data as longtext instead of varchar(1000).

### Fixed
- Resolve reports and panoramas shared with the current user in link previews and respect the `link_preview_enabled` admin setting.
- Enable panorama layout changes and page deletion only while editing.
- Focus the dataset name when opening its creation wizard and create it with Enter.
- Stack panorama tiles with balanced, full-width headers and preserved outer corner radii on narrow screens.
Expand Down
2 changes: 2 additions & 0 deletions appinfo/routes.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,10 @@
'routes' => [
['name' => 'page#main', 'url' => '/', 'verb' => 'GET'],
['name' => 'page#report', 'url' => '/r/{id}', 'verb' => 'GET'],
['name' => 'page#reportMode', 'url' => '/r/{id}/{mode}', 'verb' => 'GET'],
['name' => 'page#dataset', 'url' => '/d/{id}', 'verb' => 'GET'],
['name' => 'page#panorama', 'url' => '/pa/{id}', 'verb' => 'GET'],
['name' => 'page#panoramaMode', 'url' => '/pa/{id}/{mode}', 'verb' => 'GET'],
['name' => 'page#indexPublic', 'url' => '/p/{token}', 'verb' => 'GET'],
['name' => 'page#indexPublicMin', 'url' => '/pm/{token}', 'verb' => 'GET'],
['name' => 'page#authenticatePassword', 'url' => '/p/{token}', 'verb' => 'POST'],
Expand Down
224 changes: 224 additions & 0 deletions css/reference.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,224 @@
/**
* Analytics
*
* SPDX-FileCopyrightText: 2026 Marcel Scherello
* SPDX-License-Identifier: AGPL-3.0-or-later
*/

/* The native picker already names Analytics in its dialog title. */
.smart-picker-search .vs__dropdown-option:has(.group-name-icon[src*="/analytics/img/app-dark.svg"]) {
display: none;
}

.analytics-reference-widget {
display: flex;
flex-direction: column;
width: 100%;
border: 1px solid var(--color-border);
border-radius: var(--border-radius-large, 8px);
background-color: var(--color-main-background);
color: var(--color-main-text);
overflow: hidden;
}

.analytics-reference-header {
display: flex;
align-items: center;
gap: 8px;
padding: 8px 12px;
border-bottom: 1px solid var(--color-border);
}

.analytics-reference-header img {
width: 20px;
height: 20px;
flex-shrink: 0;
}

.analytics-reference-header a,
.analytics-reference-header span {
font-weight: 600;
color: var(--color-main-text);
text-decoration: none;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}

.analytics-reference-header a:hover {
text-decoration: underline;
}

.analytics-reference-body {
position: relative;
height: 350px;
padding: 8px;
box-sizing: border-box;
}

/* combined chart + table view: chart on top, scrollable table below */
.analytics-reference-body.analytics-reference-ct {
height: auto;
}

/* table-only view: grow with the content, but stay scrollable within a cap */
.analytics-reference-body.analytics-reference-scroll {
height: auto;
max-height: 350px;
overflow-y: auto;
overflow-x: auto;
}

.analytics-reference-chart-area {
position: relative;
height: 334px;
}

.analytics-reference-ct .analytics-reference-chart-area {
height: 260px;
}

.analytics-reference-table-area {
max-height: 260px;
overflow-y: auto;
overflow-x: auto;
margin-top: 8px;
}

.analytics-reference-body table {
width: 100%;
}

.analytics-reference-message {
display: flex;
align-items: center;
justify-content: center;
height: 100%;
color: var(--color-text-maxcontrast, var(--color-text-lighter));
}

/* panorama grid: first page of the panorama, one cell per widget */
.analytics-reference-body.analytics-reference-panorama {
height: auto;
display: grid;
grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
gap: 8px;
}

.analytics-reference-panorama-cell {
position: relative;
height: 240px;
padding: 4px;
box-sizing: border-box;
border: 1px solid var(--color-border);
border-radius: var(--border-radius, 4px);
overflow: hidden;
}

.analytics-reference-panorama-cell-title {
height: 24px;
padding-left: 6px;
font-weight: 500;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}

.analytics-reference-panorama-cell-content {
position: relative;
height: calc(100% - 24px);
overflow: hidden;
}

.analytics-reference-panorama-cell-content.analytics-reference-scroll {
overflow-y: auto;
}

.analytics-reference-panorama-text {
padding: 6px;
white-space: pre-wrap;
overflow-y: auto;
height: 100%;
}

.analytics-reference-panorama-picture {
display: flex;
align-items: center;
justify-content: center;
height: 100%;
}

.analytics-reference-panorama-picture img {
max-width: 90%;
max-height: 90%;
}

.analytics-reference-footer {
padding: 4px 12px;
border-top: 1px solid var(--color-border);
font-size: 0.9em;
}

.analytics-reference-footer a {
color: var(--color-text-maxcontrast, var(--color-text-lighter));
}

/* static fallback card (also used while the rich object carries no id) */
.analytics-reference-fallback {
display: flex;
color: var(--color-main-text);
}

.analytics-reference-fallback img {
width: 20%;
padding: 20px;
opacity: .5;
box-sizing: border-box;
}

.analytics-reference-fallback-content {
padding: 10px;
width: 75%;
}

.analytics-reference-fallback-title {
font-weight: 600;
}

.analytics-reference-fallback-subheader {
margin-top: 1em;
}

/* KPI styles from style.css, which is not loaded in the reference context */
.analytics-reference-widget .kpiWidget {
display: flex;
justify-content: center;
align-items: center;
width: 100%;
height: 100%;
border-radius: 8px;
overflow: hidden;
}

.analytics-reference-widget .kpiWidgetContent {
text-align: center;
}

.analytics-reference-widget .kpiWidgetTitel {
font-size: 1.5rem;
font-weight: 600;
margin-bottom: 0.5rem;
}

.analytics-reference-widget .kpiWidgetValue {
font-size: 3.5rem;
font-weight: 400;
}

.analytics-reference-panorama-cell .kpiWidgetTitel {
font-size: 1.1rem;
}

.analytics-reference-panorama-cell .kpiWidgetValue {
font-size: 2.2rem;
}
Loading