diff --git a/entity/KeywordEntry_entity/KeywordEntry_entity.aod b/entity/KeywordEntry_entity/KeywordEntry_entity.aod index 97125bb8039cdfc95b82b1a17c2dc1f1e9d0d198..daf9a9b371d958db9e78f601137e38a4c9b642c5 100644 --- a/entity/KeywordEntry_entity/KeywordEntry_entity.aod +++ b/entity/KeywordEntry_entity/KeywordEntry_entity.aod @@ -22,6 +22,8 @@ <mandatory v="true" /> <possibleItemsProcess>%aditoprj%/entity/KeywordEntry_entity/entityfields/container/possibleItemsProcess.js</possibleItemsProcess> <groupable v="true" /> + <state>READONLY</state> + <stateProcess>%aditoprj%/entity/KeywordEntry_entity/entityfields/container/stateProcess.js</stateProcess> </entityField> <entityField> <name>AB_KEYWORD_ENTRYID</name> @@ -30,10 +32,13 @@ </entityField> <entityField> <name>KEYID</name> + <documentation>%aditoprj%/entity/KeywordEntry_entity/entityfields/keyid/documentation.adoc</documentation> <title>Key</title> + <mandatory v="true" /> <state>READONLY</state> <stateProcess>%aditoprj%/entity/KeywordEntry_entity/entityfields/keyid/stateProcess.js</stateProcess> <valueProcess>%aditoprj%/entity/KeywordEntry_entity/entityfields/keyid/valueProcess.js</valueProcess> + <onValidation>%aditoprj%/entity/KeywordEntry_entity/entityfields/keyid/onValidation.js</onValidation> </entityField> <entityField> <name>TITLE</name> diff --git a/entity/KeywordEntry_entity/entityfields/container/documentation.adoc b/entity/KeywordEntry_entity/entityfields/container/documentation.adoc index b46aaac93ed420d5150d4d5202dc302a4898ca70..e1cfb215ac798637843c387c914479f4428e301a 100644 --- a/entity/KeywordEntry_entity/entityfields/container/documentation.adoc +++ b/entity/KeywordEntry_entity/entityfields/container/documentation.adoc @@ -1 +1,2 @@ - `CONTAINER` is the a name and used for grouping keyword-entries. This is was a keyword-container essentially is. \ No newline at end of file + `CONTAINER` is the a name and used for grouping keyword-entries. This is was a keyword-container essentially is. +After creation of an entry it cannot be changed anymore. \ No newline at end of file diff --git a/entity/KeywordEntry_entity/entityfields/container/stateProcess.js b/entity/KeywordEntry_entity/entityfields/container/stateProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..82fc64847e6ac4e59a674fac7873eef6161aa741 --- /dev/null +++ b/entity/KeywordEntry_entity/entityfields/container/stateProcess.js @@ -0,0 +1,19 @@ +import("system.result"); +import("system.neon"); +import("system.vars"); + +/*allowing the CONTAINER to change later would result in a lot of problems like + * - what happens to SORTING-value? + * - what happens with already created keyword-attributerelations? + * - what happens when a key is specified twice after the change? + * - what happens when the keywordentry has been already used? + * + * Therefore just forbid to change it after the record has been inserted + */ +var fieldState; +if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW) + fieldState = neon.COMPONENTSTATE_AUTO; +else + fieldState = neon.COMPONENTSTATE_READONLY; + +result.string(fieldState); \ No newline at end of file diff --git a/entity/KeywordEntry_entity/entityfields/keyid/documentation.adoc b/entity/KeywordEntry_entity/entityfields/keyid/documentation.adoc new file mode 100644 index 0000000000000000000000000000000000000000..543e079982a272d1ea3414231414004150915df5 --- /dev/null +++ b/entity/KeywordEntry_entity/entityfields/keyid/documentation.adoc @@ -0,0 +1,7 @@ +The key of an keyword-entry is a internal, technical representation which is stored in references. +It's unique within a keyword-container but not within the whole keyword-module (like the `AB_KEYWORD_ENTRYID` is). + +A UUID is generated and used as preset-value but it's possible to overwrite the `KEYID` with an own value (as long as the custom key follows the rules, like keyword-entry-level-uniqueness) +This could for example be ISO-standardised value or a value that is maintained within an ERP-system. + +After creation of an entry it cannot be changed anymore. \ No newline at end of file diff --git a/entity/KeywordEntry_entity/entityfields/keyid/onValidation.js b/entity/KeywordEntry_entity/entityfields/keyid/onValidation.js new file mode 100644 index 0000000000000000000000000000000000000000..a0830f5196463702be757aa76d46e9b3d3c1c8f4 --- /dev/null +++ b/entity/KeywordEntry_entity/entityfields/keyid/onValidation.js @@ -0,0 +1,26 @@ +import("system.translate"); +import("system.result"); +import("system.db"); +import("system.vars"); +import("Sql_lib"); +import("Entity_lib"); + +var container = vars.get("$field.CONTAINER"); +var keyId = ProcessHandlingUtils.getOnValidationValue(vars.get("$field.KEYID")).trim(); + +//a KEY has always to be unique within one container and since the user can specify the key on insert we've to ensure that it's unique +if (container && keyId) +{ + var selfEntryId = vars.get("$field.AB_KEYWORD_ENTRYID"); + var sqlMasks = new SqlMaskingUtils(); + var alreadyExistsSql = SqlCondition.begin() + .andPrepare(sqlMasks.trim("AB_KEYWORD_ENTRY.KEYID"), keyId, null, SqlUtils.getSingleColumnType("AB_KEYWORD_ENTRY", "KEYID")) + .andPrepare("AB_KEYWORD_ENTRY.CONTAINER", container) + .andPrepare("AB_KEYWORD_ENTRY.AB_KEYWORD_ENTRYID", selfEntryId, "# != ?") + .buildSql("select AB_KEYWORD_ENTRY.AB_KEYWORD_ENTRYID from AB_KEYWORD_ENTRY"); + var alreadyExistantEntryId = db.cell(alreadyExistsSql); + + if (alreadyExistantEntryId != "") + result.string(translate.text("the specified key has to be unique for that container but does already exist")); + +} \ No newline at end of file diff --git a/entity/KeywordEntry_entity/entityfields/keyid/valueProcess.js b/entity/KeywordEntry_entity/entityfields/keyid/valueProcess.js index 4af99287f59a86e98d9b4c552c010fe13c106cc7..2fc41228ab188dc70af71478adb1d1afd7c1cb77 100644 --- a/entity/KeywordEntry_entity/entityfields/keyid/valueProcess.js +++ b/entity/KeywordEntry_entity/entityfields/keyid/valueProcess.js @@ -3,5 +3,5 @@ import("system.result"); import("system.neon"); import("system.vars"); -if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW) +if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && !vars.get("$this.value")) result.string(util.getNewUUID()); \ No newline at end of file diff --git a/entity/KeywordEntry_entity/recordcontainers/db/onDBUpdate.js b/entity/KeywordEntry_entity/recordcontainers/db/onDBUpdate.js index d9f8978acd6592e20a2851d1e46b490b2ff398d7..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644 --- a/entity/KeywordEntry_entity/recordcontainers/db/onDBUpdate.js +++ b/entity/KeywordEntry_entity/recordcontainers/db/onDBUpdate.js @@ -1,29 +0,0 @@ -import("system.translate"); -import("system.db"); -import("system.vars"); -import("system.text"); -import("system.neon"); -import("Sql_lib"); - -var changedFields = vars.get("$local.changed"); -//whenever the container is changed data that depends on the keyword-container has be "fixed" to keep consistency -//this could be information like Keyword-attributes or the sorting-position -// TODO: maybe it'd be better to lock KeywordContainer as read-only after creation -if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_EDIT && changedFields.indexOf("AB_KEYWORD_ENTRY.CONTAINER") > -1) -{ - var keyContainer = vars.get("$field.CONTAINER"); - if (keyContainer) - { - var cond = SqlCondition.begin().andPrepare("AB_KEYWORD_ENTRY.CONTAINER", keyContainer); - var maskingHelper = new SqlMaskingUtils(); - var newCodeNumber = db.cell(cond.buildSql("select " + maskingHelper.max("AB_KEYWORD_ENTRY.SORTING") + " from AB_KEYWORD_ENTRY", "1 = 2")); - newCodeNumber = Number(newCodeNumber);//if no number exists till no, start value will be 1 (due to: ++0) - if (isNaN(newCodeNumber)) - throw new TypeError(translate.text("The code number is not a valid number.")); - - var cols = ["SORTING"]; - var vals = [++newCodeNumber]; - cond.clear().andPrepare("AB_KEYWORD_ENTRY.AB_KEYWORD_ENTRYID", vars.get("$sys.uid")); - db.updateData("AB_KEYWORD_ENTRY", cols, null, vals, cond.build("1 = 2")); - } -} \ No newline at end of file