diff --git a/.liquibase/Data_alias/basic/2019.1.4/Salesprojectmilestone_add_parent.xml b/.liquibase/Data_alias/basic/2019.1.4/Salesprojectmilestone_add_parent.xml new file mode 100644 index 0000000000000000000000000000000000000000..8e47cb4925bb3a7a4e714f74364e8a8fbe39d64d --- /dev/null +++ b/.liquibase/Data_alias/basic/2019.1.4/Salesprojectmilestone_add_parent.xml @@ -0,0 +1,8 @@ +<?xml version="1.1" encoding="UTF-8" standalone="no"?> +<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd"> + <changeSet author="m.mansour" id="33eeb249-49e8-4304-90f7-d188179b4f81"> + <addColumn tableName="SALESPROJECT_MILESTONE"> + <column name="PARENT_ID" type="CHAR(36)"/> + </addColumn> + </changeSet> +</databaseChangeLog> \ No newline at end of file diff --git a/.liquibase/Data_alias/basic/2019.1.4/changelog.xml b/.liquibase/Data_alias/basic/2019.1.4/changelog.xml index c4533ded9096b14e80c1fc7dabdb8a54530db0dc..4069900e1fe53b9a32b4ad33a934295d2019d7c0 100644 --- a/.liquibase/Data_alias/basic/2019.1.4/changelog.xml +++ b/.liquibase/Data_alias/basic/2019.1.4/changelog.xml @@ -169,4 +169,6 @@ <include relativeToChangelogFile="true" file="update_Keyword_Essentials.xml"/> <include relativeToChangelogFile="true" file="Salesproject_Phase_icons.xml"/> + + <include relativeToChangelogFile="true" file="Salesprojectmilestone_add_parent.xml"/> </databaseChangeLog> diff --git a/aliasDefinition/Data_alias/Data_alias.aod b/aliasDefinition/Data_alias/Data_alias.aod index baa669c2022589903136cce68f98ef609791fd19..bd9c2644864f4c579b35fbaa4664818b01735f5b 100644 --- a/aliasDefinition/Data_alias/Data_alias.aod +++ b/aliasDefinition/Data_alias/Data_alias.aod @@ -7865,6 +7865,20 @@ <title>Salesproject milestone Id</title> <description></description> </entityFieldDb> + <entityFieldDb> + <name>PARENT_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> </entityFields> </entityDb> <entityDb> diff --git a/entity/Activity_entity/Activity_entity.aod b/entity/Activity_entity/Activity_entity.aod index 40b966dcea0559b9cd6e9e2ab6d84db718f9db5d..c6e7347ac673140a29509b5b733fa7102f3c33c6 100644 --- a/entity/Activity_entity/Activity_entity.aod +++ b/entity/Activity_entity/Activity_entity.aod @@ -285,8 +285,8 @@ <entityParameter> <name>ID_param</name> <valueProcess>%aditoprj%/entity/Activity_entity/entityfields/moduletrees/children/id_param/valueProcess.js</valueProcess> - <expose v="false" /> - <mandatory v="false" /> + <expose v="true" /> + <mandatory v="true" /> </entityParameter> </children> </entityConsumer> @@ -453,6 +453,19 @@ </entityParameter> </children> </entityConsumer> + <entityActionField> + <name>newSupportticket</name> + <title>New Supportticket</title> + <onActionProcess>%aditoprj%/entity/Activity_entity/entityfields/newsupportticket/onActionProcess.js</onActionProcess> + <iconId>VAADIN:QUESTION</iconId> + </entityActionField> + <entityActionField> + <name>openAdminView</name> + <title>Open admin view</title> + <onActionProcess>%aditoprj%/entity/Activity_entity/entityfields/openadminview/onActionProcess.js</onActionProcess> + <iconId>VAADIN:CURLY_BRACKETS</iconId> + <stateProcess>%aditoprj%/entity/Activity_entity/entityfields/openadminview/stateProcess.js</stateProcess> + </entityActionField> </entityFields> <recordContainers> <dbRecordContainer> diff --git a/entity/Activity_entity/entityfields/newsupportticket/onActionProcess.js b/entity/Activity_entity/entityfields/newsupportticket/onActionProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..6bcfaddd9b44df49ff440fca43cfec2d19cd5958 --- /dev/null +++ b/entity/Activity_entity/entityfields/newsupportticket/onActionProcess.js @@ -0,0 +1,6 @@ +import("system.vars"); +import("ActivityTask_lib"); +import("Context_lib"); +import("Ticket_lib") + +TicketUtils.createNewTicket(undefined, undefined, ContextUtils.getCurrentContextId(), vars.get("$field.ACTIVITYID")) \ No newline at end of file diff --git a/entity/Activity_entity/entityfields/openadminview/onActionProcess.js b/entity/Activity_entity/entityfields/openadminview/onActionProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..2421bcf840468a2ac89ea751cec95d99dea8c1a9 --- /dev/null +++ b/entity/Activity_entity/entityfields/openadminview/onActionProcess.js @@ -0,0 +1,11 @@ +import("system.vars"); +import("Context_lib"); + +AdminViewUtils.open("ACTIVITYID", [ + ["PARENT_ID", vars.get("$field.PARENT_ID")], + ["PARENT_CONTEXT", vars.get("$field.PARENT_CONTEXT")], + ["DATE_NEW", vars.get("$field.DATE_NEW")], + ["DATE_EDIT", vars.get("$field.DATE_EDIT")], + ["USER_NEW", vars.get("$field.USER_NEW")], + ["USER_EDIT", vars.get("$field.USER_EDIT")] +]); \ No newline at end of file diff --git a/entity/Activity_entity/entityfields/openadminview/stateProcess.js b/entity/Activity_entity/entityfields/openadminview/stateProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..38f2298db7304b4d44a15fbad7f720558c02da99 --- /dev/null +++ b/entity/Activity_entity/entityfields/openadminview/stateProcess.js @@ -0,0 +1,4 @@ +import("Context_lib"); +import("system.result"); + +result.string(AdminViewUtils.getActionState()); \ No newline at end of file diff --git a/entity/AdminViewRow_entity/AdminViewRow_entity.aod b/entity/AdminViewRow_entity/AdminViewRow_entity.aod new file mode 100644 index 0000000000000000000000000000000000000000..eeccc7e11713b48aa8be18b4690ee35520c0b605 --- /dev/null +++ b/entity/AdminViewRow_entity/AdminViewRow_entity.aod @@ -0,0 +1,60 @@ +<?xml version="1.0" encoding="UTF-8"?> +<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.9" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.9"> + <name>AdminViewRow_entity</name> + <majorModelMode>DISTRIBUTED</majorModelMode> + <recordContainer>jdito</recordContainer> + <entityFields> + <entityProvider> + <name>#PROVIDER</name> + </entityProvider> + <entityField> + <name>UID</name> + </entityField> + <entityField> + <name>TITLE</name> + </entityField> + <entityField> + <name>VALUE</name> + <contentTypeProcess>%aditoprj%/entity/AdminViewRow_entity/entityfields/value/contentTypeProcess.js</contentTypeProcess> + </entityField> + <entityParameter> + <name>Rows_param</name> + <expose v="true" /> + <mandatory v="true" /> + </entityParameter> + <entityProvider> + <name>AdminViewRows</name> + <dependencies> + <entityDependency> + <name>b5788fdf-1c82-45e2-8545-994c5e515476</name> + <entityName>DefaultAdminView_entity</entityName> + <fieldName>Rows</fieldName> + <isConsumer v="false" /> + </entityDependency> + </dependencies> + </entityProvider> + <entityField> + <name>CONTENTTYPE</name> + </entityField> + </entityFields> + <recordContainers> + <jDitoRecordContainer> + <name>jdito</name> + <contentProcess>%aditoprj%/entity/AdminViewRow_entity/recordcontainers/jdito/contentProcess.js</contentProcess> + <recordFieldMappings> + <jDitoRecordFieldMapping> + <name>UID.value</name> + </jDitoRecordFieldMapping> + <jDitoRecordFieldMapping> + <name>TITLE.value</name> + </jDitoRecordFieldMapping> + <jDitoRecordFieldMapping> + <name>VALUE.value</name> + </jDitoRecordFieldMapping> + <jDitoRecordFieldMapping> + <name>CONTENTTYPE.value</name> + </jDitoRecordFieldMapping> + </recordFieldMappings> + </jDitoRecordContainer> + </recordContainers> +</entity> diff --git a/entity/AdminViewRow_entity/entityfields/value/contentTypeProcess.js b/entity/AdminViewRow_entity/entityfields/value/contentTypeProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..00ce5cfd3a1e2ae3cb6fb4fce05d3c92ff62c41e --- /dev/null +++ b/entity/AdminViewRow_entity/entityfields/value/contentTypeProcess.js @@ -0,0 +1,4 @@ +import("system.vars"); +import("system.result"); + +result.string(vars.get("$field.CONTENTTYPE")); \ No newline at end of file diff --git a/entity/AdminViewRow_entity/recordcontainers/jdito/contentProcess.js b/entity/AdminViewRow_entity/recordcontainers/jdito/contentProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..1aa381774a2bfaf28ac963e84c63dda45cbf7192 --- /dev/null +++ b/entity/AdminViewRow_entity/recordcontainers/jdito/contentProcess.js @@ -0,0 +1,4 @@ +import("system.vars"); +import("system.result"); + +result.object(JSON.parse(vars.getString("$param.Rows_param"))); \ No newline at end of file diff --git a/entity/AnyContact_entity/contentTitleProcess.js b/entity/AnyContact_entity/contentTitleProcess.js index a3a5bff300afa4fefc933c828813d8c7cea08afb..40ed0f5ed1acdc67a9833d7c2855383cfd2edfa1 100644 --- a/entity/AnyContact_entity/contentTitleProcess.js +++ b/entity/AnyContact_entity/contentTitleProcess.js @@ -11,5 +11,5 @@ contact.firstname = vars.get("$field.PERSON_FIRSTNAME"); contact.middlename = vars.get("$field.PERSON_MIDDLENAME"); contact.lastname = vars.get("$field.PERSON_LASTNAME"); -var renderer = new ContactTitleRenderer(contact); +var renderer = new ContactTitleRenderer(contact, ContactTitleRenderer.OPTIONS.IncludeOrganisation); result.string(renderer.asString()); \ No newline at end of file diff --git a/entity/AttributeRelation_entity/recordcontainers/jdito/contentProcess.js b/entity/AttributeRelation_entity/recordcontainers/jdito/contentProcess.js index 82afab12a9f65c35207a6cbb1352a38c984cd0b8..c13cda25c21f4704cdc9e39fbf9b6e0843395c13 100644 --- a/entity/AttributeRelation_entity/recordcontainers/jdito/contentProcess.js +++ b/entity/AttributeRelation_entity/recordcontainers/jdito/contentProcess.js @@ -18,8 +18,9 @@ var showEmpty = vars.exists("$param.ShowEmpty_param") && vars.getString("$param. var displaySimpleName = vars.exists("$param.DisplaySimpleName_param") && vars.get("$param.DisplaySimpleName_param"); -var sqlCondition = new SqlCondition(); -var subCondition = new SqlCondition(); +var sqlCondition = new SqlCondition(); //where-condition (condition for the Attribute) +var joinCondition = new SqlCondition(); //condition for the joined values (for AttributeRelation) +//=> these are two distinct conditions because if showEmpty is true, a left join is used for the relations if (vars.exists("$local.idvalues") && vars.get("$local.idvalues")) { @@ -51,28 +52,29 @@ else if (showEmpty || rowId) { let filteredIds = JSON.parse(vars.getString("$param.FilteredAttributeIds_param")); - subCondition.clear(); + let filteredCondition = new SqlCondition(); let filteredIdChildren = AttributeUtil.getAllChildren(filteredIds); - subCondition.andIn("AB_ATTRIBUTE.AB_ATTRIBUTEID", filteredIdChildren); - subCondition.andPrepare("AB_ATTRIBUTE.ATTRIBUTE_TYPE", $AttributeTypes.COMBOVALUE, "# != ?") + filteredCondition.andIn("AB_ATTRIBUTE.AB_ATTRIBUTEID", filteredIdChildren); + filteredCondition.andPrepare("AB_ATTRIBUTE.ATTRIBUTE_TYPE", $AttributeTypes.COMBOVALUE, "# != ?") // return nothing if filteredAttributeIds is an empty array. (--> and 1=2) - sqlCondition.andSqlCondition(subCondition, "1=2"); + sqlCondition.andSqlCondition(filteredCondition, "1=2"); } } -var joinCondition = ""; + if (rowId) { - subCondition.andPrepare("AB_ATTRIBUTERELATION.OBJECT_ROWID", rowId); + joinCondition.andPrepare("AB_ATTRIBUTERELATION.OBJECT_ROWID", rowId); if (objectType != null) - subCondition.andPrepare("AB_ATTRIBUTERELATION.OBJECT_TYPE", objectType); - if (subCondition.isSet()) - joinCondition = " and " + db.translateCondition(subCondition.build("1=1")); + joinCondition.andPrepare("AB_ATTRIBUTERELATION.OBJECT_TYPE", objectType); + // add condition to match all returned by joins (override default 1=2 of build) sqlCondition.and("1=1"); } +joinCondition.and("AB_ATTRIBUTERELATION.AB_ATTRIBUTE_ID = AB_ATTRIBUTE.AB_ATTRIBUTEID"); + var defaultFields = [ "AB_ATTRIBUTERELATIONID", "AB_ATTRIBUTE.AB_ATTRIBUTEID", @@ -84,14 +86,19 @@ var defaultFields = [ ]; //these fields hold the attributeRelation value, depending on the attribute type var valueFields = AttributeTypeUtil.getAllDatabaseFields(); -var attributeSql = sqlCondition.buildSql("select " + defaultFields.join(", ") + ", " + valueFields.join(", ") - + " from AB_ATTRIBUTE " - + (showEmpty ? "left " : "") + "join AB_ATTRIBUTERELATION on AB_ATTRIBUTERELATION.AB_ATTRIBUTE_ID = AB_ATTRIBUTE.AB_ATTRIBUTEID " + joinCondition - + " left join AB_ATTRIBUTE COMBOVAL on " + $AttributeTypes.COMBO.databaseField + " = COMBOVAL.AB_ATTRIBUTEID" //for the view value of combobox attributes - , "1=2" -); - -var attributeValues = db.table(attributeSql).map(function (row) +var attributeSql = SqlBuilder.begin() + .select(defaultFields.concat(valueFields)) + .from("AB_ATTRIBUTE") + .where(sqlCondition); + +if (showEmpty) + attributeSql.leftJoin("AB_ATTRIBUTERELATION", joinCondition.build("1=2")); +else + attributeSql.join("AB_ATTRIBUTERELATION", joinCondition.build("1=2")); + +attributeSql.leftJoin("AB_ATTRIBUTE", "COMBOVAL.AB_ATTRIBUTEID = " + $AttributeTypes.COMBO.databaseField, "COMBOVAL"); + +var attributeValues = db.table(attributeSql.build()).map(function (row) { var attributeId = row[1]; var attributeName = translate.text(row[4]); @@ -149,4 +156,4 @@ function _fetchAttributes (pAttributeIds) if (nextIds.length) _fetchAttributes(nextIds); -} +} \ No newline at end of file diff --git a/entity/Attribute_entity/Attribute_entity.aod b/entity/Attribute_entity/Attribute_entity.aod index 8d5f1d9867c8c6421aa53602bcc874b865298fb1..9f785f0280bb0fa739fb2bceab6f87abeff79a64 100644 --- a/entity/Attribute_entity/Attribute_entity.aod +++ b/entity/Attribute_entity/Attribute_entity.aod @@ -329,6 +329,13 @@ <name>expanded</name> <valueProcess>%aditoprj%/entity/Attribute_entity/entityfields/expanded/valueProcess.js</valueProcess> </entityField> + <entityActionField> + <name>openAdminView</name> + <title>Open admin view</title> + <onActionProcess>%aditoprj%/entity/Attribute_entity/entityfields/openadminview/onActionProcess.js</onActionProcess> + <iconId>VAADIN:CURLY_BRACKETS</iconId> + <stateProcess>%aditoprj%/entity/Attribute_entity/entityfields/openadminview/stateProcess.js</stateProcess> + </entityActionField> </entityFields> <recordContainers> <jDitoRecordContainer> diff --git a/entity/Attribute_entity/entityfields/openadminview/onActionProcess.js b/entity/Attribute_entity/entityfields/openadminview/onActionProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..2405febf9b19c521aa76b395b28c7664d84e6357 --- /dev/null +++ b/entity/Attribute_entity/entityfields/openadminview/onActionProcess.js @@ -0,0 +1,6 @@ +import("system.vars"); +import("Context_lib"); + +AdminViewUtils.open("ATTRIBUTEID", [ + ["ATTRIBUTE_PARENT_ID", vars.get("$field.ATTRIBUTE_PARENT_ID")] +]); \ No newline at end of file diff --git a/entity/Attribute_entity/entityfields/openadminview/stateProcess.js b/entity/Attribute_entity/entityfields/openadminview/stateProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..38f2298db7304b4d44a15fbad7f720558c02da99 --- /dev/null +++ b/entity/Attribute_entity/entityfields/openadminview/stateProcess.js @@ -0,0 +1,4 @@ +import("Context_lib"); +import("system.result"); + +result.string(AdminViewUtils.getActionState()); \ No newline at end of file diff --git a/entity/BulkMailAddRecipients_entity/recordcontainers/jdito/onInsert.js b/entity/BulkMailAddRecipients_entity/recordcontainers/jdito/onInsert.js index 527bf07cc5f786bc9dbf18cd0747408362473f04..43e723ea8761fff4ee989456474714b411d667e1 100644 --- a/entity/BulkMailAddRecipients_entity/recordcontainers/jdito/onInsert.js +++ b/entity/BulkMailAddRecipients_entity/recordcontainers/jdito/onInsert.js @@ -28,4 +28,4 @@ for (let i = 0, l = contactIds.length; i < l; i++) { inserts.push(["BULKMAILRECIPIENT", columns, null, [util.getNewUUID(), bulkMailId, contactIds[i], $KeywordRegistry.bulkMailRecipientStatus$pending()]]); } -db.inserts(inserts); \ No newline at end of file +db.inserts(inserts); diff --git a/entity/BulkMailRecipient_entity/BulkMailRecipient_entity.aod b/entity/BulkMailRecipient_entity/BulkMailRecipient_entity.aod index 14ec8a459047d055534c8138b13812ec31da3a26..f6363bd4668cfd1e551dda17059854bc0a6d1bcb 100644 --- a/entity/BulkMailRecipient_entity/BulkMailRecipient_entity.aod +++ b/entity/BulkMailRecipient_entity/BulkMailRecipient_entity.aod @@ -78,6 +78,7 @@ </entityField> <entityField> <name>ICON</name> + <colorProcess>%aditoprj%/entity/BulkMailRecipient_entity/entityfields/icon/colorProcess.js</colorProcess> <contentType>IMAGE</contentType> <valueProcess>%aditoprj%/entity/BulkMailRecipient_entity/entityfields/icon/valueProcess.js</valueProcess> </entityField> @@ -94,6 +95,9 @@ <resolution>MINUTE</resolution> <outputFormat>dd.MM.yyyy HH:mm</outputFormat> </entityField> + <entityField> + <name>HASCOMMRESTRICTION</name> + </entityField> </entityFields> <recordContainers> <dbRecordContainer> @@ -134,10 +138,6 @@ <name>STATUS.value</name> <recordfield>BULKMAILRECIPIENT.STATUS</recordfield> </dbRecordFieldMapping> - <dbRecordFieldMapping> - <name>EMAIL_ADDRESS.displayValue</name> - <expression>%aditoprj%/entity/BulkMailRecipient_entity/recordcontainers/db/recordfieldmappings/email_address.displayvalue/expression.js</expression> - </dbRecordFieldMapping> <dbRecordFieldMapping> <name>ORGANISATION_ID.value</name> <recordfield>CONTACT.ORGANISATION_ID</recordfield> @@ -162,6 +162,14 @@ <name>CONTACT_ID.displayValue</name> <expression>%aditoprj%/entity/BulkMailRecipient_entity/recordcontainers/db/recordfieldmappings/contact_id.displayvalue/expression.js</expression> </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>HASCOMMRESTRICTION.value</name> + <expression>%aditoprj%/entity/BulkMailRecipient_entity/recordcontainers/db/recordfieldmappings/hascommrestriction.value/expression.js</expression> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>EMAIL_ADDRESS.value</name> + <expression>%aditoprj%/entity/BulkMailRecipient_entity/recordcontainers/db/recordfieldmappings/email_address.value/expression.js</expression> + </dbRecordFieldMapping> </recordFieldMappings> </dbRecordContainer> </recordContainers> diff --git a/entity/BulkMailRecipient_entity/entityfields/icon/colorProcess.js b/entity/BulkMailRecipient_entity/entityfields/icon/colorProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..f4a5d6a797f85b33b0d1d819d44e0015a28d24c9 --- /dev/null +++ b/entity/BulkMailRecipient_entity/entityfields/icon/colorProcess.js @@ -0,0 +1,6 @@ +import("system.vars"); +import("system.result"); +import("system.neon"); + +if (vars.get("$field.HASCOMMRESTRICTION") == "true" || !vars.get("$field.EMAIL_ADDRESS")) + result.string(neon.PRIORITY_HIGH_COLOR); \ No newline at end of file diff --git a/entity/BulkMailRecipient_entity/entityfields/icon/valueProcess.js b/entity/BulkMailRecipient_entity/entityfields/icon/valueProcess.js index 39145d32a6d62713f9ace17190890fe223f734f4..c67e7c5712da325df0f23f47eee957ce28a3ed54 100644 --- a/entity/BulkMailRecipient_entity/entityfields/icon/valueProcess.js +++ b/entity/BulkMailRecipient_entity/entityfields/icon/valueProcess.js @@ -4,7 +4,9 @@ import("Contact_lib"); var type = ContactUtils.getContactTypeByPersOrg(vars.get("$field.PERSON_ID"), vars.get("$field.ORGANISATION_ID")); var icon; -if (type == 1) +if (vars.get("$field.HASCOMMRESTRICTION") == "true") + icon = "VAADIN:BAN"; +else if (type == 1) icon = "VAADIN:BUILDING"; else if (type >= 2) icon = "VAADIN:USER"; diff --git a/entity/BulkMailRecipient_entity/recordcontainers/db/recordfieldmappings/email_address.displayvalue/expression.js b/entity/BulkMailRecipient_entity/recordcontainers/db/recordfieldmappings/email_address.value/expression.js similarity index 100% rename from entity/BulkMailRecipient_entity/recordcontainers/db/recordfieldmappings/email_address.displayvalue/expression.js rename to entity/BulkMailRecipient_entity/recordcontainers/db/recordfieldmappings/email_address.value/expression.js diff --git a/entity/BulkMailRecipient_entity/recordcontainers/db/recordfieldmappings/hascommrestriction.value/expression.js b/entity/BulkMailRecipient_entity/recordcontainers/db/recordfieldmappings/hascommrestriction.value/expression.js new file mode 100644 index 0000000000000000000000000000000000000000..6cc149b9f3bb9b42be4c06cb6c4666a8fa624653 --- /dev/null +++ b/entity/BulkMailRecipient_entity/recordcontainers/db/recordfieldmappings/hascommrestriction.value/expression.js @@ -0,0 +1,7 @@ +import("system.db"); +import("Bulkmail_lib"); +import("system.result"); + +var commRestrictionCond = BulkMailUtils.getCommRestrictionCondition(true).build(); +var sql = "case when (" + db.translateStatement(commRestrictionCond) + ") then 'true' else 'false' end"; +result.string(sql); diff --git a/entity/BulkMailRecipient_entity/recordcontainers/db/recordfieldmappings/status.displayvalue/expression.js b/entity/BulkMailRecipient_entity/recordcontainers/db/recordfieldmappings/status.displayvalue/expression.js index 92fb534f8ba741d4dacd9e69cfb9273085d8c684..3d19d9481e17454133e865bdadf7e04f3f6fb0fb 100644 --- a/entity/BulkMailRecipient_entity/recordcontainers/db/recordfieldmappings/status.displayvalue/expression.js +++ b/entity/BulkMailRecipient_entity/recordcontainers/db/recordfieldmappings/status.displayvalue/expression.js @@ -1,6 +1,13 @@ +import("system.translate"); +import("system.db"); +import("Bulkmail_lib"); import("system.result"); import("Keyword_lib"); import("KeywordRegistry_basic"); -var sql = KeywordUtils.getResolvedTitleSqlPart($KeywordRegistry.bulkMailRecipientStatus(), "BULKMAILRECIPIENT.STATUS"); +var commRestrictionCond = BulkMailUtils.getCommRestrictionCondition(true).build(); +var keywordSql = KeywordUtils.getResolvedTitleSqlPart($KeywordRegistry.bulkMailRecipientStatus(), "BULKMAILRECIPIENT.STATUS"); +var sql = "case when (" + db.translateStatement(commRestrictionCond) + + ") then '" + translate.text("Advertising ban") + + "' else (" + keywordSql + ") end"; result.string(sql); diff --git a/entity/BulkMail_entity/BulkMail_entity.aod b/entity/BulkMail_entity/BulkMail_entity.aod index 155528efdd22eeae5cab9feabc58605d01316dec..7cc97c3e9f3a3e32a64b18caa64dea74906c3773 100644 --- a/entity/BulkMail_entity/BulkMail_entity.aod +++ b/entity/BulkMail_entity/BulkMail_entity.aod @@ -133,6 +133,13 @@ <element>SUBJECT</element> </fields> </entityFieldGroup> + <entityActionField> + <name>openAdminView</name> + <title>Open admin view</title> + <onActionProcess>%aditoprj%/entity/BulkMail_entity/entityfields/openadminview/onActionProcess.js</onActionProcess> + <iconId>VAADIN:CURLY_BRACKETS</iconId> + <stateProcess>%aditoprj%/entity/BulkMail_entity/entityfields/openadminview/stateProcess.js</stateProcess> + </entityActionField> </entityFields> <recordContainers> <dbRecordContainer> diff --git a/entity/BulkMail_entity/entityfields/openadminview/onActionProcess.js b/entity/BulkMail_entity/entityfields/openadminview/onActionProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..83560a4da795605d3ab671137742afc66b18e091 --- /dev/null +++ b/entity/BulkMail_entity/entityfields/openadminview/onActionProcess.js @@ -0,0 +1,6 @@ +import("system.vars"); +import("Context_lib"); + +AdminViewUtils.open("BULKMAILID", [ + ["DOCUMENTTEMPLATE_ID", vars.get("$field.DOCUMENTTEMPLATE_ID")] +]); \ No newline at end of file diff --git a/entity/BulkMail_entity/entityfields/openadminview/stateProcess.js b/entity/BulkMail_entity/entityfields/openadminview/stateProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..38f2298db7304b4d44a15fbad7f720558c02da99 --- /dev/null +++ b/entity/BulkMail_entity/entityfields/openadminview/stateProcess.js @@ -0,0 +1,4 @@ +import("Context_lib"); +import("system.result"); + +result.string(AdminViewUtils.getActionState()); \ No newline at end of file diff --git a/entity/CampaignAddParticipants_entity/entityfields/isoperationvalid/valueProcess.js b/entity/CampaignAddParticipants_entity/entityfields/isoperationvalid/valueProcess.js index b4bf3c912004332a45e08dc5ecd3adb4ecac9ecd..c0689ca0aa2ecf419c001d1461c673d2b5f076d7 100644 --- a/entity/CampaignAddParticipants_entity/entityfields/isoperationvalid/valueProcess.js +++ b/entity/CampaignAddParticipants_entity/entityfields/isoperationvalid/valueProcess.js @@ -88,7 +88,11 @@ if(selectedCampaignId != '') } countValidParticipantsToAdd = countParticipantsToAdd - countParticipantsAlreadyInCampaign; - if(countValidParticipantsToAdd <= 0) + if(countParticipantsToAdd <= 0) + { + messageString = translate.text("No contacts selected"); + } + else if(countValidParticipantsToAdd <= 0) { messageString = translate.text("All selected participants already are in the campaign"); } diff --git a/entity/CampaignParticipant_entity/CampaignParticipant_entity.aod b/entity/CampaignParticipant_entity/CampaignParticipant_entity.aod index 1d20c0877f43174e64a3d1fb3ec1de4efc994263..93a8f5fbcc697c1698fab222e1051be8310b41b9 100644 --- a/entity/CampaignParticipant_entity/CampaignParticipant_entity.aod +++ b/entity/CampaignParticipant_entity/CampaignParticipant_entity.aod @@ -162,11 +162,15 @@ <children> <entityActionField> <name>SetStepToParticipantSelection</name> - <title>Set campaign step</title> + <title>Update campaign step</title> <onActionProcess>%aditoprj%/entity/CampaignParticipant_entity/entityfields/filterviewactiongroup/children/setsteptoparticipantselection/onActionProcess.js</onActionProcess> <isObjectAction v="false" /> <isSelectionAction v="false" /> <iconId>NEON:GROUP_APPOINTMENT</iconId> + <state>DISABLED</state> + <stateProcess>%aditoprj%/entity/CampaignParticipant_entity/entityfields/filterviewactiongroup/children/setsteptoparticipantselection/stateProcess.js</stateProcess> + <tooltip>Update campaign step</tooltip> + <tooltipProcess>%aditoprj%/entity/CampaignParticipant_entity/entityfields/filterviewactiongroup/children/setsteptoparticipantselection/tooltipProcess.js</tooltipProcess> </entityActionField> </children> </entityActionGroup> diff --git a/entity/CampaignParticipant_entity/entityfields/filterviewactiongroup/children/setsteptoparticipantselection/stateProcess.js b/entity/CampaignParticipant_entity/entityfields/filterviewactiongroup/children/setsteptoparticipantselection/stateProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..d55386c662b50138c9a582d15dfcd103d2200e20 --- /dev/null +++ b/entity/CampaignParticipant_entity/entityfields/filterviewactiongroup/children/setsteptoparticipantselection/stateProcess.js @@ -0,0 +1,16 @@ +import("Campaign_lib"); +import("system.vars"); +import("system.neon"); +import("system.result"); + +var campaignId = vars.get("$field.CAMPAIGN_ID"); +var participantCount = CampaignUtils.getParticipantCount(campaignId); + +if(participantCount > 0) +{ + result.string(neon.COMPONENTSTATE_EDITABLE); +} +else +{ + result.string(neon.COMPONENTSTATE_DISABLED); +} \ No newline at end of file diff --git a/entity/CampaignParticipant_entity/entityfields/filterviewactiongroup/children/setsteptoparticipantselection/tooltipProcess.js b/entity/CampaignParticipant_entity/entityfields/filterviewactiongroup/children/setsteptoparticipantselection/tooltipProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..2809cd2e10b98d5dffdf68a57485d3edd675b0f7 --- /dev/null +++ b/entity/CampaignParticipant_entity/entityfields/filterviewactiongroup/children/setsteptoparticipantselection/tooltipProcess.js @@ -0,0 +1,4 @@ +import("system.translate"); +import("system.result"); + +result.string(translate.text("Update campaign step")); \ No newline at end of file diff --git a/entity/Campaign_entity/Campaign_entity.aod b/entity/Campaign_entity/Campaign_entity.aod index 562889587aaa52565ad4c4122fc71fa54df8b6f0..f2b0010993ecd9dd0387ecd8b323530b3a6fa531 100644 --- a/entity/Campaign_entity/Campaign_entity.aod +++ b/entity/Campaign_entity/Campaign_entity.aod @@ -410,11 +410,24 @@ </entityParameter> </children> </entityConsumer> + <entityParameter> + <name>ShowOnlyCurrentUsersCampaigns_param</name> + <title>Nur eigene anzeigen</title> + <expose v="true" /> + </entityParameter> + <entityActionField> + <name>openAdminView</name> + <title>Open admin view</title> + <onActionProcess>%aditoprj%/entity/Campaign_entity/entityfields/openadminview/onActionProcess.js</onActionProcess> + <iconId>VAADIN:CURLY_BRACKETS</iconId> + <stateProcess>%aditoprj%/entity/Campaign_entity/entityfields/openadminview/stateProcess.js</stateProcess> + </entityActionField> </entityFields> <recordContainers> <dbRecordContainer> <name>db</name> <alias>Data_alias</alias> + <conditionProcess>%aditoprj%/entity/Campaign_entity/recordcontainers/db/conditionProcess.js</conditionProcess> <onDBInsert>%aditoprj%/entity/Campaign_entity/recordcontainers/db/onDBInsert.js</onDBInsert> <onDBDelete>%aditoprj%/entity/Campaign_entity/recordcontainers/db/onDBDelete.js</onDBDelete> <linkInformation> diff --git a/entity/Campaign_entity/entityfields/openadminview/onActionProcess.js b/entity/Campaign_entity/entityfields/openadminview/onActionProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..e499f2c9eb69997395c5227e2df347b3dc86441d --- /dev/null +++ b/entity/Campaign_entity/entityfields/openadminview/onActionProcess.js @@ -0,0 +1,10 @@ +import("system.vars"); +import("Context_lib"); + +AdminViewUtils.open("CAMPAIGNID", [ + ["EMPLOYEE_CONTACT_ID", vars.get("$field.EMPLOYEE_CONTACT_ID")], + ["DATE_NEW", vars.get("$field.DATE_NEW")], + ["DATE_EDIT", vars.get("$field.DATE_EDIT")], + ["USER_NEW", vars.get("$field.USER_NEW")], + ["USER_EDIT", vars.get("$field.USER_EDIT")] +]); \ No newline at end of file diff --git a/entity/Campaign_entity/entityfields/openadminview/stateProcess.js b/entity/Campaign_entity/entityfields/openadminview/stateProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..38f2298db7304b4d44a15fbad7f720558c02da99 --- /dev/null +++ b/entity/Campaign_entity/entityfields/openadminview/stateProcess.js @@ -0,0 +1,4 @@ +import("Context_lib"); +import("system.result"); + +result.string(AdminViewUtils.getActionState()); \ No newline at end of file diff --git a/entity/Campaign_entity/recordcontainers/db/conditionProcess.js b/entity/Campaign_entity/recordcontainers/db/conditionProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..e2736c04e6c8e8231e524311c3733b49239dd775 --- /dev/null +++ b/entity/Campaign_entity/recordcontainers/db/conditionProcess.js @@ -0,0 +1,12 @@ +import("system.logging"); +import("Employee_lib"); +import("system.db"); +import("system.result"); +import("Sql_lib"); +import("system.vars"); + +if(vars.get("$param.ShowOnlyCurrentUsersCampaigns_param") == 'true') +{ + //TODO: use a preparedCondition when available #1030812 #1034026 + result.string("CAMPAIGN.EMPLOYEE_CONTACT_ID = '" + EmployeeUtils.getCurrentContactId() + "'"); +} \ No newline at end of file diff --git a/entity/Contract_entity/Contract_entity.aod b/entity/Contract_entity/Contract_entity.aod index 2426e1820b9599084c69a69860e07f3db940cb20..298a23b16fb53517a9ab1fba04202755c05b95cf 100644 --- a/entity/Contract_entity/Contract_entity.aod +++ b/entity/Contract_entity/Contract_entity.aod @@ -196,9 +196,6 @@ <fieldName>Documents</fieldName> </dependency> <children> - <entityParameter> - <name>AssignmentName_param</name> - </entityParameter> <entityParameter> <name>AssignmentRowId_param</name> <valueProcess>%aditoprj%/entity/Contract_entity/entityfields/documents/children/assignmentrowid_param/valueProcess.js</valueProcess> @@ -363,6 +360,13 @@ </entityParameter> </children> </entityConsumer> + <entityActionField> + <name>openAdminView</name> + <title>Open admin view</title> + <onActionProcess>%aditoprj%/entity/Contract_entity/entityfields/openadminview/onActionProcess.js</onActionProcess> + <iconId>VAADIN:CURLY_BRACKETS</iconId> + <stateProcess>%aditoprj%/entity/Contract_entity/entityfields/openadminview/stateProcess.js</stateProcess> + </entityActionField> </entityFields> <recordContainers> <dbRecordContainer> diff --git a/entity/Contract_entity/entityfields/openadminview/onActionProcess.js b/entity/Contract_entity/entityfields/openadminview/onActionProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..e9021a0b9f29937e17815d99b61c687d74f74973 --- /dev/null +++ b/entity/Contract_entity/entityfields/openadminview/onActionProcess.js @@ -0,0 +1,8 @@ +import("system.vars"); +import("Context_lib"); + +AdminViewUtils.open("CONTRACTID", [ + ["CONTACT_ID", vars.get("$field.CONTACT_ID")], + ["CONTACT_ORG_ID", vars.get("$field.CONTACT_ORG_ID")], + ["CONTACT_PERSON_ID", vars.get("$field.CONTACT_PERSON_ID")] +]); \ No newline at end of file diff --git a/entity/Contract_entity/entityfields/openadminview/stateProcess.js b/entity/Contract_entity/entityfields/openadminview/stateProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..38f2298db7304b4d44a15fbad7f720558c02da99 --- /dev/null +++ b/entity/Contract_entity/entityfields/openadminview/stateProcess.js @@ -0,0 +1,4 @@ +import("Context_lib"); +import("system.result"); + +result.string(AdminViewUtils.getActionState()); \ No newline at end of file diff --git a/entity/DefaultAdminView_entity/DefaultAdminView_entity.aod b/entity/DefaultAdminView_entity/DefaultAdminView_entity.aod new file mode 100644 index 0000000000000000000000000000000000000000..34f1999a062ab1a4388c4097b2d582005e157cd7 --- /dev/null +++ b/entity/DefaultAdminView_entity/DefaultAdminView_entity.aod @@ -0,0 +1,50 @@ +<?xml version="1.0" encoding="UTF-8"?> +<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.9" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.9"> + <name>DefaultAdminView_entity</name> + <majorModelMode>DISTRIBUTED</majorModelMode> + <recordContainer>jdito</recordContainer> + <entityFields> + <entityProvider> + <name>#PROVIDER</name> + </entityProvider> + <entityField> + <name>UID</name> + </entityField> + <entityParameter> + <name>Rows_param</name> + <expose v="true" /> + <mandatory v="true" /> + </entityParameter> + <entityConsumer> + <name>Rows</name> + <state>READONLY</state> + <dependency> + <name>dependency</name> + <entityName>AdminViewRow_entity</entityName> + <fieldName>AdminViewRows</fieldName> + </dependency> + <children> + <entityParameter> + <name>Rows_param</name> + <valueProcess>%aditoprj%/entity/DefaultAdminView_entity/entityfields/rows/children/rows_param/valueProcess.js</valueProcess> + </entityParameter> + </children> + </entityConsumer> + <entityParameter> + <name>Uid_param</name> + <expose v="true" /> + <mandatory v="true" /> + </entityParameter> + </entityFields> + <recordContainers> + <jDitoRecordContainer> + <name>jdito</name> + <contentProcess>%aditoprj%/entity/DefaultAdminView_entity/recordcontainers/jdito/contentProcess.js</contentProcess> + <recordFieldMappings> + <jDitoRecordFieldMapping> + <name>UID.value</name> + </jDitoRecordFieldMapping> + </recordFieldMappings> + </jDitoRecordContainer> + </recordContainers> +</entity> diff --git a/entity/DefaultAdminView_entity/entityfields/rows/children/rows_param/valueProcess.js b/entity/DefaultAdminView_entity/entityfields/rows/children/rows_param/valueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..38779881db7511d72573b62e3331790e78cda5be --- /dev/null +++ b/entity/DefaultAdminView_entity/entityfields/rows/children/rows_param/valueProcess.js @@ -0,0 +1,9 @@ +import("system.translate"); +import("system.tools"); +import("system.vars"); +import("system.result"); + +if (tools.currentUserHasRole("INTERNAL_ADMINISTRATOR")) + result.string(vars.get("$param.Rows_param")); +else //this should not be the case since the action should be invisible + result.string(JSON.stringify([["0", "", translate.text("You don't have permission for this view."), "TEXT"]])); \ No newline at end of file diff --git a/entity/DefaultAdminView_entity/recordcontainers/jdito/contentProcess.js b/entity/DefaultAdminView_entity/recordcontainers/jdito/contentProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..b6f288f713ee37fdc2431d8713d06ab465528c88 --- /dev/null +++ b/entity/DefaultAdminView_entity/recordcontainers/jdito/contentProcess.js @@ -0,0 +1,4 @@ +import("system.vars"); +import("system.result"); + +result.object([[vars.get("$param.Uid_param")]]); \ No newline at end of file diff --git a/entity/DocumentTemplate_entity/DocumentTemplate_entity.aod b/entity/DocumentTemplate_entity/DocumentTemplate_entity.aod index 3bf1f40c2ac5c981506510e5b1f1ee853bae8ed1..cbea53d43a3478605e5aa352ceec4bcd1ae16386 100644 --- a/entity/DocumentTemplate_entity/DocumentTemplate_entity.aod +++ b/entity/DocumentTemplate_entity/DocumentTemplate_entity.aod @@ -255,6 +255,13 @@ <searchable v="false" /> <valueProcess>%aditoprj%/entity/DocumentTemplate_entity/entityfields/target_context/valueProcess.js</valueProcess> </entityField> + <entityActionField> + <name>openAdminView</name> + <title>Open admin view</title> + <onActionProcess>%aditoprj%/entity/DocumentTemplate_entity/entityfields/openadminview/onActionProcess.js</onActionProcess> + <iconId>VAADIN:CURLY_BRACKETS</iconId> + <stateProcess>%aditoprj%/entity/DocumentTemplate_entity/entityfields/openadminview/stateProcess.js</stateProcess> + </entityActionField> </entityFields> <recordContainers> <dbRecordContainer> diff --git a/entity/DocumentTemplate_entity/entityfields/openadminview/onActionProcess.js b/entity/DocumentTemplate_entity/entityfields/openadminview/onActionProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..30d10d0a087957cdc1a2c6fc64fea75897528028 --- /dev/null +++ b/entity/DocumentTemplate_entity/entityfields/openadminview/onActionProcess.js @@ -0,0 +1,4 @@ +import("system.vars"); +import("Context_lib"); + +AdminViewUtils.open("DOCUMENTTEMPLATEID"); \ No newline at end of file diff --git a/entity/DocumentTemplate_entity/entityfields/openadminview/stateProcess.js b/entity/DocumentTemplate_entity/entityfields/openadminview/stateProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..38f2298db7304b4d44a15fbad7f720558c02da99 --- /dev/null +++ b/entity/DocumentTemplate_entity/entityfields/openadminview/stateProcess.js @@ -0,0 +1,4 @@ +import("Context_lib"); +import("system.result"); + +result.string(AdminViewUtils.getActionState()); \ No newline at end of file diff --git a/entity/Document_entity/Document_entity.aod b/entity/Document_entity/Document_entity.aod index 077b4c5f163f836e2c73402d2ee1f48ea69531ca..9b7b8008c36385dc47f87a4e4213933690cba16c 100644 --- a/entity/Document_entity/Document_entity.aod +++ b/entity/Document_entity/Document_entity.aod @@ -92,7 +92,6 @@ <entityField> <name>UID</name> <searchable v="false" /> - <valueProcess>%aditoprj%/entity/Document_entity/entityfields/uid/valueProcess.js</valueProcess> </entityField> <entityField> <name>DESCRIPTION</name> diff --git a/entity/Document_entity/entityfields/uid/valueProcess.js b/entity/Document_entity/entityfields/uid/valueProcess.js deleted file mode 100644 index cb202a4d661d58a69eaba5744ae3bb7f264682fe..0000000000000000000000000000000000000000 --- a/entity/Document_entity/entityfields/uid/valueProcess.js +++ /dev/null @@ -1,4 +0,0 @@ -import("system.util"); -import("system.result"); -var uid = util.getNewUUID(); -result.string(uid) \ No newline at end of file diff --git a/entity/Document_entity/recordcontainers/jdito/onInsert.js b/entity/Document_entity/recordcontainers/jdito/onInsert.js index a938789f38f6b0d6ff43f78c51280feab2a92af2..99bcdc3cb62d9a1f3c1830416e54b9a537026640 100644 --- a/entity/Document_entity/recordcontainers/jdito/onInsert.js +++ b/entity/Document_entity/recordcontainers/jdito/onInsert.js @@ -19,5 +19,5 @@ if(bindata != '' && filename != ''){ var uid = db.insertBinary(assignmentTable, assignmentName, assignmentRowId, "", bindata, filename, description, keyword, alias, id); - + } diff --git a/entity/EmployeeRole_entity/EmployeeRole_entity.aod b/entity/EmployeeRole_entity/EmployeeRole_entity.aod index 4598f76d646cc4b59d7be29b8a4e885d7e813769..22a050dcddbcf8d4999fe79d5d57457dcefc4ea3 100644 --- a/entity/EmployeeRole_entity/EmployeeRole_entity.aod +++ b/entity/EmployeeRole_entity/EmployeeRole_entity.aod @@ -39,8 +39,17 @@ <entityField> <name>ROLE</name> <title>Role</title> - <dropDownProcess>%aditoprj%/entity/EmployeeRole_entity/entityfields/role/dropDownProcess.js</dropDownProcess> + <consumer>Roles</consumer> + <linkedContext>Role</linkedContext> </entityField> + <entityConsumer> + <name>Roles</name> + <dependency> + <name>dependency</name> + <entityName>Role_entity</entityName> + <fieldName>#PROVIDER</fieldName> + </dependency> + </entityConsumer> </entityFields> <recordContainers> <jDitoRecordContainer> diff --git a/entity/EmployeeRole_entity/entityfields/role/dropDownProcess.js b/entity/EmployeeRole_entity/entityfields/role/dropDownProcess.js deleted file mode 100644 index 2c33a21e965fb2fbac61c15ea5db3604b5a83ae0..0000000000000000000000000000000000000000 --- a/entity/EmployeeRole_entity/entityfields/role/dropDownProcess.js +++ /dev/null @@ -1,28 +0,0 @@ -import("system.translate"); -import("system.vars"); -import("system.result"); -import("system.tools"); - -var selectedRole = vars.get("$field.ROLE"); -var roles = []; -var allRoles = tools.getAllRoles([tools.ROLE_INTERNAL, tools.ROLE_PROJECT, tools.ROLE_XMPP]); -var excludeRoles = { - "INTERNAL_GROUPWARE" : true, - "INTERNAL_SNMP" : true, - "INTERNAL_DESIGNER" : true, - "INTERNAL_TECHNICAL" : true, - "INTERNAL_EVERYONE" : true -}; - -if (tools.existUsers(vars.get("$param.UserTitle_param"))) -{ - var userRoles = tools.getRoles(vars.get("$param.UserTitle_param")); - for (let i in userRoles) - excludeRoles[userRoles[i]] = true; -} - -for (let roleId in allRoles) - if (!excludeRoles[roleId] || roleId == selectedRole) - roles.push([roleId, translate.text(allRoles[roleId][0])]); - -result.object(roles); \ No newline at end of file diff --git a/entity/Employee_entity/Employee_entity.aod b/entity/Employee_entity/Employee_entity.aod index 0e50e826a992efa788f2b6f283746d33de7e0970..d9f3919ce7b7831511c01aa797e366c72b204a0a 100644 --- a/entity/Employee_entity/Employee_entity.aod +++ b/entity/Employee_entity/Employee_entity.aod @@ -281,6 +281,13 @@ </entityParameter> </children> </entityConsumer> + <entityActionField> + <name>openAdminView</name> + <title>Open admin view</title> + <onActionProcess>%aditoprj%/entity/Employee_entity/entityfields/openadminview/onActionProcess.js</onActionProcess> + <iconId>VAADIN:CURLY_BRACKETS</iconId> + <stateProcess>%aditoprj%/entity/Employee_entity/entityfields/openadminview/stateProcess.js</stateProcess> + </entityActionField> </entityFields> <recordContainers> <jDitoRecordContainer> diff --git a/entity/Employee_entity/entityfields/openadminview/onActionProcess.js b/entity/Employee_entity/entityfields/openadminview/onActionProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..53f2ae98b70e5490aa9237de28f3d47fe1a27616 --- /dev/null +++ b/entity/Employee_entity/entityfields/openadminview/onActionProcess.js @@ -0,0 +1,6 @@ +import("system.vars"); +import("Context_lib"); + +AdminViewUtils.open("name", [ + ["CONTACT_ID", vars.get("$field.CONTACT_ID")] +]); \ No newline at end of file diff --git a/entity/Employee_entity/entityfields/openadminview/stateProcess.js b/entity/Employee_entity/entityfields/openadminview/stateProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..38f2298db7304b4d44a15fbad7f720558c02da99 --- /dev/null +++ b/entity/Employee_entity/entityfields/openadminview/stateProcess.js @@ -0,0 +1,4 @@ +import("Context_lib"); +import("system.result"); + +result.string(AdminViewUtils.getActionState()); \ No newline at end of file diff --git a/entity/KeywordEntry_entity/KeywordEntry_entity.aod b/entity/KeywordEntry_entity/KeywordEntry_entity.aod index 928aff1ebd77e9d4990af130753a6e5c13176d67..207554b1301c632d5e4300c6632d0927eed2b699 100644 --- a/entity/KeywordEntry_entity/KeywordEntry_entity.aod +++ b/entity/KeywordEntry_entity/KeywordEntry_entity.aod @@ -513,6 +513,13 @@ <name>expanded</name> <valueProcess>%aditoprj%/entity/KeywordEntry_entity/entityfields/expanded/valueProcess.js</valueProcess> </entityField> + <entityActionField> + <name>openAdminView</name> + <title>Open admin view</title> + <onActionProcess>%aditoprj%/entity/KeywordEntry_entity/entityfields/openadminview/onActionProcess.js</onActionProcess> + <iconId>VAADIN:CURLY_BRACKETS</iconId> + <stateProcess>%aditoprj%/entity/KeywordEntry_entity/entityfields/openadminview/stateProcess.js</stateProcess> + </entityActionField> </entityFields> <recordContainers> <dbRecordContainer> diff --git a/entity/KeywordEntry_entity/entityfields/openadminview/onActionProcess.js b/entity/KeywordEntry_entity/entityfields/openadminview/onActionProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..d564b4d76feb764e6f7db9d65f92c66db58a1a28 --- /dev/null +++ b/entity/KeywordEntry_entity/entityfields/openadminview/onActionProcess.js @@ -0,0 +1,6 @@ +import("system.vars"); +import("Context_lib"); + +AdminViewUtils.open("AB_KEYWORD_ENTRYID", [ + ["KEYID", vars.get("$field.KEYID")] +]); \ No newline at end of file diff --git a/entity/KeywordEntry_entity/entityfields/openadminview/stateProcess.js b/entity/KeywordEntry_entity/entityfields/openadminview/stateProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..38f2298db7304b4d44a15fbad7f720558c02da99 --- /dev/null +++ b/entity/KeywordEntry_entity/entityfields/openadminview/stateProcess.js @@ -0,0 +1,4 @@ +import("Context_lib"); +import("system.result"); + +result.string(AdminViewUtils.getActionState()); \ No newline at end of file diff --git a/entity/ModuleTree_entity/ModuleTree_entity.aod b/entity/ModuleTree_entity/ModuleTree_entity.aod index 04d6372a08d4b79170921e669e5669767658c428..af088a8e5feba7318fb75858a9ea61f1b552f2c1 100644 --- a/entity/ModuleTree_entity/ModuleTree_entity.aod +++ b/entity/ModuleTree_entity/ModuleTree_entity.aod @@ -36,6 +36,12 @@ <fieldName>ModuleTrees</fieldName> <isConsumer v="false" /> </entityDependency> + <entityDependency> + <name>3132e321-3b6a-4828-b600-01897ae83646</name> + <entityName>SupportTicket_entity</entityName> + <fieldName>ModuleTrees</fieldName> + <isConsumer v="false" /> + </entityDependency> </dependencies> <children> <entityParameter> diff --git a/entity/ModuleTree_entity/recordcontainers/jdito/contentProcess.js b/entity/ModuleTree_entity/recordcontainers/jdito/contentProcess.js index c3d1948fc0f63ce91316285cc1f08f00e04a657e..73393d631a5190c32e7837fd7e4de8ec01613b1a 100644 --- a/entity/ModuleTree_entity/recordcontainers/jdito/contentProcess.js +++ b/entity/ModuleTree_entity/recordcontainers/jdito/contentProcess.js @@ -1,3 +1,4 @@ +import("KeywordRegistry_basic"); import("system.vars"); import("Sql_lib") import("system.result"); @@ -8,8 +9,10 @@ var fixedID = vars.get("$param.ID_param"); let resArray = []; +var cond = new SqlCondition(); // Query root element var root = queryRootElement(fixedContextName, fixedID, true); + if (root !== null) { // Push root element resArray.push(root); @@ -20,10 +23,7 @@ if (root !== null) { if (children !== null) { // Push each children - for(let i = 0; i < children.length; i++) { - resArray.push(children[i]); - } - + resArray = resArray.concat(children); result.object(resArray); } } @@ -36,9 +36,24 @@ if (root !== null) { * @param pID ID of the parent element. */ function queryChildrenElements (pContextName, pID) { - var taskResult = db.table("select TASKID, PARENT_ID, PARENT_CONTEXT, SUBJECT, DESCRIPTION from TASK where PARENT_ID = '" + pID +"' and PARENT_CONTEXT = '" + pContextName + "'"); - var activityResult = db.table("select ACTIVITYID, PARENT_ID, PARENT_CONTEXT, SUBJECT, INFO from ACTIVITY where PARENT_ID = '" + pID +"' and PARENT_CONTEXT = '" + pContextName + "'"); - + + var taskResult = db.table(SqlCondition.begin() + .andPrepare("TASK.PARENT_ID", pID) + .andPrepare("TASK.PARENT_CONTEXT", pContextName) + .andPrepare("TASK.TYPE", $KeywordRegistry.taskType$task()) + .buildSql("select TASKID, PARENT_ID, PARENT_CONTEXT, SUBJECT, DESCRIPTION from TASK")); + + + var ticketResult = db.table(SqlCondition.begin() + .andPrepare("TASK.PARENT_ID", pID) + .andPrepare("TASK.PARENT_CONTEXT", pContextName) + .buildSql("select TICKETID, PARENT_ID, PARENT_CONTEXT, SUBJECT, DESCRIPTION from TICKET left join TASK on TASK_ID = TASKID")); + + var activityResult = db.table(SqlCondition.begin() + .andPrepare("ACTIVITY.PARENT_ID", pID) + .andPrepare("ACTIVITY.PARENT_CONTEXT", pContextName) + .buildSql("select ACTIVITYID, PARENT_ID, PARENT_CONTEXT, SUBJECT, INFO from ACTIVITY")); + var res = [] for (let i = 0; i < taskResult.length; i++) { @@ -60,6 +75,16 @@ function queryChildrenElements (pContextName, pID) { let children = queryChildrenElements("Activity", activityResult[i][0]); res = res.concat(children); } + + for (let i = 0; i < ticketResult.length; i++) { + // Augment data + ticketResult[i] = augmentData(ticketResult[i], "SupportTicket"); + res.push(ticketResult[i]); + + // Query children + let children = queryChildrenElements("SupportTicket", ticketResult[i][0]); + res = res.concat(children); + } return res; } @@ -99,7 +124,21 @@ function queryRootElement (pContextName, pID, pGetFirst) { fixedID = resultArray[0]; } return augmentData(resultArray, "Activity"); - } else { + } + else if (pContextName === "SupportTicket") { + resultArray = db.array(db.ROW, "select TICKETID, PARENT_ID, PARENT_CONTEXT, SUBJECT, DESCRIPTION from TICKET left join TASK on TASK_ID = TASKID where TICKETID = '" + pID +"'"); + if (resultArray.length === 0) { + return null; + } + if (pGetFirst && resultArray[1] && resultArray[2]) + return queryRootElement(resultArray[2], resultArray[1], pGetFirst); + if (pGetFirst) + { + fixedContextName = "SupportTicket"; + fixedID = resultArray[0]; + } + return augmentData(resultArray, "SupportTicket");} + else { return null; } } @@ -121,7 +160,7 @@ function augmentData (pDataRow, pType) { if (pDataRow.length === 0) return null; - if (pType !== "Task" && pType !== "Activity") + if (pType !== "Task" && pType !== "Activity" && pType !="SupportTicket") return null; // PARENT_ID check @@ -136,7 +175,7 @@ function augmentData (pDataRow, pType) { pDataRow.splice(1, 0, pType); // Insert icon - pDataRow.splice(6, 0, pType === "Task" ? "VAADIN:TASKS" : pType === "Activity" ? "VAADIN:HOURGLASS_END": null); + pDataRow.splice(6, 0, pType === "Task" ? "VAADIN:TASKS" : pType === "Activity" ? "VAADIN:HOURGLASS_END": pType==="SupportTicket" ? "VAADIN:QUESTION": null); return pDataRow; } \ No newline at end of file diff --git a/entity/Offer_entity/Offer_entity.aod b/entity/Offer_entity/Offer_entity.aod index f7d1884b6ac421736dcd3d72384b39928e7bb7b8..df06c88b7a21d3e0f87670c25e2236dc1c998fdc 100644 --- a/entity/Offer_entity/Offer_entity.aod +++ b/entity/Offer_entity/Offer_entity.aod @@ -884,6 +884,13 @@ <title>Letter salutation</title> <valueProcess>%aditoprj%/entity/Offer_entity/entityfields/lettersalutation/valueProcess.js</valueProcess> </entityField> + <entityActionField> + <name>openAdminView</name> + <title>Open admin view</title> + <onActionProcess>%aditoprj%/entity/Offer_entity/entityfields/openadminview/onActionProcess.js</onActionProcess> + <iconId>VAADIN:CURLY_BRACKETS</iconId> + <stateProcess>%aditoprj%/entity/Offer_entity/entityfields/openadminview/stateProcess.js</stateProcess> + </entityActionField> </entityFields> <recordContainers> <dbRecordContainer> diff --git a/entity/Offer_entity/entityfields/contact_id/onValueChange.js b/entity/Offer_entity/entityfields/contact_id/onValueChange.js index e0a100eeab30aaf88b169b1983628f54cf092441..933b3192f785834e9c600315ee2d16465cf50dd8 100644 --- a/entity/Offer_entity/entityfields/contact_id/onValueChange.js +++ b/entity/Offer_entity/entityfields/contact_id/onValueChange.js @@ -1,3 +1,4 @@ +import("system.logging"); import("system.neon"); import("system.vars"); import("system.db"); @@ -23,5 +24,7 @@ else neon.setFieldValue("$field.LANGUAGE", ""); } -if(!vars.exists("$param.ObjectRowId_param") && !vars.get("$param.ObjectRowId_param")) +if(!vars.get("$param.ObjectRowId_param")) +{ neon.setFieldValue("$field.OBJECT_ROWID", ""); +} \ No newline at end of file diff --git a/entity/Offer_entity/entityfields/openadminview/onActionProcess.js b/entity/Offer_entity/entityfields/openadminview/onActionProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..9257ff40784f0d506f2b68484ae292b951c069bd --- /dev/null +++ b/entity/Offer_entity/entityfields/openadminview/onActionProcess.js @@ -0,0 +1,13 @@ +import("system.vars"); +import("Context_lib"); +import("system.result"); + +result.string(AdminViewUtils.open("OFFERID", [ + ["CONTACT_ID", vars.get("$field.CONTACT_ID")], + ["CONTACT_ORG_ID", vars.get("$field.CONTACT_ORG_ID")], + ["CONTACT_PERSON_ID", vars.get("$field.CONTACT_PERSON_ID")], + ["DATE_NEW", vars.get("$field.DATE_NEW")], + ["DATE_EDIT", vars.get("$field.DATE_EDIT")], + ["USER_NEW", vars.get("$field.USER_NEW")], + ["USER_EDIT", vars.get("$field.USER_EDIT")] +])); \ No newline at end of file diff --git a/entity/Offer_entity/entityfields/openadminview/stateProcess.js b/entity/Offer_entity/entityfields/openadminview/stateProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..38f2298db7304b4d44a15fbad7f720558c02da99 --- /dev/null +++ b/entity/Offer_entity/entityfields/openadminview/stateProcess.js @@ -0,0 +1,4 @@ +import("Context_lib"); +import("system.result"); + +result.string(AdminViewUtils.getActionState()); \ No newline at end of file diff --git a/entity/Order_entity/Order_entity.aod b/entity/Order_entity/Order_entity.aod index 55d9f1bbd66fc7525298e84f0d016a6e9f70aed5..6181f04db534cb2ab56c6985c2a03d8dc579df9e 100644 --- a/entity/Order_entity/Order_entity.aod +++ b/entity/Order_entity/Order_entity.aod @@ -471,6 +471,13 @@ </entityParameter> </children> </entityConsumer> + <entityActionField> + <name>openAdminView</name> + <title>Open admin view</title> + <onActionProcess>%aditoprj%/entity/Order_entity/entityfields/openadminview/onActionProcess.js</onActionProcess> + <iconId>VAADIN:CURLY_BRACKETS</iconId> + <stateProcess>%aditoprj%/entity/Order_entity/entityfields/openadminview/stateProcess.js</stateProcess> + </entityActionField> </entityFields> <recordContainers> <dbRecordContainer> diff --git a/entity/Order_entity/entityfields/openadminview/onActionProcess.js b/entity/Order_entity/entityfields/openadminview/onActionProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..a253442813b4782139e4af275015c1fffc7f2e14 --- /dev/null +++ b/entity/Order_entity/entityfields/openadminview/onActionProcess.js @@ -0,0 +1,10 @@ +import("system.vars"); +import("Context_lib"); + +AdminViewUtils.open("SALESORDERID", [ + ["SALESPROJECT_ID", vars.get("$field.SALESPROJECT_ID")], + ["OFFER_ID", vars.get("$field.OFFER_ID")], + ["CONTACT_ID", vars.get("$field.CONTACT_ID")], + ["CONTACT_ORG_ID", vars.get("$field.CONTACT_ORG_ID")], + ["CONTACT_PERSON_ID", vars.get("$field.CONTACT_PERSON_ID")] +]); \ No newline at end of file diff --git a/entity/Order_entity/entityfields/openadminview/stateProcess.js b/entity/Order_entity/entityfields/openadminview/stateProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..38f2298db7304b4d44a15fbad7f720558c02da99 --- /dev/null +++ b/entity/Order_entity/entityfields/openadminview/stateProcess.js @@ -0,0 +1,4 @@ +import("Context_lib"); +import("system.result"); + +result.string(AdminViewUtils.getActionState()); \ No newline at end of file diff --git a/entity/Organisation_entity/Organisation_entity.aod b/entity/Organisation_entity/Organisation_entity.aod index dbcf7f0a06f43142cc4157693163ccbc29c1a82d..924c7ba3d2b3a1824d007cf4999c7d825855cce8 100644 --- a/entity/Organisation_entity/Organisation_entity.aod +++ b/entity/Organisation_entity/Organisation_entity.aod @@ -751,6 +751,8 @@ </entityParameter> <entityActionGroup> <name>campaignActionGroup</name> + <title>Campaign</title> + <iconId>NEON:GROUP_APPOINTMENT</iconId> <children> <entityActionField> <name>addToCampaignFromTable</name> @@ -759,11 +761,13 @@ <isObjectAction v="false" /> <isSelectionAction v="false" /> <iconId>NEON:GROUP_APPOINTMENT</iconId> + <stateProcess>%aditoprj%/entity/Organisation_entity/entityfields/campaignactiongroup/children/addtocampaignfromtable/stateProcess.js</stateProcess> <tooltip>Add the selection to a campaign</tooltip> <tooltipProcess>%aditoprj%/entity/Organisation_entity/entityfields/campaignactiongroup/children/addtocampaignfromtable/tooltipProcess.js</tooltipProcess> </entityActionField> <entityActionField> <name>addToBulkMailFromTable</name> + <title>Add to Bulkmail</title> <onActionProcess>%aditoprj%/entity/Organisation_entity/entityfields/campaignactiongroup/children/addtobulkmailfromtable/onActionProcess.js</onActionProcess> <isObjectAction v="false" /> <isSelectionAction v="true" /> @@ -820,6 +824,7 @@ <title>Open admin view</title> <onActionProcess>%aditoprj%/entity/Organisation_entity/entityfields/openadminview/onActionProcess.js</onActionProcess> <iconId>VAADIN:CURLY_BRACKETS</iconId> + <stateProcess>%aditoprj%/entity/Organisation_entity/entityfields/openadminview/stateProcess.js</stateProcess> </entityActionField> <entityConsumer> <name>LinkedAppointments</name> diff --git a/entity/Organisation_entity/entityfields/campaignactiongroup/children/addtocampaignfromtable/stateProcess.js b/entity/Organisation_entity/entityfields/campaignactiongroup/children/addtocampaignfromtable/stateProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..9d2caf19d33cc0a8be852883401ff256e06fe5b9 --- /dev/null +++ b/entity/Organisation_entity/entityfields/campaignactiongroup/children/addtocampaignfromtable/stateProcess.js @@ -0,0 +1,16 @@ +import("system.db"); +import("system.vars"); +import("system.neon"); +import("system.result"); + +var query = "select count(*) from ORGANISATION where ORGANISATIONID != '0'" +var contactCount = db.cell(query); + +if(contactCount > 0) +{ + result.string(neon.COMPONENTSTATE_EDITABLE); +} +else +{ + result.string(neon.COMPONENTSTATE_DISABLED); +} \ No newline at end of file diff --git a/entity/Organisation_entity/entityfields/openadminview/onActionProcess.js b/entity/Organisation_entity/entityfields/openadminview/onActionProcess.js index 01ced877c1b8e747137b46cebc1ac042dee51ddd..8a1b220f1e40e5d36f51e6d5afec394b6d9f8b52 100644 --- a/entity/Organisation_entity/entityfields/openadminview/onActionProcess.js +++ b/entity/Organisation_entity/entityfields/openadminview/onActionProcess.js @@ -1,12 +1,13 @@ -import("system.neon"); +import("system.vars"); import("Context_lib"); -openAdminView(); - -function openAdminView (pViewName) -{ - var context = ContextUtils.getCurrentContextId(); - if (!pViewName) - pViewName = context + "Admin_view" - neon.openContext(context, pViewName, id, neon.OPERATINGSTATE_VIEW, null); -} \ No newline at end of file +AdminViewUtils.open("CONTACTID", [ + ["ORGANISATION_ID", vars.get("$field.ORGANISATION_ID")], + ["ADDRESS_ID", vars.get("$field.ADDRESS_ID")], + ["DATE_NEW", vars.get("$field.DATE_NEW")], + ["DATE_EDIT", vars.get("$field.DATE_EDIT")], + ["DATE_NEW_CONTACT", vars.get("$field.DATE_NEW_CONTACT")], + ["USER_NEW", vars.get("$field.USER_NEW")], + ["USER_EDIT", vars.get("$field.USER_EDIT")], + ["USER_NEW_CONTACT", vars.get("$field.USER_NEW_CONTACT")], +]); \ No newline at end of file diff --git a/entity/Organisation_entity/entityfields/openadminview/stateProcess.js b/entity/Organisation_entity/entityfields/openadminview/stateProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..38f2298db7304b4d44a15fbad7f720558c02da99 --- /dev/null +++ b/entity/Organisation_entity/entityfields/openadminview/stateProcess.js @@ -0,0 +1,4 @@ +import("Context_lib"); +import("system.result"); + +result.string(AdminViewUtils.getActionState()); \ No newline at end of file diff --git a/entity/Person_entity/Person_entity.aod b/entity/Person_entity/Person_entity.aod index 131f57a342976a436e6c5f6f6e0d870ab166f993..395d2c1450d1c6419131221807b949f49004f905 100644 --- a/entity/Person_entity/Person_entity.aod +++ b/entity/Person_entity/Person_entity.aod @@ -812,6 +812,7 @@ Usually this is used for filtering COMMUNICATION-entries by a specified contact <entityActionGroup> <name>campaignActionGroup</name> <title>Campaign</title> + <iconId>NEON:GROUP_APPOINTMENT</iconId> <children> <entityActionField> <name>addToCampaignFromTable</name> @@ -821,11 +822,13 @@ Usually this is used for filtering COMMUNICATION-entries by a specified contact <isObjectAction v="false" /> <isSelectionAction v="false" /> <iconId>NEON:GROUP_APPOINTMENT</iconId> + <stateProcess>%aditoprj%/entity/Person_entity/entityfields/campaignactiongroup/children/addtocampaignfromtable/stateProcess.js</stateProcess> <tooltip>Add the selection to a campaign</tooltip> <tooltipProcess>%aditoprj%/entity/Person_entity/entityfields/campaignactiongroup/children/addtocampaignfromtable/tooltipProcess.js</tooltipProcess> </entityActionField> <entityActionField> <name>addToBulkMailFromTable</name> + <title>Add to Bulkmail</title> <onActionProcess>%aditoprj%/entity/Person_entity/entityfields/campaignactiongroup/children/addtobulkmailfromtable/onActionProcess.js</onActionProcess> <isObjectAction v="false" /> <isSelectionAction v="true" /> @@ -873,11 +876,11 @@ Usually this is used for filtering COMMUNICATION-entries by a specified contact <iconId>VAADIN:ENVELOPE</iconId> </entityActionField> <entityActionField> - <name>openAdminInfo</name> + <name>openAdminView</name> <title>Open admin view</title> - <onActionProcess>%aditoprj%/entity/Person_entity/entityfields/openadmininfo/onActionProcess.js</onActionProcess> + <onActionProcess>%aditoprj%/entity/Person_entity/entityfields/openadminview/onActionProcess.js</onActionProcess> <iconId>VAADIN:CURLY_BRACKETS</iconId> - <stateProcess>%aditoprj%/entity/Person_entity/entityfields/openadmininfo/stateProcess.js</stateProcess> + <stateProcess>%aditoprj%/entity/Person_entity/entityfields/openadminview/stateProcess.js</stateProcess> </entityActionField> <entityConsumer> <name>DSGVOEntries</name> diff --git a/entity/Person_entity/entityfields/campaignactiongroup/children/addtocampaignfromtable/stateProcess.js b/entity/Person_entity/entityfields/campaignactiongroup/children/addtocampaignfromtable/stateProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..eedb470bf2e3dace60da9a626a9a910d3455675c --- /dev/null +++ b/entity/Person_entity/entityfields/campaignactiongroup/children/addtocampaignfromtable/stateProcess.js @@ -0,0 +1,16 @@ +import("system.db"); +import("system.vars"); +import("system.neon"); +import("system.result"); + +var query = "select count(*) from PERSON" +var contactCount = db.cell(query); + +if(contactCount > 0) +{ + result.string(neon.COMPONENTSTATE_EDITABLE); +} +else +{ + result.string(neon.COMPONENTSTATE_DISABLED); +} \ No newline at end of file diff --git a/entity/Person_entity/entityfields/openadmininfo/onActionProcess.js b/entity/Person_entity/entityfields/openadmininfo/onActionProcess.js deleted file mode 100644 index 9242625e42712c8511a62e51c49113056026965e..0000000000000000000000000000000000000000 --- a/entity/Person_entity/entityfields/openadmininfo/onActionProcess.js +++ /dev/null @@ -1,13 +0,0 @@ -import("system.vars"); -import("Context_lib"); -import("system.neon"); - -var openAdminView = function (pViewName) -{ - var context = ContextUtils.getCurrentContextId(); - if (!pViewName) - pViewName = context + "Admin_view"; - neon.openContext(context, pViewName, [vars.get("$sys.uid")], neon.OPERATINGSTATE_VIEW, null); -} - -openAdminView(); diff --git a/entity/Person_entity/entityfields/openadmininfo/stateProcess.js b/entity/Person_entity/entityfields/openadmininfo/stateProcess.js deleted file mode 100644 index 474d74b2ba06b587feef99332fc360ea8c184955..0000000000000000000000000000000000000000 --- a/entity/Person_entity/entityfields/openadmininfo/stateProcess.js +++ /dev/null @@ -1,13 +0,0 @@ -import("system.result"); -import("system.tools"); -import("system.neon"); - -function isAdmin () -{ - return tools.currentUserHasRole("INTERNAL_ADMINISTRATOR"); -} - -if (isAdmin()) - result.string(neon.COMPONENTSTATE_EDITABLE); -else - result.string(neon.COMPONENTSTATE_INVISIBLE); \ No newline at end of file diff --git a/entity/Person_entity/entityfields/openadminview/onActionProcess.js b/entity/Person_entity/entityfields/openadminview/onActionProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..b56b52a65ff35e86346bb7966b3cca71e3bed711 --- /dev/null +++ b/entity/Person_entity/entityfields/openadminview/onActionProcess.js @@ -0,0 +1,14 @@ +import("system.vars"); +import("Context_lib"); + +AdminViewUtils.open("CONTACTID", [ + ["PERSON_ID", vars.get("$field.PERSON_ID")], + ["ORGANISATION_ID", vars.get("$field.ORGANISATION_ID")], + ["ADDRESS_ID", vars.get("$field.ADDRESS_ID")], + ["DATE_NEW", vars.get("$field.DATE_NEW")], + ["DATE_EDIT", vars.get("$field.DATE_EDIT")], + ["DATE_NEW_CONTACT", vars.get("$field.DATE_NEW_CONTACT")], + ["USER_NEW", vars.get("$field.USER_NEW")], + ["USER_EDIT", vars.get("$field.USER_EDIT")], + ["USER_NEW_CONTACT", vars.get("$field.USER_NEW_CONTACT")], +]); \ No newline at end of file diff --git a/entity/Person_entity/entityfields/openadminview/stateProcess.js b/entity/Person_entity/entityfields/openadminview/stateProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..38f2298db7304b4d44a15fbad7f720558c02da99 --- /dev/null +++ b/entity/Person_entity/entityfields/openadminview/stateProcess.js @@ -0,0 +1,4 @@ +import("Context_lib"); +import("system.result"); + +result.string(AdminViewUtils.getActionState()); \ No newline at end of file diff --git a/entity/Prod2prod_entity/Prod2prod_entity.aod b/entity/Prod2prod_entity/Prod2prod_entity.aod index 63a7816bbe839fa69fa802663c320bbf79785872..c8d8cddf6460088c621a11411b917f6834ef88c4 100644 --- a/entity/Prod2prod_entity/Prod2prod_entity.aod +++ b/entity/Prod2prod_entity/Prod2prod_entity.aod @@ -158,6 +158,9 @@ <jDitoRecordFieldMapping> <name>TAKEPRICE.value</name> </jDitoRecordFieldMapping> + <jDitoRecordFieldMapping> + <name>SOURCE_ID.displayValue</name> + </jDitoRecordFieldMapping> </recordFieldMappings> </jDitoRecordContainer> </recordContainers> diff --git a/entity/Prod2prod_entity/recordcontainers/jdito/contentProcess.js b/entity/Prod2prod_entity/recordcontainers/jdito/contentProcess.js index a06514c8f8c855531d3b59e0a435121dd5c2783c..549dd18c52b622b1419a23e002b166558d30623c 100644 --- a/entity/Prod2prod_entity/recordcontainers/jdito/contentProcess.js +++ b/entity/Prod2prod_entity/recordcontainers/jdito/contentProcess.js @@ -1,3 +1,4 @@ +import("system.logging"); import("system.neon"); import("system.result"); import("system.vars"); @@ -124,7 +125,7 @@ var prodid = vars.exists("$param.ProductId_param") if(prodid != "") { // First 3 columns are crucial, the rest is optional. - var data = db.table("select PROD2PRODID, SOURCE_ID, DEST_ID, QUANTITY, PRODUCTCODE, PRODUCTID, PROD2PRODID, OPTIONAL, TAKEPRICE " + var data = db.table("select PROD2PRODID, SOURCE_ID, DEST_ID, QUANTITY, PRODUCTCODE, PRODUCTID, PROD2PRODID, OPTIONAL, TAKEPRICE, PRODUCTNAME " + "from PROD2PROD join PRODUCT on PROD2PROD.SOURCE_ID = PRODUCTID " + "order by PRODUCTCODE"); @@ -139,5 +140,6 @@ if(prodid != "") graphData.forEach(function (gd) { allData.push(gd); }) }) + logging.log(JSON.stringify(allData, null, "\t")) result.object(allData); } \ No newline at end of file diff --git a/entity/Product_entity/Product_entity.aod b/entity/Product_entity/Product_entity.aod index a187dc29370693cc39c689596d2b00178e6dc36a..631c68ce9e7dd046284afa113fa6150eb5c92f60 100644 --- a/entity/Product_entity/Product_entity.aod +++ b/entity/Product_entity/Product_entity.aod @@ -442,6 +442,13 @@ </entityParameter> </children> </entityConsumer> + <entityActionField> + <name>openAdminView</name> + <title>Open admin view</title> + <onActionProcess>%aditoprj%/entity/Product_entity/entityfields/openadminview/onActionProcess.js</onActionProcess> + <iconId>VAADIN:CURLY_BRACKETS</iconId> + <stateProcess>%aditoprj%/entity/Product_entity/entityfields/openadminview/stateProcess.js</stateProcess> + </entityActionField> </entityFields> <recordContainers> <dbRecordContainer> diff --git a/entity/Product_entity/entityfields/openadminview/onActionProcess.js b/entity/Product_entity/entityfields/openadminview/onActionProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..f3bc924625a437b26dbcb3a019d95a4535c99637 --- /dev/null +++ b/entity/Product_entity/entityfields/openadminview/onActionProcess.js @@ -0,0 +1,10 @@ +import("system.vars"); +import("Context_lib"); + +AdminViewUtils.open("PRODUCTID", [ + ["CONTACT_ID", vars.get("$field.CONTACT_ID")], + ["DATE_NEW", vars.get("$field.DATE_NEW")], + ["DATE_EDIT", vars.get("$field.DATE_EDIT")], + ["USER_NEW", vars.get("$field.USER_NEW")], + ["USER_EDIT", vars.get("$field.USER_EDIT")] +]); \ No newline at end of file diff --git a/entity/Product_entity/entityfields/openadminview/stateProcess.js b/entity/Product_entity/entityfields/openadminview/stateProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..38f2298db7304b4d44a15fbad7f720558c02da99 --- /dev/null +++ b/entity/Product_entity/entityfields/openadminview/stateProcess.js @@ -0,0 +1,4 @@ +import("Context_lib"); +import("system.result"); + +result.string(AdminViewUtils.getActionState()); \ No newline at end of file diff --git a/entity/Role_entity/Role_entity.aod b/entity/Role_entity/Role_entity.aod index 9d09bd1aa18c49150ce2cf1504acefac0390280f..f6f3b52b8345bc3a535cddc9c57a69c375523fc6 100644 --- a/entity/Role_entity/Role_entity.aod +++ b/entity/Role_entity/Role_entity.aod @@ -10,6 +10,14 @@ <entityFields> <entityProvider> <name>#PROVIDER</name> + <dependencies> + <entityDependency> + <name>69cd98b9-9cb4-4892-b60e-0c3e93a1773d</name> + <entityName>EmployeeRole_entity</entityName> + <fieldName>Roles</fieldName> + <isConsumer v="false" /> + </entityDependency> + </dependencies> </entityProvider> <entityField> <name>ROLETITLE</name> diff --git a/entity/SalesprojectMilestone_entity/SalesprojectMilestone_entity.aod b/entity/SalesprojectMilestone_entity/SalesprojectMilestone_entity.aod index a440d99c1eb9d4a218a05ad98ecb1dd289bd77bb..2e2402e44fa73292fa12ff1840ed36389f8bcbd7 100644 --- a/entity/SalesprojectMilestone_entity/SalesprojectMilestone_entity.aod +++ b/entity/SalesprojectMilestone_entity/SalesprojectMilestone_entity.aod @@ -3,6 +3,9 @@ <name>SalesprojectMilestone_entity</name> <majorModelMode>DISTRIBUTED</majorModelMode> <title></title> + <grantCreate v="false" /> + <grantUpdate v="false" /> + <grantDelete v="false" /> <contentTitleProcess>%aditoprj%/entity/SalesprojectMilestone_entity/contentTitleProcess.js</contentTitleProcess> <recordContainer>db</recordContainer> <entityFields> @@ -74,9 +77,6 @@ <title>Days count</title> <valueProcess>%aditoprj%/entity/SalesprojectMilestone_entity/entityfields/dayscount/valueProcess.js</valueProcess> </entityField> - <entityField> - <name>PARENT</name> - </entityField> <entityConsumer> <name>Keywords</name> <dependency> @@ -132,6 +132,21 @@ </entityParameter> </children> </entityProvider> + <entityConsumer> + <name>SalesProjectPhases</name> + <dependency> + <name>dependency</name> + <entityName>SalesprojectPhase_entity</entityName> + <fieldName>Phases</fieldName> + </dependency> + </entityConsumer> + <entityField> + <name>PARENT_ID</name> + </entityField> + <entityField> + <name>dateEndGantt</name> + <valueProcess>%aditoprj%/entity/SalesprojectMilestone_entity/entityfields/dateendgantt/valueProcess.js</valueProcess> + </entityField> </entityFields> <recordContainers> <dbRecordContainer> @@ -176,8 +191,8 @@ <recordfield>SALESPROJECT_MILESTONE.SALESPROJECT_ID</recordfield> </dbRecordFieldMapping> <dbRecordFieldMapping> - <name>PARENT.value</name> - <expression>%aditoprj%/entity/SalesprojectMilestone_entity/recordcontainers/db/recordfieldmappings/parent.value/expression.js</expression> + <name>PARENT_ID.value</name> + <recordfield>SALESPROJECT_MILESTONE.PARENT_ID</recordfield> </dbRecordFieldMapping> </recordFieldMappings> </dbRecordContainer> diff --git a/entity/SalesprojectMilestone_entity/entityfields/dateendgantt/valueProcess.js b/entity/SalesprojectMilestone_entity/entityfields/dateendgantt/valueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..ee9ef0f40067fc309f940d6b2ef7e7fc90d35f2f --- /dev/null +++ b/entity/SalesprojectMilestone_entity/entityfields/dateendgantt/valueProcess.js @@ -0,0 +1,9 @@ +import("system.result"); +import("system.vars"); + +if (!vars.get("$field.DATE_END")) +{ + result.string(vars.get("$sys.date")); +} else { + result.string(vars.get("$field.DATE_END")); +} \ No newline at end of file diff --git a/entity/SalesprojectMilestone_entity/recordcontainers/db/recordfieldmappings/parent.value/expression.js b/entity/SalesprojectMilestone_entity/recordcontainers/db/recordfieldmappings/parent.value/expression.js deleted file mode 100644 index e5c82e9c86a2c395736339cb57fe1e2fede85a2e..0000000000000000000000000000000000000000 --- a/entity/SalesprojectMilestone_entity/recordcontainers/db/recordfieldmappings/parent.value/expression.js +++ /dev/null @@ -1,2 +0,0 @@ -import("system.result"); -result.string("''") \ No newline at end of file diff --git a/entity/SalesprojectPhase_entity/SalesprojectPhase_entity.aod b/entity/SalesprojectPhase_entity/SalesprojectPhase_entity.aod index ef583549d67921890ca9c1b35d265af872c307c0..087a77e360c37e172ddc0c03195bc978203493ae 100644 --- a/entity/SalesprojectPhase_entity/SalesprojectPhase_entity.aod +++ b/entity/SalesprojectPhase_entity/SalesprojectPhase_entity.aod @@ -3,6 +3,9 @@ <name>SalesprojectPhase_entity</name> <majorModelMode>DISTRIBUTED</majorModelMode> <title>Phase</title> + <siblings> + <element>SalesprojectMilestone_entity</element> + </siblings> <titlePlural>Phases</titlePlural> <recordContainer>jdito</recordContainer> <entityFields> @@ -35,6 +38,12 @@ <fieldName>SalesprojectPhaseStepper</fieldName> <isConsumer v="false" /> </entityDependency> + <entityDependency> + <name>26a15e56-6ce6-4d6a-9e46-793c10ac3aa6</name> + <entityName>SalesprojectMilestone_entity</entityName> + <fieldName>SalesProjectPhases</fieldName> + <isConsumer v="false" /> + </entityDependency> </dependencies> </entityProvider> </entityFields> diff --git a/entity/SalesprojectPhase_entity/recordcontainers/jdito/contentProcess.js b/entity/SalesprojectPhase_entity/recordcontainers/jdito/contentProcess.js index 38fe36fcf5a06ce3ad5c65dfa486ebd6fdf70f36..686167534bfb92567678789679443ec38d8bc940 100644 --- a/entity/SalesprojectPhase_entity/recordcontainers/jdito/contentProcess.js +++ b/entity/SalesprojectPhase_entity/recordcontainers/jdito/contentProcess.js @@ -1,4 +1,3 @@ -import("system.logging"); import("Sql_lib"); import("system.db"); import("Keyword_lib"); @@ -8,9 +7,8 @@ import("system.vars"); var steps = KeywordUtils.getEntryNamesAndIdsByContainer($KeywordRegistry.salesprojectPhase()); var selection = vars.get("$sys.selection"); -logging.log(selection.toSource()); var selected = vars.exists("$param.CurrentPhase_param") && vars.get("$param.CurrentPhase_param"); -logging.log(selected); + var res = []; steps.forEach(function ([stepId, title]) @@ -20,7 +18,7 @@ steps.forEach(function ([stepId, title]) else res.push([stepId, stepId === selected ? "ACTIVE" : "EDITABLE", title, _getIcon(stepId)]); }); -logging.log(res.toSource()) + result.object(res); function _getIcon (pPhase) diff --git a/entity/Salesproject_entity/Salesproject_entity.aod b/entity/Salesproject_entity/Salesproject_entity.aod index 1539e8243b6c9fe1b705c2098c7bf183c3bd8bdf..35672a93d575c510f6f060b3588be9cee4a8ddb6 100644 --- a/entity/Salesproject_entity/Salesproject_entity.aod +++ b/entity/Salesproject_entity/Salesproject_entity.aod @@ -3,6 +3,9 @@ <name>Salesproject_entity</name> <majorModelMode>DISTRIBUTED</majorModelMode> <title>Salesproject</title> + <siblings> + <element>SalesprojectMilestone_entity</element> + </siblings> <contentTitleProcess>%aditoprj%/entity/Salesproject_entity/contentTitleProcess.js</contentTitleProcess> <afterUiInit>%aditoprj%/entity/Salesproject_entity/afterUiInit.js</afterUiInit> <onValidation>%aditoprj%/entity/Salesproject_entity/onValidation.js</onValidation> @@ -667,6 +670,13 @@ <contentType>HTML</contentType> <valueProcess>%aditoprj%/entity/Salesproject_entity/entityfields/phaseinfo/valueProcess.js</valueProcess> </entityField> + <entityActionField> + <name>openAdminView</name> + <title>Open admin view</title> + <onActionProcess>%aditoprj%/entity/Salesproject_entity/entityfields/openadminview/onActionProcess.js</onActionProcess> + <iconId>VAADIN:CURLY_BRACKETS</iconId> + <stateProcess>%aditoprj%/entity/Salesproject_entity/entityfields/openadminview/stateProcess.js</stateProcess> + </entityActionField> </entityFields> <recordContainers> <dbRecordContainer> diff --git a/entity/Salesproject_entity/entityfields/openadminview/onActionProcess.js b/entity/Salesproject_entity/entityfields/openadminview/onActionProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..246f5181a434a2f382ae05fadc22a3e57d4cf765 --- /dev/null +++ b/entity/Salesproject_entity/entityfields/openadminview/onActionProcess.js @@ -0,0 +1,6 @@ +import("system.vars"); +import("Context_lib"); + +AdminViewUtils.open("SALESPROJECTID", [ + ["CONTACT_ID", vars.get("$field.CONTACT_ID")] +]); \ No newline at end of file diff --git a/entity/Salesproject_entity/entityfields/openadminview/stateProcess.js b/entity/Salesproject_entity/entityfields/openadminview/stateProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..38f2298db7304b4d44a15fbad7f720558c02da99 --- /dev/null +++ b/entity/Salesproject_entity/entityfields/openadminview/stateProcess.js @@ -0,0 +1,4 @@ +import("Context_lib"); +import("system.result"); + +result.string(AdminViewUtils.getActionState()); \ No newline at end of file diff --git a/entity/Salesproject_entity/entityfields/salesprojectforecastcharts/children/yearcounttoshow_param/valueProcess.js b/entity/Salesproject_entity/entityfields/salesprojectforecastcharts/children/yearcounttoshow_param/valueProcess.js index cfe5e471ffaccae236fa2eb676a3a3e4979edfa4..4b8bb66ab4e67c1042fa9c62ba85e37c230e451d 100644 --- a/entity/Salesproject_entity/entityfields/salesprojectforecastcharts/children/yearcounttoshow_param/valueProcess.js +++ b/entity/Salesproject_entity/entityfields/salesprojectforecastcharts/children/yearcounttoshow_param/valueProcess.js @@ -1,4 +1,3 @@ -import("system.logging"); import("system.vars"); import("system.result"); import("system.datetime"); diff --git a/entity/SupportTicket_entity/SupportTicket_entity.aod b/entity/SupportTicket_entity/SupportTicket_entity.aod index cfb5e2f208ebc097a37f1142fda6c9a3c916a89d..c70b106a92077b5fb48505b20418251d75e6decb 100644 --- a/entity/SupportTicket_entity/SupportTicket_entity.aod +++ b/entity/SupportTicket_entity/SupportTicket_entity.aod @@ -310,6 +310,59 @@ <fieldName>Employees</fieldName> </dependency> </entityConsumer> + <entityActionField> + <name>newActivity</name> + <title>New activity</title> + <onActionProcess>%aditoprj%/entity/SupportTicket_entity/entityfields/newactivity/onActionProcess.js</onActionProcess> + <iconId>VAADIN:HOURGLASS_END</iconId> + <tooltipProcess>%aditoprj%/entity/SupportTicket_entity/entityfields/newactivity/tooltipProcess.js</tooltipProcess> + </entityActionField> + <entityActionField> + <name>newTask</name> + <title>New task</title> + <onActionProcess>%aditoprj%/entity/SupportTicket_entity/entityfields/newtask/onActionProcess.js</onActionProcess> + <iconId>VAADIN:TASKS</iconId> + </entityActionField> + <entityConsumer> + <name>ModuleTrees</name> + <dependency> + <name>dependency</name> + <entityName>ModuleTree_entity</entityName> + <fieldName>TreeProviders</fieldName> + </dependency> + <children> + <entityParameter> + <name>ContextName_param</name> + <valueProcess>%aditoprj%/entity/SupportTicket_entity/entityfields/moduletrees/children/contextname_param/valueProcess.js</valueProcess> + </entityParameter> + <entityParameter> + <name>ID_param</name> + <valueProcess>%aditoprj%/entity/SupportTicket_entity/entityfields/moduletrees/children/id_param/valueProcess.js</valueProcess> + </entityParameter> + </children> + </entityConsumer> + <entityField> + <name>TASK_PARENT_ID</name> + <valueProcess>%aditoprj%/entity/SupportTicket_entity/entityfields/task_parent_id/valueProcess.js</valueProcess> + </entityField> + <entityField> + <name>TASK_PARENT_CONTEXT</name> + <valueProcess>%aditoprj%/entity/SupportTicket_entity/entityfields/task_parent_context/valueProcess.js</valueProcess> + </entityField> + <entityParameter> + <name>ParentContext_param</name> + <expose v="true" /> + </entityParameter> + <entityParameter> + <name>ParentId_param</name> + <expose v="true" /> + </entityParameter> + <entityActionField> + <name>newSupportticket</name> + <title>New Supportticket</title> + <onActionProcess>%aditoprj%/entity/SupportTicket_entity/entityfields/newsupportticket/onActionProcess.js</onActionProcess> + <iconId>VAADIN:QUESTION</iconId> + </entityActionField> </entityFields> <recordContainers> <dbRecordContainer> @@ -323,14 +376,14 @@ <onDBDelete>%aditoprj%/entity/SupportTicket_entity/recordcontainers/db/onDBDelete.js</onDBDelete> <linkInformation> <linkInformation> - <name>ec5c2cd3-f05b-467f-88c6-c1d4d7de87cc</name> + <name>512c662b-33f6-4491-bd24-a8b862f2de84</name> <tableName>TICKET</tableName> <primaryKey>TICKETID</primaryKey> <isUIDTable v="true" /> <readonly v="false" /> </linkInformation> <linkInformation> - <name>d73da2b3-bc44-4909-9bc0-9298cf57e7d7</name> + <name>4e818524-bb9c-46e7-a336-e48da60c06d1</name> <tableName>TASK</tableName> <primaryKey>TASKID</primaryKey> <isUIDTable v="false" /> @@ -418,6 +471,14 @@ <name>TICKETTYPE.value</name> <recordfield>TICKET.TICKETTYPE</recordfield> </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>TASK_PARENT_ID.value</name> + <recordfield>TASK.PARENT_ID</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>TASK_PARENT_CONTEXT.value</name> + <recordfield>TASK.PARENT_CONTEXT</recordfield> + </dbRecordFieldMapping> </recordFieldMappings> </dbRecordContainer> </recordContainers> diff --git a/entity/SupportTicket_entity/entityfields/keywordtaskstate/children/whitelistids_param/valueProcess.js b/entity/SupportTicket_entity/entityfields/keywordtaskstate/children/whitelistids_param/valueProcess.js index 4ee2bf21d31ab11aeeb48c898fc04fc05561bb47..0035c1d5e5ed84739103be35b6bf248bbddd8a61 100644 --- a/entity/SupportTicket_entity/entityfields/keywordtaskstate/children/whitelistids_param/valueProcess.js +++ b/entity/SupportTicket_entity/entityfields/keywordtaskstate/children/whitelistids_param/valueProcess.js @@ -1,6 +1,4 @@ -import("system.logging"); import("system.vars"); import("system.result"); import("Ticket_lib"); -logging.log(TicketUtils.begin(vars.get("$field.TICKETTYPE")).getAvailableStatus()) result.object(TicketUtils.begin(vars.get("$field.TICKETTYPE")).getAvailableStatus()) \ No newline at end of file diff --git a/entity/SupportTicket_entity/entityfields/moduletrees/children/contextname_param/valueProcess.js b/entity/SupportTicket_entity/entityfields/moduletrees/children/contextname_param/valueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..5996e99db232db8df50f155732110608e5abff4e --- /dev/null +++ b/entity/SupportTicket_entity/entityfields/moduletrees/children/contextname_param/valueProcess.js @@ -0,0 +1,4 @@ +import("system.result"); +import("Context_lib"); + +result.string(ContextUtils.getCurrentContextId()); \ No newline at end of file diff --git a/entity/SupportTicket_entity/entityfields/moduletrees/children/id_param/valueProcess.js b/entity/SupportTicket_entity/entityfields/moduletrees/children/id_param/valueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..9a7beeda9976ba10d5b1a62b4ed4da94ecb88be8 --- /dev/null +++ b/entity/SupportTicket_entity/entityfields/moduletrees/children/id_param/valueProcess.js @@ -0,0 +1,4 @@ +import("system.result"); +import("system.vars"); + +result.string(vars.get("$field.TICKETID")); \ No newline at end of file diff --git a/entity/SupportTicket_entity/entityfields/newactivity/onActionProcess.js b/entity/SupportTicket_entity/entityfields/newactivity/onActionProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..eef55adcac837abb1557202539e0fabc2c0ae815 --- /dev/null +++ b/entity/SupportTicket_entity/entityfields/newactivity/onActionProcess.js @@ -0,0 +1,5 @@ +import("system.vars"); +import("ActivityTask_lib"); +import("Context_lib"); + +ActivityUtils.createNewActivity(undefined, undefined, ContextUtils.getCurrentContextId(), vars.get("$field.TICKETID")); \ No newline at end of file diff --git a/entity/SupportTicket_entity/entityfields/newactivity/tooltipProcess.js b/entity/SupportTicket_entity/entityfields/newactivity/tooltipProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..2cdf4480a4bb519f955eb0f5a3c84ddd7bf3e5f7 --- /dev/null +++ b/entity/SupportTicket_entity/entityfields/newactivity/tooltipProcess.js @@ -0,0 +1,4 @@ +import("system.translate"); +import("system.result"); + +result.string(translate.text("New activity")); \ No newline at end of file diff --git a/entity/SupportTicket_entity/entityfields/newsupportticket/onActionProcess.js b/entity/SupportTicket_entity/entityfields/newsupportticket/onActionProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..b4a52cb145e6a84b79dfb72ba4ef97e2f981efce --- /dev/null +++ b/entity/SupportTicket_entity/entityfields/newsupportticket/onActionProcess.js @@ -0,0 +1,6 @@ +import("system.vars"); +import("ActivityTask_lib"); +import("Context_lib"); +import("Ticket_lib") + +TicketUtils.createNewTicket(undefined, undefined, ContextUtils.getCurrentContextId(), vars.get("$field.TICKETID")) \ No newline at end of file diff --git a/entity/SupportTicket_entity/entityfields/newtask/onActionProcess.js b/entity/SupportTicket_entity/entityfields/newtask/onActionProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..be994af3d1ae682b70b4dacdd41dd60805761258 --- /dev/null +++ b/entity/SupportTicket_entity/entityfields/newtask/onActionProcess.js @@ -0,0 +1,5 @@ +import("system.vars"); +import("ActivityTask_lib"); +import("Context_lib"); + +TaskUtils.createNewTask(undefined, undefined, ContextUtils.getCurrentContextId(), vars.get("$field.TICKETID")); \ No newline at end of file diff --git a/entity/SupportTicket_entity/entityfields/task_parent_context/valueProcess.js b/entity/SupportTicket_entity/entityfields/task_parent_context/valueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..a9e15f730fb836d07ab0f258ac89fa0e91e69e22 --- /dev/null +++ b/entity/SupportTicket_entity/entityfields/task_parent_context/valueProcess.js @@ -0,0 +1,4 @@ +import("system.vars"); +import("system.result"); + +result.string(vars.get("$param.ParentContext_param")); diff --git a/entity/SupportTicket_entity/entityfields/task_parent_id/valueProcess.js b/entity/SupportTicket_entity/entityfields/task_parent_id/valueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..6de1c77ad4afafc727dff8caf06ee047aaeb2758 --- /dev/null +++ b/entity/SupportTicket_entity/entityfields/task_parent_id/valueProcess.js @@ -0,0 +1,4 @@ +import("system.vars"); +import("system.result"); + +result.string(vars.get("$param.ParentId_param")); diff --git a/entity/SupportTicket_entity/recordcontainers/db/conditionProcess.js b/entity/SupportTicket_entity/recordcontainers/db/conditionProcess.js index 7aed878b9c800335d8ba7d6747eb5f84d99e0459..ee924d8bf89b12b609a37e7428ca01f99d6566b4 100644 --- a/entity/SupportTicket_entity/recordcontainers/db/conditionProcess.js +++ b/entity/SupportTicket_entity/recordcontainers/db/conditionProcess.js @@ -1,4 +1,3 @@ -import("system.logging"); import("Employee_lib"); import("system.vars"); import("system.db"); @@ -23,11 +22,11 @@ if (vars.getString("$param.FilterOnlyOwnTicket_param") == "true") if (vars.exists("$param.RowId_param") && vars.get("$param.RowId_param") && vars.exists("$param.ObjectId_param") && vars.get("$param.ObjectId_param")) { - var activityLinkCond = SqlCondition.begin().andPrepareVars("TASKLINK.OBJECT_ROWID", "$param.RowId_param") + var taskLinkCond = SqlCondition.begin().andPrepareVars("TASKLINK.OBJECT_ROWID", "$param.RowId_param") .andPrepareVars("TASKLINK.OBJECT_TYPE", "$param.ObjectId_param"); // TODO: more performant way than IN. Maybe a join? - cond.and(db.translateStatement(activityLinkCond.buildSql("TASK.TASKID in (select TASKLINK.TASK_ID from TASKLINK", "1=2", ")"))) + cond.and(db.translateStatement(taskLinkCond.buildSql("TASK.TASKID in (select TASKLINK.TASK_ID from TASKLINK", "1=2", ")"))) } if (loadNothing) @@ -38,6 +37,5 @@ else { //TODO: use a preparedCondition when available #1030812 #1034026 var resCond = db.translateCondition(cond.build("1=1")); - logging.log(resCond) result.string(resCond); } \ No newline at end of file diff --git a/entity/SupportTicket_entity/recordcontainers/db/onDBDelete.js b/entity/SupportTicket_entity/recordcontainers/db/onDBDelete.js index 533e52691a63b864202ef1d916048b1f7d289144..0245f4ad4d081303f5d24769a09a9ef11b745ed6 100644 --- a/entity/SupportTicket_entity/recordcontainers/db/onDBDelete.js +++ b/entity/SupportTicket_entity/recordcontainers/db/onDBDelete.js @@ -1,9 +1,7 @@ -import("system.logging"); import("system.vars"); import("system.db"); import("Sql_lib"); var condition = SqlCondition.begin() .andPrepareVars("TASKLINK.TASK_ID", "$field.TASK_TASKID"); -logging.log("delete " + vars.get("$field.TASK_TASKID")) db.deleteData("TASKLINK", condition.build("1=2")); \ No newline at end of file diff --git a/entity/Task_entity/Task_entity.aod b/entity/Task_entity/Task_entity.aod index 4703d5dcdba710183cff3f004e32fb211206ea3d..5029c02d1f7d08be17c89e5514fd4a202f66bbb1 100644 --- a/entity/Task_entity/Task_entity.aod +++ b/entity/Task_entity/Task_entity.aod @@ -1,521 +1,529 @@ -<?xml version="1.0" encoding="UTF-8"?> -<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.9" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.9"> - <name>Task_entity</name> - <majorModelMode>DISTRIBUTED</majorModelMode> - <documentation>%aditoprj%/entity/Task_entity/documentation.adoc</documentation> - <title>Task</title> - <contentTitleProcess>%aditoprj%/entity/Task_entity/contentTitleProcess.js</contentTitleProcess> - <afterUiInit>%aditoprj%/entity/Task_entity/afterUiInit.js</afterUiInit> - <onValidation>%aditoprj%/entity/Task_entity/onValidation.js</onValidation> - <iconId>VAADIN:TASKS</iconId> - <iconIdProcess>%aditoprj%/entity/Task_entity/iconIdProcess.js</iconIdProcess> - <titlePlural>Tasks</titlePlural> - <recordContainer>db</recordContainer> - <entityFields> - <entityProvider> - <name>#PROVIDER</name> - <recordContainer>db</recordContainer> - </entityProvider> - <entityField> - <name>SUBJECT</name> - <title>subject</title> - <mandatory v="true" /> - </entityField> - <entityField> - <name>STATUS</name> - <title>{$TASK_STATUS}</title> - <consumer>KeywordStates</consumer> - <groupable v="true" /> - <mandatory v="true" /> - <valueProcess>%aditoprj%/entity/Task_entity/entityfields/status/valueProcess.js</valueProcess> - <displayValueProcess>%aditoprj%/entity/Task_entity/entityfields/status/displayValueProcess.js</displayValueProcess> - </entityField> - <entityField> - <name>PRIORITY</name> - <title>Priority</title> - <consumer>KeywordPriorities</consumer> - <groupable v="true" /> - <mandatory v="true" /> - <valueProcess>%aditoprj%/entity/Task_entity/entityfields/priority/valueProcess.js</valueProcess> - <displayValueProcess>%aditoprj%/entity/Task_entity/entityfields/priority/displayValueProcess.js</displayValueProcess> - </entityField> - <entityField> - <name>REQUESTOR_CONTACT_ID</name> - <title>{$TASK_REQUESTOR}</title> - <consumer>ContactRequestors</consumer> - <linkedContext>Person</linkedContext> - <mandatory v="true" /> - <valueProcess>%aditoprj%/entity/Task_entity/entityfields/requestor_contact_id/valueProcess.js</valueProcess> - <displayValueProcess>%aditoprj%/entity/Task_entity/entityfields/requestor_contact_id/displayValueProcess.js</displayValueProcess> - </entityField> - <entityField> - <name>EDITOR_CONTACT_ID</name> - <title>{$TASK_EDITOR}</title> - <consumer>ContactEditors</consumer> - <linkedContext>Person</linkedContext> - <displayValueProcess>%aditoprj%/entity/Task_entity/entityfields/editor_contact_id/displayValueProcess.js</displayValueProcess> - </entityField> - <entityField> - <name>START_DATE</name> - <title>Begin</title> - <contentType>DATE</contentType> - <resolution>MINUTE</resolution> - <outputFormat>dd.MM.yyyy HH:mm</outputFormat> - <inputFormat>dd.MM.yyyy HH:mm</inputFormat> - <groupable v="true" /> - <valueProcess>%aditoprj%/entity/Task_entity/entityfields/start_date/valueProcess.js</valueProcess> - </entityField> - <entityField> - <name>MATURITY_DATE</name> - <title>Maturity</title> - <contentType>DATE</contentType> - <resolution>MINUTE</resolution> - <outputFormat>dd.MM.yyyy HH:mm</outputFormat> - <inputFormat>dd.MM.yyyy HH:mm</inputFormat> - <valueProcess>%aditoprj%/entity/Task_entity/entityfields/maturity_date/valueProcess.js</valueProcess> - </entityField> - <entityField> - <name>DESCRIPTION</name> - <title>description</title> - <contentType>LONG_TEXT</contentType> - </entityField> - <entityField> - <name>PROTECTIONLEVEL</name> - <title>Protected</title> - <contentType>BOOLEAN</contentType> - <contentTypeProcess>%aditoprj%/entity/Task_entity/entityfields/protectionlevel/contentTypeProcess.js</contentTypeProcess> - <dropDownProcess>%aditoprj%/entity/Task_entity/entityfields/protectionlevel/dropDownProcess.js</dropDownProcess> - <valueProcess>%aditoprj%/entity/Task_entity/entityfields/protectionlevel/valueProcess.js</valueProcess> - </entityField> - <entityField> - <name>TASKID</name> - <title>TASKID (UID)</title> - <mandatory v="true" /> - <searchable v="false" /> - <valueProcess>%aditoprj%/entity/Task_entity/entityfields/taskid/valueProcess.js</valueProcess> - </entityField> - <entityConsumer> - <name>ContactEditors</name> - <dependency> - <name>dependency</name> - <entityName>Employee_entity</entityName> - <fieldName>Employees</fieldName> - </dependency> - <children> - <entityParameter> - <name>OnlyActives_param</name> - </entityParameter> - </children> - </entityConsumer> - <entityConsumer> - <name>ContactRequestors</name> - <dependency> - <name>dependency</name> - <entityName>Employee_entity</entityName> - <fieldName>Employees</fieldName> - </dependency> - </entityConsumer> - <entityConsumer> - <name>MainDocuments</name> - <stateProcess>%aditoprj%/entity/Task_entity/entityfields/maindocuments/stateProcess.js</stateProcess> - <dependency> - <name>dependency</name> - <entityName>Document_entity</entityName> - <fieldName>#PROVIDER</fieldName> - </dependency> - <children> - <entityParameter> - <name>AssignmentRowId_param</name> - <valueProcess>%aditoprj%/entity/Task_entity/entityfields/maindocuments/children/assignmentrowid_param/valueProcess.js</valueProcess> - </entityParameter> - <entityParameter> - <name>AssignmentTable_param</name> - <valueProcess>%aditoprj%/entity/Task_entity/entityfields/maindocuments/children/assignmenttable_param/valueProcess.js</valueProcess> - </entityParameter> - </children> - </entityConsumer> - <entityConsumer> - <name>KeywordStates</name> - <dependency> - <name>dependency</name> - <entityName>KeywordEntry_entity</entityName> - <fieldName>SpecificContainerKeywords</fieldName> - </dependency> - <children> - <entityParameter> - <name>ContainerName_param</name> - <valueProcess>%aditoprj%/entity/Task_entity/entityfields/keywordstates/children/containername_param/valueProcess.js</valueProcess> - <expose v="false" /> - </entityParameter> - <entityParameter> - <name>WhitelistIds_param</name> - <valueProcess>%aditoprj%/entity/Task_entity/entityfields/keywordstates/children/whitelistids_param/valueProcess.js</valueProcess> - </entityParameter> - </children> - </entityConsumer> - <entityConsumer> - <name>ModuleTrees</name> - <dependency> - <name>dependency</name> - <entityName>ModuleTree_entity</entityName> - <fieldName>TreeProviders</fieldName> - </dependency> - <children> - <entityParameter> - <name>ID_param</name> - <valueProcess>%aditoprj%/entity/Task_entity/entityfields/moduletrees/children/id_param/valueProcess.js</valueProcess> - <expose v="false" /> - <mandatory v="false" /> - </entityParameter> - <entityParameter> - <name>ContextName_param</name> - <valueProcess>%aditoprj%/entity/Task_entity/entityfields/moduletrees/children/contextname_param/valueProcess.js</valueProcess> - <expose v="false" /> - <mandatory v="false" /> - </entityParameter> - </children> - </entityConsumer> - <entityField> - <name>PARENT_CONTEXT</name> - <searchable v="false" /> - <valueProcess>%aditoprj%/entity/Task_entity/entityfields/parent_context/valueProcess.js</valueProcess> - </entityField> - <entityField> - <name>PARENT_ID</name> - <searchable v="false" /> - <valueProcess>%aditoprj%/entity/Task_entity/entityfields/parent_id/valueProcess.js</valueProcess> - </entityField> - <entityParameter> - <name>ParentId_param</name> - <expose v="true" /> - <description>PARAMETER</description> - </entityParameter> - <entityParameter> - <name>ParentContext_param</name> - <expose v="true" /> - <description>PARAMETER</description> - </entityParameter> - <entityActionField> - <name>newActivity</name> - <title>New activity</title> - <onActionProcess>%aditoprj%/entity/Task_entity/entityfields/newactivity/onActionProcess.js</onActionProcess> - <iconId>VAADIN:HOURGLASS_END</iconId> - <tooltip>New activity</tooltip> - <tooltipProcess>%aditoprj%/entity/Task_entity/entityfields/newactivity/tooltipProcess.js</tooltipProcess> - </entityActionField> - <entityActionField> - <name>newTask</name> - <title>New task</title> - <onActionProcess>%aditoprj%/entity/Task_entity/entityfields/newtask/onActionProcess.js</onActionProcess> - <actionOrder v="1" /> - <iconId>VAADIN:TASKS</iconId> - </entityActionField> - <entityParameter> - <name>RowId_param</name> - <expose v="true" /> - <description>PARAMETER</description> - </entityParameter> - <entityParameter> - <name>ObjectId_param</name> - <expose v="true" /> - <description>PARAMETER</description> - </entityParameter> - <entityConsumer> - <name>KeywordPriorities</name> - <dependency> - <name>dependency</name> - <entityName>KeywordEntry_entity</entityName> - <fieldName>SpecificContainerKeywords</fieldName> - </dependency> - <children> - <entityParameter> - <name>ContainerName_param</name> - <valueProcess>%aditoprj%/entity/Task_entity/entityfields/keywordpriorities/children/containername_param/valueProcess.js</valueProcess> - <expose v="false" /> - </entityParameter> - </children> - </entityConsumer> - <entityActionField> - <name>newOffer</name> - <title>New offer</title> - <onActionProcess>%aditoprj%/entity/Task_entity/entityfields/newoffer/onActionProcess.js</onActionProcess> - <actionOrder v="0" /> - <iconId>VAADIN:CART</iconId> - </entityActionField> - <entityField> - <name>PROGRESS</name> - <title>Progress</title> - <consumer>KeywordProgress</consumer> - <mandatory v="true" /> - <valueProcess>%aditoprj%/entity/Task_entity/entityfields/progress/valueProcess.js</valueProcess> - <displayValueProcess>%aditoprj%/entity/Task_entity/entityfields/progress/displayValueProcess.js</displayValueProcess> - </entityField> - <entityConsumer> - <name>KeywordProgress</name> - <dependency> - <name>dependency</name> - <entityName>KeywordEntry_entity</entityName> - <fieldName>SpecificContainerKeywords</fieldName> - </dependency> - <children> - <entityParameter> - <name>ContainerName_param</name> - <valueProcess>%aditoprj%/entity/Task_entity/entityfields/keywordprogress/children/containername_param/valueProcess.js</valueProcess> - </entityParameter> - </children> - </entityConsumer> - <entityConsumer> - <name>Links</name> - <state>EDITABLE</state> - <dependency> - <name>dependency</name> - <entityName>TaskLink_entity</entityName> - <fieldName>Link</fieldName> - </dependency> - <children> - <entityParameter> - <name>TaskId_param</name> - <valueProcess>%aditoprj%/entity/Task_entity/entityfields/links/children/taskid_param/valueProcess.js</valueProcess> - </entityParameter> - </children> - </entityConsumer> - <entityProvider> - <name>Tasks</name> - <dependencies> - <entityDependency> - <name>dd79df43-264c-494b-9c92-cadf19e61db6</name> - <entityName>Organisation_entity</entityName> - <fieldName>Tasks</fieldName> - <isConsumer v="false" /> - </entityDependency> - <entityDependency> - <name>dc29832e-15da-4f64-b17a-f1dd978ef47b</name> - <entityName>Person_entity</entityName> - <fieldName>Tasks</fieldName> - <isConsumer v="false" /> - </entityDependency> - <entityDependency> - <name>c6507834-cd91-4202-bdf7-6566f968edb4</name> - <entityName>Salesproject_entity</entityName> - <fieldName>Tasks</fieldName> - <isConsumer v="false" /> - </entityDependency> - <entityDependency> - <name>26b9b221-de02-40ef-a400-d4b5e356da0b</name> - <entityName>Offer_entity</entityName> - <fieldName>Tasks</fieldName> - <isConsumer v="false" /> - </entityDependency> - <entityDependency> - <name>b2bb448a-b647-40c8-baec-16356f3e23f5</name> - <entityName>Order_entity</entityName> - <fieldName>Tasks</fieldName> - <isConsumer v="false" /> - </entityDependency> - <entityDependency> - <name>a93f1e7e-f929-438f-8f37-21e4af8b53b6</name> - <entityName>Product_entity</entityName> - <fieldName>Tasks</fieldName> - <isConsumer v="false" /> - </entityDependency> - <entityDependency> - <name>2b0c15eb-fa9a-4ee8-a8b1-5d0f344ddad6</name> - <entityName>Contract_entity</entityName> - <fieldName>Tasks</fieldName> - <isConsumer v="false" /> - </entityDependency> - <entityDependency> - <name>335e31ad-ab67-4567-b4ea-3668f04922b2</name> - <entityName>Campaign_entity</entityName> - <fieldName>Tasks</fieldName> - <isConsumer v="false" /> - </entityDependency> - <entityDependency> - <name>fbaa2f6c-0ba1-4c93-acae-d7b636581679</name> - <entityName>CampaignStep_entity</entityName> - <fieldName>Tasks</fieldName> - <isConsumer v="false" /> - </entityDependency> - </dependencies> - <children> - <entityParameter> - <name>RowId_param</name> - <expose v="true" /> - </entityParameter> - <entityParameter> - <name>PresetLinks_param</name> - <expose v="true" /> - </entityParameter> - <entityParameter> - <name>ParentId_param</name> - <expose v="false" /> - </entityParameter> - <entityParameter> - <name>ParentContext_param</name> - <expose v="false" /> - </entityParameter> - <entityParameter> - <name>ObjectId_param</name> - <expose v="true" /> - </entityParameter> - </children> - </entityProvider> - <entityParameter> - <name>PresetLinks_param</name> - <expose v="true" /> - <documentation>%aditoprj%/entity/Task_entity/entityfields/presetlinks_param/documentation.adoc</documentation> - <description>PARAMETER</description> - </entityParameter> - <entityField> - <name>SUBJECT_DETAILS</name> - <title>subject</title> - <linkedContext>Task</linkedContext> - <valueProcess>%aditoprj%/entity/Task_entity/entityfields/subject_details/valueProcess.js</valueProcess> - </entityField> - <entityParameter> - <name>FilterOnlyOwnTask_param</name> - <valueProcess>%aditoprj%/entity/Task_entity/entityfields/filteronlyowntask_param/valueProcess.js</valueProcess> - <expose v="true" /> - <description>PARAMETER</description> - </entityParameter> - <entityField> - <name>PRIORITY_ICON</name> - <colorProcess>%aditoprj%/entity/Task_entity/entityfields/priority_icon/colorProcess.js</colorProcess> - <contentType>IMAGE</contentType> - <valueProcess>%aditoprj%/entity/Task_entity/entityfields/priority_icon/valueProcess.js</valueProcess> - </entityField> - <entityConsumer> - <name>LogHistories</name> - <dependency> - <name>dependency</name> - <entityName>LogHistory_entity</entityName> - <fieldName>LogHistoryProvider</fieldName> - </dependency> - <children> - <entityParameter> - <name>tablenames_param</name> - <valueProcess>%aditoprj%/entity/Task_entity/entityfields/loghistories/children/tablenames_param/valueProcess.js</valueProcess> - </entityParameter> - </children> - </entityConsumer> - <entityConsumer> - <name>Documents</name> - <selectionMode>MULTI</selectionMode> - <dependency> - <name>dependency</name> - <entityName>Document_entity</entityName> - <fieldName>Documents</fieldName> - </dependency> - <children> - <entityParameter> - <name>AssignmentRowId_param</name> - <valueProcess>%aditoprj%/entity/Task_entity/entityfields/documents/children/assignmentrowid_param/valueProcess.js</valueProcess> - </entityParameter> - <entityParameter> - <name>AssignmentTable_param</name> - <valueProcess>%aditoprj%/entity/Task_entity/entityfields/documents/children/assignmenttable_param/valueProcess.js</valueProcess> - </entityParameter> - </children> - </entityConsumer> - <entityField> - <name>TYPE</name> - <valueProcess>%aditoprj%/entity/Task_entity/entityfields/type/valueProcess.js</valueProcess> - </entityField> - </entityFields> - <recordContainers> - <dbRecordContainer> - <name>db</name> - <alias>Data_alias</alias> - <conditionProcess>%aditoprj%/entity/Task_entity/recordcontainers/db/conditionProcess.js</conditionProcess> - <orderClauseProcess>%aditoprj%/entity/Task_entity/recordcontainers/db/orderClauseProcess.js</orderClauseProcess> - <onDBDelete>%aditoprj%/entity/Task_entity/recordcontainers/db/onDBDelete.js</onDBDelete> - <linkInformation> - <linkInformation> - <name>6dfe6f25-2b83-413b-89e4-5c5b9839be2e</name> - <tableName>TASK</tableName> - <primaryKey>TASKID</primaryKey> - <isUIDTable v="true" /> - <readonly v="false" /> - </linkInformation> - </linkInformation> - <recordFieldMappings> - <dbRecordFieldMapping> - <name>DESCRIPTION.value</name> - <recordfield>TASK.DESCRIPTION</recordfield> - </dbRecordFieldMapping> - <dbRecordFieldMapping> - <name>EDITOR_CONTACT_ID.value</name> - <recordfield>TASK.EDITOR_CONTACT_ID</recordfield> - </dbRecordFieldMapping> - <dbRecordFieldMapping> - <name>MATURITY_DATE.value</name> - <recordfield>TASK.MATURITY_DATE</recordfield> - </dbRecordFieldMapping> - <dbRecordFieldMapping> - <name>PRIORITY.value</name> - <recordfield>TASK.PRIORITY</recordfield> - </dbRecordFieldMapping> - <dbRecordFieldMapping> - <name>PROTECTIONLEVEL.value</name> - <recordfield>TASK.PROTECTIONLEVEL</recordfield> - </dbRecordFieldMapping> - <dbRecordFieldMapping> - <name>REQUESTOR_CONTACT_ID.value</name> - <recordfield>TASK.REQUESTOR_CONTACT_ID</recordfield> - </dbRecordFieldMapping> - <dbRecordFieldMapping> - <name>START_DATE.value</name> - <recordfield>TASK.START_DATE</recordfield> - </dbRecordFieldMapping> - <dbRecordFieldMapping> - <name>STATUS.value</name> - <recordfield>TASK.STATUS</recordfield> - </dbRecordFieldMapping> - <dbRecordFieldMapping> - <name>SUBJECT.value</name> - <recordfield>TASK.SUBJECT</recordfield> - </dbRecordFieldMapping> - <dbRecordFieldMapping> - <name>TASKID.value</name> - <recordfield>TASK.TASKID</recordfield> - </dbRecordFieldMapping> - <dbRecordFieldMapping> - <name>EDITOR_CONTACT_ID.displayValue</name> - <expression>%aditoprj%/entity/Task_entity/recordcontainers/db/recordfieldmappings/editor_contact_id.displayvalue/expression.js</expression> - </dbRecordFieldMapping> - <dbRecordFieldMapping> - <name>REQUESTOR_CONTACT_ID.displayValue</name> - <expression>%aditoprj%/entity/Task_entity/recordcontainers/db/recordfieldmappings/requestor_contact_id.displayvalue/expression.js</expression> - </dbRecordFieldMapping> - <dbRecordFieldMapping> - <name>PARENT_CONTEXT.value</name> - <recordfield>TASK.PARENT_CONTEXT</recordfield> - </dbRecordFieldMapping> - <dbRecordFieldMapping> - <name>PARENT_ID.value</name> - <recordfield>TASK.PARENT_ID</recordfield> - </dbRecordFieldMapping> - <dbRecordFieldMapping> - <name>PRIORITY.displayValue</name> - <expression>%aditoprj%/entity/Task_entity/recordcontainers/db/recordfieldmappings/priority.displayvalue/expression.js</expression> - </dbRecordFieldMapping> - <dbRecordFieldMapping> - <name>PROGRESS.value</name> - <recordfield>TASK.PROGRESS</recordfield> - </dbRecordFieldMapping> - <dbRecordFieldMapping> - <name>PROGRESS.displayValue</name> - <expression>%aditoprj%/entity/Task_entity/recordcontainers/db/recordfieldmappings/progress.displayvalue/expression.js</expression> - </dbRecordFieldMapping> - <dbRecordFieldMapping> - <name>STATUS.displayValue</name> - <expression>%aditoprj%/entity/Task_entity/recordcontainers/db/recordfieldmappings/status.displayvalue/expression.js</expression> - </dbRecordFieldMapping> - <dbRecordFieldMapping> - <name>TYPE.value</name> - <recordfield>TASK.TYPE</recordfield> - </dbRecordFieldMapping> - </recordFieldMappings> - </dbRecordContainer> - </recordContainers> -</entity> +<?xml version="1.0" encoding="UTF-8"?> +<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.9" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.9"> + <name>Task_entity</name> + <majorModelMode>DISTRIBUTED</majorModelMode> + <documentation>%aditoprj%/entity/Task_entity/documentation.adoc</documentation> + <title>Task</title> + <contentTitleProcess>%aditoprj%/entity/Task_entity/contentTitleProcess.js</contentTitleProcess> + <afterUiInit>%aditoprj%/entity/Task_entity/afterUiInit.js</afterUiInit> + <onValidation>%aditoprj%/entity/Task_entity/onValidation.js</onValidation> + <iconId>VAADIN:TASKS</iconId> + <iconIdProcess>%aditoprj%/entity/Task_entity/iconIdProcess.js</iconIdProcess> + <titlePlural>Tasks</titlePlural> + <recordContainer>db</recordContainer> + <entityFields> + <entityProvider> + <name>#PROVIDER</name> + <recordContainer>db</recordContainer> + </entityProvider> + <entityField> + <name>SUBJECT</name> + <title>subject</title> + <mandatory v="true" /> + </entityField> + <entityField> + <name>STATUS</name> + <title>{$TASK_STATUS}</title> + <consumer>KeywordStates</consumer> + <groupable v="true" /> + <mandatory v="true" /> + <valueProcess>%aditoprj%/entity/Task_entity/entityfields/status/valueProcess.js</valueProcess> + <displayValueProcess>%aditoprj%/entity/Task_entity/entityfields/status/displayValueProcess.js</displayValueProcess> + </entityField> + <entityField> + <name>PRIORITY</name> + <title>Priority</title> + <consumer>KeywordPriorities</consumer> + <groupable v="true" /> + <mandatory v="true" /> + <valueProcess>%aditoprj%/entity/Task_entity/entityfields/priority/valueProcess.js</valueProcess> + <displayValueProcess>%aditoprj%/entity/Task_entity/entityfields/priority/displayValueProcess.js</displayValueProcess> + </entityField> + <entityField> + <name>REQUESTOR_CONTACT_ID</name> + <title>{$TASK_REQUESTOR}</title> + <consumer>ContactRequestors</consumer> + <linkedContext>Person</linkedContext> + <mandatory v="true" /> + <valueProcess>%aditoprj%/entity/Task_entity/entityfields/requestor_contact_id/valueProcess.js</valueProcess> + <displayValueProcess>%aditoprj%/entity/Task_entity/entityfields/requestor_contact_id/displayValueProcess.js</displayValueProcess> + </entityField> + <entityField> + <name>EDITOR_CONTACT_ID</name> + <title>{$TASK_EDITOR}</title> + <consumer>ContactEditors</consumer> + <linkedContext>Person</linkedContext> + <displayValueProcess>%aditoprj%/entity/Task_entity/entityfields/editor_contact_id/displayValueProcess.js</displayValueProcess> + </entityField> + <entityField> + <name>START_DATE</name> + <title>Begin</title> + <contentType>DATE</contentType> + <resolution>MINUTE</resolution> + <outputFormat>dd.MM.yyyy HH:mm</outputFormat> + <inputFormat>dd.MM.yyyy HH:mm</inputFormat> + <groupable v="true" /> + <valueProcess>%aditoprj%/entity/Task_entity/entityfields/start_date/valueProcess.js</valueProcess> + </entityField> + <entityField> + <name>MATURITY_DATE</name> + <title>Maturity</title> + <contentType>DATE</contentType> + <resolution>MINUTE</resolution> + <outputFormat>dd.MM.yyyy HH:mm</outputFormat> + <inputFormat>dd.MM.yyyy HH:mm</inputFormat> + <valueProcess>%aditoprj%/entity/Task_entity/entityfields/maturity_date/valueProcess.js</valueProcess> + </entityField> + <entityField> + <name>DESCRIPTION</name> + <title>description</title> + <contentType>LONG_TEXT</contentType> + </entityField> + <entityField> + <name>PROTECTIONLEVEL</name> + <title>Protected</title> + <contentType>BOOLEAN</contentType> + <contentTypeProcess>%aditoprj%/entity/Task_entity/entityfields/protectionlevel/contentTypeProcess.js</contentTypeProcess> + <dropDownProcess>%aditoprj%/entity/Task_entity/entityfields/protectionlevel/dropDownProcess.js</dropDownProcess> + <valueProcess>%aditoprj%/entity/Task_entity/entityfields/protectionlevel/valueProcess.js</valueProcess> + </entityField> + <entityField> + <name>TASKID</name> + <title>TASKID (UID)</title> + <mandatory v="true" /> + <searchable v="false" /> + <valueProcess>%aditoprj%/entity/Task_entity/entityfields/taskid/valueProcess.js</valueProcess> + </entityField> + <entityConsumer> + <name>ContactEditors</name> + <dependency> + <name>dependency</name> + <entityName>Employee_entity</entityName> + <fieldName>Employees</fieldName> + </dependency> + </entityConsumer> + <entityConsumer> + <name>ContactRequestors</name> + <dependency> + <name>dependency</name> + <entityName>Employee_entity</entityName> + <fieldName>Employees</fieldName> + </dependency> + </entityConsumer> + <entityConsumer> + <name>MainDocuments</name> + <stateProcess>%aditoprj%/entity/Task_entity/entityfields/maindocuments/stateProcess.js</stateProcess> + <dependency> + <name>dependency</name> + <entityName>Document_entity</entityName> + <fieldName>#PROVIDER</fieldName> + </dependency> + <children> + <entityParameter> + <name>AssignmentRowId_param</name> + <valueProcess>%aditoprj%/entity/Task_entity/entityfields/maindocuments/children/assignmentrowid_param/valueProcess.js</valueProcess> + </entityParameter> + <entityParameter> + <name>AssignmentTable_param</name> + <valueProcess>%aditoprj%/entity/Task_entity/entityfields/maindocuments/children/assignmenttable_param/valueProcess.js</valueProcess> + </entityParameter> + </children> + </entityConsumer> + <entityConsumer> + <name>KeywordStates</name> + <dependency> + <name>dependency</name> + <entityName>KeywordEntry_entity</entityName> + <fieldName>SpecificContainerKeywords</fieldName> + </dependency> + <children> + <entityParameter> + <name>ContainerName_param</name> + <valueProcess>%aditoprj%/entity/Task_entity/entityfields/keywordstates/children/containername_param/valueProcess.js</valueProcess> + <expose v="false" /> + </entityParameter> + <entityParameter> + <name>WhitelistIds_param</name> + <valueProcess>%aditoprj%/entity/Task_entity/entityfields/keywordstates/children/whitelistids_param/valueProcess.js</valueProcess> + </entityParameter> + </children> + </entityConsumer> + <entityConsumer> + <name>ModuleTrees</name> + <dependency> + <name>dependency</name> + <entityName>ModuleTree_entity</entityName> + <fieldName>TreeProviders</fieldName> + </dependency> + <children> + <entityParameter> + <name>ID_param</name> + <valueProcess>%aditoprj%/entity/Task_entity/entityfields/moduletrees/children/id_param/valueProcess.js</valueProcess> + <expose v="true" /> + <mandatory v="false" /> + </entityParameter> + <entityParameter> + <name>ContextName_param</name> + <valueProcess>%aditoprj%/entity/Task_entity/entityfields/moduletrees/children/contextname_param/valueProcess.js</valueProcess> + <expose v="false" /> + <mandatory v="false" /> + </entityParameter> + </children> + </entityConsumer> + <entityField> + <name>PARENT_CONTEXT</name> + <searchable v="false" /> + <valueProcess>%aditoprj%/entity/Task_entity/entityfields/parent_context/valueProcess.js</valueProcess> + </entityField> + <entityField> + <name>PARENT_ID</name> + <searchable v="false" /> + <valueProcess>%aditoprj%/entity/Task_entity/entityfields/parent_id/valueProcess.js</valueProcess> + </entityField> + <entityParameter> + <name>ParentId_param</name> + <expose v="true" /> + <description>PARAMETER</description> + </entityParameter> + <entityParameter> + <name>ParentContext_param</name> + <expose v="true" /> + <description>PARAMETER</description> + </entityParameter> + <entityActionField> + <name>newActivity</name> + <title>New activity</title> + <onActionProcess>%aditoprj%/entity/Task_entity/entityfields/newactivity/onActionProcess.js</onActionProcess> + <iconId>VAADIN:HOURGLASS_END</iconId> + <tooltip>New activity</tooltip> + <tooltipProcess>%aditoprj%/entity/Task_entity/entityfields/newactivity/tooltipProcess.js</tooltipProcess> + </entityActionField> + <entityActionField> + <name>newTask</name> + <title>New task</title> + <onActionProcess>%aditoprj%/entity/Task_entity/entityfields/newtask/onActionProcess.js</onActionProcess> + <actionOrder v="1" /> + <iconId>VAADIN:TASKS</iconId> + </entityActionField> + <entityParameter> + <name>RowId_param</name> + <expose v="true" /> + <description>PARAMETER</description> + </entityParameter> + <entityParameter> + <name>ObjectId_param</name> + <expose v="true" /> + <description>PARAMETER</description> + </entityParameter> + <entityConsumer> + <name>KeywordPriorities</name> + <dependency> + <name>dependency</name> + <entityName>KeywordEntry_entity</entityName> + <fieldName>SpecificContainerKeywords</fieldName> + </dependency> + <children> + <entityParameter> + <name>ContainerName_param</name> + <valueProcess>%aditoprj%/entity/Task_entity/entityfields/keywordpriorities/children/containername_param/valueProcess.js</valueProcess> + <expose v="false" /> + </entityParameter> + </children> + </entityConsumer> + <entityActionField> + <name>newOffer</name> + <title>New offer</title> + <onActionProcess>%aditoprj%/entity/Task_entity/entityfields/newoffer/onActionProcess.js</onActionProcess> + <actionOrder v="0" /> + <iconId>VAADIN:CART</iconId> + </entityActionField> + <entityField> + <name>PROGRESS</name> + <title>Progress</title> + <consumer>KeywordProgress</consumer> + <mandatory v="true" /> + <valueProcess>%aditoprj%/entity/Task_entity/entityfields/progress/valueProcess.js</valueProcess> + <displayValueProcess>%aditoprj%/entity/Task_entity/entityfields/progress/displayValueProcess.js</displayValueProcess> + </entityField> + <entityConsumer> + <name>KeywordProgress</name> + <dependency> + <name>dependency</name> + <entityName>KeywordEntry_entity</entityName> + <fieldName>SpecificContainerKeywords</fieldName> + </dependency> + <children> + <entityParameter> + <name>ContainerName_param</name> + <valueProcess>%aditoprj%/entity/Task_entity/entityfields/keywordprogress/children/containername_param/valueProcess.js</valueProcess> + </entityParameter> + </children> + </entityConsumer> + <entityConsumer> + <name>Links</name> + <state>EDITABLE</state> + <dependency> + <name>dependency</name> + <entityName>TaskLink_entity</entityName> + <fieldName>Link</fieldName> + </dependency> + <children> + <entityParameter> + <name>TaskId_param</name> + <valueProcess>%aditoprj%/entity/Task_entity/entityfields/links/children/taskid_param/valueProcess.js</valueProcess> + </entityParameter> + </children> + </entityConsumer> + <entityProvider> + <name>Tasks</name> + <dependencies> + <entityDependency> + <name>dd79df43-264c-494b-9c92-cadf19e61db6</name> + <entityName>Organisation_entity</entityName> + <fieldName>Tasks</fieldName> + <isConsumer v="false" /> + </entityDependency> + <entityDependency> + <name>dc29832e-15da-4f64-b17a-f1dd978ef47b</name> + <entityName>Person_entity</entityName> + <fieldName>Tasks</fieldName> + <isConsumer v="false" /> + </entityDependency> + <entityDependency> + <name>c6507834-cd91-4202-bdf7-6566f968edb4</name> + <entityName>Salesproject_entity</entityName> + <fieldName>Tasks</fieldName> + <isConsumer v="false" /> + </entityDependency> + <entityDependency> + <name>26b9b221-de02-40ef-a400-d4b5e356da0b</name> + <entityName>Offer_entity</entityName> + <fieldName>Tasks</fieldName> + <isConsumer v="false" /> + </entityDependency> + <entityDependency> + <name>b2bb448a-b647-40c8-baec-16356f3e23f5</name> + <entityName>Order_entity</entityName> + <fieldName>Tasks</fieldName> + <isConsumer v="false" /> + </entityDependency> + <entityDependency> + <name>a93f1e7e-f929-438f-8f37-21e4af8b53b6</name> + <entityName>Product_entity</entityName> + <fieldName>Tasks</fieldName> + <isConsumer v="false" /> + </entityDependency> + <entityDependency> + <name>2b0c15eb-fa9a-4ee8-a8b1-5d0f344ddad6</name> + <entityName>Contract_entity</entityName> + <fieldName>Tasks</fieldName> + <isConsumer v="false" /> + </entityDependency> + <entityDependency> + <name>335e31ad-ab67-4567-b4ea-3668f04922b2</name> + <entityName>Campaign_entity</entityName> + <fieldName>Tasks</fieldName> + <isConsumer v="false" /> + </entityDependency> + <entityDependency> + <name>fbaa2f6c-0ba1-4c93-acae-d7b636581679</name> + <entityName>CampaignStep_entity</entityName> + <fieldName>Tasks</fieldName> + <isConsumer v="false" /> + </entityDependency> + </dependencies> + <children> + <entityParameter> + <name>RowId_param</name> + <expose v="true" /> + </entityParameter> + <entityParameter> + <name>PresetLinks_param</name> + <expose v="true" /> + </entityParameter> + <entityParameter> + <name>ParentId_param</name> + <expose v="false" /> + </entityParameter> + <entityParameter> + <name>ParentContext_param</name> + <expose v="false" /> + </entityParameter> + <entityParameter> + <name>ObjectId_param</name> + <expose v="true" /> + </entityParameter> + </children> + </entityProvider> + <entityParameter> + <name>PresetLinks_param</name> + <expose v="true" /> + <documentation>%aditoprj%/entity/Task_entity/entityfields/presetlinks_param/documentation.adoc</documentation> + <description>PARAMETER</description> + </entityParameter> + <entityField> + <name>SUBJECT_DETAILS</name> + <title>subject</title> + <linkedContext>Task</linkedContext> + <valueProcess>%aditoprj%/entity/Task_entity/entityfields/subject_details/valueProcess.js</valueProcess> + </entityField> + <entityParameter> + <name>FilterOnlyOwnTask_param</name> + <valueProcess>%aditoprj%/entity/Task_entity/entityfields/filteronlyowntask_param/valueProcess.js</valueProcess> + <expose v="true" /> + <description>PARAMETER</description> + </entityParameter> + <entityField> + <name>PRIORITY_ICON</name> + <colorProcess>%aditoprj%/entity/Task_entity/entityfields/priority_icon/colorProcess.js</colorProcess> + <contentType>IMAGE</contentType> + <valueProcess>%aditoprj%/entity/Task_entity/entityfields/priority_icon/valueProcess.js</valueProcess> + </entityField> + <entityConsumer> + <name>LogHistories</name> + <dependency> + <name>dependency</name> + <entityName>LogHistory_entity</entityName> + <fieldName>LogHistoryProvider</fieldName> + </dependency> + <children> + <entityParameter> + <name>tablenames_param</name> + <valueProcess>%aditoprj%/entity/Task_entity/entityfields/loghistories/children/tablenames_param/valueProcess.js</valueProcess> + </entityParameter> + </children> + </entityConsumer> + <entityConsumer> + <name>Documents</name> + <selectionMode>MULTI</selectionMode> + <dependency> + <name>dependency</name> + <entityName>Document_entity</entityName> + <fieldName>Documents</fieldName> + </dependency> + <children> + <entityParameter> + <name>AssignmentRowId_param</name> + <valueProcess>%aditoprj%/entity/Task_entity/entityfields/documents/children/assignmentrowid_param/valueProcess.js</valueProcess> + </entityParameter> + <entityParameter> + <name>AssignmentTable_param</name> + <valueProcess>%aditoprj%/entity/Task_entity/entityfields/documents/children/assignmenttable_param/valueProcess.js</valueProcess> + </entityParameter> + </children> + </entityConsumer> + <entityField> + <name>TYPE</name> + <valueProcess>%aditoprj%/entity/Task_entity/entityfields/type/valueProcess.js</valueProcess> + </entityField> + <entityActionField> + <name>newSupportticket</name> + <title>New Supportticket</title> + <onActionProcess>%aditoprj%/entity/Task_entity/entityfields/newsupportticket/onActionProcess.js</onActionProcess> + <iconId>VAADIN:QUESTION</iconId> + </entityActionField> + <entityActionField> + <name>openAdminView</name> + <title>Open admin view</title> + <onActionProcess>%aditoprj%/entity/Task_entity/entityfields/openadminview/onActionProcess.js</onActionProcess> + <iconId>VAADIN:CURLY_BRACKETS</iconId> + <stateProcess>%aditoprj%/entity/Task_entity/entityfields/openadminview/stateProcess.js</stateProcess> + </entityActionField> + </entityFields> + <recordContainers> + <dbRecordContainer> + <name>db</name> + <alias>Data_alias</alias> + <conditionProcess>%aditoprj%/entity/Task_entity/recordcontainers/db/conditionProcess.js</conditionProcess> + <orderClauseProcess>%aditoprj%/entity/Task_entity/recordcontainers/db/orderClauseProcess.js</orderClauseProcess> + <onDBDelete>%aditoprj%/entity/Task_entity/recordcontainers/db/onDBDelete.js</onDBDelete> + <linkInformation> + <linkInformation> + <name>6dfe6f25-2b83-413b-89e4-5c5b9839be2e</name> + <tableName>TASK</tableName> + <primaryKey>TASKID</primaryKey> + <isUIDTable v="true" /> + <readonly v="false" /> + </linkInformation> + </linkInformation> + <recordFieldMappings> + <dbRecordFieldMapping> + <name>DESCRIPTION.value</name> + <recordfield>TASK.DESCRIPTION</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>EDITOR_CONTACT_ID.value</name> + <recordfield>TASK.EDITOR_CONTACT_ID</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>MATURITY_DATE.value</name> + <recordfield>TASK.MATURITY_DATE</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>PRIORITY.value</name> + <recordfield>TASK.PRIORITY</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>PROTECTIONLEVEL.value</name> + <recordfield>TASK.PROTECTIONLEVEL</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>REQUESTOR_CONTACT_ID.value</name> + <recordfield>TASK.REQUESTOR_CONTACT_ID</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>START_DATE.value</name> + <recordfield>TASK.START_DATE</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>STATUS.value</name> + <recordfield>TASK.STATUS</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>SUBJECT.value</name> + <recordfield>TASK.SUBJECT</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>TASKID.value</name> + <recordfield>TASK.TASKID</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>EDITOR_CONTACT_ID.displayValue</name> + <expression>%aditoprj%/entity/Task_entity/recordcontainers/db/recordfieldmappings/editor_contact_id.displayvalue/expression.js</expression> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>REQUESTOR_CONTACT_ID.displayValue</name> + <expression>%aditoprj%/entity/Task_entity/recordcontainers/db/recordfieldmappings/requestor_contact_id.displayvalue/expression.js</expression> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>PARENT_CONTEXT.value</name> + <recordfield>TASK.PARENT_CONTEXT</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>PARENT_ID.value</name> + <recordfield>TASK.PARENT_ID</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>PRIORITY.displayValue</name> + <expression>%aditoprj%/entity/Task_entity/recordcontainers/db/recordfieldmappings/priority.displayvalue/expression.js</expression> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>PROGRESS.value</name> + <recordfield>TASK.PROGRESS</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>PROGRESS.displayValue</name> + <expression>%aditoprj%/entity/Task_entity/recordcontainers/db/recordfieldmappings/progress.displayvalue/expression.js</expression> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>STATUS.displayValue</name> + <expression>%aditoprj%/entity/Task_entity/recordcontainers/db/recordfieldmappings/status.displayvalue/expression.js</expression> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>TYPE.value</name> + <recordfield>TASK.TYPE</recordfield> + </dbRecordFieldMapping> + </recordFieldMappings> + </dbRecordContainer> + </recordContainers> +</entity> diff --git a/entity/Task_entity/entityfields/newsupportticket/onActionProcess.js b/entity/Task_entity/entityfields/newsupportticket/onActionProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..500687bbf40310a5633b3c9e040e0e3df5eabad3 --- /dev/null +++ b/entity/Task_entity/entityfields/newsupportticket/onActionProcess.js @@ -0,0 +1,6 @@ +import("system.vars"); +import("ActivityTask_lib"); +import("Context_lib"); +import("Ticket_lib") + +TicketUtils.createNewTicket(undefined, undefined, ContextUtils.getCurrentContextId(), vars.get("$field.TASKID")) \ No newline at end of file diff --git a/entity/Task_entity/entityfields/openadminview/onActionProcess.js b/entity/Task_entity/entityfields/openadminview/onActionProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..f665fe2dca8da956fc5faee4d60b6fb3e4edddb6 --- /dev/null +++ b/entity/Task_entity/entityfields/openadminview/onActionProcess.js @@ -0,0 +1,9 @@ +import("system.vars"); +import("Context_lib"); + +AdminViewUtils.open("TASKID", [ + ["PARENT_ID", vars.get("$field.PARENT_ID")], + ["PARENT_CONTEXT", vars.get("$field.PARENT_CONTEXT")], + ["REQUESTOR_CONTACT_ID", vars.get("$field.REQUESTOR_CONTACT_ID")], + ["EDITOR_CONTACT_ID", vars.get("$field.EDITOR_CONTACT_ID")] +]); \ No newline at end of file diff --git a/entity/Task_entity/entityfields/openadminview/stateProcess.js b/entity/Task_entity/entityfields/openadminview/stateProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..38f2298db7304b4d44a15fbad7f720558c02da99 --- /dev/null +++ b/entity/Task_entity/entityfields/openadminview/stateProcess.js @@ -0,0 +1,4 @@ +import("Context_lib"); +import("system.result"); + +result.string(AdminViewUtils.getActionState()); \ No newline at end of file diff --git a/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod b/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod index b98c1eb559d05e4336f2e07dabb01003b297f999..f0aeeeaa62a4e6e85ec9acf85030061de57d33f8 100644 --- a/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod +++ b/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod @@ -4495,115 +4495,109 @@ <key>Support Ticket</key> </entry> <entry> - <key>DSGVO Information</key> + <key>CC</key> </entry> <entry> - <key>Xing</key> - </entry> - <entry> - <key>consent</key> + <key>Remarks</key> </entry> <entry> - <key>Information Report</key> - </entry> - <entry> - <key>Data Privacy</key> + <key>Xing</key> </entry> <entry> - <key>Attribute data</key> + <key>Organisation</key> </entry> <entry> - <key>other personal data</key> + <key>Km</key> </entry> <entry> - <key>LinkedIn</key> + <key>Billed</key> </entry> <entry> - <key>Kommunikationsdaten</key> + <key>Km Fee</key> </entry> <entry> - <key>Es wurden keine Daten anonymisiert.</key> + <key>Credit Card</key> </entry> <entry> - <key>Anonymization</key> + <key>Taxi</key> </entry> <entry> - <key>Data Privacies</key> + <key>Overnight stay</key> </entry> <entry> - <key>advertising consent</key> + <key>LinkedIn</key> </entry> <entry> - <key>Sonstige personenbezogene Daten</key> + <key>In creation</key> </entry> <entry> - <key>DSGVO Anonymisierung</key> + <key>Rented car</key> </entry> <entry> - <key>Names</key> + <key>Update</key> </entry> <entry> - <key>Namen</key> + <key>The contact has an advertising ban for emails!</key> </entry> <entry> - <key>Update</key> + <key>Blog</key> </entry> <entry> - <key>The contact has an advertising ban for emails!</key> + <key>Until</key> </entry> <entry> - <key>Adressdaten</key> + <key>From</key> </entry> <entry> - <key>Blog</key> + <key>Park fees</key> </entry> <entry> - <key>DSGVO Disclosure</key> + <key>Abscences</key> </entry> <entry> - <key>Disclosure Report</key> + <key>Expense Report</key> </entry> <entry> - <key>newsletter dispatch</key> + <key>Special displays</key> </entry> <entry> - <key>Folgende Daten wurden anonymisiert: </key> + <key>Transport cost</key> </entry> <entry> - <key>DataPrivacy Right</key> + <key>Day Fee</key> </entry> <entry> - <key>Address data</key> + <key>Fuel</key> </entry> <entry> - <key>contract of sale</key> + <key>Month</key> </entry> <entry> - <key>balancing of interests</key> + <key>Working material</key> </entry> <entry> - <key>DataPrivacy Use</key> + <key>Hospitality</key> </entry> <entry> - <key>Personal data</key> + <key>Trip purpose</key> </entry> <entry> - <key>Source</key> + <key>Bed and Breakfast</key> </entry> <entry> - <key>No data has been anonymized.</key> + <key>Update campaign step</key> </entry> <entry> - <key>The following data has been anonymised: %0</key> + <key>No contacts selected</key> </entry> <entry> - <key>DSGVO anonymisation</key> + <key>Show my campaigns</key> </entry> <entry> - <key>Your changes have an impact on the data privacy information (DSGVO).</key> + <key>My campaigns</key> </entry> <entry> - <key>Update data privacy information</key> + <key>Add to Bulkmail</key> </entry> </keyValueMap> <font name="Dialog" style="0" size="11" /> diff --git a/language/_____LANGUAGE_de/_____LANGUAGE_de.aod b/language/_____LANGUAGE_de/_____LANGUAGE_de.aod index 2c4da2716f16c94eef43ab32f2ff875adbd9b2ec..b80c6bdd8332307e558ab6127acb06593e977404 100644 --- a/language/_____LANGUAGE_de/_____LANGUAGE_de.aod +++ b/language/_____LANGUAGE_de/_____LANGUAGE_de.aod @@ -34,10 +34,6 @@ <key>Sender address</key> <value>Senderadresse</value> </entry> - <entry> - <key>Your changes may have an impact on the data privacy information (DSGVO).\n Please update these.</key> - <value>Ihre Änderungen könnten Auswirkungen auf die Datenschutzerklärung (DSGVO) haben. Bitte aktualisieren Sie diese.</value> - </entry> <entry> <key>Failed</key> <value>Fehlgeschlagen</value> @@ -856,10 +852,6 @@ <key>No</key> <value>Nein</value> </entry> - <entry> - <key>Birthday</key> - <value>Geburtstag</value> - </entry> <entry> <key>Service</key> <value>Service</value> @@ -5641,142 +5633,9 @@ <entry> <key>USER_NEW_CONTACT</key> </entry> - <entry> - <key>Update data privacy information</key> - <value>Datenschutzerklärung aktualisieren</value> - </entry> <entry> <key>Bulk mail was sent!</key> </entry> - <entry> - <key>Support Ticket</key> - <value>Support Ticket</value> - </entry> - <entry> - <key>DSGVO Information</key> - <value>DSGVO Information</value> - </entry> - <entry> - <key>Xing</key> - </entry> - <entry> - <key>consent</key> - <value>Einwilligung</value> - </entry> - <entry> - <key>Information Report</key> - <value>Informationsbericht</value> - </entry> - <entry> - <key>Data Privacy</key> - <value>Datenschutzerklärung</value> - </entry> - <entry> - <key>other personal data</key> - <value>sonstige Persönliche Daten</value> - </entry> - <entry> - <key>LinkedIn</key> - </entry> - <entry> - <key>No data has been anonymized.</key> - <value>Es wurden keine Daten anonymisiert.</value> - </entry> - <entry> - <key>Anonymization</key> - <value>Anonymisierung</value> - </entry> - <entry> - <key>advertising consent</key> - <value>Werbeeinwilligung</value> - </entry> - <entry> - <key>DSGVO anonymisation</key> - <value>DSGVO anonymisierung</value> - </entry> - <entry> - <key>Names</key> - <value>Namen</value> - </entry> - <entry> - <key>The contact has an advertising ban for emails!</key> - <value>Der Kontakt hat eine Werbemail-Sperre!</value> - </entry> - <entry> - <key>Blog</key> - </entry> - <entry> - <key>DSGVO Disclosure</key> - </entry> - <entry> - <key>Disclosure Report</key> - </entry> - <entry> - <key>newsletter dispatch</key> - <value>Newsletterversand</value> - </entry> - <entry> - <key>The following data has been anonymised: %0</key> - <value>Folgende Daten wurden anonymisiert: %0</value> - </entry> - <entry> - <key>DataPrivacy Right</key> - <value>Datenschutzrecht</value> - </entry> - <entry> - <key>Address data</key> - <value>Addressdaten</value> - </entry> - <entry> - <key>contract of sale</key> - <value>Kaufvertrag</value> - </entry> - <entry> - <key>balancing of interests</key> - <value>Interessensabwägung</value> - </entry> - <entry> - <key>DataPrivacy Use</key> - <value>Interessensabwägung</value> - </entry> - <entry> - <key>Personal data</key> - <value>Persönliche Daten</value> - </entry> - <entry> - <key>Source</key> - <value>Herkunft</value> - </entry> - <entry> - <key>Attribute data</key> - </entry> - <entry> - <key>Kommunikationsdaten</key> - </entry> - <entry> - <key>Es wurden keine Daten anonymisiert.</key> - </entry> - <entry> - <key>Data Privacies</key> - </entry> - <entry> - <key>Sonstige personenbezogene Daten</key> - </entry> - <entry> - <key>DSGVO Anonymisierung</key> - </entry> - <entry> - <key>Namen</key> - </entry> - <entry> - <key>Adressdaten</key> - </entry> - <entry> - <key>Folgende Daten wurden anonymisiert: </key> - </entry> - <entry> - <key>Update</key> - </entry> <entry> <key>All selected participants already are in the campaign</key> <value>Alle selektierten Teilnehmer sind bereits in der Kampagne</value> diff --git a/language/_____LANGUAGE_en/_____LANGUAGE_en.aod b/language/_____LANGUAGE_en/_____LANGUAGE_en.aod index 73426a4f78286b2834f84561e4799c04073f5f53..5a18e05f465a75547ae8672dae17adebee31a130 100644 --- a/language/_____LANGUAGE_en/_____LANGUAGE_en.aod +++ b/language/_____LANGUAGE_en/_____LANGUAGE_en.aod @@ -4654,6 +4654,114 @@ <entry> <key>Update data privacy information</key> </entry> + <entry> + <key>Support Ticket</key> + </entry> + <entry> + <key>CC</key> + </entry> + <entry> + <key>Remarks</key> + </entry> + <entry> + <key>Xing</key> + </entry> + <entry> + <key>Organisation</key> + </entry> + <entry> + <key>Km</key> + </entry> + <entry> + <key>Billed</key> + </entry> + <entry> + <key>Km Fee</key> + </entry> + <entry> + <key>Credit Card</key> + </entry> + <entry> + <key>Taxi</key> + </entry> + <entry> + <key>Overnight stay</key> + </entry> + <entry> + <key>LinkedIn</key> + </entry> + <entry> + <key>In creation</key> + </entry> + <entry> + <key>Rented car</key> + </entry> + <entry> + <key>Update</key> + </entry> + <entry> + <key>The contact has an advertising ban for emails!</key> + </entry> + <entry> + <key>Blog</key> + </entry> + <entry> + <key>Until</key> + </entry> + <entry> + <key>From</key> + </entry> + <entry> + <key>Park fees</key> + </entry> + <entry> + <key>Abscences</key> + </entry> + <entry> + <key>Expense Report</key> + </entry> + <entry> + <key>Special displays</key> + </entry> + <entry> + <key>Transport cost</key> + </entry> + <entry> + <key>Day Fee</key> + </entry> + <entry> + <key>Fuel</key> + </entry> + <entry> + <key>Month</key> + </entry> + <entry> + <key>Working material</key> + </entry> + <entry> + <key>Hospitality</key> + </entry> + <entry> + <key>Trip purpose</key> + </entry> + <entry> + <key>Bed and Breakfast</key> + </entry> + <entry> + <key>Update campaign step</key> + </entry> + <entry> + <key>No contacts selected</key> + </entry> + <entry> + <key>Show my campaigns</key> + </entry> + <entry> + <key>My campaigns</key> + </entry> + <entry> + <key>Add to Bulkmail</key> + </entry> </keyValueMap> <font name="Dialog" style="0" size="11" /> </language> diff --git a/neonContext/AdminViewRow/AdminViewRow.aod b/neonContext/AdminViewRow/AdminViewRow.aod new file mode 100644 index 0000000000000000000000000000000000000000..8e2bf5f8b0a06d538afac1a6313a207a8a9825e9 --- /dev/null +++ b/neonContext/AdminViewRow/AdminViewRow.aod @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="UTF-8"?> +<neonContext xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.0" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonContext/1.1.0"> + <name>AdminViewRow</name> + <majorModelMode>DISTRIBUTED</majorModelMode> + <entity>AdminViewRow_entity</entity> + <references> + <neonViewReference> + <name>4c6208ab-61d4-415e-af31-16d0409f541e</name> + <view>AdminViewRow_view</view> + </neonViewReference> + </references> +</neonContext> diff --git a/neonContext/DefaultAdminView/DefaultAdminView.aod b/neonContext/DefaultAdminView/DefaultAdminView.aod new file mode 100644 index 0000000000000000000000000000000000000000..ab55b276419f274d56172dfd21cf7a6176c0e493 --- /dev/null +++ b/neonContext/DefaultAdminView/DefaultAdminView.aod @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="UTF-8"?> +<neonContext xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.0" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonContext/1.1.0"> + <name>DefaultAdminView</name> + <majorModelMode>DISTRIBUTED</majorModelMode> + <entity>DefaultAdminView_entity</entity> + <references> + <neonViewReference> + <name>b37b1c3c-6eb7-4d5c-89c6-239011878452</name> + <view>DefaultAdminView_view</view> + </neonViewReference> + </references> +</neonContext> diff --git a/neonContext/Organisation/Organisation.aod b/neonContext/Organisation/Organisation.aod index 4f3f5585095eaa4754949ae9b06f3c4d78f6bbff..bddc5f4e9dc436f799d3c90e933597a84c4d3a4c 100644 --- a/neonContext/Organisation/Organisation.aod +++ b/neonContext/Organisation/Organisation.aod @@ -43,14 +43,6 @@ <name>c4548cdb-479e-4f08-bc8e-de893f509637</name> <view>OrganisationConditionPricelist_view</view> </neonViewReference> - <neonViewReference> - <name>4f4aa991-0544-4d24-bc63-76b03c738b79</name> - <view>OrganisationAdmin_view</view> - </neonViewReference> - <neonViewReference> - <name>512e3b17-d91d-4ed3-8fc8-f1e2607d3b44</name> - <view>OrganisationAdmin_view</view> - </neonViewReference> <neonViewReference> <name>51a18051-fcb8-4d90-9075-802fdce12f9c</name> <view>OrganisationTaskAppointment_view</view> diff --git a/neonContext/Person/Person.aod b/neonContext/Person/Person.aod index 26861e84934a45fab69fd92f418641445045958e..07f8c24364ee6b4716b75d392b44c9d5116f9f98 100644 --- a/neonContext/Person/Person.aod +++ b/neonContext/Person/Person.aod @@ -42,14 +42,6 @@ <name>d2fe8cd9-e3fc-4f4e-bd61-f762e3315798</name> <view>PersonSimpleList_view</view> </neonViewReference> - <neonViewReference> - <name>b1ef43d1-ce20-4a67-bace-ed59e5527842</name> - <view>PersonAdmin_view</view> - </neonViewReference> - <neonViewReference> - <name>b0105010-457a-4866-a9cd-277d183ea130</name> - <view>PersonAdmin_view</view> - </neonViewReference> <neonViewReference> <name>fc7e2546-b42a-48c0-8670-2d4033ad0598</name> <view>PersonTaskAppointment_view</view> diff --git a/neonContext/Salesproject/Salesproject.aod b/neonContext/Salesproject/Salesproject.aod index 9b104d93a7002621e32a85a3a1c148e5588f17a8..93eddff13862c77ac7d29a6470c8d70a519099e6 100644 --- a/neonContext/Salesproject/Salesproject.aod +++ b/neonContext/Salesproject/Salesproject.aod @@ -75,9 +75,5 @@ <name>1c957028-bf6b-4b9c-9b46-60f8b53f9edd</name> <view>SaleprojectOverviewCharts_view</view> </neonViewReference> - <neonViewReference> - <name>fb935080-9328-48ad-a5ce-9ec966fb526a</name> - <view>SalesprojectMilestoneInfo_view</view> - </neonViewReference> </references> </neonContext> diff --git a/neonContext/SalesprojectMilestone/SalesprojectMilestone.aod b/neonContext/SalesprojectMilestone/SalesprojectMilestone.aod index d4ad5d6d3e6f841493e091ce12a4e19c506fd682..08aae3b687227450b3c4c886e03285a58e17cae9 100644 --- a/neonContext/SalesprojectMilestone/SalesprojectMilestone.aod +++ b/neonContext/SalesprojectMilestone/SalesprojectMilestone.aod @@ -10,5 +10,9 @@ <name>54bee07a-f45d-458a-bfc6-56ba4992b63d</name> <view>SalesprojectMilestoneChart_view</view> </neonViewReference> + <neonViewReference> + <name>8efe4695-9e0c-43e5-876c-374338a346af</name> + <view>SalesprojectMilestoneInfo_view</view> + </neonViewReference> </references> </neonContext> diff --git a/neonContext/SupportTicket/SupportTicket.aod b/neonContext/SupportTicket/SupportTicket.aod index fb9473deb5c21fd15bffcc129018e86d46867cdf..feb7436edc5f4781d26b169918d4e1732e6807f2 100644 --- a/neonContext/SupportTicket/SupportTicket.aod +++ b/neonContext/SupportTicket/SupportTicket.aod @@ -3,7 +3,6 @@ <name>SupportTicket</name> <title>Support Ticket</title> <majorModelMode>DISTRIBUTED</majorModelMode> - <icon>VAADIN:QUESTION</icon> <mainview>SupportTicketMain_view</mainview> <filterview>SupportTicketFilter_view</filterview> <editview>SupportTicketEdit_view</editview> diff --git a/neonView/AdminViewRow_view/AdminViewRow_view.aod b/neonView/AdminViewRow_view/AdminViewRow_view.aod new file mode 100644 index 0000000000000000000000000000000000000000..d148b24efeef7728f6025ccca9a30663bacffba5 --- /dev/null +++ b/neonView/AdminViewRow_view/AdminViewRow_view.aod @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="UTF-8"?> +<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.1"> + <name>AdminViewRow_view</name> + <majorModelMode>DISTRIBUTED</majorModelMode> + <layout> + <noneLayout> + <name>layout</name> + </noneLayout> + </layout> + <children> + <titledListViewTemplate> + <name>TitledList</name> + <fixedDrawer v="true" /> + <entityField>#ENTITY</entityField> + <columns> + <neonTableColumn> + <name>4296ac54-2661-4405-898d-7583d6f2803e</name> + <entityField>TITLE</entityField> + </neonTableColumn> + <neonTableColumn> + <name>d42ddaa4-1996-41b3-be19-2f3c721f9536</name> + <entityField>VALUE</entityField> + </neonTableColumn> + </columns> + </titledListViewTemplate> + </children> +</neonView> diff --git a/neonView/CampaignFilter_view/CampaignFilter_view.aod b/neonView/CampaignFilter_view/CampaignFilter_view.aod index 92a0a4185572b65a2e3f126c17ddc359fe204008..3d850abf8d2a02023b2b8d392e5f0f17a6478d20 100644 --- a/neonView/CampaignFilter_view/CampaignFilter_view.aod +++ b/neonView/CampaignFilter_view/CampaignFilter_view.aod @@ -5,6 +5,32 @@ <majorModelMode>DISTRIBUTED</majorModelMode> <icon>VAADIN:GROUP</icon> <filterable v="true" /> + <dashletConfigurations> + <neonDashletConfiguration> + <name>CurrentUsersOwnedCampaigns</name> + <title>My campaigns</title> + <description>Show my campaigns</description> + <fragment>Campaign/filter</fragment> + <singleton v="true" /> + <icon>NEON:GROUP_APPOINTMENT</icon> + <categories> + <neonDashletCategory> + <name>marketingcampaign</name> + <title>MarketingCampaign</title> + </neonDashletCategory> + <neonDashletCategory> + <name>campaignmanagement</name> + <title>CampaignManagement</title> + </neonDashletCategory> + </categories> + <parameters> + <neonDashletParameter> + <name>ShowOnlyCurrentUsersCampaigns_param</name> + <value>true</value> + </neonDashletParameter> + </parameters> + </neonDashletConfiguration> + </dashletConfigurations> <layout> <boxLayout> <name>layout</name> diff --git a/neonView/CampaignStepFilter_view/CampaignStepFilter_view.aod b/neonView/CampaignStepFilter_view/CampaignStepFilter_view.aod index 6a77b103cd1e0e2fc7cf584263658122d6e4b759..a2d5712767622a78b7a4f667568cb66aa70e7291 100644 --- a/neonView/CampaignStepFilter_view/CampaignStepFilter_view.aod +++ b/neonView/CampaignStepFilter_view/CampaignStepFilter_view.aod @@ -6,9 +6,9 @@ <majorModelMode>DISTRIBUTED</majorModelMode> <filterable v="false" /> <layout> - <groupLayout> + <boxLayout> <name>layout</name> - </groupLayout> + </boxLayout> </layout> <children> <tableViewTemplate> @@ -56,14 +56,5 @@ </neonTableColumn> </columns> </tableViewTemplate> - <ganttViewTemplate> - <name>StepGantt</name> - <beginDateField>DATE_START</beginDateField> - <endDateField>DATE_END</endDateField> - <titleField>NAME</titleField> - <descriptionField>DESCRIPTION</descriptionField> - <uidField>CAMPAIGNSTEPID</uidField> - <entityField>#ENTITY</entityField> - </ganttViewTemplate> </children> </neonView> diff --git a/neonView/DefaultAdminView_view/DefaultAdminView_view.aod b/neonView/DefaultAdminView_view/DefaultAdminView_view.aod new file mode 100644 index 0000000000000000000000000000000000000000..157109c00c4788f8d41428305e05987cbf8eb94e --- /dev/null +++ b/neonView/DefaultAdminView_view/DefaultAdminView_view.aod @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="UTF-8"?> +<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.1"> + <name>DefaultAdminView_view</name> + <majorModelMode>DISTRIBUTED</majorModelMode> + <isSmall v="true" /> + <layout> + <noneLayout> + <name>layout</name> + </noneLayout> + </layout> + <children> + <neonViewReference> + <name>80206d15-7132-45c1-9cf5-e2236d0f2fdb</name> + <entityField>Rows</entityField> + <view>AdminViewRow_view</view> + </neonViewReference> + </children> +</neonView> diff --git a/neonView/OrganisationAdmin_view/OrganisationAdmin_view.aod b/neonView/OrganisationAdmin_view/OrganisationAdmin_view.aod deleted file mode 100644 index d8ff404d6909f3124d217b4b310aa46ec7ede13e..0000000000000000000000000000000000000000 --- a/neonView/OrganisationAdmin_view/OrganisationAdmin_view.aod +++ /dev/null @@ -1,5 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.1"> - <name>OrganisationAdmin_view</name> - <majorModelMode>DISTRIBUTED</majorModelMode> -</neonView> diff --git a/neonView/PersonAdmin_view/PersonAdmin_view.aod b/neonView/PersonAdmin_view/PersonAdmin_view.aod deleted file mode 100644 index 8709028fd5e9cb9930e7e2078645257df353c348..0000000000000000000000000000000000000000 --- a/neonView/PersonAdmin_view/PersonAdmin_view.aod +++ /dev/null @@ -1,65 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.1"> - <name>PersonAdmin_view</name> - <majorModelMode>DISTRIBUTED</majorModelMode> - <isSmall v="true" /> - <layout> - <noneLayout> - <name>layout</name> - </noneLayout> - </layout> - <children> - <genericViewTemplate> - <name>Info</name> - <entityField>#ENTITY</entityField> - <fields> - <entityFieldLink> - <name>fb53347a-00e7-4b10-a84d-7ee022ca5c20</name> - <entityField>CONTACTID</entityField> - </entityFieldLink> - <entityFieldLink> - <name>11dbf6a2-b795-4e94-b1e0-09f4d14e28b1</name> - <entityField>PERSON_ID</entityField> - </entityFieldLink> - <entityFieldLink> - <name>1792811a-107c-408c-91fb-3539325cf72c</name> - <entityField>ORGANISATION_ID</entityField> - </entityFieldLink> - <entityFieldLink> - <name>9dee9668-ce14-496e-b9cb-840f0b18d876</name> - <entityField>ADDRESS_ID</entityField> - </entityFieldLink> - </fields> - </genericViewTemplate> - <genericViewTemplate> - <name>Info2</name> - <entityField>#ENTITY</entityField> - <fields> - <entityFieldLink> - <name>363e8c8c-7670-4ff1-b4f9-c8ff46d8744e</name> - <entityField>DATE_NEW</entityField> - </entityFieldLink> - <entityFieldLink> - <name>3d41529d-f9ae-4cf3-8ab5-4b490bc82566</name> - <entityField>DATE_EDIT</entityField> - </entityFieldLink> - <entityFieldLink> - <name>21c3b6fd-0203-440e-a6f7-ee8950fbf854</name> - <entityField>DATE_NEW_CONTACT</entityField> - </entityFieldLink> - <entityFieldLink> - <name>d1703ed2-cf89-4afd-83bf-ff350611336d</name> - <entityField>USER_NEW</entityField> - </entityFieldLink> - <entityFieldLink> - <name>8e23c269-28dd-4f87-a040-ec687bbdbd62</name> - <entityField>USER_EDIT</entityField> - </entityFieldLink> - <entityFieldLink> - <name>578cd57b-963a-4882-870a-d4e82889106f</name> - <entityField>USER_NEW_CONTACT</entityField> - </entityFieldLink> - </fields> - </genericViewTemplate> - </children> -</neonView> diff --git a/neonView/SalesprojectMilestoneInfo_view/SalesprojectMilestoneInfo_view.aod b/neonView/SalesprojectMilestoneInfo_view/SalesprojectMilestoneInfo_view.aod index 5a42f75cb2c7d54959405f592672604de9b2a55a..40940270b8025b9329988c4ccb7289442ffff1a5 100644 --- a/neonView/SalesprojectMilestoneInfo_view/SalesprojectMilestoneInfo_view.aod +++ b/neonView/SalesprojectMilestoneInfo_view/SalesprojectMilestoneInfo_view.aod @@ -5,30 +5,27 @@ <layout> <boxLayout> <name>layout</name> - <direction>HORIZONTAL</direction> - <maxDirectionElements v="2" /> </boxLayout> </layout> <children> - <neonViewReference> - <name>04fca7a3-55a5-44b6-9e35-9dbd34153128</name> - <entityField>SalesprojectPhaseMilestones</entityField> - <view>SalesprojectMilestoneChart_view</view> - </neonViewReference> - <genericViewTemplate> - <name>PhaseInfo</name> - <editMode v="false" /> - <showDrawer v="true" /> - <drawerCaption>phase information</drawerCaption> - <fixedDrawer v="false" /> - <hideLabels v="true" /> + <ganttViewTemplate> + <name>MilestoneGantt</name> + <beginDateField>DATE_START</beginDateField> + <endDateField>dateEndGantt</endDateField> + <titleField>VALUE</titleField> + <uidField>SALESPROJECT_MILESTONEID</uidField> + <stepPredecessorIdField>PARENT_ID</stepPredecessorIdField> <entityField>#ENTITY</entityField> - <fields> - <entityFieldLink> - <name>10b31cdf-44c7-499d-8f4c-ac3b538b4c06</name> - <entityField>PHASEINFO</entityField> - </entityFieldLink> - </fields> - </genericViewTemplate> + <columns> + <neonTableColumn> + <name>4c261b96-17d3-424e-8297-3ff46d780516</name> + <entityField>VALUE</entityField> + </neonTableColumn> + <neonTableColumn> + <name>c055c340-0f7b-4c91-a0a6-22e20511d2a9</name> + <entityField>DATE_END</entityField> + </neonTableColumn> + </columns> + </ganttViewTemplate> </children> </neonView> diff --git a/neonView/SalesprojectOverview_view/SalesprojectOverview_view.aod b/neonView/SalesprojectOverview_view/SalesprojectOverview_view.aod index 2e629e3ebd7d3c01ad173ca89250e5e99c9e7dd1..64da4f86a4186fedf651a74ac93b4b275ba317d6 100644 --- a/neonView/SalesprojectOverview_view/SalesprojectOverview_view.aod +++ b/neonView/SalesprojectOverview_view/SalesprojectOverview_view.aod @@ -16,8 +16,8 @@ <view>SalesprojectPhase_view</view> </neonViewReference> <neonViewReference> - <name>176485e7-c79c-4fb4-8c59-26c2bfb29a46</name> - <entityField>#ENTITY</entityField> + <name>7c365878-0f88-4bc3-aed4-0667951e70af</name> + <entityField>SalesprojectPhaseMilestones</entityField> <view>SalesprojectMilestoneInfo_view</view> </neonViewReference> <neonViewReference> diff --git a/neonView/SupportTicketMain_view/SupportTicketMain_view.aod b/neonView/SupportTicketMain_view/SupportTicketMain_view.aod index f8a2b93f796506b432000baee9ff2e8c3d258d28..1628c81ae4b6e56cfad711019fe5609bff3b449b 100644 --- a/neonView/SupportTicketMain_view/SupportTicketMain_view.aod +++ b/neonView/SupportTicketMain_view/SupportTicketMain_view.aod @@ -24,6 +24,11 @@ </entityFieldLink> </fields> </genericViewTemplate> + <neonViewReference> + <name>e3dbf148-8d3d-4a62-ac20-17c878c0a669</name> + <entityField>ModuleTrees</entityField> + <view>ModuleTree_view</view> + </neonViewReference> <neonViewReference> <name>6846f680-84ef-46da-a0ea-6797044cf693</name> <entityField>Documents</entityField> diff --git a/others/guide/HowToSqlBuilder.adoc b/others/guide/HowToSqlBuilder.adoc new file mode 100644 index 0000000000000000000000000000000000000000..b0abf230413b16363354c5fe2b8a0d40f5848886 --- /dev/null +++ b/others/guide/HowToSqlBuilder.adoc @@ -0,0 +1,48 @@ +How to use the SqlBuilder (state: 10.07.2019) +============================================== +:toc2: left +:numbered: + + +== What is SqlBuilder? == +A SqlBuilder object helps to build sql queries. + +== Why would I need that? == +SqlBuilder makes it easier to build complex queries while maintaining clean code, +especially if you want to append sql parts dynamically. With SqlBuilder you can also use SqlCondition +objects in many parts of the query at the same time, for example in join, where or having clauses. + +== How to use it == +* import the lib: +[source,javascript] +---- +import("Sql_lib"); +---- +* create an object () +[source,javascript] +---- +var myDescriptiveNameOfTheQuery = new SqlBuilder(); +// or +var myDescriptiveNameOfTheQuery = SqlBuilder.begin(); +---- +* use the object, set clauses +[source,javascript] +---- +myDescriptiveNameOfTheQuery.select(["PERSON.FIRSTNAME", "PERSON.LASTNAME"]) //you can use an array or a string here + .from("PERSON") + .join("CONTACT", SqlCondition.begin() + .and("CONTACT.PERSON_ID = PERSON.PERSONID")) + .where(SqlCondition.begin() + .andPrepare("CONTACT.CONTACTID", contactId) + .build("1=1")); +---- +* Using .build on the SqlCondition is optional, but you could use it to set the alternative condition. +* Before using the sql, call .build(): +[source,javascript] +---- +var names = db.table(myDescriptiveNameOfTheQuery.build()); +---- + +== available methods == +see the comments and documentation in the lib + diff --git a/process/Bulkmail_lib/process.js b/process/Bulkmail_lib/process.js index 0f60eb164cb65562896e41009d5f0cc57ee09e7e..1d5bb47ac0e20040994892cacdd6b38ed03fd5b9 100644 --- a/process/Bulkmail_lib/process.js +++ b/process/Bulkmail_lib/process.js @@ -52,8 +52,9 @@ BulkMailUtils.sendBulkMail = function (pBulkMailId) var recipientData = db.table(SqlCondition.begin() .andPrepare("BULKMAILRECIPIENT.BULKMAIL_ID", pBulkMailId) .andPrepare("BULKMAILRECIPIENT.STATUS", $KeywordRegistry.bulkMailRecipientStatus$sent(), "# != ?") - //and no advertising ban - .buildSql("select BULKMAILRECIPIENTID, CONTACT_ID, '' from BULKMAILRECIPIENT", "1=2") + .andSqlCondition(BulkMailUtils.getCommRestrictionCondition()) + .buildSql("select BULKMAILRECIPIENTID, BULKMAILRECIPIENT.CONTACT_ID, '' from BULKMAILRECIPIENT \n\ + join CONTACT on BULKMAILRECIPIENT.CONTACT_ID = CONTACT.CONTACTID", "1=2") ); var contactIds = recipientData.map(function (e) {return e[1];}); var successIds = []; @@ -69,12 +70,11 @@ BulkMailUtils.sendBulkMail = function (pBulkMailId) let isSuccess = false; let contactId = recipientData[i][1]; let email = mails[contactId]; - if (email !== undefined) + if (email !== undefined && recipientData[i][2]) { email.toRecipients = [recipientData[i][2]]; //TODO: email address missing email.sender = emailSender; email.subject = subjects[contactId]; - email.sender = sender; isSuccess = email.send(); } @@ -115,14 +115,17 @@ BulkMailUtils.openAddRecipientView = function (pContactIds) BulkMailUtils.getCommRestrictionCondition = function (pPositive) { var currentDate = datetime.date(); - var existsQuery = SqlCondition.begin() - .andPrepare("COMMRESTRICTION.MEDIUM", $KeywordRegistry.communicationMediumCampaign$mail()) - .andPrepare("COMMRESTRICTION.STARTDATE", currentDate, "# <= ?") - .and("COMMRESTRICTION.CONTACT_ID = CONTACT.CONTACTID or COMMRESTRICTION.CONTACT_ID = CONTACT.PERSON_ID") - .buildSql("exists(select COMMRESTRICTIONID from COMMRESTRICTION", "1=2", ")"); - existsQuery = db.translateCondition(existsQuery); + var existsQuery = SqlBuilder.begin() + .select("COMMRESTRICTIONID") + .from("COMMRESTRICTION") + .where(SqlCondition.begin() + .andPrepare("COMMRESTRICTION.MEDIUM", $KeywordRegistry.communicationMediumCampaign$mail()) + .andPrepare("COMMRESTRICTION.STARTDATE", currentDate, "# <= ?") + .and("COMMRESTRICTION.CONTACT_ID = CONTACT.CONTACTID or COMMRESTRICTION.CONTACT_ID = CONTACT.PERSON_ID") + .build("1=2")); + + var cond = "exists"; if (!pPositive) - existsQuery = "not " + existsQuery; - - return SqlCondition.begin().and(existsQuery); -} \ No newline at end of file + cond = "not " + cond; + return SqlCondition.begin().andSqlBuilder(existsQuery, cond); +} diff --git a/process/Contact_lib/process.js b/process/Contact_lib/process.js index 3ea1aece0b5db28903cd7bb956432c8dff4d2e4a..6ba5c64fdb7375d0a0d7dff9579bfb986c5ac9ce 100644 --- a/process/Contact_lib/process.js +++ b/process/Contact_lib/process.js @@ -1,3 +1,4 @@ +import("system.logging"); import("system.translate"); import("system.neon"); import("system.vars"); @@ -512,7 +513,7 @@ function ContactTitleRenderer(pContact, pOptions) this._options = pOptions; else this._options = ContactTitleRenderer.OPTIONS.IncludeOrganisation; - + //function that renders the contact into a sql expression (e.g. for a subselect) this._asSqlFn = function(){ var maskingUtil = new SqlMaskingUtils(); diff --git a/process/Context_lib/process.js b/process/Context_lib/process.js index eb26eb95de977fa00f1f05bb991aa7468358111b..179cb9b79349b7cb53a988ddf70736b9e22ef544 100644 --- a/process/Context_lib/process.js +++ b/process/Context_lib/process.js @@ -1,3 +1,5 @@ +import("system.tools"); +import("system.neon"); import("system.logging"); import("system.db"); import("system.translate"); @@ -600,4 +602,44 @@ ContextUtils.getCountByContactId = function(pContextId, pContactId) return count; } return 0; +} + +function AdminViewUtils () {} + +/** + * opens the admin view + * + * @param {String} [pUidField=UID] the title of the uid field (just the title, the uid itself is fetched automatically) + * @param {String[][]} pFields Additional fields as an two dimensional array, the structure should be [[title, value, contenttype]], + * the contenttype is optional (default is TEXT). + */ +AdminViewUtils.open = function (pUidField, pFields) +{ + var uid = vars.get("$sys.uid"); + if (!pUidField) + pUidField = "UID"; + else + pUidField += " (UID)"; + var rows = [ + [pUidField, pUidField, uid, "TEXT"] + ]; + if (pFields) + { + pFields.forEach(function (field) + { + rows.push([field[0], field[0], field[1], field[2] || "TEXT"]); + }); + } + var params = { + "Uid_param" : uid, + "Rows_param" : JSON.stringify(rows) + }; + neon.openContext("DefaultAdminView", "DefaultAdminView_view", [uid], neon.OPERATINGSTATE_VIEW, params); +} + +AdminViewUtils.getActionState = function () +{ + if (tools.currentUserHasRole("INTERNAL_ADMINISTRATOR")) + return neon.COMPONENTSTATE_EDITABLE; + return neon.COMPONENTSTATE_INVISIBLE; } \ No newline at end of file diff --git a/process/KeywordRegistry_basic/process.js b/process/KeywordRegistry_basic/process.js index 6491ed23f08d9e7b81be6eb78e999b614fd38aaa..5c3e9854245af3468be05aa97b23387af52e4d3a 100644 --- a/process/KeywordRegistry_basic/process.js +++ b/process/KeywordRegistry_basic/process.js @@ -66,7 +66,7 @@ $KeywordRegistry.ticketType = function(){return "TicketType";}; $KeywordRegistry.ticketType$supportTicket = function(){return "SUPPORTTICKET ";}; $KeywordRegistry.productPricelist = function(){return "ProductPricelist";}; -$KeywordRegistry.productPricelist$standardList = function(){return "02553fc7-4611-4914-8ff5-0b7c4e7531c9";}; +$KeywordRegistry.productPricelist$standardList = function(){return "PRICELISTDEFAULT ";}; $KeywordRegistry.quantityUnit = function(){return "QuantityUnit";}; $KeywordRegistry.quantityUnit$pieces = function(){return "QUANTITYPIECES";}; @@ -97,12 +97,12 @@ $KeywordRegistry.salesprojectState$lost = function(){return "SALPROJSTATLOST $KeywordRegistry.salesprojectPhase = function(){return "SalesprojectPhase";}; $KeywordRegistry.salesprojectPhase$nqc = function(){return "SALPROJPHASENQC ";}; $KeywordRegistry.taskPriority = function(){return "TaskPriority";}; -$KeywordRegistry.taskPriority$none = function(){return "TASKPRIONONE";}; -$KeywordRegistry.taskPriority$low = function(){return "TASKPRIOLOW";}; -$KeywordRegistry.taskPriority$medium = function(){return "TASKPRIOMEDIUM";}; -$KeywordRegistry.taskPriority$high = function(){return "TASKPRIOHIGH";}; +$KeywordRegistry.taskPriority$none = function(){return "TASKPRIONONE ";}; +$KeywordRegistry.taskPriority$low = function(){return "TASKPRIOLOW ";}; +$KeywordRegistry.taskPriority$medium = function(){return "TASKPRIOMEDIUM ";}; +$KeywordRegistry.taskPriority$high = function(){return "TASKPRIOHIGH ";}; $KeywordRegistry.taskProgress = function(){return "TaskProgress";}; -$KeywordRegistry.taskProgress$0 = function(){return "ec92271b-eac2-4ec2-be24-ab4abde7e939";}; +$KeywordRegistry.taskProgress$0 = function(){return "TASKPROG0 ";}; $KeywordRegistry.CompetitionState = function(){return "CompetitionState";}; $KeywordRegistry.objectRelationType = function(){return "ObjectRelationType";}; $KeywordRegistry.deliveryTerm = function(){return "DeliveryTerm";}; diff --git a/process/Offer_lib/process.js b/process/Offer_lib/process.js index 3c526221f7c96f469faeb7bfee1e9f24d94010f3..10328c4da9f2586247b32099f3c6d830bfa2cebf 100644 --- a/process/Offer_lib/process.js +++ b/process/Offer_lib/process.js @@ -62,13 +62,13 @@ OfferUtils.getOfferNumberValidationFailString = function() { OfferUtils.isEditable = function(status) { // TODO: Administrator darf immer ändern, warten auf neue Berechtigungslogik? // Offer should be editable if offer state not equals "Sent", "Won" or "Lost" - return status != $KeywordRegistry.offerStatus$sent() && status != $KeywordRegistry.offerStatus$won() && status != $KeywordRegistry.offerStatus$lost(); + return status != $KeywordRegistry.offerStatus$won() && status != $KeywordRegistry.offerStatus$lost(); } OfferUtils.isDeletable = function(status) { // TODO: Administrator darf immer ändern, warten auf neue Berechtigungslogik? // Offer should be editable if offer state not equals "Sent", "Won" or "Lost" - return status != $KeywordRegistry.offerStatus$won() && status != $KeywordRegistry.offerStatus$lost(); + return status != $KeywordRegistry.offerStatus$sent() && status != $KeywordRegistry.offerStatus$won() && status != $KeywordRegistry.offerStatus$lost(); } /** diff --git a/process/Product_lib/process.js b/process/Product_lib/process.js index 1cd3c94982b3164bfae3f19f99b69349921d1824..8f96db44736d2078070910d37bef26cead064c05 100644 --- a/process/Product_lib/process.js +++ b/process/Product_lib/process.js @@ -39,7 +39,7 @@ ProductUtils.getCurrentProductPrice = function(pid, buySell, onlyStandard) { if (onlyStandard != undefined && onlyStandard) { - actualPriceCondition.andPrepare("PRODUCTPRICE.PRICELIST", "02553fc7-4611-4914-8ff5-0b7c4e7531c9"); + actualPriceCondition.andPrepare("PRODUCTPRICE.PRICELIST", $KeywordRegistry.productPricelist$standardList()); } actualPriceCondition.andPrepare("PRODUCTPRICE.BUYSELL", buySell) diff --git a/process/Salesproject_lib/process.js b/process/Salesproject_lib/process.js index 2a49ec8798cd0180c3f264d7f6e8a7159c49e5c5..c2258732e3551f554af14495792969ae98735cdc 100644 --- a/process/Salesproject_lib/process.js +++ b/process/Salesproject_lib/process.js @@ -1,3 +1,4 @@ +import("system.logging"); import("Sql_lib"); import("system.neon"); import("system.vars"); @@ -49,6 +50,14 @@ Salesproject.validateProjectNumber = function(projectNumber) { */ Salesproject.insertMilestone = function(salesprojectId, type, value, notifyForecast) { if (KeywordUtils.exists(value, type)) { + var id= db.cell(SqlCondition.begin() + .andPrepare("SALESPROJECT_MILESTONE.SALESPROJECT_ID", salesprojectId) + .andPrepare("SALESPROJECT_MILESTONE.TYPE", type) + .and("SALESPROJECT_MILESTONE.DATE_END is null") + .buildSql("select SALESPROJECT_MILESTONE.SALESPROJECT_MILESTONEID from SALESPROJECT_MILESTONE ")); + + logging.log("id = " + id) + db.updateData( "SALESPROJECT_MILESTONE", ["DATE_END"], @@ -62,9 +71,9 @@ Salesproject.insertMilestone = function(salesprojectId, type, value, notifyForec db.insertData( "SALESPROJECT_MILESTONE", - ["SALESPROJECT_MILESTONEID", "SALESPROJECT_ID", "TYPE", "VALUE", "DATE_START"], + ["SALESPROJECT_MILESTONEID", "SALESPROJECT_ID", "TYPE", "VALUE", "DATE_START", "PARENT_ID"], null, - [util.getNewUUID(), salesprojectId, type, value, vars.get("$sys.date")]); + [util.getNewUUID(), salesprojectId, type, value, vars.get("$sys.date"), id]); if (notifyForecast) { Salesproject.notifyToUpdateForecast() } diff --git a/process/Sql_lib/process.js b/process/Sql_lib/process.js index c77ee066f09443fc807bbd71a5a18ec0fb93b88b..bc8e3cdaff76696243e3ef8095277694f70b33c8 100644 --- a/process/Sql_lib/process.js +++ b/process/Sql_lib/process.js @@ -1,3 +1,4 @@ +import("system.logging"); import("system.translate"); import("system.vars"); import("system.util"); @@ -180,6 +181,42 @@ SqlCondition.prototype.orSqlCondition = function(cond, alternativeCond) { return this; } +/** + * append an condition that uses a subQuery with SQL-and + * + * @param {SqlBuilder} subQuery the SqlBuilder object that will be used as a subquery + * @param {String} [cond="exists"] condition that is used (e. g. exists, not exists, COLUMN = any, COLUMN in, ...) + * @return {SqlCondition} current SqlCondition-object + */ +SqlCondition.prototype.andSqlBuilder = function(subQuery, cond) { + if (!cond) + cond = "exists"; + + var preparedObj = subQuery.build(); + preparedObj[0] = cond + " ( " + preparedObj[0] + " ) "; + this.andAttachPrepared(preparedObj); + + return this; +} + +/** + * append an condition that uses a subQuery with SQL-or + * + * @param {SqlBuilder} subQuery the SqlBuilder object that will be used as a subquery + * @param {String} [cond="exists"] condition that is used (e. g. exists, not exists, COLUMN = any, COLUMN in, ...) + * @return {SqlCondition} current SqlCondition-object + */ +SqlCondition.prototype.orSqlBuilder = function(subQuery, cond) { + if (!cond) + cond = "exists"; + + var preparedObj = subQuery.build(); + preparedObj[0] = cond + " ( " + preparedObj[0] + " ) "; + this.orAttachPrepared(preparedObj); + + return this; +} + /** * same as the "and"-function but with preparedStatement functionality * @param {String | String[]} field the database field as "tablename.columnname"; e.g. "ORGANISATION.NAME" or as array with column-alias: ["ORGANISATION", "NAME", "myorgAlias"] @@ -601,7 +638,17 @@ SqlCondition.equalsNot = function(pField, pValue, pAlternativeCond, pAlias) { */ function SqlBuilder () { - this._query = []; + if(!(this instanceof SqlBuilder)) + throw new Error(translate.text("SqlBuilder must be instanciated with 'new'")); + this._sqlStr = ""; + this._select = null; + this._from = null; + this._joins = []; + this._where = null; + this._groupBy = null; + this._having = null; + this._orderBy = null; + this._unions = []; } /** @@ -609,6 +656,22 @@ function SqlBuilder () * methods on it directly without having to put brackets around it * * @return {SqlBuilder} a new SqlBuilder object + * + * @example + * var query = SqlBuilder.begin() + * .select("ORGANISATION.NAME, FIRSTNAME, LASTNAME") + * .from("PERSON") + * .join("CONTACT", "CONTACT.PERSON_ID = PERSON.PERSONID") + * .leftJoin("ORGANISATION", SqlCondition.begin() + * .and("CONTACT.ORGANISATION_ID = ORGANISATION.ORGANISATIONID") + * .andPrepare("ORGANISATION.NAME", "S%", "# like ?") + * .build("1=2)) + * .where(SqlCondition.begin() + * .andPrepare("CONTACT.STATUS", $KeywordRegistry.contactStatus$active()) + * .build("1=2)) + * .build(); + * + * var data = db.table(query); */ SqlBuilder.begin = function () { @@ -625,29 +688,29 @@ SqlBuilder.prototype.toString = function () } /** - * Adds a select clause to the sql. + * Sets the select clause of the sql. * @param {String|String[]} pFields * @return {SqlBuilder} current SqlBuilder object */ SqlBuilder.prototype.select = function (pFields) { - this._append(pFields, "select", true); + this._select = this._getClause(pFields, "select", true); return this; } /** - * Adds a select distinct clause to the sql. + * Sets the select clause of the sql with distinct. * @param {String|String[]} pFields * @return {SqlBuilder} current SqlBuilder object */ SqlBuilder.prototype.selectDistinct = function (pFields) { - this._append(pFields, "select distinct", true); + this._select = this._getClause(pFields, "select distinct", true); return this; } /** - * Adds a from clause to the sql. + * Sets the from clause of the sql. * @param {String} pTable * @param {String} [pAlias] table alias * @return {SqlBuilder} current SqlBuilder object @@ -656,15 +719,15 @@ SqlBuilder.prototype.from = function (pTable, pAlias) { if (pAlias) pTable += " " + pAlias; - this._append(pTable, "from"); + this._from = this._getClause(pTable, "from"); return this; } /** * Adds a join clause to the sql. * @param {String} pTable - * @param {String|String[]} pCondition The where condition. This can be - * a string (without the where keyword) or an array (for prepared queries). + * @param {String|String[]|SqlCondition} pCondition The where condition. This can be + * a string (without the where keyword), a SqlCondition or an array (for prepared queries). * @param {String} [pAlias] table alias * @return {SqlBuilder} current SqlBuilder object */ @@ -673,16 +736,15 @@ SqlBuilder.prototype.join = function (pTable, pCondition, pAlias) var joinStr = "join " + pTable; if (pAlias) joinStr += " " + pAlias; - this._append(joinStr + " on"); - this._append(pCondition); + this._joins.push(this._getClause(pCondition, joinStr + " on")); return this; } /** * Adds a left join clause to the sql. * @param {String} pTable - * @param {String|String[]} pCondition The where condition. This can be - * a string (without the where keyword) or an array (for prepared queries). + * @param {String|String[]|SqlCondition} pCondition The where condition. This can be + * a string (without the where keyword), a SqlCondition or an array (for prepared queries). * @param {String} [pAlias] table alias * @return {SqlBuilder} current SqlBuilder object */ @@ -691,56 +753,43 @@ SqlBuilder.prototype.leftJoin = function (pTable, pCondition, pAlias) var joinStr = "left join " + pTable; if (pAlias) joinStr += " " + pAlias; - this._append(joinStr + " on"); - this._append(pCondition); + this._joins.push(this._getClause(pCondition, joinStr + " on")); return this; } /** - * Adds a where clause to the sql. + * Sets the where clause of the sql. * - * @param {String|String[]} pCondition The where condition. This can be - * a string (without the where keyword) or an array (for prepared queries). + * @param {String|String[]|SqlCondition} pCondition The where condition. This can be + * a string (without the where keyword), a SqlCondition or an array (for prepared queries). * * @return {SqlBuilder} current SqlBuilder object */ SqlBuilder.prototype.where = function (pCondition) { - this._append("where"); - this._append(pCondition); + this._where = this._getClause(pCondition, "where"); return this; } /** - * Adds a order by clause to the sql. + * Sets the order by clause of the sql. * @param {String} pOrderBy * @return {SqlBuilder} current SqlBuilder object */ SqlBuilder.prototype.orderBy = function (pOrderBy) { - this._append(pOrderBy, "order by"); + this.orderBy = this._getClause(pOrderBy, "order by"); return this; } /** - * Adds another SqlBuilder object as a subquery. - * @param {SqlBuilder} pSubSelect - * @return {SqlBuilder} current SqlBuilder object - */ -SqlBuilder.prototype.subSelect = function (pSubSelect) -{ - this._append(pSubSelect); - return this; -} - -/** - * Adds a group by clause to the sql. + * Sets the group by clause of the sql. * @param {String|String[]} pFields * @return {SqlBuilder} current SqlBuilder object */ SqlBuilder.prototype.groupBy = function (pFields) { - this._append(pFields, "group by", true); + this._groupBy = this._getClause(pFields, "group by", true); return this; } @@ -751,8 +800,7 @@ SqlBuilder.prototype.groupBy = function (pFields) */ SqlBuilder.prototype.union = function (pSelect) { - this._append("union"); - this._append(pSelect); + this._unions.push(this._getClause(pSelect, "union")); return this; } @@ -763,43 +811,72 @@ SqlBuilder.prototype.union = function (pSelect) */ SqlBuilder.prototype.unionAll = function (pSelect) { - this._append("union all"); - this._append(pSelect); + this._unions.push(this._getClause(pSelect, "union all")); return this; } /** * Adds a having clause to the sql. * - * @param {String|String[]} pCondition The where condition. This can be - * a string (without the where keyword) or an array (for prepared queries). + * @param {String|String[]|SqlCondition} pCondition The where condition. This can be + * a string (without the where keyword), a SqlCondition or an array (for prepared queries). * * @return {SqlBuilder} current SqlBuilder object */ SqlBuilder.prototype.having = function (pCondition) { - this._append("having"); - this._append(pCondition); + this._having = this._getClause(pCondition, "having"); return this; } /** - * adds an element + * generates a part of the sql * - * @param {String|String[]|SqlBuilder} pElement the element to append + * @param {String|String[]|SqlBuilder|SqlCondition} pElement the element to append * @param {String} [pPrefix] string to be added before pElement * @param {Boolean} [pAutoJoin] if this is true and pElement is an array, it will be automatically * joined together to a string * * @private */ -SqlBuilder.prototype._append = function (pElement, pPrefix, pAutoJoin) +SqlBuilder.prototype._getClause = function (pElement, pPrefix, pAutoJoin) { - if (pAutoJoin && pElement && typeof pElement !== "string" && pElement.length !== undefined) - pElement = pElement.join(", "); + var preparedValues = []; + if (pElement instanceof SqlBuilder || pElement instanceof SqlCondition) + { + pElement = _getElement(pElement); + } + else if (typeof pElement !== "string" && pElement.length !== undefined) //array + { + if (pAutoJoin) + { + for (let i = 0, l = pElement.length; i < l; i++) + { + if (pElement[i] instanceof SqlBuilder) + pElement[i] = _getElement(pElement); + } + pElement = pElement.join(", "); + } + else + { + preparedValues = preparedValues.concat(pElement[1]); + pElement = pElement[0]; + } + } + if (pPrefix) pElement = pPrefix + " " + pElement; - this._query.push(pPrefix + " " + pElement); + + return [pElement.toString(), preparedValues]; + + function _getElement (element) + { + element = element.build(); + preparedValues = preparedValues.concat(element[1]); + if (element instanceof SqlBuilder) + return "(" + element[0] + ")"; + return element[0]; + } } /** @@ -809,27 +886,36 @@ SqlBuilder.prototype._append = function (pElement, pPrefix, pAutoJoin) */ SqlBuilder.prototype.build = function () { - var sqlStr = ""; - var preparedValues = []; + if (!this._select) + throw new Error(translate.text("SqlBuilder must contain a select clause!")); + if (!this._from) + throw new Error(translate.text("SqlBuilder must contain a from clause!")); - for (let i = 0, l = this._query.length; i < l; i++) + var sqlStr = ""; + var preparedVals = []; + var allParts = [ + this._select, + this._from + ].concat(this._joins).concat([ + this._where, + this._groupBy, + this._having, + this._orderBy, + this._unions + ]).concat(this._unions); + + for (let i = 0, l = allParts.length; i < l; i++) { - let sqlPart = this._query[i]; - if (sqlPart instanceof SqlBuilder) - { - let condition = sqlPart.build(); - sqlPart = "(" + condition[0] + ")"; - preparedValues = preparedValues.concat(condition[1]); - } - //array => prepared statement - else if (typeof pElement !== "string" && pElement.length === 2 && pElement[1].length !== undefined) + let part = allParts[i]; + if (part && part.length) { - preparedValues = preparedValues.concat(sqlPart[1]); - sqlPart = sqlPart[0]; + if (sqlStr) + sqlStr += " "; + sqlStr += part[0]; + preparedVals = preparedVals.concat(part[1]); } - sqlStr += " " + sqlPart; } - return [sqlStr.trim(), preparedValues]; + return [sqlStr, preparedVals]; } diff --git a/process/Ticket_lib/process.js b/process/Ticket_lib/process.js index f5bb788424d40875e07031e69b10fc3dd4e8d727..e23e3daa74632a107bb3c192d9f8e42db4b3c8bf 100644 --- a/process/Ticket_lib/process.js +++ b/process/Ticket_lib/process.js @@ -61,9 +61,9 @@ TicketUtils.addLinkRecords= function(pObjectIdField, pRowIdField, pAdditionalLin /** * Create a new ticket */ -TicketUtils.prototype.createNewTicket = function(pRowId, pAdditionalLinks, pParentContext, pParentId, pParams) +TicketUtils.createNewTicket = function(pRowId, pAdditionalLinks, pParentContext, pParentId, pParams) { - throw Error("Not implemented yet"); + _ActivityTaskUtils._createNew("SupportTicket", pRowId, pAdditionalLinks, pParentContext, pParentId, pParams) } /** diff --git a/process/sendBulkMail_serverProcess/process.js b/process/sendBulkMail_serverProcess/process.js index 40bd252ef6a43197982835d8211d9b60171115cf..0403cb3f69f8223ece7216225bf9f0518720fa78 100644 --- a/process/sendBulkMail_serverProcess/process.js +++ b/process/sendBulkMail_serverProcess/process.js @@ -1,3 +1,4 @@ +import("system.datetime"); import("Sql_lib"); import("system.db"); import("system.util"); @@ -6,6 +7,7 @@ import("Bulkmail_lib"); import("system.vars"); import("system.notification"); +var startTime = datetime.date(); var bulkMailId = vars.get("$local.bulkMailId"); var user = vars.get("$local.user"); var res = BulkMailUtils.sendBulkMail(bulkMailId); @@ -17,6 +19,7 @@ if (user) .buildSql("select NAME from BULKMAIL") ); var message = translate.withArguments("Bulk mail \"%0\" was sent!", [mailName]); - var description = translate.withArguments("%0 mails sent sucessfully, %1 mails failed", [res.sucessful, res.failed]); + var description = translate.withArguments("%0 mails sent sucessfully, %1 mails failed. Process took %2 s.", + [res.sucessful, res.failed, Math.round((datetime.date() - startTime) / datetime.ONE_SECOND)]); notification.addNotification(util.getNewUUID(), null, null, null, "BulkMailSent", notification.PRIO_NORMAL, 2, notification.STATE_UNSEEN, [user], message, description); } \ No newline at end of file