All notable changes to this project are documented in this file.
[1.1.2.0] — 2026-09-20
Added
- Pro preview while editing. Without a licence, in edit mode, the Pro features (week view, multiple events per day and per-category colours) now render working under a "Pro preview" watermark, as Microsoft's publishing guidelines allow for paid features. In reading view, before the licence resolves, or where Power BI cannot check licences (Publish to Web, embedding, export), the free result is shown with no watermark.
build-test.js --free: builds with the real licence instead of forcing Pro. It is the only mode in which the preview, the watermark and the purchase notices can be tested.
Certification
npm audit: de 14 avisos (1 alto, 9 moderados) a 7 (0 altos, 3 moderados, 4 bajos), conoverridesdeuuidyelliptic. **ajvmoderado no se puede resolver sin subirpowerbi-visuals-tools**: forzarajv@8rompe el build (el ESLint interno de tools 5.6 necesitaajv@6). Queda declarado como hueco conocido.- ESLint no existía en el repo: ni dependencia, ni plugin, ni configuración, ni script. Añadidos
eslint@^9,eslint-plugin-powerbi-visuals,eslint.config.mjsy el script"eslint"que pide certificación. Sin errores (tools/ybuild-test.jsexcluidos por ser utilidades locales, no parte del visual). - Localización creada desde cero. No había carpeta
stringResourcesypbiviz.jsonla declaraba como[]. Ahora hayresources.resjsoncon 50 cadenas, las 46 entradas decapabilities.json(6 roles, 7 objetos, 33 propiedades) llevan sudisplayNameKey, y el visual llama acreateLocalizationManager()para el texto del aviso de compra. build-test.jsadmite--free, el único modo en el que se pueden probar la vista previa, la marca de agua y los avisos de compra.
Fixed
- Only one purchase notice reached the user.
notifyLicenseRequiredandnotifyFeatureBlockedwere called back to back, and Power BI shows a single notification at a time, so the second replaced the first. The previous notice is now cleared first, the banner names only the newly activated features, and the persistent Upgrade bar follows once the banner ends (~10.5 s). Pattern verified in Risk Matrix Pro in the Power BI service. - Clicking the Week button still notifies, even if that feature was already announced.
[1.1.1.0] — 2026-09-14
Fixed
- A paying customer could stay on Free.
getAvailableServicePlans()returns each plan'sspIdentifieras the full Partner Center Service ID (publisher.offer.plan), as the licensing API documentation states. The visual compared it with the bare plan IDcalendar-tcviz, which never matches the full Service ID. It now accepts a Service ID ending in.calendar-tcviz, and the bare plan ID as well. The 30-day trial resolves the same way.
[1.1.0.0] — 2026-09-04
Added
Power BI feature support
- Report tooltips.
capabilities.jsonnow declarestooltips.supportedTypes.canvas, so a tooltip page can be attached to the visual and is shown for the hovered day. Standard tooltips were already supported; this adds the report-page variant. - Dynamic format strings. Values are formatted with the measure's own format string, read from the column metadata on every update so a DAX-driven format string is picked up. Percentages, currencies, decimal precision and custom formats now render correctly where they previously fell back to a hand-rolled K/M abbreviation. Day cells keep the compact form via display units; tooltips and screen-reader labels show full precision. Each Tooltip Measure is formatted with its own column's format string.
- Bookmarks.
registerOnSelectCallbackkeeps the visual's selection in sync when a bookmark, a "clear filters" action or a selection made elsewhere in the report changes it. Previously the visual kept painting a stale selection. - Conditional formatting. A new Day Color property under Heatmap Colors carries an fx button. A rule bound to the Main Measure resolves per day and overrides the gradient; a constant value applies to every day. Precedence is rule, then constant, then the gradient.
- Allow Interactions. Click, keyboard activation and the context menu now honour
host.allowInteractions, so the visual is inert where Power BI asks it to be — for example when used inside a report tooltip page.
Fixed
- Tooltip Measures were aggregated by parsing their own *formatted* strings and stripping every non-numeric character. Any currency symbol, percent sign or thousands separator corrupted the running total. Aggregation now runs on the raw numbers and formatting happens only at display time.
Accessibility
- Full keyboard navigation across the day grid. A roving
tabindexmakes the grid a single tab stop; from there: ←→move one day,↑↓move one week (month view) or one day (week view)Home/Endjump to the first / last day of the weekPage Up/Page Downjump one month (month view) or one week (week view)Enter/Spacefilter on the focused day;Ctrl/Cmdadds to the selectionEscapeclears the selection so slicers and other visuals return to unfilteredShift+F10/Context Menuopens the Power BI context menu on the focused day- Moving past the edge of the visible range navigates to the adjacent month or week and keeps focus on the target day
- Visible focus ring on day cells and on all navigation buttons, themed to the configured accent color and drawn with
box-shadowso it never collides with the selection outline. - Tooltips now open on keyboard focus, not only on hover, so the secondary measures in the Tooltip Measures field well are reachable without a mouse.
- ARIA semantics:
role="grid"/rowgroup/row/columnheader/gridcellon the calendar structure, a per-dayaria-labelannouncing date, measure value, holiday and event names,aria-selectedon selected days,aria-liveon the month/week label,aria-pressedon the Month/Week toggle,aria-labelon the navigation buttons, androle="list"on the event category legend. - High contrast support via
host.colorPalette.isHighContrast. When a high-contrast theme is active the visual stops encoding meaning in fill color: day cells use the theme background with the heatmap intensity re-encoded as border weight (1–4px) in the theme foreground, today and the active view button are marked by a heavier border in the selected-foreground color, event badges and legend swatches switch to outlined style, and all text uses the theme foreground. @media (forced-colors: active)and@media (prefers-reduced-motion: reduce)rules so the OS palette and motion preferences win outright.
Changed
- Power BI's own purchase notifications replace the visual's licensing UI. The "🔒" on the Week button and the "… is available in Calendar Events Heatmap Pro" toast are gone: Microsoft asks visuals not to draw their own licensing UX. A Free user who clicks Week, or sets a Pro option (several months, more events per day, event styling, label and button styling, category colours), gets
notifyFeatureBlockedandnotifyLicenseRequired, which carry the purchase path. They fire only once the licence is resolved and are cleared when it resolves to Pro. - Pro options are visible to Free users, marked "[Pro]" in the format pane. The Measure Labels, View Buttons and Event Category Colors cards used to be hidden without a licence, so nobody could find them. The pane shows the value the user chose; the visual applies it only with a licence.
- The package description no longer claims to be "the only" calendar of its kind.
- Selecting a day now dims the unselected days and draws an outline on the selected ones, in both month and week view, for mouse and keyboard alike.
capabilities.jsonalready declaredsupportsKeyboardFocus; this release is what actually implements it.style/visual.lessis no longer where the stylesheet lives. pbiviz has never emitted it into the package —content.cssis absent in every build from 1.0.0.0 onwards — so the rules it declared never reached a report. The stylesheet is now injected at runtime byinjectStyles(), which is what makes the keyboard focus ring actually ship.
Fixed
- Week view was reachable without a licence by setting *Default View = Week*: the toggle was gated, the render path was not. Week view now renders only with a licence.
- A licence in the
Warningstate was treated as Free. Warning is the grace period of a failed payment; the customer has paid and now keeps Pro through it. The 30-day trial configured on the Partner Center plan resolves as Active, as before. - Publish to Web, embedding and export no longer ask anyone to buy.
isLicenseUnsupportedEnvandisLicenseInfoAvailableare honoured. - Removed a "License Key" text field from the format pane and
capabilities.json. It was never read by the code, and the visual is licensed only through AppSource. - Removed the unused
TRIAL_DAYSconstant andtrialActivefield. - Day keys are parsed back into dates from their explicit year/month/day components.
new Date("2025-03-04")is interpreted as UTC midnight and lands on the previous day in any negative UTC offset, which would have moved keyboard focus to the wrong day for users west of UTC.
[1.0.0.3] — 2026-08-21
Fixed
- Security — XSS. Removed all four
innerHTMLassignments and thepowerbi-visuals/no-inner-outer-htmllint suppressions that accompanied them.buildMonthView(),buildWeekView(),buildSingleMonthGrid()andbuildCategoryLegend()now build DOM nodes instead of HTML strings, and every user-supplied value (event name, event category, holiday name, formatted measure) is written through.textContent, which is never interpreted as markup. - Added
sanitizeColor()andsanitizeFont()so format-pane values are validated before they reach a style attribute. - Added input validation in
parseDataView(): unparseable dates are skipped, control characters are stripped from event and holiday names, and measure values are checked withisFinite(). renderLandingPage()andshowUpgradePrompt()rebuilt with DOM nodes.- License check now compares
plan.stateagainst the numericServicePlanState.Activeinstead of the string"Active".
[1.0.0.2] — 2026-08-17
Fixed
- First attempt at the XSS remediation above. Superseded by 1.0.0.3, which completed the conversion away from
innerHTML.
[1.0.0.1] — 2026-08-14
Fixed
- Resizing hid calendar rows. Day cells carried a fixed
min-height: 40px, so a 5–6 row grid had a minimum height above 240px and the bottom rows were silently clipped byoverflow: hiddenwhen the visual was made smaller. Cells now usemin-height: 0andflex: 1, distributing the available height evenly across week rows at any size. - Added
min-height: 0at every level of the flex chain so flex shrink propagates through the nested column layouts. - Added
flex-shrink: 0to the navigation bar, view toggle, day-name header and legend so the controls never yield their space to the grid. - Applied to both month and week view.
[1.0.0.0] — 2026-08-13
Added
Core visual
- Month view with KPI heatmap — gradient coloring from min to max across visible days
- Configurable heatmap colors: min, max, and no-data color pickers
- Day number styling: font size, family, color; separate weekend and holiday colors
- Previous/Next navigation buttons for month and week views
- Keyboard accessibility (
supportsKeyboardFocus) - Cross-page filtering via Power BI
selectionManager - Right-click Power BI context menu support (
showContextMenu) - Landing page support (
supportsLandingPage) - Highlight support (
supportsHighlight) - Multi-visual selection (
supportsMultiVisualSelection) - Filter state synchronization (
supportsSynchronizingFilterState)
Events
- Event badges with automatic per-category color palette (auto mode)
- Per-category event color configuration: up to 8 categories, one color picker each — Pro
- Color legend rendered in-visual below Month/Week navigation buttons
- Single global event color mode with
useGlobalColortoggle (when ON, single "Event Color" picker overrides category colors) - Event badge text color and font size configuration — Pro
- Max events per day (month view) — Pro
Views
- Week view — Pro
- Multi-month view: 1–12 months side by side — Pro
- Configurable default view (month/week), week start day (Sun/Mon), fiscal calendar with start month offset
Data roles
date— calendar date (Grouping)mainMeasure— KPI measure for heatmap (Measure)secondaryMeasures— tooltip-only measures, multiple fields supported (Measure)eventName— event badge label (Grouping)eventCategory— event color grouping (Grouping)holidayName— holiday overlay label (Grouping)
Format pane
- Calendar: Default View, Months to Display, Week Starts On, Fiscal Calendar, Fiscal Year Start Month
- Heatmap Colors: Min Color, Max Color, No Data Color
- Day Number: Font Size, Font Family, Color, Weekend Color, Holiday Color
- Events: Show Events, Max Events per Day, Single color for all events, Event Color (conditional), Event Text Color, Event Font Size
- Event Category Colors (c0–c7): one picker per category — Pro
- Measure Labels: Font Size, Font Family, Color — Pro
- View Buttons: Active Button Color, Button Text Color — Pro
Freemium
- Free tier: 1 month view, heatmap, 1 event/day, auto category colors, holidays, tooltip measures, filtering
- Pro tier ($9.99/month): all Free features + multi-month, week view, configurable events/day, per-category colors, full format pane
- 30-day full Pro trial on first install — no payment required
- Upgrade toast when Free-tier user attempts a Pro-only action
Documentation
support.html,terms.html,privacy.htmlpublished to GitHub Pagesdocs/CERTIFICATION-NOTES.mddocs/TIPS-AND-HINTS.md+docs/TIPS-AND-HINTS-PLAIN.txtdocs/WEBSITE-PRODUCT-PAGE.mddocs/YOUTUBE-DESCRIPTION.txtdocs/YOUTUBE-TAGS.txt