Skip to content

Commit 277e062

Browse files
committed
Structure for React UI
1 parent 827297d commit 277e062

File tree

14 files changed

+10627
-0
lines changed

14 files changed

+10627
-0
lines changed

.gitignore

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,5 +14,10 @@ target
1414
# Jahia DX Studio
1515
repository.xml.generated
1616

17+
# JS
18+
/node_modules
19+
/node
20+
/src/main/resources/javascript/ui
21+
1722
# Custom
1823
TODO.md

package.json

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
{
2+
"name": "content-integrity",
3+
"version": "3.0.0",
4+
"main": "index.js",
5+
"scripts": {
6+
"build:dev": "yarn webpack",
7+
"build:production": "yarn webpack --mode=production",
8+
"webpack": "node --max_old_space_size=2048 ./node_modules/webpack/bin/webpack.js",
9+
"start": "react-scripts start",
10+
"build": "react-scripts build",
11+
"test": "react-scripts test --env=jsdom",
12+
"eject": "react-scripts eject",
13+
"dev": "yarn webpack --watch",
14+
"watch": "yarn webpack --watch"
15+
},
16+
"dependencies": {
17+
"react": "^19.2.0",
18+
"react-dom": "^19.2.0",
19+
"react-scripts": "^5.0.0"
20+
},
21+
"devDependencies": {
22+
"clean-webpack-plugin": "^4.0.0",
23+
"copy-webpack-plugin": "^13.0.1",
24+
"webpack": "^5.102.0",
25+
"webpack-bundle-analyzer": "^4.10.2",
26+
"webpack-cli": "^6.0.1",
27+
"@babel/core": "^7.28.5",
28+
"@babel/plugin-syntax-dynamic-import": "^7.8.3",
29+
"babel-loader": "^10.0.0",
30+
"@babel/preset-env": "^7.28.5",
31+
"@babel/preset-react": "^7.28.5"
32+
},
33+
"browserslist": {
34+
"production": [
35+
">0.2%",
36+
"not dead",
37+
"not op_mini all"
38+
],
39+
"development": [
40+
"last 1 chrome version",
41+
"last 1 firefox version",
42+
"last 1 safari version"
43+
]
44+
}
45+
}

pom.xml

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@
8484
org.jahia.modules.contentintegrity.taglib</export-package>
8585
<graphql-dxm-provider.version>2.3.0</graphql-dxm-provider.version>
8686
<external-provider.version>4.0.0</external-provider.version>
87+
<yarn.arguments>build:production</yarn.arguments>
8788
</properties>
8889

8990
<scm>
@@ -120,6 +121,20 @@
120121

