JiraTargetResolver._resolve_base_url() and _load_config_map() called
JsonConfigRepository() without the required path argument, causing a
TypeError that was silently caught by except Exception, returning empty
strings. This made sync fail with 'Jira base URL is not configured for
this environment' even when the user had saved valid credentials.
Fix: import CONFIG_PATH from config module and pass it to both
JsonConfigRepository() calls so they read the same config file that
AppConfig writes to.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
_trigger_sync reads jira config from self.ctx.config.data, but if the
user hasn't clicked Save yet the config still holds old/empty values.
Add self._save() at the top of _trigger_sync so the current form
values (base URL, email, token, project mapping) are persisted to
config before the background sync job reads them.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
QFrame+Qt.Popup and QDialog popups are unreliable on macOS inside
QDialog parents — they may appear behind the parent or not receive
clicks. Replace with a simple inline QLabel that toggles visibility
when the ? button is clicked. This is the most reliable approach
across all platforms.
- Add self._inline_help QLabel below the mapping input (hidden by default)
- _toggle_inline_help() simply shows/hides the label
- Styled with dark background, blue border, matching the app theme
- No external popup windows needed
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Qt.Popup flag is unreliable on macOS inside QDialog parents — popup may
appear behind the parent or not receive clicks. Replace with a small
QDialog using Qt.Tool|Qt.FramelessWindowHint which is stable on macOS.
- Add explicit close button (✕) in the popup
- Call activateWindow() to ensure popup gets focus
- Position 4px below the help button for visual separation
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Native Qt tooltips on macOS are unreliable (delayed or invisible). Replace
with a QFrame popup that appears on click, positioned below the ? button,
and closes when clicking elsewhere (Qt.Popup flag handles ESC and outside-click).
- Store help text in self._help_text instead of setToolTip()
- Add _toggle_help_popup() method: creates/destroys floating QFrame
- Update test to check _help_text attribute instead of toolTip()
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
- Add QToolButton help icon (?) next to Project Mapping label
- Implement comprehensive tooltip explaining Project ID and Jira Key concepts
- Add inline validation to detect common mistake: entering issue keys (ABC-123) instead of project keys (ABC)
- Add 13 new i18n keys for help text in English, Vietnamese, and Japanese
- Add 15 comprehensive UX tests covering icon presence, tooltip content, validation logic, and accessibility
- Update jira-knowledge-guide.md with help icon reference and setup instructions
- Fix missing _on_paste method that was causing AttributeError
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
- Phase 9: Extend JiraConnectDialog with Project Knowledge config, mapping, and Sync Now button
- Phase 10: Wire JiraSyncService to CanonicalAuditLogger for sync start/complete/fail events
- Phase 11: Add retrieval regression suite with synthetic corpus and baseline metrics
- Phase 14: Add comprehensive production guide (docs/jira-knowledge-guide.md)
- Fix UI status label references (self.status -> self.conn_status)
- Implement real sync trigger logic in UI using JiraSyncService
Jira Server self-hosted instances (e.g. insight.fsoft.com.vn) reject
Basic Auth with email+API token (403). Auto-detect by hostname:
- *.atlassian.net → Basic Auth (email + API token)
- everything else → Bearer header with Personal Access Token
User pastes PAT into the same 'API token' field in UI Connectors.