Skip to content

Latest commit

 

History

History
1301 lines (981 loc) · 61.8 KB

CHANGELOG.md

File metadata and controls

1301 lines (981 loc) · 61.8 KB

➤ Changelog

All notable changes to this project will be documented in this file.

The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.

📖 Table of Contents

➤ Table of Contents

➤ 0.21.0 - 23.04.2026

Highlights

  • 🔑 Personal Access Tokens: Regular users can now mint their own API tokens from Settings > API tokens, with per-token permission scopes, tenant-level kill switch, and full admin visibility (#1370, #1371)
  • 🛡️ Critical QA Fixes: Closed an open-redirect after OAuth login, fixed a bogus success: false from submitPeriod, restored AD user search, and made Home/Reports tolerant of malformed URL state (#1365)
  • 📊 Reports UX Overhaul: ViewColumnsPanel gains Reset/Save/Cancel, multi-project filter for custom queries, compact date headers in Summary, and a fresh Excel export that reads the live column state (#1372, #1373)
  • 📱 Mobile Summary Visibility: Fixed invisible hours in the Timesheet Summary card layout on mobile (#1364)
  • 🧱 List Column Sizing Rewrite: Dropped the localStorage persistence layer in favour of content-sampled initial widths with admin-set minWidth/maxWidth/idealWidth as the single source of truth (#1375)

Added

  • Personal Access Tokens (#1370)
    • New "API tokens" tab in User Settings for self-service token creation (name, expiry, permission picker)
    • Server: ApiToken type gains type and userId; RequestContext gains tokenSource; handleTokenAuthentication populates userId for PATs so actions are attributable
    • New PersonalAccessTokenResolver enforces a permission-subset rule (users cannot grant permissions they don't hold)
    • Tenant-level security.personalAccessTokensEnabled kill switch in Subscription Settings
    • Admin API Tokens page shows a token type column and can revoke any user's PATs
    • English and Norwegian i18n keys
  • PAT actor fallbacks (#1371)
    • userId is used as the actor when PAT-authenticated requests lock periods or invite external users
    • Report-link writes no longer fail on missing interactive user.displayName
  • ViewColumnsPanel: Reset / Save / Cancel (#1372)
    • Snapshot / revert support at the top of the panel so users can experiment without committing
  • Custom query report: Excel export + multi-project filter (#1372)
    • Export button added, filter card runs full width, project picker uses the InteractionTag multi-select pattern
    • Server: ReportsQuery gains a projectIds array field for multi-project filtering
  • Autosize for list column widths (#1375)
    • New estimateColumnWidth helper samples the first N rows of plain-text columns to pick a sensible initial width; columns using onRender / renderAs fall back to their configured idealWidth / defaultWidth rather than guessing
    • New autoSizeColumns (default true) and autoSizeSampleSize (default 50) props on IListProps

Changed

  • Excel export: single source of truth for columns (#1373)
    • Removed the hardcoded hiddenFromExport column property; export now respects the ViewColumnsPanel visibility state, which is already persisted per list
    • useExcelExportCommand reads context.state.columns (live user selection) instead of context.props.columns (static defs)
    • Reports defaults cleaned up: startDateTimeShort / endDateTimeShort, startEndDateTime, and period hidden by default; full startDateTime / endDateTime visible by default
  • Excel export: stale column state fix (#1372)
    • Export now reads column visibility from localStorage at export time instead of via useBrowserStorage (which only snapshots at mount)
  • Summary report: compact layout (#1372)
    • Date headers show 23-29.03 instead of 23 - 29 Mar; employee column widened to 190px
  • DataGrid column width ceiling (#1372)
    • Column widths capped at 2000px to prevent runaway last-column sizing
  • List column sizing: persistence removed (#1375)
    • useColumnWidthPersist hook deleted; the previous implementation wrote to localStorage with a key derived from column keys, which silently collided across lists that shared column-key sequences
    • persistColumnWidths prop removed from IListProps and from ReportList
    • Extracted MAX_COLUMN_WIDTH (2000), DEFAULT_MIN_WIDTH (50), and character/padding constants into client/components/List/hooks/columnSizing.ts

Fixed

  • Open redirect after OAuth login (#1365)
    • server/routes/auth.ts validates redirectUrl and rejects non-relative / protocol-relative paths, matching the guard already present on the session-injection route
  • submitPeriod returning success: false on success (#1365)
    • Copy-paste bug in TimesheetResolver.ts; the success path now returns { success: true }
  • AD user search returning empty results (#1365)
    • graph_users.ts projection was stripping all user fields; explicitly includes every ActiveDirectoryUser field alongside the text score
  • Malformed URL state crashing Home / Reports (#1365)
    • getUrlState, useHome, and useCustomQueryFilterCriterias now silently ignore bad base64 / JSON instead of throwing during render
  • Summary view hours invisible on mobile (#1364)
    • Fluent UI v9 applies column widths as inline styles; on the mobile card layout this collapsed the value column to 0px. .cell / .treeGridCell now use width: 100% !important inside the max-width: 600px media query, while .selectionCell stays auto so the checkbox isn't affected
  • Auth hardening and client stale-state (f72ff5ef5)
    • authChecker treats an empty permissions array as unauthenticated
    • Added missing dependencies to useCustomers, useProjects, EventList/useColumns, and Timesheet hotkeys so stale provider/context values no longer leak through
    • useApp activity detector effect now returns its cleanup so event listeners don't leak on remount
    • Disabled Apollo variable reporting in setupGraphQL and tightened related types
  • Shared layer decoupled from server (f72ff5ef5)
    • Introduced IHolidayObject interface in shared/types/; removed server imports from shared/

Infrastructure

  • Webpack (f72ff5ef5, #1372)
    • Production builds use MiniCssExtractPlugin to emit a stylesheet instead of inlining CSS
    • BundleAnalyzerPlugin wired up behind --analyze
    • Watch polling enabled so the Docker macOS volume mount picks up changes
  • Docker bootstrap hardening (e2faefa11)
    • scripts/docker.sh: ensure_env_file now seeds from .env.sample instead of writing a minimal stub
    • New check_required_env warns on missing / placeholder SESSION_SIGNING_KEY and API_TOKEN_SECRET
    • mongo-express and redis-commander credentials read from env vars (ME_BASICAUTH_USERNAME/PASSWORD, HTTP_USER/HTTP_PASSWORD) with sensible defaults
    • Pinned redis-commander image by digest instead of :latest
    • .env.sample documents the admin-tool credential vars
  • Version bump tooling (this release)
    • .tasks/updateVersion.js now scaffolds .changelog/<version>.md from a stub and prepends the [[load:...]] directive to .changelog/CHANGELOG.md, so future bumps don't need manual changelog plumbing
  • .gitignore cleanup (947e04130, #1375)
    • Removed stale temporary and documentation-related entries
    • Added did-*/ so local git worktrees stay untracked

Documentation

  • Docker docs corrected (#1367)
    • Fixed absolute-vs-relative script paths in docker/DOCKER.md (/scripts/... -> ./scripts/...)
    • Corrected the MongoDB collection name from timeentries to time_entries in docker/data/README.md and docker/DOCKER.md
    • Replaced the non-existent npm run docker:setup reference with ./scripts/docker.sh start in docker/sample-data/README.md
  • Personal Access Tokens design spec and implementation plan checked in under planning docs (#1370 follow-ups)
  • /did skill and did-cli design spec and implementation plan checked in for the upcoming Claude Code integration

Verification

  • npm run lint passes
  • npm run build:server passes
  • npm test passes (2565 tests, including new estimateColumnWidth unit tests)

➤ 0.20.0 - 16.03.2026

Highlights

  • 📦 Dependency Upgrade Sweep: Upgraded core runtime, build, and UI dependencies across client and server
  • 🧰 Lint Stack Modernized: Upgraded @typescript-eslint parser/plugin to support TypeScript 5.9
  • 🚀 Client Output Target Updated: Raised client TypeScript target from ES5 to ES2018 for modern browser environments
  • 🐛 ISO Week/Year Bug Fix: Fixed long-standing inconsistency in DateObject.toObject for ISO week/year calculations (#1027)
  • 📅 Cleaner Timesheet View: Empty weekend days (Sat/Sun) are now hidden in the timesheet overview

Changed

  • Tooling & TypeScript

    • Upgraded typescript to 5.9.x
    • Upgraded @typescript-eslint/eslint-plugin to 8.56.1
    • Upgraded @typescript-eslint/parser to 8.56.1
    • Kept eslint on 8.57.1 (compatible with the upgraded TypeScript ESLint stack)
    • Added skipLibCheck: true to root tsconfig.json to handle type inconsistencies across upgraded third-party declarations
    • Fixed export type for type-only re-exports (FetchPolicy, IDatePeriod) for isolatedModules compatibility
  • Client Build Configuration

    • client/tsconfig.json: compilerOptions.target changed from es5 to es2018
  • Dependencies

    • Upgraded multiple core dependencies, including Apollo Server, Fluent UI packages, GraphQL, TypeGraphQL, Webpack, Sass, and related typing packages
    • Removed node-fetch — replaced by native fetch (requires Node ≥18, already enforced by engines field)
    • Moved @types/mongodb, @types/react-window from dependencies to devDependencies
    • Removed @primer/css — no longer used after EntityLabel refactor
  • Docker Development Workflow

    • Added .tasks/runDockerWatch.js: smart wrapper that runs npm ci only when package.json or package-lock.json has changed, with up to 3 retries, then falls through to npm run watch
    • Dockerfile CMD updated to use runDockerWatch.js instead of invoking npm run watch directly
    • Simplified docker:rebuild:watch npm script to use docker compose up --build
  • Scripts & Project Structure

    • Moved .scripts/ → scripts/ and .deploy/ → scripts/ for cleaner top-level layout
    • Updated .dockerignore to reflect new script paths
  • EntityLabel Component

    • Replaced @primer/css mixin-based styles (labels-base, labels-large) with self-contained CSS in EntityLabel.module.scss, removing the external CSS framework dependency
  • Timesheet Overview

    • Empty weekend days (Saturday/Sunday) are now hidden in the timesheet overview, reducing visual clutter

Fixed

  • Fixed ISO week/year bug in DateObject.toObject where week number and year could be inconsistent around year boundaries (#1027), with new test coverage

Documentation

  • Added changelog entry for version 0.20.0
  • Added detailed AGENTS.md files for client/, server/, shared/, docker/, and webpack/ contexts; refactored root AGENTS.md to reference them
  • Updated issue and pull request templates for clarity and consistency
  • Updated README logo to use gradient SVG matching the landing page (#1355)
  • Removed outdated holiday configuration document from the previous docs/ path
  • Moved DOCKER.md to docker/DOCKER.md

Verification

  • npm run lint passes with TypeScript 5.9-compatible lint tooling
  • npm run build:server passes
  • npm run package:client passes
  • npm test passes (506 tests)

➤ 0.19.0 - 20.01.2026

Highlights

  • 🎨 Major UI Framework Migration: Completed migration from Fluent UI v8 to v9, bringing modern design, better performance, and improved accessibility
  • ♻️ List Component Rewrite: Completely rewrote List component using DataGrid and TreeGrid for better performance and maintainability
  • 🎯 Icon System Overhaul: Migrated to Fluent UI v9 icon system with fallback handling and improved developer experience

Added

  • New Components

    • DataGrid-based List component with improved selection and grouping
    • TreeGrid support for hierarchical list structures
    • Skeleton loading states replacing legacy Shimmer components
    • v9 Dialog component replacing Modal
    • v9 Drawer component replacing Panel
  • Icon System

    • ErrorCircle fallback icon for missing icons in catalog
    • Development mode console warnings for missing icons
    • Support for bundled filled/regular icon variants
  • Types & Enums

    • SelectionMode enum (string-based: 'none', 'single', 'multiple')
    • CheckboxVisibility enum ('hidden', 'onHover', 'always')
    • Enhanced IListColumn interface with v9-compatible properties
  • Dependencies

    • @fluentui-contrib/react-tree-grid ^0.3.2 for hierarchical lists

Changed

  • Theme System

    • Removed legacy ThemeProvider and PortalCompatProvider
    • Simplified to single FluentProvider (v9 only)
    • Body background and text colors now applied via useEffect
    • Removed fonts.ts and legacy theme complexity
    • Dark theme updated with GitHub-inspired colors
  • List Component (Breaking Changes - See Migration Guide)

    • Migrated from ShimmeredDetailsList to DataGrid and TreeGrid
    • Removed ListGroupHeader and ListHeader subcomponents
    • Selection state management optimized (single-pass computation)
    • Removed props: onItemContextMenu, onColumnResize, dragDropEvents, listProps
    • enableShimmer now uses Skeleton instead of Shimmer
    • Column resizing not implemented (isResizable prop accepted but non-functional)
  • Icon Handling

    • Replaced getFluentIconWithFallback with enhanced getFluentIcon
    • Icons now use v9 bundled icon system
    • Missing icons show ErrorCircle fallback instead of silent failure
    • All icon imports updated to @fluentui/react-icons
  • Component API Updates

    • Modal → Dialog with open/onOpenChange instead of isOpen/onDismiss
    • Panel → Drawer with v9-compatible props
    • Checkbox label prop now supports complex ReactNode content
    • ContextualMenu → Menu with v9 menu components
    • format function now uses string-format package (API-compatible)
  • Import Paths

    • DateRangeType, DayOfWeek now from @fluentui/react-calendar-compat
    • SelectionMode, CheckboxVisibility now from components/List/types
    • All icon components from @fluentui/react-icons

Fixed

  • Critical Issues

    • Icon system now has proper fallback mechanism (no more null icons)
    • Theme component cleanup prevents memory leaks on unmount
    • Dialog onDismiss only called once on close (not multiple times)
    • List selection state optimized to prevent unnecessary re-renders
  • Performance

    • Removed redundant itemMeta Map in List component
    • Combined three separate useMemo hooks into single-pass computation
    • Filter panel signature-based deduplication prevents infinite loops
  • UI Fixes

    • ProjectList component rendering fixed for v9
    • Unmatched time entries rendering corrected
    • Mobile breadcrumb authentication check relocated
    • ScrollablePane replaced with CSS sticky positioning in LabelPicker

Documentation

  • Migration Guide: Created comprehensive _doc/MIGRATION_V8_TO_V9.md (250+ lines)

    • Documents all breaking changes with code examples
    • Workarounds for removed features
    • Testing checklist
    • Known limitations
  • Code Review: Created _doc/review/CODE_REVIEW_PR1328.md

    • Detailed analysis of critical, high, and medium priority issues
    • Prioritized TODO list for fixes
  • Fix Summary: Created _doc/review/FIXES_APPLIED.md

    • Complete documentation of all fixes applied
    • Before/after comparisons
    • Testing recommendations
  • Type Documentation: Enhanced inline documentation

    • SelectionMode enum with import warnings
    • IListColumn.isResizable documented as non-functional
    • CheckboxVisibility enum values explained

Testing

  • Manual testing required for:
    • List selection (single/multiple modes)
    • Icon rendering with missing/undefined names
    • Theme switching
    • Filter panel interactions
    • LabelPicker checkbox labels with SubText
    • HotkeyModal open/close cycles

Internal

  • Code Quality

    • Removed duplicate conditions in filter logic
    • Optimized filter panel with useCallback and useRef
    • Enhanced error handling with dev mode warnings
    • Added ESLint disables with explanatory comments
  • Type Safety

    • Updated component types to use v9 ButtonProps
    • Enhanced IColumn interface for v9 compatibility
    • Removed v8 type dependencies
  • Build System

    • Package.json updated to Fluent UI v9 packages
    • Removed legacy v8 dependencies

Notes

Known Limitations:

  • Column resizing not implemented in new List component
  • Drag and drop not supported in new List component
  • Row context menus must be implemented in column render functions

➤ 0.18.0 - 08.01.2026

Highlights

  • Complete holiday management system for accurate timebank calculations
  • Full CRUD UI for configuring national and company-specific holidays
  • Norway holiday preset with automatic Easter calculation
  • Comprehensive validation, error handling, and timezone-safe date handling

Added

  • Holiday management UI in Admin > Subscription Settings (#1325)
  • Full CRUD interface with DataGrid for managing holidays (add, edit, delete)
  • Import from country presets (Norway with 13 holidays including movable Easter dates)
  • Automatic Easter calculation using Anonymous Gregorian algorithm for movable holidays
  • Holiday configuration affects timebank calculations by reducing expected work hours
  • Validation for holiday dates (ISO format), names (1-100 chars), and hours (0-8 in 0.25 increments)
  • Real-time warnings for duplicate dates, weekend holidays, and leap year issues (Feb 29)
  • Support for recurring and non-recurring holidays
  • Support for half-day holidays (e.g., New Year's Eve: 4 hours)
  • Timezone-safe date handling with ISO date strings (YYYY-MM-DD)
  • HolidayValidationError class for structured error reporting
  • Comprehensive validation functions: validateHolidayDate(), validateHolidayName(), validateHoursOff()
  • Easter calculation functions: calculateEasterSunday(), generateMovableHolidays()
  • Helper functions: isWeekend(), findDuplicateHolidays(), getWorkingDaysInPeriod()
  • Performance optimizations with useMemo in useWorkWeekStatus hook
  • Comprehensive unit test suite with 50+ test cases covering all scenarios
  • Internationalization: Added 25 new holiday-related labels (en-GB, nb, nn)
  • Documentation: Complete HOLIDAY_CONFIGURATION.md guide (312 lines)

Changed

  • useWorkWeekStatus hook now accounts for holidays when calculating timebank
  • Enhanced getHolidayHoursInPeriod() with error handling, validation, and logging
  • Improved HolidaysField component with proper TypeScript types (replaced all any types)
  • Updated subscription settings to include holidays configuration section
  • Timebank calculations now subtract holiday hours from expected work hours
  • Error handling throughout with try-catch blocks and graceful fallbacks

Fixed

  • Fixed type safety issues in holiday configuration (eliminated all any types)
  • Fixed timezone handling to prevent date shifts across timezones
  • Fixed leap year handling for Feb 29 holidays (warns and skips in non-leap years)
  • Fixed silent calculation failures with comprehensive error logging
  • Fixed missing validation for negative hours, excessive hours, and invalid date formats
  • Fixed performance issues with memoization of holiday calculations

Documentation

  • Added comprehensive HOLIDAY_CONFIGURATION.md with architecture overview, configuration guide, API reference, and troubleshooting
  • Updated CODE_REVIEW_PR1326.md with detailed implementation notes and resolution summary
  • Added JSDoc comments for all holiday utility functions
  • Documented timezone handling strategy and edge cases
  • Included best practices and known limitations sections

Testing

  • Created holidayUtils.test.ts with 50+ test cases (413 lines)
  • Test coverage: validation, timezone handling, Easter calculations, holiday hours calculations, edge cases
  • All critical paths tested including cross-year periods, recurring holidays, and error scenarios

Internal

  • Refactored holiday utilities into reusable validation and calculation functions
  • Improved error handling with structured error classes
  • Enhanced code quality with proper TypeScript interfaces
  • Performance optimizations with React hooks memoization
  • Separated timezone logic into dedicated helper functions

Notes

This release introduces a complete holiday management system that ensures accurate timebank calculations during holiday periods. Without holiday configuration, employees working during weeks with national holidays would incorrectly show negative timebank balances. The system supports both fixed holidays (recurring annually) and movable holidays (e.g., Easter-related), with automatic calculation for movable dates. The implementation includes comprehensive validation, error handling, and timezone-safe date operations.

Example: Week 52 2025 (Dec 22-28) with 3 Norwegian holidays (Dec 24-26, 24 hours total) now correctly reduces expected hours from 40 to 16, preventing incorrect negative timebank for employees who work only Mon-Tue (16 hours).

➤ 0.17.0 - 16.12.2025

Highlights

  • Bulk edit capability for projects and customers
  • Enhanced error handling and delta link management for Entra ID user synchronization
  • Major dependency updates with security vulnerability fixes
  • Improved environment configuration management
  • Better Developer experience; removed localtunnel dependency in favor of Cloudflare Tunnel reverse proxy support

Added

  • Bulk edit capability for projects and customers (#1314)
  • New updateProjects and updateCustomers GraphQL mutations
  • Multi-selection support in ProjectList and CustomerList
  • Enhanced error handling in user sync mutations with improved feedback
  • Delta link expiration handling in MSGraphDeltaService
  • Extended query timeout support for Entra ID user sync operations
  • Progress indicators for user synchronization operations
  • did.instructions.md agent instruction file for development workflow
  • Reverse proxy and Cloudflare Tunnel support for dynamic OAuth callback URLs
  • New getCallbackUrl utility function for constructing OAuth URLs based on incoming request
  • Debug logging for proxy requests in development mode
  • Comprehensive documentation for reverse proxy setup in REVERSE_PROXY_SUPPORT.md

Changed

  • Bulk edit panels pre-populate shared field values and reuse common form controls
  • Opening the bulk edit panel immediately snapshots the selected items for a stable editing experience
  • Improved error handling and delta link management for Microsoft Graph API integration (#1321)
  • MSGraphDeltaService now gracefully handles expired delta links with automatic fallback to full sync
  • User sync mutations now return structured error information to the client
  • Refactored dotenv configuration for streamlined environment management (#1315)
  • Consolidated .env.sample files - removed separate production sample in favor of unified configuration
  • Updated .gitignore to better manage environment files
  • Updated all project dependencies to latest stable versions with security patches
  • Migrated from deprecated @octokit packages to current versions
  • Replaced deprecated string-strip-html type definitions
  • Enhanced type safety in GitHub service with proper numeric conversions using parseInt
  • Express app now trusts proxy headers (X-Forwarded-Proto, X-Forwarded-Host) for proper URL construction behind reverse proxies
  • OAuth redirect URIs (MICROSOFT_REDIRECT_URI, GOOGLE_REDIRECT_URI) are now optional - app dynamically constructs callbacks based on incoming request
  • Azure AD and Google OAuth strategies now support dynamic callback URL construction per request
  • Webpack configuration handles missing MICROSOFT_REDIRECT_URI gracefully with localhost fallback
  • Docker Compose override configuration updated to handle optional redirect URI environment variables
  • Session storage enhanced to preserve original request protocol and host for OAuth flows

Fixed

  • Bulk project updates stringify the extensions payload to satisfy the GraphQL schema
  • Bulk project and customer mutations always include updated labels and no longer drop selection while editing
  • Delta link expiration now properly triggers full sync fallback instead of failing
  • User sync operations no longer fail silently on delta link errors
  • Security vulnerabilities in dependencies resolved through major update
  • Deprecated @types/string-strip-html dependency removed
  • Type safety issues in GitHub service numeric conversions

Documentation

  • Added did.instructions.md for AI coding assistants
  • Improved documentation for user synchronization error handling
  • Updated environment variable documentation with simplified .env.sample

CI / Chores

  • Removed unused defaultChecked prop from NavigatePeriodsButtons component
  • Cleaned up package-lock.json to remove deprecated Octokit dependencies
  • Version bump to 0.17.0

Internal

  • Refactored numeric string conversions in GitHub service for better type safety
  • Improved code quality with explicit parseInt usage over implicit number coercion

Notes

This release focuses on bulk editing capabilities, enhanced synchronization reliability, dependency maintenance, and developer experience improvements. The addition of reverse proxy support enables seamless deployment behind Cloudflare Tunnels and other reverse proxies, with OAuth callbacks automatically adapting to the incoming domain without requiring multiple environment configurations.

➤ 0.16.1 - 30.10.2025

Highlights

  • Dedicated permission for locking/unlocking weeks
  • New "Partner" field on Customer Projects
  • Entra ID user search backed by MongoDB graph_users cache and Microsoft Graph delta sync

Added

  • New LOCK_UNLOCK_WEEKS permission (a7b8c9d0) protecting the lockPeriod mutation.
  • Added "Partner" field to Customer Project to support subcontractor billing workflows (#1301).
  • Introduced Entra ID user search with persisted graph_users collection and delta retrieval to keep cached profiles fresh (#1306).
  • Enhanced User Management form with autocomplete search for Entra ID users including automatic loading, performance optimizations, and visual distinction for already-added users (#1306).

Changed

  • Role permissions for authenticated users are now resolved dynamically per request (no logout required after role updates).
  • Webpack Git metadata integration now auto-disables when git or .git are unavailable (falling back to environment variables or unknown), preventing dev container build failures.
  • Express fallback error response changed from 401 to 404 to reduce noisy Unauthorized logs for missing/static assets.
  • JSON 404 responses returned for API/GraphQL style requests and clients that explicitly accept JSON.
  • Applied employment date filtering to Week Status user queries so inactive users no longer appear in reporting (#1290).
  • Improved User Management UX by removing manual "Load users from Entra ID" button and implementing automatic loading on panel open (#1306).
  • Enhanced autocomplete performance with Set-based O(1) lookups and React memoization for large user datasets (#1306).
  • Added persistent form state management ensuring search checkboxes maintain values across all user interactions (#1306).
  • Hardened manager enrichment service with production-ready error handling, distributed worker coordination, and heartbeat monitoring (#1306).

Fixed

  • Development watch task crash due to incorrect concurrently promise handling (removed .result usage; added robust promise resolution).
  • Silent failure to start webpack watcher inside Docker because .tasks directory was ignored; adjusted .dockerignore to include only watch.js.
  • Potential build crash when git binary absent (now gracefully skipped).
  • Reduced log noise by suppressing morgan output for 404 static asset requests (hashed bundles / images between rebuilds).
  • Fixed UserVacation tooltip ref error by forwarding refs through the MenuItem component to the underlying Fluent UI primitive (#1304).
  • Resolved checkbox state persistence issues in User Management form ensuring includeUsersWithoutGivenName and showAlreadyAddedUsers maintain values during form operations (#1306).
  • Fixed autocomplete disabled item styling and selection behavior for already-added users (#1306).
  • Enhanced manager enrichment service with exponential backoff retry logic, rate limiting protection, and comprehensive error categorization (#1306).

CI / Chores

  • Added helper npm scripts docker:watch and docker:rebuild:watch for a canonical rebuild/start workflow without wiping MongoDB volumes.
  • Added diagnostic logging to watch script (explicit process start lines, colored prefixes, failure summaries).
  • Improved resilience of dev build by auto-detecting absence of Git and avoiding unnecessary image bloat.

Internal

  • Version bump to 0.16.1

Notes

This release focuses on permission granularity, session freshness and developer experience improvements.

➤ 0.16.0 - 24.09.2025

Highlights

  • Deterministic Docker startup (Redis healthcheck + sequencing) eliminates race conditions
  • Reproducible Docker builds with lockfile-only install, retry/backoff, and embedded git revision & branch
  • Seed data insight & safety: size logging, --status non-destructive mode, placeholder secret detection
  • Dynamic multi-arch capable build (env-driven platform selection) & normalized image naming
  • Security & hygiene: tighter .dockerignore, secret warnings, reduced context footprint
  • Expanded developer guidance: new AGENTS.md, consolidated Docker docs, accessibility & i18n/testing standards
  • Auth routing refined so static assets & API routes are public while protected routes remain gated

Added

  • Redis healthcheck and deterministic service startup in Docker Compose
  • File size logging for MongoDB seed data import
  • Placeholder secret detection, seed summary, and --status flag in docker-quickstart.sh
  • Common reset recipes and security notes in DOCKER.md
  • Git build metadata embedding (revision & branch) in Docker/Webpack build
  • Dynamic Docker build platform selection (env-driven)
  • Normalized Docker image naming for consistent tagging
  • Central AGENTS.md developer reference (architecture & workflows)
  • Accessibility requirements and expanded i18n/component/testing standards documentation

Changed

  • Enforced lockfile integrity in Dockerfile (removed fallback to npm install)
  • Updated .dockerignore to exclude secrets and seed data
  • DOCKER.md condensed and clarified for onboarding and troubleshooting
  • Resilient npm install with retry/backoff & caching improvements in Dockerfile
  • Authentication routing updated to treat static assets & API routes as public
  • Consistent lowercase project naming (did)
  • Adopted modern docker compose command syntax
  • Increased Docker build test timeout to 300s
  • Redis cache port configurability added
  • Standardized MongoDB database name to main across code and docs

Fixed

  • Removed unused code, comments, and documentation from Docker scripts and configs
  • Startup race conditions mitigated via healthcheck sequencing
  • Prevented omission of Webpack assets from Docker build context

Documentation

  • Expanded Docker quickstart, troubleshooting, and security guidance
  • Added central architecture & workflow reference (AGENTS.md)
  • Clarified seed import/reset process & non-destructive status mode
  • Added accessibility & development standards (i18n, data management, component structure, testing)

CI / Chores

  • General QA and refactor of Docker-related files

Internal

  • Version bump to 0.16.0

Notes

This release focuses on dockerization, developer experience, and security hygiene for local development.

➤ 0.15.11 - 15.09.2025

Added

  • Account enabled checkbox added to the User form (enabled even when syncing from AAD)
  • Subscription settings now allow optionally syncing "accountEnabled" from AAD
  • Lazy loading for Active Directory users in bulk import panel with "Load Users" button
  • Search functionality for Active Directory (Entra ID) users with server-side filtering
  • Progress indicators for Entra ID user loading operations
  • Add New User panel now supports lazy loading of Entra ID users and local filtering in the picker
  • Internationalization: added new labels for Entra ID user loading and user sync menu (en-GB, nb, nn)

Changed

  • Default bulk user sync no longer includes "accountEnabled" unless explicitly selected
  • Performance: Entra ID users (≈19k) no longer fetched on initial page load, improving Admin > Users load time from ~5s to ~500ms
  • User synchronization menu now shows context-aware text (all users vs. selected users)
  • Bulk import panel now requires explicit "Load Users from Entra ID" action instead of auto-loading
  • User sync operations now load Entra ID users on-demand with progress messaging
  • Add New User panel no longer performs server-side search after initial load; uses client-side filtering
  • Sync action is disabled while Entra ID users are loading, with contextual progress text

Fixed

  • Eliminated performance bottleneck caused by fetching all Entra ID users on every Admin > Users page load
  • Fixed AVA test runner configuration (ESM loader cycle) that caused all tests to fail
  • Minor adjustment to Google Calendar service

Documentation

  • Added CLAUDE.md with project guidance and development instructions
  • Updated Copilot and contributor instructions

CI / Chores

  • Enhanced and refactored automatic chores workflow (creation, PR behavior)
  • Disabled automatic chores workflow (temporarily) for stability
  • Updated contributors list

Internal

  • Version bump to 0.15.11

Notes

This release focuses on significant scalability improvements for large Entra ID tenants and lays groundwork for more responsive administrative workflows.

➤ 0.15.10 - 01.04.2025

Added

  • Minor fix for labels in Reports #1281

➤ 0.15.9 - 01.04.2025

Added

  • Added support for including project labels in reports #1281

➤ 0.15.8 - 26.03.2025

Fixed

  • Improved administration of subscription setting security.domainRestrictionExternal.

➤ 0.15.7 - 25.03.2025

Fixed

  • Fixed an issue with the customer projects query on the customer page.

➤ 0.15.6 - 24.03.2025

Changed

  • Reload button not available when a period is confirmed

➤ 0.15.5 - 20.03.2025

Added

  • Added support for enabling maintenance mode

Changed

  • Added "Reload" button to timesheet to fetch fresh data from Microsoft Graph without using cache
  • Refactored server routes with improved error handling during page rendering
  • Added Terms of Service and Privacy Statement pages with initial content

➤ 0.15.4 - 20.03.2025

Changed

  • Added health check endpoint /health_check to the backend

➤ 0.15.3 - 20.03.2025

Changed

  • Now running on Node 22 LTS
  • Refactored user context handling into session context, improving initialization flow and type safety
  • Proper link styling for links in the Markdown component

➤ 0.15.1 - 19.03.2025

Fixed

  • Fixed critical bug in SummaryView for Timesheet page that caused the component when there were unmatched events

➤ 0.15.0 - 19.03.2025

Fixed

  • Improvements to the EventList rendering in the ProjectPopover component in the SummaryView
  • Users with no hours in selected periods are now filtered out in the SummaryView

➤ 0.14.18 - 18.03.2025

Fixed

  • Removed unneccessary margin from the EventList component

➤ 0.14.17 - 18.03.2025

Fixed

  • Enhanced ProjectPopover with support for extra content (f.ex. EventList) and improved component structure for better project information display

➤ 0.14.16 - 18.03.2025

Fixed

  • Updated UserPicker component to use TagGroup and InteractionTag components for better accessibility and user experience
  • Enhanced form validation with connected fields support in BaseControlOptions and useFormControl
  • Modified the CLEAR_VALIDATION_MESSAGES action to accept an optional string array of field names for selective validation clearing
  • Fixed path reference for roleDefinitions in useRoleDefinitions.ts to properly access nested properties
  • Added maxSuggestions parameter to SearchCustomer and ProjectPicker components for better performance
  • Removed outdated removeUserDbClick message from i18n files (en-GB, nb, nn)

➤ 0.14.15 - 17.03.2025

Changed

  • Enhanced roles and permissions management UI
  • Increased time entries loading capabilities + support for custom filters #1220

Fixed

  • Fixed an issue with project roles when manually matching in the UI

➤ 0.14.12 - 13.03.2025

Added

  • Added support for deleting a customer #1165

Fixed

  • Fixed hourly rate calculation in project time entries by ensuring proper handling of undefined/null values
  • Improved field default values for list input controls
  • Added empty message for project time entries when autoload is disabled
  • Fixed hourly rate display in UserColumn by properly rounding hourly rates

➤ 0.13.3 - 25.02.2025

Fixed

  • Fixed layout issue in Project Popover in Timesheet #1196
  • Fixed issues with importing users from Entra ID #1230

Changed

  • Improved readability on customer information page #1214
  • Improved readability on project information page #1219
  • Add support for setting default tab on Project page #1236

Added

  • Feature to select color preset for Outlook categories #1213
  • Basic functionality for Budget Tracking #1217
  • You know know add a security group in subscription settings, users in this group will be automatically enrolled in did #1182
  • Customer and Project key max length is now configurable in subscription settings #1231
  • Initial support for enhancing the resource management capabilities within the Projects module of our time entry system. #1237
  • Showing week hours summary based on user work week #1138
  • Manager included in user sync #1244
  • Support for simple project hierarchy #1245
  • Support for locking weeks from the admin UI #1249
  • Enhancements to the Project Role Management #1245
  • Add Parent Project to reports and Excel export #1253

➤ 0.13.2 - 22.02.2024

Fixed

➤ 0.13.1 - 21.02.2024

Fixed

➤ 0.13.0 - 21.02.2024

Fixed

  • Fix for #1112
  • Deactivated projects can no longer be selectable when resolving manually #1171
  • Fixed Icon field will now be cleared when a new project has been created #1188
  • Fixed Missing key prop on DetailsRowFields component #1147
  • Fix for action bar glitching in Timesheet #1132

Added

  • Improved general look and feel - now using the new Fluent UI 9
  • Company brand support #1170
  • Enriched Subscription Teams settings with fields for Teams reminder messages #1185
  • Added WeekStatus GraphQL API Endpoint for User Week Confirmation Status #1181

Changed

  • Better handling of signin errors #1176
  • Migrating to @apollo/server@v4 #1116

➤ 0.12.0 - 17.04.2023

Added

  • Added support for uploading formatted reports and displaying them to end-users #1096

Fixed

Changed

  • Missing submissions is not showing hidden users #1089
  • Vacation days reset per year by changing the user configuration format #1086

➤ 0.11.4 - 21.12.2022

Added

  • Visualize if a day is a public holiday #1064

Fixed

  • Fixed an issue with Timesheet navigation that makes it sometimes skip a year #1028
  • Fixed an issue with submit commands when there's no submit actions available #1070

Changed

  • Improved Project and Customer pages #1069
  • Visual upgrade for lists #1076
  • Adjustments to calculation/estimation of vacation #1080
  • Events without subject/title is now visible to the end user and displayed as an error that needs to be resolved before submitting #1082

➤ 0.11.3 - 25.11.2022

Fixed

  • Fixed issue with user reports #1077

➤ 0.11.2 - 18.11.2022

Fixed

  • Fixed issue with rounding of events #1065

➤ 0.11.1 - 18.11.2022

Fixed

  • Fixed issues with retrieving customers affecting Project creation etc #1062

➤ 0.11.0 - 16.11.2022

Added

  • Project code as filter to Reports #978
  • Added permission scope LIST_USERS #968
  • Support end early/start late: round appointments to nearest half hours #1056
  • Autofocus and up/down arrows navigation support for Autocomplete component #1058
  • Implemented month view #70

Fixed

  • Project reports includes week number #975
  • Reports performance issues #984
  • Reports infinite loops #994
  • Unconfirmed hours included in summary view #1031
  • Added total row to summary report #932
  • Fix for feedback locked #1042

Changed

  • Summary report shows current week #980
  • Moved delete button out of edit form for roles #935
  • Deleting API-keys and labels now requires confirmation #953

➤ 0.10.0 - 27.04.2021

Added

  • Support for split week, split year scenarios #753
  • Last year option added to reports #775
  • Support for deleting role #692
  • Improved Timesheet statusbar: Now showing on all tabs, and showing either shimmer or progress indicator, not both. #831
  • Nynorsk (nn-no) language support #864 (thanks to @paalolav ❤️)
  • Support for initial signin with email #884
  • Showing more details in the summary view on hover #886
  • Summary view moved to Reports
  • Differentiating 0-hour weeks from unconfirmed weeks in Summary view #781
  • Synchronize user photo from Azure AD #899
  • Breadcrumb for mobile devices
  • New user setting: Start page
  • New user setting: Sticky Navigation
  • Support for submitting feedback

Fixed

  • Issue where filtering on a report would crash the page #938
  • Issue where moving an event from a confirmed week to an unconfirmed week would cause an error #766
  • Issue where confirmed hours would be skewed forward one hour #760
  • Issue with navigating between tabs in Projects #749
  • Minor visual bug in unmatched hours #773
  • Issue with rogue customer matches in large event bodies #782
  • Issue where sunday hours would not be displayed in the UI after confirming a week #785
  • Issue with time entry queries in Reports #790
  • Issue with navigating to a customer from e.g. Timesheet #791
  • Issue with navigating directly to a page when not logged in #889
  • Consistent ignore/match buttons across devices in Timesheet #894

Changed

  • Consolidated server and client date utils #771
  • Summary view now using datepicker instead of slider #777
  • Visual improvements on the admin sections

➤ 0.9.0 - 15.12.2020

Added

  • Changes to forecast/confirm actions #605
  • Improvements to allocation view in Timesheet #644
  • Forecast notifications #613 (can be turned off in subscription settings #639)
  • Improved forecast/confirm actions #605
  • Automatic Azure Active Directory sync #661
  • Support for API tokens with scoped permissions #635
  • Export hours from user menu #589
  • Improved project tooltip/panel #678
  • When debugging, local cache is automatically cleared on first run #715
  • Improved project selector #671
  • Support for editing customers #672
  • Resizable columns in Reports #722
  • Added project tooltip to Summary view in Timesheet #677
  • Side panels are now light dismissable #734
  • Project suggestions in timesheet matching now also works for event body #705

Fixed

  • Fixed issue where ignored events were not persisted #730
  • Minor UI adjustments in Timesheet
  • Fixes in matching engine #603
  • Issue with appointments occuring around midnight Sunday #703
  • Lag in customer/project search #686
  • Reports: Current month and year in Reports included entries after today's date #738
  • Reports: Filters would persist when switching reports #733
  • Reports: Current month report bug #710
  • User settings: display language dropdown value would not change after switching language #740
  • Customers: Searching for newly created customers would return zero results #739
  • Fix for 'go to current week'-shortcut #707

Changed

  • Decreased Project and Customer keys min length to 2 #681
  • Increased Project and Customer keys max length to 12 #719

Removed

  • Dependency on moment.js removed, now using day.js instead

➤ 0.8.0 - 15.10.2020

Added

  • did now supports forecasting #355
  • Better mobile navigation with descriptive labels #539, #588
  • We now have custom error pages #502
  • Better error messages #579
  • Showing aggregated hours per group in Reports #541
  • Support for setting Projects to inactive in UI #524
  • Better log in/log out experience #485

Fixed

  • Fixed an issue with split weeks where the returned events and total hours were wrong #578
  • Missing week summary on Admin page #569
  • Could not open week picker in Timesheet under certain conditions #558
  • did now properly matches ÆØÅ in customer and project keys #550

➤ 0.7.0 - 09.09.2020

Added

  • Rebrand to just "did" #412
  • Improved reports landing page #505
  • Added customers as a separate column in the Timesheet overview #496
  • Show project ID (full key) in ProjectColumnTooltip #495
  • Enabling GraphQL to be called externally using authorization tokens #478
  • Show labels in the Summary view #461
  • Possibility of tagging projects with labels in UI #333
  • Deep linking for Projects #435

Fixed

  • Fixed soft match functionality (matching without (), [], {}) #489
  • Customer entries with leading/trailing spaces are un-matchable #426

➤ 0.6.0 - N/A

Need details.

➤ 0.5.0 - 22.5.2020

Added

  • Added toggle for showing/hiding inactive projects andcustomers #285
  • Redirect user to timesheet after logging in #303
  • Adjustments to Reports #269
  • Reports: Changed name of export button to 'Export current view' #269
  • Hotkeys for Timesheet #337
  • Summary view can be grouped by customer #242
  • Support for Norwegian #306

Fixed

  • Fix for scrollbar glitching #302

➤ 0.4.0 - 11.5.2020

Added

  • Support for split weeks #232
  • Added user column to project overview #224
  • Consolidating confirm buttons #270
  • Confirm hours disabled when there's unmatched events #268
  • Including project code in tooltip #243
  • Presenting active/inactive status for customers and projects in views #168
  • Changed chart library from highcharts to recharts due to licenses #273
  • Support for adding DID365 as an app in Microsoft Teams #170

Fixed

  • Sorted customer options alphabetically by name in summary view(s) #260

Fixed

➤ 0.3.1 - 16.04.2020

Added

  • Support for adding a project as a category in the users mailbox #202
  • Icon picker in project and customer forms #213
  • Support for using did in Teams tabs. No SSO support for now #170

Fixed

  • Using get-value module to get project.inactive and customer.inactive from event #212
  • Using .isoWeek() instead of .week() to calculate week from startTime in timesheet resolver #225

➤ 0.3.0 - 20.03.2020

Fixed

  • Set GraphService.getEvents to retrieve 500 items instead of just 50 #205
  • Fixed issue with events lasting until 00:00 #197

➤ 0.2.0 - 05.03.2020

Added

  • Validation for new project form #163
  • Validation for new customer form #164
  • Added progress indicator to Timesheet/overview #190
  • Functionality for deleting a customer #174