Skip to content

FOUR-16140: Start on Mobile Process Browser option #6898

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 6 commits into from
Jun 3, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions ProcessMaker/Helpers/MobileHelper.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,9 @@ public static function isMobile($userAgent)

return false;
}

public static function detectMobile()
{
return isset($_SERVER['HTTP_USER_AGENT']) && self::isMobile($_SERVER['HTTP_USER_AGENT']);
}
}
12 changes: 7 additions & 5 deletions ProcessMaker/Http/Controllers/Api/ProcessLaunchpadController.php
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,9 @@ public function getProcesses(Request $request)
$processes = Process::nonSystem()->active();
// Filter by category
$category = $request->input('category', null);
if (!empty($category)) {
if ($category === 'recent') {
$processes->orderByRecentRequests();
} elseif (!empty($category)) {
$processes->processCategory($category);
}
// Filter pmql
Expand All @@ -44,6 +46,7 @@ public function getProcesses(Request $request)
// Get the processes
$processes = $processes
->select('processes.*')
->withRequestCount()
->orderBy('processes.name', 'asc')
->paginate($perPage);

Expand Down Expand Up @@ -120,9 +123,9 @@ public function destroy(ProcessLaunchpad $launch)
return response([], 204);
}

/**
* Store the elements related to the carousel [IMAGE, EMBED URL]
*/
/**
* Store the elements related to the carousel [IMAGE, EMBED URL]
*/
public function saveContentCarousel(Request $request, Process $process)
{
$contentCarousel = $request->input('imagesCarousel');
Expand All @@ -144,7 +147,6 @@ public function saveContentCarousel(Request $request, Process $process)
// Nothing
break;
}

}
}
}
Expand Down
14 changes: 11 additions & 3 deletions ProcessMaker/Http/Controllers/ProcessesCatalogueController.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,13 @@
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use ProcessMaker\Events\ScreenBuilderStarting;
use ProcessMaker\Helpers\MobileHelper;
use ProcessMaker\Http\Controllers\Controller;
use ProcessMaker\Managers\ScreenBuilderManager;
use ProcessMaker\Models\Process;
use ProcessMaker\Models\Bookmark;
use ProcessMaker\Models\ProcessLaunchpad;
use ProcessMaker\Models\Process;
use ProcessMaker\Models\ProcessCategory;
use ProcessMaker\Models\ProcessLaunchpad;
use ProcessMaker\Traits\HasControllerAddons;

