|
332 | 332 | // -----------------------------------------------
|
333 | 333 | // Jira ticket link (data attributes are set in setDataAttributesToNode, above)
|
334 | 334 |
|
335 |
| - if (('jiraTicketId' in mergeRequestNode.dataset) && ('jiraTicketUrl' in mergeRequestNode.dataset)) { |
336 |
| - let jiraTicketLinkToolip = null; |
337 |
| - let jiraTicketLinkLabel = null; |
338 |
| - |
339 |
| - switch (this.preferences.jira_ticket_link_label_type) { |
340 |
| - case 'ticket_id': |
341 |
| - jiraTicketLinkLabel = mergeRequestNode.dataset.jiraTicketId; |
342 |
| - |
343 |
| - break; |
344 |
| - case 'icon': |
345 |
| - jiraTicketLinkLabel = this.buildSpriteIcon('issues'); |
346 |
| - jiraTicketLinkToolip = 'Jira ticket ' + mergeRequestNode.dataset.jiraTicketId; |
347 |
| - |
348 |
| - break; |
349 |
| - default: |
350 |
| - console.error('Invalid link label type ' + this.preferences.jira_ticket_link_label_type); |
351 |
| - } |
352 |
| - |
353 |
| - if (jiraTicketLinkLabel) { |
354 |
| - let jiraTicketLink = '<a href="' + mergeRequestNode.dataset.jiraTicketUrl + '" ' + |
355 |
| - 'class="issuable-milestone ' + (jiraTicketLinkToolip ? 'has-tooltip' : '') + '" ' + |
356 |
| - (jiraTicketLinkToolip ? 'title="' + jiraTicketLinkToolip + '"' : '') + '>' + |
357 |
| - jiraTicketLinkLabel + |
358 |
| - '</a> '; |
359 |
| - |
360 |
| - this.parseHtmlAndInsertBefore( |
361 |
| - mergeRequestNode.querySelector('.merge-request-title-text'), |
362 |
| - jiraTicketLink |
363 |
| - ); |
| 335 | + if (('jiraTicketIds' in mergeRequestNode.dataset) && ('jiraTicketUrls' in mergeRequestNode.dataset)) { |
| 336 | + let ticket_ids = mergeRequestNode.dataset.jiraTicketIds.split(','); |
| 337 | + let ticket_urls = mergeRequestNode.dataset.jiraTicketUrls.split(','); |
| 338 | + |
| 339 | + for (let i = 0; i < ticket_ids.length; i++) { |
| 340 | + let jiraTicketLinkToolip = null; |
| 341 | + let jiraTicketLinkLabel = null; |
| 342 | + |
| 343 | + switch (this.preferences.jira_ticket_link_label_type) { |
| 344 | + case 'ticket_id': |
| 345 | + jiraTicketLinkLabel = ticket_ids[i]; |
| 346 | + |
| 347 | + break; |
| 348 | + case 'icon': |
| 349 | + jiraTicketLinkLabel = this.buildSpriteIcon('issues'); |
| 350 | + jiraTicketLinkToolip = 'Jira ticket ' + ticket_ids[i]; |
| 351 | + |
| 352 | + break; |
| 353 | + default: |
| 354 | + console.error('Invalid link label type ' + this.preferences.jira_ticket_link_label_type); |
| 355 | + } |
| 356 | + |
| 357 | + if (jiraTicketLinkLabel) { |
| 358 | + let jiraTicketLink = '<a style="margin-right: 0.35em" href="' + ticket_urls[i] + '" ' + |
| 359 | + 'class="issuable-milestone ' + (jiraTicketLinkToolip ? 'has-tooltip' : '') + '" ' + |
| 360 | + (jiraTicketLinkToolip ? 'title="' + jiraTicketLinkToolip + '"' : '') + '>' + |
| 361 | + jiraTicketLinkLabel + |
| 362 | + '</a>'; |
| 363 | + |
| 364 | + this.parseHtmlAndInsertBefore( |
| 365 | + mergeRequestNode.querySelector('.merge-request-title-text'), |
| 366 | + jiraTicketLink |
| 367 | + ); |
| 368 | + } |
364 | 369 | }
|
365 | 370 | }
|
366 | 371 |
|
|
446 | 451 | mergeRequestNode.dataset.isWip = mergeRequest.work_in_progress;
|
447 | 452 |
|
448 | 453 | if (this.preferences.enable_jira_ticket_link) {
|
449 |
| - let jiraTicketId = this.findFirstJiraTicketId(mergeRequest); |
450 |
| - |
451 |
| - if (jiraTicketId) { |
452 |
| - mergeRequestNode.dataset.jiraTicketId = jiraTicketId; |
453 |
| - mergeRequestNode.dataset.jiraTicketUrl = this.createJiraTicketUrl(jiraTicketId); |
454 |
| - } |
| 454 | + let jiraTicketIds = this.findJiraTicketIds(mergeRequest); |
| 455 | + mergeRequestNode.dataset.jiraTicketIds = jiraTicketIds; |
| 456 | + mergeRequestNode.dataset.jiraTicketUrls = jiraTicketIds.map(id => this.createJiraTicketUrl(id)); |
455 | 457 | }
|
456 | 458 | }
|
457 | 459 |
|
458 | 460 | /**
|
459 | 461 | * Finds a Jira ticket ID in the given Merge Request object. It first tris in the source branch name, then
|
460 | 462 | * fallbacks to the Merge Request title.
|
461 | 463 | */
|
462 |
| - findFirstJiraTicketId(mergeRequest) { |
463 |
| - let jiraTicketIdRegex = new RegExp('[A-Z]{1,10}-\\d+'); |
464 |
| - |
465 |
| - // First try in the source branch name |
466 |
| - let results = jiraTicketIdRegex.exec(mergeRequest.source_branch); |
| 464 | + findJiraTicketIds(mergeRequest) { |
| 465 | + let jiraTicketIdRegex = /[A-Z]{1,10}-\d+/g; |
467 | 466 |
|
468 |
| - if (results) { |
469 |
| - return results[0]; |
470 |
| - } |
471 |
| - |
472 |
| - // Fallback to the Merge Request title if none found in the source branch name |
473 |
| - results = jiraTicketIdRegex.exec(mergeRequest.title); |
474 |
| - |
475 |
| - if (results) { |
476 |
| - return results[0]; |
477 |
| - } |
| 467 | + // Check in the source branch name and the merge request title |
| 468 | + let results = [...mergeRequest.source_branch.matchAll(jiraTicketIdRegex)].concat([...mergeRequest.title.matchAll(jiraTicketIdRegex)]); |
478 | 469 |
|
479 |
| - return null; |
| 470 | + // Get unique elements |
| 471 | + return results.map(v => v[0]).filter((v,i,a) => a.indexOf(v) === i); |
480 | 472 | }
|
481 | 473 |
|
482 | 474 | /**
|
|
595 | 587 | MR_STATUS: mergeRequestNode.dataset.status,
|
596 | 588 | MR_SOURCE_BRANCH_NAME: mergeRequestNode.dataset.sourceBranchName,
|
597 | 589 | MR_TARGET_BRANCH_NAME: mergeRequestNode.dataset.targetBranchName,
|
598 |
| - MR_JIRA_TICKET_ID: ('jiraTicketId' in mergeRequestNode.dataset) ? mergeRequestNode.dataset.jiraTicketId : '', |
599 |
| - MR_JIRA_TICKET_URL: ('jiraTicketUrl' in mergeRequestNode.dataset) ? mergeRequestNode.dataset.jiraTicketUrl : '' |
| 590 | + MR_JIRA_TICKET_ID: ('jiraTicketIds' in mergeRequestNode.dataset) ? mergeRequestNode.dataset.jiraTicketIds.replaceAll(',', ', ') : '', |
| 591 | + MR_JIRA_TICKET_URL: ('jiraTicketUrls' in mergeRequestNode.dataset) ? mergeRequestNode.dataset.jiraTicketUrls.replaceAll(',', ', ') : '' |
600 | 592 | };
|
601 | 593 |
|
602 | 594 | let placeholdersReplaceRegex = new RegExp('{(' + Object.keys(placeholders).join('|') + ')}', 'g');
|
|
0 commit comments