From 3f3b0aafb53e4b6385048845945238a3214d3c0b Mon Sep 17 00:00:00 2001 From: Brian Smith Date: Fri, 13 Dec 2024 10:07:56 -0500 Subject: [PATCH 1/2] feat: add learning username slot --- .../AuthenticatedUserDropdown.jsx | 8 +- .../LearningUsernameSlot/README.md | 116 ++++++++++++++++++ .../learning_username_custom_component.png | Bin 0 -> 4339 bytes ...sername_custom_components_before_after.png | Bin 0 -> 8864 bytes .../images/learning_username_modified.png | Bin 0 -> 5620 bytes .../LearningUsernameSlot/index.jsx | 33 +++++ src/plugin-slots/README.md | 1 + 7 files changed, 152 insertions(+), 6 deletions(-) create mode 100644 src/plugin-slots/LearningUsernameSlot/README.md create mode 100644 src/plugin-slots/LearningUsernameSlot/images/learning_username_custom_component.png create mode 100644 src/plugin-slots/LearningUsernameSlot/images/learning_username_custom_components_before_after.png create mode 100644 src/plugin-slots/LearningUsernameSlot/images/learning_username_modified.png create mode 100644 src/plugin-slots/LearningUsernameSlot/index.jsx diff --git a/src/learning-header/AuthenticatedUserDropdown.jsx b/src/learning-header/AuthenticatedUserDropdown.jsx index 4a912281e..523522e58 100644 --- a/src/learning-header/AuthenticatedUserDropdown.jsx +++ b/src/learning-header/AuthenticatedUserDropdown.jsx @@ -1,13 +1,12 @@ import React from 'react'; import PropTypes from 'prop-types'; -import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; -import { faUserCircle } from '@fortawesome/free-solid-svg-icons'; import { getConfig } from '@edx/frontend-platform'; import { injectIntl, intlShape } from '@edx/frontend-platform/i18n'; import { Dropdown } from '@openedx/paragon'; import LearningUserMenuSlot from '../plugin-slots/LearningUserMenuSlot'; +import LearningUsernameSlot from '../plugin-slots/LearningUsernameSlot'; import messages from './messages'; @@ -38,10 +37,7 @@ const AuthenticatedUserDropdown = ({ intl, username }) => { return ( - - - {username} - + diff --git a/src/plugin-slots/LearningUsernameSlot/README.md b/src/plugin-slots/LearningUsernameSlot/README.md new file mode 100644 index 000000000..3c760be94 --- /dev/null +++ b/src/plugin-slots/LearningUsernameSlot/README.md @@ -0,0 +1,116 @@ +# Learning Username Slot + +### Slot ID: `learning_username_slot` + +## Description + +This slot is used to replace/modify/hide the learning username. + +## Examples + +### Modify Username + +The following `env.config.jsx` will modify the username (in this case replacing it with 🤠) + +![Screenshot of modified username](./images/learning_username_modified.png) + +```jsx +import { PLUGIN_OPERATIONS } from '@openedx/frontend-plugin-framework'; + +const modifyUsername = ( widget ) => { + widget.content.username = "🤠"; + return widget; +}; + +const config = { + pluginSlots: { + learning_username_slot: { + keepDefault: true, + plugins: [ + { + op: PLUGIN_OPERATIONS.Modify, + widgetId: 'default_contents', + fn: modifyUsername, + }, + ] + }, + }, +} + +export default config; +``` + + +### Replace Username with Custom Component + +The following `env.config.jsx` will replace the items in the learning username entirely (in this case with an svg circle) + +![Screenshot of replaced with custom component](./images/learning_username_custom_component.png) + +```jsx +import { DIRECT_PLUGIN, PLUGIN_OPERATIONS } from '@openedx/frontend-plugin-framework'; + +const config = { + pluginSlots: { + learning_username_slot: { + keepDefault: false, + plugins: [ + { + op: PLUGIN_OPERATIONS.Insert, + widget: { + id: 'custom_username_component', + type: DIRECT_PLUGIN, + RenderWidget: () => ( + + + + ), + }, + }, + ] + }, + }, +} + +export default config; +``` + +### Add Custom Components before and after Username + +The following `env.config.jsx` will place custom components before and after the learning username (in this case 🖋️ and 🪄). + +![Screenshot of custom components before and after](./images/learning_username_custom_components_before_after.png) + +```jsx +import { DIRECT_PLUGIN, PLUGIN_OPERATIONS } from '@openedx/frontend-plugin-framework'; + +const config = { + pluginSlots: { + learning_username_slot: { + keepDefault: true, + plugins: [ + { + op: PLUGIN_OPERATIONS.Insert, + widget: { + id: 'custom_before_username_component', + type: DIRECT_PLUGIN, + priority: 10, + RenderWidget: () => "🖋️", + }, + }, + { + op: PLUGIN_OPERATIONS.Insert, + widget: { + id: 'custom_after_username_component', + type: DIRECT_PLUGIN, + priority: 90, + RenderWidget: () => "🪄", + }, + }, + ] + }, + }, +} + +export default config; +``` diff --git a/src/plugin-slots/LearningUsernameSlot/images/learning_username_custom_component.png b/src/plugin-slots/LearningUsernameSlot/images/learning_username_custom_component.png new file mode 100644 index 0000000000000000000000000000000000000000..f7230df79f846c554687e67f133b50f2e1d4af51 GIT binary patch literal 4339 zcma)AcQl;e)_z0u7DTiVgy=?Z(aWe~q7$7#BzlG+qDP2c<42;m2+@h?LX?DLgwcB^ z!H6;##lX@k2$l?>^<*p=j`X1R}T!dsK{B!0RW)V(bg~mfNSjF=MYk2 z@coZ&h%C5Vf2yWqLJGc~lOke3nHi~Rfi(7VL82UdodH)*FArzor%t}k&Yn*nc_H@* zJC#7Cdsj;8zRnIvH!n{P6E_cM0P5?;q2cVrAtu2gCMGW-B`+n%AucK|sW$fb7yxb< z>u9K&1iamu3(`+_?I6KI2pjmIP{T-*5kg=7e;$15y;Z{EXG2udsHK6kH~z65`>~OC z%xWsFkjTjj~D2u2Z! z1KahSJzlZE=)kNE+=~gXTwLHnpe;#cw>?0c5@TY-sG@Nk-L0-s=!CtIvdN^N!7Wcr zL;EW6f8TnV+5*rSI1ei#7_7U$6gr+;n?~b>KWy%9rL+j8CKu^O?K{n33x9AAk>w>i zQ`q)3@Y8En_k{o2=YxY*+;;|g%l9BUHsn)b3~{b^-GVFMUF%&m{O4|2XxI3vdT9#m z`H;27Fqx)yK8*rzd{j}a>%?(oYZ=KAOclAe0XE z1_12B{Yy47K}H>G+NsnAde@YbeFvax{;xIUWFWe`2*{Aa-T2cNn%`O$U7+qF@iM7M zmuPqkPLy-7MAk_F#-f3O(=0o!iz5fz!Jpw&auI0>dY1g0!x-HpyIkvYWq*EV2B=Ko z@Ums()`Ybd-s|mRb(_m3#AqPbI2%tBVFC<9UJm*)prr3pMSxH=l$JVbDCtj`g?(z z&$>g)l?j{(3v%Dzs&i){CZ-vLYT6P>l1TC4tA-xul?#ulS-t!6X=mdG_938ld6Qs) z&#od^DGTh`)QW+Mu99>;b(T4c!r!gp>A~j2)!LAudAT>&xH*YwbfBOE5jjMBa+cyJ z-_44J$CfRY#IAoKa!~zBkQ<>BX5Oexmkp7eWNd&RqPHqm5oE_iJCW-Y2?(i4L1LO$ zA}Dnc-|@Blih8|mBQ$0z>aCyLz+AGRAHRQ8w|e2oufu_pVB)G0o3xg6UTeM9m+=d( zD%GQUHnBGL*knF=7Ww23Q8v?4Q=`m3`rx8%_fKNtOX_kxLj__QGK1>Tm4G3iF-DA@ z&DZ?xxNRSWby+PX0w-+pVn-r=`kq?cfnw0Ey0>i3nwnRq03%y_n6(e&amVUI5PyG0*c=P7U7v1V+#@Utveq<5#(Mqx5 zS7NTQ$iGF^Cczuy7!0Sf@*S20Vi*jzxw#ouQ6V@xH@E*&58`lneu_Pk3f=m8cJ{38 zXxs__WMpIzE-nOsfS{ny`VjMMM=(21_n;H1xgea77lG@)wzY5glsao zg^qoOOvAUu-Loqr`t3zI8PKQZXGa3ZyK@u(IH9`I`He*#dr8N}$CuZK-)!#g_7!O* zC1+=oqfn@!w{oNMIc71$u*flw^)r{1j`vW=@RcmZEPiwQKJ z(}xJ)m9LYW$7Nx@rnwt5f~^jlNxKJQ`MIZ`BadmYF?F62K#i8dSdn>*wgKG@Hs`v`g{$1_>9P7> z9d>3Di_9(9NI@sDeq}5Ho`eUAPT!AzH$lW5dR#!_MDIZ0!X48Up!#ZFkpm8a#iu+Aj)*XpiRlhlgPUzV3
Gi@VrA8| z5(M672R87x{>)Rxn}9fZZijgWarTQ_x-i&qKAs6uLfExBm=-0}zphW3&2eS)vAVi# zH3|3k+^fr}Y)c@6oc~qD&OIPaK7LZO{)1^QEE$Gv`}0+>bTm^d ziG68vq=<0$FLp`&`QeDxWSuj`^78W890?*((7cK=z{|kLN9^&FC$Q?fTwFqr;cjg% zQ$Kt;Ums(bl#W^C!{Q_Q2M5W#I!;Ts{0t1Je~ymkS+EcSEUc`xPW{xQNq=aqQqXc>#Oi7&uu?gX>pcTwE+|^n3B*)(ZW@&5Qr^^b7v{Ch%mxGVUU0 z?y9sE4}luQARTzYj2==Q9UdZAH#VHshqAm;D6OEN`=D!vCMJl760W^5w3Fa7YcjtC z%w|hH!A`m6IqXa~mVP@mFfc$rZfy2mB9OlyR1KAtlXK{KN%h*#q~JXBOfW=D^l!FUJQxd*(P%Wn-4*^(sDILraS!@wQyV!N!l3 z^V0+P?}PJ$A1gVic~yJ+{4YEFhW73p-#wIh{g@-ju`A z%Mub29(j31r=`(@^Jr;hCDO9qWeL3BqSDg*TF|4Tkr{&KT;LV=>C-2;P%sNSd*Xy$ zC>uSmL4$6PZgK8=XxEc#vB5tzz~uqFF>i+W#j1Tx9}g$%*!1+Y*M1GCY5#k&md*^p zKEW&q0G+e4JU%?_0)GU&h0gvNb0%G;`4k%Fm45o``3zk_lHioSNSgQw^i;q%bqY+r zrC=>@@w=3dgv zAD@?mx9^cCQ3T&;4_)NVNj^oO2n#G`XJ?c1@*sZ9{tl;uYgZ`ftnjQG_4?WmZ@7^1 zCu{I|33u7)-o{N6Rn(bxOUxQ?8xgND@4hmfs;K;<`QVu}2*w=K`}r!r+X?>~70HWI zvdHOVDN=yy*u*Z21!zl(JZ9|ut7!Y0{yXSY%-C!Qq-fquTOArgK-X?LQg--d}U+^WI*2@BW=osgY_dlH6|t0B4$$HX6*xh&W#jE z*56!{Tf3DM(ZoWmuy2^UOkZ#u3Zc1ro-T>;`He86;ybX{fBGU)5`$pNIk+Qf@ip7V6%luJjl+xJ4-U`KGZw~L+wlQ>xolJ z6Xks_|5`Y}a;!_t@rrl{e1`v*3jWWm{PK=rdRQ8*1jje<4+%g=(?Fw2%|7B^oG&=1 literal 0 HcmV?d00001 diff --git a/src/plugin-slots/LearningUsernameSlot/images/learning_username_custom_components_before_after.png b/src/plugin-slots/LearningUsernameSlot/images/learning_username_custom_components_before_after.png new file mode 100644 index 0000000000000000000000000000000000000000..f0f51f1d0b8a595a525566a54d980923d1abe054 GIT binary patch literal 8864 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 literal 0 HcmV?d00001 diff --git a/src/plugin-slots/LearningUsernameSlot/images/learning_username_modified.png b/src/plugin-slots/LearningUsernameSlot/images/learning_username_modified.png new file mode 100644 index 0000000000000000000000000000000000000000..2b12cfc4987937b4a8cc32e043887209dceffde7 GIT binary patch literal 5620 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 WThS+9kas_{IBH;R ( + <> + + + {username} + + +); + +const LearningUsernameSlot = ({ username }) => ( + + + +); + +LearningUsername.propTypes = { + username: PropTypes.string.isRequired, +}; + +LearningUsernameSlot.propTypes = LearningUsername.propTypes; + +export default LearningUsernameSlot; diff --git a/src/plugin-slots/README.md b/src/plugin-slots/README.md index 12071fb4c..9eb452ad4 100644 --- a/src/plugin-slots/README.md +++ b/src/plugin-slots/README.md @@ -10,6 +10,7 @@ * [`mobile_logged_out_items_slot`](./MobileLoggedOutItemsSlot/) * [`mobile_user_menu_slot`](./MobileUserMenuSlot/) * [`desktop_user_menu_slot`](./DesktopUserMenuSlot/) +* [`learning_username_slot`](./LearningUsernameSlot/) * [`learning_user_menu_slot`](./LearningUserMenuSlot/) * [`learning_logged_out_items_slot`](./LearningLoggedOutItemsSlot/) * [`desktop_header_slot`](./DesktopHeaderSlot/) From 6136b880cb994f7383db5bb07ac081bdc07d599d Mon Sep 17 00:00:00 2001 From: Brian Smith Date: Fri, 13 Dec 2024 12:22:26 -0500 Subject: [PATCH 2/2] feat: add desktop username slot --- src/desktop-header/DesktopHeader.jsx | 8 +- .../DesktopUsernameSlot/README.md | 116 ++++++++++++++++++ .../desktop_username_custom_component.png | Bin 0 -> 2540 bytes ...sername_custom_components_before_after.png | Bin 0 -> 11496 bytes .../images/desktop_username_modified.png | Bin 0 -> 7252 bytes .../DesktopUsernameSlot/index.jsx | 38 ++++++ src/plugin-slots/README.md | 1 + 7 files changed, 157 insertions(+), 6 deletions(-) create mode 100644 src/plugin-slots/DesktopUsernameSlot/README.md create mode 100644 src/plugin-slots/DesktopUsernameSlot/images/desktop_username_custom_component.png create mode 100644 src/plugin-slots/DesktopUsernameSlot/images/desktop_username_custom_components_before_after.png create mode 100644 src/plugin-slots/DesktopUsernameSlot/images/desktop_username_modified.png create mode 100644 src/plugin-slots/DesktopUsernameSlot/index.jsx diff --git a/src/desktop-header/DesktopHeader.jsx b/src/desktop-header/DesktopHeader.jsx index 4b5e4939f..d28a399d4 100644 --- a/src/desktop-header/DesktopHeader.jsx +++ b/src/desktop-header/DesktopHeader.jsx @@ -5,7 +5,6 @@ import { getConfig } from '@edx/frontend-platform'; // Local Components import { Menu, MenuTrigger, MenuContent } from '../Menu'; -import Avatar from '../Avatar'; import LogoSlot from '../plugin-slots/LogoSlot'; import DesktopLoggedOutItemsSlot from '../plugin-slots/DesktopLoggedOutItemsSlot'; import { desktopLoggedOutItemsDataShape } from './DesktopLoggedOutItems'; @@ -14,13 +13,11 @@ import { desktopHeaderMainOrSecondaryMenuDataShape } from './DesktopHeaderMainOr import DesktopSecondaryMenuSlot from '../plugin-slots/DesktopSecondaryMenuSlot'; import DesktopUserMenuSlot from '../plugin-slots/DesktopUserMenuSlot'; import { desktopUserMenuDataShape } from './DesktopHeaderUserMenu'; +import DesktopUsernameSlot from '../plugin-slots/DesktopUsernameSlot'; // i18n import messages from '../Header.messages'; -// Assets -import { CaretIcon } from '../Icons'; - class DesktopHeader extends React.Component { constructor(props) { // eslint-disable-line no-useless-constructor super(props); @@ -51,8 +48,7 @@ class DesktopHeader extends React.Component { aria-label={intl.formatMessage(messages['header.label.account.menu.for'], { username })} className="btn btn-outline-primary d-inline-flex align-items-center pl-2 pr-3" > - - {username} + diff --git a/src/plugin-slots/DesktopUsernameSlot/README.md b/src/plugin-slots/DesktopUsernameSlot/README.md new file mode 100644 index 000000000..9c4b99fdb --- /dev/null +++ b/src/plugin-slots/DesktopUsernameSlot/README.md @@ -0,0 +1,116 @@ +# Desktop Username Slot + +### Slot ID: `desktop_username_slot` + +## Description + +This slot is used to replace/modify/hide the desktop username. + +## Examples + +### Modify Username + +The following `env.config.jsx` will modify the username (in this case replacing it with 🤠) + +![Screenshot of modified username](./images/desktop_username_modified.png) + +```jsx +import { PLUGIN_OPERATIONS } from '@openedx/frontend-plugin-framework'; + +const modifyUsername = ( widget ) => { + widget.content.username = "🤠"; + return widget; +}; + +const config = { + pluginSlots: { + desktop_username_slot: { + keepDefault: true, + plugins: [ + { + op: PLUGIN_OPERATIONS.Modify, + widgetId: 'default_contents', + fn: modifyUsername, + }, + ] + }, + }, +} + +export default config; +``` + + +### Replace Username with Custom Component + +The following `env.config.jsx` will replace the items in the desktop username entirely (in this case with an svg circle) + +![Screenshot of replaced with custom component](./images/desktop_username_custom_component.png) + +```jsx +import { DIRECT_PLUGIN, PLUGIN_OPERATIONS } from '@openedx/frontend-plugin-framework'; + +const config = { + pluginSlots: { + desktop_username_slot: { + keepDefault: false, + plugins: [ + { + op: PLUGIN_OPERATIONS.Insert, + widget: { + id: 'custom_username_component', + type: DIRECT_PLUGIN, + RenderWidget: () => ( + + + + ), + }, + }, + ] + }, + }, +} + +export default config; +``` + +### Add Custom Components before and after Username + +The following `env.config.jsx` will place custom components before and after the desktop username (in this case 🖋️ and 🪄). + +![Screenshot of custom components before and after](./images/desktop_username_custom_components_before_after.png) + +```jsx +import { DIRECT_PLUGIN, PLUGIN_OPERATIONS } from '@openedx/frontend-plugin-framework'; + +const config = { + pluginSlots: { + desktop_username_slot: { + keepDefault: true, + plugins: [ + { + op: PLUGIN_OPERATIONS.Insert, + widget: { + id: 'custom_before_username_component', + type: DIRECT_PLUGIN, + priority: 10, + RenderWidget: () => "🖋️", + }, + }, + { + op: PLUGIN_OPERATIONS.Insert, + widget: { + id: 'custom_after_username_component', + type: DIRECT_PLUGIN, + priority: 90, + RenderWidget: () => "🪄", + }, + }, + ] + }, + }, +} + +export default config; +``` diff --git a/src/plugin-slots/DesktopUsernameSlot/images/desktop_username_custom_component.png b/src/plugin-slots/DesktopUsernameSlot/images/desktop_username_custom_component.png new file mode 100644 index 0000000000000000000000000000000000000000..27d94659e1f1303e07a3f691ffe2c3e440f4de55 GIT binary patch literal 2540 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 ( + <> + + {username} + +); + +const DesktopUsernameSlot = ({ username, avatar }) => ( + + + +); + +DesktopUsername.propTypes = { + avatar: PropTypes.string, + username: PropTypes.string.isRequired, +}; + +DesktopUsername.defaultProps = { + avatar: null, +}; + +DesktopUsernameSlot.propTypes = DesktopUsername.propTypes; +DesktopUsernameSlot.defaultProps = DesktopUsername.defaultProps; + +export default DesktopUsernameSlot; diff --git a/src/plugin-slots/README.md b/src/plugin-slots/README.md index 9eb452ad4..6a4927e28 100644 --- a/src/plugin-slots/README.md +++ b/src/plugin-slots/README.md @@ -9,6 +9,7 @@ * [`desktop_logged_out_items_slot`](./DesktopLoggedOutItemsSlot/) * [`mobile_logged_out_items_slot`](./MobileLoggedOutItemsSlot/) * [`mobile_user_menu_slot`](./MobileUserMenuSlot/) +* [`desktop_username_slot`](./DesktopUsernameSlot/) * [`desktop_user_menu_slot`](./DesktopUserMenuSlot/) * [`learning_username_slot`](./LearningUsernameSlot/) * [`learning_user_menu_slot`](./LearningUserMenuSlot/)