From b5769ae69350f9d93bf01bee37709b0995649d44 Mon Sep 17 00:00:00 2001 From: Eduard Heimbuch Date: Wed, 4 Sep 2019 13:34:30 +0200 Subject: [PATCH 1/9] check if sources view should redirect to defaultBranch --- scm-ui/src/repos/sources/containers/Sources.js | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/scm-ui/src/repos/sources/containers/Sources.js b/scm-ui/src/repos/sources/containers/Sources.js index 9a485459a6..33301b6a43 100644 --- a/scm-ui/src/repos/sources/containers/Sources.js +++ b/scm-ui/src/repos/sources/containers/Sources.js @@ -69,7 +69,7 @@ class Sources extends React.Component { fetchBranches(repository); fetchSources(repository, revision, path); - if (branches) { + if (this.shouldRedirect()) { const defaultBranches = branches.filter(b => b.defaultBranch); if (defaultBranches.length > 0) @@ -91,12 +91,7 @@ class Sources extends React.Component { fetchSources(repository, revision, path); } - const currentUrl = this.props.location.pathname; - - if ( - branches && - (currentUrl.endsWith("sources") || currentUrl.endsWith("sources/")) - ) { + if (this.shouldRedirect()) { const defaultBranches = branches.filter(b => b.defaultBranch); if (defaultBranches.length > 0) @@ -105,6 +100,15 @@ class Sources extends React.Component { } } + shouldRedirect = () => { + const { branches, location } = this.props; + return ( + branches && + (location.pathname.endsWith("sources") || + location.pathname.endsWith("sources/")) + ); + }; + branchSelected = (branch?: Branch) => { const { baseUrl, history, path } = this.props; let url; From 199e1c2c208d4450600dc3817b7b7d65149acc79 Mon Sep 17 00:00:00 2001 From: Rene Pfeuffer Date: Wed, 4 Sep 2019 14:47:13 +0200 Subject: [PATCH 2/9] Fix content type of requests Without this fix, a content type would be stored in the headers array of the constant fetchOptions once they are set. This way they will be used whenever no explicit content type is set, which is (and mus be) the case for multipart form data. --- .../packages/ui-components/src/apiclient.js | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/scm-ui-components/packages/ui-components/src/apiclient.js b/scm-ui-components/packages/ui-components/src/apiclient.js index 80c2c4dbfa..2ad0cd1f9f 100644 --- a/scm-ui-components/packages/ui-components/src/apiclient.js +++ b/scm-ui-components/packages/ui-components/src/apiclient.js @@ -3,17 +3,16 @@ import { contextPath } from "./urls"; import { createBackendError, ForbiddenError, isBackendError, UnauthorizedError } from "./errors"; import type { BackendErrorContent } from "./errors"; -const fetchOptions: RequestOptions = { - credentials: "same-origin", - headers: { +const applyFetchOptions: (RequestOptions) => RequestOptions = o => { + o.credentials = "same-origin"; + o.headers = { Cache: "no-cache", // identify the request as ajax request "X-Requested-With": "XMLHttpRequest" - } + }; + return o; }; - - function handleFailure(response: Response) { if (!response.ok) { if (isBackendError(response)) { @@ -47,7 +46,7 @@ export function createUrl(url: string) { class ApiClient { get(url: string): Promise { - return fetch(createUrl(url), fetchOptions).then(handleFailure); + return fetch(createUrl(url), applyFetchOptions).then(handleFailure); } post(url: string, payload: any, contentType: string = "application/json") { @@ -73,7 +72,7 @@ class ApiClient { let options: RequestOptions = { method: "HEAD" }; - options = Object.assign(options, fetchOptions); + options = applyFetchOptions(options); return fetch(createUrl(url), options).then(handleFailure); } @@ -81,7 +80,7 @@ class ApiClient { let options: RequestOptions = { method: "DELETE" }; - options = Object.assign(options, fetchOptions); + options = applyFetchOptions(options); return fetch(createUrl(url), options).then(handleFailure); } @@ -99,7 +98,7 @@ class ApiClient { } httpRequestWithBinaryBody(options: RequestOptions, url: string, contentType?: string) { - options = Object.assign(options, fetchOptions); + options = applyFetchOptions(options); if (contentType) { // $FlowFixMe options.headers["Content-Type"] = contentType; From a95cd9c4161e9ac91ef24048f628faac93fedeb6 Mon Sep 17 00:00:00 2001 From: Eduard Heimbuch Date: Wed, 4 Sep 2019 15:06:04 +0200 Subject: [PATCH 3/9] fix redirect --- .../packages/ui-components/src/Breadcrumb.js | 7 ++++- .../src/repos/sources/containers/Sources.js | 30 +++++++------------ 2 files changed, 17 insertions(+), 20 deletions(-) diff --git a/scm-ui-components/packages/ui-components/src/Breadcrumb.js b/scm-ui-components/packages/ui-components/src/Breadcrumb.js index d81a4cbf63..b9011f5936 100644 --- a/scm-ui-components/packages/ui-components/src/Breadcrumb.js +++ b/scm-ui-components/packages/ui-components/src/Breadcrumb.js @@ -77,7 +77,12 @@ class Breadcrumb extends React.Component { b.name === revision).length > 0 }} + props={{ + baseUrl, + branch: branch ? branch : defaultBranch, + path, + isBranchUrl: branches && + branches.filter(b => b.name.replace("/", "%2F") === revision).length > 0 }} renderAll={true} /> diff --git a/scm-ui/src/repos/sources/containers/Sources.js b/scm-ui/src/repos/sources/containers/Sources.js index 33301b6a43..ddf71e9315 100644 --- a/scm-ui/src/repos/sources/containers/Sources.js +++ b/scm-ui/src/repos/sources/containers/Sources.js @@ -61,44 +61,36 @@ class Sources extends React.Component { repository, revision, path, - branches, - baseUrl, fetchSources } = this.props; fetchBranches(repository); fetchSources(repository, revision, path); - if (this.shouldRedirect()) { - const defaultBranches = branches.filter(b => b.defaultBranch); - - if (defaultBranches.length > 0) - this.setState({ selectedBranch: defaultBranches[0] }); - this.props.history.push(`${baseUrl}/${defaultBranches[0].name}/`); - } + this.redirectToDefaultBranch(); } componentDidUpdate(prevProps) { - const { - fetchSources, - repository, - revision, - path, - branches, - baseUrl - } = this.props; + const { fetchSources, repository, revision, path } = this.props; if (prevProps.revision !== revision || prevProps.path !== path) { fetchSources(repository, revision, path); } + this.redirectToDefaultBranch(); + } + + redirectToDefaultBranch = () => { + const { branches, baseUrl } = this.props; if (this.shouldRedirect()) { const defaultBranches = branches.filter(b => b.defaultBranch); if (defaultBranches.length > 0) this.setState({ selectedBranch: defaultBranches[0] }); - this.props.history.push(`${baseUrl}/${defaultBranches[0].name}/`); + this.props.history.push( + `${baseUrl}/${defaultBranches[0].name.replace("/", "%2F")}/` + ); } - } + }; shouldRedirect = () => { const { branches, location } = this.props; From 044c9804c4a0867f5cb25030fe7f9fa80dbf9523 Mon Sep 17 00:00:00 2001 From: Rene Pfeuffer Date: Wed, 4 Sep 2019 15:21:06 +0200 Subject: [PATCH 4/9] Fix check for redirect on sources --- scm-ui/src/repos/sources/containers/Sources.js | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/scm-ui/src/repos/sources/containers/Sources.js b/scm-ui/src/repos/sources/containers/Sources.js index ddf71e9315..a2d933583b 100644 --- a/scm-ui/src/repos/sources/containers/Sources.js +++ b/scm-ui/src/repos/sources/containers/Sources.js @@ -93,12 +93,8 @@ class Sources extends React.Component { }; shouldRedirect = () => { - const { branches, location } = this.props; - return ( - branches && - (location.pathname.endsWith("sources") || - location.pathname.endsWith("sources/")) - ); + const { branches, revision } = this.props; + return branches && !revision; }; branchSelected = (branch?: Branch) => { From cdc34be1132fd6597f122085f9f79fb49033c4b7 Mon Sep 17 00:00:00 2001 From: Eduard Heimbuch Date: Wed, 4 Sep 2019 15:39:02 +0200 Subject: [PATCH 5/9] fix defaultBranch check --- scm-ui/src/repos/sources/containers/Sources.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/scm-ui/src/repos/sources/containers/Sources.js b/scm-ui/src/repos/sources/containers/Sources.js index a2d933583b..cba3f1209b 100644 --- a/scm-ui/src/repos/sources/containers/Sources.js +++ b/scm-ui/src/repos/sources/containers/Sources.js @@ -84,11 +84,12 @@ class Sources extends React.Component { if (this.shouldRedirect()) { const defaultBranches = branches.filter(b => b.defaultBranch); - if (defaultBranches.length > 0) + if (defaultBranches.length > 0) { this.setState({ selectedBranch: defaultBranches[0] }); - this.props.history.push( - `${baseUrl}/${defaultBranches[0].name.replace("/", "%2F")}/` - ); + this.props.history.push( + `${baseUrl}/${defaultBranches[0].name.replace("/", "%2F")}/` + ); + } } }; From c5a90963bab50493ace3b5518fe851530051d1fd Mon Sep 17 00:00:00 2001 From: Eduard Heimbuch Date: Thu, 5 Sep 2019 07:44:19 +0200 Subject: [PATCH 6/9] use encodedUriComponent to encode branchName --- scm-ui/src/repos/sources/containers/Sources.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scm-ui/src/repos/sources/containers/Sources.js b/scm-ui/src/repos/sources/containers/Sources.js index cba3f1209b..5e97617067 100644 --- a/scm-ui/src/repos/sources/containers/Sources.js +++ b/scm-ui/src/repos/sources/containers/Sources.js @@ -87,7 +87,7 @@ class Sources extends React.Component { if (defaultBranches.length > 0) { this.setState({ selectedBranch: defaultBranches[0] }); this.props.history.push( - `${baseUrl}/${defaultBranches[0].name.replace("/", "%2F")}/` + `${baseUrl}/${encodeURIComponent(defaultBranches[0].name)}/` ); } } From 231d4d88104f3c8275bea7cbb54010a3ec518c02 Mon Sep 17 00:00:00 2001 From: Eduard Heimbuch Date: Thu, 5 Sep 2019 07:59:15 +0200 Subject: [PATCH 7/9] move fileSize to ui-components so it available for plugins --- .../packages/ui-components/src}/FileSize.js | 0 .../packages/ui-components/src}/FileSize.test.js | 0 scm-ui-components/packages/ui-components/src/index.js | 1 + scm-ui/src/repos/sources/components/FileTreeLeaf.js | 3 +-- scm-ui/src/repos/sources/containers/Content.js | 3 +-- 5 files changed, 3 insertions(+), 4 deletions(-) rename {scm-ui/src/repos/sources/components => scm-ui-components/packages/ui-components/src}/FileSize.js (100%) rename {scm-ui/src/repos/sources/components => scm-ui-components/packages/ui-components/src}/FileSize.test.js (100%) diff --git a/scm-ui/src/repos/sources/components/FileSize.js b/scm-ui-components/packages/ui-components/src/FileSize.js similarity index 100% rename from scm-ui/src/repos/sources/components/FileSize.js rename to scm-ui-components/packages/ui-components/src/FileSize.js diff --git a/scm-ui/src/repos/sources/components/FileSize.test.js b/scm-ui-components/packages/ui-components/src/FileSize.test.js similarity index 100% rename from scm-ui/src/repos/sources/components/FileSize.test.js rename to scm-ui-components/packages/ui-components/src/FileSize.test.js diff --git a/scm-ui-components/packages/ui-components/src/index.js b/scm-ui-components/packages/ui-components/src/index.js index 91cfe7ef72..35acd26369 100644 --- a/scm-ui-components/packages/ui-components/src/index.js +++ b/scm-ui-components/packages/ui-components/src/index.js @@ -19,6 +19,7 @@ export { default as Paginator } from "./Paginator.js"; export { default as LinkPaginator } from "./LinkPaginator.js"; export { default as StatePaginator } from "./StatePaginator.js"; +export { default as FileSize } from "./FileSize.js"; export { default as ProtectedRoute } from "./ProtectedRoute.js"; export { default as Help } from "./Help"; export { default as HelpIcon } from "./HelpIcon"; diff --git a/scm-ui/src/repos/sources/components/FileTreeLeaf.js b/scm-ui/src/repos/sources/components/FileTreeLeaf.js index d3c81b960c..2515891de0 100644 --- a/scm-ui/src/repos/sources/components/FileTreeLeaf.js +++ b/scm-ui/src/repos/sources/components/FileTreeLeaf.js @@ -1,8 +1,7 @@ //@flow import * as React from "react"; import injectSheet from "react-jss"; -import { DateFromNow } from "@scm-manager/ui-components"; -import FileSize from "./FileSize"; +import { DateFromNow, FileSize } from "@scm-manager/ui-components"; import FileIcon from "./FileIcon"; import { Link } from "react-router-dom"; import type { File } from "@scm-manager/ui-types"; diff --git a/scm-ui/src/repos/sources/containers/Content.js b/scm-ui/src/repos/sources/containers/Content.js index 64a0fb472f..14a7bfe70b 100644 --- a/scm-ui/src/repos/sources/containers/Content.js +++ b/scm-ui/src/repos/sources/containers/Content.js @@ -2,8 +2,7 @@ import React from "react"; import { translate } from "react-i18next"; import type { File, Repository } from "@scm-manager/ui-types"; -import { DateFromNow, ButtonGroup } from "@scm-manager/ui-components"; -import FileSize from "../components/FileSize"; +import { DateFromNow, ButtonGroup, FileSize } from "@scm-manager/ui-components"; import injectSheet from "react-jss"; import classNames from "classnames"; import FileButtonGroup from "../components/content/FileButtonGroup"; From d2ad6eb2f6bafbaa3952f0861abbe40996e448a0 Mon Sep 17 00:00:00 2001 From: Eduard Heimbuch Date: Thu, 5 Sep 2019 08:09:49 +0200 Subject: [PATCH 8/9] use 1000 instead of 1024 to show correct fileSize --- scm-ui-components/packages/ui-components/src/FileSize.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scm-ui-components/packages/ui-components/src/FileSize.js b/scm-ui-components/packages/ui-components/src/FileSize.js index c7d966d901..2796e0fd0c 100644 --- a/scm-ui-components/packages/ui-components/src/FileSize.js +++ b/scm-ui-components/packages/ui-components/src/FileSize.js @@ -12,9 +12,9 @@ class FileSize extends React.Component { } const units = ["B", "K", "M", "G", "T", "P", "E", "Z", "Y"]; - const i = Math.floor(Math.log(bytes) / Math.log(1024)); + const i = Math.floor(Math.log(bytes) / Math.log(1000)); - const size = i === 0 ? bytes : (bytes / 1024 ** i).toFixed(2); + const size = i === 0 ? bytes : (bytes / 1000 ** i).toFixed(2); return `${size} ${units[i]}`; } From 0226ae14799012b97b3830104dfa3ab7ae532db5 Mon Sep 17 00:00:00 2001 From: Eduard Heimbuch Date: Thu, 5 Sep 2019 06:38:40 +0000 Subject: [PATCH 9/9] Close branch feature/editor_plugin_upload