|
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