From 0fdd0761755e6471a3370ecf78906d97e363cb7a Mon Sep 17 00:00:00 2001 From: Guilherme Leme Date: Fri, 25 Jul 2025 11:37:02 -0300 Subject: [PATCH 1/8] [lad-new-functions-plugin] added upsert and delete for lad entries --- src/core/api/BbbPluginSdk.ts | 14 +++++- src/core/api/types.ts | 12 ++++- src/learning-analytics-dashboard/enums.ts | 2 + src/learning-analytics-dashboard/hooks.ts | 54 ++++++++++++++++++++--- src/learning-analytics-dashboard/types.ts | 49 ++++++++++++++++++-- 5 files changed, 120 insertions(+), 11 deletions(-) diff --git a/src/core/api/BbbPluginSdk.ts b/src/core/api/BbbPluginSdk.ts index 90d06ded..fadf2218 100644 --- a/src/core/api/BbbPluginSdk.ts +++ b/src/core/api/BbbPluginSdk.ts @@ -46,7 +46,7 @@ import { useUiData } from '../../ui-data/hooks/hooks'; import { UseMeetingFunction } from '../../data-consumption/domain/meeting/from-core/types'; import { useMeeting } from '../../data-consumption/domain/meeting/from-core/hooks'; import { serverCommands } from '../../server-commands/commands'; -import { sendGenericDataForLearningAnalyticsDashboard } from '../../learning-analytics-dashboard/hooks'; +import { deleteGenericData, sendGenericDataForLearningAnalyticsDashboard, upsertGenericData } from '../../learning-analytics-dashboard/hooks'; import { GenericDataForLearningAnalyticsDashboard } from '../../learning-analytics-dashboard/types'; import { getRemoteData } from '../../remote-data/utils'; import { persistEventFunctionWrapper } from '../../event-persistence/hooks'; @@ -131,6 +131,18 @@ export abstract class BbbPluginSdk { pluginApi.sendGenericDataForLearningAnalyticsDashboard = ( data: GenericDataForLearningAnalyticsDashboard, ) => sendGenericDataForLearningAnalyticsDashboard(data, pluginName); + pluginApi.learningAnalyticsDashboard = { + upsertGenericData: (data, targetUserId) => upsertGenericData( + data, + pluginName, + targetUserId, + ), + deleteGenericData: (data, targetUserId) => deleteGenericData( + data, + pluginName, + targetUserId, + ), + }; pluginApi.getRemoteData = ( dataSourceName: string, ) => getRemoteData(dataSourceName, pluginName); diff --git a/src/core/api/types.ts b/src/core/api/types.ts index 48a66821..9709e47d 100644 --- a/src/core/api/types.ts +++ b/src/core/api/types.ts @@ -27,7 +27,7 @@ import { GenericContentInterface } from '../../extensible-areas/generic-content- import { UseUiDataFunction } from '../../ui-data/hooks/types'; import { UseMeetingFunction } from '../../data-consumption/domain/meeting/from-core/types'; import { ServerCommands } from '../../server-commands/types'; -import { SendGenericDataForLearningAnalyticsDashboard } from '../../learning-analytics-dashboard/types'; +import { LearningAnalyticsDashboardWrapperObject, SendGenericDataForLearningAnalyticsDashboard } from '../../learning-analytics-dashboard/types'; import { UseUserCameraDomElementsFunction } from '../../dom-element-manipulation/user-camera/types'; import { ScreenshareHelperInterface, UserCameraHelperInterface } from '../../extensible-areas'; import { GetDataSource } from '../../remote-data/types'; @@ -287,12 +287,22 @@ export interface PluginApi { */ useLocaleMessages?: UseLocaleMessagesFunction /** + * @deprecated Use {@link learningAnalyticsDashboard.upsertGenericData} object instead. + * * Send data to the Learning analytics dashboard * * @param data - object in which one can render in the learning analytics dashboard * */ sendGenericDataForLearningAnalyticsDashboard?: SendGenericDataForLearningAnalyticsDashboard; + /** + * Wrapper object of functions related to the learning analytics dashboard. + * It contains the following functions: + * - deleteGenericData: Deletes a certain entry in the learning dashboard generic-data; + * - upsertGenericData: Updates or insert a generic data entry in the learning dashboard; + * + */ + learningAnalyticsDashboard?: LearningAnalyticsDashboardWrapperObject; /** * Fetches external data from pre-defined data-source in manifest. * diff --git a/src/learning-analytics-dashboard/enums.ts b/src/learning-analytics-dashboard/enums.ts index fe5b568d..fd7d71ff 100644 --- a/src/learning-analytics-dashboard/enums.ts +++ b/src/learning-analytics-dashboard/enums.ts @@ -1,3 +1,5 @@ export enum LearningAnalyticsDashboardEvents { GENERIC_DATA_SENT = 'GENERIC_DATA_FOR_LEARNING_ANALYTICS_DASHBOARD_SENT', + UPSERT_GENERIC_DATA_SENT = 'UPSERT_GENERIC_DATA_FOR_LEARNING_ANALYTICS_DASHBOARD_SENT', + DELETE_GENERIC_DATA_SENT = 'DELETE_GENERIC_DATA_FOR_LEARNING_ANALYTICS_DASHBOARD_SENT', } diff --git a/src/learning-analytics-dashboard/hooks.ts b/src/learning-analytics-dashboard/hooks.ts index 1a1a3766..b8a42477 100644 --- a/src/learning-analytics-dashboard/hooks.ts +++ b/src/learning-analytics-dashboard/hooks.ts @@ -1,6 +1,8 @@ import { LearningAnalyticsDashboardEventDetails, GenericDataForLearningAnalyticsDashboard, + UpsertGenericDataArguments, + DeleteGenericDataArguments, } from './types'; import { LearningAnalyticsDashboardEvents } from './enums'; @@ -10,11 +12,51 @@ export const sendGenericDataForLearningAnalyticsDashboard = ( ) => { window.dispatchEvent( new CustomEvent< - LearningAnalyticsDashboardEventDetails>(LearningAnalyticsDashboardEvents.GENERIC_DATA_SENT, { - detail: { - pluginName, - data, - }, - }), + LearningAnalyticsDashboardEventDetails>(LearningAnalyticsDashboardEvents.GENERIC_DATA_SENT, { + detail: { + pluginName, + data, + }, + }), + ); +}; + +export const upsertGenericData = ( + data: UpsertGenericDataArguments, + pluginName: string, + targetUserId?: string, +) => { + window.dispatchEvent( + new CustomEvent< + LearningAnalyticsDashboardEventDetails>( + LearningAnalyticsDashboardEvents.UPSERT_GENERIC_DATA_SENT, + { + detail: { + pluginName, + data, + targetUserId, + }, + }, + ), + ); +}; + +export const deleteGenericData = ( + data: DeleteGenericDataArguments, + pluginName: string, + targetUserId?: string, +) => { + window.dispatchEvent( + new CustomEvent< + LearningAnalyticsDashboardEventDetails>( + LearningAnalyticsDashboardEvents.DELETE_GENERIC_DATA_SENT, + { + detail: { + pluginName, + data, + targetUserId, + }, + }, + ), ); }; diff --git a/src/learning-analytics-dashboard/types.ts b/src/learning-analytics-dashboard/types.ts index a93c426d..c579bdfb 100644 --- a/src/learning-analytics-dashboard/types.ts +++ b/src/learning-analytics-dashboard/types.ts @@ -1,13 +1,56 @@ +// Deprecated Send data function export interface GenericDataForLearningAnalyticsDashboard { cardTitle: string; columnTitle: string; value: string; } +export type SendGenericDataForLearningAnalyticsDashboard = ( + data: GenericDataForLearningAnalyticsDashboard) => void; + +// Upsert function +export interface UpsertGenericDataArguments { + cardTitle: string; + columnTitle: string; + value: string; +} + +export type UpsertGenericDataFunction = ( + data: UpsertGenericDataArguments, + targetUserId?: string, +) => void; + +// Delete function +export interface DeleteGenericDataArguments { + cardTitle: string; + columnTitle: string; +} + +export type DeleteGenericDataFunction = ( + data: DeleteGenericDataArguments, + targetUserId?: string, +) => void; + +// General typing. + export interface LearningAnalyticsDashboardEventDetails { pluginName: string; - data: GenericDataForLearningAnalyticsDashboard; + data: GenericDataForLearningAnalyticsDashboard + | UpsertGenericDataArguments | DeleteGenericDataArguments; + targetUserId?: string; } -export type SendGenericDataForLearningAnalyticsDashboard = ( - data: GenericDataForLearningAnalyticsDashboard) => void; +export interface LearningAnalyticsDashboardWrapperObject { + /** + * Updates or insert a generic data entry in the learning dashboard; + * + * @param data Data to insert or update + */ + upsertGenericData: UpsertGenericDataFunction; + /** + * Updates or insert a generic data entry in the learning dashboard; + * + * @param data Data to be deleted + */ + deleteGenericData: DeleteGenericDataFunction; +} From 7685701896bac9689857d866f663814b7e7a0111 Mon Sep 17 00:00:00 2001 From: Guilherme Leme Date: Fri, 25 Jul 2025 15:34:02 -0300 Subject: [PATCH 2/8] [lad-new-functions-plugin] rename from genericData -> data --- src/core/api/BbbPluginSdk.ts | 6 +++--- src/learning-analytics-dashboard/enums.ts | 4 ++-- src/learning-analytics-dashboard/hooks.ts | 16 ++++++++-------- src/learning-analytics-dashboard/types.ts | 18 +++++++++--------- 4 files changed, 22 insertions(+), 22 deletions(-) diff --git a/src/core/api/BbbPluginSdk.ts b/src/core/api/BbbPluginSdk.ts index fadf2218..7fb369b7 100644 --- a/src/core/api/BbbPluginSdk.ts +++ b/src/core/api/BbbPluginSdk.ts @@ -46,7 +46,7 @@ import { useUiData } from '../../ui-data/hooks/hooks'; import { UseMeetingFunction } from '../../data-consumption/domain/meeting/from-core/types'; import { useMeeting } from '../../data-consumption/domain/meeting/from-core/hooks'; import { serverCommands } from '../../server-commands/commands'; -import { deleteGenericData, sendGenericDataForLearningAnalyticsDashboard, upsertGenericData } from '../../learning-analytics-dashboard/hooks'; +import { deleteData, sendGenericDataForLearningAnalyticsDashboard, upsertData } from '../../learning-analytics-dashboard/hooks'; import { GenericDataForLearningAnalyticsDashboard } from '../../learning-analytics-dashboard/types'; import { getRemoteData } from '../../remote-data/utils'; import { persistEventFunctionWrapper } from '../../event-persistence/hooks'; @@ -132,12 +132,12 @@ export abstract class BbbPluginSdk { data: GenericDataForLearningAnalyticsDashboard, ) => sendGenericDataForLearningAnalyticsDashboard(data, pluginName); pluginApi.learningAnalyticsDashboard = { - upsertGenericData: (data, targetUserId) => upsertGenericData( + upsertData: (data, targetUserId) => upsertData( data, pluginName, targetUserId, ), - deleteGenericData: (data, targetUserId) => deleteGenericData( + deleteData: (data, targetUserId) => deleteData( data, pluginName, targetUserId, diff --git a/src/learning-analytics-dashboard/enums.ts b/src/learning-analytics-dashboard/enums.ts index fd7d71ff..39790099 100644 --- a/src/learning-analytics-dashboard/enums.ts +++ b/src/learning-analytics-dashboard/enums.ts @@ -1,5 +1,5 @@ export enum LearningAnalyticsDashboardEvents { GENERIC_DATA_SENT = 'GENERIC_DATA_FOR_LEARNING_ANALYTICS_DASHBOARD_SENT', - UPSERT_GENERIC_DATA_SENT = 'UPSERT_GENERIC_DATA_FOR_LEARNING_ANALYTICS_DASHBOARD_SENT', - DELETE_GENERIC_DATA_SENT = 'DELETE_GENERIC_DATA_FOR_LEARNING_ANALYTICS_DASHBOARD_SENT', + UPSERT_DATA_COMMAND_SENT = 'UPSERT_DATA_COMMAND_FOR_LEARNING_ANALYTICS_DASHBOARD_SENT', + DELETE_DATA_COMMAND_SENT = 'DELETE_DATA_COMMAND_FOR_LEARNING_ANALYTICS_DASHBOARD_SENT', } diff --git a/src/learning-analytics-dashboard/hooks.ts b/src/learning-analytics-dashboard/hooks.ts index b8a42477..cf88a7fe 100644 --- a/src/learning-analytics-dashboard/hooks.ts +++ b/src/learning-analytics-dashboard/hooks.ts @@ -1,8 +1,8 @@ import { LearningAnalyticsDashboardEventDetails, GenericDataForLearningAnalyticsDashboard, - UpsertGenericDataArguments, - DeleteGenericDataArguments, + UpsertDataArguments, + DeleteDataArguments, } from './types'; import { LearningAnalyticsDashboardEvents } from './enums'; @@ -21,15 +21,15 @@ export const sendGenericDataForLearningAnalyticsDashboard = ( ); }; -export const upsertGenericData = ( - data: UpsertGenericDataArguments, +export const upsertData = ( + data: UpsertDataArguments, pluginName: string, targetUserId?: string, ) => { window.dispatchEvent( new CustomEvent< LearningAnalyticsDashboardEventDetails>( - LearningAnalyticsDashboardEvents.UPSERT_GENERIC_DATA_SENT, + LearningAnalyticsDashboardEvents.UPSERT_DATA_COMMAND_SENT, { detail: { pluginName, @@ -41,15 +41,15 @@ export const upsertGenericData = ( ); }; -export const deleteGenericData = ( - data: DeleteGenericDataArguments, +export const deleteData = ( + data: DeleteDataArguments, pluginName: string, targetUserId?: string, ) => { window.dispatchEvent( new CustomEvent< LearningAnalyticsDashboardEventDetails>( - LearningAnalyticsDashboardEvents.DELETE_GENERIC_DATA_SENT, + LearningAnalyticsDashboardEvents.DELETE_DATA_COMMAND_SENT, { detail: { pluginName, diff --git a/src/learning-analytics-dashboard/types.ts b/src/learning-analytics-dashboard/types.ts index c579bdfb..3f71c838 100644 --- a/src/learning-analytics-dashboard/types.ts +++ b/src/learning-analytics-dashboard/types.ts @@ -9,25 +9,25 @@ export type SendGenericDataForLearningAnalyticsDashboard = ( data: GenericDataForLearningAnalyticsDashboard) => void; // Upsert function -export interface UpsertGenericDataArguments { +export interface UpsertDataArguments { cardTitle: string; columnTitle: string; value: string; } -export type UpsertGenericDataFunction = ( - data: UpsertGenericDataArguments, +export type UpsertDataFunction = ( + data: UpsertDataArguments, targetUserId?: string, ) => void; // Delete function -export interface DeleteGenericDataArguments { +export interface DeleteDataArguments { cardTitle: string; columnTitle: string; } -export type DeleteGenericDataFunction = ( - data: DeleteGenericDataArguments, +export type DeleteDataFunction = ( + data: DeleteDataArguments, targetUserId?: string, ) => void; @@ -36,7 +36,7 @@ export type DeleteGenericDataFunction = ( export interface LearningAnalyticsDashboardEventDetails { pluginName: string; data: GenericDataForLearningAnalyticsDashboard - | UpsertGenericDataArguments | DeleteGenericDataArguments; + | UpsertDataArguments | DeleteDataArguments; targetUserId?: string; } @@ -46,11 +46,11 @@ export interface LearningAnalyticsDashboardWrapperObject { * * @param data Data to insert or update */ - upsertGenericData: UpsertGenericDataFunction; + upsertData: UpsertDataFunction; /** * Updates or insert a generic data entry in the learning dashboard; * * @param data Data to be deleted */ - deleteGenericData: DeleteGenericDataFunction; + deleteData: DeleteDataFunction; } From 5d1ebfea49ee70a3f16c6bcb504374cdca646659 Mon Sep 17 00:00:00 2001 From: Guilherme Leme Date: Fri, 25 Jul 2025 16:50:44 -0300 Subject: [PATCH 3/8] [lad-new-functions-plugin] added documentation --- README.md | 50 ++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 46 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 22b8af2c..00568f76 100644 --- a/README.md +++ b/README.md @@ -458,18 +458,34 @@ So the idea is that we have a `uiCommands` object and at a point, there will be ### Learning Analytics Dashboard integration -- `sendGenericDataForLearningAnalyticsDashboard`: This function will send data for the bbb to render inside the plugin's table +This integration allow you to insert/update entry in LAD (Learning Analytics Dashboard) via `upsert` function and also delete entries via `delete` function. -The object structure of this function's argument must be: +It's an object available in the `pluginApi` that wraps those 2 functions: + +- `pluginApi.learningAnalyticsDashboard.upsert` +- `pluginApi.learningAnalyticsDashboard.delete` + +For the `upsert` function, the argument's data object structure must be: ```ts -interface GenericDataForLearningAnalyticsDashboard { - cardTitle: string; // Yet to be implemented (future updates) +interface UpsertDataArguments { + cardTitle: string; columnTitle: string; value: string; } ``` +For the `delete` function, the argument's data object structure must be: + +```ts +interface DeleteDataArguments { + cardTitle: string; + columnTitle: string; +} +``` + +And if the user is a moderator, there is the possibility to publish data on behalf of other users by using the second **optional** parameter named `targetUserId` + So that the data will appear in the following form: | User | Count | `` | @@ -477,6 +493,32 @@ So that the data will appear in the following form: | user-name | 1 | `` | +See example of use ahead: + +```ts +const targetUserId = 'abcd-efg'; +pluginApi.learningAnalyticsDashboard.upsertData( + { + cardTitle: 'Example Title', + columnTitle: 'link sent by user', + value: '[link](https://my-website.com/abc.png)' + }, + targetUserId, +); + +pluginApi.learningAnalyticsDashboard.deleteData( + { + cardTitle: 'Example Title', + columnTitle: 'link sent by user', + }, + targetUserId, +); +``` + +Note 1: the `value` field (in the upsert function's argument) supports markdown, so feel free to use it as you wish. + +Note 2: pluginApi.sendGenericDataForLearningAnalyticsDashboard is now being deprecated, but has the same data structure as upsert (without the possibility to send entry on behalf of another user) + ### External data resources This is the new integration with external servers to fetch data in a secure manner. From 536c70166ba9598ff48d42934e449195743a4b14 Mon Sep 17 00:00:00 2001 From: Guilherme Leme Date: Thu, 7 Aug 2025 10:05:07 -0300 Subject: [PATCH 4/8] [lad-new-functions-plugin] rename data -> userData for LAD --- README.md | 16 +++++----- src/core/api/BbbPluginSdk.ts | 6 ++-- src/learning-analytics-dashboard/enums.ts | 4 +-- src/learning-analytics-dashboard/hooks.ts | 33 +++++++++++++++----- src/learning-analytics-dashboard/types.ts | 38 ++++++++++++++++------- 5 files changed, 64 insertions(+), 33 deletions(-) diff --git a/README.md b/README.md index 00568f76..f90ac235 100644 --- a/README.md +++ b/README.md @@ -458,27 +458,27 @@ So the idea is that we have a `uiCommands` object and at a point, there will be ### Learning Analytics Dashboard integration -This integration allow you to insert/update entry in LAD (Learning Analytics Dashboard) via `upsert` function and also delete entries via `delete` function. +This integration allow you to insert/update entry in LAD (Learning Analytics Dashboard) via `upsertUserData` function and also delete entries via `deleteUserData` function. It's an object available in the `pluginApi` that wraps those 2 functions: -- `pluginApi.learningAnalyticsDashboard.upsert` -- `pluginApi.learningAnalyticsDashboard.delete` +- `pluginApi.learningAnalyticsDashboard.upsertUserData` +- `pluginApi.learningAnalyticsDashboard.deleteUserData` For the `upsert` function, the argument's data object structure must be: ```ts -interface UpsertDataArguments { +interface LearningAnalyticsDashboardUserData { cardTitle: string; columnTitle: string; value: string; } ``` -For the `delete` function, the argument's data object structure must be: +For the `deleteUserData` function, the argument's data object structure must be: ```ts -interface DeleteDataArguments { +interface LearningAnalyticsDashboardDeleteUserData { cardTitle: string; columnTitle: string; } @@ -497,7 +497,7 @@ See example of use ahead: ```ts const targetUserId = 'abcd-efg'; -pluginApi.learningAnalyticsDashboard.upsertData( +pluginApi.learningAnalyticsDashboard.upsertUserData( { cardTitle: 'Example Title', columnTitle: 'link sent by user', @@ -506,7 +506,7 @@ pluginApi.learningAnalyticsDashboard.upsertData( targetUserId, ); -pluginApi.learningAnalyticsDashboard.deleteData( +pluginApi.learningAnalyticsDashboard.deleteUserData( { cardTitle: 'Example Title', columnTitle: 'link sent by user', diff --git a/src/core/api/BbbPluginSdk.ts b/src/core/api/BbbPluginSdk.ts index 7fb369b7..8584e047 100644 --- a/src/core/api/BbbPluginSdk.ts +++ b/src/core/api/BbbPluginSdk.ts @@ -46,7 +46,7 @@ import { useUiData } from '../../ui-data/hooks/hooks'; import { UseMeetingFunction } from '../../data-consumption/domain/meeting/from-core/types'; import { useMeeting } from '../../data-consumption/domain/meeting/from-core/hooks'; import { serverCommands } from '../../server-commands/commands'; -import { deleteData, sendGenericDataForLearningAnalyticsDashboard, upsertData } from '../../learning-analytics-dashboard/hooks'; +import { deleteUserData, sendGenericDataForLearningAnalyticsDashboard, upsertUserData } from '../../learning-analytics-dashboard/hooks'; import { GenericDataForLearningAnalyticsDashboard } from '../../learning-analytics-dashboard/types'; import { getRemoteData } from '../../remote-data/utils'; import { persistEventFunctionWrapper } from '../../event-persistence/hooks'; @@ -132,12 +132,12 @@ export abstract class BbbPluginSdk { data: GenericDataForLearningAnalyticsDashboard, ) => sendGenericDataForLearningAnalyticsDashboard(data, pluginName); pluginApi.learningAnalyticsDashboard = { - upsertData: (data, targetUserId) => upsertData( + upsertUserData: (data, targetUserId) => upsertUserData( data, pluginName, targetUserId, ), - deleteData: (data, targetUserId) => deleteData( + deleteUserData: (data, targetUserId) => deleteUserData( data, pluginName, targetUserId, diff --git a/src/learning-analytics-dashboard/enums.ts b/src/learning-analytics-dashboard/enums.ts index 39790099..cc3f098f 100644 --- a/src/learning-analytics-dashboard/enums.ts +++ b/src/learning-analytics-dashboard/enums.ts @@ -1,5 +1,5 @@ export enum LearningAnalyticsDashboardEvents { GENERIC_DATA_SENT = 'GENERIC_DATA_FOR_LEARNING_ANALYTICS_DASHBOARD_SENT', - UPSERT_DATA_COMMAND_SENT = 'UPSERT_DATA_COMMAND_FOR_LEARNING_ANALYTICS_DASHBOARD_SENT', - DELETE_DATA_COMMAND_SENT = 'DELETE_DATA_COMMAND_FOR_LEARNING_ANALYTICS_DASHBOARD_SENT', + UPSERT_USER_DATA_COMMAND_SENT = 'UPSERT_USER_DATA_COMMAND_FOR_LEARNING_ANALYTICS_DASHBOARD_SENT', + DELETE_USER_DATA_COMMAND_SENT = 'DELETE_USER_DATA_COMMAND_FOR_LEARNING_ANALYTICS_DASHBOARD_SENT', } diff --git a/src/learning-analytics-dashboard/hooks.ts b/src/learning-analytics-dashboard/hooks.ts index cf88a7fe..1485b661 100644 --- a/src/learning-analytics-dashboard/hooks.ts +++ b/src/learning-analytics-dashboard/hooks.ts @@ -1,8 +1,9 @@ import { LearningAnalyticsDashboardEventDetails, GenericDataForLearningAnalyticsDashboard, - UpsertDataArguments, - DeleteDataArguments, + LearningAnalyticsDashboardUserData, + LearningAnalyticsDashboardDeleteUserData, + ClearLearningAnalyticsDashboardEventDetails, } from './types'; import { LearningAnalyticsDashboardEvents } from './enums'; @@ -21,15 +22,15 @@ export const sendGenericDataForLearningAnalyticsDashboard = ( ); }; -export const upsertData = ( - data: UpsertDataArguments, +export const upsertUserData = ( + data: LearningAnalyticsDashboardUserData, pluginName: string, targetUserId?: string, ) => { window.dispatchEvent( new CustomEvent< LearningAnalyticsDashboardEventDetails>( - LearningAnalyticsDashboardEvents.UPSERT_DATA_COMMAND_SENT, + LearningAnalyticsDashboardEvents.UPSERT_USER_DATA_COMMAND_SENT, { detail: { pluginName, @@ -41,15 +42,15 @@ export const upsertData = ( ); }; -export const deleteData = ( - data: DeleteDataArguments, +export const deleteUserData = ( + data: LearningAnalyticsDashboardDeleteUserData, pluginName: string, targetUserId?: string, ) => { window.dispatchEvent( new CustomEvent< LearningAnalyticsDashboardEventDetails>( - LearningAnalyticsDashboardEvents.DELETE_DATA_COMMAND_SENT, + LearningAnalyticsDashboardEvents.DELETE_USER_DATA_COMMAND_SENT, { detail: { pluginName, @@ -60,3 +61,19 @@ export const deleteData = ( ), ); }; + +export const clearAllUsersData = ( + pluginName: string, +) => { + window.dispatchEvent( + new CustomEvent< + ClearLearningAnalyticsDashboardEventDetails>( + LearningAnalyticsDashboardEvents.DELETE_USER_DATA_COMMAND_SENT, + { + detail: { + pluginName, + }, + }, + ), + ); +}; diff --git a/src/learning-analytics-dashboard/types.ts b/src/learning-analytics-dashboard/types.ts index 3f71c838..cb666d8b 100644 --- a/src/learning-analytics-dashboard/types.ts +++ b/src/learning-analytics-dashboard/types.ts @@ -9,48 +9,62 @@ export type SendGenericDataForLearningAnalyticsDashboard = ( data: GenericDataForLearningAnalyticsDashboard) => void; // Upsert function -export interface UpsertDataArguments { +export interface LearningAnalyticsDashboardUserData { cardTitle: string; columnTitle: string; value: string; } -export type UpsertDataFunction = ( - data: UpsertDataArguments, +export type UpsertUserDataFunction = ( + data: LearningAnalyticsDashboardUserData, targetUserId?: string, ) => void; // Delete function -export interface DeleteDataArguments { +export interface LearningAnalyticsDashboardDeleteUserData { cardTitle: string; columnTitle: string; } -export type DeleteDataFunction = ( - data: DeleteDataArguments, +export type DeleteUserDataFunction = ( + data: LearningAnalyticsDashboardDeleteUserData, targetUserId?: string, ) => void; -// General typing. +export type ClearUsersDataFunction = () => void; +// General typing. export interface LearningAnalyticsDashboardEventDetails { pluginName: string; data: GenericDataForLearningAnalyticsDashboard - | UpsertDataArguments | DeleteDataArguments; + | LearningAnalyticsDashboardUserData | LearningAnalyticsDashboardDeleteUserData; targetUserId?: string; } +export interface ClearLearningAnalyticsDashboardEventDetails { + pluginName: string; +} + export interface LearningAnalyticsDashboardWrapperObject { /** - * Updates or insert a generic data entry in the learning dashboard; + * Updates or insert a generic data entry in the learning dashboard for a target user + * (if target user is not passed, current user will be considered); * * @param data Data to insert or update + * @targetUserId string representing the internal userId of the target user (Optional) */ - upsertData: UpsertDataFunction; + upsertUserData: UpsertUserDataFunction; /** - * Updates or insert a generic data entry in the learning dashboard; + * Deletes generic data entry for target user (if target user is not passed, + * current user will be considered). * * @param data Data to be deleted + * @targetUserId string representing the internal userId of the target user (Optional) + */ + deleteUserData: DeleteUserDataFunction; + /** + * Clears all Users Data for a specific plugin. (No arguments required) + * */ - deleteData: DeleteDataFunction; + clearAllUsersData: ClearUsersDataFunction; } From d37c682f4bd9068092b24826a04138c8f68d31d7 Mon Sep 17 00:00:00 2001 From: Guilherme Leme Date: Thu, 7 Aug 2025 16:14:07 -0300 Subject: [PATCH 5/8] [lad-new-functions-plugin] Created new function to clear LAD data --- src/core/api/BbbPluginSdk.ts | 11 ++++++++++- src/learning-analytics-dashboard/enums.ts | 1 + src/learning-analytics-dashboard/hooks.ts | 4 +++- src/learning-analytics-dashboard/types.ts | 4 ++-- 4 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/core/api/BbbPluginSdk.ts b/src/core/api/BbbPluginSdk.ts index 8584e047..c7d3f948 100644 --- a/src/core/api/BbbPluginSdk.ts +++ b/src/core/api/BbbPluginSdk.ts @@ -46,7 +46,12 @@ import { useUiData } from '../../ui-data/hooks/hooks'; import { UseMeetingFunction } from '../../data-consumption/domain/meeting/from-core/types'; import { useMeeting } from '../../data-consumption/domain/meeting/from-core/hooks'; import { serverCommands } from '../../server-commands/commands'; -import { deleteUserData, sendGenericDataForLearningAnalyticsDashboard, upsertUserData } from '../../learning-analytics-dashboard/hooks'; +import { + clearAllUsersData, + deleteUserData, + sendGenericDataForLearningAnalyticsDashboard, + upsertUserData, +} from '../../learning-analytics-dashboard/hooks'; import { GenericDataForLearningAnalyticsDashboard } from '../../learning-analytics-dashboard/types'; import { getRemoteData } from '../../remote-data/utils'; import { persistEventFunctionWrapper } from '../../event-persistence/hooks'; @@ -142,6 +147,10 @@ export abstract class BbbPluginSdk { pluginName, targetUserId, ), + clearAllUsersData: (cardTitle?: string) => clearAllUsersData( + pluginName, + cardTitle, + ), }; pluginApi.getRemoteData = ( dataSourceName: string, diff --git a/src/learning-analytics-dashboard/enums.ts b/src/learning-analytics-dashboard/enums.ts index cc3f098f..e229c343 100644 --- a/src/learning-analytics-dashboard/enums.ts +++ b/src/learning-analytics-dashboard/enums.ts @@ -2,4 +2,5 @@ export enum LearningAnalyticsDashboardEvents { GENERIC_DATA_SENT = 'GENERIC_DATA_FOR_LEARNING_ANALYTICS_DASHBOARD_SENT', UPSERT_USER_DATA_COMMAND_SENT = 'UPSERT_USER_DATA_COMMAND_FOR_LEARNING_ANALYTICS_DASHBOARD_SENT', DELETE_USER_DATA_COMMAND_SENT = 'DELETE_USER_DATA_COMMAND_FOR_LEARNING_ANALYTICS_DASHBOARD_SENT', + CLEAR_ALL_USERS_DATA_COMMAND_SENT = 'CLEAR_ALL_USERS_DATA_COMMAND_SENT_COMMAND_FOR_LEARNING_ANALYTICS_DASHBOARD_SENT', } diff --git a/src/learning-analytics-dashboard/hooks.ts b/src/learning-analytics-dashboard/hooks.ts index 1485b661..c7bf6b2b 100644 --- a/src/learning-analytics-dashboard/hooks.ts +++ b/src/learning-analytics-dashboard/hooks.ts @@ -64,14 +64,16 @@ export const deleteUserData = ( export const clearAllUsersData = ( pluginName: string, + cardTitle?: string, ) => { window.dispatchEvent( new CustomEvent< ClearLearningAnalyticsDashboardEventDetails>( - LearningAnalyticsDashboardEvents.DELETE_USER_DATA_COMMAND_SENT, + LearningAnalyticsDashboardEvents.CLEAR_ALL_USERS_DATA_COMMAND_SENT, { detail: { pluginName, + cardTitle, }, }, ), diff --git a/src/learning-analytics-dashboard/types.ts b/src/learning-analytics-dashboard/types.ts index cb666d8b..139e93cc 100644 --- a/src/learning-analytics-dashboard/types.ts +++ b/src/learning-analytics-dashboard/types.ts @@ -31,7 +31,7 @@ export type DeleteUserDataFunction = ( targetUserId?: string, ) => void; -export type ClearUsersDataFunction = () => void; +export type ClearUsersDataFunction = (cardTitle?: string) => void; // General typing. export interface LearningAnalyticsDashboardEventDetails { @@ -43,6 +43,7 @@ export interface LearningAnalyticsDashboardEventDetails { export interface ClearLearningAnalyticsDashboardEventDetails { pluginName: string; + cardTitle?: string; } export interface LearningAnalyticsDashboardWrapperObject { @@ -64,7 +65,6 @@ export interface LearningAnalyticsDashboardWrapperObject { deleteUserData: DeleteUserDataFunction; /** * Clears all Users Data for a specific plugin. (No arguments required) - * */ clearAllUsersData: ClearUsersDataFunction; } From 87c9a26bf420cf289978676b5315c4c5b8c55dac Mon Sep 17 00:00:00 2001 From: Guilherme Leme Date: Thu, 7 Aug 2025 17:16:49 -0300 Subject: [PATCH 6/8] [lad-new-functions-plugin] updated documentation --- README.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index f90ac235..6ecb9419 100644 --- a/README.md +++ b/README.md @@ -464,6 +464,7 @@ It's an object available in the `pluginApi` that wraps those 2 functions: - `pluginApi.learningAnalyticsDashboard.upsertUserData` - `pluginApi.learningAnalyticsDashboard.deleteUserData` +- `pluginApi.learningAnalyticsDashboard.clearAllUsersData` For the `upsert` function, the argument's data object structure must be: @@ -484,7 +485,9 @@ interface LearningAnalyticsDashboardDeleteUserData { } ``` -And if the user is a moderator, there is the possibility to publish data on behalf of other users by using the second **optional** parameter named `targetUserId` +For the `clearAllUsersData` function, the argument is the cardTitle (optionally), and when it's not sent, all the entries for a specific plugin will be deleted. (And if the card ends up empty, it will be removed) + +If the user is a moderator, there is the possibility to publish data on behalf of other users by using the second **optional** parameter named `targetUserId` So that the data will appear in the following form: @@ -513,6 +516,10 @@ pluginApi.learningAnalyticsDashboard.deleteUserData( }, targetUserId, ); + +pluginApi.learningAnalyticsDashboard.clearAllUsersData(columnTitle); + +pluginApi.learningAnalyticsDashboard.clearAllUsersData(); // Or without the Column Title ``` Note 1: the `value` field (in the upsert function's argument) supports markdown, so feel free to use it as you wish. From 884cb80930aa95eb2012499c6fdc8a6f2837016e Mon Sep 17 00:00:00 2001 From: Guilherme Leme Date: Wed, 20 Aug 2025 11:54:27 -0300 Subject: [PATCH 7/8] [lad-new-functions-plugin] rename hooks file to commands file. --- src/core/api/BbbPluginSdk.ts | 2 +- src/learning-analytics-dashboard/{hooks.ts => commands.ts} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename src/learning-analytics-dashboard/{hooks.ts => commands.ts} (100%) diff --git a/src/core/api/BbbPluginSdk.ts b/src/core/api/BbbPluginSdk.ts index c7d3f948..3fe568fa 100644 --- a/src/core/api/BbbPluginSdk.ts +++ b/src/core/api/BbbPluginSdk.ts @@ -51,7 +51,7 @@ import { deleteUserData, sendGenericDataForLearningAnalyticsDashboard, upsertUserData, -} from '../../learning-analytics-dashboard/hooks'; +} from '../../learning-analytics-dashboard/commands'; import { GenericDataForLearningAnalyticsDashboard } from '../../learning-analytics-dashboard/types'; import { getRemoteData } from '../../remote-data/utils'; import { persistEventFunctionWrapper } from '../../event-persistence/hooks'; diff --git a/src/learning-analytics-dashboard/hooks.ts b/src/learning-analytics-dashboard/commands.ts similarity index 100% rename from src/learning-analytics-dashboard/hooks.ts rename to src/learning-analytics-dashboard/commands.ts From f9550105f9635782c4336c5985df025411d492f5 Mon Sep 17 00:00:00 2001 From: Guilherme Leme Date: Wed, 17 Dec 2025 09:14:41 -0300 Subject: [PATCH 8/8] [lad-new-functions-plugin] fixed documentation --- README.md | 2 +- src/core/api/types.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 6ecb9419..2692e51c 100644 --- a/README.md +++ b/README.md @@ -460,7 +460,7 @@ So the idea is that we have a `uiCommands` object and at a point, there will be This integration allow you to insert/update entry in LAD (Learning Analytics Dashboard) via `upsertUserData` function and also delete entries via `deleteUserData` function. -It's an object available in the `pluginApi` that wraps those 2 functions: +It's an object available in the `pluginApi` that wraps those 3 functions: - `pluginApi.learningAnalyticsDashboard.upsertUserData` - `pluginApi.learningAnalyticsDashboard.deleteUserData` diff --git a/src/core/api/types.ts b/src/core/api/types.ts index 9709e47d..24c19b3f 100644 --- a/src/core/api/types.ts +++ b/src/core/api/types.ts @@ -287,7 +287,7 @@ export interface PluginApi { */ useLocaleMessages?: UseLocaleMessagesFunction /** - * @deprecated Use {@link learningAnalyticsDashboard.upsertGenericData} object instead. + * @deprecated Use {@link learningAnalyticsDashboard.upsertUserData} object instead. * * Send data to the Learning analytics dashboard *