diff --git a/.github/workflows/release-drafter.yml b/.github/workflows/release-drafter.yml index 99bf6977255..4434bb469f8 100644 --- a/.github/workflows/release-drafter.yml +++ b/.github/workflows/release-drafter.yml @@ -6,6 +6,7 @@ on: - master pull_request: types: [opened, reopened, synchronize] + workflow_dispatch: permissions: contents: write diff --git a/AxonIvyPortal/PortalKitTestHelper/dataclasses/ch/ivy/addon/portalkit/showroom/ExtendedTask.d.json b/AxonIvyPortal/PortalKitTestHelper/dataclasses/ch/ivy/addon/portalkit/showroom/ExtendedTask.d.json deleted file mode 100644 index ce23ef56730..00000000000 --- a/AxonIvyPortal/PortalKitTestHelper/dataclasses/ch/ivy/addon/portalkit/showroom/ExtendedTask.d.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "$schema" : "https://json-schema.axonivy.com/data-class/12.0.0/data-class.json", - "simpleName" : "ExtendedTask", - "namespace" : "ch.ivy.addon.portalkit.showroom", - "isBusinessCaseData" : false, - "fields" : [ { - "name" : "iTask", - "type" : "ch.ivyteam.ivy.workflow.ITask", - "modifiers" : [ "PERSISTENT" ] - }, { - "name" : "taskId", - "type" : "Number", - "modifiers" : [ "PERSISTENT" ] - }, { - "name" : "caseId", - "type" : "Number", - "modifiers" : [ "PERSISTENT" ] - } ] -} \ No newline at end of file diff --git a/AxonIvyPortal/PortalKitTestHelper/dataclasses/portalKit_test/Data.d.json b/AxonIvyPortal/PortalKitTestHelper/dataclasses/portalKit_test/Data.d.json index 7588fffbc2c..3b8602647d0 100644 --- a/AxonIvyPortal/PortalKitTestHelper/dataclasses/portalKit_test/Data.d.json +++ b/AxonIvyPortal/PortalKitTestHelper/dataclasses/portalKit_test/Data.d.json @@ -4,10 +4,6 @@ "namespace" : "portalKit_test", "isBusinessCaseData" : false, "fields" : [ { - "name" : "iTask", - "type" : "ch.ivyteam.ivy.workflow.ITask", - "modifiers" : [ "PERSISTENT" ] - }, { "name" : "taskId", "type" : "Number", "modifiers" : [ "PERSISTENT" ] @@ -33,15 +29,13 @@ "modifiers" : [ "PERSISTENT" ] }, { "name" : "cases", - "type" : "List", - "modifiers" : [ "PERSISTENT" ] + "type" : "List" }, { "name" : "count", "type" : "Integer", "modifiers" : [ "PERSISTENT" ] }, { "name" : "workingCase", - "type" : "ch.ivyteam.ivy.workflow.ICase", - "modifiers" : [ "PERSISTENT" ] + "type" : "ch.ivyteam.ivy.workflow.ICase" } ] } \ No newline at end of file diff --git a/AxonIvyPortal/PortalKitTestHelper/pom.xml b/AxonIvyPortal/PortalKitTestHelper/pom.xml index c5b12aa3cfb..92f67094eef 100644 --- a/AxonIvyPortal/PortalKitTestHelper/pom.xml +++ b/AxonIvyPortal/PortalKitTestHelper/pom.xml @@ -8,7 +8,7 @@ iar 12.0.0 - 12.0.0-SNAPSHOT + 12.0.0 UTF-8 diff --git a/AxonIvyPortal/PortalKitTestHelper/src/ch/ivy/addon/portalkit/test/util/TaskUtils.java b/AxonIvyPortal/PortalKitTestHelper/src/ch/ivy/addon/portalkit/test/util/TaskUtils.java index 7f94965af72..429ce1816d6 100644 --- a/AxonIvyPortal/PortalKitTestHelper/src/ch/ivy/addon/portalkit/test/util/TaskUtils.java +++ b/AxonIvyPortal/PortalKitTestHelper/src/ch/ivy/addon/portalkit/test/util/TaskUtils.java @@ -1,83 +1,34 @@ package ch.ivy.addon.portalkit.test.util; -import java.util.ArrayList; import java.util.List; import ch.ivyteam.ivy.environment.Ivy; -import ch.ivyteam.ivy.persistence.IQueryResult; import ch.ivyteam.ivy.security.exec.Sudo; -import ch.ivyteam.ivy.workflow.CaseProperty; import ch.ivyteam.ivy.workflow.CaseState; import ch.ivyteam.ivy.workflow.ICase; -import ch.ivyteam.ivy.workflow.IPropertyFilter; import ch.ivyteam.ivy.workflow.ITask; -import ch.ivyteam.ivy.workflow.TaskProperty; -import ch.ivyteam.ivy.workflow.TaskState; +import ch.ivyteam.ivy.workflow.query.CaseQuery; import ch.ivyteam.ivy.workflow.query.TaskQuery; public class TaskUtils { - public static List destroyAllCase() { - try { - return Sudo.call(() -> { - try { - IPropertyFilter noFilter = null; - IQueryResult qr = Ivy.wf().findCases(noFilter, null, 0, -1, true); - List names = new ArrayList(); - for (ICase ivyCase : qr.getResultList()) { - try { - if (ivyCase.getState().intValue() != TaskState.DESTROYED.intValue() - && ivyCase.getState().intValue() != TaskState.DONE.intValue()) { - ivyCase.destroy(); - } - } catch (Exception e1) { - Ivy.log().error(e1); - } - } - return names; - } catch (Exception e2) { - Ivy.log().error(e2); - return null; - } - }); - } catch (Exception e) { - Ivy.log().error(e); + public static void destroyAllCase() throws Exception { + Sudo.call(() -> { + List result = Ivy.wf().getCaseQueryExecutor() + .getResults(CaseQuery.create().where().state().isNotIn(CaseState.DESTROYED, CaseState.DONE)); + for (ICase iCaze : result) { + iCaze.destroy(); + } return null; - } - } - - public static boolean resumeFirstTask() { - try { - Sudo.call(() -> { - try { - IPropertyFilter filter = null; - IQueryResult result = Ivy.wf().findTasks(filter, null, 0, -1, true); - List tasks = result.getResultList(); - for (ITask task : tasks) { - if (TaskState.SUSPENDED == task.getState()) { - Ivy.session().resumeTask(task.getId()); - break; - } - } - return true; - } catch (Exception e) { - return false; - } - }); - } catch (Exception e) { - return false; - } - return false; + }); } public static void deleteCompletedCases() throws Exception { Sudo.call(() -> { - IPropertyFilter noFilter = null; - IQueryResult qr = Ivy.wf().findCases(noFilter, null, 0, -1, true); - for (ICase ivyCase : qr.getResultList()) { - if (ivyCase.getState() == CaseState.DESTROYED || ivyCase.getState() == CaseState.DONE) { - Ivy.wf().deleteCompletedCase(ivyCase); - } + List result = Ivy.wf().getCaseQueryExecutor() + .getResults(CaseQuery.create().where().state().isIn(CaseState.DESTROYED, CaseState.DONE)); + for (ICase iCaze : result) { + Ivy.wf().deleteCompletedCase(iCaze); } return null; }); @@ -85,12 +36,10 @@ public static void deleteCompletedCases() throws Exception { public static void deleteDestroyedCases() throws Exception { Sudo.call(() -> { - IPropertyFilter noFilter = null; - IQueryResult qr = Ivy.wf().findCases(noFilter, null, 0, -1, true); - for (ICase ivyCase : qr.getResultList()) { - if (ivyCase.getState() == CaseState.DESTROYED) { - Ivy.wf().deleteCompletedCase(ivyCase); - } + List result = Ivy.wf().getCaseQueryExecutor() + .getResults(CaseQuery.create().where().state().isEqual(CaseState.DESTROYED)); + for (ICase iCaze : result) { + Ivy.wf().deleteCompletedCase(iCaze); } return null; }); @@ -98,8 +47,8 @@ public static void deleteDestroyedCases() throws Exception { public static void destroyTaskByCustomField(String customFieldName) throws Exception { Sudo.call(() -> { - ITask selectedTask = TaskQuery.create().where().customField() - .stringField(customFieldName).isNotNull().executor().firstResult(); + ITask selectedTask = + TaskQuery.create().where().customField().stringField(customFieldName).isNotNull().executor().firstResult(); if (selectedTask != null) { selectedTask.destroy(); selectedTask.customFields().stringField(customFieldName).delete(); diff --git a/AxonIvyPortal/PortalKitTestHelper/webContent/layouts/OneComponent.xhtml b/AxonIvyPortal/PortalKitTestHelper/webContent/layouts/OneComponent.xhtml index d3580d9ba05..38adbe5ed6c 100644 --- a/AxonIvyPortal/PortalKitTestHelper/webContent/layouts/OneComponent.xhtml +++ b/AxonIvyPortal/PortalKitTestHelper/webContent/layouts/OneComponent.xhtml @@ -9,7 +9,7 @@ - + Portalkit component diff --git a/AxonIvyPortal/PortalKitTestHelper/webContent/layouts/basic.xhtml b/AxonIvyPortal/PortalKitTestHelper/webContent/layouts/basic.xhtml index cf13511b499..997d46a3fab 100644 --- a/AxonIvyPortal/PortalKitTestHelper/webContent/layouts/basic.xhtml +++ b/AxonIvyPortal/PortalKitTestHelper/webContent/layouts/basic.xhtml @@ -14,7 +14,7 @@ - + <ui:insert name="title">Axon Ivy Portal</ui:insert> diff --git a/AxonIvyPortal/portal-components/pom.xml b/AxonIvyPortal/portal-components/pom.xml index 50204f3e8b6..21011bc121d 100644 --- a/AxonIvyPortal/portal-components/pom.xml +++ b/AxonIvyPortal/portal-components/pom.xml @@ -17,7 +17,7 @@ 12.0.0 - 12.0.0-SNAPSHOT + 12.0.0 UTF-8 diff --git a/AxonIvyPortal/portal-components/src/com/axonivy/portal/components/bean/ProcessViewerBean.java b/AxonIvyPortal/portal-components/src/com/axonivy/portal/components/bean/ProcessViewerBean.java index 3b31d0be6c9..4a59964f6d2 100644 --- a/AxonIvyPortal/portal-components/src/com/axonivy/portal/components/bean/ProcessViewerBean.java +++ b/AxonIvyPortal/portal-components/src/com/axonivy/portal/components/bean/ProcessViewerBean.java @@ -11,7 +11,7 @@ public class ProcessViewerBean implements Serializable { private static final long serialVersionUID = 3619473738758338192L; - public static String getProcessTypeDisplayName(String processType) { + public String getProcessTypeDisplayName(String processType) { ProcessType type = ProcessType.typeOf(processType); return type != null ? type.getLabel() : processType; } diff --git a/AxonIvyPortal/portal-components/src_hd/com/axonivy/portal/components/DocumentTable/DocumentTableData.d.json b/AxonIvyPortal/portal-components/src_hd/com/axonivy/portal/components/DocumentTable/DocumentTableData.d.json index cd83a1a8746..2f38a35f3b0 100644 --- a/AxonIvyPortal/portal-components/src_hd/com/axonivy/portal/components/DocumentTable/DocumentTableData.d.json +++ b/AxonIvyPortal/portal-components/src_hd/com/axonivy/portal/components/DocumentTable/DocumentTableData.d.json @@ -5,20 +5,17 @@ "isBusinessCaseData" : false, "fields" : [ { "name" : "documents", - "type" : "java.util.List", - "modifiers" : [ "PERSISTENT" ] + "type" : "java.util.List" }, { "name" : "event", - "type" : "org.primefaces.event.FileUploadEvent", - "modifiers" : [ "PERSISTENT" ] + "type" : "org.primefaces.event.FileUploadEvent" }, { "name" : "fileLimit", "type" : "Integer", "modifiers" : [ "PERSISTENT" ] }, { "name" : "ivyCase", - "type" : "ch.ivyteam.ivy.workflow.ICase", - "modifiers" : [ "PERSISTENT" ] + "type" : "ch.ivyteam.ivy.workflow.ICase" }, { "name" : "message", "type" : "String", @@ -29,28 +26,23 @@ "modifiers" : [ "PERSISTENT" ] }, { "name" : "selectedDocument", - "type" : "com.axonivy.portal.components.ivydata.bo.IvyDocument", - "modifiers" : [ "PERSISTENT" ] + "type" : "com.axonivy.portal.components.ivydata.bo.IvyDocument" }, { "name" : "streamedContent", - "type" : "org.primefaces.model.StreamedContent", - "modifiers" : [ "PERSISTENT" ] + "type" : "org.primefaces.model.StreamedContent" }, { "name" : "typeColumnRendered", "type" : "Boolean", "modifiers" : [ "PERSISTENT" ] }, { "name" : "typeSelection", - "type" : "com.axonivy.portal.components.enums.DocumentType", - "modifiers" : [ "PERSISTENT" ] + "type" : "com.axonivy.portal.components.enums.DocumentType" }, { "name" : "uploadDocumentCheckStatus", - "type" : "com.axonivy.portal.components.enums.UploadDocumentCheckStatus", - "modifiers" : [ "PERSISTENT" ] + "type" : "com.axonivy.portal.components.enums.UploadDocumentCheckStatus" }, { "name" : "uploadedDocument", - "type" : "ch.ivyteam.ivy.workflow.document.IDocument", - "modifiers" : [ "PERSISTENT" ] + "type" : "ch.ivyteam.ivy.workflow.document.IDocument" }, { "name" : "enableVirusScannerForUploadedDocument", "type" : "Boolean", diff --git a/AxonIvyPortal/portal-components/src_hd/com/axonivy/portal/components/ProcessHistory/ProcessHistoryData.d.json b/AxonIvyPortal/portal-components/src_hd/com/axonivy/portal/components/ProcessHistory/ProcessHistoryData.d.json index 2fad25644fb..2ffc678cb44 100644 --- a/AxonIvyPortal/portal-components/src_hd/com/axonivy/portal/components/ProcessHistory/ProcessHistoryData.d.json +++ b/AxonIvyPortal/portal-components/src_hd/com/axonivy/portal/components/ProcessHistory/ProcessHistoryData.d.json @@ -9,8 +9,7 @@ "modifiers" : [ "PERSISTENT" ] }, { "name" : "caze", - "type" : "ch.ivyteam.ivy.workflow.ICase", - "modifiers" : [ "PERSISTENT" ] + "type" : "ch.ivyteam.ivy.workflow.ICase" }, { "name" : "isOpenInFrame", "type" : "Boolean", diff --git a/AxonIvyPortal/portal-components/src_hd/com/axonivy/portal/components/ProcessViewer/ProcessViewerData.d.json b/AxonIvyPortal/portal-components/src_hd/com/axonivy/portal/components/ProcessViewer/ProcessViewerData.d.json index 6f496d1e01a..0dccd670df1 100644 --- a/AxonIvyPortal/portal-components/src_hd/com/axonivy/portal/components/ProcessViewer/ProcessViewerData.d.json +++ b/AxonIvyPortal/portal-components/src_hd/com/axonivy/portal/components/ProcessViewer/ProcessViewerData.d.json @@ -21,20 +21,17 @@ "modifiers" : [ "PERSISTENT" ] }, { "name" : "webStartable", - "type" : "ch.ivyteam.ivy.workflow.start.IWebStartable", - "modifiers" : [ "PERSISTENT" ] + "type" : "ch.ivyteam.ivy.workflow.start.IWebStartable" }, { "name" : "webLink", - "type" : "ch.ivyteam.ivy.model.value.WebLink", - "modifiers" : [ "PERSISTENT" ] + "type" : "ch.ivyteam.ivy.model.value.WebLink" }, { "name" : "activatorName", "type" : "String", "modifiers" : [ "PERSISTENT" ] }, { "name" : "activator", - "type" : "ch.ivyteam.ivy.security.ISecurityMember", - "modifiers" : [ "PERSISTENT" ] + "type" : "ch.ivyteam.ivy.security.ISecurityMember" }, { "name" : "category", "type" : "String", diff --git a/AxonIvyPortal/portal-migration/pom.xml b/AxonIvyPortal/portal-migration/pom.xml index 4513cb0fae4..a0353fc56c4 100644 --- a/AxonIvyPortal/portal-migration/pom.xml +++ b/AxonIvyPortal/portal-migration/pom.xml @@ -7,7 +7,7 @@ iar 12.0.0 - 12.0.0-SNAPSHOT + 12.0.0 diff --git a/AxonIvyPortal/portal-selenium-test/customized_pom.xml b/AxonIvyPortal/portal-selenium-test/customized_pom.xml index 2de832b8e7e..70d06c19157 100644 --- a/AxonIvyPortal/portal-selenium-test/customized_pom.xml +++ b/AxonIvyPortal/portal-selenium-test/customized_pom.xml @@ -6,7 +6,7 @@ 9.1.0.0-SNAPSHOT iar - 12.0.0-SNAPSHOT + 12.0.0 12.0.0 UTF-8 diff --git a/AxonIvyPortal/portal-selenium-test/document_screenshot_pom.xml b/AxonIvyPortal/portal-selenium-test/document_screenshot_pom.xml index abc189a43f3..64fdb25fbfd 100644 --- a/AxonIvyPortal/portal-selenium-test/document_screenshot_pom.xml +++ b/AxonIvyPortal/portal-selenium-test/document_screenshot_pom.xml @@ -6,7 +6,7 @@ 9.1.0.0-SNAPSHOT pom - 12.0.0-SNAPSHOT + 12.0.0 12.0.0 UTF-8 diff --git a/AxonIvyPortal/portal-selenium-test/jmeter/portal_walkthrough_testplan.jmx b/AxonIvyPortal/portal-selenium-test/jmeter/portal_walkthrough_testplan.jmx index 2cca9533399..b8279fee7d0 100644 --- a/AxonIvyPortal/portal-selenium-test/jmeter/portal_walkthrough_testplan.jmx +++ b/AxonIvyPortal/portal-selenium-test/jmeter/portal_walkthrough_testplan.jmx @@ -1421,6 +1421,90 @@ + + + + + true + true + = + true + javax.faces.partial.ajax + + + true + case-default_case_list_dashboard_case_1:case-component:rcLoadCaseFirstTime + = + true + javax.faces.source + + + true + case-default_case_list_dashboard_case_1:case-component:rcLoadCaseFirstTime + = + true + javax.faces.partial.execute + + + true + case-default_case_list_dashboard_case_1:case-component:dashboard-cases-container + = + true + javax.faces.partial.render + + + true + case-default_case_list_dashboard_case_1:case-component:rcLoadCaseFirstTime + = + true + case-default_case_list_dashboard_case_1:case-component:rcLoadCaseFirstTime + + + true + 1 + = + true + portal-breadcrumb:breadcrumb-form_SUBMIT + + + true + ${viewState} + = + true + javax.faces.ViewState + + + + + + + + ${url} + POST + true + false + true + false + + + + + + + + 200 + + + Assertion.response_code + false + 8 + + + + ${__P(portal.duration.normal)} + + + diff --git a/AxonIvyPortal/portal-selenium-test/pom.xml b/AxonIvyPortal/portal-selenium-test/pom.xml index 1ce49824f8c..0d9279096db 100644 --- a/AxonIvyPortal/portal-selenium-test/pom.xml +++ b/AxonIvyPortal/portal-selenium-test/pom.xml @@ -8,7 +8,7 @@ iar 12.0.0 - 12.0.0-SNAPSHOT + 12.0.0 UTF-8 diff --git a/AxonIvyPortal/portal-selenium-test/resources/js/document-screenshot.js b/AxonIvyPortal/portal-selenium-test/resources/js/document-screenshot.js index 21a68240535..8e9b4caacee 100644 --- a/AxonIvyPortal/portal-selenium-test/resources/js/document-screenshot.js +++ b/AxonIvyPortal/portal-selenium-test/resources/js/document-screenshot.js @@ -141,8 +141,8 @@ function highlightAddExternalDialogItem() { var icon = $("[id$='add-external-link-form:external-link-icon:awesome-icon-selection']"); appendStepAnnotation(icon, "9", -10, icon.width()); - var uploadButton = $("[id$='add-external-link-form:external-link-image-upload']"); - appendStepAnnotation(uploadButton, "10", 0, 80); + var uploadImage = $("[id$='add-external-link-form:external-link-image-label']"); + appendStepAnnotation(uploadImage, "10", 0, 40); var addButton = $("[id$='process-widget:adding-new-external-link-command']"); appendStepAnnotation(addButton, "11", -25, -5); @@ -159,6 +159,10 @@ function highlightProcessItems() { createRedMediumOutline($('[id$="process-widget:process-view-mode:view-mode-selection"]')); appendStepAnnotation($("[id$='process-widget:process-view-mode:view-mode-selection'] div[class$='ui-state-active']"), "3", -10, -40); + + var processActions = $('[id$="image-process-action-component:process-action-button"]').eq(0); + createRedMediumOutline(processActions); + appendStepAnnotation(processActions, "4", -5, processActions.width() - 80); } function highlightEditProcessIcon() { @@ -518,14 +522,18 @@ function highlightAndNumberingTaskTemplate() { appendStepAnnotation(other, "3", 27, -20); } -function highlightNotificationFullPageIcon(){ - var icon = $("#notification-full-page"); - icon.addClass("red-medium-border"); -} - function highlightNotificationIcon(){ var icon = $("#open-notifications-panel"); icon.addClass("red-medium-border"); + appendStepAnnotation(icon, "1", 20, -20); + + var moreOptionsIcon = $("button[id$=':notification-more-option_button']"); + icon.addClass("red-medium-border"); + appendStepAnnotation(moreOptionsIcon, "2", 20, -20); + + var fullPageOption = $("a[id$=':notification-full-page']"); + icon.addClass("red-medium-border"); + appendStepAnnotation(fullPageOption, "3", 20, -20); } function highlightMobileApp() { diff --git a/AxonIvyPortal/portal-selenium-test/src_test/com/axonivy/portal/selenium/common/BaseTest.java b/AxonIvyPortal/portal-selenium-test/src_test/com/axonivy/portal/selenium/common/BaseTest.java index 5ef65dcfb78..0e64c67bcde 100644 --- a/AxonIvyPortal/portal-selenium-test/src_test/com/axonivy/portal/selenium/common/BaseTest.java +++ b/AxonIvyPortal/portal-selenium-test/src_test/com/axonivy/portal/selenium/common/BaseTest.java @@ -154,6 +154,7 @@ public void tearDown() { protected String createDataFinishedDate = "portalKitTestHelper/18B031C59C3C7814/CreateDataForFinishedDate.ivp"; protected String grantCaseReadAllOwnRoleInvolvedPermission = "PortalKitTestHelper/14DE09882B540AD5/grantCaseReadAllOwnRoleInvolvedPermission.ivp"; protected String denyCaseReadAllOwnRoleInvolvedPermission = "PortalKitTestHelper/14DE09882B540AD5/denyCaseReadAllOwnRoleInvolvedPermission.ivp"; + protected String multipleOwnersUrl = "InternalSupport/16A68510A341BE6E/multipleOwners.ivp"; protected void redirectToNewDashBoard() { open(EngineUrl.createProcessUrl(PORTAL_HOME_PAGE_URL)); diff --git a/AxonIvyPortal/portal-selenium-test/src_test/com/axonivy/portal/selenium/document/screenshot/DashboardConfigurationScreenshotTest.java b/AxonIvyPortal/portal-selenium-test/src_test/com/axonivy/portal/selenium/document/screenshot/DashboardConfigurationScreenshotTest.java index 086860653da..d99b1c58e24 100644 --- a/AxonIvyPortal/portal-selenium-test/src_test/com/axonivy/portal/selenium/document/screenshot/DashboardConfigurationScreenshotTest.java +++ b/AxonIvyPortal/portal-selenium-test/src_test/com/axonivy/portal/selenium/document/screenshot/DashboardConfigurationScreenshotTest.java @@ -49,7 +49,7 @@ public void screenshotDashboardConfigurationUserGuide() throws IOException { ScreenshotUtils.DASHBOARD_CONFIGURATION_FOLDER + "dashboard-multi-language-dialog", new ScreenshotMargin(10)); dashboardConfigurationPage.cancelMultiLanguageDialog(); dashboardConfigurationPage.cancelCreateDashboard(); - ScreenshotUtils.captureElementWithMarginOptionScreenshot(dashboardConfigurationPage.getDashboardConfigurationPage(), + ScreenshotUtils.captureElementWithMarginOptionScreenshot(dashboardConfigurationPage.getDashboardConfigurationPageWithActionsMenu(), ScreenshotUtils.DASHBOARD_CONFIGURATION_FOLDER + "edit-private-dashboards", new ScreenshotMargin(10)); ScreenshotUtils.captureElementWithMarginOptionScreenshot(dashboardConfigurationPage.getDashboardConfigurationPage(), ScreenshotUtils.DASHBOARD_CONFIGURATION_FOLDER + "reorder-your-dashboards", new ScreenshotMargin(10)); @@ -61,28 +61,44 @@ public void screenshotDashboardConfigurationUserGuide() throws IOException { ScreenshotUtils.DASHBOARD_CONFIGURATION_FOLDER + "create-public-dashboard-dialog", new ScreenshotMargin(10)); dashboardConfigurationPage.cancelCreateDashboard(); dashboardConfigurationPage.openEditPublicDashboardsPage(); - ScreenshotUtils.captureElementWithMarginOptionScreenshot(dashboardConfigurationPage.getDashboardConfigurationPage(), + ScreenshotUtils.captureElementWithMarginOptionScreenshot(dashboardConfigurationPage.getDashboardConfigurationPageWithActionsMenu(), ScreenshotUtils.DASHBOARD_CONFIGURATION_FOLDER + "edit-public-dashboards", new ScreenshotMargin(10)); ScreenshotUtils.captureElementWithMarginOptionScreenshot(dashboardConfigurationPage.getDashboardConfigurationPage(), ScreenshotUtils.DASHBOARD_CONFIGURATION_FOLDER + "reorder-public-dashboards", new ScreenshotMargin(10)); dashboardConfigurationPage.openCreatePublicDashboardMenu(); - ScreenshotUtils.captureElementWithMarginOptionScreenshot(dashboardConfigurationPage.getDashboardTemplates(), - ScreenshotUtils.DASHBOARD_CONFIGURATION_FOLDER + "dashboard-templates", new ScreenshotMargin(10)); + ScreenshotUtils.captureElementScreenshot(dashboardConfigurationPage.getDashboardTemplates(), + ScreenshotUtils.DASHBOARD_CONFIGURATION_FOLDER + "dashboard-templates"); // screenshot highlight for accessibility template ScreenshotUtils.resizeBrowser(new Dimension(1920, 1080)); ScreenshotUtils.executeDecorateJs("createBlackMediumOutline($($('.dashboard-action-container')[4]));"); ScreenshotUtils.captureElementWithMarginOptionScreenshot(dashboardConfigurationPage.getDashboardTemplates(), ScreenshotUtils.ACCESSIBILITY_DASHBOARD_FOLDER + "accessibility-dashboard-creation", new ScreenshotMargin(10)); - dashboardConfigurationPage.openImportPublicDashboards(); - ScreenshotUtils.captureElementWithMarginOptionScreenshot(dashboardConfigurationPage.getImportDialog(), - ScreenshotUtils.DASHBOARD_CONFIGURATION_FOLDER + "import-public-dashboard-dialog", new ScreenshotMargin(10)); - dashboardConfigurationPage.cancelImportDashboard(); - dashboardConfigurationPage.openImportPrivateDashboards(); - ScreenshotUtils.captureElementWithMarginOptionScreenshot(dashboardConfigurationPage.getImportDialog(), - ScreenshotUtils.DASHBOARD_CONFIGURATION_FOLDER + "import-private-dashboard-dialog", new ScreenshotMargin(10)); - dashboardConfigurationPage.cancelImportDashboard(); + dashboardConfigurationPage.closeAddDashboardDialog(); dashboardConfigurationPage.openEditPublicDashboardsPage(); ScreenshotUtils.captureElementWithMarginOptionScreenshot(dashboardConfigurationPage.getShareDashboardDialog(), ScreenshotUtils.DASHBOARD_CONFIGURATION_FOLDER + "share-dashboard-dialog", new ScreenshotMargin(10)); } + + @Test + public void screenshotImportPublicDashboard() throws IOException { + showNewDashboard(); + newDashboardPage = new NewDashboardPage(); + DashboardConfigurationPage dashboardConfigurationPage = newDashboardPage.openDashboardConfigurationPage(); + dashboardConfigurationPage.openCreatePublicDashboardMenu(); + dashboardConfigurationPage.openImportPublicDashboards(); + ScreenshotUtils.resizeBrowser(new Dimension(1920, 1080)); + ScreenshotUtils.captureElementScreenshot(dashboardConfigurationPage.getImportDialog(), + ScreenshotUtils.DASHBOARD_CONFIGURATION_FOLDER + "import-public-dashboard-dialog"); + } + + @Test + public void screenshotImportPrivateDashboard() throws IOException { + showNewDashboard(); + newDashboardPage = new NewDashboardPage(); + DashboardConfigurationPage dashboardConfigurationPage = newDashboardPage.openDashboardConfigurationPage(); + dashboardConfigurationPage.openImportPrivateDashboards(); + ScreenshotUtils.resizeBrowser(new Dimension(1920, 1080)); + ScreenshotUtils.captureElementScreenshot(dashboardConfigurationPage.getImportDialog(), + ScreenshotUtils.DASHBOARD_CONFIGURATION_FOLDER + "import-private-dashboard-dialog"); + } } diff --git a/AxonIvyPortal/portal-selenium-test/src_test/com/axonivy/portal/selenium/document/screenshot/DashboardScreenshotTest.java b/AxonIvyPortal/portal-selenium-test/src_test/com/axonivy/portal/selenium/document/screenshot/DashboardScreenshotTest.java index b668dfc7083..2d673f25df7 100644 --- a/AxonIvyPortal/portal-selenium-test/src_test/com/axonivy/portal/selenium/document/screenshot/DashboardScreenshotTest.java +++ b/AxonIvyPortal/portal-selenium-test/src_test/com/axonivy/portal/selenium/document/screenshot/DashboardScreenshotTest.java @@ -1,5 +1,8 @@ package com.axonivy.portal.selenium.document.screenshot; +import static com.codeborne.selenide.CollectionCondition.sizeGreaterThanOrEqual; +import static com.codeborne.selenide.Selenide.$; + import java.io.IOException; import java.util.Arrays; @@ -40,8 +43,6 @@ import com.codeborne.selenide.CollectionCondition; import com.codeborne.selenide.Condition; import com.codeborne.selenide.SelenideElement; -import static com.codeborne.selenide.CollectionCondition.sizeGreaterThanOrEqual; -import static com.codeborne.selenide.Selenide.$; import ch.ivy.addon.portalkit.enums.PortalVariable; @@ -205,6 +206,17 @@ public void screenshotNewDashboardUserGuide() throws IOException { detailsEditPage.waitForCaseWidgetLoaded(); ScreenshotUtils.capturePageScreenshot(ScreenshotUtils.NEW_DASHBOARD_FOLDER + "edit-widget"); + // Take screenshot of task widget table in edit mode + NewDashboardPage newDashboardPage = new NewDashboardPage(); + ScreenshotUtils.captureElementScreenshot( + newDashboardPage.getTaskWidgetTable(), + ScreenshotUtils.NEW_DASHBOARD_FOLDER + "task-list-widget-edit-mode"); + + // Take screenshot of case widget table in edit mode + ScreenshotUtils.captureElementScreenshot( + newDashboardPage.getCaseWidgetTable(), + ScreenshotUtils.NEW_DASHBOARD_FOLDER + "case-list-widget-edit-mode"); + // Take screenshot of Add new widget dialog WebElement newWidgetDialog = detailsEditPage.addWidget(); ScreenshotUtils.captureElementWithMarginOptionScreenshot(newWidgetDialog, @@ -220,8 +232,7 @@ public void screenshotNewDashboardUserGuide() throws IOException { taskConfigurationPage.cancelMultiLanguageDialogWhenAddWidget(); taskConfigurationPage.openFilter(); taskConfigurationPage.addFilter("name", FilterOperator.EMPTY); - ScreenshotUtils.captureElementScreenshot(taskConfigurationPage.getConfigurationFilter(), - ScreenshotUtils.NEW_DASHBOARD_FOLDER + "task-list-widget-configuration"); + ScreenshotUtils.resizeBrowserAndCaptureWholeScreen(ScreenshotUtils.NEW_DASHBOARD_FOLDER + "task-list-widget-configuration", new Dimension(1366, 768)); taskConfigurationPage.closeFilter(); WebElement columnManagementDialog = taskConfigurationPage.openColumnManagementDialog(); ScreenshotUtils.captureElementScreenshot(columnManagementDialog, @@ -246,8 +257,7 @@ public void screenshotNewDashboardUserGuide() throws IOException { ComplexFilterHelper.addFilter("Creator", FilterOperator.CURRENT_USER); ComplexFilterHelper.addFilter("Name", FilterOperator.CONTAINS); ComplexFilterHelper.inputValueOnLatestFilter(FilterValueType.TEXT, "Leave", "Request"); - ScreenshotUtils.captureElementWithMarginOptionScreenshot(caseConfigurationPage.getConfigurationFilter(), - ScreenshotUtils.NEW_DASHBOARD_FOLDER + "case-list-widget-configuration", new ScreenshotMargin(20)); + ScreenshotUtils.resizeBrowserAndCaptureWholeScreen(ScreenshotUtils.NEW_DASHBOARD_FOLDER + "case-list-widget-configuration", new Dimension(1366, 768)); caseConfigurationPage.closeFilter(); ScreenshotUtils.captureElementWithMarginOptionScreenshot(caseConfigurationPage.openColumnManagementDialog(), ScreenshotUtils.NEW_DASHBOARD_FOLDER + "case-list-widget-table-configuration", new ScreenshotMargin(20)); @@ -424,19 +434,11 @@ public void screenshotComplexFilter() throws IOException { ScreenshotUtils.executeDecorateJs("removeHighlightShowFilterButton();"); resizeBrowserTo2kResolution(); caseConfig.openColumnManagementDialog(); - caseConfig.addCustomColumnByName("InvoiceQualityNumber"); + caseConfig.addCustomColumnByName("AccountNumber"); caseConfig.saveColumn(); caseConfig.waitPreviewTableLoaded(); caseConfig.openFilter(); caseConfig.addFilter("Creator", FilterOperator.CURRENT_USER); - caseConfig.addFilter("Name", FilterOperator.CONTAINS); - caseConfig.inputValueOnLatestFilter(FilterValueType.TEXT, "Ticket", "Request"); - - caseConfig.addFilter("State", null); - caseConfig.inputValueOnLatestFilter(FilterValueType.STATE_TYPE, "OPEN", "DONE"); - - caseConfig.addFilter("Invoice quality number", FilterOperator.BETWEEN); - caseConfig.inputValueOnLatestFilter(FilterValueType.NUMBER_BETWEEN, 1, 40); caseConfig.closeFilter(); caseConfig.save(); @@ -445,6 +447,14 @@ public void screenshotComplexFilter() throws IOException { homePage = new NewDashboardPage(); caseWidget = homePage.selectCaseWidget("Your Cases"); caseWidget.openFilterWidget(); + caseWidget.addFilter("Name", FilterOperator.CONTAINS); + caseWidget.inputValueOnLatestFilter(FilterValueType.TEXT, "Ticket", "Request"); + + caseWidget.addFilter("State", null); + caseWidget.inputValueOnLatestFilter(FilterValueType.STATE_TYPE, "OPEN", "DONE"); + + caseWidget.addFilter("Account Number", FilterOperator.EQUAL); + caseWidget.inputValueOnLatestFilter(FilterValueType.NUMBER, 40); caseWidget.addFilter("Created Date", FilterOperator.WITHIN_LAST); caseWidget.inputValueOnLatestFilter(FilterValueType.WITHIN, "2", "Year(s)"); @@ -503,9 +513,9 @@ public void screenshotSaveWidgetFilter() throws IOException { homePage.closeManageFilterDialog(); caseWidget.openFilterWidget(); homePage.clickOnManageFilterLink(); - + homePage.waitForPageLoad(); ScreenshotUtils.captureElementScreenshot(homePage.getManageFilterDialog(), - ScreenshotUtils.NEW_DASHBOARD_FOLDER + "widget-filter-management"); //#delete-saved-filter-form\:quick-filter-table > div.ui-datatable-scrollable-body + ScreenshotUtils.NEW_DASHBOARD_FOLDER + "widget-filter-management"); //#delete-saved-filter-form\:quick-filter-table > div.ui-datatable-scrollable-body } @Test @@ -524,8 +534,8 @@ public void screenshotFilterExample() throws IOException { caseWidget.addFilter("Created Date", FilterOperator.TODAY); caseWidget.removeFocusFilterDialog(); - ScreenshotUtils.captureElementWithMarginOptionScreenshot(caseWidget.getConfigurationFilter(), - ScreenshotUtils.NEW_DASHBOARD_FOLDER + "complex-filter-example", new ScreenshotMargin(10)); + ScreenshotUtils.captureElementScreenshot(caseWidget.getConfigurationFilter(), + ScreenshotUtils.NEW_DASHBOARD_FOLDER + "complex-filter-example"); } @Test diff --git a/AxonIvyPortal/portal-selenium-test/src_test/com/axonivy/portal/selenium/document/screenshot/NotificationScreenshotTest.java b/AxonIvyPortal/portal-selenium-test/src_test/com/axonivy/portal/selenium/document/screenshot/NotificationScreenshotTest.java index 8a3a89a3ad8..bf691fdb3a8 100644 --- a/AxonIvyPortal/portal-selenium-test/src_test/com/axonivy/portal/selenium/document/screenshot/NotificationScreenshotTest.java +++ b/AxonIvyPortal/portal-selenium-test/src_test/com/axonivy/portal/selenium/document/screenshot/NotificationScreenshotTest.java @@ -30,13 +30,11 @@ public void screenshotNotification() throws IOException{ NotificationCompactPage notificationPanel = homePage.openNotificationPanel(); ScreenshotUtils.resizeBrowser(new Dimension(1400, 700)); - ScreenshotUtils.executeDecorateJs("highlightNotificationIcon()"); - ScreenshotUtils.captureHalfRightPageScreenShot(ScreenshotUtils.NOTIFICATION_FOLDER + "notification-panel"); - - ScreenshotUtils.resizeBrowser(new Dimension(1400, 700)); - ScreenshotUtils.executeDecorateJs("highlightNotificationFullPageIcon()"); - ScreenshotUtils.captureHalfRightPageScreenShot(ScreenshotUtils.NOTIFICATION_FOLDER + "notification-link-to-full-page"); + notificationPanel.openNotificationMoreActionsMenu(); + ScreenshotUtils.executeDecorateJs("highlightNotificationIcon()"); + ScreenshotUtils.captureHalfRightPageScreenShot(ScreenshotUtils.NOTIFICATION_FOLDER + "notification-panel"); + ScreenshotUtils.resizeBrowser(new Dimension(1400, 1000)); notificationPanel.openNotificationFullPage(); ScreenshotUtils.capturePageScreenshot(ScreenshotUtils.NOTIFICATION_FOLDER + "notification-full-page"); diff --git a/AxonIvyPortal/portal-selenium-test/src_test/com/axonivy/portal/selenium/document/screenshot/PortalCasesScreenshotTest.java b/AxonIvyPortal/portal-selenium-test/src_test/com/axonivy/portal/selenium/document/screenshot/PortalCasesScreenshotTest.java index fbb6fa918e7..46cf1803ebb 100644 --- a/AxonIvyPortal/portal-selenium-test/src_test/com/axonivy/portal/selenium/document/screenshot/PortalCasesScreenshotTest.java +++ b/AxonIvyPortal/portal-selenium-test/src_test/com/axonivy/portal/selenium/document/screenshot/PortalCasesScreenshotTest.java @@ -218,6 +218,7 @@ public void screenshotProcessOverviewLink() throws IOException { CaseWidgetNewDashBoardPage caseWidget = mainMenuPage.openCaseList(); CaseDetailsPage caseDetailsPage = caseWidget.openDetailsCase("Process With Process Steps"); caseDetailsPage.waitForCaseDetailsDisplay(); + caseDetailsPage.openActionPanel(); ScreenshotUtils.executeDecorateJs("highlightProcessOverviewLink()"); ScreenshotUtils diff --git a/AxonIvyPortal/portal-selenium-test/src_test/com/axonivy/portal/selenium/document/screenshot/PortalProcessesScreenshotTest.java b/AxonIvyPortal/portal-selenium-test/src_test/com/axonivy/portal/selenium/document/screenshot/PortalProcessesScreenshotTest.java index c12829c955b..d7421a40e6a 100644 --- a/AxonIvyPortal/portal-selenium-test/src_test/com/axonivy/portal/selenium/document/screenshot/PortalProcessesScreenshotTest.java +++ b/AxonIvyPortal/portal-selenium-test/src_test/com/axonivy/portal/selenium/document/screenshot/PortalProcessesScreenshotTest.java @@ -109,10 +109,12 @@ private void screenshotMoreInfoOnProcessList() throws IOException { processWidget.getFilterTextfield().sendKeys(processName); processWidget.waitUntilProcessDisplayed(processName); - + processWidget.clickProcessMoreActionMenu(processName); ScreenshotUtils.executeDecorateJs("highlightProcessMoreInformationLink()"); ScreenshotUtils .captureHalfLeftPageScreenShot(ScreenshotUtils.PROCESSES_INFORMATION_WIDGET_FOLDER + "more-information-link"); + // Close process more menu item + processWidget.clickProcessMoreActionMenu(processName); processWidget.clickMoreInformationLinkImage(processName); ProcessInformationPage processInformationPage = new ProcessInformationPage(); diff --git a/AxonIvyPortal/portal-selenium-test/src_test/com/axonivy/portal/selenium/page/CaseDetailsPage.java b/AxonIvyPortal/portal-selenium-test/src_test/com/axonivy/portal/selenium/page/CaseDetailsPage.java index f6e6a08ef3b..9adacb2c1f3 100644 --- a/AxonIvyPortal/portal-selenium-test/src_test/com/axonivy/portal/selenium/page/CaseDetailsPage.java +++ b/AxonIvyPortal/portal-selenium-test/src_test/com/axonivy/portal/selenium/page/CaseDetailsPage.java @@ -1019,9 +1019,16 @@ public String openDoneTask(int index) { } public void clickShowOnlyOpenTasks() { - $("div[id$=':show-only-open-tasks'] .ui-chkbox-box") .shouldBe(getClickableCondition(), DEFAULT_TIMEOUT).click(); } + + public void clickShowCaseOwners() { + $("a[id$=':show-case-owner-link']").shouldBe(getClickableCondition(), DEFAULT_TIMEOUT).click(); + } + + public int countCaseOwners() { + return $$("div[id$=':security-member-container']").size(); + } } diff --git a/AxonIvyPortal/portal-selenium-test/src_test/com/axonivy/portal/selenium/page/DashboardConfigurationPage.java b/AxonIvyPortal/portal-selenium-test/src_test/com/axonivy/portal/selenium/page/DashboardConfigurationPage.java index e7fda822211..7dd61c03998 100644 --- a/AxonIvyPortal/portal-selenium-test/src_test/com/axonivy/portal/selenium/page/DashboardConfigurationPage.java +++ b/AxonIvyPortal/portal-selenium-test/src_test/com/axonivy/portal/selenium/page/DashboardConfigurationPage.java @@ -30,6 +30,12 @@ public SelenideElement getDashboardConfigurationPage() { waitForDashboardConfigurationTypeSelectionAppear(); return $("div[id$='configuration-group']"); } + + public SelenideElement getDashboardConfigurationPageWithActionsMenu() { + waitForDashboardConfigurationTypeSelectionAppear(); + getDashboardConfigurationActionMenu(); + return $("div[id$='configuration-group']"); + } public SelenideElement getPrivateDashboardConfigurationTypeSelection() { waitForDashboardConfigurationTypeSelectionAppear(); @@ -367,7 +373,9 @@ private SelenideElement findPublicDashboardRowByName(String dashboardName) { public void createPrivateDashboardFromScratch() { openCreatePrivateDashboardMenu(); $("a[id$=':create-from-scratch']").shouldBe(Condition.appear, DEFAULT_TIMEOUT).click(); + waitForElementDisplayed(getMenuIconContainer(), true); $$("[id$=':dashboard-title']").filter(Condition.visible).first().sendKeys("My dashboard"); + $$("input[id$=':dashboard-description']").filter(Condition.visible).first().sendKeys("Private dashboard description"); } public SelenideElement getDashboardCreationDialog() { @@ -395,6 +403,13 @@ public void cancelCreateDashboard() { public void createPublicDashboardFromScratch() { openCreatePublicDashboardMenu(); $("a[id$=':create-from-scratch']").shouldBe(getClickableCondition()).click(); + waitForElementDisplayed(getMenuIconContainer(), true); + $$("[id$=':dashboard-title']").filter(Condition.visible).first().sendKeys("My dashboard"); + $$("input[id$=':dashboard-description']").filter(Condition.visible).first().sendKeys("Public dashboard description"); + } + + public SelenideElement getMenuIconContainer() { + return $("div[id$=':dashboard-creation-details-dialog']").shouldBe(appear, DEFAULT_TIMEOUT).$("div[id$=':custom-array-icon']").shouldBe(appear, DEFAULT_TIMEOUT); } public SelenideElement getDashboardTemplates() { diff --git a/AxonIvyPortal/portal-selenium-test/src_test/com/axonivy/portal/selenium/page/NotificationCompactPage.java b/AxonIvyPortal/portal-selenium-test/src_test/com/axonivy/portal/selenium/page/NotificationCompactPage.java index 46560eab37f..d69a38db6bf 100644 --- a/AxonIvyPortal/portal-selenium-test/src_test/com/axonivy/portal/selenium/page/NotificationCompactPage.java +++ b/AxonIvyPortal/portal-selenium-test/src_test/com/axonivy/portal/selenium/page/NotificationCompactPage.java @@ -12,8 +12,11 @@ protected String getLoadedLocator() { } public void openNotificationFullPage() { - $("button[id$=':notification-more-option_button']").shouldBe(getClickableCondition()).click(); $("[id$=':notification-full-page']").shouldBe(Condition.appear, DEFAULT_TIMEOUT).shouldBe(getClickableCondition(), DEFAULT_TIMEOUT).click(); $("a[id='notification-full-form:notifications-scroller:0:notification-mark-as-read']").shouldBe(getClickableCondition(), DEFAULT_TIMEOUT); } + + public void openNotificationMoreActionsMenu() { + $("button[id$=':notification-more-option_button']").shouldBe(getClickableCondition()).click(); + } } diff --git a/AxonIvyPortal/portal-selenium-test/src_test/com/axonivy/portal/selenium/page/ProcessWidgetPage.java b/AxonIvyPortal/portal-selenium-test/src_test/com/axonivy/portal/selenium/page/ProcessWidgetPage.java index 43cf14d56b6..3d2ef4de049 100644 --- a/AxonIvyPortal/portal-selenium-test/src_test/com/axonivy/portal/selenium/page/ProcessWidgetPage.java +++ b/AxonIvyPortal/portal-selenium-test/src_test/com/axonivy/portal/selenium/page/ProcessWidgetPage.java @@ -363,9 +363,13 @@ public void clickMoreInformationLink(String processName) { } private SelenideElement getProcessActionMenu(String processName) { + clickProcessMoreActionMenu(processName); + return $$("div[id$='process-action-menu']").filter(Condition.appear).first(); + } + + public void clickProcessMoreActionMenu(String processName) { SelenideElement processItem = getProcessItem(processName); processItem.$("button[id*=':process-action-button']").shouldBe(getClickableCondition(), DEFAULT_TIMEOUT).click(); - return $$("div[id$='process-action-menu']").filter(Condition.appear).first(); } public SelenideElement getProcessItem(String processName) { diff --git a/AxonIvyPortal/portal-selenium-test/src_test/com/axonivy/portal/selenium/test/dashboard/DashboardCaseWidgetTest.java b/AxonIvyPortal/portal-selenium-test/src_test/com/axonivy/portal/selenium/test/dashboard/DashboardCaseWidgetTest.java index fb70f8324fe..e28ed133bbe 100644 --- a/AxonIvyPortal/portal-selenium-test/src_test/com/axonivy/portal/selenium/test/dashboard/DashboardCaseWidgetTest.java +++ b/AxonIvyPortal/portal-selenium-test/src_test/com/axonivy/portal/selenium/test/dashboard/DashboardCaseWidgetTest.java @@ -15,6 +15,7 @@ import com.axonivy.portal.selenium.common.LinkNavigator; import com.axonivy.portal.selenium.common.ScreenshotUtils; import com.axonivy.portal.selenium.common.TestAccount; +import com.axonivy.portal.selenium.common.Variable; import com.axonivy.portal.selenium.page.CaseDetailsPage; import com.axonivy.portal.selenium.page.CaseEditWidgetNewDashBoardPage; import com.axonivy.portal.selenium.page.CaseWidgetNewDashBoardPage; @@ -349,6 +350,19 @@ public void testResizeColumnWidth() { int newSize = modificationPage.getPriorityColumnSize(); assertTrue(newSize > oldSize); redirectToNewDashBoard(); - + } + + @Test + public void testCaseOwners() { + redirectToRelativeLink(multipleOwnersUrl); + login(TestAccount.ADMIN_USER); + updatePortalSetting(Variable.ENABLE_CASE_OWNER.getKey(), "true"); + redirectToNewDashBoard(); + CaseWidgetNewDashBoardPage caseWidget = newDashboardPage.selectCaseWidget(YOUR_CASES_WIDGET); + caseWidget.expand().shouldHave(sizeGreaterThanOrEqual(1)); + CaseDetailsPage detailsCase = caseWidget.openDetailsCase("Case with multiple owners"); + detailsCase.clickShowCaseOwners(); + assertTrue(detailsCase.countCaseOwners() > 0); + updatePortalSetting(Variable.ENABLE_CASE_OWNER.getKey(), "false"); } } diff --git a/AxonIvyPortal/portal/cms/cms.yaml b/AxonIvyPortal/portal/cms/cms.yaml index 5a2295b2567..896f00b7270 100644 --- a/AxonIvyPortal/portal/cms/cms.yaml +++ b/AxonIvyPortal/portal/cms/cms.yaml @@ -1014,11 +1014,11 @@ ch.ivy.addon.portalkit.ui.jsf: sort: Sort taskWarning: createdTaskLeave: '
You are about to leave this page.
Please choose one of the following options:
  • Leave: Discard your changes and move to the selected page.
  • Cancel: Continue working this task.
' - createdTaskLogout: '
You are about to leave this page.
Please choose one of the following options:
  •  Logout: Discard your changes and logout.
  •  Cancel: Continue working this task.
' + createdTaskLogout: '
You are about to leave this page.
Please choose one of the following options:
  • Logout: Discard your changes and logout.
  • Cancel: Continue working this task.
' resetParkTaskBeforeLeave: '
You are about to leave a task in progress.
Please choose one of the following options:
  • Leave: Discard your changes and move to the selected page.
  • Reserve: Discard your changes and keep the task in your task list.
  • Cancel: Continue working this task.
' - resetParkTaskBeforeLogout: '
You are about to leave a task in progress.
Please choose one of the following options:
  •     Logout: Discard your changes and logout.
  •     Reserve: Discard your changes and keep the task in your personal task list. Then logout.
  •   -   Cancel: Continue working this task.
' + resetParkTaskBeforeLogout: '
You are about to leave a task in progress.
Please choose one of the following options:
  • Logout: Discard your changes and logout.
  • Reserve: Discard your changes and keep the task in your personal task list. Then logout.
  • Cancel: Continue working + this task.
' taskNotFound: The task does not exist or you have insufficient rights to see this task. userProfile: myProfileTitle: My profile diff --git a/AxonIvyPortal/portal/cms/cms_de.yaml b/AxonIvyPortal/portal/cms/cms_de.yaml index 12ab6c82827..6e5487adf0c 100644 --- a/AxonIvyPortal/portal/cms/cms_de.yaml +++ b/AxonIvyPortal/portal/cms/cms_de.yaml @@ -344,7 +344,7 @@ ch.ivy.addon.portalkit.ui.jsf: FINISHED_TIME: Erledigt ID: Vorgangs Id NAME: Name / Beschreibung - OWNER: Verantwortlich + OWNER: Prozessverantwortlichen STATE: Status deletionNoteContent: Der Vorgang wurde durch {0} gelöscht. destroyCaseMessage: Diese Operation kann nicht rückgängig gemacht werden. Sind Sie sicher, dass dieser komplette Vorgang gelöscht werden soll? @@ -461,7 +461,7 @@ ch.ivy.addon.portalkit.ui.jsf: detail: Details display: Anzeigen displayAsTopMenu: Als oberstes Menü anzeigen - displayName: Name anzeigen + displayName: Anzeigename dragAndDropFile: 'Ziehen und Ablegen einer Datei oder ' dragAndDropImage: 'Ziehen und Ablegen eines Bildes oder ' edit: Bearbeiten @@ -983,6 +983,8 @@ ch.ivy.addon.portalkit.ui.jsf: newNoteHeader: Neue Notiz hinzufügen wroteAt: Erstellt am notifications: + errorNotificationMessage: | + Die Details für die neue Aufgabe konnten nicht angezeigt werden. Bitte wenden Sie sich an Ihren Administrator, um Unterstützung zu erhalten linkToFullScreen: Link zum Vollbild linkToNotificationSettings: Benachrichtigungseinstellungen markAllAsRead: Alle als gelesen markieren @@ -1251,10 +1253,10 @@ ch.ivy.addon.portalkit.ui.jsf: taskWarning: createdTaskLeave: '
Sie verlassen die aktuelle Seite.
Bitte wählen Sie eine der folgenden Optionen:
  • Verlassen: Ihre Änderungen verwerfen und zur ausgewählten Seite gehen.
  • Abbrechen: Die Bearbeitung dieser Aufgabe fortsetzen.
' createdTaskLogout: '
Sie verlassen die aktuelle Seite.
Bitte wählen Sie eine der folgenden Optionen:
  • Abmelden: Ihre Änderungen verwerfen und abmelden.
  • Abbrechen: Die Bearbeitung dieser Aufgabe fortsetzen.
' - resetParkTaskBeforeLeave: '
Sie verlassen die aktuelle Aufgabe.
Bitte wählen Sie eine der folgenden Optionen:
  • Verlassen: Ihre Änderungen verwerfen und zur ausgewählten Seite gehen.
  • Reservieren: Ihre Änderungen verwerfen und die Aufgabe in Ihre Aufgabenliste verschieben
  • - Abbrechen: Die Bearbeitung dieser Aufgabe fortsetzen.
' - resetParkTaskBeforeLogout: '
Sie verlassen die aktuelle Aufgabe.
Bitte wählen Sie eine der folgenden Optionen:
  •     Abmelden: Ihre Änderungen verwerfen und abmelden.
  •     Reservieren: Ihre Änderungen verwerfen und die Aufgabe in Ihre persönliche Aufgabenliste - verschieben. Dann abmelden.
  •     Abbrechen: Die Bearbeitung dieser Aufgabe fortsetzen.
' + resetParkTaskBeforeLeave: '
Sie verlassen die aktuelle Aufgabe.
Bitte wählen Sie eine der folgenden Optionen:
  • Verlassen: Ihre Änderungen verwerfen und zur ausgewählten Seite gehen.
  • Reservieren: Ihre Änderungen verwerfen und die Aufgabe in Ihre Aufgabenliste verschieben
  • Abbrechen: + Die Bearbeitung dieser Aufgabe fortsetzen.
' + resetParkTaskBeforeLogout: '
Sie verlassen die aktuelle Aufgabe.
Bitte wählen Sie eine der folgenden Optionen:
  • Abmelden: Ihre Änderungen verwerfen und abmelden.
  • Reservieren: Ihre Änderungen verwerfen und die Aufgabe in Ihre persönliche Aufgabenliste verschieben. Dann abmelden.
  • Abbrechen: + Die Bearbeitung dieser Aufgabe fortsetzen.
' taskNotFound: Die Aufgabe existiert nicht oder Sie haben ungenügende Rechte, um diese Aufgabe zu sehen. userProfile: myProfileTitle: Mein Profil @@ -1303,7 +1305,7 @@ Dialogs: CouldNotFindLinkedProcess: Der verlinkte Prozess konnte nicht gefunden werden! CustomWidgetIFrameTitle: '{0} Rahmen' DashboardModification: - Share: Aktie + Share: Teilen ProcessWidgetConfiguration: DragAndDropToChangeOrder: ziehen und ablegen zum ändern der Reihenfolge. DragAndDropTooltip: Klicken Sie auf die Vorschau und ändern Sie die Reihenfolge durch Ziehen und Ableg @@ -1317,7 +1319,7 @@ Dialogs: CaseDetailTitle: Vorgangsdetails DataDescription: Daten und Beschreibung destroyCase: Vorgang löschen - CaseOwner: Prozessverantwortlicher + CaseOwner: Prozessverantwortlichen Finished: Erledigt GlobalSearchText: Die Vorgänge enthalten das Schlüsselwort "{0}" in Vorgangs Id{1}. ShowBusinessDetails: Geschäftsinformationen anzeigen @@ -1468,8 +1470,8 @@ Labels: FINISHED: Beendetes Datum ID: Id NAME: Name - OWNER: Eigentümer des Falles - STATE: Staat + OWNER: Prozessverantwortlichen + STATE: Status DashboardStandardTaskColumn: ACTIONS: Aktionen APPLICATION: Anmeldung @@ -1482,7 +1484,7 @@ Labels: PRIORITY: Priorität RESPONSIBLE: Verantwortlich START: Start - STATE: Staat + STATE: Status FilterOperator: AFTER: Ist nach BEFORE: Ist vor diff --git a/AxonIvyPortal/portal/cms/cms_en.yaml b/AxonIvyPortal/portal/cms/cms_en.yaml index 60c442e9f48..09849801239 100644 --- a/AxonIvyPortal/portal/cms/cms_en.yaml +++ b/AxonIvyPortal/portal/cms/cms_en.yaml @@ -343,7 +343,7 @@ ch.ivy.addon.portalkit.ui.jsf: FINISHED_TIME: Finished ID: Case Id NAME: Name / Description - OWNER: Owner + OWNER: Case Owners STATE: State deletionNoteContent: The case was destroyed by {0} destroyCaseMessage: This operation cannot be undone. Are you sure you want to destroy this case and all of its tasks? @@ -985,6 +985,7 @@ ch.ivy.addon.portalkit.ui.jsf: newNoteHeader: Add new note wroteAt: wrote at notifications: + errorNotificationMessage: We couldn't display the details for the new task. Please contact your administrator for assistance linkToFullScreen: Link to full screen linkToNotificationSettings: Notification settings markAllAsRead: Mark all as read @@ -1252,11 +1253,11 @@ ch.ivy.addon.portalkit.ui.jsf: sort: Sort taskWarning: createdTaskLeave: '
You are about to leave this page.
Please choose one of the following options:
  • Leave: Discard your changes and move to the selected page.
  • Cancel: Continue working this task.
' - createdTaskLogout: '
You are about to leave this page.
Please choose one of the following options:
  •  Logout: Discard your changes and logout.
  •  Cancel: Continue working this task.
' + createdTaskLogout: '
You are about to leave this page.
Please choose one of the following options:
  • Logout: Discard your changes and logout.
  • Cancel: Continue working this task.
' resetParkTaskBeforeLeave: '
You are about to leave a task In progress.
Please choose one of the following options:
  • Leave: Discard your changes and move to the selected page.
  • Reserve: Discard your changes and keep the task in your task list.
  • Cancel: Continue working this task.
' - resetParkTaskBeforeLogout: '
You are about to leave a task in progress.
Please choose one of the following options:
  •     Logout: Discard your changes and logout.
  •     Reserve: Discard your changes and keep the task in your personal task list. Then logout.
  •   -   Cancel: Continue working this task.
' + resetParkTaskBeforeLogout: '
You are about to leave a task in progress.
Please choose one of the following options:
  • Logout: Discard your changes and logout.
  • Reserve: Discard your changes and keep the task in your personal task list. Then logout.
  • Cancel: Continue working + this task.
' taskNotFound: The task does not exist or you have insufficient rights to see this task. userProfile: myProfileTitle: My profile @@ -1319,7 +1320,7 @@ Dialogs: CaseDetailTitle: Case Details DataDescription: Data and Description destroyCase: Destroy case - CaseOwner: Case Owner + CaseOwner: Case Owners Finished: Finished GlobalSearchText: Cases contain the keyword "{0}" in Case Id{1}. ShowBusinessDetails: Business details @@ -1515,7 +1516,7 @@ Labels: FINISHED: Finished Date ID: Id NAME: Name - OWNER: Case Owner + OWNER: Case Owners STATE: State DashboardStandardTaskColumn: ACTIONS: Actions diff --git a/AxonIvyPortal/portal/cms/cms_es.yaml b/AxonIvyPortal/portal/cms/cms_es.yaml index 8a32f765f4b..ae3ef4f43dc 100644 --- a/AxonIvyPortal/portal/cms/cms_es.yaml +++ b/AxonIvyPortal/portal/cms/cms_es.yaml @@ -345,7 +345,7 @@ ch.ivy.addon.portalkit.ui.jsf: FINISHED_TIME: Terminado ID: ID del caso NAME: Nombre / Descripción - OWNER: Propietario + OWNER: Responsables del proceso STATE: 'Estatus ' deletionNoteContent: El caso fue destruido por {0} destroyCaseMessage: Esta operación no se puede deshacer. ¿Está seguro de que quiere destruir este caso y todas sus tareas? @@ -483,7 +483,7 @@ ch.ivy.addon.portalkit.ui.jsf: finish: Terminar general: General generalInformation: Información general - globalSearch: Búsqueda ... + globalSearch: Buscar ... goToDetail: Ir a detalles hasPrecondition: Este proceso tiene una precondición height: altura @@ -564,7 +564,7 @@ ch.ivy.addon.portalkit.ui.jsf: showSystemNotes: Notas del sistema showSystemTasks: Tareas del sistema sorting: Sorting - start: Abrir + start: Iniciar startProcess: Iniciar el proceso state: Estatus status: Estado @@ -982,6 +982,8 @@ ch.ivy.addon.portalkit.ui.jsf: newNoteHeader: Agregar nueva nota wroteAt: escribió en notifications: + errorNotificationMessage: | + No pudimos mostrar los detalles de la nueva tarea. Por favor, contacte con su administrador para obtener ayuda linkToFullScreen: Enlace a la pantalla completa linkToNotificationSettings: Ajustes de notificación markAllAsRead: Marcar todo como leído @@ -1248,8 +1250,8 @@ ch.ivy.addon.portalkit.ui.jsf: showFullTaskList: Mostrar lista de tareas completa sort: Ordenar taskWarning: - createdTaskLeave: '
Va a salir de esta página. Por favor selecione una de las siguientes opciones:
  •     Salir: No guardará sus cambios y navegará a la página seleccionada
  •     Cancelar: Continue trabajando en esta tarea.
' - createdTaskLogout: '
Va a salir de esta página.
Por favor selecione una de las siguientes opciones:
  •     Cerrar sesión: No guardará sus cambios y se cerrará la sesión.
  •  Cancelar: Continue trabajando en esta tarea.
' + createdTaskLeave: '
Va a salir de esta página. Por favor selecione una de las siguientes opciones:
  • Salir: No guardará sus cambios y navegará a la página seleccionada
  • Cancelar: Continue trabajando en esta tarea.
' + createdTaskLogout: '
Va a salir de esta página.
Por favor selecione una de las siguientes opciones:
  • Cerrar sesión: No guardará sus cambios y se cerrará la sesión.
  • Cancelar: Continue trabajando en esta tarea.
' resetParkTaskBeforeLeave: '
Va a salir de esta página.
Por favor selecione una de las siguientes opciones:
  • Salir: No guardará sus cambios y navegará a la página seleccionada
  • Reservar: No guardará sus cambios y esta tarea quedara reservada para usted.
  • Cancelar: Continue trabajando en esta tarea.
' resetParkTaskBeforeLogout: '
Va a salir de esta página.
Por favor selecione una de las siguientes opciones:
  • Salir: no guardará sus cambios y volverá a la página anterior.
  • Reservar: No guardará sus cambios, volverá a la página anterior pero la tarea quedara reservada para usted.
  • Cancelar: @@ -1316,7 +1318,7 @@ Dialogs: CaseDetailTitle: Detalles del caso DataDescription: Datos y Descripción destroyCase: Borrar caso - CaseOwner: Responsable del proceso + CaseOwner: Responsables del proceso Finished: Terminado GlobalSearchText: Los casos contienen la palabra clave "{0}" en ID del caso{1}. ShowBusinessDetails: Detalles del negocio @@ -1447,7 +1449,7 @@ Labels: FINISHED: Fecha de finalización ID: Id NAME: Nombre - OWNER: Propietario del caso + OWNER: Responsables del proceso STATE: Estado DashboardStandardTaskColumn: ACTIONS: Acciones diff --git a/AxonIvyPortal/portal/cms/cms_fr.yaml b/AxonIvyPortal/portal/cms/cms_fr.yaml index d100701e6ec..5e0680c0317 100644 --- a/AxonIvyPortal/portal/cms/cms_fr.yaml +++ b/AxonIvyPortal/portal/cms/cms_fr.yaml @@ -18,11 +18,11 @@ ch.ivy.addon.portalkit.ui.jsf: userNameRequired: Le nom d'utilisateur doit être indiqué. absences: Absences addAbsence: Ajouter une absence - deputies: Substituts + deputies: Remplaçant description: Veuillez inscrire vos vacances, maladies ou autres obligations extérieures conduisant à une absence. editAbsence: Editer les absences from: Du - noDeputy: Aucun substitut + noDeputy: Aucun remplaçant noPermissionToSeeThisArea: Vous n'avez pas l'autorisation requise pour visiter cette zone. period: Période personalTaskDuringAbsenceDeputies: Remplacer les tâches assignées personnellement pendant l'absence @@ -39,15 +39,15 @@ ch.ivy.addon.portalkit.ui.jsf: removedAbsences: Absence supprimée pour {0} saveAbsenceSetting: Les paramètres d'absence ont été sauvegardés avec succès. updateAbsence: Mise à jour des absences réussie - absenceAndDeputy: Absences et suppléances + absenceAndDeputy: Absences et remplacements allAbsences: Absences de tous les utilisateurs applicationAndRole: Application et rôle - definedDeputies: Substituts définis + definedDeputies: Remplaçant définis deputyFor: Je suis remplaçant pour myAbsences: Mon absence myDeputies: Mes substituts nextAbsence: Absence à venir - selectedDeputyFor: L'utilisateur sélectionné est un substitut de + selectedDeputyFor: L'utilisateur sélectionné est un remplaçant de selectedUser: Utilisateur sélectionné AccessibilityShortcuts: processName: Raccourcis d'accessibilité Widgets @@ -139,7 +139,7 @@ ch.ivy.addon.portalkit.ui.jsf: MyProfile: DateFormat: Format de la date FormattingLanguage: Langue de mise en forme - General: Généraux + General: Général Homepage: Page d'accueil Language: Langue ProcessList: Liste des processus @@ -342,7 +342,7 @@ ch.ivy.addon.portalkit.ui.jsf: FINISHED_TIME: Terminé ID: Id du dossier NAME: Nom / Description - OWNER: Propriétaire + OWNER: Responsables de processus STATE: Etat deletionNoteContent: Ce dossier a été supprimé par {0} destroyCaseMessage: Cette opération ne peut pas être annulée. Êtes-vous sûr de vouloir supprimer ce dossier et toutes les tâches associées ? @@ -980,9 +980,10 @@ ch.ivy.addon.portalkit.ui.jsf: newNoteHeader: Ajouter une nouvelle note wroteAt: Ajoutée le notifications: + errorNotificationMessage: Nous n'avons pas pu afficher les détails de la nouvelle tâche. Veuillez contacter votre administrateur pour obtenir de l'aide linkToFullScreen: Lien vers le plein écran linkToNotificationSettings: Paramètres de notification - markAllAsRead: Marquer tous les textes comme lus + markAllAsRead: Marquer tous comme lus markAsRead: Marquer comme lu noNotificationText: Pas de notification notificationTitle: Notifications @@ -1247,11 +1248,11 @@ ch.ivy.addon.portalkit.ui.jsf: sort: Trier taskWarning: createdTaskLeave: '
    Vous êtes sur le point de quitter cette page.
    Choisissez l''une des options suivantes :
    • Quitter : abandonnez vos modifications et allez à la page choisie.
    • Annuler : continuez à travailler sur cette tâche.
    ' - createdTaskLogout: '
    Vous êtes sur le point de quitter cette page.
    Choisissez l''une des options suivantes :
    •   Déconnecter : abandonnez vos modifications et déconnectez-vous.
    •   Annuler : continuez à travailler sur cette tâche.
    ' + createdTaskLogout: '
    Vous êtes sur le point de quitter cette page.
    Choisissez l''une des options suivantes :
    • Déconnecter : abandonnez vos modifications et déconnectez-vous.
    • Annuler : continuez à travailler sur cette tâche.
    ' resetParkTaskBeforeLeave: '
    Vous êtes sur le point de laisser une tâche en cours.
    Choisissez l''une des options suivantes :
    • Quitter : abandonnez vos modifications et allez à la page choisie.
    • Enregistrer : abandonnez vos modifications et conservez la tâche dans votre liste de tâches personnelles. Ensuite déconnectez-vous.
    • Annuler : continuez à travailler sur cette tâche.
    ' - resetParkTaskBeforeLogout: '
    Vous êtes sur le point de laisser une tâche en cours.
    Choisissez l''une des options suivantes :
    •     Déconnecter : abandonnez vos modifications et déconnectez-vous.
    •     Enregistrer : annulez vos modifications et - conservez la tâche dans votre liste de tâches personnelles. Ensuite, déconnectez-vous.
    •     Annuler : continuez à travailler sur cette tâche.
    ' + resetParkTaskBeforeLogout: '
    Vous êtes sur le point de laisser une tâche en cours.
    Choisissez l''une des options suivantes :
    • Déconnecter : abandonnez vos modifications et déconnectez-vous.
    • Enregistrer : annulez vos modifications et conservez la tâche dans votre + liste de tâches personnelles. Ensuite, déconnectez-vous.
    • Annuler : continuez à travailler sur cette tâche.
    ' taskNotFound: cette tâche n'existe pas ou vous n'avez pas l'autorisation de la voir. userProfile: myProfileTitle: Mon profil @@ -1314,7 +1315,7 @@ Dialogs: CaseDetailTitle: Détail du cas DataDescription: Données et description destroyCase: détruire le cas - CaseOwner: Responsable de processus + CaseOwner: Responsables de processus Finished: Terminé GlobalSearchText: Les cas contiennent le mot-clé "{0}" dans Id du dossier{1}. ShowBusinessDetails: Détails de l'entreprise @@ -1497,7 +1498,7 @@ Labels: FINISHED: Date d'achèvement ID: Id NAME: Nom - OWNER: Propriétaire du dossier + OWNER: Responsables de processus STATE: État DashboardStandardTaskColumn: ACTIONS: Actions diff --git a/AxonIvyPortal/portal/cms/images/AIAssistant/DefaultLogo.png b/AxonIvyPortal/portal/cms/images/AIAssistant/DefaultLogo.png index 9d1b71808cb..7bdcb556159 100644 Binary files a/AxonIvyPortal/portal/cms/images/AIAssistant/DefaultLogo.png and b/AxonIvyPortal/portal/cms/images/AIAssistant/DefaultLogo.png differ diff --git a/AxonIvyPortal/portal/cms/images/MenuQRCode/AppleStore/AppleStore.svg b/AxonIvyPortal/portal/cms/images/MenuQRCode/AppleStore/AppleStore.svg index ed1a7efde8c..a26f5bff0b2 100644 --- a/AxonIvyPortal/portal/cms/images/MenuQRCode/AppleStore/AppleStore.svg +++ b/AxonIvyPortal/portal/cms/images/MenuQRCode/AppleStore/AppleStore.svg @@ -1,25 +1 @@ - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + \ No newline at end of file diff --git a/AxonIvyPortal/portal/cms/images/MenuQRCode/GooglePlay/GooglePlay.svg b/AxonIvyPortal/portal/cms/images/MenuQRCode/GooglePlay/GooglePlay.svg index dbcfb88ec67..6112d780b78 100644 --- a/AxonIvyPortal/portal/cms/images/MenuQRCode/GooglePlay/GooglePlay.svg +++ b/AxonIvyPortal/portal/cms/images/MenuQRCode/GooglePlay/GooglePlay.svg @@ -1,43 +1 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + \ No newline at end of file diff --git a/AxonIvyPortal/portal/cms/images/MenuQRCode/MobileAppLogo/MobileAppLogo.png b/AxonIvyPortal/portal/cms/images/MenuQRCode/MobileAppLogo/MobileAppLogo.png index feb1505761e..f862dad6f0e 100644 Binary files a/AxonIvyPortal/portal/cms/images/MenuQRCode/MobileAppLogo/MobileAppLogo.png and b/AxonIvyPortal/portal/cms/images/MenuQRCode/MobileAppLogo/MobileAppLogo.png differ diff --git a/AxonIvyPortal/portal/cms/images/WelcomeWidget/DefaultImage.jpg b/AxonIvyPortal/portal/cms/images/WelcomeWidget/DefaultImage.jpg index a1d8bbec85d..d773f0b5f7e 100644 Binary files a/AxonIvyPortal/portal/cms/images/WelcomeWidget/DefaultImage.jpg and b/AxonIvyPortal/portal/cms/images/WelcomeWidget/DefaultImage.jpg differ diff --git a/AxonIvyPortal/portal/cms/images/WelcomeWidget/DefaultImageDark.jpg b/AxonIvyPortal/portal/cms/images/WelcomeWidget/DefaultImageDark.jpg index 57b807cc85d..d14373e5864 100644 Binary files a/AxonIvyPortal/portal/cms/images/WelcomeWidget/DefaultImageDark.jpg and b/AxonIvyPortal/portal/cms/images/WelcomeWidget/DefaultImageDark.jpg differ diff --git a/AxonIvyPortal/portal/config/variables/Portal/ClientStatistic.json b/AxonIvyPortal/portal/config/variables/Portal/ClientStatistic.json index b396995683d..741453b58ba 100644 --- a/AxonIvyPortal/portal/config/variables/Portal/ClientStatistic.json +++ b/AxonIvyPortal/portal/config/variables/Portal/ClientStatistic.json @@ -161,7 +161,7 @@ } ], "descriptions": [ - { + { "locale": "de", "value": "Dieses Balkendiagramm zeigt alle Aufgaben an, die der Benutzer bearbeiten kann, gruppiert nach Priorität." }, @@ -240,7 +240,7 @@ }, { "locale": "fr", - "value": "Durée moyenne des affaires par Catégorie" + "value": "Durée moyenne des affaires par catégorie" }, { "locale": "es", @@ -499,7 +499,7 @@ }, { "locale": "fr", - "value": "Cas en Cours" + "value": "Cas en cours" }, { "locale": "es", @@ -652,11 +652,11 @@ }, { "locale": "fr", - "value": "Tâches Ouvertes" + "value": "Tâches ouvertes" }, { "locale": "es", - "value": "Tareas Abiertas" + "value": "Tareas Pendientes" } ], "descriptions": [ @@ -696,19 +696,19 @@ "names": [ { "locale": "de", - "value": "Fällig Heute" + "value": "Heute fällige Aufgaben" }, { "locale": "en", - "value": "Due Today" + "value": "Tasks Due Today" }, { "locale": "fr", - "value": "Dû Aujourd'hui" + "value": "Tâches à effectuer aujourd'hui" }, { "locale": "es", - "value": "Vence Hoy" + "value": "Tareas para hoy" } ], "descriptions": [ diff --git a/AxonIvyPortal/portal/config/variables/Portal/Dashboard.json b/AxonIvyPortal/portal/config/variables/Portal/Dashboard.json index fe24c2736a4..c222e3a9993 100644 --- a/AxonIvyPortal/portal/config/variables/Portal/Dashboard.json +++ b/AxonIvyPortal/portal/config/variables/Portal/Dashboard.json @@ -53,24 +53,28 @@ "enableQuickSearch": true, "columns": [ { - "field": "start" + "field": "start", + "width": "65" }, { - "field": "priority" + "field": "priority", + "width": "65" }, { "field": "id", "visible": false }, { - "field": "name" + "field": "name", + "width": "315" }, { "field": "description", "visible": false }, { - "field": "activator" + "field": "activator", + "width": "120" }, { "field": "state", @@ -88,7 +92,8 @@ "visible": false }, { - "field": "actions" + "field": "actions", + "width": "78" } ], "sortDescending": true, @@ -137,23 +142,28 @@ "enableQuickSearch": true, "columns": [ { - "field": "id" + "field": "id", + "width": "60" }, { - "field": "name" + "field": "name", + "width": "320" }, { "field": "description", "visible": false }, { - "field": "state" + "field": "state", + "width": "60" }, { - "field": "creator" + "field": "creator", + "width": "100" }, { - "field": "startTimestamp" + "field": "startTimestamp", + "width": "100" }, { "field": "endTimestamp", @@ -164,7 +174,8 @@ "visible": false }, { - "field": "actions" + "field": "actions", + "width": "60" } ], "sortDescending": true, diff --git a/AxonIvyPortal/portal/config/variables/Portal/DashboardTemplates.json b/AxonIvyPortal/portal/config/variables/Portal/DashboardTemplates.json index 298ad622469..4c1146a4165 100644 --- a/AxonIvyPortal/portal/config/variables/Portal/DashboardTemplates.json +++ b/AxonIvyPortal/portal/config/variables/Portal/DashboardTemplates.json @@ -74,40 +74,48 @@ "canWorkOn": true, "columns": [ { - "field": "start" + "field": "start", + "width": "53" }, { - "field": "priority" + "field": "priority", + "width": "50" }, { "field": "id", "visible": false }, { - "field": "name" + "field": "name", + "width": "185" }, { "field": "description", "visible": false }, { - "field": "activator" + "field": "activator", + "width": "85" }, { - "field": "state" + "field": "state", + "width": "60" }, { - "field": "startTimestamp" + "field": "startTimestamp", + "width": "80" }, { - "field": "expiryTimestamp" + "field": "expiryTimestamp", + "width": "80" }, { "field": "category", "visible": false }, { - "field": "actions" + "field": "actions", + "width": "65" } ], "sortField": "startTimestamp", @@ -155,23 +163,28 @@ "enableQuickSearch": true, "columns": [ { - "field": "id" + "field": "id", + "width": "60" }, { - "field": "name" + "field": "name", + "width": "320" }, { "field": "description", "visible": false }, { - "field": "state" + "field": "state", + "width": "50" }, { - "field": "creator" + "field": "creator", + "width": "90" }, { - "field": "startTimestamp" + "field": "startTimestamp", + "width": "80" }, { "field": "endTimestamp", @@ -182,7 +195,8 @@ "visible": false }, { - "field": "actions" + "field": "actions", + "width": "55" } ], "sortField": "startTimestamp", @@ -401,16 +415,20 @@ "sortDescending": true, "columns": [ { - "field": "start" + "field": "start", + "width": "50" }, { - "field": "priority" + "field": "priority", + "width": "50" }, { - "field": "id" + "field": "id", + "width": "60" }, { - "field": "name" + "field": "name", + "width": "300" }, { "field": "description", @@ -422,12 +440,14 @@ }, { "field": "state", + "width": "60", "filterList": [ "OPEN" ] }, { - "field": "startTimestamp" + "field": "startTimestamp", + "width": "90" }, { "field": "expiryTimestamp", @@ -438,7 +458,8 @@ "visible": false }, { - "field": "actions" + "field": "actions", + "width": "60" } ], "canWorkOn": true, @@ -463,16 +484,20 @@ "sortDescending": true, "columns": [ { - "field": "start" + "field": "start", + "width": "50" }, { - "field": "priority" + "field": "priority", + "width": "50" }, { - "field": "id" + "field": "id", + "width": "60" }, { - "field": "name" + "field": "name", + "width": "300" }, { "field": "description", @@ -484,13 +509,15 @@ }, { "field": "state", + "width": "60", "filterList": [ "OPEN", "IN_PROGRESS" ] }, { - "field": "startTimestamp" + "field": "startTimestamp", + "width": "90" }, { "field": "expiryTimestamp", @@ -501,7 +528,8 @@ "visible": false }, { - "field": "actions" + "field": "actions", + "width": "60" } ], "canWorkOn": false, @@ -558,7 +586,7 @@ }, { "locale": "fr", - "value": "Tableau de bord réduit optimisé pour une utilisation en accessibilité" + "value": "Tableau de bord réduit optimisé pour une utilisation accessible" }, { "locale": "de", @@ -606,28 +634,36 @@ "showFullscreenMode": false, "columns": [ { - "field": "start" + "field": "start", + "width": "50" }, { - "field": "actions" + "field": "actions", + "width": "70" }, { - "field": "name" + "field": "name", + "width": "200" }, { - "field": "priority" + "field": "priority", + "width": "60" }, { - "field": "activator" + "field": "activator", + "width": "90" }, { - "field": "state" + "field": "state", + "width": "60" }, { - "field": "startTimestamp" + "field": "startTimestamp", + "width": "90" }, { - "field": "expiryTimestamp" + "field": "expiryTimestamp", + "width": "90" }, { "field": "id", @@ -743,26 +779,32 @@ "visible": false }, { - "field": "name" + "field": "name", + "width": "280" }, { "field": "description", "visible": false }, { - "field": "state" + "field": "state", + "width": "60" }, { - "field": "creator" + "field": "creator", + "width": "100" }, { - "field": "startTimestamp" + "field": "startTimestamp", + "width": "100" }, { - "field": "endTimestamp" + "field": "endTimestamp", + "width": "100" }, { - "field": "owner" + "field": "owner", + "width": "100" }, { "field": "category", @@ -773,7 +815,8 @@ "visible": false }, { - "field": "actions" + "field": "actions", + "width": "70" } ], "sortField": "id", diff --git a/AxonIvyPortal/portal/dataclasses/ch/ivy/addon/portal/generic/PortalStartData.d.json b/AxonIvyPortal/portal/dataclasses/ch/ivy/addon/portal/generic/PortalStartData.d.json index ebb64dbd9fc..e076d994800 100644 --- a/AxonIvyPortal/portal/dataclasses/ch/ivy/addon/portal/generic/PortalStartData.d.json +++ b/AxonIvyPortal/portal/dataclasses/ch/ivy/addon/portal/generic/PortalStartData.d.json @@ -94,7 +94,7 @@ "type" : "Long" }, { "name" : "notes", - "type" : "java.util.List" + "type" : "List" }, { "name" : "isAuthorized", "type" : "Boolean" diff --git a/AxonIvyPortal/portal/dataclasses/portalkit/PortalCallableToolsData.d.json b/AxonIvyPortal/portal/dataclasses/portalkit/PortalCallableToolsData.d.json index 98bd9b26f72..f9ddca99fed 100644 --- a/AxonIvyPortal/portal/dataclasses/portalkit/PortalCallableToolsData.d.json +++ b/AxonIvyPortal/portal/dataclasses/portalkit/PortalCallableToolsData.d.json @@ -1,5 +1,5 @@ { - "$schema" : "https://json-schema.axonivy.com/data-class/11.4.0/data-class.json", + "$schema" : "https://json-schema.axonivy.com/data-class/12.0.0/data-class.json", "simpleName" : "PortalCallableToolsData", "namespace" : "portalkit", "isBusinessCaseData" : false, diff --git a/AxonIvyPortal/portal/dataclasses/portalkit/PortalToolsData.d.json b/AxonIvyPortal/portal/dataclasses/portalkit/PortalToolsData.d.json index 1d15edb0dcc..343e07a90e5 100644 --- a/AxonIvyPortal/portal/dataclasses/portalkit/PortalToolsData.d.json +++ b/AxonIvyPortal/portal/dataclasses/portalkit/PortalToolsData.d.json @@ -1,5 +1,5 @@ { - "$schema" : "https://json-schema.axonivy.com/data-class/11.4.0/data-class.json", + "$schema" : "https://json-schema.axonivy.com/data-class/12.0.0/data-class.json", "simpleName" : "PortalToolsData", "namespace" : "portalkit", "isBusinessCaseData" : false, diff --git a/AxonIvyPortal/portal/pom.xml b/AxonIvyPortal/portal/pom.xml index 421cec260e2..48de35cf4df 100644 --- a/AxonIvyPortal/portal/pom.xml +++ b/AxonIvyPortal/portal/pom.xml @@ -18,7 +18,7 @@ 12.0.0 - 12.0.0-SNAPSHOT + 12.0.0 UTF-8 diff --git a/AxonIvyPortal/portal/processes/Start Processes/PortalStart.p.json b/AxonIvyPortal/portal/processes/Start Processes/PortalStart.p.json index 613181a5ded..9966d5f5f3b 100644 --- a/AxonIvyPortal/portal/processes/Start Processes/PortalStart.p.json +++ b/AxonIvyPortal/portal/processes/Start Processes/PortalStart.p.json @@ -2828,7 +2828,7 @@ "type" : "DialogCall", "name" : "Task Note History", "config" : { - "dialog" : "ch.ivy.addon.portal.generic.TaskNoteHistory:start(java.util.List,String,ch.ivyteam.ivy.workflow.ITask)", + "dialog" : "ch.ivy.addon.portal.generic.TaskNoteHistory:start(List,String,ch.ivyteam.ivy.workflow.ITask)", "call" : { "map" : { "param.notes" : "in.notes", @@ -4290,8 +4290,9 @@ "config" : { "output" : { "code" : [ + "import ch.ivy.addon.portalkit.util.TaskUtils;", "import ch.ivy.addon.portalkit.bean.TaskActionBean;", - "in.isAuthorized = in.#taskSelected is initialized && TaskActionBean.canReset(in.#taskSelected);" + "in.isAuthorized = in.#taskSelected is initialized && TaskUtils.canReset(in.#taskSelected);" ] } }, diff --git a/AxonIvyPortal/portal/src/ch/ivy/addon/portal/generic/bean/DashboardDetailModificationBean.java b/AxonIvyPortal/portal/src/ch/ivy/addon/portal/generic/bean/DashboardDetailModificationBean.java index 0457782231a..5727ffb6499 100644 --- a/AxonIvyPortal/portal/src/ch/ivy/addon/portal/generic/bean/DashboardDetailModificationBean.java +++ b/AxonIvyPortal/portal/src/ch/ivy/addon/portal/generic/bean/DashboardDetailModificationBean.java @@ -1060,7 +1060,7 @@ public void onResizeColumn(ColumnResizeEvent event) { * Then, the result should be 1 * * @param columnKey - * @return + * @return column index */ private Integer getColumnIndexFromColumnKey(String columnKey) { List idParts = Arrays.asList(columnKey.split("\\:")); diff --git a/AxonIvyPortal/portal/src/ch/ivy/addon/portalkit/bean/CaseDetailsBean.java b/AxonIvyPortal/portal/src/ch/ivy/addon/portalkit/bean/CaseDetailsBean.java index c0fb0b37afc..d397d3337e1 100644 --- a/AxonIvyPortal/portal/src/ch/ivy/addon/portalkit/bean/CaseDetailsBean.java +++ b/AxonIvyPortal/portal/src/ch/ivy/addon/portalkit/bean/CaseDetailsBean.java @@ -9,6 +9,7 @@ import javax.faces.bean.ManagedBean; import javax.faces.bean.ViewScoped; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.BooleanUtils; import org.apache.commons.lang3.StringUtils; import org.primefaces.event.SelectEvent; @@ -33,12 +34,14 @@ import ch.ivy.addon.portalkit.jsf.ManagedBeans; import ch.ivy.addon.portalkit.service.GlobalSettingService; import ch.ivy.addon.portalkit.util.PermissionUtils; +import ch.ivy.addon.portalkit.util.SecurityMemberDisplayNameUtils; import ch.ivy.addon.portalkit.util.SortFieldUtil; import ch.ivy.addon.portalkit.util.TaskUtils; import ch.ivyteam.ivy.environment.Ivy; import ch.ivyteam.ivy.workflow.ICase; import ch.ivyteam.ivy.workflow.ITask; import ch.ivyteam.ivy.workflow.caze.CaseBusinessState; +import ch.ivyteam.ivy.workflow.caze.owner.CaseOwner; import ch.ivyteam.ivy.workflow.query.CaseQuery; @ManagedBean @@ -344,5 +347,25 @@ public boolean isShowDurationTime() { public void setShowDurationTime(boolean showDurationTime) { this.showDurationTime = showDurationTime; } + + public String getFirstCaseOwner() { + if (selectedCase == null || CollectionUtils.isEmpty(selectedCase.owners().all())) { + return ""; + } + final var owners = selectedCase.owners(); + final var size = owners.all().size(); + if (size <= 2 ) { + return SecurityMemberDisplayNameUtils.generateBriefDisplayNameForCaseOwners(owners); + } + CaseOwner first = owners.all().get(0); + CaseOwner second = owners.all().get(1); + + return String.format("%s, %s,..", + SecurityMemberDisplayNameUtils.generateBriefDisplayNameForSecurityMember(first.member(), first.memberName()), + SecurityMemberDisplayNameUtils.generateBriefDisplayNameForSecurityMember(second.member(), second.memberName())); + } + public List getCaseOwners() { + return selectedCase.owners().all(); + } } diff --git a/AxonIvyPortal/portal/src/ch/ivy/addon/portalkit/bean/CaseTaskDocumentBean.java b/AxonIvyPortal/portal/src/ch/ivy/addon/portalkit/bean/CaseTaskDocumentBean.java index 157c7709f51..4d834930018 100644 --- a/AxonIvyPortal/portal/src/ch/ivy/addon/portalkit/bean/CaseTaskDocumentBean.java +++ b/AxonIvyPortal/portal/src/ch/ivy/addon/portalkit/bean/CaseTaskDocumentBean.java @@ -15,7 +15,6 @@ import ch.ivy.addon.portalkit.util.SortFieldUtil; import ch.ivyteam.ivy.security.IPermission; import ch.ivyteam.ivy.workflow.ICase; -import ch.ivyteam.ivy.workflow.INoteable; import ch.ivyteam.ivy.workflow.ITask; import ch.ivyteam.ivy.workflow.caze.CaseBusinessState; @@ -33,33 +32,31 @@ public boolean isShowMoreDocument() { return PermissionUtils.hasPermission(IPermission.DOCUMENT_READ); } - public boolean canWriteDocument(INoteable iNoteable) { - ICase currentCase = getCurrentBusinessCase(iNoteable); - if (currentCase == null) { + public boolean canWriteDocument(ICase caze) { + if (caze == null) { return false; } var isHideUploadDocForDoneCase = GlobalSettingService.getInstance() .findGlobalSettingValueAsBoolean(GlobalVariable.HIDE_UPLOAD_DOCUMENT_FOR_DONE_CASE); - return !(currentCase.getBusinessState() == CaseBusinessState.DONE && isHideUploadDocForDoneCase) && hasPermissionWriteDocument(iNoteable); + return !(caze.getBusinessState() == CaseBusinessState.DONE && isHideUploadDocForDoneCase) && hasPermissionWriteDocument(caze); } - - private ICase getCurrentBusinessCase(INoteable iNoteable) { - if (iNoteable instanceof ICase) { - return (ICase) iNoteable; - } - if (iNoteable instanceof ITask) { - var task = (ITask) iNoteable; - return task.getCase().getBusinessCase(); + + public boolean canWriteDocument(ITask task) { + ICase currentCase = task.getCase().getBusinessCase(); + if (currentCase == null) { + return false; } - return null; + var isHideUploadDocForDoneCase = GlobalSettingService.getInstance() + .findGlobalSettingValueAsBoolean(GlobalVariable.HIDE_UPLOAD_DOCUMENT_FOR_DONE_CASE); + return !(currentCase.getBusinessState() == CaseBusinessState.DONE && isHideUploadDocForDoneCase) && hasPermissionWriteDocument(task); } - public boolean hasPermissionWriteDocument(INoteable iNoteable) { + private boolean hasPermissionWriteDocument(Object iNoteable) { return hasPermission(iNoteable, IPermission.DOCUMENT_WRITE) || hasPermission(iNoteable, IPermission.DOCUMENT_OF_INVOLVED_CASE_WRITE); } - private boolean hasPermission(INoteable iNoteable, IPermission permission) { + private boolean hasPermission(Object iNoteable, IPermission permission) { if (iNoteable == null || permission == null) { return false; } diff --git a/AxonIvyPortal/portal/src/ch/ivy/addon/portalkit/bean/CaseTaskNoteHistoryBean.java b/AxonIvyPortal/portal/src/ch/ivy/addon/portalkit/bean/CaseTaskNoteHistoryBean.java index b9d3f3990f3..f0c3b80eaaa 100644 --- a/AxonIvyPortal/portal/src/ch/ivy/addon/portalkit/bean/CaseTaskNoteHistoryBean.java +++ b/AxonIvyPortal/portal/src/ch/ivy/addon/portalkit/bean/CaseTaskNoteHistoryBean.java @@ -19,8 +19,8 @@ import ch.ivy.addon.portalkit.util.SortFieldUtil; import ch.ivyteam.ivy.environment.Ivy; import ch.ivyteam.ivy.workflow.ICase; -import ch.ivyteam.ivy.workflow.INote; import ch.ivyteam.ivy.workflow.ITask; +import ch.ivyteam.ivy.workflow.note.Note; @ManagedBean(name = "caseTaskNoteHistoryBean") public class CaseTaskNoteHistoryBean implements Serializable { @@ -73,7 +73,7 @@ private String createContentWithTaskState(String taskStateCmsUrl, String content return String.format("%s: %s", Ivy.cms().co(taskStateCmsUrl), content); } - public StreamedContent getExportedFileOfTaskNoteHistory(List taskNoteHistory, String fileName) { + public StreamedContent getExportedFileOfTaskNoteHistory(List taskNoteHistory, String fileName) { NoteHistoryExporter exporter = new NoteHistoryExporter(); return exporter.getStreamedContentOfTaskNoteHistory(taskNoteHistory, fileName + ".xlsx"); } diff --git a/AxonIvyPortal/portal/src/ch/ivy/addon/portalkit/bean/DashboardProcessBean.java b/AxonIvyPortal/portal/src/ch/ivy/addon/portalkit/bean/DashboardProcessBean.java index 1f57566435d..5bdb552c1ff 100644 --- a/AxonIvyPortal/portal/src/ch/ivy/addon/portalkit/bean/DashboardProcessBean.java +++ b/AxonIvyPortal/portal/src/ch/ivy/addon/portalkit/bean/DashboardProcessBean.java @@ -125,8 +125,7 @@ protected void redirectToLink(String link, boolean isEmbedInFrame) throws IOExce FacesContext.getCurrentInstance().getExternalContext().redirect(link); } - protected String getRedirectLink(String link, boolean isEmbedInFrame) - throws IOException { + protected String getRedirectLink(String link, boolean isEmbedInFrame) { if (isEmbedInFrame) { link += (link.contains("?") ? "&" : "?" + "embedInFrame"); } diff --git a/AxonIvyPortal/portal/src/ch/ivy/addon/portalkit/bean/DocumentIconBean.java b/AxonIvyPortal/portal/src/ch/ivy/addon/portalkit/bean/DocumentIconBean.java index 7d96b51b6cf..505974baf16 100644 --- a/AxonIvyPortal/portal/src/ch/ivy/addon/portalkit/bean/DocumentIconBean.java +++ b/AxonIvyPortal/portal/src/ch/ivy/addon/portalkit/bean/DocumentIconBean.java @@ -52,7 +52,7 @@ public class DocumentIconBean implements Serializable { * @param documentName is a name of file * @return return CSS class for icon */ - public static String getIconCssClass(String documentName) { + public String getIconCssClass(String documentName) { String iconClass = StringUtils.EMPTY; if (StringUtils.isNotEmpty(documentName)) { String fileExtension = getExtensionByFileName(documentName); @@ -84,7 +84,7 @@ public static String getIconCssClass(String documentName) { return iconClass; } - private static String getExtensionByFileName(String documentName) { + private String getExtensionByFileName(String documentName) { String fileName = StringUtils.trimToEmpty(documentName); fileName = RegExUtils.removeAll(fileName, FILE_NAME_REGEX); return FilenameUtils.getExtension(StringUtils.lowerCase(fileName)); diff --git a/AxonIvyPortal/portal/src/ch/ivy/addon/portalkit/bean/TaskActionBean.java b/AxonIvyPortal/portal/src/ch/ivy/addon/portalkit/bean/TaskActionBean.java index 728b2329944..2452356aaa8 100644 --- a/AxonIvyPortal/portal/src/ch/ivy/addon/portalkit/bean/TaskActionBean.java +++ b/AxonIvyPortal/portal/src/ch/ivy/addon/portalkit/bean/TaskActionBean.java @@ -52,25 +52,8 @@ public TaskActionBean() { isShowReadWorkflowEvent = PermissionUtils.hasPortalPermission(PortalPermission.TASK_DISPLAY_WORKFLOW_EVENT_ACTION); } - public static boolean canReset(ITask task) { - if (task == null) { - return false; - } - - EnumSet taskStates = EnumSet.of(TaskState.RESUMED, TaskState.PARKED, TaskState.READY_FOR_JOIN, - TaskState.FAILED); - if (!taskStates.contains(task.getState())) { - return false; - } - - if (task.getState() == TaskState.READY_FOR_JOIN) { - IPermission resetTaskReadyForJoin = IPermissionRepository.instance().findByName(PortalPermission.TASK_RESET_READY_FOR_JOIN.getValue()); - return hasPermission(task, resetTaskReadyForJoin); - } - - - return (hasPermission(task, IPermission.TASK_RESET_OWN_WORKING_TASK) && canResume(task)) - || hasPermission(task, IPermission.TASK_RESET); + public boolean canReset(ITask task) { + return TaskUtils.canReset(task); } public boolean canDelegate(ITask task) { @@ -104,7 +87,7 @@ private boolean userCanOnlyDelegateAssignedTask(ITask task) { return hasPermission(task, permission) && !hasPermission(task, IPermission.TASK_WRITE_ACTIVATOR); } - public static boolean canResume(ITask task) { + public boolean canResume(ITask task) { return TaskUtils.canResume(task); } diff --git a/AxonIvyPortal/portal/src/ch/ivy/addon/portalkit/comparator/NoteComparator.java b/AxonIvyPortal/portal/src/ch/ivy/addon/portalkit/comparator/NoteComparator.java index 6fcf772aa1a..633f379d948 100644 --- a/AxonIvyPortal/portal/src/ch/ivy/addon/portalkit/comparator/NoteComparator.java +++ b/AxonIvyPortal/portal/src/ch/ivy/addon/portalkit/comparator/NoteComparator.java @@ -2,13 +2,13 @@ import java.util.Comparator; -import ch.ivyteam.ivy.workflow.INote; +import ch.ivyteam.ivy.workflow.note.Note; -public class NoteComparator implements Comparator { +public class NoteComparator implements Comparator { @Override - public int compare(INote o1, INote o2) { - return o2.getCreationTimestamp().compareTo(o1.getCreationTimestamp()); + public int compare(Note o1, Note o2) { + return o2.createdAt().compareTo(o1.createdAt()); } } diff --git a/AxonIvyPortal/portal/src/ch/ivy/addon/portalkit/datamodel/internal/RelatedTaskLazyDataModel.java b/AxonIvyPortal/portal/src/ch/ivy/addon/portalkit/datamodel/internal/RelatedTaskLazyDataModel.java index e27434583e5..9e354ecfb9b 100644 --- a/AxonIvyPortal/portal/src/ch/ivy/addon/portalkit/datamodel/internal/RelatedTaskLazyDataModel.java +++ b/AxonIvyPortal/portal/src/ch/ivy/addon/portalkit/datamodel/internal/RelatedTaskLazyDataModel.java @@ -60,13 +60,21 @@ private void updateCriteria() { criteria.setSortDescending(false); this.getCriteria().setKeyword(StringUtils.EMPTY); this.setQueryByBusinessCaseId(true); - boolean isOwner = iCase != null && iCase.getOwner() != null ? iCase.getOwner().isMember(Ivy.session(), true) : false; + boolean isOwner = isCaseOwnerUser(iCase); this.setAdminQuery(PermissionUtils.checkReadAllTasksPermission() || PermissionUtils.checkTaskReadOwnCaseTasksPermission() || isOwner); if (HiddenTasksCasesConfig.isHiddenTasksCasesExcluded()) { criteria.setCustomTaskQuery(TaskQuery.create().where().customField().stringField(AdditionalProperty.HIDE.toString()).isNull()); } } + + private boolean isCaseOwnerUser(ICase caze) { + return caze != null && caze.owners() != null && caze + .owners() + .all() + .stream() + .anyMatch(item -> item.member().isMember(Ivy.session(), true)); + } @Override public List load(int first, int pageSize, Map sortBy, Map filterBy) { diff --git a/AxonIvyPortal/portal/src/ch/ivy/addon/portalkit/dto/dashboard/Dashboard.java b/AxonIvyPortal/portal/src/ch/ivy/addon/portalkit/dto/dashboard/Dashboard.java index 7d4a76151e1..0896ec2dc67 100644 --- a/AxonIvyPortal/portal/src/ch/ivy/addon/portalkit/dto/dashboard/Dashboard.java +++ b/AxonIvyPortal/portal/src/ch/ivy/addon/portalkit/dto/dashboard/Dashboard.java @@ -33,9 +33,12 @@ public class Dashboard extends AbstractConfiguration implements Serializable { private List permissionDTOs; @JsonIgnore private String displayedPermission; - private boolean isTopMenu; + private Boolean isTopMenu; - public Dashboard() {} + public Dashboard() { + // Set default values + isTopMenu = false; + } public Dashboard(Dashboard dashboard) { setId(dashboard.getId()); @@ -135,11 +138,11 @@ public void setTemplateId(String templateId) { this.templateId = templateId; } - public boolean getIsTopMenu() { + public Boolean getIsTopMenu() { return isTopMenu; } - public void setIsTopMenu(boolean isTopMenu) { + public void setIsTopMenu(Boolean isTopMenu) { this.isTopMenu = isTopMenu; } diff --git a/AxonIvyPortal/portal/src/ch/ivy/addon/portalkit/dto/dashboard/ProcessDashboardWidget.java b/AxonIvyPortal/portal/src/ch/ivy/addon/portalkit/dto/dashboard/ProcessDashboardWidget.java index 6fe84dc3275..417f8dbbf05 100644 --- a/AxonIvyPortal/portal/src/ch/ivy/addon/portalkit/dto/dashboard/ProcessDashboardWidget.java +++ b/AxonIvyPortal/portal/src/ch/ivy/addon/portalkit/dto/dashboard/ProcessDashboardWidget.java @@ -17,7 +17,6 @@ import ch.ivy.addon.portalkit.ivydata.searchcriteria.DashboardProcessSearchCriteria; import ch.ivy.addon.portalkit.util.DashboardWidgetUtils; import ch.ivy.addon.portalkit.util.SortFieldUtil; -import ch.ivyteam.ivy.environment.Ivy; @JsonInclude(JsonInclude.Include.NON_EMPTY) public class ProcessDashboardWidget extends DashboardWidget { diff --git a/AxonIvyPortal/portal/src/ch/ivy/addon/portalkit/dto/dashboard/casecolumn/CreatorColumnModel.java b/AxonIvyPortal/portal/src/ch/ivy/addon/portalkit/dto/dashboard/casecolumn/CreatorColumnModel.java index 140b4065e74..363010077a0 100644 --- a/AxonIvyPortal/portal/src/ch/ivy/addon/portalkit/dto/dashboard/casecolumn/CreatorColumnModel.java +++ b/AxonIvyPortal/portal/src/ch/ivy/addon/portalkit/dto/dashboard/casecolumn/CreatorColumnModel.java @@ -46,6 +46,7 @@ public DashboardColumnFormat getDefaultFormat() { return DashboardColumnFormat.CUSTOM; } + @Override @JsonIgnore protected int getDefaultColumnWidth() { return EXTRA_WIDTH; diff --git a/AxonIvyPortal/portal/src/ch/ivy/addon/portalkit/dto/dashboard/casecolumn/OwnerColumnModel.java b/AxonIvyPortal/portal/src/ch/ivy/addon/portalkit/dto/dashboard/casecolumn/OwnerColumnModel.java index f7a8091231b..c5ea811f154 100644 --- a/AxonIvyPortal/portal/src/ch/ivy/addon/portalkit/dto/dashboard/casecolumn/OwnerColumnModel.java +++ b/AxonIvyPortal/portal/src/ch/ivy/addon/portalkit/dto/dashboard/casecolumn/OwnerColumnModel.java @@ -17,7 +17,6 @@ import ch.ivy.addon.portalkit.ivydata.utils.ServiceUtilities; import ch.ivy.addon.portalkit.util.SecurityMemberDisplayNameUtils; import ch.ivy.addon.portalkit.util.SecurityMemberUtils; -import ch.ivyteam.ivy.security.ISecurityMember; import ch.ivyteam.ivy.workflow.ICase; public class OwnerColumnModel extends CaseColumnModel implements Serializable { @@ -55,11 +54,10 @@ public String getDefaultStyleClass() { @Override public Object display(ICase caze) { - if (caze == null || caze.getOwner() == null) { + if (caze == null || CollectionUtils.isEmpty(caze.owners().all())) { return StringUtils.EMPTY; } - ISecurityMember member = caze.getOwner(); - return SecurityMemberDisplayNameUtils.generateBriefDisplayNameForSecurityMember(member, member.getMemberName()); + return SecurityMemberDisplayNameUtils.generateBriefDisplayNameForCaseOwners(caze.owners()); } @JsonIgnore @@ -71,9 +69,9 @@ public List getOwners() { public void setOwners(List owner) { if (owner != null) { this.filterList = owner.stream().map(SecurityMemberDTO::getMemberName).collect(Collectors.toList()); - } else { - this.filterList = new ArrayList<>(); - } + return; + } + this.filterList = new ArrayList<>(); } @JsonIgnore @@ -85,9 +83,9 @@ public List getUserFilterOwners() { public void setUserFilterOwners(List owners) { if (owners != null) { this.userFilterList = owners.stream().map(SecurityMemberDTO::getMemberName).collect(Collectors.toList()); - } else { - this.userFilterList = new ArrayList<>(); - } + return; + } + this.userFilterList = new ArrayList<>(); } public List completeUserFilterOwners(String query) { @@ -111,4 +109,10 @@ private List toSecurityMemberDTOs(List filters, Strin private SecurityMemberDTO findSecurityMember(String memberName) { return ServiceUtilities.findSecurityMemberByName(memberName); } + + @Override + public Boolean getDefaultSortable() { + return false; + } + } diff --git a/AxonIvyPortal/portal/src/ch/ivy/addon/portalkit/dto/dashboard/taskcolumn/DescriptionColumnModel.java b/AxonIvyPortal/portal/src/ch/ivy/addon/portalkit/dto/dashboard/taskcolumn/DescriptionColumnModel.java index 05c7a63047e..151c88403a8 100644 --- a/AxonIvyPortal/portal/src/ch/ivy/addon/portalkit/dto/dashboard/taskcolumn/DescriptionColumnModel.java +++ b/AxonIvyPortal/portal/src/ch/ivy/addon/portalkit/dto/dashboard/taskcolumn/DescriptionColumnModel.java @@ -29,6 +29,7 @@ public Boolean getDefaultSortable() { return false; } + @Override protected int getDefaultColumnWidth() { return LARGE_WIDTH; } diff --git a/AxonIvyPortal/portal/src/ch/ivy/addon/portalkit/exporter/CaseDashboardExporter.java b/AxonIvyPortal/portal/src/ch/ivy/addon/portalkit/exporter/CaseDashboardExporter.java index 6c08e971197..1211fbec002 100644 --- a/AxonIvyPortal/portal/src/ch/ivy/addon/portalkit/exporter/CaseDashboardExporter.java +++ b/AxonIvyPortal/portal/src/ch/ivy/addon/portalkit/exporter/CaseDashboardExporter.java @@ -86,9 +86,7 @@ private Object getCommonColumnValue(DashboardStandardCaseColumn sortField, ICase : SecurityMemberDisplayNameUtils.generateBriefDisplayNameForSecurityMember(caseItem.getCreatorUser(), caseItem.getCreatorUserName()); case CREATED -> caseItem.getStartTimestamp(); case FINISHED -> caseItem.getEndTimestamp(); - case OWNER -> caseItem.getOwnerName() == null - ? Ivy.cms().co("/ch.ivy.addon.portalkit.ui.jsf/common/notAvailable") - : SecurityMemberDisplayNameUtils.generateBriefDisplayNameForSecurityMember(caseItem.getOwner(), caseItem.getOwnerName()); + case OWNER -> SecurityMemberDisplayNameUtils.generateBriefDisplayNameForCaseOwners(caseItem.owners()); case CATEGORY-> caseItem.getCategory().getPath(); case APPLICATION -> caseItem.getApplication().getName(); default -> ""; @@ -115,18 +113,13 @@ private Object getCustomColumnValue(String column, ICase caseItem) { return ""; } - switch (fieldFormat) { - case NUMBER: - return caseItem.customFields().numberField(fieldName).getOrNull(); - case STRING: - return caseItem.customFields().stringField(fieldName).getOrNull(); - case TEXT: - return caseItem.customFields().textField(fieldName).getOrNull(); - case TIMESTAMP: - return caseItem.customFields().timestampField(fieldName).getOrNull(); - default: - return ""; - } + return switch (fieldFormat) { + case NUMBER -> caseItem.customFields().numberField(fieldName).getOrNull(); + case STRING -> caseItem.customFields().stringField(fieldName).getOrNull(); + case TEXT -> caseItem.customFields().textField(fieldName).getOrNull(); + case TIMESTAMP -> caseItem.customFields().timestampField(fieldName).getOrNull(); + default -> ""; + }; } /** diff --git a/AxonIvyPortal/portal/src/ch/ivy/addon/portalkit/exporter/CaseExporter.java b/AxonIvyPortal/portal/src/ch/ivy/addon/portalkit/exporter/CaseExporter.java index 036f0782505..ce5ccc18c22 100644 --- a/AxonIvyPortal/portal/src/ch/ivy/addon/portalkit/exporter/CaseExporter.java +++ b/AxonIvyPortal/portal/src/ch/ivy/addon/portalkit/exporter/CaseExporter.java @@ -97,34 +97,23 @@ protected Object getCommonColumnValue(String column, ICase caseItem) { } CaseSortField sortField = CaseSortField.valueOf(column); - switch (sortField) { - case NAME: - return StringUtils.isEmpty(caseItem.names().current()) ? Ivy.cms().co("/Dialogs/ch/ivy/addon/portalkit/component/CaseWidget/caseNameNotAvailable") : caseItem.names().current(); - case ID: - return String.valueOf(caseItem.getId()); - case CREATOR: + return switch (sortField) { + case NAME -> StringUtils.isEmpty(caseItem.names().current()) ? Ivy.cms().co("/Dialogs/ch/ivy/addon/portalkit/component/CaseWidget/caseNameNotAvailable") : caseItem.names().current(); + case ID -> String.valueOf(caseItem.getId()); + case CREATOR -> { if (caseItem.getCreatorUserName() == null) { - return Ivy.cms().co("/ch.ivy.addon.portalkit.ui.jsf/common/notAvailable"); + yield Ivy.cms().co("/ch.ivy.addon.portalkit.ui.jsf/common/notAvailable"); } - return SecurityMemberDisplayNameUtils.generateBriefDisplayNameForSecurityMember(caseItem.getCreatorUser(), caseItem.getCreatorUserName()); - case OWNER: - if (caseItem.getOwnerName() == null) { - return Ivy.cms().co("/ch.ivy.addon.portalkit.ui.jsf/common/notAvailable"); - } - return SecurityMemberDisplayNameUtils.generateBriefDisplayNameForSecurityMember(caseItem.getOwner(), caseItem.getOwnerName()); - case CREATION_TIME: - return caseItem.getStartTimestamp(); - case FINISHED_TIME: - return caseItem.getEndTimestamp(); - case STATE: - return CaseUtils.convertToUserFriendlyCaseState(caseItem.getBusinessState()); - case CATEGORY: - return caseItem.getCategory().getPath(); - case APPLICATION: - return caseItem.getApplication().getName(); - default: - return ""; - } + yield SecurityMemberDisplayNameUtils.generateBriefDisplayNameForSecurityMember(caseItem.getCreatorUser(), caseItem.getCreatorUserName()); + } + case OWNER -> SecurityMemberDisplayNameUtils.generateBriefDisplayNameForCaseOwners(caseItem.owners()); + case CREATION_TIME -> caseItem.getStartTimestamp(); + case FINISHED_TIME -> caseItem.getEndTimestamp(); + case STATE -> CaseUtils.convertToUserFriendlyCaseState(caseItem.getBusinessState()); + case CATEGORY -> caseItem.getCategory().getPath(); + case APPLICATION -> caseItem.getApplication().getName(); + default -> ""; + }; } /** diff --git a/AxonIvyPortal/portal/src/ch/ivy/addon/portalkit/exporter/internal/NoteHistoryExporter.java b/AxonIvyPortal/portal/src/ch/ivy/addon/portalkit/exporter/internal/NoteHistoryExporter.java index dd223354db2..360d65a239e 100644 --- a/AxonIvyPortal/portal/src/ch/ivy/addon/portalkit/exporter/internal/NoteHistoryExporter.java +++ b/AxonIvyPortal/portal/src/ch/ivy/addon/portalkit/exporter/internal/NoteHistoryExporter.java @@ -19,11 +19,11 @@ import ch.ivy.addon.portalkit.util.SecurityMemberDisplayNameUtils; import ch.ivyteam.ivy.environment.Ivy; import ch.ivyteam.ivy.workflow.ICase; -import ch.ivyteam.ivy.workflow.INote; +import ch.ivyteam.ivy.workflow.note.Note; public class NoteHistoryExporter { - public StreamedContent getStreamedContentOfTaskNoteHistory(List taskNoteHistory, String fileName) { + public StreamedContent getStreamedContentOfTaskNoteHistory(List taskNoteHistory, String fileName) { List> rows = generateDataForTaskNoteHistory(taskNoteHistory); ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); @@ -88,13 +88,13 @@ private List generateHeaders(boolean isBusinessCase) { return headers; } - private List> generateDataForTaskNoteHistory(List taskNoteHistory) { + private List> generateDataForTaskNoteHistory(List taskNoteHistory) { List> rows = new ArrayList<>(); - for (INote taskNote : taskNoteHistory) { + for (Note taskNote : taskNoteHistory) { List row = new ArrayList<>(); - row.add(taskNote.getMessage()); - row.add(SecurityMemberDisplayNameUtils.generateBriefDisplayNameForUser(taskNote.getWritter(), taskNote.getWritter().getName())); - row.add(formatDate(taskNote.getCreationTimestamp())); + row.add(taskNote.content()); + row.add(SecurityMemberDisplayNameUtils.generateBriefDisplayNameForUser(taskNote.author(), taskNote.authorName())); + row.add(formatDate(taskNote.createdAt())); rows.add(row); } return rows; diff --git a/AxonIvyPortal/portal/src/ch/ivy/addon/portalkit/ivydata/searchcriteria/CaseSearchCriteria.java b/AxonIvyPortal/portal/src/ch/ivy/addon/portalkit/ivydata/searchcriteria/CaseSearchCriteria.java index c70aea8629c..c10254dedb4 100644 --- a/AxonIvyPortal/portal/src/ch/ivy/addon/portalkit/ivydata/searchcriteria/CaseSearchCriteria.java +++ b/AxonIvyPortal/portal/src/ch/ivy/addon/portalkit/ivydata/searchcriteria/CaseSearchCriteria.java @@ -163,7 +163,6 @@ public CaseSortingQueryAppender appendSorting(CaseSearchCriteria criteria) { appendSortByStartTimeIfSet(criteria); appendSortByEndTimeIfSet(criteria); appendSortByCreatorIfSet(criteria); - appendSortByOwnerIfSet(criteria); appendSortByStateIfSet(criteria); return this; } @@ -222,16 +221,6 @@ private void appendSortByCreatorIfSet(CaseSearchCriteria criteria) { } } - private void appendSortByOwnerIfSet(CaseSearchCriteria criteria) { - if (!CaseSortField.OWNER.toString().equalsIgnoreCase(criteria.getSortField())) { - return; - } - OrderByColumnQuery orderByName = query.orderBy().ownerDisplayName(); - if (criteria.isSortDescending()) { - orderByName.descending(); - } - } - private void appendSortByStateIfSet(CaseSearchCriteria criteria) { if (!CaseSortField.STATE.toString().equalsIgnoreCase(criteria.getSortField())) { return; diff --git a/AxonIvyPortal/portal/src/ch/ivy/addon/portalkit/ivydata/searchcriteria/DashboardCaseSearchCriteria.java b/AxonIvyPortal/portal/src/ch/ivy/addon/portalkit/ivydata/searchcriteria/DashboardCaseSearchCriteria.java index 65577909027..d4080d46991 100644 --- a/AxonIvyPortal/portal/src/ch/ivy/addon/portalkit/ivydata/searchcriteria/DashboardCaseSearchCriteria.java +++ b/AxonIvyPortal/portal/src/ch/ivy/addon/portalkit/ivydata/searchcriteria/DashboardCaseSearchCriteria.java @@ -172,7 +172,6 @@ public CaseSortingQueryAppender appendSorting(DashboardCaseSearchCriteria criter appendSortByIdIfSet(criteria); appendSortByCreationDateIfSet(criteria); appendSortByStateIfSet(criteria); - appendSortByOwnerIfSet(criteria); appendSortByEndDateIfSet(criteria); appendSortByCustomFieldIfSet(criteria); if (criteria.isSortDescending()) { @@ -188,14 +187,6 @@ private void appendSortByEndDateIfSet(DashboardCaseSearchCriteria criteria) { } } - private void appendSortByOwnerIfSet(DashboardCaseSearchCriteria criteria) { - if (DashboardStandardCaseColumn.OWNER.getField().equalsIgnoreCase(criteria.getSortField()) - && GlobalSettingService.getInstance().isCaseOwnerEnabled()) { - order = query.orderBy().ownerDisplayName(); - sortStandardColumn = true; - } - } - private void appendSortByNameIfSet(DashboardCaseSearchCriteria criteria) { if (DashboardStandardCaseColumn.NAME.getField().equalsIgnoreCase(criteria.getSortField())) { order = query.orderBy().name(); diff --git a/AxonIvyPortal/portal/src/ch/ivy/addon/portalkit/ivydata/searchcriteria/DashboardProcessCaseSearchCriteria.java b/AxonIvyPortal/portal/src/ch/ivy/addon/portalkit/ivydata/searchcriteria/DashboardProcessCaseSearchCriteria.java index 6377773a96f..087b4150005 100644 --- a/AxonIvyPortal/portal/src/ch/ivy/addon/portalkit/ivydata/searchcriteria/DashboardProcessCaseSearchCriteria.java +++ b/AxonIvyPortal/portal/src/ch/ivy/addon/portalkit/ivydata/searchcriteria/DashboardProcessCaseSearchCriteria.java @@ -87,7 +87,6 @@ public CaseSortingQueryAppender appendSorting(DashboardProcessCaseSearchCriteria appendSortByIdIfSet(criteria); appendSortByCreationDateIfSet(criteria); appendSortByStateIfSet(criteria); - appendSortByOwnerIfSet(criteria); appendSortByEndDateIfSet(criteria); if (criteria.isSortDescending()) { order.descending(); @@ -101,12 +100,6 @@ private void appendSortByEndDateIfSet(DashboardProcessCaseSearchCriteria criteri } } - private void appendSortByOwnerIfSet(DashboardProcessCaseSearchCriteria criteria) { - if (DashboardStandardCaseColumn.OWNER.getField().equalsIgnoreCase(criteria.getSortField())) { - order = query.orderBy().ownerDisplayName(); - } - } - private void appendSortByNameIfSet(DashboardProcessCaseSearchCriteria criteria) { if (DashboardStandardCaseColumn.NAME.getField().equalsIgnoreCase(criteria.getSortField())) { order = query.orderBy().name(); diff --git a/AxonIvyPortal/portal/src/ch/ivy/addon/portalkit/persistence/converter/BusinessEntityConverter.java b/AxonIvyPortal/portal/src/ch/ivy/addon/portalkit/persistence/converter/BusinessEntityConverter.java index 2c1917cb585..67d7f464a8c 100644 --- a/AxonIvyPortal/portal/src/ch/ivy/addon/portalkit/persistence/converter/BusinessEntityConverter.java +++ b/AxonIvyPortal/portal/src/ch/ivy/addon/portalkit/persistence/converter/BusinessEntityConverter.java @@ -20,7 +20,9 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.json.JsonMapper; +import ch.ivy.addon.portalkit.dto.dashboard.Dashboard; import ch.ivy.addon.portalkit.service.exception.PortalException; +import ch.ivy.addon.portalkit.util.DashboardUtils; /** * This class provides method to convert Business entity object into JSON value and reverse @@ -32,6 +34,10 @@ public class BusinessEntityConverter { public BusinessEntityConverter() {} public static String entityToJsonValue(Object entity) { + return objectEntityToJsonValue(entity); + } + + private static String objectEntityToJsonValue(Object entity) { try { return getObjectMapper().writeValueAsString(entity); } catch (JsonProcessingException e) { @@ -40,6 +46,10 @@ public static String entityToJsonValue(Object entity) { } public static String prettyPrintEntityToJsonValue(Object entity) { + return prettyPrintObjectEntityToJsonValue(entity); + } + + private static String prettyPrintObjectEntityToJsonValue(Object entity) { try { return getObjectMapper().writerWithDefaultPrettyPrinter().writeValueAsString(entity); } catch (JsonProcessingException e) { @@ -126,4 +136,14 @@ public static List convertJsonToListString(String value) return new ArrayList<>(); } + + public static String entityToJsonValue(List dashboards) { + DashboardUtils.updatePropertiesToNullIfCurrentValueIsDefaultValue(dashboards); + return objectEntityToJsonValue(dashboards); + } + + public static String prettyPrintEntityToJsonValue(List dashboards) { + DashboardUtils.updatePropertiesToNullIfCurrentValueIsDefaultValue(dashboards); + return prettyPrintObjectEntityToJsonValue(dashboards); + } } diff --git a/AxonIvyPortal/portal/src/ch/ivy/addon/portalkit/service/HistoryService.java b/AxonIvyPortal/portal/src/ch/ivy/addon/portalkit/service/HistoryService.java index e3890f0b413..3c843fd327b 100644 --- a/AxonIvyPortal/portal/src/ch/ivy/addon/portalkit/service/HistoryService.java +++ b/AxonIvyPortal/portal/src/ch/ivy/addon/portalkit/service/HistoryService.java @@ -20,20 +20,14 @@ import ch.ivyteam.ivy.security.ISecurityConstants; import ch.ivyteam.ivy.security.exec.Sudo; import ch.ivyteam.ivy.workflow.ICase; -import ch.ivyteam.ivy.workflow.INote; import ch.ivyteam.ivy.workflow.ITask; import ch.ivyteam.ivy.workflow.IWorkflowEvent; +import ch.ivyteam.ivy.workflow.note.Note; public class HistoryService { private static final String CASE_NAME_FORMAT = "#%d %s"; - public List getHistories(List tasks, List notes, boolean excludeSystemTasks, boolean excludeSystemNotes) { - List historiesRelatedToTasks = createHistoriesFromITasks(tasks, excludeSystemTasks); - List historiesRelatedToNotes = createHistoriesFromINotes(notes, excludeSystemNotes); - return sortHistoriesByTimeStampDescending(Arrays.asList(historiesRelatedToTasks, historiesRelatedToNotes)); - } - public List getCaseHistories(Long selectedCaseId, List tasks, List cases, boolean excludeSystemTasks, boolean excludeSystemNotes) { var historiesRelatedToTasks = createHistoriesFromITasks(tasks, excludeSystemTasks, selectedCaseId); @@ -46,7 +40,7 @@ public List getCaseHistories(Long selectedCaseId, List tasks, Li private List createCaseHistories(boolean excludeSystemNotes, ICase caseHistory, Long selectedCaseId) { var histories = new ArrayList(); - for (var note : caseHistory.getNotes()) { + for (var note : caseHistory.notes().all()) { if(excludeSystemNotes && !isNotSystemNote(note)) { continue; } @@ -89,14 +83,7 @@ private List sortHistoriesByTimeStampDescending(List> lis return allHistories; } - private List createHistoriesFromITasks(List tasks, boolean excludeSystemTasks) { - if (excludeSystemTasks) { - return tasks.stream().filter(isNotSystemTaskNote()).map(this::createHistoryFrom).collect(Collectors.toList()); - } - return tasks.stream().map(this::createHistoryFrom).collect(Collectors.toList()); - } - - public List createHistoriesFromINotes(List notes, boolean excludeSystemNotes) { + public List createHistoriesFromINotes(List notes, boolean excludeSystemNotes) { if(excludeSystemNotes) { return notes.stream().filter(note -> isNotSystemNote(note)) .map(this::createHistoryFrom).collect(Collectors.toList()); @@ -108,8 +95,8 @@ private Predicate isNotSystemTaskNote() { return task -> !StringUtils.equals(task.getWorkerUserName(), ISecurityConstants.SYSTEM_USER_NAME); } - private boolean isNotSystemNote(INote note) { - return !StringUtils.equals(note.getWritterName(), ISecurityConstants.SYSTEM_USER_NAME); + private boolean isNotSystemNote(Note note) { + return !StringUtils.equals(note.authorName(), ISecurityConstants.SYSTEM_USER_NAME); } public History createHistoryFrom(ITask task) { @@ -164,13 +151,13 @@ private List getTaskWorkflowEvents(ITask task) { }); } - public History createHistoryFrom(INote note) { + public History createHistoryFrom(Note note) { History history = new History(); - history.setId(note.getId()); - history.setContent(note.getMessage()); - history.setInvolvedUser(note.getWritter()); - history.setInvolvedUsername(note.getWritterName()); - history.setTimestamp(new Timestamp(note.getCreationTimestamp().getTime())); + history.setId(note.id()); + history.setContent(note.content()); + history.setInvolvedUser(note.author()); + history.setInvolvedUsername(note.authorName()); + history.setTimestamp(new Timestamp(note.createdAt().getTime())); history.setType(HistoryType.NOTE); return history; } diff --git a/AxonIvyPortal/portal/src/ch/ivy/addon/portalkit/util/CaseUtils.java b/AxonIvyPortal/portal/src/ch/ivy/addon/portalkit/util/CaseUtils.java index 5d2b9ff6332..a475e19bc45 100644 --- a/AxonIvyPortal/portal/src/ch/ivy/addon/portalkit/util/CaseUtils.java +++ b/AxonIvyPortal/portal/src/ch/ivy/addon/portalkit/util/CaseUtils.java @@ -16,8 +16,8 @@ import ch.ivyteam.ivy.security.exec.Sudo; import ch.ivyteam.ivy.workflow.CaseState; import ch.ivyteam.ivy.workflow.ICase; -import ch.ivyteam.ivy.workflow.INote; import ch.ivyteam.ivy.workflow.caze.CaseBusinessState; +import ch.ivyteam.ivy.workflow.note.Note; import ch.ivyteam.ivy.workflow.query.CaseQuery; public final class CaseUtils { @@ -39,12 +39,12 @@ public static List findSubCasesByBusinessCaseId(long caseId) { }); } - public static List findNotes(ICase iCase, boolean excludeSystemNotes) { + public static List findNotes(ICase iCase, boolean excludeSystemNotes) { Objects.requireNonNull(iCase, "Case must not be null"); - List notes = iCase.getNotes(); + List notes = iCase.notes().all(); if (excludeSystemNotes) { notes = notes.stream() - .filter(n -> !StringUtils.equals(n.getWritterName(), ISecurityConstants.SYSTEM_USER_NAME)) + .filter(n -> !StringUtils.equals(n.authorName(), ISecurityConstants.SYSTEM_USER_NAME)) .collect(Collectors.toList()); } return new ArrayList<>(notes); diff --git a/AxonIvyPortal/portal/src/ch/ivy/addon/portalkit/util/DashboardUtils.java b/AxonIvyPortal/portal/src/ch/ivy/addon/portalkit/util/DashboardUtils.java index fc65b3943a7..f42e63ec3d2 100644 --- a/AxonIvyPortal/portal/src/ch/ivy/addon/portalkit/util/DashboardUtils.java +++ b/AxonIvyPortal/portal/src/ch/ivy/addon/portalkit/util/DashboardUtils.java @@ -13,6 +13,7 @@ import java.util.function.Consumer; import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.BooleanUtils; import org.apache.commons.lang3.StringUtils; import org.primefaces.PrimeFaces; @@ -311,4 +312,19 @@ public static boolean isMainDashboard(String dashboardId, boolean defaultValue) return isMainDashboard; } + + /** + * Uses this method before saving a dashboard to simplify generated json from the dashboard + */ + public static void updatePropertiesToNullIfCurrentValueIsDefaultValue(List dashboards) { + if (CollectionUtils.isEmpty(dashboards)) { + return; + } + for (Dashboard dashboard : dashboards) { + if (BooleanUtils.isFalse(dashboard.getIsTopMenu())) { + dashboard.setIsTopMenu(null); + } + } + } + } diff --git a/AxonIvyPortal/portal/src/ch/ivy/addon/portalkit/util/SecurityMemberDisplayNameUtils.java b/AxonIvyPortal/portal/src/ch/ivy/addon/portalkit/util/SecurityMemberDisplayNameUtils.java index 523e266b2ff..84f3bd5f573 100644 --- a/AxonIvyPortal/portal/src/ch/ivy/addon/portalkit/util/SecurityMemberDisplayNameUtils.java +++ b/AxonIvyPortal/portal/src/ch/ivy/addon/portalkit/util/SecurityMemberDisplayNameUtils.java @@ -2,6 +2,7 @@ import java.util.ArrayList; import java.util.List; +import java.util.stream.Collectors; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang.StringUtils; @@ -12,6 +13,7 @@ import ch.ivyteam.ivy.environment.Ivy; import ch.ivyteam.ivy.security.ISecurityMember; import ch.ivyteam.ivy.security.IUser; +import ch.ivyteam.ivy.workflow.caze.owner.CaseOwners; public class SecurityMemberDisplayNameUtils { @@ -22,7 +24,17 @@ public class SecurityMemberDisplayNameUtils { private static final String FORMAT_WITHOUT_DISPLAY_NAME = "<%s> (%s)"; private static final String FORMAT_DISABLED_USER = "%s %s"; - + public static String generateBriefDisplayNameForCaseOwners(CaseOwners owners) { + if (owners == null) { + return ""; + } + return CollectionUtils.emptyIfNull(owners.all()) + .stream() + .map(item -> generateBriefDisplayNameForSecurityMember(item.member(), item.memberName())) + .collect(Collectors.joining(", ")); + } + + public static String generateBriefDisplayNameForSecurityMember(ISecurityMember securityMember, String securityMemberName) { if(StringUtils.isBlank(securityMemberName)) { return Ivy.cms().co(NOT_AVAILABLE_CMS); diff --git a/AxonIvyPortal/portal/src/ch/ivy/addon/portalkit/util/TaskUtils.java b/AxonIvyPortal/portal/src/ch/ivy/addon/portalkit/util/TaskUtils.java index 5b929156c6e..191926fce6a 100644 --- a/AxonIvyPortal/portal/src/ch/ivy/addon/portalkit/util/TaskUtils.java +++ b/AxonIvyPortal/portal/src/ch/ivy/addon/portalkit/util/TaskUtils.java @@ -6,6 +6,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Date; +import java.util.EnumSet; import java.util.List; import java.util.stream.Collectors; @@ -21,14 +22,17 @@ import ch.ivy.addon.portalkit.datamodel.internal.RelatedTaskLazyDataModel; import ch.ivy.addon.portalkit.dto.TaskEndInfo; import ch.ivy.addon.portalkit.enums.PortalPage; +import ch.ivy.addon.portalkit.enums.PortalPermission; import ch.ivy.addon.portalkit.enums.SessionAttribute; import ch.ivy.addon.portalkit.ivydata.searchcriteria.TaskSearchCriteria; import ch.ivy.addon.portalkit.service.StickyTaskListService; import ch.ivy.addon.portalkit.service.TaskInforActionService; import ch.ivyteam.ivy.environment.Ivy; +import ch.ivyteam.ivy.security.IPermission; import ch.ivyteam.ivy.security.ISecurityMember; import ch.ivyteam.ivy.security.IUser; import ch.ivyteam.ivy.security.exec.Sudo; +import ch.ivyteam.ivy.security.restricted.permission.IPermissionRepository; import ch.ivyteam.ivy.workflow.ICase; import ch.ivyteam.ivy.workflow.ITask; import ch.ivyteam.ivy.workflow.IWorkflowSession; @@ -365,4 +369,33 @@ public static String convertToUserFriendlyTaskPriority(WorkflowPriority priority return Ivy.cms().co(PRIORITY_CMS_PATH + priority); } + + public static boolean canReset(ITask task) { + if (task == null) { + return false; + } + + EnumSet taskStates = EnumSet.of(TaskState.RESUMED, TaskState.PARKED, TaskState.READY_FOR_JOIN, + TaskState.FAILED); + if (!taskStates.contains(task.getState())) { + return false; + } + + if (task.getState() == TaskState.READY_FOR_JOIN) { + IPermission resetTaskReadyForJoin = IPermissionRepository.instance().findByName(PortalPermission.TASK_RESET_READY_FOR_JOIN.getValue()); + return hasPermission(task, resetTaskReadyForJoin); + } + + + return (hasPermission(task, IPermission.TASK_RESET_OWN_WORKING_TASK) && canResume(task)) + || hasPermission(task, IPermission.TASK_RESET); + } + + private static boolean hasPermission(ITask task, IPermission permission) { + if (task == null || permission == null) { + return false; + } + return PermissionUtils.hasPermission(permission); + } + } diff --git a/AxonIvyPortal/portal/src/com/axonivy/portal/bean/dashboard/filter/TaskWidgetUserFilterBean.java b/AxonIvyPortal/portal/src/com/axonivy/portal/bean/dashboard/filter/TaskWidgetUserFilterBean.java index 899a8379bc0..e47be0e1d35 100644 --- a/AxonIvyPortal/portal/src/com/axonivy/portal/bean/dashboard/filter/TaskWidgetUserFilterBean.java +++ b/AxonIvyPortal/portal/src/com/axonivy/portal/bean/dashboard/filter/TaskWidgetUserFilterBean.java @@ -38,9 +38,14 @@ private void initUserFilters() { } for (DashboardFilter filter : this.widget.getUserFilters()) { + if (Optional.ofNullable(filter).map(DashboardFilter::getFilterType) + .isEmpty()) { + return; + } + FilterField filterField = TaskFilterFieldFactory - .findBy(Optional.ofNullable(filter).map(DashboardFilter::getField).orElse(""), - Optional.ofNullable(filter).map(DashboardFilter::getFilterType).orElse(null)); + .findBy(Optional.ofNullable(filter).map(DashboardFilter::getField) + .orElse(""), filter.getFilterType()); if (filterField != null) { filterField.initFilter(filter); } diff --git a/AxonIvyPortal/portal/src/com/axonivy/portal/migration/dashboard/converter/JsonDashboardConverterFactory.java b/AxonIvyPortal/portal/src/com/axonivy/portal/migration/dashboard/converter/JsonDashboardConverterFactory.java index fb0b1f06dbe..6ab00122140 100644 --- a/AxonIvyPortal/portal/src/com/axonivy/portal/migration/dashboard/converter/JsonDashboardConverterFactory.java +++ b/AxonIvyPortal/portal/src/com/axonivy/portal/migration/dashboard/converter/JsonDashboardConverterFactory.java @@ -23,17 +23,14 @@ public static List getConverters(AbstractJsonVersion version) { new com.axonivy.portal.migration.dashboard.converter.v113.DashboardCaseWidgetConverter(), new com.axonivy.portal.migration.dashboard.converter.v113.DashboardTaskWidgetConverter()); - private static final List LE114 = List - .of(new com.axonivy.portal.migration.dashboard.converter.v114.DashboardProcessWidgetConverter()); - private static final List LE120 = List - .of(new com.axonivy.portal.migration.dashboard.converter.v120.DashboardStatisticWidgetConverter()); + .of(new com.axonivy.portal.migration.dashboard.converter.v120.DashboardProcessWidgetConverter(), + new com.axonivy.portal.migration.dashboard.converter.v120.DashboardStatisticWidgetConverter()); static { CONVERTERS.addAll(LE112); CONVERTERS.addAll(LE113); - CONVERTERS.addAll(LE114); CONVERTERS.addAll(LE120); } } diff --git a/AxonIvyPortal/portal/src/com/axonivy/portal/migration/dashboard/converter/v114/DashboardProcessWidgetConverter.java b/AxonIvyPortal/portal/src/com/axonivy/portal/migration/dashboard/converter/v120/DashboardProcessWidgetConverter.java similarity index 94% rename from AxonIvyPortal/portal/src/com/axonivy/portal/migration/dashboard/converter/v114/DashboardProcessWidgetConverter.java rename to AxonIvyPortal/portal/src/com/axonivy/portal/migration/dashboard/converter/v120/DashboardProcessWidgetConverter.java index a8fe3737724..ea33bde3bec 100644 --- a/AxonIvyPortal/portal/src/com/axonivy/portal/migration/dashboard/converter/v114/DashboardProcessWidgetConverter.java +++ b/AxonIvyPortal/portal/src/com/axonivy/portal/migration/dashboard/converter/v120/DashboardProcessWidgetConverter.java @@ -1,4 +1,4 @@ -package com.axonivy.portal.migration.dashboard.converter.v114; +package com.axonivy.portal.migration.dashboard.converter.v120; import com.axonivy.portal.bo.jsonversion.AbstractJsonVersion; import com.axonivy.portal.bo.jsonversion.DashboardJsonVersion; @@ -44,7 +44,7 @@ public String getNewType() { @Override public AbstractJsonVersion version() { - return new DashboardJsonVersion("11.4.0"); + return new DashboardJsonVersion("12.0.0"); } @Override diff --git a/AxonIvyPortal/portal/src/com/axonivy/portal/migration/dashboardtemplate/converter/JsonDashboardTemplateConverterFactory.java b/AxonIvyPortal/portal/src/com/axonivy/portal/migration/dashboardtemplate/converter/JsonDashboardTemplateConverterFactory.java index 5eac8c1784a..35e4b1ae592 100644 --- a/AxonIvyPortal/portal/src/com/axonivy/portal/migration/dashboardtemplate/converter/JsonDashboardTemplateConverterFactory.java +++ b/AxonIvyPortal/portal/src/com/axonivy/portal/migration/dashboardtemplate/converter/JsonDashboardTemplateConverterFactory.java @@ -25,12 +25,12 @@ public static List getConverters(AbstractJsonVersion version) { new com.axonivy.portal.migration.dashboard.converter.v113.DashboardTaskWidgetConverter() ); - private static final List LE114 = List.of( - new com.axonivy.portal.migration.dashboard.converter.v114.DashboardProcessWidgetConverter()); + private static final List LE120 = List.of( + new com.axonivy.portal.migration.dashboard.converter.v120.DashboardProcessWidgetConverter()); static { CONVERTERS.addAll(LE112); CONVERTERS.addAll(LE113); - CONVERTERS.addAll(LE114); + CONVERTERS.addAll(LE120); } } diff --git a/AxonIvyPortal/portal/src/com/axonivy/portal/migration/dashboardtemplate/converter/v114/DashboardTemplateProcessWidgetConverter.java b/AxonIvyPortal/portal/src/com/axonivy/portal/migration/dashboardtemplate/converter/v120/DashboardTemplateProcessWidgetConverter.java similarity index 97% rename from AxonIvyPortal/portal/src/com/axonivy/portal/migration/dashboardtemplate/converter/v114/DashboardTemplateProcessWidgetConverter.java rename to AxonIvyPortal/portal/src/com/axonivy/portal/migration/dashboardtemplate/converter/v120/DashboardTemplateProcessWidgetConverter.java index b9d7f8b266a..8287abe090f 100644 --- a/AxonIvyPortal/portal/src/com/axonivy/portal/migration/dashboardtemplate/converter/v114/DashboardTemplateProcessWidgetConverter.java +++ b/AxonIvyPortal/portal/src/com/axonivy/portal/migration/dashboardtemplate/converter/v120/DashboardTemplateProcessWidgetConverter.java @@ -1,4 +1,4 @@ -package com.axonivy.portal.migration.dashboardtemplate.converter.v114; +package com.axonivy.portal.migration.dashboardtemplate.converter.v120; import com.axonivy.portal.bo.jsonversion.AbstractJsonVersion; import com.axonivy.portal.bo.jsonversion.DashboardTemplateJsonVersion; @@ -43,7 +43,7 @@ public String getNewType() { @Override public AbstractJsonVersion version() { - return new DashboardTemplateJsonVersion("11.4.0"); + return new DashboardTemplateJsonVersion("12.0.0"); } @Override diff --git a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/component/ProcessInformation/ProcessInformationData.d.json b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/component/ProcessInformation/ProcessInformationData.d.json index 198426aa535..f7e2daf5b89 100644 --- a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/component/ProcessInformation/ProcessInformationData.d.json +++ b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/component/ProcessInformation/ProcessInformationData.d.json @@ -5,20 +5,17 @@ "isBusinessCaseData" : false, "fields" : [ { "name" : "processSteps", - "type" : "java.util.List", - "modifiers" : [ "PERSISTENT" ] + "type" : "java.util.List" }, { "name" : "processId", "type" : "String", "modifiers" : [ "PERSISTENT" ] }, { "name" : "userProcesses", - "type" : "java.util.List", - "modifiers" : [ "PERSISTENT" ] + "type" : "java.util.List" }, { "name" : "selectedProcess", - "type" : "ch.ivy.addon.portalkit.configuration.UserProcess", - "modifiers" : [ "PERSISTENT" ] + "type" : "ch.ivy.addon.portalkit.configuration.UserProcess" }, { "name" : "portalProcessInformation", "type" : "String", diff --git a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/component/iframe/CaseInformationInIFrame/CaseInformationInIFrameData.d.json b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/component/iframe/CaseInformationInIFrame/CaseInformationInIFrameData.d.json index 706a269a518..ec57d1a3df6 100644 --- a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/component/iframe/CaseInformationInIFrame/CaseInformationInIFrameData.d.json +++ b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/component/iframe/CaseInformationInIFrame/CaseInformationInIFrameData.d.json @@ -5,8 +5,7 @@ "isBusinessCaseData" : false, "fields" : [ { "name" : "currentCase", - "type" : "ch.ivyteam.ivy.workflow.ICase", - "modifiers" : [ "PERSISTENT" ] + "type" : "ch.ivyteam.ivy.workflow.ICase" }, { "name" : "showBackButton", "type" : "Boolean", diff --git a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/component/iframe/PortalTaskItemDetailsInIFrame/PortalTaskItemDetailsInIFrameData.d.json b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/component/iframe/PortalTaskItemDetailsInIFrame/PortalTaskItemDetailsInIFrameData.d.json index 609447ba5b2..1f5224c4cf7 100644 --- a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/component/iframe/PortalTaskItemDetailsInIFrame/PortalTaskItemDetailsInIFrameData.d.json +++ b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/component/iframe/PortalTaskItemDetailsInIFrame/PortalTaskItemDetailsInIFrameData.d.json @@ -5,20 +5,17 @@ "isBusinessCaseData" : false, "fields" : [ { "name" : "dataModel", - "type" : "ch.ivy.addon.portalkit.datamodel.TaskLazyDataModel", - "modifiers" : [ "PERSISTENT" ] + "type" : "ch.ivy.addon.portalkit.datamodel.TaskLazyDataModel" }, { "name" : "isFromTaskList", "type" : "Boolean", "modifiers" : [ "PERSISTENT" ] }, { "name" : "portalPage", - "type" : "ch.ivy.addon.portalkit.enums.PortalPage", - "modifiers" : [ "PERSISTENT" ] + "type" : "ch.ivy.addon.portalkit.enums.PortalPage" }, { "name" : "task", - "type" : "ch.ivyteam.ivy.workflow.ITask", - "modifiers" : [ "PERSISTENT" ] + "type" : "ch.ivyteam.ivy.workflow.ITask" }, { "name" : "isTaskStartedInDetails", "type" : "Boolean", diff --git a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/AdditionalCaseDetails/AdditionalCaseDetailsData.d.json b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/AdditionalCaseDetails/AdditionalCaseDetailsData.d.json index a7eed73b169..0fa38c8a127 100644 --- a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/AdditionalCaseDetails/AdditionalCaseDetailsData.d.json +++ b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/AdditionalCaseDetails/AdditionalCaseDetailsData.d.json @@ -5,7 +5,6 @@ "isBusinessCaseData" : false, "fields" : [ { "name" : "selectedCase", - "type" : "ch.ivyteam.ivy.workflow.ICase", - "modifiers" : [ "PERSISTENT" ] + "type" : "ch.ivyteam.ivy.workflow.ICase" } ] } \ No newline at end of file diff --git a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/ApplicationSelectionMenu/ApplicationSelectionMenuData.d.json b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/ApplicationSelectionMenu/ApplicationSelectionMenuData.d.json index 47bdaaf981a..928edc57724 100644 --- a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/ApplicationSelectionMenu/ApplicationSelectionMenuData.d.json +++ b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/ApplicationSelectionMenu/ApplicationSelectionMenuData.d.json @@ -13,8 +13,7 @@ "modifiers" : [ "PERSISTENT" ] }, { "name" : "workingTask", - "type" : "ch.ivyteam.ivy.workflow.ITask", - "modifiers" : [ "PERSISTENT" ] + "type" : "ch.ivyteam.ivy.workflow.ITask" }, { "name" : "destinationBreadcrumbPage", "type" : "String", diff --git a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/CaseDocuments/CaseDocumentsData.d.json b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/CaseDocuments/CaseDocumentsData.d.json index 5c4675ca6e7..dd24e480a84 100644 --- a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/CaseDocuments/CaseDocumentsData.d.json +++ b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/CaseDocuments/CaseDocumentsData.d.json @@ -5,24 +5,19 @@ "isBusinessCaseData" : false, "fields" : [ { "name" : "selectedCase", - "type" : "ch.ivyteam.ivy.workflow.ICase", - "modifiers" : [ "PERSISTENT" ] + "type" : "ch.ivyteam.ivy.workflow.ICase" }, { "name" : "documents", - "type" : "java.util.List", - "modifiers" : [ "PERSISTENT" ] + "type" : "java.util.List" }, { "name" : "filteredDocuments", - "type" : "java.util.List", - "modifiers" : [ "PERSISTENT" ] + "type" : "java.util.List" }, { "name" : "document", - "type" : "com.axonivy.portal.components.ivydata.bo.IvyDocument", - "modifiers" : [ "PERSISTENT" ] + "type" : "com.axonivy.portal.components.ivydata.bo.IvyDocument" }, { "name" : "streamedContent", - "type" : "org.primefaces.model.StreamedContent", - "modifiers" : [ "PERSISTENT" ] + "type" : "org.primefaces.model.StreamedContent" }, { "name" : "deleteDocumentMessage", "type" : "String", diff --git a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/CaseNoteHistory/CaseNoteHistoryData.d.json b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/CaseNoteHistory/CaseNoteHistoryData.d.json index 5c6b9c1418f..f81c61c6c54 100644 --- a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/CaseNoteHistory/CaseNoteHistoryData.d.json +++ b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/CaseNoteHistory/CaseNoteHistoryData.d.json @@ -5,20 +5,16 @@ "isBusinessCaseData" : false, "fields" : [ { "name" : "histories", - "type" : "List", - "modifiers" : [ "PERSISTENT" ] + "type" : "List" }, { "name" : "exportedFileName", - "type" : "String", - "modifiers" : [ "PERSISTENT" ] + "type" : "String" }, { "name" : "filteredHistories", - "type" : "List", - "modifiers" : [ "PERSISTENT" ] + "type" : "List" }, { "name" : "ivyCase", - "type" : "ch.ivyteam.ivy.workflow.ICase", - "modifiers" : [ "PERSISTENT" ] + "type" : "ch.ivyteam.ivy.workflow.ICase" }, { "name" : "showRelatedCaseInfo", "type" : "Boolean", diff --git a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/ForgotPassword/ForgotPassword.xhtml b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/ForgotPassword/ForgotPassword.xhtml index 0e9a21b4405..4922e251f05 100644 --- a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/ForgotPassword/ForgotPassword.xhtml +++ b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/ForgotPassword/ForgotPassword.xhtml @@ -7,7 +7,7 @@ - + diff --git a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/GlobalSearch/GlobalSearchData.d.json b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/GlobalSearch/GlobalSearchData.d.json index 448111e17ff..a92263ef33b 100644 --- a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/GlobalSearch/GlobalSearchData.d.json +++ b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/GlobalSearch/GlobalSearchData.d.json @@ -17,12 +17,10 @@ "modifiers" : [ "PERSISTENT" ] }, { "name" : "caze", - "type" : "ch.ivyteam.ivy.workflow.ICase", - "modifiers" : [ "PERSISTENT" ] + "type" : "ch.ivyteam.ivy.workflow.ICase" }, { "name" : "workingTask", - "type" : "ch.ivyteam.ivy.workflow.ITask", - "modifiers" : [ "PERSISTENT" ] + "type" : "ch.ivyteam.ivy.workflow.ITask" }, { "name" : "taskId", "type" : "String", diff --git a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/Login/Login.xhtml b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/Login/Login.xhtml index 8efd66b39aa..5518a0211b7 100644 --- a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/Login/Login.xhtml +++ b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/Login/Login.xhtml @@ -7,7 +7,7 @@ - + diff --git a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/PasswordReset/PasswordReset.xhtml b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/PasswordReset/PasswordReset.xhtml index d5fb743859b..129598b49c9 100644 --- a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/PasswordReset/PasswordReset.xhtml +++ b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/PasswordReset/PasswordReset.xhtml @@ -7,7 +7,7 @@ - + #{ivy.cms.co('/ch.ivy.addon.portalkit.ui.jsf/forgotPassword/setANewPassword')} diff --git a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/PortalBreadcrumb/PortalBreadcrumbData.d.json b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/PortalBreadcrumb/PortalBreadcrumbData.d.json index 9e77ef32877..75d554f0190 100644 --- a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/PortalBreadcrumb/PortalBreadcrumbData.d.json +++ b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/PortalBreadcrumb/PortalBreadcrumbData.d.json @@ -5,8 +5,7 @@ "isBusinessCaseData" : false, "fields" : [ { "name" : "workingTask", - "type" : "ch.ivyteam.ivy.workflow.ITask", - "modifiers" : [ "PERSISTENT" ] + "type" : "ch.ivyteam.ivy.workflow.ITask" }, { "name" : "linkToNavigateWhenLeaveTask", "type" : "String", diff --git a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/PortalCaseDetails/PortalCaseDetailsData.d.json b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/PortalCaseDetails/PortalCaseDetailsData.d.json index 7850a60c07b..d339460f4e9 100644 --- a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/PortalCaseDetails/PortalCaseDetailsData.d.json +++ b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/PortalCaseDetails/PortalCaseDetailsData.d.json @@ -5,8 +5,7 @@ "isBusinessCaseData" : false, "fields" : [ { "name" : "caseInfo", - "type" : "ch.ivyteam.ivy.workflow.ICase", - "modifiers" : [ "PERSISTENT" ] + "type" : "ch.ivyteam.ivy.workflow.ICase" }, { "name" : "isShowBackButton", "type" : "Boolean", @@ -17,7 +16,6 @@ "modifiers" : [ "PERSISTENT" ] }, { "name" : "caseLazyDataModel", - "type" : "ch.ivy.addon.portalkit.datamodel.internal.RelatedCaseLazyDataModel", - "modifiers" : [ "PERSISTENT" ] + "type" : "ch.ivy.addon.portalkit.datamodel.internal.RelatedCaseLazyDataModel" } ] } \ No newline at end of file diff --git a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/PortalFinishTaskHandle/PortalFinishTaskHandleData.d.json b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/PortalFinishTaskHandle/PortalFinishTaskHandleData.d.json index 1ad2ea1cbd1..fbdda6d3d81 100644 --- a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/PortalFinishTaskHandle/PortalFinishTaskHandleData.d.json +++ b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/PortalFinishTaskHandle/PortalFinishTaskHandleData.d.json @@ -9,7 +9,6 @@ "modifiers" : [ "PERSISTENT" ] }, { "name" : "caze", - "type" : "ch.ivyteam.ivy.workflow.ICase", - "modifiers" : [ "PERSISTENT" ] + "type" : "ch.ivyteam.ivy.workflow.ICase" } ] } \ No newline at end of file diff --git a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/PortalTaskDetails/PortalTaskDetailsData.d.json b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/PortalTaskDetails/PortalTaskDetailsData.d.json index d964e066d06..b4c39c992a0 100644 --- a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/PortalTaskDetails/PortalTaskDetailsData.d.json +++ b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/PortalTaskDetails/PortalTaskDetailsData.d.json @@ -5,16 +5,13 @@ "isBusinessCaseData" : false, "fields" : [ { "name" : "task", - "type" : "ch.ivyteam.ivy.workflow.ITask", - "modifiers" : [ "PERSISTENT" ] + "type" : "ch.ivyteam.ivy.workflow.ITask" }, { "name" : "dataModel", - "type" : "ch.ivy.addon.portalkit.datamodel.TaskLazyDataModel", - "modifiers" : [ "PERSISTENT" ] + "type" : "ch.ivy.addon.portalkit.datamodel.TaskLazyDataModel" }, { "name" : "portalPage", - "type" : "ch.ivy.addon.portalkit.enums.PortalPage", - "modifiers" : [ "PERSISTENT" ] + "type" : "ch.ivy.addon.portalkit.enums.PortalPage" }, { "name" : "isFromTaskList", "type" : "Boolean", @@ -26,8 +23,7 @@ "modifiers" : [ "PERSISTENT" ] }, { "name" : "dashboardDataModel", - "type" : "ch.ivy.addon.portalkit.datamodel.DashboardTaskLazyDataModel", - "modifiers" : [ "PERSISTENT" ] + "type" : "ch.ivy.addon.portalkit.datamodel.DashboardTaskLazyDataModel" }, { "name" : "showItemDetailsHeader", "type" : "Boolean", diff --git a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/ProcessViewer/ProcessViewerData.d.json b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/ProcessViewer/ProcessViewerData.d.json index 221bf40b05b..6a5d21decc0 100644 --- a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/ProcessViewer/ProcessViewerData.d.json +++ b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/ProcessViewer/ProcessViewerData.d.json @@ -9,8 +9,7 @@ "modifiers" : [ "PERSISTENT" ] }, { "name" : "selectedCase", - "type" : "ch.ivyteam.ivy.workflow.ICase", - "modifiers" : [ "PERSISTENT" ] + "type" : "ch.ivyteam.ivy.workflow.ICase" }, { "name" : "processId", "type" : "String", @@ -21,7 +20,6 @@ "modifiers" : [ "PERSISTENT" ] }, { "name" : "selectedTask", - "type" : "ch.ivyteam.ivy.workflow.ITask", - "modifiers" : [ "PERSISTENT" ] + "type" : "ch.ivyteam.ivy.workflow.ITask" } ] } \ No newline at end of file diff --git a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/TaskDocuments/TaskDocumentsData.d.json b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/TaskDocuments/TaskDocumentsData.d.json index c21bdc03d2e..a794252756c 100644 --- a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/TaskDocuments/TaskDocumentsData.d.json +++ b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/TaskDocuments/TaskDocumentsData.d.json @@ -5,24 +5,19 @@ "isBusinessCaseData" : false, "fields" : [ { "name" : "task", - "type" : "ch.ivyteam.ivy.workflow.ITask", - "modifiers" : [ "PERSISTENT" ] + "type" : "ch.ivyteam.ivy.workflow.ITask" }, { "name" : "documents", - "type" : "java.util.List", - "modifiers" : [ "PERSISTENT" ] + "type" : "java.util.List" }, { "name" : "filteredDocuments", - "type" : "java.util.List", - "modifiers" : [ "PERSISTENT" ] + "type" : "java.util.List" }, { "name" : "document", - "type" : "com.axonivy.portal.components.ivydata.bo.IvyDocument", - "modifiers" : [ "PERSISTENT" ] + "type" : "com.axonivy.portal.components.ivydata.bo.IvyDocument" }, { "name" : "streamedContent", - "type" : "org.primefaces.model.StreamedContent", - "modifiers" : [ "PERSISTENT" ] + "type" : "org.primefaces.model.StreamedContent" }, { "name" : "deleteDocumentMessage", "type" : "String", diff --git a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/TaskNoteHistory/TaskNoteHistory.xhtml b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/TaskNoteHistory/TaskNoteHistory.xhtml index 1328d5c5ede..6d971effa61 100644 --- a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/TaskNoteHistory/TaskNoteHistory.xhtml +++ b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/TaskNoteHistory/TaskNoteHistory.xhtml @@ -41,29 +41,29 @@ emptyMessage="#{ivy.cms.co('/ch.ivy.addon.portalkit.ui.jsf/common/noRecordsFound')}" reflow="true" scrollable="true" lazy="false"> - - + - + securityMember="#{note.author()}" + displayName="#{securityMemberDisplayNameFormatBean.generateBriefDisplayNameForSecurityMember(note.author(), note.authorName())}" /> - + - + diff --git a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/TaskNoteHistory/TaskNoteHistoryData.d.json b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/TaskNoteHistory/TaskNoteHistoryData.d.json index be9b2214169..06da8431858 100644 --- a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/TaskNoteHistory/TaskNoteHistoryData.d.json +++ b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/TaskNoteHistory/TaskNoteHistoryData.d.json @@ -9,15 +9,12 @@ "modifiers" : [ "PERSISTENT" ] }, { "name" : "filteredNotes", - "type" : "List", - "modifiers" : [ "PERSISTENT" ] + "type" : "List" }, { "name" : "notes", - "type" : "java.util.List", - "modifiers" : [ "PERSISTENT" ] + "type" : "java.util.List" }, { "name" : "task", - "type" : "ch.ivyteam.ivy.workflow.ITask", - "modifiers" : [ "PERSISTENT" ] + "type" : "ch.ivyteam.ivy.workflow.ITask" } ] } \ No newline at end of file diff --git a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/TaskNoteHistory/TaskNoteHistoryProcess.p.json b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/TaskNoteHistory/TaskNoteHistoryProcess.p.json index 3815f04a4b4..af72e131460 100644 --- a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/TaskNoteHistory/TaskNoteHistoryProcess.p.json +++ b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/TaskNoteHistory/TaskNoteHistoryProcess.p.json @@ -8,12 +8,12 @@ "elements" : [ { "id" : "f0", "type" : "HtmlDialogStart", - "name" : "start(List,String,ITask)", + "name" : "start(List,String,ITask)", "config" : { "signature" : "start", "input" : { "params" : [ - { "name" : "notes", "type" : "java.util.List", "desc" : "" }, + { "name" : "notes", "type" : "List", "desc" : "" }, { "name" : "exportedFileName", "type" : "String", "desc" : "" }, { "name" : "task", "type" : "ch.ivyteam.ivy.workflow.ITask", "desc" : "" } ], diff --git a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/ai/FindCaseWidget/FindCaseWidgetData.d.json b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/ai/FindCaseWidget/FindCaseWidgetData.d.json index 06e049fdf48..329e9b981a4 100644 --- a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/ai/FindCaseWidget/FindCaseWidgetData.d.json +++ b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/ai/FindCaseWidget/FindCaseWidgetData.d.json @@ -1,5 +1,5 @@ { - "$schema" : "https://json-schema.axonivy.com/data-class/11.4.0/data-class.json", + "$schema" : "https://json-schema.axonivy.com/data-class/12.0.0/data-class.json", "simpleName" : "FindCaseWidgetData", "namespace" : "ch.ivy.addon.portal.generic.ai.FindCaseWidget", "isBusinessCaseData" : false, diff --git a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/ai/FindProcessWidget/FindProcessWidgetData.d.json b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/ai/FindProcessWidget/FindProcessWidgetData.d.json index aa9e01dd85e..06ee30a0465 100644 --- a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/ai/FindProcessWidget/FindProcessWidgetData.d.json +++ b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/ai/FindProcessWidget/FindProcessWidgetData.d.json @@ -1,5 +1,5 @@ { - "$schema" : "https://json-schema.axonivy.com/data-class/11.4.0/data-class.json", + "$schema" : "https://json-schema.axonivy.com/data-class/12.0.0/data-class.json", "simpleName" : "FindProcessWidgetData", "namespace" : "ch.ivy.addon.portal.generic.ai.FindProcessWidget", "isBusinessCaseData" : false, diff --git a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/ai/FindTaskWidget/FindTaskWidgetData.d.json b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/ai/FindTaskWidget/FindTaskWidgetData.d.json index a0cd3683e22..a14c00e2c6d 100644 --- a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/ai/FindTaskWidget/FindTaskWidgetData.d.json +++ b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/ai/FindTaskWidget/FindTaskWidgetData.d.json @@ -1,5 +1,5 @@ { - "$schema" : "https://json-schema.axonivy.com/data-class/11.4.0/data-class.json", + "$schema" : "https://json-schema.axonivy.com/data-class/12.0.0/data-class.json", "simpleName" : "FindTaskWidgetData", "namespace" : "ch.ivy.addon.portal.generic.ai.FindTaskWidget", "isBusinessCaseData" : false, diff --git a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/dashboard/component/CaseDashboardWidget/CaseDashboardWidgetData.d.json b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/dashboard/component/CaseDashboardWidget/CaseDashboardWidgetData.d.json index fac17c94935..0a94f4a8785 100644 --- a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/dashboard/component/CaseDashboardWidget/CaseDashboardWidgetData.d.json +++ b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/dashboard/component/CaseDashboardWidget/CaseDashboardWidgetData.d.json @@ -5,8 +5,7 @@ "isBusinessCaseData" : false, "fields" : [ { "name" : "widget", - "type" : "ch.ivy.addon.portalkit.dto.dashboard.CaseDashboardWidget", - "modifiers" : [ "PERSISTENT" ] + "type" : "ch.ivy.addon.portalkit.dto.dashboard.CaseDashboardWidget" }, { "name" : "totalCases", "type" : "Long", @@ -21,12 +20,10 @@ "modifiers" : [ "PERSISTENT" ] }, { "name" : "collectedCasesForExporting", - "type" : "java.util.List", - "modifiers" : [ "PERSISTENT" ] + "type" : "java.util.List" }, { "name" : "exportedFile", - "type" : "org.primefaces.model.StreamedContent", - "modifiers" : [ "PERSISTENT" ] + "type" : "org.primefaces.model.StreamedContent" }, { "name" : "columnsVisibility", "type" : "java.util.List", diff --git a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/dashboard/component/CaseDashboardWidget/CaseInfo.xhtml b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/dashboard/component/CaseDashboardWidget/CaseInfo.xhtml index 3fe4fcfd3a8..c39fa393d19 100644 --- a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/dashboard/component/CaseDashboardWidget/CaseInfo.xhtml +++ b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/dashboard/component/CaseDashboardWidget/CaseInfo.xhtml @@ -20,9 +20,16 @@ alwaysShowState="true" responsiveStyleClass="" /> - + + + - + + + + + + @@ -46,9 +53,16 @@ - + + + - + + + + + +
    diff --git a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/dashboard/component/CaseWidget/CaseWidget.xhtml b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/dashboard/component/CaseWidget/CaseWidget.xhtml index a83f1c5bb13..a955c99272a 100644 --- a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/dashboard/component/CaseWidget/CaseWidget.xhtml +++ b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/dashboard/component/CaseWidget/CaseWidget.xhtml @@ -84,7 +84,8 @@ - + + diff --git a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/dashboard/component/DashboardModification/DashboardModification.xhtml b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/dashboard/component/DashboardModification/DashboardModification.xhtml index 89fa86311d8..a90abd57fac 100644 --- a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/dashboard/component/DashboardModification/DashboardModification.xhtml +++ b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/dashboard/component/DashboardModification/DashboardModification.xhtml @@ -72,7 +72,7 @@ icon="si si-download-bottom" value="#{ivy.cms.co('/ch.ivy.addon.portalkit.ui.jsf/dashboard/DashboardConfiguration/ExportDashboard')}" rendered="#{dashboardModificationBean.hasExportDashboardPermission()}" - onclick="PF('exportDashboardBtn').jq.click()"/> + onclick="PF('exportDashboardBtn-#{dashboard.id}').jq.click()"/>
    - #{entry.value} #{ivy.cms.co('/ch.ivy.addon.portalkit.ui.jsf/common/processes')} - #{entry.value} #{ivy.cms.co('/ch.ivy.addon.portalkit.ui.jsf/common/process')} + + + + + + + + + + + +
    diff --git a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/dashboard/component/ProcessWidget/CompactModeProcess.xhtml b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/dashboard/component/ProcessWidget/CompactModeProcess.xhtml index 15de2909f7e..a08c193ee7a 100644 --- a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/dashboard/component/ProcessWidget/CompactModeProcess.xhtml +++ b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/dashboard/component/ProcessWidget/CompactModeProcess.xhtml @@ -53,7 +53,8 @@ - + diff --git a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/dashboard/component/ProcessWidget/ProcessWidgetData.d.json b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/dashboard/component/ProcessWidget/ProcessWidgetData.d.json index fe8de82eb6d..89bcbc66bed 100644 --- a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/dashboard/component/ProcessWidget/ProcessWidgetData.d.json +++ b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/dashboard/component/ProcessWidget/ProcessWidgetData.d.json @@ -5,35 +5,28 @@ "isBusinessCaseData" : false, "fields" : [ { "name" : "tasks", - "type" : "java.util.List", - "modifiers" : [ "PERSISTENT" ] + "type" : "java.util.List" }, { "name" : "taskSearchCriteria", - "type" : "ch.ivy.addon.portalkit.ivydata.searchcriteria.TaskSearchCriteria", - "modifiers" : [ "PERSISTENT" ] + "type" : "ch.ivy.addon.portalkit.ivydata.searchcriteria.TaskSearchCriteria" }, { "name" : "taskQuery", - "type" : "ch.ivyteam.ivy.workflow.query.TaskQuery", - "modifiers" : [ "PERSISTENT" ] + "type" : "ch.ivyteam.ivy.workflow.query.TaskQuery" }, { "name" : "taskWidget", - "type" : "ch.ivy.addon.portalkit.dto.dashboard.TaskDashboardWidget", - "modifiers" : [ "PERSISTENT" ] + "type" : "ch.ivy.addon.portalkit.dto.dashboard.TaskDashboardWidget" }, { "name" : "filteredTasks", - "type" : "java.util.List", - "modifiers" : [ "PERSISTENT" ] + "type" : "java.util.List" }, { "name" : "dataModel", - "type" : "ch.ivy.addon.portalkit.datamodel.DashboardTaskLazyDataModel", - "modifiers" : [ "PERSISTENT" ] + "type" : "ch.ivy.addon.portalkit.datamodel.DashboardTaskLazyDataModel" }, { "name" : "currentPortalPage", "type" : "String", "modifiers" : [ "PERSISTENT" ] }, { "name" : "selectedTask", - "type" : "ch.ivyteam.ivy.workflow.ITask", - "modifiers" : [ "PERSISTENT" ] + "type" : "ch.ivyteam.ivy.workflow.ITask" } ] } \ No newline at end of file diff --git a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/dashboard/component/TaskDashboardWidget/TaskDashboardWidget.xhtml b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/dashboard/component/TaskDashboardWidget/TaskDashboardWidget.xhtml index 1c8c0f81241..dc2c26f1169 100644 --- a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/dashboard/component/TaskDashboardWidget/TaskDashboardWidget.xhtml +++ b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/dashboard/component/TaskDashboardWidget/TaskDashboardWidget.xhtml @@ -4,16 +4,15 @@ - - - + + diff --git a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/dashboard/component/TaskDashboardWidget/TaskDashboardWidgetData.d.json b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/dashboard/component/TaskDashboardWidget/TaskDashboardWidgetData.d.json index 204dad13afa..9517046f067 100644 --- a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/dashboard/component/TaskDashboardWidget/TaskDashboardWidgetData.d.json +++ b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/dashboard/component/TaskDashboardWidget/TaskDashboardWidgetData.d.json @@ -5,8 +5,7 @@ "isBusinessCaseData" : false, "fields" : [ { "name" : "widget", - "type" : "ch.ivy.addon.portalkit.dto.dashboard.TaskDashboardWidget", - "modifiers" : [ "PERSISTENT" ] + "type" : "ch.ivy.addon.portalkit.dto.dashboard.TaskDashboardWidget" }, { "name" : "totalTasks", "type" : "Long", @@ -21,15 +20,13 @@ "modifiers" : [ "PERSISTENT" ] }, { "name" : "collectedTasksForExporting", - "type" : "List", - "modifiers" : [ "PERSISTENT" ] + "type" : "List" }, { "name" : "columnsVisibility", "type" : "List", "modifiers" : [ "PERSISTENT" ] }, { "name" : "exportedFile", - "type" : "org.primefaces.model.StreamedContent", - "modifiers" : [ "PERSISTENT" ] + "type" : "org.primefaces.model.StreamedContent" } ] } \ No newline at end of file diff --git a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/dashboard/component/TaskDashboardWidget/TaskInfo.xhtml b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/dashboard/component/TaskDashboardWidget/TaskInfo.xhtml index e39ae8d23a7..53b21fd21a2 100644 --- a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/dashboard/component/TaskDashboardWidget/TaskInfo.xhtml +++ b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/dashboard/component/TaskDashboardWidget/TaskInfo.xhtml @@ -18,15 +18,30 @@ - + + + -
    + + + + + + +
    - + + + - + + + + + + @@ -47,9 +62,16 @@ alwaysShowState="true" responsiveStyleClass="" />
    - + + + - + + + + + +
    @@ -73,9 +95,16 @@ - + + + - + + + + + +
    diff --git a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/iframe/TaskTemplateIFrame/TaskTemplateIFrameData.d.json b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/iframe/TaskTemplateIFrame/TaskTemplateIFrameData.d.json index e5046dce6b9..2660552e249 100644 --- a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/iframe/TaskTemplateIFrame/TaskTemplateIFrameData.d.json +++ b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/generic/iframe/TaskTemplateIFrame/TaskTemplateIFrameData.d.json @@ -9,8 +9,7 @@ "modifiers" : [ "PERSISTENT" ] }, { "name" : "task", - "type" : "ch.ivyteam.ivy.workflow.ITask", - "modifiers" : [ "PERSISTENT" ] + "type" : "ch.ivyteam.ivy.workflow.ITask" }, { "name" : "taskId", "type" : "Number", diff --git a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/setting/AbsenceManagement/AbsenceManagementData.d.json b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/setting/AbsenceManagement/AbsenceManagementData.d.json index 42988c4bf10..59cb29ab85d 100644 --- a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/setting/AbsenceManagement/AbsenceManagementData.d.json +++ b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portal/setting/AbsenceManagement/AbsenceManagementData.d.json @@ -9,22 +9,19 @@ "modifiers" : [ "PERSISTENT" ] }, { "name" : "backupAbsence", - "type" : "ch.ivy.addon.portalkit.ivydata.bo.IvyAbsence", - "modifiers" : [ "PERSISTENT" ] + "type" : "ch.ivy.addon.portalkit.ivydata.bo.IvyAbsence" }, { "name" : "isSupervisor", "type" : "Boolean" }, { "name" : "users", - "type" : "java.util.List", - "modifiers" : [ "PERSISTENT" ] + "type" : "java.util.List" }, { "name" : "queryAutoComplete", "type" : "String" }, { "name" : "selectedAbsence", - "type" : "ch.ivy.addon.portalkit.ivydata.bo.IvyAbsence", - "modifiers" : [ "PERSISTENT" ] + "type" : "ch.ivy.addon.portalkit.ivydata.bo.IvyAbsence" }, { "name" : "validationError", "type" : "Boolean" @@ -34,56 +31,47 @@ "modifiers" : [ "PERSISTENT" ] }, { "name" : "displayedAbsences", - "type" : "java.util.List", - "modifiers" : [ "PERSISTENT" ] + "type" : "java.util.List" }, { "name" : "isAbsenceBeingCreated", "type" : "Boolean", "modifiers" : [ "PERSISTENT" ] }, { "name" : "selectedAbsenceUser", - "type" : "com.axonivy.portal.components.dto.UserDTO", - "modifiers" : [ "PERSISTENT" ] + "type" : "com.axonivy.portal.components.dto.UserDTO" }, { "name" : "selectedUser", - "type" : "com.axonivy.portal.components.dto.UserDTO", - "modifiers" : [ "PERSISTENT" ] + "type" : "com.axonivy.portal.components.dto.UserDTO" }, { "name" : "isCreateMode", "type" : "Boolean", "modifiers" : [ "PERSISTENT" ] }, { "name" : "substitutes", - "type" : "java.util.List", - "modifiers" : [ "PERSISTENT" ] + "type" : "java.util.List" }, { "name" : "substitutions", - "type" : "java.util.List", - "modifiers" : [ "PERSISTENT" ] + "type" : "java.util.List" }, { "name" : "message", "type" : "String", "modifiers" : [ "PERSISTENT" ] }, { "name" : "deputyRoles", - "type" : "java.util.List", - "modifiers" : [ "PERSISTENT" ] + "type" : "java.util.List" }, { "name" : "selectedDeputyRole", - "type" : "ch.ivy.addon.portalkit.dto.DeputyRole", - "modifiers" : [ "PERSISTENT" ] + "type" : "ch.ivy.addon.portalkit.dto.DeputyRole" }, { "name" : "selectedDeputyRoleId", "type" : "String", "modifiers" : [ "PERSISTENT" ] }, { "name" : "selectedDeputy", - "type" : "com.axonivy.portal.components.dto.UserDTO", - "modifiers" : [ "PERSISTENT" ] + "type" : "com.axonivy.portal.components.dto.UserDTO" }, { "name" : "selectedDeputies", - "type" : "java.util.List", - "modifiers" : [ "PERSISTENT" ] + "type" : "java.util.List" }, { "name" : "canCreateAbsenceForOtherUsers", "type" : "Boolean", diff --git a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/admin/AdminSettings/AdminSettingsData.d.json b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/admin/AdminSettings/AdminSettingsData.d.json index f18f189fc12..9122f820784 100644 --- a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/admin/AdminSettings/AdminSettingsData.d.json +++ b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/admin/AdminSettings/AdminSettingsData.d.json @@ -5,12 +5,10 @@ "isBusinessCaseData" : false, "fields" : [ { "name" : "application", - "type" : "ch.ivy.addon.portalkit.configuration.Application", - "modifiers" : [ "PERSISTENT" ] + "type" : "ch.ivy.addon.portalkit.configuration.Application" }, { "name" : "applicationList", - "type" : "List", - "modifiers" : [ "PERSISTENT" ] + "type" : "List" }, { "name" : "confirmMsg", "type" : "String", @@ -36,16 +34,13 @@ "type" : "List" }, { "name" : "selectedApp", - "type" : "ch.ivy.addon.portalkit.configuration.Application", - "modifiers" : [ "PERSISTENT" ] + "type" : "ch.ivy.addon.portalkit.configuration.Application" }, { "name" : "selectedSetting", - "type" : "ch.ivy.addon.portalkit.configuration.GlobalSetting", - "modifiers" : [ "PERSISTENT" ] + "type" : "ch.ivy.addon.portalkit.configuration.GlobalSetting" }, { "name" : "settingList", - "type" : "List", - "modifiers" : [ "PERSISTENT" ] + "type" : "List" }, { "name" : "supportedLanguages", "type" : "List" @@ -55,8 +50,7 @@ "modifiers" : [ "PERSISTENT" ] }, { "name" : "settingInputType", - "type" : "ch.ivy.addon.portalkit.enums.GlobalVariableType", - "modifiers" : [ "PERSISTENT" ] + "type" : "ch.ivy.addon.portalkit.enums.GlobalVariableType" }, { "name" : "dropDownValues", "type" : "java.util.List", @@ -69,8 +63,7 @@ "modifiers" : [ "PERSISTENT" ] }, { "name" : "filteredSettingList", - "type" : "List", - "modifiers" : [ "PERSISTENT" ] + "type" : "List" }, { "name" : "isDefaultApplicationLanguage", "type" : "Boolean", @@ -81,8 +74,7 @@ "modifiers" : [ "PERSISTENT" ] }, { "name" : "announcement", - "type" : "ch.ivy.addon.portalkit.configuration.Announcement", - "modifiers" : [ "PERSISTENT" ] + "type" : "ch.ivy.addon.portalkit.configuration.Announcement" }, { "name" : "selectedMultiSettings", "type" : "java.util.List", diff --git a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/ActionStep/ActionStep.xhtml b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/ActionStep/ActionStep.xhtml index 8149d47fc71..f91f3032968 100644 --- a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/ActionStep/ActionStep.xhtml +++ b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/ActionStep/ActionStep.xhtml @@ -49,7 +49,7 @@ - + #{ivy.cms.co('/ch.ivy.addon.portalkit.ui.jsf/caseDetails/showProcessOverview')} diff --git a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/ActionStep/ActionStepData.d.json b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/ActionStep/ActionStepData.d.json index e623fd66bb8..4765356d557 100644 --- a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/ActionStep/ActionStepData.d.json +++ b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/ActionStep/ActionStepData.d.json @@ -5,8 +5,7 @@ "isBusinessCaseData" : false, "fields" : [ { "name" : "caze", - "type" : "ch.ivyteam.ivy.workflow.ICase", - "modifiers" : [ "PERSISTENT" ] + "type" : "ch.ivyteam.ivy.workflow.ICase" }, { "name" : "inFrame", "type" : "Boolean", diff --git a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/CaseItem/CaseItemData.d.json b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/CaseItem/CaseItemData.d.json index 45a7ea0b862..82fb4734304 100644 --- a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/CaseItem/CaseItemData.d.json +++ b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/CaseItem/CaseItemData.d.json @@ -5,8 +5,7 @@ "isBusinessCaseData" : false, "fields" : [ { "name" : "caze", - "type" : "ch.ivyteam.ivy.workflow.ICase", - "modifiers" : [ "PERSISTENT" ] + "type" : "ch.ivyteam.ivy.workflow.ICase" }, { "name" : "inFrame", "type" : "Boolean", diff --git a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/CaseItemDocument/CaseItemDocumentData.d.json b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/CaseItemDocument/CaseItemDocumentData.d.json index 441d344a423..8acef9945b4 100644 --- a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/CaseItemDocument/CaseItemDocumentData.d.json +++ b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/CaseItemDocument/CaseItemDocumentData.d.json @@ -5,20 +5,16 @@ "isBusinessCaseData" : false, "fields" : [ { "name" : "document", - "type" : "com.axonivy.portal.components.ivydata.bo.IvyDocument", - "modifiers" : [ "PERSISTENT" ] + "type" : "com.axonivy.portal.components.ivydata.bo.IvyDocument" }, { "name" : "documents", - "type" : "java.util.List", - "modifiers" : [ "PERSISTENT" ] + "type" : "java.util.List" }, { "name" : "documentUploadEvent", - "type" : "org.primefaces.event.FileUploadEvent", - "modifiers" : [ "PERSISTENT" ] + "type" : "org.primefaces.event.FileUploadEvent" }, { "name" : "caze", - "type" : "ch.ivyteam.ivy.workflow.ICase", - "modifiers" : [ "PERSISTENT" ] + "type" : "ch.ivyteam.ivy.workflow.ICase" }, { "name" : "isHideUploadDocumentForDoneCase", "type" : "Boolean", @@ -29,16 +25,14 @@ "modifiers" : [ "PERSISTENT" ] }, { "name" : "streamedContent", - "type" : "org.primefaces.model.StreamedContent", - "modifiers" : [ "PERSISTENT" ] + "type" : "org.primefaces.model.StreamedContent" }, { "name" : "uploadDocumentCheckMessage", "type" : "String", "modifiers" : [ "PERSISTENT" ] }, { "name" : "uploadDocumentCheckStatus", - "type" : "com.axonivy.portal.components.enums.UploadDocumentCheckStatus", - "modifiers" : [ "PERSISTENT" ] + "type" : "com.axonivy.portal.components.enums.UploadDocumentCheckStatus" }, { "name" : "deleteDocumentMessage", "type" : "String", diff --git a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/CaseItemGeneralInformation/CaseItemGeneralInformation.xhtml b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/CaseItemGeneralInformation/CaseItemGeneralInformation.xhtml index 1de6a6a5b52..7b5daf9b567 100644 --- a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/CaseItemGeneralInformation/CaseItemGeneralInformation.xhtml +++ b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/CaseItemGeneralInformation/CaseItemGeneralInformation.xhtml @@ -65,15 +65,16 @@
    + rendered="#{(caseDetailsBean.showNotAvailableData and empty case.owners().all()) or not empty case.owners().all()}">
    - + +
    @@ -159,5 +160,18 @@ + +
    + +
    + +
    +
    +
    +
    \ No newline at end of file diff --git a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/CaseItemHistory/CaseItemHistoryData.d.json b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/CaseItemHistory/CaseItemHistoryData.d.json index 47696dbe1ba..024dfcc08a4 100644 --- a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/CaseItemHistory/CaseItemHistoryData.d.json +++ b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/CaseItemHistory/CaseItemHistoryData.d.json @@ -5,20 +5,17 @@ "isBusinessCaseData" : false, "fields" : [ { "name" : "caze", - "type" : "ch.ivyteam.ivy.workflow.ICase", - "modifiers" : [ "PERSISTENT" ] + "type" : "ch.ivyteam.ivy.workflow.ICase" }, { "name" : "histories", - "type" : "List", - "modifiers" : [ "PERSISTENT" ] + "type" : "List" }, { "name" : "noteContent", "type" : "String", "modifiers" : [ "PERSISTENT" ] }, { "name" : "note", - "type" : "ch.ivyteam.ivy.workflow.INote", - "modifiers" : [ "PERSISTENT" ] + "type" : "ch.ivyteam.ivy.workflow.note.Note" }, { "name" : "taskId", "type" : "Long", diff --git a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/CaseItemRelatedCases/CaseItemRelatedCasesData.d.json b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/CaseItemRelatedCases/CaseItemRelatedCasesData.d.json index 3e0057197d5..85e8eda6ddc 100644 --- a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/CaseItemRelatedCases/CaseItemRelatedCasesData.d.json +++ b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/CaseItemRelatedCases/CaseItemRelatedCasesData.d.json @@ -5,12 +5,10 @@ "isBusinessCaseData" : false, "fields" : [ { "name" : "caze", - "type" : "ch.ivyteam.ivy.workflow.ICase", - "modifiers" : [ "PERSISTENT" ] + "type" : "ch.ivyteam.ivy.workflow.ICase" }, { "name" : "relatedCases", - "type" : "java.util.List", - "modifiers" : [ "PERSISTENT" ] + "type" : "java.util.List" }, { "name" : "isTaskFinished", "type" : "Boolean", @@ -25,8 +23,7 @@ "modifiers" : [ "PERSISTENT" ] }, { "name" : "caseSearchCriteria", - "type" : "ch.ivy.addon.portalkit.ivydata.searchcriteria.CaseSearchCriteria", - "modifiers" : [ "PERSISTENT" ] + "type" : "ch.ivy.addon.portalkit.ivydata.searchcriteria.CaseSearchCriteria" }, { "name" : "startIndex", "type" : "Integer", @@ -41,12 +38,10 @@ "modifiers" : [ "PERSISTENT" ] }, { "name" : "caseLazyDataModel", - "type" : "ch.ivy.addon.portalkit.datamodel.internal.RelatedCaseLazyDataModel", - "modifiers" : [ "PERSISTENT" ] + "type" : "ch.ivy.addon.portalkit.datamodel.internal.RelatedCaseLazyDataModel" }, { "name" : "exportedFile", - "type" : "org.primefaces.model.StreamedContent", - "modifiers" : [ "PERSISTENT" ] + "type" : "org.primefaces.model.StreamedContent" }, { "name" : "columnsVisibility", "type" : "java.util.List", @@ -61,7 +56,6 @@ "modifiers" : [ "PERSISTENT" ] }, { "name" : "collectedCasesForExporting", - "type" : "java.util.List", - "modifiers" : [ "PERSISTENT" ] + "type" : "java.util.List" } ] } \ No newline at end of file diff --git a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/CaseItemRelatedTask/CaseItemRelatedTask.xhtml b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/CaseItemRelatedTask/CaseItemRelatedTask.xhtml deleted file mode 100644 index e93168aceaa..00000000000 --- a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/CaseItemRelatedTask/CaseItemRelatedTask.xhtml +++ /dev/null @@ -1,100 +0,0 @@ - - - - - - - - - - - - - - -
    -
    - #{ivy.cms.co('/ch.ivy.addon.portalkit.ui.jsf/caseDetails/relatedTasksAndCases')} -
    - - - -
    - - - - - - #{ivy.cms.co('/ch.ivy.addon.portalkit.ui.jsf/caseDetails/showMoreTechnicalCases')} - #{ivy.cms.co('/ch.ivy.addon.portalkit.ui.jsf/common/more')} - - - - - -
    - - - - - - - - -
    -
    - -
    - - -
    - \ No newline at end of file diff --git a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/CaseItemRelatedTask/CaseItemRelatedTaskData.d.json b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/CaseItemRelatedTask/CaseItemRelatedTaskData.d.json deleted file mode 100644 index bc3fb91df79..00000000000 --- a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/CaseItemRelatedTask/CaseItemRelatedTaskData.d.json +++ /dev/null @@ -1,51 +0,0 @@ -{ - "$schema" : "https://json-schema.axonivy.com/data-class/12.0.0/data-class.json", - "simpleName" : "CaseItemRelatedTaskData", - "namespace" : "ch.ivy.addon.portalkit.component.CaseItemRelatedTask", - "isBusinessCaseData" : false, - "fields" : [ { - "name" : "caze", - "type" : "ch.ivyteam.ivy.workflow.ICase", - "modifiers" : [ "PERSISTENT" ] - }, { - "name" : "relatedTasks", - "type" : "java.util.List", - "modifiers" : [ "PERSISTENT" ] - }, { - "name" : "technicalCases", - "type" : "java.util.List", - "modifiers" : [ "PERSISTENT" ] - }, { - "name" : "caseSearchCriteria", - "type" : "ch.ivy.addon.portalkit.ivydata.searchcriteria.CaseSearchCriteria", - "modifiers" : [ "PERSISTENT" ] - }, { - "name" : "selectedTechnicalCase", - "type" : "ch.ivyteam.ivy.workflow.ICase", - "modifiers" : [ "PERSISTENT" ] - }, { - "name" : "totalRelatedCases", - "type" : "Integer", - "modifiers" : [ "PERSISTENT" ] - }, { - "name" : "totalRelatedTasks", - "type" : "Integer", - "modifiers" : [ "PERSISTENT" ] - }, { - "name" : "isTaskFinished", - "type" : "Boolean", - "modifiers" : [ "PERSISTENT" ] - }, { - "name" : "isWorkingOnTask", - "type" : "Boolean", - "modifiers" : [ "PERSISTENT" ] - }, { - "name" : "inFrame", - "type" : "Boolean", - "modifiers" : [ "PERSISTENT" ] - }, { - "name" : "taskUUID", - "type" : "String", - "modifiers" : [ "PERSISTENT" ] - } ] -} \ No newline at end of file diff --git a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/CaseItemRelatedTask/CaseItemRelatedTaskProcess.p.json b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/CaseItemRelatedTask/CaseItemRelatedTaskProcess.p.json deleted file mode 100644 index 02a83bad51f..00000000000 --- a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/CaseItemRelatedTask/CaseItemRelatedTaskProcess.p.json +++ /dev/null @@ -1,541 +0,0 @@ -{ - "$schema" : "https://json-schema.axonivy.com/process/12.0.0/process.json", - "id" : "153358BE9219FD4C", - "kind" : "HTML_DIALOG", - "config" : { - "data" : "ch.ivy.addon.portalkit.component.CaseItemRelatedTask.CaseItemRelatedTaskData" - }, - "elements" : [ { - "id" : "f0", - "type" : "HtmlDialogStart", - "name" : "start()", - "config" : { - "signature" : "start", - "guid" : "167E9A75EF3D0909" - }, - "visual" : { - "at" : { "x" : 96, "y" : 96 } - }, - "connect" : [ - { "id" : "f3", "to" : "f1" } - ] - }, { - "id" : "f1", - "type" : "HtmlDialogEnd", - "visual" : { - "at" : { "x" : 288, "y" : 96 } - } - }, { - "id" : "f6", - "type" : "HtmlDialogMethodStart", - "name" : "initData(ICase)", - "config" : { - "signature" : "initData", - "input" : { - "params" : [ - { "name" : "iCase", "type" : "ch.ivyteam.ivy.workflow.ICase", "desc" : "" } - ], - "map" : { - "out.caze" : "param.iCase" - } - }, - "guid" : "167E9A777AB171EA" - }, - "visual" : { - "at" : { "x" : 96, "y" : 192 } - }, - "connect" : [ - { "id" : "f12", "to" : "f8" } - ] - }, { - "id" : "f7", - "type" : "HtmlDialogEnd", - "visual" : { - "at" : { "x" : 744, "y" : 192 } - } - }, { - "id" : "f8", - "type" : "Split", - "config" : { - "output" : { - "map" : { - "out1" : "in", - "out1.caze" : "in.caze", - "out2.caze" : "in.caze" - } - } - }, - "visual" : { - "at" : { "x" : 192, "y" : 192 } - }, - "connect" : [ - { "id" : "f15", "to" : "f14", "outVar" : "out1" }, - { "id" : "f18", "to" : "f17", "via" : [ { "x" : 192, "y" : 288 } ], "outVar" : "out2" } - ] - }, { - "id" : "f9", - "type" : "Join", - "config" : { - "output" : { - "map" : { - "out" : "in1", - "out.relatedTasks" : "in1.relatedTasks", - "out.technicalCases" : "in2.technicalCases", - "out.totalRelatedCases" : "in2.totalRelatedCases", - "out.totalRelatedTasks" : "in1.totalRelatedTasks" - } - } - }, - "visual" : { - "at" : { "x" : 648, "y" : 192 } - }, - "connect" : [ - { "id" : "f10", "to" : "f7" } - ] - }, { - "id" : "f14", - "type" : "Script", - "name" : "Find related tasks", - "config" : { - "output" : { - "code" : [ - "import ch.ivy.addon.portalkit.util.PermissionUtils;", - "import ch.ivy.addon.portalkit.ivydata.utils.ServiceUtilities;", - "import ch.ivyteam.ivy.security.ISession;", - "import ch.ivy.addon.portalkit.util.HiddenTasksCasesConfig;", - "import org.apache.commons.lang3.StringUtils;", - "import ch.ivy.addon.portalkit.enums.AdditionalProperty;", - "import ch.ivyteam.ivy.workflow.TaskState;", - "import ch.ivyteam.ivy.workflow.ITask;", - "", - "in.relatedTasks.clear();", - "", - "int count = 1;", - "in.totalRelatedTasks = 0;", - "boolean excludeHiddenTasks = Boolean.parseBoolean(ivy.var.get(HiddenTasksCasesConfig.PORTAL_HIDDEN_TASK_CASE_EXCLUDED));", - "ISession session = ivy.session;", - "boolean isOwner = in.caze.#owner != null ? in.caze.getOwner().isMember(ivy.session, true) : false;", - "boolean ableToSeeAllRelatedTaskOfCase = PermissionUtils.checkReadAllTasksPermission() || PermissionUtils.checkTaskReadOwnCaseTasksPermission() || isOwner;", - "for (ITask task : in.caze.tasks().all()) {", - " if ((task.getState() == TaskState.SUSPENDED || task.getState() == TaskState.RESUMED || task.getState() == TaskState.PARKED || task.getState() == TaskState.CREATED)", - " && (excludeHiddenTasks ? StringUtils.isEmpty(task.customFields().stringField(AdditionalProperty.HIDE.toString()).getOrNull()) : true) && task.isPersistent()) {", - " if (ableToSeeAllRelatedTaskOfCase) {", - " in.totalRelatedTasks++;", - " if (count <= 21) {//get only 21 tasks", - " in.relatedTasks.add(task);", - " }", - " count++;", - " } else {", - " if(task.canUserResumeTask(session).wasSuccessful()) {", - " in.totalRelatedTasks++;", - " if (count <= 21) {//get only 21 tasks", - " in.relatedTasks.add(task);", - " }", - " count++;", - " }", - " }", - " }", - "}" - ] - }, - "sudo" : true - }, - "visual" : { - "at" : { "x" : 392, "y" : 192 } - }, - "connect" : [ - { "id" : "f13", "to" : "f9", "var" : "in1" } - ] - }, { - "id" : "f17", - "type" : "Script", - "name" : [ - "Prepare case", - "search criteria" - ], - "config" : { - "output" : { - "code" : [ - "import ch.ivy.addon.portalkit.util.PermissionUtils;", - "import ch.ivyteam.ivy.workflow.CaseState;", - "import java.util.Arrays;", - "", - "", - "out.caseSearchCriteria.businessCaseId = in.caze.getId();", - "out.caseSearchCriteria.setIncludedStates(Arrays.asList(CaseState.CREATED, CaseState.RUNNING, CaseState.DONE));", - "out.caseSearchCriteria.technicalCase = true;", - "out.caseSearchCriteria.adminQuery = PermissionUtils.checkReadAllCasesPermission();" - ] - } - }, - "visual" : { - "at" : { "x" : 296, "y" : 288 } - }, - "connect" : [ - { "id" : "f20", "to" : "f19" } - ] - }, { - "id" : "f19", - "type" : "SubProcessCall", - "name" : "CaseService", - "config" : { - "processCall" : "Ivy Data Processes/CaseService:findCasesByCriteria(ch.ivy.addon.portalkit.ivydata.searchcriteria.CaseSearchCriteria,Integer,Integer)", - "call" : { - "map" : { - "param.caseSearchCriteria" : "in.caseSearchCriteria", - "param.startIndex" : "0", - "param.count" : "21" - } - }, - "output" : { - "map" : { - "out" : "in", - "out.technicalCases" : "result.cases" - } - } - }, - "visual" : { - "at" : { "x" : 464, "y" : 288 } - }, - "connect" : [ - { "id" : "f29", "to" : "f28" } - ] - }, { - "id" : "f23", - "type" : "SubProcessCall", - "name" : "Navigate to case detail", - "config" : { - "processCall" : "Functional Processes/Navigator:viewCase(ch.ivy.addon.portalkit.dto.GlobalCaseId)", - "call" : { - "map" : { - "param.caseId" : "ch.ivy.addon.portalkit.dto.GlobalCaseId.uuid(in.selectedTechnicalCase.uuid()).isBusinessCase(in.selectedTechnicalCase.isBusinessCase()).build()" - } - } - }, - "visual" : { - "at" : { "x" : 864, "y" : 768 }, - "size" : { "width" : 128 } - } - }, { - "id" : "f26", - "type" : "SubProcessCall", - "name" : "Navigate to technical case list", - "config" : { - "processCall" : "Functional Processes/Navigator:viewTechnicalCasesOfBusniessCase(String,ch.ivy.addon.portalkit.dto.GlobalCaseId)", - "call" : { - "map" : { - "param.businessCaseName" : "ch.ivy.addon.portalkit.util.PermissionUtils.getCaseName(in.selectedTechnicalCase)", - "param.businessCaseId" : "ch.ivy.addon.portalkit.dto.GlobalCaseId.uuid(in.selectedTechnicalCase.uuid()).isBusinessCase(in.selectedTechnicalCase.isBusinessCase()).build()" - } - } - }, - "visual" : { - "at" : { "x" : 888, "y" : 592 }, - "size" : { "width" : 176 } - } - }, { - "id" : "f28", - "type" : "SubProcessCall", - "name" : "Count technical cases", - "config" : { - "processCall" : "Ivy Data Processes/CaseService:countCasesByCriteria(ch.ivy.addon.portalkit.ivydata.searchcriteria.CaseSearchCriteria)", - "call" : { - "map" : { - "param.caseSearchCriteria" : "in.caseSearchCriteria" - } - }, - "output" : { - "map" : { - "out" : "in", - "out.totalRelatedCases" : "result.totalCases.intValue()" - } - } - }, - "visual" : { - "at" : { "x" : 648, "y" : 288 }, - "size" : { "width" : 128 } - }, - "connect" : [ - { "id" : "f21", "to" : "f9", "var" : "in2" } - ] - }, { - "id" : "f33", - "type" : "Script", - "name" : "Update TaskStartedAttribute", - "config" : { - "output" : { - "code" : [ - "import ch.ivy.addon.portalkit.util.TaskUtils;", - "", - "TaskUtils.updateTaskStartedAttribute(false);" - ] - } - }, - "visual" : { - "at" : { "x" : 248, "y" : 488 }, - "size" : { "width" : 160 } - }, - "connect" : [ - { "id" : "f36", "to" : "f31" } - ] - }, { - "id" : "f4", - "type" : "Script", - "name" : "Navigate to task list", - "config" : { - "output" : { - "code" : [ - "import ch.ivy.addon.portalkit.util.PermissionUtils;", - "import ch.ivy.addon.portal.generic.navigation.PortalNavigator;", - "", - "if (in.inFrame) {", - " PortalNavigator.navigateToPortalRelatedTasksOfCaseInFrame(in.caze.uuid(), true, PermissionUtils.getCaseName(in.caze));", - "} else {", - " PortalNavigator.navigateToPortalRelatedTasksOfCase(in.caze.uuid(), true, PermissionUtils.getCaseName(in.caze));", - "}" - ] - } - }, - "visual" : { - "at" : { "x" : 448, "y" : 384 } - } - }, { - "id" : "f31", - "type" : "Script", - "name" : "Navigate to task details", - "config" : { - "output" : { - "code" : [ - "import ch.ivy.addon.portal.generic.navigation.PortalNavigator;", - "", - "if (in.inFrame) {", - " PortalNavigator.navigateToPortalTaskDetailsInFrame(in.taskUUID);", - "} else {", - " PortalNavigator.navigateToPortalTaskDetails(in.taskUUID);", - "}" - ] - } - }, - "visual" : { - "at" : { "x" : 472, "y" : 488 }, - "size" : { "width" : 176, "height" : 48 } - } - }, { - "id" : "f39", - "type" : "Script", - "name" : "mark navigate from related list", - "config" : { - "output" : { - "code" : [ - "import ch.ivy.addon.portalkit.util.TaskUtils;", - "import ch.ivy.addon.portalkit.enums.SessionAttribute;", - "", - "ivy.session.setAttribute(SessionAttribute.NAVIGATE_FROM_RELATED_CASE.toString(), \"true\");", - "TaskUtils.updateTaskStartedAttribute(false);" - ] - } - }, - "visual" : { - "at" : { "x" : 544, "y" : 592 }, - "size" : { "width" : 176 } - }, - "connect" : [ - { "id" : "f48", "to" : "f46" } - ] - }, { - "id" : "f34", - "type" : "Script", - "name" : "mark navigate from related list", - "config" : { - "output" : { - "code" : [ - "import ch.ivy.addon.portalkit.util.TaskUtils;", - "import ch.ivy.addon.portalkit.enums.SessionAttribute;", - "", - "ivy.session.setAttribute(SessionAttribute.NAVIGATE_FROM_RELATED_CASE.toString(), \"true\");", - "TaskUtils.updateTaskStartedAttribute(false);" - ] - } - }, - "visual" : { - "at" : { "x" : 544, "y" : 768 }, - "size" : { "width" : 176 } - }, - "connect" : [ - { "id" : "f24", "to" : "f22" } - ] - }, { - "id" : "f45", - "type" : "HtmlDialogMethodStart", - "name" : "navigateToSelectedTaskDetails(String,Boolean,Boolean)", - "config" : { - "signature" : "navigateToSelectedTaskDetails", - "input" : { - "params" : [ - { "name" : "taskUUID", "type" : "String", "desc" : "" }, - { "name" : "isWorkingOnTask", "type" : "Boolean", "desc" : "" }, - { "name" : "inFrame", "type" : "Boolean", "desc" : "" } - ], - "map" : { - "out.inFrame" : "param.inFrame", - "out.isWorkingOnTask" : "param.isWorkingOnTask", - "out.taskUUID" : "param.taskUUID" - } - }, - "guid" : "1720C62D9BF92EB1" - }, - "visual" : { - "at" : { "x" : 96, "y" : 488 }, - "labelOffset" : { "x" : 85, "y" : 40 } - }, - "connect" : [ - { "id" : "f47", "to" : "f33" } - ] - }, { - "id" : "f43", - "type" : "HtmlDialogMethodStart", - "name" : "navigateToRelatedTasksOfCase(Boolean,Boolean)", - "config" : { - "signature" : "navigateToRelatedTasksOfCase", - "input" : { - "params" : [ - { "name" : "isWorkingOnTask", "type" : "Boolean", "desc" : "" }, - { "name" : "inFrame", "type" : "Boolean", "desc" : "" } - ], - "map" : { - "out.inFrame" : "param.inFrame", - "out.isWorkingOnTask" : "param.isWorkingOnTask" - } - }, - "guid" : "1720C5CCA7DA3932" - }, - "visual" : { - "at" : { "x" : 96, "y" : 384 }, - "labelOffset" : { "x" : 71, "y" : 43 } - }, - "connect" : [ - { "id" : "f51", "to" : "f4" } - ] - }, { - "id" : "f2", - "type" : "HtmlDialogMethodStart", - "name" : "navigateToTechnicalCasesOfBusinessCase(ICase,Boolean,Boolean)", - "config" : { - "signature" : "navigateToTechnicalCasesOfBusinessCase", - "input" : { - "params" : [ - { "name" : "selectedTechnicalCase", "type" : "ch.ivyteam.ivy.workflow.ICase", "desc" : "" }, - { "name" : "isWorkingOnTask", "type" : "Boolean", "desc" : "" }, - { "name" : "inFrame", "type" : "Boolean", "desc" : "" } - ], - "map" : { - "out.inFrame" : "param.inFrame", - "out.isWorkingOnTask" : "param.isWorkingOnTask", - "out.selectedTechnicalCase" : "param.selectedTechnicalCase" - } - }, - "guid" : "1720CC0AEC970FA8" - }, - "visual" : { - "at" : { "x" : 96, "y" : 592 }, - "labelOffset" : { "x" : 110, "y" : 39 } - }, - "connect" : [ - { "id" : "f11", "to" : "f39" } - ] - }, { - "id" : "f25", - "type" : "HtmlDialogMethodStart", - "name" : "navigateToRelatedCaseDetails(ICase,Boolean,Boolean)", - "config" : { - "signature" : "navigateToRelatedCaseDetails", - "input" : { - "params" : [ - { "name" : "selectedTechnicalCase", "type" : "ch.ivyteam.ivy.workflow.ICase", "desc" : "" }, - { "name" : "isWorkingOnTask", "type" : "Boolean", "desc" : "" }, - { "name" : "inFrame", "type" : "Boolean", "desc" : "" } - ], - "map" : { - "out.inFrame" : "param.inFrame", - "out.isWorkingOnTask" : "param.isWorkingOnTask", - "out.selectedTechnicalCase" : "param.selectedTechnicalCase" - } - }, - "guid" : "1720CC59596D550D" - }, - "visual" : { - "at" : { "x" : 96, "y" : 768 }, - "labelOffset" : { "x" : 85, "y" : 40 } - }, - "connect" : [ - { "id" : "f5", "to" : "f34" } - ] - }, { - "id" : "f22", - "type" : "Alternative", - "name" : "Navigate in Case Information frame ?", - "config" : { - "conditions" : { - "f30" : "!in.inFrame" - } - }, - "visual" : { - "at" : { "x" : 704, "y" : 768 }, - "labelOffset" : { "x" : 36, "y" : -26 } - }, - "connect" : [ - { "id" : "f30", "to" : "f23" }, - { "id" : "f38", "to" : "f32", "via" : [ { "x" : 704, "y" : 872 } ] } - ] - }, { - "id" : "f32", - "type" : "SubProcessCall", - "name" : "Navigate to case detail in frame", - "config" : { - "processCall" : "Functional Processes/Navigator:viewCaseItemDetailsInIFrame(ch.ivy.addon.portalkit.dto.GlobalCaseId)", - "call" : { - "map" : { - "param.caseId" : "ch.ivy.addon.portalkit.dto.GlobalCaseId.uuid(in.selectedTechnicalCase.uuid()).isBusinessCase(in.selectedTechnicalCase.isBusinessCase()).build()" - } - } - }, - "visual" : { - "at" : { "x" : 888, "y" : 872 }, - "size" : { "width" : 176 } - } - }, { - "id" : "f46", - "type" : "Alternative", - "name" : "Navigate in Case Information frame ?", - "config" : { - "conditions" : { - "f40" : "!in.inFrame" - } - }, - "visual" : { - "at" : { "x" : 704, "y" : 592 }, - "labelOffset" : { "x" : 38, "y" : -26 } - }, - "connect" : [ - { "id" : "f40", "to" : "f26" }, - { "id" : "f50", "to" : "f49", "via" : [ { "x" : 704, "y" : 680 } ] } - ] - }, { - "id" : "f49", - "type" : "SubProcessCall", - "name" : "Navigate to technical case list in frame", - "config" : { - "processCall" : "Functional Processes/Navigator:viewTechnicalCasesOfBusniessCaseInFrame(String,ch.ivy.addon.portalkit.dto.GlobalCaseId)", - "call" : { - "map" : { - "param.businessCaseName" : "ch.ivy.addon.portalkit.util.PermissionUtils.getCaseName(in.selectedTechnicalCase)", - "param.businessCaseId" : "ch.ivy.addon.portalkit.dto.GlobalCaseId.uuid(in.selectedTechnicalCase.uuid()).isBusinessCase(in.selectedTechnicalCase.isBusinessCase()).build()" - } - } - }, - "visual" : { - "at" : { "x" : 912, "y" : 680 }, - "size" : { "width" : 224 } - } - } ] -} \ No newline at end of file diff --git a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/CaseItemRelatedTasks/CaseItemRelatedTasksData.d.json b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/CaseItemRelatedTasks/CaseItemRelatedTasksData.d.json index ff9128782b9..aec39bbf90c 100644 --- a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/CaseItemRelatedTasks/CaseItemRelatedTasksData.d.json +++ b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/CaseItemRelatedTasks/CaseItemRelatedTasksData.d.json @@ -5,8 +5,7 @@ "isBusinessCaseData" : false, "fields" : [ { "name" : "caze", - "type" : "ch.ivyteam.ivy.workflow.ICase", - "modifiers" : [ "PERSISTENT" ] + "type" : "ch.ivyteam.ivy.workflow.ICase" }, { "name" : "isTaskFinished", "type" : "Boolean", @@ -21,8 +20,7 @@ "modifiers" : [ "PERSISTENT" ] }, { "name" : "task", - "type" : "ch.ivyteam.ivy.workflow.ITask", - "modifiers" : [ "PERSISTENT" ] + "type" : "ch.ivyteam.ivy.workflow.ITask" }, { "name" : "canUserResumeTask", "type" : "Boolean", @@ -34,24 +32,20 @@ }, { "name" : "selectedTask", "type" : "ch.ivyteam.ivy.workflow.ITask", - "comment" : "Task is selected for reset or delegate", - "modifiers" : [ "PERSISTENT" ] + "comment" : "Task is selected for reset or delegate" }, { "name" : "dataModel", - "type" : "ch.ivy.addon.portalkit.datamodel.internal.RelatedTaskLazyDataModel", - "modifiers" : [ "PERSISTENT" ] + "type" : "ch.ivy.addon.portalkit.datamodel.internal.RelatedTaskLazyDataModel" }, { "name" : "relatedTaskColumnsVisibility", "type" : "java.util.List", "modifiers" : [ "PERSISTENT" ] }, { "name" : "exportedFile", - "type" : "org.primefaces.model.StreamedContent", - "modifiers" : [ "PERSISTENT" ] + "type" : "org.primefaces.model.StreamedContent" }, { "name" : "taskSearchCriteria", - "type" : "ch.ivy.addon.portalkit.ivydata.searchcriteria.TaskSearchCriteria", - "modifiers" : [ "PERSISTENT" ] + "type" : "ch.ivy.addon.portalkit.ivydata.searchcriteria.TaskSearchCriteria" }, { "name" : "totalTasks", "type" : "Integer", @@ -66,8 +60,7 @@ "modifiers" : [ "PERSISTENT" ] }, { "name" : "collectedTasksForExporting", - "type" : "java.util.List", - "modifiers" : [ "PERSISTENT" ] + "type" : "java.util.List" }, { "name" : "count", "type" : "Integer", @@ -78,8 +71,7 @@ "modifiers" : [ "PERSISTENT" ] }, { "name" : "tasks", - "type" : "List", - "modifiers" : [ "PERSISTENT" ] + "type" : "List" }, { "name" : "taskUUID", "type" : "String", diff --git a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/CaseWidget/CaseWidgetData.d.json b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/CaseWidget/CaseWidgetData.d.json index ac8cfab0312..be03d45b498 100644 --- a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/CaseWidget/CaseWidgetData.d.json +++ b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/CaseWidget/CaseWidgetData.d.json @@ -9,16 +9,14 @@ "modifiers" : [ "PERSISTENT" ] }, { "name" : "cases", - "type" : "java.util.List", - "modifiers" : [ "PERSISTENT" ] + "type" : "java.util.List" }, { "name" : "filteringKeyword", "type" : "String", "modifiers" : [ "PERSISTENT" ] }, { "name" : "dataModel", - "type" : "ch.ivy.addon.portalkit.datamodel.CaseLazyDataModel", - "modifiers" : [ "PERSISTENT" ] + "type" : "ch.ivy.addon.portalkit.datamodel.CaseLazyDataModel" }, { "name" : "totalCases", "type" : "Long", @@ -33,16 +31,14 @@ "modifiers" : [ "PERSISTENT" ] }, { "name" : "caseSearchCriteria", - "type" : "ch.ivy.addon.portalkit.ivydata.searchcriteria.CaseSearchCriteria", - "modifiers" : [ "PERSISTENT" ] + "type" : "ch.ivy.addon.portalkit.ivydata.searchcriteria.CaseSearchCriteria" }, { "name" : "filterSetName", "type" : "String", "modifiers" : [ "PERSISTENT" ] }, { "name" : "filterType", - "type" : "ch.ivy.addon.portalkit.enums.FilterType", - "modifiers" : [ "PERSISTENT" ] + "type" : "ch.ivy.addon.portalkit.enums.FilterType" }, { "name" : "isFilterExisted", "type" : "Boolean", @@ -53,28 +49,23 @@ "modifiers" : [ "PERSISTENT" ] }, { "name" : "publicFilters", - "type" : "java.util.List", - "modifiers" : [ "PERSISTENT" ] + "type" : "java.util.List" }, { "name" : "privateFilters", - "type" : "java.util.List", - "modifiers" : [ "PERSISTENT" ] + "type" : "java.util.List" }, { "name" : "filterDataToBeDeleted", - "type" : "ch.ivy.addon.portalkit.casefilter.impl.CaseFilterData", - "modifiers" : [ "PERSISTENT" ] + "type" : "ch.ivy.addon.portalkit.casefilter.impl.CaseFilterData" }, { "name" : "columnsVisibility", "type" : "java.util.List", "modifiers" : [ "PERSISTENT" ] }, { "name" : "globalCaseId", - "type" : "ch.ivy.addon.portalkit.dto.GlobalCaseId", - "modifiers" : [ "PERSISTENT" ] + "type" : "ch.ivy.addon.portalkit.dto.GlobalCaseId" }, { "name" : "exportedFile", - "type" : "org.primefaces.model.StreamedContent", - "modifiers" : [ "PERSISTENT" ] + "type" : "org.primefaces.model.StreamedContent" }, { "name" : "loopCounter", "type" : "Integer", @@ -85,7 +76,6 @@ "modifiers" : [ "PERSISTENT" ] }, { "name" : "collectedCasesForExporting", - "type" : "java.util.List", - "modifiers" : [ "PERSISTENT" ] + "type" : "java.util.List" } ] } \ No newline at end of file diff --git a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/ProcessWidget/ProcessWidgetData.d.json b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/ProcessWidget/ProcessWidgetData.d.json index 52f1a8de3bf..da4d2212519 100644 --- a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/ProcessWidget/ProcessWidgetData.d.json +++ b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/ProcessWidget/ProcessWidgetData.d.json @@ -5,7 +5,6 @@ "isBusinessCaseData" : false, "fields" : [ { "name" : "processes", - "type" : "java.util.List", - "modifiers" : [ "PERSISTENT" ] + "type" : "java.util.List" } ] } \ No newline at end of file diff --git a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/SecurityMemberDisplayName/SecurityMemberDisplayNameData.d.json b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/SecurityMemberDisplayName/SecurityMemberDisplayNameData.d.json index 162d22b2f1f..3bb43e921b0 100644 --- a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/SecurityMemberDisplayName/SecurityMemberDisplayNameData.d.json +++ b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/SecurityMemberDisplayName/SecurityMemberDisplayNameData.d.json @@ -5,8 +5,7 @@ "isBusinessCaseData" : false, "fields" : [ { "name" : "memberNames", - "type" : "java.util.List", - "modifiers" : [ "PERSISTENT" ] + "type" : "java.util.List" }, { "name" : "roleName", "type" : "String", @@ -25,7 +24,6 @@ "modifiers" : [ "PERSISTENT" ] }, { "name" : "securityMember", - "type" : "ch.ivyteam.ivy.security.ISecurityMember", - "modifiers" : [ "PERSISTENT" ] + "type" : "ch.ivyteam.ivy.security.ISecurityMember" } ] } \ No newline at end of file diff --git a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/SideStep/SideStepData.d.json b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/SideStep/SideStepData.d.json index 5cd9e506e49..d4757fe83c5 100644 --- a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/SideStep/SideStepData.d.json +++ b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/SideStep/SideStepData.d.json @@ -5,12 +5,10 @@ "isBusinessCaseData" : false, "fields" : [ { "name" : "task", - "type" : "ch.ivyteam.ivy.workflow.ITask", - "modifiers" : [ "PERSISTENT" ] + "type" : "ch.ivyteam.ivy.workflow.ITask" }, { "name" : "dataModel", - "type" : "ch.ivy.addon.portalkit.datamodel.TaskLazyDataModel", - "modifiers" : [ "PERSISTENT" ] + "type" : "ch.ivy.addon.portalkit.datamodel.TaskLazyDataModel" }, { "name" : "currentPortalPage", "type" : "String", diff --git a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/TaskExpiryActivatorSelection/TaskExpiryActivatorSelectionData.d.json b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/TaskExpiryActivatorSelection/TaskExpiryActivatorSelectionData.d.json index c88f0dd4752..016099d4dcf 100644 --- a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/TaskExpiryActivatorSelection/TaskExpiryActivatorSelectionData.d.json +++ b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/TaskExpiryActivatorSelection/TaskExpiryActivatorSelectionData.d.json @@ -9,32 +9,26 @@ "modifiers" : [ "PERSISTENT" ] }, { "name" : "users", - "type" : "java.util.List", - "modifiers" : [ "PERSISTENT" ] + "type" : "java.util.List" }, { "name" : "roles", - "type" : "java.util.List", - "modifiers" : [ "PERSISTENT" ] + "type" : "java.util.List" }, { "name" : "selectedActivator", - "type" : "ch.ivyteam.ivy.security.ISecurityMember", - "modifiers" : [ "PERSISTENT" ] + "type" : "ch.ivyteam.ivy.security.ISecurityMember" }, { "name" : "queryAutoComplete", "type" : "String", "modifiers" : [ "PERSISTENT" ] }, { "name" : "task", - "type" : "ch.ivyteam.ivy.workflow.ITask", - "modifiers" : [ "PERSISTENT" ] + "type" : "ch.ivyteam.ivy.workflow.ITask" }, { "name" : "selectedUser", - "type" : "com.axonivy.portal.components.dto.UserDTO", - "modifiers" : [ "PERSISTENT" ] + "type" : "com.axonivy.portal.components.dto.UserDTO" }, { "name" : "selectedRole", - "type" : "com.axonivy.portal.components.dto.RoleDTO", - "modifiers" : [ "PERSISTENT" ] + "type" : "com.axonivy.portal.components.dto.RoleDTO" }, { "name" : "comment", "type" : "String", diff --git a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/TaskItem/TaskItemData.d.json b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/TaskItem/TaskItemData.d.json index 82661861df8..458d0dfb23e 100644 --- a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/TaskItem/TaskItemData.d.json +++ b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/TaskItem/TaskItemData.d.json @@ -5,16 +5,14 @@ "isBusinessCaseData" : false, "fields" : [ { "name" : "task", - "type" : "ch.ivyteam.ivy.workflow.ITask", - "modifiers" : [ "PERSISTENT" ] + "type" : "ch.ivyteam.ivy.workflow.ITask" }, { "name" : "compactMode", "type" : "Boolean", "modifiers" : [ "PERSISTENT" ] }, { "name" : "expandedTask", - "type" : "ch.ivyteam.ivy.workflow.ITask", - "modifiers" : [ "PERSISTENT" ] + "type" : "ch.ivyteam.ivy.workflow.ITask" }, { "name" : "canUserResumeTask", "type" : "Boolean", @@ -26,8 +24,7 @@ "modifiers" : [ "PERSISTENT" ] }, { "name" : "dataModel", - "type" : "ch.ivy.addon.portalkit.datamodel.TaskLazyDataModel", - "modifiers" : [ "PERSISTENT" ] + "type" : "ch.ivy.addon.portalkit.datamodel.TaskLazyDataModel" }, { "name" : "currentPortalPage", "type" : "String", diff --git a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/TaskItemDelegate/TaskItemDelegateData.d.json b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/TaskItemDelegate/TaskItemDelegateData.d.json index a2edb2c2d98..2cfd6c3d8fb 100644 --- a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/TaskItemDelegate/TaskItemDelegateData.d.json +++ b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/TaskItemDelegate/TaskItemDelegateData.d.json @@ -9,16 +9,13 @@ "modifiers" : [ "PERSISTENT" ] }, { "name" : "usersToDelegate", - "type" : "java.util.List", - "modifiers" : [ "PERSISTENT" ] + "type" : "java.util.List" }, { "name" : "rolesToDelegate", - "type" : "java.util.List", - "modifiers" : [ "PERSISTENT" ] + "type" : "java.util.List" }, { "name" : "application", - "type" : "ch.ivyteam.ivy.application.IApplication", - "modifiers" : [ "PERSISTENT" ] + "type" : "ch.ivyteam.ivy.application.IApplication" }, { "name" : "disabledDelegateButton", "type" : "Boolean", @@ -29,8 +26,7 @@ "modifiers" : [ "PERSISTENT" ] }, { "name" : "delegatedSecurityMember", - "type" : "ch.ivyteam.ivy.security.ISecurityMember", - "modifiers" : [ "PERSISTENT" ] + "type" : "ch.ivyteam.ivy.security.ISecurityMember" }, { "name" : "delegateComment", "type" : "String", @@ -41,16 +37,13 @@ "modifiers" : [ "PERSISTENT" ] }, { "name" : "task", - "type" : "ch.ivyteam.ivy.workflow.ITask", - "modifiers" : [ "PERSISTENT" ] + "type" : "ch.ivyteam.ivy.workflow.ITask" }, { "name" : "selectedUser", - "type" : "com.axonivy.portal.components.dto.UserDTO", - "modifiers" : [ "PERSISTENT" ] + "type" : "com.axonivy.portal.components.dto.UserDTO" }, { "name" : "selectedRole", - "type" : "com.axonivy.portal.components.dto.RoleDTO", - "modifiers" : [ "PERSISTENT" ] + "type" : "com.axonivy.portal.components.dto.RoleDTO" }, { "name" : "taskDelegationComment", "type" : "String", diff --git a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/TaskItemDetails/TaskItemDetailsData.d.json b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/TaskItemDetails/TaskItemDetailsData.d.json index 9fa1a4bc1ab..cbdc84d883e 100644 --- a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/TaskItemDetails/TaskItemDetailsData.d.json +++ b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/TaskItemDetails/TaskItemDetailsData.d.json @@ -13,8 +13,7 @@ "modifiers" : [ "PERSISTENT" ] }, { "name" : "task", - "type" : "ch.ivyteam.ivy.workflow.ITask", - "modifiers" : [ "PERSISTENT" ] + "type" : "ch.ivyteam.ivy.workflow.ITask" }, { "name" : "canUserResumeTask", "type" : "Boolean", @@ -25,13 +24,11 @@ "modifiers" : [ "PERSISTENT" ] }, { "name" : "dataModel", - "type" : "ch.ivy.addon.portalkit.datamodel.TaskLazyDataModel", - "modifiers" : [ "PERSISTENT" ] + "type" : "ch.ivy.addon.portalkit.datamodel.TaskLazyDataModel" }, { "name" : "portalPage", "type" : "ch.ivy.addon.portalkit.enums.PortalPage", - "comment" : "Page opened Task Details", - "modifiers" : [ "PERSISTENT" ] + "comment" : "Page opened Task Details" }, { "name" : "isHideTaskDocument", "type" : "Boolean", diff --git a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/TaskItemDocuments/TaskItemDocumentsData.d.json b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/TaskItemDocuments/TaskItemDocumentsData.d.json index 068ba5fe366..e5f0cc77869 100644 --- a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/TaskItemDocuments/TaskItemDocumentsData.d.json +++ b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/TaskItemDocuments/TaskItemDocumentsData.d.json @@ -5,28 +5,23 @@ "isBusinessCaseData" : false, "fields" : [ { "name" : "document", - "type" : "com.axonivy.portal.components.ivydata.bo.IvyDocument", - "modifiers" : [ "PERSISTENT" ] + "type" : "com.axonivy.portal.components.ivydata.bo.IvyDocument" }, { "name" : "documentContent", - "type" : "javax.activation.DataHandler", - "modifiers" : [ "PERSISTENT" ] + "type" : "javax.activation.DataHandler" }, { "name" : "streamedContent", - "type" : "org.primefaces.model.StreamedContent", - "modifiers" : [ "PERSISTENT" ] + "type" : "org.primefaces.model.StreamedContent" }, { "name" : "documentId", "type" : "Long", "modifiers" : [ "PERSISTENT" ] }, { "name" : "documents", - "type" : "java.util.List", - "modifiers" : [ "PERSISTENT" ] + "type" : "java.util.List" }, { "name" : "documentUploadEvent", - "type" : "org.primefaces.event.FileUploadEvent", - "modifiers" : [ "PERSISTENT" ] + "type" : "org.primefaces.event.FileUploadEvent" }, { "name" : "isHideUploadDocumentForDoneCase", "type" : "Boolean", @@ -37,20 +32,17 @@ "modifiers" : [ "PERSISTENT" ] }, { "name" : "task", - "type" : "ch.ivyteam.ivy.workflow.ITask", - "modifiers" : [ "PERSISTENT" ] + "type" : "ch.ivyteam.ivy.workflow.ITask" }, { "name" : "uploadDocumentCheckMessage", "type" : "String", "modifiers" : [ "PERSISTENT" ] }, { "name" : "uploadDocumentCheckStatus", - "type" : "com.axonivy.portal.components.enums.UploadDocumentCheckStatus", - "modifiers" : [ "PERSISTENT" ] + "type" : "com.axonivy.portal.components.enums.UploadDocumentCheckStatus" }, { "name" : "businessCase", - "type" : "ch.ivyteam.ivy.workflow.ICase", - "modifiers" : [ "PERSISTENT" ] + "type" : "ch.ivyteam.ivy.workflow.ICase" }, { "name" : "deleteDocumentMessage", "type" : "String", diff --git a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/TaskItemGeneralInfo/TaskItemGeneralInfoData.d.json b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/TaskItemGeneralInfo/TaskItemGeneralInfoData.d.json index c10e6f38e65..6d2c7eae659 100644 --- a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/TaskItemGeneralInfo/TaskItemGeneralInfoData.d.json +++ b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/TaskItemGeneralInfo/TaskItemGeneralInfoData.d.json @@ -13,12 +13,10 @@ "modifiers" : [ "PERSISTENT" ] }, { "name" : "selectedCase", - "type" : "ch.ivyteam.ivy.workflow.ICase", - "modifiers" : [ "PERSISTENT" ] + "type" : "ch.ivyteam.ivy.workflow.ICase" }, { "name" : "task", - "type" : "ch.ivyteam.ivy.workflow.ITask", - "modifiers" : [ "PERSISTENT" ] + "type" : "ch.ivyteam.ivy.workflow.ITask" }, { "name" : "expiryTimestamp", "type" : "java.util.Date", diff --git a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/TaskItemNotes/TaskItemNotes.xhtml b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/TaskItemNotes/TaskItemNotes.xhtml index 87d4f861e40..9eaa3937dda 100644 --- a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/TaskItemNotes/TaskItemNotes.xhtml +++ b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/TaskItemNotes/TaskItemNotes.xhtml @@ -54,23 +54,23 @@ + sortBy="#{note.content()}"> - + - + - + diff --git a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/TaskItemNotes/TaskItemNotesData.d.json b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/TaskItemNotes/TaskItemNotesData.d.json index 56d73a0ae78..7aebee25de6 100644 --- a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/TaskItemNotes/TaskItemNotesData.d.json +++ b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/TaskItemNotes/TaskItemNotesData.d.json @@ -13,20 +13,17 @@ "modifiers" : [ "PERSISTENT" ] }, { "name" : "note", - "type" : "ch.ivyteam.ivy.workflow.INote", - "modifiers" : [ "PERSISTENT" ] + "type" : "ch.ivyteam.ivy.workflow.note.Note" }, { "name" : "noteContent", "type" : "String", "modifiers" : [ "PERSISTENT" ] }, { "name" : "notes", - "type" : "java.util.List", - "modifiers" : [ "PERSISTENT" ] + "type" : "List" }, { "name" : "task", - "type" : "ch.ivyteam.ivy.workflow.ITask", - "modifiers" : [ "PERSISTENT" ] + "type" : "ch.ivyteam.ivy.workflow.ITask" }, { "name" : "showSystemNotes", "type" : "Boolean", diff --git a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/TaskItemWorkflowEvents/TaskItemWorkflowEvents.xhtml b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/TaskItemWorkflowEvents/TaskItemWorkflowEvents.xhtml index 7656af30411..c5f60a7e2e4 100644 --- a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/TaskItemWorkflowEvents/TaskItemWorkflowEvents.xhtml +++ b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/TaskItemWorkflowEvents/TaskItemWorkflowEvents.xhtml @@ -14,12 +14,10 @@ - -
    - - - - diff --git a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/TaskItemWorkflowEvents/TaskItemWorkflowEventsData.d.json b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/TaskItemWorkflowEvents/TaskItemWorkflowEventsData.d.json index e583bc480c6..f85d838b50a 100644 --- a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/TaskItemWorkflowEvents/TaskItemWorkflowEventsData.d.json +++ b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/TaskItemWorkflowEvents/TaskItemWorkflowEventsData.d.json @@ -9,7 +9,6 @@ "modifiers" : [ "PERSISTENT" ] }, { "name" : "task", - "type" : "ch.ivyteam.ivy.workflow.ITask", - "modifiers" : [ "PERSISTENT" ] + "type" : "ch.ivyteam.ivy.workflow.ITask" } ] } \ No newline at end of file diff --git a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/TaskWidget/TaskWidgetData.d.json b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/TaskWidget/TaskWidgetData.d.json index 7f5881fa723..09437607065 100644 --- a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/TaskWidget/TaskWidgetData.d.json +++ b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/TaskWidget/TaskWidgetData.d.json @@ -37,8 +37,7 @@ "modifiers" : [ "PERSISTENT" ] }, { "name" : "latestTasks", - "type" : "java.util.List", - "modifiers" : [ "PERSISTENT" ] + "type" : "java.util.List" }, { "name" : "selectedSort", "type" : "String", @@ -77,16 +76,13 @@ "modifiers" : [ "PERSISTENT" ] }, { "name" : "taskPrivateFilters", - "type" : "List", - "modifiers" : [ "PERSISTENT" ] + "type" : "List" }, { "name" : "taskPublicFilters", - "type" : "List", - "modifiers" : [ "PERSISTENT" ] + "type" : "List" }, { "name" : "tasks", - "type" : "java.util.List", - "modifiers" : [ "PERSISTENT" ] + "type" : "java.util.List" }, { "name" : "taskSearchCriteria", "type" : "ch.ivy.addon.portalkit.ivydata.searchcriteria.TaskSearchCriteria", @@ -98,8 +94,7 @@ }, { "name" : "selectedTask", "type" : "ch.ivyteam.ivy.workflow.ITask", - "comment" : "Task is selected for reset or delegate", - "modifiers" : [ "PERSISTENT" ] + "comment" : "Task is selected for reset or delegate" }, { "name" : "currentPortalPage", "type" : "String", @@ -122,8 +117,7 @@ "modifiers" : [ "PERSISTENT" ] }, { "name" : "collectedTasksForExporting", - "type" : "List", - "modifiers" : [ "PERSISTENT" ] + "type" : "List" }, { "name" : "columnsVisibility", "type" : "List", diff --git a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/WarningBeforeLeavingTask/WarningBeforeLeavingTaskData.d.json b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/WarningBeforeLeavingTask/WarningBeforeLeavingTaskData.d.json index 93fce8d1f0d..0d4273a947c 100644 --- a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/WarningBeforeLeavingTask/WarningBeforeLeavingTaskData.d.json +++ b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/WarningBeforeLeavingTask/WarningBeforeLeavingTaskData.d.json @@ -9,7 +9,6 @@ "modifiers" : [ "PERSISTENT" ] }, { "name" : "caze", - "type" : "ch.ivyteam.ivy.workflow.ICase", - "modifiers" : [ "PERSISTENT" ] + "type" : "ch.ivyteam.ivy.workflow.ICase" } ] } \ No newline at end of file diff --git a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/WarningBeforeLostSession/WarningBeforeLostSessionData.d.json b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/WarningBeforeLostSession/WarningBeforeLostSessionData.d.json index c796ad53702..8a365275a45 100644 --- a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/WarningBeforeLostSession/WarningBeforeLostSessionData.d.json +++ b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/WarningBeforeLostSession/WarningBeforeLostSessionData.d.json @@ -5,7 +5,6 @@ "isBusinessCaseData" : false, "fields" : [ { "name" : "task", - "type" : "ch.ivyteam.ivy.workflow.ITask", - "modifiers" : [ "PERSISTENT" ] + "type" : "ch.ivyteam.ivy.workflow.ITask" } ] } \ No newline at end of file diff --git a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/task/column/TaskName/TaskNameData.d.json b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/task/column/TaskName/TaskNameData.d.json index 8d7864ea75e..f6b97f50102 100644 --- a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/task/column/TaskName/TaskNameData.d.json +++ b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/component/task/column/TaskName/TaskNameData.d.json @@ -9,8 +9,7 @@ "modifiers" : [ "PERSISTENT" ] }, { "name" : "task", - "type" : "ch.ivyteam.ivy.workflow.ITask", - "modifiers" : [ "PERSISTENT" ] + "type" : "ch.ivyteam.ivy.workflow.ITask" }, { "name" : "changeNameNoteContent", "type" : "String", diff --git a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/multiapp/settings/LogoutSetting/LogoutSetting.xhtml b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/multiapp/settings/LogoutSetting/LogoutSetting.xhtml index f8025608331..4481667b73d 100644 --- a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/multiapp/settings/LogoutSetting/LogoutSetting.xhtml +++ b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/multiapp/settings/LogoutSetting/LogoutSetting.xhtml @@ -27,8 +27,8 @@ actionListener="#{logic.logout(task)}" /> + widgetVar="logoutConfirmation" appendTo="@(body)" style="max-width: 610px;" + rendered="#{data.isWorkingOnATask}" responsive="true" closable="false" styleClass="warning-before-leaving-task">

    #{ivy.cms.co('/ch.ivy.addon.portalkit.ui.jsf/common/confirmation')}

    diff --git a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/multiapp/settings/LogoutSetting/LogoutSettingData.d.json b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/multiapp/settings/LogoutSetting/LogoutSettingData.d.json index ea1cbf3ab8c..73c483e65c7 100644 --- a/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/multiapp/settings/LogoutSetting/LogoutSettingData.d.json +++ b/AxonIvyPortal/portal/src_hd/ch/ivy/addon/portalkit/multiapp/settings/LogoutSetting/LogoutSettingData.d.json @@ -5,8 +5,7 @@ "isBusinessCaseData" : false, "fields" : [ { "name" : "task", - "type" : "ch.ivyteam.ivy.workflow.ITask", - "modifiers" : [ "PERSISTENT" ] + "type" : "ch.ivyteam.ivy.workflow.ITask" }, { "name" : "isWorkingOnATask", "type" : "Boolean", diff --git a/AxonIvyPortal/portal/src_hd/com/axonivy/portal/component/NotificationFullPage/NotificationFullPage.xhtml b/AxonIvyPortal/portal/src_hd/com/axonivy/portal/component/NotificationFullPage/NotificationFullPage.xhtml index 9b845e08f5f..b050e4a94d6 100644 --- a/AxonIvyPortal/portal/src_hd/com/axonivy/portal/component/NotificationFullPage/NotificationFullPage.xhtml +++ b/AxonIvyPortal/portal/src_hd/com/axonivy/portal/component/NotificationFullPage/NotificationFullPage.xhtml @@ -50,14 +50,19 @@
    -
    - - - - - -
    +
    + + + + + + + + + + +
    diff --git a/AxonIvyPortal/portal/src_hd/com/axonivy/portal/dashboard/component/NotificationWidget/NotificationWidget.xhtml b/AxonIvyPortal/portal/src_hd/com/axonivy/portal/dashboard/component/NotificationWidget/NotificationWidget.xhtml index 973a3d3eb8d..b73634529d4 100644 --- a/AxonIvyPortal/portal/src_hd/com/axonivy/portal/dashboard/component/NotificationWidget/NotificationWidget.xhtml +++ b/AxonIvyPortal/portal/src_hd/com/axonivy/portal/dashboard/component/NotificationWidget/NotificationWidget.xhtml @@ -70,12 +70,16 @@ value="#{ivy.cms.co('/ch.ivy.addon.portalkit.ui.jsf/notifications/markAsRead')}" />
    - + + - - - + + + + +
    diff --git a/AxonIvyPortal/portal/webContent/layouts/BasicTemplate.xhtml b/AxonIvyPortal/portal/webContent/layouts/BasicTemplate.xhtml index f6a0f213148..dd1ff2f4d1e 100644 --- a/AxonIvyPortal/portal/webContent/layouts/BasicTemplate.xhtml +++ b/AxonIvyPortal/portal/webContent/layouts/BasicTemplate.xhtml @@ -18,7 +18,7 @@ - +
    diff --git a/AxonIvyPortal/portal/webContent/layouts/includes/notification.xhtml b/AxonIvyPortal/portal/webContent/layouts/includes/notification.xhtml index 88e7d2224b0..7b15d46666b 100644 --- a/AxonIvyPortal/portal/webContent/layouts/includes/notification.xhtml +++ b/AxonIvyPortal/portal/webContent/layouts/includes/notification.xhtml @@ -84,13 +84,18 @@ value="#{ivy.cms.co('/ch.ivy.addon.portalkit.ui.jsf/notifications/markAsRead')}" /> </div> <div class="flex notification-message-block flex-column"> - <p:commandLink id="notification-message" styleClass="notification-message" - actionListener="#{notificationBean.goToNotificationDetail(notification, isWorkingOnATask, task)}" - rendered="#{notification.infoAction != null}"> - </p:commandLink> + <h:panelGroup rendered="#{notification.infoAction != null}"> + <p:commandLink id="notification-message" styleClass="notification-message" + actionListener="#{notificationBean.goToNotificationDetail(notification, isWorkingOnATask, task)}"> + <h:outputText value="#{htmlSanitizerBean.sanitize(notification.message)}" /> + </p:commandLink> <h:outputText value="#{htmlSanitizerBean.sanitize(notification.message)}" /> <p:tooltip for="notification-message" value="#{notification.infoAction.title}" /> - <h:outputText value="#{notification.timeSince}" styleClass="font-normal notifications-item-time-since" /> + </h:panelGroup> + <h:panelGroup rendered="#{notification.infoAction == null}"> + <h:outputText value="#{ivy.cms.co('/ch.ivy.addon.portalkit.ui.jsf/notifications/errorNotificationMessage')}" /> + </h:panelGroup> + <h:outputText value="#{notification.timeSince}" styleClass="font-normal notifications-item-time-since" /> </div> <p:outputPanel rendered="#{notificationBean.isActionAvailible(notification)}" styleClass="flex notification-action-block"> <p:commandLink id="notification-start-task" diff --git a/AxonIvyPortal/portal/webContent/layouts/restricted/IFrameWithoutMenuTemplate.xhtml b/AxonIvyPortal/portal/webContent/layouts/restricted/IFrameWithoutMenuTemplate.xhtml index a52abf57b3d..c7b2db752d3 100644 --- a/AxonIvyPortal/portal/webContent/layouts/restricted/IFrameWithoutMenuTemplate.xhtml +++ b/AxonIvyPortal/portal/webContent/layouts/restricted/IFrameWithoutMenuTemplate.xhtml @@ -11,7 +11,7 @@ <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> - <meta name="apple-mobile-web-app-capable" content="yes" /> + <meta name="mobile-web-app-capable" content="yes" /> </f:facet> <f:attribute name="primefaces.THEME" value="#{ivyFreyaTheme.theme}" /> diff --git a/AxonIvyPortal/portal/webContent/layouts/restricted/decorator/SidebarWidgetConfiguration.xhtml b/AxonIvyPortal/portal/webContent/layouts/restricted/decorator/SidebarWidgetConfiguration.xhtml index 6796eefbd1b..1c3d9cfbb43 100644 --- a/AxonIvyPortal/portal/webContent/layouts/restricted/decorator/SidebarWidgetConfiguration.xhtml +++ b/AxonIvyPortal/portal/webContent/layouts/restricted/decorator/SidebarWidgetConfiguration.xhtml @@ -41,7 +41,6 @@ </div> </h:panelGroup> <div class="ui-g-4"> - <h:outputText value="#{ivy.cms.co('/ch.ivy.addon.portalkit.ui.jsf/dashboard/configuration/tableConfigurationDesc')}" /> </div> <div class="ui-g-4"> <p:commandButton id="show-filter" styleClass="Fright" icon="si si-filter-1" diff --git a/AxonIvyPortal/portal/webContent/resources/css/module.css b/AxonIvyPortal/portal/webContent/resources/css/module.css index e29b97b2c74..fe5859af43f 100644 --- a/AxonIvyPortal/portal/webContent/resources/css/module.css +++ b/AxonIvyPortal/portal/webContent/resources/css/module.css @@ -1160,7 +1160,7 @@ span.case-details-document-add-link, span.task-details-document-add-link { display: flex; align-items: center; padding-left: 12px; - width: 4.2rem; + padding-right: 17px; } .process-start-list-item-icon .fa { @@ -1195,7 +1195,7 @@ span.case-details-document-add-link, span.task-details-document-add-link { .process-start-list-item-name { overflow: hidden; display: inline-grid; - width: calc(100% - 75px); + flex-grow: 1; align-items: center; padding:0 15px; } @@ -1260,6 +1260,8 @@ span.case-details-document-add-link, span.task-details-document-add-link { } .process-start-list-item .ui-commandlink.process-item { + display: flex; + justify-content: space-between; margin: 0; padding: 0 5px; max-width: 100%; @@ -1928,7 +1930,6 @@ _:-ms-input-placeholder, :root a.compact-task-start-link { } .options-panel .ui-state-disabled.option-item { - display: inline-block; opacity: 0.5; text-decoration: none; } diff --git a/AxonIvyPortal/portal/webContent/resources/images/welcome-widget-sample.png b/AxonIvyPortal/portal/webContent/resources/images/welcome-widget-sample.png index 6bc310bb8c4..8d3611b93d5 100644 Binary files a/AxonIvyPortal/portal/webContent/resources/images/welcome-widget-sample.png and b/AxonIvyPortal/portal/webContent/resources/images/welcome-widget-sample.png differ diff --git a/AxonIvyPortal/portal/webContent/resources/js/portal.js b/AxonIvyPortal/portal/webContent/resources/js/portal.js index f194fea7bc0..48e5a524a41 100644 --- a/AxonIvyPortal/portal/webContent/resources/js/portal.js +++ b/AxonIvyPortal/portal/webContent/resources/js/portal.js @@ -224,7 +224,7 @@ var MainMenu = { } this.removeActiveMenu(activeMenuItemList); $currentPageMenu.parent().addClass('active-menuitem'); - PF('main-menu').addMenuitem($currentPageMenu.parent().attr('id')); + PF('main-menu')?.addMenuitem($currentPageMenu.parent().attr('id')); } }, @@ -283,10 +283,10 @@ function handleError(xhr, renderDetail, isShowErrorLog){ $("[id$='ajax-indicator:form-data']").text(decodeURIComponent(xhr.pfSettings.data)); $("[id$='ajax-indicator:response-text']").text(xhr.responseText); $("[id$='ajax-indicator:xhr']").text(JSON.stringify(xhr)); - PF('detail-error-dialog').show(); + PF('detail-error-dialog')?.show(); }); } - PF('error-ajax-dialog').show(); + PF('error-ajax-dialog')?.show(); if(isShowErrorLog){ var settingsSourceId = "PfSettings.source.id:\n"; console.log("Status code:\n" + xhr.status); @@ -336,7 +336,7 @@ function executeStoreMenuRemoteCommand(menuItem, isWorkingOnATask, isOpenOnNewTa function fireEventClickOnMenuItem(menuItem, prevMenuItemId) { PF('main-menu').addMenuitem(menuItem); if (prevMenuItemId !== menuItem) { - PF('main-menu').removeMenuitem(prevMenuItemId); + PF('main-menu')?.removeMenuitem(prevMenuItemId); } } @@ -363,7 +363,7 @@ function highlightDashboardItem(menuId) { } function activeMenuItemOnLeftMenu(menuId) { - PF('main-menu').addMenuitem(menuId); + PF('main-menu')?.addMenuitem(menuId); let $selectedMenu = $("[id$='" + menuId + "']"); if (!$selectedMenu.hasClass('active-menuitem') && !$selectedMenu.siblings('.active-menuitem').length) { $selectedMenu.addClass('active-menuitem'); @@ -371,7 +371,7 @@ function activeMenuItemOnLeftMenu(menuId) { } function deactivateMenuItemOnLeftMenu(menuId) { - PF('main-menu').removeMenuitem(menuId); + PF('main-menu')?.removeMenuitem(menuId); let $removedMenu = $("[id$='" + menuId + "']"); if ($removedMenu.hasClass('active-menuitem')) { $removedMenu.removeClass('active-menuitem'); diff --git a/Documentation/portal-guide/source/portal-developer-guide/architecture/images/multi-app-structure.png b/Documentation/portal-guide/source/portal-developer-guide/architecture/images/multi-app-structure.png index 962b6f55605..1329f867693 100644 Binary files a/Documentation/portal-guide/source/portal-developer-guide/architecture/images/multi-app-structure.png and b/Documentation/portal-guide/source/portal-developer-guide/architecture/images/multi-app-structure.png differ diff --git a/Documentation/portal-guide/source/portal-developer-guide/architecture/images/process-module-structure.png b/Documentation/portal-guide/source/portal-developer-guide/architecture/images/process-module-structure.png index 42e54c0a7e2..7efd7c68ea3 100644 Binary files a/Documentation/portal-guide/source/portal-developer-guide/architecture/images/process-module-structure.png and b/Documentation/portal-guide/source/portal-developer-guide/architecture/images/process-module-structure.png differ diff --git a/Documentation/portal-guide/source/portal-developer-guide/customization/images/business-details-page/customization-business-details-page-start-request.png b/Documentation/portal-guide/source/portal-developer-guide/customization/images/business-details-page/customization-business-details-page-start-request.png index 9198e5c90b7..4c41dbdeb89 100644 Binary files a/Documentation/portal-guide/source/portal-developer-guide/customization/images/business-details-page/customization-business-details-page-start-request.png and b/Documentation/portal-guide/source/portal-developer-guide/customization/images/business-details-page/customization-business-details-page-start-request.png differ diff --git a/Documentation/portal-guide/source/portal-developer-guide/customization/images/business-details-page/customize-business-details-with-public-api.png b/Documentation/portal-guide/source/portal-developer-guide/customization/images/business-details-page/customize-business-details-with-public-api.png index 26b8e13865b..95f37707717 100644 Binary files a/Documentation/portal-guide/source/portal-developer-guide/customization/images/business-details-page/customize-business-details-with-public-api.png and b/Documentation/portal-guide/source/portal-developer-guide/customization/images/business-details-page/customize-business-details-with-public-api.png differ diff --git a/Documentation/portal-guide/source/portal-developer-guide/customization/images/business-details-page/set-business-details-page-callable-process.png b/Documentation/portal-guide/source/portal-developer-guide/customization/images/business-details-page/set-business-details-page-callable-process.png index 0ea7f9145fd..1a45a709327 100644 Binary files a/Documentation/portal-guide/source/portal-developer-guide/customization/images/business-details-page/set-business-details-page-callable-process.png and b/Documentation/portal-guide/source/portal-developer-guide/customization/images/business-details-page/set-business-details-page-callable-process.png differ diff --git a/Documentation/portal-guide/source/portal-developer-guide/customization/images/business-details-page/start-business-details-page-iframe.png b/Documentation/portal-guide/source/portal-developer-guide/customization/images/business-details-page/start-business-details-page-iframe.png index 96195996880..bcad0842312 100644 Binary files a/Documentation/portal-guide/source/portal-developer-guide/customization/images/business-details-page/start-business-details-page-iframe.png and b/Documentation/portal-guide/source/portal-developer-guide/customization/images/business-details-page/start-business-details-page-iframe.png differ diff --git a/Documentation/portal-guide/source/portal-developer-guide/customization/images/case-details/Mapping-ReviewRequest-Start.png b/Documentation/portal-guide/source/portal-developer-guide/customization/images/case-details/Mapping-ReviewRequest-Start.png index a6e82447c53..8761a30c446 100644 Binary files a/Documentation/portal-guide/source/portal-developer-guide/customization/images/case-details/Mapping-ReviewRequest-Start.png and b/Documentation/portal-guide/source/portal-developer-guide/customization/images/case-details/Mapping-ReviewRequest-Start.png differ diff --git a/Documentation/portal-guide/source/portal-developer-guide/customization/images/case-details/Review-Request-Start.png b/Documentation/portal-guide/source/portal-developer-guide/customization/images/case-details/Review-Request-Start.png index 8e93d9352f5..b4e6813b9c1 100644 Binary files a/Documentation/portal-guide/source/portal-developer-guide/customization/images/case-details/Review-Request-Start.png and b/Documentation/portal-guide/source/portal-developer-guide/customization/images/case-details/Review-Request-Start.png differ diff --git a/Documentation/portal-guide/source/portal-developer-guide/customization/images/customization/edit-variable-portal-case-details.png b/Documentation/portal-guide/source/portal-developer-guide/customization/images/customization/edit-variable-portal-case-details.png index 2a06e85cc67..57cca97dfe6 100644 Binary files a/Documentation/portal-guide/source/portal-developer-guide/customization/images/customization/edit-variable-portal-case-details.png and b/Documentation/portal-guide/source/portal-developer-guide/customization/images/customization/edit-variable-portal-case-details.png differ diff --git a/Documentation/portal-guide/source/portal-developer-guide/customization/images/customization/edit-variable-portal-task-details.png b/Documentation/portal-guide/source/portal-developer-guide/customization/images/customization/edit-variable-portal-task-details.png index f6aa71d6d43..2e807d9e991 100644 Binary files a/Documentation/portal-guide/source/portal-developer-guide/customization/images/customization/edit-variable-portal-task-details.png and b/Documentation/portal-guide/source/portal-developer-guide/customization/images/customization/edit-variable-portal-task-details.png differ diff --git a/Documentation/portal-guide/source/portal-developer-guide/customization/images/customization/hide-technical-case.png b/Documentation/portal-guide/source/portal-developer-guide/customization/images/customization/hide-technical-case.png index d2e427d4b41..9d579f47f0e 100644 Binary files a/Documentation/portal-guide/source/portal-developer-guide/customization/images/customization/hide-technical-case.png and b/Documentation/portal-guide/source/portal-developer-guide/customization/images/customization/hide-technical-case.png differ diff --git a/Documentation/portal-guide/source/portal-developer-guide/customization/images/customization/hide-technical-task.png b/Documentation/portal-guide/source/portal-developer-guide/customization/images/customization/hide-technical-task.png index d9730fd7823..86b84eea6e8 100644 Binary files a/Documentation/portal-guide/source/portal-developer-guide/customization/images/customization/hide-technical-task.png and b/Documentation/portal-guide/source/portal-developer-guide/customization/images/customization/hide-technical-task.png differ diff --git a/Documentation/portal-guide/source/portal-developer-guide/customization/images/customization/task-customized-iframe-process-custom-field.png b/Documentation/portal-guide/source/portal-developer-guide/customization/images/customization/task-customized-iframe-process-custom-field.png index 4cffff72a80..fcc3b555bfc 100644 Binary files a/Documentation/portal-guide/source/portal-developer-guide/customization/images/customization/task-customized-iframe-process-custom-field.png and b/Documentation/portal-guide/source/portal-developer-guide/customization/images/customization/task-customized-iframe-process-custom-field.png differ diff --git a/Documentation/portal-guide/source/portal-developer-guide/customization/images/customization/task-customized-iframe-process-input-mapping.png b/Documentation/portal-guide/source/portal-developer-guide/customization/images/customization/task-customized-iframe-process-input-mapping.png index 1a121e40aea..79e4501677a 100644 Binary files a/Documentation/portal-guide/source/portal-developer-guide/customization/images/customization/task-customized-iframe-process-input-mapping.png and b/Documentation/portal-guide/source/portal-developer-guide/customization/images/customization/task-customized-iframe-process-input-mapping.png differ diff --git a/Documentation/portal-guide/source/portal-developer-guide/customization/images/process-image/define-process-image.png b/Documentation/portal-guide/source/portal-developer-guide/customization/images/process-image/define-process-image.png index 8b4251ee935..f9f24bbed03 100644 Binary files a/Documentation/portal-guide/source/portal-developer-guide/customization/images/process-image/define-process-image.png and b/Documentation/portal-guide/source/portal-developer-guide/customization/images/process-image/define-process-image.png differ diff --git a/Documentation/portal-guide/source/portal-developer-guide/customization/images/task-delegation/calculate-task-delegate.png b/Documentation/portal-guide/source/portal-developer-guide/customization/images/task-delegation/calculate-task-delegate.png index f5f7e04ab4d..8da87526206 100644 Binary files a/Documentation/portal-guide/source/portal-developer-guide/customization/images/task-delegation/calculate-task-delegate.png and b/Documentation/portal-guide/source/portal-developer-guide/customization/images/task-delegation/calculate-task-delegate.png differ diff --git a/Documentation/portal-guide/source/portal-developer-guide/dashboard/images/new-dashboard-case-widget/custom-action-button-custom-field.png b/Documentation/portal-guide/source/portal-developer-guide/dashboard/images/new-dashboard-case-widget/custom-action-button-custom-field.png index dd5d72adb91..cc96a4cb8f2 100644 Binary files a/Documentation/portal-guide/source/portal-developer-guide/dashboard/images/new-dashboard-case-widget/custom-action-button-custom-field.png and b/Documentation/portal-guide/source/portal-developer-guide/dashboard/images/new-dashboard-case-widget/custom-action-button-custom-field.png differ diff --git a/Documentation/portal-guide/source/portal-developer-guide/dashboard/images/new-dashboard-case-widget/custom-action-button-process-demo.png b/Documentation/portal-guide/source/portal-developer-guide/dashboard/images/new-dashboard-case-widget/custom-action-button-process-demo.png index 7a5d7eeacbf..9026d782fdd 100644 Binary files a/Documentation/portal-guide/source/portal-developer-guide/dashboard/images/new-dashboard-case-widget/custom-action-button-process-demo.png and b/Documentation/portal-guide/source/portal-developer-guide/dashboard/images/new-dashboard-case-widget/custom-action-button-process-demo.png differ diff --git a/Documentation/portal-guide/source/portal-developer-guide/dashboard/images/new-dashboard-custom-widget/process-custom-field.png b/Documentation/portal-guide/source/portal-developer-guide/dashboard/images/new-dashboard-custom-widget/process-custom-field.png index 3b8308f0024..1b574551f92 100644 Binary files a/Documentation/portal-guide/source/portal-developer-guide/dashboard/images/new-dashboard-custom-widget/process-custom-field.png and b/Documentation/portal-guide/source/portal-developer-guide/dashboard/images/new-dashboard-custom-widget/process-custom-field.png differ diff --git a/Documentation/portal-guide/source/portal-developer-guide/dashboard/images/new-dashboard-custom-widget/process-custom-params.png b/Documentation/portal-guide/source/portal-developer-guide/dashboard/images/new-dashboard-custom-widget/process-custom-params.png index 5b498dd61d0..56df31f45a3 100644 Binary files a/Documentation/portal-guide/source/portal-developer-guide/dashboard/images/new-dashboard-custom-widget/process-custom-params.png and b/Documentation/portal-guide/source/portal-developer-guide/dashboard/images/new-dashboard-custom-widget/process-custom-params.png differ diff --git a/Documentation/portal-guide/source/portal-developer-guide/dashboard/images/new-dashboard-process-widget/process-sort-index.png b/Documentation/portal-guide/source/portal-developer-guide/dashboard/images/new-dashboard-process-widget/process-sort-index.png index 6b1fc94245e..d7265ad7ab2 100644 Binary files a/Documentation/portal-guide/source/portal-developer-guide/dashboard/images/new-dashboard-process-widget/process-sort-index.png and b/Documentation/portal-guide/source/portal-developer-guide/dashboard/images/new-dashboard-process-widget/process-sort-index.png differ diff --git a/Documentation/portal-guide/source/portal-developer-guide/dashboard/new-dashboard-case-widget.rst b/Documentation/portal-guide/source/portal-developer-guide/dashboard/new-dashboard-case-widget.rst index 891a533d323..22ca725eada 100644 --- a/Documentation/portal-guide/source/portal-developer-guide/dashboard/new-dashboard-case-widget.rst +++ b/Documentation/portal-guide/source/portal-developer-guide/dashboard/new-dashboard-case-widget.rst @@ -135,7 +135,7 @@ The basic JSON structure of the case widget - ``endTimestamp``: end date and time of the case - - ``owner``: case owner + - ``owner``: list of case owners - ``actions``: for further actions like ``access case details``, ``case business details``, ``destroy case`` diff --git a/Documentation/portal-guide/source/portal-developer-guide/iframe/images/case-embedInFrame.png b/Documentation/portal-guide/source/portal-developer-guide/iframe/images/case-embedInFrame.png index 3807ff77112..e7e4d983cc9 100644 Binary files a/Documentation/portal-guide/source/portal-developer-guide/iframe/images/case-embedInFrame.png and b/Documentation/portal-guide/source/portal-developer-guide/iframe/images/case-embedInFrame.png differ diff --git a/Documentation/portal-guide/source/portal-developer-guide/iframe/images/task-embedInFrame.png b/Documentation/portal-guide/source/portal-developer-guide/iframe/images/task-embedInFrame.png index 5d7d00cddee..b43640ae750 100644 Binary files a/Documentation/portal-guide/source/portal-developer-guide/iframe/images/task-embedInFrame.png and b/Documentation/portal-guide/source/portal-developer-guide/iframe/images/task-embedInFrame.png differ diff --git a/Documentation/portal-guide/source/portal-developer-guide/installation/index.rst b/Documentation/portal-guide/source/portal-developer-guide/installation/index.rst index d6f80ba39a3..458e958ff15 100644 --- a/Documentation/portal-guide/source/portal-developer-guide/installation/index.rst +++ b/Documentation/portal-guide/source/portal-developer-guide/installation/index.rst @@ -144,10 +144,15 @@ In Engine Migrate 11.3.2 To 12.0.0 ------------------------ -Custom field values for business details pages are migrated silently from the process link relative path +1. Custom field values for business details pages are migrated silently from the process link relative path to its :dev-url:`IWebStartable ID </doc/|version|/public-api/ch/ivyteam/ivy/workflow/start/IWebStartable.html#getId()>`. You don't need to do anything, this is just for your information. +2. We implemented a new feature to adjusting column widths in the Task and Case widgets. +This change may slightly impact the column widths of Task and Case widgets from previous versions. +To manually adjust column widths, please refer to the :ref:`Task widget configuraiton <new-dashboard-task-list-widget>`, +and :ref:`Case widget configuraiton <new-dashboard-case-list-widget>` guides. + Migrate 11.1.0 To 11.2.0 ------------------------ @@ -484,6 +489,7 @@ Changes in 12.0.0 - Introduce the component IFrameTaskConfig to configure IFrame tasks. Refer to :ref:`iframe-configure-template` for more information. - The :ref:`full task list page <full-task-list>` and :ref:`full case list page <full-case-list>` have been redesigned to align with the concept of a dashboard widget. It now functions as a dashboard with a single, full-width widget. To configure it, you can adjust it like any other widgets. +- Support multiple case owners. The single case owner sort feature is removed. Changes in 11.2.0 ----------------- diff --git a/Documentation/portal-guide/source/portal-user-guide/accessibility/index.rst b/Documentation/portal-guide/source/portal-user-guide/accessibility/index.rst index bc86b94e76e..21d281e0a58 100644 --- a/Documentation/portal-guide/source/portal-user-guide/accessibility/index.rst +++ b/Documentation/portal-guide/source/portal-user-guide/accessibility/index.rst @@ -144,10 +144,10 @@ In the case list, additional information is also integrated into the highlighted - **State**: The current state of the case (e.g., Open, Done, Deleted). - **Created On**: The creation date of the case. - **Finished On**: The completion date of the case. -- **Owner**: The current owner of the case. +- **Owners**: The current owners of the case. When a user jumps to the first case element using a shortcut, the screen reader reads the information in the following format: -"Case Name: `<case name>` - State: `<state>` - Created On: `<creation date>` - Finished On: `<finish date>` - Owner: `<owner name>`." +"Case Name: `<case name>` - State: `<state>` - Created On: `<creation date>` - Finished On: `<finish date>` - Owners: `<first owner name>`." If the selected task or case is not in the "Completed" state, all relevant details are read aloud to inform the user of the current status. Language Support for Screen Readers diff --git a/Documentation/portal-guide/source/portal-user-guide/admin-settings/documents/available_settings.csv b/Documentation/portal-guide/source/portal-user-guide/admin-settings/documents/available_settings.csv index 0a645737c67..94765715425 100644 --- a/Documentation/portal-guide/source/portal-user-guide/admin-settings/documents/available_settings.csv +++ b/Documentation/portal-guide/source/portal-user-guide/admin-settings/documents/available_settings.csv @@ -3,21 +3,16 @@ Portal.ApplicationName,"Axon Ivy",The default application name that will be disp Portal.CaseDetails.HideDocument,FALSE,"Set to true, the document section in case detail page will be hidden, otherwise it will be shown." Portal.CaseDetails.HideUploadDocumentForDoneCase,FALSE,Set to true to deny upload (also delete) document after a case is done. Portal.CaseDetails.ShowDurationTime,TRUE,For switch on/off the display of the duration time in case details page. -Portal.Cases.DisableCount,FALSE,Set to true to disable counting case in case list. Portal.Cases.EnableOwner,FALSE,"| Set to true to enable filtering case owner when cases are queried. This setting affects all case -| queries e.g. for case list, global search." -Portal.Cases.SortDirection,Sort descending,Default sort direction of case list. -Portal.Cases.SortField,Case Id,Default sort field of the case list. +| queries e.g. for case widget, global search." +Portal.Cases.HideCaseCreator,FALSE,"Set to true to hide case creator in case widget, case widget and case details. This setting affects all case queries, e.g. for case widget, global search." Portal.Chat.EnableGroup,FALSE,Set this property to true to enable group chat function. Portal.Chat.EnablePrivate,FALSE,Set this property to true to enable private chat function. Portal.Chat.MaxConnection,3,"| The set number controls the amount of tabs allowed with active chat. If more tabs are opened, | the chat will be disabled in inactive tabs. Allowed values are 1 to 5." Portal.Chat.ResponseTimeout,0,"| Chat response timeout in seconds, default value is 0 and means no timeout. If chat messages go through | the reverse proxy Nginx, chat response timeout must be less than the Nginx timeout, e.g. less than 60 seconds." -Portal.ClientSideTimeout,0,"| Client side timeout in minutes. Has to be more than 0 and less than the server side timeout (e.g. 25 minutes). -| Default value is 0, which means that the default client side timeout is applied. -| Default client side timeout is server side timeout minus 3 minutes." -Portal.DateTimeFormat.DateFilterWithTime,FALSE,"Set to true to enable date filtering with time. This setting affects task list and case list." +Portal.DateTimeFormat.DateFilterWithTime,FALSE,"Set to true to enable date filtering with time. This setting affects task widget and case widget." Portal.DateTimeFormat.HideTime,FALSE,Set to true to hide hours and minutes next to date. Portal.DateTimeFormat.HideYear,FALSE,"Set to true, year will be hidden, otherwise it will be shown." Portal.DisplayMessageAfterFinishTask,TRUE,A feedback message will be displayed after user finishes or leaves a task. @@ -45,12 +40,8 @@ Portal.ShowButtonIcon,TRUE,"If true, show icons in buttons." Portal.ShowGlobalSearch,TRUE,"If true, display the global search box." Portal.TaskDetails.HideDocument,FALSE,"If true, the document section in task detail page will be hidden, otherwise it will be shown." Portal.TaskDetails.ShowDurationTime,TRUE,For switch on/off the display of the duration time in task details page. -Portal.Tasks.DisableCount,FALSE,Set to true to disable counting task in task list. -Portal.Tasks.RefreshInterval,10000,Task list refresh interval in seconds. -Portal.Tasks.SortDirection,Sort descending,Default sort direction of task list. -Portal.Tasks.SortField,Task Id,Default sort field of task list. -Portal.Tasks.BehaviorWhenClickingOnLineInTaskList,Run the task,"| Default behaviors (run the task or access task details) when clicking. -| on a line in the task list, task widget of the dashboard or on related tasks in the case details page." +Portal.Tasks.BehaviourWhenClickingOnLineInTaskList,Run the task,"| Default behaviors (run the task or access task details) when clicking. +| on a line in the task widget, task widget of the dashboard or on related tasks in the case details page." Portal.UserMenu.HideChangePasswordMenu,FALSE,"Set this variable to true to hide the ""Change Password"" option in the top menu and the ""Forgotten Password"" option on the login page. If set to false, these options will be shown." Portal.UserMenu.HideLogoutMenu,FALSE,"If true, the logout button on top menu will be hidden, otherwise it will be shown." Portal.ProcessViewer,TRUE,"Set this property to true to display process viewer option in Task/Case actions. If a process is designed to not allow users to view it, the option in related Task/Case actions will be hidden." @@ -74,5 +65,4 @@ Portal.UserMenu.ShowQRCode,FALSE,For switch on/off the display of the QR code. Portal.UserMenu.BaseQRCodeUrl,"",Set Base URL for QR code to display. Portal.UserMenu.AppleStoreURL,"",Set URL to download Axon Ivy mobile app on Apple Store. Portal.UserMenu.GooglePlayURL,"",Set URL to download Axon Ivy mobile app on Google Play. -Portal.GlobalSearchScopeCategories,"PROCESSES,TASKS,CASES",Defining the types that the global search will search for. -Portal.Cases.HideCaseCreator,FALSE,"Set to true to hide case creator in case list, case widget and case details.This setting affects all case queries, e.g. for case list, global search." \ No newline at end of file +Portal.GlobalSearchScopeCategories,"PROCESSES,TASKS,CASES",Defining the types that the global search will search for. \ No newline at end of file diff --git a/Documentation/portal-guide/source/portal-user-guide/admin-settings/index.rst b/Documentation/portal-guide/source/portal-user-guide/admin-settings/index.rst index b460f7a1a0b..b89bb5b7599 100644 --- a/Documentation/portal-guide/source/portal-user-guide/admin-settings/index.rst +++ b/Documentation/portal-guide/source/portal-user-guide/admin-settings/index.rst @@ -13,7 +13,7 @@ Admin Settings .. hint:: Only users who have granted the role ``AXONIVY_PORTAL_ADMIN`` can see and access - the :guilabel:`Admin settings` user menu item. They can update Portal settings, + the :guilabel:`Admin settings` on the user menu. They can update Portal settings, as well as define, show and hide the announcement. Select the :guilabel:`Admin settings` user menu item. @@ -50,7 +50,7 @@ HowTo: Update Portal Settings |global-settings| -#. To update Portal settings, click on the |edit-icon| icon. +#. To update value of Portal settings variable, click on the |edit-icon| icon. |edit-global-settings| @@ -79,7 +79,7 @@ HowTo: Show/Hide the Announcement |announcement| -#. Input your announcement text. +#. Input your announcement text and click on :guilabel:`Save changes` #. To show the announcement, click on :guilabel:`Enable`. @@ -133,11 +133,20 @@ Portal provides the :guilabel:`Password Validation` section in the :guilabel:`Ad .. include:: ../includes/_common-icon.rst .. |applications| image:: ../../screenshots/settings/applications.png + :alt: Admin setting: applications .. |add-application| image:: ../../screenshots/settings/add-application.png + :alt: Admin setting: Add application dialog .. |announcement| image:: ../../screenshots/settings/announcement.png + :alt: Admin setting: Announcement .. |select-admin-settings| image:: ../../screenshots/settings/select-admin-settings.png + :alt: Admin setting menu .. |global-settings| image:: ../../screenshots/settings/global-settings.png + :alt: Admin setting: Global settings .. |edit-global-settings| image:: ../../screenshots/settings/edit-global-settings.png + :alt: Admin setting: Edit global setting dialog .. |role-assignment-tab| image:: ../../screenshots/settings/role-assignment-tab.png + :alt: Admin setting: Role management .. |role-assignment-creation-dialog| image:: ../../screenshots/settings/role-assignment-creation-dialog.png -.. |password-validation-tab| image:: ../../screenshots/settings/password-validation-tab.png \ No newline at end of file + :alt: Admin setting: role creation dialog +.. |password-validation-tab| image:: ../../screenshots/settings/password-validation-tab.png + :alt: Admin setting: Password Validation \ No newline at end of file diff --git a/Documentation/portal-guide/source/portal-user-guide/ai-assistant/ai-assistant-menu-item.png b/Documentation/portal-guide/source/portal-user-guide/ai-assistant/ai-assistant-menu-item.png index a8087189bf2..b5a55ffa5d9 100644 Binary files a/Documentation/portal-guide/source/portal-user-guide/ai-assistant/ai-assistant-menu-item.png and b/Documentation/portal-guide/source/portal-user-guide/ai-assistant/ai-assistant-menu-item.png differ diff --git a/Documentation/portal-guide/source/portal-user-guide/axon-ivy-portal/index.rst b/Documentation/portal-guide/source/portal-user-guide/axon-ivy-portal/index.rst index 8b274f0a259..8cda99f9719 100644 --- a/Documentation/portal-guide/source/portal-user-guide/axon-ivy-portal/index.rst +++ b/Documentation/portal-guide/source/portal-user-guide/axon-ivy-portal/index.rst @@ -71,6 +71,10 @@ point. The Portal Homepage has the following elements: .. |login-screen| image:: ../../screenshots/login/login-form.png + :alt: Portal Login screen .. |axon-ivy-portal-header| image:: ../../screenshots/dashboard/portal-header.png + :alt: Portal header .. |axon-ivy-portal-menu| image:: ../../screenshots/dashboard/expanded-left-menu.png + :alt: Portal expanded Left menu .. |axon-ivy-portal| image:: ../../screenshots/dashboard/dashboard.png + :alt: Portal dashboard screen diff --git a/Documentation/portal-guide/source/portal-user-guide/complex-filter/index.rst b/Documentation/portal-guide/source/portal-user-guide/complex-filter/index.rst index 5c1933b6c66..855d52196f0 100644 --- a/Documentation/portal-guide/source/portal-user-guide/complex-filter/index.rst +++ b/Documentation/portal-guide/source/portal-user-guide/complex-filter/index.rst @@ -19,7 +19,7 @@ This feature is available for the Case Widget and the Task Widget in Dashboard. How to use ---------- -- The Filters dialog can be accessed by clicking on the 'Available Filters' button within the Task/Case Widget on the Dashboard, or by clicking on the 'Filter' button within the Edit Widget on the Edit Dashboard. +- The Filters dialog can be accessed by clicking on the :guilabel:`Filters` button within the Task/Case Widget on the Dashboard, or by clicking on the :guilabel:`Filter` button within the Edit Widget Configuration panel on the Edit Dashboard. Please refer to :ref:`new-dashboard` for more details. - To add a filter, select ``Add filter``, then select the column and operator, and input value if needed. @@ -38,7 +38,7 @@ How to use |complex-filter-example| - This filter configuration finds all cases in state OPEN, with their name containing 'Mike', created today. + This filter configuration finds all cases in state OPEN, with case name containing 'Mike', created today. If the task/case widget has been pre-configured with filters in the dashboard configuration, these filters will be displayed as read-only filters. @@ -64,11 +64,11 @@ Filter Set Management You can manage your saved filter set in the Widget Filter Management dialog. -- In the ``Available Filters`` dialog, select ``Manage filters`` link. +- In the ``Available Filters`` dialog, select ``Manage filters``. - To search for a filter set, type the search value into the input field at the top of every column. -- To delete filters, select the checkbox next to the filter set and then click the ``Remove`` button +- To delete filters, select the checkbox next to the filter set and then click :guilabel:`Remove selection` button |widget-filter-management| @@ -196,7 +196,12 @@ Filter Operators .. include:: ../includes/_common-icon.rst .. |case-task-widget-filter-combine| image:: ../../screenshots/new-dashboard/case-task-widget-filter-combine.png + :alt: Complex filters combination .. |filter-operator-dropdown| image:: ../../screenshots/new-dashboard/filter-operator-dropdown.png + :alt: Complex filters's operator selection .. |widget-filter-management| image:: ../../screenshots/new-dashboard/widget-filter-management.png + :alt: Widget filter management dialog .. |widget-save-filter| image:: ../../screenshots/new-dashboard/widget-save-filter.png + :alt: Save widget's complex filters .. |complex-filter-example| image:: ../../screenshots/new-dashboard/complex-filter-example.png + :alt: Complex filter example \ No newline at end of file diff --git a/Documentation/portal-guide/source/portal-user-guide/dashboard-configuration/index.rst b/Documentation/portal-guide/source/portal-user-guide/dashboard-configuration/index.rst index dab2eae210d..70bcbcdd8ff 100644 --- a/Documentation/portal-guide/source/portal-user-guide/dashboard-configuration/index.rst +++ b/Documentation/portal-guide/source/portal-user-guide/dashboard-configuration/index.rst @@ -29,9 +29,9 @@ add or edit your private dashboards, and reorder all dashboards visible to you. How to: add private dashboard ============================= -#. Select |add-icon| New Dashboard. +#. Select :guilabel:`Add New Dashboard` button -#. Select one of the available templates to add (see Available dashboard templates). +#. Select one of the available templates to add (see :ref:`Available dashboard templates <private-available-dashboard-template>`). #. The :guilabel:`Create new private dashboard` dialog is opened. @@ -47,7 +47,12 @@ How to: add private dashboard To set multi languages for the dashboard title, see at :ref:`portal-multi-language`: -Available dashboard templates: +.. _private-available-dashboard-template: + +Available dashboard templates +============================= + +:guilabel:`Default Template`, :guilabel:`Two Task list dashboard` template and :guilabel:`Accessiblity dashboard` template. Please see the image below for more details. |dashboard-templates| @@ -57,17 +62,17 @@ Available dashboard templates: How to: import private dashboards ================================= -#. Select |add-icon| New Dashboard. +#. Select :guilabel:`Add new Dashboard` button. #. Select |import-icon| Import. #. The :guilabel:`Import Private Dashboard` dialog is opened. -#. Press the Select button and choose the JSON file that contains the dashboard you want to import. +#. Drag and drop, or click on the :guilabel:`Upload one here` link to select the JSON file containing the dashboard you want to import. #. Edit the mandatory title and the optional description for the private dashboard. -#. Import the dashboard by selecting the Create Dashboard button. +#. Import the dashboard by selecting :guilabel:`Create Dashboard` button. #. Configuration your private dashboard (see: :ref:`Dashboard <new-dashboard>`). @@ -82,19 +87,17 @@ How to: import private dashboards How to: edit private dashboards =============================== - -You can edit your private dashboards by selecting |edit-icon| Edit. The :guilabel:`Edit private dashboard` section shows -your private dashboards. - +The :guilabel:`Edit private dashboard` section shows your private dashboards. A table of private dashboards is shown with the following information: #. Dashboard title #. Dashboard description -#. :guilabel:`Actions` for further actions: |move-expand-vertical| reorder, |edit-icon| edit (name, description), |settings-icon| configure - (see: :ref:`Dashboards <new-dashboard>` ), |download-icon| export dashboard, - and |trash-icon| delete a private dashboard. +#. Actions: click on |actions-menu-icon| to get :guilabel:`Actions` menu for further actions: |edit-icon| Edit (name, description), |settings-icon| Configuration + (see: :ref:`Dashboards <new-dashboard>` ), |download-icon| Export dashboard, |trash-icon| Delete a private dashboard. + +You can edit your private dashboards by selecting |edit-icon| Edit. .. note:: @@ -107,17 +110,7 @@ A table of private dashboards is shown with the following information: How to: reorder private dashboards ================================== -You re-arrange dashboards by drag and drop using |move-expand-vertical| Reorder. - -A table of private dashboards is shown with the following information: - -#. Dashboard title - -#. Dashboard description - -#. :guilabel:`Actions` for further actions: |move-expand-vertical| reorder, |edit-icon| edit (name, description), |settings-icon| configure - (see: :ref:`Dashboards <new-dashboard>` ), |download-icon| export dashboard, - and |trash-icon| delete a private dashboard. +You can rearrange dashboards by dragging and dropping |reorder-dashboard-icon| icon. |reorder-your-dashboards| @@ -141,13 +134,15 @@ add, edit, and reorder public dashboards. How to: add public dashboard ============================ -#. Select |add-icon| New Dashboard. +#. Select :guilabel:`Add New Dashboard` button. -#. Select one of the available templates to add (see Available dashboard templates). +#. Select one of the available templates to add (see :ref:`Available dashboard templates <public-available-dashboard-template>`). #. The :guilabel:`Create new public dashboard` dialog is opened. #. Enter the mandatory title, permissions to see the public dashboard and the optional description for the public dashboard. + If the `Top Menu Item` checkbox is checked, the dashboard appears as a top-level item in the navigation bar. + If unchecked, it appears as a sub-item under `Dashboard` menu item. #. Create the public dashboard by selecting |add-icon| Create dashboard. @@ -159,7 +154,12 @@ How to: add public dashboard To set multi languages for the dashboard title, see at :ref:`portal-multi-language`: -Available dashboard templates: +.. _public-available-dashboard-template: + +Available dashboard templates +============================= + +:guilabel:`Default Template`, :guilabel:`Two Task list dashboard` template and :guilabel:`Accessiblity dashboard` template. |dashboard-templates| @@ -171,17 +171,19 @@ Available dashboard templates: How to: import public dashboard =============================== -#. Select |add-icon| New Dashboard. +#. Select :guilabel:`Add New Dashboard` button. #. Select |import-icon| Import. #. The :guilabel:`Import Public Dashboard` dialog is opened. -#. Press the Select button and choose the JSON file that contains the dashboard you want to import. +#. Drag and drop, or click on the :guilabel:`Upload one here` link to select the JSON file containing the dashboard you want to import. #. Edit the mandatory title, permissions to see the public dashboard and the optional description for the public dashboard. + If the `Top Menu Item` checkbox is checked, the dashboard appears as a top-level item in the navigation bar. + If unchecked, it appears as a sub-item under `Dashboard` menu item. -#. Import the dashboard by selecting the Create Dashboard button. +#. Import the dashboard by selecting :guilabel:`Create Dashboard` button. #. Configuration public dashboard (see: :ref:`Dashboard <new-dashboard>`). @@ -195,10 +197,7 @@ How to: import public dashboard How to: edit public dashboards ============================== - -You can edit public dashboards by selecting |edit-icon| Edit. The :guilabel:`Edit public dashboards` section shows -you the public dashboards. - +The :guilabel:`Edit public dashboards` section shows you the public dashboards. A table of public dashboards is shown with the following information: #. Dashboard title @@ -207,9 +206,13 @@ A table of public dashboards is shown with the following information: #. Dashboard description -#. :guilabel:`Actions` for further actions: |move-expand-vertical| reorder, |edit-icon| edit (name, description), |settings-icon| configure - (see: :ref:`Dashboards <new-dashboard>` ), |download-icon| export dashboard, |share-icon| share, - and |trash-icon| delete a public dashboard. +#. Display as top menu or not + +#. Actions: click on |actions-menu-icon| to get :guilabel:`Actions` menu for further actions: |edit-icon| Edit (name, description), |settings-icon| Configuration + (see: :ref:`Dashboards <new-dashboard>` ), |download-icon| Export dashboard, |share-icon| Share, + and |trash-icon| Delete a public dashboard. + +You can edit public dashboards by selecting |edit-icon| Edit. .. note:: @@ -221,7 +224,7 @@ A table of public dashboards is shown with the following information: How to: share public dashboards =============================== -To generate a public dashboard link, simply click on the |share-icon| Share in the :guilabel:`Edit public dashboards` section. +To generate a public dashboard link, simply click on the |share-icon| Share in the :guilabel:`Actions` menu of the dashboard. |share-public-dashboards| @@ -232,38 +235,37 @@ To generate a public dashboard link, simply click on the |share-icon| Share in t How to: reorder public dashboards ================================= -You can re-arrange them by drag and drop using |move-expand-vertical| Reorder. - -A table of public dashboards is shown with the following information: - -#. Dashboard title - -#. Dashboard permissions - -#. Dashboard description - -#. :guilabel:`Actions` for further actions: |move-expand-vertical| reorder, |edit-icon| edit (name, description), |settings-icon| configure - (see: :ref:`Dashboards <new-dashboard>` ), |download-icon| export dashboard, |share-icon| share - and |trash-icon| delete a public dashboard. +You can rearrange dashboards by dragging and dropping |reorder-dashboard-icon| icon. |reorder-public-dashboards| -.. hint:: - - Note that this ordering does not apply to all users who ordered their dashboards. It is overridden by the personal ordering. - .. include:: ../includes/_common-icon.rst .. |dashboard-configuration| image:: ../../screenshots/settings/dashboard-configuration.png + :alt: Dashboard configuration menu .. |dashboard-configuration-page| image:: ../../screenshots/dashboard-configuration/dashboard-configuration-page.png + :alt: Dashboard configuration screen .. |private-dashboard-configuration| image:: ../../screenshots/dashboard-configuration/private-dashboard-configuration.png + :alt: Private dashboard configuration .. |create-private-dashboard-dialog| image:: ../../screenshots/dashboard-configuration/create-private-dashboard-dialog.png + :alt: Create private dashboard dialog .. |edit-private-dashboards| image:: ../../screenshots/dashboard-configuration/edit-private-dashboards.png + :alt: Edit private dashboard dialog .. |reorder-your-dashboards| image:: ../../screenshots/dashboard-configuration/reorder-your-dashboards.png + :alt: Reorder private dashboards .. |public-dashboard-configuration| image:: ../../screenshots/dashboard-configuration/public-dashboard-configuration.png + :alt: Public dashboard configuration .. |create-public-dashboard-dialog| image:: ../../screenshots/dashboard-configuration/create-public-dashboard-dialog.png + :alt: Create public dashboard dialog .. |edit-public-dashboards| image:: ../../screenshots/dashboard-configuration/edit-public-dashboards.png + :alt: Edit public dashboard dialog .. |reorder-public-dashboards| image:: ../../screenshots/dashboard-configuration/reorder-public-dashboards.png + :alt: Reorder public dashboards .. |dashboard-templates| image:: ../../screenshots/dashboard-configuration/dashboard-templates.png + :alt: Dashboard template selection dialog .. |import-public-dashboard-dialog| image:: ../../screenshots/dashboard-configuration/import-public-dashboard-dialog.png + :alt: Import public dashboard dialog .. |import-private-dashboard-dialog| image:: ../../screenshots/dashboard-configuration/import-private-dashboard-dialog.png + :alt: Import private dashboard dialog .. |share-public-dashboards| image:: ../../screenshots/dashboard-configuration/share-dashboard-dialog.png + :alt: Share dashboard dialog diff --git a/Documentation/portal-guide/source/portal-user-guide/demo-processes/index.rst b/Documentation/portal-guide/source/portal-user-guide/demo-processes/index.rst index 6b0da037ac8..23380e924b7 100644 --- a/Documentation/portal-guide/source/portal-user-guide/demo-processes/index.rst +++ b/Documentation/portal-guide/source/portal-user-guide/demo-processes/index.rst @@ -74,7 +74,7 @@ Lending (Case Map) |lending-casemap-external-solvency-service| -#. After finishing Internal Solvency, you will have 1 or 2 approval levels which +#. After finishing **Internal Solvency Check**, you will have 1 or 2 approval levels which depend on Amount and Salary fields. If Amount is greater than or equal to 20% of Salary, you will have 2 approval levels. @@ -86,9 +86,16 @@ Lending (Case Map) .. |example-overview-leave-request| image:: ../../screenshots/demo-processes/example-overview-leave-request.png + :alt: Portal examples: Leave request example .. |leave-request-creation| image:: ../../screenshots/demo-processes/leave-request-creation.png + :alt: Portal examples: Create leave request example .. |user-example-guide-link| image:: ../../screenshots/demo-processes/user-example-guide-link.png + :alt: Link to the user example guide .. |example-overview-lending-case| image:: ../../screenshots/demo-processes/example-overview-lending-case.png + :alt: Portal examples: Lending .. |lending-casemap-collect-personal-data| image:: ../../screenshots/demo-processes/lending-casemap-collect-personal-data.png + :alt: Portal examples: Lending case map - collect personal data .. |lending-casemap-external-solvency-service| image:: ../../screenshots/demo-processes/lending-casemap-external-solvency-service.png -.. |lending-casemap-approval-task| image:: ../../screenshots/demo-processes/lending-casemap-approval-task.png \ No newline at end of file + :alt: Portal examples: Lending case map - external solvency service +.. |lending-casemap-approval-task| image:: ../../screenshots/demo-processes/lending-casemap-approval-task.png + :alt: Portal examples: Lending casemap - approval task \ No newline at end of file diff --git a/Documentation/portal-guide/source/portal-user-guide/forgot-password/index.rst b/Documentation/portal-guide/source/portal-user-guide/forgot-password/index.rst index 8fd69509ffe..4875554845d 100644 --- a/Documentation/portal-guide/source/portal-user-guide/forgot-password/index.rst +++ b/Documentation/portal-guide/source/portal-user-guide/forgot-password/index.rst @@ -32,6 +32,10 @@ Click on :guilabel:`Back To Login Page` and log in again with your account and t .. include:: ../includes/_common-icon.rst .. |login-screen| image:: ../../screenshots/login/login-form.png + :alt: Portal login page .. |send-email-screen| image:: ../../screenshots/forgot-password/send-email-screen.png + :alt: "Send reset password email" page .. |reset-password-screen| image:: ../../screenshots/forgot-password/reset-password-screen.png -.. |reset-password-success-screen| image:: ../../screenshots/forgot-password/reset-password-success-screen.png \ No newline at end of file + :alt: New password page +.. |reset-password-success-screen| image:: ../../screenshots/forgot-password/reset-password-success-screen.png + :alt: Reset password successful page \ No newline at end of file diff --git a/Documentation/portal-guide/source/portal-user-guide/full-case-list/index.rst b/Documentation/portal-guide/source/portal-user-guide/full-case-list/index.rst index a62ca4411e1..18b5b534f99 100644 --- a/Documentation/portal-guide/source/portal-user-guide/full-case-list/index.rst +++ b/Documentation/portal-guide/source/portal-user-guide/full-case-list/index.rst @@ -3,10 +3,8 @@ Full Case List ************** -The **Full Case List** page shows you all cases you are involved in. -This page provides you with extended information on the cases as well -as advanced search and filter capabilities. You can reach the page by -selecting |case-icon| :guilabel:`Cases` in the |ivy| Portal menu. +The **Full Case List** page is a dashboard featuring a single, full-width task widget. +You can reach the page by using the |case-icon| :guilabel:`Cases` link in the |ivy| Portal menu. .. note:: @@ -14,41 +12,31 @@ selecting |case-icon| :guilabel:`Cases` in the |ivy| Portal menu. .. hint:: The set of cases you see in the Portal depends on the roles you hold - in both the application and the |ivy| Portal. Administrators - (having role AXONIVY_PORTAL_ADMIN) see all cases. + in in your applications. |navigate-to-full-cases-list-page| -On the top of the **Full Case List** page, next to the heading -:guilabel:`Cases`, you see the overall number of cases shown to you, in -brackets. Below, you find the filter feature. Their usage will be explained below in -the HowTo’s section. Finally, you see the list of cases. - For each case, the list shows the following key information: -#. Name and Description - #. Case ID +#. Name + +#. Description + #. Creator #. Creation Date #. Finished Date -#. Status +#. State #. Category -#. Application (This column is not displayed by default) - |case-key-information| -At the end of each row you find a set of key features to handle cases: - -#. Detail - -#. :guilabel:`Actions` for further actions +At the end of each row you find a set of key features to handle cases by clicking on :guilabel:`Actions`. To access the full set of case data, click on the case Name/Description. @@ -78,94 +66,6 @@ The case details are separated into four different sections: .. _howto-use-existing-filter-1: -HowTo: Use Existing Filter --------------------------- - -.. hint:: - If there are no public filters and you didn’t create any filters so far, - there might be no filters available. In this case, you have to create a filter - first. This is described in detail in :ref:`howto-create-new-filter-1`. - - -#. Click on the :guilabel:`Save Filter` dropdown menu. - -#. Select the filter you want to use. - -.. _howto-create-new-filter-1: - -HowTo: Create New Filter ------------------------- - -#. Click on :guilabel:`More` to select one of the available filters. - For a list of available filters, see Table 3: Case filter criteria. - -#. Click on the newly added filter and configure it. - -#. Add more filters by clicking on :guilabel:`More` again. - -#. Drop filters by clicking on |delete-circle-icon| next to the filter. - -#. When finished, click on :guilabel:`Save filter`. - -#. The dialog :guilabel:`Save filter` is opened. - -#. In :guilabel:`Filter name`, provide a descriptive name for the filter. - -#. In :guilabel:`Filter visibility`, define if the filter is only - visible to you or to all users. - -#. Save the filter by clicking :guilabel:`Ok`. - -|how-to-create-case-filter| - - -.. centered:: Case filter criteria - -+-----------------------+-----------------------------------+ -| Criteria | Description | -+=======================+===================================+ -| ID | Specify the ID of the case | -| | | -+-----------------------+-----------------------------------+ -| Name | Specify the case name | -| | | -+-----------------------+-----------------------------------+ -| Created (from / to) | Specify the period in which the | -| | case has been created. | -| | | -+-----------------------+-----------------------------------+ -| Creator | Specify the user who has created | -| | the case. | -+-----------------------+-----------------------------------+ -| Description | Search for keywords within the | -| | case description. | -| | | -+-----------------------+-----------------------------------+ -| Finished (from / to) | Specify the period in which the | -| | case has been finished. | -+-----------------------+-----------------------------------+ -| State | Specify the case state | -| | | -+-----------------------+-----------------------------------+ -| Application | This filter lets you select | -| | the application | -+-----------------------+-----------------------------------+ - -.. hint:: - #. You can create a new filter by selecting an existing filter, reconfiguring it, and saving it. - - #. Only users with the admin role ``AXONIVY_PORTAL_ADMIN`` can save the filter for all users. - -HowTo: Configure Displayed Cases in the Full Case List -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -#. To choose columns to display, click on :guilabel:`Manage columns`. Select - columns to display by checking the related checkboxes. - -#. To sort data, click on the column header. To change sort direction, click on - that column header one more time. Note that some columns do not support - sorting. - HowTo: Move and Resize Widgets in Case Details ---------------------------------------------- 1. Open the case details @@ -268,13 +168,6 @@ HowTo: Export a Case History |export-case-history| -HowTo: Export Case List ------------------------ - -To export the Case List, click on **Export to Excel**. - -|export-to-excel-button| - HowTo: Manipulate Related Tasks Inside Case Details --------------------------------------------------- @@ -312,6 +205,8 @@ following columns: - Expiry Date +- Finished date + - State At the end of each row, a side step menu is available. It offers the following @@ -327,7 +222,7 @@ actions: - Trigger Escalation Task -- Add Ad-hoc Task +- Workflow Events To access the full set of the task data, click on the row containing the task. @@ -409,21 +304,36 @@ HowTo: Share Case Details .. include:: ../includes/_common-icon.rst .. |navigate-to-full-cases-list-page| image:: ../../screenshots/case/navigate-to-full-cases-list-page.png + :alt: Menu to navigate to the Full case list page .. |case-key-information| image:: ../../screenshots/case/case-key-information.png + :alt: Full case list: key informations .. |case-details| image:: ../../screenshots/case-detail/case-details.png + :alt: The Case Details page .. |case-details-data-description| image:: ../../screenshots/case-detail/case-details-data-description.png + :alt: Case Details: General section .. |case-details-related-tasks-cases| image:: ../../screenshots/case-detail/case-details-related-tasks-cases.png + :alt: Case Details: Related Tasks of Case section .. |case-details-histories| image:: ../../screenshots/case-detail/case-details-histories.png + :alt: Case Details: Histories section .. |case-details-documents| image:: ../../screenshots/case-detail/case-details-documents.png -.. |how-to-create-case-filter| image:: ../../screenshots/case/how-to-create-case-filter.png + :alt: Case Details: Documents section .. |how-to-attach-document-to-case| image:: ../../screenshots/case-detail/how-to-attach-document-to-case.png + :alt: Case Details: Add document dialog .. |how-to-delete-an-attachment-from-case| image:: ../../screenshots/case-detail/how-to-delete-an-attachment-from-case.png + :alt: Case Details: Delete document confirm dialog .. |how-to-add-task-note| image:: ../../screenshots/case-detail/how-to-add-task-note.png + :alt: Case Details: Add note dialog .. |how-to-show-note-details| image:: ../../screenshots/case-detail/how-to-show-note-details.png + :alt: Case Details: Link to show more notes details .. |export-case-history| image:: ../../screenshots/case/export-case-history.png -.. |export-to-excel-button| image:: ../../screenshots/case/export-to-excel-button.png + :alt: Case Business Information page: Link to export case history .. |how-to-switch-to-view-mode| image:: ../../screenshots/case-detail/how-to-switch-to-view-mode.png + :alt: Case Details: save button .. |how-to-switch-to-edit-mode| image:: ../../screenshots/case-detail/how-to-switch-to-edit-mode.png + :alt: Case Details: button to switch to the edit mode .. |how-to-reset-to-default| image:: ../../screenshots/case-detail/how-to-reset-to-default.png + :alt: Case Details: button to reset to the default configurations .. |portal-process-viewer| image:: ../../screenshots/case/portal-process-viewer.png + :alt: Process Viewer page .. |how-to-share-case-details| image:: ../../screenshots/case-detail/share-page-button.png + :alt: Case Details: button to get the shareable link of the case details diff --git a/Documentation/portal-guide/source/portal-user-guide/full-process-list/index.rst b/Documentation/portal-guide/source/portal-user-guide/full-process-list/index.rst index 9d101bc333d..a6d45171e83 100644 --- a/Documentation/portal-guide/source/portal-user-guide/full-process-list/index.rst +++ b/Documentation/portal-guide/source/portal-user-guide/full-process-list/index.rst @@ -20,15 +20,15 @@ are sorted alphabetically and grouped by their initial character. |portal-full-process-list-page| #. Search for a process, input your keyword here - #. External link icon + #. Image process icon #. Change view mode + #. Process more menu item icon Process Display Mode -------------------- The **Full Process List** provides three modes to display the process list. By -default, **Image mode** is activated. To change the default process display mode -in :guilabel:`My Profile`. +default, **Image mode** is activated. To change the default process display mode, access :ref:`process-list-configuration` in ``My Profile``. Image Mode ^^^^^^^^^^ @@ -74,34 +74,30 @@ Values of Portal Setting **Portal.Processes.DefaultImage** |process-default-image-values| -HowTo: Edit process icon in Image mode --------------------------------------- -#. Click on more menu item in the process card item. -#. Click on |edit-icon| :guilabel:`Edit` menu item. -#. The dialog **Edit process information** is opened. -#. Click on the link ``Change`` besides the current icon. -#. The dialog :guilabel:`Selecting icon` is opened, and choose new icon. -#. Press on :guilabel:`Save` button, and process icon is changed - - |edit-process-menu-item| - |edit-process-icon-dialog| - HowTo: Add an external link --------------------------- -#. Click on :guilabel:`Add external link` which is in Process list header. +#. Click on :guilabel:`Add external link` at the top of the page next to the search text box. #. The dialog :guilabel:`Add external link` is opened. #. For the :guilabel:`Process name`, define the best name for it. -#. In :guilabel:`Process name`, click on the icon to the right (show icon graphic here) to define a name for the external link. You can define it in multiple languages by filling in the various language fields. If you don't fill in a language field, the default language name will be used. +#. At the end of the :guilabel:`Process name` input, you will see a translate + icon. Click the icon to open the ``Setting Multiple Languages`` dialog. You + can specify the name in multiple languages by filling in the various language + fields. If you don’t fill in a language field, the default language name will + be used. #. For the :guilabel:`Start link`, add the URL of your external link. #. For the :guilabel:`Description`, add the description of your external link. -#. In :guilabel:`Description`, click on the icon to the right (show icon graphic here) to define a description for the external link. You can define it in multiple languages by filling in the various language fields. If you don't fill in a language field, the default language description will be used. +#. At the end of :guilabel:`Description` input, you will see a translate icon. + Click the icon to open the ``Setting Multiple Languages`` dialog. You can + specify the description in multiple languages by filling in the various + language fields. If you don't fill in a language field, the default language + description will be used. #. Grant permission :bdg-ref-warning:`🔑CreatePublicExternalLink <CreatePublicExternalLink>` to allow a user to create public links to external sites. This user can set this link as a public link by selecting :guilabel:`All users` . @@ -109,7 +105,7 @@ HowTo: Add an external link #. For the :guilabel:`Icon`, change the best icon for it. -#. For the :guilabel:`Image`, upload a image for the process. +#. For the :guilabel:`Image`, drag and drop an image, or click on ``Upload one here`` to upload an image for the process. #. Confirm your configuration with the button :guilabel:`Add`. @@ -126,14 +122,82 @@ HowTo: Add an external link .. include:: ../includes/_common-icon.rst +HowTo: Edit process icon of External link in Image mode +------------------------------------------------------- +#. Click on ``More menu item`` icon in the process card item. +#. Click on |edit-icon| :guilabel:`Edit` menu item. +#. The dialog **Edit process information** is opened. +#. Click on the link ``Change`` besides the current icon. +#. The dialog :guilabel:`Selecting icon` is opened, and choose new icon. +#. Press on :guilabel:`Save` button, and process icon is changed + + |edit-process-menu-item| + |edit-process-icon-dialog| + +Process Information +------------------- + +The **Process Information** page shows you information about the selected process. +Besides basic information such as process name and description, you can see +advanced information like process steps and more. + +Process steps are a list of steps you will perform once you start the process. +These process steps are defined by the process developer. + +Basic information +^^^^^^^^^^^^^^^^^ + +The **Process Information** page not only shows you basic information of the +selected process such as process name and description, but also detailed +information in the form of process steps. + +To reach this page: + +- click on ``More action item`` icon of a process in image mode or grid mode, then choose ``More Information``. + +|more-information-link| + +- click on link ``Show process overview`` on the Case details page of a case + started by this process. + +|process-overview-link| + +Process steps +^^^^^^^^^^^^^ + +|process-information| + +At the top of the **Process Information** page, you see basic process +information like name and description. + +Depending on the process, you can see process steps that are defined by its +developers. These process steps give you a clear picture of the flow of the +process so you can work more efficiently with it. + .. |navigate-to-full-process-list| image:: ../../screenshots/process/navigate-to-full-process-list.png + :alt: Full process list menu .. |portal-full-process-list-page| image:: ../../screenshots/process/portal-full-process-list-page.png + :alt: Full process list page .. |how-to-add-a-new-external-link| image:: ../../screenshots/process/how-to-add-a-new-external-link.png + :alt: How to add new external link .. |add-external-link-dialog| image:: ../../screenshots/process/add-external-link-dialog.png + :alt: Add new external link dialog .. |portal-process-image-view-page| image:: ../../screenshots/process/portal-process-image-view-page.png + :alt: Full process list image mode .. |portal-process-grid-view-page| image:: ../../screenshots/process/portal-process-grid-view-page.png + :alt: Full process list grid mode .. |portal-process-list-view-page| image:: ../../screenshots/process/portal-process-list-view-page.png + :alt: Full process list compact mode .. |edit-process-menu-item| image:: ../../screenshots/process/edit-process-menu-item.png + :alt: Edit process menu item .. |edit-process-icon-dialog| image:: ../../screenshots/process/edit-process-dialog.png -.. |process-default-image-values| image:: images/process-default-image-values.png \ No newline at end of file + :alt: Edit process dialog +.. |process-default-image-values| image:: images/process-default-image-values.png + :alt: Photos of default process images +.. |more-information-link| image:: ../../screenshots/process/information/more-information-link.png + :alt: Process more information link +.. |process-overview-link| image:: ../../screenshots/process/information/process-overview-link.png + :alt: Process overview link +.. |process-information| image:: ../../screenshots/process/information/process-information.png + :alt: Process information page \ No newline at end of file diff --git a/Documentation/portal-guide/source/portal-user-guide/full-task-list/index.rst b/Documentation/portal-guide/source/portal-user-guide/full-task-list/index.rst index 904903174e2..d5e515e1212 100644 --- a/Documentation/portal-guide/source/portal-user-guide/full-task-list/index.rst +++ b/Documentation/portal-guide/source/portal-user-guide/full-task-list/index.rst @@ -3,9 +3,8 @@ Full Task List ************** -The **Full Task List** page shows you the tasks, as well as, advanced search and filter -capabilities. You can reach the page by using the |task-list-icon| :guilabel:`Tasks` -link in the |ivy| Portal menu. +The **Full Task List** page is a dashboard featuring a single, full-width task widget. +You can reach the page by using the |task-list-icon| :guilabel:`Tasks` link in the |ivy| Portal menu. .. note:: @@ -20,14 +19,6 @@ link in the |ivy| Portal menu. the tasks belonging to you but all open tasks. - Visibility tasks assigned to roles depending on state: - - - Open: Visible for all members - - - In Progress: Visible for all members, but "parked" for working user (no actions possible for other role members) - - - Done: Visible for all members - |navigate-to-full-task-list-page| On the top of the **Full Task List** page you see next to the heading @@ -39,38 +30,44 @@ For each task the following key information is shown in the list: #. Priority -#. Name and Description +#. Task ID + +#. Name + +#. Description #. Responsible user or role -#. Task ID +#. State #. Creation Date #. Expiry Date -#. Status - #. Category #. Application (This column is not displayed by default) |task-key-information| -Furthermore, at the end of each row you find a side step menu of key features in +Furthermore, at the end of each row you find the `Actions` menu of key features in handling tasks: +#. Details + #. Reset Task #. Delegate Task #. Reserve -#. Destroy Task +#. Destroy -#. Trigger Escalation Task +#. Trigger Escalation -#. Add Ad-hoc Task +#. Workflow Events + +#. Process Viewer .. note:: @@ -80,7 +77,7 @@ handling tasks: :bdg-ref-warning:`🔑TaskDisplayWorkflowEventAction <TaskDisplayWorkflowEventAction>` to allow a user to see the corresponding buttons and menu items. Finally, you have the possibility to access the full set of the task -data by clicking on the row containing the task Name and Description. +data by clicking on `Actions` then clicking on the `Details` menu item. The task details are separated into 4 different sections: @@ -105,110 +102,14 @@ The task details are separated into 4 different sections: |detailed-task-information| +HowTo: Configure the full task list +----------------------------------- -HowTo: Use existing filter --------------------------- +The full task list page functions as a dashboard accessible from the top-level menu. +To customize the task list, navigate to :ref:`Dashboard configuration <dashboard-configuration>`. -.. hint:: - If there are no public filters and you didn’t create any filters so far, - there might be no filters available. In this case, you must create a filter - first. This is described in detail in HowTo: Create new filter. - -#. Click on the :guilabel:`Save Filter` dropdown menu. - -#. Select the filter you want to use. - -HowTo: Create new filter ------------------------- - -#. Click on the button :guilabel:`More` to select one of the available filters. - For a list of available filters, see `Task filter`_. - -#. Click on the newly added filter and configure it. - -#. Add more filters by clicking on the button :guilabel:`Filter` again. - -#. Drop filters by clicking on the |delete-circle-icon| icon next to - the filter. - -#. When finished defining your filter, click on the button **Save - filter**. - -#. The :guilabel:`Save filter` dialog is opened. - -#. Under :guilabel:`Filter name`, provide a recognizable name for the filter. - -#. Under :guilabel:`Filter visibility`, you can select if the filter is only - visible for you or shall be available to all users. - -#. Save the filter by clicking the button :guilabel:`Ok`. - -|how-to-create-task-filter| - - -.. centered:: _`Task filter` - -+-----------------------------------+-----------------------------------+ -| Criteria | Description | -+===================================+===================================+ -| ID | The filter lets you specify the | -| | task identify number | -+-----------------------------------+-----------------------------------+ -| Name | The filter lets you specify the | -| | task name | -+-----------------------------------+-----------------------------------+ -| Completed on (from / to) | This filter lets you specify task | -| | complete period. | -+-----------------------------------+-----------------------------------+ -| Created (from / to) | This filter lets you specify in | -| | which time period the task was | -| | created. | -+-----------------------------------+-----------------------------------+ -| Description | This filter lets you search for | -| | keywords within the task | -| | description. | -+-----------------------------------+-----------------------------------+ -| Expiry (from / to) | This filter lets you specify in | -| | which time period the task will | -| | expire. | -+-----------------------------------+-----------------------------------+ -| Priority | This filter lets you specify the | -| | priority of the tasks to be | -| | shown. | -+-----------------------------------+-----------------------------------+ -| Responsible | This filter lets you specify a | -| | user or role which is responsible | -| | for the task. | -+-----------------------------------+-----------------------------------+ -| State | This filter lets you specify the | -| | task state. | -+-----------------------------------+-----------------------------------+ -| Category | This filter lets you specify | -| | the task category. | -+-----------------------------------+-----------------------------------+ -| Missing Activator | This filter is only for Admin and | -| | lets you find tasks which have no | -| | activator, activator is not found | -| | or is disabled. | -+-----------------------------------+-----------------------------------+ -| Application | This filter lets you select the | -| | application | -+-----------------------------------+-----------------------------------+ - - - -.. hint:: - #. You can create a new filter by selecting an existing filter, reconfiguring it, and saving it. - - #. Only users with the admin role ``AXONIVY_PORTAL_ADMIN`` can save the filter for all users. - -HowTo: Configure displayed tasks in the Full Task List -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -#. To choose columns to display, click on :guilabel:`Manage columns`. Then you could choose displayed columns by checking the related checkboxes. - -#. To sort data, click on the column header. To change sort direction, click on that column header one more time. - Note that some columns do not support sorting. +To restore the dashboard to its default settings, including the menu icon and task list layout, delete the dashboard. Portal will automatically +recreate the dashboard with the default settings. HowTo: Move and Resize Widgets in Task Details ---------------------------------------------- @@ -322,14 +223,6 @@ HowTo: Show Workflow Events |workflow-events-table| -HowTo: Export Task List ------------------------ - -You may export the Task List by clicking on the button **Export to Excel**. - -|export-to-excel-button| - - HowTo: Share Task Details ------------------------- @@ -347,22 +240,36 @@ HowTo: Share Task Details .. |navigate-to-full-task-list-page| image:: ../../screenshots/dashboard/expanded-left-menu.png + :alt: Menu to navigate to the Full task list .. |task-key-information| image:: ../../screenshots/task/task-key-information.png + :alt: Full task list: key informations .. |detailed-task-information-data-description| image:: ../../screenshots/task-detail/detailed-task-information-data-description.png + :alt: Task Details: General section .. |detailed-task-information-note| image:: ../../screenshots/task-detail/detailed-task-information-note.png + :alt: Task Details: Notes section .. |detailed-task-information-documents| image:: ../../screenshots/task-detail/detailed-task-information-documents.png + :alt: Task Details: Documents section .. |detailed-task-information| image:: ../../screenshots/task-detail/detailed-task-information.png -.. |how-to-create-task-filter| image:: ../../screenshots/task/how-to-create-task-filter.png + :alt: The Task Details page .. |how-to-upload-document| image:: ../../screenshots/task-detail/how-to-upload-document.png + :alt: Task Details:Add document dialog .. |how-to-delete-document| image:: ../../screenshots/task-detail/how-to-delete-document.png + :alt: Task Details: Delete document confirm dialog .. |how-to-add-note| image:: ../../screenshots/task-detail/how-to-add-note.png + :alt: Task Details: Add note dialog .. |how-to-show-note-details| image:: ../../screenshots/task-detail/how-to-show-note-details.png + :alt: Task Details: Link to show more notes details .. |how-to-export-note-details| image:: ../../screenshots/task-detail/how-to-export-note-details.png -.. |how-to-show-workflow-event| image:: ../../screenshots/task-detail/how-to-show-workflow-event.png + :alt: Link to export task notes .. |workflow-events-table| image:: ../../screenshots/task-detail/workflow-events-table.png -.. |export-to-excel-button| image:: ../../screenshots/task/export-to-excel-button.png + :alt: Workflow events of task dialog .. |how-to-switch-to-view-mode| image:: ../../screenshots/task-detail/how-to-switch-to-view-mode.png + :alt: Task Details: save button .. |how-to-switch-to-edit-mode| image:: ../../screenshots/task-detail/how-to-switch-to-edit-mode.png + :alt: Task Details: button to switch to the edit mode .. |how-to-reset-to-default| image:: ../../screenshots/task-detail/how-to-reset-to-default.png + :alt: Task Details: button to reset to the default configurations .. |how-to-share-task-details| image:: ../../screenshots/task-detail/share-page-button.png + :alt: Task Details: button to get the shareable link of the task details .. |task-status-banner| image:: ../../screenshots/task-detail/task-status-banner.png + :alt: Task Details: the Status banner \ No newline at end of file diff --git a/Documentation/portal-guide/source/portal-user-guide/includes/_common-icon.rst b/Documentation/portal-guide/source/portal-user-guide/includes/_common-icon.rst index 0cdb00ccaf2..47ce6210797 100644 --- a/Documentation/portal-guide/source/portal-user-guide/includes/_common-icon.rst +++ b/Documentation/portal-guide/source/portal-user-guide/includes/_common-icon.rst @@ -56,3 +56,7 @@ :width: 15px .. |remove-filter-icon| image:: ../includes/images/subtract-circle.svg :width: 15px +.. |actions-menu-icon| image:: ../includes/images/actions-menu.svg + :width: 15px +.. |reorder-dashboard-icon| image:: ../includes/images/reorder.svg + :width: 15px diff --git a/Documentation/portal-guide/source/portal-user-guide/includes/images/actions-menu.svg b/Documentation/portal-guide/source/portal-user-guide/includes/images/actions-menu.svg new file mode 100644 index 00000000000..7283ce3953a --- /dev/null +++ b/Documentation/portal-guide/source/portal-user-guide/includes/images/actions-menu.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--!Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M8 256a56 56 0 1 1 112 0A56 56 0 1 1 8 256zm160 0a56 56 0 1 1 112 0 56 56 0 1 1 -112 0zm216-56a56 56 0 1 1 0 112 56 56 0 1 1 0-112z"/></svg> \ No newline at end of file diff --git a/Documentation/portal-guide/source/portal-user-guide/includes/images/reorder.svg b/Documentation/portal-guide/source/portal-user-guide/includes/images/reorder.svg new file mode 100644 index 00000000000..b238403fa65 --- /dev/null +++ b/Documentation/portal-guide/source/portal-user-guide/includes/images/reorder.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--!Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M0 96C0 78.3 14.3 64 32 64l384 0c17.7 0 32 14.3 32 32s-14.3 32-32 32L32 128C14.3 128 0 113.7 0 96zM0 256c0-17.7 14.3-32 32-32l384 0c17.7 0 32 14.3 32 32s-14.3 32-32 32L32 288c-17.7 0-32-14.3-32-32zM448 416c0 17.7-14.3 32-32 32L32 448c-17.7 0-32-14.3-32-32s14.3-32 32-32l384 0c17.7 0 32 14.3 32 32z"/></svg> \ No newline at end of file diff --git a/Documentation/portal-guide/source/portal-user-guide/index.rst b/Documentation/portal-guide/source/portal-user-guide/index.rst index 89c91e5f50a..f5f9f5d1206 100644 --- a/Documentation/portal-guide/source/portal-user-guide/index.rst +++ b/Documentation/portal-guide/source/portal-user-guide/index.rst @@ -6,22 +6,21 @@ User Guide :caption: Portal User Guide axon-ivy-portal/index - forgot-password/index new-dashboard/index dashboard-configuration/index - portal-header/index + complex-filter/index full-process-list/index - process-information/index full-task-list/index full-case-list/index + statistic-chart/index + portal-header/index my-profile/index - admin-settings/index - portal-chat/index notification/index - demo-processes/index + portal-chat/index + admin-settings/index + forgot-password/index portal-multi-language/index - qr-code/index - complex-filter/index - statistic-chart/index accessibility/index - ai-assistant/index \ No newline at end of file + demo-processes/index + qr-code/index + ai-assistant/index diff --git a/Documentation/portal-guide/source/portal-user-guide/my-profile/index.rst b/Documentation/portal-guide/source/portal-user-guide/my-profile/index.rst index acd37ef986e..60493a3b6ea 100644 --- a/Documentation/portal-guide/source/portal-user-guide/my-profile/index.rst +++ b/Documentation/portal-guide/source/portal-user-guide/my-profile/index.rst @@ -10,11 +10,13 @@ Help you adjust your general settings, language and notification channels subscr General settings ---------------- -**General settings** allows you to configure some settings according to your requirements. This area -contains :guilabel:`Selected homepage` and :guilabel:`Show Welcome Tour`. +**General settings** allows you to configure some settings according to your +requirements. This area allows you to select the homepage you want to display. + +.. _process-list-configuration: Process list configuration -^^^^^^^^^^^^^^^^^^^^^^^^^^ +-------------------------- This section has available options which help you to configure your Process list. These are options you can modify: @@ -30,45 +32,6 @@ These are options you can modify: Portal will use the default value defined by the administrator if you don't select an option. -Task list configuration -^^^^^^^^^^^^^^^^^^^^^^^ - -This section has available options which help you to modify your Task list. -These are options you can modify: - -.. table:: - - +-----------------------+-----------------------------------------------+ - | Option | Description | - +=======================+===============================================+ - | Default sort field | Default sort field when you open a task list. | - +-----------------------+-----------------------------------------------+ - | Default sort direction| Default sort direction when you open a task | - | | list. | - +-----------------------+-----------------------------------------------+ - - -Portal will use the default value defined by the administrator if you don't select an option. - -Case list configuration -^^^^^^^^^^^^^^^^^^^^^^^ - -This section has available options which help you to modify your Case list. -These are options you can modify: - -.. table:: - - +-----------------------+------------------------------------------------+ - | Option | Description | - +=======================+================================================+ - | Default sort field | Default sort field when you open a case list. | - +-----------------------+------------------------------------------------+ - | Default sort direction| Default sort direction when you open a case | - | | list. | - +-----------------------+------------------------------------------------+ - -Portal will use the default value defined by the administrator if you don't select an option. - .. _language-settings: Language settings @@ -100,6 +63,8 @@ Portal: application specific dialogs will still be shown in English. +.. _notification-channels: + Notification Channels --------------------- @@ -113,4 +78,5 @@ events that can either be subscribed or unsubscribed. The checkbox in each event column allow you to specify three state of event: subscribed by default, subscribe, unsubscribe. -.. |my-profile-save| image:: ../../screenshots/my-profile/my-profile.png \ No newline at end of file +.. |my-profile-save| image:: ../../screenshots/my-profile/my-profile.png + :alt: My profile page \ No newline at end of file diff --git a/Documentation/portal-guide/source/portal-user-guide/new-dashboard/index.rst b/Documentation/portal-guide/source/portal-user-guide/new-dashboard/index.rst index 6e0fbaa96ce..e21967a22c9 100644 --- a/Documentation/portal-guide/source/portal-user-guide/new-dashboard/index.rst +++ b/Documentation/portal-guide/source/portal-user-guide/new-dashboard/index.rst @@ -38,7 +38,7 @@ The following default widgets are available: In addition, a developer can provide custom widgets to add relevant project information to your dashboard. -**Task list widget, Case list widget, Process list widget (compact mode)** has the following standard features: +**Task list widget, Case list widget, Process list widget (compact mode)** have the following standard features: - Saved filters and Filter options @@ -49,7 +49,7 @@ In addition, a developer can provide custom widgets to add relevant project info |widget-info| If you have the permission, you can re-size, re-arrange, create, or delete widgets -using the **Edit** button in the upper right corner of your dashboard: +using :guilabel:`Edit` button in the upper right corner of your dashboard: |edit-widget| @@ -57,7 +57,7 @@ In edit mode, you can: - **Move widgets using drag-and-drop**: click on the widget you want to move and drop again. Helper lines will support you. - - **Edit existing widgets**: the configuration panel for a specific widget will open to edit it. + - **Edit existing widgets**: open the configuration panel to edit widget by clicking on :guilabel:`Edit` button. - **Delete existing widgets**: the widget will be deleted. @@ -87,29 +87,25 @@ see and how. On the widget configuration panel, you can define the widget name, enable the quick search function, show or hide the widget information and fullscreen -mode icons, and manage columns and filters. +mode icons, manage columns and filters, edit the default sort order of the table columns by clicking on the column headers. **Filters panel** -By clicking on the ``Filter`` button, you can configure the complex filter for -your widget and get a preview of it by clicking on the ``apply`` button. Please +By clicking on the :guilabel:`Filter` button, you can configure the complex filter for +your widget and get a preview of it by clicking on the :guilabel:`Apply` button. Please refer to :ref:`Complex Filter <complex-filter>` for more details. -|task-widget-complex-filter-configuration| +|task-list-widget-configuration| **Column Management** -This panel allows you to: - -- Edit the default sort order of the table rows by clicking on the column headers -- Define the order of the columns -- Define the displayed set of columns by clicking on the link ``Manage Columns`` at the top right. You get the following dialog: +By clicking on the :guilabel:`Manage Columns` button at the top right of the configuration panel. You get the following dialog: |task-list-widget-table-configuration| -In the table configuration panel, you find two sections: +In the column management dialog, you find two sections to configure the table columns: - #. Add field section: add any available field to your widget table + #. Add field section: add any available fields to your widget table #. Columns section: configure the widget table itself as follows: - Enable visibility @@ -133,7 +129,7 @@ Portal supports to display **custom case fields** within the task list. **Excel export** -You can export all data of the task widget by clicking on the link ``Export to Excel`` at the bottom left corner of the widget information panel. +In view mode, you can export all data of the task widget by clicking on the link ``Export to Excel`` at the bottom left corner of the widget information panel. |task-export-excel| @@ -148,8 +144,20 @@ In view mode, when quick search is enabled, a text box will appear to allow you .. important:: - #. The quick search function is unaffected by widget filters. #. You can define the scope of the quick search feature in the configuration panel. + #. The result of the quick search function may be affected if you apply a complex filter on the widget. + +**Adjust column width** + +In edit mode, you can adjust the width of each column directly within the widget table. + +|task-list-widget-edit-mode| + +You may also notice gridlines on the table which implemented by Portal to help you adjust the column widths more efficiently. + + .. important:: + + If the total width of the columns is less than the widget’s width, the Portal will automatically adjust the column widths to match the widget’s width. .. _new-dashboard-case-list-widget: @@ -163,27 +171,23 @@ see and how. On the widget configuration panel, you can define the widget name, enable the quick search function, show or hide the widget information and fullscreen -mode icons, and manage columns and filters. +mode icons, manage columns and filters, edit the default sort order of the table columns by clicking on the column headers. **Filters panel** -By clicking on the ``Filter`` button, you can configure the complex filter for -your widget and get a preview of it by clicking on the ``apply`` button. Please +By clicking on the :guilabel:`Filter` button, you can configure the complex filter for +your widget and get a preview of it by clicking on the :guilabel:`Apply` button. Please refer to :ref:`Complex Filter <complex-filter>` for more details. |case-list-widget-configuration| **Column Management** -This panel allows you to: - -- Edit the default sort order of the table rows by clicking on the column headers -- define the order of the columns -- define the displayed set of columns by clicking on the link ``Manage Columns`` at the top right. You get the following dialog: +By clicking on the :guilabel:`Manage Columns` button at the top right of the configuration panel. You get the following dialog: |case-list-widget-table-configuration| -In the table configuration panel, you find two sections: +In the column management dialog, you find two sections to configure the table columns: #. Add field section: add any available field to your widget table #. Columns section: configure the widget table itself as follows: @@ -204,7 +208,7 @@ In the table configuration panel, you find two sections: **Excel export** -You can export all data of the case widget by clicking on the link ``Export to Excel`` at the end of the widget information panel. +In view mode, you can export all data of the case widget by clicking on the link ``Export to Excel`` at the end of the widget information panel. |case-export-excel| @@ -213,14 +217,26 @@ files and put them into a single zip file. **Quick search** -In the view mode, when quick search is enabled, a text box will appear to allow you to search. +In view mode, when quick search is enabled, a text box will appear to allow you to search. |case-quick-search-textbox| .. important:: - #. The quick search function is unaffected by widget filters. #. You can define the scope of the quick search feature in the configuration panel. + #. The result of the quick search function may be affected if you apply a complex filter on the widget. + +**Adjust column width** + +In edit mode, you can adjust the width of each column directly within the widget table. + +|case-list-widget-edit-mode| + +You may also notice gridlines on the table which implemented by Portal to help you adjust the column widths more efficiently. + + .. important:: + + If the total width of the columns is less than the widget’s width, the Portal will automatically adjust the column widths to match the widget’s width. .. _new-dashboard-process-list-widget: @@ -335,13 +351,13 @@ In manage news, the user can: #. Create one entry in multiple languages. When creating the entry, the user can switch between the available languages with a click on the tab view header. -#. Translate the title by clicking on the input label. Translate the content by clicking on the |translate-icon| icon. +#. Translate the title by clicking on the input label. Translate the content by clicking on the |translate-icon| icon. If you see something wrong with the translation, please prefer to :ref:`enable-translation` #. Choose an icon for the news by clicking directly on the icon, the :guilabel:`Icon browser` browser will be shown. #. Define the news title. Its length is limited to 200 characters. -#. Provide news content, i.e., the main information for the newsfeed. The content is limited to 1000 characters, max. +#. Provide news content, i.e., the main information for the news feed. The content is limited to a maximum of 1,000 characters. After setting up everything, simply click on the :guilabel:`Share this dashboard` link at the bottom of your dashboard to share it with colleagues. @@ -368,43 +384,74 @@ You can define a Notifications widget to display all Notifications based on your .. include:: ../includes/_common-icon.rst .. |dash-board| image:: ../../screenshots/new-dashboard/dashboard.png + :alt: Dashboard screen .. |widget-filter| image:: ../../screenshots/new-dashboard/widget-filter.png + :alt: Dashboard widget's filters panel .. |widget-info| image:: ../../screenshots/new-dashboard/widget-info.png + :alt: Dashboard widget's info panel .. |case-export-excel| image:: ../../screenshots/new-dashboard/case-export-excel.png + :alt: Dashboard case widget: export to Excel feature .. |task-export-excel| image:: ../../screenshots/new-dashboard/task-export-excel.png + :alt: Dashboard task widget: export to Excel feature .. |edit-widget| image:: ../../screenshots/new-dashboard/edit-widget.png + :alt: Dashboard configuration screen .. |add-widget| image:: ../../screenshots/new-dashboard/add-widget.png - + :alt: Add new widget dialog .. |task-list-widget| image:: ../../screenshots/new-dashboard/task-list-widget.png + :alt: Dashboard task widget's configuration dialog .. |task-list-widget-configuration| image:: ../../screenshots/new-dashboard/task-list-widget-configuration.png + :alt: Dashboard task widget's configuration panel .. |task-list-widget-table-configuration| image:: ../../screenshots/new-dashboard/task-list-widget-table-configuration.png + :alt: Dashboard task widget's table configuration .. |task-column-field-type-configuration| image:: ../../screenshots/new-dashboard/task-column-field-type-configuration.png + :alt: Dashboard task widget's column management .. |task-widget-complex-filter-configuration| image:: ../../screenshots/new-dashboard/task-widget-complex-filter-configuration.png - + :alt: Dashboard task widget's complex filter configuration .. |case-list-widget| image:: ../../screenshots/new-dashboard/case-list-widget.png + :alt: Dashboard case widget's configuration dialog .. |case-list-widget-configuration| image:: ../../screenshots/new-dashboard/case-list-widget-configuration.png + :alt: Dashboard case widget's configuration panel .. |case-list-widget-table-configuration| image:: ../../screenshots/new-dashboard/case-list-widget-table-configuration.png - + :alt: Dashboard case widget's table configuration .. |process-widget-modes| image:: ../../screenshots/new-dashboard/process-widget-modes.png + :alt: Dashboard process widget mode selection .. |process-widget-combined-mode| image:: ../../screenshots/new-dashboard/process-widget-combined-mode.png + :alt: Dashboard process widget's combined mode .. |process-widget-compact-mode| image:: ../../screenshots/new-dashboard/process-widget-compact-mode.png + :alt: Dashboard process widget's compact mode .. |process-widget-full-mode| image:: ../../screenshots/new-dashboard/process-widget-full-mode.png + :alt: Dashboard process widget's full mode .. |process-widget-image-mode| image:: ../../screenshots/new-dashboard/process-widget-image-mode.png + :alt: Dashboard process widget's image mode .. |process-viewer-widget| image:: ../../screenshots/new-dashboard/process-viewer-widget.png + :alt: Dashboard process viewer widget .. |process-viewer-widget-configuration| image:: ../../screenshots/new-dashboard/process-viewer-widget-configuration.png + :alt: Dashboard process viewer widget's configuration dialog .. |process-quick-search-textbox| image:: ../../screenshots/new-dashboard/process-quick-search-textbox.png - + :alt: Quick search feature of dashboard process widget .. |welcome-widget-configuration| image:: ../../screenshots/new-dashboard/welcome-widget-configuration.png + :alt: Dashboard welcome widget's configuration dialog .. |news-feed-widget-configuration| image:: ../../screenshots/new-dashboard/news-feed-widget-configuration.png + :alt: Dashboard news feed widget's configuration dialog .. |news-feed-widget| image:: ../../screenshots/new-dashboard/news-feed-widget.png + :alt: Dashboard news feed widget .. |news-feed-widget-manage-content| image:: ../../screenshots/new-dashboard/news-feed-widget-manage-content.png + :alt: Dashboard news feed widget's Manage news dialog .. |news-feed-widget-overlay-panel| image:: ../../screenshots/new-dashboard/news-feed-widget-overlay-panel.png - + :alt: Dashboard external page widget's overlay dialog .. |external-page-widget-configuration| image:: ../../screenshots/dashboard/external-page-widget-configuration.png - + :alt: Dashboard external page widget's configuration dialog .. |add-statistic-widget| image:: ../../screenshots/new-dashboard/add-client-statistic-widget.png - + :alt: Add new dashboard client statistic widget .. |notification-widget-configuration| image:: ../../screenshots/new-dashboard/notification-widget-configuration.png + :alt: Dashboard notification widget's configuration dialog .. |notification-widget| image:: ../../screenshots/new-dashboard/notification-widget.png + :alt: Dashboard notification widget .. |task-quick-search-textbox| image:: ../../screenshots/new-dashboard/task-quick-search-textbox.png + :alt: Dashboard task widget's quick search .. |case-quick-search-textbox| image:: ../../screenshots/new-dashboard/case-quick-search-textbox.png + :alt: Dashboard case widget's quick search +.. |task-list-widget-edit-mode| image:: ../../screenshots/new-dashboard/task-list-widget-edit-mode.png + :alt: Dashboard task widget in the Edit mode +.. |case-list-widget-edit-mode| image:: ../../screenshots/new-dashboard/case-list-widget-edit-mode.png + :alt: Dashboard case widget in the Edit mode \ No newline at end of file diff --git a/Documentation/portal-guide/source/portal-user-guide/notification/index.rst b/Documentation/portal-guide/source/portal-user-guide/notification/index.rst index 4420e34e27e..5679a71e1c5 100644 --- a/Documentation/portal-guide/source/portal-user-guide/notification/index.rst +++ b/Documentation/portal-guide/source/portal-user-guide/notification/index.rst @@ -3,17 +3,16 @@ Notification ************ -You can open your notifications by clicking on the bell icon in the top right corner. A panel contains all your notifications will be displayed. - -.. note:: - - The bell icon will automatically be hidden if the web notification channel is disabled either by the administrator or the user. +Portal notification displays all notifications based on your notification settings. |notification-panel| + #. To open the notification, click on the bell icon in the top right corner. A panel contains all your notifications will be displayed. + #. On the panel, you can access :ref:`notification settings <notification-channels>` or go to a full page notification by clicking on More actions icon in the top right of the panel. + #. Navigate to a full page notification by clicking on the |show-more-icon| icon. -You can navigate to a full page notification by clicking on the |show-more-icon| icon in the notification panel. +.. note:: -|notification-link-to-full-page| + The bell icon will automatically be hidden if the web notification channel is disabled either by the administrator or the user. |notification-full-page| @@ -21,7 +20,6 @@ You can navigate to a full page notification by clicking on the |show-more-icon| .. include:: ../includes/_common-icon.rst .. |notification-panel| image:: ../../screenshots/notification/notification-panel.png -.. |notification-link-to-full-page| image:: ../../screenshots/notification/notification-link-to-full-page.png + :alt: Notifications panel .. |notification-full-page| image:: ../../screenshots/notification/notification-full-page.png - - + :alt: Full notifications page \ No newline at end of file diff --git a/Documentation/portal-guide/source/portal-user-guide/portal-chat/index.rst b/Documentation/portal-guide/source/portal-user-guide/portal-chat/index.rst index 30ba509ed3a..46d4ce54dbf 100644 --- a/Documentation/portal-guide/source/portal-user-guide/portal-chat/index.rst +++ b/Documentation/portal-guide/source/portal-user-guide/portal-chat/index.rst @@ -9,9 +9,9 @@ Portal supports process chat related to a case or private chat between two users HowTo: Activate chat -------------------- -You can turn on private chat with this Portal setting: Portal.Chat.EnablePrivate. +You can turn on private chat with this Portal setting: :guilabel:`Portal.Chat.EnablePrivate`. -You can turn on process chat with this Portal setting: Portal.Chat.EnableGroup. +You can turn on process chat with this Portal setting: :guilabel:`Portal.Chat.EnableGroup`. See :ref:`Update Portal settings <update-portal-settings>`. diff --git a/Documentation/portal-guide/source/portal-user-guide/portal-header/index.rst b/Documentation/portal-guide/source/portal-user-guide/portal-header/index.rst index 9a3c8742f5d..5dd4864ab6b 100644 --- a/Documentation/portal-guide/source/portal-user-guide/portal-header/index.rst +++ b/Documentation/portal-guide/source/portal-user-guide/portal-header/index.rst @@ -27,12 +27,12 @@ needs. These features are described in the following sections below. Admin Settings -------------- -Menu entry :ref:`Admin Settings <admin-settings>` is only available for users who have role AXONIVY_PORTAL_ADMIN. +Menu entry :ref:`Admin Settings <admin-settings>` is only available for users who have role ``AXONIVY_PORTAL_ADMIN``. My profile ---------- -Menu entry :ref:`my-profile` contains general setting, user language and email settings. +Menu entry :ref:`my-profile` contains general setting, user language and notification channels subscription settings. Dashboard Configuration ----------------------- @@ -49,10 +49,7 @@ component. Here you can enter your absence and define delegate for tasks assigned to you or one of the roles you hold. .. hint:: - Although you can specify - delegates for a role you hold, we recommend specifying only delegates for tasks - assigned personally to you. Roles are normally held by a group of users, so if - you’re absent one of your role members is still able to pick the task. + Although you can specify delegates for a role you hold, we recommend specifying delegates only for tasks assigned directly to you. Roles are typically held by a group of users, so if you're absent, another member of your role can still take on the task. |portal-absences| @@ -96,7 +93,7 @@ HowTo: Set substitute A substitute can only belonged to one type. -#. Specify substitutes by clicking on link ends with |si-notes-quill|. +#. Specify substitutes by clicking on link ends with |si-notes-quill|, select substitutes and click :guilabel:`Add` button to add. #. Confirm your substitutes with the button :guilabel:`Save`. @@ -143,11 +140,11 @@ The Global Search is a convenient tool for you to look up information in the whole |ivy| Portal. You may search for any keyword. By default, the |ivy| Portal will search for: -#. Processes +#. Processes: name, description -#. Cases +#. Cases: id, name, description -#. Tasks +#. Tasks: id, name, description and all custom string fields When you confirm the keyword you’re looking for, the |ivy| Portal will route you to the **Global Search Results** page. For each category @@ -158,13 +155,8 @@ a tab is provided, giving you the results of your search. HowTo: Limit search scope of Global Search ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -By default, Global Search looks for data that match your input in these fields: - - - Task fields: Id, name, and description. - - Case fields: Id, name, description, and any custom string field. - As an administrator, you may want to limit fields which Global Search should be looking for. -Portal provides two variables to help you: +Portal provides three variables to help you: - ``Portal.SearchScope.ByCaseFields``: Defining the fields that the global search will use to find matching cases besides case Id (this can influence the performance of the search). @@ -179,9 +171,16 @@ You can configure these variables by :ref:`settings-admin-settings`. .. |portal-header| image:: ../../screenshots/dashboard/portal-header-with-numbering-annotation.png + :alt: Portal header items .. |portal-absences| image:: ../../screenshots/settings/absence.png + :alt: Absences page .. |how-to-add-an-absence| image:: ../../screenshots/settings/new-absence.png + :alt: Absences page: Add new absence dialog .. |how-to-set-absence-substitutes| image:: ../../screenshots/settings/set-deputy.png + :alt: Absences page: Set deputy section .. |portal-password-change-dialog| image:: ../../screenshots/settings/change-password.png + :alt: Change password dialog .. |portal-version-information| image:: ../../screenshots/settings/portal-version-information.png -.. |portal-global-search-result-page| image:: ../../screenshots/search/global-search-result.png \ No newline at end of file + :alt: Version information dialog +.. |portal-global-search-result-page| image:: ../../screenshots/search/global-search-result.png + :alt: Global search results page \ No newline at end of file diff --git a/Documentation/portal-guide/source/portal-user-guide/portal-multi-language/index.rst b/Documentation/portal-guide/source/portal-user-guide/portal-multi-language/index.rst index 8212325de92..240c65ca20d 100644 --- a/Documentation/portal-guide/source/portal-user-guide/portal-multi-language/index.rst +++ b/Documentation/portal-guide/source/portal-user-guide/portal-multi-language/index.rst @@ -6,6 +6,8 @@ Portal Multi Language The document translation shows how easy it has become, to translate from the pure text, into the language of your end user. Say goodbye to language barriers in process automation with Axon Ivy's translation service powered by DeepL. +.. _enable-translation: + HowTo: Enable the translation ----------------------------- @@ -40,5 +42,8 @@ HowTo: Translate a pure text .. include:: ../includes/_common-icon.rst .. |create-private-dashboard-dialog| image:: ../../screenshots/dashboard-configuration/create-private-dashboard-dialog-ml.png + :alt: Multi language usage when create private dashboard .. |overlay-panel-translation| image:: ../../screenshots/dashboard-configuration/overlay-panel-translation-ml.png + :alt: Multi language: Translation panel .. |dashboard-multi-language-dialog| image:: ../../screenshots/dashboard-configuration/dashboard-multi-language-dialog-ml.png + :alt: Multi language dialog \ No newline at end of file diff --git a/Documentation/portal-guide/source/portal-user-guide/process-information/index.rst b/Documentation/portal-guide/source/portal-user-guide/process-information/index.rst deleted file mode 100644 index a2dc12695a4..00000000000 --- a/Documentation/portal-guide/source/portal-user-guide/process-information/index.rst +++ /dev/null @@ -1,47 +0,0 @@ -.. _process-information: - -Process Information -******************* - -The **Process Information** page shows you information about the selected process. -Besides basic information such as process name and description, you can see -advanced information like process steps and more. - -Process steps are a list of steps you will perform once you start the process. -These process steps are defined by the process developer. - -Basic information -^^^^^^^^^^^^^^^^^ - -The **Process Information** page not only shows you basic information of the -selected process such as process name and description, but also detailed -information in the form of process steps. - -To reach this page, - -- click on link ``More information`` of a process in the full Process List in - grid mode. - -|more-information-link| - -- click on link ``Show process overview`` on the Case details page of a case - started by this process. - -|process-overview-link| - -Process steps -^^^^^^^^^^^^^ - -|process-information| - -At the top of the **Process Information** page, you see basic process -information like name and description. - -Depending on the process, you can see process steps that are defined by its -developers. These process steps give you a clear picture of the flow of the -process so you can work more efficiently with it. - - -.. |more-information-link| image:: ../../screenshots/process/information/more-information-link.png -.. |process-overview-link| image:: ../../screenshots/process/information/process-overview-link.png -.. |process-information| image:: ../../screenshots/process/information/process-information.png \ No newline at end of file diff --git a/Documentation/portal-guide/source/portal-user-guide/qr-code/index.rst b/Documentation/portal-guide/source/portal-user-guide/qr-code/index.rst index 27277c859f8..0ff8340458d 100644 --- a/Documentation/portal-guide/source/portal-user-guide/qr-code/index.rst +++ b/Documentation/portal-guide/source/portal-user-guide/qr-code/index.rst @@ -8,12 +8,12 @@ By scanning the QR code, the Axon Ivy mobile application can obtain the login ur HowTo: Activate the QR code --------------------------- -You can turn on QR code with this Portal setting: Portal.UserMenu.ShowQRCode. +You can turn on QR code with this Portal setting: :guilabel:`Portal.UserMenu.ShowQRCode`. HowTo: Change base Portal URL for Axon Ivy Mobile application ------------------------------------------------------------- -You can change the base Portal URL with this Portal setting: Portal.UserMenu.BaseQRCodeUrl. +You can change the base Portal URL with this Portal setting: :guilabel:`Portal.UserMenu.BaseQRCodeUrl`. See :ref:`Update Portal settings <update-portal-settings>`. @@ -44,5 +44,8 @@ HowTo: Connect To the Axon Ivy Mobile application using the QR code #. Open the Axon Ivy mobile application and scan this QR code. .. |qr-code| image:: ../../screenshots/mobile/qr-code.png + :alt: Mobile app QR code .. |mobile-app-menu| image:: ../../screenshots/mobile/mobile-app-menu.png -.. |platform-qr-code| image:: ../../screenshots/mobile/platform-qr-code.png \ No newline at end of file + :alt: Mobile app menu +.. |platform-qr-code| image:: ../../screenshots/mobile/platform-qr-code.png + :alt: Mobile app QR code \ No newline at end of file diff --git a/Documentation/portal-guide/source/portal-user-guide/statistic-chart/index.rst b/Documentation/portal-guide/source/portal-user-guide/statistic-chart/index.rst index 90e7bbe1bd4..131c187a157 100644 --- a/Documentation/portal-guide/source/portal-user-guide/statistic-chart/index.rst +++ b/Documentation/portal-guide/source/portal-user-guide/statistic-chart/index.rst @@ -13,7 +13,7 @@ How to use To utilize the Statistic feature on the Dashboard Configuration, follow these steps: -- Navigate to Dashboard Configuration and select "Add Widget" +- Navigate to Dashboard Configuration of the dashboard where you want to add the widget and select :guilabel:`Add Widget`. - From the dropdown menu labeled "Statistic Widget," choose from a variety of insightful charts. @@ -92,17 +92,36 @@ Available Standard Charts - This chart shows all tasks the user can work on. - Chart type: :bdg-info:`Number` +- Tasks Due Today + + |due-today-chart| + + - This chart shows all tasks that are due today. + - Chart type: :bdg-info:`Number` + .. |statistic-widget-list-page| image:: ../../screenshots/statistic/statistic-widget-list.png + :alt: Statistic widget list .. |dashboard-statistic-widget-demo| image:: ../../screenshots/statistic/dashboard-statistic-widget-demo.png - + :alt: Statistic widget demo .. |tasks-by-prior-pie-chart| image:: ../../screenshots/statistic/tasks-by-prior-pie-chart.png + :alt: Task by priority pie chart .. |tasks-by-prior-bar-chart| image:: ../../screenshots/statistic/tasks-by-prior-bar-chart.png + :alt: Task by priority bar chart .. |tasks-by-prior-number-chart| image:: ../../screenshots/statistic/tasks-by-prior-number-chart.png + :alt: Task by priority number chart .. |avg-runtime-chart| image:: ../../screenshots/statistic/avg-runtime-chart.png + :alt: Average runtime chart .. |completed-cases-chart| image:: ../../screenshots/statistic/completed-cases-chart.png + :alt: Completed cases chart .. |due-today-chart| image:: ../../screenshots/statistic/due-today-chart.png + :alt: Number of tasks expire today .. |new-cases-chart| image:: ../../screenshots/statistic/new-cases-chart.png + :alt: Number of new cases chart .. |open-tasks-chart| image:: ../../screenshots/statistic/running-cases-chart.png + :alt: Number of running cases chart .. |tasks-expire-end-week-chart| image:: ../../screenshots/statistic/tasks-expire-end-week-chart.png + :alt: Number of tasks expire this week chart .. |top-prior-chart| image:: ../../screenshots/statistic/top-prior-chart.png -.. |running-cases-chart| image:: ../../screenshots/statistic/running-cases-chart.png \ No newline at end of file + :alt: Top priority tasks chart +.. |running-cases-chart| image:: ../../screenshots/statistic/running-cases-chart.png + :alt: Running cases chart \ No newline at end of file diff --git a/Documentation/public-api/pom.xml b/Documentation/public-api/pom.xml index 345e9c0875f..5bea3c50dc9 100644 --- a/Documentation/public-api/pom.xml +++ b/Documentation/public-api/pom.xml @@ -5,8 +5,8 @@ <artifactId>public-api</artifactId> <version>9.1.0.0-SNAPSHOT</version> <properties> - <build.plugin.version>11.4.0-SNAPSHOT</build.plugin.version> - <ivy.engine.version>11.4.0</ivy.engine.version> + <build.plugin.version>12.0.0</build.plugin.version> + <ivy.engine.version>12.0.0</ivy.engine.version> </properties> <distributionManagement> <repository> diff --git a/Showcase/InternalSupport/pom.xml b/Showcase/InternalSupport/pom.xml index 8f67c86cf8f..5e0578b75af 100644 --- a/Showcase/InternalSupport/pom.xml +++ b/Showcase/InternalSupport/pom.xml @@ -6,7 +6,7 @@ <version>9.1.0.0-SNAPSHOT</version> <packaging>iar</packaging> <properties> - <build.plugin.version>12.0.0-SNAPSHOT</build.plugin.version> + <build.plugin.version>12.0.0</build.plugin.version> <ivy.engine.version>12.0.0</ivy.engine.version> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> diff --git a/Showcase/InternalSupport/processes/Business Processes/testProcesses/CaseOwner.p.json b/Showcase/InternalSupport/processes/Business Processes/testProcesses/CaseOwner.p.json index be61088980f..6aa3b1d10ec 100644 --- a/Showcase/InternalSupport/processes/Business Processes/testProcesses/CaseOwner.p.json +++ b/Showcase/InternalSupport/processes/Business Processes/testProcesses/CaseOwner.p.json @@ -41,7 +41,7 @@ "output" : { "code" : [ "import ch.ivyteam.ivy.security.ISecurityContext;", - "ivy.case.setOwner(ISecurityContext.current().users().find(\"demo\"));" + "ivy.case.owners().add(ISecurityContext.current().users().find(\"demo\"));" ] }, "sudo" : true @@ -132,7 +132,7 @@ "output" : { "code" : [ "import ch.ivyteam.ivy.security.ISecurityContext;", - "ivy.case.setOwner(ISecurityContext.current().roles().find(\"CaseOwner\"));" + "ivy.case.owners().add(ISecurityContext.current().roles().find(\"CaseOwner\"));" ] }, "sudo" : true @@ -144,5 +144,84 @@ "connect" : [ { "id" : "f12", "to" : "f8", "var" : "in1" } ] + }, { + "id" : "f14", + "type" : "RequestStart", + "name" : "multipleOwners", + "config" : { + "signature" : "multipleOwners", + "request" : { + "name" : "Create case with multiple owners", + "description" : "Create case with multiple owners" + } + }, + "visual" : { + "at" : { "x" : 96, "y" : 280 } + }, + "connect" : [ + { "id" : "f16", "to" : "f15" } + ] + }, { + "id" : "f15", + "type" : "Script", + "name" : "Set multiple case owners", + "config" : { + "output" : { + "code" : [ + "import ch.ivyteam.ivy.security.ISecurityContext;", + "if (ISecurityContext.current().users().find(\"demo\") != null){", + " ivy.case.owners().add(ISecurityContext.current().users().find(\"demo\")); ", + "}", + "", + "if (ISecurityContext.current().users().find(\"admin\") != null){", + " ivy.case.owners().add(ISecurityContext.current().users().find(\"admin\"));", + "}", + "", + "if (ISecurityContext.current().roles().find(\"CaseOwner\") != null){", + " ivy.case.owners().add(ISecurityContext.current().roles().find(\"CaseOwner\"));", + "", + "}", + "", + "if (ISecurityContext.current().roles().find(\"HR\") != null){", + " ivy.case.owners().add(ISecurityContext.current().roles().find(\"HR\"));", + "}" + ] + }, + "sudo" : true + }, + "visual" : { + "at" : { "x" : 224, "y" : 280 } + }, + "connect" : [ + { "id" : "f18", "to" : "f22", "var" : "in1" } + ] + }, { + "id" : "f19", + "type" : "TaskEnd", + "visual" : { + "at" : { "x" : 448, "y" : 280 }, + "labelOffset" : { "x" : 13, "y" : 33 } + } + }, { + "id" : "f22", + "type" : "TaskSwitchGateway", + "config" : { + "tasks" : [ { + "id" : "TaskA", + "name" : "Task with multiple case owners", + "responsible" : { + "activator" : "CREATOR" + } + } ], + "case" : { + "name" : "Case with multiple owners" + } + }, + "visual" : { + "at" : { "x" : 352, "y" : 280 } + }, + "connect" : [ + { "id" : "f21", "to" : "f19", "condition" : "ivp==\"TaskA.ivp\"" } + ] } ] } \ No newline at end of file diff --git a/Showcase/portal-components-examples/pom.xml b/Showcase/portal-components-examples/pom.xml index ad995a6a774..ac732b8129c 100644 --- a/Showcase/portal-components-examples/pom.xml +++ b/Showcase/portal-components-examples/pom.xml @@ -18,7 +18,7 @@ </distributionManagement> <properties> <ivy.engine.version>12.0.0</ivy.engine.version> - <build.plugin.version>12.0.0-SNAPSHOT</build.plugin.version> + <build.plugin.version>12.0.0</build.plugin.version> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> diff --git a/Showcase/portal-components-examples/src_hd/com/axonivy/portal/components/examples/InvestmentRequestBusinessDetailsPage/InvestmentRequestBusinessDetailsPageData.d.json b/Showcase/portal-components-examples/src_hd/com/axonivy/portal/components/examples/InvestmentRequestBusinessDetailsPage/InvestmentRequestBusinessDetailsPageData.d.json index f36aa498436..5a9ce5b7385 100644 --- a/Showcase/portal-components-examples/src_hd/com/axonivy/portal/components/examples/InvestmentRequestBusinessDetailsPage/InvestmentRequestBusinessDetailsPageData.d.json +++ b/Showcase/portal-components-examples/src_hd/com/axonivy/portal/components/examples/InvestmentRequestBusinessDetailsPage/InvestmentRequestBusinessDetailsPageData.d.json @@ -5,7 +5,6 @@ "isBusinessCaseData" : false, "fields" : [ { "name" : "ivyCase", - "type" : "ch.ivyteam.ivy.workflow.ICase", - "modifiers" : [ "PERSISTENT" ] + "type" : "ch.ivyteam.ivy.workflow.ICase" } ] } \ No newline at end of file diff --git a/Showcase/portal-components-examples/src_hd/com/axonivy/portal/components/examples/ProcessHistoryDetailsExample/ProcessHistoryDetailsExampleData.d.json b/Showcase/portal-components-examples/src_hd/com/axonivy/portal/components/examples/ProcessHistoryDetailsExample/ProcessHistoryDetailsExampleData.d.json index 18eaa0cebf0..b197fd95b7f 100644 --- a/Showcase/portal-components-examples/src_hd/com/axonivy/portal/components/examples/ProcessHistoryDetailsExample/ProcessHistoryDetailsExampleData.d.json +++ b/Showcase/portal-components-examples/src_hd/com/axonivy/portal/components/examples/ProcessHistoryDetailsExample/ProcessHistoryDetailsExampleData.d.json @@ -5,7 +5,6 @@ "isBusinessCaseData" : false, "fields" : [ { "name" : "caseView", - "type" : "ch.ivyteam.ivy.workflow.ICase", - "modifiers" : [ "PERSISTENT" ] + "type" : "ch.ivyteam.ivy.workflow.ICase" } ] } \ No newline at end of file diff --git a/Showcase/portal-developer-examples/cms/cms_es.yaml b/Showcase/portal-developer-examples/cms/cms_es.yaml index 4f4748fb93a..380a3b7f4b2 100644 --- a/Showcase/portal-developer-examples/cms/cms_es.yaml +++ b/Showcase/portal-developer-examples/cms/cms_es.yaml @@ -177,5 +177,5 @@ Processes: name: Pedido de pizza description: Crear 3 tareas, cada tarea tiene CustomerName y ShipmentDate name: Crear tareas para la personalización de la lista de tareas - UserExampleGuide: Guía de ejemplos de uso + UserExampleGuide: Guía de ejemplos para el usuario google: SP Google diff --git a/Showcase/portal-developer-examples/cms/cms_fr.yaml b/Showcase/portal-developer-examples/cms/cms_fr.yaml index 3cdeb331592..f1beab7a276 100644 --- a/Showcase/portal-developer-examples/cms/cms_fr.yaml +++ b/Showcase/portal-developer-examples/cms/cms_fr.yaml @@ -177,5 +177,5 @@ Processes: name: Commande de pizzas description: Créez 3 tâches, chaque tâche a le nom du client et la date d'expédition. name: Créer des tâches pour la personnalisation de la liste de tâches - UserExampleGuide: Guide d'exemple d'utilisation + UserExampleGuide: Guide d'utilisation google: FR Google diff --git a/Showcase/portal-developer-examples/pom.xml b/Showcase/portal-developer-examples/pom.xml index e6627713740..6b8f7129f2b 100644 --- a/Showcase/portal-developer-examples/pom.xml +++ b/Showcase/portal-developer-examples/pom.xml @@ -18,7 +18,7 @@ </distributionManagement> <properties> <ivy.engine.version>12.0.0</ivy.engine.version> - <build.plugin.version>12.0.0-SNAPSHOT</build.plugin.version> + <build.plugin.version>12.0.0</build.plugin.version> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> diff --git a/Showcase/portal-user-examples/cms/Images/advertising-megaphone.svg b/Showcase/portal-user-examples/cms/Images/advertising-megaphone.svg index a8f81c87e9a..d372c8d496b 100644 --- a/Showcase/portal-user-examples/cms/Images/advertising-megaphone.svg +++ b/Showcase/portal-user-examples/cms/Images/advertising-megaphone.svg @@ -1,11 +1 @@ -<?xml version="1.0" encoding="UTF-8"?> -<svg width="56" height="56" version="1.1" viewBox="0 0 56 56" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> - <!--Generated by IJSVG (https://github.com/iconjar/IJSVG)--> - <g transform="scale(2.33333)"> - <path fill="none" stroke="#1B1B1B" stroke-linecap="round" stroke-linejoin="round" stroke-width="1" d="M0.59,19.53l1.68,2.53"></path> - <path fill="none" stroke="#1B1B1B" stroke-linecap="round" stroke-linejoin="round" stroke-width="1" d="M9.88,8.27l6.38,9.61"></path> - <path fill="none" stroke="#1B1B1B" stroke-linecap="round" stroke-linejoin="round" stroke-width="1" d="M15.925,17.372l-13.988,4.184l-1.007,-1.518l9.284,-11.267l5.711,8.601Z"></path> - <path fill="none" stroke="#1B1B1B" stroke-linecap="round" stroke-linejoin="round" stroke-width="1" d="M9.216,19.378l-3.98083e-08,-4.56708e-08c0.771138,0.884701 0.679076,2.22702 -0.205625,2.99816c-0.884701,0.771138 -2.22702,0.679076 -2.99816,-0.205625c-0.0592333,-0.0679564 -0.114082,-0.139613 -0.164214,-0.214536l-0.877,-1.321"></path> - <path fill="none" stroke="#1B1B1B" stroke-linecap="round" stroke-linejoin="round" stroke-width="1" d="M3.588,12.46l-0.671,-0.711l3.98494e-08,4.2266e-08c-0.181599,-0.192612 -0.181599,-0.493388 -7.96988e-08,-0.686l1.8,-1.9l-0.6,-2.546l2.97005e-09,1.25925e-08c-0.0608206,-0.257869 0.0900669,-0.518413 0.344,-0.594l2.508,-0.747l0.747,-2.508l-3.32104e-10,1.12173e-09c0.0741497,-0.25045 0.32858,-0.401627 0.584,-0.347l2.545,0.605l1.9,-1.8l4.01326e-08,-3.7838e-08c0.192612,-0.181599 0.493388,-0.181599 0.686,7.56759e-08l1.9,1.8l2.546,-0.6l-1.83957e-08,4.33879e-09c0.257869,-0.0608206 0.518413,0.0900669 0.594,0.344l0.747,2.508l2.508,0.747l8.4804e-09,2.49826e-09c0.256805,0.0756528 0.408455,0.340158 0.344,0.6l-0.596,2.535l1.8,1.9l-8.50221e-09,-9.01782e-09c0.181599,0.192612 0.181599,0.493388 1.70044e-08,0.686l-1.8,1.9l0.605,2.545l4.26082e-09,1.79111e-08c0.061422,0.258199 -0.0895913,0.519399 -0.344,0.595l-2.508,0.747l-0.747,2.508l1.31211e-08,-4.38415e-08c-0.0760202,0.254006 -0.337095,0.404508 -0.595,0.343l-2.545,-0.6l-1.9,1.8l-6.88442e-09,6.4908e-09c-0.192612,0.181599 -0.493388,0.181599 -0.686,-1.29816e-08l-0.361,-0.341"></path> - </g> -</svg> \ No newline at end of file +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="56" height="56" version="1.1" viewBox="0 0 56 56"><g><path fill="none" stroke="#1B1B1B" stroke-linecap="round" stroke-linejoin="round" stroke-width="1" d="M0.59,19.53l1.68,2.53" transform="scale(2.33333)"/><path fill="none" stroke="#1B1B1B" stroke-linecap="round" stroke-linejoin="round" stroke-width="1" d="M9.88,8.27l6.38,9.61" transform="scale(2.33333)"/><path fill="none" stroke="#1B1B1B" stroke-linecap="round" stroke-linejoin="round" stroke-width="1" d="M15.925,17.372l-13.988,4.184l-1.007,-1.518l9.284,-11.267l5.711,8.601Z" transform="scale(2.33333)"/><path fill="none" stroke="#1B1B1B" stroke-linecap="round" stroke-linejoin="round" stroke-width="1" d="M9.216,19.378l-3.98083e-08,-4.56708e-08c0.771138,0.884701 0.679076,2.22702 -0.205625,2.99816c-0.884701,0.771138 -2.22702,0.679076 -2.99816,-0.205625c-0.0592333,-0.0679564 -0.114082,-0.139613 -0.164214,-0.214536l-0.877,-1.321" transform="scale(2.33333)"/><path fill="none" stroke="#1B1B1B" stroke-linecap="round" stroke-linejoin="round" stroke-width="1" d="M3.588,12.46l-0.671,-0.711l3.98494e-08,4.2266e-08c-0.181599,-0.192612 -0.181599,-0.493388 -7.96988e-08,-0.686l1.8,-1.9l-0.6,-2.546l2.97005e-09,1.25925e-08c-0.0608206,-0.257869 0.0900669,-0.518413 0.344,-0.594l2.508,-0.747l0.747,-2.508l-3.32104e-10,1.12173e-09c0.0741497,-0.25045 0.32858,-0.401627 0.584,-0.347l2.545,0.605l1.9,-1.8l4.01326e-08,-3.7838e-08c0.192612,-0.181599 0.493388,-0.181599 0.686,7.56759e-08l1.9,1.8l2.546,-0.6l-1.83957e-08,4.33879e-09c0.257869,-0.0608206 0.518413,0.0900669 0.594,0.344l0.747,2.508l2.508,0.747l8.4804e-09,2.49826e-09c0.256805,0.0756528 0.408455,0.340158 0.344,0.6l-0.596,2.535l1.8,1.9l-8.50221e-09,-9.01782e-09c0.181599,0.192612 0.181599,0.493388 1.70044e-08,0.686l-1.8,1.9l0.605,2.545l4.26082e-09,1.79111e-08c0.061422,0.258199 -0.0895913,0.519399 -0.344,0.595l-2.508,0.747l-0.747,2.508l1.31211e-08,-4.38415e-08c-0.0760202,0.254006 -0.337095,0.404508 -0.595,0.343l-2.545,-0.6l-1.9,1.8l-6.88442e-09,6.4908e-09c-0.192612,0.181599 -0.493388,0.181599 -0.686,-1.29816e-08l-0.361,-0.341" transform="scale(2.33333)"/></g></svg> \ No newline at end of file diff --git a/Showcase/portal-user-examples/cms/Images/check-circle-1.svg b/Showcase/portal-user-examples/cms/Images/check-circle-1.svg index 04e557020ff..c08a3802170 100644 --- a/Showcase/portal-user-examples/cms/Images/check-circle-1.svg +++ b/Showcase/portal-user-examples/cms/Images/check-circle-1.svg @@ -1,8 +1 @@ -<?xml version="1.0" encoding="UTF-8"?> -<svg width="56" height="56" version="1.1" viewBox="0 0 56 56" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> - <!--Generated by IJSVG (https://github.com/iconjar/IJSVG)--> - <g transform="scale(2.33333)"> - <path fill="none" stroke="#007095" stroke-linecap="round" stroke-linejoin="round" stroke-width="1" d="M18,6.999l-7,9.5l-5,-4"></path> - <path fill="none" stroke="#007095" stroke-linecap="round" stroke-linejoin="round" stroke-width="1" d="M20.1317,3.86727c4.49103,4.49103 4.49103,11.7724 0,16.2635c-4.49103,4.49103 -11.7724,4.49103 -16.2635,0c-4.49103,-4.49103 -4.49103,-11.7724 0,-16.2635c4.49103,-4.49103 11.7724,-4.49103 16.2635,0"></path> - </g> -</svg> \ No newline at end of file +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="56" height="56" version="1.1" viewBox="0 0 56 56"><g><path fill="none" stroke="#007095" stroke-linecap="round" stroke-linejoin="round" stroke-width="1" d="M18,6.999l-7,9.5l-5,-4" transform="scale(2.33333)"/><path fill="none" stroke="#007095" stroke-linecap="round" stroke-linejoin="round" stroke-width="1" d="M20.1317,3.86727c4.49103,4.49103 4.49103,11.7724 0,16.2635c-4.49103,4.49103 -11.7724,4.49103 -16.2635,0c-4.49103,-4.49103 -4.49103,-11.7724 0,-16.2635c4.49103,-4.49103 11.7724,-4.49103 16.2635,0" transform="scale(2.33333)"/></g></svg> \ No newline at end of file diff --git a/Showcase/portal-user-examples/cms/Images/information-circle.svg b/Showcase/portal-user-examples/cms/Images/information-circle.svg index 85005e72dee..718401a3bb1 100644 --- a/Showcase/portal-user-examples/cms/Images/information-circle.svg +++ b/Showcase/portal-user-examples/cms/Images/information-circle.svg @@ -1,10 +1 @@ -<?xml version="1.0" encoding="UTF-8"?> -<svg width="56" height="56" version="1.1" viewBox="0 0 56 56" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> - <!--Generated by IJSVG (https://github.com/iconjar/IJSVG)--> - <g transform="scale(2.33333)"> - <path fill="none" stroke="#007095" stroke-linecap="round" stroke-linejoin="round" stroke-width="1" d="M19.7782,4.22283c4.29577,4.29577 4.29577,11.2606 0,15.5563c-4.29577,4.29577 -11.2606,4.29577 -15.5563,0c-4.29577,-4.29577 -4.29577,-11.2606 -2.66454e-15,-15.5563c4.29577,-4.29577 11.2606,-4.29577 15.5563,-2.66454e-15"></path> - <path fill="none" stroke="#007095" stroke-linecap="round" stroke-linejoin="round" stroke-width="1" d="M14.5,17.005h-1.5h-4.37114e-08c-0.552285,-2.41411e-08 -1,-0.447715 -1,-1c0,0 0,-3.55271e-15 0,-3.55271e-15v-6.5v0c0,-0.276142 -0.223858,-0.5 -0.5,-0.5h-1.5"></path> - <path fill="none" stroke="#007095" stroke-linecap="round" stroke-linejoin="round" stroke-width="1" d="M11.74,6.5v0"></path> - <path fill="none" stroke="#007095" stroke-linecap="round" stroke-linejoin="round" stroke-width="1" d="M11.745,6.5h-1.09278e-08c-0.138071,6.03528e-09 -0.25,0.111929 -0.25,0.25c6.03528e-09,0.138071 0.111929,0.25 0.25,0.25c0.138071,-6.03528e-09 0.25,-0.111929 0.25,-0.25v0c0,-0.138071 -0.111929,-0.25 -0.25,-0.25"></path> - </g> -</svg> \ No newline at end of file +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="56" height="56" version="1.1" viewBox="0 0 56 56"><g><path fill="none" stroke="#007095" stroke-linecap="round" stroke-linejoin="round" stroke-width="1" d="M19.7782,4.22283c4.29577,4.29577 4.29577,11.2606 0,15.5563c-4.29577,4.29577 -11.2606,4.29577 -15.5563,0c-4.29577,-4.29577 -4.29577,-11.2606 -2.66454e-15,-15.5563c4.29577,-4.29577 11.2606,-4.29577 15.5563,-2.66454e-15" transform="scale(2.33333)"/><path fill="none" stroke="#007095" stroke-linecap="round" stroke-linejoin="round" stroke-width="1" d="M14.5,17.005h-1.5h-4.37114e-08c-0.552285,-2.41411e-08 -1,-0.447715 -1,-1c0,0 0,-3.55271e-15 0,-3.55271e-15v-6.5v0c0,-0.276142 -0.223858,-0.5 -0.5,-0.5h-1.5" transform="scale(2.33333)"/><path fill="none" stroke="#007095" stroke-linecap="round" stroke-linejoin="round" stroke-width="1" d="M11.74,6.5v0" transform="scale(2.33333)"/><path fill="none" stroke="#007095" stroke-linecap="round" stroke-linejoin="round" stroke-width="1" d="M11.745,6.5h-1.09278e-08c-0.138071,6.03528e-09 -0.25,0.111929 -0.25,0.25c6.03528e-09,0.138071 0.111929,0.25 0.25,0.25c0.138071,-6.03528e-09 0.25,-0.111929 0.25,-0.25v0c0,-0.138071 -0.111929,-0.25 -0.25,-0.25" transform="scale(2.33333)"/></g></svg> \ No newline at end of file diff --git a/Showcase/portal-user-examples/cms/Images/shopping-cart-check.svg b/Showcase/portal-user-examples/cms/Images/shopping-cart-check.svg index 3a046996070..a769a020657 100644 --- a/Showcase/portal-user-examples/cms/Images/shopping-cart-check.svg +++ b/Showcase/portal-user-examples/cms/Images/shopping-cart-check.svg @@ -1,12 +1 @@ -<?xml version="1.0" encoding="UTF-8"?> -<svg width="56" height="56" version="1.1" viewBox="0 0 56 56" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> - <!--Generated by IJSVG (https://github.com/iconjar/IJSVG)--> - <g transform="scale(2.33333)"> - <path fill="none" stroke="#1B1B1B" stroke-linecap="round" stroke-linejoin="round" stroke-width="1" d="M9.06066,17.9383c0.585786,0.585786 0.585786,1.53553 0,2.12132c-0.585786,0.585786 -1.53553,0.585786 -2.12132,0c-0.585786,-0.585786 -0.585786,-1.53553 0,-2.12132c0.585786,-0.585786 1.53553,-0.585786 2.12132,0"></path> - <path fill="none" stroke="#1B1B1B" stroke-linecap="round" stroke-linejoin="round" stroke-width="1" d="M0.5,0.5h2.708l4.32338e-08,1.84377e-11c0.463907,0.00019785 0.866765,0.31942 0.973,0.771l3.819,16.229h4"></path> - <path fill="none" stroke="#1B1B1B" stroke-linecap="round" stroke-linejoin="round" stroke-width="1" d="M21.984,11.046l1.077,-3.229l4.87377e-08,-1.45817e-07c0.175074,-0.523801 -0.107625,-1.09035 -0.631426,-1.26543c-0.102381,-0.0342195 -0.209627,-0.0516363 -0.317575,-0.0515743h-16.7"></path> - <path fill="none" stroke="#1B1B1B" stroke-linecap="round" stroke-linejoin="round" stroke-width="1" d="M7.29,14.5h4.69"></path> - <path fill="none" stroke="#1B1B1B" stroke-linecap="round" stroke-linejoin="round" stroke-width="1" d="M22.0355,14.9635c1.95262,1.95262 1.95262,5.11845 0,7.07107c-1.95262,1.95262 -5.11845,1.95262 -7.07107,0c-1.95262,-1.95262 -1.95262,-5.11845 0,-7.07107c1.95262,-1.95262 5.11845,-1.95262 7.07107,0"></path> - <path fill="none" stroke="#1B1B1B" stroke-linecap="round" stroke-linejoin="round" stroke-width="1" d="M16.5,19l1.083,1.083l-3.67503e-08,-3.66937e-08c0.195413,0.195112 0.511995,0.194868 0.707107,-0.000544702c0.0193082,-0.019338 0.0369986,-0.0402264 0.0528934,-0.0624552l2.157,-3.02"></path> - </g> -</svg> \ No newline at end of file +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="56" height="56" version="1.1" viewBox="0 0 56 56"><g><path fill="none" stroke="#1B1B1B" stroke-linecap="round" stroke-linejoin="round" stroke-width="1" d="M9.06066,17.9383c0.585786,0.585786 0.585786,1.53553 0,2.12132c-0.585786,0.585786 -1.53553,0.585786 -2.12132,0c-0.585786,-0.585786 -0.585786,-1.53553 0,-2.12132c0.585786,-0.585786 1.53553,-0.585786 2.12132,0" transform="scale(2.33333)"/><path fill="none" stroke="#1B1B1B" stroke-linecap="round" stroke-linejoin="round" stroke-width="1" d="M0.5,0.5h2.708l4.32338e-08,1.84377e-11c0.463907,0.00019785 0.866765,0.31942 0.973,0.771l3.819,16.229h4" transform="scale(2.33333)"/><path fill="none" stroke="#1B1B1B" stroke-linecap="round" stroke-linejoin="round" stroke-width="1" d="M21.984,11.046l1.077,-3.229l4.87377e-08,-1.45817e-07c0.175074,-0.523801 -0.107625,-1.09035 -0.631426,-1.26543c-0.102381,-0.0342195 -0.209627,-0.0516363 -0.317575,-0.0515743h-16.7" transform="scale(2.33333)"/><path fill="none" stroke="#1B1B1B" stroke-linecap="round" stroke-linejoin="round" stroke-width="1" d="M7.29,14.5h4.69" transform="scale(2.33333)"/><path fill="none" stroke="#1B1B1B" stroke-linecap="round" stroke-linejoin="round" stroke-width="1" d="M22.0355,14.9635c1.95262,1.95262 1.95262,5.11845 0,7.07107c-1.95262,1.95262 -5.11845,1.95262 -7.07107,0c-1.95262,-1.95262 -1.95262,-5.11845 0,-7.07107c1.95262,-1.95262 5.11845,-1.95262 7.07107,0" transform="scale(2.33333)"/><path fill="none" stroke="#1B1B1B" stroke-linecap="round" stroke-linejoin="round" stroke-width="1" d="M16.5,19l1.083,1.083l-3.67503e-08,-3.66937e-08c0.195413,0.195112 0.511995,0.194868 0.707107,-0.000544702c0.0193082,-0.019338 0.0369986,-0.0402264 0.0528934,-0.0624552l2.157,-3.02" transform="scale(2.33333)"/></g></svg> \ No newline at end of file diff --git a/Showcase/portal-user-examples/cms/cms_es.yaml b/Showcase/portal-user-examples/cms/cms_es.yaml index 19260975f15..bbe2968ce42 100644 --- a/Showcase/portal-user-examples/cms/cms_es.yaml +++ b/Showcase/portal-user-examples/cms/cms_es.yaml @@ -173,4 +173,4 @@ Processes: UserExampleGuide: comingSoon: Próximamente… description: '¡Bienvenido! En esta guía de ejemplo de usuario encontrará algunos procesos de demostración disponibles en el portal Axon Ivy. Simplemente haga clic en el enlace correspondiente abajo para obtener más información. ' - name: Guía para los ejemplos + name: Guía de ejemplos para el usuario diff --git a/Showcase/portal-user-examples/cms/cms_fr.yaml b/Showcase/portal-user-examples/cms/cms_fr.yaml index 93ef82d5a7e..780ad6f178e 100644 --- a/Showcase/portal-user-examples/cms/cms_fr.yaml +++ b/Showcase/portal-user-examples/cms/cms_fr.yaml @@ -156,10 +156,10 @@ Processes: name: Processus d'absence rejectedTask: Votre demande de congé est rejetée MarketingCampaign: - name: Marketing campaign coordination + name: Coordination des campagnes marketing Procurement: - name: Procurement + name: Approvisionnement UserExampleGuide: comingSoon: A venir… description: 'Bienvenue ! Dans ce guide d''exemple d''utilisateur, vous trouverez quelques processus de démonstration disponibles dans le Axon Ivy Portal. Il vous suffit de cliquer sur le lien correspondant ci-dessous pour obtenir plus d''informations. ' - name: Guide d'exemple d'utilisateur + name: Guide d'utilisation diff --git a/Showcase/portal-user-examples/pom.xml b/Showcase/portal-user-examples/pom.xml index c3de29d2f10..1933081090c 100644 --- a/Showcase/portal-user-examples/pom.xml +++ b/Showcase/portal-user-examples/pom.xml @@ -18,7 +18,7 @@ </distributionManagement> <properties> <ivy.engine.version>12.0.0</ivy.engine.version> - <build.plugin.version>12.0.0-SNAPSHOT</build.plugin.version> + <build.plugin.version>12.0.0</build.plugin.version> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> diff --git a/Showcase/portal-user-examples/processes/Start Processes/UserExampleGuide.p.json b/Showcase/portal-user-examples/processes/Start Processes/UserExampleGuide.p.json index da4de677535..b13a8331350 100644 --- a/Showcase/portal-user-examples/processes/Start Processes/UserExampleGuide.p.json +++ b/Showcase/portal-user-examples/processes/Start Processes/UserExampleGuide.p.json @@ -12,7 +12,7 @@ "signature" : "userExampleGuide", "request" : { "name" : "<%=ivy.cms.co(\"/Processes/UserExampleGuide/name\")%>", - "description" : "<%=ivy.cms.co(\"/Processes/UserExampleGuide/processDescription\")%>", + "description" : "<%=ivy.cms.co(\"/Processes/UserExampleGuide/description\")%>", "customFields" : [ { "name" : "cssIcon", "value" : "si si-help-wheel" }, { "name" : "processImage", "value" : "<%=ivy.cms.cr(\"/Images/process/HELPDESK2\")%>" } @@ -415,7 +415,7 @@ } ], "layout" : { "lanes" : [ { - "name" : "User example guide", + "name" : "<%=ivy.cms.co(\"/Processes/UserExampleGuide/name\")%>", "offset" : 32, "size" : 544, "lanes" : [ ] diff --git a/Showcase/portal-user-examples/src_hd/com/axonivy/portal/userexamples/ExampleHomePage/ExampleHomePage.xhtml b/Showcase/portal-user-examples/src_hd/com/axonivy/portal/userexamples/ExampleHomePage/ExampleHomePage.xhtml index 7a354ff3f73..6a359f625ca 100644 --- a/Showcase/portal-user-examples/src_hd/com/axonivy/portal/userexamples/ExampleHomePage/ExampleHomePage.xhtml +++ b/Showcase/portal-user-examples/src_hd/com/axonivy/portal/userexamples/ExampleHomePage/ExampleHomePage.xhtml @@ -4,8 +4,6 @@ xmlns:pe="http://primefaces.org/ui/extensions"> <h:body> <ui:composition template="/layouts/frame-10.xhtml"> - <ui:param name="items" value="#{exampleHomeBean.processes}" /> - <ui:param name="isFullScreen" value="false" /> <ui:define name="title">#{ivy.cms.co('/Processes/UserExampleGuide/name')}</ui:define> <ui:define name="content"> <h:outputStylesheet library="css" name="portal-root-variables.css" /> @@ -56,7 +54,15 @@ </ui:repeat> </h:form> </div> - + <!-- <script> + window.isWorkingOnATask = false; + window.announcementInvisible = false; + window.viewName="TASK_DETAIL"; + window.taskName = "hola"; + window.isHideCaseInfo = true; + window.isHideTaskAction = true; + </script> --> + <ic:com.axonivy.portal.components.IFrameTaskConfig isWorkingOnATask="false" viewName="PROCESS" taskName="#{ivy.cms.co('/Processes/UserExampleGuide/name')}" /> </ui:define> </ui:composition>