diff --git a/app/helpers/projects_helper.rb b/app/helpers/projects_helper.rb
index d2177f683a1a9caef7e3dd747b71f3d39df3efed..8a28b6c5d40a5dc0b7b2e0c22eb9548e2dcae2d1 100644
--- a/app/helpers/projects_helper.rb
+++ b/app/helpers/projects_helper.rb
@@ -171,48 +171,27 @@ module ProjectsHelper
       nav_tabs << :merge_requests
     end
 
-    if can?(current_user, :read_pipeline, project)
-      nav_tabs << :pipelines
-    end
-
-    if can?(current_user, :read_build, project)
-      nav_tabs << :builds
-    end
-
     if Gitlab.config.registry.enabled && can?(current_user, :read_container_image, project)
       nav_tabs << :container_registry
     end
 
-    if can?(current_user, :read_environment, project)
-      nav_tabs << :environments
-    end
-
-    if can?(current_user, :admin_project, project)
-      nav_tabs << :settings
-    end
-
-    if can?(current_user, :read_project_member, project)
-      nav_tabs << :team
-    end
-
-    if can?(current_user, :read_issue, project)
-      nav_tabs << :issues
-    end
-
-    if can?(current_user, :read_wiki, project)
-      nav_tabs << :wiki
-    end
-
-    if can?(current_user, :read_project_snippet, project)
-      nav_tabs << :snippets
-    end
-
-    if can?(current_user, :read_label, project)
-      nav_tabs << :labels
-    end
+    tab_ability_map = {
+      environments: :read_environment,
+      milestones:   :read_milestone,
+      pipelines:    :read_pipeline,
+      snippets:     :read_project_snippet,
+      settings:     :admin_project,
+      builds:       :read_build,
+      labels:       :read_label,
+      issues:       :read_issue,
+      team:         :read_project_member,
+      wiki:         :read_wiki
+    }
 
-    if can?(current_user, :read_milestone, project)
-      nav_tabs << :milestones
+    tab_ability_map.each do |tab, ability|
+      if can?(current_user, ability, project)
+        nav_tabs << tab
+      end
     end
 
     nav_tabs.flatten
diff --git a/app/policies/project_policy.rb b/app/policies/project_policy.rb
index b5db9c12622945da490221b484dff873f38f9cb5..e06818a04562ed9d40c342076706cb52bc7d5a80 100644
--- a/app/policies/project_policy.rb
+++ b/app/policies/project_policy.rb
@@ -171,9 +171,7 @@ class ProjectPolicy < BasePolicy
   def disabled_features!
     repository_enabled = project.feature_available?(:repository, user)
 
-    unless project.feature_available?(:issues, user)
-      cannot!(*named_abilities(:issue))
-    end
+    block_issues_abilities
 
     unless project.feature_available?(:merge_requests, user) && repository_enabled
       cannot!(*named_abilities(:merge_request))
@@ -250,6 +248,15 @@ class ProjectPolicy < BasePolicy
       )
   end
 
+  def block_issues_abilities
+    unless project.feature_available?(:issues, user)
+      cannot! :read_issue if project.default_issues_tracker?
+      cannot! :create_issue
+      cannot! :update_issue
+      cannot! :admin_issue
+    end
+  end
+
   def named_abilities(name)
     [
       :"read_#{name}",
diff --git a/changelogs/unreleased/issue_25682.yml b/changelogs/unreleased/issue_25682.yml
new file mode 100644
index 0000000000000000000000000000000000000000..a50138756ba0464f1894947cde36e7ab2c46b988
--- /dev/null
+++ b/changelogs/unreleased/issue_25682.yml
@@ -0,0 +1,4 @@
+---
+title: Parse JIRA issue references even if Issue Tracker is disabled
+merge_request:
+author:
diff --git a/spec/features/projects/features_visibility_spec.rb b/spec/features/projects/features_visibility_spec.rb
index 3bb33394be7a678529003bbbe30c14b5ec636a21..9079350186def349fcaf7f39b886a2df2a7a12c6 100644
--- a/spec/features/projects/features_visibility_spec.rb
+++ b/spec/features/projects/features_visibility_spec.rb
@@ -42,6 +42,17 @@ describe 'Edit Project Settings', feature: true do
       end
     end
 
+    context "When external issue tracker is enabled" do
+      it "does not hide issues tab" do
+        project.project_feature.update(issues_access_level: ProjectFeature::DISABLED)
+        allow_any_instance_of(Project).to receive(:external_issue_tracker).and_return(JiraService.new)
+
+        visit namespace_project_path(project.namespace, project)
+
+        expect(page).to have_selector(".shortcuts-issues")
+      end
+    end
+
     context "pipelines subtabs" do
       it "shows builds when enabled" do
         visit namespace_project_pipelines_path(project.namespace, project)
diff --git a/spec/lib/banzai/reference_parser/external_issue_parser_spec.rb b/spec/lib/banzai/reference_parser/external_issue_parser_spec.rb
index 50a5d1a19ba04198b2f0464555751f18d972d3a4..0af36776a54f9bced08dc5dddefee83e417edfc4 100644
--- a/spec/lib/banzai/reference_parser/external_issue_parser_spec.rb
+++ b/spec/lib/banzai/reference_parser/external_issue_parser_spec.rb
@@ -12,7 +12,17 @@ describe Banzai::ReferenceParser::ExternalIssueParser, lib: true do
     context 'when the link has a data-issue attribute' do
       before { link['data-external-issue'] = 123 }
 
-      it_behaves_like "referenced feature visibility", "issues"
+      levels = [ProjectFeature::DISABLED, ProjectFeature::PRIVATE, ProjectFeature::ENABLED]
+
+      levels.each do |level|
+        it "creates reference when the feature is #{level}" do
+          project.project_feature.update(issues_access_level: level)
+
+          visible_nodes = subject.nodes_visible_to_user(user, [link])
+
+          expect(visible_nodes).to include(link)
+        end
+      end
     end
   end