diff --git a/workflow/engine/content/translations/english/processmaker.en.po b/workflow/engine/content/translations/english/processmaker.en.po
index 7625ca94f..ed7fba400 100755
--- a/workflow/engine/content/translations/english/processmaker.en.po
+++ b/workflow/engine/content/translations/english/processmaker.en.po
@@ -19475,6 +19475,18 @@ msgstr "Successfully connected to MySQL Server"
msgid "My account"
msgstr "My account"
+# TRANSLATION
+# LABEL/ID_MY_CASES
+#: LABEL/ID_MY_CASES
+msgid "My Cases"
+msgstr "My Cases"
+
+# TRANSLATION
+# LABEL/ID_MY_DOCUMENTS
+#: LABEL/ID_MY_DOCUMENTS
+msgid "My Documents"
+msgstr "My Documents"
+
# TRANSLATION
# LABEL/ID_MY_DRAFTS
#: LABEL/ID_MY_DRAFTS
@@ -24977,6 +24989,12 @@ msgstr "Failed saving Supervisor Assigned to process"
msgid "Supervisor has been removed successfully from Process"
msgstr "Supervisor has been removed successfully from Process"
+# TRANSLATION
+# LABEL/ID_SUPERVISOR_TASKS
+#: LABEL/ID_SUPERVISOR_TASKS
+msgid "Supervisor Tasks"
+msgstr "Supervisor Tasks"
+
# TRANSLATION
# LABEL/ID_SUPERVISOR_UNAVAILABLE
#: LABEL/ID_SUPERVISOR_UNAVAILABLE
@@ -25241,6 +25259,12 @@ msgstr "Overdue"
msgid "Task properties has been saved successfully"
msgstr "Task properties has been saved successfully"
+# TRANSLATION
+# LABEL/ID_TASK_REASSIGNMENTS
+#: LABEL/ID_TASK_REASSIGNMENTS
+msgid "Task Reassignments"
+msgstr "Task Reassignments"
+
# TRANSLATION
# LABEL/ID_TASK_TRANSFER
#: LABEL/ID_TASK_TRANSFER
diff --git a/workflow/engine/data/mysql/insert.sql b/workflow/engine/data/mysql/insert.sql
index c7d1cd93a..eb00051a6 100755
--- a/workflow/engine/data/mysql/insert.sql
+++ b/workflow/engine/data/mysql/insert.sql
@@ -60135,6 +60135,8 @@ INSERT INTO TRANSLATION (TRN_CATEGORY,TRN_ID,TRN_LANG,TRN_VALUE,TRN_UPDATE_DATE
( 'LABEL','ID_MYSQL_ERROR','en','MySQL error: {0}','2014-01-15') ,
( 'LABEL','ID_MYSQL_SUCCESS_CONNECT','en','Successfully connected to MySQL Server','2015-04-08') ,
( 'LABEL','ID_MY_ACCOUNT','en','My account','2014-01-15') ,
+( 'LABEL','ID_MY_CASES','en','My Cases','2020-12-07') ,
+( 'LABEL','ID_MY_DOCUMENTS','en','My Documents','2014-12-07') ,
( 'LABEL','ID_MY_DRAFTS','en','My Drafts','2014-01-15') ,
( 'LABEL','ID_MY_INBOX','en','My inbox','2014-01-15') ,
( 'LABEL','ID_NAME','en','Name','2014-01-15') ,
@@ -61080,6 +61082,7 @@ INSERT INTO TRANSLATION (TRN_CATEGORY,TRN_ID,TRN_LANG,TRN_VALUE,TRN_UPDATE_DATE
( 'LABEL','ID_SUPERVISOR_DOES_NOT_HAVE_DYNAFORMS','en','Supervisor does not have a permission for Dynaform(s).','2015-05-28') ,
( 'LABEL','ID_SUPERVISOR_FAILED','en','Failed saving Supervisor Assigned to process','2014-01-15') ,
( 'LABEL','ID_SUPERVISOR_REMOVED','en','Supervisor has been removed successfully from Process','2014-01-15') ,
+( 'LABEL','ID_SUPERVISOR_TASKS','en','Supervisor Tasks','2020-12-07') ,
( 'LABEL','ID_SUPERVISOR_UNAVAILABLE','en','No supervisors are available. All supervisors have been already assigned.','2014-01-15') ,
( 'LABEL','ID_SUPPORT','en','Support','2014-10-20') ,
( 'LABEL','ID_SWITCH_EDITOR','en','Switch Editor','2014-01-15') ,
@@ -61126,6 +61129,7 @@ INSERT INTO TRANSLATION (TRN_CATEGORY,TRN_ID,TRN_LANG,TRN_VALUE,TRN_UPDATE_DATE
( 'LABEL','ID_TASK_NO_STEPS','en','The task doesn''t have any steps','2014-01-15') ,
( 'LABEL','ID_TASK_OVERDUE','en','Overdue','2015-06-09') ,
( 'LABEL','ID_TASK_PROPERTIES_SAVE','en','Task properties has been saved successfully','2014-01-15') ,
+( 'LABEL','ID_TASK_REASSIGNMENTS','en','Task Reassignments','2020-12-07') ,
( 'LABEL','ID_TASK_TRANSFER','en','Task Transfer Date','2014-01-15') ,
( 'LABEL','ID_TASK_WAS_ASSIGNED_TO_USER','en','Manual assignment shouldn''t be used with sub-processes.
The task "{0}" from case {1} was assigned to user {2} ( {3} {4} )','2015-02-24') ,
( 'LABEL','ID_TAS_DURATION_REQUIRE','en','Duration task required','2014-0f-15') ,
diff --git a/workflow/engine/menus/home.php b/workflow/engine/menus/home.php
new file mode 100644
index 000000000..b5b8f23b6
--- /dev/null
+++ b/workflow/engine/menus/home.php
@@ -0,0 +1,84 @@
+AddIdRawOption('SEARCHS', '', G::LoadTranslation('ID_HOME'), '', '', 'blockHeader');
+$G_TMP_MENU->AddIdRawOption(
+ 'CASES_MY_CASES',
+ '/',
+ G::LoadTranslation('ID_MY_CASES'),
+ 'fas fa-sliders-h'
+);
+if ($RBAC->userCanAccess('PM_ALLCASES') == 1) {
+ $G_TMP_MENU->AddIdRawOption(
+ 'CASES_SEARCH',
+ 'casesListExtJs?action=search',
+ G::LoadTranslation('ID_ADVANCEDSEARCH'),
+ 'fas fa-search'
+ );
+}
+
+
+// Tasks section
+$G_TMP_MENU->AddIdRawOption('FOLDERS', '', G::LoadTranslation('ID_TASKS'), '', '', 'blockHeader');
+$G_TMP_MENU->AddIdRawOption(
+ 'CASES_INBOX',
+ 'casesListExtJs?action=todo',
+ G::LoadTranslation('ID_INBOX'),
+ 'far fa-check-circle'
+);
+$G_TMP_MENU->AddIdRawOption(
+ 'CASES_DRAFT',
+ 'casesListExtJs?action=draft',
+ G::LoadTranslation('ID_DRAFT'),
+ 'far fa-edit'
+);
+$G_TMP_MENU->AddIdRawOption(
+ 'CASES_PAUSED',
+ 'casesListExtJs?action=paused',
+ G::LoadTranslation('ID_PAUSED'),
+ 'far fa-pause-circle'
+);
+$G_TMP_MENU->AddIdRawOption(
+ 'CASES_SELFSERVICE',
+ 'casesListExtJs?action=selfservice',
+ G::LoadTranslation('ID_UNASSIGNED'),
+ 'fas fa-crosshairs'
+);
+
+
+// Supervisor Tasks section
+$G_TMP_MENU->AddIdRawOption('ADMIN', '', G::LoadTranslation('ID_SUPERVISOR_TASKS'), '', '', 'blockHeader');
+/*----------------------------------********---------------------------------*/
+$licensedFeatures = PMLicensedFeatures::getSingleton();
+if ($licensedFeatures->verifyfeature('7TTeDBQeWRoZTZKYjh4eFpYUlRDUUEyVERPU3FxellWank=')) {
+ $G_TMP_MENU->AddIdRawOption(
+ 'CONSOLIDATED_CASES',
+ 'casesConsolidatedListExtJs?action=consolidated',
+ G::LoadTranslation('ID_BATCH_ROUTING'),
+ 'fas fa-bars'
+ );
+}
+/*----------------------------------********---------------------------------*/
+if ($RBAC->userCanAccess('PM_REASSIGNCASE') == 1 || $RBAC->userCanAccess('PM_REASSIGNCASE_SUPERVISOR') == 1) {
+ $G_TMP_MENU->AddIdRawOption(
+ 'CASES_TO_REASSIGN',
+ 'casesListExtJs?action=to_reassign',
+ G::LoadTranslation('ID_TASK_REASSIGNMENTS'),
+ 'fas fa-arrows-alt'
+ );
+}
+
+
+// Documents section
+if ($RBAC->userCanAccess('PM_FOLDERS_ALL') == 1 || $RBAC->userCanAccess('PM_FOLDERS_OWNER') == 1) {
+ $G_TMP_MENU->AddIdRawOption('DOCUMENTS', '', G::LoadTranslation('ID_FOLDERS'), '', '', 'blockHeader');
+ $G_TMP_MENU->AddIdRawOption(
+ 'CASES_FOLDERS',
+ 'casesStartPage?action=documents',
+ G::LoadTranslation('ID_MY_DOCUMENTS'),
+ 'fas fa-bars'
+ );
+}
diff --git a/workflow/engine/src/ProcessMaker/Services/Api/Home.php b/workflow/engine/src/ProcessMaker/Services/Api/Home.php
index c1543d20c..c450ce729 100644
--- a/workflow/engine/src/ProcessMaker/Services/Api/Home.php
+++ b/workflow/engine/src/ProcessMaker/Services/Api/Home.php
@@ -4,7 +4,9 @@ namespace ProcessMaker\Services\Api;
use Exception;
use Luracast\Restler\RestException;
+use Menu;
use ProcessMaker\BusinessModel\Cases\Draft;
+use ProcessMaker\BusinessModel\Cases\Filter;
use ProcessMaker\BusinessModel\Cases\Inbox;
use ProcessMaker\BusinessModel\Cases\Participated;
use ProcessMaker\BusinessModel\Cases\Paused;
@@ -14,6 +16,7 @@ use ProcessMaker\BusinessModel\Cases\Unassigned;
use ProcessMaker\Model\User;
use ProcessMaker\Services\Api;
use RBAC;
+use stdClass;
class Home extends Api
{
@@ -460,4 +463,75 @@ class Home extends Api
throw new RestException(Api::STAT_APP_EXCEPTION, $e->getMessage());
}
}
+
+ /**
+ * Get home menu
+ *
+ * @url GET /menu
+ *
+ * @return array
+ *
+ * @access protected
+ */
+ public function getMenu()
+ {
+ // Parse menu definition
+ $menuInstance = new Menu();
+ $menuInstance->load('home');
+
+ // Initializing variables
+ $optionsWithCounter = ['CASES_INBOX', 'CASES_DRAFT', 'CASES_PAUSED', 'CASES_SELFSERVICE'];
+ $menuHome = [];
+
+ // Build the Home menu
+ for ($i = 0; $i < count($menuInstance->Options); $i++) {
+ // Initializing option object
+ $option = new stdClass();
+
+ // Build the object according to the option menu type
+ if ($menuInstance->Types[$i] === 'blockHeader') {
+ $option->header = true;
+ $option->title = $menuInstance->Labels[$i];
+ $option->hiddenOnCollapse = true;
+ } else {
+ $option->href = $menuInstance->Options[$i];
+ $option->id = $menuInstance->Id[$i];
+ $option->title = $menuInstance->Labels[$i];
+ $option->icon = $menuInstance->Icons[$i];
+ }
+
+ // Add additional attributes for some options
+ if (in_array($menuInstance->Id[$i], $optionsWithCounter)) {
+ $option->badge = new stdClass();
+ $option->badge->text = '0';
+ $option->badge->class = 'badge-custom';
+ }
+ if ($menuInstance->Id[$i] === 'CASES_SEARCH') {
+ // Get advanced search filters for the current user
+ $filters = Filter::getByUser($this->getUserId());
+
+ // Initializing
+ $child = [];
+ foreach ($filters as $filter) {
+ $childFilter = new stdClass();
+ $childFilter->id = $filter->id;
+ $childFilter->page = '/advanced-search';
+ $childFilter->href = "{$childFilter->page}/{$filter->id}";
+ $childFilter->title = $filter->name;
+ $childFilter->icon = 'fas fa-circle';
+ $childFilter->filters = $filter->filters;
+ $child[] = $childFilter;
+ }
+
+ // Adding filters to the "Advanced Search" option
+ $option->child = $child;
+ }
+
+ // Add option to the menu
+ $menuHome[] = $option;
+ }
+
+ // Return menu
+ return $menuHome;
+ }
}