Merge with 2.0.0-m3

This commit is contained in:
Rene Pfeuffer
2019-11-21 07:39:28 +01:00
9 changed files with 111 additions and 68 deletions

View File

@@ -25,7 +25,7 @@ public class AvailablePlugin implements Plugin {
return pending;
}
public AvailablePlugin install() {
AvailablePlugin install() {
Preconditions.checkState(!pending, "installation is already pending");
return new AvailablePlugin(pluginDescriptor, true);
}

View File

@@ -27,13 +27,17 @@ const extractXsrfToken = () => {
};
const applyFetchOptions: (p: RequestInit) => RequestInit = o => {
const headers: { [key: string]: string } = {
Cache: "no-cache",
// identify the request as ajax request
"X-Requested-With": "XMLHttpRequest",
// identify the web interface
"X-SCM-Client": "WUI"
};
if (!o.headers) {
o.headers = {};
}
// @ts-ignore We are sure that here we only get headers of type Record<string, string>
const headers: Record<string, string> = o.headers;
headers["Cache"] = "no-cache";
// identify the request as ajax request
headers["X-Requested-With"] = "XMLHttpRequest";
// identify the web interface
headers["X-SCM-Client"] = "WUI";
const xsrf = extractXsrfToken();
if (xsrf) {
@@ -80,23 +84,32 @@ class ApiClient {
return fetch(createUrl(url), applyFetchOptions({})).then(handleFailure);
}
post(url: string, payload?: any, contentType = "application/json") {
return this.httpRequestWithJSONBody("POST", url, contentType, payload);
post(url: string, payload?: any, contentType = "application/json", additionalHeaders: Record<string, string> = {}) {
return this.httpRequestWithJSONBody("POST", url, contentType, additionalHeaders, payload);
}
postBinary(url: string, fileAppender: (p: FormData) => void) {
postText(url: string, payload: string, additionalHeaders: Record<string, string> = {}) {
return this.httpRequestWithTextBody("POST", url, additionalHeaders, payload);
}
putText(url: string, payload: string, additionalHeaders: Record<string, string> = {}) {
return this.httpRequestWithTextBody("PUT", url, additionalHeaders, payload);
}
postBinary(url: string, fileAppender: (p: FormData) => void, additionalHeaders: Record<string, string> = {}) {
const formData = new FormData();
fileAppender(formData);
const options: RequestInit = {
method: "POST",
body: formData
body: formData,
headers: additionalHeaders
};
return this.httpRequestWithBinaryBody(options, url);
}
put(url: string, payload: any, contentType = "application/json") {
return this.httpRequestWithJSONBody("PUT", url, contentType, payload);
put(url: string, payload: any, contentType = "application/json", additionalHeaders: Record<string, string> = {}) {
return this.httpRequestWithJSONBody("PUT", url, contentType, additionalHeaders, payload);
}
head(url: string) {
@@ -115,9 +128,16 @@ class ApiClient {
return fetch(createUrl(url), options).then(handleFailure);
}
httpRequestWithJSONBody(method: string, url: string, contentType: string, payload?: any): Promise<Response> {
httpRequestWithJSONBody(
method: string,
url: string,
contentType: string,
additionalHeaders: Record<string, string>,
payload?: any
): Promise<Response> {
const options: RequestInit = {
method: method
method: method,
headers: additionalHeaders
};
if (payload) {
options.body = JSON.stringify(payload);
@@ -125,13 +145,27 @@ class ApiClient {
return this.httpRequestWithBinaryBody(options, url, contentType);
}
httpRequestWithTextBody(
method: string,
url: string,
additionalHeaders: Record<string, string> = {},
payload: string
) {
const options: RequestInit = {
method: method,
headers: additionalHeaders
};
options.body = payload;
return this.httpRequestWithBinaryBody(options, url, "text/plain");
}
httpRequestWithBinaryBody(options: RequestInit, url: string, contentType?: string) {
options = applyFetchOptions(options);
if (contentType) {
if (!options.headers) {
options.headers = new Headers();
options.headers = {};
}
// @ts-ignore
// @ts-ignore We are sure that here we only get headers of type Record<string, string>
options.headers["Content-Type"] = contentType;
}

View File

@@ -1,11 +1,14 @@
import React from "react";
import DiffFile from "./DiffFile";
import { DiffObjectProps, File } from "./DiffTypes";
import Notification from "../Notification";
import { WithTranslation, withTranslation } from "react-i18next";
type Props = DiffObjectProps & {
diff: File[];
defaultCollapse?: boolean;
};
type Props = WithTranslation &
DiffObjectProps & {
diff: File[];
defaultCollapse?: boolean;
};
class Diff extends React.Component<Props> {
static defaultProps: Partial<Props> = {
@@ -13,15 +16,17 @@ class Diff extends React.Component<Props> {
};
render() {
const { diff, ...fileProps } = this.props;
const { diff, t, ...fileProps } = this.props;
return (
<>
{diff.map((file, index) => (
<DiffFile key={index} file={file} {...fileProps} {...this.props} />
))}
{diff.length === 0 ? (
<Notification type="info">{t("diff.noDiffFound")}</Notification>
) : (
diff.map((file, index) => <DiffFile key={index} file={file} {...fileProps} {...this.props} />)
)}
</>
);
}
}
export default Diff;
export default withTranslation("repos")(Diff);

View File

@@ -43,6 +43,7 @@ class LoadingDiff extends React.Component<Props, State> {
fetchDiff = () => {
const { url } = this.props;
this.setState({loading: true});
apiClient
.get(url)
.then(response => response.text())

View File

@@ -7,41 +7,6 @@ const OptimizeCSSAssetsPlugin = require("optimize-css-assets-webpack-plugin");
const root = path.resolve(process.cwd(), "scm-ui");
module.exports = [
{
context: root,
entry: "./ui-styles/src/scm.scss",
module: {
rules: [
{
test: /\.(css|scss|sass)$/i,
use: [
{
loader: MiniCssExtractPlugin.loader
},
"css-loader",
"sass-loader"
]
},
{
test: /\.(png|svg|jpg|gif|woff2?|eot|ttf)$/,
use: ["file-loader"]
}
]
},
plugins: [
new MiniCssExtractPlugin({
filename: "ui-styles.css",
ignoreOrder: false
})
],
optimization: {
minimizer: [new OptimizeCSSAssetsPlugin({})]
},
output: {
path: path.join(root, "target", "assets"),
filename: "ui-styles.bundle.js"
}
},
{
context: root,
entry: {
@@ -142,6 +107,41 @@ module.exports = [
}
}
},
{
context: root,
entry: "./ui-styles/src/scm.scss",
module: {
rules: [
{
test: /\.(css|scss|sass)$/i,
use: [
{
loader: MiniCssExtractPlugin.loader
},
"css-loader",
"sass-loader"
]
},
{
test: /\.(png|svg|jpg|gif|woff2?|eot|ttf)$/,
use: ["file-loader"]
}
]
},
plugins: [
new MiniCssExtractPlugin({
filename: "ui-styles.css",
ignoreOrder: false
})
],
optimization: {
minimizer: [new OptimizeCSSAssetsPlugin({})]
},
output: {
path: path.join(root, "target", "assets"),
filename: "ui-styles.bundle.js"
}
},
{
context: path.resolve(root),
entry: {

View File

@@ -177,7 +177,8 @@
},
"diff": {
"sideBySide": "Zweispaltig",
"combined": "Kombiniert"
"combined": "Kombiniert",
"noDiffFound": "Kein Diff zwischen den ausgewählten Branches gefunden."
},
"fileUpload": {
"clickHere": "Klicken Sie hier um Ihre Datei hochzuladen.",

View File

@@ -184,7 +184,8 @@
"copy": "copied"
},
"sideBySide": "side-by-side",
"combined": "combined"
"combined": "combined",
"noDiffFound": "No Diff between the selected branches found."
},
"fileUpload": {
"clickHere": "Click here to select your file",

View File

@@ -184,7 +184,8 @@
"copy": "copiado"
},
"sideBySide": "dos columnas",
"combined": "combinado"
"combined": "combinado",
"noDiffFound": "No se encontraron diferencias entre las ramas seleccionadas."
},
"fileUpload": {
"clickHere": "Haga click aquí para seleccionar su fichero",

View File

@@ -198,9 +198,9 @@
}
},
"namespaceStrategies": {
"UsernameNamespaceStrategy": "Username",
"CustomNamespaceStrategy": "Custom",
"CurrentYearNamespaceStrategy": "Current year",
"UsernameNamespaceStrategy": "Username",
"CustomNamespaceStrategy": "Custom",
"CurrentYearNamespaceStrategy": "Current year",
"RepositoryTypeNamespaceStrategy": "Repository type"
}
}