diff --git a/src/main/groovy/com/netgrif/application/engine/petrinet/domain/dataset/logic/action/ActionDelegate.groovy b/src/main/groovy/com/netgrif/application/engine/petrinet/domain/dataset/logic/action/ActionDelegate.groovy index 24278dfb82..afdbe5480a 100644 --- a/src/main/groovy/com/netgrif/application/engine/petrinet/domain/dataset/logic/action/ActionDelegate.groovy +++ b/src/main/groovy/com/netgrif/application/engine/petrinet/domain/dataset/logic/action/ActionDelegate.groovy @@ -2486,7 +2486,11 @@ class ActionDelegate { if (!childrenIds.isEmpty()) { for (String id : childrenIds) { UriNode childNode = uriService.findById(id) - options.put(childNode.name, new I18nString(childNode.name)) + Case folderCase = menuItemService.findFolderCase(childNode) + if (folderCase != null) { + I18nString name = (I18nString) folderCase.getFieldValue(MenuItemConstants.FIELD_MENU_NAME) + options.put(childNode.name, name) + } } } diff --git a/src/main/java/com/netgrif/application/engine/menu/domain/MenuItemBody.java b/src/main/java/com/netgrif/application/engine/menu/domain/MenuItemBody.java index 02dde58907..ea8ef6dd76 100644 --- a/src/main/java/com/netgrif/application/engine/menu/domain/MenuItemBody.java +++ b/src/main/java/com/netgrif/application/engine/menu/domain/MenuItemBody.java @@ -31,6 +31,7 @@ public class MenuItemBody { private boolean useCustomView = false; private String customViewSelector; private boolean isAutoSelect = false; + private boolean isFolder = false; private boolean useTabbedView = true; private String tabIcon; @@ -109,16 +110,29 @@ public void setTabName(String name) { } public void setView(ViewBody viewBody) { - if (viewBody != null) { - this.view = viewBody; - MenuItemViewType viewType = viewBody.getViewType(); - if (viewType.isTabbed() != viewType.isUntabbed()) { - // if isTabbed == isUntabbed we cannot determine the result value - this.useTabbedView = viewType.isTabbed(); - } + if (viewBody == null) { + return; } + if (this.isFolder) { + throw new IllegalArgumentException("Folder cannot have view"); + } + this.view = viewBody; + MenuItemViewType viewType = viewBody.getViewType(); + if (viewType.getViewType() == ViewType.ONLY_TABBED) { + this.useTabbedView = true; + } else if (viewType.getViewType() == ViewType.ONLY_UNTABBED) { + this.useTabbedView = false; + } + } + + public void setIsFolder(boolean isFolder) { + if (isFolder && this.view != null) { + throw new IllegalArgumentException("Folder cannot have view"); + } + this.isFolder = isFolder; } + /** * @return true if the menu item contains view * */ @@ -187,6 +201,7 @@ public ToDataSetOutcome toDataSet(String parentId, String nodePath, Case viewCas outcome.putDataSetEntryOptions(MenuItemConstants.FIELD_ALLOWED_ROLES, FieldType.MULTICHOICE_MAP, this.allowedRoles); outcome.putDataSetEntryOptions(MenuItemConstants.FIELD_BANNED_ROLES, FieldType.MULTICHOICE_MAP, this.bannedRoles); outcome.putDataSetEntry(MenuItemConstants.FIELD_CONFIGURATION_TEMPLATES, FieldType.ENUMERATION_MAP, this.configurationTemplateIdentifier); + outcome.putDataSetEntry(MenuItemConstants.FIELD_IS_FOLDER, FieldType.BOOLEAN, this.isFolder); outcome = toDataSetWithView(viewCase, outcome); @@ -203,6 +218,7 @@ public ToDataSetOutcome toDataSetByConfigTemplate(Case viewCase) { ToDataSetOutcome outcome = new ToDataSetOutcome(); outcome.putDataSetEntry(MenuItemConstants.FIELD_USE_TABBED_VIEW, FieldType.BOOLEAN, this.useTabbedView); outcome.putDataSetEntry(MenuItemConstants.FIELD_USE_CUSTOM_VIEW, FieldType.BOOLEAN, this.useCustomView); + outcome.putDataSetEntry(MenuItemConstants.FIELD_IS_FOLDER, FieldType.BOOLEAN, this.isFolder); return toDataSetWithView(viewCase, outcome); } diff --git a/src/main/java/com/netgrif/application/engine/menu/domain/MenuItemConstants.java b/src/main/java/com/netgrif/application/engine/menu/domain/MenuItemConstants.java index 6099240141..c4ab1f141c 100644 --- a/src/main/java/com/netgrif/application/engine/menu/domain/MenuItemConstants.java +++ b/src/main/java/com/netgrif/application/engine/menu/domain/MenuItemConstants.java @@ -6,7 +6,7 @@ public class MenuItemConstants { public static final String FIELD_PARENT_ID = "parentId"; public static final String FIELD_CHILD_ITEM_IDS = "childItemIds"; - public static final String FIELD_HAS_CHILDREN = "hasChildren"; + public static final String FIELD_IS_FOLDER = "is_folder"; public static final String FIELD_IDENTIFIER = "menu_item_identifier"; public static final String FIELD_APPEND_MENU_ITEM = "append_menu_item_stringId"; public static final String FIELD_ALLOWED_ROLES = "allowed_roles"; diff --git a/src/main/java/com/netgrif/application/engine/menu/domain/MenuItemViewType.java b/src/main/java/com/netgrif/application/engine/menu/domain/MenuItemViewType.java index bdf38961be..e8f6f59ecf 100644 --- a/src/main/java/com/netgrif/application/engine/menu/domain/MenuItemViewType.java +++ b/src/main/java/com/netgrif/application/engine/menu/domain/MenuItemViewType.java @@ -8,46 +8,52 @@ import java.util.Map; import java.util.stream.Collectors; +import static com.netgrif.application.engine.menu.domain.ViewType.*; + /** - * Here is listed and configured every configuration process available for menu items. + * Here is listed and described every configuration process available for menu items. * */ @Getter public enum MenuItemViewType { CASE_VIEW(new I18nString("Case view", Map.of("sk", "Zobrazenie prípadov", "de", "Fallansicht")), - "case_view", List.of("task_view"), true, true, true), + "case_view", List.of("task_view"), TABBED_AND_UNTABBED, true), TASK_VIEW(new I18nString("Task view", Map.of("sk", "Zobrazenie úloh", "de", "Aufgabenansicht")), - "task_view", List.of(), true, true, true), + "task_view", List.of(), TABBED_AND_UNTABBED, true), TABBED_TICKET_VIEW(new I18nString("Tabbed ticket view", Map.of("sk", "Tiketové zobrazenie v taboch", "de", "Ticketansicht mit Registerkarten")), - "tabbed_ticket_view", List.of("single_task_view"), true, false, true), + "tabbed_ticket_view", List.of("single_task_view"), ONLY_TABBED, true), SINGLE_TASK_VIEW(new I18nString("Single task view", Map.of("sk", "Zobrazenie jednej úlohy", "de", "Einzelaufgabenansicht")), - "single_task_view", List.of(), true, true, true); + "single_task_view", List.of(), TABBED_AND_UNTABBED, true); private final I18nString name; private final String identifier; + /** * List of view identifiers of views, that can be associated with the view * */ private final List allowedAssociatedViews; - private final boolean isTabbed; - private final boolean isUntabbed; + + /** + * Specifies whether this view type can be used in tabbed menu items, untabbed menu items, or both. + * This determines the context in which the view can be displayed in the menu structure. + * */ + private final ViewType viewType; + /** * if false, the view cannot be used as first configuration of the menu_item, but can be used as secondary * (associated to another view) * */ private final boolean isPrimary; - MenuItemViewType(I18nString name, String identifier, List allowedAssociatedViews, boolean isTabbed, - boolean isUntabbed, boolean isPrimary) { + MenuItemViewType(I18nString name, String identifier, List allowedAssociatedViews, ViewType viewType, boolean isPrimary) { this.name = name; this.identifier = identifier; this.allowedAssociatedViews = allowedAssociatedViews; - this.isTabbed = isTabbed; - this.isUntabbed = isUntabbed; + this.viewType = viewType; this.isPrimary = isPrimary; } @@ -64,32 +70,29 @@ public static MenuItemViewType fromIdentifier(String identifier) { } /** - * Finds all enum values, that are tabbed or non-tabbed + * Finds all enum values, that are / are not primary * - * @param isTabbed if true, only tabbed values will be returned * @param isPrimary if true, only views accessible directly from the menu_item will be returned * - * @return List of views based on {@link #isTabbed} + * @return List of views based on {@link #isPrimary} * */ - public static List findAllByIsTabbedAndIsPrimary(boolean isTabbed, boolean isPrimary) { + public static List findAllByIsPrimary(boolean isPrimary) { return Arrays.stream(MenuItemViewType.values()) - .filter(view -> (view.isTabbed == isTabbed || view.isUntabbed != isTabbed) && view.isPrimary == isPrimary) + .filter(view -> view.isPrimary == isPrimary) .collect(Collectors.toList()); } /** - * Finds all enum values, that are tabbed or non-tabbed and are defined in parent view as {@link #allowedAssociatedViews} + * Finds all enum values, that are are defined in parent view as {@link #allowedAssociatedViews} * - * @param isTabbed if true, set of views is reduced to only tabbed views * @param parentIdentifier identifier of the view, that contains returned views in {@link #allowedAssociatedViews} * - * @return List of views based on {@link #isTabbed} and {@link #allowedAssociatedViews} + * @return List of views based on {@link #allowedAssociatedViews} * */ - public static List findAllByIsTabbedAndParentIdentifier(boolean isTabbed, String parentIdentifier) { + public static List findAllByParentIdentifier(String parentIdentifier) { MenuItemViewType parentView = fromIdentifier(parentIdentifier); return Arrays.stream(MenuItemViewType.values()) - .filter(view -> (view.isTabbed == isTabbed || view.isUntabbed != isTabbed) - && parentView.getAllowedAssociatedViews().contains(view.identifier)) + .filter(view -> parentView.getAllowedAssociatedViews().contains(view.identifier)) .collect(Collectors.toList()); } } diff --git a/src/main/java/com/netgrif/application/engine/menu/domain/ViewType.java b/src/main/java/com/netgrif/application/engine/menu/domain/ViewType.java new file mode 100644 index 0000000000..e9fcb9f58c --- /dev/null +++ b/src/main/java/com/netgrif/application/engine/menu/domain/ViewType.java @@ -0,0 +1,7 @@ +package com.netgrif.application.engine.menu.domain; + +public enum ViewType { + ONLY_TABBED, + ONLY_UNTABBED, + TABBED_AND_UNTABBED +} diff --git a/src/main/java/com/netgrif/application/engine/menu/domain/configurations/CaseViewBody.java b/src/main/java/com/netgrif/application/engine/menu/domain/configurations/CaseViewBody.java index 6a47b3b45b..7e796f6735 100644 --- a/src/main/java/com/netgrif/application/engine/menu/domain/configurations/CaseViewBody.java +++ b/src/main/java/com/netgrif/application/engine/menu/domain/configurations/CaseViewBody.java @@ -25,6 +25,8 @@ public class CaseViewBody extends ViewBody { private boolean allowHeaderTableMode = true; private List headersMode = new ArrayList<>(List.of("sort", "edit", "search")); private String headersDefaultMode = "sort"; + private String headersSortModeActive; + private String headersSortModeDirection = "desc"; private List defaultHeaders; private boolean headerModeChangeable = true; private boolean useDefaultHeaders = true; @@ -82,6 +84,10 @@ protected ToDataSetOutcome toDataSetInternal(ToDataSetOutcome outcome) { this.headersMode == null ? new ArrayList<>() : this.headersMode); outcome.putDataSetEntry(CaseViewConstants.FIELD_HEADERS_DEFAULT_MODE, FieldType.ENUMERATION_MAP, this.headersDefaultMode); + outcome.putDataSetEntry(CaseViewConstants.FIELD_HEADERS_SORT_MODE_ACTIVE, FieldType.TEXT, + this.headersSortModeActive); + outcome.putDataSetEntry(CaseViewConstants.FIELD_HEADERS_SORT_MODE_DIRECTION, FieldType.ENUMERATION_MAP, + this.headersSortModeDirection); if (this.defaultHeaders != null) { outcome.putDataSetEntry(CaseViewConstants.FIELD_DEFAULT_HEADERS, FieldType.STRING_COLLECTION, this.defaultHeaders); diff --git a/src/main/java/com/netgrif/application/engine/menu/domain/configurations/CaseViewConstants.java b/src/main/java/com/netgrif/application/engine/menu/domain/configurations/CaseViewConstants.java index 44db426e1b..2cfdaabe45 100644 --- a/src/main/java/com/netgrif/application/engine/menu/domain/configurations/CaseViewConstants.java +++ b/src/main/java/com/netgrif/application/engine/menu/domain/configurations/CaseViewConstants.java @@ -15,6 +15,8 @@ public class CaseViewConstants extends ViewConstants { public static final String FIELD_ALLOW_HEADER_TABLE_MODE = "case_allow_header_table_mode"; public static final String FIELD_HEADERS_MODE = "case_headers_mode"; public static final String FIELD_HEADERS_DEFAULT_MODE = "case_headers_default_mode"; + public static final String FIELD_HEADERS_SORT_MODE_ACTIVE = "case_headers_sort_mode_active"; + public static final String FIELD_HEADERS_SORT_MODE_DIRECTION = "case_headers_sort_mode_direction"; public static final String FIELD_IS_HEADER_MODE_CHANGEABLE = "case_is_header_mode_changeable"; public static final String FIELD_USE_DEFAULT_HEADERS = "use_case_default_headers"; public static final String FIELD_EMPTY_CONTENT_TEXT = "case_empty_content_text"; diff --git a/src/main/java/com/netgrif/application/engine/menu/domain/configurations/TaskViewBody.java b/src/main/java/com/netgrif/application/engine/menu/domain/configurations/TaskViewBody.java index 4e8e09456b..be54684789 100644 --- a/src/main/java/com/netgrif/application/engine/menu/domain/configurations/TaskViewBody.java +++ b/src/main/java/com/netgrif/application/engine/menu/domain/configurations/TaskViewBody.java @@ -19,6 +19,8 @@ public class TaskViewBody extends ViewBody { private String viewSearchType = "fulltext_advanced"; private List headersMode = new ArrayList<>(List.of("sort", "edit")); private String headersDefaultMode = "sort"; + private String headersSortModeActive; + private String headersSortModeDirection = "desc"; private boolean isHeaderModeChangeable = true; private boolean allowHeaderTableMode = true; private boolean useDefaultHeaders = true; @@ -71,6 +73,10 @@ protected ToDataSetOutcome toDataSetInternal(ToDataSetOutcome outcome) { outcome.putDataSetEntry(TaskViewConstants.FIELD_DEFAULT_HEADERS, FieldType.STRING_COLLECTION, this.defaultHeaders); } + outcome.putDataSetEntry(TaskViewConstants.FIELD_HEADERS_SORT_MODE_ACTIVE, FieldType.TEXT, + this.headersSortModeActive); + outcome.putDataSetEntry(TaskViewConstants.FIELD_HEADERS_SORT_MODE_DIRECTION, FieldType.ENUMERATION_MAP, + this.headersSortModeDirection); outcome.putDataSetEntry(TaskViewConstants.FIELD_SHOW_MORE_MENU, FieldType.BOOLEAN, this.showMoreMenu); if (this.emptyContentText != null) { diff --git a/src/main/java/com/netgrif/application/engine/menu/domain/configurations/TaskViewConstants.java b/src/main/java/com/netgrif/application/engine/menu/domain/configurations/TaskViewConstants.java index c9acf6f9e5..736c836091 100644 --- a/src/main/java/com/netgrif/application/engine/menu/domain/configurations/TaskViewConstants.java +++ b/src/main/java/com/netgrif/application/engine/menu/domain/configurations/TaskViewConstants.java @@ -10,6 +10,8 @@ public class TaskViewConstants extends ViewConstants { public static final String FIELD_DEFAULT_HEADERS = "task_default_headers"; public static final String FIELD_HEADERS_MODE = "task_headers_mode"; public static final String FIELD_HEADERS_DEFAULT_MODE = "task_headers_default_mode"; + public static final String FIELD_HEADERS_SORT_MODE_ACTIVE = "task_headers_sort_mode_active"; + public static final String FIELD_HEADERS_SORT_MODE_DIRECTION = "task_headers_sort_mode_direction"; public static final String FIELD_IS_HEADER_MODE_CHANGEABLE = "task_is_header_mode_changeable"; public static final String FIELD_ALLOW_HEADER_TABLE_MODE = "task_allow_header_table_mode"; public static final String FIELD_USE_DEFAULT_HEADERS = "use_task_default_headers"; diff --git a/src/main/java/com/netgrif/application/engine/menu/domain/templates/FolderTemplate.java b/src/main/java/com/netgrif/application/engine/menu/domain/templates/FolderTemplate.java new file mode 100644 index 0000000000..2f5bdd40f3 --- /dev/null +++ b/src/main/java/com/netgrif/application/engine/menu/domain/templates/FolderTemplate.java @@ -0,0 +1,37 @@ +package com.netgrif.application.engine.menu.domain.templates; + +import com.netgrif.application.engine.menu.domain.MenuItemBody; +import com.netgrif.application.engine.petrinet.domain.I18nString; + +import java.util.Map; + +public class FolderTemplate implements Template { + + public static final String IDENTIFIER = "folder"; + + private static final I18nString NAME = new I18nString("Folder without view", + Map.of("sk", "Priečinok bez zobrazenia", "de", "Ordner ohne Ansicht")); + + private static MenuItemBody buildTemplate() { + MenuItemBody menuItemBody = new MenuItemBody(); + menuItemBody.setConfigurationTemplateIdentifier(IDENTIFIER); + menuItemBody.setUseTabbedView(false); + menuItemBody.setIsFolder(true); + return menuItemBody; + } + + @Override + public String getIdentifier() { + return IDENTIFIER; + } + + @Override + public I18nString getName() { + return NAME; + } + + @Override + public MenuItemBody getTemplate() { + return buildTemplate(); + } +} diff --git a/src/main/java/com/netgrif/application/engine/menu/service/MenuItemService.java b/src/main/java/com/netgrif/application/engine/menu/service/MenuItemService.java index 07010a5917..08d18047c5 100644 --- a/src/main/java/com/netgrif/application/engine/menu/service/MenuItemService.java +++ b/src/main/java/com/netgrif/application/engine/menu/service/MenuItemService.java @@ -91,6 +91,7 @@ public void ensureDatabaseIndexes() { * * @throws IllegalArgumentException if the provided menu identifier already exists * */ + // todo: should be transactional @Override public Case createMenuItem(MenuItemBody body) throws TransitionNotExecutableException { validateMenuItemBody(body); @@ -247,6 +248,7 @@ public Case findFolderCase(UriNode node) { Query query = Query.query( Criteria.where("processIdentifier").is(MenuItemConstants.PROCESS_IDENTIFIER) .and(String.format("dataSet.%s.value", MenuItemConstants.FIELD_NODE_PATH)).is(node.getUriPath()) + .and(String.format("dataSet.%s.value", MenuItemConstants.FIELD_IS_FOLDER)).is(true) ); if (existDatabaseIndexes == null || !existDatabaseIndexes) { ensureDatabaseIndexes(); @@ -291,11 +293,11 @@ public void moveItem(Case itemCase, String destUri) throws TransitionNotExecutab if (MenuItemUtils.isCyclicNodePath(itemCase, destUri)) { throw new IllegalArgumentException(String.format("Cyclic path not supported. Destination path: %s", destUri)); } - List casesToSave = new ArrayList<>(); - - List oldParentIdAsList = MenuItemUtils.getCaseIdsFromCaseRef(itemCase, MenuItemConstants.FIELD_PARENT_ID); UriNode destNode = uriService.getOrCreate(destUri, UriContentType.CASE); + + List casesToSave = new ArrayList<>(); + List oldParentIdAsList = MenuItemUtils.getCaseIdsFromCaseRef(itemCase, MenuItemConstants.FIELD_PARENT_ID); Case newParent = getOrCreateFolderItem(destNode.getUriPath()); if (oldParentIdAsList != null && !oldParentIdAsList.isEmpty()) { @@ -421,7 +423,6 @@ public Case removeChildItemFromParent(String folderId, Case childItem) { } childIds.remove(childItem.getStringId()); parentFolder.getDataField(MenuItemConstants.FIELD_CHILD_ITEM_IDS).setValue(childIds); - parentFolder.getDataField(MenuItemConstants.FIELD_HAS_CHILDREN).setValue(MenuItemUtils.hasFolderChildren(parentFolder)); return workflowService.save(parentFolder); } @@ -540,6 +541,9 @@ protected void validateMenuItemBody(MenuItemBody body) { throw new IllegalArgumentException("Uri cannot contain this identifier"); } } + if (body.isFolder() && body.getView() != null) { + throw new IllegalArgumentException("Folder cannot have view"); + } } protected Case findCase(String processIdentifier, String query) { @@ -638,6 +642,8 @@ protected String createNodePath(String uri, String identifier) { protected Case getOrCreateFolderItem(String uri) throws TransitionNotExecutableException { UriNode node = uriService.getOrCreate(uri, UriContentType.CASE); MenuItemBody body = new MenuItemBody(new I18nString(node.getName()), DEFAULT_FOLDER_ICON); + body.setIdentifier(MenuItemUtils.sanitize(node.getName())); + body.setIsFolder(true); return getOrCreateFolderRecursive(node, body); } @@ -655,6 +661,10 @@ protected Case getOrCreateFolderRecursive(UriNode node, MenuItemBody body, Case return folderCase; } + if (existsMenuItem(body.getIdentifier())) { + throw new IllegalArgumentException(String.format("Menu item with identifier '%s' is not folder", body.getIdentifier())); + } + folderCase = createCase(MenuItemConstants.PROCESS_IDENTIFIER, body.getMenuName().getDefaultValue(), loggedUser.transformToLoggedUser()); folderCase.setUriNodeId(node.getParentId()); @@ -668,6 +678,8 @@ protected Case getOrCreateFolderRecursive(UriNode node, MenuItemBody body, Case if (node.getParentId() != null) { UriNode parentNode = uriService.findById(node.getParentId()); body = new MenuItemBody(new I18nString(parentNode.getName()), DEFAULT_FOLDER_ICON); + body.setIdentifier(MenuItemUtils.sanitize(parentNode.getName())); + body.setIsFolder(true); Case parentFolderCase = getOrCreateFolderRecursive(parentNode, body, folderCase); dataSetOutcome.putDataSetEntry(MenuItemConstants.FIELD_PARENT_ID, FieldType.CASE_REF, List.of(parentFolderCase.getStringId())); @@ -688,8 +700,6 @@ protected void appendChildCaseIdInDataSet(Case folderCase, String childItemCaseI dataSet.put(MenuItemConstants.FIELD_CHILD_ITEM_IDS, Map.of("type", FieldType.CASE_REF.getName(), "value", childIds)); - dataSet.put(MenuItemConstants.FIELD_HAS_CHILDREN, Map.of("type", FieldType.BOOLEAN.getName(), - "value", !childIds.isEmpty())); } protected void appendChildCaseIdInMemory(Case folderCase, String childItemCaseId) { @@ -700,7 +710,6 @@ protected void appendChildCaseIdInMemory(Case folderCase, String childItemCaseId childIds.add(childItemCaseId); folderCase.getDataField(MenuItemConstants.FIELD_CHILD_ITEM_IDS).setValue(childIds); } - folderCase.getDataField(MenuItemConstants.FIELD_HAS_CHILDREN).setValue(MenuItemUtils.hasFolderChildren(folderCase)); } protected Case appendChildCaseIdAndSave(Case folderCase, String childItemCaseId) { diff --git a/src/main/java/com/netgrif/application/engine/menu/service/MenuItemTemplateHolder.java b/src/main/java/com/netgrif/application/engine/menu/service/MenuItemTemplateHolder.java index 48f27d931a..c3573264c2 100644 --- a/src/main/java/com/netgrif/application/engine/menu/service/MenuItemTemplateHolder.java +++ b/src/main/java/com/netgrif/application/engine/menu/service/MenuItemTemplateHolder.java @@ -33,7 +33,8 @@ SimpleCaseViewTemplate.IDENTIFIER, new SimpleCaseViewTemplate(), SimpleTaskViewTemplate.IDENTIFIER, new SimpleTaskViewTemplate(), SingleTaskViewTemplate.IDENTIFIER, new SingleTaskViewTemplate(), TabbedTicketViewTemplate.IDENTIFIER, new TabbedTicketViewTemplate(), - CustomViewTemplate.IDENTIFIER, new CustomViewTemplate() + CustomViewTemplate.IDENTIFIER, new CustomViewTemplate(), + FolderTemplate.IDENTIFIER, new FolderTemplate() ); diff --git a/src/main/java/com/netgrif/application/engine/menu/service/interfaces/IMenuItemService.java b/src/main/java/com/netgrif/application/engine/menu/service/interfaces/IMenuItemService.java index ad776b2a9e..25634c33fb 100644 --- a/src/main/java/com/netgrif/application/engine/menu/service/interfaces/IMenuItemService.java +++ b/src/main/java/com/netgrif/application/engine/menu/service/interfaces/IMenuItemService.java @@ -33,34 +33,30 @@ public interface IMenuItemService { Map collectRoles(Map roles); /** - * Gets all tabbed or non-tabbed views - * - * @param isTabbed if true, only tabbed views will be returned - * @param isPrimary if true, only views accessible directly from the menu_item will be returned + * Gets all primary views as options * * @return All available views defined in {@link MenuItemViewType} in consideration of input value. Views are returned as * options for {@link MapOptionsField} * */ - default Map getAvailableViewsAsOptions(boolean isTabbed, boolean isPrimary) { - return MenuItemViewType.findAllByIsTabbedAndIsPrimary(isTabbed, isPrimary).stream() + default Map getPrimaryViewsAsOptions() { + return MenuItemViewType.findAllByIsPrimary(true).stream() .collect(Collectors.toMap(MenuItemViewType::getIdentifier, MenuItemViewType::getName)); } /** - * Gets all tabbed or non-tabbed views + * Gets all views available for the configuration identifier * - * @param isTabbed if true, only tabbed views will be returned * @param viewIdentifier identifier of view (defined in {@link MenuItemViewType}), which is parent to returned views * * @return All available views defined in {@link MenuItemViewType} in consideration of input values. Views are returned as * options for {@link MapOptionsField} * */ - default Map getAvailableViewsAsOptions(boolean isTabbed, String viewIdentifier) { + default Map getAvailableViewsAsOptions(String viewIdentifier) { int index = viewIdentifier.lastIndexOf("_configuration"); if (index > 0) { viewIdentifier = viewIdentifier.substring(0, index); } - return MenuItemViewType.findAllByIsTabbedAndParentIdentifier(isTabbed, viewIdentifier).stream() + return MenuItemViewType.findAllByParentIdentifier(viewIdentifier).stream() .collect(Collectors.toMap(MenuItemViewType::getIdentifier, MenuItemViewType::getName)); } diff --git a/src/main/java/com/netgrif/application/engine/workflow/web/WorkflowController.java b/src/main/java/com/netgrif/application/engine/workflow/web/WorkflowController.java index 095a6de4f8..8124725e2d 100644 --- a/src/main/java/com/netgrif/application/engine/workflow/web/WorkflowController.java +++ b/src/main/java/com/netgrif/application/engine/workflow/web/WorkflowController.java @@ -53,6 +53,7 @@ import java.net.URLDecoder; import java.nio.charset.StandardCharsets; import java.util.ArrayList; +import java.util.HashMap; import java.util.Locale; import java.util.Map; @@ -80,7 +81,10 @@ public class WorkflowController { public EntityModel createCase(@RequestBody CreateCaseBody body, Authentication auth, Locale locale) { LoggedUser loggedUser = (LoggedUser) auth.getPrincipal(); try { - CreateCaseEventOutcome outcome = workflowService.createCase(body.netId, body.title, body.color, loggedUser, locale); + if (body.params == null) { + body.params = new HashMap<>(); + } + CreateCaseEventOutcome outcome = workflowService.createCase(body.netId, body.title, body.color, loggedUser, locale, body.params); return EventOutcomeWithMessageResource.successMessage("Case with id " + outcome.getCase().getStringId() + " was created succesfully", LocalisedEventOutcomeFactory.from(outcome, locale)); } catch (Exception e) { // TODO: 5. 2. 2017 change to custom exception diff --git a/src/main/java/com/netgrif/application/engine/workflow/web/requestbodies/CreateCaseBody.java b/src/main/java/com/netgrif/application/engine/workflow/web/requestbodies/CreateCaseBody.java index e36e5678a8..2c82a3bae9 100644 --- a/src/main/java/com/netgrif/application/engine/workflow/web/requestbodies/CreateCaseBody.java +++ b/src/main/java/com/netgrif/application/engine/workflow/web/requestbodies/CreateCaseBody.java @@ -1,5 +1,8 @@ package com.netgrif.application.engine.workflow.web.requestbodies; +import java.util.HashMap; +import java.util.Map; + /** * Created by Milan on 4.2.2017. */ @@ -8,6 +11,7 @@ public class CreateCaseBody { public String title; public String netId; public String color; + public Map params = new HashMap<>(); public CreateCaseBody() { } diff --git a/src/main/resources/petriNets/engine-processes/menu/case_view_configuration.xml b/src/main/resources/petriNets/engine-processes/menu/case_view_configuration.xml index 57cb6d1f10..8e401ad957 100644 --- a/src/main/resources/petriNets/engine-processes/menu/case_view_configuration.xml +++ b/src/main/resources/petriNets/engine-processes/menu/case_view_configuration.xml @@ -226,6 +226,20 @@ sort + + case_headers_sort_mode_active + Active column for sorting + Example: meta-title + + + case_headers_sort_mode_direction + Default sort direction + + + + + desc + headers_options_holder @@ -248,21 +262,14 @@ <data type="stringCollection" immediate="true"> <id>case_default_headers</id> <title name="case_default_headers">Set default headers - Example: "meta-title", "meta-visualId" + Example: "meta-title", "myProcessIdentifier-myDataFieldId", ... view_configuration_type View type - menuItemService.getAvailableViewsAsOptions(true, useCase.processIdentifier) + menuItemService.getAvailableViewsAsOptions(useCase.processIdentifier) - - view_configuration_type: f.view_configuration_type; - - if (view_configuration_type.options == null || view_configuration_type.options.isEmpty()) { - change view_configuration_type options { menuItemService.getAvailableViewsAsOptions(true, useCase.processIdentifier) } - } - view_configuration_id @@ -357,7 +364,7 @@ Identifikátor ikony tlačidla "Nová inštancia" Náhľad ikony Predvolené hlavičky - Napríklad: "meta-title", "meta-visualId" + Napríklad: "meta-title", "myProcessIdentifier-myDataFieldId", ... Typ vyhľadávania prípadov Skryté Fulltext @@ -395,13 +402,18 @@ Zobrazenie po kliknutí na inštanciu Tlačidlo vytvorenia inštancie Hlavičky + Predvolený smer zoradenia + Vzostupne + Zostupne + Aktívny stĺpec pre zoradenie + Napríklad: meta-title Schaltflächentitel "Neuer Fall" Ikone ID Ikonevorschau Anzuzeigende Attributmenge auswählen - Beispiel: "meta-title", "meta-visualId" + Beispiel: "meta-title", "myProcessIdentifier-myDataFieldId", ... Versteckt Einfacher Suchmodus Sortieren @@ -426,11 +438,9 @@ Einstellungen Erlaube Export? Leerer Inhaltstext - Wenn dieses Feld leer ist, wird der Standardtext verwendet - + Wenn dieses Feld leer ist, wird der Standardtext verwendet Leeres Inhaltssymbol - Wenn dieses Feld leer ist, wird das Standardsymbol verwendet - + Wenn dieses Feld leer ist, wird das Standardsymbol verwendet Vorschau des leeren Inhaltssymbols Filter Verwenden Sie PFQL Query @@ -441,6 +451,11 @@ Ansicht nach dem Klicken auf die Instanz Schaltfläche zum Erstellen einer Instanz Kopfzeilen + Standard-Sortierrichtung + Aufsteigend + Absteigend + Aktive Spalte zum Sortieren + Beispiel: meta-title @@ -1042,6 +1057,38 @@ outline + + case_headers_sort_mode_active + + editable + required + + + 0 + 2 + 1 + 1 + 0 + + outline + + + + case_headers_sort_mode_direction + + editable + required + + + 1 + 2 + 1 + 1 + 0 + + outline + + assign @@ -1370,7 +1417,7 @@ - view_configuration_type + case_headers_sort_mode_active visible @@ -1384,7 +1431,7 @@ - view_configuration_all_data_form + case_headers_sort_mode_direction visible @@ -1398,7 +1445,7 @@ - case_allow_export + view_configuration_type visible @@ -1411,6 +1458,34 @@ outline + + view_configuration_all_data_form + + visible + + + 0 + 24 + 1 + 1 + + outline + + + + case_allow_export + + visible + + + 0 + 25 + 1 + 1 + + outline + + diff --git a/src/main/resources/petriNets/engine-processes/menu/menu_item.xml b/src/main/resources/petriNets/engine-processes/menu/menu_item.xml index aa52e26d39..12fb4c9775 100644 --- a/src/main/resources/petriNets/engine-processes/menu/menu_item.xml +++ b/src/main/resources/petriNets/engine-processes/menu/menu_item.xml @@ -40,6 +40,28 @@ + + menu_item_create + + + move_dest_uri: f.move_dest_uri; + + String destUriPath = params["dest_uri_path"] + if (destUriPath == null || destUriPath.isEmpty()) { + return + } + + try { + def splitDestPathAsList = splitUriPath(destUriPath) + if (splitDestPathAsList.size() > 1) { + change move_dest_uri value { splitDestPathAsList } + } + } catch (IllegalArgumentException ignore) { + log.error("Cannot move item on creation", ignore) + } + + + system @@ -235,18 +257,15 @@ </data> <data type="boolean" immediate="true"> - <id>hasChildren</id> + <id>is_folder</id> <title/> </data> <data type="button"> <id>duplicate_reset_childItemIds</id> <title/> <action trigger="set"> - hasChildren: f.hasChildren, childItemIds: f.childItemIds; - change childItemIds value { [] } - change hasChildren value { false } </action> </data> <data type="text" immediate="true"> @@ -522,16 +541,8 @@ <id>view_configuration_type</id> <title name="view_configuration_type">View type - menuItemService.getAvailableViewsAsOptions(true, true) + menuItemService.getPrimaryViewsAsOptions() - - use_tabbed_view: f.use_tabbed_view, - view_configuration_type: f.view_configuration_type; - - if (view_configuration_type.options == null || view_configuration_type.options.isEmpty()) { - change view_configuration_type options { menuItemService.getAvailableViewsAsOptions(use_tabbed_view.value, true) } - } - view_configuration_id @@ -925,9 +936,17 @@ moveDestUri: f.move_dest_uri; - String uriNodeId = elasticCaseService.findUriNodeId(useCase) - def node = uriService.findById(uriNodeId) - updateMultichoiceWithCurrentNode(moveDestUri, node) + def node + if (moveDestUri.value != null && !moveDestUri.value.isEmpty()) { + String uriPath = moveDestUri.value.join("/") + uriPath = uriPath.replace("//","/") + node = uriService.findByUri(uriPath) + change moveDestUri options { findOptionsBasedOnSelectedNode(node) } + } else { + String uriNodeId = elasticCaseService.findUriNodeId(useCase) + node = uriService.findById(uriNodeId) + updateMultichoiceWithCurrentNode(moveDestUri, node) + } @@ -974,6 +993,7 @@ newUri = newUri.replace("//","/") changeMenuItem useCase uri { newUri } + Frontend.reloadMenu() Create @@ -1231,6 +1251,7 @@ newUri = newUri.replace("//","/") changeMenuItem useCase uri { newUri } + Frontend.reloadMenu() Move @@ -1875,7 +1896,7 @@ - hasChildren + is_folder visible diff --git a/src/main/resources/petriNets/engine-processes/menu/tabbed_ticket_view_configuration.xml b/src/main/resources/petriNets/engine-processes/menu/tabbed_ticket_view_configuration.xml index 29fcb55068..d65d3b5e48 100644 --- a/src/main/resources/petriNets/engine-processes/menu/tabbed_ticket_view_configuration.xml +++ b/src/main/resources/petriNets/engine-processes/menu/tabbed_ticket_view_configuration.xml @@ -73,15 +73,8 @@ view_configuration_type View type - menuItemService.getAvailableViewsAsOptions(true, useCase.processIdentifier) + menuItemService.getAvailableViewsAsOptions(useCase.processIdentifier) - - view_configuration_type: f.view_configuration_type; - - if (view_configuration_type.options == null || view_configuration_type.options.isEmpty()) { - change view_configuration_type options { menuItemService.getAvailableViewsAsOptions(true, useCase.processIdentifier) } - } - view_configuration_id diff --git a/src/main/resources/petriNets/engine-processes/menu/task_view_configuration.xml b/src/main/resources/petriNets/engine-processes/menu/task_view_configuration.xml index 98133e4e75..bbb37cdf21 100644 --- a/src/main/resources/petriNets/engine-processes/menu/task_view_configuration.xml +++ b/src/main/resources/petriNets/engine-processes/menu/task_view_configuration.xml @@ -126,6 +126,20 @@ sort + + task_headers_sort_mode_active + Active column for sorting + Example: meta-title + + + task_headers_sort_mode_direction + Default sort direction + + + + + desc + headers_options_holder @@ -152,7 +166,7 @@ <data type="stringCollection" immediate="true"> <id>task_default_headers</id> <title name="task_default_headers">Set default headers - Example: "meta-title", "meta-user" + Example: "meta-title", "meta-caseTitle", ... task_show_more_menu @@ -233,7 +247,7 @@ Povoliť tabuľkový mód pre hlavičky? Použiť vlastné predvolené hlavičky? Predvolené hlavičky - Napríklad: "meta-title", "meta-user" + Napríklad: "meta-title", "meta-caseTitle", ... Zobrazovať menu pre úlohovú položku? Nastavenie položky Všeobecné @@ -249,6 +263,11 @@ Použi PFQL query Filter Hlavičky + Predvolený smer zoradenia + Vzostupne + Zostupne + Aktívny stĺpec pre zoradenie + Napríklad: meta-title Versteckt @@ -262,7 +281,7 @@ Erlaube Tabellenmodus? Eigene Kopfzeilen verwenden? Anzuzeigende Attributmenge auswählen - Beispiel: "meta-title", "meta-user" + Beispiel: "meta-title", "meta-caseTitle", ... Allgemein Einfacher und erweiterter Suchmodus Mit dem Basisfilter kombinieren, falls vorhanden? @@ -281,6 +300,11 @@ Verwenden Sie PFQL Query Filter Kopfzeilen + Standard-Sortierrichtung + Aufsteigend + Absteigend + Aktive Spalte zum Sortieren + Beispiel: meta-title @@ -676,6 +700,38 @@ outline + + task_headers_sort_mode_active + + editable + required + + + 0 + 2 + 1 + 1 + 0 + + outline + + + + task_headers_sort_mode_direction + + editable + required + + + 1 + 2 + 1 + 1 + 0 + + outline + + assign @@ -933,6 +989,34 @@ outline + + task_headers_sort_mode_active + + visible + + + 0 + 16 + 1 + 1 + + outline + + + + task_headers_sort_mode_direction + + visible + + + 0 + 17 + 1 + 1 + + outline + + diff --git a/src/test/java/com/netgrif/application/engine/menu/MenuItemServiceTest.java b/src/test/java/com/netgrif/application/engine/menu/MenuItemServiceTest.java index a6872e39c7..1f18dc3f42 100644 --- a/src/test/java/com/netgrif/application/engine/menu/MenuItemServiceTest.java +++ b/src/test/java/com/netgrif/application/engine/menu/MenuItemServiceTest.java @@ -3,24 +3,18 @@ import com.mongodb.client.MongoCollection; import com.netgrif.application.engine.TestHelper; import com.netgrif.application.engine.auth.service.interfaces.IUserService; -import com.netgrif.application.engine.elastic.service.interfaces.IElasticCaseService; import com.netgrif.application.engine.menu.domain.*; import com.netgrif.application.engine.menu.domain.configurations.*; -import com.netgrif.application.engine.menu.domain.templates.CustomViewTemplate; -import com.netgrif.application.engine.menu.domain.templates.SimpleTaskViewTemplate; -import com.netgrif.application.engine.menu.domain.templates.TabbedCaseViewTemplate; -import com.netgrif.application.engine.menu.domain.templates.Template; +import com.netgrif.application.engine.menu.domain.templates.*; import com.netgrif.application.engine.menu.service.MenuItemService; import com.netgrif.application.engine.menu.service.MenuItemTemplateHolder; import com.netgrif.application.engine.menu.utils.MenuItemUtils; -import com.netgrif.application.engine.petrinet.domain.DataGroup; import com.netgrif.application.engine.petrinet.domain.I18nString; import com.netgrif.application.engine.petrinet.domain.UriNode; import com.netgrif.application.engine.petrinet.domain.dataset.FieldType; import com.netgrif.application.engine.petrinet.domain.throwable.TransitionNotExecutableException; import com.netgrif.application.engine.petrinet.service.interfaces.IUriService; import com.netgrif.application.engine.startup.ImportHelper; -import com.netgrif.application.engine.startup.SuperCreator; import com.netgrif.application.engine.workflow.domain.Case; import com.netgrif.application.engine.workflow.domain.DataField; import com.netgrif.application.engine.workflow.domain.TaskPair; @@ -36,13 +30,10 @@ import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; -import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; -import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.junit.jupiter.SpringExtension; import java.util.List; -import java.util.Locale; import java.util.Map; import java.util.Optional; @@ -59,9 +50,6 @@ public class MenuItemServiceTest { @Autowired private MenuItemService menuItemService; - @Autowired - private SuperCreator superCreator; - @Autowired private MongoTemplate mongoTemplate; @@ -260,7 +248,7 @@ private void createAndAssertDetailed() throws TransitionNotExecutableException { UriNode testNode = uriService.findByUri("/netgrif"); UriNode netgrifNode = uriService.getRoot(); - Case rootFolder = findMenuItem(""); + Case rootFolder = findMenuItem("root"); assertNotNull(testFolder); assertNotNull(testNode); @@ -291,6 +279,11 @@ private void createAndAssertDetailed() throws TransitionNotExecutableException { List rootFolderChildIds = MenuItemUtils.getCaseIdsFromCaseRef(rootFolder, MenuItemConstants.FIELD_CHILD_ITEM_IDS); assertNotNull(rootFolderChildIds); assertTrue(rootFolderChildIds.contains(netgrifFolder.getStringId())); + + Optional bodyOpt = MenuItemTemplateHolder.get("simple_case_view", "/netgrif/test/new_menu_item", "someIdentifier"); + assertTrue(bodyOpt.isPresent()); + // cannot place item inside non-folder item + assertThrows(IllegalArgumentException.class, () -> menuItemService.createMenuItem(bodyOpt.get())); } @Test @@ -385,7 +378,7 @@ public void findFolderCaseTest() throws TransitionNotExecutableException { assertThrows(IllegalArgumentException.class, () -> menuItemService.findFolderCase(null)); assertNull(menuItemService.findFolderCase(new UriNode())); - Optional menuItemBodyOpt = MenuItemTemplateHolder.get(CustomViewTemplate.IDENTIFIER, "/folderik", "test"); + Optional menuItemBodyOpt = MenuItemTemplateHolder.get(FolderTemplate.IDENTIFIER, "/folderik", "test"); assertTrue(menuItemBodyOpt.isPresent()); Case createdMenuItemCase = menuItemService.createMenuItem(menuItemBodyOpt.get()); @@ -520,7 +513,7 @@ public void duplicateFolderItemTest() throws TransitionNotExecutableException { List duplicatedChildIds = MenuItemUtils.getCaseIdsFromCaseRef(duplicatedFolderCase, MenuItemConstants.FIELD_CHILD_ITEM_IDS); assertNotNull(duplicatedChildIds); assertEquals(0, duplicatedChildIds.size()); - assertFalse((Boolean) duplicatedFolderCase.getFieldValue(MenuItemConstants.FIELD_HAS_CHILDREN)); + assertTrue((Boolean) duplicatedFolderCase.getFieldValue(MenuItemConstants.FIELD_IS_FOLDER)); assertEquals(1, duplicatedFolderCase.getActivePlaces().get("initialized")); } @@ -595,19 +588,20 @@ public void removeChildItemFromParentTest() throws TransitionNotExecutableExcept assertNotNull(childrenCaseIds); assertEquals(1, childrenCaseIds.size()); assertTrue(childrenCaseIds.contains(testItemCase.getStringId())); - assertTrue((Boolean) folderikCase.getFieldValue(MenuItemConstants.FIELD_HAS_CHILDREN)); + assertTrue((Boolean) folderikCase.getFieldValue(MenuItemConstants.FIELD_IS_FOLDER)); folderikCase = menuItemService.removeChildItemFromParent(folderikCase.getStringId(), testItemCase); childrenCaseIds = MenuItemUtils.getCaseIdsFromCaseRef(folderikCase, MenuItemConstants.FIELD_CHILD_ITEM_IDS); assertNotNull(childrenCaseIds); assertEquals(0, childrenCaseIds.size()); - assertFalse((Boolean) folderikCase.getFieldValue(MenuItemConstants.FIELD_HAS_CHILDREN)); + assertTrue((Boolean) folderikCase.getFieldValue(MenuItemConstants.FIELD_IS_FOLDER)); } @Test @SuppressWarnings("unchecked") public void handleConfigurationTemplateTest() throws TransitionNotExecutableException { + // tabbed case view Case menuItemCase = workflowService.createCaseByIdentifier(MenuItemConstants.PROCESS_IDENTIFIER, "", "", userService.getSystem().transformToLoggedUser()).getCase(); @@ -622,6 +616,7 @@ public void handleConfigurationTemplateTest() throws TransitionNotExecutableExce assertTrue((Boolean) outcome.getMapping().get(MenuItemConstants.FIELD_USE_TABBED_VIEW)); assertFalse((Boolean) outcome.getMapping().get(MenuItemConstants.FIELD_USE_CUSTOM_VIEW)); + assertFalse((Boolean) outcome.getMapping().get(MenuItemConstants.FIELD_IS_FOLDER)); assertEquals(MenuItemViewType.CASE_VIEW.getIdentifier(), outcome.getMapping().get(MenuItemConstants.FIELD_VIEW_CONFIGURATION_TYPE)); List viewCaseIdAsList = (List) outcome.getMapping().get(MenuItemConstants.FIELD_VIEW_CONFIGURATION_ID); assertEquals(1, viewCaseIdAsList.size()); @@ -633,53 +628,65 @@ public void handleConfigurationTemplateTest() throws TransitionNotExecutableExce List viewAllFormTaskIdAsList = (List) outcome.getMapping().get(MenuItemConstants.FIELD_VIEW_CONFIGURATION_ALL_DATA_FORM); assertEquals(1, viewAllFormTaskIdAsList.size()); assertEquals(MenuItemUtils.findTaskIdInCase(viewCase, ViewConstants.TRANS_ALL_MENU_DATA_ID), viewAllFormTaskIdAsList.get(0)); + + // folder item + menuItemCase = workflowService.createCaseByIdentifier(MenuItemConstants.PROCESS_IDENTIFIER, "", "", + userService.getSystem().transformToLoggedUser()).getCase(); + + menuItemCase = dataService.setData(MenuItemUtils.findTaskIdInCase(menuItemCase, MenuItemConstants.TRANS_INIT_ID), + ImportHelper.populateDataset( + Map.of(MenuItemConstants.FIELD_CONFIGURATION_TEMPLATES, + Map.of("type", FieldType.ENUMERATION_MAP.getName(), "value", FolderTemplate.IDENTIFIER)) + ) + ).getCase(); + + outcome = menuItemService.handleConfigurationTemplate(menuItemCase); + assertFalse((Boolean) outcome.getMapping().get(MenuItemConstants.FIELD_USE_TABBED_VIEW)); + assertFalse((Boolean) outcome.getMapping().get(MenuItemConstants.FIELD_USE_CUSTOM_VIEW)); + assertTrue((Boolean) outcome.getMapping().get(MenuItemConstants.FIELD_IS_FOLDER)); + + // custom view + menuItemCase = workflowService.createCaseByIdentifier(MenuItemConstants.PROCESS_IDENTIFIER, "", "", + userService.getSystem().transformToLoggedUser()).getCase(); + + menuItemCase = dataService.setData(MenuItemUtils.findTaskIdInCase(menuItemCase, MenuItemConstants.TRANS_INIT_ID), + ImportHelper.populateDataset( + Map.of(MenuItemConstants.FIELD_CONFIGURATION_TEMPLATES, + Map.of("type", FieldType.ENUMERATION_MAP.getName(), "value", CustomViewTemplate.IDENTIFIER)) + ) + ).getCase(); + + outcome = menuItemService.handleConfigurationTemplate(menuItemCase); + assertFalse((Boolean) outcome.getMapping().get(MenuItemConstants.FIELD_USE_TABBED_VIEW)); + assertTrue((Boolean) outcome.getMapping().get(MenuItemConstants.FIELD_USE_CUSTOM_VIEW)); + assertFalse((Boolean) outcome.getMapping().get(MenuItemConstants.FIELD_IS_FOLDER)); } @Test - public void getAvailableViewsAsOptionsByIsPrimaryTest() { + public void getPrimaryViewsAsOptionsTest() { - Map options = menuItemService.getAvailableViewsAsOptions(true, true); + Map options = menuItemService.getPrimaryViewsAsOptions(); assertNotNull(options); assertEquals(4, options.size()); assertTrue(options.containsKey(MenuItemViewType.CASE_VIEW.getIdentifier())); assertTrue(options.containsKey(MenuItemViewType.TASK_VIEW.getIdentifier())); assertTrue(options.containsKey(MenuItemViewType.TABBED_TICKET_VIEW.getIdentifier())); assertTrue(options.containsKey(MenuItemViewType.SINGLE_TASK_VIEW.getIdentifier())); - - options = menuItemService.getAvailableViewsAsOptions(true, false); - assertNotNull(options); - assertEquals(0, options.size()); - - options = menuItemService.getAvailableViewsAsOptions(false, false); - assertNotNull(options); - assertEquals(0, options.size()); - - options = menuItemService.getAvailableViewsAsOptions(false, true); - assertNotNull(options); - assertEquals(3, options.size()); - assertTrue(options.containsKey(MenuItemViewType.CASE_VIEW.getIdentifier())); - assertTrue(options.containsKey(MenuItemViewType.TASK_VIEW.getIdentifier())); - assertTrue(options.containsKey(MenuItemViewType.SINGLE_TASK_VIEW.getIdentifier())); } @Test public void getAvailableViewsAsOptionsByViewIdentifierTest() { - Map options = menuItemService.getAvailableViewsAsOptions(true, MenuItemViewType.CASE_VIEW.getIdentifier()); + Map options = menuItemService.getAvailableViewsAsOptions(MenuItemViewType.CASE_VIEW.getIdentifier()); assertNotNull(options); assertEquals(1, options.size()); assertTrue(options.containsKey(MenuItemViewType.TASK_VIEW.getIdentifier())); - options = menuItemService.getAvailableViewsAsOptions(true, MenuItemViewType.TABBED_TICKET_VIEW.getIdentifier()); - assertNotNull(options); - assertEquals(1, options.size()); - assertTrue(options.containsKey(MenuItemViewType.SINGLE_TASK_VIEW.getIdentifier())); - - options = menuItemService.getAvailableViewsAsOptions(false, MenuItemViewType.TABBED_TICKET_VIEW.getIdentifier()); + options = menuItemService.getAvailableViewsAsOptions(MenuItemViewType.TABBED_TICKET_VIEW.getIdentifier()); assertNotNull(options); assertEquals(1, options.size()); assertTrue(options.containsKey(MenuItemViewType.SINGLE_TASK_VIEW.getIdentifier())); - options = menuItemService.getAvailableViewsAsOptions(true, MenuItemViewType.TASK_VIEW.getIdentifier()); + options = menuItemService.getAvailableViewsAsOptions(MenuItemViewType.TASK_VIEW.getIdentifier()); assertNotNull(options); assertEquals(0, options.size()); } @@ -721,32 +728,6 @@ void testRemoveMenuItem() throws TransitionNotExecutableException, InterruptedEx assertThrows(IllegalArgumentException.class, () -> workflowService.findOne(tabbedTaskViewId)); } - private Case createDefaultMenuItem(String identifier, I18nString name) throws TransitionNotExecutableException { - FilterBody filterBody = new FilterBody(); - filterBody.setQuery("processIdentifier:process1"); - filterBody.setType(FieldType.CASE_FILTER); - - CaseViewBody caseView = new CaseViewBody(); - caseView.setFilterBody(filterBody); - caseView.setRequireTitleInCreation(false); - caseView.setChainedView(new TaskViewBody()); - - MenuItemBody menuItemBody = new MenuItemBody(); - menuItemBody.setUri("/"); - menuItemBody.setIdentifier(identifier); - menuItemBody.setMenuIcon("home"); - menuItemBody.setMenuName(name); - menuItemBody.setTabIcon("folder"); - menuItemBody.setTabName(name); - menuItemBody.setView(caseView); - - return menuItemService.createMenuItem(menuItemBody); - } - - private void login() { - SecurityContextHolder.getContext().setAuthentication(new UsernamePasswordAuthenticationToken(superCreator.getLoggedSuper(), null)); - } - private String getTaskId(Case useCase, String transId) { return useCase.getTasks().stream() .filter((taskPair -> taskPair.getTransition().equals(transId)))