diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index 8d1cf95..81f6ab4 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -20,9 +20,9 @@ jobs: - name: Set up JDK 17 uses: actions/setup-java@v3 with: - java-version: 17 + java-version: 21 architecture: x64 - distribution: corretto + distribution: temurin cache: maven - name: Build with Maven run: mvn -B package --file sources/pom.xml diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index fc758d8..c475aac 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -18,9 +18,9 @@ jobs: - name: Set up JDK 17 uses: actions/setup-java@v4 with: - java-version: 17 + java-version: 21 architecture: x64 - distribution: corretto + distribution: temurin cache: maven server-id: ossrh server-username: MAVEN_USERNAME # env variable for username in deploy diff --git a/README.md b/README.md index 0582dc1..ef6a747 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ [![Maven Central](https://img.shields.io/maven-central/v/tools.dynamia.themes/tools.dynamia.themes.dynamical.svg?label=Maven%20Central)](https://search.maven.org/search?q=g:%22tools.dynamia.themes%22%20AND%20a:%22tools.dynamia.themes.dynamical%22) [![Maven Build](https://github.com/dynamiatools/theme-dynamical/actions/workflows/maven.yml/badge.svg)](https://github.com/dynamiatools/theme-dynamical/actions/workflows/maven.yml) [![Release and Deploy](https://github.com/dynamiatools/theme-dynamical/actions/workflows/release.yml/badge.svg)](https://github.com/dynamiatools/theme-dynamical/actions/workflows/release.yml) -![Java Version Required](https://img.shields.io/badge/java-17-blue) +![Java Version Required](https://img.shields.io/badge/java-21-blue) # Bootstrap theme for DynamiaTools @@ -26,13 +26,13 @@ This template is based on https://adminlte.io/ free (MIT) admin template. Which tools.dynamia.themes tools.dynamia.themes.dynamical - 5.1.3 + 5.4.0 ``` **Gradle** ```groovy -compile 'tools.dynamia.themes:tools.dynamia.themes.dynamical:5.1.3' +compile 'tools.dynamia.themes:tools.dynamia.themes.dynamical:5.4.0' ``` Edit Spring Boot properties ```application.properties``` diff --git a/sources/pom.xml b/sources/pom.xml index a9038c6..c2a4df9 100644 --- a/sources/pom.xml +++ b/sources/pom.xml @@ -23,7 +23,7 @@ tools.dynamia.themes tools.dynamia.themes.dynamical - 5.3.6 + 5.4.0 Themes - ZK Dynamical https://www.dynamia.tools/themes/dynamical Boostrap theme for DynamiaTools apps @@ -56,9 +56,9 @@ - 5.3.6 - 17 - 3.13.0 + 5.4.0 + 21 + 3.14.0 UTF-8 @@ -122,7 +122,7 @@ org.zkoss.theme iceblue_c - 10.0.0 + 10.0.0.1 @@ -137,6 +137,13 @@ + + + zkoss-ce + https://mavensync.zkoss.org/maven2/ + + + release-sign-artifacts diff --git a/sources/src/main/java/tools/dynamia/themes/dynamical/DynamicalTemplate.java b/sources/src/main/java/tools/dynamia/themes/dynamical/DynamicalTemplate.java index 20812d8..9f47dfb 100644 --- a/sources/src/main/java/tools/dynamia/themes/dynamical/DynamicalTemplate.java +++ b/sources/src/main/java/tools/dynamia/themes/dynamical/DynamicalTemplate.java @@ -24,6 +24,7 @@ import tools.dynamia.templates.ApplicationTemplate; import tools.dynamia.templates.ApplicationTemplateSkin; import tools.dynamia.templates.InstallApplicationTemplate; +import tools.dynamia.themes.dynamical.viewers.DynamicalCrudViewRenderer; import tools.dynamia.viewers.ViewTypeFactory; import tools.dynamia.zk.viewers.BootstrapConfigViewRender; import tools.dynamia.zk.viewers.BootstrapCrudViewRenderer; @@ -60,7 +61,7 @@ public DynamicalTemplate(ViewTypeFactory viewTypeFactory) { createSkins(); properties = MapBuilder.put(AUTHOR, "Mario Serrano", DATE, "2017", COPYRIGHT, "Dynamia Soluciones IT 2017", - VERSION, "5.3.1", ORIGINAL_AUTHOR, "Almsaeed Studio"); + VERSION, "5.4.0", ORIGINAL_AUTHOR, "Almsaeed Studio"); } @@ -79,7 +80,7 @@ public void init() { Library.setProperty("org.zkoss.theme.preferred", "iceblue_c"); - viewTypeFactory.setCustomViewRenderer("crud", BootstrapCrudViewRenderer.class); + viewTypeFactory.setCustomViewRenderer("crud", DynamicalCrudViewRenderer.class); viewTypeFactory.setCustomViewRenderer("table", BootstrapTableViewRenderer.class); viewTypeFactory.setCustomViewRenderer("form", BootstrapFormViewRenderer.class); viewTypeFactory.setCustomViewRenderer("config", BootstrapConfigViewRender.class); diff --git a/sources/src/main/java/tools/dynamia/themes/dynamical/viewers/DynamicalCrudView.java b/sources/src/main/java/tools/dynamia/themes/dynamical/viewers/DynamicalCrudView.java index 15c7571..8c09370 100644 --- a/sources/src/main/java/tools/dynamia/themes/dynamical/viewers/DynamicalCrudView.java +++ b/sources/src/main/java/tools/dynamia/themes/dynamical/viewers/DynamicalCrudView.java @@ -17,342 +17,30 @@ package tools.dynamia.themes.dynamical.viewers; -import org.zkoss.zk.ui.Component; -import org.zkoss.zk.ui.HtmlBasedComponent; -import org.zkoss.zul.*; -import tools.dynamia.actions.Action; -import tools.dynamia.actions.ActionGroup; -import tools.dynamia.actions.ActionRenderer; -import tools.dynamia.actions.Actions; -import tools.dynamia.commons.StringUtils; -import tools.dynamia.crud.ChangedStateEvent; -import tools.dynamia.crud.CrudState; -import tools.dynamia.crud.actions.CancelAction; -import tools.dynamia.ui.icons.Icon; import tools.dynamia.ui.icons.IconSize; -import tools.dynamia.ui.icons.IconType; -import tools.dynamia.ui.icons.IconsTheme; -import tools.dynamia.web.util.HttpUtils; -import tools.dynamia.zk.actions.ActionToolbar; -import tools.dynamia.zk.actions.ButtonActionRenderer; -import tools.dynamia.zk.actions.MenuitemActionRenderer; -import tools.dynamia.zk.actions.ToolbarbuttonActionRenderer; -import tools.dynamia.zk.crud.CrudView; import tools.dynamia.zk.crud.CrudViewRenderer; -import tools.dynamia.zk.crud.actions.FindAction; import tools.dynamia.zk.util.ZKUtil; -import tools.dynamia.zk.viewers.ZKWrapperView; +import tools.dynamia.zk.viewers.BootstrapCrudView; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public class DynamicalCrudView extends CrudView { +public class DynamicalCrudView extends BootstrapCrudView { /** * */ private static final long serialVersionUID = 1773528227238113127L; - private Div formLeftActions; - private Div formRightActions; - private Div formActions; - private Component leftActions; - private Component rightActions; - private Menupopup actionsMenu; - private Button actionsButton; - private Borderlayout borderlayout; - private Map actionGroupContainers; - private ButtonActionRenderer defaultActionRenderer; @Override protected void buildGeneralView() { super.buildGeneralView(); - - borderlayout = (Borderlayout) layout; - - Div header = new Div(); - header.setZclass("crudview-header " + ActionToolbar.CONTAINER_SCLASS); - header.setSclass("clearfix"); - header.setParent(borderlayout.getNorth()); - toolbarContainer = header; - - formActions = new Div(); - formActions.setZclass("crudview-footer row"); - - formLeftActions = new Div(); - formLeftActions.setZclass("col-xs-12 col-md-12"); - formLeftActions.setParent(formActions); - - formRightActions = new Div(); - formRightActions.setZclass("col-xs-12 col-md-12"); - formRightActions.setStyle("text-align: right"); - formRightActions.setParent(formActions); - - String menuId = "actionMenu" + StringUtils.randomString().substring(0, 4); - actionsMenu = new Menupopup(); - actionsMenu.setId(menuId); - actionsMenu.setParent(this); - actionsButton = new Button(); - actionsButton.setZclass("btn btn-primary actions"); - actionsButton.setPopup(menuId + ", after_start"); - ZKUtil.configureComponentIcon("process", actionsButton, IconSize.NORMAL); - - addCrudStateChangedListener(this::controlChangedState); - } - - @Override - protected void buildToolbars() { - if (!HttpUtils.isSmartphone()) { - Div toolbar = new Div(); - toolbar.setZclass("btn-toolbar"); - - leftActions = toolbar; - - toolbar = new Div(); - toolbar.setZclass("btn-toolbar"); - toolbar.setSclass("actiontb-right"); - rightActions = toolbar; - } - } - - @Override - protected void buildToolbarContainer() { - if (!HttpUtils.isSmartphone()) { - toolbarContainer.appendChild(leftActions); - toolbarContainer.appendChild(rightActions); - } - - } - - @SuppressWarnings("rawtypes") - @Override - protected ActionRenderer getDefaultActionRenderer() { - if (defaultActionRenderer == null) { - defaultActionRenderer = new ButtonActionRenderer(); - defaultActionRenderer.setZclass("btn btn-default"); - defaultActionRenderer.setShowLabels(false); - - } - return defaultActionRenderer; - } - - @Override - protected void loadActions(CrudState state) { - actionsMenu.getChildren().clear(); - - if (HttpUtils.isSmartphone()) { - - toolbarContainer.getChildren().clear(); - if (state == CrudState.READ) { - - toolbarContainer.appendChild(actionsButton); - } else { - borderlayout.getNorth().setVisible(false); - } - } - - super.loadActions(state); - } - - protected Component renderAction(Action action) { - ActionRenderer actionRenderer = action.getRenderer(); - if (actionRenderer == null) { - actionRenderer = getDefaultActionRenderer(); - } - Component component = (Component) Actions.render(actionRenderer, action, this); - - String actionId = action.getId(); - if (action.getAttribute("internalId") != null) { - actionId = action.getAttribute("internalId").toString(); - } - if (component instanceof HtmlBasedComponent) { - HtmlBasedComponent hcom = (HtmlBasedComponent) component; - hcom.setSclass("actiontb-a " + actionId); - if (hcom instanceof Toolbarbutton) { - hcom.setZclass("none"); - hcom.setSclass("btn btn-default " + hcom.getSclass()); - } - - hcom.setTooltiptext(action.getName()); - if (HttpUtils.isSmartphone()) { - if (!(component instanceof Button)) { - hcom.setSclass(hcom.getSclass() + " flexit"); - } - } - } - - return component; - - } - - @Override - protected void showActionGroup(ActionGroup actionGroup) { - if (HttpUtils.isSmartphone() && getState() == CrudState.READ) { - MenuitemActionRenderer renderer = new MenuitemActionRenderer(); - for (Action action : actionGroup.getActions()) { - if (action.getRenderer() == null || action.getRenderer() instanceof ToolbarbuttonActionRenderer) { - Menuitem menuitem = Actions.render(renderer, action, this); - actionsMenu.appendChild(menuitem); - } else { - showAction(actionGroup, action); - } - } - } else { - - actionGroup.getActions().forEach(a -> { - showAction(actionGroup, a); - }); - } - } - - @Override - protected void showAction(ActionGroup actionGroup, Action action) { - if ((getState() == CrudState.CREATE || getState() == CrudState.UPDATE) - && (action.getRenderer() == null || action.getRenderer() instanceof ToolbarbuttonActionRenderer)) { - ButtonActionRenderer renderer = new ButtonActionRenderer(); - Button button = Actions.render(renderer, action, this); - button.setAttribute(ACTION, action); - applyButtonStyle(button, action); - addButton(actionGroup, button); - } else { - fixFindAction(action); - - Component actionComp = renderAction(action); - if (!HttpUtils.isSmartphone()) { - Component group = getActionGroupContainer(actionGroup); - group.appendChild(actionComp); - if (group.getParent() == null) { - group.setParent("left".equals(actionGroup.getAlign()) ? leftActions : rightActions); - } - - } else { - toolbarContainer.appendChild(actionComp); - } - } - } - - private Component getActionGroupContainer(ActionGroup actionGroup) { - if (actionGroupContainers == null) { - this.actionGroupContainers = new HashMap<>(); - } - - Div group = this.actionGroupContainers.get(actionGroup); - if (group == null) { - group = new Div(); - group.setZclass("btn-group"); - this.actionGroupContainers.put(actionGroup, group); - } - - return group; - } - - private void fixFindAction(Action action) { - if (HttpUtils.isSmartphone()) { - if (action instanceof FindAction) { - action.setAttribute("zclass", "form-control"); - - } + if (actionsButton != null) { + actionsButton.setIconSclass("fa fa-bars"); } - } - - private void displayMenuActions(List actionComponents) { - toolbarContainer.appendChild(actionsButton); - MenuitemActionRenderer menuRenderer = new MenuitemActionRenderer(); - for (Component component : actionComponents) { - System.out.println("MENU ACTION: " + component); - Action action = (Action) component.getAttribute(ACTION); - if (action != null) { - System.out.println(" " + action); - Menuitem menuitem = Actions.render(menuRenderer, action, this); - actionsMenu.appendChild(menuitem); - } - } } - private void addButton(ActionGroup group, Component btn) { - - Div btnGroup = new Div(); - if (HttpUtils.isSmartphone()) { - btnGroup.setZclass("btn-group col-md-3 col-sm-3 col-xs-12"); - } else { - btnGroup.setZclass("btn-group"); - } - btnGroup.appendChild(btn); - - if ("right".equals(group.getAlign())) { - btnGroup.setSclass("pull-right"); - formRightActions.appendChild(btnGroup); - } else { - formLeftActions.appendChild(btnGroup); - } - - } - - private void applyButtonStyle(Button button, Action action) { - if (action instanceof CancelAction) { - button.setZclass("btn btn-danger"); - } else if (action.getPosition() <= 1) { - button.setZclass("btn btn-primary"); - } else { - button.setZclass("btn btn-default"); - } - - if (action != null && action.getAttribute("type") != null) { - button.setZclass("btn btn-" + action.getAttribute("type")); - } - - Icon icon = IconsTheme.get().getIcon(action.getImage()); - if (icon.getType() == IconType.IMAGE) { - button.setImage(null); - } - } - - - protected void controlChangedState(ChangedStateEvent evt) { - CrudState crudState = evt.newState(); - - switch (crudState) { - - case READ: - - borderlayout.getNorth().setVisible(true); - break; - default: - if (leftActions != null && rightActions != null) { - if (leftActions.getChildren().isEmpty() && rightActions.getChildren().isEmpty()) { - borderlayout.getNorth().setVisible(false); - } - } - break; - } - } - - @Override - public void clearActions() { - super.clearActions(); - actionsMenu.getChildren().clear(); - formLeftActions.getChildren().clear(); - formRightActions.getChildren().clear(); - if (leftActions != null && rightActions != null) { - leftActions.getChildren().clear(); - rightActions.getChildren().clear(); - } - if (actionGroupContainers != null) { - this.actionGroupContainers.clear(); - } - - } - - @Override - protected void addFormViewToContainer(String formViewTitle) { - ZKWrapperView wrapperView = new ZKWrapperView(formView); - formActions.setParent(wrapperView); - formViewContainer.addView(formViewTitle, wrapperView); - } @SuppressWarnings("rawtypes") @Override diff --git a/sources/src/main/java/tools/dynamia/themes/dynamical/viewers/DynamicalCrudViewRenderer.java b/sources/src/main/java/tools/dynamia/themes/dynamical/viewers/DynamicalCrudViewRenderer.java index f04a5c1..e72ccee 100644 --- a/sources/src/main/java/tools/dynamia/themes/dynamical/viewers/DynamicalCrudViewRenderer.java +++ b/sources/src/main/java/tools/dynamia/themes/dynamical/viewers/DynamicalCrudViewRenderer.java @@ -18,9 +18,9 @@ package tools.dynamia.themes.dynamical.viewers; import tools.dynamia.zk.crud.CrudView; -import tools.dynamia.zk.crud.CrudViewRenderer; +import tools.dynamia.zk.viewers.BootstrapCrudViewRenderer; -public class DynamicalCrudViewRenderer extends CrudViewRenderer { +public class DynamicalCrudViewRenderer extends BootstrapCrudViewRenderer { public DynamicalCrudViewRenderer() { System.out.println("Starting " + getClass().getName());