Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
60 commits
Select commit Hold shift + click to select a range
2b183a9
OTWO-7546 Added layout for home page
Niharika1117 Feb 2, 2026
8bfb627
OTWO-7574 - Figma redesign for homepage
bd-vaibhav Feb 25, 2026
a44a96b
OTWO-7574 Fixed card layout issues in homepage
bd-vaibhav Mar 2, 2026
65ef012
OTWO-7557 project show page design modification
Niharika1117 Mar 2, 2026
3e0ecc1
OTWO-7557 fix on the css for project show page
Niharika1117 Mar 3, 2026
13ba12f
OTWO-7574 - Figma redesign for homepage (#1870)
bd-vaibhav Mar 6, 2026
e09b43f
OTWO-7557 project show page design modification (#1871)
Niharika1117 Mar 6, 2026
7e7a694
OTWO-7546 added layout for home page
Niharika1117 Feb 2, 2026
90aede3
OTWO-7596 Implementation of project search index page
bd-vaibhav Mar 10, 2026
e367890
OTWO-7546 Added layout for home page
Niharika1117 Feb 2, 2026
9000b8f
OTWO-7574 - Figma redesign for homepage (#1870)
bd-vaibhav Mar 6, 2026
f24f3af
OTWO-7557 project show page design modification (#1871)
Niharika1117 Mar 6, 2026
cec6e63
Rubocop fix
Niharika1117 Mar 12, 2026
8920906
Added i18n translation keys
bd-vaibhav Mar 12, 2026
f6bea7d
Fix testcases
Niharika1117 Mar 16, 2026
3944449
Merge branch 'ui-redesign' into OTWO-7546
Niharika1117 Mar 16, 2026
272b894
conflict fix
Niharika1117 Mar 16, 2026
064b74f
OTWO-7596 Implementation of project search index page (#1875)
bd-vaibhav Mar 16, 2026
f8ce76f
OTWO-7595 Implement project explore page redesign per Figma
Niharika1117 Mar 17, 2026
a9eff99
testcase fix
Niharika1117 Mar 17, 2026
6cafc4f
OTWO-7596 logo layout fix
bd-vaibhav Mar 18, 2026
a657875
OTWO-7546 added layout for home page
Niharika1117 Feb 2, 2026
81fd60b
Added layout for home page
Niharika1117 Feb 2, 2026
a53bd98
OTWO-7574 Figma redesign for homepage
Niharika1117 Mar 20, 2026
4e9a9e7
Merge branch 'OTWO-7557' into OTWO-7546
Niharika1117 Mar 20, 2026
68dd256
Fix testcases
Niharika1117 Mar 16, 2026
55ab417
rubocop fix
Niharika1117 Mar 20, 2026
cb367a5
OTWO-7596 Implementation of project search index page
Niharika1117 Mar 20, 2026
18d6d65
OTWO-7595 Implement project explore page redesign per Figma
Niharika1117 Mar 20, 2026
427139f
Added UI fix for explore projects
Niharika1117 Mar 17, 2026
722d298
OTWO-7596 logo layout fix
bd-vaibhav Mar 18, 2026
34aef9d
rotating file deletion
Niharika1117 Mar 20, 2026
7d8335c
OTWO-7546 added layout for home page
Niharika1117 Feb 2, 2026
4ae08e8
OTWO-7563 Enable redis password for non test environments (#1865)
alex-sig Mar 24, 2026
5160ce3
OTWO-7603 Implement project contributions page design (#1879)
bd-vaibhav Mar 31, 2026
3d21671
Merge OTWO-7546 into ui-redesign to consolidate branches
Niharika1117 Mar 31, 2026
e0ce797
OTWO-7604 Implement people landing page redesign per figma (#1881)
Niharika1117 Apr 1, 2026
52ffd20
OTWO-7607 Fix coverage issue and failed test cases
Niharika1117 Apr 7, 2026
a901a0b
OTWO-7617 Implementation of Project enlistments page (#1882)
bd-vaibhav Apr 8, 2026
a6ff577
OTWO-7618 Implement figma design for organizations show page (#1883)
bd-vaibhav Apr 14, 2026
b9a6b8b
OTWO-7620 suggestions UI/UX (#1884)
Niharika1117 Apr 15, 2026
425e4f9
OTWO-7627 Added settings page changes for Projects/accounts/organizat…
Niharika1117 Apr 28, 2026
4e25067
OTWO-7630 Implement BDSA Page Design and SEO (#1887)
bd-vaibhav Apr 28, 2026
795a096
OTWO-7631 Implement figma designs for login management (#1889)
Niharika1117 Apr 28, 2026
1aea23b
OTWO-7628 Implement figma design for People show page (#1888)
Niharika1117 Apr 29, 2026
0c95b2e
OTWO-7576 Preserve dark mode settings per user (#1894)
Niharika1117 May 13, 2026
095ff08
OTWO-7635 Create and implement design for organization search index p…
Niharika1117 May 13, 2026
f752ab4
Web accessibilty and UI bug
Niharika1117 May 20, 2026
595cf3c
OTWO-7636 Create and implement Design for Organization show page (#1898)
bd-vaibhav May 20, 2026
cd92f0d
Added image for home page banner
Niharika1117 May 21, 2026
170fab5
Account profile page fix
Niharika1117 May 21, 2026
35d6e05
OTWO-7658 Create and implement Design for Tools page (#1902)
bd-vaibhav May 27, 2026
496f3f5
OTWO-7663 people/org entire page ui changes (#1904)
Niharika1117 May 28, 2026
9c68040
Conflict from main
Niharika1117 May 28, 2026
ad6e300
Projects page UI/UX fix for footer nav
Niharika1117 Jun 1, 2026
fa5d279
Projects page footer nav link page css
Niharika1117 Jun 2, 2026
5af44db
Added link to changes and few projects page UI
Niharika1117 Jun 3, 2026
e066049
Added fixex for People page and UI bugs
Niharika1117 Jun 15, 2026
5aed4fb
OTWO 7677 Fix enlistments and Highcharts related bugs in New UI/UX (#…
bd-vaibhav Jul 1, 2026
4c51a6f
OTWO-7681 Improvement functionlity of openhub for new UI/UX (#1917)
bd-vaibhav Jul 1, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
1 change: 0 additions & 1 deletion app/assets/javascripts/api/vulnerability.js.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,6 @@ $(document).ready ->
$('.bdsa-search-clear').show()
else
$('.bdsa-search-clear').hide()
$('.bdsa-search-error').hide()
$('.bdsa-search-clear').click () ->
$('.bdsa-search-input').val('').focus()
$(this).hide()
Expand Down
7 changes: 7 additions & 0 deletions app/assets/javascripts/application.js.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,13 @@
#= require slick.min


$(document).on 'click', '.flash-close', (e) ->
e.preventDefault()
$alert = $(e.currentTarget).closest('.alert')
$flashMsg = $alert.closest('#flash-msg')
$target = if $flashMsg.length then $flashMsg else $alert
$target.fadeOut 200, -> $target.remove()

$(document).on 'page:change', ->
StackShow.init()
Expander.init()
Expand Down
7 changes: 7 additions & 0 deletions app/assets/javascripts/charts.js
Original file line number Diff line number Diff line change
Expand Up @@ -148,6 +148,12 @@ var Charts = {
width: 950,
lang: {
thousandsSep: ','
},
exporting: {
enabled: false
},
credits: {
enabled: false
}
})

Expand Down Expand Up @@ -182,6 +188,7 @@ var Charts = {
}

},

commit_volume_formatter: function() {
return '<strong>' + this.series.name + '</strong><br/>' + this.y + ' Commits (' + Math.floor(this.percentage) + '%)';
}
Expand Down
30 changes: 30 additions & 0 deletions app/assets/javascripts/compare_accordion.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
// Mobile Compare Projects Accordion Functionality
document.addEventListener('click', function(e) {
var accordionHeader = e.target.closest('.accordion-header');
if (accordionHeader) {
e.preventDefault();

var section = accordionHeader.parentElement;
var content = section.querySelector('.accordion-content');
var icon = accordionHeader.querySelector('i');
var isOpen = section.classList.contains('active');

if (isOpen) {
// Close this section
section.classList.remove('active');
content.style.maxHeight = null;
if (icon) {
icon.classList.remove('icon-chevron-up');
icon.classList.add('icon-chevron-down');
}
} else {
// Open this section
section.classList.add('active');
content.style.maxHeight = content.scrollHeight + 'px';
if (icon) {
icon.classList.remove('icon-chevron-down');
icon.classList.add('icon-chevron-up');
}
}
}
});
33 changes: 33 additions & 0 deletions app/assets/javascripts/contributors_cards.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
document.addEventListener('click', function(e) {
// Handle contributor and enlistment card headers
var cardHeader = e.target.closest('.contributor-card-item .card-item-header, .enlistment-card-item .card-item-header');
if (cardHeader) {
// Skip if clicking a link
if (e.target.closest('a, .contributor-link')) {
return;
}
e.preventDefault();
cardHeader.closest('.contributor-card-item, .enlistment-card-item').classList.toggle('expanded');
return;
}

// Handle about code locations card header
var aboutHeader = e.target.closest('.about-code-locations-card .card-header');
if (aboutHeader) {
aboutHeader.closest('.about-code-locations-card').classList.toggle('expanded');
return;
}

// Handle about account basics card header
var basicsHeader = e.target.closest('.about-account-basics-card .card-header');
if (basicsHeader) {
basicsHeader.closest('.about-account-basics-card').classList.toggle('expanded');
return;
}

// Handle about project basics card header
var projectBasicsHeader = e.target.closest('.about-project-basics-card .card-header');
if (projectBasicsHeader) {
projectBasicsHeader.closest('.about-project-basics-card').classList.toggle('expanded');
}
});
48 changes: 39 additions & 9 deletions app/assets/javascripts/demographics.js.coffee
Original file line number Diff line number Diff line change
@@ -1,21 +1,51 @@
ProjectDemographics =
chart: null

DESCRIPTIONS:
'Inactive': 'No recent activity'
'Very Low': 'Minimal activity'
'Low': 'Low activity'
'Moderate': 'Moderate activity'
'High': 'High activity'
'Very High': 'Very high activity'
'New': 'Newly added project'

init: () ->
return if $('#project_demographics').length == 0
return if $('#demographics_chart').length == 0

$.ajax
url: $('#demographics_chart').data('src')
cache: false
success: (data) ->
return if (data == null)
chart = new Highcharts.Chart(data);
ProjectDemographics.tooltip_formatter(chart)
data.tooltip ||= {}
data.tooltip.formatter = () ->
name = if @point?.name then @point.name else @series?.name or ''
pct = if @y? then @y else 0
desc = ProjectDemographics.DESCRIPTIONS[name] or ''
isMobile = window.innerWidth <= 768
if isMobile
"<span class='hc-tooltip-name'>#{name}</span><span class='hc-tooltip-value'>#{pct}%</span>"
else
descHtml = if desc then "<span class='hc-tooltip-desc'>#{desc}</span>" else ''
"<span class='hc-tooltip-name'>#{name}</span>#{descHtml}<span class='hc-tooltip-value'>#{pct}%</span>"

# On touch/mobile devices, disable allowPointSelect so tap shows tooltip
# instead of triggering slice selection animation
isTouch = 'ontouchstart' of window or navigator.maxTouchPoints > 0
if isTouch
data.plotOptions ||= {}
data.plotOptions.pie ||= {}
data.plotOptions.pie.allowPointSelect = false
data.plotOptions.pie.stickyTracking = true

tooltip_formatter: (chart) ->
chart.tooltip.options.formatter = () ->
if this.point.name
"#{this.point.name}: #{this.y}%"
else
"#{this.series.name}: #{this.y}%"
ProjectDemographics.chart = new Highcharts.Chart(data)

reflow: () ->
ProjectDemographics.chart.reflow() if ProjectDemographics.chart

$(document).on 'page:change', ->
ProjectDemographics.init()

$(window).on 'resize', ->
ProjectDemographics.reflow()
71 changes: 71 additions & 0 deletions app/assets/javascripts/dropdown_handler.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
// Dropdown menu handler for logged user menu
(function($) {
'use strict';

function initDropdown() {
var $dropdown = $('#logged_user_menu');

if ($dropdown.length === 0) {
return; // Dropdown not found (user not logged in)
}

var $toggle = $dropdown.find('.dropdown-toggle');
var $menu = $dropdown.find('.dropdown-menu');

// Remove any existing event handlers
$toggle.off('click.userDropdown');
$(document).off('click.userDropdown keydown.userDropdown');
$menu.find('a').off('click.userDropdown');

// Toggle dropdown on click
$toggle.on('click.userDropdown', function(e) {
e.preventDefault();
e.stopPropagation();

var wasOpen = $dropdown.hasClass('open');

// Close all dropdowns first
$('.dropdown').removeClass('open');

// Toggle this dropdown
if (!wasOpen) {
$dropdown.addClass('open');
}

return false;
});

// Close dropdown when clicking outside
$(document).on('click.userDropdown', function(e) {
var $target = $(e.target);
if (!$dropdown.is($target) && $dropdown.has($target).length === 0) {
$dropdown.removeClass('open');
}
});

// Close dropdown when clicking a menu item
$menu.find('a').on('click.userDropdown', function() {
setTimeout(function() {
$dropdown.removeClass('open');
}, 150);
});

// Close dropdown on ESC key
$(document).on('keydown.userDropdown', function(e) {
if (e.keyCode === 27) {
$dropdown.removeClass('open');
}
});
}

// Initialize when DOM is ready
$(document).ready(function() {
initDropdown();
});

// Re-initialize on Turbolinks page change
$(document).on('page:change', function() {
initDropdown();
});

})(jQuery);
2 changes: 1 addition & 1 deletion app/assets/javascripts/enlistments.js.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ class App.EnlistmentSelect
showSpinnerAndSubmit = ->
$(this).attr('disabled', 'disabled')
$('.enlistment .spinner').show()
$('.well.enlistment form').submit()
$('.enlistment form').submit()

hideAllScmInfo = ->
$('.enlistment .scm_info').hide()
Expand Down
92 changes: 88 additions & 4 deletions app/assets/javascripts/explore.js.coffee
Original file line number Diff line number Diff line change
@@ -1,6 +1,19 @@
$(document).on 'click', '.tag-search-btn', ->
tag = $(this).siblings('.tag-input').val()
if tag.length > 0
window.location.href = '/tags?names=' + encodeURIComponent(tag)
return false

$(document).on 'keydown', '.tag-input', (e) ->
if e.which == 13
e.preventDefault()
tag = $(this).val()
if tag.length > 0
window.location.href = '/tags?names=' + encodeURIComponent(tag)
return false
App.Explore =
init: () ->
return if $('#explore_projects_page').length == 0
return if $('#explore_projects_page').length == 0 && $('.explore-projects-page').length == 0

$('#explore_search_form .icon-search').click (e) ->
e.preventDefault()
Expand All @@ -13,22 +26,93 @@ App.Explore =
$(this).siblings('.icon-search').trigger('click')
return false

$('.similar_projects .icon-search').click (e) ->
$('.similar_projects .icon-search, .similar-card .search-icon-btn').click (e) ->
$(this).parents('form:first').trigger('submit')

$('form[rel=similar_project_jump]').submit (e) ->
projectId = $("#project").val()
projectId = $(this).find('input[name="project"]').val()
if projectId != ''
e.preventDefault()
window.location.href = "/p/#{projectId.toLowerCase()}/similar"
else
$('span.error').removeClass('hidden')
$(this).find('span.error').removeClass('hidden')
false

$('form[rel=sort_filter] select').change () ->
if $('#explore_projects_page') && $(this).val() == ''
$(this).attr('disabled', 'disabled')
$(this).parents('form').attr('action', document.location).submit()

# Discover More collapsible toggle (mobile/tablet)
$(document).on 'click', '.discover-toggle', (e) ->
content = $(this).siblings('.discover-content')
content.toggleClass('show')
chevron = $(this).find('.chevron')
chevron.text(if content.hasClass('show') then '▲' else '▼')

# Language filter dropdown toggle
$(document).on 'click', '.language-toggle', (e) ->
e.stopPropagation()
menu = $(this).siblings('.language-dropdown-menu')
menu.toggleClass('show')

$(document).on 'click', (e) ->
unless $(e.target).closest('.language-dropdown').length
$('.language-dropdown-menu').removeClass('show')

$(document).on 'page:change', ->
App.Explore.init()

# ── PAI Tooltip ──────────────────────────────────────────────────────────────
# Runs once at module level; uses event delegation so no re-binding needed.
# position:fixed tooltip appended to <body> escapes overflow/transform clipping.
$('<div id="pai-global-tooltip"></div>').appendTo('body')

stripPaiTitles = ->
$('.pai-tooltip-wrapper [title]').each ->
$(this).removeAttr('title')

showPaiTooltip = (wrapper) ->
text = wrapper.data('tooltip')
return unless text
# Strip native title to prevent browser double-tooltip
wrapper.find('[title]').removeAttr('title')
tooltip = $('#pai-global-tooltip')
tooltip.text(text)
tooltip.css(visibility: 'hidden', display: 'block')
tw = tooltip.outerWidth()
th = tooltip.outerHeight()
tooltip.css(visibility: '', display: 'none')
rect = wrapper[0].getBoundingClientRect()
left = rect.left + (rect.width / 2) - (tw / 2)
top = rect.top - th - 10
left = Math.max(8, Math.min(left, window.innerWidth - tw - 8))
if top < 8
top = rect.bottom + 10
tooltip.css(left: left, top: top).addClass('visible')

hidePaiTooltip = ->
$('#pai-global-tooltip').removeClass('visible')

# Desktop hover
$(document).on 'mouseenter', '.pai-tooltip-wrapper', ->
showPaiTooltip($(this))
$(document).on 'mouseleave', '.pai-tooltip-wrapper', ->
hidePaiTooltip()

# Mobile/tablet tap toggle
$(document).on 'touchstart', '.pai-tooltip-wrapper', (e) ->
e.preventDefault()
e.stopPropagation()
if $('#pai-global-tooltip').hasClass('visible')
hidePaiTooltip()
else
showPaiTooltip($(this))
$(document).on 'touchstart', (e) ->
unless $(e.target).closest('.pai-tooltip-wrapper').length
hidePaiTooltip()

# Strip native [title] on every page load (prevents browser double-tooltip)
document.addEventListener 'DOMContentLoaded', stripPaiTitles
document.addEventListener 'turbolinks:load', stripPaiTitles
document.addEventListener 'page:change', stripPaiTitles
2 changes: 1 addition & 1 deletion app/assets/javascripts/home.js.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ $(document).on 'page:change', ->
divs = $('p[id^="content-"]')
i = 0
do ->
divs.eq(i).removeClass('hide').fadeIn(400).delay(6000).fadeOut 400, arguments.callee
divs.eq(i).removeClass('hide').fadeIn(200).delay(2500).fadeOut 200, arguments.callee
i = ++i % divs.length

$('#icon_text').click ->
Expand Down
Loading