diff --git a/keycloak-d4science-theme/src/main/resources/theme/d4science.v2/account/resources/content.json b/keycloak-d4science-theme/src/main/resources/theme/d4science.v2/account/resources/content.json index b0a864e..bf15332 100644 --- a/keycloak-d4science-theme/src/main/resources/theme/d4science.v2/account/resources/content.json +++ b/keycloak-d4science-theme/src/main/resources/theme/d4science.v2/account/resources/content.json @@ -3,7 +3,7 @@ "id": "personal-info", "path": "personal-info", "icon": "pf-icon-user", - "label": "personalInfoHtmlTitle", + "label": "personalInfoSidebarTitle", "descriptionLabel": "personalInfoIntroMessage", "content" : [ { @@ -25,27 +25,27 @@ { "id": "security", "icon": "pf-icon-security", - "label": "Account Security", + "label": "accountSecuritySidebarTitle", "descriptionLabel": "accountSecurityIntroMessage", "content": [ { "id": "signingin", "path": "security/signingin", - "label": "signingIn", + "label": "signingInSidebarTitle", "modulePath": "/content/signingin-page/SigningInPage.js", "componentName": "SigningInPage" }, { "id": "device-activity", "path": "security/device-activity", - "label": "device-activity", + "label": "deviceActivitySidebarTitle", "modulePath": "/content/device-activity-page/DeviceActivityPage.js", "componentName": "DeviceActivityPage" }, { "id": "linked-accounts", "path": "security/linked-accounts", - "label": "linkedAccountsHtmlTitle", + "label": "linkedAccountsSidebarTitle", "modulePath": "/content/linked-accounts-page/LinkedAccountsPage.js", "componentName": "LinkedAccountsPage", "hidden": "!features.isLinkedAccountsEnabled" @@ -61,6 +61,16 @@ "modulePath": "/content/applications-page/ApplicationsPage.js", "componentName": "ApplicationsPage" }, + { + "id": "groups", + "path": "groups", + "icon": "pf-icon-server-group", + "label": "groupLabel", + "descriptionLabel": "groupDescriptionLabel", + "modulePath": "/content/group-page/GroupsPage.js", + "componentName": "GroupsPage", + "hidden": "!features.isViewGroupsEnabled" + }, { "id": "resources", "icon": "pf-icon-repository", diff --git a/keycloak-d4science-theme/src/main/resources/theme/d4science.v2/account/resources/content/d4science-page/AccountExtraPage.js b/keycloak-d4science-theme/src/main/resources/theme/d4science.v2/account/resources/content/d4science-page/AccountExtraPage.js index 5e40f62..e8f0e42 100644 --- a/keycloak-d4science-theme/src/main/resources/theme/d4science.v2/account/resources/content/d4science-page/AccountExtraPage.js +++ b/keycloak-d4science-theme/src/main/resources/theme/d4science.v2/account/resources/content/d4science-page/AccountExtraPage.js @@ -1,7 +1,7 @@ function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } import * as React from "../../../../common/keycloak/web_modules/react.js"; -import { Button, Grid, GridItem, Expandable, Modal } from "../../../../common/keycloak/web_modules/@patternfly/react-core.js"; +import { PageSection, PageSectionVariants, Button, Grid, GridItem, ExpandableSection, Modal } from "../../../../common/keycloak/web_modules/@patternfly/react-core.js"; import { AccountServiceContext } from "../../account-service/AccountServiceContext.js"; import { Msg } from "../../widgets/Msg.js"; import { ContentPage } from "../ContentPage.js"; @@ -38,62 +38,66 @@ export class AccountExtraPage extends React.Component { render() { const accountUrl = this.context["accountUrl"]; - return React.createElement(ContentPage, { + return /*#__PURE__*/React.createElement(ContentPage, { title: "accountExtraInfoHtmlTitle", introMessage: "accountExtraSubMessage" - }, React.createElement(AvatarForm, { + }, /*#__PURE__*/React.createElement(PageSection, { + isFilled: true, + variant: PageSectionVariants.light + }, /*#__PURE__*/React.createElement(AvatarForm, { accountUrl: accountUrl - }), React.createElement("div", { + }), /*#__PURE__*/React.createElement("div", { id: "delete-account", style: { marginTop: "30px" } - }, React.createElement(Expandable, { - toggleText: Msg.localize('deleteAccount') - }, React.createElement(Grid, { - gutter: "sm" - }, React.createElement(GridItem, { + }, /*#__PURE__*/React.createElement(ExpandableSection, { + toggleText: Msg.localize('deleteAccount'), + displaySize: "large" + }, /*#__PURE__*/React.createElement(Grid, { + hasGutter: true + }, /*#__PURE__*/React.createElement(GridItem, { span: 8 - }, React.createElement("p", { + }, /*#__PURE__*/React.createElement("p", { dangerouslySetInnerHTML: { __html: Msg.localize('deleteAccountInfoMessage') } - })), React.createElement(GridItem, { + })), /*#__PURE__*/React.createElement(GridItem, { span: 4 - }, React.createElement(Button, { + }, /*#__PURE__*/React.createElement(Button, { id: "delete-account-btn", variant: "danger", onClick: e => this.handleModalToggle(true), className: "delete-button" - }, React.createElement(Msg, { + }, /*#__PURE__*/React.createElement(Msg, { msgKey: "doDelete" - }))))), React.createElement(Modal, { + }))))), /*#__PURE__*/React.createElement(Modal, { width: '50%', title: Msg.localize('deleteAccountDialogHeader'), isOpen: this.state.isModalOpen, onClose: () => this.handleModalToggle(false), - actions: [React.createElement(Button, { + actions: [/*#__PURE__*/React.createElement(Button, { key: "confirm", variant: "danger", onClick: this.modalConfirmDelete - }, React.createElement(Msg, { + }, /*#__PURE__*/React.createElement(Msg, { msgKey: "doDeleteConfirm" - })), React.createElement(Button, { + })), /*#__PURE__*/React.createElement(Button, { key: "cancel", variant: "secondary", onClick: e => this.handleModalToggle(false) - }, React.createElement(Msg, { + }, /*#__PURE__*/React.createElement(Msg, { msgKey: "doCancel" }))] - }, React.createElement("div", { + }, /*#__PURE__*/React.createElement("div", { dangerouslySetInnerHTML: { __html: Msg.localize('deleteAccountWarningMessage') } - }), React.createElement("div", { + }), /*#__PURE__*/React.createElement("div", { dangerouslySetInnerHTML: { __html: Msg.localize('deleteAccountConfirmMessage') } - })))); + }))))); } } diff --git a/keycloak-d4science-theme/src/main/resources/theme/d4science.v2/account/resources/content/d4science-page/AccountExtraPage.js.map b/keycloak-d4science-theme/src/main/resources/theme/d4science.v2/account/resources/content/d4science-page/AccountExtraPage.js.map index 639ca5b..d2ef1d0 100644 --- a/keycloak-d4science-theme/src/main/resources/theme/d4science.v2/account/resources/content/d4science-page/AccountExtraPage.js.map +++ b/keycloak-d4science-theme/src/main/resources/theme/d4science.v2/account/resources/content/d4science-page/AccountExtraPage.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../../src/app/content/d4science-page/AccountExtraPage.tsx"],"names":["React","Button","Grid","GridItem","Expandable","Modal","AccountServiceContext","Msg","ContentPage","ContentAlert","AvatarForm","AccountExtraPage","Component","constructor","props","open","setState","isModalOpen","event","accountUrl","context","deleteUrl","doPost","then","success","window","location","reload","state","render","marginTop","localize","__html","e","handleModalToggle","modalConfirmDelete"],"mappings":"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","sourcesContent":["import * as React from 'react';\r\n\r\nimport { Button, Grid, GridItem, Expandable, Modal, Form } from '@patternfly/react-core';\r\nimport { AccountServiceContext } from '../../account-service/AccountServiceContext';\r\nimport { Msg } from '../../widgets/Msg';\r\nimport { ContentPage } from '../ContentPage';\r\nimport { ContentAlert } from '../ContentAlert';\r\nimport { AvatarForm } from './AvatarForm';\r\n\r\ninterface AccountExtraPageProps {\r\n}\r\n\r\ninterface AccountExtraPageState {\r\n isModalOpen: boolean;\r\n}\r\n\r\nexport class AccountExtraPage extends React.Component {\r\n static contextType = AccountServiceContext;\r\n context: React.ContextType;\r\n\r\n constructor(props: any) {\r\n super(props)\r\n this.state = { isModalOpen: false }\r\n }\r\n\r\n private handleModalToggle = (open: boolean) => {\r\n this.setState({ isModalOpen: open })\r\n }\r\n\r\n private modalConfirmDelete = (event: any) => {\r\n const accountUrl = this.context![\"accountUrl\"]\r\n const deleteUrl = accountUrl + \"-delete/request-delete\"\r\n this.context!.doPost(deleteUrl, {})\r\n .then(() => {\r\n ContentAlert.success('accountDeletedMessage')\r\n window.location.reload();\r\n })\r\n this.setState({ isModalOpen: false })\r\n }\r\n\r\n public render(): React.ReactNode {\r\n const accountUrl = this.context![\"accountUrl\"]\r\n\r\n return (\r\n \r\n \r\n\r\n
\r\n \r\n \r\n \r\n

\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n this.handleModalToggle(false)}\r\n actions={[\r\n ,\r\n \r\n ]}\r\n >\r\n

\r\n
\r\n \r\n
\r\n\r\n \r\n )\r\n }\r\n}"],"file":"AccountExtraPage.js"} \ No newline at end of file +{"version":3,"file":"AccountExtraPage.js","names":["React","PageSection","PageSectionVariants","Button","Grid","GridItem","ExpandableSection","Modal","AccountServiceContext","Msg","ContentPage","ContentAlert","AvatarForm","AccountExtraPage","Component","constructor","props","open","setState","isModalOpen","event","accountUrl","context","deleteUrl","doPost","then","success","window","location","reload","state","render","light","marginTop","localize","__html","e","handleModalToggle","modalConfirmDelete"],"sources":["../../../src/app/content/d4science-page/AccountExtraPage.tsx"],"sourcesContent":["import * as React from 'react';\r\n\r\nimport { PageSection, PageSectionVariants,Button, Grid, GridItem, ExpandableSection, Modal } from '@patternfly/react-core';\r\nimport { AccountServiceContext } from '../../account-service/AccountServiceContext';\r\nimport { Msg } from '../../widgets/Msg';\r\nimport { ContentPage } from '../ContentPage';\r\nimport { ContentAlert } from '../ContentAlert';\r\nimport { AvatarForm } from './AvatarForm';\r\n\r\ninterface AccountExtraPageProps {\r\n}\r\n\r\ninterface AccountExtraPageState {\r\n isModalOpen: boolean;\r\n}\r\n\r\nexport class AccountExtraPage extends React.Component {\r\n static contextType = AccountServiceContext;\r\n context: React.ContextType;\r\n\r\n constructor(props: any) {\r\n super(props)\r\n this.state = { isModalOpen: false }\r\n }\r\n\r\n private handleModalToggle = (open: boolean) => {\r\n this.setState({ isModalOpen: open })\r\n }\r\n\r\n private modalConfirmDelete = (event: any) => {\r\n const accountUrl = this.context![\"accountUrl\"]\r\n const deleteUrl = accountUrl + \"-delete/request-delete\"\r\n this.context!.doPost(deleteUrl, {})\r\n .then(() => {\r\n ContentAlert.success('accountDeletedMessage')\r\n window.location.reload();\r\n })\r\n this.setState({ isModalOpen: false })\r\n }\r\n\r\n public render(): React.ReactNode {\r\n const accountUrl = this.context![\"accountUrl\"]\r\n\r\n return (\r\n \r\n \r\n \r\n\r\n
\r\n \r\n \r\n \r\n

\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n this.handleModalToggle(false)}\r\n actions={[\r\n ,\r\n \r\n ]}\r\n >\r\n

\r\n
\r\n \r\n
\r\n \r\n\r\n \r\n )\r\n }\r\n}"],"mappings":"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"} \ No newline at end of file diff --git a/keycloak-d4science-theme/src/main/resources/theme/d4science.v2/account/resources/content/d4science-page/AvatarForm.js b/keycloak-d4science-theme/src/main/resources/theme/d4science.v2/account/resources/content/d4science-page/AvatarForm.js index 61546b1..7235317 100644 --- a/keycloak-d4science-theme/src/main/resources/theme/d4science.v2/account/resources/content/d4science-page/AvatarForm.js +++ b/keycloak-d4science-theme/src/main/resources/theme/d4science.v2/account/resources/content/d4science-page/AvatarForm.js @@ -141,49 +141,48 @@ export class AvatarForm extends React.Component { border: '1px solid lightgray', boxShadow: 'lightgray 6px 3px 10px 2px' }; - return React.createElement(Form, { + return /*#__PURE__*/React.createElement(Form, { id: "avatarForm", method: "post", - isHorizontal: true, action: avatarUrl, encType: "multipart/form-data", onSubmit: event => this.handleSubmit(event) - }, React.createElement(FormGroup, { + }, /*#__PURE__*/React.createElement(FormGroup, { label: Msg.localize('avatarLabel'), fieldId: "avatar-current-or-preview", helperTextInvalid: this.state.errors.avatar, - isValid: this.state.errors.avatar === '' - }, avatarSrc !== "" ? React.createElement(Avatar, { + validated: this.state.errors.avatar === '' ? 'success' : 'error' + }, avatarSrc !== "" ? /*#__PURE__*/React.createElement(Avatar, { src: avatarSrc, style: avatarStyle, alt: "Avatar image preview", onError: this.handleError - }) : React.createElement(Avatar, { + }) : /*#__PURE__*/React.createElement(Avatar, { src: noAvatarSrc, style: avatarStyle, alt: "No avatar found" - })), React.createElement(FormGroup, { + })), /*#__PURE__*/React.createElement(FormGroup, { fieldId: "avatar-upload", - label: React.createElement("span", null, React.createElement(Msg, { + label: /*#__PURE__*/React.createElement("span", null, /*#__PURE__*/React.createElement(Msg, { msgKey: "uploadLabel" - }), ' ', React.createElement(Tooltip, { - content: React.createElement(Msg, { + }), ' ', /*#__PURE__*/React.createElement(Tooltip, { + content: /*#__PURE__*/React.createElement(Msg, { msgKey: "avatarInfo" }) - }, React.createElement(OutlinedQuestionCircleIcon, null))) - }, React.createElement(FileUpload, { + }, /*#__PURE__*/React.createElement(OutlinedQuestionCircleIcon, null))) + }, /*#__PURE__*/React.createElement(FileUpload, { id: "simple-file", filename: filename, filenamePlaceholder: Msg.localize('dragdropInfo'), browseButtonText: Msg.localize('browseButton'), clearButtonText: Msg.localize('clearButton'), onChange: this.handleFileInputChange - })), React.createElement(ActionGroup, null, React.createElement(Button, { + })), /*#__PURE__*/React.createElement(ActionGroup, null, /*#__PURE__*/React.createElement(Button, { id: "save-btn", type: "submit", variant: "primary", isDisabled: filename === "" - }, React.createElement(Msg, { + }, /*#__PURE__*/React.createElement(Msg, { msgKey: "doSave" })))); } diff --git a/keycloak-d4science-theme/src/main/resources/theme/d4science.v2/account/resources/content/d4science-page/AvatarForm.js.map b/keycloak-d4science-theme/src/main/resources/theme/d4science.v2/account/resources/content/d4science-page/AvatarForm.js.map index bc91dba..d0bb029 100644 --- a/keycloak-d4science-theme/src/main/resources/theme/d4science.v2/account/resources/content/d4science-page/AvatarForm.js.map +++ b/keycloak-d4science-theme/src/main/resources/theme/d4science.v2/account/resources/content/d4science-page/AvatarForm.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../../src/app/content/d4science-page/AvatarForm.tsx"],"names":["React","Form","FormGroup","ActionGroup","FileUpload","Avatar","Button","Tooltip","OutlinedQuestionCircleIcon","AccountServiceContext","ContentAlert","Msg","AvatarForm","Component","constructor","props","context","imgData","callback","img","Image","src","onload","event","canvas","document","createElement","ctx","getContext","drawImage","MAX_WIDTH","MAX_HEIGHT","width","height","toBlob","preventDefault","form","target","formData","FormData","append","state","imageBlob","xhr","XMLHttpRequest","onreadystatechange","readyState","status","success","danger","response","setState","errors","avatar","filename","avatarSrc","avatarUrl","open","method","action","send","localize","currentAvatar","accountUrl","noAvatarSrc","reader","FileReader","onloadend","String","result","imageScale","blob","URL","createObjectURL","bind","handleFileInputChange","file","readAsDataURL","render","avatarStyle","objectFit","border","boxShadow","handleSubmit","handleError"],"mappings":"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","sourcesContent":["import * as React from 'react';\r\nimport * as CSS from 'csstype';\r\n\r\nimport { Form, FormGroup, ActionGroup, FileUpload, Avatar, Button, Tooltip } from \"@patternfly/react-core\";\r\nimport { OutlinedQuestionCircleIcon } from '@patternfly/react-icons';\r\nimport { AccountServiceContext } from '../../account-service/AccountServiceContext';\r\nimport { ContentAlert } from '../ContentAlert';\r\nimport { Msg } from '../../widgets/Msg';\r\n\r\n\r\ninterface AvatarFormProps {\r\n accountUrl: string;\r\n}\r\n\r\ninterface AvatarFormState {\r\n errors: any;\r\n imageBlob: any;\r\n filename: string;\r\n avatarUrl: string;\r\n avatarSrc: string;\r\n noAvatarSrc: string;\r\n}\r\n\r\nexport class AvatarForm extends React.Component {\r\n static contextType = AccountServiceContext;\r\n context: React.ContextType;\r\n private handleFileInputChange: any;\r\n\r\n constructor(props: AvatarFormProps, context: React.ContextType) {\r\n super(props);\r\n this.context = context;\r\n\r\n var currentAvatar = props.accountUrl + \"-avatar\"\r\n this.state = {\r\n errors: {avatar: ''},\r\n imageBlob: null,\r\n filename: \"\",\r\n avatarUrl: currentAvatar,\r\n avatarSrc: currentAvatar,\r\n noAvatarSrc: \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDI0LjAuMiwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPgo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IgoJIHZpZXdCb3g9IjAgMCAzNiAzNiIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgMzYgMzY7IiB4bWw6c3BhY2U9InByZXNlcnZlIj4KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KCS5zdDB7ZmlsbC1ydWxlOmV2ZW5vZGQ7Y2xpcC1ydWxlOmV2ZW5vZGQ7ZmlsbDojRjBGMEYwO30KCS5zdDF7ZmlsbC1ydWxlOmV2ZW5vZGQ7Y2xpcC1ydWxlOmV2ZW5vZGQ7ZmlsbDojRDJEMkQyO30KCS5zdDJ7ZmlsbDojQjhCQkJFO30KCS5zdDN7ZmlsbDojRDJEMkQyO30KPC9zdHlsZT4KPHJlY3QgY2xhc3M9InN0MCIgd2lkdGg9IjM2IiBoZWlnaHQ9IjM2Ii8+CjxwYXRoIGNsYXNzPSJzdDEiIGQ9Ik0xNy43LDIwLjFjLTMuNSwwLTYuNC0yLjktNi40LTYuNHMyLjktNi40LDYuNC02LjRzNi40LDIuOSw2LjQsNi40UzIxLjMsMjAuMSwxNy43LDIwLjF6Ii8+CjxwYXRoIGNsYXNzPSJzdDIiIGQ9Ik0xMy4zLDM2bDAtNi43Yy0yLDAuNC0yLjksMS40LTMuMSwzLjVMMTAuMSwzNkgxMy4zeiIvPgo8cGF0aCBjbGFzcz0ic3QzIiBkPSJNMTAuMSwzNmwwLjEtMy4yYzAuMi0yLjEsMS4xLTMuMSwzLjEtMy41bDAsNi43aDkuNGwwLTYuN2MyLDAuNCwyLjksMS40LDMuMSwzLjVsMC4xLDMuMmg0LjcKCWMtMC40LTMuOS0xLjMtOS0yLjktMTFjLTEuMS0xLjQtMi4zLTIuMi0zLjUtMi42cy0xLjgtMC42LTYuMy0wLjZzLTYuMSwwLjctNi4xLDAuN2MtMS4yLDAuNC0yLjQsMS4yLTMuNCwyLjYKCUM2LjcsMjcsNS44LDMyLjIsNS40LDM2SDEwLjF6Ii8+CjxwYXRoIGNsYXNzPSJzdDIiIGQ9Ik0yNS45LDM2bC0wLjEtMy4yYy0wLjItMi4xLTEuMS0zLjEtMy4xLTMuNWwwLDYuN0gyNS45eiIvPgo8L3N2Zz4=\"\r\n }\r\n\r\n var reader = new FileReader()\r\n reader.onloadend = function (event: any) {\r\n var imgData = String(event.target!.result)\r\n this.imageScale(imgData, (blob: Blob) => {\r\n this.setState({\r\n imageBlob: blob,\r\n avatarSrc: URL.createObjectURL(blob)\r\n })\r\n })\r\n }.bind(this)\r\n \r\n this.handleFileInputChange = (file: File, filename: string) => {\r\n if (filename != \"\") {\r\n this.setState({ filename: filename })\r\n reader.readAsDataURL(file)\r\n } else {\r\n this.setState({\r\n imageBlob: null,\r\n filename: \"\",\r\n avatarSrc: currentAvatar\r\n })\r\n }\r\n }\r\n }\r\n\r\n private imageScale = (imgData: string, callback: any) => {\r\n var img = new Image()\r\n img.src = imgData\r\n img.onload = (event: Event) => {\r\n var canvas = document.createElement(\"canvas\")\r\n var ctx = canvas.getContext(\"2d\")\r\n ctx!.drawImage(img, 0, 0)\r\n\r\n var MAX_WIDTH = 250\r\n var MAX_HEIGHT = 250\r\n var width = img.width\r\n var height = img.height\r\n\r\n if (width > height) {\r\n if (width > MAX_WIDTH) {\r\n height *= MAX_WIDTH / width\r\n width = MAX_WIDTH\r\n }\r\n } else {\r\n if (height > MAX_HEIGHT) {\r\n width *= MAX_HEIGHT / height\r\n height = MAX_HEIGHT\r\n }\r\n }\r\n canvas.width = width\r\n canvas.height = height\r\n ctx = canvas.getContext(\"2d\")\r\n ctx!.drawImage(img, 0, 0, width, height)\r\n canvas.toBlob(callback)\r\n }\r\n }\r\n\r\n private handleSubmit = (event: React.FormEvent): void => {\r\n event.preventDefault()\r\n const form = event.target as HTMLFormElement\r\n var formData = new FormData(form)\r\n formData.append(\"image\", this.state.imageBlob)\r\n var xhr = new XMLHttpRequest();\r\n xhr.onreadystatechange = () => {\r\n if (xhr.readyState == 4) {\r\n if (200 <= xhr.status && xhr.status <= 204) {\r\n ContentAlert.success('avatarUpdatedMessage')\r\n } else {\r\n ContentAlert.danger(xhr.response)\r\n }\r\n // force reload avatar\r\n this.setState({\r\n errors: {avatar: \"\"},\r\n imageBlob: null,\r\n filename: \"\",\r\n avatarSrc: this.state.avatarUrl\r\n })\r\n }\r\n }\r\n xhr.open(form.method, form.action, true);\r\n xhr.send(formData);\r\n }\r\n\r\n private handleError = (event: any) => {\r\n this.setState({\r\n errors: {avatar: Msg.localize('error-noAvatarFound')},\r\n avatarSrc: \"\"\r\n })\r\n }\r\n\r\n render() {\r\n const { filename, avatarUrl, avatarSrc, noAvatarSrc } = this.state\r\n const avatarStyle: CSS.Properties = {\r\n objectFit: 'cover',\r\n width: '150px', height: '150px',\r\n border: '1px solid lightgray',\r\n boxShadow: 'lightgray 6px 3px 10px 2px'\r\n }\r\n return (\r\n
this.handleSubmit(event)}\r\n >\r\n \r\n { avatarSrc !== \"\"\r\n ? \r\n : \r\n }\r\n \r\n\r\n \r\n \r\n {' '}\r\n }>\r\n \r\n \r\n }\r\n >\r\n \r\n\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n }\r\n}\r\n"],"file":"AvatarForm.js"} \ No newline at end of file +{"version":3,"file":"AvatarForm.js","names":["React","Form","FormGroup","ActionGroup","FileUpload","Avatar","Button","Tooltip","OutlinedQuestionCircleIcon","AccountServiceContext","ContentAlert","Msg","AvatarForm","Component","constructor","props","context","imgData","callback","img","Image","src","onload","event","canvas","document","createElement","ctx","getContext","drawImage","MAX_WIDTH","MAX_HEIGHT","width","height","toBlob","preventDefault","form","target","formData","FormData","append","state","imageBlob","xhr","XMLHttpRequest","onreadystatechange","readyState","status","success","danger","response","setState","errors","avatar","filename","avatarSrc","avatarUrl","open","method","action","send","localize","currentAvatar","accountUrl","noAvatarSrc","reader","FileReader","onloadend","String","result","imageScale","blob","URL","createObjectURL","bind","handleFileInputChange","file","readAsDataURL","render","avatarStyle","objectFit","border","boxShadow","handleSubmit","handleError"],"sources":["../../../src/app/content/d4science-page/AvatarForm.tsx"],"sourcesContent":["import * as React from 'react';\r\nimport * as CSS from 'csstype';\r\n\r\nimport { Form, FormGroup, ActionGroup, FileUpload, Avatar, Button, Tooltip } from \"@patternfly/react-core\";\r\nimport { OutlinedQuestionCircleIcon } from '@patternfly/react-icons';\r\nimport { AccountServiceContext } from '../../account-service/AccountServiceContext';\r\nimport { ContentAlert } from '../ContentAlert';\r\nimport { Msg } from '../../widgets/Msg';\r\n\r\n\r\ninterface AvatarFormProps {\r\n accountUrl: string;\r\n}\r\n\r\ninterface AvatarFormState {\r\n errors: any;\r\n imageBlob: any;\r\n filename: string;\r\n avatarUrl: string;\r\n avatarSrc: string;\r\n noAvatarSrc: string;\r\n}\r\n\r\nexport class AvatarForm extends React.Component {\r\n static contextType = AccountServiceContext;\r\n context: React.ContextType;\r\n private handleFileInputChange: any;\r\n\r\n constructor(props: AvatarFormProps, context: React.ContextType) {\r\n super(props);\r\n this.context = context;\r\n\r\n var currentAvatar = props.accountUrl + \"-avatar\"\r\n this.state = {\r\n errors: {avatar: ''},\r\n imageBlob: null,\r\n filename: \"\",\r\n avatarUrl: currentAvatar,\r\n avatarSrc: currentAvatar,\r\n noAvatarSrc: \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDI0LjAuMiwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPgo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IgoJIHZpZXdCb3g9IjAgMCAzNiAzNiIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgMzYgMzY7IiB4bWw6c3BhY2U9InByZXNlcnZlIj4KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KCS5zdDB7ZmlsbC1ydWxlOmV2ZW5vZGQ7Y2xpcC1ydWxlOmV2ZW5vZGQ7ZmlsbDojRjBGMEYwO30KCS5zdDF7ZmlsbC1ydWxlOmV2ZW5vZGQ7Y2xpcC1ydWxlOmV2ZW5vZGQ7ZmlsbDojRDJEMkQyO30KCS5zdDJ7ZmlsbDojQjhCQkJFO30KCS5zdDN7ZmlsbDojRDJEMkQyO30KPC9zdHlsZT4KPHJlY3QgY2xhc3M9InN0MCIgd2lkdGg9IjM2IiBoZWlnaHQ9IjM2Ii8+CjxwYXRoIGNsYXNzPSJzdDEiIGQ9Ik0xNy43LDIwLjFjLTMuNSwwLTYuNC0yLjktNi40LTYuNHMyLjktNi40LDYuNC02LjRzNi40LDIuOSw2LjQsNi40UzIxLjMsMjAuMSwxNy43LDIwLjF6Ii8+CjxwYXRoIGNsYXNzPSJzdDIiIGQ9Ik0xMy4zLDM2bDAtNi43Yy0yLDAuNC0yLjksMS40LTMuMSwzLjVMMTAuMSwzNkgxMy4zeiIvPgo8cGF0aCBjbGFzcz0ic3QzIiBkPSJNMTAuMSwzNmwwLjEtMy4yYzAuMi0yLjEsMS4xLTMuMSwzLjEtMy41bDAsNi43aDkuNGwwLTYuN2MyLDAuNCwyLjksMS40LDMuMSwzLjVsMC4xLDMuMmg0LjcKCWMtMC40LTMuOS0xLjMtOS0yLjktMTFjLTEuMS0xLjQtMi4zLTIuMi0zLjUtMi42cy0xLjgtMC42LTYuMy0wLjZzLTYuMSwwLjctNi4xLDAuN2MtMS4yLDAuNC0yLjQsMS4yLTMuNCwyLjYKCUM2LjcsMjcsNS44LDMyLjIsNS40LDM2SDEwLjF6Ii8+CjxwYXRoIGNsYXNzPSJzdDIiIGQ9Ik0yNS45LDM2bC0wLjEtMy4yYy0wLjItMi4xLTEuMS0zLjEtMy4xLTMuNWwwLDYuN0gyNS45eiIvPgo8L3N2Zz4=\"\r\n }\r\n\r\n var reader = new FileReader()\r\n reader.onloadend = function (event: any) {\r\n var imgData = String(event.target!.result)\r\n this.imageScale(imgData, (blob: Blob) => {\r\n this.setState({\r\n imageBlob: blob,\r\n avatarSrc: URL.createObjectURL(blob)\r\n })\r\n })\r\n }.bind(this)\r\n \r\n this.handleFileInputChange = (file: File, filename: string) => {\r\n if (filename != \"\") {\r\n this.setState({ filename: filename })\r\n reader.readAsDataURL(file)\r\n } else {\r\n this.setState({\r\n imageBlob: null,\r\n filename: \"\",\r\n avatarSrc: currentAvatar\r\n })\r\n }\r\n }\r\n }\r\n\r\n private imageScale = (imgData: string, callback: any) => {\r\n var img = new Image()\r\n img.src = imgData\r\n img.onload = (event: Event) => {\r\n var canvas = document.createElement(\"canvas\")\r\n var ctx = canvas.getContext(\"2d\")\r\n ctx!.drawImage(img, 0, 0)\r\n\r\n var MAX_WIDTH = 250\r\n var MAX_HEIGHT = 250\r\n var width = img.width\r\n var height = img.height\r\n\r\n if (width > height) {\r\n if (width > MAX_WIDTH) {\r\n height *= MAX_WIDTH / width\r\n width = MAX_WIDTH\r\n }\r\n } else {\r\n if (height > MAX_HEIGHT) {\r\n width *= MAX_HEIGHT / height\r\n height = MAX_HEIGHT\r\n }\r\n }\r\n canvas.width = width\r\n canvas.height = height\r\n ctx = canvas.getContext(\"2d\")\r\n ctx!.drawImage(img, 0, 0, width, height)\r\n canvas.toBlob(callback)\r\n }\r\n }\r\n\r\n private handleSubmit = (event: React.FormEvent): void => {\r\n event.preventDefault()\r\n const form = event.target as HTMLFormElement\r\n var formData = new FormData(form)\r\n formData.append(\"image\", this.state.imageBlob)\r\n var xhr = new XMLHttpRequest();\r\n xhr.onreadystatechange = () => {\r\n if (xhr.readyState == 4) {\r\n if (200 <= xhr.status && xhr.status <= 204) {\r\n ContentAlert.success('avatarUpdatedMessage')\r\n } else {\r\n ContentAlert.danger(xhr.response)\r\n }\r\n // force reload avatar\r\n this.setState({\r\n errors: {avatar: \"\"},\r\n imageBlob: null,\r\n filename: \"\",\r\n avatarSrc: this.state.avatarUrl\r\n })\r\n }\r\n }\r\n xhr.open(form.method, form.action, true);\r\n xhr.send(formData);\r\n }\r\n\r\n private handleError = (event: any) => {\r\n this.setState({\r\n errors: {avatar: Msg.localize('error-noAvatarFound')},\r\n avatarSrc: \"\"\r\n })\r\n }\r\n\r\n render() {\r\n const { filename, avatarUrl, avatarSrc, noAvatarSrc } = this.state\r\n const avatarStyle: CSS.Properties = {\r\n objectFit: 'cover',\r\n width: '150px', height: '150px',\r\n border: '1px solid lightgray',\r\n boxShadow: 'lightgray 6px 3px 10px 2px'\r\n }\r\n return (\r\n
this.handleSubmit(event)}\r\n >\r\n \r\n { avatarSrc !== \"\"\r\n ? \r\n : \r\n }\r\n \r\n\r\n \r\n \r\n {' '}\r\n }>\r\n \r\n \r\n }\r\n >\r\n \r\n\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n }\r\n}\r\n"],"mappings":"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"} \ No newline at end of file diff --git a/keycloak-d4science-theme/src/main/resources/theme/d4science.v2/account/src/app/content/d4science-page/AccountExtraPage.tsx b/keycloak-d4science-theme/src/main/resources/theme/d4science.v2/account/src/app/content/d4science-page/AccountExtraPage.tsx index 1880c02..e34a8e6 100644 --- a/keycloak-d4science-theme/src/main/resources/theme/d4science.v2/account/src/app/content/d4science-page/AccountExtraPage.tsx +++ b/keycloak-d4science-theme/src/main/resources/theme/d4science.v2/account/src/app/content/d4science-page/AccountExtraPage.tsx @@ -1,6 +1,6 @@ import * as React from 'react'; -import { Button, Grid, GridItem, Expandable, Modal, Form } from '@patternfly/react-core'; +import { PageSection, PageSectionVariants,Button, Grid, GridItem, ExpandableSection, Modal } from '@patternfly/react-core'; import { AccountServiceContext } from '../../account-service/AccountServiceContext'; import { Msg } from '../../widgets/Msg'; import { ContentPage } from '../ContentPage'; @@ -45,42 +45,44 @@ export class AccountExtraPage extends React.Component - + + -
- - - -

- - - + + + + + this.handleModalToggle(false)} + actions={[ + , + - - - - - this.handleModalToggle(false)} - actions={[ - , - - ]} - > -

-
- -
+ ]} + > +
+
+ +
+ ) diff --git a/keycloak-d4science-theme/src/main/resources/theme/d4science.v2/account/src/app/content/d4science-page/AvatarForm.tsx b/keycloak-d4science-theme/src/main/resources/theme/d4science.v2/account/src/app/content/d4science-page/AvatarForm.tsx index 3be175f..754ac95 100644 --- a/keycloak-d4science-theme/src/main/resources/theme/d4science.v2/account/src/app/content/d4science-page/AvatarForm.tsx +++ b/keycloak-d4science-theme/src/main/resources/theme/d4science.v2/account/src/app/content/d4science-page/AvatarForm.tsx @@ -139,14 +139,14 @@ export class AvatarForm extends React.Component this.handleSubmit(event)} > { avatarSrc !== "" ? diff --git a/keycloak-d4science-theme/src/main/resources/theme/d4science.v2/account/theme.properties b/keycloak-d4science-theme/src/main/resources/theme/d4science.v2/account/theme.properties index c402614..34e0578 100644 --- a/keycloak-d4science-theme/src/main/resources/theme/d4science.v2/account/theme.properties +++ b/keycloak-d4science-theme/src/main/resources/theme/d4science.v2/account/theme.properties @@ -1,19 +1,13 @@ -# This theme will inherit everything from its parent unless -# it is overridden in the current theme. parent=keycloak.v2 -# Look at the styles.css file to see examples of using PatternFly's CSS variables -# for modifying look and feel. -styles=css/styles.css - # This is the logo in upper lefthand corner. # It must be a relative path. logo=/public/d4science-logo.png # This is the link followed when clicking on the logo. # It can be any valid URL, including an external site. -logoUrl=./ +logoUrl=https://www.d4science.org/ # This is the icon for the account console. # It must be a relative path. -favIcon=/public/favicon.ico \ No newline at end of file +favIcon=/public/favicon.ico diff --git a/keycloak-d4science-theme/src/main/resources/theme/d4science/login/login-update-profile.ftl b/keycloak-d4science-theme/src/main/resources/theme/d4science/login/login-update-profile.ftl index 6faf8db..b5f017a 100644 --- a/keycloak-d4science-theme/src/main/resources/theme/d4science/login/login-update-profile.ftl +++ b/keycloak-d4science-theme/src/main/resources/theme/d4science/login/login-update-profile.ftl @@ -26,23 +26,25 @@
-
-
- -
-
- + <#if user.editEmailAllowed> +
+
+ +
+
+ - <#if messagesPerField.existsError('email')> - - ${kcSanitize(messagesPerField.get('email'))?no_esc} - - + <#if messagesPerField.existsError('email')> + + ${kcSanitize(messagesPerField.get('email'))?no_esc} + + +
-
+
diff --git a/keycloak-d4science-theme/src/main/resources/theme/d4science/login/template.ftl b/keycloak-d4science-theme/src/main/resources/theme/d4science/login/template.ftl index ca3bdb2..bcf03bb 100644 --- a/keycloak-d4science-theme/src/main/resources/theme/d4science/login/template.ftl +++ b/keycloak-d4science-theme/src/main/resources/theme/d4science/login/template.ftl @@ -1,6 +1,6 @@ <#macro registrationLayout bodyClass="" displayInfo=false displayMessage=true displayRequiredFields=false displayWide=false> - - + + @@ -47,6 +47,7 @@ class="${properties.kcHeaderWrapperClass!}">${kcSanitize(msg("loginTitleHtml",(realm.displayNameHtml!'')))?no_esc}
--> +