diff --git a/packages/widgets/src/SharingDialog/AccessSelect.js b/packages/widgets/src/SharingDialog/AccessSelect.js index bbd81e94e6..1123fc2e46 100644 --- a/packages/widgets/src/SharingDialog/AccessSelect.js +++ b/packages/widgets/src/SharingDialog/AccessSelect.js @@ -1,22 +1,32 @@ import React from 'react' -import { - SingleSelect, - SingleSelectOption, -} from '../' + +import PropTypes from '@dhis2/prop-types' + +import i18n from '@dhis2/d2-i18n' + +import { SingleSelect, SingleSelectOption } from '../' import { accessStrings, ACCESS_NONE } from './sharingConstants' -import { accessSelectStyles } from './SharingDialog.styles'; +import { accessSelectStyles } from './SharingDialog.styles' export const AccessSelect = ({ access, onChange, showNoAccessOption }) => ( onChange(selected)} + className="share-select" + placeholder={i18n.t('Select access')} + selected={access} + onChange={({ selected }) => onChange(selected)} > - {Object.entries(accessStrings).map(([value, strings]) => ( - (value !== ACCESS_NONE || showNoAccessOption) && - - ))} + {Object.entries(accessStrings).map( + ([value, strings]) => + (value !== ACCESS_NONE || showNoAccessOption) && ( + + ) + )} - ); \ No newline at end of file +) + +AccessSelect.propTypes = { + access: PropTypes.object, + showNoAccessOption: PropTypes.bool, + onChange: PropTypes.func, +} diff --git a/packages/widgets/src/SharingDialog/ShareBlock.js b/packages/widgets/src/SharingDialog/ShareBlock.js index fc2c833030..3de59cb35d 100644 --- a/packages/widgets/src/SharingDialog/ShareBlock.js +++ b/packages/widgets/src/SharingDialog/ShareBlock.js @@ -1,7 +1,12 @@ import React, { useState } from 'react' -import { Button, InputField } from '../'; -import { AccessSelect } from './AccessSelect'; -import { shareBlockStyles } from "./SharingDialog.styles"; + +import PropTypes from '@dhis2/prop-types' + +import i18n from '@dhis2/d2-i18n' + +import { Button, InputField } from '../' +import { AccessSelect } from './AccessSelect' +import { shareBlockStyles } from './SharingDialog.styles' export const ShareBlock = ({ onAdd }) => { const [userOrGroup, setUserOrGroup] = useState(undefined) @@ -14,20 +19,28 @@ export const ShareBlock = ({ onAdd }) => { setAccess(undefined) } - return
- -

Share with users and groups

-
- setUserOrGroup(value)} - /> -
- + return ( +
+ +

{i18n.t('Share with users and groups')}

+ + setUserOrGroup(value)} + /> +
+ +
+ +
- - -
-}; \ No newline at end of file + ) +} + +ShareBlock.propTypes = { + onAdd: PropTypes.func, +} diff --git a/packages/widgets/src/SharingDialog/SharingDialog.js b/packages/widgets/src/SharingDialog/SharingDialog.js index 24b58c3434..f7658fb759 100644 --- a/packages/widgets/src/SharingDialog/SharingDialog.js +++ b/packages/widgets/src/SharingDialog/SharingDialog.js @@ -1,53 +1,72 @@ -import React, { useState } from "react"; +import React, { useState } from 'react' import PropTypes from '@dhis2/prop-types' +import i18n from '@dhis2/d2-i18n' + +import { + Modal, + ModalTitle, + ModalContent, + ModalActions, + ButtonStrip, + Button, +} from '../' +import { SharingList } from './SharingList' +import { ShareBlock } from './ShareBlock' import { - Modal, - ModalTitle, - ModalContent, - ModalActions, - ButtonStrip, - Button, -} from "../"; -import { SharingList } from "./SharingList"; -import { ShareBlock } from "./ShareBlock"; -import i18n from "@dhis2/d2-i18n"; -import { defaultSharingSettings, sharingSettingsAreEqual } from "./sharingConstants"; + defaultSharingSettings, + sharingSettingsAreEqual, +} from './sharingConstants' -export const SharingDialog = ({ name, initialSharingSettings = defaultSharingSettings }) => { - const [sharingSettings, updateSharingSettings] = useState(initialSharingSettings) +export const SharingDialog = ({ + name, + initialSharingSettings = defaultSharingSettings, +}) => { + const [sharingSettings, updateSharingSettings] = useState( + initialSharingSettings + ) - const addUserOrGroupAccess = ({ type, id, access }) => { - console.log(type, id, access) - updateSharingSettings({ - ...sharingSettings, - [`${type}s`]: { - ...sharingSettings[`${type}s`], - [id]: access - } - }) -} + const addUserOrGroupAccess = ({ type, id, access }) => { + console.log(type, id, access) + updateSharingSettings({ + ...sharingSettings, + [`${type}s`]: { + ...sharingSettings[`${type}s`], + [id]: access, + }, + }) + } - console.log(sharingSettings) - - const dirty = !sharingSettingsAreEqual(initialSharingSettings, sharingSettings) - return ( - - {i18n.t('Sharing settings')}{ name && `: ${name}` } - - - - - - - - - - - - ); + const dirty = !sharingSettingsAreEqual( + initialSharingSettings, + sharingSettings + ) + return ( + + + {i18n.t('Sharing settings')} + {name && `: ${name}`} + + + + + + + + + + + + + ) } -SharingDialog.propTYpes = { - name: PropTypes.string -} \ No newline at end of file +SharingDialog.propTypes = { + initialSharingSettings: PropTypes.object, + name: PropTypes.string, +} diff --git a/packages/widgets/src/SharingDialog/SharingList.js b/packages/widgets/src/SharingDialog/SharingList.js index 9cd9e31159..9735eff4d4 100644 --- a/packages/widgets/src/SharingDialog/SharingList.js +++ b/packages/widgets/src/SharingDialog/SharingList.js @@ -1,43 +1,92 @@ import React from 'react' -import { sharingListStyles } from "./SharingDialog.styles"; -import { SHARE_TARGET_PUBLIC, SHARE_TARGET_EXTERNAL, SHARE_TARGET_GROUP, SHARE_TARGET_USER } from "./sharingConstants"; -import { SharingListItem } from './SharingListItem'; -import i18n from '@dhis2/d2-i18n'; +import PropTypes from '@dhis2/prop-types' +import i18n from '@dhis2/d2-i18n' + +import { sharingListStyles } from './SharingDialog.styles' +import { + SHARE_TARGET_PUBLIC, + SHARE_TARGET_EXTERNAL, + SHARE_TARGET_GROUP, + SHARE_TARGET_USER, +} from './sharingConstants' +import { SharingListItem } from './SharingListItem' export const SharingList = ({ sharingSettings, onChange }) => ( -
- -

{i18n.t('Users and groups that have access')}

- - - onChange({ ...sharingSettings, external: access })} /> - onChange({ ...sharingSettings, public: access })} /> - {Object.entries(sharingSettings.groups).map(([group, access]) => - onChange({ ...sharingSettings, groups: { ...sharingSettings.groups, [group]: newAccess } })} /> - )} - {Object.entries(sharingSettings.users).map(([user, access]) => - access && onChange({ - ...sharingSettings, - users: { - ...sharingSettings.users, - [user]: newAccess +
+ +

{i18n.t('Users and groups that have access')}

+
+ + + onChange({ ...sharingSettings, external: access }) } - })} - onRemove={() => onChange({ - ...sharingSettings, - users: { - ...sharingSettings.users, - [user]: undefined + /> + + onChange({ ...sharingSettings, public: access }) } - })} - /> - )} - -
-
-); \ No newline at end of file + /> + {Object.entries(sharingSettings.groups).map( + ([group, access]) => ( + + onChange({ + ...sharingSettings, + groups: { + ...sharingSettings.groups, + [group]: newAccess, + }, + }) + } + /> + ) + )} + {Object.entries(sharingSettings.users).map( + ([user, access]) => + access && ( + + onChange({ + ...sharingSettings, + users: { + ...sharingSettings.users, + [user]: newAccess, + }, + }) + } + onRemove={() => + onChange({ + ...sharingSettings, + users: { + ...sharingSettings.users, + [user]: undefined, + }, + }) + } + /> + ) + )} + + +
+) + +SharingList.propTypes = { + sharingSettings: PropTypes.object, + onChange: PropTypes.func, +} diff --git a/packages/widgets/src/SharingDialog/SharingListItem.js b/packages/widgets/src/SharingDialog/SharingListItem.js index 87dc6ce6cf..34cb8d55eb 100644 --- a/packages/widgets/src/SharingDialog/SharingListItem.js +++ b/packages/widgets/src/SharingDialog/SharingListItem.js @@ -1,32 +1,57 @@ import React from 'react' +import PropTypes from '@dhis2/prop-types' -import { sharingListItemStyles } from "./SharingDialog.styles"; -import { IconExternal } from "./icons/IconExternal"; -import { IconDelete } from "./icons/IconDelete"; -import { SHARE_TARGET_PUBLIC, accessStrings, isPermanentTarget } from "./sharingConstants"; -import { AccessSelect } from './AccessSelect'; +import { sharingListItemStyles } from './SharingDialog.styles' +import { IconExternal } from './icons/IconExternal' +import { IconDelete } from './icons/IconDelete' +import { + SHARE_TARGET_PUBLIC, + accessStrings, + isPermanentTarget, +} from './sharingConstants' +import { AccessSelect } from './AccessSelect' -export const SharingListItem = ({ name, target, access, onChange, onRemove }) => ( +export const SharingListItem = ({ + name, + target, + access, + onChange, + onRemove, +}) => ( - - - - - -

{name}

-

- {target === SHARE_TARGET_PUBLIC - ? accessStrings[access]?.publicDescription - : accessStrings[access]?.description} -

- - - - - - {!isPermanentTarget(target) &&
- -
} - + + + + + +

{name}

+

+ {target === SHARE_TARGET_PUBLIC + ? accessStrings[access]?.publicDescription + : accessStrings[access]?.description} +

+ + + + + + {!isPermanentTarget(target) && ( +
+ +
+ )} + - ); \ No newline at end of file +) + +SharingListItem.propTypes = { + access: PropTypes.object, + name: PropTypes.string, + target: PropTypes.string, + onChange: PropTypes.func, + onRemove: PropTypes.func, +}