* Add open-source gettext extractor and translation source check
Replaces the manual Poedit Pro step for regenerating messages.pot.
The extractor covers Twig |trans literals and PHP __trans /
__pluralTrans / exception keywords, mirroring the historical Poedit
runs (validated against the May 2026 messages.pot: only obsolete
fossils differ). Also adds an informational per-PR check reporting
msgid changes, as gettext matching is case-sensitive and casing-only
changes silently invalidate translations.
* Remove AI slop from extractor and workflow
Drop the unused function, unused parameters, unreachable branches,
restating comments and oversized docstring. No behavior change:
output verified byte-identical.
* Fix actions/github-script pin to a resolvable SHA
* Refresh i18n POT header and check label
* Rename translation workflow title
* Run translation source check on ubuntu-slim
* Ignore Python bytecode cache in scripts dir
* Address review: plural edge case and workflow injection
Skip __pluralTrans calls without a complete static plural instead
of emitting a misleading singular entry. Pass the pot diff to the
comment script via env to close the template-injection vector.
* Address review: one-to-one casing match and comment pagination
Consume each removed msgid at most once when pairing casing-only
changes, and paginate issue comments when locating the sticky
check comment.
* Address review: string-content calls, concat fragments, plural diff, credentials
Ignore keyword-like text inside PHP string/heredoc content, skip
concatenated first arguments instead of recording untranslatable
fragments (13 such fragments dropped from current output), report
plural changes across casing pairs, and set persist-credentials:
false with a non-failing comment step for fork PRs.
* Skip PHP string-content matches and fix heredoc terminators
Track string/heredoc spans during comment masking and ignore
keyword-like text inside them; also accept comma-terminated
flexible heredocs. Removes phantom refs and entries, keeps real
calls with correct line numbers (verified: timeago entries
intact, May-validation residuals all still excluded-path
fossils or untranslatable fragments).
* Migrate E2E suite from Cypress to Playwright
* Address review feedback for Playwright migration
Use Symfony Filesystem::mkdir() for the test uploads directory instead of
suppressed native mkdir, and tolerate an optional trailing slash in the
admin smoke test URL assertions.
* Improve type safety, auth checks and PHPStan fixes (#3250)
* Improve type safety, auth checks and PHPStan fixes
* Remove @phpstan-ignore annotations
* Improve type safety, auth checks and PHPStan fixes
* Remove @phpstan-ignore annotations
* Remove redundant @phpstan-ignore comment
* Improve code robustness and reliability (#3248)
* Harden code against null/undefined values
* Update dependency lockfiles
* Sanitize ticket input and use IDs in email list
* Restructure tests and add test utilities
* Move E2E tests to `Library\E2E` namespace
* Update `php-build` action ref in workflows
* Switch tests to Pest and add test scaffolding
* Refactor E2E tests to Pest-style tests
m
Skip E2E tests when env not configured
* Refactor Unit tests and update test config
Add test datasets and refine test helpers
* Add DEBUG guard, fix API JSON decode, update tests
* Refactor tests: add types and Mockery expectations
* Adjust tests, phpstan config, and composer script
* Instantiate test APIs locally, remove beforeEach
* Refactor runtime checks, types & logging
* Apply PHP Code Styling Changes
m
* Add PHPStan ignores, test renames & small fixes
* Enable Pest tests in CI workflow
* Remove legacy tests; add new unit tests/config
* Avoid undefined index in fingerprint comparison
* Ignore properties absent in both fingerprints
* Remove public_ticket_create API method
* Add Fingerprint unit tests
* Remove em dash from fingerprint test name
* Switch to Pest; assorted bug fixes & refactors
* Prefer getDi() and guard DEBUG define
* Refactor tests: DBAL, Antispam rename, helpers
* Refactor email tests to use Doctrine entities
* Update tests, use DBAL mocks & improve Formbuilder admin
* Validate plan_id and update unit tests
* Replace error_log with DI logger and update tests
* Expect db->store in Invoice Service test
* Use DI logger instead of error_log; fix tests
* Fix typo in Hook Service test
* Fix Staff test spelling fixture
* Complete Pest test migration
* Fix Product test spelling fixtures
* Fix Product test spelling fixtures
* Run live tests with Pest and load helpers
* Migrate tests to ApiClient; remove legacy APIHelper
* Fix Email test spelling
* Remove unused PHPUnit bridge
* Organize Cypress end-to-end tests
* Document Pest test directory root
* Remove noisy Pest comments
* Adjust admin alerts and installer warning
* Make dashboard cards full-height and align badges
* Split dashboard cards into partials and add AJAX
* Replace status badges with ribbon elements
* Revamp activity panel layout and responsiveness
* Adjust dashboard card spacing and styles
* Style dashboard links and adjust chart heights
* Back-to-top: update classes and styles
* Fix client admin UI labels and flags
* Improve API response parsing and errors
* Mark action columns no-sort, add table-hover
* Update table classes for hover and wrapping
* Refactor admin templates to card-header layout
* Update admin templates layout and semantics
* Tidy admin templates; remove tabs, update notice
* Standardize admin alert styles and messages
* Handle null/empty status in status_name macro
* Validate resolved renewal price before invoicing
* Keep IP actions inline in activity table
* Right-align activity pagination controls
* Align pagination and export buttons in admin lists
* Improve admin pagination & per-page defaults
* Extract record selector into partial
* Add tab deep-linking and URL hash persistence
* Refactor search controls & capitalize 'One Time'
* Refactor client search filters and toggle state
* Refactor activity filters UI and tomselect styling
* Redesign admin filters; capitalize 'On Hold'
* Revamp admin filter panels (Invoice & Support)
* Group search clause in Massmailer query
* Add filters and expanded search for pages/gateways
* Add filter panels, refine search logic, tests
* Add advanced search filters for activity modules
* Add structured filters, date/ip search & tests
* Add Email queue filters and admin tab
* Add collapsible filter panel to Staff settings
* Refactor badges to use shared macros
* Add massmailer statuses & boolean badges
* Add search icon and refine search input layout
* Update admin templates layout and markup
* Use modals for creating clients/groups
* Centralize tab header action buttons
* Centralize toolbar actions; add Order modal
* Bump Composer dependencies (lockfile)
* Capitalize 'One Time' payment label
* Return raw API body; use button for search
* Wrap search button in input-group-text
* Make search max width configurable
* Fix malformed aria-label Twig expression in layout_default.html.twig
Agent-Logs-Url: https://github.com/FOSSBilling/FOSSBilling/sessions/c8db6ba9-bda4-413a-989f-e4777e06bd12
Co-authored-by: admdly <2807620+admdly@users.noreply.github.com>
* Fix XSS risk in updateExternalIP: append IP via createTextNode instead of innerHTML concat
Agent-Logs-Url: https://github.com/FOSSBilling/FOSSBilling/sessions/0c435e52-1784-4466-a8dc-c41e12443a6f
Co-authored-by: admdly <2807620+admdly@users.noreply.github.com>
* Refactor New Client modal layout and styles
* Limit and style phone country code field
* Use `country_names` helper and `country_name` filter
* Use Symfony Intl for currencies & locales
* Use Symfony Intl for currencies; drop built-in country lists
* Refactor Currency module API, entity and service
* Remove system checkLimits usages from modules and tests
* Remove `currency.title` column and update APIs
* Add inputmode and maxlength to cspell dictionary
* Fix dropdown toggle accessibility: use button instead of anchor
Agent-Logs-Url: https://github.com/FOSSBilling/FOSSBilling/sessions/b7f9474b-1988-4c08-aec0-f8991edfea71
Co-authored-by: admdly <2807620+admdly@users.noreply.github.com>
* Improve multi-currency handling and installer
* Log currency code when changing cart currency
* Use removeCurrency in Admin API and update tests
* Use Intl currency symbols and fraction digits
* Use currency filters in templates
* Rename currency title to name and update schema
* Remove deprecated Service::getLanguages
* Capitalize system permission labels and fix messages
* Use Symfony Countries and remove phone codes list
* Validate country codes; use country select
* Set fb_locale cookie and fix admin locale display
* Validate locales and add default locale selector
* Use Locales::getNames; tweak language selector CSS
* Tweak header spacing and make nav links icon-only
* Localize client login texts
* Add phone country-code attrs and styles
* Center .modal-dialog in two themes
* Add phone_codes API to list calling codes
* Make form the modal-content wrapper
* Move create forms to Bootstrap modals
* Convert new-item tabs to modals in admin UI
* Revamp admin UI, embed snippets & modal
* Revamp admin settings UI and templates
* Revamp Formbuilder & Redirect admin UIs
* Add 'Segoe' and 'minmax' to cspell dictionary
* Rename warning() to warn() in test logger
* Refactor admin templates to card-based layout
* Expose initAvatars globally and scoped init
* Add 'view' permissions and enforce checks
* Refactor Servicehosting admin UI and scripts
* Add staff permission checks and module permissions
* Refactor admin templates layout and forms
* Add staff permission checks and module perms
* Add staff permission checks and module perms
* Refactor admin Twig templates and UI
* Refactor client admin UI to use summary/form cards
* Refactor admin invoice/subscription/transaction templates
* Refactor Order admin UI; fix country labels
* Refactor admin templates and add IP country filter
* Add 'view' permissions and checks to admin APIs
* Use detail/related partials in admin templates
* Refactor admin product templates to use partials
* Add endembed to cspell ignoreWords to fix spellcheck CI failure
Agent-Logs-Url: https://github.com/FOSSBilling/FOSSBilling/sessions/e8973bef-7364-4b30-8dd8-13701ca15c5d
Co-authored-by: admdly <2807620+admdly@users.noreply.github.com>
* Refactor admin templates to use common partials
* Validate order status, add permission checks
* Center form buttons and add horizontal padding
* Introduce createAdminApi and BBTestCaseContainer
* Refactor admin UI templates and forms
* Run intl compression after composer install
* Disable provenance in buildx outputs
* Revamp admin templates for UI and previews
* Refactor admin templates, pricing UI & styles
* Refactor admin invoice sidebar and SEO settings UI
* Use minor currency units, country list & API fixes
* Rename language selector class to locale-selector
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: admdly <2807620+admdly@users.noreply.github.com>
* Introduce E2E tests using Cypress
* Removed unrelated submodule
* Add Cypress Cloud project ID
* Save Cypress runs to Cloud
* Pass commit information to the container
* Added admin smoke tests
* Redo Cypress workflow
* Increase shm size
* Run Cypress using Electron
* Add dedicated Docker network alias
* Fixed hostname
* Validate sessions via browser navigation
* Disable session fingerprinting during Cypress tests
* Adjust smoke test paths
* Move Cypress usage to npx
* Remove redundant assertions
* Added basic tests for the client area
* Make spellcheck happy
* Fix test cases
* Added client support lifecycle tests
* Separate tests by directories
* Account for the max subject length
* Fix an actual FOSSBilling error
* Getting around the subject character limit
* Restored the long subject
* Timing issues with Bootstrap modals
* Fix for pull request finding
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
* Fix for pull request finding
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
* Only upload artifacts when recording is disabled
---------
Co-authored-by: Adam Daley <admdly@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>