├── .editorconfig ├── .env.example ├── .github └── dependabot.yml ├── .gitignore ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── app └── .gitignore ├── artisan ├── bootstrap ├── app.php └── cache │ └── .gitignore ├── composer.json ├── config ├── activitylog.php ├── app.php ├── auth.php ├── breadcrumbs.php ├── broadcasting.php ├── cache.php ├── clockwork.php ├── cors.php ├── database.php ├── datatables-buttons.php ├── datatables-fractal.php ├── datatables-html.php ├── datatables.php ├── db-snapshots.php ├── debug-server.php ├── debugbar.php ├── eloquent-sortable.php ├── excel.php ├── filesystems.php ├── flare.php ├── geoip.php ├── hashids.php ├── hashing.php ├── ide-helper.php ├── ignition.php ├── image.php ├── jsvalidation.php ├── laravel-link-checker.php ├── laravellocalization.php ├── laroute.php ├── localization-js.php ├── logging.php ├── mail.php ├── media-library.php ├── notification.php ├── opcache.php ├── querydetector.php ├── queue.php ├── rinvex.categories.php ├── rinvex.oauth.php ├── rinvex.pages.php ├── rinvex.settings.php ├── rinvex.tags.php ├── rinvex.tenants.php ├── sanctum.php ├── self-diagnosis.php ├── services.php ├── session.php ├── sitemap.php ├── snappy.php ├── stats.php ├── tinker.php ├── translatable.php ├── validation.php └── view.php ├── database ├── .gitignore └── migrations │ └── .gitkeep ├── package.json ├── phpstan.neon.dist ├── public ├── .gitignore ├── .htaccess ├── .user.ini ├── favicon.ico ├── index.php ├── manifest.json ├── robots.txt └── web.config ├── resources ├── images │ ├── details_close.png │ ├── details_open.png │ └── loading_bar.gif ├── js │ ├── app.js │ └── vendor │ │ ├── bootstrap-popover-picker.js │ │ ├── datatables-buttons.js │ │ ├── datatables.js │ │ ├── formbuilder.js │ │ ├── fullcalendar-cortal.js │ │ ├── fullcalendar.js │ │ ├── jquery-implicitforms.js │ │ ├── jquery-intl-tel-input.js │ │ ├── jquery-scrollstop.js │ │ ├── jquery-validation.js │ │ ├── lang.js │ │ ├── laroute.js │ │ └── slugify.js ├── lang │ └── en │ │ ├── auth.php │ │ ├── pagination.php │ │ ├── passwords.php │ │ └── validation.php ├── sass │ ├── app.scss │ ├── datatables.scss │ ├── fullcalendar-cortal.scss │ ├── fullcalendar.scss │ └── vendor.scss └── views │ ├── errors │ ├── 401.blade.php │ ├── 403.blade.php │ ├── 404.blade.php │ ├── 419.blade.php │ ├── 429.blade.php │ ├── 500.blade.php │ ├── 503.blade.php │ ├── illustrated-layout.blade.php │ ├── layout.blade.php │ └── minimal.blade.php │ └── vendor │ ├── datatables │ └── script.blade.php │ └── jsvalidation │ └── bootstrap.php ├── server.php ├── storage ├── app │ ├── .gitignore │ └── public │ │ └── .gitignore ├── clockwork │ └── .gitignore ├── debugbar │ └── .gitignore ├── framework │ ├── .gitignore │ ├── cache │ │ ├── .gitignore │ │ └── data │ │ │ └── .gitignore │ ├── sessions │ │ └── .gitignore │ ├── testing │ │ └── .gitignore │ └── views │ │ └── .gitignore └── logs │ └── .gitignore ├── tailwind.config.js └── webpack.mix.js /.editorconfig: -------------------------------------------------------------------------------- 1 | # http://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | end_of_line = lf 7 | indent_size = 4 8 | indent_style = space 9 | insert_final_newline = true 10 | max_line_length = 80 11 | trim_trailing_whitespace = true 12 | 13 | [*.md] 14 | max_line_length = 0 15 | trim_trailing_whitespace = false 16 | 17 | [*.yml] 18 | indent_size = 2 19 | 20 | [COMMIT_EDITMSG] 21 | max_line_length = 0 22 | -------------------------------------------------------------------------------- /.env.example: -------------------------------------------------------------------------------- 1 | APP_NAME=Cortex 2 | APP_ENV=local 3 | APP_DEBUG=true 4 | APP_KEY=SomeRandomString 5 | APP_DOMAIN=cortex.rinvex.test 6 | APP_DOMAINS=${APP_DOMAIN};frontarea|adminarea,cortex.rinvex.test;frontarea|adminarea|managerarea|tenantarea,tenantsdomain.test;tenantarea 7 | APP_URL=http://${APP_DOMAIN} 8 | APP_TIMEZONE=UTC 9 | #APP_SERVICES_CACHE=./bootstrap/cache/services.php 10 | #APP_PACKAGES_CACHE=./bootstrap/cache/packages.php 11 | #APP_CONFIG_CACHE=./bootstrap/cache/config.php 12 | #APP_ROUTES_CACHE=./bootstrap/cache/routes.php 13 | #APP_EVENTS_CACHE=./bootstrap/cache/events.php 14 | 15 | #APP_MODULES_PATH=./app/modules 16 | #APP_MODULES_CACHE=./bootstrap/cache/modules.php 17 | 18 | #APP_EXTENSIONS_PATH=./app/extensions 19 | #APP_EXTENSIONS_CACHE=./bootstrap/cache/extensions.php 20 | 21 | HASHIDS_ALPHABET=ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890 22 | HASHIDS_KEY=SomeRandomString 23 | HASHIDS_LENGTH=12 24 | 25 | MIX_HASHIDS_KEY=${HASHIDS_KEY} 26 | MIX_HASHIDS_LENGTH=${HASHIDS_LENGTH} 27 | MIX_HASHIDS_ALPHABET=${HASHIDS_ALPHABET} 28 | 29 | LOG_LEVEL=debug 30 | LOG_CHANNEL=stack 31 | LOG_DEPRECATIONS_CHANNEL=null 32 | 33 | DB_CONNECTION=mysql 34 | DB_HOST=mysql 35 | DB_PORT=3306 36 | DB_DATABASE=rinvex_cortex 37 | DB_USERNAME=root 38 | DB_PASSWORD=root 39 | DB_CHARSET=utf8mb4 40 | DB_COLLATION=utf8mb4_unicode_ci 41 | DB_PREFIX=cortex_ 42 | 43 | MEMCACHED_HOST=127.0.0.1 44 | MEMCACHED_PORT=11211 45 | 46 | FILESYSTEM_DISK=local 47 | FILESYSTEM_CLOUD=s3 48 | 49 | CACHE_DRIVER=redis 50 | CACHE_PREFIX=rinvex_cortex 51 | SCHEDULE_CACHE_DRIVER=null 52 | 53 | SESSION_STORE=database 54 | SESSION_DRIVER=database 55 | SESSION_LIFETIME=120 56 | SESSION_CONNECTION=null 57 | SESSION_DOMAIN=.cortex.rinvex.test 58 | QUEUE_CONNECTION=sync 59 | 60 | REDIS_HOST=redis 61 | REDIS_PASSWORD=null 62 | REDIS_QUEUE=null 63 | REDIS_PORT=6379 64 | REDIS_DB=0 65 | 66 | BROADCAST_DRIVER=pusher 67 | 68 | MAIL_MAILER=log 69 | MAIL_HOST=smtp.mailtrap.io 70 | MAIL_PORT=2525 71 | MAIL_USERNAME=null 72 | MAIL_PASSWORD=null 73 | MAIL_ENCRYPTION=tls 74 | 75 | MAIL_FROM_ADDRESS=help@rinvex.com 76 | MAIL_FROM_NAME=Rinvex 77 | 78 | PUSHER_APP_ID=TEST_PUSHER_APP_ID 79 | PUSHER_APP_KEY=TEST_PUSHER_APP_KEY 80 | PUSHER_APP_SECRET=TEST_PUSHER_APP_SECRET 81 | PUSHER_APP_CLUSTER=mt1 82 | 83 | MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}" 84 | MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}" 85 | 86 | VITE_PUSHER_APP_KEY="${PUSHER_APP_KEY}" 87 | VITE_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}" 88 | 89 | DEBUGBAR_ENABLED=false 90 | CLOCKWORK_ENABLE=false 91 | CLOCKWORK_WEB=false 92 | ACTIVITY_LOGGER_ENABLED=true 93 | 94 | AUTHY_SECRET=AuthySecretKey 95 | 96 | AWS_REGION=us-east-1 97 | 98 | AWS_ACCESS_KEY_ID= 99 | AWS_SECRET_ACCESS_KEY= 100 | 101 | AWS_S3_KEY=null 102 | AWS_S3_URL=null 103 | AWS_S3_SECRET=null 104 | AWS_S3_REGION=us-east-1 105 | AWS_S3_BUCKET=null 106 | AWS_S3_ENDPOINT 107 | AWS_S3_USE_PATH_STYLE_ENDPOINT 108 | 109 | AWS_SES_KEY=null 110 | AWS_SES_SECRET=null 111 | AWS_SES_REGION=us-east-1 112 | 113 | AWS_SQS_KEY=null 114 | AWS_SQS_SECRET=null 115 | AWS_SQS_PREFIX=null 116 | AWS_SQS_QUEUE=null 117 | AWS_SQS_REGION=us-east-1 118 | 119 | AWS_DYNAMODB_KEY=null 120 | AWS_DYNAMODB_SECRET=null 121 | AWS_DYNAMODB_REGION=us-east-1 122 | AWS_DYNAMODB_TABLE=cache 123 | 124 | TWITTER_CLIENT_ID=null 125 | TWITTER_CLIENT_SECRET=null 126 | TWITTER_CALLBACK_URL=null 127 | 128 | FACEBOOK_CLIENT_ID=null 129 | FACEBOOK_CLIENT_SECRET=null 130 | FACEBOOK_CALLBACK_URL=null 131 | 132 | LinkedIn_CLIENT_ID=null 133 | LinkedIn_CLIENT_SECRET=null 134 | LinkedIn_CALLBACK_URL=null 135 | 136 | GOOGLE_CLIENT_ID=null 137 | GOOGLE_CLIENT_SECRET=null 138 | GOOGLE_CALLBACK_URL=null 139 | 140 | GITHUB_CLIENT_ID=null 141 | GITHUB_CLIENT_SECRET=null 142 | GITHUB_CALLBACK_URL=null 143 | 144 | BITBUCKET_CLIENT_ID=null 145 | BITBUCKET_CLIENT_SECRET=null 146 | BITBUCKET_CALLBACK_URL=null 147 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: composer 4 | directory: "/" 5 | schedule: 6 | interval: daily 7 | time: "03:00" 8 | open-pull-requests-limit: 10 9 | target-branch: develop 10 | ignore: 11 | - dependency-name: pusher/pusher-php-server 12 | versions: 13 | - 6.0.1 14 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | /vendor 3 | /.idea 4 | /.vscode 5 | /.vagrant 6 | /public/hot 7 | /node_modules 8 | /storage/*.key 9 | /composer.lock 10 | /public/storage 11 | /package-lock.json 12 | .phpunit.result.cache 13 | Homestead.json 14 | Homestead.yaml 15 | yarn-error.log 16 | npm-debug.log 17 | composer.phar 18 | .DS_Store 19 | .env 20 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Contributor Covenant Code of Conduct 2 | 3 | ## Our Pledge 4 | 5 | In the interest of fostering an open and welcoming environment, we as 6 | contributors and maintainers pledge to making participation in our project and 7 | our community a harassment-free experience for everyone, regardless of age, body 8 | size, disability, ethnicity, gender identity and expression, level of experience, 9 | nationality, personal appearance, race, religion, or sexual identity and 10 | orientation. 11 | 12 | ## Our Standards 13 | 14 | Examples of behavior that contributes to creating a positive environment 15 | include: 16 | 17 | * Using welcoming and inclusive language 18 | * Being respectful of differing viewpoints and experiences 19 | * Gracefully accepting constructive criticism 20 | * Focusing on what is best for the community 21 | * Showing empathy towards other community members 22 | 23 | Examples of unacceptable behavior by participants include: 24 | 25 | * The use of sexualized language or imagery and unwelcome sexual attention or 26 | advances 27 | * Trolling, insulting/derogatory comments, and personal or political attacks 28 | * Public or private harassment 29 | * Publishing others' private information, such as a physical or electronic 30 | address, without explicit permission 31 | * Other conduct which could reasonably be considered inappropriate in a 32 | professional setting 33 | 34 | ## Our Responsibilities 35 | 36 | Project maintainers are responsible for clarifying the standards of acceptable 37 | behavior and are expected to take appropriate and fair corrective action in 38 | response to any instances of unacceptable behavior. 39 | 40 | Project maintainers have the right and responsibility to remove, edit, or 41 | reject comments, commits, code, wiki edits, issues, and other contributions 42 | that are not aligned to this Code of Conduct, or to ban temporarily or 43 | permanently any contributor for other behaviors that they deem inappropriate, 44 | threatening, offensive, or harmful. 45 | 46 | ## Scope 47 | 48 | This Code of Conduct applies both within project spaces and in public spaces 49 | when an individual is representing the project or its community. Examples of 50 | representing a project or community include using an official project e-mail 51 | address, posting via an official social media account, or acting as an appointed 52 | representative at an online or offline event. Representation of a project may be 53 | further defined and clarified by project maintainers. 54 | 55 | ## Enforcement 56 | 57 | Instances of abusive, harassing, or otherwise unacceptable behavior may be 58 | reported by contacting the project team at [help@rinvex.com](mailto:help@rinvex.com). All 59 | complaints will be reviewed and investigated and will result in a response that 60 | is deemed necessary and appropriate to the circumstances. The project team is 61 | obligated to maintain confidentiality with regard to the reporter of an incident. 62 | Further details of specific enforcement policies may be posted separately. 63 | 64 | Project maintainers who do not follow or enforce the Code of Conduct in good 65 | faith may face temporary or permanent repercussions as determined by other 66 | members of the project's leadership. 67 | 68 | ## Attribution 69 | 70 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, 71 | available at [http://contributor-covenant.org/version/1/4][version] 72 | 73 | [homepage]: http://contributor-covenant.org 74 | [version]: http://contributor-covenant.org/version/1/4/ 75 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contribution Guide 2 | 3 | This project adheres to the following standards and practices. 4 | 5 | 6 | ## Versioning 7 | 8 | This project is versioned under the [Semantic Versioning](http://semver.org/) guidelines as much as possible. 9 | 10 | Releases will be numbered with the following format: 11 | 12 | - `..` 13 | - `..` 14 | 15 | And constructed with the following guidelines: 16 | 17 | - Breaking backward compatibility bumps the major and resets the minor and patch. 18 | - New additions without breaking backward compatibility bump the minor and reset the patch. 19 | - Bug fixes and misc changes bump the patch. 20 | 21 | 22 | ## Pull Requests 23 | 24 | The pull request process differs for new features and bugs. 25 | 26 | Pull requests for bugs may be sent without creating any proposal issue. If you believe that you know of a solution for a bug that has been filed, please leave a comment detailing your proposed fix or create a pull request with the fix mentioning that issue id. 27 | 28 | 29 | ## Coding Standards 30 | 31 | This project follows the FIG PHP Standards Recommendations compliant with the [PSR-1: Basic Coding Standard](http://www.php-fig.org/psr/psr-1/), [PSR-2: Coding Style Guide](http://www.php-fig.org/psr/psr-2/) and [PSR-4: Autoloader](http://www.php-fig.org/psr/psr-4/) to ensure a high level of interoperability between shared PHP code. If you notice any compliance oversights, please send a patch via pull request. 32 | 33 | 34 | ## Feature Requests 35 | 36 | If you have a proposal or a feature request, you may create an issue with `[Proposal]` in the title. 37 | 38 | The proposal should also describe the new feature, as well as implementation ideas. The proposal will then be reviewed and either approved or denied. Once a proposal is approved, a pull request may be created implementing the new feature. 39 | 40 | 41 | ## Git Flow 42 | 43 | This project follows [Git-Flow](http://nvie.com/posts/a-successful-git-branching-model/), and as such has `master` (latest stable releases), `develop` (latest WIP development) and X.Y support branches (when there's multiple major versions). 44 | 45 | Accordingly all pull requests MUST be sent to the `develop` branch. 46 | 47 | > **Note:** Pull requests which do not follow these guidelines will be closed without any further notice. 48 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2016-2021, Rinvex LLC, 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Rinvex Cortex 2 | 3 | Rinvex Cortex is a solid foundation for enterprise solutions, that provides a flexible and extensible architecture for building multi-lingual, multi-tenant applications with content management, themeable views, application modules and much more. 4 | 5 | This project uses Laravel framework, but it has its own modular architecture, that's different from the default vanilla structure. Rinvex Cortex is built of modules, and modules are the core building blocks and at the heart of it. Modules are first citizens and everything within the entire application is built of a module, even it's basic fundamental building block that drives the whole system. Everything here is part of a module! Once installed, you can check the automatically populated structure inside the `app` directory to get familiar with it. 6 | 7 | The project also supports multi-tenant, multi-domain, and multiple access areas, such as: adminarea, frontarea, managerarea, and tenantarea. Each access area is dedicated for a different user type, like: admins, managers, and members. Each type can access only their access areas, and have their own guards and authentication/authorization. 8 | 9 | This project is currently under heavy development, and may not have the level of support you're looking for, but for the record it's been used for multiple live enterprise solutions on production. Still, use at your own responsibility, and note that it changes rapidly. 10 | 11 | To install Rinvex Cortex, just run the following command on your terminal: 12 | ```php 13 | composer create-project rinvex/cortex 14 | ``` 15 | 16 | This will create a new project based on Rinvex Cortex, install the default modules, and prepare the project for your development. 17 | 18 | 19 | # Fresh Installation 20 | 21 | Before you start working with this project, make sure you're familiar with the modular architecture of our system. The steps is straight forward and should be easy to implement. 22 | It's supposed that you're running homestead on vagrant machine, with the default setup, using PHP 7.1+ and MySQL 5.7.8+, or any similar environment like [rinvex/punnet](https://github.com/rinvex/punnet). 23 | If you follow the steps below, you should get it done in less than 10 minutes regardless of your experience level. 24 | Make sure to create a new database for the new project, and ensure you've local domain ready you can use. 25 | 26 | ``` 27 | composer create-project rinvex/cortex cortex-demo 28 | ``` 29 | 30 | Replace the following pseudo variables with your values in the following commands, then execute from terminal (inside the new project directory): 31 | 32 | - `YOUR_DATABASE_HOST_HERE` 33 | - `YOUR_DATABASE_NAME_HERE` 34 | - `YOUR_DATABASE_USERNAME_HERE` 35 | - `YOUR_DATABASE_PASSWORD_HERE` 36 | 37 | ``` 38 | sed -i "s/DB_HOST=.*/DB_HOST=YOUR_DATABASE_HOST_HERE/" .env 39 | sed -i "s/DB_DATABASE=.*/DB_DATABASE=YOUR_DATABASE_NAME_HERE/" .env 40 | sed -i "s/DB_USERNAME=.*/DB_USERNAME=YOUR_DATABASE_USERNAME_HERE/" .env 41 | sed -i "s/DB_PASSWORD=.*/DB_PASSWORD=YOUR_DATABASE_PASSWORD_HERE/" .env 42 | ``` 43 | 44 | Install the project 45 | 46 | ``` 47 | php artisan cortex:install 48 | npm install 49 | npm run dev 50 | ``` 51 | 52 | **Important:** You'll need to update your localhost project domains in config `app.domains` for the project to run smoothly. 53 | 54 | The rest of documentation will be ready soon.. 55 | 56 | 57 | # Optional 58 | 59 | Create public disk symbolic link 60 | 61 | ``` 62 | php artisan storage:link 63 | ``` 64 | 65 | To create a new module run the following command 66 | 67 | ``` 68 | php artisan make:module cortex/boards 69 | ``` 70 | 71 | To see all the available command line tools, run the following command: 72 | 73 | ``` 74 | php artisan list 75 | ``` 76 | 77 | If you're using any browser streaming features, and would like to disable output buffering, then make sure your PHP & nginx settings are set up correctly, with buffering turned off, so you can stream content to the browser. 78 | 79 | ## nginx config 80 | ``` 81 | fastcgi_buffering off; 82 | ``` 83 | 84 | ## php config 85 | ``` 86 | output_buffering = off 87 | zlib.output_compression = off 88 | ``` 89 | 90 | Notes: 91 | - If you changed any `.env` environment variables, or any of their references, make sure to run `npm run dev` to update the public assets, as it reference some of it. 92 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /artisan: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env php 2 | make(Illuminate\Contracts\Console\Kernel::class); 36 | 37 | $status = $kernel->handle( 38 | $input = new Symfony\Component\Console\Input\ArgvInput, 39 | new Symfony\Component\Console\Output\ConsoleOutput 40 | ); 41 | 42 | /* 43 | |-------------------------------------------------------------------------- 44 | | Shutdown The Application 45 | |-------------------------------------------------------------------------- 46 | | 47 | | Once Artisan has finished running, we will fire off the shutdown events 48 | | so that any final work may be done by the application before we shut 49 | | down the process. This is the last thing to happen to the request. 50 | | 51 | */ 52 | 53 | $kernel->terminate($input, $status); 54 | 55 | exit($status); 56 | -------------------------------------------------------------------------------- /bootstrap/app.php: -------------------------------------------------------------------------------- 1 | singleton( 32 | Illuminate\Contracts\Http\Kernel::class, 33 | Cortex\Foundation\Http\Kernel::class 34 | ); 35 | 36 | $app->singleton( 37 | Illuminate\Contracts\Console\Kernel::class, 38 | Cortex\Foundation\Console\Kernel::class 39 | ); 40 | 41 | $app->singleton( 42 | Illuminate\Contracts\Debug\ExceptionHandler::class, 43 | Cortex\Foundation\Exceptions\ExceptionHandler::class 44 | ); 45 | 46 | /* 47 | |-------------------------------------------------------------------------- 48 | | Return The Application 49 | |-------------------------------------------------------------------------- 50 | | 51 | | This script returns the application instance. The instance is given to 52 | | the calling script so we can separate the building of the instances 53 | | from the actual running of the application and sending responses. 54 | | 55 | */ 56 | 57 | return $app; 58 | -------------------------------------------------------------------------------- /bootstrap/cache/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "rinvex/cortex", 3 | "description": "Rinvex Cortex is a solid foundation for enterprise solutions, that provides a flexible and extensible architecture for building multi-lingual, multi-tenant applications with content management, themeable views, application modules and much more.", 4 | "keywords": [ 5 | "rinvex", 6 | "cortex", 7 | "flexible", 8 | "framework", 9 | "laravel", 10 | "themes", 11 | "solution", 12 | "extension", 13 | "enterprise", 14 | "application", 15 | "multi-lingual", 16 | "multi-tenant", 17 | "bootstrap", 18 | "module" 19 | ], 20 | "type": "project", 21 | "license": "MIT", 22 | "homepage": "https://rinvex.com", 23 | "support": { 24 | "email": "help@rinvex.com", 25 | "issues": "https://github.com/rinvex/cortex/issues", 26 | "source": "https://github.com/rinvex/cortex", 27 | "docs": "https://github.com/rinvex/cortex/blob/master/README.md" 28 | }, 29 | "authors": [ 30 | { 31 | "name": "Rinvex LLC", 32 | "homepage": "https://rinvex.com", 33 | "email": "help@rinvex.com" 34 | }, 35 | { 36 | "name": "Abdelrahman Omran", 37 | "homepage": "https://omranic.com", 38 | "email": "me@omranic.com", 39 | "role": "Project Lead" 40 | }, 41 | { 42 | "name": "The Generous Laravel Community", 43 | "homepage": "https://github.com/rinvex/cortex/contributors" 44 | } 45 | ], 46 | "repositories": [ 47 | { 48 | "type": "vcs", 49 | "url": "https://github.com/laravel-shift/laravel-self-diagnosis.git" 50 | }, 51 | { 52 | "type": "vcs", 53 | "url": "https://github.com/laravel-shift/uniquewith-validator.git" 54 | } 55 | ], 56 | "require": { 57 | "php": "^8.1.0", 58 | "ext-curl": "*", 59 | "ext-json": "*", 60 | "ext-mbstring": "*", 61 | "ext-openssl": "*", 62 | "ext-pdo": "*", 63 | "aws/aws-sdk-php": "^3.200.0", 64 | "cortex/auth-tenantable": "^1.0.0", 65 | "cortex/categories": "^7.0.0", 66 | "cortex/foundation": "^8.0.0", 67 | "cortex/oauth-tenantable": "^1.0.0", 68 | "cortex/pages-tenantable": "^1.0.0", 69 | "cortex/settings-tenantable": "^1.0.0", 70 | "cortex/tags": "^7.0.0", 71 | "cortex/tenants": "^8.0.0", 72 | "doctrine/dbal": "^3.3.0", 73 | "guzzlehttp/guzzle": "^7.4.0", 74 | "laravel/envoy": "^2.8.0", 75 | "laravel/framework": "^10.0.0 || ^11.0.0", 76 | "laravel/tinker": "^2.8.0", 77 | "league/flysystem-aws-s3-v3": "^3.0.0", 78 | "predis/predis": "^2.0.0", 79 | "pusher/pusher-php-server": "^7.0.0", 80 | "spatie/laravel-db-snapshots": "^2.0.0", 81 | "spatie/laravel-ignition": "^2.0.0" 82 | }, 83 | "require-dev": { 84 | "roave/security-advisories": "dev-master", 85 | "barryvdh/laravel-debugbar": "^3.6.0", 86 | "barryvdh/laravel-ide-helper": "^2.12.0", 87 | "beyondcode/laravel-dump-server": "^1.7.0", 88 | "beyondcode/laravel-query-detector": "^1.6.0", 89 | "codedungeon/phpunit-result-printer": "^0.32.0", 90 | "fakerphp/faker": "^1.19.0", 91 | "itsgoingd/clockwork": "^5.1.0", 92 | "mockery/mockery": "^1.6.0", 93 | "nunomaduro/collision": "^7.5.0", 94 | "phpunit/phpunit": "^10.1.0", 95 | "symfony/thanks": "^1.2.0" 96 | }, 97 | "autoload-dev": { 98 | "psr-4": { 99 | "Tests\\": "tests/" 100 | } 101 | }, 102 | "scripts": { 103 | "post-root-package-install": [ 104 | "@php -r \"file_exists('.env') || copy('.env.example', '.env');\"", 105 | "@php artisan key:generate --ansi --ifnot" 106 | ], 107 | "post-create-project-cmd": [ 108 | "@php artisan key:generate --ansi --ifnot" 109 | ], 110 | "post-autoload-dump": [ 111 | "Illuminate\\Foundation\\ComposerScripts::postAutoloadDump", 112 | "@php artisan package:discover --ansi", 113 | "@php artisan cortex:generate:idehelper" 114 | ] 115 | }, 116 | "config": { 117 | "sort-packages": true, 118 | "preferred-install": "dist", 119 | "optimize-autoloader": true, 120 | "allow-plugins": { 121 | "rinvex/laravel-composer": true, 122 | "composer/package-versions-deprecated": true, 123 | "symfony/thanks": true 124 | } 125 | }, 126 | "extra": { 127 | "laravel": { 128 | "dont-discover": [ 129 | "rinvex/tmp-lord-laroute", 130 | "barryvdh/laravel-debugbar", 131 | "appstract/laravel-opcache", 132 | "mariuzzo/laravel-js-localization" 133 | ] 134 | } 135 | }, 136 | "minimum-stability": "dev", 137 | "prefer-stable": true 138 | } 139 | -------------------------------------------------------------------------------- /config/activitylog.php: -------------------------------------------------------------------------------- 1 | env('ACTIVITY_LOGGER_ENABLED', true), 11 | 12 | /* 13 | * When the clean-command is executed, all recording activities older than 14 | * the number of days specified here will be deleted. 15 | */ 16 | 'delete_records_older_than_days' => 365, 17 | 18 | /* 19 | * If no log name is passed to the activity() helper 20 | * we use this default log name. 21 | */ 22 | 'default_log_name' => 'default', 23 | 24 | /* 25 | * You can specify an auth driver here that gets user models. 26 | * If this is null we'll use the default Laravel auth driver. 27 | */ 28 | 'default_auth_driver' => null, 29 | 30 | /* 31 | * If set to true, the subject returns soft deleted models. 32 | */ 33 | 'subject_returns_soft_deleted_models' => false, 34 | 35 | /* 36 | * This model will be used to log activity. 37 | * It should implement the Spatie\Activitylog\Contracts\Activity interface 38 | * and extend Illuminate\Database\Eloquent\Model. 39 | */ 40 | 'activity_model' => \Cortex\Foundation\Models\Log::class, 41 | 42 | /* 43 | * This is the name of the table that will be created by the migration and 44 | * used by the Activity model shipped with this package. 45 | */ 46 | 'table_name' => 'activity_log', 47 | 48 | /* 49 | * This is the database connection that will be used by the migration and 50 | * the Activity model shipped with this package. In case it's not set 51 | * Laravel's database.default will be used instead. 52 | */ 53 | 'database_connection' => env('ACTIVITY_LOGGER_DB_CONNECTION'), 54 | ]; 55 | -------------------------------------------------------------------------------- /config/auth.php: -------------------------------------------------------------------------------- 1 | [ 19 | 'guard' => 'member', 20 | 'apiguard' => 'api:member', 21 | 'provider' => 'members', 22 | 'passwords' => 'member', 23 | 'emails' => 'member', 24 | ], 25 | 26 | /* 27 | |-------------------------------------------------------------------------- 28 | | Authentication Guards 29 | |-------------------------------------------------------------------------- 30 | | 31 | | Next, you may define every authentication guard for your application. 32 | | Of course, a great default configuration has been defined for you 33 | | here which uses session storage and the Eloquent user provider. 34 | | 35 | | All authentication drivers have a user provider. This defines how the 36 | | users are actually retrieved out of your database or other storage 37 | | mechanisms used by this application to persist your user's data. 38 | | 39 | | Supported: "session", "token" 40 | | 41 | */ 42 | 43 | 'guards' => [ 44 | 45 | 'guardian' => [ 46 | 'driver' => 'session', 47 | 'provider' => 'guardians', 48 | ], 49 | 50 | 'admin' => [ 51 | 'driver' => 'session', 52 | 'provider' => 'admins', 53 | ], 54 | 55 | 'manager' => [ 56 | 'driver' => 'session', 57 | 'provider' => 'managers', 58 | ], 59 | 60 | 'member' => [ 61 | 'driver' => 'session', 62 | 'provider' => 'members', 63 | ], 64 | 65 | 'api:admin' => [ 66 | 'driver' => 'oauth', 67 | 'provider' => 'admins', 68 | ], 69 | 70 | 'api:manager' => [ 71 | 'driver' => 'oauth', 72 | 'provider' => 'managers', 73 | ], 74 | 75 | 'api:member' => [ 76 | 'driver' => 'oauth', 77 | 'provider' => 'members', 78 | ], 79 | ], 80 | 81 | /* 82 | |-------------------------------------------------------------------------- 83 | | User Providers 84 | |-------------------------------------------------------------------------- 85 | | 86 | | All authentication drivers have a user provider. This defines how the 87 | | users are actually retrieved out of your database or other storage 88 | | mechanisms used by this application to persist your user's data. 89 | | 90 | | If you have multiple user tables or models you may configure multiple 91 | | sources which represent each model / table. These sources may then 92 | | be assigned to any extra authentication guards you have defined. 93 | | 94 | | Supported: "database", "eloquent" 95 | | 96 | */ 97 | 98 | 'providers' => [ 99 | 100 | 'admins' => [ 101 | 'driver' => 'eloquent', 102 | 'model' => \Cortex\Auth\Models\Admin::class, 103 | ], 104 | 105 | 'members' => [ 106 | 'driver' => 'eloquent', 107 | 'model' => \Cortex\Auth\Models\Member::class, 108 | ], 109 | 110 | 'managers' => [ 111 | 'driver' => 'eloquent', 112 | 'model' => \Cortex\Auth\Models\Manager::class, 113 | ], 114 | 115 | 'guardians' => [ 116 | 'driver' => 'eloquent', 117 | 'model' => \Cortex\Auth\Models\Guardian::class, 118 | ], 119 | 120 | // 'users' => [ 121 | // 'driver' => 'database', 122 | // 'table' => 'users', 123 | // ], 124 | ], 125 | 126 | /* 127 | |-------------------------------------------------------------------------- 128 | | Resetting Passwords 129 | |-------------------------------------------------------------------------- 130 | | 131 | | You may specify multiple password reset configurations if you have more 132 | | than one user table or model in the application and you want to have 133 | | separate password reset settings based on the specific user types. 134 | | 135 | | The expire time is the number of minutes that each reset token will be 136 | | considered valid. This security feature keeps tokens short-lived so 137 | | they have less time to be guessed. You may change this as needed. 138 | | 139 | */ 140 | 141 | 'passwords' => [ 142 | 143 | 'admin' => [ 144 | 'provider' => 'admins', 145 | 'expire' => 60, 146 | ], 147 | 148 | 'member' => [ 149 | 'provider' => 'members', 150 | 'expire' => 60, 151 | ], 152 | 153 | 'manager' => [ 154 | 'provider' => 'managers', 155 | 'expire' => 60, 156 | ], 157 | 158 | 'guardian' => [ 159 | 'provider' => 'guardians', 160 | 'expire' => 60, 161 | ], 162 | 163 | ], 164 | 165 | /* 166 | |-------------------------------------------------------------------------- 167 | | Email Verification 168 | |-------------------------------------------------------------------------- 169 | | 170 | | The broker option controls the default email verification broker for 171 | | your application. You may change this default as required, 172 | | but they're a perfect start for most applications. 173 | | 174 | | You may need to specify multiple email verification configurations if you have 175 | | more than one user table or model in the application and you want to have 176 | | separate email verification settings based on the specific user types. 177 | | 178 | | The expire time is the number of minutes that the email verification token 179 | | should be considered valid. This security feature keeps tokens short-lived 180 | | so they have less time to be guessed. You may change this as needed. 181 | | 182 | */ 183 | 184 | 'emails' => [ 185 | 186 | 'admin' => [ 187 | 'provider' => 'admins', 188 | 'expire' => 60, 189 | ], 190 | 191 | 'member' => [ 192 | 'provider' => 'members', 193 | 'expire' => 60, 194 | ], 195 | 196 | 'manager' => [ 197 | 'provider' => 'managers', 198 | 'expire' => 60, 199 | ], 200 | 201 | 'guardian' => [ 202 | 'provider' => 'guardians', 203 | 'expire' => 60, 204 | ], 205 | 206 | ], 207 | 208 | /* 209 | |-------------------------------------------------------------------------- 210 | | Password Confirmation Timeout 211 | |-------------------------------------------------------------------------- 212 | | 213 | | Here you may define the amount of seconds before a password confirmation 214 | | times out and the user is prompted to re-enter their password via the 215 | | confirmation screen. By default, the timeout lasts for three hours. 216 | | 217 | */ 218 | 219 | 'password_timeout' => 10800, 220 | 221 | /* 222 | |-------------------------------------------------------------------------- 223 | | TwoFactor Confirmation Timeout 224 | |-------------------------------------------------------------------------- 225 | | 226 | | Here you may define the amount of seconds before a TwoFactor confirmation 227 | | times out and the user is prompted to re-enter their TwoFactor via the 228 | | confirmation screen. By default, the timeout lasts for three hours. 229 | | 230 | */ 231 | 232 | 'twofactor_timeout' => 10800, 233 | 234 | ]; 235 | -------------------------------------------------------------------------------- /config/breadcrumbs.php: -------------------------------------------------------------------------------- 1 | 'cortex/foundation::common.partials.breadcrumbs', 29 | 30 | /* 31 | |-------------------------------------------------------------------------- 32 | | Breadcrumbs File(s) 33 | |-------------------------------------------------------------------------- 34 | | 35 | | The file(s) where breadcrumbs are defined. e.g. 36 | | 37 | | - base_path('routes/breadcrumbs.php') 38 | | - glob(base_path('breadcrumbs/*.php')) 39 | | 40 | */ 41 | 42 | 'files' => [], 43 | 44 | /* 45 | |-------------------------------------------------------------------------- 46 | | Exceptions 47 | |-------------------------------------------------------------------------- 48 | | 49 | | Determine when to throw an exception. 50 | | 51 | */ 52 | 53 | // When route-bound breadcrumbs are used but the current route doesn't have a name (UnnamedRouteException) 54 | 'unnamed-route-exception' => true, 55 | 56 | // When route-bound breadcrumbs are used and the matching breadcrumb doesn't exist (InvalidBreadcrumbException) 57 | 'missing-route-bound-breadcrumb-exception' => true, 58 | 59 | // When a named breadcrumb is used but doesn't exist (InvalidBreadcrumbException) 60 | 'invalid-named-breadcrumb-exception' => true, 61 | 62 | /* 63 | |-------------------------------------------------------------------------- 64 | | Classes 65 | |-------------------------------------------------------------------------- 66 | | 67 | | Subclass the default classes for more advanced customisations. 68 | | 69 | */ 70 | 71 | // Manager 72 | 'manager-class' => \Cortex\Foundation\Overrides\Diglactic\Breadcrumbs\Manager::class, 73 | 74 | // Generator 75 | 'generator-class' => \Diglactic\Breadcrumbs\Generator::class, 76 | 77 | ]; 78 | -------------------------------------------------------------------------------- /config/broadcasting.php: -------------------------------------------------------------------------------- 1 | env('BROADCAST_DRIVER', 'pusher'), 21 | 22 | /* 23 | |-------------------------------------------------------------------------- 24 | | Broadcast Connections 25 | |-------------------------------------------------------------------------- 26 | | 27 | | Here you may define all of the broadcast connections that will be used 28 | | to broadcast events to other systems or over websockets. Samples of 29 | | each available type of connection are provided inside this array. 30 | | 31 | */ 32 | 33 | 'connections' => [ 34 | 35 | 'pusher' => [ 36 | 'driver' => 'pusher', 37 | 'key' => env('PUSHER_APP_KEY'), 38 | 'secret' => env('PUSHER_APP_SECRET'), 39 | 'app_id' => env('PUSHER_APP_ID'), 40 | 'options' => [ 41 | 'cluster' => env('PUSHER_APP_CLUSTER'), 42 | 'useTLS' => true, 43 | ], 44 | 'client_options' => [ 45 | // Guzzle client options: https://docs.guzzlephp.org/en/stable/request-options.html 46 | ], 47 | ], 48 | 49 | 'ably' => [ 50 | 'driver' => 'ably', 51 | 'key' => env('ABLY_KEY'), 52 | ], 53 | 54 | 'redis' => [ 55 | 'driver' => 'redis', 56 | 'connection' => 'default', 57 | ], 58 | 59 | 'log' => [ 60 | 'driver' => 'log', 61 | ], 62 | 63 | 'null' => [ 64 | 'driver' => 'null', 65 | ], 66 | 67 | ], 68 | 69 | ]; 70 | -------------------------------------------------------------------------------- /config/cache.php: -------------------------------------------------------------------------------- 1 | env('CACHE_DRIVER', 'redis'), 21 | 22 | /* 23 | |-------------------------------------------------------------------------- 24 | | Cache Stores 25 | |-------------------------------------------------------------------------- 26 | | 27 | | Here you may define all of the cache "stores" for your application as 28 | | well as their drivers. You may even define multiple stores for the 29 | | same cache driver to group types of items stored in your caches. 30 | | 31 | | Supported drivers: "apc", "array", "database", "file", 32 | | "memcached", "redis", "dynamodb", "octane", "null" 33 | | 34 | */ 35 | 36 | 'stores' => [ 37 | 38 | 'apc' => [ 39 | 'driver' => 'apc', 40 | ], 41 | 42 | 'array' => [ 43 | 'driver' => 'array', 44 | 'serialize' => false, 45 | ], 46 | 47 | 'database' => [ 48 | 'driver' => 'database', 49 | 'table' => 'cache', 50 | 'connection' => null, 51 | 'lock_connection' => null, 52 | ], 53 | 54 | 'file' => [ 55 | 'driver' => 'file', 56 | 'path' => storage_path('framework/cache/data'), 57 | ], 58 | 59 | 'memcached' => [ 60 | 'driver' => 'memcached', 61 | 'persistent_id' => env('MEMCACHED_PERSISTENT_ID'), 62 | 'sasl' => [ 63 | env('MEMCACHED_USERNAME'), 64 | env('MEMCACHED_PASSWORD'), 65 | ], 66 | 'options' => [ 67 | // Memcached::OPT_CONNECT_TIMEOUT => 2000, 68 | ], 69 | 'servers' => [ 70 | [ 71 | 'host' => env('MEMCACHED_HOST', '127.0.0.1'), 72 | 'port' => env('MEMCACHED_PORT', 11211), 73 | 'weight' => 100, 74 | ], 75 | ], 76 | ], 77 | 78 | 'redis' => [ 79 | 'driver' => 'redis', 80 | 'connection' => 'cache', 81 | 'lock_connection' => 'default', 82 | ], 83 | 84 | 'dynamodb' => [ 85 | 'driver' => 'dynamodb', 86 | 'key' => env('AWS_DYNAMODB_KEY'), 87 | 'secret' => env('AWS_DYNAMODB_SECRET'), 88 | 'region' => env('AWS_DYNAMODB_REGION', 'us-east-1'), 89 | 'table' => env('AWS_DYNAMODB_TABLE', 'cache'), 90 | 'endpoint' => env('DYNAMODB_ENDPOINT'), 91 | ], 92 | 93 | 'octane' => [ 94 | 'driver' => 'octane', 95 | ], 96 | 97 | ], 98 | 99 | /* 100 | |-------------------------------------------------------------------------- 101 | | Cache Key Prefix 102 | |-------------------------------------------------------------------------- 103 | | 104 | | When utilizing a RAM based store such as APC or Memcached, there might 105 | | be other applications utilizing the same cache. So, we'll specify a 106 | | value to get prefixed to all our keys so we can avoid collisions. 107 | | 108 | */ 109 | 110 | 'prefix' => env('CACHE_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_cache'), 111 | 112 | ]; 113 | -------------------------------------------------------------------------------- /config/cors.php: -------------------------------------------------------------------------------- 1 | [], 27 | 28 | /* 29 | * Matches the request method. `['*']` allows all methods. 30 | */ 31 | 'allowed_methods' => ['*'], 32 | 33 | /* 34 | * Matches the request origin. `['*']` allows all origins. Wildcards can be used, eg `*.mydomain.com` 35 | */ 36 | 'allowed_origins' => ['*'], 37 | 38 | /* 39 | * Patterns that can be used with `preg_match` to match the origin. 40 | */ 41 | 'allowed_origins_patterns' => [], 42 | 43 | /* 44 | * Sets the Access-Control-Allow-Headers response header. `['*']` allows all headers. 45 | */ 46 | 'allowed_headers' => ['*'], 47 | 48 | /* 49 | * Sets the Access-Control-Expose-Headers response header with these headers. 50 | */ 51 | 'exposed_headers' => [], 52 | 53 | /* 54 | * Sets the Access-Control-Max-Age response header when > 0. 55 | */ 56 | 'max_age' => 0, 57 | 58 | /* 59 | * Sets the Access-Control-Allow-Credentials header. 60 | */ 61 | 'supports_credentials' => false, 62 | ]; 63 | -------------------------------------------------------------------------------- /config/database.php: -------------------------------------------------------------------------------- 1 | env('DB_CONNECTION', 'mysql'), 21 | 22 | /* 23 | |-------------------------------------------------------------------------- 24 | | Database Connections 25 | |-------------------------------------------------------------------------- 26 | | 27 | | Here are each of the database connections setup for your application. 28 | | Of course, examples of configuring each database platform that is 29 | | supported by Laravel is shown below to make development simple. 30 | | 31 | | 32 | | All database work in Laravel is done through the PHP PDO facilities 33 | | so make sure you have the driver for your particular database of 34 | | choice installed on your machine before you begin development. 35 | | 36 | */ 37 | 38 | 'connections' => [ 39 | 40 | 'sqlite' => [ 41 | 'driver' => 'sqlite', 42 | 'url' => env('DATABASE_URL'), 43 | 'database' => env('DB_DATABASE', database_path('database.sqlite')), 44 | 'prefix' => env('DB_PREFIX', ''), 45 | 'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true), 46 | ], 47 | 48 | 'mysql' => [ 49 | 'driver' => 'mysql', 50 | 'url' => env('DATABASE_URL'), 51 | 'host' => env('DB_HOST', '127.0.0.1'), 52 | 'port' => env('DB_PORT', '3306'), 53 | 'database' => env('DB_DATABASE', 'forge'), 54 | 'username' => env('DB_USERNAME', 'forge'), 55 | 'password' => env('DB_PASSWORD', ''), 56 | 'unix_socket' => env('DB_SOCKET', ''), 57 | 'charset' => env('DB_CHARSET', 'utf8mb4'), 58 | 'collation' => env('DB_COLLATION', 'utf8mb4_unicode_ci'), 59 | 'prefix' => env('DB_PREFIX', ''), 60 | 'prefix_indexes' => true, 61 | 'strict' => true, 62 | 'engine' => null, 63 | 'timezone' => env('APP_TIMEZONE', 'UTC'), 64 | 'options' => extension_loaded('pdo_mysql') ? array_filter([ 65 | PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'), 66 | ]) : [], 67 | ], 68 | 69 | 'pgsql' => [ 70 | 'driver' => 'pgsql', 71 | 'url' => env('DATABASE_URL'), 72 | 'host' => env('DB_HOST', '127.0.0.1'), 73 | 'port' => env('DB_PORT', '5432'), 74 | 'database' => env('DB_DATABASE', 'forge'), 75 | 'username' => env('DB_USERNAME', 'forge'), 76 | 'password' => env('DB_PASSWORD', ''), 77 | 'charset' => env('DB_CHARSET', 'utf8'), 78 | 'prefix' => env('DB_PREFIX', ''), 79 | 'prefix_indexes' => true, 80 | 'search_path' => 'public', 81 | 'sslmode' => 'prefer', 82 | 'timezone' => env('APP_TIMEZONE', 'UTC'), 83 | ], 84 | 85 | 'sqlsrv' => [ 86 | 'driver' => 'sqlsrv', 87 | 'url' => env('DATABASE_URL'), 88 | 'host' => env('DB_HOST', 'localhost'), 89 | 'port' => env('DB_PORT', '1433'), 90 | 'database' => env('DB_DATABASE', 'forge'), 91 | 'username' => env('DB_USERNAME', 'forge'), 92 | 'password' => env('DB_PASSWORD', ''), 93 | 'charset' => 'utf8', 94 | 'prefix' => '', 95 | 'timezone' => env('APP_TIMEZONE', 'UTC'), 96 | 'prefix_indexes' => true, 97 | ], 98 | 99 | ], 100 | 101 | /* 102 | |-------------------------------------------------------------------------- 103 | | Migration Repository Table 104 | |-------------------------------------------------------------------------- 105 | | 106 | | This table keeps track of all the migrations that have already run for 107 | | your application. Using this information, we can determine which of 108 | | the migrations on disk haven't actually been run in the database. 109 | | 110 | */ 111 | 112 | 'migrations' => 'migrations', 113 | 114 | /* 115 | |-------------------------------------------------------------------------- 116 | | Redis Databases 117 | |-------------------------------------------------------------------------- 118 | | 119 | | Redis is an open source, fast, and advanced key-value store that also 120 | | provides a richer body of commands than a typical key-value system 121 | | such as APC or Memcached. Laravel makes it easy to dig right in. 122 | | 123 | */ 124 | 125 | 'redis' => [ 126 | 127 | 'client' => env('REDIS_CLIENT', 'phpredis'), 128 | 129 | 'options' => [ 130 | 'cluster' => env('REDIS_CLUSTER', 'redis'), 131 | 'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_database_'), 132 | ], 133 | 134 | 'default' => [ 135 | 'url' => env('REDIS_URL'), 136 | 'host' => env('REDIS_HOST', '127.0.0.1'), 137 | 'password' => env('REDIS_PASSWORD'), 138 | 'port' => env('REDIS_PORT', '6379'), 139 | 'database' => env('REDIS_DB', '0'), 140 | ], 141 | 142 | 'cache' => [ 143 | 'url' => env('REDIS_URL'), 144 | 'host' => env('REDIS_HOST', '127.0.0.1'), 145 | 'password' => env('REDIS_PASSWORD'), 146 | 'port' => env('REDIS_PORT', '6379'), 147 | 'database' => env('REDIS_CACHE_DB', '1'), 148 | ], 149 | 150 | ], 151 | 152 | ]; 153 | -------------------------------------------------------------------------------- /config/datatables-buttons.php: -------------------------------------------------------------------------------- 1 | [ 10 | /* 11 | * Base namespace/directory to create the new file. 12 | * This is appended on default Laravel namespace. 13 | * Usage: php artisan datatables:make User 14 | * Output: App\DataTables\UserDataTable 15 | * With Model: App\User (default model) 16 | * Export filename: users_timestamp 17 | */ 18 | 'base' => 'DataTables', 19 | 20 | /* 21 | * Base namespace/directory where your model's are located. 22 | * This is appended on default Laravel namespace. 23 | * Usage: php artisan datatables:make Post --model 24 | * Output: App\DataTables\PostDataTable 25 | * With Model: App\Post 26 | * Export filename: posts_timestamp 27 | */ 28 | 'model' => '', 29 | ], 30 | 31 | /* 32 | * Set Custom stub folder 33 | */ 34 | //'stub' => '/app/cortex/foundation/resources/stubs', 35 | 36 | /* 37 | * PDF generator to be used when converting the table to pdf. 38 | * Available generators: excel, snappy 39 | * Snappy package: barryvdh/laravel-snappy 40 | * Excel package: maatwebsite/excel 41 | */ 42 | 'pdf_generator' => 'snappy', 43 | 44 | /* 45 | * Snappy PDF options. 46 | */ 47 | 'snappy' => [ 48 | 'options' => [ 49 | 'no-outline' => true, 50 | 'margin-left' => '0', 51 | 'margin-right' => '0', 52 | 'margin-top' => '10mm', 53 | 'margin-bottom' => '10mm', 54 | ], 55 | 'orientation' => 'landscape', 56 | ], 57 | 58 | /* 59 | * Default html builder parameters. 60 | */ 61 | 'parameters' => [ 62 | 'dom' => 'Bfrtip', 63 | 'order' => [[0, 'desc']], 64 | 'buttons' => [ 65 | 'create', 66 | 'export', 67 | 'print', 68 | 'reset', 69 | 'reload', 70 | ], 71 | ], 72 | 73 | /* 74 | * Generator command default options value. 75 | */ 76 | 'generator' => [ 77 | /* 78 | * Default columns to generate when not set. 79 | */ 80 | 'columns' => 'id,add your columns,created_at,updated_at', 81 | 82 | /* 83 | * Default buttons to generate when not set. 84 | */ 85 | 'buttons' => 'create,export,print,reset,reload', 86 | 87 | /* 88 | * Default DOM to generate when not set. 89 | */ 90 | 'dom' => 'Bfrtip', 91 | ], 92 | ]; 93 | -------------------------------------------------------------------------------- /config/datatables-fractal.php: -------------------------------------------------------------------------------- 1 | 'include', 10 | 11 | /* 12 | * Default fractal serializer. 13 | */ 14 | 'serializer' => League\Fractal\Serializer\DataArraySerializer::class, 15 | ]; 16 | -------------------------------------------------------------------------------- /config/datatables-html.php: -------------------------------------------------------------------------------- 1 | 'LaravelDataTables', 11 | 12 | /* 13 | * Default table attributes when generating the table. 14 | */ 15 | 'table' => [ 16 | 'id' => 'dataTableBuilder', 17 | 'class' => 'table table-striped table-hover responsive dataTableBuilder', 18 | ], 19 | 20 | /* 21 | * Default condition to determine if a parameter is a callback or not. 22 | * Callbacks needs to start by those terms or they will be casted to string. 23 | */ 24 | 'callback' => ['$', '$.', 'function', '{'], 25 | 26 | /* 27 | * Html builder script template. 28 | */ 29 | 'script' => 'datatables::script', 30 | 31 | /* 32 | * Html builder script template for DataTables Editor integration. 33 | */ 34 | 'editor' => 'datatables::editor', 35 | ]; 36 | -------------------------------------------------------------------------------- /config/datatables.php: -------------------------------------------------------------------------------- 1 | [ 10 | /* 11 | * Smart search will enclose search keyword with wildcard string "%keyword%". 12 | * SQL: column LIKE "%keyword%" 13 | */ 14 | 'smart' => true, 15 | 16 | /* 17 | * Multi-term search will explode search keyword using spaces resulting into multiple term search. 18 | */ 19 | 'multi_term' => true, 20 | 21 | /* 22 | * Case insensitive will search the keyword in lower case format. 23 | * SQL: LOWER(column) LIKE LOWER(keyword) 24 | */ 25 | 'case_insensitive' => true, 26 | 27 | /* 28 | * Wild card will add "%" in between every characters of the keyword. 29 | * SQL: column LIKE "%k%e%y%w%o%r%d%" 30 | */ 31 | 'use_wildcards' => false, 32 | 33 | /* 34 | * Perform a search which starts with the given keyword. 35 | * SQL: column LIKE "keyword%" 36 | */ 37 | 'starts_with' => false, 38 | ], 39 | 40 | /* 41 | * DataTables internal index id response column name. 42 | */ 43 | 'index_column' => 'DT_RowIndex', 44 | 45 | /* 46 | * List of available builders for DataTables. 47 | * This is where you can register your custom dataTables builder. 48 | */ 49 | 'engines' => [ 50 | 'query' => \Yajra\DataTables\QueryDataTable::class, 51 | 'collection' => \Yajra\DataTables\CollectionDataTable::class, 52 | 'resource' => \Yajra\DataTables\ApiResourceDataTable::class, 53 | 'eloquent' => \Yajra\DataTables\EloquentDataTable::class, 54 | ], 55 | 56 | /* 57 | * DataTables accepted builder to engine mapping. 58 | * This is where you can override which engine a builder should use 59 | * Note, only change this if you know what you are doing! 60 | */ 61 | 'builders' => [ 62 | //Illuminate\Database\Eloquent\Relations\Relation::class => 'eloquent', 63 | //Illuminate\Database\Eloquent\Builder::class => 'eloquent', 64 | //Illuminate\Database\Query\Builder::class => 'query', 65 | //Illuminate\Support\Collection::class => 'collection', 66 | ], 67 | 68 | /* 69 | * Nulls last sql pattern for PostgreSQL & Oracle. 70 | * For MySQL, use 'CASE WHEN :column IS NULL THEN 1 ELSE 0 END, :column :direction' 71 | */ 72 | 'nulls_last_sql' => ':column :direction NULLS LAST', 73 | 74 | /* 75 | * User friendly message to be displayed on user if error occurs. 76 | * Possible values: 77 | * null - The exception message will be used on error response. 78 | * 'throw' - Throws a \Yajra\DataTables\Exceptions\Exception. Use your custom error handler if needed. 79 | * 'custom message' - Any friendly message to be displayed to the user. You can also use translation key. 80 | */ 81 | 'error' => env('DATATABLES_ERROR', null), 82 | 83 | /* 84 | * Default columns definition of dataTable utility functions. 85 | */ 86 | 'columns' => [ 87 | /* 88 | * List of columns hidden/removed on json response. 89 | */ 90 | 'excess' => ['rn', 'row_num'], 91 | 92 | /* 93 | * List of columns to be escaped. If set to *, all columns are escape. 94 | * Note: You can set the value to empty array to disable XSS protection. 95 | */ 96 | 'escape' => '*', 97 | 98 | /* 99 | * List of columns that are allowed to display html content. 100 | * Note: Adding columns to list will make us available to XSS attacks. 101 | */ 102 | 'raw' => ['action'], 103 | 104 | /* 105 | * List of columns are forbidden from being searched/sorted. 106 | */ 107 | 'blacklist' => ['password', 'remember_token'], 108 | 109 | /* 110 | * List of columns that are only allowed fo search/sort. 111 | * If set to *, all columns are allowed. 112 | */ 113 | 'whitelist' => '*', 114 | ], 115 | 116 | /* 117 | * JsonResponse header and options config. 118 | */ 119 | 'json' => [ 120 | 'header' => [], 121 | 'options' => 0, 122 | ], 123 | 124 | ]; 125 | -------------------------------------------------------------------------------- /config/db-snapshots.php: -------------------------------------------------------------------------------- 1 | 'snapshots', 11 | 12 | /* 13 | * The connection to be used to create snapshots. Set this to null 14 | * to use the default configured in `config/databases.php` 15 | */ 16 | 'default_connection' => null, 17 | 18 | /* 19 | * The directory where temporary files will be stored. 20 | */ 21 | 'temporary_directory_path' => storage_path('app/laravel-db-snapshots/temp'), 22 | 23 | /* 24 | * Create dump files that are gzipped 25 | */ 26 | 'compress' => false, 27 | 28 | /* 29 | * Only these tables will be included in the snapshot. Set to `null` to include all tables. 30 | * 31 | * Default: `null` 32 | */ 33 | 'tables' => null, 34 | ]; 35 | -------------------------------------------------------------------------------- /config/debug-server.php: -------------------------------------------------------------------------------- 1 | env('DUMP_SERVER_HOST', 'tcp://127.0.0.1:9912'), 10 | ]; 11 | -------------------------------------------------------------------------------- /config/eloquent-sortable.php: -------------------------------------------------------------------------------- 1 | 'order_column', 10 | 11 | /* 12 | * Define if the models should sort when creating. 13 | * When true, the package will automatically assign the highest order number to a new mode 14 | */ 15 | 'sort_when_creating' => true, 16 | ]; 17 | -------------------------------------------------------------------------------- /config/filesystems.php: -------------------------------------------------------------------------------- 1 | env('FILESYSTEM_DISK', 'local'), 19 | 20 | /* 21 | |-------------------------------------------------------------------------- 22 | | Filesystem Disks 23 | |-------------------------------------------------------------------------- 24 | | 25 | | Here you may configure as many filesystem "disks" as you wish, and you 26 | | may even configure multiple disks of the same driver. Defaults have 27 | | been setup for each driver as an example of the required options. 28 | | 29 | | Supported Drivers: "local", "ftp", "sftp", "s3" 30 | | 31 | */ 32 | 33 | 'disks' => [ 34 | 35 | 'local' => [ 36 | 'driver' => 'local', 37 | 'root' => storage_path('app'), 38 | ], 39 | 40 | 'public' => [ 41 | 'driver' => 'local', 42 | 'root' => storage_path('app/public'), 43 | 'url' => env('APP_URL').'/storage', 44 | 'visibility' => 'public', 45 | ], 46 | 47 | 's3' => [ 48 | 'driver' => 's3', 49 | 'url' => env('AWS_S3_URL'), 50 | 'key' => env('AWS_S3_KEY'), 51 | 'secret' => env('AWS_S3_SECRET'), 52 | 'region' => env('AWS_S3_REGION', 'us-east-1'), 53 | 'bucket' => env('AWS_S3_BUCKET'), 54 | 'endpoint' => env('AWS_S3_ENDPOINT'), 55 | 'use_path_style_endpoint' => env('AWS_S3_USE_PATH_STYLE_ENDPOINT', false), 56 | ], 57 | 58 | 's3-public' => [ 59 | 'driver' => 's3', 60 | 'visibility' => 'public', 61 | 'url' => env('AWS_S3_URL'), 62 | 'key' => env('AWS_S3_KEY'), 63 | 'secret' => env('AWS_S3_SECRET'), 64 | 'region' => env('AWS_S3_REGION', 'us-east-1'), 65 | 'bucket' => env('AWS_S3_BUCKET'), 66 | 'endpoint' => env('AWS_S3_ENDPOINT'), 67 | 'use_path_style_endpoint' => env('AWS_S3_USE_PATH_STYLE_ENDPOINT', false), 68 | ], 69 | 70 | 'snapshots' => [ 71 | 'driver' => 'local', 72 | 'root' => database_path('snapshots'), 73 | ], 74 | 75 | ], 76 | 77 | /* 78 | |-------------------------------------------------------------------------- 79 | | Symbolic Links 80 | |-------------------------------------------------------------------------- 81 | | 82 | | Here you may configure the symbolic links that will be created when the 83 | | `storage:link` Artisan command is executed. The array keys should be 84 | | the locations of the links and the values should be their targets. 85 | | 86 | */ 87 | 88 | 'links' => [ 89 | public_path('storage') => storage_path('app/public'), 90 | ], 91 | 92 | ]; 93 | -------------------------------------------------------------------------------- /config/flare.php: -------------------------------------------------------------------------------- 1 | env('FLARE_KEY'), 31 | 32 | /* 33 | |-------------------------------------------------------------------------- 34 | | Middleware 35 | |-------------------------------------------------------------------------- 36 | | 37 | | These middleware will modify the contents of the report sent to Flare. 38 | | 39 | */ 40 | 41 | 'flare_middleware' => [ 42 | RemoveRequestIp::class, 43 | AddGitInformation::class, 44 | AddNotifierName::class, 45 | AddEnvironmentInformation::class, 46 | AddExceptionInformation::class, 47 | AddDumps::class, 48 | AddLogs::class => [ 49 | 'maximum_number_of_collected_logs' => 200, 50 | ], 51 | AddQueries::class => [ 52 | 'maximum_number_of_collected_queries' => 200, 53 | 'report_query_bindings' => true, 54 | ], 55 | AddJobs::class => [ 56 | 'max_chained_job_reporting_depth' => 5, 57 | ], 58 | CensorRequestBodyFields::class => [ 59 | 'censor_fields' => [ 60 | 'password', 61 | 'password_confirmation', 62 | ], 63 | ], 64 | CensorRequestHeaders::class => [ 65 | 'headers' => [ 66 | 'API-KEY', 67 | ], 68 | ], 69 | ], 70 | 71 | /* 72 | |-------------------------------------------------------------------------- 73 | | Reporting log statements 74 | |-------------------------------------------------------------------------- 75 | | 76 | | If this setting is `false` log statements won't be sent as events to Flare, 77 | | no matter which error level you specified in the Flare log channel. 78 | | 79 | */ 80 | 81 | 'send_logs_as_events' => true, 82 | ]; 83 | -------------------------------------------------------------------------------- /config/geoip.php: -------------------------------------------------------------------------------- 1 | false, 18 | 19 | /* 20 | |-------------------------------------------------------------------------- 21 | | Include Currency in Results 22 | |-------------------------------------------------------------------------- 23 | | 24 | | When enabled the system will do it's best in deciding the user's currency 25 | | by matching their ISO code to a preset list of currencies. 26 | | 27 | */ 28 | 29 | 'include_currency' => false, 30 | 31 | /* 32 | |-------------------------------------------------------------------------- 33 | | Default Service 34 | |-------------------------------------------------------------------------- 35 | | 36 | | Here you may specify the default storage driver that should be used 37 | | by the framework. 38 | | 39 | | Supported: "maxmind_database", "maxmind_api", "ipapi" 40 | | 41 | */ 42 | 43 | 'service' => 'maxmind_database', 44 | 45 | /* 46 | |-------------------------------------------------------------------------- 47 | | Storage Specific Configuration 48 | |-------------------------------------------------------------------------- 49 | | 50 | | Here you may configure as many storage drivers as you wish. 51 | | 52 | */ 53 | 54 | 'services' => [ 55 | 56 | 'maxmind_database' => [ 57 | 'class' => \Torann\GeoIP\Services\MaxMindDatabase::class, 58 | 'database_path' => storage_path('app/geoip.mmdb'), 59 | 'update_url' => 'https://geolite.maxmind.com/download/geoip/database/GeoLite2-City.mmdb.gz', 60 | 'locales' => ['en'], 61 | ], 62 | 63 | 'maxmind_api' => [ 64 | 'class' => \Torann\GeoIP\Services\MaxMindWebService::class, 65 | 'user_id' => env('MAXMIND_USER_ID'), 66 | 'license_key' => env('MAXMIND_LICENSE_KEY'), 67 | 'locales' => ['en'], 68 | ], 69 | 70 | 'ipapi' => [ 71 | 'class' => \Torann\GeoIP\Services\IPApi::class, 72 | 'secure' => true, 73 | 'key' => env('IPAPI_KEY'), 74 | 'continent_path' => storage_path('app/continents.json'), 75 | 'lang' => 'en', 76 | ], 77 | 78 | 'ipgeolocation' => [ 79 | 'class' => \Torann\GeoIP\Services\IPGeoLocation::class, 80 | 'secure' => true, 81 | 'key' => env('IPGEOLOCATION_KEY'), 82 | 'continent_path' => storage_path('app/continents.json'), 83 | 'lang' => 'en', 84 | ], 85 | 86 | 'ipdata' => [ 87 | 'class' => \Torann\GeoIP\Services\IPData::class, 88 | 'key' => env('IPDATA_API_KEY'), 89 | 'secure' => true, 90 | ], 91 | 92 | 'ipfinder' => [ 93 | 'class' => \Torann\GeoIP\Services\IPFinder::class, 94 | 'key' => env('IPFINDER_API_KEY'), 95 | 'secure' => true, 96 | 'locales' => ['en'], 97 | ], 98 | 99 | ], 100 | 101 | /* 102 | |-------------------------------------------------------------------------- 103 | | Default Cache Driver 104 | |-------------------------------------------------------------------------- 105 | | 106 | | Here you may specify the type of caching that should be used 107 | | by the package. 108 | | 109 | | Options: 110 | | 111 | | all - All location are cached 112 | | some - Cache only the requesting user 113 | | none - Disable cached 114 | | 115 | */ 116 | 117 | 'cache' => 'all', 118 | 119 | /* 120 | |-------------------------------------------------------------------------- 121 | | Cache Tags 122 | |-------------------------------------------------------------------------- 123 | | 124 | | Cache tags are not supported when using the file or database cache 125 | | drivers in Laravel. This is done so that only locations can be cleared. 126 | | 127 | */ 128 | 129 | 'cache_tags' => ['torann-geoip-location'], 130 | 131 | /* 132 | |-------------------------------------------------------------------------- 133 | | Cache Expiration 134 | |-------------------------------------------------------------------------- 135 | | 136 | | Define how long cached location are valid. 137 | | 138 | */ 139 | 140 | 'cache_expires' => 30, 141 | 142 | /* 143 | |-------------------------------------------------------------------------- 144 | | Default Location 145 | |-------------------------------------------------------------------------- 146 | | 147 | | Return when a location is not found. 148 | | 149 | */ 150 | 151 | 'default_location' => [ 152 | 'ip' => '127.0.0.0', 153 | 'iso_code' => 'US', 154 | 'country' => 'United States', 155 | 'city' => 'New Haven', 156 | 'state' => 'CT', 157 | 'state_name' => 'Connecticut', 158 | 'postal_code' => '06510', 159 | 'lat' => 41.31, 160 | 'lon' => -72.92, 161 | 'timezone' => env('APP_TIMEZONE', 'UTC'), 162 | 'continent' => 'NA', 163 | 'default' => true, 164 | 'currency' => 'USD', 165 | ], 166 | 167 | ]; 168 | -------------------------------------------------------------------------------- /config/hashids.php: -------------------------------------------------------------------------------- 1 | 'main', 19 | 20 | /* 21 | |-------------------------------------------------------------------------- 22 | | Hashids Connections 23 | |-------------------------------------------------------------------------- 24 | | 25 | | Here are each of the connections setup for your application. Example 26 | | configuration has been included, but you may add as many connections as 27 | | you would like. 28 | | 29 | */ 30 | 31 | 'connections' => [ 32 | 33 | 'main' => [ 34 | 'salt' => env('HASHIDS_KEY'), 35 | 'length' => (int) env('HASHIDS_LENGTH'), 36 | 'alphabet' => env('HASHIDS_ALPHABET'), 37 | ], 38 | 39 | 'alternative' => [ 40 | 'salt' => env('HASHIDS_KEY'), 41 | 'length' => (int) env('HASHIDS_LENGTH'), 42 | 'alphabet' => env('HASHIDS_ALPHABET'), 43 | ], 44 | 45 | ], 46 | 47 | ]; 48 | -------------------------------------------------------------------------------- /config/hashing.php: -------------------------------------------------------------------------------- 1 | 'bcrypt', 21 | 22 | /* 23 | |-------------------------------------------------------------------------- 24 | | Bcrypt Options 25 | |-------------------------------------------------------------------------- 26 | | 27 | | Here you may specify the configuration options that should be used when 28 | | passwords are hashed using the Bcrypt algorithm. This will allow you 29 | | to control the amount of time it takes to hash the given password. 30 | | 31 | */ 32 | 33 | 'bcrypt' => [ 34 | 'rounds' => env('BCRYPT_ROUNDS', 10), 35 | ], 36 | 37 | /* 38 | |-------------------------------------------------------------------------- 39 | | Argon Options 40 | |-------------------------------------------------------------------------- 41 | | 42 | | Here you may specify the configuration options that should be used when 43 | | passwords are hashed using the Argon algorithm. These will allow you 44 | | to control the amount of time it takes to hash the given password. 45 | | 46 | */ 47 | 48 | 'argon' => [ 49 | 'memory' => 65536, 50 | 'threads' => 1, 51 | 'time' => 4, 52 | ], 53 | 54 | ]; 55 | -------------------------------------------------------------------------------- /config/image.php: -------------------------------------------------------------------------------- 1 | 'gd', 21 | 22 | ]; 23 | -------------------------------------------------------------------------------- /config/jsvalidation.php: -------------------------------------------------------------------------------- 1 | 'jsvalidation::bootstrap', 13 | 14 | /* 15 | * Default JQuery selector find the form to be validated. 16 | * By default, the validations are applied to all forms. 17 | */ 18 | 'form_selector' => 'form', 19 | 20 | /* 21 | * If you change the focus on detect some error then active 22 | * this parameter to move the focus to the first error found. 23 | */ 24 | 'focus_on_error' => false, 25 | 26 | /* 27 | * Duration time for the animation when We are moving the focus 28 | * to the first error, http://api.jquery.com/animate/ for more information. 29 | */ 30 | 'duration_animate' => 1000, 31 | 32 | /* 33 | * Enable or disable Ajax validations of Database and custom rules. 34 | * By default Unique, ActiveURL, Exists and custom validations are validated via AJAX 35 | */ 36 | 'disable_remote_validation' => false, 37 | 38 | /* 39 | * Field name used in the remote validation Ajax request 40 | * You can change this value to avoid conflicts wth your field names 41 | */ 42 | 'remote_validation_field' => '_jsvalidation', 43 | 44 | /* 45 | * Whether to escape all validation messages with htmlentities. 46 | */ 47 | 'escape' => true, 48 | 49 | /* 50 | * Set a default value for the validate ignore property. 51 | * 52 | * See https://jqueryvalidation.org/validate/#ignore 53 | */ 54 | 'ignore' => ":hidden, [contenteditable='true']", 55 | ]; 56 | -------------------------------------------------------------------------------- /config/laravel-link-checker.php: -------------------------------------------------------------------------------- 1 | '', 12 | 13 | /* 14 | * The profile determining which links need to be checked. 15 | */ 16 | 'default_profile' => Spatie\LinkChecker\CheckAllLinks::class, 17 | 18 | /* 19 | * The reporter determining what needs to be done when the 20 | * the crawler has visited a link. 21 | */ 22 | 'default_reporter' => Spatie\LinkChecker\Reporters\LogBrokenLinks::class, 23 | 24 | /* 25 | * To speed up the checking process we'll fire off requests concurrently. 26 | * Here you can change the amount of concurrent requests. 27 | */ 28 | 'concurrency' => 10, 29 | 30 | /* 31 | * List of client options to use in Guzzle HTTP. 32 | */ 33 | 'client_options' => [ 34 | 35 | \GuzzleHttp\RequestOptions::COOKIES => true, 36 | \GuzzleHttp\RequestOptions::CONNECT_TIMEOUT => 10, 37 | \GuzzleHttp\RequestOptions::TIMEOUT => 10, 38 | \GuzzleHttp\RequestOptions::ALLOW_REDIRECTS => false, 39 | 40 | ], 41 | 42 | /* 43 | * Configuration regarding the used reporters. 44 | */ 45 | 'reporters' => [ 46 | 47 | 'mail' => [ 48 | 49 | /* 50 | * The from address to be used by the mail reporter. 51 | */ 52 | 'from_address' => '', 53 | 54 | /* 55 | * The to address to be used by the mail reporter. 56 | */ 57 | 'to_address' => '', 58 | 59 | /* 60 | * The subject line to be used by the mail reporter. 61 | */ 62 | 'subject' => '', 63 | 64 | ], 65 | 66 | /* 67 | * If you wish to exclude certain status codes from the reporters, 68 | * specify them here. 69 | * Here's an example: [200, 302] 70 | */ 71 | 'exclude_status_codes' => [], 72 | ], 73 | ]; 74 | -------------------------------------------------------------------------------- /config/laroute.php: -------------------------------------------------------------------------------- 1 | public_path('js'), 11 | 12 | /* 13 | * The destination filename for the javascript file. 14 | */ 15 | 'filename' => 'routes', 16 | 17 | /* 18 | * The namespace for the helper functions. By default this will bind them to 19 | * `window.laroute`. 20 | */ 21 | 'namespace' => 'routes', 22 | 23 | /* 24 | * Generate absolute URLs 25 | * 26 | * Set the Application URL in config/app.php 27 | */ 28 | 'absolute' => true, 29 | 30 | /* 31 | * The Filter Method 32 | * 33 | * 'all' => All routes except "'laroute' => false" 34 | * 'only' => Only "'laroute' => true" routes 35 | * 'force' => All routes, ignored "laroute" route parameter 36 | */ 37 | 'filter' => 'all', 38 | 39 | /* 40 | * Controller Namespace 41 | * 42 | * Set here your controller namespace (see RouteServiceProvider -> $namespace) for cleaner action calls 43 | * e.g. 'App\Http\Controllers' 44 | */ 45 | 'action_namespace' => '', 46 | 47 | /* 48 | * The path to the template `laroute.js` file. This is the file that contains 49 | * the ported helper Laravel url/route functions and the route data to go 50 | * with them. 51 | */ 52 | 'template' => __DIR__.'/../resources/js/vendor/laroute.js', 53 | 54 | /* 55 | * Appends a prefix to URLs. By default the prefix is an empty string. 56 | * 57 | */ 58 | 'prefix' => '', 59 | 60 | ]; 61 | -------------------------------------------------------------------------------- /config/localization-js.php: -------------------------------------------------------------------------------- 1 | [ 12 | * 'validation', 13 | * 'forum/thread', 14 | * ], 15 | */ 16 | 'messages' => [ 17 | 18 | ], 19 | 20 | /* 21 | * The default path to use for the generated javascript. 22 | */ 23 | 'path' => public_path('js/messages.js'), 24 | ]; 25 | -------------------------------------------------------------------------------- /config/logging.php: -------------------------------------------------------------------------------- 1 | env('LOG_CHANNEL', 'stack'), 23 | 24 | /* 25 | |-------------------------------------------------------------------------- 26 | | Deprecations Log Channel 27 | |-------------------------------------------------------------------------- 28 | | 29 | | This option controls the log channel that should be used to log warnings 30 | | regarding deprecated PHP and library features. This allows you to get 31 | | your application ready for upcoming major versions of dependencies. 32 | | 33 | */ 34 | 35 | 'deprecations' => env('LOG_DEPRECATIONS_CHANNEL', 'null'), 36 | 37 | /* 38 | |-------------------------------------------------------------------------- 39 | | Log Channels 40 | |-------------------------------------------------------------------------- 41 | | 42 | | Here you may configure the log channels for your application. Out of 43 | | the box, Laravel uses the Monolog PHP logging library. This gives 44 | | you a variety of powerful log handlers / formatters to utilize. 45 | | 46 | | Available Drivers: "single", "daily", "slack", "syslog", 47 | | "errorlog", "monolog", 48 | | "custom", "stack" 49 | | 50 | */ 51 | 52 | 'channels' => [ 53 | 'stack' => [ 54 | 'driver' => 'stack', 55 | 'channels' => ['daily', 'flare'], 56 | 'ignore_exceptions' => false, 57 | ], 58 | 59 | 'single' => [ 60 | 'driver' => 'single', 61 | 'path' => storage_path('logs/laravel.log'), 62 | 'level' => env('LOG_LEVEL', 'debug'), 63 | ], 64 | 65 | 'daily' => [ 66 | 'driver' => 'daily', 67 | 'path' => storage_path('logs/laravel.log'), 68 | 'level' => env('LOG_LEVEL', 'debug'), 69 | 'days' => 14, 70 | ], 71 | 72 | 'installer' => [ 73 | 'driver' => 'daily', 74 | 'path' => storage_path('logs/installer.log'), 75 | 'level' => 'debug', 76 | ], 77 | 78 | 'slack' => [ 79 | 'driver' => 'slack', 80 | 'url' => env('LOG_SLACK_WEBHOOK_URL'), 81 | 'username' => 'Laravel Log', 82 | 'emoji' => ':boom:', 83 | 'level' => env('LOG_LEVEL', 'critical'), 84 | ], 85 | 86 | 'papertrail' => [ 87 | 'driver' => 'monolog', 88 | 'level' => env('LOG_LEVEL', 'debug'), 89 | 'handler' => env('LOG_PAPERTRAIL_HANDLER', SyslogUdpHandler::class), 90 | 'handler_with' => [ 91 | 'host' => env('PAPERTRAIL_URL'), 92 | 'port' => env('PAPERTRAIL_PORT'), 93 | 'connectionString' => 'tls://'.env('PAPERTRAIL_URL').':'.env('PAPERTRAIL_PORT'), 94 | ], 95 | ], 96 | 97 | 'stderr' => [ 98 | 'driver' => 'monolog', 99 | 'level' => env('LOG_LEVEL', 'debug'), 100 | 'handler' => StreamHandler::class, 101 | 'formatter' => env('LOG_STDERR_FORMATTER'), 102 | 'with' => [ 103 | 'stream' => 'php://stderr', 104 | ], 105 | ], 106 | 107 | 'syslog' => [ 108 | 'driver' => 'syslog', 109 | 'level' => env('LOG_LEVEL', 'debug'), 110 | ], 111 | 112 | 'errorlog' => [ 113 | 'driver' => 'errorlog', 114 | 'level' => env('LOG_LEVEL', 'debug'), 115 | ], 116 | 117 | 'null' => [ 118 | 'driver' => 'monolog', 119 | 'handler' => NullHandler::class, 120 | ], 121 | 122 | 'emergency' => [ 123 | 'path' => storage_path('logs/laravel.log'), 124 | ], 125 | 126 | 'flare' => [ 127 | 'driver' => 'flare', 128 | ], 129 | 130 | ], 131 | 132 | ]; 133 | -------------------------------------------------------------------------------- /config/mail.php: -------------------------------------------------------------------------------- 1 | env('MAIL_MAILER', 'smtp'), 19 | 20 | /* 21 | |-------------------------------------------------------------------------- 22 | | Mailer Configurations 23 | |-------------------------------------------------------------------------- 24 | | 25 | | Here you may configure all of the mailers used by your application plus 26 | | their respective settings. Several examples have been configured for 27 | | you and you are free to add your own as your application requires. 28 | | 29 | | Laravel supports a variety of mail "transport" drivers to be used while 30 | | sending an e-mail. You will specify which one you are using for your 31 | | mailers below. You are free to add additional mailers as required. 32 | | 33 | | Supported: "smtp", "sendmail", "mailgun", "ses", 34 | | "postmark", "log", "array", "failover" 35 | | 36 | */ 37 | 38 | 'mailers' => [ 39 | 'smtp' => [ 40 | 'transport' => 'smtp', 41 | 'host' => env('MAIL_HOST', 'smtp.mailgun.org'), 42 | 'port' => env('MAIL_PORT', 587), 43 | 'encryption' => env('MAIL_ENCRYPTION', 'tls'), 44 | 'username' => env('MAIL_USERNAME'), 45 | 'password' => env('MAIL_PASSWORD'), 46 | 'timeout' => null, 47 | ], 48 | 49 | 'ses' => [ 50 | 'transport' => 'ses', 51 | ], 52 | 53 | 'mailgun' => [ 54 | 'transport' => 'mailgun', 55 | ], 56 | 57 | 'postmark' => [ 58 | 'transport' => 'postmark', 59 | ], 60 | 61 | 'sendmail' => [ 62 | 'transport' => 'sendmail', 63 | 'path' => env('MAIL_SENDMAIL_PATH', '/usr/sbin/sendmail -t -i'), 64 | ], 65 | 66 | 'log' => [ 67 | 'transport' => 'log', 68 | 'channel' => env('MAIL_LOG_CHANNEL'), 69 | ], 70 | 71 | 'array' => [ 72 | 'transport' => 'array', 73 | ], 74 | 75 | 'failover' => [ 76 | 'transport' => 'failover', 77 | 'mailers' => [ 78 | 'smtp', 79 | 'log', 80 | ], 81 | ], 82 | ], 83 | 84 | /* 85 | |-------------------------------------------------------------------------- 86 | | Global "From" Address 87 | |-------------------------------------------------------------------------- 88 | | 89 | | You may wish for all e-mails sent by your application to be sent from 90 | | the same address. Here, you may specify a name and address that is 91 | | used globally for all e-mails that are sent by your application. 92 | | 93 | */ 94 | 95 | 'from' => [ 96 | 'address' => env('MAIL_FROM_ADDRESS', 'help@rinvex.com'), 97 | 'name' => env('MAIL_FROM_NAME', 'Rinvex LLC'), 98 | ], 99 | 100 | /* 101 | |-------------------------------------------------------------------------- 102 | | Markdown Mail Settings 103 | |-------------------------------------------------------------------------- 104 | | 105 | | If you are using Markdown based email rendering, you may configure your 106 | | theme and component paths here, allowing you to customize the design 107 | | of the emails. Or, you may simply stick with the Laravel defaults! 108 | | 109 | */ 110 | 111 | 'markdown' => [ 112 | 'theme' => 'default', 113 | 114 | 'paths' => [ 115 | resource_path('views/vendor/mail'), 116 | ], 117 | ], 118 | 119 | ]; 120 | -------------------------------------------------------------------------------- /config/notification.php: -------------------------------------------------------------------------------- 1 | 'notifications', 16 | 17 | /* 18 | |-------------------------------------------------------------------------- 19 | | Default container name 20 | |-------------------------------------------------------------------------- 21 | | 22 | | This name will be used to name default container (when calling it with null value). 23 | | 24 | */ 25 | 'default_container' => 'default', 26 | 27 | /* 28 | |-------------------------------------------------------------------------- 29 | | Default types for dynamic containers. 30 | |-------------------------------------------------------------------------- 31 | | 32 | | These types will be added for new containers. 33 | | 34 | */ 35 | 'default_types' => ['info', 'success', 'warning', 'danger', 'errors'], 36 | 37 | /* 38 | |-------------------------------------------------------------------------- 39 | | Types for containers 40 | |-------------------------------------------------------------------------- 41 | | 42 | | Specify available types for each container separately. 43 | | 44 | */ 45 | 'types' => [], 46 | 47 | /* 48 | |-------------------------------------------------------------------------- 49 | | Default message format 50 | |-------------------------------------------------------------------------- 51 | | 52 | | This format will be used when no format is specified. 53 | | Available place holders: 54 | | 55 | | :type - type of message (error, warning, info, success). 56 | | :message - message text. 57 | | 58 | */ 59 | 'default_format' => "", 60 | 61 | /* 62 | |-------------------------------------------------------------------------- 63 | | Default message format for containers 64 | |-------------------------------------------------------------------------- 65 | | 66 | | This format will be used to override global default format for each container. 67 | | 68 | | 'format' => array( 69 | | 'myContainer' => ':message - :type', 70 | | ) 71 | | 72 | | 73 | | Available place holders: 74 | | 75 | | :type - type of message (error, warning, info, success). 76 | | :message - message text. 77 | | 78 | */ 79 | 'format' => [], 80 | 81 | /* 82 | |-------------------------------------------------------------------------- 83 | | Default message formats for types 84 | |-------------------------------------------------------------------------- 85 | | 86 | | These formats can override default format for each type of message (error, warning, info, success). 87 | | Available place holders: 88 | | 89 | | :type - type of message (error, warning, info, success). 90 | | :message - message text. 91 | | 92 | */ 93 | 'default_formats' => [], 94 | 95 | /* 96 | |-------------------------------------------------------------------------- 97 | | Message formats for types and container types 98 | |-------------------------------------------------------------------------- 99 | | 100 | | These formats can override default format for each type of message (error, warning, info, success). 101 | | You can set formats for each container by using this syntax: 102 | | 103 | | 'formats' => array( 104 | | 'myContainer' => array( 105 | | 'info' => ':key - :message' 106 | | ) 107 | | ) 108 | | 109 | | Available place holders: 110 | | 111 | | :type - type of message (error, warning, info, success). 112 | | :message - message text. 113 | | 114 | */ 115 | 'formats' => [ 116 | 'default' => [ 117 | 'errors' => "", 118 | ], 119 | ], 120 | 121 | ]; 122 | -------------------------------------------------------------------------------- /config/opcache.php: -------------------------------------------------------------------------------- 1 | env('OPCACHE_URL', config('app.url')), 7 | 'prefix' => 'opcache-api', 8 | 'verify' => true, 9 | 'headers' => [], 10 | 'directories' => [ 11 | base_path('app'), 12 | base_path('bootstrap'), 13 | base_path('public'), 14 | base_path('resources'), 15 | base_path('routes'), 16 | base_path('storage'), 17 | base_path('vendor'), 18 | ], 19 | 'exclude' => [ 20 | 'test', 21 | 'Test', 22 | 'tests', 23 | 'Tests', 24 | 'stub', 25 | 'Stub', 26 | 'stubs', 27 | 'Stubs', 28 | 'dumper', 29 | 'Dumper', 30 | 'Autoload', 31 | ], 32 | ]; 33 | -------------------------------------------------------------------------------- /config/querydetector.php: -------------------------------------------------------------------------------- 1 | env('QUERY_DETECTOR_ENABLED', null), 11 | 12 | /* 13 | * Threshold level for the N+1 query detection. If a relation query will be 14 | * executed more then this amount, the detector will notify you about it. 15 | */ 16 | 'threshold' => (int) env('QUERY_DETECTOR_THRESHOLD', 1), 17 | 18 | /* 19 | * Here you can whitelist model relations. 20 | * 21 | * Right now, you need to define the model relation both as the class name and the attribute name on the model. 22 | * So if an "Author" model would have a "posts" relation that points to a "Post" class, you need to add both 23 | * the "posts" attribute and the "Post::class", since the relation can get resolved in multiple ways. 24 | */ 25 | 'except' => [ 26 | //Author::class => [ 27 | // Post::class, 28 | // 'posts', 29 | //] 30 | ], 31 | 32 | /* 33 | * Here you can set a specific log channel to write to 34 | * in case you are trying to isolate queries or have a lot 35 | * going on in the laravel.log. Defaults to laravel.log though. 36 | */ 37 | 'log_channel' => env('QUERY_DETECTOR_LOG_CHANNEL', 'daily'), 38 | 39 | /* 40 | * Define the output format that you want to use. Multiple classes are supported. 41 | * Available options are: 42 | * 43 | * Alert: 44 | * Displays an alert on the website 45 | * \BeyondCode\QueryDetector\Outputs\Alert::class 46 | * 47 | * Console: 48 | * Writes the N+1 queries into your browsers console log 49 | * \BeyondCode\QueryDetector\Outputs\Console::class 50 | * 51 | * Clockwork: (make sure you have the itsgoingd/clockwork package installed) 52 | * Writes the N+1 queries warnings to Clockwork log 53 | * \BeyondCode\QueryDetector\Outputs\Clockwork::class 54 | * 55 | * Debugbar: (make sure you have the barryvdh/laravel-debugbar package installed) 56 | * Writes the N+1 queries into a custom messages collector of Debugbar 57 | * \BeyondCode\QueryDetector\Outputs\Debugbar::class 58 | * 59 | * JSON: 60 | * Writes the N+1 queries into the response body of your JSON responses 61 | * \BeyondCode\QueryDetector\Outputs\Json::class 62 | * 63 | * Log: 64 | * Writes the N+1 queries into the Laravel.log file 65 | * \BeyondCode\QueryDetector\Outputs\Log::class 66 | */ 67 | 'output' => [ 68 | \BeyondCode\QueryDetector\Outputs\Alert::class, 69 | \BeyondCode\QueryDetector\Outputs\Log::class, 70 | ], 71 | ]; 72 | -------------------------------------------------------------------------------- /config/queue.php: -------------------------------------------------------------------------------- 1 | env('QUEUE_CONNECTION', 'database'), 19 | 20 | /* 21 | |-------------------------------------------------------------------------- 22 | | Queue Connections 23 | |-------------------------------------------------------------------------- 24 | | 25 | | Here you may configure the connection information for each server that 26 | | is used by your application. A default configuration has been added 27 | | for each back-end shipped with Laravel. You are free to add more. 28 | | 29 | | Drivers: "sync", "database", "beanstalkd", "sqs", "redis", "null" 30 | | 31 | */ 32 | 33 | 'connections' => [ 34 | 35 | 'sync' => [ 36 | 'driver' => 'sync', 37 | ], 38 | 39 | 'database' => [ 40 | 'driver' => 'database', 41 | 'table' => 'queue_job_records', 42 | 'queue' => 'default', 43 | 'retry_after' => 90, 44 | 'after_commit' => false, 45 | ], 46 | 47 | 'beanstalkd' => [ 48 | 'driver' => 'beanstalkd', 49 | 'host' => 'localhost', 50 | 'queue' => 'default', 51 | 'retry_after' => 90, 52 | 'block_for' => 0, 53 | 'after_commit' => false, 54 | ], 55 | 56 | 'sqs' => [ 57 | 'driver' => 'sqs', 58 | 'key' => env('AWS_SQS_KEY'), 59 | 'secret' => env('AWS_SQS_SECRET'), 60 | 'prefix' => env('AWS_SQS_PREFIX', 'https://sqs.us-east-1.amazonaws.com/your-account-id'), 61 | 'queue' => env('AWS_SQS_QUEUE', 'default'), 62 | 'suffix' => env('AWS_SQS_SUFFIX'), 63 | 'region' => env('AWS_SQS_REGION', 'us-east-1'), 64 | 'after_commit' => false, 65 | ], 66 | 67 | 'redis' => [ 68 | 'driver' => 'redis', 69 | 'connection' => 'default', 70 | 'queue' => env('REDIS_QUEUE', 'default'), 71 | 'retry_after' => 90, 72 | 'block_for' => null, 73 | 'after_commit' => false, 74 | ], 75 | 76 | ], 77 | 78 | /* 79 | |-------------------------------------------------------------------------- 80 | | Failed Queue Jobs 81 | |-------------------------------------------------------------------------- 82 | | 83 | | These options configure the behavior of failed queue job logging so you 84 | | can control which database and table are used to store the jobs that 85 | | have failed. You may change them to any database / table you wish. 86 | | 87 | */ 88 | 89 | 'failed' => [ 90 | 'driver' => env('QUEUE_FAILED_DRIVER', 'database-uuids'), 91 | 'database' => env('DB_CONNECTION', 'mysql'), 92 | 'table' => 'queue_job_failures', 93 | ], 94 | 95 | 'batching' => [ 96 | 'database' => env('DB_CONNECTION', 'mysql'), 97 | 'table' => 'queue_job_batches', 98 | ], 99 | 100 | ]; 101 | -------------------------------------------------------------------------------- /config/rinvex.categories.php: -------------------------------------------------------------------------------- 1 | true, 9 | 10 | // Categories Database Tables 11 | 'tables' => [ 12 | 13 | 'categories' => 'categories', 14 | 'categorizables' => 'categorizables', 15 | 16 | ], 17 | 18 | // Categories Models 19 | 'models' => [ 20 | 'category' => \Cortex\Categories\Models\Category::class, 21 | ], 22 | 23 | ]; 24 | -------------------------------------------------------------------------------- /config/rinvex.oauth.php: -------------------------------------------------------------------------------- 1 | true, 9 | 10 | // Enabled grants 11 | 'grants' => [ 12 | 'Password' => ['enabled' => true, 'expire_in' => new DateInterval('P1Y')], 13 | 'Implicit' => ['enabled' => false, 'expire_in' => new DateInterval('P1Y')], 14 | 'AuthCode' => ['enabled' => true, 'expire_in' => new DateInterval('P1Y')], 15 | 'RefreshToken' => ['enabled' => true, 'expire_in' => new DateInterval('P1Y')], 16 | 'PersonalAccess' => ['enabled' => true, 'expire_in' => new DateInterval('P1Y')], 17 | 'ClientCredentials' => ['enabled' => true, 'expire_in' => new DateInterval('P1Y')], 18 | ], 19 | 20 | // Indicates if we should unserializes cookies. 21 | 'unserializes_cookies' => false, 22 | 23 | // Indicates if we should ignore incoming CSRF tokens. 24 | 'ignore_csrf_token' => false, 25 | 26 | // The name for API token cookies. 27 | 'cookie' => 'laravel_token', 28 | 29 | // Set the default scope(s). Multiple scopes may be specified delimited by spaces. 30 | 'default_scope' => null, 31 | 32 | // Override the default "BearerTokenResponse" to custom schema, 33 | // for example to add new extra parameters to support OpenID Connect flow 34 | 'server_response_type' => null, 35 | 36 | // Database Tables 37 | 'tables' => [ 38 | 'clients' => 'oauth_clients', 39 | 'auth_codes' => 'oauth_auth_codes', 40 | 'access_tokens' => 'oauth_access_tokens', 41 | 'refresh_tokens' => 'oauth_refresh_tokens', 42 | ], 43 | 44 | // Models 45 | 'models' => [ 46 | 'client' => \Cortex\Oauth\Models\Client::class, 47 | 'auth_code' => \Cortex\Oauth\Models\AuthCode::class, 48 | 'access_token' => \Cortex\Oauth\Models\AccessToken::class, 49 | 'refresh_token' => \Cortex\Oauth\Models\RefreshToken::class, 50 | ], 51 | 52 | /* 53 | |-------------------------------------------------------------------------- 54 | | Personal Access Client 55 | |-------------------------------------------------------------------------- 56 | | 57 | | If you enable client hashing, you should set the personal access client 58 | | ID and unhashed secret within your environment file. The values will 59 | | get used while issuing fresh personal access tokens to your users. 60 | | 61 | */ 62 | 63 | 'personal_access_client' => [ 64 | 'id' => env('OAUTH_PERSONAL_ACCESS_CLIENT_ID'), 65 | 'secret' => env('OAUTH_PERSONAL_ACCESS_CLIENT_SECRET'), 66 | ], 67 | 68 | ]; 69 | -------------------------------------------------------------------------------- /config/rinvex.pages.php: -------------------------------------------------------------------------------- 1 | true, 9 | 10 | // Pageable Database Tables 11 | 'tables' => [ 12 | 'pages' => 'pages', 13 | 'pageables' => 'pageables', 14 | ], 15 | 16 | // Pageable Models 17 | 'models' => [ 18 | 'page' => \Cortex\Pages\Models\PageTenantable::class, 19 | ], 20 | 21 | // Register routes 22 | 'register_routes' => false, 23 | 24 | ]; 25 | -------------------------------------------------------------------------------- /config/rinvex.settings.php: -------------------------------------------------------------------------------- 1 | true, 9 | 10 | // Settings Database Tables 11 | 'tables' => [ 12 | 'settings' => 'settings', 13 | ], 14 | 15 | // Settings Models 16 | 'models' => [ 17 | 'setting' => \Cortex\Settings\Models\SettingTenantable::class, 18 | ], 19 | 20 | // Loadsettings Bootstrap 21 | 'bootstrap' => \Cortex\Settings\Bootstrap\LoadSettings::class, 22 | 23 | // Types 24 | 'types' => [ 25 | 'text' => 'text', 26 | 'radio' => 'radio', 27 | 'checkbox' => 'checkbox', 28 | 'dropdown' => 'dropdown', 29 | 'multi-select' => 'multi-select', 30 | 'boolean' => 'boolean', 31 | 'email' => 'email', 32 | 'phone' => 'phone', 33 | 'password' => 'password', 34 | 'date-picker' => 'date-picker', 35 | 'color-picker' => 'color-picker', 36 | 'icon-picker' => 'icon-picker', 37 | 'style-picker' => 'style-picker', 38 | 'resource' => 'resource', 39 | ], 40 | 41 | ]; 42 | -------------------------------------------------------------------------------- /config/rinvex.tags.php: -------------------------------------------------------------------------------- 1 | true, 9 | 10 | // Tags Database Tables 11 | 'tables' => [ 12 | 13 | 'tags' => 'tags', 14 | 'taggables' => 'taggables', 15 | 16 | ], 17 | 18 | // Tags Models 19 | 'models' => [ 20 | 'tag' => \Cortex\Tags\Models\Tag::class, 21 | ], 22 | 23 | ]; 24 | -------------------------------------------------------------------------------- /config/rinvex.tenants.php: -------------------------------------------------------------------------------- 1 | true, 9 | 10 | // Tenants Database Tables 11 | 'tables' => [ 12 | 13 | 'tenants' => 'tenants', 14 | 'tenantables' => 'tenantables', 15 | 16 | ], 17 | 18 | // Tenants Models 19 | 'models' => [ 20 | 'tenant' => \Cortex\Tenants\Models\Tenant::class, 21 | ], 22 | 23 | /* 24 | |-------------------------------------------------------------------------- 25 | | Tenant Resolver Class 26 | |-------------------------------------------------------------------------- 27 | | 28 | | This package resolve currently active tenant using Resolver Classes. 29 | | It comes with few default resolvers that you can use, or you can 30 | | build your own custom resolver to support additional functions. 31 | | 32 | | Default Resolvers: 33 | | - \Rinvex\Tenants\Http\Resolvers\DomainTenantResolver::class 34 | | - \Rinvex\Tenants\Http\Resolvers\SubdomainTenantResolver::class 35 | | - \Rinvex\Tenants\Http\Resolvers\SubdomainOrDomainTenantResolver::class 36 | | 37 | */ 38 | 39 | 'resolver' => \Rinvex\Tenants\Resolvers\SubdomainOrDomainTenantResolver::class, 40 | 41 | ]; 42 | -------------------------------------------------------------------------------- /config/sanctum.php: -------------------------------------------------------------------------------- 1 | explode(',', env('SANCTUM_STATEFUL_DOMAINS', sprintf( 19 | '%s%s', 20 | 'localhost,localhost:3000,127.0.0.1,127.0.0.1:8000,::1', 21 | env('APP_URL') ? ','.parse_url(env('APP_URL'), PHP_URL_HOST) : '' 22 | ))), 23 | 24 | /* 25 | |-------------------------------------------------------------------------- 26 | | Sanctum Guards 27 | |-------------------------------------------------------------------------- 28 | | 29 | | This array contains the authentication guards that will be checked when 30 | | Sanctum is trying to authenticate a request. If none of these guards 31 | | are able to authenticate the request, Sanctum will use the bearer 32 | | token that's present on an incoming request for authentication. 33 | | 34 | */ 35 | 36 | 'guard' => ['web'], 37 | 38 | /* 39 | |-------------------------------------------------------------------------- 40 | | Expiration Minutes 41 | |-------------------------------------------------------------------------- 42 | | 43 | | This value controls the number of minutes until an issued token will be 44 | | considered expired. If this value is null, personal access tokens do 45 | | not expire. This won't tweak the lifetime of first-party sessions. 46 | | 47 | */ 48 | 49 | 'expiration' => null, 50 | 51 | /* 52 | |-------------------------------------------------------------------------- 53 | | Sanctum Middleware 54 | |-------------------------------------------------------------------------- 55 | | 56 | | When authenticating your first-party SPA with Sanctum you may need to 57 | | customize some of the middleware Sanctum uses while processing the 58 | | request. You may change the middleware listed below as required. 59 | | 60 | */ 61 | 62 | 'middleware' => [ 63 | 'verify_csrf_token' => App\Http\Middleware\VerifyCsrfToken::class, 64 | 'encrypt_cookies' => App\Http\Middleware\EncryptCookies::class, 65 | ], 66 | 67 | ]; 68 | -------------------------------------------------------------------------------- /config/self-diagnosis.php: -------------------------------------------------------------------------------- 1 | [ 11 | 'prod' => 'production', 12 | 'live' => 'production', 13 | 'local' => 'development', 14 | ], 15 | 16 | /* 17 | * Common checks that will be performed on all environments. 18 | */ 19 | 'checks' => [ 20 | \BeyondCode\SelfDiagnosis\Checks\AppKeyIsSet::class, 21 | \BeyondCode\SelfDiagnosis\Checks\CorrectPhpVersionIsInstalled::class, 22 | \BeyondCode\SelfDiagnosis\Checks\DatabaseCanBeAccessed::class => [ 23 | 'default_connection' => true, 24 | 'connections' => [], 25 | ], 26 | \BeyondCode\SelfDiagnosis\Checks\DirectoriesHaveCorrectPermissions::class => [ 27 | 'directories' => [ 28 | storage_path(), 29 | base_path('bootstrap/cache'), 30 | ], 31 | ], 32 | \BeyondCode\SelfDiagnosis\Checks\EnvFileExists::class, 33 | \BeyondCode\SelfDiagnosis\Checks\ExampleEnvironmentVariablesAreSet::class, 34 | //\BeyondCode\SelfDiagnosis\Checks\LocalesAreInstalled::class => [ 35 | // 'required_locales' => [ 36 | // 'en_US', 37 | // PHP_OS === 'Darwin' ? 'en_US.UTF-8' : 'en_US.utf8', 38 | // ], 39 | //], 40 | \BeyondCode\SelfDiagnosis\Checks\MaintenanceModeNotEnabled::class, 41 | //\BeyondCode\SelfDiagnosis\Checks\MigrationsAreUpToDate::class, 42 | \BeyondCode\SelfDiagnosis\Checks\PhpExtensionsAreInstalled::class => [ 43 | 'extensions' => [ 44 | 'openssl', 45 | 'PDO', 46 | 'mbstring', 47 | 'tokenizer', 48 | 'xml', 49 | 'ctype', 50 | 'json', 51 | ], 52 | 'include_composer_extensions' => true, 53 | ], 54 | //\BeyondCode\SelfDiagnosis\Checks\RedisCanBeAccessed::class => [ 55 | // 'default_connection' => true, 56 | // 'connections' => [], 57 | //], 58 | \BeyondCode\SelfDiagnosis\Checks\StorageDirectoryIsLinked::class, 59 | ], 60 | 61 | /* 62 | * Environment specific checks that will only be performed for the corresponding environment. 63 | */ 64 | 'environment_checks' => [ 65 | 'development' => [ 66 | //\BeyondCode\SelfDiagnosis\Checks\ComposerWithDevDependenciesIsUpToDate::class, 67 | \BeyondCode\SelfDiagnosis\Checks\ConfigurationIsNotCached::class, 68 | \BeyondCode\SelfDiagnosis\Checks\RoutesAreNotCached::class, 69 | \BeyondCode\SelfDiagnosis\Checks\ExampleEnvironmentVariablesAreUpToDate::class, 70 | ], 71 | 'production' => [ 72 | //\BeyondCode\SelfDiagnosis\Checks\ComposerWithoutDevDependenciesIsUpToDate::class, 73 | \BeyondCode\SelfDiagnosis\Checks\ConfigurationIsCached::class, 74 | \BeyondCode\SelfDiagnosis\Checks\DebugModeIsNotEnabled::class, 75 | \BeyondCode\SelfDiagnosis\Checks\PhpExtensionsAreDisabled::class => [ 76 | 'extensions' => [ 77 | 'xdebug', 78 | ], 79 | ], 80 | \BeyondCode\SelfDiagnosis\Checks\RoutesAreCached::class, 81 | //\BeyondCode\SelfDiagnosis\Checks\ServersArePingable::class => [ 82 | // 'servers' => [ 83 | // 'www.google.com', 84 | // ['host' => 'www.google.com', 'port' => 8080], 85 | // '8.8.8.8', 86 | // ['host' => '8.8.8.8', 'port' => 8080, 'timeout' => 5], 87 | // ], 88 | //], 89 | //\BeyondCode\SelfDiagnosis\Checks\SupervisorProgramsAreRunning::class => [ 90 | // 'programs' => [ 91 | // 'horizon', 92 | // ], 93 | // 'restarted_within' => 300, 94 | //], 95 | //\BeyondCode\SelfDiagnosis\Checks\HorizonIsRunning::class, 96 | ], 97 | ], 98 | 99 | ]; 100 | -------------------------------------------------------------------------------- /config/services.php: -------------------------------------------------------------------------------- 1 | [ 20 | 'domain' => env('MAILGUN_DOMAIN'), 21 | 'secret' => env('MAILGUN_SECRET'), 22 | 'endpoint' => env('MAILGUN_ENDPOINT', 'api.mailgun.net'), 23 | ], 24 | 25 | 'postmark' => [ 26 | 'token' => env('POSTMARK_TOKEN'), 27 | ], 28 | 29 | 'ses' => [ 30 | 'key' => env('AWS_SES_KEY'), 31 | 'secret' => env('AWS_SES_SECRET'), 32 | 'region' => env('AWS_SES_REGION'), 33 | ], 34 | 35 | 'sparkpost' => [ 36 | 'secret' => env('SPARKPOST_SECRET'), 37 | ], 38 | 39 | 'authy' => [ 40 | 'secret' => env('AUTHY_SECRET'), 41 | ], 42 | 43 | 'twitter' => [ 44 | 'client_id' => env('TWITTER_CLIENT_ID'), 45 | 'client_secret' => env('TWITTER_CLIENT_SECRET'), 46 | 'redirect' => env('TWITTER_CALLBACK_URL'), 47 | ], 48 | 49 | 'facebook' => [ 50 | 'client_id' => env('FACEBOOK_CLIENT_ID'), 51 | 'client_secret' => env('FACEBOOK_CLIENT_SECRET'), 52 | 'redirect' => env('FACEBOOK_CALLBACK_URL'), 53 | ], 54 | 55 | 'linkedin' => [ 56 | 'client_id' => env('LinkedIn_CLIENT_ID'), 57 | 'client_secret' => env('LinkedIn_CLIENT_SECRET'), 58 | 'redirect' => env('LinkedIn_CALLBACK_URL'), 59 | ], 60 | 61 | 'google' => [ 62 | 'client_id' => env('GOOGLE_CLIENT_ID'), 63 | 'client_secret' => env('GOOGLE_CLIENT_SECRET'), 64 | 'redirect' => env('GOOGLE_CALLBACK_URL'), 65 | ], 66 | 67 | 'github' => [ 68 | 'client_id' => env('GITHUB_CLIENT_ID'), 69 | 'client_secret' => env('GITHUB_CLIENT_SECRET'), 70 | 'redirect' => env('GITHUB_CALLBACK_URL'), 71 | ], 72 | 73 | 'bitbucket' => [ 74 | 'client_id' => env('BITBUCKET_CLIENT_ID'), 75 | 'client_secret' => env('BITBUCKET_CLIENT_SECRET'), 76 | 'redirect' => env('BITBUCKET_CALLBACK_URL'), 77 | ], 78 | 79 | ]; 80 | -------------------------------------------------------------------------------- /config/session.php: -------------------------------------------------------------------------------- 1 | env('SESSION_DRIVER', 'database'), 24 | 25 | /* 26 | |-------------------------------------------------------------------------- 27 | | Session Lifetime 28 | |-------------------------------------------------------------------------- 29 | | 30 | | Here you may specify the number of minutes that you wish the session 31 | | to be allowed to remain idle before it expires. If you want them 32 | | to immediately expire on the browser closing, set that option. 33 | | 34 | */ 35 | 36 | 'lifetime' => env('SESSION_LIFETIME', 120), 37 | 38 | 'expire_on_close' => false, 39 | 40 | /* 41 | |-------------------------------------------------------------------------- 42 | | Session Encryption 43 | |-------------------------------------------------------------------------- 44 | | 45 | | This option allows you to easily specify that all of your session data 46 | | should be encrypted before it is stored. All encryption will be run 47 | | automatically by Laravel and you can use the Session like normal. 48 | | 49 | */ 50 | 51 | 'encrypt' => true, 52 | 53 | /* 54 | |-------------------------------------------------------------------------- 55 | | Session File Location 56 | |-------------------------------------------------------------------------- 57 | | 58 | | When using the native session driver, we need a location where session 59 | | files may be stored. A default has been set for you but a different 60 | | location may be specified. This is only needed for file sessions. 61 | | 62 | */ 63 | 64 | 'files' => storage_path('framework/sessions'), 65 | 66 | /* 67 | |-------------------------------------------------------------------------- 68 | | Session Database Connection 69 | |-------------------------------------------------------------------------- 70 | | 71 | | When using the "database" or "redis" session drivers, you may specify a 72 | | connection that should be used to manage these sessions. This should 73 | | correspond to a connection in your database configuration options. 74 | | 75 | */ 76 | 77 | 'connection' => env('SESSION_CONNECTION'), 78 | 79 | /* 80 | |-------------------------------------------------------------------------- 81 | | Session Database Table 82 | |-------------------------------------------------------------------------- 83 | | 84 | | When using the "database" session driver, you may specify the table we 85 | | should use to manage the sessions. Of course, a sensible default is 86 | | provided for you; however, you are free to change this as needed. 87 | | 88 | */ 89 | 90 | 'table' => 'sessions', 91 | 92 | /* 93 | |-------------------------------------------------------------------------- 94 | | Session Cache Store 95 | |-------------------------------------------------------------------------- 96 | | 97 | | While using one of the framework's cache driven session backends you may 98 | | list a cache store that should be used for these sessions. This value 99 | | must match with one of the application's configured cache "stores". 100 | | 101 | | Affects: "apc", "dynamodb", "memcached", "redis" 102 | | 103 | */ 104 | 105 | 'store' => env('SESSION_STORE'), 106 | 107 | /* 108 | |-------------------------------------------------------------------------- 109 | | Session Sweeping Lottery 110 | |-------------------------------------------------------------------------- 111 | | 112 | | Some session drivers must manually sweep their storage location to get 113 | | rid of old sessions from storage. Here are the chances that it will 114 | | happen on a given request. By default, the odds are 2 out of 100. 115 | | 116 | */ 117 | 118 | 'lottery' => [2, 100], 119 | 120 | /* 121 | |-------------------------------------------------------------------------- 122 | | Session Cookie Name 123 | |-------------------------------------------------------------------------- 124 | | 125 | | Here you may change the name of the cookie used to identify a session 126 | | instance by ID. The name specified here will get used every time a 127 | | new session cookie is created by the framework for every driver. 128 | | 129 | */ 130 | 131 | 'cookie' => env( 132 | 'SESSION_COOKIE', 133 | Str::slug(env('APP_NAME', 'laravel'), '_').'_session' 134 | ), 135 | 136 | /* 137 | |-------------------------------------------------------------------------- 138 | | Session Cookie Path 139 | |-------------------------------------------------------------------------- 140 | | 141 | | The session cookie path determines the path for which the cookie will 142 | | be regarded as available. Typically, this will be the root path of 143 | | your application but you are free to change this when necessary. 144 | | 145 | */ 146 | 147 | 'path' => '/', 148 | 149 | /* 150 | |-------------------------------------------------------------------------- 151 | | Session Cookie Domain 152 | |-------------------------------------------------------------------------- 153 | | 154 | | Here you may change the domain of the cookie used to identify a session 155 | | in your application. This will determine which domains the cookie is 156 | | available to in your application. A sensible default has been set. 157 | | 158 | */ 159 | 160 | 'domain' => env('SESSION_DOMAIN'), 161 | 162 | /* 163 | |-------------------------------------------------------------------------- 164 | | HTTPS Only Cookies 165 | |-------------------------------------------------------------------------- 166 | | 167 | | By setting this option to true, session cookies will only be sent back 168 | | to the server if the browser has a HTTPS connection. This will keep 169 | | the cookie from being sent to you when it can't be done securely. 170 | | 171 | */ 172 | 173 | 'secure' => env('SESSION_SECURE_COOKIE'), 174 | 175 | /* 176 | |-------------------------------------------------------------------------- 177 | | HTTP Access Only 178 | |-------------------------------------------------------------------------- 179 | | 180 | | Setting this value to true will prevent JavaScript from accessing the 181 | | value of the cookie and the cookie will only be accessible through 182 | | the HTTP protocol. You are free to modify this option if needed. 183 | | 184 | */ 185 | 186 | 'http_only' => true, 187 | 188 | /* 189 | |-------------------------------------------------------------------------- 190 | | Same-Site Cookies 191 | |-------------------------------------------------------------------------- 192 | | 193 | | This option determines how your cookies behave when cross-site requests 194 | | take place, and can be used to mitigate CSRF attacks. By default, we 195 | | will set this value to "lax" since this is a secure default value. 196 | | 197 | | Supported: "lax", "strict", "none", null 198 | | 199 | */ 200 | 201 | 'same_site' => 'lax', 202 | 203 | ]; 204 | -------------------------------------------------------------------------------- /config/sitemap.php: -------------------------------------------------------------------------------- 1 | [ 17 | 18 | /* 19 | * Whether or not cookies are used in a request. 20 | */ 21 | RequestOptions::COOKIES => true, 22 | 23 | /* 24 | * The number of seconds to wait while trying to connect to a server. 25 | * Use 0 to wait indefinitely. 26 | */ 27 | RequestOptions::CONNECT_TIMEOUT => 10, 28 | 29 | /* 30 | * The timeout of the request in seconds. Use 0 to wait indefinitely. 31 | */ 32 | RequestOptions::TIMEOUT => 10, 33 | 34 | /* 35 | * Describes the redirect behavior of a request. 36 | */ 37 | RequestOptions::ALLOW_REDIRECTS => false, 38 | ], 39 | 40 | /* 41 | * The sitemap generator can execute JavaScript on each page so it will 42 | * discover links that are generated by your JS scripts. This feature 43 | * is powered by headless Chrome. 44 | */ 45 | 'execute_javascript' => false, 46 | 47 | /* 48 | * The package will make an educated guess as to where Google Chrome is installed. 49 | * You can also manually pass it's location here. 50 | */ 51 | 'chrome_binary_path' => null, 52 | 53 | /* 54 | * The sitemap generator uses a CrawlProfile implementation to determine 55 | * which urls should be crawled for the sitemap. 56 | */ 57 | 'crawl_profile' => Profile::class, 58 | 59 | ]; 60 | -------------------------------------------------------------------------------- /config/snappy.php: -------------------------------------------------------------------------------- 1 | [ 39 | 'enabled' => true, 40 | 'binary' => env('WKHTML_PDF_BINARY', '/usr/local/bin/wkhtmltopdf'), 41 | 'timeout' => false, 42 | 'options' => [], 43 | 'env' => [], 44 | ], 45 | 46 | 'image' => [ 47 | 'enabled' => true, 48 | 'binary' => env('WKHTML_IMG_BINARY', '/usr/local/bin/wkhtmltoimage'), 49 | 'timeout' => false, 50 | 'options' => [], 51 | 'env' => [], 52 | ], 53 | 54 | ]; 55 | -------------------------------------------------------------------------------- /config/stats.php: -------------------------------------------------------------------------------- 1 | [ 11 | base_path('app'), 12 | base_path('database'), 13 | base_path('tests'), 14 | ], 15 | 16 | /* 17 | * List of files/folders to be excluded from analysis. 18 | */ 19 | 'exclude' => [ 20 | // base_path('app/helpers.php'), 21 | // base_path('app/Services'), 22 | ], 23 | 24 | /* 25 | * List of your custom Classifiers 26 | */ 27 | 'custom_component_classifier' => [ 28 | // \App\Classifiers\CustomerExportClassifier::class 29 | ], 30 | 31 | /* 32 | * The Strategy used to reject Classes from the project statistics. 33 | * 34 | * By default all Classes located in 35 | * the vendor directory are being rejected and don't 36 | * count to the statistics. 37 | * 38 | * The package ships with 2 strategies: 39 | * - \Wnx\LaravelStats\RejectionStrategies\RejectVendorClasses::class 40 | * - \Wnx\LaravelStats\RejectionStrategies\RejectInternalClasses::class 41 | * 42 | * If none of the default strategies fit for your usecase, you can 43 | * write your own class which implements the RejectionStrategy Contract. 44 | */ 45 | 'rejection_strategy' => \Wnx\LaravelStats\RejectionStrategies\RejectVendorClasses::class, 46 | 47 | /* 48 | * Namespaces which should be ignored. 49 | * Laravel Stats uses the `Str::startsWith()` helper to 50 | * check if a Namespace should be ignored. 51 | * 52 | * You can use `Illuminate` to ignore the entire `Illuminate`-namespace 53 | * or `Illuminate\Support` to ignore a subset of the namespace. 54 | */ 55 | 'ignored_namespaces' => [ 56 | 'Wnx\LaravelStats', 57 | 'Illuminate', 58 | 'Symfony', 59 | ], 60 | 61 | ]; 62 | -------------------------------------------------------------------------------- /config/tinker.php: -------------------------------------------------------------------------------- 1 | [ 19 | // App\Console\Commands\ExampleCommand::class, 20 | ], 21 | 22 | /* 23 | |-------------------------------------------------------------------------- 24 | | Auto Aliased Classes 25 | |-------------------------------------------------------------------------- 26 | | 27 | | Tinker will not automatically alias classes in your vendor namespaces 28 | | but you may explicitly allow a subset of classes to get aliased by 29 | | adding the names of each of those classes to the following list. 30 | | 31 | */ 32 | 33 | 'alias' => [ 34 | // 35 | ], 36 | 37 | /* 38 | |-------------------------------------------------------------------------- 39 | | Classes That Should Not Be Aliased 40 | |-------------------------------------------------------------------------- 41 | | 42 | | Typically, Tinker automatically aliases classes as you require them in 43 | | Tinker. However, you may wish to never alias certain classes, which 44 | | you may accomplish by listing the classes in the following array. 45 | | 46 | */ 47 | 48 | 'dont_alias' => [ 49 | 'App\Nova', 50 | ], 51 | 52 | ]; 53 | -------------------------------------------------------------------------------- /config/translatable.php: -------------------------------------------------------------------------------- 1 | 'en', 11 | 12 | /* 13 | * If a translation has not been set for a given locale and the fallback locale, 14 | * any other locale will be chosen instead. 15 | */ 16 | 'fallback_any' => false, 17 | ]; 18 | -------------------------------------------------------------------------------- /config/validation.php: -------------------------------------------------------------------------------- 1 | [ 10 | 11 | 'password' => config('app.env') === 'production' 12 | ? Password::min(8) 13 | ->letters() 14 | ->mixedCase() 15 | ->numbers() 16 | ->symbols() 17 | ->uncompromised() 18 | : Password::min(8), 19 | 20 | 'username' => [ 21 | 'alpha_dash', 22 | 'max:64', 23 | 'min:3', 24 | ], 25 | 26 | 'email' => [ 27 | config('app.env') === 'production' ? 'email:rfc,dns,spoof' : 'email:rfc', 28 | 'max:128', 29 | 'min:3', 30 | ], 31 | 32 | ], 33 | 34 | ]; 35 | -------------------------------------------------------------------------------- /config/view.php: -------------------------------------------------------------------------------- 1 | [ 19 | resource_path('views'), 20 | ], 21 | 22 | /* 23 | |-------------------------------------------------------------------------- 24 | | Compiled View Path 25 | |-------------------------------------------------------------------------- 26 | | 27 | | This option determines where all the compiled Blade templates will be 28 | | stored for your application. Typically, this is within the storage 29 | | directory. However, as usual, you are free to change this value. 30 | | 31 | */ 32 | 33 | 'compiled' => env( 34 | 'VIEW_COMPILED_PATH', 35 | realpath(storage_path('framework/views')) 36 | ), 37 | 38 | ]; 39 | -------------------------------------------------------------------------------- /database/.gitignore: -------------------------------------------------------------------------------- 1 | *.sqlite 2 | *.sqlite-journal 3 | -------------------------------------------------------------------------------- /database/migrations/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rinvex/cortex-classic/465d243537c41ab525ec224aab0c4138583f7887/database/migrations/.gitkeep -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "private": true, 3 | "scripts": { 4 | "dev": "npm run development", 5 | "development": "mix", 6 | "watch": "mix watch", 7 | "watch-poll": "mix watch -- --watch-options-poll=1000", 8 | "hot": "mix watch --hot", 9 | "prod": "npm run production", 10 | "production": "mix --production" 11 | }, 12 | "devDependencies": { 13 | "@tailwindcss/forms": "^0.5.0", 14 | "admin-lte": "^2.4.0", 15 | "autoprefixer": "^10.4.0", 16 | "axios": "^0.25.0", 17 | "bootstrap-colorpicker": "^2.5.0", 18 | "bootstrap-daterangepicker": "^3.1.0", 19 | "bootstrap-notify": "^3.1.0", 20 | "bootstrap-popover-picker": "^1.1.0", 21 | "bootstrap-sass": "^3.4.0", 22 | "datatables.mark.js": "^2.1.0", 23 | "datatables.net": "^1.11.0", 24 | "datatables.net-bs": "^1.11.0", 25 | "datatables.net-buttons": "^2.2.0", 26 | "datatables.net-buttons-bs": "^2.2.0", 27 | "datatables.net-keytable": "^2.6.0", 28 | "datatables.net-keytable-bs": "^2.6.0", 29 | "datatables.net-responsive": "^2.2.0", 30 | "datatables.net-responsive-bs": "^2.2.0", 31 | "datatables.net-rowgroup": "^1.1.0", 32 | "datatables.net-rowgroup-bs": "^1.1.0", 33 | "datatables.net-select": "^1.3.0", 34 | "datatables.net-select-bs": "^1.3.0", 35 | "datepair.js": "^0.4.0", 36 | "dropzone": "^5.9.0", 37 | "expose-loader": "^3.1.0", 38 | "font-awesome": "^4.7.0", 39 | "fontawesome-iconpicker": "^1.4.0", 40 | "glob": "^7.2.0", 41 | "hashids": "^2.2.0", 42 | "install": "^0.13.0", 43 | "intl-tel-input": "^17.0.0", 44 | "jquery": "^3.6.0", 45 | "jquery-datatables-checkboxes": "^1.2.0", 46 | "jquery-mousewheel": "^3.1.0", 47 | "jquery-slimscroll": "^1.3.0", 48 | "laravel-echo": "^1.11.0", 49 | "laravel-mix": "^6.0.0", 50 | "laravel-mix-purgecss": "^6.0.0", 51 | "mark.js": "^8.11.0", 52 | "moment": "^2.29.0", 53 | "npm": "^8.4.0", 54 | "pluralize": "^8.0.0", 55 | "postcss-nested": "^5.0.0", 56 | "pusher-js": "^7.0.0", 57 | "resolve-url-loader": "^5.0.0", 58 | "sass": "^1.49.0", 59 | "sass-loader": "^12.4.0", 60 | "select2": "^4.0.0", 61 | "tailwindcss": "^3.0.0", 62 | "timepicker": "^1.13.0", 63 | "tinymce": "^5.10.0", 64 | "webpack-shell-plugin-next": "^2.2.0" 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /phpstan.neon.dist: -------------------------------------------------------------------------------- 1 | includes: 2 | - ./vendor/nunomaduro/larastan/extension.neon 3 | parameters: 4 | level: 5 5 | paths: 6 | - src 7 | -------------------------------------------------------------------------------- /public/.gitignore: -------------------------------------------------------------------------------- 1 | /css 2 | /favicon 3 | /fonts 4 | /images 5 | /js 6 | /tinymce 7 | mix-manifest.json 8 | -------------------------------------------------------------------------------- /public/.htaccess: -------------------------------------------------------------------------------- 1 | 2 | 3 | Options -MultiViews -Indexes 4 | 5 | 6 | RewriteEngine On 7 | 8 | # Handle Authorization Header 9 | RewriteCond %{HTTP:Authorization} . 10 | RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] 11 | 12 | # Redirect Trailing Slashes If Not A Folder... 13 | RewriteCond %{REQUEST_FILENAME} !-d 14 | RewriteCond %{REQUEST_URI} (.+)/$ 15 | RewriteRule ^ %1 [L,R=301] 16 | 17 | # Handle Front Controller... 18 | RewriteCond %{REQUEST_FILENAME} !-d 19 | RewriteCond %{REQUEST_FILENAME} !-f 20 | RewriteRule ^ index.php [L] 21 | 22 | -------------------------------------------------------------------------------- /public/.user.ini: -------------------------------------------------------------------------------- 1 | # Stream php output 2 | output_buffering = off 3 | zlib.output_compression = off 4 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rinvex/cortex-classic/465d243537c41ab525ec224aab0c4138583f7887/public/favicon.ico -------------------------------------------------------------------------------- /public/index.php: -------------------------------------------------------------------------------- 1 | make(Kernel::class); 52 | 53 | $response = tap($kernel->handle( 54 | $request = Request::capture() 55 | ))->send(); 56 | 57 | $kernel->terminate($request, $response); 58 | -------------------------------------------------------------------------------- /public/manifest.json: -------------------------------------------------------------------------------- 1 | {"name":"Cortex","icons":[{"src":"/favicon/android-icon-36x36.png","sizes":"36x36","type":"image/png","density":"0.75"},{"src":"/favicon/android-icon-48x48.png","sizes":"48x48","type":"image/png","density":"1.0"},{"src":"/favicon/android-icon-72x72.png","sizes":"72x72","type":"image/png","density":"1.5"},{"src":"/favicon/android-icon-96x96.png","sizes":"96x96","type":"image/png","density":"2.0"},{"src":"/favicon/android-icon-144x144.png","sizes":"144x144","type":"image/png","density":"3.0"},{"src":"/favicon/android-icon-192x192.png","sizes":"192x192","type":"image/png","density":"4.0"}]} 2 | -------------------------------------------------------------------------------- /public/robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | Disallow: 3 | -------------------------------------------------------------------------------- /public/web.config: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /resources/images/details_close.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rinvex/cortex-classic/465d243537c41ab525ec224aab0c4138583f7887/resources/images/details_close.png -------------------------------------------------------------------------------- /resources/images/details_open.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rinvex/cortex-classic/465d243537c41ab525ec224aab0c4138583f7887/resources/images/details_open.png -------------------------------------------------------------------------------- /resources/images/loading_bar.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rinvex/cortex-classic/465d243537c41ab525ec224aab0c4138583f7887/resources/images/loading_bar.gif -------------------------------------------------------------------------------- /resources/js/vendor/datatables-buttons.js: -------------------------------------------------------------------------------- 1 | (function (factory) { 2 | if (typeof define === 'function' && define.amd) { 3 | // AMD 4 | define(['jquery', 'datatables.net'], function ($) { 5 | return factory($, window, document); 6 | }); 7 | } else if (typeof exports === 'object') { 8 | // CommonJS 9 | module.exports = function (root, $) { 10 | if (! root) { 11 | root = window; 12 | } 13 | 14 | if (! $ || ! $.fn.dataTable) { 15 | $ = require('datatables.net')(root, $).$; 16 | } 17 | 18 | return factory($, root, root.document); 19 | }; 20 | } else { 21 | // Browser 22 | factory(jQuery, window, document); 23 | } 24 | }(function ($, window, document, undefined) { 25 | 'use strict'; 26 | let DataTable = $.fn.dataTable; 27 | 28 | let exportAction = function (e, dt, button, config, action) { 29 | let visibleColumns = getVisibleColumns(); 30 | let dataTableBuilder = $('.dataTableBuilder'); 31 | let selectedIds = dataTableBuilder.DataTable().column(0).checkboxes.selected(); 32 | 33 | let $form = $('
'); 34 | $form.attr('action', window.location + '?' + $.param(dt.ajax.params())); 35 | $form.attr('method', 'post'); 36 | $form.append(''); 37 | $form.append(''); 38 | 39 | if (visibleColumns.length) { 40 | visibleColumns.join(',').split(',').forEach((visibleColumn) => $form.append('')); 41 | } 42 | 43 | if (selectedIds.length) { 44 | selectedIds.join(',').split(',').forEach((selectedId) => $form.append('')); 45 | } 46 | 47 | dataTableBuilder.append($form); 48 | $form.submit(); 49 | }; 50 | 51 | let getVisibleColumns = function () { 52 | let visible_columns = []; 53 | 54 | $.each(DataTable.settings[0].aoColumns, function (key, col) { 55 | if (col.bVisible) { 56 | visible_columns.push(col.name); 57 | } 58 | }); 59 | 60 | return visible_columns; 61 | }; 62 | 63 | // @TODO: add support for additional parameter. Example: change status to xyz 64 | let bulkAction = function (e, dt, button, config, action) { 65 | if (confirm('Are you sure you want to ' + action + ' all selected records?')) { 66 | let selectedIds = $('.dataTableBuilder').DataTable().column(0).checkboxes.selected(); 67 | 68 | if (selectedIds.length > 0) { 69 | axios.post(window.location.href, { 70 | action: action, 71 | selected_ids: selectedIds.join(',').split(',') 72 | }) 73 | .then(function (response) { 74 | let notification = function () {$.notify({message: response.data}, {type: 'success', mouse_over: 'pause', z_index: 9999, animate: {enter: 'animated fadeIn', exit: 'animated fadeOut'}});}; if (typeof notification === 'function') {notification(); notification = null;} 75 | dt.search('').draw(); 76 | dt.column(0).checkboxes.deselectAll(); 77 | }); 78 | } else { 79 | alert('No Selected Records!'); 80 | } 81 | } 82 | }; 83 | 84 | DataTable.ext.buttons.export = { 85 | extend: 'collection', 86 | className: 'buttons-export', 87 | buttons: ['csv', 'excel', 'pdf'], 88 | text: (dt) => ' ' + dt.i18n('buttons.export', 'Export') + ' ', 89 | }; 90 | 91 | DataTable.ext.buttons.excel = { 92 | className: 'buttons-excel', 93 | action: (e, dt, button, config) => exportAction(e, dt, button, config, 'excel'), 94 | text: (dt) => ' ' + dt.i18n('buttons.excel', 'Excel'), 95 | }; 96 | 97 | DataTable.ext.buttons.csv = { 98 | className: 'buttons-csv', 99 | action: (e, dt, button, config) => exportAction(e, dt, button, config, 'csv'), 100 | text: (dt) => ' ' + dt.i18n('buttons.csv', 'CSV'), 101 | }; 102 | 103 | DataTable.ext.buttons.pdf = { 104 | className: 'buttons-pdf', 105 | action: (e, dt, button, config) => exportAction(e, dt, button, config, 'pdf'), 106 | text: (dt) => ' ' + dt.i18n('buttons.pdf', 'PDF'), 107 | }; 108 | 109 | DataTable.ext.buttons.print = { 110 | className: 'buttons-print', 111 | action: (e, dt, button, config) => exportAction(e, dt, button, config, 'print'), 112 | text: (dt) => ' ' + dt.i18n('buttons.print', 'Print'), 113 | }; 114 | 115 | DataTable.ext.buttons.reset = { 116 | className: 'buttons-reset', 117 | text: (dt) => ' ' + dt.i18n('buttons.reset', 'Reset'), 118 | action: (e, dt, button, config) => { 119 | dt.column(0).checkboxes.deselectAll(); 120 | delete window.showSelected; 121 | dt.search('').draw(); 122 | } 123 | }; 124 | 125 | DataTable.ext.buttons.reload = { 126 | className: 'buttons-reload', 127 | text: (dt) => ' ' + dt.i18n('buttons.reload', 'Reload'), 128 | action: (e, dt, button, config) => dt.draw(false), 129 | }; 130 | 131 | DataTable.ext.buttons.create = { 132 | className: 'buttons-create', 133 | text: (dt) => ' ' + dt.i18n('buttons.create', 'Create'), 134 | action: (e, dt, button, config) => window.location = routes.route(window.Cortex.routePrefix + '.create'), 135 | }; 136 | 137 | DataTable.ext.buttons.import = { 138 | className: 'buttons-import', 139 | text: (dt) => ' ' + dt.i18n('buttons.import', 'Import'), 140 | action: (e, dt, button, config) => window.location = routes.route(window.Cortex.routePrefix + '.import'), 141 | }; 142 | 143 | DataTable.ext.buttons.showSelected = { 144 | className: 'buttons-selected', 145 | text: (dt) => ' ' + dt.i18n('buttons.showSelected', 'Show Selected'), 146 | action: (e, dt, button, config) => { 147 | window.showSelected = true; 148 | dt.draw(); 149 | }, 150 | }; 151 | 152 | // @TODO: allow dynamic bulk actions, possibly use wildcard or filter button by name starting with bulk 153 | DataTable.ext.buttons.bulk = { 154 | extend: 'collection', 155 | className: 'buttons-bulk', 156 | text: (dt) => ' ' + dt.i18n('buttons.bulk', 'Bulk') + ' ', 157 | }; 158 | 159 | DataTable.ext.buttons.delete = { 160 | className: 'buttons-bulk-delete', 161 | action: (e, dt, button, config) => bulkAction(e, dt, button, config, 'delete'), 162 | text: (dt) => ' ' + dt.i18n('buttons.bulkDelete', 'Delete'), 163 | }; 164 | 165 | DataTable.ext.buttons.activate = { 166 | className: 'buttons-bulk-activate', 167 | action: (e, dt, button, config) => bulkAction(e, dt, button, config, 'activate'), 168 | text: (dt) => ' ' + dt.i18n('buttons.bulkActivate', 'Activate'), 169 | }; 170 | 171 | DataTable.ext.buttons.deactivate = { 172 | className: 'buttons-bulk-deactivate', 173 | action: (e, dt, button, config) => bulkAction(e, dt, button, config, 'deactivate'), 174 | text: (dt) => ' ' + dt.i18n('buttons.bulkDeactivate', 'Deactivate'), 175 | }; 176 | 177 | DataTable.ext.buttons.revoke = { 178 | className: 'buttons-bulk-revoke', 179 | action: (e, dt, button, config) => bulkAction(e, dt, button, config, 'revoke'), 180 | text: (dt) => ' ' + dt.i18n('buttons.bulkRevoke', 'Revoke'), 181 | }; 182 | 183 | DataTable.ext.buttons.create_popup = { 184 | className: 'buttons-create-popup', 185 | text: (dt) => ' ' + dt.i18n('buttons.create', 'Create'), 186 | }; 187 | 188 | })); 189 | -------------------------------------------------------------------------------- /resources/js/vendor/datatables.js: -------------------------------------------------------------------------------- 1 | // Datatables 2 | import 'datatables.net'; 3 | import 'datatables.net-bs'; 4 | import 'datatables.mark.js'; 5 | import 'datatables.net-select'; 6 | import 'datatables.net-buttons'; 7 | import 'datatables.net-rowgroup'; 8 | import 'datatables.net-keytable'; 9 | import 'datatables.net-responsive'; 10 | import 'datatables.net-buttons-bs'; 11 | import 'datatables.net-responsive-bs'; 12 | import 'datatables.net-buttons/js/buttons.html5'; 13 | import 'datatables.net-buttons/js/buttons.colVis.min'; 14 | import 'jquery-datatables-checkboxes'; 15 | import './datatables-buttons'; 16 | 17 | (function () { 18 | // Format Log DataTable details 19 | window.dtFormatLogDetails = function (data) { 20 | // if ($.isEmptyObject(data.attributes)) { 21 | // return 'Saved without any changes!'; 22 | // } 23 | 24 | let headerDrwan = false; 25 | let $thead = $(''); 26 | let $tbody = $(''); 27 | let $table = $(''); 28 | 29 | $.each(data, function (i, item) { 30 | let $tr = $(''); 31 | let $trH = $(''); 32 | 33 | if (! headerDrwan) { 34 | // Empty cell 35 | $trH.append(''); 40 | }); 41 | 42 | // Append table header 43 | $trH.appendTo($thead); 44 | $thead.appendTo($table); 45 | headerDrwan = true; 46 | } 47 | 48 | // Append table row 49 | $tr.appendTo($tbody); 50 | $tbody.appendTo($table); 51 | $tr.append(''); 52 | 53 | $.each(item, function (i2, item2) { 54 | // Check if cell value is object 55 | if (item2 && typeof item2 === 'object') { 56 | let cellValue = ''; 57 | 58 | // Loop through cell value object and append as string 59 | $.each(item2, function (i3, item3) { 60 | cellValue += i3 + ': ' + item3 + ' '; 61 | }); 62 | 63 | // Append cell value to table row 64 | $tr.append(''); 65 | } else { 66 | // Append cell value to table row 67 | $tr.append(''); 68 | } 69 | }); 70 | }); 71 | 72 | // Return table HTML string 73 | return $table; 74 | }; 75 | 76 | // Datatable Checkbox 77 | window.showSelected = false; 78 | 79 | let dataTableBuilder = $('.dataTableBuilder'); 80 | 81 | dataTableBuilder.on('draw.dt', function () { 82 | $.ajaxPrefilter(function (options, originalOptions, jqXHR) { 83 | if (window.showSelected) { 84 | let selectedIds = dataTableBuilder.DataTable().column(0).checkboxes.selected().join(',').split(','); 85 | selectedIds.filter(item => item).forEach(item => options.data += '&selected_ids[]=' + item); 86 | } 87 | }); 88 | }); 89 | })(); 90 | -------------------------------------------------------------------------------- /resources/js/vendor/formbuilder.js: -------------------------------------------------------------------------------- 1 | import 'jquery-ui-sortable'; 2 | import 'formBuilder/dist/form-builder.min'; 3 | import 'formBuilder/dist/form-render.min'; 4 | -------------------------------------------------------------------------------- /resources/js/vendor/fullcalendar.js: -------------------------------------------------------------------------------- 1 | import 'fullcalendar'; 2 | import './fullcalendar-cortal'; 3 | -------------------------------------------------------------------------------- /resources/js/vendor/jquery-implicitforms.js: -------------------------------------------------------------------------------- 1 | (function () { 2 | 3 | let implicitForms = (function () { 4 | 5 | return { 6 | initialize: function () { 7 | this.methodLinks = $('a[data-form]'); 8 | this.registerEvents(); 9 | }, 10 | 11 | registerEvents: function () { 12 | this.methodLinks.on('click', this.handleMethod); 13 | }, 14 | 15 | handleMethod: function (e) { 16 | let link = $(this); 17 | let httpMethod = link.data('form').toUpperCase(); 18 | 19 | // Ignore if the data-form attribute is not PUT, POST, or DELETE, 20 | if ($.inArray(httpMethod, ['PUT', 'DELETE', 'POST']) === - 1) { 21 | return; 22 | } 23 | 24 | // Allow user to optionally provide data-confirm="Are you sure?" 25 | if (link.data('confirm')) { 26 | if (! implicitForms.verifyConfirm(link)) { 27 | return false; 28 | } 29 | } 30 | 31 | let form = implicitForms.createForm(link); 32 | form.submit(); 33 | e.preventDefault(); 34 | }, 35 | 36 | verifyConfirm: function (link) { 37 | return confirm(link.data('confirm')); 38 | }, 39 | 40 | createForm: function (link) { 41 | let form = $('', {'method': 'POST', 'action': link.attr('href')}); 42 | let _token = $('', {'type': 'hidden', 'name': '_token', 'value': link.data('token')}); 43 | let _method = $('', {'name': '_method', 'type': 'hidden', 'value': link.data('form')}); 44 | 45 | return form.append(_token, _method) 46 | .appendTo('body'); 47 | } 48 | }; 49 | }).call(this); 50 | 51 | /** 52 | * Expose the class either via AMD, CommonJS or the global object 53 | */ 54 | if (typeof define === 'function' && define.amd) { 55 | define(function () { 56 | return implicitForms; 57 | }); 58 | } else if (typeof module === 'object' && module.exports) { 59 | module.exports = implicitForms; 60 | } else { 61 | window.implicitForms = implicitForms; 62 | } 63 | 64 | }).call(this); 65 | -------------------------------------------------------------------------------- /resources/js/vendor/jquery-intl-tel-input.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Exposing intl-tel-input as a component 3 | */ 4 | module.exports = require('intl-tel-input/build/js/intlTelInput-jquery'); 5 | -------------------------------------------------------------------------------- /resources/js/vendor/jquery-scrollstop.js: -------------------------------------------------------------------------------- 1 | // jQuery Scrollstop Plugin v1.2.0 2 | // https://github.com/ssorallen/jquery-scrollstop 3 | 4 | (function (factory) { 5 | // UMD[2] wrapper for jQuery plugins to work in AMD or in CommonJS. 6 | // 7 | // [2] https://github.com/umdjs/umd 8 | 9 | if (typeof define === 'function' && define.amd) { 10 | // AMD. Register as an anonymous module. 11 | define(['jquery'], factory); 12 | } else if (typeof exports === 'object') { 13 | // Node/CommonJS 14 | module.exports = factory(require('jquery')); 15 | } else { 16 | // Browser globals 17 | factory(jQuery); 18 | } 19 | }(function ($) { 20 | // $.event.dispatch was undocumented and was deprecated in jQuery 1.7[1]. It 21 | // was replaced by $.event.handle in jQuery 1.9. 22 | // 23 | // Use the first of the available functions to support jQuery <1.8. 24 | // 25 | // [1] https://github.com/jquery/jquery-migrate/blob/master/src/event.js#L25 26 | var dispatch = $.event.dispatch || $.event.handle; 27 | 28 | var special = $.event.special, 29 | uid1 = 'D' + (+new Date()), 30 | uid2 = 'D' + (+new Date() + 1); 31 | 32 | special.scrollstart = { 33 | setup: function (data) { 34 | var _data = $.extend({ 35 | latency: special.scrollstop.latency 36 | }, data); 37 | 38 | var timer, 39 | handler = function (evt) { 40 | var _self = this, 41 | _args = arguments; 42 | 43 | if (timer) { 44 | clearTimeout(timer); 45 | } else { 46 | evt.type = 'scrollstart'; 47 | dispatch.apply(_self, _args); 48 | } 49 | 50 | timer = setTimeout(function () { 51 | timer = null; 52 | }, _data.latency); 53 | }; 54 | 55 | $(this).bind('scroll', handler).data(uid1, handler); 56 | }, 57 | teardown: function () { 58 | $(this).unbind('scroll', $(this).data(uid1)); 59 | } 60 | }; 61 | 62 | special.scrollstop = { 63 | latency: 250, 64 | setup: function (data) { 65 | var _data = $.extend({ 66 | latency: special.scrollstop.latency 67 | }, data); 68 | 69 | var timer, 70 | handler = function (evt) { 71 | var _self = this, 72 | _args = arguments; 73 | 74 | if (timer) { 75 | clearTimeout(timer); 76 | } 77 | 78 | timer = setTimeout(function () { 79 | timer = null; 80 | evt.type = 'scrollstop'; 81 | dispatch.apply(_self, _args); 82 | }, _data.latency); 83 | }; 84 | 85 | $(this).bind('scroll', handler).data(uid2, handler); 86 | }, 87 | teardown: function () { 88 | $(this).unbind('scroll', $(this).data(uid2)); 89 | } 90 | }; 91 | })); 92 | -------------------------------------------------------------------------------- /resources/js/vendor/laroute.js: -------------------------------------------------------------------------------- 1 | (function () { 2 | 3 | var laroute = (function () { 4 | 5 | var routes = { 6 | 7 | absolute: $ABSOLUTE$, 8 | rootUrl: '$ROOTURL$', 9 | routes: $ROUTES$, 10 | prefix: '$PREFIX$', 11 | 12 | route: function (name, parameters, route) { 13 | route = route || this.getByName(name); 14 | 15 | if (! route) { 16 | return undefined; 17 | } 18 | 19 | return this.toRoute(route, parameters); 20 | }, 21 | 22 | url: function (url, parameters) { 23 | parameters = parameters || []; 24 | 25 | var uri = url + '/' + parameters.join('/'); 26 | 27 | return this.getCorrectUrl(uri); 28 | }, 29 | 30 | toRoute: function (route, parameters) { 31 | var uri = this.replaceNamedParameters(route.uri, parameters); 32 | var qs = this.getRouteQueryString(parameters); 33 | 34 | // Bind route domain parameters. Ex: {frontarea}, {adminarea} ..etc 35 | if (this.absolute && this.isOtherHost(route)) { 36 | return '//' + this.replaceNamedParameters(route.host, window.Cortex.routeDomains) + '/' + uri + (qs ? '/' + qs : ''); 37 | } 38 | 39 | return this.getCorrectUrl(uri + (qs ? '/' + qs : '')); 40 | }, 41 | 42 | isOtherHost: function (route) { 43 | return route.host && route.host != window.location.hostname; 44 | }, 45 | 46 | replaceNamedParameters: function (uri, parameters) { 47 | uri = uri.replace(/\{(.*?)\??\}/g, function (match, key) { 48 | if (parameters.hasOwnProperty(key)) { 49 | var value = parameters[key]; 50 | if (! (key in window.Cortex.routeDomains)) { 51 | delete parameters[key]; 52 | } 53 | return value; 54 | } else { 55 | return match; 56 | } 57 | }); 58 | 59 | // Strip out any optional parameters that were not given 60 | uri = uri.replace(/\/\{.*?\?\}/g, ''); 61 | 62 | return uri; 63 | }, 64 | 65 | getRouteQueryString: function (parameters) { 66 | var qs = []; 67 | for (var key in parameters) { 68 | if (parameters.hasOwnProperty(key)) { 69 | qs.push(key + '=' + parameters[key]); 70 | } 71 | } 72 | 73 | if (qs.length < 1) { 74 | return ''; 75 | } 76 | 77 | return '?' + qs.join('&'); 78 | }, 79 | 80 | getByName: function (name) { 81 | for (var key in this.routes) { 82 | if (this.routes.hasOwnProperty(key) && this.routes[key].name === name) { 83 | return this.routes[key]; 84 | } 85 | } 86 | }, 87 | 88 | getByAction: function (action) { 89 | for (var key in this.routes) { 90 | if (this.routes.hasOwnProperty(key) && this.routes[key].action === action) { 91 | return this.routes[key]; 92 | } 93 | } 94 | }, 95 | 96 | getCorrectUrl: function (uri) { 97 | var url = this.prefix + '/' + uri.replace(/^\/?/, ''); 98 | 99 | if (! this.absolute) { 100 | return url; 101 | } 102 | 103 | return this.rootUrl.replace('/\/?$/', '') + url; 104 | } 105 | }; 106 | 107 | var getLinkAttributes = function (attributes) { 108 | if (! attributes) { 109 | return ''; 110 | } 111 | 112 | var attrs = []; 113 | for (var key in attributes) { 114 | if (attributes.hasOwnProperty(key)) { 115 | attrs.push(key + '="' + attributes[key] + '"'); 116 | } 117 | } 118 | 119 | return attrs.join(' '); 120 | }; 121 | 122 | var getHtmlLink = function (url, title, attributes) { 123 | title = title || url; 124 | attributes = getLinkAttributes(attributes); 125 | 126 | return '' + title + ''; 127 | }; 128 | 129 | return { 130 | // Generate a url for a given controller action. 131 | // $NAMESPACE$.action('HomeController@getIndex', [params = {}]) 132 | action: function (name, parameters) { 133 | parameters = parameters || {}; 134 | 135 | return routes.route(name, parameters, routes.getByAction(name)); 136 | }, 137 | 138 | // Generate a url for a given named route. 139 | // $NAMESPACE$.route('routeName', [params = {}]) 140 | route: function (route, parameters) { 141 | parameters = parameters || {}; 142 | 143 | return routes.route(route, parameters); 144 | }, 145 | 146 | // Generate a fully qualified URL to the given path. 147 | // $NAMESPACE$.route('url', [params = {}]) 148 | url: function (route, parameters) { 149 | parameters = parameters || {}; 150 | 151 | return routes.url(route, parameters); 152 | }, 153 | 154 | // Generate a html link to the given url. 155 | // $NAMESPACE$.link_to('foo/bar', [title = url], [attributes = {}]) 156 | link_to: function (url, title, attributes) { 157 | url = this.url(url); 158 | 159 | return getHtmlLink(url, title, attributes); 160 | }, 161 | 162 | // Generate a html link to the given route. 163 | // $NAMESPACE$.link_to_route('route.name', [title=url], [parameters = {}], [attributes = {}]) 164 | link_to_route: function (route, title, parameters, attributes) { 165 | var url = this.route(route, parameters); 166 | 167 | return getHtmlLink(url, title, attributes); 168 | }, 169 | 170 | // Generate a html link to the given controller action. 171 | // $NAMESPACE$.link_to_action('HomeController@getIndex', [title=url], [parameters = {}], [attributes = {}]) 172 | link_to_action: function (action, title, parameters, attributes) { 173 | var url = this.action(action, parameters); 174 | 175 | return getHtmlLink(url, title, attributes); 176 | } 177 | 178 | }; 179 | 180 | }).call(this); 181 | 182 | /** 183 | * Expose the class either via AMD, CommonJS or the global object 184 | */ 185 | if (typeof define === 'function' && define.amd) { 186 | define(function () { 187 | return laroute; 188 | }); 189 | } else if (typeof module === 'object' && module.exports) { 190 | module.exports = laroute; 191 | } else { 192 | window.$NAMESPACE$ = laroute; 193 | } 194 | 195 | }).call(this); 196 | -------------------------------------------------------------------------------- /resources/lang/en/auth.php: -------------------------------------------------------------------------------- 1 | 'These credentials do not match our records.', 19 | 'password' => 'The provided password is incorrect.', 20 | 'throttle' => 'Too many login attempts. Please try again in :seconds seconds.', 21 | 22 | ]; 23 | -------------------------------------------------------------------------------- /resources/lang/en/pagination.php: -------------------------------------------------------------------------------- 1 | '« Previous', 19 | 'next' => 'Next »', 20 | 21 | ]; 22 | -------------------------------------------------------------------------------- /resources/lang/en/passwords.php: -------------------------------------------------------------------------------- 1 | 'Your password has been reset!', 19 | 'sent' => 'We have emailed your password reset link!', 20 | 'throttled' => 'Please wait before retrying.', 21 | 'token' => 'This password reset token is invalid.', 22 | 'user' => "We can't find a user with that email address.", 23 | 'password' => 'Passwords must be at least eight characters and match the confirmation.', 24 | 'expired' => 'This password reset link is expired, please request a new one.', 25 | 26 | ]; 27 | -------------------------------------------------------------------------------- /resources/lang/en/validation.php: -------------------------------------------------------------------------------- 1 | 'The :attribute must be accepted.', 19 | 'active_url' => 'The :attribute is not a valid URL.', 20 | 'after' => 'The :attribute must be a date after :date.', 21 | 'after_or_equal' => 'The :attribute must be a date after or equal to :date.', 22 | 'alpha' => 'The :attribute may only contain letters.', 23 | 'alpha_dash' => 'The :attribute may only contain letters, numbers, dashes and underscores.', 24 | 'alpha_num' => 'The :attribute may only contain letters and numbers.', 25 | 'array' => 'The :attribute must be an array.', 26 | 'before' => 'The :attribute must be a date before :date.', 27 | 'before_or_equal' => 'The :attribute must be a date before or equal to :date.', 28 | 'between' => [ 29 | 'numeric' => 'The :attribute must be between :min and :max.', 30 | 'file' => 'The :attribute must be between :min and :max kilobytes.', 31 | 'string' => 'The :attribute must be between :min and :max characters.', 32 | 'array' => 'The :attribute must have between :min and :max items.', 33 | ], 34 | 'boolean' => 'The :attribute field must be true or false.', 35 | 'confirmed' => 'The :attribute confirmation does not match.', 36 | 'date' => 'The :attribute is not a valid date.', 37 | 'date_equals' => 'The :attribute must be a date equal to :date.', 38 | 'date_format' => 'The :attribute does not match the format :format.', 39 | 'different' => 'The :attribute and :other must be different.', 40 | 'digits' => 'The :attribute must be :digits digits.', 41 | 'digits_between' => 'The :attribute must be between :min and :max digits.', 42 | 'dimensions' => 'The :attribute has invalid image dimensions.', 43 | 'distinct' => 'The :attribute field has a duplicate value.', 44 | 'email' => 'The :attribute must be a valid email address.', 45 | 'ends_with' => 'The :attribute must end with one of the following: :values.', 46 | 'exists' => 'The selected :attribute is invalid.', 47 | 'file' => 'The :attribute must be a file.', 48 | 'filled' => 'The :attribute field must have a value.', 49 | 'gt' => [ 50 | 'numeric' => 'The :attribute must be greater than :value.', 51 | 'file' => 'The :attribute must be greater than :value kilobytes.', 52 | 'string' => 'The :attribute must be greater than :value characters.', 53 | 'array' => 'The :attribute must have more than :value items.', 54 | ], 55 | 'gte' => [ 56 | 'numeric' => 'The :attribute must be greater than or equal :value.', 57 | 'file' => 'The :attribute must be greater than or equal :value kilobytes.', 58 | 'string' => 'The :attribute must be greater than or equal :value characters.', 59 | 'array' => 'The :attribute must have :value items or more.', 60 | ], 61 | 'image' => 'The :attribute must be an image.', 62 | 'in' => 'The selected :attribute is invalid.', 63 | 'in_array' => 'The :attribute field does not exist in :other.', 64 | 'integer' => 'The :attribute must be an integer.', 65 | 'ip' => 'The :attribute must be a valid IP address.', 66 | 'ipv4' => 'The :attribute must be a valid IPv4 address.', 67 | 'ipv6' => 'The :attribute must be a valid IPv6 address.', 68 | 'json' => 'The :attribute must be a valid JSON string.', 69 | 'lt' => [ 70 | 'numeric' => 'The :attribute must be less than :value.', 71 | 'file' => 'The :attribute must be less than :value kilobytes.', 72 | 'string' => 'The :attribute must be less than :value characters.', 73 | 'array' => 'The :attribute must have less than :value items.', 74 | ], 75 | 'lte' => [ 76 | 'numeric' => 'The :attribute must be less than or equal :value.', 77 | 'file' => 'The :attribute must be less than or equal :value kilobytes.', 78 | 'string' => 'The :attribute must be less than or equal :value characters.', 79 | 'array' => 'The :attribute must not have more than :value items.', 80 | ], 81 | 'max' => [ 82 | 'numeric' => 'The :attribute may not be greater than :max.', 83 | 'file' => 'The :attribute may not be greater than :max kilobytes.', 84 | 'string' => 'The :attribute may not be greater than :max characters.', 85 | 'array' => 'The :attribute may not have more than :max items.', 86 | ], 87 | 'mimes' => 'The :attribute must be a file of type: :values.', 88 | 'mimetypes' => 'The :attribute must be a file of type: :values.', 89 | 'min' => [ 90 | 'numeric' => 'The :attribute must be at least :min.', 91 | 'file' => 'The :attribute must be at least :min kilobytes.', 92 | 'string' => 'The :attribute must be at least :min characters.', 93 | 'array' => 'The :attribute must have at least :min items.', 94 | ], 95 | 'multiple_of' => 'The :attribute must be a multiple of :value', 96 | 'not_in' => 'The selected :attribute is invalid.', 97 | 'not_regex' => 'The :attribute format is invalid.', 98 | 'numeric' => 'The :attribute must be a number.', 99 | 'password' => 'The password is incorrect.', 100 | 'present' => 'The :attribute field must be present.', 101 | 'regex' => 'The :attribute format is invalid.', 102 | 'required' => 'The :attribute field is required.', 103 | 'required_if' => 'The :attribute field is required when :other is :value.', 104 | 'required_unless' => 'The :attribute field is required unless :other is in :values.', 105 | 'required_with' => 'The :attribute field is required when :values is present.', 106 | 'required_with_all' => 'The :attribute field is required when :values are present.', 107 | 'required_without' => 'The :attribute field is required when :values is not present.', 108 | 'required_without_all' => 'The :attribute field is required when none of :values are present.', 109 | 'same' => 'The :attribute and :other must match.', 110 | 'size' => [ 111 | 'numeric' => 'The :attribute must be :size.', 112 | 'file' => 'The :attribute must be :size kilobytes.', 113 | 'string' => 'The :attribute must be :size characters.', 114 | 'array' => 'The :attribute must contain :size items.', 115 | ], 116 | 'starts_with' => 'The :attribute must start with one of the following: :values.', 117 | 'string' => 'The :attribute must be a string.', 118 | 'timezone' => 'The :attribute must be a valid zone.', 119 | 'unique' => 'The :attribute has already been taken.', 120 | 'uploaded' => 'The :attribute failed to upload.', 121 | 'url' => 'The :attribute format is invalid.', 122 | 'phone' => 'The :attribute field contains an invalid number.', 123 | 'uuid' => 'The :attribute must be a valid UUID.', 124 | 125 | /* 126 | |-------------------------------------------------------------------------- 127 | | Custom Validation Language Lines 128 | |-------------------------------------------------------------------------- 129 | | 130 | | Here you may specify custom validation messages for attributes using the 131 | | convention "attribute.rule" to name the lines. This makes it quick to 132 | | specify a specific custom language line for a given attribute rule. 133 | | 134 | */ 135 | 136 | 'custom' => [ 137 | 'attribute-name' => [ 138 | 'rule-name' => 'custom-message', 139 | ], 140 | ], 141 | 142 | /* 143 | |-------------------------------------------------------------------------- 144 | | Custom Validation Attributes 145 | |-------------------------------------------------------------------------- 146 | | 147 | | The following language lines are used to swap our attribute placeholder 148 | | with something more reader friendly such as "E-Mail Address" instead 149 | | of "email". This simply helps us make our message more expressive. 150 | | 151 | */ 152 | 153 | 'attributes' => [], 154 | 'invalid_country' => 'Country must be valid!', 155 | 'invalid_language' => 'Language must be valid!', 156 | 'invalid_strip_tags' => 'HTML tags are not allowed!', 157 | 'invalid_timeoffset' => 'Invalid time offset!', 158 | 'invalid_currency' => 'Currency must be valid!', 159 | 'unique_with' => 'This combination of :fields already exists.', 160 | 161 | ]; 162 | -------------------------------------------------------------------------------- /resources/sass/app.scss: -------------------------------------------------------------------------------- 1 | //@tailwind base; 2 | //@tailwind components; 3 | //@tailwind utilities; 4 | 5 | // Notifications Customizations 6 | [data-notify='container'] { 7 | font-weight: bold; 8 | } 9 | 10 | // DataTables 11 | .dataTables_processing { 12 | position: absolute; 13 | top: 50%; 14 | left: 50%; 15 | width: 250px; 16 | height: 80px; 17 | margin-left: -125px; 18 | margin-top: -15px; 19 | padding: 15px 0 30px 0; 20 | border: 1px solid #ddd; 21 | text-align: center; 22 | color: #444; 23 | font-size: 14px; 24 | background: url('../images/loading_bar.gif') no-repeat center 38px #fff; 25 | box-shadow: 2px 2px 5px #444; 26 | -moz-box-shadow: 2px 2px 5px #444; 27 | -webkit-box-shadow: 2px 2px 5px #444; 28 | z-index: 9999; 29 | } 30 | 31 | div.dt-button-background { 32 | position: fixed; 33 | top: 0; 34 | left: 0; 35 | width: 100%; 36 | height: 100%; 37 | background: rgba(0, 0, 0, 0.7); 38 | /* Fallback */ 39 | background: -ms-radial-gradient(center, ellipse farthest-corner, rgba(0, 0, 0, 0.3) 0%, rgba(0, 0, 0, 0.7) 100%); 40 | /* IE10 Consumer Preview */ 41 | background: -moz-radial-gradient(center, ellipse farthest-corner, rgba(0, 0, 0, 0.3) 0%, rgba(0, 0, 0, 0.7) 100%); 42 | /* Firefox */ 43 | background: -o-radial-gradient(center, ellipse farthest-corner, rgba(0, 0, 0, 0.3) 0%, rgba(0, 0, 0, 0.7) 100%); 44 | /* Opera */ 45 | background: -webkit-gradient( 46 | radial, 47 | center center, 48 | 0, 49 | center center, 50 | 497, 51 | color-stop(0, rgba(0, 0, 0, 0.3)), 52 | color-stop(1, rgba(0, 0, 0, 0.7)) 53 | ); 54 | /* Webkit (Safari/Chrome 10) */ 55 | background: -webkit-radial-gradient( 56 | center, 57 | ellipse farthest-corner, 58 | rgba(0, 0, 0, 0.3) 0%, 59 | rgba(0, 0, 0, 0.7) 100% 60 | ); 61 | /* Webkit (Chrome 11+) */ 62 | background: radial-gradient(ellipse farthest-corner at center, rgba(0, 0, 0, 0.3) 0%, rgba(0, 0, 0, 0.7) 100%); 63 | /* W3C Markup, IE10 Release Preview */ 64 | z-index: 2001; 65 | } 66 | 67 | td.dt-details-control { 68 | background: url('../images/details_open.png') no-repeat center center; 69 | cursor: pointer; 70 | } 71 | 72 | tr.details td.dt-details-control { 73 | background: url('../images/details_close.png') no-repeat center center; 74 | } 75 | 76 | .select-item { 77 | padding-left: 10px; 78 | padding-right: 10px; 79 | } 80 | 81 | // Style select2 error 82 | .has-error .select2-selection { 83 | border: 1px solid #a94442; 84 | } 85 | 86 | // Custom 87 | .tag-group, 88 | .attribute-group { 89 | background-color: #eee !important; 90 | } 91 | 92 | // Dropzone 93 | .dropzone { 94 | margin-bottom: 10px; 95 | border-style: dashed; 96 | 97 | .dz-message { 98 | font-size: 2em; 99 | } 100 | } 101 | 102 | .media-object { 103 | max-width: 150px; 104 | 105 | &.media-object-small { 106 | width: 130px; 107 | } 108 | } 109 | 110 | .large-icon { 111 | font-size: 63px; 112 | } 113 | 114 | /* Profile sidebar */ 115 | .profile-sidebar { 116 | padding: 20px 0 10px 0; 117 | background: #fff; 118 | } 119 | 120 | .profile-usertitle { 121 | text-align: center; 122 | margin-top: 20px; 123 | } 124 | 125 | .profile-usertitle-name { 126 | color: #5a7391; 127 | font-size: 16px; 128 | font-weight: 600; 129 | margin-bottom: 7px; 130 | } 131 | 132 | .profile-usertitle-job { 133 | text-transform: uppercase; 134 | color: #5b9bd1; 135 | font-size: 12px; 136 | font-weight: 600; 137 | margin-bottom: 15px; 138 | } 139 | 140 | .profile-usermenu { 141 | margin-top: 30px; 142 | } 143 | 144 | .profile-usermenu ul li { 145 | border-bottom: 1px solid #f0f4f7; 146 | } 147 | 148 | .profile-usermenu ul li:last-child { 149 | border-bottom: none; 150 | } 151 | 152 | .profile-usermenu ul li a { 153 | color: #93a3b5; 154 | font-size: 14px; 155 | font-weight: 400; 156 | } 157 | 158 | .profile-usermenu ul li a i { 159 | margin-right: 8px; 160 | font-size: 14px; 161 | } 162 | 163 | .profile-usermenu ul li a:hover { 164 | background-color: #fafcfd; 165 | color: #5b9bd1; 166 | } 167 | 168 | .profile-usermenu ul li.active { 169 | border-bottom: none; 170 | } 171 | 172 | .profile-usermenu ul li.active a { 173 | color: #5b9bd1; 174 | background-color: #f6f9fb; 175 | border-left: 2px solid #5b9bd1; 176 | margin-left: -2px; 177 | } 178 | 179 | /* Profile Content */ 180 | .profile-content { 181 | background: #fff; 182 | min-height: 400px; 183 | position: relative; 184 | padding: 20px 20px 60px 20px; 185 | } 186 | 187 | .profile-buttons { 188 | bottom: 0; 189 | position: absolute; 190 | margin-bottom: 20px; 191 | } 192 | 193 | .intl-tel-input { 194 | width: 100%; 195 | } 196 | 197 | /* Formbuilder */ 198 | .frmb.ui-sortable { 199 | min-height: 500px !important; 200 | } 201 | 202 | // intl-tel-input 203 | .iti { 204 | display: block; 205 | } 206 | 207 | // datatables.mark 208 | mark { 209 | background: orange; 210 | color: black; 211 | } 212 | -------------------------------------------------------------------------------- /resources/sass/datatables.scss: -------------------------------------------------------------------------------- 1 | @import '~datatables.net-bs/css/dataTables.bootstrap.min'; 2 | @import '~datatables.net-select-bs/css/select.bootstrap'; 3 | @import '~datatables.net-buttons-bs/css/buttons.bootstrap'; 4 | @import '~datatables.net-keytable-bs/css/keyTable.bootstrap'; 5 | @import '~datatables.net-rowgroup-bs/css/rowGroup.bootstrap'; 6 | @import '~datatables.net-responsive-bs/css/responsive.bootstrap'; 7 | @import '~jquery-datatables-checkboxes/css/dataTables.checkboxes'; 8 | -------------------------------------------------------------------------------- /resources/sass/fullcalendar-cortal.scss: -------------------------------------------------------------------------------- 1 | .cortal { 2 | position: relative; 3 | } 4 | 5 | .cortal .panel-title { 6 | margin-left: -15px; 7 | } 8 | 9 | .cortal-event-form .colors .btn, 10 | .cortal-event-form-edit .colors .btn { 11 | position: relative; 12 | border-width: 5px; 13 | border-style: solid; 14 | padding: 4px !important; 15 | font-size: 12px; 16 | } 17 | 18 | .cortal-event-form .colors .active, 19 | .cortal-event-form-edit .colors .active { 20 | border: 5px solid #fff !important; 21 | } 22 | 23 | .popover .cortal-event-form label { 24 | font-weight: normal !important; 25 | } 26 | 27 | .container-fluid { 28 | padding: 0 15px; 29 | } 30 | 31 | #wrapper { 32 | background: #e5e5e5; 33 | } 34 | 35 | .panel { 36 | border: none; 37 | } 38 | 39 | .panel .panel-heading { 40 | background-image: none; 41 | filter: none; 42 | border: none; 43 | position: relative; 44 | margin: 0 auto 0px; 45 | border-left: 5px solid #e5e5e5; 46 | border-top: 5px solid #e5e5e5; 47 | border-right: 5px solid #e5e5e5; 48 | padding: 10px; 49 | padding-right: 5px; 50 | border-radius: 0; 51 | -moz-border-radius: 0; 52 | -webkit-border-radius: 0; 53 | background: #fff; 54 | } 55 | 56 | .panel .panel-heading > .btn-group { 57 | float: right; 58 | } 59 | 60 | .panel .panel-heading > .btn-group .btn { 61 | background: none; 62 | color: #999; 63 | border-color: transparent; 64 | border-radius: 0 !important; 65 | } 66 | 67 | .panel .panel-heading > .btn-group .btn:hover { 68 | color: #333; 69 | } 70 | 71 | .panel .panel-heading > .btn-group .dropdown-menu { 72 | right: 0; 73 | left: auto; 74 | } 75 | 76 | .panel .panel-title { 77 | padding-left: 0; 78 | cursor: default; 79 | font-size: 28px; 80 | font-weight: 100; 81 | text-transform: uppercase; 82 | float: left; 83 | } 84 | 85 | .panel .panel-heading:after { 86 | content: ''; 87 | display: block; 88 | clear: both; 89 | width: 0; 90 | height: 0; 91 | } 92 | 93 | .panel .panel-footer { 94 | background: #e5e5e5; 95 | border: 5px solid #d6d6d6; 96 | border-top: none; 97 | } 98 | 99 | .panel .panel-body { 100 | background: none; 101 | border: none; 102 | height: 100%; 103 | position: relative; 104 | text-decoration: none; 105 | vertical-align: top; 106 | padding: 15px; 107 | background: #ffffff !important; 108 | border-radius: 2px; 109 | box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1) !important; 110 | -moz-box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1) !important; 111 | -webkit-box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1) !important; 112 | } 113 | 114 | .panel-success > .panel-heading { 115 | border-color: #5cb85c; 116 | color: #5cb85c; 117 | } 118 | 119 | .panel-warning > .panel-heading { 120 | border-color: #f0ad4e; 121 | color: #f0ad4e; 122 | } 123 | 124 | .panel-danger > .panel-heading { 125 | border-color: #d9534f; 126 | color: #d9534f; 127 | } 128 | 129 | .panel-primary > .panel-heading { 130 | border-color: #428bca; 131 | color: #428bca; 132 | } 133 | 134 | .panel-info > .panel-heading { 135 | border-color: #5bc0de; 136 | color: #5bc0de; 137 | } 138 | 139 | .modal > .modal-dialog { 140 | background: none; 141 | box-shadow: 0 2px 40px rgba(0, 0, 0, 0.8); 142 | -moz-box-shadow: 0 2px 40px rgba(0, 0, 0, 0.8); 143 | -webkit-box-shadow: 0 2px 40px rgba(0, 0, 0, 0.8); 144 | } 145 | 146 | .modal > .modal-dialog .modal-content { 147 | background: #f5f5f5; 148 | -webkit-border-radius: 0 !important; 149 | -moz-border-radius: 0 !important; 150 | border-radius: 0 !important; 151 | box-shadow: none; 152 | -webkit-box-shadow: none; 153 | -moz-box-shadow: none; 154 | outline: 5px solid #999; 155 | border: 3px solid #e5e5e5; 156 | } 157 | 158 | .modal > .modal-dialog .modal-content .modal-header { 159 | background: #f1f1f1; 160 | -webkit-border-radius: 0 !important; 161 | -moz-border-radius: 0 !important; 162 | border-radius: 0 !important; 163 | color: #666; 164 | } 165 | 166 | .modal > .modal-dialog .modal-content .modal-header > .modal-title { 167 | color: #333; 168 | font-weight: 300; 169 | text-transform: uppercase; 170 | } 171 | 172 | .modal > .modal-dialog .modal-content .modal-body { 173 | } 174 | 175 | .modal > .modal-dialog .modal-content .modal-footer { 176 | background: #e5e5e5; 177 | padding: 8px; 178 | border-top: 1px solid #d6d6d6; 179 | } 180 | 181 | /***************** fullcalendar ****************/ 182 | .panel.calendar { 183 | position: relative; 184 | } 185 | 186 | .panel.calendar .fc-button { 187 | border-radius: 0px !important; 188 | top: -50px; 189 | right: 0px; 190 | height: 40px !important; 191 | border: 0; 192 | padding-top: 5px; 193 | background: #f1f1f1; 194 | color: #333; 195 | box-shadow: none; 196 | margin-right: 10px; 197 | text-transform: capitalize; 198 | } 199 | 200 | .panel.calendar .fc-button:hover { 201 | background: #e5e5e5; 202 | } 203 | 204 | .calendar.panel-danger .fc-event { 205 | background-color: #d9534f !important; 206 | border-color: #d9534f; 207 | } 208 | 209 | .calendar.panel-warning .fc-event { 210 | background-color: #f0ad4e !important; 211 | border-color: #f0ad4e; 212 | } 213 | 214 | .calendar.panel-success .fc-event { 215 | background-color: #5cb85c !important; 216 | border-color: #5cb85c; 217 | } 218 | 219 | .calendar.panel-info .fc-event { 220 | background-color: #5bc0de !important; 221 | border-color: #5bc0de; 222 | } 223 | 224 | .calendar.panel-primary .fc-event { 225 | background-color: #428bca !important; 226 | border-color: #428bca; 227 | } 228 | 229 | .panel.calendar .fc-state-active, 230 | .panel.calendar .fc-state-active:hover { 231 | background-image: none !important; 232 | filter: none; 233 | background-color: #09c; 234 | color: #fff !important; 235 | text-shadow: none !important; 236 | } 237 | 238 | .panel.calendar .fc-state-down { 239 | filter: none; /* disable for IE*/ 240 | text-shadow: none; 241 | } 242 | 243 | .panel.calendar .fc-state-disabled { 244 | color: #ccc; 245 | } 246 | 247 | .panel.calendar .fc-header-left, 248 | .panel.calendar .fc-header-center, 249 | .panel.calendar .fc-header-right { 250 | } 251 | 252 | .panel.calendar .panel-heading { 253 | height: 45px !important; 254 | overflow: hidden; 255 | } 256 | 257 | .panel.calendar .fc-header-title { 258 | color: #999; 259 | font-weight: 100; 260 | } 261 | 262 | @media screen and (max-width: 480px), screen and (max-width: 768px), screen and (max-width: 992px) { 263 | .fc-header-left, 264 | .fc-header-center, 265 | .fc-header-right { 266 | width: 100% !important; 267 | display: block; 268 | clear: both; 269 | } 270 | 271 | .panel.calendar .fc-button { 272 | top: auto !important; 273 | border: 1px solid #d6d6d6; 274 | } 275 | 276 | .panel.calendar .fc-header-right { 277 | text-align: left; 278 | padding-left: -20px; 279 | border-bottom: 1px solid #d6d6d6; 280 | margin-bottom: 10px; 281 | } 282 | 283 | .panel.calendar .fc-header-space { 284 | display: none; 285 | } 286 | 287 | .panel-danger.calendar .fc-button-prev, 288 | .panel-danger.calendar .fc-button-next, 289 | .panel-success.calendar .fc-button-prev, 290 | .panel-success.calendar .fc-button-next, 291 | .panel-warning.calendar .fc-button-prev, 292 | .panel-warning.calendar .fc-button-next, 293 | .panel-primary.calendar .fc-button-prev, 294 | .panel-primary.calendar .fc-button-next, 295 | .panel-info.calendar .fc-button-prev, 296 | .panel-info.calendar .fc-button-next { 297 | } 298 | 299 | .panel.calendar .fc-header-right .fc-button { 300 | margin-bottom: 0; 301 | bottom: -1px; 302 | } 303 | 304 | .panel.calendar .fc-button-prev, 305 | .panel.calendar .fc-button-next { 306 | top: -35px !important; 307 | right: 10px !important; 308 | position: absolute; 309 | width: 40px; 310 | } 311 | 312 | .panel.calendar .fc-button-prev { 313 | right: 50px !important; 314 | } 315 | 316 | .panel.calendar .fc-header-right .fc-state-active { 317 | border-top: 2px solid #e5e5e5 !important; 318 | border-bottom-color: #f5f5f5 !important; 319 | background: none !important; 320 | text-shadow: none !important; 321 | box-shadow: none !important; 322 | color: #333 !important; 323 | } 324 | 325 | .panel-danger.calendar .fc-header-right .fc-state-active { 326 | border-top-color: #d9534f !important; 327 | } 328 | 329 | .panel-success.calendar .fc-header-right .fc-state-active { 330 | border-top-color: #5cb85c !important; 331 | } 332 | 333 | .panel-warning.calendar .fc-header-right .fc-state-active { 334 | border-top-color: #f0ad4e !important; 335 | } 336 | 337 | .panel-primary.calendar .fc-header-right .fc-state-active { 338 | border-top-color: #428bca !important; 339 | } 340 | 341 | .panel-info.calendar .fc-header-right .fc-state-active { 342 | border-top-color: #5bc0de !important; 343 | } 344 | 345 | .panel.calendar .fc-header-right .fc-state-disabled { 346 | color: #ccc; 347 | } 348 | 349 | .panel.calendar .fc-header-title h2 { 350 | white-space: normal; 351 | word-wrap: normal; 352 | } 353 | } 354 | -------------------------------------------------------------------------------- /resources/sass/fullcalendar.scss: -------------------------------------------------------------------------------- 1 | @import '~fullcalendar/dist/fullcalendar.css'; 2 | @import './fullcalendar-cortal.scss'; 3 | -------------------------------------------------------------------------------- /resources/sass/vendor.scss: -------------------------------------------------------------------------------- 1 | $flagsImagePath: '../../build/img/'; 2 | $icon-font-path: '../../fonts/bootstrap/'; 3 | 4 | @import '~bootstrap-daterangepicker/daterangepicker'; 5 | @import '~bootstrap-sass/assets/stylesheets/_bootstrap'; 6 | @import '~bootstrap-colorpicker/src/sass/_colorpicker'; 7 | @import '~bootstrap-popover-picker/dist/css/bootstrap-picker'; 8 | @import '~fontawesome-iconpicker/dist/css/fontawesome-iconpicker'; 9 | @import '~intl-tel-input/src/css/intlTelInput'; 10 | @import '~font-awesome/scss/font-awesome'; 11 | @import '~timepicker/jquery.timepicker'; 12 | @import '~select2/src/scss/core'; 13 | @import '~dropzone/dist/dropzone'; 14 | -------------------------------------------------------------------------------- /resources/views/errors/401.blade.php: -------------------------------------------------------------------------------- 1 | @extends('errors::minimal') 2 | 3 | @section('title', __('Unauthorized')) 4 | @section('code', '401') 5 | @section('message', __('Unauthorized')) 6 | -------------------------------------------------------------------------------- /resources/views/errors/403.blade.php: -------------------------------------------------------------------------------- 1 | @extends('errors::minimal') 2 | 3 | @section('title', __('Forbidden')) 4 | @section('code', '403') 5 | @section('message', __($exception->getMessage() ?: 'Forbidden')) 6 | -------------------------------------------------------------------------------- /resources/views/errors/404.blade.php: -------------------------------------------------------------------------------- 1 | @extends('errors::minimal') 2 | 3 | @section('title', __('Not Found')) 4 | @section('code', '404') 5 | @section('message', __('Not Found')) 6 | -------------------------------------------------------------------------------- /resources/views/errors/419.blade.php: -------------------------------------------------------------------------------- 1 | @extends('errors::minimal') 2 | 3 | @section('title', __('Page Expired')) 4 | @section('code', '419') 5 | @section('message', __('Page Expired')) 6 | -------------------------------------------------------------------------------- /resources/views/errors/429.blade.php: -------------------------------------------------------------------------------- 1 | @extends('errors::minimal') 2 | 3 | @section('title', __('Too Many Requests')) 4 | @section('code', '429') 5 | @section('message', __('Too Many Requests')) 6 | -------------------------------------------------------------------------------- /resources/views/errors/500.blade.php: -------------------------------------------------------------------------------- 1 | @extends('errors::minimal') 2 | 3 | @section('title', __('Server Error')) 4 | @section('code', '500') 5 | @section('message', __('Server Error')) 6 | -------------------------------------------------------------------------------- /resources/views/errors/503.blade.php: -------------------------------------------------------------------------------- 1 | @extends('errors::minimal') 2 | 3 | @section('title', __('Service Unavailable')) 4 | @section('code', '503') 5 | @section('message', __('Service Unavailable')) 6 | -------------------------------------------------------------------------------- /resources/views/errors/layout.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | @yield('title') 8 | 9 | 10 | 43 | 44 | 45 |
46 |
47 |
48 | @yield('message') 49 |
50 |
51 |
52 | 53 | 54 | -------------------------------------------------------------------------------- /resources/views/errors/minimal.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | @yield('title') 8 | 9 | 12 | 13 | 18 | 19 | 20 |
21 |
22 |
23 |
24 | @yield('code') 25 |
26 | 27 |
28 | @yield('message') 29 |
30 |
31 |
32 |
33 | 34 | 35 | -------------------------------------------------------------------------------- /resources/views/vendor/datatables/script.blade.php: -------------------------------------------------------------------------------- 1 | @if ($routePrefix)window.Cortex.routePrefix = "{{ $routePrefix }}";@endif 2 | 3 | window.onload = function() { 4 | $(function() { 5 | window.{{ config('datatables-html.namespace', 'LaravelDataTables') }} = window.{{ config('datatables-html.namespace', 'LaravelDataTables') }} || {}; 6 | window.{{ config('datatables-html.namespace', 'LaravelDataTables') }}["{{ $id }}"] = $("#{{ str_replace('.', '\\\.', $id) }}").DataTable({!! $options !!}); 7 | }); 8 | 9 | @if ($pusher) 10 | // Realtime updates 11 | window.Echo.private("{{ $pusher['channel'] }}") 12 | .listen('.{{ $pusher['entity'] }}.created', (e) => { 13 | window.LaravelDataTables["{{ $id }}"].draw(); 14 | }) 15 | .listen('.{{ $pusher['entity'] }}.updated', (e) => { 16 | window.LaravelDataTables["{{ $id }}"].draw(); 17 | }) 18 | .listen('.{{ $pusher['entity'] }}.deleted', (e) => { 19 | window.LaravelDataTables["{{ $id }}"].draw(); 20 | }) 21 | .listen('.{{ $pusher['entity'] }}.restored', (e) => { 22 | window.LaravelDataTables["{{ $id }}"].draw(); 23 | }); 24 | @endif 25 | }; 26 | -------------------------------------------------------------------------------- /resources/views/vendor/jsvalidation/bootstrap.php: -------------------------------------------------------------------------------- 1 | 54 | -------------------------------------------------------------------------------- /server.php: -------------------------------------------------------------------------------- 1 |
'); 36 | 37 | // Draw columns 38 | $.each(item, function (i2, item2) { 39 | $trH.append('' + i2 + '' + i + '' + cellValue + '' + item2 + '