commit
dbad6dcf61
39 changed files with 1721 additions and 97 deletions
11
configuration/kie-server/javaOpts.txt
Normal file
11
configuration/kie-server/javaOpts.txt
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
-DM2_HOME=/Users/nheron/m2_kieserver
|
||||
-Dorg.chtijbug.server.tracedir=/Users/nheron/kie-base-jbpm-710/trace
|
||||
-Dorg.appformer.m2repo.url=http://localhost:8080/kie-wb/maven2
|
||||
-Dorg.uberfire.nio.git.dir=/Users/nheron/kie-base-jbpm-710/niodir-kieserver
|
||||
-Dkie.maven.settings.custom=/Users/nheron/m2_kieserver/settings.xml
|
||||
-Dorg.kie.server.repo=/Users/nheron/kie-base-jbpm-710/niodir-kieserver
|
||||
-Dfile.encoding=UTF-8
|
||||
-Duser.language=fr
|
||||
-Duser.country=FR
|
||||
-Dorg.kie.server.id=server1
|
||||
-Dorg.chtijbug.server.sftpPort=9080
|
||||
|
|
@ -1,92 +0,0 @@
|
|||
package org.chtijbug.drools.console;
|
||||
|
||||
|
||||
import com.vaadin.flow.component.button.Button;
|
||||
import com.vaadin.flow.component.orderedlayout.HorizontalLayout;
|
||||
import com.vaadin.flow.component.orderedlayout.VerticalLayout;
|
||||
import com.vaadin.flow.component.textfield.PasswordField;
|
||||
import com.vaadin.flow.component.textfield.TextField;
|
||||
import com.vaadin.flow.router.Route;
|
||||
import org.chtijbug.drools.console.service.KieRepositoryService;
|
||||
import org.chtijbug.drools.console.service.UserConnectedService;
|
||||
import org.chtijbug.drools.console.service.model.UserConnected;
|
||||
import org.chtijbug.drools.console.service.model.kie.KieConfigurationData;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
|
||||
import javax.annotation.PostConstruct;
|
||||
|
||||
@Route("")
|
||||
public class WelcomeView extends DroolsAdminConsoleMainView {
|
||||
|
||||
private UserConnected userConnected;
|
||||
private TextField userNameTextField;
|
||||
private PasswordField userpasswdTextField;
|
||||
private Button loginButton;
|
||||
private Button logoutButton;
|
||||
|
||||
@Autowired
|
||||
private KieRepositoryService kieRepositoryService;
|
||||
@Autowired
|
||||
private KieConfigurationData configKie;
|
||||
|
||||
@Autowired
|
||||
private UserConnectedService userConnectedService;
|
||||
|
||||
public WelcomeView() {
|
||||
super();
|
||||
}
|
||||
|
||||
@PostConstruct
|
||||
public void buildUI() {
|
||||
|
||||
userConnected = new UserConnected();
|
||||
VerticalLayout verticalLayout = new VerticalLayout();
|
||||
HorizontalLayout userHorizontal = new HorizontalLayout();
|
||||
verticalLayout.add(userHorizontal);
|
||||
TextField urlTextField = new TextField("Kie-Wb url");
|
||||
urlTextField.setValue(configKie.getKiewbUrl());
|
||||
urlTextField.setMaxLength(200);
|
||||
userHorizontal.add(urlTextField);
|
||||
userNameTextField = new TextField("User name");
|
||||
userNameTextField.setValue(configKie.getUserName());
|
||||
userConnected.setUserName(configKie.getUserName());
|
||||
userNameTextField.addValueChangeListener(valueChangeEvent -> userConnected.setUserName(valueChangeEvent.getValue()));
|
||||
|
||||
userHorizontal.add(userNameTextField);
|
||||
userpasswdTextField = new PasswordField("Password");
|
||||
userpasswdTextField.setValue(configKie.getPassword());
|
||||
userConnected.setUserPassword(configKie.getPassword());
|
||||
userpasswdTextField.addValueChangeListener(valueChangeEvent -> userConnected.setUserPassword(valueChangeEvent.getValue()));
|
||||
userHorizontal.add(userpasswdTextField);
|
||||
loginButton = new Button("login");
|
||||
userHorizontal.add(loginButton);
|
||||
logoutButton = new Button("logout");
|
||||
logoutButton.setEnabled(false);
|
||||
userHorizontal.add(logoutButton);
|
||||
|
||||
loginButton.addClickListener(event -> {
|
||||
UserConnected connected = kieRepositoryService.login(this.configKie.getKiewbUrl(), userConnected.getUserName(), userConnected.getUserPassword());
|
||||
userConnected.getProjectResponses().clear();
|
||||
userConnected.getProjectResponses().addAll(connected.getProjectResponses());
|
||||
userConnected.getRoles().clear();
|
||||
userConnected.getRoles().addAll(connected.getRoles());
|
||||
loginButton.setEnabled(false);
|
||||
logoutButton.setEnabled(true);
|
||||
userConnected.setConnected(true);
|
||||
userConnectedService.addToSession(userConnected);
|
||||
});
|
||||
logoutButton.addClickListener(event -> {
|
||||
userConnected.getRoles().clear();
|
||||
userConnected.getProjectResponses().clear();
|
||||
userConnected.setConnected(false);
|
||||
loginButton.setEnabled(true);
|
||||
logoutButton.setEnabled(false);
|
||||
userConnectedService.addToSession(null);
|
||||
});
|
||||
setActionView(verticalLayout);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -20,6 +20,10 @@ public class UserConnectedService {
|
|||
VaadinSession.getCurrent().setAttribute(USER, userConnected);
|
||||
}
|
||||
|
||||
public void disconnect(){
|
||||
VaadinSession.getCurrent().setAttribute(USER, null);
|
||||
}
|
||||
|
||||
public void addAssetToSession(String asset) {
|
||||
VaadinSession.getCurrent().setAttribute(ASSET, asset);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,12 @@
|
|||
package org.chtijbug.drools.console.util;
|
||||
|
||||
import com.vaadin.flow.data.validator.RegexpValidator;
|
||||
|
||||
public class PasswordValidator extends RegexpValidator {
|
||||
|
||||
private static final String PATTERN = "[a-zA-Z0-9_@./*#&+-]{4,30}";
|
||||
|
||||
public PasswordValidator(String errorMessage) {
|
||||
super(errorMessage, "[a-zA-Z0-9_@./#*&+-]{4,30}", true);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,12 @@
|
|||
package org.chtijbug.drools.console.util;
|
||||
|
||||
import com.vaadin.flow.data.validator.RegexpValidator;
|
||||
|
||||
public class hostnameValidator extends RegexpValidator {
|
||||
|
||||
private static final String PATTERN ="(^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$|^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\\-]*[a-zA-Z0-9])\\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\\-]*[A-Za-z0-9])$)";
|
||||
|
||||
public hostnameValidator(String errorMessage) {
|
||||
super(errorMessage, PATTERN, true);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,43 @@
|
|||
package org.chtijbug.drools.console.vaadinComponent.ComponentPerso;
|
||||
|
||||
|
||||
import com.vaadin.flow.component.combobox.ComboBox;
|
||||
import com.vaadin.flow.component.dependency.StyleSheet;
|
||||
import com.vaadin.flow.component.icon.Icon;
|
||||
import com.vaadin.flow.component.orderedlayout.HorizontalLayout;
|
||||
import com.vaadin.flow.component.orderedlayout.VerticalLayout;
|
||||
|
||||
@StyleSheet("css/composantperso/textFieldPerso.css")
|
||||
public class ComboBoxPerso<T> extends HorizontalLayout {
|
||||
|
||||
|
||||
ComboBox<T> comboBox;
|
||||
|
||||
public ComboBoxPerso (String caption, Icon icon){
|
||||
this.setMargin(false);
|
||||
this.setSpacing(false);
|
||||
|
||||
setClassName("horizontal-content");
|
||||
|
||||
|
||||
VerticalLayout verticalLayout=new VerticalLayout();
|
||||
verticalLayout.setClassName("content-icon");
|
||||
|
||||
icon.setClassName("passwordField-perso-icon");
|
||||
verticalLayout.add(icon);
|
||||
|
||||
comboBox =new ComboBox<>(caption);
|
||||
comboBox.setClassName("horizontal-content");
|
||||
this.add(verticalLayout);
|
||||
this.add(comboBox);
|
||||
}
|
||||
|
||||
public ComboBox<T> getComboBox() {
|
||||
return comboBox;
|
||||
}
|
||||
|
||||
public void setComboBox(ComboBox<T> comboBox) {
|
||||
this.comboBox = comboBox;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,36 @@
|
|||
package org.chtijbug.drools.console.vaadinComponent.ComponentPerso;
|
||||
|
||||
import com.vaadin.flow.component.datepicker.DatePicker;
|
||||
import com.vaadin.flow.component.dependency.StyleSheet;
|
||||
import com.vaadin.flow.component.icon.Icon;
|
||||
import com.vaadin.flow.component.orderedlayout.HorizontalLayout;
|
||||
import com.vaadin.flow.component.orderedlayout.VerticalLayout;
|
||||
|
||||
@StyleSheet("css/composantperso/datePickerPerso.css")
|
||||
public class DatePickerPerso extends HorizontalLayout {
|
||||
|
||||
DatePicker datepicker;
|
||||
|
||||
public DatePickerPerso (String caption, Icon icon){
|
||||
this.setMargin(false);
|
||||
this.setSpacing(false);
|
||||
|
||||
setClassName("horizontal-content");
|
||||
|
||||
|
||||
VerticalLayout verticalLayout=new VerticalLayout();
|
||||
verticalLayout.setClassName("content-icon");
|
||||
|
||||
icon.setClassName("datepicker-perso-icon");
|
||||
verticalLayout.add(icon);
|
||||
|
||||
datepicker =new DatePicker(caption);
|
||||
datepicker.setClassName("horizontal-content");
|
||||
this.add(verticalLayout);
|
||||
this.add(datepicker);
|
||||
}
|
||||
|
||||
public DatePicker getDatepicker() {
|
||||
return datepicker;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,39 @@
|
|||
package org.chtijbug.drools.console.vaadinComponent.ComponentPerso;
|
||||
|
||||
import com.vaadin.flow.component.dependency.StyleSheet;
|
||||
import com.vaadin.flow.component.icon.Icon;
|
||||
import com.vaadin.flow.component.orderedlayout.HorizontalLayout;
|
||||
import com.vaadin.flow.component.orderedlayout.VerticalLayout;
|
||||
import com.vaadin.flow.component.textfield.PasswordField;
|
||||
|
||||
@StyleSheet("css/composantperso/textFieldPerso.css")
|
||||
public class PasswordFieldPerso extends HorizontalLayout {
|
||||
|
||||
private PasswordField passwordField;
|
||||
|
||||
public PasswordFieldPerso (String caption, Icon icon){
|
||||
this.setMargin(false);
|
||||
this.setSpacing(false);
|
||||
|
||||
|
||||
VerticalLayout verticalLayout=new VerticalLayout();
|
||||
verticalLayout.setClassName("content-icon");
|
||||
|
||||
icon.setClassName("passwordField-perso-icon");
|
||||
verticalLayout.add(icon);
|
||||
|
||||
passwordField =new PasswordField(caption);
|
||||
passwordField.setClassName("horizontal-content");
|
||||
this.add(verticalLayout);
|
||||
this.add(passwordField);
|
||||
passwordField.setRequired(true);
|
||||
}
|
||||
|
||||
public PasswordField getPasswordField() {
|
||||
return passwordField;
|
||||
}
|
||||
|
||||
public void setPasswordField(PasswordField passwordField) {
|
||||
this.passwordField = passwordField;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,40 @@
|
|||
package org.chtijbug.drools.console.vaadinComponent.ComponentPerso;
|
||||
|
||||
import com.vaadin.flow.component.dependency.StyleSheet;
|
||||
import com.vaadin.flow.component.icon.Icon;
|
||||
import com.vaadin.flow.component.orderedlayout.HorizontalLayout;
|
||||
import com.vaadin.flow.component.orderedlayout.VerticalLayout;
|
||||
import com.vaadin.flow.component.textfield.TextField;
|
||||
|
||||
@StyleSheet("css/composantperso/textFieldPerso.css")
|
||||
public class TextFieldPerso extends HorizontalLayout {
|
||||
|
||||
TextField textField;
|
||||
|
||||
public TextFieldPerso (String caption,String placeHolder, Icon icon){
|
||||
this.setMargin(false);
|
||||
this.setSpacing(false);
|
||||
|
||||
setClassName("content-perso-field");
|
||||
|
||||
VerticalLayout verticalLayout=new VerticalLayout();
|
||||
verticalLayout.setClassName("content-icon");
|
||||
|
||||
icon.setClassName("passwordField-perso-icon");
|
||||
verticalLayout.add(icon);
|
||||
|
||||
textField=new TextField(caption,placeHolder);
|
||||
textField.setClassName("horizontal-content");
|
||||
textField.setRequired(true);
|
||||
this.add(verticalLayout);
|
||||
this.add(textField);
|
||||
}
|
||||
|
||||
public TextField getTextField() {
|
||||
return textField;
|
||||
}
|
||||
|
||||
public void setTextField(TextField textField) {
|
||||
this.textField = textField;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,105 @@
|
|||
package org.chtijbug.drools.console.vaadinComponent.Squelette;
|
||||
|
||||
import com.vaadin.flow.component.dependency.StyleSheet;
|
||||
import com.vaadin.flow.component.orderedlayout.HorizontalLayout;
|
||||
import com.vaadin.flow.component.orderedlayout.VerticalLayout;
|
||||
import org.chtijbug.drools.console.vaadinComponent.leftMenu.LeftMenuGlobal;
|
||||
import org.chtijbug.drools.console.vaadinComponent.menu.MenuPrincipal;
|
||||
import org.chtijbug.drools.console.vaadinComponent.menu.MenuScondaireDeployement;
|
||||
import org.chtijbug.drools.console.vaadinComponent.menu.MenuSecondaireInfoUser;
|
||||
|
||||
@StyleSheet("css/accueil.css")
|
||||
public class SqueletteComposant extends VerticalLayout {
|
||||
|
||||
private MenuPrincipal menuPrincipal;
|
||||
|
||||
private LeftMenuGlobal leftMenuGlobal;
|
||||
|
||||
private MenuScondaireDeployement menuScondaireDeployement;
|
||||
|
||||
private MenuSecondaireInfoUser menuSecondaireInfoUser;
|
||||
|
||||
private VerticalLayout content;
|
||||
|
||||
private VerticalLayout infoPage;
|
||||
|
||||
public SqueletteComposant(){
|
||||
setClassName("squelette-composant-contentAll");
|
||||
|
||||
menuPrincipal=new MenuPrincipal(this);
|
||||
add(menuPrincipal);
|
||||
|
||||
|
||||
|
||||
|
||||
HorizontalLayout horizontalLayout=new HorizontalLayout();
|
||||
horizontalLayout.setClassName("squelette-component-horizontal");
|
||||
add(horizontalLayout);
|
||||
|
||||
content=new VerticalLayout();
|
||||
content.setClassName("squelette-component-content");
|
||||
|
||||
menuScondaireDeployement=new MenuScondaireDeployement();
|
||||
content.add(menuScondaireDeployement);
|
||||
|
||||
menuSecondaireInfoUser=new MenuSecondaireInfoUser();
|
||||
content.add(menuSecondaireInfoUser);
|
||||
|
||||
infoPage=new VerticalLayout();
|
||||
infoPage.setClassName("squelette-component-infoPage");
|
||||
content.add(infoPage);
|
||||
|
||||
leftMenuGlobal=new LeftMenuGlobal();
|
||||
horizontalLayout.add(leftMenuGlobal);
|
||||
|
||||
horizontalLayout.add(content);
|
||||
}
|
||||
|
||||
public MenuPrincipal getMenuPrincipal() {
|
||||
return menuPrincipal;
|
||||
}
|
||||
|
||||
public void setMenuPrincipal(MenuPrincipal menuPrincipal) {
|
||||
this.menuPrincipal = menuPrincipal;
|
||||
}
|
||||
|
||||
public LeftMenuGlobal getLeftMenuGlobal() {
|
||||
return leftMenuGlobal;
|
||||
}
|
||||
|
||||
public void setLeftMenuGlobal(LeftMenuGlobal leftMenuGlobal) {
|
||||
this.leftMenuGlobal = leftMenuGlobal;
|
||||
}
|
||||
|
||||
public MenuScondaireDeployement getMenuScondaireDeployement() {
|
||||
return menuScondaireDeployement;
|
||||
}
|
||||
|
||||
public void setMenuScondaireDeployement(MenuScondaireDeployement menuScondaireDeployement) {
|
||||
this.menuScondaireDeployement = menuScondaireDeployement;
|
||||
}
|
||||
|
||||
public MenuSecondaireInfoUser getMenuSecondaireInfoUser() {
|
||||
return menuSecondaireInfoUser;
|
||||
}
|
||||
|
||||
public void setMenuSecondaireInfoUser(MenuSecondaireInfoUser menuSecondaireInfoUser) {
|
||||
this.menuSecondaireInfoUser = menuSecondaireInfoUser;
|
||||
}
|
||||
|
||||
public VerticalLayout getContent() {
|
||||
return content;
|
||||
}
|
||||
|
||||
public void setContent(VerticalLayout content) {
|
||||
this.content = content;
|
||||
}
|
||||
|
||||
public VerticalLayout getInfoPage() {
|
||||
return infoPage;
|
||||
}
|
||||
|
||||
public void setInfoPage(VerticalLayout infoPage) {
|
||||
this.infoPage = infoPage;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,110 @@
|
|||
package org.chtijbug.drools.console.vaadinComponent.leftMenu;
|
||||
|
||||
import com.vaadin.flow.component.dependency.StyleSheet;
|
||||
import com.vaadin.flow.component.html.Image;
|
||||
import com.vaadin.flow.component.orderedlayout.VerticalLayout;
|
||||
import com.vaadin.flow.component.html.Label;
|
||||
import com.vaadin.flow.server.InputStreamFactory;
|
||||
import com.vaadin.flow.server.StreamResource;
|
||||
|
||||
import java.io.InputStream;
|
||||
|
||||
@StyleSheet("css/accueil.css")
|
||||
public class InformationStructure extends VerticalLayout {
|
||||
|
||||
private Label nomPage;
|
||||
|
||||
private Label numberProject;
|
||||
|
||||
private Label numberKieWb;
|
||||
|
||||
private Label numberKieServer;
|
||||
|
||||
private Image logo;
|
||||
|
||||
private String strProject="Number of projects : ";
|
||||
|
||||
private String strKieWb="Number of kie-workbench : ";
|
||||
|
||||
private String strKieServer="Number of Kie-Server : ";
|
||||
|
||||
public InformationStructure(){
|
||||
|
||||
setClassName("leftMenu-global-infoStructure-content");
|
||||
|
||||
VerticalLayout verticalLayout=new VerticalLayout();
|
||||
verticalLayout.setClassName("leftMenu-global-infoStrcutre-contentTitre");
|
||||
add(verticalLayout);
|
||||
|
||||
nomPage=new Label("Accueil");
|
||||
nomPage.setClassName("leftMenu-global-inforStructure-titre");
|
||||
verticalLayout.add(nomPage);
|
||||
|
||||
InputStreamFactory inputStreamFactory=new InputStreamFactory() {
|
||||
@Override
|
||||
public InputStream createInputStream() {
|
||||
return getClass().getResourceAsStream("/images/book.png");
|
||||
}
|
||||
};
|
||||
|
||||
StreamResource str=new StreamResource("logo",inputStreamFactory);
|
||||
|
||||
logo=new Image(str,"");
|
||||
logo.setClassName("leftMenu-global-inforStructure-logo");
|
||||
add(logo);
|
||||
|
||||
VerticalLayout verticalLayout1=new VerticalLayout();
|
||||
verticalLayout1.setClassName("leftMenu-global-inforStructure-content-label");
|
||||
add(verticalLayout1);
|
||||
|
||||
numberKieServer=new Label(strKieServer+"0");
|
||||
numberKieServer.setClassName("leftMenu-global-inforStructure-label");
|
||||
verticalLayout1.add(numberKieServer);
|
||||
|
||||
numberKieWb=new Label(strKieWb+"0");
|
||||
numberKieWb.setClassName("leftMenu-global-inforStructure-label");
|
||||
verticalLayout1.add(numberKieWb);
|
||||
|
||||
numberProject=new Label(strProject+"0");
|
||||
numberProject.setClassName("leftMenu-global-inforStructure-label");
|
||||
verticalLayout1.add(numberProject);
|
||||
}
|
||||
|
||||
public void actualiseKieWb(Integer numberOfKieWb){
|
||||
numberKieWb.setText(strKieWb+numberOfKieWb);
|
||||
}
|
||||
public void actualiseKieServer(Integer numberOfKieServer){
|
||||
numberKieServer.setText(strKieServer+numberOfKieServer);
|
||||
}
|
||||
public void actualiseProject(Integer numberOfProject){
|
||||
numberProject.setText(strProject+numberOfProject);
|
||||
}
|
||||
|
||||
public Label getNomPage() {
|
||||
return nomPage;
|
||||
}
|
||||
|
||||
public void setNomPage(Label nomPage) {
|
||||
this.nomPage = nomPage;
|
||||
}
|
||||
|
||||
public Label getNumberProject() {
|
||||
return numberProject;
|
||||
}
|
||||
|
||||
public Label getNumberKieWb() {
|
||||
return numberKieWb;
|
||||
}
|
||||
|
||||
public Label getNumberKieServer() {
|
||||
return numberKieServer;
|
||||
}
|
||||
|
||||
public Image getLogo() {
|
||||
return logo;
|
||||
}
|
||||
|
||||
public void setLogo(Image logo) {
|
||||
this.logo = logo;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,100 @@
|
|||
package org.chtijbug.drools.console.vaadinComponent.leftMenu;
|
||||
|
||||
import com.vaadin.flow.component.button.Button;
|
||||
import com.vaadin.flow.component.dependency.StyleSheet;
|
||||
import com.vaadin.flow.component.html.Anchor;
|
||||
import com.vaadin.flow.component.icon.Icon;
|
||||
import com.vaadin.flow.component.icon.VaadinIcon;
|
||||
import com.vaadin.flow.component.orderedlayout.HorizontalLayout;
|
||||
import com.vaadin.flow.component.orderedlayout.VerticalLayout;
|
||||
|
||||
@StyleSheet("css/accueil.css")
|
||||
public class LeftMenuGlobal extends VerticalLayout {
|
||||
|
||||
private Button actionOne;
|
||||
|
||||
private Button actionTwo;
|
||||
|
||||
private Boolean visibility=true;
|
||||
|
||||
|
||||
public LeftMenuGlobal(){
|
||||
|
||||
setClassName("leftMenu-global-content");
|
||||
|
||||
InformationStructure informationStructure=new InformationStructure();
|
||||
add(informationStructure);
|
||||
|
||||
VerticalLayout verticalLayout=new VerticalLayout();
|
||||
verticalLayout.setClassName("leftMenu-global-action");
|
||||
add(verticalLayout);
|
||||
|
||||
actionOne=new Button("ActionOne", VaadinIcon.TOOLS.create());
|
||||
actionOne.setClassName("leftMenu-global-button");
|
||||
verticalLayout.add(actionOne);
|
||||
actionOne.addClickListener(buttonClickEvent -> {
|
||||
active(actionOne);
|
||||
});
|
||||
|
||||
actionTwo=new Button("ActionTwo",VaadinIcon.TOOLS.create());
|
||||
actionTwo.setClassName("leftMenu-global-button");
|
||||
verticalLayout.add(actionTwo);
|
||||
actionTwo.addClickListener(buttonClickEvent -> {
|
||||
active(actionTwo);
|
||||
|
||||
});
|
||||
|
||||
|
||||
HorizontalLayout horizontalLayout=new HorizontalLayout();
|
||||
horizontalLayout.setClassName("leftMenu-global-infoEntreprise");
|
||||
add(horizontalLayout);
|
||||
|
||||
Anchor aproposFooter=new Anchor("https://pymma-software.heron-software.com/","A propos");
|
||||
aproposFooter.setClassName("footer-button");
|
||||
horizontalLayout.add(aproposFooter);
|
||||
|
||||
Anchor contactFooter=new Anchor("https://pymma-software.heron-software.com/contact","Contact");
|
||||
contactFooter.setClassName("footer-button");
|
||||
horizontalLayout.add(contactFooter);
|
||||
|
||||
}
|
||||
private boolean isActive(Button button){
|
||||
return button.getClassNames().contains("active");
|
||||
}
|
||||
private void removeActive(Button button) {
|
||||
|
||||
if(button.getClassNames().contains("active")){
|
||||
button.getClassNames().remove("active");
|
||||
}
|
||||
}
|
||||
private void active(Button button){
|
||||
removeActive(actionOne);
|
||||
removeActive(actionTwo);
|
||||
|
||||
button.getClassNames().add("active");
|
||||
}
|
||||
|
||||
public Button getActionOne() {
|
||||
return actionOne;
|
||||
}
|
||||
|
||||
public void setActionOne(Button actionOne) {
|
||||
this.actionOne = actionOne;
|
||||
}
|
||||
|
||||
public Button getActionTwo() {
|
||||
return actionTwo;
|
||||
}
|
||||
|
||||
public void setActionTwo(Button actionTwo) {
|
||||
this.actionTwo = actionTwo;
|
||||
}
|
||||
|
||||
public Boolean getVisibility() {
|
||||
return visibility;
|
||||
}
|
||||
|
||||
public void setVisibility(Boolean visibility) {
|
||||
this.visibility = visibility;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,175 @@
|
|||
package org.chtijbug.drools.console.vaadinComponent.login;
|
||||
|
||||
import com.vaadin.flow.component.button.Button;
|
||||
import com.vaadin.flow.component.dependency.StyleSheet;
|
||||
import com.vaadin.flow.component.html.Label;
|
||||
import com.vaadin.flow.component.icon.VaadinIcon;
|
||||
import com.vaadin.flow.component.orderedlayout.VerticalLayout;
|
||||
import com.vaadin.flow.data.binder.Binder;
|
||||
import com.vaadin.flow.data.value.ValueChangeMode;
|
||||
import org.chtijbug.drools.console.service.KieRepositoryService;
|
||||
import org.chtijbug.drools.console.service.UserConnectedService;
|
||||
import org.chtijbug.drools.console.service.model.UserConnected;
|
||||
import org.chtijbug.drools.console.service.model.kie.KieConfigurationData;
|
||||
import org.chtijbug.drools.console.service.util.AppContext;
|
||||
import org.chtijbug.drools.console.util.PasswordValidator;
|
||||
import org.chtijbug.drools.console.vaadinComponent.ComponentPerso.PasswordFieldPerso;
|
||||
import org.chtijbug.drools.console.vaadinComponent.ComponentPerso.TextFieldPerso;
|
||||
|
||||
@StyleSheet("css/accueil.css")
|
||||
public class FormulaireComposant extends VerticalLayout {
|
||||
|
||||
//Composant
|
||||
|
||||
private Label title;
|
||||
|
||||
private TextFieldPerso username;
|
||||
|
||||
private PasswordFieldPerso password;
|
||||
|
||||
private Button login;
|
||||
|
||||
private Button forgotPassword;
|
||||
|
||||
//METIER
|
||||
|
||||
private Binder<UserConnected> userConnectedBinder;
|
||||
|
||||
private KieRepositoryService kieRepositoryService;
|
||||
|
||||
private KieConfigurationData configKie;
|
||||
|
||||
private UserConnectedService userConnectedService;
|
||||
|
||||
public FormulaireComposant(){
|
||||
|
||||
kieRepositoryService= AppContext.getApplicationContext().getBean(KieRepositoryService.class);
|
||||
configKie= AppContext.getApplicationContext().getBean(KieConfigurationData.class);
|
||||
userConnectedService=AppContext.getApplicationContext().getBean(UserConnectedService.class);
|
||||
|
||||
setClassName("login-application-layout");
|
||||
|
||||
userConnectedBinder=new Binder<>();
|
||||
userConnectedBinder.setBean(new UserConnected());
|
||||
|
||||
//FORMULAIRE
|
||||
|
||||
title=new Label("Sign in ");
|
||||
title.setClassName("login-application-title");
|
||||
add(title);
|
||||
|
||||
username=new TextFieldPerso("Username","", VaadinIcon.USER.create());
|
||||
username.getTextField().setValueChangeMode(ValueChangeMode.EAGER);
|
||||
username.getTextField().addValueChangeListener(textFieldStringComponentValueChangeEvent -> verifyValidity());
|
||||
userConnectedBinder.forField(username.getTextField())
|
||||
.bind(
|
||||
userConnected -> userConnected.getUserName(),
|
||||
(userConnected, s) -> userConnected.setUserName(s));
|
||||
|
||||
add(username);
|
||||
|
||||
password=new PasswordFieldPerso("Password", VaadinIcon.PASSWORD.create());
|
||||
password.getPasswordField().setValueChangeMode(ValueChangeMode.EAGER);
|
||||
password.getPasswordField().addValueChangeListener(textFieldStringComponentValueChangeEvent -> verifyValidity());
|
||||
userConnectedBinder.forField(password.getPasswordField())
|
||||
.withValidator(new PasswordValidator("Ce n'est pas un password valide"))
|
||||
.bind(
|
||||
userConnected -> userConnected.getUserPassword(),
|
||||
(userConnected, s) -> userConnected.setUserPassword(s));
|
||||
|
||||
|
||||
|
||||
add(password);
|
||||
|
||||
forgotPassword=new Button("Forgot password?");
|
||||
forgotPassword.setClassName("footer-button");
|
||||
add(forgotPassword);
|
||||
|
||||
login=new Button("Connexion");
|
||||
login.setEnabled(false);
|
||||
login.setClassName("login-application-connexion");
|
||||
login.addClickListener(buttonClickEvent ->{
|
||||
Boolean test=connexion();
|
||||
|
||||
if(test){
|
||||
getUI().get().navigate("accueil");
|
||||
}else {
|
||||
login.setEnabled(false);
|
||||
username.getTextField().setValue("");
|
||||
password.getPasswordField().setValue("");
|
||||
}
|
||||
});
|
||||
add(login);
|
||||
|
||||
password.getPasswordField().setValue(configKie.getPassword());
|
||||
username.getTextField().setValue(configKie.getUserName());
|
||||
|
||||
}
|
||||
public void verifyValidity(){
|
||||
if(!username.getTextField().isInvalid()&&username.getTextField().getValue()!=null&&!username.getTextField().isEmpty()&&
|
||||
!password.getPasswordField().isInvalid()&&password.getPasswordField().getValue()!=null&&!password.getPasswordField().isEmpty()){
|
||||
login.setEnabled(true);
|
||||
}else {
|
||||
login.setEnabled(false);
|
||||
}
|
||||
}
|
||||
public boolean connexion(){
|
||||
UserConnected connected = kieRepositoryService.login(
|
||||
configKie.getKiewbUrl(),
|
||||
userConnectedBinder.getBean().getUserName(),
|
||||
userConnectedBinder.getBean().getUserPassword());
|
||||
|
||||
if(connected!=null) {
|
||||
connected.getProjectResponses().clear();
|
||||
connected.getProjectResponses().addAll(connected.getProjectResponses());
|
||||
connected.getRoles().clear();
|
||||
connected.getRoles().addAll(connected.getRoles());
|
||||
connected.setConnected(true);
|
||||
userConnectedService.addToSession(connected);
|
||||
|
||||
return true;
|
||||
}else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public Label getTitle() {
|
||||
return title;
|
||||
}
|
||||
|
||||
public void setTitle(Label title) {
|
||||
this.title = title;
|
||||
}
|
||||
|
||||
public TextFieldPerso getUsername() {
|
||||
return username;
|
||||
}
|
||||
|
||||
public void setUsername(TextFieldPerso username) {
|
||||
this.username = username;
|
||||
}
|
||||
|
||||
public PasswordFieldPerso getPassword() {
|
||||
return password;
|
||||
}
|
||||
|
||||
public void setPassword(PasswordFieldPerso password) {
|
||||
this.password = password;
|
||||
}
|
||||
|
||||
public Button getLogin() {
|
||||
return login;
|
||||
}
|
||||
|
||||
public void setLogin(Button login) {
|
||||
this.login = login;
|
||||
}
|
||||
|
||||
public Button getForgotPassword() {
|
||||
return forgotPassword;
|
||||
}
|
||||
|
||||
public void setForgotPassword(Button forgotPassword) {
|
||||
this.forgotPassword = forgotPassword;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,42 @@
|
|||
package org.chtijbug.drools.console.vaadinComponent.login;
|
||||
|
||||
import com.vaadin.flow.component.dependency.StyleSheet;
|
||||
import com.vaadin.flow.component.orderedlayout.VerticalLayout;
|
||||
import com.vaadin.flow.component.html.Label;
|
||||
|
||||
@StyleSheet("css/accueil.css")
|
||||
public class FormulaireInfoComposant extends VerticalLayout {
|
||||
|
||||
public Label title;
|
||||
|
||||
public Label paragraphe;
|
||||
|
||||
public FormulaireInfoComposant(){
|
||||
|
||||
setClassName("login-application-layout-FormulaireInfo");
|
||||
|
||||
title=new Label("How to connect?");
|
||||
title.setClassName("login-application-layout-FormulaireInfo-Title");
|
||||
add(title);
|
||||
|
||||
paragraphe=new Label("To access this application, make sure you already have an account on the kie-workbench");
|
||||
paragraphe.setClassName("login-application-layout-FormulaireInfo-Paragraphe");
|
||||
add(paragraphe);
|
||||
}
|
||||
|
||||
public Label getTitle() {
|
||||
return title;
|
||||
}
|
||||
|
||||
public void setTitle(Label title) {
|
||||
this.title = title;
|
||||
}
|
||||
|
||||
public Label getParagraphe() {
|
||||
return paragraphe;
|
||||
}
|
||||
|
||||
public void setParagraphe(Label paragraphe) {
|
||||
this.paragraphe = paragraphe;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,40 @@
|
|||
package org.chtijbug.drools.console.vaadinComponent.login;
|
||||
|
||||
import com.vaadin.flow.component.dependency.StyleSheet;
|
||||
import com.vaadin.flow.component.orderedlayout.HorizontalLayout;
|
||||
import com.vaadin.flow.component.orderedlayout.VerticalLayout;
|
||||
|
||||
@StyleSheet("css/accueil.css")
|
||||
public class LoginComponent extends HorizontalLayout {
|
||||
|
||||
private FormulaireComposant layoutLeft;
|
||||
|
||||
private FormulaireInfoComposant layoutRight;
|
||||
|
||||
public LoginComponent(){
|
||||
|
||||
setClassName("login-formulaire-globalLayout");
|
||||
|
||||
layoutLeft=new FormulaireComposant();
|
||||
layoutRight=new FormulaireInfoComposant();
|
||||
|
||||
add(layoutLeft);
|
||||
add(layoutRight);
|
||||
}
|
||||
|
||||
public FormulaireComposant getLayoutLeft() {
|
||||
return layoutLeft;
|
||||
}
|
||||
|
||||
public void setLayoutLeft(FormulaireComposant layoutLeft) {
|
||||
this.layoutLeft = layoutLeft;
|
||||
}
|
||||
|
||||
public FormulaireInfoComposant getLayoutRight() {
|
||||
return layoutRight;
|
||||
}
|
||||
|
||||
public void setLayoutRight(FormulaireInfoComposant layoutRight) {
|
||||
this.layoutRight = layoutRight;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,51 @@
|
|||
package org.chtijbug.drools.console.vaadinComponent.login;
|
||||
|
||||
import com.vaadin.flow.component.checkbox.Checkbox;
|
||||
import com.vaadin.flow.component.dependency.StyleSheet;
|
||||
import com.vaadin.flow.component.orderedlayout.HorizontalLayout;
|
||||
import com.vaadin.flow.component.orderedlayout.VerticalLayout;
|
||||
import com.vaadin.flow.component.html.Label;
|
||||
|
||||
@StyleSheet("css/accueil.css")
|
||||
public class TextInfoComponent extends VerticalLayout {
|
||||
|
||||
private Label title;
|
||||
|
||||
private HorizontalLayout separator;
|
||||
|
||||
|
||||
public TextInfoComponent(){
|
||||
|
||||
setClassName("login-layout-textInfo");
|
||||
|
||||
title=new Label("Drools kie-platform");
|
||||
title.setClassName("login-title");
|
||||
add(title);
|
||||
|
||||
separator=new HorizontalLayout();
|
||||
separator.setClassName("separator");
|
||||
add(separator);
|
||||
|
||||
add(row("Dynamic management of kie-servers"));
|
||||
add(row("Facilitates the process drools as a whole"));
|
||||
|
||||
}
|
||||
|
||||
public HorizontalLayout row(String text){
|
||||
|
||||
HorizontalLayout horizontalLayout=new HorizontalLayout();
|
||||
horizontalLayout.setClassName("login-textInfo-layoutContent");
|
||||
|
||||
Checkbox checkbox=new Checkbox();
|
||||
checkbox.setValue(true);
|
||||
checkbox.setEnabled(false);
|
||||
horizontalLayout.add(checkbox);
|
||||
checkbox.setClassName("login-textInfo-button");
|
||||
|
||||
Label label=new Label(text);
|
||||
horizontalLayout.add(label);
|
||||
label.setClassName("login-textInfo-paragraph");
|
||||
|
||||
return horizontalLayout;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,153 @@
|
|||
package org.chtijbug.drools.console.vaadinComponent.menu;
|
||||
|
||||
import com.vaadin.flow.component.button.Button;
|
||||
import com.vaadin.flow.component.dependency.StyleSheet;
|
||||
import com.vaadin.flow.component.html.Image;
|
||||
import com.vaadin.flow.component.icon.Icon;
|
||||
import com.vaadin.flow.component.icon.VaadinIcon;
|
||||
import com.vaadin.flow.component.orderedlayout.HorizontalLayout;
|
||||
import com.vaadin.flow.server.InputStreamFactory;
|
||||
import com.vaadin.flow.server.StreamResource;
|
||||
import org.chtijbug.drools.console.service.UserConnectedService;
|
||||
import org.chtijbug.drools.console.service.util.AppContext;
|
||||
import org.chtijbug.drools.console.vaadinComponent.Squelette.SqueletteComposant;
|
||||
|
||||
import java.io.InputStream;
|
||||
|
||||
|
||||
@StyleSheet("css/accueil.css")
|
||||
public class MenuPrincipal extends HorizontalLayout {
|
||||
|
||||
//COMPONENT
|
||||
|
||||
private Image logo;
|
||||
|
||||
private Button deployement;
|
||||
|
||||
private Button infoUser;
|
||||
|
||||
private Button hamburger;
|
||||
|
||||
//METIER
|
||||
|
||||
private UserConnectedService userConnectedService;
|
||||
|
||||
public MenuPrincipal(SqueletteComposant squeletteComposant){
|
||||
|
||||
userConnectedService= AppContext.getApplicationContext().getBean(UserConnectedService.class);
|
||||
|
||||
addClassName("menu-principal-menubar-content");
|
||||
|
||||
InputStreamFactory inputStreamFactory=new InputStreamFactory() {
|
||||
@Override
|
||||
public InputStream createInputStream() {
|
||||
return getClass().getResourceAsStream("/images/pymma.png");
|
||||
}
|
||||
};
|
||||
|
||||
StreamResource str=new StreamResource("logo",inputStreamFactory);
|
||||
|
||||
logo=new Image(str,"");
|
||||
logo.setClassName("menu-principal-logoPresentation");
|
||||
|
||||
Icon icon=VaadinIcon.MENU.create();
|
||||
icon.setClassName("icon-menuPrincipal");
|
||||
|
||||
|
||||
hamburger=new Button("",icon);
|
||||
hamburger.setClassName("hamburger");
|
||||
add(hamburger);
|
||||
|
||||
hamburger.addClickListener(buttonClickEvent -> {
|
||||
if(squeletteComposant.getLeftMenuGlobal().getVisibility()) {
|
||||
squeletteComposant.getLeftMenuGlobal().setVisible(false);
|
||||
squeletteComposant.getLeftMenuGlobal().setVisibility(false);
|
||||
}else {
|
||||
squeletteComposant.getLeftMenuGlobal().setVisible(true);
|
||||
squeletteComposant.getLeftMenuGlobal().setVisibility(true);
|
||||
}
|
||||
});
|
||||
|
||||
deployement=new Button("Déployment");
|
||||
deployement.setClassName("menu-principal-button");
|
||||
add(deployement);
|
||||
deployement.addClickListener(buttonClickEvent -> {
|
||||
|
||||
if(!isActive(deployement)) {
|
||||
active(deployement);
|
||||
squeletteComposant.getMenuScondaireDeployement().setVisible(true);
|
||||
squeletteComposant.getMenuSecondaireInfoUser().setVisible(false);
|
||||
}else {
|
||||
removeActive(deployement);
|
||||
squeletteComposant.getMenuScondaireDeployement().setVisible(false);
|
||||
squeletteComposant.getMenuSecondaireInfoUser().setVisible(false);
|
||||
}
|
||||
});
|
||||
|
||||
add(logo);
|
||||
|
||||
infoUser=new Button(userConnectedService.getUserConnected().getUserName(), VaadinIcon.USER.create());
|
||||
infoUser.setClassName("menu-principal-button-user");
|
||||
infoUser.addClickListener(buttonClickEvent -> {
|
||||
if(!isActive(infoUser)) {
|
||||
active(infoUser);
|
||||
squeletteComposant.getMenuScondaireDeployement().setVisible(false);
|
||||
squeletteComposant.getMenuSecondaireInfoUser().setVisible(true);
|
||||
}else {
|
||||
removeActive(infoUser);
|
||||
squeletteComposant.getMenuScondaireDeployement().setVisible(false);
|
||||
squeletteComposant.getMenuSecondaireInfoUser().setVisible(false);
|
||||
}
|
||||
});
|
||||
|
||||
add(infoUser);
|
||||
|
||||
}
|
||||
private boolean isActive(Button button){
|
||||
return button.getClassNames().contains("active");
|
||||
}
|
||||
private void removeActive(Button button) {
|
||||
|
||||
if(button.getClassNames().contains("active")){
|
||||
button.getClassNames().remove("active");
|
||||
}
|
||||
}
|
||||
private void active(Button button){
|
||||
removeActive(infoUser);
|
||||
removeActive(deployement);
|
||||
|
||||
button.getClassNames().add("active");
|
||||
}
|
||||
|
||||
public Image getLogo() {
|
||||
return logo;
|
||||
}
|
||||
|
||||
public void setLogo(Image logo) {
|
||||
this.logo = logo;
|
||||
}
|
||||
|
||||
public Button getDeployement() {
|
||||
return deployement;
|
||||
}
|
||||
|
||||
public void setDeployement(Button deployement) {
|
||||
this.deployement = deployement;
|
||||
}
|
||||
|
||||
public Button getInfoUser() {
|
||||
return infoUser;
|
||||
}
|
||||
|
||||
public void setInfoUser(Button infoUser) {
|
||||
this.infoUser = infoUser;
|
||||
}
|
||||
|
||||
public UserConnectedService getUserConnectedService() {
|
||||
return userConnectedService;
|
||||
}
|
||||
|
||||
public void setUserConnectedService(UserConnectedService userConnectedService) {
|
||||
this.userConnectedService = userConnectedService;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,69 @@
|
|||
package org.chtijbug.drools.console.vaadinComponent.menu;
|
||||
|
||||
import com.vaadin.flow.component.button.Button;
|
||||
import com.vaadin.flow.component.dependency.StyleSheet;
|
||||
import com.vaadin.flow.component.dialog.Dialog;
|
||||
import com.vaadin.flow.component.icon.VaadinIcon;
|
||||
import com.vaadin.flow.component.orderedlayout.HorizontalLayout;
|
||||
import org.chtijbug.drools.console.view.AddRuntime;
|
||||
|
||||
@StyleSheet("css/accueil.css")
|
||||
public class MenuScondaireDeployement extends HorizontalLayout {
|
||||
|
||||
private Button addRuntime;
|
||||
|
||||
private Button projectDeploy;
|
||||
|
||||
private Button accueilDeployment;
|
||||
|
||||
public MenuScondaireDeployement(){
|
||||
setVisible(false);
|
||||
|
||||
setClassName("menu-secondaire-content");
|
||||
|
||||
|
||||
|
||||
accueilDeployment=new Button("Accueil deployement",VaadinIcon.ARCHIVE.create());
|
||||
accueilDeployment.setClassName("menu-secondaire-button");
|
||||
add(accueilDeployment);
|
||||
|
||||
projectDeploy=new Button("Deployable project",VaadinIcon.EJECT.create());
|
||||
projectDeploy.setClassName("menu-secondaire-button");
|
||||
add(projectDeploy);
|
||||
|
||||
addRuntime=new Button("add runtime", VaadinIcon.PLUS.create());
|
||||
addRuntime.setClassName("menu-secondaire-button");
|
||||
add(addRuntime);
|
||||
|
||||
Dialog dialog=new Dialog();
|
||||
dialog.add(new AddRuntime(dialog));
|
||||
|
||||
addRuntime.addClickListener(buttonClickEvent -> {
|
||||
dialog.open();
|
||||
});
|
||||
}
|
||||
|
||||
public Button getAddRuntime() {
|
||||
return addRuntime;
|
||||
}
|
||||
|
||||
public void setAddRuntime(Button addRuntime) {
|
||||
this.addRuntime = addRuntime;
|
||||
}
|
||||
|
||||
public Button getProjectDeploy() {
|
||||
return projectDeploy;
|
||||
}
|
||||
|
||||
public void setProjectDeploy(Button projectDeploy) {
|
||||
this.projectDeploy = projectDeploy;
|
||||
}
|
||||
|
||||
public Button getAccueilDeployment() {
|
||||
return accueilDeployment;
|
||||
}
|
||||
|
||||
public void setAccueilDeployment(Button accueilDeployment) {
|
||||
this.accueilDeployment = accueilDeployment;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,55 @@
|
|||
package org.chtijbug.drools.console.vaadinComponent.menu;
|
||||
|
||||
import com.vaadin.flow.component.button.Button;
|
||||
import com.vaadin.flow.component.dependency.StyleSheet;
|
||||
import com.vaadin.flow.component.icon.VaadinIcon;
|
||||
import com.vaadin.flow.component.orderedlayout.HorizontalLayout;
|
||||
import org.chtijbug.drools.console.service.UserConnectedService;
|
||||
import org.chtijbug.drools.console.service.util.AppContext;
|
||||
|
||||
@StyleSheet("css/accueil.css")
|
||||
public class MenuSecondaireInfoUser extends HorizontalLayout {
|
||||
|
||||
private Button infoUser;
|
||||
|
||||
private Button disconnect;
|
||||
|
||||
private UserConnectedService userConnectedService;
|
||||
|
||||
public MenuSecondaireInfoUser() {
|
||||
setVisible(false);
|
||||
|
||||
userConnectedService= AppContext.getApplicationContext().getBean(UserConnectedService.class);
|
||||
|
||||
setClassName("menu-secondaire-content");
|
||||
|
||||
infoUser=new Button("Information User", VaadinIcon.INFO.create());
|
||||
infoUser.setClassName("menu-secondaire-button");
|
||||
add(infoUser);
|
||||
|
||||
disconnect=new Button("Disconnect",VaadinIcon.SIGN_OUT.create());
|
||||
disconnect.setClassName("menu-secondaire-button");
|
||||
disconnect.addClickListener(buttonClickEvent -> {
|
||||
userConnectedService.disconnect();
|
||||
getUI().get().navigate("");
|
||||
});
|
||||
add(disconnect);
|
||||
|
||||
}
|
||||
|
||||
public Button getInfoUser() {
|
||||
return infoUser;
|
||||
}
|
||||
|
||||
public void setInfoUser(Button infoUser) {
|
||||
this.infoUser = infoUser;
|
||||
}
|
||||
|
||||
public Button getDisconnect() {
|
||||
return disconnect;
|
||||
}
|
||||
|
||||
public void setDisconnect(Button disconnect) {
|
||||
this.disconnect = disconnect;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,14 @@
|
|||
package org.chtijbug.drools.console.view;
|
||||
|
||||
import com.vaadin.flow.component.dependency.StyleSheet;
|
||||
import com.vaadin.flow.component.page.Push;
|
||||
import com.vaadin.flow.router.Route;
|
||||
import org.chtijbug.drools.console.vaadinComponent.Squelette.SqueletteComposant;
|
||||
|
||||
@Push
|
||||
@StyleSheet("css/accueil.css")
|
||||
@Route("accueil")
|
||||
public class AccueilView extends SqueletteComposant {
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,111 @@
|
|||
package org.chtijbug.drools.console.view;
|
||||
|
||||
import com.vaadin.flow.component.button.Button;
|
||||
import com.vaadin.flow.component.dependency.StyleSheet;
|
||||
import com.vaadin.flow.component.dialog.Dialog;
|
||||
import com.vaadin.flow.component.icon.VaadinIcon;
|
||||
import com.vaadin.flow.component.html.Label;
|
||||
import com.vaadin.flow.component.orderedlayout.VerticalLayout;
|
||||
import com.vaadin.flow.data.value.ValueChangeMode;
|
||||
import org.chtijbug.drools.console.vaadinComponent.ComponentPerso.TextFieldPerso;
|
||||
|
||||
@StyleSheet("css/accueil.css")
|
||||
public class AddRuntime extends VerticalLayout {
|
||||
|
||||
private TextFieldPerso host;
|
||||
|
||||
private TextFieldPerso port;
|
||||
|
||||
private TextFieldPerso runtimeName;
|
||||
|
||||
private Button testConnexion;
|
||||
|
||||
private Label label;
|
||||
|
||||
public AddRuntime(Dialog dialog){
|
||||
|
||||
setClassName("creation-runtime-content");
|
||||
|
||||
label=new Label("Add Runtime");
|
||||
label.setClassName("creation-runtime-title");
|
||||
add(label);
|
||||
|
||||
runtimeName=new TextFieldPerso("Runtime name","", VaadinIcon.USER.create());
|
||||
runtimeName.getTextField().setRequired(true);
|
||||
runtimeName.getTextField().setValueChangeMode(ValueChangeMode.EAGER);
|
||||
runtimeName.getTextField().addValueChangeListener(textFieldStringComponentValueChangeEvent -> {
|
||||
verify();
|
||||
});
|
||||
add(runtimeName);
|
||||
|
||||
host=new TextFieldPerso("Host","111.111.1.111",VaadinIcon.HARDDRIVE.create());
|
||||
host.getTextField().setRequired(true);
|
||||
host.getTextField().setValueChangeMode(ValueChangeMode.EAGER);
|
||||
host.getTextField().addValueChangeListener(textFieldStringComponentValueChangeEvent -> {
|
||||
verify();
|
||||
});
|
||||
|
||||
add(host);
|
||||
|
||||
port=new TextFieldPerso("Port","",VaadinIcon.INBOX.create());
|
||||
port.getTextField().setRequired(true);
|
||||
port.getTextField().setValueChangeMode(ValueChangeMode.EAGER);
|
||||
port.getTextField().addValueChangeListener(textFieldStringComponentValueChangeEvent -> {
|
||||
verify();
|
||||
});
|
||||
|
||||
|
||||
add(port);
|
||||
|
||||
testConnexion=new Button("Tester connexion");
|
||||
testConnexion.setEnabled(false);
|
||||
testConnexion.setClassName("login-application-connexion");
|
||||
add(testConnexion);
|
||||
testConnexion.addClickListener(buttonClickEvent -> {
|
||||
dialog.close();
|
||||
});
|
||||
}
|
||||
|
||||
public void verify(){
|
||||
if(runtimeName.getTextField().isInvalid()||runtimeName.getTextField().getValue().isEmpty()||runtimeName.getTextField().getValue()==null&&
|
||||
port.getTextField().isInvalid()||port.getTextField().getValue().isEmpty()||port.getTextField().getValue()==null&&
|
||||
host.getTextField().isInvalid()||host.getTextField().getValue().isEmpty()||host.getTextField().getValue()==null){
|
||||
testConnexion.setEnabled(false);
|
||||
}else {
|
||||
testConnexion.setEnabled(true);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public TextFieldPerso getHost() {
|
||||
return host;
|
||||
}
|
||||
|
||||
public void setHost(TextFieldPerso host) {
|
||||
this.host = host;
|
||||
}
|
||||
|
||||
public TextFieldPerso getPort() {
|
||||
return port;
|
||||
}
|
||||
|
||||
public void setPort(TextFieldPerso port) {
|
||||
this.port = port;
|
||||
}
|
||||
|
||||
public TextFieldPerso getRuntimeName() {
|
||||
return runtimeName;
|
||||
}
|
||||
|
||||
public void setRuntimeName(TextFieldPerso runtimeName) {
|
||||
this.runtimeName = runtimeName;
|
||||
}
|
||||
|
||||
public Button getTestConnexion() {
|
||||
return testConnexion;
|
||||
}
|
||||
|
||||
public void setTestConnexion(Button testConnexion) {
|
||||
this.testConnexion = testConnexion;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,101 @@
|
|||
package org.chtijbug.drools.console.view;
|
||||
|
||||
import com.vaadin.flow.component.button.Button;
|
||||
import com.vaadin.flow.component.dependency.StyleSheet;
|
||||
import com.vaadin.flow.component.html.Anchor;
|
||||
import com.vaadin.flow.component.html.Image;
|
||||
import com.vaadin.flow.component.orderedlayout.HorizontalLayout;
|
||||
import com.vaadin.flow.component.orderedlayout.VerticalLayout;
|
||||
import com.vaadin.flow.router.Route;
|
||||
import com.vaadin.flow.server.InputStreamFactory;
|
||||
import com.vaadin.flow.server.StreamResource;
|
||||
import org.chtijbug.drools.console.vaadinComponent.login.LoginComponent;
|
||||
import org.chtijbug.drools.console.vaadinComponent.login.TextInfoComponent;
|
||||
|
||||
import java.io.InputStream;
|
||||
|
||||
@Route("")
|
||||
@StyleSheet("css/accueil.css")
|
||||
public class LoginView extends VerticalLayout {
|
||||
|
||||
private TextInfoComponent textInfoComponent;
|
||||
|
||||
private LoginComponent loginComponent;
|
||||
|
||||
private Image logo;
|
||||
|
||||
private VerticalLayout verticalLayout;
|
||||
|
||||
public LoginView(){
|
||||
|
||||
setClassName("global-layout");
|
||||
|
||||
|
||||
HorizontalLayout contentImage=new HorizontalLayout();
|
||||
contentImage.setClassName("content-image");
|
||||
add(contentImage);
|
||||
|
||||
verticalLayout=new VerticalLayout();
|
||||
verticalLayout.setClassName("login-global");
|
||||
add(verticalLayout);
|
||||
|
||||
HorizontalLayout contentImage2=new HorizontalLayout();
|
||||
contentImage2.setClassName("content-image2");
|
||||
add(contentImage2);
|
||||
|
||||
Anchor aproposFooter=new Anchor("https://pymma-software.heron-software.com/","A propos");
|
||||
aproposFooter.setClassName("footer-button");
|
||||
contentImage2.add(aproposFooter);
|
||||
|
||||
Anchor contactFooter=new Anchor("https://pymma-software.heron-software.com/contact","Contact");
|
||||
contactFooter.setClassName("footer-button");
|
||||
contentImage2.add(contactFooter);
|
||||
|
||||
InputStreamFactory inputStreamFactory=new InputStreamFactory() {
|
||||
@Override
|
||||
public InputStream createInputStream() {
|
||||
return getClass().getResourceAsStream("/images/pymma.png");
|
||||
}
|
||||
};
|
||||
|
||||
StreamResource str=new StreamResource("logo",inputStreamFactory);
|
||||
|
||||
logo=new Image(str,"");
|
||||
logo.setClassName("login-logoPresentation");
|
||||
contentImage.add(logo);
|
||||
|
||||
HorizontalLayout horizontalLayout=new HorizontalLayout();
|
||||
horizontalLayout.setClassName("login-global-content");
|
||||
verticalLayout.add(horizontalLayout);
|
||||
|
||||
textInfoComponent=new TextInfoComponent();
|
||||
horizontalLayout.add(textInfoComponent);
|
||||
|
||||
loginComponent=new LoginComponent();
|
||||
horizontalLayout.add(loginComponent);
|
||||
}
|
||||
|
||||
public TextInfoComponent getTextInfoComponent() {
|
||||
return textInfoComponent;
|
||||
}
|
||||
|
||||
public void setTextInfoComponent(TextInfoComponent textInfoComponent) {
|
||||
this.textInfoComponent = textInfoComponent;
|
||||
}
|
||||
|
||||
public LoginComponent getLoginComponent() {
|
||||
return loginComponent;
|
||||
}
|
||||
|
||||
public void setLoginComponent(LoginComponent loginComponent) {
|
||||
this.loginComponent = loginComponent;
|
||||
}
|
||||
|
||||
public Image getLogo() {
|
||||
return logo;
|
||||
}
|
||||
|
||||
public void setLogo(Image logo) {
|
||||
this.logo = logo;
|
||||
}
|
||||
}
|
||||
|
|
@ -1,4 +1,41 @@
|
|||
@import "login/globalLogin.css";
|
||||
@import "menu/menuGlobal.css";
|
||||
@import "leftMenu/leftMenuGlobal.css";
|
||||
@import "view/global.css";
|
||||
|
||||
.separator{
|
||||
height: 2px;
|
||||
background-color: rgba(0, 0, 0, 0.2) !important;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.squelette-composant-contentAll{
|
||||
width: 100%!important;
|
||||
height: 100%;
|
||||
padding: 0px;
|
||||
}
|
||||
|
||||
.squelette-component-content{
|
||||
padding: 0px;
|
||||
margin: 0px;
|
||||
background-color: whitesmoke;
|
||||
}
|
||||
|
||||
.squelette-component-horizontal{
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
margin: 0px;
|
||||
}
|
||||
|
||||
.squelette-component-infoPage{
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
margin: 0px;
|
||||
}
|
||||
.footer-button{
|
||||
background: transparent;
|
||||
cursor: pointer;
|
||||
font-size: 0.8vw;
|
||||
}
|
||||
|
||||
|
||||
.grid-perso {
|
||||
height: 800px !important;
|
||||
}
|
||||
|
|
@ -0,0 +1,22 @@
|
|||
.datepicker-perso-icon{
|
||||
color: #a5a5a5;
|
||||
margin-top: 18px;
|
||||
}
|
||||
.content-icon{
|
||||
background-color: grey;
|
||||
height: 40px;
|
||||
border-radius: 3px;
|
||||
margin-top: 35px;
|
||||
padding: 6px !important;
|
||||
}
|
||||
.vaadin-date-picker-container.style-scope.vaadin-date-picker >label {
|
||||
|
||||
margin-left: -35px;
|
||||
}
|
||||
.vaadin-date-picker-container.style-scope.vaadin-date-picker {
|
||||
width: 400px;
|
||||
|
||||
}
|
||||
vaadin-date-picker [part="input-field"]{
|
||||
width: 400px;
|
||||
}
|
||||
|
|
@ -0,0 +1,25 @@
|
|||
.passwordField-perso-icon{
|
||||
color: #a5a5a5;
|
||||
margin-top: 18px;
|
||||
}
|
||||
.content-icon{
|
||||
background-color: grey;
|
||||
height: 40px;
|
||||
border-radius: 3px;
|
||||
margin-top: 35px;
|
||||
padding: 6px !important;
|
||||
width: 37px !important;
|
||||
}
|
||||
.horizontal-content{
|
||||
width: 90%;
|
||||
}
|
||||
.vaadin-text-field-container.style-scope.vaadin-password-field {
|
||||
width: 100%;
|
||||
}
|
||||
.vaadin-text-field-container.style-scope.vaadin-text-field {
|
||||
width: 100%;
|
||||
}
|
||||
.content-perso-field{
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,73 @@
|
|||
.leftMenu-global-content{
|
||||
width: 19%!important;
|
||||
padding: 0px;
|
||||
height: 100%;
|
||||
text-align: center;
|
||||
position: relative;
|
||||
box-shadow: 5px 4px 10px #A0A0A0A0;
|
||||
|
||||
}
|
||||
|
||||
.leftMenu-global-infoEntreprise{
|
||||
width: 100%;
|
||||
display: inline-block;
|
||||
bottom: 0;
|
||||
position: absolute;
|
||||
}
|
||||
|
||||
.leftMenu-global-button{
|
||||
background: transparent;
|
||||
width: 100%;
|
||||
font-size: 1vw;
|
||||
margin: 0px;
|
||||
height: 3vw;
|
||||
color: #32CBC5;
|
||||
border-radius: 0px;
|
||||
cursor: pointer;
|
||||
}
|
||||
.leftMenu-global-button.active{
|
||||
border-left-color: rgb(50, 203, 187);
|
||||
border-left-style: solid;
|
||||
border-left-width: 0.2vw;
|
||||
background-color: whitesmoke;
|
||||
}
|
||||
|
||||
|
||||
.leftMenu-global-action{
|
||||
height: 100%;
|
||||
padding: 0px;
|
||||
margin-left: 0px;
|
||||
margin-right: 0px;
|
||||
}
|
||||
|
||||
.leftMenu-global-infoStructure-content{
|
||||
width: 100%!important;
|
||||
padding: 0px;
|
||||
height: 100%;
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.leftMenu-global-infoStrcutre-contentTitre{
|
||||
background-color: #DCDCDC;
|
||||
width: 100%!important;
|
||||
height: 4vw;
|
||||
margin: 0px;
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.leftMenu-global-inforStructure-titre{
|
||||
font-size: 1.5vw;
|
||||
font-weight: bold;
|
||||
color: rgba(0,0,0,0.4);
|
||||
}
|
||||
|
||||
.leftMenu-global-inforStructure-logo{
|
||||
width: 6vw;
|
||||
}
|
||||
|
||||
.leftMenu-global-inforStructure-label{
|
||||
color: rgba(0,0,0,0.6);
|
||||
font-size: 0.9vw;
|
||||
}
|
||||
|
||||
.leftMenu-global-inforStructure-content-label{}
|
||||
|
|
@ -0,0 +1,43 @@
|
|||
.login-application-title{
|
||||
color: #32CBBB;
|
||||
font-weight: bolder;
|
||||
font-size: 30px;
|
||||
}
|
||||
|
||||
.login-application-forgotPassword{}
|
||||
|
||||
.login-application-connexion {
|
||||
font-family: var(--lumo-font-family);
|
||||
font-size: var(--lumo-font-size-m);
|
||||
font-weight: 500;
|
||||
color: white;
|
||||
background-color:#32cbcb ;
|
||||
border-radius: var(--lumo-border-radius);
|
||||
width: 100%;
|
||||
-webkit-tap-highlight-color: transparent;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
margin-top: 10%;
|
||||
cursor: pointer;
|
||||
display: inline-block;
|
||||
}
|
||||
.login-application-connexion[disabled][disabled] {
|
||||
pointer-events: none;
|
||||
color: var(--lumo-disabled-text-color);
|
||||
background-color: gainsboro;
|
||||
|
||||
}
|
||||
|
||||
.login-application-layout{
|
||||
display: inline-block;
|
||||
box-shadow: 5px 4px 10px #A0A0A0A0;
|
||||
border-bottom-right-radius: 2px;
|
||||
border-bottom-left-radius: 2px;
|
||||
padding: 15px;
|
||||
border-radius: 5px;
|
||||
background-color: white;
|
||||
}
|
||||
|
||||
.login-application-layout-separation{}
|
||||
|
||||
.login-application-layout-formulaire{}
|
||||
|
|
@ -0,0 +1,43 @@
|
|||
|
||||
.login-application-layout-FormulaireInfo {
|
||||
position: relative;
|
||||
background: #32CBBB;
|
||||
border: 4px solid #32CBBB;
|
||||
width: 50%!important;
|
||||
display: inline-grid;
|
||||
}
|
||||
.login-application-layout-FormulaireInfo:after, .arrow_box:before {
|
||||
right: 100%;
|
||||
top: 50%;
|
||||
border: solid transparent;
|
||||
content: " ";
|
||||
height: 0;
|
||||
width: 0;
|
||||
position: absolute;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
.login-application-layout-FormulaireInfo:after {
|
||||
border-color: rgba(50, 203, 187, 0);
|
||||
border-right-color: #32CBBB;
|
||||
border-width: 30px;
|
||||
margin-top: -30px;
|
||||
}
|
||||
.login-application-layout-FormulaireInfo:before {
|
||||
border-color: rgba(50, 203, 187, 0);
|
||||
border-right-color: #32CBBB;
|
||||
border-width: 36px;
|
||||
margin-top: -36px;
|
||||
}
|
||||
|
||||
.login-application-layout-FormulaireInfo-Title{
|
||||
color: whitesmoke;
|
||||
font-size: 20px;
|
||||
font-weight: bold;
|
||||
margin-top: -30%;
|
||||
}
|
||||
|
||||
.login-application-layout-FormulaireInfo-Paragraphe{
|
||||
color: whitesmoke;
|
||||
margin-top: -30%;
|
||||
}
|
||||
|
|
@ -0,0 +1,50 @@
|
|||
@import "formulaire.css";
|
||||
@import "formulaireInfoContent.css";
|
||||
@import "textInfo.css";
|
||||
@import "loginComponent.css";
|
||||
|
||||
.login-global{
|
||||
text-align: center;
|
||||
background-color: #F0F0F0;
|
||||
height: 76%!important;
|
||||
padding-top: 8%;
|
||||
}
|
||||
.global-layout{
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
text-align: center;
|
||||
padding: 0 !important;
|
||||
background-color: #F0F0F0;
|
||||
}
|
||||
|
||||
|
||||
.footer-button .vaadin-button-container {
|
||||
text-decoration: underline!important;
|
||||
}
|
||||
|
||||
.footer-button :hover{
|
||||
background: transparent;
|
||||
}
|
||||
.login-global-content{}
|
||||
|
||||
.login-logoPresentation{
|
||||
width: 200px;
|
||||
}
|
||||
.content-image{
|
||||
display: inline-block;
|
||||
width: 100%;
|
||||
padding-top: 1%;
|
||||
padding-bottom: 1%;
|
||||
background-color: white;
|
||||
height: 12%;
|
||||
box-shadow: 0px 2px 10px #A0A0A0A0;
|
||||
}
|
||||
.content-image2{
|
||||
display: inline-block;
|
||||
width: 100%;
|
||||
padding-top: 1%;
|
||||
padding-bottom: 1%;
|
||||
background-color: white;
|
||||
height: 12%;
|
||||
box-shadow: 0px -2px 12px #A0A0A0A0;
|
||||
}
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
.login-formulaire-globalLayout{
|
||||
text-align: center;
|
||||
margin-left: 14%;
|
||||
}
|
||||
|
|
@ -0,0 +1,15 @@
|
|||
.login-layout-textInfo{
|
||||
width: 40%!important;
|
||||
margin-left: 10%;
|
||||
}
|
||||
|
||||
.login-title{
|
||||
font-size: 20px;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.login-textInfo-layoutContent{}
|
||||
|
||||
.login-textInfo-button{}
|
||||
|
||||
.login-textInfo-paragraph{}
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
@import "menuPrincipal.css";
|
||||
@import "menuSecondaire.css";
|
||||
|
|
@ -0,0 +1,57 @@
|
|||
.menu-principal-menubar-content{
|
||||
height: 8%;
|
||||
width: 100%;
|
||||
position: relative;
|
||||
padding: 0px;
|
||||
box-shadow: 5px 4px 10px #A0A0A0A0;
|
||||
}
|
||||
|
||||
.menu-principal-logoPresentation{
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
margin-top: 0.4%;
|
||||
margin-bottom: 0.4%;
|
||||
width: 11vw;
|
||||
}
|
||||
.icon-menuPrincipal{
|
||||
color: rgba(0,0,0,0.60);
|
||||
}
|
||||
.hamburger{
|
||||
background-color: transparent;
|
||||
height: 100%;
|
||||
margin: 0px;
|
||||
cursor: pointer;
|
||||
margin-left: 18px;
|
||||
font-size: 2vw;
|
||||
|
||||
}
|
||||
.menu-principal-button{
|
||||
background-color: transparent;
|
||||
cursor: pointer;
|
||||
height: 100%;
|
||||
border-radius: 0px;
|
||||
color: rgba(0,0,0,0.60);
|
||||
margin: 0px;
|
||||
font-size: 0.9vw;
|
||||
}
|
||||
|
||||
.menu-principal-button.active{
|
||||
border-bottom-color: rgb(50, 203, 187);
|
||||
border-bottom-style: solid;
|
||||
border-bottom-width: 0.2vw;
|
||||
background-color: whitesmoke;
|
||||
}
|
||||
|
||||
.menu-principal-button-user{
|
||||
background-color: #32CBC3;
|
||||
cursor: pointer;
|
||||
height: 100%;
|
||||
border-radius: 0px;
|
||||
color: white;
|
||||
position: absolute;
|
||||
right: 0;
|
||||
margin: 0px;
|
||||
width: 14%;
|
||||
font-size: 1.3vw;
|
||||
font-weight: bolder;
|
||||
}
|
||||
|
|
@ -0,0 +1,14 @@
|
|||
.menu-secondaire-content{
|
||||
width: 100%;
|
||||
background-color: #32cbcb;
|
||||
box-shadow: 5px 4px 10px #A0A0A0A0;
|
||||
height: 7%;
|
||||
padding: 0;
|
||||
}
|
||||
.menu-secondaire-button{
|
||||
background-color: transparent;
|
||||
height: 100%;
|
||||
color: white;
|
||||
cursor: pointer;
|
||||
font-size: 1vw;
|
||||
}
|
||||
|
|
@ -0,0 +1,9 @@
|
|||
.creation-runtime-title{
|
||||
color: #32CBBB;
|
||||
font-weight: bolder;
|
||||
font-size: 1.5vw;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
|
||||
.creation-runtime-content{}
|
||||
|
|
@ -0,0 +1 @@
|
|||
@import "addRuntime.css";
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 1.8 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 208 KiB |
|
|
@ -10,8 +10,6 @@
|
|||
<output-test url="file://$MODULE_DIR$/target/test-classes" />
|
||||
<content url="file://$MODULE_DIR$">
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/target" />
|
||||
</content>
|
||||
<orderEntry type="inheritedJdk" />
|
||||
|
|
|
|||
Loading…
Add table
editor.link_modal.header
Reference in a new issue