/**
Expand All @@ -22,7 +23,7 @@
class ProcessesCatalogueController extends Controller
{
use HasControllerAddons;

public function index(Request $request, Process $process = null)
{
$manager = app(ScreenBuilderManager::class);
Expand All @@ -33,6 +34,13 @@ public function index(Request $request, Process $process = null)
$process->launchpad = ProcessLaunchpad::getLaunchpad(true, $process->id);
$process->bookmark_id = Bookmark::getBookmarked(true, $process->id, $currentUser['id']);
}

if (MobileHelper::detectMobile()) {
$title = __('Process Browser');

return view('processes-catalogue.mobile', compact('title', 'process', 'currentUser', 'manager'));
}

return view('processes-catalogue.index', compact('process', 'currentUser', 'manager'));
}
}
76 changes: 53 additions & 23 deletions ProcessMaker/Models/Process.php
Original file line number Diff line number Diff line change
Expand Up @@ -1162,29 +1162,34 @@ public function manageCustomRoutes()
break;

default:
if ($webEntryProperties->webentryRouteConfig->firstUrlSegment !== '') {
$webentryRouteConfig = $webEntryProperties->webentryRouteConfig;
try {
WebentryRoute::updateOrCreate(
[
'process_id' => $this->id,
'node_id' => $webentryRouteConfig->nodeId,
],
[
'first_segment' => $webentryRouteConfig->firstUrlSegment,
'params' => $webentryRouteConfig->parameters,
]
);
} catch (\Exception $e) {
\Log::info('*** Error: ' . $e->getMessage());
}
}
$this->manageWebentryRoute($webEntryProperties);
break;
}
}
}
}

private function manageWebentryRoute($webEntryProperties)
{
if ($webEntryProperties->webentryRouteConfig->firstUrlSegment !== '') {
$webentryRouteConfig = $webEntryProperties->webentryRouteConfig;
try {
WebentryRoute::updateOrCreate(
[
'process_id' => $this->id,
'node_id' => $webentryRouteConfig->nodeId,
],
[
'first_segment' => $webentryRouteConfig->firstUrlSegment,
'params' => $webentryRouteConfig->parameters,
]
);
} catch (Exception $e) {
\Log::info('*** Error: ' . $e->getMessage());
}
}
}

/**
* Get node element attributes
*
Expand Down Expand Up @@ -1250,7 +1255,7 @@ private function getStartEventPermissions(User $user)
/**
* Process events relationship.
*
* @return \ProcessMaker\Models\ProcessEvents
* @return ProcessEvents
*/
public function events()
{
Expand Down Expand Up @@ -1287,7 +1292,7 @@ public function launchpad()
/**
* Assignments of the process.
*
* @return \Illuminate\Database\Eloquent\Relations\HasMany
* @return HasMany
*/
public function assignments()
{
Expand Down Expand Up @@ -1616,7 +1621,7 @@ private function validateSchema(BpmnDocument $document)
private function deleteUnusedCustomRoutes($url, $processId, $nodeId)
{
// Delete unused custom routes
$customRoute = webentryRoute::where('process_id', $processId)->where('node_id', $nodeId)->first();
$customRoute = WebentryRoute::where('process_id', $processId)->where('node_id', $nodeId)->first();
if ($customRoute) {
$customRoute->delete();
}
Expand Down Expand Up @@ -1751,9 +1756,9 @@ public function scopeFilter($query, $filterStr)
->orWhere('processes.description', 'like', $filter)
->orWhere('processes.status', '=', $filterStr)
->orWhereHas('user', function ($query) use ($filter) {
$query->where('firstname', 'like', $filter)
->orWhere('lastname', 'like', $filter);
})
$query->where('firstname', 'like', $filter)
->orWhere('lastname', 'like', $filter);
})
->orWhereIn('processes.id', function ($qry) use ($filter) {
$qry->select('assignable_id')
->from('category_assignments')
Expand Down Expand Up @@ -1797,4 +1802,29 @@ public function hasAlternative()
{
return true;
}

public function scopeOrderByRecentRequests($query)
{
return $query->orderByDesc(
ProcessRequest::select('id')
// User has participated
->whereHas('tokens', function ($q) {
$q->where('user_id', Auth::user()->id);
})
->whereColumn('process_id', 'processes.id')
->orderByDesc('id') // using ID because created_at is not indexed
->limit(1)
);
}

public function scopeWithRequestCount($query)
{
return $query->withCount(['requests' => function ($query) {
return $query->where('status', 'ACTIVE')
// User has participated
->whereHas('tokens', function ($q) {
$q->where('user_id', Auth::user()->id);
});
}]);
}
}
11 changes: 11 additions & 0 deletions resources/js/app-layout.js
Original file line number Diff line number Diff line change
Expand Up @@ -222,6 +222,17 @@ if (isMobileNavbar === "true") {
return {
};
},
computed: {
visible() {



// wont work because of replaceState. Maybe replace state listener???

// Do not show on process details page
return !(/process-browser\/\d+/.test(window.location.href));
}
},
mounted() {
if (this.$cookies.get("firstMounted") === "true") {
$("#welcomeModal").modal("show");
Expand Down
8 changes: 7 additions & 1 deletion resources/js/processes-catalogue/components/CardProcess.vue
Original file line number Diff line number Diff line change
Expand Up @@ -154,10 +154,16 @@ export default {
};
</script>

<style>
<style scoped lang="scss">

@import '~styles/variables';
.processList {
display: flex;
flex-wrap: wrap;

@media (max-width: $lp-breakpoint) {
display: block;
}
}
.text-custom {
color: #1572C2;
Expand Down
Loading
Loading