121122
<build>
122123
<plugins>
124+
<plugin>
125+
<artifactId>maven-clean-plugin</artifactId>
126+
<version>3.1.0</version>
127+
<configuration>
128+
<filesets>
129+
<fileset>
130+
<directory>src/main/resources/javascript/apps/ui</directory>
131+
<includes>
132+
<include>*</include>
133+
</includes>
134+
</fileset>
135+
</filesets>
136+
</configuration>
137+
</plugin>
123138
<plugin>
124139
<groupId>org.apache.felix</groupId>
125140
<artifactId>maven-bundle-plugin</artifactId>
@@ -132,6 +147,51 @@
132147
</instructions>
133148
</configuration>
134149
</plugin>
150+
<plugin>
151+
<groupId>com.github.eirslett</groupId>
152+
<artifactId>frontend-maven-plugin</artifactId>
153+
<version>1.15.0</version>
154+
<executions>
155+
<execution>
156+
<id>npm install node and yarn</id>
157+
<phase>generate-resources</phase>
158+
<goals>
159+
<goal>install-node-and-yarn</goal>
160+
</goals>
161+
<configuration>
162+
<nodeVersion>v22.19.0</nodeVersion>
163+
<yarnVersion>v1.22.22</yarnVersion>
164+
</configuration>
165+
</execution>
166+
<execution>
167+
<id>yarn install</id>
168+
<phase>generate-resources</phase>
169+
<goals>
170+
<goal>yarn</goal>
171+
</goals>
172+
</execution>
173+
<execution>
174+
<id>yarn post-install</id>
175+
<phase>generate-resources</phase>
176+
<goals>
177+
<goal>yarn</goal>
178+
</goals>
179+
<configuration>
180+
<arguments>${yarn.arguments}</arguments>
181+
</configuration>
182+
</execution>
183+
<execution>
184+
<id>sync-pom</id>
185+
<phase>none</phase>
186+
<goals>
187+
<goal>yarn</goal>
188+
</goals>
189+
<configuration>
190+
<arguments>sync-pom</arguments>
191+
</configuration>
192+
</execution>
193+
</executions>
194+
</plugin>
135195
</plugins>
136196
</build>
137197

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package org.jahia.modules.contentintegrity.config;
2+
3+
import org.osgi.service.component.annotations.Activate;
4+
import org.osgi.service.component.annotations.Component;
5+
import org.osgi.service.component.annotations.Deactivate;
6+
import org.osgi.service.metatype.annotations.AttributeDefinition;
7+
import org.osgi.service.metatype.annotations.Designate;
8+
import org.osgi.service.metatype.annotations.ObjectClassDefinition;
9+
import org.osgi.service.metatype.annotations.Option;
10+
import org.slf4j.Logger;
11+
import org.slf4j.LoggerFactory;
12+
13+
import java.util.Arrays;
14+
import java.util.Collection;
15+
import java.util.Map;
16+
17+
@Component(service = ContentIntegrityConfig.class, immediate = true, configurationPid = "org.jahia.modules.contentintegrity")
18+
//@Designate(ocd = ContentIntegrityConfig.Config.class)
19+
public class ContentIntegrityConfig {
20+
21+
/*
22+
@ObjectClassDefinition(name = "%configuration.name", description = "%configuration.description", localization = "OSGI-INF/l10n/contentIntegrityConfig")
23+
public @interface Config {
24+
@AttributeDefinition(
25+
name = "%ui.name",
26+
description = "%ui.description",
27+
options = {
28+
@Option(label = "%ui.value.default", value = "default"),
29+
@Option(label = "%ui.value.js", value = "js"),
30+
@Option(label = "%ui.value.react", value = "react"),
31+
}
32+
)
33+
String ui() default "default";
34+
}
35+
*/
36+
37+
private static final Logger logger = LoggerFactory.getLogger(ContentIntegrityConfig.class);
38+
39+
private static final String UI_JS = "js";
40+
private static final String UI_REACT = "react";
41+
private static final String DEFAULT_UI = UI_JS;
42+
private static final Collection<String> validUis = Arrays.asList(UI_JS, UI_REACT);
43+
44+
private String ui;
45+
46+
/*
47+
@Activate
48+
public void activate(Config config) {
49+
ui = config.ui();
50+
}
51+
*/
52+
53+
@Activate
54+
public void activate(Map<String, ?> properties) {
55+
ui = (String) properties.getOrDefault("contentIntegrity.ui", null);
56+
}
57+
58+
public String getUi() {
59+
return validUis.contains(ui) ? ui : DEFAULT_UI;
60+
}
61+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package org.jahia.modules.contentintegrity.taglib;
2+
3+
import org.jahia.modules.contentintegrity.config.ContentIntegrityConfig;
4+
import org.jahia.osgi.BundleUtils;
5+
import org.slf4j.Logger;
6+
import org.slf4j.LoggerFactory;
7+
8+
public class Functions {
9+
10+
private static final Logger logger = LoggerFactory.getLogger(Functions.class);
11+
12+
public static String getScreenView() {
13+
return BundleUtils.getOsgiService(ContentIntegrityConfig.class, null).getUi();
14+
}
15+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
export default function Screen() {
2+
return (
3+
<div>
4+
<h1>{constants.main.title}</h1>
5+
<p>{constants.main.description}</p>
6+
</div>
7+
)
8+
}

src/main/javascript/index.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import { StrictMode } from "react";
2+
import { createRoot } from "react-dom/client";
3+
4+
import Screen from "./Screen";
5+
6+
const rootElement = document.getElementById("content-integrity-root");
7+
console.log("Initializing content-integrity UI", rootElement)
8+
const root = createRoot(rootElement);
9+
root.render(
10+
<StrictMode>
11+
<Screen />
12+
</StrictMode>
13+
);
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# default configuration - won't be overridden
2+
3+
contentIntegrity.ui=<default>

src/main/resources/META-INF/content-integrity.tld

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,17 @@
99
<tlib-version>1.0</tlib-version>
1010
<short-name>content-integrity-utils</short-name>
1111
<uri>http://www.jahia.org/tags/content-integrity-utils</uri>
12+
1213
<tag>
1314
<name>toolsToken</name>
1415
<tag-class>org.jahia.modules.contentintegrity.taglib.ToolsTokenTag</tag-class>
1516
<body-content>empty</body-content>
1617
</tag>
18+
<function>
19+
<name>screenView</name>
20+
<function-class>org.jahia.modules.contentintegrity.taglib.Functions</function-class>
21+
<function-signature>java.lang.String getScreenView()</function-signature>
22+
</function>
23+
1724

1825
</taglib>
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
configuration.name=Content Integrity
2+
configuration.description=Configuration of the content-integrity module
3+
ui.name=contentIntegrity.ui
4+
ui.description=Implementation to use for the UI. Choosing "default" means using the javascript UI until the React one becomes production ready
5+
ui.value.default=Default
6+
ui.value.js=Javascript
7+
ui.value.react=React

0 commit comments

Comments
 (0)