diff --git a/ccm-cms/package.json.tsc b/ccm-cms/package.json.tsc
new file mode 100644
index 000000000..29096e6f3
--- /dev/null
+++ b/ccm-cms/package.json.tsc
@@ -0,0 +1,32 @@
+{
+ "name": "ccm-cms",
+ "version": "7.0.0",
+ "description": "JavaScript stuff for ccm-cms",
+ "main": "index.js",
+ "scripts": {
+ "build": "npm-run-all build:*:*",
+ "build:cms-admin:ts": "tsc",
+ "build:cms-admin:css": "sass src/main/scss/content-sections/cms-admin.scss target/generated-resources/assets/@content-sections/cms-admin.css"
+ },
+ "author": "Jens Pelzetter",
+ "license": "LGPL-3.0-or-later",
+ "devDependencies": {
+ "@parcel/transformer-typescript-tsc": "^2.0.0-beta.1",
+ "@types/jquery": "^3.5.5",
+ "npm-run-all": "^4.1.5",
+ "parcel": "^2.0.0-beta.2",
+ "sass": "^1.32.12",
+ "typescript": "^4.2.4"
+ },
+ "dependencies": {
+ "@tiptap/core": "^2.0.0-beta.46",
+ "@tiptap/starter-kit": "^2.0.0-beta.43",
+ "bootstrap": "^4.6.0",
+ "bootstrap-icons": "^1.4.1",
+ "jquery": "^3.6.0",
+ "popper.js": "^1.16.1"
+ },
+ "targets": {
+ "main": false
+ }
+}
diff --git a/ccm-cms/package.json.webpack b/ccm-cms/package.json.webpack
new file mode 100644
index 000000000..cd2532779
--- /dev/null
+++ b/ccm-cms/package.json.webpack
@@ -0,0 +1,35 @@
+{
+ "name": "ccm-cms",
+ "version": "7.0.0",
+ "description": "JavaScript stuff for ccm-cms",
+ "main": "index.js",
+ "scripts": {
+ "build": "npm-run-all build:*:*",
+ "build:ccm-admin:js": "webpack",
+ "build:ccm-admin:css": "sass src/main/scss/content-sections/cms-admin.scss target/generated-resources/assets/@content-sections/cms-admin.css"
+ },
+ "author": "Jens Pelzetter",
+ "license": "LGPL-3.0-or-later",
+ "devDependencies": {
+ "@parcel/transformer-typescript-tsc": "^2.0.0-beta.1",
+ "@types/bootstrap": "^5.0.15",
+ "npm-run-all": "^4.1.5",
+ "parcel": "^2.0.0-beta.2",
+ "sass": "^1.32.12",
+ "ts-loader": "^9.2.3",
+ "typescript": "^4.2.4",
+ "webpack": "^5.38.1",
+ "webpack-cli": "^4.7.2"
+ },
+ "dependencies": {
+ "@tiptap/core": "^2.0.0-beta.46",
+ "@tiptap/starter-kit": "^2.0.0-beta.43",
+ "bootstrap": "^4.6.0",
+ "bootstrap-icons": "^1.4.1",
+ "jquery": "^3.6.0",
+ "popper.js": "^1.16.1"
+ },
+ "targets": {
+ "main": false
+ }
+}
diff --git a/ccm-cms/src/main/java/org/librecms/ui/contentsections/assets/AbstractContactableEntityEditStep.java b/ccm-cms/src/main/java/org/librecms/ui/contentsections/assets/AbstractContactableEntityEditStep.java
index dd5290071..3c48c4667 100644
--- a/ccm-cms/src/main/java/org/librecms/ui/contentsections/assets/AbstractContactableEntityEditStep.java
+++ b/ccm-cms/src/main/java/org/librecms/ui/contentsections/assets/AbstractContactableEntityEditStep.java
@@ -37,6 +37,7 @@ import java.util.Optional;
import java.util.stream.Collectors;
import javax.inject.Inject;
+import javax.mvc.Controller;
import javax.mvc.Models;
import javax.servlet.http.HttpServletRequest;
import javax.transaction.Transactional;
@@ -50,6 +51,7 @@ import javax.ws.rs.core.Context;
*
* @author Jens Pelzetter
*/
+@Controller
public abstract class AbstractContactableEntityEditStep
extends AbstractMvcAssetEditStep {
@@ -123,7 +125,7 @@ public abstract class AbstractContactableEntityEditStep
.append(request.getServerName())
.append(addServerPortToBaseUrl())
.append(addContextPathToBaseUrl())
- .toString()
+ .toString()
);
} else {
@@ -152,6 +154,14 @@ public abstract class AbstractContactableEntityEditStep
@FormParam("entryKey") final String entryKeyParam,
@FormParam("entryValue") final String entryValue
) {
+ try {
+ init();
+ } catch (ContentSectionNotFoundException ex) {
+ return ex.showErrorMessage();
+ } catch (AssetNotFoundException ex) {
+ return ex.showErrorMessage();
+ }
+
final Optional entryKeyResult = entryKeyRepo
.findByEntryKey(entryKeyParam);
if (!entryKeyResult.isPresent()) {
@@ -178,6 +188,14 @@ public abstract class AbstractContactableEntityEditStep
@PathParam("index") final int index,
@FormParam("entryValue") final String entryValue
) {
+ try {
+ init();
+ } catch (ContentSectionNotFoundException ex) {
+ return ex.showErrorMessage();
+ } catch (AssetNotFoundException ex) {
+ return ex.showErrorMessage();
+ }
+
final List entries = getContactableEntity()
.getContactEntries();
if (index >= entries.size()) {
@@ -199,6 +217,14 @@ public abstract class AbstractContactableEntityEditStep
public String removeContactEntry(
@PathParam("index") final int index
) {
+ try {
+ init();
+ } catch (ContentSectionNotFoundException ex) {
+ return ex.showErrorMessage();
+ } catch (AssetNotFoundException ex) {
+ return ex.showErrorMessage();
+ }
+
final List entries = getContactableEntity()
.getContactEntries();
if (index >= entries.size()) {
@@ -221,6 +247,14 @@ public abstract class AbstractContactableEntityEditStep
@FormParam("postalAddressIdentifier")
final String postalAddressIdentifier
) {
+ try {
+ init();
+ } catch (ContentSectionNotFoundException ex) {
+ return ex.showErrorMessage();
+ } catch (AssetNotFoundException ex) {
+ return ex.showErrorMessage();
+ }
+
final Identifier identifier = identifierParser
.parseIdentifier(postalAddressIdentifier);
final Optional postalAddressResult;
@@ -260,6 +294,14 @@ public abstract class AbstractContactableEntityEditStep
@AuthorizationRequired
@Transactional(Transactional.TxType.REQUIRED)
public String removePostalAddress() {
+ try {
+ init();
+ } catch (ContentSectionNotFoundException ex) {
+ return ex.showErrorMessage();
+ } catch (AssetNotFoundException ex) {
+ return ex.showErrorMessage();
+ }
+
contactableManager.removePostalAddressFromContactableEntity(
getContactableEntity().getPostalAddress(), getContactableEntity()
);
diff --git a/ccm-cms/src/main/typescript/content-sections/cms-assetpicker.ts b/ccm-cms/src/main/typescript/content-sections/cms-assetpicker.ts
index 864047f8d..0bac030ce 100644
--- a/ccm-cms/src/main/typescript/content-sections/cms-assetpicker.ts
+++ b/ccm-cms/src/main/typescript/content-sections/cms-assetpicker.ts
@@ -93,7 +93,7 @@ async function selectAsset(event: Event, assetPickerElem: Element) {
console.error("assetPickerParam is null");
return;
}
- assetPickerParam.value = assetUuid;
+ assetPickerParam.value = `UUID-${assetUuid}`;
const form = assetPickerElem.querySelector("form") as HTMLFormElement;
form.submit();
diff --git a/ccm-cms/webpack.config.js b/ccm-cms/webpack.config.js
new file mode 100644
index 000000000..460c20e8c
--- /dev/null
+++ b/ccm-cms/webpack.config.js
@@ -0,0 +1,21 @@
+module.exports = {
+ mode: "production",
+ devtool: "inline-source-map",
+ entry: {
+ "cms-admin": "./src/main/typescript/content-sections/cms-admin.ts",
+ "cms-editor": "./src/main/typescript/content-sections/cms-editor.ts"
+ },
+ output: {
+ filename: "[name].js",
+ path: __dirname + "/target/generated-resources/assets/@content-sections"
+ },
+ resolve: {
+ extensions: [".tsx", ".ts", ".js", ".json"]
+ },
+ module: {
+ rules: [
+ // all files with a '.ts' or '.tsx' extension will be handled by 'ts-loader'
+ { test: /\.tsx?$/, use: ["ts-loader"], exclude: /node_modules/ }
+ ]
+ }
+};