update_10.09.23

This commit is contained in:
NW 2023-09-21 15:01:58 +01:00
parent 4a9c23c4ea
commit 98a7d01134
24 changed files with 3084 additions and 14153 deletions

View File

@ -0,0 +1,10 @@
<?php
namespace App\Enums\User;
enum PermissionEnum: string
{
case CREATE_FORM = 'create form';
case VIEW_FORM = 'view form';
case EDIT_FORM = 'edit form';
}

View File

@ -0,0 +1,10 @@
<?php
namespace App\Enums\User;
enum RoleEnum: string
{
case SUPERVISOR = 'supervisor';
case ADMIN = 'admin';
case USER = 'user';
}

View File

@ -50,34 +50,34 @@ class HomeController extends Controller
if (! empty($form->schema)) {
$action = '<a href="'.action([\App\Http\Controllers\FormController::class, 'show'], ['form' => $form->slug ?: $form->id]).'"'.'
target="_blank"
target="_blank"
class="btn btn-sm btn-info m-1" data-toggle="tooltip" title="'.__('messages.view').'">
<i class="fa fa-eye" aria-hidden="true"></i>
</a>';
}
$action .= '<a href="'.action([\App\Http\Controllers\FormController::class, 'edit'], ['form' => $form->id]).'"'.'
$action .= '<a href="'.action([\App\Http\Controllers\FormController::class, 'edit'], ['form' => $form->id]).'"'.'
class="btn btn-sm btn-warning m-1" data-toggle="tooltip" title="'.__('messages.edit').'">
<i class="fa fa-edit" aria-hidden="true"></i>
</a>';
$action .= '<button type="button" data-href="'.action([\App\Http\Controllers\FormController::class, 'destroy'], ['form' => $form->id]).'"'.' class="btn btn-sm btn-danger delete_form m-1" data-toggle="tooltip"
$action .= '<button type="button" data-href="'.action([\App\Http\Controllers\FormController::class, 'destroy'], ['form' => $form->id]).'"'.' class="btn btn-sm btn-danger delete_form m-1" data-toggle="tooltip"
title="'.__('messages.delete').'">
<i class="fa fa-trash" aria-hidden="true"></i>
</button>';
$action .= '<button type="button" data-href="'.action([\App\Http\Controllers\FormController::class, 'copyForm'], ['id' => $form->id]).'"'.' class="btn btn-sm btn-primary copy_form m-1" data-toggle="tooltip"
$action .= '<button type="button" data-href="'.action([\App\Http\Controllers\FormController::class, 'copyForm'], ['id' => $form->id]).'"'.' class="btn btn-sm btn-primary copy_form m-1" data-toggle="tooltip"
title="'.__('messages.copy_this_form').'">
<i class="fas fa-copy"></i>
</button>';
$action .= '<button type="button" data-href="'.action([\App\Http\Controllers\FormController::class, 'generateWidget'], ['id' => $form->id]).'"'.' class="btn btn-sm btn-info generate_widget m-1" data-toggle="tooltip"
$action .= '<button type="button" data-href="'.action([\App\Http\Controllers\FormController::class, 'generateWidget'], ['id' => $form->id]).'"'.' class="btn btn-sm btn-info generate_widget m-1" data-toggle="tooltip"
title="'.__('messages.widget').'">
<i class="fa fa-random" aria-hidden="true"></i>
</button>';
$action .= '<a href="'.action([\App\Http\Controllers\FormDataController::class, 'show'], ['id' => $form->id]).'"'.'"
target="_blank"
target="_blank"
class="btn btn-sm btn-success m-1" data-toggle="tooltip" title="'.__('messages.view_form_data').'">
<i class="fa fa-list" aria-hidden="true"></i>
</a>';
@ -86,18 +86,12 @@ class HomeController extends Controller
$superadmin_emails = explode(',', $superadmins);
if (in_array($user->email, $superadmin_emails) ||
(is_saas_enabled() && (isset($subscription->package_details['is_form_downloadable']) && $subscription->package_details['is_form_downloadable'])) || ! is_saas_enabled()) {
$action .= '<a href="'.action([\App\Http\Controllers\FormController::class, 'downloadCode'], ['id' => $form->id]).'"'.'" class="btn btn-sm btn-dark m-1" data-toggle="tooltip"
$action .= '<a href="'.action([\App\Http\Controllers\FormController::class, 'downloadCode'], ['id' => $form->id]).'"'.'" class="btn btn-sm btn-dark m-1" data-toggle="tooltip"
title="'.__('messages.download_code').'">
<i class="fas fa-download" aria-hidden="true"></i>
</a>';
}
$action .= '<a href="'.action([\App\Http\Controllers\FormDataController::class, 'getReport'], ['id' => $form->id]).'"'.'"
target="_blank"
class="btn btn-sm btn-success m-1" data-toggle="tooltip" title="'.__('messages.report').'">
<i class="fas fa-chart-pie" aria-hidden="true"></i>
</a>';
$action .= '<a data-href="'.action([\App\Http\Controllers\FormController::class, 'getCollab'], ['id' => $form->id]).'"'.'class="btn btn-sm btn-primary m-1 collab_btn" data-toggle="tooltip" title="'.__('messages.collaborate').'">
<i class="fas fa-handshake text-white" aria-hidden="true"></i>
</a>';
@ -174,17 +168,17 @@ class HomeController extends Controller
return DataTables::of($forms)
->addColumn('action', function ($row) {
$action = '<a href="'.action([\App\Http\Controllers\FormController::class, 'show'], ['form' => $row->slug ?: $row->id]).'"'.'
target="_blank"
target="_blank"
class="btn btn-sm btn-info m-1" data-toggle="tooltip" title="'.__('messages.view').'">
<i class="fa fa-eye" aria-hidden="true"></i>
</a>';
if (! $row->is_global_template || auth()->user()->can('superadmin')) {
$action .= '<a href="'.action([\App\Http\Controllers\FormController::class, 'edit'], ['form' => $row->id]).'"'.'
$action .= '<a href="'.action([\App\Http\Controllers\FormController::class, 'edit'], ['form' => $row->id]).'"'.'
class="btn btn-sm btn-warning m-1" data-toggle="tooltip" title="'.__('messages.edit').'">
<i class="fa fa-edit" aria-hidden="true"></i>
</a>
<button type="button" data-href="'.action([\App\Http\Controllers\FormController::class, 'destroy'], ['form' => $row->id]).'"'.' class="btn btn-sm btn-danger delete_template m-1" data-toggle="tooltip"
<button type="button" data-href="'.action([\App\Http\Controllers\FormController::class, 'destroy'], ['form' => $row->id]).'"'.' class="btn btn-sm btn-danger delete_template m-1" data-toggle="tooltip"
title="'.__('messages.delete').'">
<i class="fa fa-trash" aria-hidden="true"></i>
</button>';
@ -265,31 +259,26 @@ class HomeController extends Controller
'action',
function ($row) {
$action = '';
if (! empty($row->permissions) && in_array('can_view_form', $row->permissions)) {
if (! empty($row->permissions) && in_array('can_view_form', $row->permissions) && auth()->user()->show_edit_buttons_form) {
$action = '<a href="'.action([\App\Http\Controllers\FormController::class, 'show'], ['form' => $row->slug ?: $row->form_id]).'"'.'
target="_blank"
target="_blank"
class="btn btn-sm btn-info m-1" data-toggle="tooltip" title="'.__('messages.view').'">
<i class="fa fa-eye" aria-hidden="true"></i>
</a>';
}
if (! empty($row->permissions) && in_array('can_design_form', $row->permissions)) {
$action .= '<a href="'.action([\App\Http\Controllers\FormController::class, 'edit'], ['form' => $row->form_id]).'"'.'
if (! empty($row->permissions) && in_array('can_design_form', $row->permissions) && auth()->user()->show_edit_buttons_form) {
$action .= '<a href="'.action([\App\Http\Controllers\FormController::class, 'edit'], ['form' => $row->form_id]).'"'.'
class="btn btn-sm btn-warning m-1" data-toggle="tooltip" title="'.__('messages.edit').'">
<i class="fa fa-edit" aria-hidden="true"></i>
</a>';
}
if (! empty($row->permissions) && in_array('can_view_data', $row->permissions)) {
if (! empty($row->permissions) && in_array('can_view_data', $row->permissions) && auth()->user()->show_edit_buttons_form) {
$action .= '<a href="'.action([\App\Http\Controllers\FormDataController::class, 'show'], ['id' => $row->form_id]).'"'.'"
target="_blank"
target="_blank"
class="btn btn-sm btn-success m-1" data-toggle="tooltip" title="'.__('messages.view_form_data').'">
<i class="fa fa-list" aria-hidden="true"></i>
</a>
<a href="'.action([\App\Http\Controllers\FormDataController::class, 'getReport'], ['id' => $row->form_id]).'"'.'"
target="_blank"
class="btn btn-sm btn-success m-1" data-toggle="tooltip" title="'.__('messages.report').'">
<i class="fas fa-chart-pie" aria-hidden="true"></i>
</a>';
}

View File

@ -35,7 +35,7 @@ class ManageUsersController extends Controller
return DataTables::of($users)
->addColumn(
'action',
'
'
@if($is_active)
<span title="@lang("messages.mark_inactive")">
<a class="btn btn-link btn-icon btn-sm text-danger toggle_is_active pointer" data-href="{{ action([\App\Http\Controllers\Superadmin\ManageUsersController::class, "toggleUserActiveStatus"], [$id])}}">
@ -126,7 +126,7 @@ class ManageUsersController extends Controller
return $this->notAllowedInDemo();
}
$input = $request->only('name', 'email', 'is_active', 'can_create_form');
$input = $request->only('name', 'email', 'is_active', 'can_create_form', 'show_form_response_user', 'show_edit_buttons_form');
if (! empty($request->input('password'))) {
$input['password'] = bcrypt($request->input('password'));
@ -134,6 +134,8 @@ class ManageUsersController extends Controller
$input['is_active'] = ! empty($input['is_active']) ? 1 : 0;
$input['can_create_form'] = ! empty($input['can_create_form']) ? 1 : 0;
$input['show_form_response_user'] = ! empty($input['show_form_response_user']) ? 1 : 0;
$input['show_edit_buttons_form'] = ! empty($input['show_edit_buttons_form']) ? 1 : 0;
$user = User::create($input);
@ -219,9 +221,11 @@ class ManageUsersController extends Controller
return $this->notAllowedInDemo();
}
$input = $request->only('name', 'email', 'is_active', 'can_create_form');
$input = $request->only('name', 'email', 'is_active', 'can_create_form', 'show_form_response_user', 'show_edit_buttons_form');
$input['is_active'] = ! empty($input['is_active']) ? 1 : 0;
$input['can_create_form'] = ! empty($input['can_create_form']) ? 1 : 0;
$input['show_form_response_user'] = ! empty($input['show_form_response_user']) ? 1 : 0;
$input['show_edit_buttons_form'] = ! empty($input['show_edit_buttons_form']) ? 1 : 0;
if (! empty($request->input('password'))) {
$input['password'] = bcrypt($request->input('password'));

View File

@ -4,10 +4,12 @@ namespace App;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Spatie\Permission\Traits\HasRoles;
class User extends Authenticatable
{
use Notifiable;
use Notifiable,
HasRoles;
/**
* The attributes that aren't mass assignable.

View File

@ -8,7 +8,7 @@
],
"license": "MIT",
"require": {
"php": "^8.0",
"php": "^8.1",
"carlos-meneses/laravel-mpdf": "^2.1",
"composer/semver": "^3.2",
"guzzlehttp/guzzle": "^7.2",
@ -18,6 +18,7 @@
"laravel/ui": "^3.3",
"milon/barcode": "^9.0",
"spatie/laravel-newsletter": "*",
"spatie/laravel-permission": "^5.11",
"spatie/laravel-webhook-server": "^3.1",
"srmklive/paypal": "^3.0",
"stripe/stripe-php": "^7.108",

1500
composer.lock generated

File diff suppressed because it is too large Load Diff

View File

@ -190,6 +190,7 @@ return [
Srmklive\PayPal\Providers\PayPalServiceProvider::class,
// Meneses\LaravelMpdf\LaravelMpdfServiceProvider::class,
Milon\Barcode\BarcodeServiceProvider::class,
Spatie\Permission\PermissionServiceProvider::class,
/*
* Application Service Providers...

161
config/permission.php Normal file
View File

@ -0,0 +1,161 @@
<?php
return [
'models' => [
/*
* When using the "HasPermissions" trait from this package, we need to know which
* Eloquent model should be used to retrieve your permissions. Of course, it
* is often just the "Permission" model but you may use whatever you like.
*
* The model you want to use as a Permission model needs to implement the
* `Spatie\Permission\Contracts\Permission` contract.
*/
'permission' => Spatie\Permission\Models\Permission::class,
/*
* When using the "HasRoles" trait from this package, we need to know which
* Eloquent model should be used to retrieve your roles. Of course, it
* is often just the "Role" model but you may use whatever you like.
*
* The model you want to use as a Role model needs to implement the
* `Spatie\Permission\Contracts\Role` contract.
*/
'role' => Spatie\Permission\Models\Role::class,
],
'table_names' => [
/*
* When using the "HasRoles" trait from this package, we need to know which
* table should be used to retrieve your roles. We have chosen a basic
* default value but you may easily change it to any table you like.
*/
'roles' => 'roles',
/*
* When using the "HasPermissions" trait from this package, we need to know which
* table should be used to retrieve your permissions. We have chosen a basic
* default value but you may easily change it to any table you like.
*/
'permissions' => 'permissions',
/*
* When using the "HasPermissions" trait from this package, we need to know which
* table should be used to retrieve your models permissions. We have chosen a
* basic default value but you may easily change it to any table you like.
*/
'model_has_permissions' => 'model_has_permissions',
/*
* When using the "HasRoles" trait from this package, we need to know which
* table should be used to retrieve your models roles. We have chosen a
* basic default value but you may easily change it to any table you like.
*/
'model_has_roles' => 'model_has_roles',
/*
* When using the "HasRoles" trait from this package, we need to know which
* table should be used to retrieve your roles permissions. We have chosen a
* basic default value but you may easily change it to any table you like.
*/
'role_has_permissions' => 'role_has_permissions',
],
'column_names' => [
/*
* Change this if you want to name the related pivots other than defaults
*/
'role_pivot_key' => null, //default 'role_id',
'permission_pivot_key' => null, //default 'permission_id',
/*
* Change this if you want to name the related model primary key other than
* `model_id`.
*
* For example, this would be nice if your primary keys are all UUIDs. In
* that case, name this `model_uuid`.
*/
'model_morph_key' => 'model_id',
/*
* Change this if you want to use the teams feature and your related model's
* foreign key is other than `team_id`.
*/
'team_foreign_key' => 'team_id',
],
/*
* When set to true, the method for checking permissions will be registered on the gate.
* Set this to false, if you want to implement custom logic for checking permissions.
*/
'register_permission_check_method' => true,
/*
* When set to true the package implements teams using the 'team_foreign_key'. If you want
* the migrations to register the 'team_foreign_key', you must set this to true
* before doing the migration. If you already did the migration then you must make a new
* migration to also add 'team_foreign_key' to 'roles', 'model_has_roles', and
* 'model_has_permissions'(view the latest version of package's migration file)
*/
'teams' => false,
/*
* When set to true, the required permission names are added to the exception
* message. This could be considered an information leak in some contexts, so
* the default setting is false here for optimum safety.
*/
'display_permission_in_exception' => false,
/*
* When set to true, the required role names are added to the exception
* message. This could be considered an information leak in some contexts, so
* the default setting is false here for optimum safety.
*/
'display_role_in_exception' => false,
/*
* By default wildcard permission lookups are disabled.
*/
'enable_wildcard_permission' => false,
'cache' => [
/*
* By default all permissions are cached for 24 hours to speed up performance.
* When permissions or roles are updated the cache is flushed automatically.
*/
'expiration_time' => \DateInterval::createFromDateString('24 hours'),
/*
* The cache key used to store all permissions.
*/
'key' => 'spatie.permission.cache',
/*
* You may optionally indicate a specific cache driver to use for permission and
* role caching using any of the `store` drivers listed in the cache.php config
* file. Using 'default' here means to use the `default` set in cache.php.
*/
'store' => 'default',
],
];

View File

@ -19,6 +19,10 @@ return new class extends Migration
$table->string('email')->unique();
$table->timestamp('email_verified_at')->nullable();
$table->string('password');
$table->boolean('show_form_response_user')->default(false);
$table->boolean('show_edit_buttons_form');
$table->rememberToken();
$table->timestamps();
});

View File

@ -0,0 +1,141 @@
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
use Spatie\Permission\PermissionRegistrar;
class CreatePermissionTables extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
$tableNames = config('permission.table_names');
$columnNames = config('permission.column_names');
$teams = config('permission.teams');
if (empty($tableNames)) {
throw new \Exception('Error: config/permission.php not loaded. Run [php artisan config:clear] and try again.');
}
if ($teams && empty($columnNames['team_foreign_key'] ?? null)) {
throw new \Exception('Error: team_foreign_key on config/permission.php not loaded. Run [php artisan config:clear] and try again.');
}
Schema::create($tableNames['permissions'], function (Blueprint $table) {
$table->bigIncrements('id'); // permission id
$table->string('name'); // For MySQL 8.0 use string('name', 125);
$table->string('guard_name'); // For MySQL 8.0 use string('guard_name', 125);
$table->timestamps();
$table->unique(['name', 'guard_name']);
});
Schema::create($tableNames['roles'], function (Blueprint $table) use ($teams, $columnNames) {
$table->bigIncrements('id'); // role id
if ($teams || config('permission.testing')) { // permission.testing is a fix for sqlite testing
$table->unsignedBigInteger($columnNames['team_foreign_key'])->nullable();
$table->index($columnNames['team_foreign_key'], 'roles_team_foreign_key_index');
}
$table->string('name'); // For MySQL 8.0 use string('name', 125);
$table->string('guard_name'); // For MySQL 8.0 use string('guard_name', 125);
$table->timestamps();
if ($teams || config('permission.testing')) {
$table->unique([$columnNames['team_foreign_key'], 'name', 'guard_name']);
} else {
$table->unique(['name', 'guard_name']);
}
});
Schema::create($tableNames['model_has_permissions'], function (Blueprint $table) use ($tableNames, $columnNames, $teams) {
$table->unsignedBigInteger(PermissionRegistrar::$pivotPermission);
$table->string('model_type');
$table->unsignedBigInteger($columnNames['model_morph_key']);
$table->index([$columnNames['model_morph_key'], 'model_type'], 'model_has_permissions_model_id_model_type_index');
$table->foreign(PermissionRegistrar::$pivotPermission)
->references('id') // permission id
->on($tableNames['permissions'])
->onDelete('cascade');
if ($teams) {
$table->unsignedBigInteger($columnNames['team_foreign_key']);
$table->index($columnNames['team_foreign_key'], 'model_has_permissions_team_foreign_key_index');
$table->primary([$columnNames['team_foreign_key'], PermissionRegistrar::$pivotPermission, $columnNames['model_morph_key'], 'model_type'],
'model_has_permissions_permission_model_type_primary');
} else {
$table->primary([PermissionRegistrar::$pivotPermission, $columnNames['model_morph_key'], 'model_type'],
'model_has_permissions_permission_model_type_primary');
}
});
Schema::create($tableNames['model_has_roles'], function (Blueprint $table) use ($tableNames, $columnNames, $teams) {
$table->unsignedBigInteger(PermissionRegistrar::$pivotRole);
$table->string('model_type');
$table->unsignedBigInteger($columnNames['model_morph_key']);
$table->index([$columnNames['model_morph_key'], 'model_type'], 'model_has_roles_model_id_model_type_index');
$table->foreign(PermissionRegistrar::$pivotRole)
->references('id') // role id
->on($tableNames['roles'])
->onDelete('cascade');
if ($teams) {
$table->unsignedBigInteger($columnNames['team_foreign_key']);
$table->index($columnNames['team_foreign_key'], 'model_has_roles_team_foreign_key_index');
$table->primary([$columnNames['team_foreign_key'], PermissionRegistrar::$pivotRole, $columnNames['model_morph_key'], 'model_type'],
'model_has_roles_role_model_type_primary');
} else {
$table->primary([PermissionRegistrar::$pivotRole, $columnNames['model_morph_key'], 'model_type'],
'model_has_roles_role_model_type_primary');
}
});
Schema::create($tableNames['role_has_permissions'], function (Blueprint $table) use ($tableNames) {
$table->unsignedBigInteger(PermissionRegistrar::$pivotPermission);
$table->unsignedBigInteger(PermissionRegistrar::$pivotRole);
$table->foreign(PermissionRegistrar::$pivotPermission)
->references('id') // permission id
->on($tableNames['permissions'])
->onDelete('cascade');
$table->foreign(PermissionRegistrar::$pivotRole)
->references('id') // role id
->on($tableNames['roles'])
->onDelete('cascade');
$table->primary([PermissionRegistrar::$pivotPermission, PermissionRegistrar::$pivotRole], 'role_has_permissions_permission_id_role_id_primary');
});
app('cache')
->store(config('permission.cache.store') != 'default' ? config('permission.cache.store') : null)
->forget(config('permission.cache.key'));
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
$tableNames = config('permission.table_names');
if (empty($tableNames)) {
throw new \Exception('Error: config/permission.php not found and defaults could not be merged. Please publish the package configuration before proceeding, or drop the tables manually.');
}
Schema::drop($tableNames['role_has_permissions']);
Schema::drop($tableNames['model_has_roles']);
Schema::drop($tableNames['model_has_permissions']);
Schema::drop($tableNames['roles']);
Schema::drop($tableNames['permissions']);
}
}

View File

@ -13,8 +13,12 @@ class DatabaseSeeder extends Seeder
*/
public function run()
{
$this->call(UsersTableSeeder::class);
$this->call(SystemsTableSeeder::class);
$this->call(TemplateSeeder::class);
$this->call([
PermissionSeeder::class,
RoleSeeder::class,
UsersTableSeeder::class,
SystemsTableSeeder::class,
TemplateSeeder::class
]);
}
}

View File

@ -0,0 +1,20 @@
<?php
namespace Database\Seeders;
use App\Enums\User\PermissionEnum;
use Illuminate\Database\Seeder;
use Spatie\Permission\Models\Permission;
class PermissionSeeder extends Seeder
{
public function run(): void
{
Permission::query()
->upsert([
['name' => PermissionEnum::CREATE_FORM->value, 'guard_name' => 'web'],
['name' => PermissionEnum::VIEW_FORM->value, 'guard_name' => 'web'],
['name' => PermissionEnum::EDIT_FORM->value, 'guard_name' => 'web']
], ['name', 'guard_name']);
}
}

View File

@ -0,0 +1,20 @@
<?php
namespace Database\Seeders;
use App\Enums\User\RoleEnum;
use Illuminate\Database\Seeder;
use Spatie\Permission\Models\Role;
class RoleSeeder extends Seeder
{
public function run(): void
{
Role::query()
->upsert([
['name' => RoleEnum::SUPERVISOR->value, 'guard_name' => 'web'],
['name' => RoleEnum::ADMIN->value, 'guard_name' => 'web'],
['name' => RoleEnum::USER->value, 'guard_name' => 'web']
], ['name', 'guard_name']);
}
}

View File

@ -2,6 +2,7 @@
namespace Database\Seeders;
use App\Enums\User\RoleEnum;
use App\User;
use Illuminate\Database\Seeder;
@ -14,14 +15,13 @@ class UsersTableSeeder extends Seeder
*/
public function run()
{
$info = [
'name' => 'admin',
'email' => 'admin@admin.com',
'password' => bcrypt(12345678),
'is_active' => 1,
];
//create user
$user = User::create($info);
User::query()
->create([
'name' => 'admin',
'email' => 'admin@admin.com',
'password' => bcrypt(12345678),
'is_active' => 1,
])
->assignRole(RoleEnum::SUPERVISOR->value);
}
}

File diff suppressed because one or more lines are too long

View File

@ -477,6 +477,10 @@ return [
'outline' => 'Outline',
'can_create_form' => 'Can create form',
'can_create_form_tooltip' => 'If checked user can create forms for him/herself',
'show_form_response_user' => 'Can view form response author',
'show_form_response_user_tooltip' => 'If checked user can view form response author',
'show_edit_buttons_form' => 'Can view form edit buttons',
'show_edit_buttons_form_tooltip' => 'If checked user can view edit buttons',
'assign_forms' => 'Share forms',
'permission_for_forms' => 'Permission for shared forms',
'can_design_form' => 'Can design form',

View File

@ -477,6 +477,10 @@ return [
'outline' => 'Контур',
'can_create_form' => 'Может создавать форму',
'can_create_form_tooltip' => 'Если установлено, пользователь может создавать формы для себя',
'show_form_response_user' => 'Can view form response author',
'show_form_response_user_tooltip' => 'If checked user can view form response author',
'show_edit_buttons_form' => 'Can view form edit buttons',
'show_edit_buttons_form_tooltip' => 'If checked user can view edit buttons',
'assign_forms' => 'Поделиться формами',
'permission_for_forms' => 'Разрешение на общие формы',
'can_design_form' => 'Может проектировать форму',

14529
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -1,75 +1,79 @@
@extends('layouts.app')
@section('css')
<style type="text/css">
.no-print {
display: block;
}
@media screen {
#printSection {
display: none;
}
}
@media print {
body * {
visibility:hidden;
}
#printSection, #printSection * {
visibility:visible;
}
#printSection {
position:absolute;
left:0;
top:0;
}
<style type="text/css">
.no-print {
display: none;
display: block;
}
}
</style>
@media screen {
#printSection {
display: none;
}
}
@media print {
body * {
visibility: hidden;
}
#printSection, #printSection * {
visibility: visible;
}
#printSection {
position: absolute;
left: 0;
top: 0;
}
.no-print {
display: none;
}
}
</style>
@endsection
@section('content')
<div class="container-fluid">
<div class="row justify-content-center no-print">
<div class="col-md-12">
@php
$date_format = config('constants.APP_DATE_FORMAT');
if (config('constants.APP_TIME_FORMAT') == '12') {
$date_format .= ' h:i A';
} else if (config('constants.APP_TIME_FORMAT') == '24') {
$date_format .= ' H:i';
} else {
$date_format = 'm/d/Y h:i A';
}
@endphp
<div class="card">
<div class="card-header">
{{$form->name}}
</div>
<div class="container-fluid">
<div class="row justify-content-center no-print">
<div class="col-md-12">
@php
$is_enabled_sub_ref_no = false;
if(isset($form->schema['settings']['form_submision_ref']['is_enabled']) && $form->schema['settings']['form_submision_ref']['is_enabled']) {
$is_enabled_sub_ref_no = true;
$date_format = config('constants.APP_DATE_FORMAT');
if (config('constants.APP_TIME_FORMAT') == '12') {
$date_format .= ' h:i A';
} else if (config('constants.APP_TIME_FORMAT') == '24') {
$date_format .= ' H:i';
} else {
$date_format = 'm/d/Y h:i A';
}
@endphp
<div class="tab-content card-body table-responsive" role="tabpanel">
@if(!empty($form->schema))
@php
$schema = $form->schema['form'];
$col_visible = $form['schema']['settings']['form_data']['col_visible'];
$btn_enabled = $form['schema']['settings']['form_data']['btn_enabled'];
@endphp
<table class="table" id="submitted_data_table" style="width: 100%;">
<thead>
<div class="card">
<div class="card-header">
{{$form->name}}
</div>
@php
$is_enabled_sub_ref_no = false;
if(isset($form->schema['settings']['form_submision_ref']['is_enabled']) && $form->schema['settings']['form_submision_ref']['is_enabled']) {
$is_enabled_sub_ref_no = true;
}
@endphp
<div class="tab-content card-body table-responsive" role="tabpanel">
@if(!empty($form->schema))
@php
$schema = $form->schema['form'];
$col_visible = $form['schema']['settings']['form_data']['col_visible'];
$btn_enabled = $form['schema']['settings']['form_data']['btn_enabled'];
@endphp
<table class="table" id="submitted_data_table" style="width: 100%;">
<thead>
<tr>
<th>@lang('messages.action')</th>
@if($is_enabled_sub_ref_no)
<th>@lang('messages.submission_numbering')</th>
@endif
@if(auth()->user()->show_form_response_user)
<th>@lang('messages.username')</th>
@endif
@foreach($schema as $element)
@if(in_array($element['name'], $col_visible))
<th>
@ -79,32 +83,32 @@
@endforeach
<th>@lang('messages.submitted_on')</th>
</tr>
</thead>
</thead>
<tbody>
<tbody>
@foreach($data as $k => $row)
<tr>
<td>
@if(in_array('view', $btn_enabled))
<button type="button" class="btn btn-info btn-sm view_form_data m-1" data-href="{{action([\App\Http\Controllers\FormDataController::class, 'viewData'], [$row->id])}}" data-toggle="modal">
<button type="button" class="btn btn-info btn-sm view_form_data m-1"
data-href="{{action([\App\Http\Controllers\FormDataController::class, 'viewData'], [$row->id])}}"
data-toggle="modal">
<i class="fa fa-eye" aria-hidden="true"></i>
@lang('messages.view')
</button>
@endif
@if(in_array('delete', $btn_enabled))
<button type="button" class="btn btn-danger btn-sm delete_form_data m-1" data-href="{{action([\App\Http\Controllers\FormDataController::class, 'destroy'], [$row->id])}}">
<button type="button" class="btn btn-danger btn-sm delete_form_data m-1"
data-href="{{action([\App\Http\Controllers\FormDataController::class, 'destroy'], [$row->id])}}">
<i class="fa fa-trash" aria-hidden="true"></i>
@lang('messages.delete')
</button>
@endif
<a class="btn btn-primary btn-sm m-1" target="_blank" href="{{action([\App\Http\Controllers\FormDataController::class, 'downloadPdf'], [$row->id])}}">
<i class="far fa-file-pdf" aria-hidden="true"></i>
@lang('messages.download_pdf')
</a>
@php
$form_id = !empty($form->slug) ? $form->slug : $form->id;
@endphp
<a class="btn btn-dark btn-sm m-1" target="_blank" href="{{action([\App\Http\Controllers\FormDataController::class, 'getEditformData'], ['slug' => $form_id,'id' => $row->id])}}">
<a class="btn btn-dark btn-sm m-1" target="_blank"
href="{{action([\App\Http\Controllers\FormDataController::class, 'getEditformData'], ['slug' => $form_id,'id' => $row->id])}}">
<i class="far fa-edit" aria-hidden="true"></i>
@lang('messages.edit')
</a>
@ -114,18 +118,25 @@
{{$row['submission_ref']}}
</td>
@endif
@if(auth()->user()->show_form_response_user)
<td>{{ $row->submittedBy?->name }}</td>
@endif
@foreach($schema as $row_element)
@if(in_array($row_element['name'], $col_visible))
<td>
@isset($row->data[$row_element['name']])
@if($row_element['type'] == 'file_upload')
@include('form_data.file_view', ['form_upload' => $row->data[$row_element['name']]])
@include('form_data.file_view', ['form_upload' => $row->data[$row_element['name']]])
@elseif($row_element['type'] == 'signature')
@if(!empty($row->data[$row_element['name']]))
<a target="_blank" href="{{$row->data[$row_element['name']]}}"
download="Signature">
<img src="{{$row->data[$row_element['name']]}}" class="signature">
<a target="_blank"
href="{{$row->data[$row_element['name']]}}"
download="Signature">
<img src="{{$row->data[$row_element['name']]}}"
class="signature">
</a>
@endif
@elseif(is_array($row->data[$row_element['name']]) && $row_element['type'] != 'file_upload')
@ -133,7 +144,7 @@
@else
{!! nl2br($row->data[$row_element['name']]) !!}
@endif
@endisset
</td>
@endif
@ -147,121 +158,121 @@
</td>
</tr>
@endforeach
</tbody>
</table>
@else
<p>Form Not found</p>
@endif
</div>
</div>
</tbody>
</table>
@else
<p>Form Not found</p>
@endif
</div>
</div>
</div>
</div>
</div>
</div>
@endsection
@section('footer')
<script type="text/javascript">
$(document).ready(function(){
$('#submitted_data_table').DataTable({
scrollY: "600px",
scrollX: true,
scrollCollapse: true,
paging: true,
fixedColumns: {
leftColumns: 2
}
});
// view form data
$(document).on('click', '.view_form_data', function(){
var url = $(this).data("href");
$.ajax({
method: "GET",
dataType: "html",
url: url,
success: function(result){
$("#modal_div").html(result).modal("show");
<script type="text/javascript">
$(document).ready(function () {
$('#submitted_data_table').DataTable({
scrollY: "600px",
scrollX: true,
scrollCollapse: true,
paging: true,
fixedColumns: {
leftColumns: 2
}
});
});
//delete form data
$(document).on('click', '.delete_form_data', function(){
var url = $(this).data("href");
var result = confirm('Are You Sure?');
if (result == true) {
// view form data
$(document).on('click', '.view_form_data', function () {
var url = $(this).data("href");
$.ajax({
method: "DELETE",
method: "GET",
dataType: "html",
url: url,
dataType: "json",
success: function(result){
if(result.success == true){
toastr.success(result.msg);
setTimeout(function(){
location.reload();
}, 1000);
} else {
toastr.error(result.msg);
}
success: function (result) {
$("#modal_div").html(result).modal("show");
}
});
}
});
});
//print form data on btn click
$(document).on('click', '.formDataPrintBtn', function() {
printElement(document.getElementById("print_form_data"));
});
$("#modal_div").on('shown.bs.modal', function () {
if ($("form#add_comment_form").length) {
$("form#add_comment_form").validate();
}
});
$(document).on('submit', 'form#add_comment_form', function (e) {
e.preventDefault();
var data = $("form#add_comment_form").serialize();
var url = $("form#add_comment_form").attr('action');
var ladda = Ladda.create(document.querySelector('.add_comment_btn'));
ladda.start();
$.ajax({
method: "POST",
url: url,
dataType: "json",
data: data,
success: function (response) {
ladda.stop();
if (response.success) {
$("#comment").val('');
$('.direct-chat-messages').prepend(response.comment);
toastr.success(response.msg);
} else {
toastr.error(response.msg);
}
//delete form data
$(document).on('click', '.delete_form_data', function () {
var url = $(this).data("href");
var result = confirm('Are You Sure?');
if (result == true) {
$.ajax({
method: "DELETE",
url: url,
dataType: "json",
success: function (result) {
if (result.success == true) {
toastr.success(result.msg);
setTimeout(function () {
location.reload();
}, 1000);
} else {
toastr.error(result.msg);
}
}
});
}
});
});
$(document).on('click', '.delete-comment', function(e) {
e.preventDefault();
var element = $(this);
var comment_id = $(this).data('comment_id');
var form_data_id = $(this).data('form_data_id');
if (confirm('Are you sure.?')) {
//print form data on btn click
$(document).on('click', '.formDataPrintBtn', function () {
printElement(document.getElementById("print_form_data"));
});
$("#modal_div").on('shown.bs.modal', function () {
if ($("form#add_comment_form").length) {
$("form#add_comment_form").validate();
}
});
$(document).on('submit', 'form#add_comment_form', function (e) {
e.preventDefault();
var data = $("form#add_comment_form").serialize();
var url = $("form#add_comment_form").attr('action');
var ladda = Ladda.create(document.querySelector('.add_comment_btn'));
ladda.start();
$.ajax({
method:'DELETE',
dataType: 'json',
url: '/form-data-comment/'+comment_id+'?form_data_id='+form_data_id,
success: function(response){
method: "POST",
url: url,
dataType: "json",
data: data,
success: function (response) {
ladda.stop();
if (response.success) {
$("#comment").val('');
$('.direct-chat-messages').prepend(response.comment);
toastr.success(response.msg);
element.closest('.direct-chat-msg').remove();
} else {
toastr.error(response.msg);
}
}
});
}
});
$(document).on('click', '.delete-comment', function (e) {
e.preventDefault();
var element = $(this);
var comment_id = $(this).data('comment_id');
var form_data_id = $(this).data('form_data_id');
if (confirm('Are you sure.?')) {
$.ajax({
method: 'DELETE',
dataType: 'json',
url: '/form-data-comment/' + comment_id + '?form_data_id=' + form_data_id,
success: function (response) {
if (response.success) {
toastr.success(response.msg);
element.closest('.direct-chat-msg').remove();
} else {
toastr.error(response.msg);
}
}
});
}
});
});
});
</script>
@endsection
</script>
@endsection

View File

@ -71,7 +71,7 @@
</li>
@endif
<li class="nav-item">
<a class="nav-link
<a class="nav-link
@if(!auth()->user()->can('superadmin') && !Auth::user()->can_create_form)
active
@endif
@ -137,7 +137,6 @@
<tr>
<th>@lang('messages.name')</th>
<th>@lang('messages.description')</th>
<th>@lang('messages.created_by')</th>
<th>@lang('messages.action')</th>
</tr>
</thead>
@ -215,7 +214,7 @@
if(result.success == true){
toastr.success(result.msg);
form_table.ajax.reload();
} else {
} else {
toastr.error(result.msg);
}
}
@ -236,7 +235,7 @@
if(result.success == true){
toastr.success(result.msg);
template_table.ajax.reload();
} else {
} else {
toastr.error(result.msg);
}
}
@ -295,13 +294,11 @@
"columnDefs": [
{ "width": "25%", "targets": 0 },
{ "width": "40%", "targets": 1 },
{ "width": "15%", "targets": 2 },
{ "width": "20%", "targets": 3 }
{ "width": "20%", "targets": 2 }
],
columns: [
{ data: 'name' , name: 'forms.name'},
{ data: 'description' , name: 'forms.description'},
{ data: 'created_by' , name: 'users.name', sortable:false},
{ data: 'action', name: 'action', sortable:false }
]
});
@ -393,4 +390,4 @@
@endif
});
</script>
@endsection
@endsection

View File

@ -40,7 +40,7 @@
<script src="{{asset('/plugins/countdowntimer/countdowntimer.min.js').'?v='.$asset_version}}"></script>
@if(!$is_download)
<!-- app js values -->
<script type="application/javascript">
var APP = {};
@ -69,7 +69,7 @@
function printElement(elem) {
var domClone = elem.cloneNode(true);
var printSection = document.getElementById("printSection");
if (!printSection) {
var printSection = document.createElement("div");
printSection.id = "printSection";
@ -129,7 +129,7 @@
toastr.error("{{ __('messages.some_error_in_input_field') }}");
}
});
$(document).ready(function(){
@if(!$is_download)
jQuery.extend($.fn.dataTable.defaults, {
@ -138,34 +138,7 @@
[25, 50, 100, 200, 500, 1000, -1], [25, 50, 100, 200, 500, 1000, "{{__('messages.all')}}"]
],
iDisplayLength: 25,
dom: 'lBfrtip',
buttons: [
{
extend: 'copy',
text: "{{__('messages.copy')}}",
exportOptions: {
columns: ':visible',
}
},
{
extend: 'excel',
text: "{{__('messages.excel')}}",
exportOptions: {
columns: ':visible',
}
},
{
extend: 'csv',
text: "{{__('messages.csv')}}",
exportOptions: {
columns: ':visible',
}
},
{
extend: 'colvis',
text: "{{__('messages.column_visibility')}}",
},
],
dom: 'lfrtip',
"language": {
"emptyTable": "{{__('messages.emptyTable')}}",
"info": "{{__('messages.dt_info')}}",
@ -269,10 +242,10 @@
},
});
}
Dropzone.autoDiscover = false;
function initialize_dropzone(element_name, file_upload_msg, no_of_files_can_be_uploaded, max_file_size, allowed_file_type, url = null) {
var file_remove_url = "library/delete_file.php";
if (url == null) {
url = "{{ url('/file-upload')}}";
@ -333,11 +306,11 @@
if(result.success == 1){
toastr.success(result.msg);
var index = file_names.indexOf(file.uploaded_as);
if(index!=-1){
file_names.splice(index, 1);
}
var elementVal = $('input#'+element_name).val();
var oldVal = elementVal.split(",");
@ -373,12 +346,12 @@
}
function initialize_text_editor(element_name, placeholder, height) {
$('#'+element_name).summernote({
placeholder: placeholder,
height: height
});
}
}
function initialize_star_rating(element_name) {
$("#"+element_name).rating({
@ -415,18 +388,18 @@
var signaturePad = element;
var canvas = document.getElementById(element);
signaturePad = new SignaturePad(canvas, {
onEnd: function(event) {
onEnd: function(event) {
var element = $(this)[0]._canvas.id
var signature = $(this)[0].toDataURL();
$('#output_'+element).val(signature);
}
});
if ($('#output_'+element).val().length > 0) {
signaturePad.fromDataURL($('#output_'+element).val());
}
$(document).on('click', '#clear_'+element, function() {
signaturePad.clear();
$('#output_'+$(this).data('name')).val('');
@ -476,5 +449,5 @@
@if(!$is_download && !isset($nav))
@if(!empty($__additional_js))
{!!$__additional_js!!}
@endif
@endif
@endif
@endif

View File

@ -21,7 +21,7 @@
<input type="text" class="form-control"
name="name" id="name" required>
</div>
</div>
</div>
<div class="col-md-6">
<div class="form-group">
@ -32,7 +32,7 @@
<input type="email" class="form-control"
name="email" id="email" required>
</div>
</div>
</div>
</div>
<div class="row">
@ -45,7 +45,7 @@
<input type="password" class="form-control"
name="password" id="password" required>
</div>
</div>
</div>
</div>
<div class="row">
@ -76,6 +76,25 @@
</label>
</div>
</div>
<div class="col-md-4">
<div class="form-group form-check">
<input type="checkbox" class="form-check-input" name="show_form_response_user" id="show_form_response_user" value="1">
<label class="form-check-label" for="show_form_response_user">
@lang('messages.show_form_response_user')
<i class="fas fa-info-circle text-info" data-toggle="tooltip" title="@lang('messages.show_form_response_user_tooltip')"></i>
</label>
</div>
</div>
<div class="col-md-4">
<div class="form-group form-check">
<input type="checkbox" class="form-check-input" name="show_edit_buttons_form" id="show_edit_buttons_form" value="1">
<label class="form-check-label" for="show_edit_buttons_form">
@lang('messages.show_edit_buttons_form')
<i class="fas fa-info-circle text-info" data-toggle="tooltip" title="@lang('messages.show_edit_buttons_form_tooltip')"></i>
</label>
</div>
</div>
</div>
<div class="card assign-form p-3">
<div class="row">
@ -95,7 +114,7 @@
</div>
</div>
<h5>@lang('messages.permission_for_forms'):</h5>
<div class="row">
<div class="row">
<div class="col-md-4">
<div class="form-group form-check">
<input type="checkbox" class="form-check-input" name="permissions[]" id="form_design" value="can_design_form">
@ -136,4 +155,4 @@
</div>
</div>
</form>
</div>
</div>

View File

@ -22,7 +22,7 @@
<input type="text" class="form-control"
name="name" id="name" value="{{$user->name}}" required>
</div>
</div>
</div>
<div class="col-md-6">
<div class="form-group">
@ -33,7 +33,7 @@
<input type="email" class="form-control"
name="email" id="email" value="{{$user->email}}" required>
</div>
</div>
</div>
</div>
<div class="row">
@ -47,7 +47,7 @@
<small id="passwordHelp" class="form-text text-muted">
@lang('messages.dont_want_to_change_keep_it_blank')
</small>
</div>
</div>
</div>
</div>
<div class="row">
@ -78,6 +78,25 @@
</label>
</div>
</div>
<div class="col-md-4">
<div class="form-group form-check">
<input type="checkbox" class="form-check-input" name="show_form_response_user" id="show_form_response_user" value="1" @if($user->show_form_response_user) checked @endif>
<label class="form-check-label" for="show_form_response_user">
@lang('messages.show_form_response_user')
<i class="fas fa-info-circle text-info" data-toggle="tooltip" title="@lang('messages.show_form_response_user_tooltip')"></i>
</label>
</div>
</div>
<div class="col-md-4">
<div class="form-group form-check">
<input type="checkbox" class="form-check-input" name="show_edit_buttons_form" id="show_edit_buttons_form" value="1" @if($user->show_edit_buttons_form) checked @endif>
<label class="form-check-label" for="show_edit_buttons_form">
@lang('messages.show_edit_buttons_form')
<i class="fas fa-info-circle text-info" data-toggle="tooltip" title="@lang('messages.show_edit_buttons_form_tooltip')"></i>
</label>
</div>
</div>
</div>
@if(auth()->user()->id != $user->id)
@php
@ -91,7 +110,7 @@
<i class="fab fa-wpforms"></i>
{{$assigned_form->form->name}}
</label>
<div class="row">
<div class="row">
<input type="hidden" name="edit_assigned_form_id[]" value="{{$assigned_form->id}}">
<div class="col-md-4">
<div class="form-group form-check">
@ -194,4 +213,4 @@
</div>
</div>
</form>
</div>
</div>