diff --git a/ProcessMaker/Console/Commands/SyncTranslations.php b/ProcessMaker/Console/Commands/SyncTranslations.php index ff185d5d44..2a02052218 100644 --- a/ProcessMaker/Console/Commands/SyncTranslations.php +++ b/ProcessMaker/Console/Commands/SyncTranslations.php @@ -40,9 +40,9 @@ public function handle() //Search files $this->listFiles($translationsCore . '/lang'); - //updating languages by default + // updating languages by default foreach ($this->files as $pathFile) { - if (!(str_contains($pathFile, '.json') || str_contains($pathFile, '.php'))) { + if (!(str_contains($pathFile, '.json') || str_contains($pathFile, '.php')) || str_contains($pathFile, '.bak.')) { continue; } // updating resources/lang @@ -57,13 +57,9 @@ public function handle() $this->files = []; $translationsCore = app()->basePath() . '/resources/lang'; $this->listFiles($translationsCore); - $filesIgnore = ['/fr/', '/de/', '/en/', '/es/', '.gitignore', '/en.json', '/es.json', '/de.json', '/fr.json']; foreach ($this->files as $pathFile) { - // ignore languages by default - foreach ($filesIgnore as $value) { - if (str_contains($pathFile, $value)) { - continue 2; - } + if (!(str_contains($pathFile, '.json') || str_contains($pathFile, '.php')) || str_contains($pathFile, '.bak.')) { + continue; } // updating resources/lang $backup = str_replace('/resources/', '/resources-core/', preg_replace('/(?<=lang).+?(?=json)/', '/en.', $pathFile)); @@ -98,14 +94,14 @@ public function handle() $this->listFiles($translationsPackage . '/lang-' . last($package)); $existsLangOrig = $this->fileExists($translationsPackage . '/lang.orig-' . last($package)); foreach ($this->files as $pathFile) { - if (!str_contains($pathFile, '.json')) { + if (!str_contains($pathFile, '.json') || str_contains($pathFile, '.bak.')) { continue; } // updating resources/lang - $this->syncFile($pathFile, $pathPackage . '/en.json', true); + $this->syncFile($pathFile, $pathPackage . '/en.json'); if ($existsLangOrig) { // updating resources/lang.orig - $this->syncFile(str_replace('/lang-', '/lang.orig-', $pathFile), $pathPackage . '/en.json', true); + $this->syncFile(str_replace('/lang-', '/lang.orig-', $pathFile), $pathPackage . '/en.json'); } } @@ -163,46 +159,112 @@ private function parseFile($path) return collect($lines); } - private function syncFile($target, $backup, $package = false) + /** + * Synchronize translations between target and backup files + * + * @param string $target Path to target file + * @param string $backup Path to backup file + * @return bool + * @throws \Exception + */ + private function syncFile($target, $backup) { - $pathInfo = pathinfo($target); - $targetTranslations = $this->parseFile($target); - $origin = $this->parseFile($backup); + if (str_contains($target, '.bak.')) { + // Clean up old backup if everything succeeded + if (file_exists($target)) { + unlink($target); + $this->info('Removed bak: ' . $target); + } + $this->info("Skipping backup file: {$target}"); - if ($package) { - $filesIgnore = ['/en.json']; - } else { - $filesIgnore = ['/fr/', '/de/', '/en/', '/es/', '/en.json', '/es.json', '/de.json', '/fr.json']; + return true; } - $clear = true; - foreach ($filesIgnore as $value) { - if (str_contains($target, $value)) { - $clear = false; - continue; + // Create backup before modifications + $backupPath = $target . '.bak.' . date('Y-m-d-His'); + try { + if (!copy($target, $backupPath)) { + $this->error("Failed to create backup file: {$backupPath}"); + + return false; } + $this->info("Backup created: {$backupPath}"); + } catch (\Exception $e) { + $this->error('Error creating backup: ' . $e->getMessage()); + + return false; } - if ($clear) { - $diff = $origin->diffKeys($targetTranslations); + $pathInfo = pathinfo($target); - $targetTranslations = $diff->map(function () { - return ''; - }); + try { + $targetTranslations = $this->parseFile($target); + $origin = $this->parseFile($backup); + } catch (\Exception $e) { + $this->error('Error parsing files: ' . $e->getMessage()); + + return false; } - $merged = $origin->merge($targetTranslations); - // search empty values - // send values to openAI. - $contents = $this->generateFile($merged, $pathInfo['extension']); + // Solo obtener las claves que están en origin pero no en target + $diff = $origin->diffKeys($targetTranslations); - file_put_contents($target, $contents); - $this->info($target . ' Saved'); + if ($diff->isNotEmpty()) { + $this->info('Found ' . $diff->count() . " new translations to add in {$target}"); + + // only files en.json to en.json have translations others are empty + $clear = true; + if (str_contains($target, 'en.json') && str_contains($backup, 'en.json')) { + $clear = false; + } - if ($pathInfo['extension'] == 'php') { - $this->clearCache(); + // Agregar solo las nuevas claves al targetTranslations + foreach ($diff as $key => $value) { + $targetTranslations[$key] = $clear ? '' : $value; + } } - return true; + try { + $contents = $this->generateFile($targetTranslations, $pathInfo['extension']); + + // Validate content before saving + if (empty($contents)) { + throw new \Exception('Generated content is empty'); + } + + // Use atomic file writing + $tempFile = $target . '.tmp'; + if (file_put_contents($tempFile, $contents) === false) { + throw new \Exception('Failed to write temporary file'); + } + + if (!rename($tempFile, $target)) { + unlink($tempFile); + throw new \Exception('Failed to move temporary file'); + } + + $this->info("Successfully updated: {$target}"); + + // Clean up old backup if everything succeeded + if (file_exists($backupPath)) { + unlink($backupPath); + $this->info('Removed backup file after successful update'); + } + + if ($pathInfo['extension'] == 'php') { + $this->clearCache(); + } + + return true; + } catch (\Exception $e) { + // Restore from backup if something went wrong + if (file_exists($backupPath)) { + copy($backupPath, $target); + $this->info('Restored from backup due to error'); + } + $this->error('Error saving file: ' . $e->getMessage()); + + return false; + } } private function generateFile($lines, $type) diff --git a/ProcessMaker/Enums/ExporterMap.php b/ProcessMaker/Enums/ExporterMap.php index 2775b68b2f..20ce1ca0b5 100644 --- a/ProcessMaker/Enums/ExporterMap.php +++ b/ProcessMaker/Enums/ExporterMap.php @@ -13,6 +13,7 @@ enum ExporterMap 'process_templates' => [\ProcessMaker\Models\ProcessTemplates::class, \ProcessMaker\ImportExport\Exporters\TemplateExporter::class], 'data_source' => [\ProcessMaker\Packages\Connectors\DataSources\Models\DataSource::class, \ProcessMaker\Packages\Connectors\DataSources\ImportExport\DataSourceExporter::class], 'decision_table' => [\ProcessMaker\Package\PackageDecisionEngine\Models\DecisionTable::class, \ProcessMaker\Package\PackageDecisionEngine\ImportExport\DecisionTableExporter::class], + 'collection' => [\ProcessMaker\Plugins\Collections\Models\Collection::class, \ProcessMaker\Plugins\Collections\ImportExport\CollectionExporter::class], 'flow_genie' => [ \ProcessMaker\Package\PackageAi\Models\FlowGenie::class, \ProcessMaker\Package\PackageAi\ImportExport\FlowGenieExporter::class, diff --git a/ProcessMaker/Filters/BaseFilter.php b/ProcessMaker/Filters/BaseFilter.php index 966ba9b76b..66b245d06a 100644 --- a/ProcessMaker/Filters/BaseFilter.php +++ b/ProcessMaker/Filters/BaseFilter.php @@ -27,6 +27,8 @@ abstract class BaseFilter public const TYPE_PROCESS = 'Process'; + public const TYPE_PROCESS_NAME = 'ProcessName'; + public const TYPE_RELATIONSHIP = 'Relationship'; public string|null $subjectValue; @@ -96,6 +98,8 @@ private function apply($query): void $this->valueAliasAdapter($valueAliasMethod, $query); } elseif ($this->subjectType === self::TYPE_PROCESS) { $this->filterByProcessId($query); + } elseif ($this->subjectType === self::TYPE_PROCESS_NAME) { + $this->filterByProcessName($query); } elseif ($this->subjectType === self::TYPE_RELATIONSHIP) { $this->filterByRelationship($query); } elseif ($this->isJsonData() && $query->getModel() instanceof ProcessRequestToken) { @@ -224,6 +228,10 @@ private function subject() return $this->relationshipSubjectTypeParts()[1]; } + if ($this->subjectType === self::TYPE_PROCESS_NAME) { + return 'name'; + } + return $this->subjectValue; } @@ -298,6 +306,18 @@ private function filterByProcessId(Builder $query): void } } + private function filterByProcessName(Builder $query): void + { + if ($query->getModel() instanceof ProcessRequestToken) { + $query->whereIn('process_request_id', function ($query) { + $query->select('id')->from('process_requests'); + $this->applyQueryBuilderMethod($query); + }); + } else { + $query->whereIn('name', (array) $this->value()); + } + } + private function filterByRelationship(Builder $query): void { $relationshipName = $this->relationshipSubjectTypeParts()[0]; diff --git a/ProcessMaker/Http/Controllers/Api/SecurityLogController.php b/ProcessMaker/Http/Controllers/Api/SecurityLogController.php index ea1b6ccccf..7491b94cbb 100644 --- a/ProcessMaker/Http/Controllers/Api/SecurityLogController.php +++ b/ProcessMaker/Http/Controllers/Api/SecurityLogController.php @@ -81,9 +81,16 @@ public function index(Request $request) $query->pmql($pmql); } + // Get total + $totalCount = $query->count(); + + // Always paginate using query object instead "ApiCollection" class + $query->paginate($request->input('per_page', 10)); + + // Get records $response = $query->get(); - return new ApiCollection($response); + return new ApiCollection($response, $totalCount); } /** diff --git a/ProcessMaker/Jobs/RunServiceTask.php b/ProcessMaker/Jobs/RunServiceTask.php index e9a6fcad57..76ce0c9746 100644 --- a/ProcessMaker/Jobs/RunServiceTask.php +++ b/ProcessMaker/Jobs/RunServiceTask.php @@ -2,6 +2,7 @@ namespace ProcessMaker\Jobs; +use Exception; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Support\Facades\Log; use ProcessMaker\Exception\ConfigurationException; @@ -127,8 +128,11 @@ public function action(ProcessRequestToken $token = null, ServiceTaskInterface $ $error->setName($message); $token->setProperty('error', $error); - $exceptionClass = get_class($exception); - $modifiedException = new $exceptionClass($message); + if ($message !== $exception->getMessage()) { + $modifiedException = new Exception($message, $exception->getCode(), $exception); + } else { + $modifiedException = $exception; + } $token->logError($modifiedException, $element); Log::error('Service task failed: ' . $implementation . ' - ' . $message); diff --git a/ProcessMaker/Traits/TaskControllerIndexMethods.php b/ProcessMaker/Traits/TaskControllerIndexMethods.php index 8fa0d17d24..078843c950 100644 --- a/ProcessMaker/Traits/TaskControllerIndexMethods.php +++ b/ProcessMaker/Traits/TaskControllerIndexMethods.php @@ -320,7 +320,7 @@ private function applyForCurrentUser($query, $user) ->orWhereIn('id', $user->availableSelfServiceTaskIds()); }); } - + public function applyProcessManager($query, $user) { $ids = Process::select(['id']) @@ -329,7 +329,7 @@ public function applyProcessManager($query, $user) ->get() ->toArray(); - $query->orWhere(function ($query) use ($ids) { + $query->where(function ($query) use ($ids) { $query->whereIn('process_request_tokens.process_id', array_column($ids, 'id')) ->where('process_request_tokens.status', 'ACTIVE'); }); diff --git a/composer.json b/composer.json index 5180ea0eec..705309f357 100644 --- a/composer.json +++ b/composer.json @@ -1,6 +1,6 @@ { "name": "processmaker/processmaker", - "version": "4.12.0+beta-4", + "version": "4.12.0", "description": "BPM PHP Software", "keywords": [ "php bpm processmaker" @@ -107,11 +107,11 @@ "Gmail" ], "processmaker": { - "build": "c88ca571", + "build": "fe0627fe", "cicd-enabled": true, "custom": { - "package-ellucian-ethos": "dev-release-2024-fall", - "package-plaid": "dev-release-2024-fall", + "package-ellucian-ethos": "1.17.0", + "package-plaid": "1.6.0", "paypal-package": "dev-fall", "pps-adsync": "dev-fall", "ps_ethos": "dev-fall", @@ -137,54 +137,54 @@ "pm-platform": "dev-fall", "package-zj-nas": "dev-fall", "package-plg": "dev-release-2024-fall", - "package-accessibility": "dev-release-2024-fall" + "package-accessibility": "1.0.0" }, "enterprise": { - "connector-docusign": "dev-release-2024-fall", - "connector-idp": "dev-release-2024-fall", - "connector-pdf-print": "dev-release-2024-fall", - "connector-send-email": "dev-release-2024-fall", - "connector-slack": "dev-release-2024-fall", - "docker-executor-cdata": "dev-release-2024-fall", - "docker-executor-node-ssr": "dev-release-2024-fall", - "package-ab-testing": "dev-release-2024-fall", - "package-actions-by-email": "dev-release-2024-fall", - "package-advanced-user-manager": "dev-release-2024-fall", - "package-ai": "dev-release-2024-fall", - "package-analytics-reporting": "dev-release-2024-fall", - "package-auth": "dev-release-2024-fall", - "package-cdata": "dev-release-2024-fall", - "package-collections": "dev-release-2024-fall", - "package-comments": "dev-release-2024-fall", - "package-conversational-forms": "dev-release-2024-fall", - "package-data-sources": "dev-release-2024-fall", - "package-decision-engine": "dev-release-2024-fall", - "package-dynamic-ui": "dev-release-2024-fall", - "package-files": "dev-release-2024-fall", - "package-googleplaces": "dev-release-2024-fall", - "package-photo-video": "dev-release-2024-fall", - "package-pm-blocks": "dev-release-2024-fall", - "package-process-documenter": "dev-release-2024-fall", - "package-process-optimization": "dev-release-2024-fall", - "package-product-analytics": "dev-release-2024-fall", - "package-projects": "dev-release-2024-fall", - "package-rpa": "dev-release-2024-fall", - "package-savedsearch": "dev-release-2024-fall", - "package-slideshow": "dev-release-2024-fall", - "package-sentry": "dev-release-2024-fall", - "package-signature": "dev-release-2024-fall", - "package-testing": "dev-release-2024-fall", - "package-translations": "dev-release-2024-fall", - "package-versions": "dev-release-2024-fall", - "package-vocabularies": "dev-release-2024-fall", - "package-webentry": "dev-release-2024-fall", - "package-api-testing": "dev-release-2024-fall", + "connector-docusign": "1.10.0", + "connector-idp": "1.13.0", + "connector-pdf-print": "1.19.0", + "connector-send-email": "1.30.0", + "connector-slack": "1.9.0", + "docker-executor-cdata": "1.6.0", + "docker-executor-node-ssr": "1.7.0", + "package-ab-testing": "1.3.0", + "package-actions-by-email": "1.20.0", + "package-advanced-user-manager": "1.11.0", + "package-ai": "1.12.0", + "package-analytics-reporting": "1.9.0", + "package-auth": "1.22.0", + "package-cdata": "1.4.5", + "package-collections": "2.20.0", + "package-comments": "1.15.0", + "package-conversational-forms": "1.11.0", + "package-data-sources": "1.30.0", + "package-decision-engine": "1.12.0", + "package-dynamic-ui": "1.24.0", + "package-files": "1.19.0", + "package-googleplaces": "1.12.0", + "package-photo-video": "1.6.0", + "package-pm-blocks": "1.9.0", + "package-process-documenter": "1.11.0", + "package-process-optimization": "1.10.0", + "package-product-analytics": "1.5.8", + "package-projects": "1.7.0", + "package-rpa": "1.1.0", + "package-savedsearch": "1.38.0", + "package-slideshow": "1.2.0", + "package-sentry": "1.10.0", + "package-signature": "1.14.0", + "package-testing": "1.6.1", + "package-translations": "2.12.0", + "package-versions": "1.13.0", + "package-vocabularies": "2.16.0", + "package-webentry": "2.26.0", + "package-api-testing": "1.1.0", "packages": "^0" }, "docker-executors": { - "docker-executor-java": "dev-release-2024-fall", - "docker-executor-python": "dev-release-2024-fall", - "docker-executor-csharp": "dev-release-2024-fall" + "docker-executor-java": "1.0.4", + "docker-executor-python": "1.0.1", + "docker-executor-csharp": "1.0.2" }, "microservices": { "pmai": "fall-2023" diff --git a/composer.lock b/composer.lock index 84ed94f024..0cf34435e0 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "4addc39de26b735c2f01cd52a3c89941", + "content-hash": "e2a1e8c8a231f9f6f1d47918f77f9694", "packages": [ { "name": "aws/aws-crt-php", diff --git a/database/seeders/PermissionSeeder.php b/database/seeders/PermissionSeeder.php index 8acb45e4da..7ba4437677 100644 --- a/database/seeders/PermissionSeeder.php +++ b/database/seeders/PermissionSeeder.php @@ -3,9 +3,7 @@ namespace Database\Seeders; use Illuminate\Database\Seeder; -use ProcessMaker\Models\Group; use ProcessMaker\Models\Permission; -use ProcessMaker\Models\User; class PermissionSeeder extends Seeder { @@ -118,24 +116,16 @@ class PermissionSeeder extends Seeder ], ]; - private $defaultPermissions = [ - 'view-my_requests', - ]; - public function run($seedUser = null) { foreach ($this->permissionGroups as $groupName => $permissions) { foreach ($permissions as $permissionString) { - $permission = Permission::updateOrCreate([ + Permission::updateOrCreate([ 'name' => $permissionString, ], [ 'title' => ucwords(preg_replace('/(\-|_)/', ' ', $permissionString)), 'group' => $groupName, ]); - - if (in_array($permissionString, $this->defaultPermissions)) { - $this->assignDefaultPermission($permission); - } } } @@ -146,26 +136,4 @@ public function run($seedUser = null) $seedUser->save(); } } - - /** - * Assign default permission to users and groups. - */ - private function assignDefaultPermission(Permission $permission): void - { - $userIds = User::nonSystem()->pluck('id'); - $groupIds = Group::pluck('id'); - - // Define the chunk size for the permission assignment - $chunkSize = 500; - - // Attach user IDs in chunks - $userIds->chunk($chunkSize)->each(function ($chunk) use ($permission) { - $permission->users()->attach($chunk); - }); - - // Attach group IDs in chunks - $groupIds->chunk($chunkSize)->each(function ($chunk) use ($permission) { - $permission->groups()->attach($chunk); - }); - } } diff --git a/database/seeders/RenameRequestsToCasesPermissionSeeder.php b/database/seeders/RenameRequestsToCasesPermissionSeeder.php deleted file mode 100644 index 2b2429ee2d..0000000000 --- a/database/seeders/RenameRequestsToCasesPermissionSeeder.php +++ /dev/null @@ -1,25 +0,0 @@ -where('group', 'Requests') - ->update(['group' => 'Cases']); - // Update the title of group - $permission = Permission::where('name', 'view-all_requests')->first(); - - if ($permission) { - $permission->title = 'View All Cases'; - $permission->save(); - } - } -} diff --git a/package-lock.json b/package-lock.json index 232fd64a37..ec947d05d9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@processmaker/processmaker", - "version": "4.12.0+beta-4", + "version": "4.12.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@processmaker/processmaker", - "version": "4.12.0+beta-4", + "version": "4.12.0", "hasInstallScript": true, "license": "ISC", "dependencies": { @@ -20,9 +20,9 @@ "@fortawesome/free-solid-svg-icons": "^5.15.1", "@fortawesome/vue-fontawesome": "^0.1.9", "@panter/vue-i18next": "^0.15.2", - "@processmaker/modeler": "1.63.5", + "@processmaker/modeler": "1.64.0", "@processmaker/processmaker-bpmn-moddle": "0.16.0", - "@processmaker/screen-builder": "3.0.6", + "@processmaker/screen-builder": "3.0.7", "@processmaker/vue-form-elements": "0.61.2", "@processmaker/vue-multiselect": "2.3.0", "@tinymce/tinymce-vue": "2.0.0", @@ -3749,9 +3749,9 @@ } }, "node_modules/@processmaker/modeler": { - "version": "1.63.5", - "resolved": "https://registry.npmjs.org/@processmaker/modeler/-/modeler-1.63.5.tgz", - "integrity": "sha512-muy1Spq8+WWsRLiCStZ6GGXdlh2BhEeZa1pcABjcg3PDtS7m1Ulp6e6O2cGnLsH74xalnsevANTF+44RI5zTlQ==", + "version": "1.64.0", + "resolved": "https://registry.npmjs.org/@processmaker/modeler/-/modeler-1.64.0.tgz", + "integrity": "sha512-qI+jQeLXb4ntYss3C8bZAYLDeJpWF+SpoSWGvp3ZDo4UtPLeSFdXLBs1yKCDBjv+8MDH2knTjAomyVkAMnQipA==", "dependencies": { "@babel/plugin-proposal-private-methods": "^7.12.1", "@fortawesome/fontawesome-free": "^5.11.2", @@ -3759,7 +3759,7 @@ "@fortawesome/free-brands-svg-icons": "^6.4.2", "@fortawesome/free-solid-svg-icons": "^5.11.2", "@fortawesome/vue-fontawesome": "^0.1.8", - "@processmaker/screen-builder": "3.0.6", + "@processmaker/screen-builder": "3.0.7", "@processmaker/vue-form-elements": "0.61.2", "@processmaker/vue-multiselect": "2.3.0", "bootstrap": "^4.3.1", @@ -3912,9 +3912,9 @@ } }, "node_modules/@processmaker/screen-builder": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@processmaker/screen-builder/-/screen-builder-3.0.6.tgz", - "integrity": "sha512-JrBe1U7K1M/1d/wUsfVHnKCFTcp0OR6QpCiMusFvi2mi32jY8O+ibjO/innCMKTgL8h81FXSuPUKURLmn7GGnQ==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@processmaker/screen-builder/-/screen-builder-3.0.7.tgz", + "integrity": "sha512-6BB1bO2PRzRE5332RqJpBuTAl5w/qZPG7VPZ+Xglf5gZKbsPAbTKyR9G95E8ElKiE5NVy0eio9pwQtBfmagb/g==", "dependencies": { "@chantouchsek/validatorjs": "1.2.3", "@storybook/addon-docs": "^7.6.13", @@ -5693,9 +5693,9 @@ } }, "node_modules/@storybook/csf": { - "version": "0.1.11", - "resolved": "https://registry.npmjs.org/@storybook/csf/-/csf-0.1.11.tgz", - "integrity": "sha512-dHYFQH3mA+EtnCkHXzicbLgsvzYjcDJ1JWsogbItZogkPHgSJM/Wr71uMkcvw8v9mmCyP4NpXJuu6bPoVsOnzg==", + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/@storybook/csf/-/csf-0.1.12.tgz", + "integrity": "sha512-9/exVhabisyIVL0VxTCxo01Tdm8wefIXKXfltAPTSr8cbLn5JAxGQ6QV3mjdecLGEOucfoVhAKtJfVHxEK1iqw==", "dependencies": { "type-fest": "^2.19.0" } @@ -25856,9 +25856,9 @@ "optional": true }, "@processmaker/modeler": { - "version": "1.63.5", - "resolved": "https://registry.npmjs.org/@processmaker/modeler/-/modeler-1.63.5.tgz", - "integrity": "sha512-muy1Spq8+WWsRLiCStZ6GGXdlh2BhEeZa1pcABjcg3PDtS7m1Ulp6e6O2cGnLsH74xalnsevANTF+44RI5zTlQ==", + "version": "1.64.0", + "resolved": "https://registry.npmjs.org/@processmaker/modeler/-/modeler-1.64.0.tgz", + "integrity": "sha512-qI+jQeLXb4ntYss3C8bZAYLDeJpWF+SpoSWGvp3ZDo4UtPLeSFdXLBs1yKCDBjv+8MDH2knTjAomyVkAMnQipA==", "requires": { "@babel/plugin-proposal-private-methods": "^7.12.1", "@fortawesome/fontawesome-free": "^5.11.2", @@ -25866,7 +25866,7 @@ "@fortawesome/free-brands-svg-icons": "^6.4.2", "@fortawesome/free-solid-svg-icons": "^5.11.2", "@fortawesome/vue-fontawesome": "^0.1.8", - "@processmaker/screen-builder": "3.0.6", + "@processmaker/screen-builder": "3.0.7", "@processmaker/vue-form-elements": "0.61.2", "@processmaker/vue-multiselect": "2.3.0", "bootstrap": "^4.3.1", @@ -25971,9 +25971,9 @@ } }, "@processmaker/screen-builder": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@processmaker/screen-builder/-/screen-builder-3.0.6.tgz", - "integrity": "sha512-JrBe1U7K1M/1d/wUsfVHnKCFTcp0OR6QpCiMusFvi2mi32jY8O+ibjO/innCMKTgL8h81FXSuPUKURLmn7GGnQ==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@processmaker/screen-builder/-/screen-builder-3.0.7.tgz", + "integrity": "sha512-6BB1bO2PRzRE5332RqJpBuTAl5w/qZPG7VPZ+Xglf5gZKbsPAbTKyR9G95E8ElKiE5NVy0eio9pwQtBfmagb/g==", "requires": { "@chantouchsek/validatorjs": "1.2.3", "@storybook/addon-docs": "^7.6.13", @@ -26941,9 +26941,9 @@ } }, "@storybook/csf": { - "version": "0.1.11", - "resolved": "https://registry.npmjs.org/@storybook/csf/-/csf-0.1.11.tgz", - "integrity": "sha512-dHYFQH3mA+EtnCkHXzicbLgsvzYjcDJ1JWsogbItZogkPHgSJM/Wr71uMkcvw8v9mmCyP4NpXJuu6bPoVsOnzg==", + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/@storybook/csf/-/csf-0.1.12.tgz", + "integrity": "sha512-9/exVhabisyIVL0VxTCxo01Tdm8wefIXKXfltAPTSr8cbLn5JAxGQ6QV3mjdecLGEOucfoVhAKtJfVHxEK1iqw==", "requires": { "type-fest": "^2.19.0" }, diff --git a/package.json b/package.json index 0100362770..7ee0065443 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@processmaker/processmaker", - "version": "4.12.0+beta-4", + "version": "4.12.0", "description": "ProcessMaker 4", "author": "DevOps ", "license": "ISC", @@ -58,9 +58,9 @@ "@fortawesome/free-solid-svg-icons": "^5.15.1", "@fortawesome/vue-fontawesome": "^0.1.9", "@panter/vue-i18next": "^0.15.2", - "@processmaker/modeler": "1.63.5", + "@processmaker/modeler": "1.64.0", "@processmaker/processmaker-bpmn-moddle": "0.16.0", - "@processmaker/screen-builder": "3.0.6", + "@processmaker/screen-builder": "3.0.7", "@processmaker/vue-form-elements": "0.61.2", "@processmaker/vue-multiselect": "2.3.0", "@tinymce/tinymce-vue": "2.0.0", diff --git a/resources/js/processes/designer/Assets.vue b/resources/js/processes/designer/Assets.vue index 9e236122fa..0df3d54da8 100644 --- a/resources/js/processes/designer/Assets.vue +++ b/resources/js/processes/designer/Assets.vue @@ -166,8 +166,8 @@ export default { color: "#556271", image_icon: require("../../../img/flowGenieIcon.svg"), asset_name: "FlowGenie", - asset_name_all: `${this.$t("View All")} Genies`, - asset_name_new: `${this.$t("New")} Genie`, + asset_name_all: "View All Genies", + asset_name_new: "New Genie", urlPath: "/designer/flow-genies", urlAsset: "/designer/flow-genies?create=true", }, diff --git a/resources/jscomposition/cases/casesMain/utils/counters.js b/resources/jscomposition/cases/casesMain/utils/counters.js index 54db9fdb68..f60f8793fb 100644 --- a/resources/jscomposition/cases/casesMain/utils/counters.js +++ b/resources/jscomposition/cases/casesMain/utils/counters.js @@ -30,7 +30,7 @@ export const formatCounters = (data) => { }, ]; - if (data.totalAllCases) { + if (data.totalAllCases !== null) { counters.push({ header: t("All cases"), body: data.totalAllCases.toString(), @@ -41,7 +41,7 @@ export const formatCounters = (data) => { }); } - if (data.totalMyRequest) { + if (data.totalMyRequest !== null) { counters.push({ header: t("My requests"), body: data.totalMyRequest.toString(), diff --git a/resources/lang/de.json b/resources/lang/de.json index 968455ca15..5117284f2e 100644 --- a/resources/lang/de.json +++ b/resources/lang/de.json @@ -2434,5 +2434,15 @@ "Create a bundle to easily share assets and settings between ProcessMaker instances.": "Erstellen Sie ein Bundle, um Assets und Einstellungen einfach zwischen ProcessMaker-Instanzen zu teilen.", "In addition to the process manager, these users and groups will have permission to reassign any task in this process, regardless of the \"Allow Reassignment\" task setting.": "Zusätzlich zum Prozessmanager haben diese Benutzer und Gruppen die Berechtigung, jede Aufgabe in diesem Prozess neu zuzuweisen, unabhängig von der Einstellung \"Neuzuweisung zulassen\" der Aufgabe.", "Reassignment Permission": "Neuzuweisungserlaubnis", - "This task can not be reassigned": "Diese Aufgabe kann nicht neu zugewiesen werden" + "This task can not be reassigned": "Diese Aufgabe kann nicht neu zugewiesen werden", + "Start New Case": "Neuen Fall starten", + "No Case to Start": "Kein Fall zu starten", + "No Cases to Show": "Keine Fälle anzuzeigen", + "Drafts": "Entwürfe", + "An error ocurred, please check the PI process file and try again.": "Ein Fehler ist aufgetreten, bitte überprüfen Sie die PI-Prozessdatei und versuchen Sie es erneut.", + "New": "Neu", + "New Genie": "Neuer Genie", + "View All Genies": "Alle Genies anzeigen", + "View All Collections": "Alle Kollektionen anzeigen", + "Collapse sidebar": "Seitenleiste einklappen" } \ No newline at end of file diff --git a/resources/lang/en.json b/resources/lang/en.json index e67e6ffa78..5e165f2ce3 100644 --- a/resources/lang/en.json +++ b/resources/lang/en.json @@ -2432,5 +2432,10 @@ "No Case to Start": "No Case to Start", "No Cases to Show": "No Cases to Show", "Drafts": "Drafts", - "An error ocurred, please check the PI process file and try again.": "An error ocurred, please check the PI process file and try again." + "An error ocurred, please check the PI process file and try again.": "An error ocurred, please check the PI process file and try again.", + "New": "New", + "New Genie": "New Genie", + "View All Genies": "View All Genies", + "View All Collections": "View All Collections", + "Collapse sidebar": "Collapse sidebar" } diff --git a/resources/lang/es.json b/resources/lang/es.json index f710fbcfe7..89d5865152 100644 --- a/resources/lang/es.json +++ b/resources/lang/es.json @@ -2431,5 +2431,15 @@ "Create a bundle to easily share assets and settings between ProcessMaker instances.": "Crear un paquete para compartir fácilmente activos y configuraciones entre instancias de ProcessMaker.", "In addition to the process manager, these users and groups will have permission to reassign any task in this process, regardless of the \"Allow Reassignment\" task setting.": "Además del gestor de procesos, estos usuarios y grupos tendrán permiso para reasignar cualquier tarea en este proceso, independientemente de la configuración de tarea \"Allow Reassignment\".", "Reassignment Permission": "Permiso de reasignación", - "This task can not be reassigned": "Esta tarea no se puede reasignar" + "This task can not be reassigned": "Esta tarea no se puede reasignar", + "Start New Case": "Iniciar Nuevo Caso", + "No Case to Start": "No Case to Start", + "No Cases to Show": "No hay casos para mostrar", + "Drafts": "Borradores", + "An error ocurred, please check the PI process file and try again.": "Se produjo un error, por favor revise el archivo de proceso PI y vuelva a intentarlo.", + "New": "Nuevo", + "New Genie": "Nuevo Genie", + "View All Genies": "Ver todos los Genies", + "View All Collections": "Ver Todas las Colecciones", + "Collapse sidebar": "Colapsar barra lateral" } \ No newline at end of file diff --git a/resources/lang/fr.json b/resources/lang/fr.json index e596b94b30..436672b5f0 100644 --- a/resources/lang/fr.json +++ b/resources/lang/fr.json @@ -2433,5 +2433,15 @@ "Create a bundle to easily share assets and settings between ProcessMaker instances.": "Créez un bundle pour partager facilement des actifs et des paramètres entre les instances de ProcessMaker.", "In addition to the process manager, these users and groups will have permission to reassign any task in this process, regardless of the \"Allow Reassignment\" task setting.": "En plus du gestionnaire de processus, ces utilisateurs et groupes auront la permission de réaffecter toute tâche dans ce processus, indépendamment du paramètre de tâche \"Allow Reassignment\".", "Reassignment Permission": "Autorisation de réaffectation", - "This task can not be reassigned": "Cette tâche ne peut pas être réaffectée" + "This task can not be reassigned": "Cette tâche ne peut pas être réaffectée", + "Start New Case": "Démarrer un nouveau cas", + "No Case to Start": "Aucune affaire à commencer", + "No Cases to Show": "Aucun cas à afficher", + "Drafts": "Brouillons", + "An error ocurred, please check the PI process file and try again.": "Une erreur s'est produite, veuillez vérifier le fichier de processus PI et réessayer.", + "New": "Nouveau", + "New Genie": "New Genie", + "View All Genies": "Voir tous les Genies", + "View All Collections": "Voir toutes les collections", + "Collapse sidebar": "Réduire la barre latérale" } \ No newline at end of file diff --git a/resources/views/admin/users/index.blade.php b/resources/views/admin/users/index.blade.php index bd9b477397..2697745d22 100644 --- a/resources/views/admin/users/index.blade.php +++ b/resources/views/admin/users/index.blade.php @@ -33,13 +33,13 @@
-