@selfcommunity/react-ui 0.7.9-alpha.7 → 0.7.9-alpha.70

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (168) hide show
  1. package/lib/cjs/components/AccountRecover/AccountRecover.js +6 -1
  2. package/lib/cjs/components/BottomNavigation/BottomNavigation.js +4 -3
  3. package/lib/cjs/components/CategoryHeader/Skeleton.js +3 -2
  4. package/lib/cjs/components/ChangeGroupPicture/ChangeGroupPicture.js +13 -10
  5. package/lib/cjs/components/Composer/Attributes/Attributes.js +3 -3
  6. package/lib/cjs/components/Composer/Composer.js +3 -3
  7. package/lib/cjs/components/Composer/Layer/AudienceLayer/AudienceLayer.d.ts +1 -1
  8. package/lib/cjs/components/Composer/Layer/AudienceLayer/AudienceLayer.js +9 -19
  9. package/lib/cjs/components/FeedObject/Contributors/Contributors.js +1 -1
  10. package/lib/cjs/components/FeedObject/FeedObject.d.ts +1 -0
  11. package/lib/cjs/components/FeedObject/FeedObject.js +27 -8
  12. package/lib/cjs/components/FeedObject/Poll/Poll.js +20 -20
  13. package/lib/cjs/components/FeedUpdatesWidget/FeedUpdatesWidget.js +1 -1
  14. package/lib/cjs/components/Group/Group.d.ts +8 -0
  15. package/lib/cjs/components/Group/Group.js +17 -5
  16. package/lib/cjs/components/GroupAutocomplete/GroupAutocomplete.js +1 -1
  17. package/lib/cjs/components/GroupForm/GroupForm.js +64 -13
  18. package/lib/cjs/components/GroupHeader/GroupHeader.d.ts +6 -5
  19. package/lib/cjs/components/GroupHeader/GroupHeader.js +53 -11
  20. package/lib/cjs/components/GroupInfoWidget/GroupInfoWidget.js +63 -9
  21. package/lib/cjs/components/GroupInviteButton/GroupInviteButton.js +31 -9
  22. package/lib/cjs/components/GroupInvitedWidget/GroupInvitedWidget.d.ts +74 -0
  23. package/lib/cjs/components/GroupInvitedWidget/GroupInvitedWidget.js +221 -0
  24. package/lib/cjs/components/GroupInvitedWidget/Skeleton.d.ts +22 -0
  25. package/lib/cjs/components/GroupInvitedWidget/Skeleton.js +38 -0
  26. package/lib/cjs/components/GroupInvitedWidget/constants.d.ts +1 -0
  27. package/lib/cjs/components/GroupInvitedWidget/constants.js +4 -0
  28. package/lib/cjs/components/GroupInvitedWidget/index.d.ts +4 -0
  29. package/lib/cjs/components/GroupInvitedWidget/index.js +8 -0
  30. package/lib/cjs/components/GroupMembersButton/GroupMembersButton.d.ts +5 -0
  31. package/lib/cjs/components/GroupMembersButton/GroupMembersButton.js +8 -3
  32. package/lib/cjs/components/GroupMembersWidget/GroupMembersWidget.js +25 -4
  33. package/lib/cjs/components/GroupRequestsWidget/GroupRequestsWidget.d.ts +11 -5
  34. package/lib/cjs/components/GroupRequestsWidget/GroupRequestsWidget.js +18 -7
  35. package/lib/cjs/components/GroupSettingsIconButton/GroupSettingsIconButton.d.ts +48 -0
  36. package/lib/cjs/components/GroupSettingsIconButton/GroupSettingsIconButton.js +151 -0
  37. package/lib/cjs/components/GroupSettingsIconButton/index.d.ts +3 -0
  38. package/lib/cjs/components/GroupSettingsIconButton/index.js +5 -0
  39. package/lib/cjs/components/GroupSubscribeButton/GroupSubscribeButton.d.ts +8 -3
  40. package/lib/cjs/components/GroupSubscribeButton/GroupSubscribeButton.js +30 -11
  41. package/lib/cjs/components/Groups/Groups.d.ts +15 -8
  42. package/lib/cjs/components/Groups/Groups.js +89 -32
  43. package/lib/cjs/components/Groups/Skeleton.d.ts +4 -0
  44. package/lib/cjs/components/Groups/Skeleton.js +2 -2
  45. package/lib/cjs/components/InlineComposerWidget/InlineComposerWidget.js +7 -0
  46. package/lib/cjs/components/NavigationMenuIconButton/NavigationMenuIconButton.js +1 -1
  47. package/lib/cjs/components/NavigationSettingsIconButton/NavigationSettingsIconButton.js +4 -4
  48. package/lib/cjs/components/NavigationToolbar/NavigationToolbar.js +6 -2
  49. package/lib/cjs/components/NavigationToolbarMobile/NavigationToolbarMobile.d.ts +5 -0
  50. package/lib/cjs/components/NavigationToolbarMobile/NavigationToolbarMobile.js +11 -4
  51. package/lib/cjs/components/Notification/Group/Group.d.ts +15 -0
  52. package/lib/cjs/components/Notification/Group/Group.js +78 -0
  53. package/lib/cjs/components/Notification/Group/index.d.ts +3 -0
  54. package/lib/cjs/components/Notification/Group/index.js +5 -0
  55. package/lib/cjs/components/Notification/Notification.js +31 -1
  56. package/lib/cjs/components/Notification/PrivateMessage/PrivateMessage.js +16 -5
  57. package/lib/cjs/components/PrivateMessageComponent/PrivateMessageComponent.d.ts +1 -1
  58. package/lib/cjs/components/PrivateMessageComponent/PrivateMessageComponent.js +12 -7
  59. package/lib/cjs/components/PrivateMessageSettingsIconButton/PrivateMessageSettingsIconButton.js +1 -1
  60. package/lib/cjs/components/PrivateMessageSnippetItem/PrivateMessageSnippetItem.js +11 -6
  61. package/lib/cjs/components/PrivateMessageSnippets/PrivateMessageSnippets.d.ts +3 -3
  62. package/lib/cjs/components/PrivateMessageSnippets/PrivateMessageSnippets.js +24 -6
  63. package/lib/cjs/components/PrivateMessageThread/PrivateMessageThread.d.ts +6 -1
  64. package/lib/cjs/components/PrivateMessageThread/PrivateMessageThread.js +45 -20
  65. package/lib/cjs/components/PrivateMessageThreadItem/PrivateMessageThreadItem.js +6 -0
  66. package/lib/cjs/components/SearchAutocomplete/SearchAutocomplete.js +22 -5
  67. package/lib/cjs/components/SnippetNotifications/SnippetNotifications.js +7 -0
  68. package/lib/cjs/components/ToastNotifications/ToastNotifications.js +7 -0
  69. package/lib/cjs/components/User/User.d.ts +6 -1
  70. package/lib/cjs/components/User/User.js +5 -4
  71. package/lib/cjs/components/UserSubscribedGroupsWidget/Skeleton.d.ts +21 -0
  72. package/lib/cjs/components/UserSubscribedGroupsWidget/Skeleton.js +46 -0
  73. package/lib/cjs/components/UserSubscribedGroupsWidget/UserSubscribedGroupsWidget.d.ts +68 -0
  74. package/lib/cjs/components/UserSubscribedGroupsWidget/UserSubscribedGroupsWidget.js +183 -0
  75. package/lib/cjs/components/UserSubscribedGroupsWidget/constants.d.ts +1 -0
  76. package/lib/cjs/components/UserSubscribedGroupsWidget/constants.js +4 -0
  77. package/lib/cjs/components/UserSubscribedGroupsWidget/index.d.ts +4 -0
  78. package/lib/cjs/components/UserSubscribedGroupsWidget/index.js +8 -0
  79. package/lib/cjs/components/VoteAudienceButton/VoteAudienceButton.js +1 -1
  80. package/lib/cjs/constants/PubSub.d.ts +28 -0
  81. package/lib/cjs/constants/PubSub.js +22 -0
  82. package/lib/cjs/index.d.ts +6 -2
  83. package/lib/cjs/index.js +15 -4
  84. package/lib/esm/components/AccountRecover/AccountRecover.js +6 -1
  85. package/lib/esm/components/BottomNavigation/BottomNavigation.js +5 -4
  86. package/lib/esm/components/CategoryHeader/Skeleton.js +3 -2
  87. package/lib/esm/components/ChangeGroupPicture/ChangeGroupPicture.js +13 -10
  88. package/lib/esm/components/Composer/Attributes/Attributes.js +3 -3
  89. package/lib/esm/components/Composer/Composer.js +3 -3
  90. package/lib/esm/components/Composer/Layer/AudienceLayer/AudienceLayer.d.ts +1 -1
  91. package/lib/esm/components/Composer/Layer/AudienceLayer/AudienceLayer.js +9 -19
  92. package/lib/esm/components/FeedObject/Contributors/Contributors.js +1 -1
  93. package/lib/esm/components/FeedObject/FeedObject.d.ts +1 -0
  94. package/lib/esm/components/FeedObject/FeedObject.js +28 -9
  95. package/lib/esm/components/FeedObject/Poll/Poll.js +20 -20
  96. package/lib/esm/components/FeedUpdatesWidget/FeedUpdatesWidget.js +1 -1
  97. package/lib/esm/components/Group/Group.d.ts +8 -0
  98. package/lib/esm/components/Group/Group.js +21 -9
  99. package/lib/esm/components/GroupAutocomplete/GroupAutocomplete.js +1 -1
  100. package/lib/esm/components/GroupForm/GroupForm.js +64 -13
  101. package/lib/esm/components/GroupHeader/GroupHeader.d.ts +6 -5
  102. package/lib/esm/components/GroupHeader/GroupHeader.js +55 -13
  103. package/lib/esm/components/GroupInfoWidget/GroupInfoWidget.js +63 -9
  104. package/lib/esm/components/GroupInviteButton/GroupInviteButton.js +31 -9
  105. package/lib/esm/components/GroupInvitedWidget/GroupInvitedWidget.d.ts +74 -0
  106. package/lib/esm/components/GroupInvitedWidget/GroupInvitedWidget.js +218 -0
  107. package/lib/esm/components/GroupInvitedWidget/Skeleton.d.ts +22 -0
  108. package/lib/esm/components/GroupInvitedWidget/Skeleton.js +34 -0
  109. package/lib/esm/components/GroupInvitedWidget/constants.d.ts +1 -0
  110. package/lib/esm/components/GroupInvitedWidget/constants.js +1 -0
  111. package/lib/esm/components/GroupInvitedWidget/index.d.ts +4 -0
  112. package/lib/esm/components/GroupInvitedWidget/index.js +4 -0
  113. package/lib/esm/components/GroupMembersButton/GroupMembersButton.d.ts +5 -0
  114. package/lib/esm/components/GroupMembersButton/GroupMembersButton.js +9 -4
  115. package/lib/esm/components/GroupMembersWidget/GroupMembersWidget.js +26 -5
  116. package/lib/esm/components/GroupRequestsWidget/GroupRequestsWidget.d.ts +11 -5
  117. package/lib/esm/components/GroupRequestsWidget/GroupRequestsWidget.js +18 -7
  118. package/lib/esm/components/GroupSettingsIconButton/GroupSettingsIconButton.d.ts +48 -0
  119. package/lib/esm/components/GroupSettingsIconButton/GroupSettingsIconButton.js +148 -0
  120. package/lib/esm/components/GroupSettingsIconButton/index.d.ts +3 -0
  121. package/lib/esm/components/GroupSettingsIconButton/index.js +2 -0
  122. package/lib/esm/components/GroupSubscribeButton/GroupSubscribeButton.d.ts +8 -3
  123. package/lib/esm/components/GroupSubscribeButton/GroupSubscribeButton.js +30 -11
  124. package/lib/esm/components/Groups/Groups.d.ts +15 -8
  125. package/lib/esm/components/Groups/Groups.js +94 -37
  126. package/lib/esm/components/Groups/Skeleton.d.ts +4 -0
  127. package/lib/esm/components/Groups/Skeleton.js +2 -2
  128. package/lib/esm/components/InlineComposerWidget/InlineComposerWidget.js +9 -2
  129. package/lib/esm/components/NavigationMenuIconButton/NavigationMenuIconButton.js +1 -1
  130. package/lib/esm/components/NavigationSettingsIconButton/NavigationSettingsIconButton.js +4 -4
  131. package/lib/esm/components/NavigationToolbar/NavigationToolbar.js +7 -3
  132. package/lib/esm/components/NavigationToolbarMobile/NavigationToolbarMobile.d.ts +5 -0
  133. package/lib/esm/components/NavigationToolbarMobile/NavigationToolbarMobile.js +13 -6
  134. package/lib/esm/components/Notification/Group/Group.d.ts +15 -0
  135. package/lib/esm/components/Notification/Group/Group.js +75 -0
  136. package/lib/esm/components/Notification/Group/index.d.ts +3 -0
  137. package/lib/esm/components/Notification/Group/index.js +2 -0
  138. package/lib/esm/components/Notification/Notification.js +31 -1
  139. package/lib/esm/components/Notification/PrivateMessage/PrivateMessage.js +16 -5
  140. package/lib/esm/components/PrivateMessageComponent/PrivateMessageComponent.d.ts +1 -1
  141. package/lib/esm/components/PrivateMessageComponent/PrivateMessageComponent.js +13 -8
  142. package/lib/esm/components/PrivateMessageSettingsIconButton/PrivateMessageSettingsIconButton.js +1 -1
  143. package/lib/esm/components/PrivateMessageSnippetItem/PrivateMessageSnippetItem.js +11 -6
  144. package/lib/esm/components/PrivateMessageSnippets/PrivateMessageSnippets.d.ts +3 -3
  145. package/lib/esm/components/PrivateMessageSnippets/PrivateMessageSnippets.js +26 -8
  146. package/lib/esm/components/PrivateMessageThread/PrivateMessageThread.d.ts +6 -1
  147. package/lib/esm/components/PrivateMessageThread/PrivateMessageThread.js +47 -22
  148. package/lib/esm/components/PrivateMessageThreadItem/PrivateMessageThreadItem.js +7 -1
  149. package/lib/esm/components/SearchAutocomplete/SearchAutocomplete.js +22 -5
  150. package/lib/esm/components/SnippetNotifications/SnippetNotifications.js +7 -0
  151. package/lib/esm/components/ToastNotifications/ToastNotifications.js +7 -0
  152. package/lib/esm/components/User/User.d.ts +6 -1
  153. package/lib/esm/components/User/User.js +5 -4
  154. package/lib/esm/components/UserSubscribedGroupsWidget/Skeleton.d.ts +21 -0
  155. package/lib/esm/components/UserSubscribedGroupsWidget/Skeleton.js +42 -0
  156. package/lib/esm/components/UserSubscribedGroupsWidget/UserSubscribedGroupsWidget.d.ts +68 -0
  157. package/lib/esm/components/UserSubscribedGroupsWidget/UserSubscribedGroupsWidget.js +180 -0
  158. package/lib/esm/components/UserSubscribedGroupsWidget/constants.d.ts +1 -0
  159. package/lib/esm/components/UserSubscribedGroupsWidget/constants.js +1 -0
  160. package/lib/esm/components/UserSubscribedGroupsWidget/index.d.ts +4 -0
  161. package/lib/esm/components/UserSubscribedGroupsWidget/index.js +4 -0
  162. package/lib/esm/components/VoteAudienceButton/VoteAudienceButton.js +1 -1
  163. package/lib/esm/constants/PubSub.d.ts +28 -0
  164. package/lib/esm/constants/PubSub.js +19 -0
  165. package/lib/esm/index.d.ts +6 -2
  166. package/lib/esm/index.js +8 -4
  167. package/lib/umd/react-ui.js +1 -1
  168. package/package.json +6 -6
