Commit 00fc9f26 authored by Douwe Maan's avatar Douwe Maan

Load tree readme asynchronously

parent ecc6cc8b
...@@ -8,7 +8,10 @@ export default class BlobViewer { ...@@ -8,7 +8,10 @@ export default class BlobViewer {
this.richViewer = document.querySelector('.blob-viewer[data-type="rich"]'); this.richViewer = document.querySelector('.blob-viewer[data-type="rich"]');
this.$fileHolder = $('.file-holder'); this.$fileHolder = $('.file-holder');
let initialViewerName = document.querySelector('.blob-viewer:not(.hidden)').getAttribute('data-type'); const initialViewer = document.querySelector('.blob-viewer:not(.hidden)');
if (!initialViewer) return;
let initialViewerName = initialViewer.getAttribute('data-type');
this.initBindings(); this.initBindings();
......
...@@ -246,6 +246,7 @@ const ShortcutsBlob = require('./shortcuts_blob'); ...@@ -246,6 +246,7 @@ const ShortcutsBlob = require('./shortcuts_blob');
new NotificationsForm(); new NotificationsForm();
if ($('#tree-slider').length) { if ($('#tree-slider').length) {
new TreeView(); new TreeView();
new BlobViewer();
} }
break; break;
case 'projects:pipelines:builds': case 'projects:pipelines:builds':
...@@ -300,6 +301,7 @@ const ShortcutsBlob = require('./shortcuts_blob'); ...@@ -300,6 +301,7 @@ const ShortcutsBlob = require('./shortcuts_blob');
case 'projects:tree:show': case 'projects:tree:show':
shortcut_handler = new ShortcutsNavigation(); shortcut_handler = new ShortcutsNavigation();
new TreeView(); new TreeView();
new BlobViewer();
gl.TargetBranchDropDown.bootstrap(); gl.TargetBranchDropDown.bootstrap();
break; break;
case 'projects:find_file:show': case 'projects:find_file:show':
......
class ReadmeBlob < SimpleDelegator
attr_reader :repository
def initialize(blob, repository)
@repository = repository
super(blob)
end
def rendered_markup
repository.rendered_readme
end
end
...@@ -518,7 +518,7 @@ class Repository ...@@ -518,7 +518,7 @@ class Repository
def readme def readme
if head = tree(:head) if head = tree(:head)
head.readme ReadmeBlob.new(head.readme, self)
end end
end end
......
...@@ -40,10 +40,7 @@ class Tree ...@@ -40,10 +40,7 @@ class Tree
readme_path = path == '/' ? readme_tree.name : File.join(path, readme_tree.name) readme_path = path == '/' ? readme_tree.name : File.join(path, readme_tree.name)
git_repo = repository.raw_repository @readme = repository.blob_at(sha, readme_path)
@readme = Gitlab::Git::Blob.find(git_repo, sha, readme_path)
@readme.load_all_data!(git_repo)
@readme
end end
def trees def trees
......
...@@ -2,9 +2,9 @@ ...@@ -2,9 +2,9 @@
%article.readme-holder %article.readme-holder
.pull-right .pull-right
- if can?(current_user, :push_code, @project) - if can?(current_user, :push_code, @project)
= link_to icon('pencil'), namespace_project_edit_blob_path(@project.namespace, @project, tree_join(@repository.root_ref, readme.name)), class: 'light edit-project-readme' = link_to icon('pencil'), namespace_project_edit_blob_path(@project.namespace, @project, tree_join(@repository.root_ref, readme.path)), class: 'light edit-project-readme'
.file-content.wiki
= markup(readme.name, readme.data, rendered: @repository.rendered_readme) = render 'projects/blob/viewer', viewer: readme.rich_viewer, viewer_url: namespace_project_blob_path(@project.namespace, @project, tree_join(@repository.root_ref, readme.path), viewer: :rich, format: :json)
- else - else
.row-content-block.second-block.center .row-content-block.second-block.center
%h3.page-title %h3.page-title
......
...@@ -2,8 +2,8 @@ ...@@ -2,8 +2,8 @@
- render_error = viewer.render_error - render_error = viewer.render_error
- load_asynchronously = local_assigns.fetch(:load_asynchronously, viewer.server_side?) && render_error.nil? - load_asynchronously = local_assigns.fetch(:load_asynchronously, viewer.server_side?) && render_error.nil?
- url = url_for(params.merge(viewer: viewer.type, format: :json)) if load_asynchronously - viewer_url = local_assigns.fetch(:viewer_url) { url_for(params.merge(viewer: viewer.type, format: :json)) } if load_asynchronously
.blob-viewer{ data: { type: viewer.type, url: url }, class: ('hidden' if hidden) } .blob-viewer{ data: { type: viewer.type, url: viewer_url }, class: ('hidden' if hidden) }
- if load_asynchronously - if load_asynchronously
.text-center.prepend-top-default.append-bottom-default .text-center.prepend-top-default.append-bottom-default
= icon('spinner spin 2x', 'aria-hidden' => 'true', 'aria-label' => 'Loading content') = icon('spinner spin 2x', 'aria-hidden' => 'true', 'aria-label' => 'Loading content')
......
%article.file-holder.readme-holder %article.file-holder.readme-holder
.js-file-title.file-title .js-file-title.file-title
= blob_icon readme.mode, readme.name = blob_icon readme.mode, readme.name
= link_to namespace_project_blob_path(@project.namespace, @project, tree_join(@ref, @path, readme.name)) do = link_to namespace_project_blob_path(@project.namespace, @project, tree_join(@ref, readme.path)) do
%strong %strong
= readme.name = readme.name
.file-content.wiki
= markup(readme.name, readme.data) = render 'projects/blob/viewer', viewer: readme.rich_viewer, viewer_url: namespace_project_blob_path(@project.namespace, @project, tree_join(@ref, readme.path), viewer: :rich, format: :json)
---
title: Load tree readme asynchronously
merge_request:
author:
...@@ -18,6 +18,7 @@ Feature: Project ...@@ -18,6 +18,7 @@ Feature: Project
Then I should see the default project avatar Then I should see the default project avatar
And I should not see the "Remove avatar" button And I should not see the "Remove avatar" button
@javascript
Scenario: I should have readme on page Scenario: I should have readme on page
And I visit project "Shop" page And I visit project "Shop" page
Then I should see project "Shop" README Then I should see project "Shop" README
......
...@@ -19,12 +19,14 @@ Feature: Project Source Markdown Render ...@@ -19,12 +19,14 @@ Feature: Project Source Markdown Render
And I click on Gitlab API in README And I click on Gitlab API in README
Then I should see correct document rendered Then I should see correct document rendered
@javascript
Scenario: I view README in markdown branch Scenario: I view README in markdown branch
Then I should see files from repository in markdown Then I should see files from repository in markdown
And I should see rendered README which contains correct links And I should see rendered README which contains correct links
And I click on Rake tasks in README And I click on Rake tasks in README
Then I should see correct directory rendered Then I should see correct directory rendered
@javascript
Scenario: I view README in markdown branch to see reference links to directory Scenario: I view README in markdown branch to see reference links to directory
Then I should see files from repository in markdown Then I should see files from repository in markdown
And I should see rendered README which contains correct links And I should see rendered README which contains correct links
...@@ -74,6 +76,7 @@ Feature: Project Source Markdown Render ...@@ -74,6 +76,7 @@ Feature: Project Source Markdown Render
And I click on Gitlab API in README And I click on Gitlab API in README
Then I should see correct document rendered for markdown branch Then I should see correct document rendered for markdown branch
@javascript
Scenario: I browse directory from markdown branch Scenario: I browse directory from markdown branch
When I visit markdown branch When I visit markdown branch
Then I should see files from repository in markdown branch Then I should see files from repository in markdown branch
......
...@@ -2,6 +2,7 @@ class Spinach::Features::Project < Spinach::FeatureSteps ...@@ -2,6 +2,7 @@ class Spinach::Features::Project < Spinach::FeatureSteps
include SharedAuthentication include SharedAuthentication
include SharedProject include SharedProject
include SharedPaths include SharedPaths
include WaitForAjax
step 'change project settings' do step 'change project settings' do
fill_in 'project_name_edit', with: 'NewName' fill_in 'project_name_edit', with: 'NewName'
...@@ -86,6 +87,7 @@ class Spinach::Features::Project < Spinach::FeatureSteps ...@@ -86,6 +87,7 @@ class Spinach::Features::Project < Spinach::FeatureSteps
end end
step 'I should see project "Shop" README' do step 'I should see project "Shop" README' do
wait_for_ajax
page.within('.readme-holder') do page.within('.readme-holder') do
expect(page).to have_content 'testme' expect(page).to have_content 'testme'
end end
......
...@@ -120,6 +120,7 @@ class Spinach::Features::ProjectSourceMarkdownRender < Spinach::FeatureSteps ...@@ -120,6 +120,7 @@ class Spinach::Features::ProjectSourceMarkdownRender < Spinach::FeatureSteps
When 'I visit markdown branch' do When 'I visit markdown branch' do
visit namespace_project_tree_path(@project.namespace, @project, "markdown") visit namespace_project_tree_path(@project.namespace, @project, "markdown")
wait_for_ajax
end end
When 'I visit markdown branch "README.md" blob' do When 'I visit markdown branch "README.md" blob' do
......
...@@ -1634,7 +1634,7 @@ describe Repository, models: true do ...@@ -1634,7 +1634,7 @@ describe Repository, models: true do
context 'with an existing repository' do context 'with an existing repository' do
it 'returns the README' do it 'returns the README' do
expect(repository.readme).to be_an_instance_of(Gitlab::Git::Blob) expect(repository.readme).to be_an_instance_of(ReadmeBlob)
end end
end end
end end
......
...@@ -31,7 +31,7 @@ describe 'projects/tree/show' do ...@@ -31,7 +31,7 @@ describe 'projects/tree/show' do
it 'displays correctly' do it 'displays correctly' do
render render
expect(rendered).to have_css('.js-project-refs-dropdown .dropdown-toggle-text', text: ref) expect(rendered).to have_css('.js-project-refs-dropdown .dropdown-toggle-text', text: ref)
expect(rendered).to have_css('.readme-holder .file-content', text: ref) expect(rendered).to have_css('.readme-holder')
end end
end end
end end
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment