From c097f0c497a58749bd54f29d8b6346e3d9e1bbb0 Mon Sep 17 00:00:00 2001 From: Ryan Mathis Date: Thu, 2 Sep 2021 09:48:39 -0700 Subject: [PATCH] Updated bundle admin --- backend/src/main/resources/bundle.schema.json | 38 +++++++++ .../main/resources/i18n/messages.properties | 6 +- .../schema/attribute/bundle.schema.json | 38 +++++++++ .../assets/schema/source/metadata-source.json | 1 + ui/src/app/core/components/Header.js | 20 ++--- ui/src/app/metadata/Attribute.js | 10 ++- .../attribute/AttributeBundleDefinition.js | 4 +- .../metadata/editor/AttributeBundleEditor.js | 56 +++++++++++++ ui/src/app/metadata/new/NewBundle.js | 81 +++++++++++++++++++ .../view/MetadataAttributeBundleEdit.js | 8 +- .../metadata/view/MetadataAttributeBundles.js | 2 +- .../metadata/view/MetadataAttributeEdit.js | 4 +- .../component/NotificationList.js | 2 +- 13 files changed, 249 insertions(+), 21 deletions(-) create mode 100644 backend/src/main/resources/bundle.schema.json create mode 100644 ui/public/assets/schema/attribute/bundle.schema.json create mode 100644 ui/src/app/metadata/editor/AttributeBundleEditor.js diff --git a/backend/src/main/resources/bundle.schema.json b/backend/src/main/resources/bundle.schema.json new file mode 100644 index 000000000..3c5111e40 --- /dev/null +++ b/backend/src/main/resources/bundle.schema.json @@ -0,0 +1,38 @@ +{ + "type": "object", + "required": [ + "name" + ], + "properties": { + "name": { + "type": "string", + "title": "label.bundle-name", + "description": "tooltip.bundle-name", + "minLength": 1, + "maxLength": 255 + }, + "attributes": { + "type": "array", + "title": "label.attributes", + "description": "Attribute table - select the attributes you want to bundle (default unchecked)", + "items": { + "type": "string", + "enum": [ + "eduPersonPrincipalName", + "uid", + "mail", + "surname", + "givenName", + "eduPersonAffiliation", + "eduPersonScopedAffiliation", + "eduPersonPrimaryAffiliation", + "eduPersonEntitlement", + "eduPersonAssurance", + "eduPersonUniqueId", + "employeeNumber" + ] + }, + "uniqueItems": true + } + } +} \ No newline at end of file diff --git a/backend/src/main/resources/i18n/messages.properties b/backend/src/main/resources/i18n/messages.properties index e76a6c8ee..406c587a1 100644 --- a/backend/src/main/resources/i18n/messages.properties +++ b/backend/src/main/resources/i18n/messages.properties @@ -493,7 +493,11 @@ label.by=By label.source=Metadata Source label.provider=Metadata Provider - +label.bundle-name=Bundle name +action.add-new-bundle=Add bundle +tooltip.bundle-name=A user friendly name to identify the bundle +action.attribute-bundles=Attribute bundles +label.new-attribute-bundle=New attribute bundle message.user-role-admin-group=Cannot change group for ROLE_ADMIN users. diff --git a/ui/public/assets/schema/attribute/bundle.schema.json b/ui/public/assets/schema/attribute/bundle.schema.json new file mode 100644 index 000000000..3c5111e40 --- /dev/null +++ b/ui/public/assets/schema/attribute/bundle.schema.json @@ -0,0 +1,38 @@ +{ + "type": "object", + "required": [ + "name" + ], + "properties": { + "name": { + "type": "string", + "title": "label.bundle-name", + "description": "tooltip.bundle-name", + "minLength": 1, + "maxLength": 255 + }, + "attributes": { + "type": "array", + "title": "label.attributes", + "description": "Attribute table - select the attributes you want to bundle (default unchecked)", + "items": { + "type": "string", + "enum": [ + "eduPersonPrincipalName", + "uid", + "mail", + "surname", + "givenName", + "eduPersonAffiliation", + "eduPersonScopedAffiliation", + "eduPersonPrimaryAffiliation", + "eduPersonEntitlement", + "eduPersonAssurance", + "eduPersonUniqueId", + "employeeNumber" + ] + }, + "uniqueItems": true + } + } +} \ No newline at end of file diff --git a/ui/public/assets/schema/source/metadata-source.json b/ui/public/assets/schema/source/metadata-source.json index dc19fe8d4..eaf89a5f0 100644 --- a/ui/public/assets/schema/source/metadata-source.json +++ b/ui/public/assets/schema/source/metadata-source.json @@ -219,6 +219,7 @@ "type": "string", "enum": [ "eduPersonPrincipalName", + {"name": "foo", "attributes": []}, "uid", "mail", "surname", diff --git a/ui/src/app/core/components/Header.js b/ui/src/app/core/components/Header.js index dc115b6af..dbade4c52 100644 --- a/ui/src/app/core/components/Header.js +++ b/ui/src/app/core/components/Header.js @@ -7,7 +7,7 @@ import Dropdown from 'react-bootstrap/Dropdown'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; -import { faTh, faSignOutAlt, faPlusCircle, faCube, faCubes, faUsersCog, faSpinner, faUserCircle, faCog, faFileArchive, faUserTag } from '@fortawesome/free-solid-svg-icons'; +import { faTh, faSignOutAlt, faPlusCircle, faCube, faCubes, faUsersCog, faSpinner, faUserCircle, faCog, faFileArchive, faUserTag, faBoxOpen, faTags, faIdBadge } from '@fortawesome/free-solid-svg-icons'; import Translate from '../../i18n/components/translate'; import { useTranslator } from '../../i18n/hooks'; @@ -49,16 +49,16 @@ export function Header () { - + - + {isAdmin && - + } @@ -71,19 +71,19 @@ export function Header () { - + - - + + - + - + @@ -100,7 +100,7 @@ export function Header () { - + Logout diff --git a/ui/src/app/metadata/Attribute.js b/ui/src/app/metadata/Attribute.js index a963887d1..2bb653429 100644 --- a/ui/src/app/metadata/Attribute.js +++ b/ui/src/app/metadata/Attribute.js @@ -5,6 +5,8 @@ import { NewAttribute } from './new/NewAttribute'; import { MetadataAttributeEdit } from './view/MetadataAttributeEdit'; import { MetadataAttributeList } from './view/MetadataAttributeList'; import { MetadataAttributeBundles } from './view/MetadataAttributeBundles'; +import { NewBundle } from './new/NewBundle'; +import { MetadataAttributeBundleEdit } from './view/MetadataAttributeBundleEdit'; export function Attribute() { @@ -25,9 +27,15 @@ export function Attribute() { } /> - + } /> + + + } /> + + + } /> ); diff --git a/ui/src/app/metadata/domain/attribute/AttributeBundleDefinition.js b/ui/src/app/metadata/domain/attribute/AttributeBundleDefinition.js index 464bd1d59..f94bec721 100644 --- a/ui/src/app/metadata/domain/attribute/AttributeBundleDefinition.js +++ b/ui/src/app/metadata/domain/attribute/AttributeBundleDefinition.js @@ -7,7 +7,9 @@ export const AttributeBundleDefinition = { schema: `/assets/schema/attribute/bundle.schema.json`, uiSchema: { - + attributes: { + 'ui:widget': 'AttributeReleaseWidget' + } }, parser: (data) => { diff --git a/ui/src/app/metadata/editor/AttributeBundleEditor.js b/ui/src/app/metadata/editor/AttributeBundleEditor.js new file mode 100644 index 000000000..0f04ba9ad --- /dev/null +++ b/ui/src/app/metadata/editor/AttributeBundleEditor.js @@ -0,0 +1,56 @@ +import React from 'react'; +import { MetadataFormContext, setFormDataAction, setFormErrorAction } from '../hoc/MetadataFormContext'; +import { MetadataDefinitionContext, MetadataSchemaContext } from '../hoc/MetadataSchema'; +import { transformErrors } from '../domain/transform'; + +import Form from '@rjsf/bootstrap-4'; + +import { fields, widgets } from '../../form/component'; +import { templates } from '../../form/component'; + +function ErrorListTemplate() { + return (<>); +} + +export function AttributeBundleEditor({ children }) { + + const definition = React.useContext(MetadataDefinitionContext); + const schema = React.useContext(MetadataSchemaContext); + + const { state, dispatch } = React.useContext(MetadataFormContext); + const { metadata, errors } = state; + + const onChange = (changes) => { + dispatch(setFormDataAction(changes.formData)); + dispatch(setFormErrorAction(changes.errors)); + // setBlocking(true); + }; + + return ( +
+
+ {children(metadata, errors)} +
+
+
+
+
onChange(form)} + schema={schema} + uiSchema={definition.uiSchema} + FieldTemplate={templates.FieldTemplate} + ObjectFieldTemplate={templates.ObjectFieldTemplate} + ArrayFieldTemplate={templates.ArrayFieldTemplate} + fields={fields} + widgets={widgets} + liveValidate={true} + ErrorList={ErrorListTemplate} + transformErrors={transformErrors}> + <> +
+
+
+
+ ); +} \ No newline at end of file diff --git a/ui/src/app/metadata/new/NewBundle.js b/ui/src/app/metadata/new/NewBundle.js index e69de29bb..4302b4ada 100644 --- a/ui/src/app/metadata/new/NewBundle.js +++ b/ui/src/app/metadata/new/NewBundle.js @@ -0,0 +1,81 @@ +import React from 'react'; +import { faSave, faSpinner } from '@fortawesome/free-solid-svg-icons'; +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; +import Button from 'react-bootstrap/Button'; + +import { Prompt, useHistory } from 'react-router'; +import Translate from '../../i18n/components/translate'; + +import { AttributeBundleDefinition } from '../domain/attribute/AttributeBundleDefinition'; +import MetadataSchema from '../hoc/MetadataSchema'; +import { MetadataForm } from '../hoc/MetadataFormContext'; +import { AttributeBundleEditor } from '../editor/AttributeBundleEditor'; +import { AttributeBundleApi } from '../hoc/attribute/AttributeBundleApi'; + +export function NewBundle() { + const history = useHistory(); + + console.log('hi') + + const definition = AttributeBundleDefinition; + + const [blocking, setBlocking] = React.useState(false); + + const cancel = () => { + gotoDetail(); + }; + + const gotoDetail = (state = null) => { + setBlocking(false); + history.push(`/metadata/attributes/bundles`, state); + }; + + return ( + + {(load, find, create, update, remove, loading) => +
+ + `message.unsaved-editor` + } + /> +
+
+
+
+ Add a new attribute bundle +
+
+
+
+ + + + {(bundle, errors) => + + + + + } + + + +
+
+
+ } +
+ ); +} \ No newline at end of file diff --git a/ui/src/app/metadata/view/MetadataAttributeBundleEdit.js b/ui/src/app/metadata/view/MetadataAttributeBundleEdit.js index e84395b89..914cb4347 100644 --- a/ui/src/app/metadata/view/MetadataAttributeBundleEdit.js +++ b/ui/src/app/metadata/view/MetadataAttributeBundleEdit.js @@ -27,7 +27,7 @@ export function MetadataAttributeBundleEdit() { const gotoDetail = (state = null) => { setBlocking(false); - history.push(`/metadata/attributes`, state); + history.push(`/metadata/attributes/bundles`, state); }; return ( @@ -58,15 +58,15 @@ export function MetadataAttributeBundleEdit() { diff --git a/ui/src/app/metadata/view/MetadataAttributeBundles.js b/ui/src/app/metadata/view/MetadataAttributeBundles.js index 520080b41..056994fcf 100644 --- a/ui/src/app/metadata/view/MetadataAttributeBundles.js +++ b/ui/src/app/metadata/view/MetadataAttributeBundles.js @@ -31,7 +31,7 @@ export function MetadataAttributeBundles({ entities, onDelete }) {
- +   Add new bundle diff --git a/ui/src/app/metadata/view/MetadataAttributeEdit.js b/ui/src/app/metadata/view/MetadataAttributeEdit.js index d0c04f287..a1297b6d4 100644 --- a/ui/src/app/metadata/view/MetadataAttributeEdit.js +++ b/ui/src/app/metadata/view/MetadataAttributeEdit.js @@ -86,13 +86,13 @@ export function MetadataAttributeEdit() { type="button" onClick={() => save(filter)} disabled={errors.length > 0 || loading} - aria-label="Save changes to the metadata source. You will return to the dashboard"> + aria-label="Save changes to the custom attribute. You will return to the attribute list">   Save diff --git a/ui/src/app/notifications/component/NotificationList.js b/ui/src/app/notifications/component/NotificationList.js index 7d621f5c3..c4ec3a6b5 100644 --- a/ui/src/app/notifications/component/NotificationList.js +++ b/ui/src/app/notifications/component/NotificationList.js @@ -9,7 +9,7 @@ export function NotificationList () { const onRemove = (id) => dispatch(removeNotificationAction(id)); return ( -
    +
      {state.notifications.map((n) => (