renaming: name to repoName if repo name is meant; usage of create loading

This commit is contained in:
Maren Süwer
2018-08-30 12:11:31 +02:00
parent 961cbd9f90
commit 2e16186034
7 changed files with 186 additions and 117 deletions

View File

@@ -8,7 +8,8 @@ import { SubmitButton } from "../../components/buttons";
type Props = {
t: string => string,
createPermission: (permission: Permission) => void
createPermission: (permission: Permission) => void,
loading: boolean
};
type State = {
@@ -29,7 +30,7 @@ class CreatePermissionForm extends React.Component<Props, State> {
}
render() {
const { t } = this.props;
const { t, loading } = this.props;
const { name, type, groupPermission } = this.state;
return (
@@ -71,6 +72,7 @@ class CreatePermissionForm extends React.Component<Props, State> {
<SubmitButton
label={t("add-permission.submit-button")}
action={this.submit}
loading={loading}
/>
</div>
);

View File

@@ -8,13 +8,13 @@ import { DeleteButton } from "../../../components/buttons/index";
type Props = {
permission: Permission,
namespace: string,
name: string,
repoName: string,
confirmDialog?: boolean,
t: string => string,
deletePermission: (
permission: Permission,
namespace: string,
name: string
repoName: string
) => void,
loading: boolean
};
@@ -28,7 +28,7 @@ class DeletePermissionButton extends React.Component<Props> {
this.props.deletePermission(
this.props.permission,
this.props.namespace,
this.props.name
this.props.repoName
);
};

View File

@@ -8,7 +8,8 @@ import {
isFetchPermissionsPending,
getPermissionsOfRepo,
hasCreatePermission,
createPermission
createPermission,
isCreatePermissionPending
} from "../modules/permissions";
import Loading from "../../components/Loading";
import ErrorPage from "../../components/ErrorPage";
@@ -18,18 +19,19 @@ import CreatePermissionForm from "../components/CreatePermissionForm";
type Props = {
namespace: string,
name: string,
repoName: string,
loading: boolean,
error: Error,
permissions: PermissionCollection,
createPermission: boolean,
hasPermissionToCreate: boolean,
loadingCreatePermission: boolean,
//dispatch functions
fetchPermissions: (namespace: string, name: string) => void,
fetchPermissions: (namespace: string, repoName: string) => void,
createPermission: (
permission: Permission,
namespace: string,
name: string
repoName: string
) => void,
// context props
@@ -39,9 +41,9 @@ type Props = {
class Permissions extends React.Component<Props> {
componentDidMount() {
const { fetchPermissions, namespace, name } = this.props;
const { fetchPermissions, namespace, repoName } = this.props;
fetchPermissions(namespace, name);
fetchPermissions(namespace, repoName);
}
render() {
@@ -51,8 +53,9 @@ class Permissions extends React.Component<Props> {
permissions,
t,
namespace,
name,
createPermission
repoName,
loadingCreatePermission,
hasPermissionToCreate
} = this.props;
if (error) {
@@ -69,11 +72,12 @@ class Permissions extends React.Component<Props> {
return <Loading />;
}
const createPermissionForm = createPermission ? (
const createPermissionForm = hasPermissionToCreate ? (
<CreatePermissionForm
createPermission={permission =>
this.props.createPermission(permission, namespace, name)
this.props.createPermission(permission, namespace, repoName)
}
loading={loadingCreatePermission}
/>
) : null;
@@ -94,7 +98,7 @@ class Permissions extends React.Component<Props> {
<SinglePermission
key={index}
namespace={namespace}
name={name}
repoName={repoName}
permission={permission}
/>
);
@@ -111,33 +115,39 @@ class Permissions extends React.Component<Props> {
const mapStateToProps = (state, ownProps) => {
const namespace = ownProps.namespace;
const name = ownProps.name;
const error = getFetchPermissionsFailure(state, namespace, name);
const loading = isFetchPermissionsPending(state, namespace, name);
const permissions = getPermissionsOfRepo(state, namespace, name);
const repoName = ownProps.repoName;
const error = getFetchPermissionsFailure(state, namespace, repoName);
const loading = isFetchPermissionsPending(state, namespace, repoName);
const permissions = getPermissionsOfRepo(state, namespace, repoName);
const loadingCreatePermission = isCreatePermissionPending(
state,
namespace,
repoName
);
console.log(permissions);
const createPermission = hasCreatePermission(state, namespace, name);
const hasPermissionToCreate = hasCreatePermission(state, namespace, repoName);
return {
namespace,
name,
repoName,
error,
loading,
permissions,
createPermission
hasPermissionToCreate,
loadingCreatePermission
};
};
const mapDispatchToProps = dispatch => {
return {
fetchPermissions: (namespace: string, name: string) => {
dispatch(fetchPermissions(namespace, name));
fetchPermissions: (namespace: string, repoName: string) => {
dispatch(fetchPermissions(namespace, repoName));
},
createPermission: (
permission: Permission,
namespace: string,
name: string
repoName: string
) => {
dispatch(createPermission(permission, namespace, name));
dispatch(createPermission(permission, namespace, repoName));
}
};
};

View File

@@ -3,7 +3,6 @@ import React from "react";
import type { Permission } from "../types/Permissions";
import { Checkbox } from "../../components/forms/index";
import { translate } from "react-i18next";
import { Select } from "../../components/forms/index";
import {
modifyPermission,
isModifyPermissionPending,
@@ -26,7 +25,7 @@ type Props = {
permission: Permission,
t: string => string,
namespace: string,
name: string,
repoName: string,
match: any,
history: History,
loading: boolean,
@@ -58,7 +57,7 @@ class SinglePermission extends React.Component<Props, State> {
const { permission } = this.props;
this.props.permissionReset(
this.props.namespace,
this.props.name,
this.props.repoName,
permission.name
);
if (permission) {
@@ -77,15 +76,13 @@ class SinglePermission extends React.Component<Props, State> {
this.props.deletePermission(
this.props.permission,
this.props.namespace,
this.props.name
this.props.repoName
);
};
render() {
const { permission } = this.state;
const { t, loading, error, namespace, name } = this.props;
const types = ["READ", "OWNER", "WRITE"];
const { loading, error, namespace, repoName } = this.props;
const typeSelector = this.props.permission._links.update ? (
<td>
<TypeSelector
@@ -113,7 +110,7 @@ class SinglePermission extends React.Component<Props, State> {
<DeletePermissionButton
permission={permission}
namespace={namespace}
name={name}
repoName={repoName}
deletePermission={this.deletePermission}
loading={this.props.deleteLoading}
/>
@@ -139,7 +136,7 @@ class SinglePermission extends React.Component<Props, State> {
this.props.modifyPermission(
permission,
this.props.namespace,
this.props.name
this.props.repoName
);
};
@@ -159,26 +156,26 @@ const mapStateToProps = (state, ownProps) => {
const loading = isModifyPermissionPending(
state,
ownProps.namespace,
ownProps.name,
ownProps.repoName,
permission.name
);
const error =
getModifyPermissionFailure(
state,
ownProps.namespace,
ownProps.name,
ownProps.repoName,
permission.name
) ||
getDeletePermissionFailure(
state,
ownProps.namespace,
ownProps.name,
ownProps.repoName,
permission.name
);
const deleteLoading = isDeletePermissionPending(
state,
ownProps.namespace,
ownProps.name,
ownProps.repoName,
permission.name
);
@@ -190,23 +187,23 @@ const mapDispatchToProps = dispatch => {
modifyPermission: (
permission: Permission,
namespace: string,
name: string
repoName: string
) => {
dispatch(modifyPermission(permission, namespace, name));
dispatch(modifyPermission(permission, namespace, repoName));
},
permissionReset: (
namespace: string,
name: string,
repoName: string,
permissionname: string
) => {
dispatch(modifyPermissionReset(namespace, name, permissionname));
dispatch(modifyPermissionReset(namespace, repoName, permissionname));
},
deletePermission: (
permission: Permission,
namespace: string,
name: string
repoName: string
) => {
dispatch(deletePermission(permission, namespace, name));
dispatch(deletePermission(permission, namespace, repoName));
}
};
};

View File

@@ -57,60 +57,60 @@ const CONTENT_TYPE = "application/vnd.scmm-permission+json";
// fetch permissions
export function fetchPermissions(namespace: string, name: string) {
export function fetchPermissions(namespace: string, repoName: string) {
return function(dispatch: any) {
dispatch(fetchPermissionsPending(namespace, name));
dispatch(fetchPermissionsPending(namespace, repoName));
return apiClient
.get(`${REPOS_URL}/${namespace}/${name}/${PERMISSIONS_URL}`)
.get(`${REPOS_URL}/${namespace}/${repoName}/${PERMISSIONS_URL}`)
.then(response => response.json())
.then(permissions => {
dispatch(fetchPermissionsSuccess(permissions, namespace, name));
dispatch(fetchPermissionsSuccess(permissions, namespace, repoName));
})
.catch(err => {
dispatch(fetchPermissionsFailure(namespace, name, err));
dispatch(fetchPermissionsFailure(namespace, repoName, err));
});
};
}
export function fetchPermissionsPending(
namespace: string,
name: string
repoName: string
): Action {
return {
type: FETCH_PERMISSIONS_PENDING,
payload: {
namespace,
name
repoName
},
itemId: namespace + "/" + name
itemId: namespace + "/" + repoName
};
}
export function fetchPermissionsSuccess(
permissions: any,
namespace: string,
name: string
repoName: string
): Action {
return {
type: FETCH_PERMISSIONS_SUCCESS,
payload: permissions,
itemId: namespace + "/" + name
itemId: namespace + "/" + repoName
};
}
export function fetchPermissionsFailure(
namespace: string,
name: string,
repoName: string,
error: Error
): Action {
return {
type: FETCH_PERMISSIONS_FAILURE,
payload: {
namespace,
name,
repoName,
error
},
itemId: namespace + "/" + name
itemId: namespace + "/" + repoName
};
}
@@ -119,15 +119,15 @@ export function fetchPermissionsFailure(
export function modifyPermission(
permission: Permission,
namespace: string,
name: string,
repoName: string,
callback?: () => void
) {
return function(dispatch: any) {
dispatch(modifyPermissionPending(permission, namespace, name));
dispatch(modifyPermissionPending(permission, namespace, repoName));
return apiClient
.put(permission._links.update.href, permission, CONTENT_TYPE)
.then(() => {
dispatch(modifyPermissionSuccess(permission, namespace, name));
dispatch(modifyPermissionSuccess(permission, namespace, repoName));
if (callback) {
callback();
}
@@ -136,7 +136,7 @@ export function modifyPermission(
const error = new Error(
`failed to modify permission: ${cause.message}`
);
dispatch(modifyPermissionFailure(permission, error, namespace, name));
dispatch(modifyPermissionFailure(permission, error, namespace, repoName));
});
};
}
@@ -144,27 +144,27 @@ export function modifyPermission(
export function modifyPermissionPending(
permission: Permission,
namespace: string,
name: string
repoName: string
): Action {
return {
type: MODIFY_PERMISSION_PENDING,
payload: permission,
itemId: namespace + "/" + name + "/" + permission.name
itemId: namespace + "/" + repoName + "/" + permission.name
};
}
export function modifyPermissionSuccess(
permission: Permission,
namespace: string,
name: string
repoName: string
): Action {
return {
type: MODIFY_PERMISSION_SUCCESS,
payload: {
permission,
position: namespace + "/" + name
position: namespace + "/" + repoName
},
itemId: namespace + "/" + name + "/" + permission.name
itemId: namespace + "/" + repoName + "/" + permission.name
};
}
@@ -172,12 +172,12 @@ export function modifyPermissionFailure(
permission: Permission,
error: Error,
namespace: string,
name: string
repoName: string
): Action {
return {
type: MODIFY_PERMISSION_FAILURE,
payload: { error, permission },
itemId: namespace + "/" + name + "/" + permission.name
itemId: namespace + "/" + repoName + "/" + permission.name
};
}
@@ -195,12 +195,12 @@ function newPermissions(
export function modifyPermissionReset(
namespace: string,
name: string,
repoName: string,
permissionname: string
) {
return {
type: MODIFY_PERMISSION_RESET,
itemId: namespace + "/" + name + "/" + permissionname
itemId: namespace + "/" + repoName + "/" + permissionname
};
}
@@ -208,19 +208,19 @@ export function modifyPermissionReset(
export function createPermission(
permission: Permission,
namespace: string,
name: string,
repoName: string,
callback?: () => void
) {
return function(dispatch: Dispatch) {
dispatch(createPermissionPending(permission, namespace, name));
dispatch(createPermissionPending(permission, namespace, repoName));
return apiClient
.post(
`${REPOS_URL}/${namespace}/${name}/${PERMISSIONS_URL}`,
`${REPOS_URL}/${namespace}/${repoName}/${PERMISSIONS_URL}`,
permission,
CONTENT_TYPE
)
.then(() => {
dispatch(createPermissionSuccess(permission, namespace, name));
dispatch(createPermissionSuccess(permission, namespace, repoName));
if (callback) {
callback();
}
@@ -232,7 +232,7 @@ export function createPermission(
`failed to add permission ${permission.name}: ${err.message}`
),
namespace,
name
repoName
)
)
);
@@ -242,39 +242,39 @@ export function createPermission(
export function createPermissionPending(
permission: Permission,
namespace: string,
name: string
repoName: string
): Action {
return {
type: CREATE_PERMISSION_PENDING,
payload: permission,
itemId: namespace + "/" + name
itemId: namespace + "/" + repoName
};
}
export function createPermissionSuccess(
permission: Permission,
namespace: string,
name: string
repoName: string
): Action {
return {
type: CREATE_PERMISSION_SUCCESS,
payload: {
permission,
position: namespace + "/" + name
position: namespace + "/" + repoName
},
itemId: namespace + "/" + name
itemId: namespace + "/" + repoName
};
}
export function createPermissionFailure(
error: Error,
namespace: string,
name: string
repoName: string
): Action {
return {
type: CREATE_PERMISSION_FAILURE,
payload: error,
itemId: namespace + "/" + name
itemId: namespace + "/" + repoName
};
}
@@ -283,15 +283,15 @@ export function createPermissionFailure(
export function deletePermission(
permission: Permission,
namespace: string,
name: string,
repoName: string,
callback?: () => void
) {
return function(dispatch: any) {
dispatch(deletePermissionPending(permission, namespace, name));
dispatch(deletePermissionPending(permission, namespace, repoName));
return apiClient
.delete(permission._links.delete.href)
.then(() => {
dispatch(deletePermissionSuccess(permission, namespace, name));
dispatch(deletePermissionSuccess(permission, namespace, repoName));
if (callback) {
callback();
}
@@ -300,7 +300,7 @@ export function deletePermission(
const error = new Error(
`could not delete permission ${permission.name}: ${cause.message}`
);
dispatch(deletePermissionFailure(permission, namespace, name, error));
dispatch(deletePermissionFailure(permission, namespace, repoName, error));
});
};
}
@@ -308,34 +308,34 @@ export function deletePermission(
export function deletePermissionPending(
permission: Permission,
namespace: string,
name: string
repoName: string
): Action {
return {
type: DELETE_PERMISSION_PENDING,
payload: permission,
itemId: namespace + "/" + name + "/" + permission.name
itemId: namespace + "/" + repoName + "/" + permission.name
};
}
export function deletePermissionSuccess(
permission: Permission,
namespace: string,
name: string
repoName: string
): Action {
return {
type: DELETE_PERMISSION_SUCCESS,
payload: {
permission,
position: namespace + "/" + name
position: namespace + "/" + repoName
},
itemId: namespace + "/" + name + "/" + permission.name
itemId: namespace + "/" + repoName + "/" + permission.name
};
}
export function deletePermissionFailure(
permission: Permission,
namespace: string,
name: string,
repoName: string,
error: Error
): Action {
return {
@@ -344,7 +344,7 @@ export function deletePermissionFailure(
error,
permission
},
itemId: namespace + "/" + name + "/" + permission.name
itemId: namespace + "/" + repoName + "/" + permission.name
};
}
@@ -425,10 +425,10 @@ export default function reducer(
export function getPermissionsOfRepo(
state: Object,
namespace: string,
name: string
repoName: string
) {
if (state.permissions && state.permissions[namespace + "/" + name]) {
const permissions = state.permissions[namespace + "/" + name].entries;
if (state.permissions && state.permissions[namespace + "/" + repoName]) {
const permissions = state.permissions[namespace + "/" + repoName].entries;
return permissions;
}
}
@@ -436,77 +436,100 @@ export function getPermissionsOfRepo(
export function isFetchPermissionsPending(
state: Object,
namespace: string,
name: string
repoName: string
) {
return isPending(state, FETCH_PERMISSIONS, namespace + "/" + name);
return isPending(state, FETCH_PERMISSIONS, namespace + "/" + repoName);
}
export function getFetchPermissionsFailure(
state: Object,
namespace: string,
name: string
repoName: string
) {
return getFailure(state, FETCH_PERMISSIONS, namespace + "/" + name);
return getFailure(state, FETCH_PERMISSIONS, namespace + "/" + repoName);
}
export function isModifyPermissionPending(
state: Object,
namespace: string,
name: string,
repoName: string,
permissionname: string
) {
return isPending(
state,
MODIFY_PERMISSION,
namespace + "/" + name + "/" + permissionname
namespace + "/" + repoName + "/" + permissionname
);
}
export function getModifyPermissionFailure(
state: Object,
namespace: string,
name: string,
repoName: string,
permissionname: string
) {
return getFailure(
state,
MODIFY_PERMISSION,
namespace + "/" + name + "/" + permissionname
namespace + "/" + repoName + "/" + permissionname
);
}
export function hasCreatePermission(
state: Object,
namespace: string,
name: string
repoName: string
) {
if (state.permissions && state.permissions[namespace + "/" + name])
return state.permissions[namespace + "/" + name].createPermission;
if (state.permissions && state.permissions[namespace + "/" + repoName])
return state.permissions[namespace + "/" + repoName].createPermission;
else return null;
}
export function isCreatePermissionPending(
state: Object,
namespace: string,
repoName: string
) {
return isPending(
state,
CREATE_PERMISSION,
namespace + "/" + repoName
);
}
export function getCreatePermissionFailure(
state: Object,
namespace: string,
repoName: string
) {
return getFailure(
state,
CREATE_PERMISSION,
namespace + "/" + repoName
);
}
export function isDeletePermissionPending(
state: Object,
namespace: string,
name: string,
repoName: string,
permissionname: string
) {
return isPending(
state,
DELETE_PERMISSION,
namespace + "/" + name + "/" + permissionname
namespace + "/" + repoName + "/" + permissionname
);
}
export function getDeletePermissionFailure(
state: Object,
namespace: string,
name: string,
repoName: string,
permissionname: string
) {
return getFailure(
state,
DELETE_PERMISSION,
namespace + "/" + name + "/" + permissionname
namespace + "/" + repoName + "/" + permissionname
);
}

View File

@@ -33,7 +33,10 @@ import reducer, {
DELETE_PERMISSION_PENDING,
DELETE_PERMISSION_SUCCESS,
DELETE_PERMISSION_FAILURE,
createPermissionSuccess
CREATE_PERMISSION,
createPermissionSuccess,
getCreatePermissionFailure,
isCreatePermissionPending
} from "./permissions";
import type { Permission, PermissionCollection } from "../types/Permissions";
@@ -113,7 +116,7 @@ describe("permission fetch", () => {
type: FETCH_PERMISSIONS_PENDING,
payload: {
namespace: "hitchhiker",
name: "puzzle42"
repoName: "puzzle42"
},
itemId: "hitchhiker/puzzle42"
},
@@ -636,4 +639,38 @@ describe("permissions selectors", () => {
getDeletePermissionFailure({}, "hitchhiker", "puzzle42", "user_eins")
).toBe(undefined);
});
it("should return true, when create permission is pending", () => {
const state = {
pending: {
[CREATE_PERMISSION + "/hitchhiker/puzzle42"]: true
}
};
expect(isCreatePermissionPending(state, "hitchhiker", "puzzle42")).toEqual(
true
);
});
it("should return false, when create permissions is not pending", () => {
expect(isCreatePermissionPending({}, "hitchiker", "puzzle42")).toEqual(
false
);
});
it("should return error when create permissions did fail", () => {
const state = {
failure: {
[CREATE_PERMISSION + "/hitchhiker/puzzle42"]: error
}
};
expect(getCreatePermissionFailure(state, "hitchhiker", "puzzle42")).toEqual(
error
);
});
it("should return undefined when create permissions did not fail", () => {
expect(getCreatePermissionFailure({}, "hitchhiker", "puzzle42")).toBe(
undefined
);
});
});

View File

@@ -104,7 +104,7 @@ class RepositoryRoot extends React.Component<Props> {
component={() => (
<Permissions
namespace={repository.namespace}
name={repository.name}
repoName={repository.name}
/>
)}
/>