Conversation
|
EN: DE: |
The customer's preferred phone-call time was only visible in the call-queue detail view. Compliance staff calling through a phone queue could not see it in the overview and had to open each entry. A new "Phone Call Times" column is shown as the last column before Date, only in the ManualCheckPhone and ManualCheckIpCountryPhone queues (deliberate decision; the other phone queues keep the value in the detail view). The value is the raw, semicolon-separated time slots the customer selected; an empty value shows "-". The neighbouring column labels of the queue list get their missing de/fr/it translations. The value is delivered by the API on CallQueueItem (DFXswiss/backend#3924). Until @dfx.swiss/core carries the field (DFXswiss/packages#180), a small typings bridge exposes phoneCallTimes on CallQueueItem so the screen reads it type-safely; the bridge is removed once core publishes the field. Tests: a unit test brings compliance-call-queue.screen.tsx to full coverage (column visibility per queue, dash for empty values, cell rendering, empty state, error and loading paths, row navigation). The full-stack compliance cases assert the column in the phone queue and its absence in the IP queue; the factory can seed user_data.phoneCallTimes. A visual spec and its handbook metadata are added; the darwin baselines and the reality declarations for the synthetic queue response and the seeded value are declared in the pull request.
Blume1977
force-pushed
the
feat/call-queue-phone-times
branch
from
September 14, 2026 14:25
a270955 to
4db9edf
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
EN:
The call-queue overview shows the customer's preferred phone-call time as a new last column before Date, only in the ManualCheckPhone and ManualCheckIpCountryPhone queues. Compliance staff no longer have to open every entry to see when a customer wants to be called. Column labels of the queue list are translated in German, French and Italian.
DE:
Die Call-Queue-Übersicht zeigt die vom Kunden gewählte Anrufzeit als neue letzte Spalte vor Datum, nur in den Queues ManualCheckPhone und ManualCheckIpCountryPhone. Compliance muss nicht mehr jeden Eintrag öffnen, um zu sehen, wann ein Kunde angerufen werden will. Die Spaltenbeschriftungen der Queue-Liste sind auf Deutsch, Französisch und Italienisch übersetzt.
Details
Change:
src/screens/compliance-call-queue.screen.tsxgets ashowPhoneCallTimesflag (same pattern asshowIp/showCountry/showStatus), a header and a cell column, andcolumnCountincludes it. The value is the raw, semicolon-separated slot list the customer selected (e.g.H9To10;H10To11), identical to the detail view. The cell usesitem.phoneCallTimes || '-'rather than the neighbours'??on purpose: the API stores the slots as a joined string, so an empty selection arrives as''and must render the dash like a missing value. The limitation to the two queues is a deliberate compliance decision (ManualCheckIpPhone and ManualCheckExternalAccountPhone keep the value in the detail view only); the code comment says so. The unreachableif (!queue) return;inopenDetailis removed: rows only render oncequeueis set, so the guard could never execute (CONTRIBUTING: delete rather than exclude).i18n:
Phone Call Timesplus the neighbouring column labels of the same table that were already passed throughtranslate()without keys (Call Queue,User,Phone,Lang,Transaction,Country,Status,Date) are added toscreens/compliancein de/fr/it, appended at the end of the block like the previous table keys.Tests:
src/__tests__/compliance-call-queue.screen.test.tsx(29 tests): column shown in ManualCheckPhone and ManualCheckIpCountryPhone as the last column before Date, hidden in ManualCheckIpPhone, ManualCheckExternalAccountPhone and UnavailableSuspicious;''andundefinedrender-; full and sparse cell rendering; empty-state colspan (9 and 7); unknown and missing queue param; logged-out; loading spinner; rejection withErrorand with a non-Error value; row click with and withouttxId; back navigation; row keys without duplicate-key warnings.src/screens/compliance-call-queue.screen.tsx: 100 / 100 / 100 / 100 (statements / branches / functions / lines).src/__tests__/compliance-call-queue.screen.test.tsxis a test file and not instrumented; translation JSON,typings/*.d.ts,e2e/,e2e-stack/,docs/andscripts/handbook/metadata.jsoncarry no coverage.LC_ALL=en_US.UTF-8 npm run test -- --findRelatedTests <changed src files> --coverage: 102 suites, 1714 tests green.npm run lint(--max-warnings 0) andnpm run format:md:checkgreen;npx eslint --max-warnings 0andnpx prettier --checkgreen on every changed file excepte2e-stack/specs/fixtures/factories.ts;tsc --noEmit -p e2e/tsconfig.jsonand-p e2e-stack/tsconfig.jsonwithout errors in the changed specs.factories.tsis not Prettier-clean ondevelop(pre-existing hunks from line 1779 on, outside the lint glob); the three inserted lines follow the Prettier style and the pre-existing hunks are left untouched to keep the diff to this change.e2e-stack/specs/compliance-cases.spec.tsgets a case that seeds a ManualCheckPhone entry withphoneCallTimes(factory optioncreateCallQueueEntry({ phoneCallTimes })), asserts the column header scoped to the queue table, its position directly before Date, and its absence in ManualCheckIpPhone. Not run locally (no Docker); route claims unchanged, the file already claims/compliance/call-queues/:queue.Declared deviations:
e2e/compliance-call-queue.spec.tsis new (synthetic API, two visual variants) andscripts/handbook/metadata.jsonhas thecompliance-call-queueentry, but the two PNGse2e/screenshots/baseline/compliance-call-queue.spec.ts-compliance-call-queue-01-phone-queue-chromium-darwin.pngand...-02-ip-phone-queue-chromium-darwin.pngare not in this PR: no Playwright browsers on this machine. The metadata entry is orphaned until the baselines exist (build prints a warning, does not fail).CallQueueItem.phoneCallTimes, which@dfx.swiss/coredoes not expose yet (feat(core): add phoneCallTimes to CallQueueItem packages#180 open, latest core 0.7.1 without the field).typings/dfx-core-call-queue.d.tsaugments the interface with the optional field so the screen stays type-safe and the PR does not depend on the package release. This moves one optional response field into this repository against the rule; the bridge is deleted in the PR that bumps@dfx.swiss/reactafter packages#180 publishes.docs/test-architecture.md): the visual spec answersGET /v1/support/call-queues/{queue}/itemsitself; the full-stack case SQL-writesuser_data.phoneCallTimesand accepts the-placeholder in the cell because the API in the stack does not deliver the field until DFXswiss/backend#5542 is merged.Dependencies: real values appear once DFXswiss/backend#5542 (fills
phoneCallTimesintoTxCallQueueItem) is live; order is not critical, the field is optional and the column renders-until then. DFXswiss/packages#180 adds the field to@dfx.swiss/core.Pre-existing, not changed (reported per CONTRIBUTING, out of scope here):
useEffect(lines 43-50) has no in-flight guard: switching the queue while a request is pending lets a slower older response overwrite the newer list; no mounted guard either.erroris never reset on a queue change (line 45 sets loading, not error), so a previous failure keeps showing after the next queue loads.catch((e) => setError(e.message))on a non-Error rejection setsundefinedand shows an empty table without a hint (covered by a test to pin the current behaviour).KYCandIPheaders are hard-coded withouttranslate().Overlap: none of the currently open PRs touches
compliance-call-queue.screen.tsx.