Skip to content

Commit

Permalink
Implemented metadata editor
Browse files Browse the repository at this point in the history
  • Loading branch information
rmathis committed May 11, 2021
1 parent 8ff8d41 commit 768f6a5
Show file tree
Hide file tree
Showing 19 changed files with 252 additions and 138 deletions.
1 change: 1 addition & 0 deletions ui/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
"@testing-library/user-event": "^12.1.10",
"bootstrap": "^4.6.0",
"date-fns": "^2.21.1",
"deep-object-diff": "^1.1.0",
"file-saver": "^2.0.5",
"http-proxy-middleware": "^1.2.0",
"lodash": "^4.17.21",
Expand Down
20 changes: 4 additions & 16 deletions ui/public/assets/schema/provider/dynamic-http.schema.json
Original file line number Diff line number Diff line change
Expand Up @@ -433,7 +433,7 @@
{
"properties": {
"requireSignedRoot": {
"enum": [true]
"const": true
}
},
"required": [
Expand All @@ -443,7 +443,7 @@
{
"properties": {
"requireSignedRoot": {
"enum": [false]
"const": false
}
}
}
Expand All @@ -468,20 +468,8 @@
"id": "select"
},
"type": "string",
"oneOf": [
{
"enum": [
"SPSSODescriptor"
],
"description": "value.spdescriptor"
},
{
"enum": [
"AttributeAuthorityDescriptor"
],
"description": "value.attr-auth-descriptor"
}
]
"enum": ["SPSSODescriptor", "AttributeAuthorityDescriptor"],
"enumNames": ["value.spdescriptor", "value.attr-auth-descriptor"]
}
},
"removeRolelessEntityDescriptors": {
Expand Down
40 changes: 24 additions & 16 deletions ui/src/app/App.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,9 @@ import { UserProvider } from './core/user/UserContext';
import { Metadata } from './metadata/Metadata';
import { Notifications } from './notifications/hoc/Notifications';
import { NotificationList } from './notifications/component/NotificationList';
import { UserConfirmation, ConfirmWindow } from './core/components/UserConfirmation';



function App() {

Expand All @@ -38,22 +41,27 @@ function App() {
<Notifications>
<UserProvider>
<I18nProvider>
<Router>
<QueryParamProvider ReactRouterRoute={Route}>
<Header />
<main className="pad-content">
<Switch>
<Route exact path="/">
<Redirect to="/dashboard" />
</Route>
<Route path="/dashboard" component={Dashboard} />
<Route path="/metadata/:type/:id" component={Metadata} />
</Switch>
<NotificationList />
</main>
<Footer />
</QueryParamProvider>
</Router>
<UserConfirmation>
{(message, confirm, confirmCallback, setConfirm, getConfirmation) =>
<Router getUserConfirmation={getConfirmation}>
<ConfirmWindow message={message} confirm={confirm} confirmCallback={confirmCallback} setConfirm={setConfirm} />
<QueryParamProvider ReactRouterRoute={Route}>
<Header />
<main className="pad-content">
<Switch>
<Route exact path="/">
<Redirect to="/dashboard" />
</Route>
<Route path="/dashboard" component={Dashboard} />
<Route path="/metadata/:type/:id" component={Metadata} />
</Switch>
<NotificationList />
</main>
<Footer />
</QueryParamProvider>
</Router>
}
</UserConfirmation>
</I18nProvider>
</UserProvider>
</Notifications>
Expand Down
48 changes: 48 additions & 0 deletions ui/src/app/core/components/UserConfirmation.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
import React from 'react';
import Modal from 'react-bootstrap/Modal';
import Button from 'react-bootstrap/Button';
import Translate from '../../i18n/components/translate';


export function UserConfirmation({children}) {
const [confirm, setConfirm] = React.useState(false);
const [confirmCallback, setConfirmCallback] = React.useState(null);
const [message, setMessage] = React.useState('');

function getConfirmation(message, callback) {
setConfirmCallback(() => callback);
setConfirm(true);
setMessage(message);
}

return (<>{children(message, confirm, confirmCallback, setConfirm, getConfirmation)}</>);
}

export function ConfirmWindow ({message, confirm, setConfirm, confirmCallback}) {
const allowTransition = () => {
setConfirm(false);
confirmCallback(true);
}

const blockTransition = () => {
setConfirm(false);
confirmCallback(false);
}

return (
<Modal show={confirm} onHide={blockTransition}>
<Modal.Header closeButton>
<Modal.Title>Are you sure?</Modal.Title>
</Modal.Header>

<Modal.Body>
<p><Translate value={message}>{message}</Translate></p>
</Modal.Body>

<Modal.Footer className="justify-content-start">
<Button variant="primary" onClick={allowTransition}><Translate value={`action.discard-changes`} /></Button>
<Button onClick={blockTransition} variant="outline-secondary"><Translate value={`action.cancel`} /></Button>
</Modal.Footer>
</Modal>
);
}
8 changes: 4 additions & 4 deletions ui/src/app/form/component/templates/ArrayFieldTemplate.js
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ const ObjectArrayItem = ({type, ...props}) => {
<Translate value={'label.new-of-type'} params={{type}} />
</Accordion.Toggle>
{props.hasToolbar && (
<div className="d-flex flex-row align-items-center">
<div className="d-flex flex-row align-items-start">
{(props.hasMoveUp || props.hasMoveDown) && (
<div className="m-0 p-0">
<IconButton
Expand Down Expand Up @@ -141,10 +141,10 @@ const DefaultArrayItem = (props) => {

return (
<div key={props.key} className={`mt-2 `}>
<div className="mb-2 d-flex align-items-center">
<div className="mb-2 d-flex align-items-start">
<div className={`mr-2 flex-grow-1 ${uiSchemaOptions.classNames}`}>{props.children}</div>
{props.hasToolbar && (
<div className="d-flex flex-row align-items-center">
<div className="d-flex flex-row align-items-start">
{(props.hasMoveUp || props.hasMoveDown) && (
<div className="m-0 p-0">
<IconButton
Expand Down Expand Up @@ -175,7 +175,7 @@ const DefaultArrayItem = (props) => {
)}

{props.hasRemove && (
<div className="m-0 pb-1">
<div className="m-0 px-1 pt-3">
<IconButton
className="text-danger"
variant='text'
Expand Down
46 changes: 25 additions & 21 deletions ui/src/app/form/component/templates/FieldTemplate.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,35 +11,39 @@ export function FieldTemplate ({
children,
displayLabel,
rawErrors = [],
errors = [],
rawHelp,
help,
rawDescription,
...props
}) {

return (
<>{!props.hidden ?
<Form.Group>
{children}
{rawErrors.length > 0 && (
<ListGroup as="ul">
{rawErrors.map((error) => {
return (
<ListGroup.Item as="li" key={error} className="border-0 m-0 p-0">
<small className="m-0 text-danger">
{error}
</small>
</ListGroup.Item>
);
})}
</ListGroup>
)}
{rawHelp && (
<Form.Text
className={rawErrors.length > 0 ? "text-danger" : "text-muted"}
id={id}>
<Translate value={rawHelp} />
</Form.Text>
)}
<div>
{children}
</div>
<div>
{rawErrors.length > 0 && (
<ListGroup as="ul">
{rawErrors.map((error, i) => {
return (
<ListGroup.Item as="li" key={i} className={`border-0 m-0 p-0 bg-transparent ${i > 0 ? 'sr-only' : ''}`}>
<small className="m-0 text-danger">
{error}
</small>
</ListGroup.Item>
);
})}
</ListGroup>
)}
{rawHelp && rawErrors.length < 1 && (
<Form.Text className={rawErrors.length > 0 ? "text-danger" : "text-muted"} id={id}>
<Translate value={rawHelp} />
</Form.Text>
)}
</div>
</Form.Group>
: <></>
}</>
Expand Down
2 changes: 1 addition & 1 deletion ui/src/app/form/component/templates/ObjectFieldTemplate.js
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ const ObjectFieldTemplate = ({
<Row>{uiSchema.layout.groups.map((group, rIdx) => (
<React.Fragment key={rIdx}>
{properties.some(p => group.fields.indexOf(p.name) > -1) &&
<Col xs={group.size} key={rIdx} className={`d-empty-none ${group.classNames}`}>
<Col lg={group.size} key={rIdx} className={`d-empty-none ${group.classNames}`}>
{group.title && <legend><Translate value={group.title} /></legend>}
{properties.filter(p => group.fields.indexOf(p.name) > -1).map((element, eIdx) => (
<React.Fragment key={eIdx}>{element.content}</React.Fragment>
Expand Down
5 changes: 3 additions & 2 deletions ui/src/app/form/component/widgets/OptionWidget.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,12 @@ import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { faAsterisk, faCaretDown, faCaretUp } from "@fortawesome/free-solid-svg-icons";
import { useTranslator } from "../../../i18n/hooks";

const ToggleButton = ({ isOpen, onClick }) => (
const ToggleButton = ({ isOpen, onClick, disabled }) => (
<button
type="button"
className="btn btn-outline-secondary toggle-button"
onClick={onClick}
disabled={disabled}
onMouseDown={e => {
// Prevent input from losing focus.
e.preventDefault();
Expand Down Expand Up @@ -76,7 +77,7 @@ const OptionWidget = ({
return <span className={options.indexOf(text) === index ? 'font-weight-bold' : ''}>{option}</span>;
}}>
{({ isMenuShown, toggleMenu }) => (
<ToggleButton isOpen={isMenuShown} onClick={e => toggleMenu()} />
<ToggleButton isOpen={isMenuShown} onClick={e => toggleMenu()} disabled={disabled || readonly} />
)}
</Typeahead>
</Form.Group>
Expand Down
3 changes: 2 additions & 1 deletion ui/src/app/metadata/Metadata.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import React from 'react';
import { Switch, Route, useRouteMatch } from 'react-router-dom';
import { Switch, Route, useRouteMatch, Redirect } from 'react-router-dom';
import { MetadataOptions } from './view/MetadataOptions';
import { MetadataDetail } from './component/MetadataDetail';
import { MetadataHistory } from './view/MetadataHistory';
Expand Down Expand Up @@ -49,6 +49,7 @@ export function Metadata () {
<Route path={`${path}/edit/:section`} render={ () =>
<MetadataEdit />
} />
<Redirect exact path={`${path}`} to={`${path}/configuration/options`} />
</Switch>
</MetadataSchema>
</MetadataXmlLoader>
Expand Down
3 changes: 0 additions & 3 deletions ui/src/app/metadata/component/properties/ArrayProperty.js
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,6 @@ export function ArrayProperty ({ property, columns, onPreview }) {

React.useEffect(() => {
setKeys(property.value.reduce((val, version) => version ? version.length > val ? version.length : val : val, 0));

console.log(property);

setDataList(property.items?.enum);
}, [property]);

Expand Down
16 changes: 4 additions & 12 deletions ui/src/app/metadata/domain/source/SourceDefinition.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
import defaultsDeep from 'lodash/defaultsDeep';
// import API_BASE_PATH from '../../../App.constant';
import {removeNull} from '../../../core/utility/remove_null';


export const SourceBase = {
label: 'Metadata Source',
Expand All @@ -9,19 +11,9 @@ export const SourceBase = {
//${API_BASE_PATH}/ui/MetadataSources
validatorParams: [/*getAllOtherIds*/],

parse: (data) => {
if (data?.securityInfo?.x509CertificateAvailable) {
if (!data?.securityInfo?.x509Certificates) {
data.securityInfo.x509Certificates = [];
}
data.securityInfo.x509Certificates.push({})
}
return data;
},
parser: (data) => removeNull(data, true),

formatter: (changes, schema) => {
return changes;
},
formatter: (changes, schema) => changes,

getValidators: (entityIdList) => {
const validators = {
Expand Down
Loading

0 comments on commit 768f6a5

Please sign in to comment.