Compare commits
11 Commits
main
...
Lang_funct
Author | SHA1 | Date | |
---|---|---|---|
|
157a5a1939 | ||
|
a46ec03369 | ||
|
3485957da4 | ||
|
2d0d36af7e | ||
262b8003f4 | |||
|
d8a271adb4 | ||
|
cf7c57228a | ||
|
4cb505276f | ||
|
c5295f0fee | ||
|
fd9dc5d545 | ||
|
c18c2d0f32 |
.env
app
Form.php
architect.mdHttp
database/migrations
lang/en
package-lock.jsonresources
routes
87
.env
Normal file
87
.env
Normal file
@ -0,0 +1,87 @@
|
||||
APP_NAME="AKNAPROFF"
|
||||
APP_ENV="live"
|
||||
APP_KEY=base64:dvbkNw1BmEGND2DRWIauV7ub306TMEiPws0A9yOhiMU=
|
||||
APP_DEBUG=true
|
||||
APP_URL=https://uniquesoft.es
|
||||
APP_LOCALE="en"
|
||||
|
||||
LOG_CHANNEL=stack
|
||||
|
||||
DB_CONNECTION=mysql
|
||||
DB_HOST=127.0.0.1
|
||||
DB_PORT=3306
|
||||
DB_DATABASE=
|
||||
DB_USERNAME=
|
||||
DB_PASSWORD=
|
||||
|
||||
BROADCAST_DRIVER=log
|
||||
CACHE_DRIVER=file
|
||||
QUEUE_CONNECTION=sync
|
||||
SESSION_DRIVER=file
|
||||
SESSION_LIFETIME=120
|
||||
|
||||
REDIS_HOST=127.0.0.1
|
||||
REDIS_PASSWORD=null
|
||||
REDIS_PORT=6379
|
||||
|
||||
MAIL_MAILER=smtp
|
||||
MAIL_HOST="smtp.mailtrap.io"
|
||||
MAIL_PORT="2525"
|
||||
MAIL_USERNAME="hello@example.com"
|
||||
MAIL_PASSWORD="12345"
|
||||
MAIL_ENCRYPTION="TLS/SSL"
|
||||
MAIL_FROM_ADDRESS="hello@example.com"
|
||||
MAIL_FROM_NAME="Example"
|
||||
|
||||
AWS_ACCESS_KEY_ID=
|
||||
AWS_SECRET_ACCESS_KEY=
|
||||
AWS_DEFAULT_REGION=us-east-1
|
||||
AWS_BUCKET=
|
||||
|
||||
PUSHER_APP_ID=
|
||||
PUSHER_APP_KEY=
|
||||
PUSHER_APP_SECRET=
|
||||
PUSHER_APP_CLUSTER=mt1
|
||||
|
||||
MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
|
||||
MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"
|
||||
|
||||
ENVATO_PURCHASE_CODE="780fc1cd-62c9-4b1f-8798-7f4f6f7048ef"
|
||||
SUPERADMIN_EMAILS=admin@admin.com
|
||||
ENABLE_REGISTRATION="0"
|
||||
|
||||
CURRENCY_NAME="Euro"
|
||||
CURRENCY_SYMBOL="€"
|
||||
CURRENCY_CODE="EUR"
|
||||
|
||||
APP_TIMEZONE="Europe/Helsinki"
|
||||
|
||||
ENABLE_SAAS_MODULE="0"
|
||||
|
||||
PAYPAL_MODE="sandbox"
|
||||
#PayPal Setting & API Credentials - sandbox
|
||||
PAYPAL_SANDBOX_API_USERNAME=
|
||||
PAYPAL_SANDBOX_API_PASSWORD=
|
||||
PAYPAL_SANDBOX_API_SECRET=
|
||||
PAYPAL_SANDBOX_API_CERTIFICATE=
|
||||
|
||||
#PayPal Setting & API Credentials - live
|
||||
PAYPAL_LIVE_API_USERNAME=
|
||||
PAYPAL_LIVE_API_PASSWORD=
|
||||
PAYPAL_LIVE_API_SECRET=
|
||||
PAYPAL_LIVE_API_CERTIFICATE=
|
||||
|
||||
#Stripe Payment Api & Credentials
|
||||
STRIPE_PUB_KEY=
|
||||
STRIPE_SECRET_KEY=
|
||||
|
||||
APP_DATE_FORMAT="d.m.Y"
|
||||
APP_TIME_FORMAT="24"
|
||||
|
||||
DEBUGBAR_ENABLED=false
|
||||
ENABLE_OFFLINE_PAYMENT="0"
|
||||
|
||||
ACELLE_MAIL_NAME=""
|
||||
ACELLE_MAIL_API=""
|
||||
|
||||
APP_TITLE="Vormid"
|
@ -14,8 +14,7 @@ class Form extends Model
|
||||
* @var array
|
||||
*/
|
||||
protected $guarded = [];
|
||||
public $incrementing = false;
|
||||
protected $keyType = 'string';
|
||||
|
||||
protected $appends = ['media_url'];
|
||||
|
||||
/**
|
||||
|
@ -16,6 +16,11 @@ use ZipArchive;
|
||||
|
||||
class FormController extends Controller
|
||||
{
|
||||
|
||||
public function __construct() {
|
||||
$this->middleware('auth');
|
||||
}
|
||||
|
||||
/**
|
||||
* Display a listing of the resource.
|
||||
*
|
||||
@ -191,7 +196,7 @@ class FormController extends Controller
|
||||
public function update($id)
|
||||
{
|
||||
try {
|
||||
$input = request()->only('name', 'description', 'slug');
|
||||
$input = request()->only('name', 'name_ru', 'name_est', 'description', 'description_ru', 'description_est', 'slug');
|
||||
$form_data = [
|
||||
'form' => request()->input('form'),
|
||||
'emailConfig' => request()->input('email_config'),
|
||||
@ -202,14 +207,20 @@ class FormController extends Controller
|
||||
'contains_page_break' => request()->input('contains_page_break'),
|
||||
];
|
||||
|
||||
// dd($form_data);
|
||||
|
||||
$is_template = request()->input('is_template');
|
||||
$input['schema'] = $form_data;
|
||||
|
||||
$form = Form::find($id);
|
||||
|
||||
$form->name = $input['name'];
|
||||
$form->name_ru = $input['name_ru'];
|
||||
$form->name_est = $input['name_est'];
|
||||
$form->slug = $input['slug'];
|
||||
$form->description = $input['description'];
|
||||
$form->description_ru = $input['description_ru'];
|
||||
$form->description_est = $input['description_est'];
|
||||
$form->schema = $input['schema'];
|
||||
$form->is_template = $is_template;
|
||||
$form->mailchimp_details = request()->input('mailchimp_details');
|
||||
|
@ -477,28 +477,21 @@ class FormDataController extends Controller
|
||||
->orderBy('created_at', 'desc')
|
||||
->get()
|
||||
->filter(function (FormData $formData) use ($request) {
|
||||
$date = null;
|
||||
if (is_array($formData->data)) {
|
||||
$dates = array_filter($formData->data, function ($item) {
|
||||
return is_string($item) && strtotime($item);
|
||||
});
|
||||
if (!empty($dates)) {
|
||||
$firstDate = reset($dates);
|
||||
$date = strtotime($firstDate);
|
||||
}
|
||||
$date = strtotime(
|
||||
array_values(
|
||||
array_filter($formData->data, fn($item) => is_string($item) && strtotime($item))
|
||||
)[0]
|
||||
);
|
||||
}
|
||||
|
||||
if (!$date) {
|
||||
return false; // Skip entries without valid dates
|
||||
}
|
||||
|
||||
$dateStr = Carbon::createFromTimestamp($date)->toDateString();
|
||||
$isValidStartDate = $request->filled('start_date')
|
||||
? $request->get('start_date') <= $dateStr
|
||||
: Carbon::now()->subDays(7)->toDateString() <= $dateStr;
|
||||
$isValidEndDate = $request->filled('end_date')
|
||||
? $request->get('end_date') >= $dateStr
|
||||
: Carbon::now()->toDateString() >= $dateStr;
|
||||
$date = Carbon::createFromTimestamp($date)->toDateString();
|
||||
$isValidStartDate = $request->filled('start_date') ?
|
||||
$request->get('start_date') <= $date :
|
||||
Carbon::now()->subDays(7)->toDateString() <= $date;
|
||||
$isValidEndDate = $request->filled('end_date') ?
|
||||
$request->get('end_date') >= $date :
|
||||
Carbon::now()->toDateString() >= $date;
|
||||
|
||||
return $isValidStartDate && $isValidEndDate;
|
||||
});
|
||||
@ -539,7 +532,7 @@ class FormDataController extends Controller
|
||||
}
|
||||
|
||||
return view('form_data.show')
|
||||
->with(compact('form', 'data', 'has_permission')); // Добавьте has_permission
|
||||
->with(compact('form', 'data'));
|
||||
}
|
||||
|
||||
public function viewData($id)
|
||||
|
@ -183,7 +183,7 @@ class HomeController extends Controller
|
||||
if (request()->ajax()) {
|
||||
$user_id = request()->user()->id;
|
||||
|
||||
$forms = Form::select('name', 'description', 'id', 'slug', 'is_global_template')
|
||||
$forms = Form::select('name', 'name_est', 'name_ru', 'description', 'description_ru', 'description_est', 'id', 'slug', 'is_global_template')
|
||||
->where(function ($query) use ($user_id) {
|
||||
$query->where('is_template', 1)
|
||||
->where('created_by', $user_id)
|
||||
@ -278,7 +278,7 @@ class HomeController extends Controller
|
||||
$forms = UserForm::join('forms', 'user_forms.form_id', '=', 'forms.id')
|
||||
->leftJoin('users', 'forms.created_by', '=', 'users.id')
|
||||
->where('user_forms.assigned_to', \Auth::id())
|
||||
->select('user_forms.permissions as permissions', 'forms.name as name', 'forms.description as description', 'forms.id as form_id', 'forms.created_at as created_at', 'forms.slug as slug', 'users.name as created_by');
|
||||
->select('user_forms.permissions as permissions', 'forms.name as name', 'forms.name_ru as name_ru', 'forms.name_est as name_est', 'forms.description as description', 'forms.description_ru as description_ru', 'forms.description_est as description_est', 'forms.id as form_id', 'forms.created_at as created_at', 'forms.slug as slug', 'users.name as created_by');
|
||||
|
||||
return DataTables::of($forms)
|
||||
->addColumn(
|
||||
|
31
app/Http/Controllers/LocaleController.php
Normal file
31
app/Http/Controllers/LocaleController.php
Normal file
@ -0,0 +1,31 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\UserSetting;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\App;
|
||||
use Illuminate\Support\Facades\Session;
|
||||
|
||||
class LocaleController extends Controller
|
||||
{
|
||||
public function __invoke($locale) {
|
||||
if (! in_array($locale, ['en', 'ru', 'est'])) {
|
||||
abort(400);
|
||||
}
|
||||
|
||||
Session::put('locale', $locale);
|
||||
|
||||
app()->setLocale($locale);
|
||||
|
||||
$userSetting = UserSetting::where('user_id', auth()->user()->id)->first();
|
||||
|
||||
if (!empty($userSetting)) {
|
||||
$userSetting->update([
|
||||
'language' => $locale
|
||||
]);
|
||||
}
|
||||
|
||||
return redirect()->back();
|
||||
}
|
||||
}
|
@ -5,6 +5,7 @@ namespace App\Http\Controllers;
|
||||
use App\UserSetting;
|
||||
use DateTimeZone;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Session;
|
||||
|
||||
class ManageSettingsController extends Controller
|
||||
{
|
||||
@ -57,6 +58,14 @@ class ManageSettingsController extends Controller
|
||||
|
||||
$setting = UserSetting::where('user_id', $input['user_id'])->first();
|
||||
|
||||
if (! in_array($request->language, ['en', 'ru', 'est'])) {
|
||||
abort(400);
|
||||
}
|
||||
|
||||
Session::put('locale', $request->language);
|
||||
|
||||
app()->setLocale($request->language);
|
||||
|
||||
if (empty($setting)) {
|
||||
UserSetting::create($input);
|
||||
} else {
|
||||
|
@ -64,5 +64,6 @@ class Kernel extends HttpKernel
|
||||
'bootstrap' => \App\Http\Middleware\Callbacks::class,
|
||||
'setDefaultConfig' => \App\Http\Middleware\SetDefaultConfigForUser::class,
|
||||
'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,
|
||||
'locale' => \App\Http\Middleware\LocaleMiddleware::class,
|
||||
];
|
||||
}
|
||||
|
37
app/Http/Middleware/LocaleMiddleware.php
Normal file
37
app/Http/Middleware/LocaleMiddleware.php
Normal file
@ -0,0 +1,37 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Middleware;
|
||||
|
||||
use App\UserSetting;
|
||||
use Closure;
|
||||
use Illuminate\Support\Facades\Session;
|
||||
|
||||
class LocaleMiddleware
|
||||
{
|
||||
/**
|
||||
* Handle an incoming request.
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @param \Closure $next
|
||||
* @return mixed
|
||||
*/
|
||||
public function handle($request, Closure $next)
|
||||
{
|
||||
|
||||
if (empty(Session::get('locale'))) {
|
||||
$userSetting = UserSetting::where('user_id', auth()->user()->id)->first();
|
||||
|
||||
$locale = 'en';
|
||||
if (!empty($userSetting)) {
|
||||
if (!in_array($userSetting->language, ['en', 'ru', 'est'])) {
|
||||
$locale = $userSetting->language;
|
||||
}
|
||||
}
|
||||
|
||||
Session::put('locale', $locale);
|
||||
app()->setLocale($locale);
|
||||
}
|
||||
|
||||
return $next($request);
|
||||
}
|
||||
}
|
141
architect.md
141
architect.md
@ -1,141 +0,0 @@
|
||||
## Подробная карта проекта
|
||||
|
||||
Этот проект представляет собой веб-приложение, разработанное на фреймворке Laravel, с использованием Vue.js для некоторых компонентов фронтенда. Он функционирует как "Многоцелевой генератор форм" (Multi-Purpose Form Generator), как указано в [`config/app.php`](config/app.php).
|
||||
|
||||
### 1. Обзор файловой структуры
|
||||
|
||||
Проект имеет стандартную структуру Laravel, которая хорошо организована и следует принципам MVC (Model-View-Controller). Основные директории:
|
||||
|
||||
* **[`app/`](app/)**: Содержит основной код приложения, включая модели, контроллеры, исключения, консольные команды, посредники и поставщики услуг.
|
||||
* **[`bootstrap/`](bootstrap/)**: Содержит файлы, которые загружают фреймворк и настраивают автозагрузку.
|
||||
* **[`config/`](config/)**: Содержит все файлы конфигурации приложения.
|
||||
* **[`database/`](database/)**: Содержит миграции базы данных, сидеры и фабрики моделей.
|
||||
* **[`public/`](public/)**: Корневая директория веб-сервера, содержащая общедоступные ресурсы, такие как скомпилированные активы (CSS, JavaScript), изображения и файл [`index.php`](public/index.php).
|
||||
* **[`resources/`](resources/)**: Содержит необработанные активы (LESS, SASS, JavaScript) и файлы представлений (Blade-шаблоны).
|
||||
* **[`routes/`](routes/)**: Определяет все маршруты приложения (веб, API, консоль, каналы).
|
||||
* **[`storage/`](storage/)**: Содержит скомпилированные шаблоны Blade, файловые сессии, кэш и другие файлы, генерируемые фреймворком.
|
||||
* **[`tests/`](tests/)**: Содержит автоматизированные тесты.
|
||||
* **[`vendor/`](vendor/)**: Содержит зависимости Composer.
|
||||
|
||||
### 2. Назначение каждого файла/директории
|
||||
|
||||
* **[`app/`](app/)**:
|
||||
* **[`app/UserForm.php`](app/UserForm.php)**: Модель Eloquent, представляющая связь между пользователями и формами, а также управляющая разрешениями для назначенных форм.
|
||||
* **[`app/Console/`](app/Console/)**:
|
||||
* **[`app/Console/Kernel.php`](app/Console/Kernel.php)**: Ядро консоли, определяющее расписание команд Artisan и загружающее пользовательские консольные команды.
|
||||
* **[`app/Console/Commands/`](app/Console/Commands/)**: Содержит пользовательские команды Artisan. Например, [`Template.php`](app/Console/Commands/Template.php) (строка 6, [`app/Console/Kernel.php`](app/Console/Kernel.php:6)) используется для команд, связанных с шаблонами.
|
||||
* **[`app/Enums/`](app/Enums/)**: Содержит перечисления, такие как [`User/RoleEnum.php`](app/Enums/User/RoleEnum.php) (строка 5, [`database/seeders/UsersTableSeeder.php`](database/seeders/UsersTableSeeder.php:5)), используемые для определения ролей пользователей.
|
||||
* **[`app/Exceptions/`](app/Exceptions/)**:
|
||||
* **[`app/Exceptions/Handler.php`](app/Exceptions/Handler.php)**: Централизованный обработчик исключений, который регистрирует и отображает ошибки. В режиме "demo" он также отправляет уведомления по электронной почте об исключениях (строки 48-50, [`app/Exceptions/Handler.php`](app/Exceptions/Handler.php:48)).
|
||||
* **[`app/Http/`](app/Http/)**:
|
||||
* **[`app/Http/helpers.php`](app/Http/helpers.php)**: Содержит набор глобальных вспомогательных функций, таких как `pos_boot` (для проверки лицензии), `is_saas_enabled` (для проверки включения SaaS-модуля) и `isAppInstalled` (для проверки установки приложения).
|
||||
* **[`app/Http/Controllers/`](app/Http/Controllers/)**: Содержит контроллеры, обрабатывающие логику запросов.
|
||||
* **[`app/Http/Controllers/Controller.php`](app/Http/Controllers/Controller.php)**: Базовый контроллер, предоставляющий общие методы для обработки HTTP-ответов (успех, ошибка, несанкционированный доступ), проверки подписки и квоты пользователя, управления посетителями и разрешениями форм.
|
||||
* **[`app/Http/Controllers/FormController.php`](app/Http/Controllers/FormController.php)**: Обрабатывает логику, связанную с формами (создание, редактирование, копирование, генерация виджетов, загрузка кода, управление глобальными шаблонами).
|
||||
* **[`app/Http/Controllers/FormDataController.php`](app/Http/Controllers/FormDataController.php)**: Управляет данными, отправленными через формы (сохранение, просмотр, редактирование, загрузка PDF, отчеты).
|
||||
* **[`app/Http/Controllers/HomeController.php`](app/Http/Controllers/HomeController.php)**: Контроллер для домашней страницы и связанных функций (например, получение шаблонов, назначенных форм, тестирование SMTP).
|
||||
* **[`app/Http/Controllers/UploadController.php`](app/Http/Controllers/UploadController.php)**: Обрабатывает загрузку и удаление файлов.
|
||||
* **[`app/Http/Controllers/Auth/`](app/Http/Controllers/Auth/)**: Содержит контроллеры для аутентификации пользователей (вход, регистрация, сброс пароля, подтверждение).
|
||||
* **[`app/Http/Controllers/form_bundle_libraries/`](app/Http/Controllers/form_bundle_libraries/)**: Содержит сторонние библиотеки, такие как PHPMailer, используемые для отправки электронной почты.
|
||||
* **[`app/Http/Controllers/Superadmin/`](app/Http/Controllers/Superadmin/)**: Контроллеры для функций супер-администратора (управление пользователями, пакетами, подписками).
|
||||
* **[`app/Http/Middleware/`](app/Http/Middleware/)**: Содержит посредники HTTP, которые фильтруют HTTP-запросы, входящие в приложение. Примеры включают [`Authenticate.php`](app/Http/Middleware/Authenticate.php) (для проверки аутентификации), [`IsInstalled.php`](app/Http/Middleware/IsInstalled.php) (для проверки установки приложения), [`VerifyCsrfToken.php`](app/Http/Middleware/VerifyCsrfToken.php) (для защиты от CSRF-атак).
|
||||
* **[`app/Mail/`](app/Mail/)**: Содержит классы для отправки электронной почты, например, [`ExceptionOccured.php`](app/Mail/ExceptionOccured.php) (строка 6, [`app/Exceptions/Handler.php`](app/Exceptions/Handler.php:6)).
|
||||
* **[`app/Notifications/`](app/Notifications/)**: Содержит классы для отправки уведомлений.
|
||||
* **[`app/Providers/`](app/Providers/)**: Содержит поставщиков услуг, которые регистрируют привязки контейнера служб, обработчики событий, посредники и маршруты.
|
||||
* **[`app/Traits/`](app/Traits/)**: Содержит трейты, которые могут быть повторно использованы в различных классах.
|
||||
* **[`bootstrap/`](bootstrap/)**:
|
||||
* **[`bootstrap/cache/`](bootstrap/cache/)**: Содержит файлы кэша, генерируемые Laravel для оптимизации производительности.
|
||||
* **[`config/`](config/)**:
|
||||
* **[`config/app.php`](config/app.php)**: Основной файл конфигурации приложения, определяющий название приложения, среду, режим отладки, URL, часовой пояс, локаль, ключ шифрования, поставщиков услуг и псевдонимы классов.
|
||||
* **[`config/auth.php`](config/auth.php)**: Конфигурация аутентификации.
|
||||
* **[`config/database.php`](config/database.php)**: Конфигурация подключения к базе данных, включая настройки для MySQL, SQLite, PostgreSQL и SQL Server, а также настройки Redis.
|
||||
* Другие файлы конфигурации (например, `barcode.php`, `mail.php`, `paypal.php`, `permission.php`, `session.php`, `webhook-server.php`) настраивают различные аспекты приложения и сторонние интеграции.
|
||||
* **[`database/`](database/)**:
|
||||
* **[`database/factories/`](database/factories/)**: Содержит фабрики моделей для генерации фиктивных данных.
|
||||
* **[`database/migrations/`](database/migrations/)**: Содержит файлы миграций базы данных, которые определяют структуру таблиц базы данных. Например, [`2014_10_12_000000_create_users_table.php`](database/migrations/2014_10_12_000000_create_users_table.php) создает таблицу `users`.
|
||||
* **[`database/seeders/`](database/seeders/)**: Содержит сидеры базы данных для заполнения базы данных начальными данными. Например, [`UsersTableSeeder.php`](database/seeders/UsersTableSeeder.php) создает пользователя-администратора по умолчанию.
|
||||
* **[`public/`](public/)**:
|
||||
* **[`public/index.php`](public/index.php)**: Точка входа в приложение.
|
||||
* **[`public/css/`](public/css/)**, **[`public/js/`](public/js/)**: Содержат скомпилированные файлы CSS и JavaScript.
|
||||
* **[`public/img/`](public/img/)**: Содержит изображения.
|
||||
* **[`public/plugins/`](public/plugins/)**: Содержит сторонние плагины и библиотеки.
|
||||
* **[`resources/`](resources/)**:
|
||||
* **[`resources/js/`](resources/js/)**: Содержит исходные файлы JavaScript.
|
||||
* **[`resources/js/app.js`](resources/js/app.js)**: Основной файл JavaScript, который инициализирует Vue.js, регистрирует компоненты Vue, включает сторонние библиотеки (AdminLTE, Ladda, easyqrcodejs, accounting-js) и определяет глобальные функции и правила валидации.
|
||||
* **[`resources/js/bootstrap.js`](resources/js/bootstrap.js)**: Инициализирует общие библиотеки JavaScript, такие как Axios и Lodash.
|
||||
* **[`resources/js/components/`](resources/js/components/)**: Содержит компоненты Vue.js, используемые в приложении (например, `CreateForm.vue`, `FieldConfigurator.vue`, `Mailchimp.vue`, `Webhook/`).
|
||||
* **[`resources/sass/`](resources/sass/)**: Содержит исходные файлы Sass/SCSS для стилей.
|
||||
* **[`resources/views/`](resources/views/)**: Содержит шаблоны Blade для представлений.
|
||||
* **[`resources/views/welcome.blade.php`](resources/views/welcome.blade.php)**: Начальное представление для корневого URL.
|
||||
* **[`resources/views/auth/`](resources/views/auth/)**: Представления для аутентификации (вход, регистрация, сброс пароля).
|
||||
* **[`resources/views/form/`](resources/views/form/)**: Представления, связанные с формами.
|
||||
* **[`resources/views/form_data/`](resources/views/form_data/)**: Представления для отображения и управления данными форм.
|
||||
* **[`resources/views/layouts/`](resources/views/layouts/)**: Содержит основные макеты приложения.
|
||||
* **[`resources/views/superadmin/`](resources/views/superadmin/)**: Представления для интерфейса супер-администратора.
|
||||
* **[`resources/views/user/`](resources/views/user/)**: Представления, связанные с профилем и настройками пользователя.
|
||||
* **[`routes/`](routes/)**:
|
||||
* **[`routes/web.php`](routes/web.php)**: Определяет веб-маршруты для пользовательского интерфейса приложения. Включает маршруты для аутентификации, домашней страницы, управления формами, данными форм, профилем пользователя, настройками и подписками. Также содержит маршруты для функций супер-администратора.
|
||||
* **[`routes/api.php`](routes/api.php)**: Определяет маршруты API.
|
||||
* **[`routes/console.php`](routes/console.php)**: Определяет консольные команды Artisan.
|
||||
* **[`routes/channels.php`](routes/channels.php)**: Определяет каналы широковещания для событий Laravel Echo.
|
||||
|
||||
### 3. Ключевые компоненты и их взаимодействие
|
||||
|
||||
* **Маршруты (`routes/`)**: Определяют, как HTTP-запросы направляются к соответствующим контроллерам. [`routes/web.php`](routes/web.php) является основным файлом для веб-интерфейса, а [`routes/api.php`](routes/api.php) - для API.
|
||||
* **Контроллеры (`app/Http/Controllers/`)**: Обрабатывают входящие HTTP-запросы, взаимодействуют с моделями для получения или сохранения данных и возвращают представления или JSON-ответы. Например, `FormController` обрабатывает запросы, связанные с формами, а `FormDataController` - с данными форм.
|
||||
* **Модели (`app/` и другие директории)**: Представляют таблицы базы данных и обеспечивают интерфейс для взаимодействия с ними. Примеры включают [`App\UserForm`](app/UserForm.php) (строка 7, [`app/UserForm.php`](app/UserForm.php:7)), `App\Form` (строка 5, [`app/Http/Controllers/Controller.php`](app/Http/Controllers/Controller.php:5)), `App\PackageSubscription` (строка 6, [`app/Http/Controllers/Controller.php`](app/Http/Controllers/Controller.php:6)) и `App\Visitor` (строка 8, [`app/Http/Controllers/Controller.php`](app/Http/Controllers/Controller.php:8)).
|
||||
* **Представления (`resources/views/`)**: Содержат HTML-код и логику отображения данных. Используют шаблонизатор Blade. Компоненты Vue.js (например, [`resources/js/components/CreateForm.vue`](resources/js/components/CreateForm.vue)) встраиваются в эти представления для создания интерактивного фронтенда.
|
||||
* **Посредники (`app/Http/Middleware/`)**: Выполняют задачи до или после обработки запроса контроллером. Например, `IsInstalled` проверяет, установлено ли приложение, а `Authenticate` проверяет аутентификацию пользователя.
|
||||
* **Вспомогательные функции (`app/Http/helpers.php`)**: Предоставляют общие утилиты, доступные по всему приложению.
|
||||
* **Консольные команды (`app/Console/Commands/`)**: Позволяют выполнять задачи через командную строку.
|
||||
* **Поставщики услуг (`app/Providers/`)**: Регистрируют и загружают различные компоненты и сервисы приложения.
|
||||
|
||||
**Взаимодействие:**
|
||||
Пользователь отправляет HTTP-запрос, который обрабатывается маршрутом ([`routes/web.php`](routes/web.php)). Маршрут направляет запрос к соответствующему контроллеру ([`app/Http/Controllers/`](app/Http/Controllers/)). Контроллер взаимодействует с моделями ([`app/UserForm.php`](app/UserForm.php), `App\Form` и т.д.) для выполнения операций с базой данных. После обработки данных контроллер возвращает представление ([`resources/views/`](resources/views/)) или JSON-ответ. Посредники могут перехватывать запросы до или после их обработки контроллером для выполнения таких задач, как аутентификация или проверка установки. Фронтенд, построенный на Vue.js ([`resources/js/app.js`](resources/js/app.js) и [`resources/js/components/`](resources/js/components/)), взаимодействует с бэкендом через AJAX-запросы к маршрутам, определенным в [`routes/web.php`](routes/web.php) и [`routes/api.php`](routes/api.php).
|
||||
|
||||
### 4. Общая архитектура проекта
|
||||
|
||||
Проект следует архитектурному паттерну **MVC (Model-View-Controller)**, который является стандартным для Laravel.
|
||||
|
||||
* **Модели**: Представлены классами Eloquent ORM в директории [`app/`](app/) (например, [`UserForm.php`](app/UserForm.php)). Они отвечают за взаимодействие с базой данных и бизнес-логику, связанную с данными.
|
||||
* **Представления**: Находятся в директории [`resources/views/`](resources/views/) и используют шаблонизатор Blade. Они отвечают за отображение данных пользователю. Кроме того, компоненты Vue.js в [`resources/js/components/`](resources/js/components/) также служат частью уровня представления, обеспечивая интерактивность на стороне клиента.
|
||||
* **Контроллеры**: Расположены в [`app/Http/Controllers/`](app/Http/Controllers/). Они действуют как посредники между моделями и представлениями, обрабатывая пользовательский ввод, взаимодействуя с моделями и выбирая соответствующее представление для отображения.
|
||||
|
||||
Дополнительно, проект включает в себя:
|
||||
* **Посредники (Middleware)**: Для фильтрации HTTP-запросов.
|
||||
* **Маршрутизация (Routing)**: Для определения конечных точек приложения.
|
||||
* **Консоль (Console)**: Для выполнения задач командной строки.
|
||||
* **Сидеры и Миграции (Seeders & Migrations)**: Для управления схемой базы данных и начальными данными.
|
||||
* **Система аутентификации и авторизации**: Встроенная в Laravel, с дополнительными ролями через `spatie/laravel-permission`.
|
||||
* **SaaS-функциональность**: Присутствуют проверки подписки и квоты, что указывает на возможность использования проекта в качестве SaaS-платформы.
|
||||
|
||||
### 5. Используемые технологии/фреймворки
|
||||
|
||||
* **Бэкенд**:
|
||||
* **PHP**: Основной язык программирования.
|
||||
* **Laravel (v9.52)**: Веб-фреймворк (подтверждено `readme.md` и `composer.json`).
|
||||
* **MySQL**: Предполагаемая база данных по умолчанию (на основе [`config/database.php`](config/database.php)).
|
||||
* **Composer**: Менеджер зависимостей PHP.
|
||||
* **Spatie/laravel-permission**: Для управления ролями и разрешениями пользователей.
|
||||
* **Srmklive/paypal**: Для интеграции с PayPal.
|
||||
* **Stripe/stripe-php**: Для интеграции со Stripe.
|
||||
* **Intervention/image**: Для обработки изображений.
|
||||
* **Milon/barcode**: Для генерации штрих-кодов.
|
||||
* **Carlos-meneses/laravel-mpdf**: Для генерации PDF.
|
||||
* **Spatie/laravel-newsletter**: Для интеграции с Mailchimp (или аналогичными сервисами рассылки).
|
||||
* **Spatie/laravel-webhook-server**: Для обработки веб-хуков.
|
||||
* **Yajra/laravel-datatables-oracle**: Для работы с таблицами данных.
|
||||
* **PHPMailer**: Сторонняя библиотека для отправки электронной почты (найдена в [`app/Http/Controllers/form_bundle_libraries/PHPMailer/`](app/Http/Controllers/form_bundle_libraries/PHPMailer/)).
|
||||
|
||||
* **Фронтенд**:
|
||||
* **JavaScript**: Основной язык сценариев.
|
||||
* **Vue.js (v2.5.17)**: Прогрессивный фреймворк JavaScript для построения пользовательских интерфейсов (подтверждено `package.json` и [`resources/js/app.js`](resources/js/app.js)).
|
||||
* **NPM/Yarn**: Менеджер пакетов JavaScript (используется `package.json`).
|
||||
* **Laravel Mix (v4.0.7)**: API для определения шагов сборки Webpack для приложений Laravel.
|
||||
* **Sass**: Препроцессор CSS.
|
||||
* **AdminLTE (v3.0.0-beta.2)**: Шаблон панели администратора (подтверждено `package.json` и [`resources/js/app.js`](resources/js/app.js)).
|
||||
* **Accounting.js**: Для форматирования валюты.
|
||||
* **Easyqrcodejs**: Для генерации QR-кодов.
|
||||
* **Ladda**: Для кнопок с индикаторами загрузки.
|
||||
* **Particles.js**: Для интерактивного фона на странице приветствия ([`resources/views/welcome.blade.php`](resources/views/welcome.blade.php)).
|
||||
* **VueDraggable**: Для функциональности перетаскивания.
|
@ -0,0 +1,35 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function up()
|
||||
{
|
||||
Schema::table('forms', function (Blueprint $table) {
|
||||
$table->string('name_ru')->after('name')->nullable();
|
||||
$table->string('name_est')->after('name_ru')->nullable();
|
||||
$table->string('description_ru')->after('description')->nullable();
|
||||
$table->string('description_est')->after('description_ru')->nullable();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function down()
|
||||
{
|
||||
Schema::table('forms', function (Blueprint $table) {
|
||||
//
|
||||
});
|
||||
}
|
||||
};
|
@ -81,8 +81,8 @@ return [
|
||||
'click_to_add_tags' => 'Click to add the tags',
|
||||
'body' => 'Body',
|
||||
'email_body' => 'Email Body',
|
||||
'auto_response_settings' => 'Auto Response Settings',
|
||||
'enable_auto_response' => 'Enable Auto Response?',
|
||||
'auto_restonse_settings' => 'Auto Restonse Settings',
|
||||
'enable_auto_restonse' => 'Enable Auto Restonse?',
|
||||
'smtp_settings' => 'SMTP Settings',
|
||||
'use_system_smtp' => 'Use System SMTP?',
|
||||
'host' => 'Host',
|
||||
@ -425,7 +425,7 @@ return [
|
||||
'tour_step_2_intro' => '<b class="text-success">Step 2:</b></br> Drop the element here & click it to configure.',
|
||||
'tour_step_3_intro' => '<b class="text-success">Step 3:</b></br> Form & Element configuration will appear here.',
|
||||
'tour_step_4_intro' => '<b class="text-success">Step 4:</b></br> Add conditions to show/hide element based on other element values.',
|
||||
'tour_step_5_intro' => '<b class="text-success">Step 5:</b></br> Configure receiving of submission email & auto-respond email to the user.',
|
||||
'tour_step_5_intro' => '<b class="text-success">Step 5:</b></br> Configure receiving of submission email & auto-restond email to the user.',
|
||||
'tour_step_6_intro' => '<b class="text-success">Step 6:</b></br> Configure form reCaptcha, design, notifications, scheduling, submission reference number & others.',
|
||||
'tour_step_7_intro' => '<b class="text-success">Step 7:</b></br> Integrate mailchimp.',
|
||||
'tour_step_8_intro' => '<b class="text-success">Step 8:</b></br> Add additional Js/css in the form.',
|
||||
@ -451,7 +451,7 @@ return [
|
||||
'field_name_should_nt_have_space' => 'Field name should not have space',
|
||||
'duplicate_field_name_choose_unique' => 'Duplicate field name, choose unique name',
|
||||
'field_dont_have_name_property' => ":input field don't have name property",
|
||||
'field_contain_space' => ':input field contain whitespace in name',
|
||||
'field_contain_space' => ':input field contain whitestace in name',
|
||||
'field_contain_duplicate_field_name' => ':input field contain duplicate name',
|
||||
'key' => 'Key',
|
||||
'add_form_custom_attribute' => 'Add form custom attribute',
|
||||
@ -677,4 +677,16 @@ return [
|
||||
'error_msg_for_not_allowed_value' => 'Error message for not allowed value',
|
||||
'enter_allowed_value_per_line' => 'Enter one allowed value per line.',
|
||||
'values_allowed_tooltip' => 'Values provided here will only be allowed while submitting the form, keep it empty to allow all values',
|
||||
'field_label_est' => 'Field Label in est',
|
||||
'field_label_ru' => 'Field Label in Ru',
|
||||
'content_est' => 'Content in est',
|
||||
'content_ru' => 'Content in Ru',
|
||||
'placeholder_est' => 'Placeholder in est',
|
||||
'placeholder_ru' => 'Placeholder in Ru',
|
||||
'options_est' => 'Options in est',
|
||||
'options_ru' => 'Options in Ru',
|
||||
'form_name_est' => 'Form Name est',
|
||||
'form_name_ru' => 'Form Name ru',
|
||||
'form_description_est' => 'Form Description est',
|
||||
'form_description_ru' => 'Form Description ru',
|
||||
];
|
||||
|
2
package-lock.json
generated
2
package-lock.json
generated
@ -1,5 +1,5 @@
|
||||
{
|
||||
"name": "uniquesoft.es",
|
||||
"name": "Aknaproff",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -17,6 +17,26 @@
|
||||
v-model="element.label">
|
||||
</div>
|
||||
|
||||
<div class="form-group"
|
||||
v-if="!_.includes(['heading', 'hr', 'html_text'], element.type)">
|
||||
<label>
|
||||
{{trans('messages.field_label_est')}}
|
||||
<span class="error">*</span>
|
||||
</label>
|
||||
<input type="text" class="form-control form-control-sm"
|
||||
v-model="element.label_est">
|
||||
</div>
|
||||
|
||||
<div class="form-group"
|
||||
v-if="!_.includes(['heading', 'hr', 'html_text'], element.type)">
|
||||
<label>
|
||||
{{trans('messages.field_label_ru')}}
|
||||
<span class="error">*</span>
|
||||
</label>
|
||||
<input type="text" class="form-control form-control-sm"
|
||||
v-model="element.label_ru">
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label>
|
||||
{{trans('messages.field_name')}}
|
||||
@ -88,7 +108,6 @@
|
||||
:element="element">
|
||||
</pdf-uploader>
|
||||
</div>
|
||||
|
||||
<!-- countdown -->
|
||||
<div v-if="_.includes(['countdown'], element.type)">
|
||||
<div class="mb-1">
|
||||
@ -276,6 +295,20 @@
|
||||
v-model="element.placeholder">
|
||||
</div>
|
||||
|
||||
<div class="form-group"
|
||||
v-if="_.includes(['text', 'textarea', 'text_editor'], element.type)">
|
||||
<label>{{trans('messages.placeholder_est')}}</label>
|
||||
<input type="text" class="form-control form-control-sm"
|
||||
v-model="element.placeholder_est">
|
||||
</div>
|
||||
|
||||
<div class="form-group"
|
||||
v-if="_.includes(['text', 'textarea', 'text_editor'], element.type)">
|
||||
<label>{{trans('messages.placeholder_ru')}}</label>
|
||||
<input type="text" class="form-control form-control-sm"
|
||||
v-model="element.placeholder_ru">
|
||||
</div>
|
||||
|
||||
<div class="form-group"
|
||||
v-if="!_.includes(['heading', 'terms_and_condition', 'hr', 'html_text', 'rating', 'youtube', 'iframe', 'pdf', 'countdown'], element.type)">
|
||||
<label>{{trans('messages.help_text')}}</label>
|
||||
@ -622,6 +655,26 @@
|
||||
</small>
|
||||
</div>
|
||||
|
||||
<div class="form-group"
|
||||
v-if="_.includes(['radio', 'checkbox', 'dropdown'], element.type)">
|
||||
<label>{{trans('messages.options_est')}}</label>
|
||||
<textarea class="form-control form-control-sm"
|
||||
v-model="element.options_est"></textarea>
|
||||
<small class="form-text">
|
||||
{{trans('messages.enter_one_option_per_line')}}
|
||||
</small>
|
||||
</div>
|
||||
|
||||
<div class="form-group"
|
||||
v-if="_.includes(['radio', 'checkbox', 'dropdown'], element.type)">
|
||||
<label>{{trans('messages.options_ru')}}</label>
|
||||
<textarea class="form-control form-control-sm"
|
||||
v-model="element.options_ru"></textarea>
|
||||
<small class="form-text">
|
||||
{{trans('messages.enter_one_option_per_line')}}
|
||||
</small>
|
||||
</div>
|
||||
|
||||
<div class="row mb-1"
|
||||
v-if="_.includes(['radio', 'checkbox'], element.type)">
|
||||
<div class="col-md-12">
|
||||
@ -686,6 +739,20 @@
|
||||
v-model="element.content"></textarea>
|
||||
</div>
|
||||
|
||||
<div class="form-group"
|
||||
v-if="_.includes(['heading'], element.type)">
|
||||
<label>{{trans('messages.content_est')}}</label>
|
||||
<textarea class="form-control form-control-sm"
|
||||
v-model="element.content_est"></textarea>
|
||||
</div>
|
||||
|
||||
<div class="form-group"
|
||||
v-if="_.includes(['heading'], element.type)">
|
||||
<label>{{trans('messages.content_ru')}}</label>
|
||||
<textarea class="form-control form-control-sm"
|
||||
v-model="element.content_ru"></textarea>
|
||||
</div>
|
||||
|
||||
<div class="form-group"
|
||||
v-if="_.includes(['heading'], element.type)">
|
||||
<label for="heading_text_color">
|
||||
|
@ -8,7 +8,7 @@
|
||||
<i class="fas fa-sort handle pointer font_icon_size float-left mr-3" :class="[display_handler]"
|
||||
:title="trans('messages.drag_element_using_icon')"></i>
|
||||
<span :style="{'color': settings.color.label}">
|
||||
{{ element.label }}
|
||||
{{ form_trans_label(element, 'label') }}
|
||||
</span>
|
||||
<span :style="{'color': settings.color.required_asterisk_color}" v-if="element.required">*</span>
|
||||
<i class="fas fa-info-circle cursor-pointer modal_trigger"
|
||||
@ -24,7 +24,7 @@
|
||||
</div>
|
||||
<input :type="element.subtype" class="form-control"
|
||||
:name="element.name"
|
||||
:placeholder="element.placeholder"
|
||||
:placeholder="form_trans_label(element, 'placeholder')"
|
||||
:class="[element.size, element.custom_class, element.conditional_class]"
|
||||
:required="element.required && applyValidations"
|
||||
v-bind="getDynamicallyGeneratedAttributeObj(element.validations, element.custom_attributes)"
|
||||
@ -54,7 +54,7 @@
|
||||
<i class="fas fa-sort handle pointer font_icon_size float-left mr-3" :class="[display_handler]"
|
||||
:title="trans('messages.drag_element_using_icon')"></i>
|
||||
<span :style="{'color': settings.color.label}">
|
||||
{{ element.label }}
|
||||
{{ form_trans_label(element, 'label') }}
|
||||
</span>
|
||||
<span :style="{'color': settings.color.required_asterisk_color}" v-if="element.required">*</span>
|
||||
<i class="fas fa-info-circle cursor-pointer modal_trigger"
|
||||
@ -98,7 +98,7 @@
|
||||
<i class="fas fa-sort handle pointer font_icon_size float-left mr-3" :class="[display_handler]"
|
||||
:title="trans('messages.drag_element_using_icon')"></i>
|
||||
<span :style="{'color': settings.color.label}">
|
||||
{{ element.label }}
|
||||
{{ form_trans_label(element, 'label') }}
|
||||
</span>
|
||||
<span :style="{'color': settings.color.required_asterisk_color}" v-if="element.required">*</span>
|
||||
<i class="fas fa-info-circle cursor-pointer modal_trigger"
|
||||
@ -155,7 +155,7 @@
|
||||
<i class="fas fa-sort handle pointer font_icon_size float-left mr-3" :class="[display_handler]"
|
||||
:title="trans('messages.drag_element_using_icon')"></i>
|
||||
<span :style="{'color': settings.color.label}">
|
||||
{{ element.label }}
|
||||
{{ form_trans_label(element, 'label') }}
|
||||
</span>
|
||||
<span :style="{'color': settings.color.required_asterisk_color}" v-if="element.required">*</span>
|
||||
<i class="fas fa-info-circle cursor-pointer modal_trigger"
|
||||
@ -175,7 +175,7 @@
|
||||
:name="element.name"
|
||||
:id="element.name"
|
||||
:cols="element.columns"
|
||||
:placeholder="element.placeholder"
|
||||
:placeholder="form_trans_label(element, 'placeholder')"
|
||||
:class="[element.custom_class, element.conditional_class]"
|
||||
:required="element.required && applyValidations"
|
||||
v-bind="getDynamicallyGeneratedAttributeObj(element.validations, element.custom_attributes)"
|
||||
@ -204,7 +204,7 @@
|
||||
<label :for="element.name">
|
||||
<i class="fas fa-sort handle pointer font_icon_size float-left mr-3" :class="[display_handler]"
|
||||
:title="trans('messages.drag_element_using_icon')"></i>
|
||||
<span :style="{'color': settings.color.label}">{{ element.label }}</span>
|
||||
<span :style="{'color': settings.color.label}">{{ form_trans_label(element, 'label') }} </span>
|
||||
<span :style="{'color': settings.color.required_asterisk_color}" v-if="element.required">*</span>
|
||||
<i class="fas fa-info-circle cursor-pointer modal_trigger"
|
||||
v-if="!_.isUndefined(element.popover_help_text) && element.popover_help_text.enable"
|
||||
@ -213,7 +213,7 @@
|
||||
</label>
|
||||
<div class="row">
|
||||
<div :class="[spreadColumnForElement(element)]"
|
||||
v-for="(option, index) in element.options.split('\n')">
|
||||
v-for="(option, index) in form_trans_label(element, 'options').split('\n')">
|
||||
<div class="custom-control" :class="[element.type == 'radio' ? 'custom-radio' : 'custom-checkbox']">
|
||||
<input class="custom-control-input"
|
||||
:type="element.type"
|
||||
@ -248,7 +248,7 @@
|
||||
<label :for="element.name">
|
||||
<i class="fas fa-sort handle pointer font_icon_size float-left mr-3" :class="[display_handler]"
|
||||
:title="trans('messages.drag_element_using_icon')"></i>
|
||||
<span :style="{'color': settings.color.label}">{{ element.label }}</span>
|
||||
<span :style="{'color': settings.color.label}">{{ form_trans_label(element, 'label') }}</span>
|
||||
<span :style="{'color': settings.color.required_asterisk_color}" v-if="element.required">*</span>
|
||||
<i class="fas fa-info-circle cursor-pointer modal_trigger"
|
||||
v-if="!_.isUndefined(element.popover_help_text) && element.popover_help_text.enable"
|
||||
@ -270,7 +270,7 @@
|
||||
@change="$emit('apply_conditions')"
|
||||
:data-msg-required="element.required_error_msg"
|
||||
>
|
||||
<option v-for="option in element.options.split('\n')"
|
||||
<option v-for="option in form_trans_label(element, 'options').split('\n')"
|
||||
:selected="_.includes(_.get(submitted_data, element.name, ''), option)"
|
||||
>
|
||||
{{ option }}
|
||||
@ -297,7 +297,7 @@
|
||||
<i class="fas fa-sort handle pointer font_icon_size float-left mr-3" :class="[display_handler]"
|
||||
:title="trans('messages.drag_element_using_icon')"></i>
|
||||
<div
|
||||
v-html="'<' + element.tag + ' style=color:' + element.text_color + '>' + element.content + '</' + element.tag + '>'"
|
||||
v-html="'<' + element.tag + ' style=color:' + element.text_color + '>' + form_trans_label(element, 'content') + '</' + element.tag + '>'"
|
||||
:class="[element.custom_class]">
|
||||
</div>
|
||||
</div>
|
||||
@ -308,7 +308,7 @@
|
||||
<label :for="element.name">
|
||||
<i class="fas fa-sort handle pointer font_icon_size float-left mr-3" :class="[display_handler]"
|
||||
:title="trans('messages.drag_element_using_icon')"></i>
|
||||
<span :style="{'color': settings.color.label}">{{ element.label }}</span>
|
||||
<span :style="{'color': settings.color.label}">{{ form_trans_label(element, 'label') }}</span>
|
||||
<span :style="{'color': settings.color.required_asterisk_color}" v-if="element.required">*</span>
|
||||
<i class="fas fa-info-circle cursor-pointer modal_trigger"
|
||||
v-if="!_.isUndefined(element.popover_help_text) && element.popover_help_text.enable"
|
||||
@ -336,7 +336,7 @@
|
||||
<label :for="element.name">
|
||||
<i class="fas fa-sort handle pointer font_icon_size float-left mr-3" :class="[display_handler]"
|
||||
:title="trans('messages.drag_element_using_icon')"></i>
|
||||
<span :style="{'color': settings.color.label}">{{ element.label }}</span>
|
||||
<span :style="{'color': settings.color.label}">{{ form_trans_label(element, 'label') }}</span>
|
||||
<span :style="{'color': settings.color.required_asterisk_color}" v-if="element.required">*</span>
|
||||
<i class="fas fa-info-circle cursor-pointer modal_trigger"
|
||||
v-if="!_.isUndefined(element.popover_help_text) && element.popover_help_text.enable"
|
||||
@ -375,9 +375,9 @@
|
||||
>
|
||||
<label class="custom-control-label" for="terms_and_condition">
|
||||
<a :href="element.link" target="_blank" v-if="element.link">
|
||||
{{ element.label }}
|
||||
{{ form_trans_label(element, 'label') }}
|
||||
</a>
|
||||
<span v-else>{{ element.label }}</span>
|
||||
<span v-else>{{ form_trans_label(element, 'label') }}</span>
|
||||
<span :style="{'color': settings.color.required_asterisk_color}" v-if="element.required">*</span>
|
||||
<i class="fas fa-info-circle cursor-pointer modal_trigger"
|
||||
v-if="!_.isUndefined(element.popover_help_text) && element.popover_help_text.enable"
|
||||
@ -412,7 +412,7 @@
|
||||
<label :for="element.name">
|
||||
<i class="fas fa-sort handle pointer font_icon_size float-left mr-3" :class="[display_handler]"
|
||||
:title="trans('messages.drag_element_using_icon')"></i>
|
||||
<span :style="{'color': settings.color.label}">{{ element.label }}</span>
|
||||
<span :style="{'color': settings.color.label}">{{ form_trans_label(element, 'label') }}</span>
|
||||
<span :style="{'color': settings.color.required_asterisk_color}" v-if="element.required">*</span>
|
||||
<i class="fas fa-info-circle cursor-pointer modal_trigger"
|
||||
v-if="!_.isUndefined(element.popover_help_text) && element.popover_help_text.enable"
|
||||
@ -451,7 +451,7 @@
|
||||
>
|
||||
<label :for="element.name">
|
||||
<span :style="{'color': settings.color.label}" class="ml-2">
|
||||
{{ element.label }}
|
||||
{{ form_trans_label(element, 'label') }}
|
||||
</span>
|
||||
<span :style="{'color': settings.color.required_asterisk_color}" v-if="element.required">*</span>
|
||||
<i class="fas fa-info-circle cursor-pointer modal_trigger"
|
||||
@ -476,7 +476,7 @@
|
||||
:title="trans('messages.drag_element_using_icon')"></i>
|
||||
<label :for="element.name">
|
||||
<span :style="{'color': settings.color.label}" class="ml-2">
|
||||
{{ element.label }}
|
||||
{{ form_trans_label(element, 'label') }}
|
||||
</span>
|
||||
<span :style="{'color': settings.color.required_asterisk_color}" v-if="element.required">*</span>
|
||||
<i class="fas fa-info-circle cursor-pointer modal_trigger"
|
||||
@ -535,7 +535,7 @@
|
||||
:title="trans('messages.drag_element_using_icon')"></i>
|
||||
<label :for="element.name">
|
||||
<span :style="{'color': settings.color.label}" class="ml-2">
|
||||
{{ element.label }}
|
||||
{{ form_trans_label(element, 'label') }}
|
||||
</span>
|
||||
<span :style="{'color': settings.color.required_asterisk_color}" v-if="element.required">*</span>
|
||||
</label>
|
||||
@ -563,7 +563,7 @@
|
||||
:title="trans('messages.drag_element_using_icon')"></i>
|
||||
<label :for="element.name">
|
||||
<span :style="{'color': settings.color.label}" class="ml-2">
|
||||
{{ element.label }}
|
||||
{{ form_trans_label(element, 'label') }}
|
||||
</span>
|
||||
<span :style="{'color': settings.color.required_asterisk_color}" v-if="element.required">*</span>
|
||||
</label>
|
||||
@ -588,7 +588,7 @@
|
||||
:title="trans('messages.drag_element_using_icon')"></i>
|
||||
<label :for="element.name">
|
||||
<span :style="{'color': settings.color.label}" class="ml-2">
|
||||
{{ element.label }}
|
||||
{{ form_trans_label(element, 'label') }}
|
||||
</span>
|
||||
<span :style="{'color': settings.color.required_asterisk_color}" v-if="element.required">*</span>
|
||||
</label>
|
||||
@ -617,7 +617,7 @@
|
||||
:title="trans('messages.drag_element_using_icon')"></i>
|
||||
<label :for="element.name">
|
||||
<span :style="{'color': settings.color.label}" class="ml-2">
|
||||
{{ element.label }}
|
||||
{{ form_trans_label(element, 'label') }}
|
||||
</span>
|
||||
<span :style="{'color': settings.color.required_asterisk_color}" v-if="element.required">*</span>
|
||||
</label>
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -508,6 +508,21 @@ export default {
|
||||
initialize_countdowntimer(element);
|
||||
}, 2000); //initialize after 2 sec
|
||||
}
|
||||
},
|
||||
form_trans_label (data, key) {
|
||||
const currLang = document.documentElement.lang
|
||||
if (currLang === 'ru') {
|
||||
if (data[`${key}_ru`] == '' || data[`${key}_ru`] === undefined || data[`${key}_ru`] === null) {
|
||||
return data[key];
|
||||
}
|
||||
return data[`${key}_ru`]
|
||||
} else if (currLang === 'est') {
|
||||
if (data[`${key}_est`] == '' || data[`${key}_est`] === undefined || data[`${key}_est`] === null) {
|
||||
return data[key];
|
||||
}
|
||||
return data[`${key}_est`]
|
||||
}
|
||||
return data[key];
|
||||
}
|
||||
},
|
||||
};
|
||||
|
@ -8,7 +8,6 @@
|
||||
$additional_js = $form->schema['additional_js_css']['js'];
|
||||
$page_color = $form->schema['settings']['color']['page_color'] ?? '#f4f6f9';
|
||||
@endphp
|
||||
|
||||
<div class="@if(!empty($iframe_enabled) && $iframe_enabled) container-fluid @else container @endif">
|
||||
<div class="row justify-content-center">
|
||||
<div class="col-sm-12 col-md-12 col-lg-12 col-xl-12">
|
||||
|
@ -16,7 +16,8 @@
|
||||
visibility: hidden;
|
||||
}
|
||||
|
||||
#printSection, #printSection * {
|
||||
#printSection,
|
||||
#printSection * {
|
||||
visibility: visible;
|
||||
}
|
||||
|
||||
@ -53,11 +54,13 @@
|
||||
|
||||
<form action="{{ @route('form-data.show', ['id' => $form->id]) }}" class="form row mt-3 mx-2 mb-0">
|
||||
<div class="form-group mb-0 col-1">
|
||||
<input type="date" class="form-control" name="start_date" value="{{ request()->get('start_date') ?? \Carbon\Carbon::now()->subDays(7)->toDateString() }}">
|
||||
<input type="date" class="form-control" name="start_date"
|
||||
value="{{ request()->get('start_date') ?? \Carbon\Carbon::now()->subDays(7)->toDateString() }}">
|
||||
</div>
|
||||
|
||||
<div class="form-group mb-0 col-1">
|
||||
<input type="date" class="form-control" name="end_date" value="{{ request()->get('end_date') ?? \Carbon\Carbon::now()->toDateString() }}">
|
||||
<input type="date" class="form-control" name="end_date"
|
||||
value="{{ request()->get('end_date') ?? \Carbon\Carbon::now()->toDateString() }}">
|
||||
</div>
|
||||
|
||||
<div class="form-group mb-0 col-2 d-flex">
|
||||
@ -67,7 +70,10 @@
|
||||
|
||||
@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']) {
|
||||
if (
|
||||
isset($form->schema['settings']['form_submision_ref']['is_enabled']) &&
|
||||
$form->schema['settings']['form_submision_ref']['is_enabled']
|
||||
) {
|
||||
$is_enabled_sub_ref_no = true;
|
||||
}
|
||||
|
||||
@ -82,7 +88,9 @@
|
||||
<table class="table" id="submitted_data_table" style="width: 100%;">
|
||||
<thead>
|
||||
<tr>
|
||||
@if (auth()->user()->hasRole([\App\Enums\User\RoleEnum::SUPERVISOR->value, \App\Enums\User\RoleEnum::ADMIN->value], 'web'))
|
||||
<th>@lang('messages.action')</th>
|
||||
@endif
|
||||
|
||||
@if ($is_enabled_sub_ref_no)
|
||||
<th>@lang('messages.submission_numbering')</th>
|
||||
@ -91,7 +99,12 @@
|
||||
@foreach ($schema as $element)
|
||||
@if (in_array($element['name'], $col_visible))
|
||||
<th>
|
||||
{{-- $element['label'] --}}
|
||||
@if (in_array(session()->get('locale'), ['ru', 'est']) && isset($element['label_' . session()->get('locale')]))
|
||||
{{ $element['label_' . session()->get('locale')] }}
|
||||
@else
|
||||
{{ $element['label'] }}
|
||||
@endif
|
||||
</th>
|
||||
@endif
|
||||
@endforeach
|
||||
@ -102,19 +115,17 @@
|
||||
<tbody>
|
||||
@foreach ($data as $k => $row)
|
||||
<tr>
|
||||
@if (auth()->user()->hasRole([\App\Enums\User\RoleEnum::SUPERVISOR->value, \App\Enums\User\RoleEnum::ADMIN->value], 'web'))
|
||||
<td>
|
||||
{{-- Кнопка просмотра для всех, у кого есть права --}}
|
||||
@if(in_array('view', $btn_enabled) && $has_permission)
|
||||
<button type="button" class="btn btn-info btn-sm view_form_data m-1"
|
||||
@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">
|
||||
<i class="fa fa-eye" aria-hidden="true"></i>
|
||||
@lang('messages.view')
|
||||
</button>
|
||||
@endif
|
||||
|
||||
{{-- Кнопки только для админов/супервайзеров --}}
|
||||
@if(auth()->user()->hasRole([\App\Enums\User\RoleEnum::SUPERVISOR->value, \App\Enums\User\RoleEnum::ADMIN->value], 'web'))
|
||||
@if (in_array('delete', $btn_enabled))
|
||||
<button type="button"
|
||||
class="btn btn-danger btn-sm delete_form_data m-1"
|
||||
@ -123,7 +134,6 @@
|
||||
@lang('messages.delete')
|
||||
</button>
|
||||
@endif
|
||||
|
||||
@php
|
||||
$form_id = !empty($form->slug) ? $form->slug : $form->id;
|
||||
@endphp
|
||||
@ -132,8 +142,8 @@
|
||||
<i class="far fa-edit" aria-hidden="true"></i>
|
||||
@lang('messages.edit')
|
||||
</a>
|
||||
@endif
|
||||
</td>
|
||||
@endif
|
||||
|
||||
@if ($is_enabled_sub_ref_no)
|
||||
<td>
|
||||
@ -148,8 +158,10 @@
|
||||
<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"
|
||||
@ -164,7 +176,6 @@
|
||||
@else
|
||||
{!! nl2br($row->data[$row_element['name']]) !!}
|
||||
@endif
|
||||
|
||||
@endisset
|
||||
</td>
|
||||
@endif
|
||||
|
@ -23,7 +23,9 @@
|
||||
<div class="modal-body">
|
||||
<div class="row mb-2">
|
||||
<div class="col-md-6">
|
||||
@if(isset($form_data->form->schema['settings']['form_submision_ref']['is_enabled']) && $form_data->form->schema['settings']['form_submision_ref']['is_enabled'] && !empty($form_data->submission_ref))
|
||||
@if (isset($form_data->form->schema['settings']['form_submision_ref']['is_enabled']) &&
|
||||
$form_data->form->schema['settings']['form_submision_ref']['is_enabled'] &&
|
||||
!empty($form_data->submission_ref))
|
||||
<b>@lang('messages.submission_numbering'):</b>
|
||||
{{ $form_data->submission_ref }}
|
||||
@endif
|
||||
@ -41,12 +43,19 @@
|
||||
@isset($form_data->data[$element['name']])
|
||||
<tr>
|
||||
<td>
|
||||
<strong>{{$element['label']}}</strong>
|
||||
<strong>
|
||||
@if (in_array(session()->get('locale'), ['ru', 'est']) && isset($element['label_' . session()->get('locale')]))
|
||||
{{ $element['label_' . session()->get('locale')] }}
|
||||
@else
|
||||
{{ $element['label'] }}
|
||||
@endif
|
||||
</strong>
|
||||
</td>
|
||||
<td>
|
||||
@if ($element['type'] == 'file_upload')
|
||||
|
||||
@include('form_data.file_view', ['form_upload' => $form_data->data[$element['name']]])
|
||||
@include('form_data.file_view', [
|
||||
'form_upload' => $form_data->data[$element['name']],
|
||||
])
|
||||
@elseif($element['type'] == 'signature')
|
||||
@if (!empty($form_data->data[$element['name']]))
|
||||
<a target="_blank" href="{{ $form_data->data[$element['name']] }}"
|
||||
@ -55,9 +64,7 @@
|
||||
</a>
|
||||
@endif
|
||||
@elseif(is_array($form_data->data[$element['name']]) && $element['type'] != 'file_upload')
|
||||
|
||||
{{ implode(', ', $form_data->data[$element['name']]) }}
|
||||
|
||||
@else
|
||||
{!! nl2br($form_data->data[$element['name']]) !!}
|
||||
@endif
|
||||
@ -69,7 +76,9 @@
|
||||
</table>
|
||||
<div class="no-print mt-4">
|
||||
<hr>
|
||||
<form id="add_comment_form" action="{{action([\App\Http\Controllers\FormDataCommentController::class, 'store'])}}" method="POST">
|
||||
<form id="add_comment_form"
|
||||
action="{{ action([\App\Http\Controllers\FormDataCommentController::class, 'store']) }}"
|
||||
method="POST">
|
||||
{{ csrf_field() }}
|
||||
<!-- hiden fields -->
|
||||
<input type="hidden" name="form_data_id" id="form_data_id" value="{{ $form_data->id }}">
|
||||
@ -104,7 +113,8 @@
|
||||
<i class="fas fa-print"></i>
|
||||
@lang('messages.print')
|
||||
</button>
|
||||
<a class="btn float-right btn-primary btn-sm m-1" target="_blank" href="{{action([\App\Http\Controllers\FormDataController::class, 'downloadPdf'], [$form_data->id])}}">
|
||||
<a class="btn float-right btn-primary btn-sm m-1" target="_blank"
|
||||
href="{{ action([\App\Http\Controllers\FormDataController::class, 'downloadPdf'], [$form_data->id]) }}">
|
||||
<i class="far fa-file-pdf" aria-hidden="true"></i>
|
||||
@lang('messages.download_pdf')
|
||||
</a>
|
||||
|
@ -24,8 +24,7 @@
|
||||
@if (!auth()->user()->hasRole(\App\Enums\User\RoleEnum::ADMIN->value))
|
||||
<div class="col-12 col-sm-6 col-md-3">
|
||||
<div class="info-box">
|
||||
<span class="info-box-icon bg-danger elevation-1"><i
|
||||
class="fas fa-align-justify"></i></span>
|
||||
<span class="info-box-icon bg-danger elevation-1"><i class="fas fa-align-justify"></i></span>
|
||||
|
||||
<div class="info-box-content">
|
||||
<span class="info-box-text">@lang('messages.templates')</span>
|
||||
@ -47,8 +46,7 @@
|
||||
</div>
|
||||
|
||||
<div class="col-12 col-sm-6 col-md-3">
|
||||
<button type="button"
|
||||
data-href="{{action([\App\Http\Controllers\FormController::class, 'create'])}}"
|
||||
<button type="button" data-href="{{ action([\App\Http\Controllers\FormController::class, 'create']) }}"
|
||||
class="btn btn-primary float-right col-md-9 createForm mt-3">
|
||||
<i class="fas fa-plus" aria-hidden="true"></i> @lang('messages.new_form')</button>
|
||||
</div>
|
||||
@ -59,9 +57,7 @@
|
||||
<div class="card card-primary card-outline card-outline-tabs">
|
||||
<div class="card-header p-0 border-bottom-0">
|
||||
<ul class="nav nav-tabs
|
||||
@if(auth()->user()->hasRole(\App\Enums\User\RoleEnum::SUPERVISOR->value) || auth()->user()->can_create_form)
|
||||
nav-justified
|
||||
@endif"
|
||||
@if (auth()->user()->hasRole(\App\Enums\User\RoleEnum::SUPERVISOR->value) || auth()->user()->can_create_form) nav-justified @endif"
|
||||
id="custom-tabs-four-tab" role="tablist">
|
||||
@if (auth()->user()->hasRole([\App\Enums\User\RoleEnum::SUPERVISOR->value]) || auth()->user()->can_create_form)
|
||||
<li class="nav-item">
|
||||
@ -76,25 +72,20 @@
|
||||
<a class="nav-link" id="custome-tabs-all-templates" data-toggle="pill"
|
||||
href="#custome-tabs-templates" role="tab"
|
||||
aria-controls="custome-tabs-templates">
|
||||
<i class="fas fa-align-justify"
|
||||
aria-hidden="true"></i> @lang('messages.all_templates')
|
||||
<i class="fas fa-align-justify" aria-hidden="true"></i> @lang('messages.all_templates')
|
||||
</a>
|
||||
</li>
|
||||
@endif
|
||||
@endif
|
||||
<li class="nav-item">
|
||||
<a class="nav-link
|
||||
@if(!auth()->user()->hasRole(\App\Enums\User\RoleEnum::SUPERVISOR->value) && !auth()->user()->can_create_form)
|
||||
active
|
||||
@endif
|
||||
" id="custome-tabs-shared-forms" data-toggle="pill"
|
||||
@if (!auth()->user()->hasRole(\App\Enums\User\RoleEnum::SUPERVISOR->value) && !auth()->user()->can_create_form) active @endif
|
||||
"
|
||||
id="custome-tabs-shared-forms" data-toggle="pill"
|
||||
href="#custome-tabs-shared-forms-assigned" role="tab"
|
||||
aria-controls="custome-tabs-shared-forms-assigned"
|
||||
@if(!auth()->user()->hasRole(\App\Enums\User\RoleEnum::SUPERVISOR->value) && !auth()->user()->can_create_form)
|
||||
aria-selected="true"
|
||||
@endif>
|
||||
<i class="fas fa-file-alt"
|
||||
aria-hidden="true"></i> @lang('messages.assigned_forms')
|
||||
@if (!auth()->user()->hasRole(\App\Enums\User\RoleEnum::SUPERVISOR->value) && !auth()->user()->can_create_form) aria-selected="true" @endif>
|
||||
<i class="fas fa-file-alt" aria-hidden="true"></i> @lang('messages.assigned_forms')
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
@ -130,8 +121,7 @@
|
||||
@if (auth()->user()->can('superadmin'))
|
||||
<th>
|
||||
@lang('messages.is_global_template')
|
||||
<i class="fas fa-info-circle"
|
||||
data-toggle="tooltip"
|
||||
<i class="fas fa-info-circle" data-toggle="tooltip"
|
||||
title="@lang('messages.is_global_template_tooltip')"></i>
|
||||
</th>
|
||||
@endif
|
||||
@ -144,14 +134,14 @@
|
||||
</div>
|
||||
@endif
|
||||
<div class="tab-pane fade
|
||||
@if(!auth()->user()->hasRole(\App\Enums\User\RoleEnum::SUPERVISOR->value) || !auth()->user()->can_create_form)
|
||||
active show
|
||||
@endif
|
||||
" id="custome-tabs-shared-forms-assigned" role="tabpanel"
|
||||
@if (!auth()->user()->hasRole(\App\Enums\User\RoleEnum::SUPERVISOR->value) || !auth()->user()->can_create_form) active show @endif
|
||||
"
|
||||
id="custome-tabs-shared-forms-assigned" role="tabpanel"
|
||||
aria-labelledby="custome-tabs-shared-forms">
|
||||
<div class="table-responsive">
|
||||
<table class="table" id="assigned_form_table" style="width: 100%;">
|
||||
<thead>
|
||||
|
||||
<tr>
|
||||
<th>@lang('messages.description')</th>
|
||||
<th>@lang('messages.name')</th>
|
||||
@ -178,6 +168,20 @@
|
||||
@section('footer')
|
||||
<script type="text/javascript">
|
||||
$(document).ready(function() {
|
||||
var lang = `{{ session()->get('locale') }}`
|
||||
var titleColName = 'name';
|
||||
if (lang === 'est') {
|
||||
titleColName = 'name_est'
|
||||
} else if (lang === 'ru') {
|
||||
titleColName = 'name_ru'
|
||||
}
|
||||
|
||||
var descColName = 'description';
|
||||
if (lang === 'est') {
|
||||
descColName = 'description_est'
|
||||
} else if (lang === 'ru') {
|
||||
descColName = 'description_ru'
|
||||
}
|
||||
|
||||
// form dataTable
|
||||
var form_table = $('#form_table').DataTable({
|
||||
@ -187,20 +191,62 @@
|
||||
buttons: [],
|
||||
dom: 'lfrtip',
|
||||
fixedHeader: false,
|
||||
aaSorting: [[2, 'desc']],
|
||||
"columnDefs": [
|
||||
{"width": "22%", "targets": 0},
|
||||
{"width": "40%", "targets": 1},
|
||||
{"width": "15%", "targets": 2},
|
||||
{"width": "3%", "targets": 3},
|
||||
{"width": "20%", "targets": 4}
|
||||
aaSorting: [
|
||||
[1, 'desc']
|
||||
],
|
||||
columns: [
|
||||
{data: 'name', name: 'name'},
|
||||
{data: 'description', name: 'description'},
|
||||
{data: 'created_at', name: 'created_at'},
|
||||
{data: 'data_count', name: 'data_count', searchable: false},
|
||||
{data: 'action', name: 'action', sortable: false}
|
||||
"columnDefs": [{
|
||||
"width": "22%",
|
||||
"targets": 0
|
||||
},
|
||||
{
|
||||
"width": "40%",
|
||||
"targets": 1
|
||||
},
|
||||
{
|
||||
"width": "15%",
|
||||
"targets": 2
|
||||
},
|
||||
{
|
||||
"width": "3%",
|
||||
"targets": 3
|
||||
},
|
||||
{
|
||||
"width": "20%",
|
||||
"targets": 4
|
||||
}
|
||||
],
|
||||
columns: [{
|
||||
data: descColName,
|
||||
name: descColName,
|
||||
createdCell: function(td, cellData, rowData, row, col) {
|
||||
if (td.innerHTML.length === 0) {
|
||||
td.innerHTML = rowData.name
|
||||
}
|
||||
},
|
||||
},
|
||||
{
|
||||
data: titleColName,
|
||||
name: titleColName,
|
||||
createdCell: function(td, cellData, rowData, row, col) {
|
||||
if (td.innerHTML.length === 0) {
|
||||
td.innerHTML = rowData.name
|
||||
}
|
||||
},
|
||||
},
|
||||
{
|
||||
data: 'created_at',
|
||||
name: 'created_at'
|
||||
},
|
||||
{
|
||||
data: 'data_count',
|
||||
name: 'data_count',
|
||||
searchable: false
|
||||
},
|
||||
{
|
||||
data: 'action',
|
||||
name: 'action',
|
||||
sortable: false
|
||||
}
|
||||
]
|
||||
});
|
||||
|
||||
@ -212,16 +258,35 @@
|
||||
buttons: [],
|
||||
dom: 'lfrtip',
|
||||
fixedHeader: false,
|
||||
columns: [
|
||||
{data: 'name', name: 'name'},
|
||||
{data: 'description', name: 'description'},
|
||||
columns: [{
|
||||
data: descColName,
|
||||
name: descColName,
|
||||
createdCell: function(td, cellData, rowData, row, col) {
|
||||
if (td.innerHTML.length === 0) {
|
||||
td.innerHTML = rowData.name
|
||||
}
|
||||
},
|
||||
},
|
||||
{
|
||||
data: titleColName,
|
||||
name: titleColName,
|
||||
createdCell: function(td, cellData, rowData, row, col) {
|
||||
if (td.innerHTML.length === 0) {
|
||||
td.innerHTML = rowData.name
|
||||
}
|
||||
},
|
||||
},
|
||||
@if (auth()->user()->can('superadmin'))
|
||||
{
|
||||
data: 'is_global_template', name: 'is_global_template', sortable: false, searchable: false
|
||||
data: 'is_global_template',
|
||||
name: 'is_global_template',
|
||||
sortable: false,
|
||||
searchable: false
|
||||
},
|
||||
@endif
|
||||
{
|
||||
data: 'action', name: 'action', sortable: false
|
||||
@endif {
|
||||
data: 'action',
|
||||
name: 'action',
|
||||
sortable: false
|
||||
}
|
||||
]
|
||||
});
|
||||
@ -315,33 +380,65 @@
|
||||
buttons: [],
|
||||
dom: 'lfrtip',
|
||||
fixedHeader: false,
|
||||
aaSorting: [[0, 'desc']],
|
||||
"columnDefs": [
|
||||
{"width": "25%", "targets": 0},
|
||||
{"width": "40%", "targets": 1},
|
||||
@if(auth()->user()->hasRole(\App\Enums\User\RoleEnum::SUPERVISOR->value))
|
||||
{
|
||||
"width": "15%", "targets": 2
|
||||
},
|
||||
@endif
|
||||
{
|
||||
"width": "20%",
|
||||
"targets": @php echo auth()->user()->hasRole(\App\Enums\User\RoleEnum::SUPERVISOR->value) ? 3 : 2 @endphp }
|
||||
aaSorting: [
|
||||
[0, 'desc']
|
||||
],
|
||||
columns: [
|
||||
{data: 'name', name: 'forms.name'},
|
||||
{data: 'description', name: 'forms.description'},
|
||||
"columnDefs": [{
|
||||
"width": "25%",
|
||||
"targets": 0
|
||||
},
|
||||
{
|
||||
"width": "40%",
|
||||
"targets": 1
|
||||
},
|
||||
@if (auth()->user()->hasRole(\App\Enums\User\RoleEnum::SUPERVISOR->value))
|
||||
{
|
||||
data: 'created_by', name: 'forms.created_by'
|
||||
"width": "15%",
|
||||
"targets": 2
|
||||
},
|
||||
@endif {
|
||||
"width": "20%",
|
||||
"targets": @php
|
||||
echo auth()
|
||||
->user()
|
||||
->hasRole(\App\Enums\User\RoleEnum::SUPERVISOR->value)
|
||||
? 3
|
||||
: 2;
|
||||
@endphp
|
||||
}
|
||||
],
|
||||
columns: [{
|
||||
data: descColName,
|
||||
name: 'forms.' + descColName,
|
||||
createdCell: function(td, cellData, rowData, row, col) {
|
||||
if (td.innerHTML.length === 0) {
|
||||
td.innerHTML = rowData.description
|
||||
}
|
||||
},
|
||||
},
|
||||
@endif
|
||||
{
|
||||
data: 'action', name: 'action', sortable: false
|
||||
data: titleColName,
|
||||
name: 'forms.' + titleColName,
|
||||
createdCell: function(td, cellData, rowData, row, col) {
|
||||
if (td.innerHTML.length === 0) {
|
||||
td.innerHTML = rowData.name
|
||||
}
|
||||
},
|
||||
},
|
||||
@if (auth()->user()->hasRole(\App\Enums\User\RoleEnum::SUPERVISOR->value))
|
||||
{
|
||||
data: 'created_by',
|
||||
name: 'forms.created_by'
|
||||
},
|
||||
@endif {
|
||||
data: 'action',
|
||||
name: 'action',
|
||||
sortable: false
|
||||
}
|
||||
]
|
||||
});
|
||||
|
||||
|
||||
//form collaborate
|
||||
$(document).on('click', '.collab_btn', function() {
|
||||
var url = $(this).data('href');
|
||||
|
@ -1,5 +1,5 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
|
||||
<html lang="{{ str_replace('_', '-', session()->get('locale', 'en')) }}">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
|
@ -19,6 +19,33 @@
|
||||
<!-- Right Side Of Navbar -->
|
||||
<ul class="navbar-nav ml-auto">
|
||||
<!-- Authentication Links -->
|
||||
<li class="nav-item dropdown">
|
||||
<a id="superadminDropdown" href="#" data-toggle="dropdown" aria-haspopup="true"
|
||||
aria-expanded="false" class="nav-link dropdown-toggle">
|
||||
{{str(session()->get('locale'))->upper()}}
|
||||
</a>
|
||||
|
||||
<ul aria-labelledby="superadminDropdown" class="dropdown-menu border-0 shadow">
|
||||
<li>
|
||||
<a href="{{route('locale', 'en')}}"
|
||||
class="dropdown-item @if (session()->get('locale') == 'en') active @endif">
|
||||
English
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="{{route('locale', 'ru')}}"
|
||||
class="dropdown-item @if (session()->get('locale') == 'ru') active @endif">
|
||||
Русский
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="{{route('locale', 'est')}}"
|
||||
class="dropdown-item @if (session()->get('locale') == 'est') active @endif">
|
||||
Eesti keel
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
@guest
|
||||
<li class="nav-item d-none d-sm-inline-block">
|
||||
<a class="nav-link" href="{{ route('login') }}">{{ __('Login') }}</a>
|
||||
|
@ -4,6 +4,7 @@ use App\Http\Controllers\FormController;
|
||||
use App\Http\Controllers\FormDataCommentController;
|
||||
use App\Http\Controllers\FormDataController;
|
||||
use App\Http\Controllers\HomeController;
|
||||
use App\Http\Controllers\LocaleController;
|
||||
use App\Http\Controllers\ManageProfileController;
|
||||
use App\Http\Controllers\ManageSettingsController;
|
||||
use App\Http\Controllers\RegistrationController;
|
||||
@ -33,13 +34,15 @@ Route::get('/', function () {
|
||||
return view('welcome');
|
||||
});
|
||||
|
||||
Route::get('locale/{locale}', LocaleController::class)->name('locale');
|
||||
|
||||
Route::middleware(['IsInstalled'])->group(function () {
|
||||
Auth::routes(['register' => env('ENABLE_REGISTRATION', false)]);
|
||||
|
||||
Route::post('registration', [RegistrationController::class, 'store']);
|
||||
});
|
||||
|
||||
Route::middleware(['IsInstalled', 'auth', 'bootstrap', 'setDefaultConfig'])->group(function () {
|
||||
Route::middleware(['IsInstalled', 'auth', 'bootstrap', 'setDefaultConfig', 'locale',])->group(function () {
|
||||
Route::get('/home', [HomeController::class, 'index'])->name('home');
|
||||
Route::get('/home-template', [HomeController::class, 'getTemplate']);
|
||||
Route::get('/home-assigned-forms', [HomeController::class, 'getAssignedForms']);
|
||||
|
Loading…
Reference in New Issue
Block a user