Skip to content

Commit fff4906

Browse files
committed
Jira migration updates
1 parent e9de66d commit fff4906

3 files changed

Lines changed: 64 additions & 8 deletions

File tree

app/Filament/Pages/JiraImport.php

Lines changed: 53 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,8 @@ class JiraImport extends Page implements HasForms
4949
public $selected_tickets;
5050
public $data = [];
5151
public $ticketsDataApi;
52+
public $epicKeys = [];
53+
public $taskKeys = [];
5254

5355
public function mount(): void
5456
{
@@ -199,6 +201,18 @@ public function getFormSchema(): array
199201
->visible(fn() => $this->loadingTickets)
200202
->content(__('Loading tickets, please wait...'));
201203

204+
if (!$this->loadingTickets && $this->tickets) {
205+
$fields[] = Placeholder::make('selection_buttons')
206+
->hiddenLabel()
207+
->content(new HtmlString(
208+
"<div class='flex items-center gap-2'>"
209+
. "<button type='button' wire:click='selectAllEpics' class='px-3 py-1.5 rounded-md text-xs font-bold bg-purple-600 text-white shadow-sm hover:bg-purple-700'>" . __('Select All Epics') . "</button>"
210+
. "<button type='button' wire:click='selectAllTasks' class='px-3 py-1.5 rounded-md text-xs font-bold bg-primary-600 text-white shadow-sm hover:bg-primary-700'>" . __('Select All Tasks') . "</button>"
211+
. "<button type='button' wire:click='deselectAll' class='px-3 py-1.5 rounded-md text-xs font-bold bg-gray-400 text-white shadow-sm hover:bg-gray-500'>" . __('Deselect All') . "</button>"
212+
. "</div>"
213+
));
214+
}
215+
202216
if (!$this->loadingTickets) {
203217
if ($this->tickets) {
204218
foreach ($this->tickets as $projectKey => $ticket) {
@@ -213,9 +227,13 @@ public function getFormSchema(): array
213227
foreach ($ticket['issues'] as $issue) {
214228
$fields[] = Checkbox::make('data.' . Str::slug($projectKey) . '_' . Str::slug($issue['code']))
215229
->label(function () use ($issue) {
230+
$epicBadge = !empty($issue['isEpic'])
231+
? "<span class='inline-flex items-center px-2.5 py-1 rounded-md text-xs font-bold bg-purple-600 text-white shadow-sm'>EPIC</span> "
232+
: '';
216233
return new HtmlString(
217234
"<div class='w-full flex flex-col gap-1'>"
218235
. "<div class='w-full flex items-center gap-1'>"
236+
. $epicBadge
219237
. "<div class='text-gray-700 text-xs font-light'><span class='font-medium uppercase'>" . $issue['code'] . "</span> " . $issue['name'] . "</div>"
220238
. "</div>"
221239
. "</div>"
@@ -251,8 +269,13 @@ public function import(): void
251269
if ($this->data && sizeof($this->data)) {
252270
$tickets = [];
253271
foreach (array_keys($this->data) as $item) {
254-
$url = $this->ticketsDataApi[$item];
255-
$tickets[] = $this->getJiraTicketDetails($this->host, $this->username, $this->token, $url);
272+
$url = $this->ticketsDataApi[$item] ?? null;
273+
if ($url) {
274+
$ticket = $this->getJiraTicketDetails($this->host, $this->username, $this->token, $url);
275+
if ($ticket) {
276+
$tickets[] = $ticket;
277+
}
278+
}
256279
}
257280
dispatch(new ImportJiraTicketsJob($tickets, auth()->user()));
258281
Notification::make()
@@ -278,15 +301,42 @@ public function updateJiraProjects(): void
278301
public function updateJiraTickets(): void
279302
{
280303
$this->ticketsDataApi = [];
304+
$this->epicKeys = [];
305+
$this->taskKeys = [];
281306
$client = $this->connectToJira($this->host, $this->username, $this->token);
282307
$this->tickets = $this->getJiraTicketsByProject($client, $this->selected_projects);
283308
if ($this->tickets) {
284309
foreach ($this->tickets as $projectKey => $ticket) {
285310
foreach ($ticket['issues'] as $issue) {
286-
$this->ticketsDataApi[Str::slug($projectKey) . '_' . Str::slug($issue['code'])] = $issue['data']->self;
311+
$key = Str::slug($projectKey) . '_' . Str::slug($issue['code']);
312+
$this->ticketsDataApi[$key] = $issue['data']->self;
313+
if (!empty($issue['isEpic'])) {
314+
$this->epicKeys[] = $key;
315+
} else {
316+
$this->taskKeys[] = $key;
317+
}
287318
}
288319
}
289320
}
290321
$this->loadingTickets = false;
291322
}
323+
324+
public function selectAllEpics(): void
325+
{
326+
foreach ($this->epicKeys as $key) {
327+
$this->data[$key] = true;
328+
}
329+
}
330+
331+
public function selectAllTasks(): void
332+
{
333+
foreach ($this->taskKeys as $key) {
334+
$this->data[$key] = true;
335+
}
336+
}
337+
338+
public function deselectAll(): void
339+
{
340+
$this->data = [];
341+
}
292342
}

app/Helpers/JiraHelper.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ public function getJiraTicketsByProject(Client $client, $projectKeys): array|nul
4141
$results[] = [
4242
'code' => $issue->key,
4343
'name' => $issue->fields->summary,
44+
'isEpic' => isset($issue->fields->issuetype) && strtolower($issue->fields->issuetype->name) === 'epic',
4445
'data' => $issue
4546
];
4647
}

app/Jobs/ImportJiraTicketsJob.php

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,9 @@ public function handle()
4444
{
4545
if ($this->tickets && sizeof($this->tickets)) {
4646
foreach ($this->tickets as $ticket) {
47+
if (!$ticket || !isset($ticket->fields)) {
48+
continue;
49+
}
4750
$projectDetails = $ticket->fields->project;
4851
$ticketData = $ticket->fields;
4952

@@ -52,7 +55,7 @@ public function handle()
5255
$project = Project::create([
5356
'name' => $projectDetails->name,
5457
'description' => __('Project imported from Jira, project key:') . $projectDetails->key,
55-
'status_id' => ProjectStatus::where('is_default', true)->first()->id,
58+
'status_id' => ProjectStatus::where('is_default', true)->first()?->id ?? ProjectStatus::first()->id,
5659
'owner_id' => $this->user->id,
5760
'ticket_prefix' => $projectDetails->key
5861
]);
@@ -66,12 +69,14 @@ public function handle()
6669

6770
Ticket::create([
6871
'name' => $ticketData->summary,
69-
'content' => $ticketData->description ?? __('No content found in jira ticket'),
72+
'content' => is_string($ticketData->description ?? null)
73+
? $ticketData->description
74+
: (isset($ticketData->description) ? json_encode($ticketData->description) : __('No content found in jira ticket')),
7075
'owner_id' => $this->user->id,
71-
'status_id' => TicketStatus::where('is_default', true)->first()->id,
76+
'status_id' => TicketStatus::where('is_default', true)->first()?->id ?? TicketStatus::first()->id,
7277
'project_id' => $project->id,
73-
'type_id' => TicketType::where('is_default', true)->first()->id,
74-
'priority_id' => TicketPriority::where('is_default', true)->first()->id,
78+
'type_id' => TicketType::where('is_default', true)->first()?->id ?? TicketType::first()->id,
79+
'priority_id' => TicketPriority::where('is_default', true)->first()?->id ?? TicketPriority::first()->id,
7580
]);
7681
}
7782
FilamentNotification::make()

0 commit comments

Comments
 (0)