@@ -103,7 +103,12 @@ function AccountRecover(inProps) {
103
103
  }
104
104
  // RENDER
105
105
  return (react_1.default.createElement(Root, Object.assign({ className: (0, classnames_1.default)(classes.root, className) }, rest), isSucceed ? (react_1.default.createElement(material_1.Alert, { severity: "success", className: classes.success },
106
- intl.formatMessage({ id: 'ui.accountRecover.success', defaultMessage: 'ui.accountRecover.success' }, { email, bold: (chunks) => react_1.default.createElement("b", null, chunks) }),
106
+ intl.formatMessage({ id: 'ui.accountRecover.success', defaultMessage: 'ui.accountRecover.success' }, {
107
+ email,
108
+ // eslint-disable-next-line @typescript-eslint/ban-ts-ignore
109
+ // @ts-ignore
110
+ b: (chunks) => react_1.default.createElement("b", null, chunks)
111
+ }),
107
112
  successAction)) : (react_1.default.createElement("form", { className: classes.form, onSubmit: handleSubmit },
108
113
  react_1.default.createElement(EmailTextField_1.default, Object.assign({ className: classes.email, disabled: isSubmitting, label: react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.accountRecover.email.label", defaultMessage: "ui.accountRecover.email.label" }) }, TextFieldProps, { value: email, onChange: handleChange, error: Boolean(emailError), helperText: emailError && (react_1.default.createElement(react_intl_1.FormattedMessage, { id: `ui.accountRecover.email.error.${emailError}`, defaultMessage: `ui.accountRecover.email.error.${emailError}` })) })),
109
114
  react_1.default.createElement(material_1.Button, Object.assign({ type: "submit" }, ButtonProps, { disabled: !email || Boolean(emailError) || isSubmitting }),
@@ -71,9 +71,10 @@ function BottomNavigation(inProps) {
71
71
  react_1.default.createElement(material_1.BottomNavigationAction, { key: "home", className: classes.action, component: react_core_1.Link, to: scUserContext.user ? scRoutingContext.url(react_core_1.SCRoutes.HOME_ROUTE_NAME, {}) : '/', value: scUserContext.user ? scRoutingContext.url(react_core_1.SCRoutes.HOME_ROUTE_NAME, {}) : '/', icon: react_1.default.createElement(material_1.Icon, null, "home") }),
72
72
  (scUserContext.user || preferences[react_core_1.SCPreferences.CONFIGURATIONS_CONTENT_AVAILABILITY].value) &&
73
73
  preferences[react_core_1.SCPreferences.CONFIGURATIONS_EXPLORE_STREAM_ENABLED].value ? (react_1.default.createElement(material_1.BottomNavigationAction, { key: "explore", className: classes.action, component: react_core_1.Link, to: scRoutingContext.url(react_core_1.SCRoutes.EXPLORE_ROUTE_NAME, {}), value: scRoutingContext.url(react_core_1.SCRoutes.EXPLORE_ROUTE_NAME, {}), icon: react_1.default.createElement(material_1.Icon, null, "explore") })) : null,
74
- react_1.default.createElement(material_1.BottomNavigationAction, { key: "composer", className: (0, classnames_1.default)(classes.composer, classes.action), component: ComposerIconButton_1.default, disableRipple: true }),
75
- groupsEnabled && scUserContext.user ? (react_1.default.createElement(material_1.BottomNavigationAction, { key: "groups", className: classes.action, component: react_core_1.Link, to: scRoutingContext.url(react_core_1.SCRoutes.GROUPS_ROUTE_NAME, {}), value: scRoutingContext.url(react_core_1.SCRoutes.GROUPS_ROUTE_NAME, {}), icon: react_1.default.createElement(material_1.Icon, null, "groups") })) : null,
76
- scUserContext.user ? (react_1.default.createElement(material_1.BottomNavigationAction, { key: "notifications", className: classes.action, component: react_core_1.Link, to: scRoutingContext.url(react_core_1.SCRoutes.USER_NOTIFICATIONS_ROUTE_NAME, {}), value: scRoutingContext.url(react_core_1.SCRoutes.USER_NOTIFICATIONS_ROUTE_NAME, {}), icon: react_1.default.createElement(material_1.Badge, { badgeContent: scUserContext.user.unseen_notification_banners_counter + scUserContext.user.unseen_interactions_counter, color: "secondary" },
74
+ !preferences[react_core_1.SCPreferences.CONFIGURATIONS_POST_ONLY_STAFF_ENABLED].value ||
75
+ (react_core_1.UserUtils.isStaff(scUserContext.user) && preferences[react_core_1.SCPreferences.CONFIGURATIONS_POST_ONLY_STAFF_ENABLED].value) ? (react_1.default.createElement(material_1.BottomNavigationAction, { key: "composer", className: (0, classnames_1.default)(classes.composer, classes.action), component: ComposerIconButton_1.default, disableRipple: true })) : null,
76
+ groupsEnabled && scUserContext.user ? (react_1.default.createElement(material_1.BottomNavigationAction, { key: "groups", className: classes.action, component: react_core_1.Link, to: scRoutingContext.url(react_core_1.SCRoutes.GROUPS_SUBSCRIBED_ROUTE_NAME, {}), value: scRoutingContext.url(react_core_1.SCRoutes.GROUPS_SUBSCRIBED_ROUTE_NAME, {}), icon: react_1.default.createElement(material_1.Icon, null, "groups") })) : null,
77
+ scUserContext.user && !groupsEnabled ? (react_1.default.createElement(material_1.BottomNavigationAction, { key: "notifications", className: classes.action, component: react_core_1.Link, to: scRoutingContext.url(react_core_1.SCRoutes.USER_NOTIFICATIONS_ROUTE_NAME, {}), value: scRoutingContext.url(react_core_1.SCRoutes.USER_NOTIFICATIONS_ROUTE_NAME, {}), icon: react_1.default.createElement(material_1.Badge, { badgeContent: scUserContext.user.unseen_notification_banners_counter + scUserContext.user.unseen_interactions_counter, color: "secondary" },
77
78
  react_1.default.createElement(material_1.Icon, null, "notifications_active")) })) : null,
78
79
  privateMessagingEnabled && scUserContext.user ? (react_1.default.createElement(material_1.BottomNavigationAction, { key: "messages", className: classes.action, component: react_core_1.Link, to: scRoutingContext.url(react_core_1.SCRoutes.USER_PRIVATE_MESSAGES_ROUTE_NAME, {}), value: scRoutingContext.url(react_core_1.SCRoutes.USER_PRIVATE_MESSAGES_ROUTE_NAME, {}), icon: react_1.default.createElement(material_1.Badge, { badgeContent: 0, color: "secondary" },
79
80
  react_1.default.createElement(material_1.Icon, null, "email")) })) : null
@@ -7,7 +7,8 @@ const styles_1 = require("@mui/material/styles");
7
7
  const Skeleton_1 = tslib_1.__importDefault(require("@mui/material/Skeleton"));
8
8
  const constants_1 = require("./constants");
9
9
  const classes = {
10
- root: `${constants_1.PREFIX}-skeleton-root`
10
+ root: `${constants_1.PREFIX}-skeleton-root`,
11
+ cover: `${constants_1.PREFIX}-skeleton-cover`,
11
12
  };
12
13
  const Root = (0, styles_1.styled)(material_1.Box, {
13
14
  name: constants_1.PREFIX,
@@ -35,7 +36,7 @@ const Root = (0, styles_1.styled)(material_1.Box, {
35
36
  */
36
37
  function CategoryHeaderSkeleton() {
37
38
  return (react_1.default.createElement(Root, { className: classes.root },
38
- react_1.default.createElement(Skeleton_1.default, { sx: { height: 150 }, animation: "wave", variant: "rectangular" }),
39
+ react_1.default.createElement(Skeleton_1.default, { sx: { height: 230 }, animation: "wave", variant: "rectangular", className: classes.cover }),
39
40
  react_1.default.createElement(material_1.Box, null,
40
41
  react_1.default.createElement(Skeleton_1.default, { animation: "wave", sx: { height: 20, maxWidth: 300, width: '100%', margin: '0 auto' } })),
41
42
  react_1.default.createElement(material_1.Box, null,
@@ -59,12 +59,12 @@ function ChangeGroupPicture(inProps) {
59
59
  name: constants_1.PREFIX
60
60
  });
61
61
  const { groupId, onChange, autoHide, className, isCreationMode = false } = props, rest = tslib_1.__rest(props, ["groupId", "onChange", "autoHide", "className", "isCreationMode"]);
62
+ //CONTEXT
63
+ const scUserContext = (0, react_1.useContext)(react_core_1.SCUserContext);
62
64
  //STATE
65
+ let fileInput = (0, react_1.useRef)(null);
63
66
  const [loading, setLoading] = (0, react_1.useState)(false);
64
67
  const [alert, setAlert] = (0, react_1.useState)(null);
65
- let fileInput = (0, react_1.useRef)(null);
66
- //CONTEXT
67
- const scUserContext = (0, react_1.useContext)(react_core_1.SCUserContext);
68
68
  // INTL
69
69
  const intl = (0, react_intl_1.useIntl)();
70
70
  // Anonymous
@@ -75,8 +75,8 @@ function ChangeGroupPicture(inProps) {
75
75
  * Handles avatar upload
76
76
  * @param event
77
77
  */
78
- function handleUpload(event) {
79
- const fileInput = event.target.files[0];
78
+ const handleUpload = (event) => {
79
+ fileInput = event.target.files[0];
80
80
  if (fileInput) {
81
81
  const reader = new FileReader();
82
82
  reader.onload = (e) => {
@@ -93,26 +93,29 @@ function ChangeGroupPicture(inProps) {
93
93
  // @ts-ignore
94
94
  img.src = e.target.result;
95
95
  };
96
+ // eslint-disable-next-line @typescript-eslint/ban-ts-ignore
97
+ // @ts-ignore
96
98
  reader.readAsDataURL(fileInput);
97
99
  }
98
- }
99
- // ui.changeGroupPicture.alert
100
+ };
100
101
  /**
101
102
  * Performs save avatar after upload
102
103
  */
103
104
  function handleSave() {
104
105
  setLoading(true);
105
106
  const formData = new FormData();
107
+ // eslint-disable-next-line @typescript-eslint/ban-ts-ignore
108
+ // @ts-ignore
106
109
  formData.append('image_original', fileInput);
107
110
  api_services_1.GroupService.changeGroupAvatarOrCover(groupId, formData, { headers: { 'Content-Type': 'multipart/form-data' } })
108
111
  .then((data) => {
112
+ onChange && onChange(data.image_big);
109
113
  setLoading(false);
110
- onChange && onChange(data.image_bigger);
111
114
  })
112
115
  .catch((error) => {
113
- setAlert(intl.formatMessage(messages.errorLoadImage));
114
- setLoading(false);
115
116
  utils_1.Logger.error(Errors_1.SCOPE_SC_UI, error);
117
+ setLoading(false);
118
+ setAlert(intl.formatMessage(messages.errorLoadImage));
116
119
  });
117
120
  }
118
121
  /**
@@ -16,7 +16,7 @@ const Root = (0, styles_1.styled)(material_1.Box, {
16
16
  slot: 'AttributesRoot'
17
17
  })(() => ({}));
18
18
  exports.default = (props) => {
19
- var _a, _b;
19
+ var _a, _b, _c;
20
20
  // PROPS
21
21
  const { className = null, value = null, onChange = null, onClick = null } = props;
22
22
  // HANDLERS
@@ -47,8 +47,8 @@ exports.default = (props) => {
47
47
  return (react_1.default.createElement(Root, { className: (0, classnames_1.default)(classes.root, className) },
48
48
  ((_a = value === null || value === void 0 ? void 0 : value.categories) === null || _a === void 0 ? void 0 : _a.length) > 0 &&
49
49
  (value === null || value === void 0 ? void 0 : value.categories.map((c) => (react_1.default.createElement(material_1.Chip, { key: c.id, label: c.name, onDelete: handleDeleteCategory(c.id), icon: react_1.default.createElement(Icon_1.default, null, "category"), onClick: handleClickCategory })))),
50
- (value === null || value === void 0 ? void 0 : value.group) && (react_1.default.createElement(material_1.Chip, { key: value === null || value === void 0 ? void 0 : value.group.id, label: value === null || value === void 0 ? void 0 : value.group.name, onDelete: handleDeleteGroup, icon: react_1.default.createElement(Icon_1.default, null, "groups"), onClick: handleClickGroup })),
51
- ((_b = value === null || value === void 0 ? void 0 : value.addressing) === null || _b === void 0 ? void 0 : _b.length) > 0 &&
50
+ (value === null || value === void 0 ? void 0 : value.group) && (react_1.default.createElement(material_1.Chip, { key: value === null || value === void 0 ? void 0 : value.group.id, label: value === null || value === void 0 ? void 0 : value.group.name, onDelete: handleDeleteGroup, icon: react_1.default.createElement(Icon_1.default, null, "groups"), onClick: handleClickGroup, disabled: !((_b = value === null || value === void 0 ? void 0 : value.group) === null || _b === void 0 ? void 0 : _b.subscription_status) })),
51
+ ((_c = value === null || value === void 0 ? void 0 : value.addressing) === null || _c === void 0 ? void 0 : _c.length) > 0 &&
52
52
  (value === null || value === void 0 ? void 0 : value.addressing.map((t) => (react_1.default.createElement(TagChip_1.default, { key: t.id, tag: t, onDelete: handleDeleteTag(t.id), icon: react_1.default.createElement(Icon_1.default, null, "label"), onClick: handleClickTag })))),
53
53
  (value === null || value === void 0 ? void 0 : value.location) && (react_1.default.createElement(material_1.Chip, { icon: react_1.default.createElement(Icon_1.default, null, "add_location_alt"), label: value === null || value === void 0 ? void 0 : value.location.location, onDelete: handleDeleteLocation, onClick: handleClickLocation }))));
54
54
  };
@@ -307,7 +307,7 @@ function Composer(inProps) {
307
307
  }
308
308
  }), [handleAddLayer, handleRemoveLayer, handleChangeCategories, categories]);
309
309
  const handleChangeAudience = (0, react_1.useCallback)((value) => {
310
- if (group || typeof value === 'object') {
310
+ if (group || (value && Object.prototype.hasOwnProperty.call(value, 'managed_by'))) {
311
311
  dispatch({ type: 'group', value });
312
312
  }
313
313
  else {
@@ -321,7 +321,7 @@ function Composer(inProps) {
321
321
  ComponentProps: {
322
322
  onClose: handleRemoveLayer,
323
323
  onSave: handleChangeAudience,
324
- defaultValue: group || typeof addressing === 'object' ? group : addressing
324
+ defaultValue: group || (addressing && Object.prototype.hasOwnProperty.call(addressing, 'managed_by')) ? group : addressing
325
325
  }
326
326
  }), [handleAddLayer, handleRemoveLayer, handleChangeAudience, addressing, group]);
327
327
  const handleChangeLocation = (0, react_1.useCallback)((value) => {
@@ -553,7 +553,7 @@ function Composer(inProps) {
553
553
  }),
554
554
  react_1.default.createElement(material_1.IconButton, { disabled: isSubmitting, onClick: handleAddCategoryLayer },
555
555
  react_1.default.createElement(Icon_1.default, null, "category")),
556
- react_1.default.createElement(material_1.IconButton, { disabled: isSubmitting || !features.includes(types_1.SCFeatureName.TAGGING), onClick: handleAddAudienceLayer }, addressing === null || addressing.length === 0 ? (react_1.default.createElement(Icon_1.default, null, "public")) : typeof addressing === 'object' ? (react_1.default.createElement(Icon_1.default, null, "groups")) : (react_1.default.createElement(Icon_1.default, null, "label"))),
556
+ react_1.default.createElement(material_1.IconButton, { disabled: isSubmitting || !features.includes(types_1.SCFeatureName.TAGGING) || Boolean(feedObject === null || feedObject === void 0 ? void 0 : feedObject.group), onClick: handleAddAudienceLayer }, (!group && addressing === null) || (addressing === null || addressing === void 0 ? void 0 : addressing.length) === 0 ? react_1.default.createElement(Icon_1.default, null, "public") : group ? react_1.default.createElement(Icon_1.default, null, "groups") : react_1.default.createElement(Icon_1.default, null, "label")),
557
557
  preferences[react_core_1.SCPreferences.ADDONS_POST_GEOLOCATION_ENABLED].value && (react_1.default.createElement(material_1.IconButton, { disabled: isSubmitting, onClick: handleAddLocationLayer, color: location !== null ? 'primary' : 'default' },
558
558
  react_1.default.createElement(Icon_1.default, null, "add_location_alt"))))),
559
559
  layer && (react_1.default.createElement(LayerTransitionRoot, { className: classes.layerTransitionRoot, in: true, container: dialogRef.current, direction: "left" },
@@ -10,7 +10,7 @@ export declare enum AudienceTypes {
10
10
  AUDIENCE_GROUP = "group"
11
11
  }
12
12
  export interface AudienceLayerProps extends Omit<BoxProps, 'defaultValue'>, ComposerLayerProps {
13
- defaultValue: SCTagType[] | SCGroupType;
13
+ defaultValue: SCTagType[] | SCGroupType | any;
14
14
  TextFieldProps?: TextFieldProps;
15
15
  }
16
16
  declare const AudienceLayer: React.ForwardRefExoticComponent<Pick<AudienceLayerProps, "p" | "slot" | "style" | "title" | "key" | "defaultChecked" | "defaultValue" | "suppressContentEditableWarning" | "suppressHydrationWarning" | "accessKey" | "className" | "contentEditable" | "contextMenu" | "dir" | "draggable" | "hidden" | "id" | "lang" | "placeholder" | "spellCheck" | "tabIndex" | "translate" | "radioGroup" | "role" | "about" | "datatype" | "inlist" | "prefix" | "property" | "resource" | "typeof" | "vocab" | "autoCapitalize" | "autoCorrect" | "autoSave" | "color" | "itemProp" | "itemScope" | "itemType" | "itemID" | "itemRef" | "results" | "security" | "unselectable" | "inputMode" | "is" | "aria-activedescendant" | "aria-atomic" | "aria-autocomplete" | "aria-busy" | "aria-checked" | "aria-colcount" | "aria-colindex" | "aria-colspan" | "aria-controls" | "aria-current" | "aria-describedby" | "aria-details" | "aria-disabled" | "aria-dropeffect" | "aria-errormessage" | "aria-expanded" | "aria-flowto" | "aria-grabbed" | "aria-haspopup" | "aria-hidden" | "aria-invalid" | "aria-keyshortcuts" | "aria-label" | "aria-labelledby" | "aria-level" | "aria-live" | "aria-modal" | "aria-multiline" | "aria-multiselectable" | "aria-orientation" | "aria-owns" | "aria-placeholder" | "aria-posinset" | "aria-pressed" | "aria-readonly" | "aria-relevant" | "aria-required" | "aria-roledescription" | "aria-rowcount" | "aria-rowindex" | "aria-rowspan" | "aria-selected" | "aria-setsize" | "aria-sort" | "aria-valuemax" | "aria-valuemin" | "aria-valuenow" | "aria-valuetext" | "children" | "dangerouslySetInnerHTML" | "onCopy" | "onCopyCapture" | "onCut" | "onCutCapture" | "onPaste" | "onPasteCapture" | "onCompositionEnd" | "onCompositionEndCapture" | "onCompositionStart" | "onCompositionStartCapture" | "onCompositionUpdate" | "onCompositionUpdateCapture" | "onFocus" | "onFocusCapture" | "onBlur" | "onBlurCapture" | "onChange" | "onChangeCapture" | "onBeforeInput" | "onBeforeInputCapture" | "onInput" | "onInputCapture" | "onReset" | "onResetCapture" | "onSubmit" | "onSubmitCapture" | "onInvalid" | "onInvalidCapture" | "onLoad" | "onLoadCapture" | "onError" | "onErrorCapture" | "onKeyDown" | "onKeyDownCapture" | "onKeyPress" | "onKeyPressCapture" | "onKeyUp" | "onKeyUpCapture" | "onAbort" | "onAbortCapture" | "onCanPlay" | "onCanPlayCapture" | "onCanPlayThrough" | "onCanPlayThroughCapture" | "onDurationChange" | "onDurationChangeCapture" | "onEmptied" | "onEmptiedCapture" | "onEncrypted" | "onEncryptedCapture" | "onEnded" | "onEndedCapture" | "onLoadedData" | "onLoadedDataCapture" | "onLoadedMetadata" | "onLoadedMetadataCapture" | "onLoadStart" | "onLoadStartCapture" | "onPause" | "onPauseCapture" | "onPlay" | "onPlayCapture" | "onPlaying" | "onPlayingCapture" | "onProgress" | "onProgressCapture" | "onRateChange" | "onRateChangeCapture" | "onSeeked" | "onSeekedCapture" | "onSeeking" | "onSeekingCapture" | "onStalled" | "onStalledCapture" | "onSuspend" | "onSuspendCapture" | "onTimeUpdate" | "onTimeUpdateCapture" | "onVolumeChange" | "onVolumeChangeCapture" | "onWaiting" | "onWaitingCapture" | "onAuxClick" | "onAuxClickCapture" | "onClick" | "onClickCapture" | "onContextMenu" | "onContextMenuCapture" | "onDoubleClick" | "onDoubleClickCapture" | "onDrag" | "onDragCapture" | "onDragEnd" | "onDragEndCapture" | "onDragEnter" | "onDragEnterCapture" | "onDragExit" | "onDragExitCapture" | "onDragLeave" | "onDragLeaveCapture" | "onDragOver" | "onDragOverCapture" | "onDragStart" | "onDragStartCapture" | "onDrop" | "onDropCapture" | "onMouseDown" | "onMouseDownCapture" | "onMouseEnter" | "onMouseLeave" | "onMouseMove" | "onMouseMoveCapture" | "onMouseOut" | "onMouseOutCapture" | "onMouseOver" | "onMouseOverCapture" | "onMouseUp" | "onMouseUpCapture" | "onSelect" | "onSelectCapture" | "onTouchCancel" | "onTouchCancelCapture" | "onTouchEnd" | "onTouchEndCapture" | "onTouchMove" | "onTouchMoveCapture" | "onTouchStart" | "onTouchStartCapture" | "onPointerDown" | "onPointerDownCapture" | "onPointerMove" | "onPointerMoveCapture" | "onPointerUp" | "onPointerUpCapture" | "onPointerCancel" | "onPointerCancelCapture" | "onPointerEnter" | "onPointerEnterCapture" | "onPointerLeave" | "onPointerLeaveCapture" | "onPointerOver" | "onPointerOverCapture" | "onPointerOut" | "onPointerOutCapture" | "onGotPointerCapture" | "onGotPointerCaptureCapture" | "onLostPointerCapture" | "onLostPointerCaptureCapture" | "onScroll" | "onScrollCapture" | "onWheel" | "onWheelCapture" | "onAnimationStart" | "onAnimationStartCapture" | "onAnimationEnd" | "onAnimationEndCapture" | "onAnimationIteration" | "onAnimationIterationCapture" | "onTransitionEnd" | "onTransitionEndCapture" | "border" | "borderTop" | "borderRight" | "borderBottom" | "borderLeft" | "borderColor" | "borderRadius" | "display" | "displayPrint" | "overflow" | "textOverflow" | "visibility" | "whiteSpace" | "flexBasis" | "flexDirection" | "flexWrap" | "justifyContent" | "alignItems" | "alignContent" | "order" | "flex" | "flexGrow" | "flexShrink" | "alignSelf" | "justifyItems" | "justifySelf" | "gap" | "columnGap" | "rowGap" | "gridColumn" | "gridRow" | "gridAutoFlow" | "gridAutoColumns" | "gridAutoRows" | "gridTemplateColumns" | "gridTemplateRows" | "gridTemplateAreas" | "gridArea" | "bgcolor" | "zIndex" | "position" | "top" | "right" | "bottom" | "left" | "boxShadow" | "width" | "maxWidth" | "minWidth" | "height" | "maxHeight" | "minHeight" | "boxSizing" | "m" | "mt" | "mr" | "mb" | "ml" | "mx" | "my" | "pt" | "pr" | "pb" | "pl" | "px" | "py" | "margin" | "marginTop" | "marginRight" | "marginBottom" | "marginLeft" | "marginX" | "marginY" | "marginInline" | "marginInlineStart" | "marginInlineEnd" | "marginBlock" | "marginBlockStart" | "marginBlockEnd" | "padding" | "paddingTop" | "paddingRight" | "paddingBottom" | "paddingLeft" | "paddingX" | "paddingY" | "paddingInline" | "paddingInlineStart" | "paddingInlineEnd" | "paddingBlock" | "paddingBlockStart" | "paddingBlockEnd" | "typography" | "fontFamily" | "fontSize" | "fontStyle" | "fontWeight" | "letterSpacing" | "lineHeight" | "textAlign" | "textTransform" | "component" | "sx" | "classes" | "onClose" | "TextFieldProps" | "onSave"> & React.RefAttributes<unknown>>;
@@ -46,7 +46,7 @@ const AudienceLayer = react_1.default.forwardRef((props, ref) => {
46
46
  // @ts-ignore
47
47
  defaultValue === null || defaultValue.length === 0
48
48
  ? AudienceTypes.AUDIENCE_ALL
49
- : typeof defaultValue === 'object'
49
+ : defaultValue && Object.prototype.hasOwnProperty.call(defaultValue, 'managed_by')
50
50
  ? AudienceTypes.AUDIENCE_GROUP
51
51
  : AudienceTypes.AUDIENCE_TAG);
52
52
  // eslint-disable-next-line @typescript-eslint/ban-ts-comment
@@ -55,15 +55,15 @@ const AudienceLayer = react_1.default.forwardRef((props, ref) => {
55
55
  // HOOKS
56
56
  const { scAddressingTags } = (0, react_core_1.useSCFetchAddressingTagList)({ fetch: autocompleteOpen });
57
57
  // HANDLERS
58
- const handleSave = (0, react_1.useCallback)(
59
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
60
- // @ts-ignore
61
- () => (typeof defaultValue === 'object' ? onSave(value) : onSave((value === null || value === void 0 ? void 0 : value.length) && (value === null || value === void 0 ? void 0 : value.length) > 0 ? value : null)), [value, onSave]);
58
+ const handleSave = (0, react_1.useCallback)(() => {
59
+ audience === AudienceTypes.AUDIENCE_GROUP ? onSave(value) : onSave((value === null || value === void 0 ? void 0 : value.length) && (value === null || value === void 0 ? void 0 : value.length) > 0 ? value : null);
60
+ }, [value, onSave, audience]);
62
61
  const handleChange = (0, react_1.useCallback)((event, tags) => setValue(tags), []);
63
62
  const handleGroupChange = (0, react_1.useCallback)((group) => setValue(group), []);
64
63
  const handleChangeAudience = (0, react_1.useCallback)((event, data) => setAudience(data), []);
65
64
  const handleAutocompleteOpen = (0, react_1.useCallback)(() => setAutocompleteOpen(true), []);
66
65
  const handleAutocompleteClose = (0, react_1.useCallback)(() => setAutocompleteOpen(false), []);
66
+ console.log(defaultValue);
67
67
  return (react_1.default.createElement(Root, Object.assign({ ref: ref, className: (0, classnames_1.default)(className, classes.root) }, rest),
68
68
  react_1.default.createElement(material_1.DialogTitle, { className: classes.title },
69
69
  react_1.default.createElement(material_1.IconButton, { onClick: onClose },
@@ -75,20 +75,10 @@ const AudienceLayer = react_1.default.forwardRef((props, ref) => {
75
75
  react_1.default.createElement(DialogContent_1.default, { className: classes.content },
76
76
  react_1.default.createElement(material_1.Tabs, { value: audience, onChange: handleChangeAudience, "aria-label": "audience type" },
77
77
  react_1.default.createElement(material_1.Tab, { value: AudienceTypes.AUDIENCE_ALL, icon: react_1.default.createElement(Icon_1.default, null, "public"), label: react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.composer.layer.audience.all", defaultMessage: "ui.composer.layer.audience.all" }) }),
78
- react_1.default.createElement(material_1.Tab
79
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
80
- // @ts-ignore
81
- , {
82
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
83
- // @ts-ignore
84
- disabled: defaultValue && defaultValue.length !== 0, value: AudienceTypes.AUDIENCE_GROUP, icon: react_1.default.createElement(Icon_1.default, null, "groups"), label: react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.composer.layer.audience.group", defaultMessage: "ui.composer.layer.audience.group" }) }),
85
- react_1.default.createElement(material_1.Tab
86
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
87
- // @ts-ignore
88
- , {
89
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
90
- // @ts-ignore
91
- disabled: typeof defaultValue === 'object', value: AudienceTypes.AUDIENCE_TAG, icon: react_1.default.createElement(Icon_1.default, null, "label"), label: react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.composer.layer.audience.tag", defaultMessage: "ui.composer.layer.audience.tag" }) })),
78
+ react_1.default.createElement(material_1.Tab, { disabled: (Boolean(value === null || value === void 0 ? void 0 : value.length) && !Object.prototype.hasOwnProperty.call(value, 'managed_by')) ||
79
+ (value !== undefined && Boolean(!(value === null || value === void 0 ? void 0 : value.length)) && audience !== AudienceTypes.AUDIENCE_ALL) ||
80
+ (Boolean((value === null || value === void 0 ? void 0 : value.length) === 0) && audience === AudienceTypes.AUDIENCE_ALL && Boolean((defaultValue === null || defaultValue === void 0 ? void 0 : defaultValue.length) !== 0)), value: AudienceTypes.AUDIENCE_GROUP, icon: react_1.default.createElement(Icon_1.default, null, "groups"), label: react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.composer.layer.audience.group", defaultMessage: "ui.composer.layer.audience.group" }) }),
81
+ react_1.default.createElement(material_1.Tab, { disabled: value && Object.prototype.hasOwnProperty.call(value, 'managed_by'), value: AudienceTypes.AUDIENCE_TAG, icon: react_1.default.createElement(Icon_1.default, null, "label"), label: react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.composer.layer.audience.tag", defaultMessage: "ui.composer.layer.audience.tag" }) })),
92
82
  react_1.default.createElement(material_1.Typography, { className: classes.message },
93
83
  audience === AudienceTypes.AUDIENCE_ALL && (react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.composer.layer.audience.all.message", defaultMessage: "ui.composer.audience.layer.all.message" })),
94
84
  audience === AudienceTypes.AUDIENCE_GROUP && (react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.composer.layer.audience.group.message", defaultMessage: "ui.composer.audience.layer.group.message" })),
@@ -60,6 +60,6 @@ function ContributorsFeedObject(props) {
60
60
  openContributorsDialog && (react_1.default.createElement(BaseDialog_1.default, { title: react_1.default.createElement(react_intl_1.FormattedMessage, { defaultMessage: "ui.feedObject.contributors.title", id: "ui.feedObject.contributors.title", values: { total: contributorsObject.total } }), onClose: () => setOpenContributorsDialog(false), open: openContributorsDialog }, contributorsObject.isLoadingNext ? (react_1.default.createElement(CentralProgress_1.default, { size: 50 })) : (react_1.default.createElement(InfiniteScroll_1.default, { dataLength: contributorsObject.contributors.length, next: contributorsObject.getNextPage(), hasMoreNext: Boolean(contributorsObject.next), loaderNext: react_1.default.createElement(CentralProgress_1.default, { size: 30 }), height: 400, endMessage: react_1.default.createElement(material_1.Typography, { variant: "body2", align: "center", fontWeight: "bold" },
61
61
  react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.feedObject.contributors.noOtherContributors", defaultMessage: "ui.feedObject.contributors.noOtherContributors" })) },
62
62
  react_1.default.createElement(material_1.List, null, contributorsObject.contributors.map((c, i) => (react_1.default.createElement(material_1.ListItem, { key: i },
63
- react_1.default.createElement(User_1.default, { elevation: 0, user: c, key: c.id, sx: { m: 0 } }))))))))))) : null)))));
63
+ react_1.default.createElement(User_1.default, { elevation: 0, user: c, key: c.id, sx: { m: 0 }, onClick: () => setOpenContributorsDialog(false) }))))))))))) : null)))));
64
64
  }
65
65
  exports.default = ContributorsFeedObject;
@@ -188,6 +188,7 @@ export interface FeedObjectProps extends CardProps, VirtualScrollerItemProps {
188
188
  |deleted|.SCFeedObject-deleted|Styles applied to the feed obj when is deleted (visible only for admin and moderator).|
189
189
  |header|.SCFeedObject-header|Styles applied to the header of the card.|
190
190
  |category|.SCFeedObject-category|Styles applied to the category element.|
191
+ |group|.SCFeedObject-group|Styles applied to the group element.|
191
192
  |avatar|.SCFeedObject-avatar|Styles applied to the avatar element.|
192
193
  |username|.SCFeedObject-username|Styles applied to the username element.|
193
194
  |activityAt|.SCFeedObject-activity-at|Styles applied to the activity at section.|
@@ -42,6 +42,10 @@ const messages = (0, react_intl_1.defineMessages)({
42
42
  visibleToAll: {
43
43
  id: 'ui.feedObject.visibleToAll',
44
44
  defaultMessage: 'ui.feedObject.visibleToAll'
45
+ },
46
+ visibleToGroup: {
47
+ id: 'ui.feedObject.visibleToGroup',
48
+ defaultMessage: 'ui.feedObject.visibleToGroup'
45
49
  }
46
50
  });
47
51
  const classes = {
@@ -49,6 +53,7 @@ const classes = {
49
53
  deleted: `${constants_1.PREFIX}-deleted`,
50
54
  header: `${constants_1.PREFIX}-header`,
51
55
  category: `${constants_1.PREFIX}-category`,
56
+ group: `${constants_1.PREFIX}-group`,
52
57
  avatar: `${constants_1.PREFIX}-avatar`,
53
58
  username: `${constants_1.PREFIX}-username`,
54
59
  activityAt: `${constants_1.PREFIX}-activity-at`,
@@ -102,6 +107,7 @@ const Root = (0, styles_1.styled)(Widget_1.default, {
102
107
  |deleted|.SCFeedObject-deleted|Styles applied to the feed obj when is deleted (visible only for admin and moderator).|
103
108
  |header|.SCFeedObject-header|Styles applied to the header of the card.|
104
109
  |category|.SCFeedObject-category|Styles applied to the category element.|
110
+ |group|.SCFeedObject-group|Styles applied to the group element.|
105
111
  |avatar|.SCFeedObject-avatar|Styles applied to the avatar element.|
106
112
  |username|.SCFeedObject-username|Styles applied to the username element.|
107
113
  |activityAt|.SCFeedObject-activity-at|Styles applied to the activity at section.|
@@ -169,7 +175,7 @@ function FeedObject(inProps) {
169
175
  }, [onStateChange, onHeightChange]);
170
176
  /**
171
177
  * Update state object
172
- * @param obj
178
+ * @param newObj
173
179
  */
174
180
  const updateObject = (newObj) => {
175
181
  setObj(newObj);
@@ -198,8 +204,10 @@ function FeedObject(inProps) {
198
204
  /**
199
205
  * Handle change/update poll: votes
200
206
  */
201
- const handleChangePoll = (0, react_1.useCallback)((pollObject) => {
202
- updateObject(Object.assign({}, obj, { poll: pollObject }));
207
+ const handleChangePoll = (0, react_1.useCallback)((pollChoices) => {
208
+ if ('poll' in obj) {
209
+ updateObject(Object.assign({}, obj, { poll: Object.assign(Object.assign({}, obj.poll), { choices: pollChoices }) }));
210
+ }
203
211
  }, [obj]);
204
212
  /**
205
213
  * Handle change poll visibility
@@ -426,8 +434,13 @@ function FeedObject(inProps) {
426
434
  template === feedObject_1.SCFeedObjectTemplateType.DETAIL ||
427
435
  template === feedObject_1.SCFeedObjectTemplateType.SEARCH) {
428
436
  objElement = (react_1.default.createElement(react_1.default.Fragment, null, obj ? (react_1.default.createElement(material_1.Box, { className: (0, classnames_1.default)({ [classes.deleted]: obj && obj.deleted }) },
429
- obj.categories.length > 0 && (react_1.default.createElement("div", { className: classes.category }, obj.categories.map((c) => (react_1.default.createElement(react_core_1.Link, { to: scRoutingContext.url(react_core_1.SCRoutes.CATEGORY_ROUTE_NAME, c), key: c.id },
430
- react_1.default.createElement(material_1.Typography, { variant: "overline" }, c.name)))))),
437
+ obj.categories.length > 0 && (react_1.default.createElement("div", { className: classes.category },
438
+ react_1.default.createElement(react_1.default.Fragment, null, obj.group && (react_1.default.createElement("div", { className: classes.group },
439
+ react_1.default.createElement(material_1.Chip, { color: "secondary", size: "small", key: obj.group.id, icon: react_1.default.createElement(Icon_1.default, null, "groups"), component: react_core_1.Link, to: scRoutingContext.url(react_core_1.SCRoutes.GROUP_ROUTE_NAME, obj.group), clickable: true })))),
440
+ obj.categories.map((c) => (react_1.default.createElement(react_core_1.Link, { to: scRoutingContext.url(react_core_1.SCRoutes.CATEGORY_ROUTE_NAME, c), key: c.id },
441
+ react_1.default.createElement(material_1.Typography, { variant: "overline" }, c.name)))))),
442
+ obj.group && !obj.categories.length && (react_1.default.createElement("div", { className: classes.group },
443
+ react_1.default.createElement(material_1.Chip, { color: "secondary", size: "small", key: obj.group.id, icon: react_1.default.createElement(Icon_1.default, null, "groups"), label: obj.group.name, component: react_core_1.Link, to: scRoutingContext.url(react_core_1.SCRoutes.GROUP_ROUTE_NAME, obj.group), clickable: true }))),
431
444
  react_1.default.createElement(material_1.CardHeader, { className: classes.header, avatar: react_1.default.createElement(react_core_1.Link, Object.assign({}, (!obj.author.deleted && { to: scRoutingContext.url(react_core_1.SCRoutes.USER_PROFILE_ROUTE_NAME, obj.author) }), { onClick: obj.author.deleted ? () => setOpenAlert(true) : null }),
432
445
  react_1.default.createElement(UserAvatar_1.default, { hide: !obj.author.community_badge },
433
446
  react_1.default.createElement(material_1.Avatar, { "aria-label": "recipe", src: obj.author.avatar, className: classes.avatar }, obj.author.username))), title: react_1.default.createElement(react_core_1.Link, Object.assign({}, (!obj.author.deleted && { to: scRoutingContext.url(react_core_1.SCRoutes.USER_PROFILE_ROUTE_NAME, obj.author) }), { onClick: obj.author.deleted ? () => setOpenAlert(true) : null, className: classes.username }), obj.author.username), subheader: react_1.default.createElement(react_1.default.Fragment, null,
@@ -439,7 +452,8 @@ function FeedObject(inProps) {
439
452
  react_1.default.createElement(Icon_1.default, null, "add_location_alt"), (_a = obj.location) === null || _a === void 0 ? void 0 :
440
453
  _a.location))),
441
454
  react_1.default.createElement(Bullet_1.default, null),
442
- react_1.default.createElement(material_1.Box, { className: classes.tag }, obj.addressing.length > 0 ? (react_1.default.createElement(Tags_1.default, { tags: obj.addressing, TagChipProps: { disposable: false, clickable: false } })) : (react_1.default.createElement(material_1.Tooltip, { title: `${intl.formatMessage(messages.visibleToAll)}` },
455
+ react_1.default.createElement(material_1.Box, { className: classes.tag }, obj.addressing.length > 0 ? (react_1.default.createElement(Tags_1.default, { tags: obj.addressing, TagChipProps: { disposable: false, clickable: false } })) : obj.group ? (react_1.default.createElement(material_1.Tooltip, { title: `${intl.formatMessage(messages.visibleToGroup, { group: obj.group.name })}` },
456
+ react_1.default.createElement(Icon_1.default, { color: "disabled", fontSize: "small" }, "groups"))) : (react_1.default.createElement(material_1.Tooltip, { title: `${intl.formatMessage(messages.visibleToAll)}` },
443
457
  react_1.default.createElement(Icon_1.default, { color: "disabled", fontSize: "small" }, "public"))))), action: renderHeaderAction() }),
444
458
  react_1.default.createElement(CardContent_1.default, { classes: { root: classes.content } },
445
459
  react_1.default.createElement(material_1.Box, { className: classes.titleSection }, 'title' in obj && (react_1.default.createElement(react_1.default.Fragment, null, template === feedObject_1.SCFeedObjectTemplateType.DETAIL ? (react_1.default.createElement(material_1.Typography, { variant: "body1", gutterBottom: true, className: classes.title }, obj.title)) : (react_1.default.createElement(react_core_1.Link, { to: scRoutingContext.url((0, contribution_1.getContributionRouteName)(obj), (0, contribution_1.getRouteData)(obj)) },
@@ -468,8 +482,13 @@ function FeedObject(inProps) {
468
482
  }
469
483
  else if (template === feedObject_1.SCFeedObjectTemplateType.SHARE) {
470
484
  objElement = (react_1.default.createElement(react_1.default.Fragment, null, obj ? (react_1.default.createElement(react_1.default.Fragment, null,
471
- obj.categories.length > 0 && (react_1.default.createElement("div", { className: classes.category }, obj.categories.map((c) => (react_1.default.createElement(react_core_1.Link, { to: scRoutingContext.url(react_core_1.SCRoutes.CATEGORY_ROUTE_NAME, c), key: c.id },
472
- react_1.default.createElement(material_1.Typography, { variant: "overline" }, c.name)))))),
485
+ obj.categories.length > 0 && (react_1.default.createElement("div", { className: classes.category },
486
+ react_1.default.createElement(react_1.default.Fragment, null, obj.group && (react_1.default.createElement("div", { className: classes.group },
487
+ react_1.default.createElement(material_1.Chip, { color: "secondary", size: "small", key: obj.group.id, icon: react_1.default.createElement(Icon_1.default, null, "groups"), component: react_core_1.Link, to: scRoutingContext.url(react_core_1.SCRoutes.GROUP_ROUTE_NAME, obj.group), clickable: true })))),
488
+ obj.categories.map((c) => (react_1.default.createElement(react_core_1.Link, { to: scRoutingContext.url(react_core_1.SCRoutes.CATEGORY_ROUTE_NAME, c), key: c.id },
489
+ react_1.default.createElement(material_1.Typography, { variant: "overline" }, c.name)))))),
490
+ obj.group && !obj.categories.length && (react_1.default.createElement("div", { className: classes.group },
491
+ react_1.default.createElement(material_1.Chip, { color: "secondary", size: "small", key: obj.group.id, icon: react_1.default.createElement(Icon_1.default, null, "groups"), label: obj.group.name, component: react_core_1.Link, to: scRoutingContext.url(react_core_1.SCRoutes.GROUP_ROUTE_NAME, obj.group), clickable: true }))),
473
492
  react_1.default.createElement(material_1.CardHeader, { classes: { root: classes.header }, avatar: react_1.default.createElement(react_core_1.Link, Object.assign({}, (!obj.author.deleted && { to: scRoutingContext.url(react_core_1.SCRoutes.USER_PROFILE_ROUTE_NAME, obj.author) }), { onClick: obj.author.deleted ? () => setOpenAlert(true) : null, className: classes.username }),
474
493
  react_1.default.createElement(UserAvatar_1.default, { hide: !obj.author.community_badge },
475
494
  react_1.default.createElement(material_1.Avatar, { "aria-label": "recipe", src: obj.author.avatar, className: classes.avatar }, obj.author.username))), title: react_1.default.createElement(react_core_1.Link, Object.assign({}, (!obj.author.deleted && { to: scRoutingContext.url(react_core_1.SCRoutes.USER_PROFILE_ROUTE_NAME, obj.author) }), { onClick: obj.author.deleted ? () => setOpenAlert(true) : null, className: classes.username }), obj.author.username), subheader: react_1.default.createElement(react_core_1.Link, { to: scRoutingContext.url((0, contribution_1.getContributionRouteName)(obj), (0, contribution_1.getRouteData)(obj)), className: classes.activityAt },
@@ -69,36 +69,36 @@ function PollObject(props) {
69
69
  * Handles choice upvote
70
70
  */
71
71
  const handleVote = (id) => {
72
+ const prevChoices = [...choices];
73
+ let updatedChoices;
72
74
  if (multipleChoices) {
73
- setChoices((prevChoices) => {
74
- return prevChoices.map((choice) => Object.assign({}, choice, {
75
- voted: choice.id === id ? true : choice.voted,
76
- vote_count: choice.id === id ? choice.vote_count + 1 : choice.vote_count
77
- }));
78
- });
75
+ updatedChoices = prevChoices.map((choice) => Object.assign({}, choice, {
76
+ voted: choice.id === id ? true : choice.voted,
77
+ vote_count: choice.id === id ? choice.vote_count + 1 : choice.vote_count
78
+ }));
79
79
  setVotes((prevVotes) => prevVotes + 1);
80
80
  }
81
81
  else {
82
- setChoices((prevChoices) => {
83
- const updatedChoices = prevChoices.map((choice) => {
84
- return Object.assign(Object.assign({}, choice), { voted: choice.id === id, vote_count: choice.id === id ? choice.vote_count + 1 : choice.vote_count > 0 && choice.voted ? choice.vote_count - 1 : choice.vote_count });
85
- });
86
- const newVotes = updatedChoices.reduce((totalVotes, choice) => totalVotes + choice.vote_count, 0);
87
- setVotes(newVotes);
88
- return updatedChoices;
89
- });
82
+ updatedChoices = prevChoices.map((choice) => Object.assign({}, choice, {
83
+ voted: choice.id === id,
84
+ vote_count: choice.id === id ? choice.vote_count + 1 : choice.vote_count > 0 && choice.voted ? choice.vote_count - 1 : choice.vote_count
85
+ }));
86
+ setVotes(updatedChoices.reduce((totalVotes, choice) => totalVotes + choice.vote_count, 0));
90
87
  }
88
+ setChoices(updatedChoices);
89
+ onChange(updatedChoices);
91
90
  };
92
91
  /**
93
92
  * Handles choice unvote
94
93
  */
95
94
  const handleUnVote = (id) => {
96
- setChoices((prevChoices) => {
97
- return prevChoices.map((choice) => Object.assign({}, choice, {
98
- voted: choice.id === id ? false : choice.voted,
99
- vote_count: choice.id === id && choice.vote_count > 0 ? choice.vote_count - 1 : choice.vote_count
100
- }));
101
- });
95
+ const prevChoices = [...choices];
96
+ const updatedChoices = prevChoices.map((choice) => Object.assign({}, choice, {
97
+ voted: choice.id === id ? false : choice.voted,
98
+ vote_count: choice.id === id && choice.vote_count > 0 ? choice.vote_count - 1 : choice.vote_count
99
+ }));
100
+ setChoices(updatedChoices);
101
+ onChange(updatedChoices);
102
102
  setVotes((prevVotes) => prevVotes - 1);
103
103
  };
104
104
  /**
@@ -57,7 +57,7 @@ function FeedUpdatesWidget(inProps) {
57
57
  const [updates, setUpdates] = (0, react_1.useState)(false);
58
58
  // REFS
59
59
  const updatesSubscription = (0, react_1.useRef)(null);
60
- // Subscripber for pubsub callback
60
+ // Subscriber for pubsub callback
61
61
  const subscriber = (msg, data) => {
62
62
  if (subscriptionChannelUpdatesCallback(msg, data)) {
63
63
  setUpdates(true);
@@ -27,6 +27,11 @@ export interface GroupProps extends WidgetProps {
27
27
  * @default false
28
28
  */
29
29
  hideActions?: boolean;
30
+ /**
31
+ * Prop to redirect the user to the group page
32
+ * @default false
33
+ */
34
+ actionRedirect?: boolean;
30
35
  /**
31
36
  * Props to spread to the button
32
37
  * @default {}
@@ -61,6 +66,9 @@ export interface GroupProps extends WidgetProps {
61
66
  |---|---|---|
62
67
  |root|.SCGroup-root|Styles applied to the root element.|
63
68
  |avatar|.SCGroup-avatar|Styles applied to the avatar element.|
69
+ |actions|.SCGroup-actions|Styles applied to the actions section.|
70
+ |icon|.SCGroup-icon|Styles applied to the group privacy icon element.|
71
+
64
72
 
65
73
  *
66
74
  * @param inProps
@@ -4,6 +4,7 @@ const tslib_1 = require("tslib");
4
4
  const react_1 = tslib_1.__importStar(require("react"));
5
5
  const styles_1 = require("@mui/material/styles");
6
6
  const material_1 = require("@mui/material");
7
+ const types_1 = require("@selfcommunity/types");
7
8
  const react_core_1 = require("@selfcommunity/react-core");
8
9
  const react_intl_1 = require("react-intl");
9
10
  const classnames_1 = tslib_1.__importDefault(require("classnames"));
@@ -22,7 +23,8 @@ const messages = (0, react_intl_1.defineMessages)({
22
23
  const classes = {
23
24
  root: `${constants_1.PREFIX}-root`,
24
25
  avatar: `${constants_1.PREFIX}-avatar`,
25
- actions: `${constants_1.PREFIX}-actions`
26
+ actions: `${constants_1.PREFIX}-actions`,
27
+ icon: `${constants_1.PREFIX}-icon`
26
28
  };
27
29
  const Root = (0, styles_1.styled)(BaseItemButton_1.default, {
28
30
  name: constants_1.PREFIX,
@@ -53,21 +55,28 @@ const Root = (0, styles_1.styled)(BaseItemButton_1.default, {
53
55
  |---|---|---|
54
56
  |root|.SCGroup-root|Styles applied to the root element.|
55
57
  |avatar|.SCGroup-avatar|Styles applied to the avatar element.|
58
+ |actions|.SCGroup-actions|Styles applied to the actions section.|
59
+ |icon|.SCGroup-icon|Styles applied to the group privacy icon element.|
60
+
56
61
 
57
62
  *
58
63
  * @param inProps
59
64
  */
60
65
  function Group(inProps) {
66
+ var _a;
61
67
  // PROPS
62
68
  const props = (0, system_1.useThemeProps)({
63
69
  props: inProps,
64
70
  name: constants_1.PREFIX
65
71
  });
66
- const { groupId = null, group = null, className = null, elevation, hideActions = false, groupSubscribeButtonProps = {}, visible = true } = props, rest = tslib_1.__rest(props, ["groupId", "group", "className", "elevation", "hideActions", "groupSubscribeButtonProps", "visible"]);
72
+ const { groupId = null, group = null, className = null, elevation, hideActions = false, actionRedirect = false, groupSubscribeButtonProps = {} } = props, rest = tslib_1.__rest(props, ["groupId", "group", "className", "elevation", "hideActions", "actionRedirect", "groupSubscribeButtonProps"]);
67
73
  // STATE
68
74
  const { scGroup } = (0, react_core_1.useSCFetchGroup)({ id: groupId, group });
69
75
  // CONTEXT
70
76
  const scRoutingContext = (0, react_core_1.useSCRouting)();
77
+ const scUserContext = (0, react_core_1.useSCUser)();
78
+ // CONST
79
+ const isGroupAdmin = (0, react_1.useMemo)(() => { var _a; return scUserContext.user && ((_a = scGroup === null || scGroup === void 0 ? void 0 : scGroup.managed_by) === null || _a === void 0 ? void 0 : _a.id) === scUserContext.user.id; }, [scUserContext.user, (_a = scGroup === null || scGroup === void 0 ? void 0 : scGroup.managed_by) === null || _a === void 0 ? void 0 : _a.id]);
71
80
  const [openAlert, setOpenAlert] = (0, react_1.useState)(false);
72
81
  // INTL
73
82
  const intl = (0, react_intl_1.useIntl)();
@@ -77,8 +86,8 @@ function Group(inProps) {
77
86
  */
78
87
  function renderAuthenticatedActions() {
79
88
  return (react_1.default.createElement(material_1.Stack, { className: classes.actions, direction: "row", alignItems: "center", justifyContent: "center", spacing: 2 },
80
- react_1.default.createElement(material_1.Icon, null, !visible ? 'private' : 'public'),
81
- react_1.default.createElement(GroupSubscribeButton_1.default, Object.assign({ group: group, groupId: groupId }, groupSubscribeButtonProps))));
89
+ isGroupAdmin && react_1.default.createElement(material_1.Icon, null, "face"),
90
+ actionRedirect ? (react_1.default.createElement(material_1.Button, { size: "small", variant: "outlined", component: react_core_1.Link, to: scRoutingContext.url(react_core_1.SCRoutes.GROUP_ROUTE_NAME, scGroup) }, scGroup.subscription_status === types_1.SCGroupSubscriptionStatusType.SUBSCRIBED ? (react_1.default.createElement(react_intl_1.FormattedMessage, { defaultMessage: "ui.group.status.enter", id: "ui.group.status.enter" })) : (react_1.default.createElement(react_intl_1.FormattedMessage, { defaultMessage: "ui.group.status.discover", id: "ui.group.status.discover" })))) : (react_1.default.createElement(GroupSubscribeButton_1.default, Object.assign({ group: group, groupId: groupId }, groupSubscribeButtonProps)))));
82
91
  }
83
92
  /**
84
93
  * Renders group object
@@ -90,7 +99,10 @@ function Group(inProps) {
90
99
  * Renders root object
91
100
  */
92
101
  return (react_1.default.createElement(react_1.default.Fragment, null,
93
- react_1.default.createElement(Root, Object.assign({ elevation: elevation }, rest, { className: (0, classnames_1.default)(classes.root, className), ButtonBaseProps: { component: react_core_1.Link, to: scRoutingContext.url(react_core_1.SCRoutes.GROUP_ROUTE_NAME, scGroup) }, image: react_1.default.createElement(material_1.Avatar, { alt: scGroup.name, src: scGroup.image_medium, className: classes.avatar }), primary: scGroup.name, secondary: `${intl.formatMessage(messages.groupMembers, { total: scGroup.subscribers_counter })}`, actions: hideActions ? null : renderAuthenticatedActions() })),
102
+ react_1.default.createElement(Root, Object.assign({ elevation: elevation }, rest, { className: (0, classnames_1.default)(classes.root, className), ButtonBaseProps: { component: react_core_1.Link, to: scRoutingContext.url(react_core_1.SCRoutes.GROUP_ROUTE_NAME, scGroup) }, image: react_1.default.createElement(material_1.Avatar, { alt: scGroup.name, src: scGroup.image_medium, className: classes.avatar }), primary: react_1.default.createElement(react_1.default.Fragment, null,
103
+ scGroup.name,
104
+ " ",
105
+ react_1.default.createElement(material_1.Icon, { className: classes.icon }, (group === null || group === void 0 ? void 0 : group.privacy) === types_1.SCGroupPrivacyType.PRIVATE ? 'private' : 'public')), secondary: `${intl.formatMessage(messages.groupMembers, { total: scGroup.subscribers_counter })}`, actions: hideActions ? null : renderAuthenticatedActions() })),
94
106
  openAlert && react_1.default.createElement(UserDeletedSnackBar_1.default, { open: openAlert, handleClose: () => setOpenAlert(false) })));
95
107
  }
96
108
  exports.default = Group;
@@ -80,7 +80,7 @@ const GroupAutocomplete = (inProps) => {
80
80
  setValue(value);
81
81
  };
82
82
  // Render
83
- return (react_1.default.createElement(Root, Object.assign({ freeSolo: true, className: classes.root, open: open, onOpen: handleOpen, onClose: handleClose, options: groups || [], getOptionLabel: (option) => option.name || '', value: value, selectOnFocus: true, clearOnBlur: true, blurOnSelect: true, handleHomeEndKeys: true, clearIcon: null, disabled: disabled || isLoading, noOptionsText: react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupAutocomplete.empty", defaultMessage: "ui.groupAutocomplete.empty" }), onChange: handleChange, isOptionEqualToValue: (option, value) => value.id === option.id,
83
+ return (react_1.default.createElement(Root, Object.assign({ className: classes.root, open: open, onOpen: handleOpen, onClose: handleClose, options: groups || [], getOptionLabel: (option) => option.name || '', value: value, selectOnFocus: true, clearOnBlur: true, blurOnSelect: true, handleHomeEndKeys: true, clearIcon: null, disabled: disabled || isLoading, noOptionsText: react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupAutocomplete.empty", defaultMessage: "ui.groupAutocomplete.empty" }), onChange: handleChange, isOptionEqualToValue: (option, value) => value.id === option.id,
84
84
  // renderTags={(value, getTagProps) => {
85
85
  // return value.map((option: any, index) => (
86
86
  // <Chip key={option.id} id={option.id} label={option.name} color={option.color} {...getTagProps({index})} />