diff --git a/entity/CampaignParticipant_entity/CampaignParticipant_entity.aod b/entity/CampaignParticipant_entity/CampaignParticipant_entity.aod index 47b0a2253721888ace0a233eb08692be82c179b5..c83cda0bd567d2bf66cf349b78e2ea0ba307de42 100644 --- a/entity/CampaignParticipant_entity/CampaignParticipant_entity.aod +++ b/entity/CampaignParticipant_entity/CampaignParticipant_entity.aod @@ -22,20 +22,6 @@ <name>CampaignParticipantsProvider</name> <documentation>%aditoprj%/entity/CampaignParticipant_entity/entityfields/campaignparticipantsprovider/documentation.adoc</documentation> <recordContainer>db</recordContainer> - <dependencies> - <entityDependency> - <name>f28945cd-4613-4dfa-91f7-a7d9d64cef58</name> - <entityName>Campaign_entity</entityName> - <fieldName>CampaignParticipants</fieldName> - <isConsumer v="false" /> - </entityDependency> - <entityDependency> - <name>7ad08378-b36f-4512-8891-db727c6ddcd7</name> - <entityName>CampaignStep_entity</entityName> - <fieldName>CampaignParticipantsConsumer</fieldName> - <isConsumer v="false" /> - </entityDependency> - </dependencies> <children> <entityParameter> <name>ContactId_param</name> @@ -50,6 +36,20 @@ <expose v="true" /> </entityParameter> </children> + <dependencies> + <entityDependency> + <name>f28945cd-4613-4dfa-91f7-a7d9d64cef58</name> + <entityName>Campaign_entity</entityName> + <fieldName>CampaignParticipants</fieldName> + <isConsumer v="false" /> + </entityDependency> + <entityDependency> + <name>7ad08378-b36f-4512-8891-db727c6ddcd7</name> + <entityName>CampaignStep_entity</entityName> + <fieldName>CampaignParticipantsConsumer</fieldName> + <isConsumer v="false" /> + </entityDependency> + </dependencies> </entityProvider> <entityParameter> <name>CampaignStepId_param</name> @@ -144,11 +144,6 @@ <entityConsumer> <name>CampaignSteps</name> <refreshParent v="true" /> - <dependency> - <name>dependency</name> - <entityName>CampaignStep_entity</entityName> - <fieldName>CampaignSteps</fieldName> - </dependency> <children> <entityParameter> <name>campaignId_param</name> @@ -156,6 +151,11 @@ <expose v="true" /> </entityParameter> </children> + <dependency> + <name>dependency</name> + <entityName>CampaignStep_entity</entityName> + <fieldName>CampaignSteps</fieldName> + </dependency> </entityConsumer> <entityField> <name>CONTACTCONTEXT</name> @@ -203,17 +203,17 @@ </entityConsumer> <entityConsumer> <name>CommRestrictionIcon</name> - <dependency> - <name>dependency</name> - <entityName>KeywordAttribute_entity</entityName> - <fieldName>SpecificContainerKeyword</fieldName> - </dependency> <children> <entityParameter> <name>ContainerName_param</name> <valueProcess>%aditoprj%/entity/CampaignParticipant_entity/entityfields/commrestrictionicon/children/containername_param/valueProcess.js</valueProcess> </entityParameter> </children> + <dependency> + <name>dependency</name> + <entityName>KeywordAttribute_entity</entityName> + <fieldName>SpecificContainerKeyword</fieldName> + </dependency> </entityConsumer> <entityField> <name>STANDARD_EMAIL_COMMUNICATION</name> @@ -271,7 +271,7 @@ </entityConsumer> <entityField> <name>RESPONSIBLE_CONTACT_ID</name> - <title>Verantwortlicher</title> + <title>Responsible</title> <consumer>ResponsibleEmployees</consumer> <groupable v="true" /> <linkedContext>Person</linkedContext> diff --git a/entity/Document_entity/entityfields/msteam/children/synchronizedocuments/stateProcess.js b/entity/Document_entity/entityfields/msteam/children/synchronizedocuments/stateProcess.js index f5e9edcd5d6225637cb7ad055c09e80799997070..0bd4c4c544c99f66a5a2ce914d8abd13910ad5c5 100644 --- a/entity/Document_entity/entityfields/msteam/children/synchronizedocuments/stateProcess.js +++ b/entity/Document_entity/entityfields/msteam/children/synchronizedocuments/stateProcess.js @@ -1,12 +1,7 @@ -import("Util_lib"); +import("MSTeams_lib"); import("system.vars"); import("system.neon"); import("system.result"); -import("Sql_lib"); -var isArchived = Utils.toBoolean(newSelect("IS_ARCHIVED") - .from("MST_TEAM") - .whereIfSet("MST_TEAM.MST_TEAMID", "$param.MSTTeamId_param") - .cell(true)); - -result.string(isArchived ? neon.COMPONENTSTATE_DISABLED : neon.COMPONENTSTATE_EDITABLE); \ No newline at end of file +var isEnabled = MSTeamsUtils.isTeamsEnabled() && MSTeamsUtils.isTeamActive(vars.get("$param.MSTTeamId_param")); +result.string(isEnabled ? neon.COMPONENTSTATE_EDITABLE : neon.COMPONENTSTATE_DISABLED); \ No newline at end of file diff --git a/entity/Member_entity/entityfields/msteamsactiongroup/children/addapp/onActionProcess.js b/entity/Member_entity/entityfields/msteamsactiongroup/children/addapp/onActionProcess.js index 826e42316f9b497e1a22f38b25f0bfcc420d7aba..f53cd7c87d173497b7b8fd5bcbb4ba4212bac637 100644 --- a/entity/Member_entity/entityfields/msteamsactiongroup/children/addapp/onActionProcess.js +++ b/entity/Member_entity/entityfields/msteamsactiongroup/children/addapp/onActionProcess.js @@ -3,5 +3,5 @@ import("system.project"); import("system.vars"); var appId = project.getInstanceConfigValue("teamsAppId", null); -if (appId != null) +if (appId) teams.addApp(vars.get("$param.MSTTeamId_param"), appId); \ No newline at end of file diff --git a/entity/Member_entity/entityfields/msteamsactiongroup/children/addapp/stateProcess.js b/entity/Member_entity/entityfields/msteamsactiongroup/children/addapp/stateProcess.js index 8c22d355887ba359f69c392d8671aa574cdc376d..f1febe96416f12e029c6de6537cf96e5c7f4d5db 100644 --- a/entity/Member_entity/entityfields/msteamsactiongroup/children/addapp/stateProcess.js +++ b/entity/Member_entity/entityfields/msteamsactiongroup/children/addapp/stateProcess.js @@ -5,27 +5,12 @@ import("system.result"); import("Sql_lib"); var res = neon.COMPONENTSTATE_DISABLED; -var teamId = vars.exists("$param.MSTTeamId_param") ? vars.get("$param.MSTTeamId_param") : null; +var teamId = vars.get("$param.MSTTeamId_param"); if (teamId && MSTeamsUtils.isTeamsEnabled()) { - var isArchived, serviceUrl; - var teamData = newSelect("IS_ARCHIVED, SERVICE_URL") - .from("MST_TEAM") - .whereIfSet("MST_TEAM.MST_TEAMID", teamId) - .arrayRow(true); - - if (teamData) - [isArchived, serviceUrl] = teamData; - - - if (isArchived == 1 || serviceUrl) - { - res = neon.COMPONENTSTATE_DISABLED; - } - else - { + var teamInfo = MSTeamsUtils.getTeamInfo(teamId); + if (teamInfo && !teamInfo.isArchived && !teamInfo.serviceUrl) res = neon.COMPONENTSTATE_EDITABLE; - } } result.string(res); \ No newline at end of file diff --git a/entity/Member_entity/entityfields/msteamsactiongroup/children/deleteteam/stateProcess.js b/entity/Member_entity/entityfields/msteamsactiongroup/children/deleteteam/stateProcess.js index ff7327ea21424cb3394d6d204c49cc42d49296da..dcaec1cc02ac3718197fd77a80e966630bdc0e1d 100644 --- a/entity/Member_entity/entityfields/msteamsactiongroup/children/deleteteam/stateProcess.js +++ b/entity/Member_entity/entityfields/msteamsactiongroup/children/deleteteam/stateProcess.js @@ -2,30 +2,14 @@ import("MSTeams_lib"); import("system.vars"); import("system.neon"); import("system.result"); -import("Sql_lib"); var res = neon.COMPONENTSTATE_DISABLED; -var teamId = vars.exists("$param.MSTTeamId_param") ? vars.get("$param.MSTTeamId_param") : null; +var teamId = vars.get("$param.MSTTeamId_param"); if (teamId && MSTeamsUtils.isTeamsEnabled()) { - var isArchived, serviceUrl; - var teamData = newSelect("IS_ARCHIVED, SERVICE_URL") - .from("MST_TEAM") - .whereIfSet("MST_TEAM.MST_TEAMID", teamId) - .arrayRow(true); - - if (teamData) - [isArchived, serviceUrl] = teamData; - - - if (isArchived == 1 || serviceUrl || !MSTeamsUtils.isUserTeamOwner(teamId)) - { - res = neon.COMPONENTSTATE_DISABLED; - } - else - { + var teamInfo = MSTeamsUtils.getTeamInfo(teamId); + if (teamInfo && !teamInfo.isArchived && !teamInfo.serviceUrl && MSTeamsUtils.isUserTeamOwner(teamId)) res = neon.COMPONENTSTATE_EDITABLE; - } } result.string(res); \ No newline at end of file diff --git a/entity/Member_entity/entityfields/msteamsactiongroup/children/editteam/stateProcess.js b/entity/Member_entity/entityfields/msteamsactiongroup/children/editteam/stateProcess.js index 19d44a29c7aa78d785175ef6ea98d680670f97d2..7aa4197a0d2f1be51667f68696e2ecf18cbf3bc1 100644 --- a/entity/Member_entity/entityfields/msteamsactiongroup/children/editteam/stateProcess.js +++ b/entity/Member_entity/entityfields/msteamsactiongroup/children/editteam/stateProcess.js @@ -2,30 +2,12 @@ import("MSTeams_lib"); import("system.vars"); import("system.neon"); import("system.result"); -import("Sql_lib"); var res = neon.COMPONENTSTATE_DISABLED; -var teamId = vars.exists("$param.MSTTeamId_param") ? vars.get("$param.MSTTeamId_param") : null; -if (teamId && MSTeamsUtils.isTeamsEnabled()) -{ - var isArchived, serviceUrl; - var teamData = newSelect("IS_ARCHIVED, SERVICE_URL") - .from("MST_TEAM") - .whereIfSet("MST_TEAM.MST_TEAMID", teamId) - .arrayRow(true); - - if (teamData) - [isArchived, serviceUrl] = teamData; - - - if (isArchived == 1 || !MSTeamsUtils.isUserTeamOwner(teamId)) - { - res = neon.COMPONENTSTATE_DISABLED; - } - else - { - res = neon.COMPONENTSTATE_EDITABLE; - } +var teamId = vars.get("$param.MSTTeamId_param"); +if (teamId && MSTeamsUtils.isTeamsEnabled() && MSTeamsUtils.isTeamActive(teamId) && MSTeamsUtils.isUserTeamOwner(teamId)) +{ + res = neon.COMPONENTSTATE_EDITABLE; } result.string(res); \ No newline at end of file diff --git a/entity/Member_entity/entityfields/msteamsactiongroup/children/openmsteams/onActionProcess.js b/entity/Member_entity/entityfields/msteamsactiongroup/children/openmsteams/onActionProcess.js index 19f20d51a62115ea00b95eba76f5c733eccddea5..dd6293385c56357965b6ddd53fa1f5611b6bcf72 100644 --- a/entity/Member_entity/entityfields/msteamsactiongroup/children/openmsteams/onActionProcess.js +++ b/entity/Member_entity/entityfields/msteamsactiongroup/children/openmsteams/onActionProcess.js @@ -1,11 +1,8 @@ -import("Sql_lib"); +import("MSTeams_lib"); import("system.vars"); import("system.neon"); -var webUrl = newSelect("WEB_URL") - .from("MST_TEAM") - .whereIfSet("MST_TEAM.MST_TEAMID", "$param.MSTTeamId_param") - .cell(true); +var teamInfo = MSTeamsUtils.getTeamInfo(vars.get("$param.MSTTeamId_param")); -if (webUrl) - neon.openUrl(webUrl, true); +if (teamInfo && teamInfo.webUrl) + neon.openUrl(teamInfo.webUrl, true); diff --git a/entity/Member_entity/entityfields/msteamsactiongroup/children/openmsteams/stateProcess.js b/entity/Member_entity/entityfields/msteamsactiongroup/children/openmsteams/stateProcess.js index 43b7cdd5eadeb6f287b2e2d24f3391c91360ee68..ce25c1feb1a1c2247dc19707bd447b5096e04184 100644 --- a/entity/Member_entity/entityfields/msteamsactiongroup/children/openmsteams/stateProcess.js +++ b/entity/Member_entity/entityfields/msteamsactiongroup/children/openmsteams/stateProcess.js @@ -5,22 +5,10 @@ import("system.result"); import("Sql_lib"); var res = neon.COMPONENTSTATE_DISABLED; -var teamId = vars.exists("$param.MSTTeamId_param") ? vars.get("$param.MSTTeamId_param") : null; -if (teamId && MSTeamsUtils.isTeamsEnabled()) +var teamId = vars.get("$param.MSTTeamId_param"); +if (teamId && MSTeamsUtils.isTeamsEnabled() && MSTeamsUtils.isTeamActive(teamId)) { - var isArchived = newSelect("IS_ARCHIVED") - .from("MST_TEAM") - .whereIfSet("MST_TEAM.MST_TEAMID", teamId) - .cell(true); - - if (isArchived == 1) - { - res = neon.COMPONENTSTATE_DISABLED; - } - else - { - res = neon.COMPONENTSTATE_EDITABLE; - } + res = neon.COMPONENTSTATE_EDITABLE; } result.string(res); \ No newline at end of file diff --git a/entity/Member_entity/entityfields/msteamsactiongroup/children/restoreteam/stateProcess.js b/entity/Member_entity/entityfields/msteamsactiongroup/children/restoreteam/stateProcess.js index f6f0a5da09790cfe007d834b76e59a4397c0355e..45ca08b1622ea01f75c5029fbb125be25fba87c5 100644 --- a/entity/Member_entity/entityfields/msteamsactiongroup/children/restoreteam/stateProcess.js +++ b/entity/Member_entity/entityfields/msteamsactiongroup/children/restoreteam/stateProcess.js @@ -5,27 +5,12 @@ import("system.result"); import("Sql_lib"); var res = neon.COMPONENTSTATE_DISABLED; -var teamId = vars.exists("$param.MSTTeamId_param") ? vars.get("$param.MSTTeamId_param") : null; +var teamId = vars.get("$param.MSTTeamId_param"); if (teamId && MSTeamsUtils.isTeamsEnabled()) -{ - var isArchived, serviceUrl; - var teamData = newSelect("IS_ARCHIVED, SERVICE_URL") - .from("MST_TEAM") - .whereIfSet("MST_TEAM.MST_TEAMID", teamId) - .arrayRow(true); - - if (teamData) - [isArchived, serviceUrl] = teamData; - - - if (isArchived == 0) - { - res = neon.COMPONENTSTATE_DISABLED; - } - else - { +{ + var teamInfo = MSTeamsUtils.getTeamInfo(teamId); + if (teamInfo && teamInfo.isArchived) res = neon.COMPONENTSTATE_EDITABLE; - } } result.string(res); \ No newline at end of file diff --git a/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod b/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod index 6e143f7c08f9f480a085ba81023ca54c98b26082..fe22a9591a17181e4dea12575af148e7ca1e07d4 100644 --- a/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod +++ b/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod @@ -7566,6 +7566,12 @@ <entry> <key>Exports the knowledge entry as a html file</key> </entry> + <entry> + <key>The max participants count can not be equal or less then 0</key> + </entry> + <entry> + <key>Illegal Parent Operator in buildFilterObj-Function:</key> + </entry> </keyValueMap> <font name="Dialog" style="0" size="11" /> <sqlModels> diff --git a/language/_____LANGUAGE_en/_____LANGUAGE_en.aod b/language/_____LANGUAGE_en/_____LANGUAGE_en.aod index 867c0450057feccad79678709728ae32f38fc452..eaad07dadb7c4840ff4ff363402878d1e732ad38 100644 --- a/language/_____LANGUAGE_en/_____LANGUAGE_en.aod +++ b/language/_____LANGUAGE_en/_____LANGUAGE_en.aod @@ -7647,6 +7647,12 @@ <entry> <key>Exports the knowledge entry as a html file</key> </entry> + <entry> + <key>The max participants count can not be equal or less then 0</key> + </entry> + <entry> + <key>Illegal Parent Operator in buildFilterObj-Function:</key> + </entry> </keyValueMap> <font name="Dialog" style="0" size="11" /> </language> diff --git a/neonView/CampaignCostChart_view/CampaignCostChart_view.aod b/neonView/CampaignCostChart_view/CampaignCostChart_view.aod index 9c8daa4a4eb3d5133e1831909f0c9f0c7b9712f8..24159367f94612a4b7887229f13a811a9d4c1acc 100644 --- a/neonView/CampaignCostChart_view/CampaignCostChart_view.aod +++ b/neonView/CampaignCostChart_view/CampaignCostChart_view.aod @@ -5,7 +5,7 @@ <dashletConfigurations> <neonDashletConfiguration> <name>CampaignCostsChart</name> - <title>Campaign costs</title> + <title>Campaign Costs</title> <description>Shows campaing costs graphically processed</description> <fragment>Campaign/full</fragment> <singleton v="true" /> diff --git a/neonView/CampaignFilter_view/CampaignFilter_view.aod b/neonView/CampaignFilter_view/CampaignFilter_view.aod index 0dcb198305db9a4021ace200c99df40b0018904d..4d7c3aac1c158be044fc069bf96cff0cf4c12a3c 100644 --- a/neonView/CampaignFilter_view/CampaignFilter_view.aod +++ b/neonView/CampaignFilter_view/CampaignFilter_view.aod @@ -8,7 +8,7 @@ <dashletConfigurations> <neonDashletConfiguration> <name>CurrentUsersOwnedCampaigns</name> - <title>My campaigns</title> + <title>My Campaigns</title> <description>Show my campaigns</description> <fragment>Campaign/filter</fragment> <singleton v="true" /> diff --git a/process/MSTeams_lib/process.js b/process/MSTeams_lib/process.js index 16d41e7efaf86b7f58b7cb80be742348ea1696c4..95db6db28b0c7e5b1fe7ff3542b3b47408337678 100644 --- a/process/MSTeams_lib/process.js +++ b/process/MSTeams_lib/process.js @@ -195,7 +195,10 @@ MSTeamsUtils.getLinkedTeam = function (pRowId, pObjectType) } /** + * Loads the contactIds associated with the given azureIds * + * @param {String[]} pAzureIds azureIds of the users + * @return {Object} object with the azureIds as keys and the corresponding contactIds as values */ MSTeamsUtils.getContactIdsByAzureIds = function (pAzureIds) { @@ -213,21 +216,32 @@ MSTeamsUtils.getContactIdsByAzureIds = function (pAzureIds) } /** + * Generates a sql expression to resolve the roles in a team for the contacts * + * @param {String} pTeamId id of the team + * @param {String} pContactIdField sql field that contains the contactId that is used for selecting the role + * @return {String} sql expression */ MSTeamsUtils.getTeamRoleSubSql = function (pTeamId, pContactIdField) { if (!pTeamId) return "''"; - var ownerIds = Object.keys(teams.getAllOwners(pTeamId)); - var ownerContactIds = MSTeamsUtils.getContactIdsByAzureIds(ownerIds); - ownerContactIds = Utils.objectValues(ownerContactIds); - - var members = teams.getAllMembers(pTeamId); - var memberIds = Object.keys(members); - var memberContactIds = MSTeamsUtils.getContactIdsByAzureIds(memberIds); - memberContactIds = Utils.objectValues(memberContactIds); + try { + var ownerIds = Object.keys(teams.getAllOwners(pTeamId)); + var ownerContactIds = MSTeamsUtils.getContactIdsByAzureIds(ownerIds); + ownerContactIds = Utils.objectValues(ownerContactIds); + + var members = teams.getAllMembers(pTeamId); + var memberIds = Object.keys(members); + var memberContactIds = MSTeamsUtils.getContactIdsByAzureIds(memberIds); + memberContactIds = Utils.objectValues(memberContactIds); + } + catch (err) + { + logging.log(err, logging.ERROR); + return "''"; + } if (ownerContactIds.length === 0 && memberContactIds.length === 0) return "''"; @@ -246,7 +260,11 @@ MSTeamsUtils.getTeamRoleSubSql = function (pTeamId, pContactIdField) } /** + * Checks if the user is an owner of the team * + * @param {String} pTeamId the id of the team + * @param {String} [pUserId=current user] the userId of the user + * @return {Boolean} true if the user is an owner */ MSTeamsUtils.isUserTeamOwner = function (pTeamId, pUserId) { @@ -259,4 +277,50 @@ MSTeamsUtils.isUserTeamOwner = function (pTeamId, pUserId) if (!user) return false; return user[tools.PARAMS][tools.TEAMS_AZUREID] in teams.getAllOwners(pTeamId); +} + +/** + * Loads the properties of the team from the database. + * + * @param {String} pTeamId the id of the team + * @return {Object} Object with these properties: + * <ul> + * <li>teamName</li> + * <li>webUrl</li> + * <li>serviceUrl</li> + * <li>isArchived</li> + * <li>generalChannelId</li> + * </ul> + * If the team was not found, null is returned. + */ +MSTeamsUtils.getTeamInfo = function (pTeamId) +{ + var teamInfo = new SqlBuilder("Data_alias") + .select(["TEAMNAME", "WEB_URL", "SERVICE_URL", "IS_ARCHIVED", "GENERAL_CHANNELID"]) + .from("MST_TEAM") + .whereIfSet("MST_TEAM.MST_TEAMID", pTeamId) + .arrayRow(true); + + if (teamInfo.length === 0) + return null; + + return { + teamName: teamInfo[0], + webUrl: teamInfo[1], + serviceUrl: teamInfo[2], + isArchived: Utils.toBoolean(teamInfo[3]), + generalChannelId: teamInfo[4] + }; +} + +/** + * Checks if the team is active + * + * @param {String} pTeamId the id of the team + * @return {Boolean} true, if the team exists and is not archived + */ +MSTeamsUtils.isTeamActive = function (pTeamId) +{ + var teamInfo = MSTeamsUtils.getTeamInfo(pTeamId); + return teamInfo != null && !teamInfo.isArchived; } \ No newline at end of file