feat: add Jira URL integration and relay functionality
- Implemented OpenBrowserURL function to open Jira links - Updated components to utilize the new Jira URL feature - Added relay server to manage real-time URL updates - Set default Jira URL in settings if not specified
This commit is contained in:
@@ -7,7 +7,7 @@
|
||||
import History from './components/History.svelte'
|
||||
import Setup from './components/Setup.svelte'
|
||||
import { EventsOn, EventsOff, WindowSetSize, ScreenGetAll } from '../wailsjs/runtime/runtime'
|
||||
import { GetParticipants, StartMeeting, GetSettings, SkipSpeaker, RemoveFromQueue, SwitchToSpeaker } from '../wailsjs/go/app/App'
|
||||
import { GetParticipants, StartMeeting, GetSettings, SkipSpeaker, RemoveFromQueue, SwitchToSpeaker, OpenBrowserURL } from '../wailsjs/go/app/App'
|
||||
import { t, initLocale } from './lib/i18n'
|
||||
import { attendance } from './lib/stores'
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
EventsOn('timer:meeting_warning', handleMeetingWarning)
|
||||
EventsOn('timer:meeting_ended', handleMeetingEnded)
|
||||
EventsOn('timer:speaker_changed', handleSpeakerChanged)
|
||||
EventsOn('jira:open', handleJiraOpen)
|
||||
EventsOn('jira:open', (url) => { if (url) OpenBrowserURL(url) })
|
||||
|
||||
// Warm up AudioContext on first user interaction
|
||||
const warmUpAudio = async () => {
|
||||
@@ -134,10 +134,6 @@
|
||||
timerState = state
|
||||
}
|
||||
|
||||
function handleJiraOpen(url) {
|
||||
window.open(url, 'jira-kanban')
|
||||
}
|
||||
|
||||
let audioContext = null
|
||||
|
||||
function getAudioContext() {
|
||||
@@ -296,7 +292,7 @@
|
||||
{#if currentView === 'main'}
|
||||
{#if meetingActive && timerState}
|
||||
<div class="timer-view">
|
||||
<Timer {timerState} />
|
||||
<Timer {timerState} jiraUrl={settings?.defaultJiraUrl || ''} />
|
||||
<ParticipantList {timerState} on:skip={handleSkipFromList} on:switch={handleSwitchSpeaker} />
|
||||
<Controls {timerState} on:stop={() => meetingActive = false} />
|
||||
</div>
|
||||
@@ -311,6 +307,9 @@
|
||||
<button class="secondary-btn" on:click={() => currentView = 'setup'}>
|
||||
{$t('timer.editParticipants')}
|
||||
</button>
|
||||
{#if settings?.defaultJiraUrl}
|
||||
<button class="secondary-btn" on:click={() => OpenBrowserURL(settings.defaultJiraUrl)}>🔗 Jira</button>
|
||||
{/if}
|
||||
</div>
|
||||
{:else}
|
||||
<div class="no-meeting">
|
||||
|
||||
@@ -6,8 +6,9 @@
|
||||
let sessions = []
|
||||
let stats = null
|
||||
let loading = true
|
||||
let dateFrom = new Date(Date.now() - 30 * 24 * 60 * 60 * 1000).toISOString().split('T')[0]
|
||||
let dateTo = new Date().toISOString().split('T')[0]
|
||||
const _now = new Date()
|
||||
let dateFrom = `${_now.getFullYear()}-${String(_now.getMonth() + 1).padStart(2, '0')}-01`
|
||||
let dateTo = `${_now.getFullYear()}-${String(_now.getMonth() + 1).padStart(2, '0')}-${String(_now.getDate()).padStart(2, '0')}`
|
||||
let exporting = false
|
||||
let showDeleteAllConfirm = false
|
||||
let deletingSessionId = null
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<script>
|
||||
import { onMount, createEventDispatcher } from 'svelte'
|
||||
import { GetParticipants, GetMeeting, StartMeeting, AddParticipant, DeleteParticipant, ReorderParticipants, UpdateParticipant, UpdateMeeting, GetSettings } from '../../wailsjs/go/app/App'
|
||||
import { GetParticipants, GetMeeting, StartMeeting, AddParticipant, DeleteParticipant, ReorderParticipants, UpdateParticipant, UpdateMeeting, GetSettings, OpenBrowserURL } from '../../wailsjs/go/app/App'
|
||||
import { t } from '../lib/i18n'
|
||||
import { attendance } from '../lib/stores'
|
||||
|
||||
|
||||
@@ -1,8 +1,10 @@
|
||||
<script>
|
||||
import { onMount, onDestroy } from 'svelte'
|
||||
import { t } from '../lib/i18n'
|
||||
import { OpenBrowserURL } from '../../wailsjs/go/app/App'
|
||||
|
||||
export let timerState
|
||||
export let jiraUrl = ''
|
||||
|
||||
let currentTime = ''
|
||||
let clockInterval
|
||||
@@ -63,6 +65,9 @@
|
||||
<div class="timer-container" class:warning={timerState?.warning} class:overtime={timerState?.speakerOvertime}>
|
||||
<div class="header-row">
|
||||
<div class="current-clock">{currentTime}</div>
|
||||
{#if jiraUrl}
|
||||
<button class="jira-btn" on:click={() => OpenBrowserURL(jiraUrl)} title="Открыть Jira">🔗</button>
|
||||
{/if}
|
||||
<div class="help-icon">
|
||||
?
|
||||
<div class="help-tooltip">
|
||||
@@ -204,6 +209,17 @@
|
||||
margin-bottom: 8px;
|
||||
}
|
||||
|
||||
.jira-btn {
|
||||
background: none;
|
||||
border: none;
|
||||
cursor: pointer;
|
||||
font-size: 16px;
|
||||
padding: 2px 4px;
|
||||
opacity: 0.6;
|
||||
transition: opacity 0.2s;
|
||||
}
|
||||
.jira-btn:hover { opacity: 1; }
|
||||
|
||||
.current-clock {
|
||||
font-size: 14px;
|
||||
color: #8899a6;
|
||||
|
||||
2
frontend/wailsjs/go/app/App.d.ts
vendored
2
frontend/wailsjs/go/app/App.d.ts
vendored
@@ -43,6 +43,8 @@ export function GetVersion():Promise<string>;
|
||||
|
||||
export function NextSpeaker():Promise<void>;
|
||||
|
||||
export function OpenBrowserURL(arg1:string):Promise<void>;
|
||||
|
||||
export function PauseMeeting():Promise<void>;
|
||||
|
||||
export function RemoveFromQueue(arg1:number):Promise<void>;
|
||||
|
||||
@@ -82,6 +82,10 @@ export function NextSpeaker() {
|
||||
return window['go']['app']['App']['NextSpeaker']();
|
||||
}
|
||||
|
||||
export function OpenBrowserURL(arg1) {
|
||||
return window['go']['app']['App']['OpenBrowserURL'](arg1);
|
||||
}
|
||||
|
||||
export function PauseMeeting() {
|
||||
return window['go']['app']['App']['PauseMeeting']();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user