first commit
This commit is contained in:
270
vendor/yiisoft/yii2-gii/CHANGELOG.md
vendored
Normal file
270
vendor/yiisoft/yii2-gii/CHANGELOG.md
vendored
Normal file
@ -0,0 +1,270 @@
|
||||
Yii Framework 2 gii extension Change Log
|
||||
========================================
|
||||
|
||||
2.2.7 February 13, 2025
|
||||
-----------------------
|
||||
|
||||
- Bug #531: Fix `yii\gii\console\GenerateAction` to use `stdout()` instead of echoing the output (egmsystems)
|
||||
- Bug #532: Return `ExitCode::USAGE` on command input validation error (egmsystems)
|
||||
- Bug #545: Fix CRUD for non-relational databases (spzgy)
|
||||
- Enh #534: Generating in model ENUM fields value constants, setter and getter methods (uldisn)
|
||||
- Enh #537: Generating rules for the fields with default values (manky)
|
||||
- Enh #542: Use the table name to create the relation (thiagotalma)
|
||||
- Enh #551: Add optional parameter `$formName` to `SearchModel::search()` method (evil1)
|
||||
|
||||
|
||||
2.2.6 May 22, 2023
|
||||
------------------
|
||||
|
||||
- Bug #510: Fix possible XSS (rob006)
|
||||
- Bug #511: Fix validation for `messageCategory` in Generator (rob006)
|
||||
- Bug #525: Fix of the modal dialog visibility with a preview of generated migration (glodov)
|
||||
- Enh #514: Fix compatibility with PHP 8.1 and 8.2 (rob006)
|
||||
|
||||
|
||||
2.2.5 September 04, 2022
|
||||
------------------------
|
||||
|
||||
- Ehn #489: Added support for the `::class` constant in model generator via the `useClassConstant` setting (rhertogh)
|
||||
- Bug #500: Fix missing namespace in CRUD index template (mohamed-nazim)
|
||||
- Bug #502: Setting `skipOnEmpty` to fix "trim(): Passing null to parameter" in `generators/model/Generator.php` (rhertogh)
|
||||
|
||||
|
||||
2.2.4 December 30, 2021
|
||||
-----------------------
|
||||
|
||||
- Bug #467: Fix view `generators/crud/default/controller` (WinterSilence, cjrf)
|
||||
- Bug #476: Fix stucking datalist options in form generator (WinterSilence)
|
||||
- Bug #484: Add parent's labels and hints, fix rule for attribute `moduleClass` in module generator (WinterSilence)
|
||||
- Bug #486: Update `assets/js/bs4-native.min.js` to the latest version (WinterSilence)
|
||||
- Bug #488: Fix `ActionColumn::$urlCreator` in index template of CRUD generator (WinterSilence)
|
||||
- Enh #485: Add validation rules for `enableI18N` and `messageCategory` to Generator (WinterSilence)
|
||||
|
||||
|
||||
2.2.3 August 09, 2021
|
||||
---------------------
|
||||
|
||||
- Enh #453: Allow CRUD to work with non-RDBMS ARs (WinterSilence)
|
||||
- Enh #458: Add CIDR support for allowedIPs (rhertogh)
|
||||
- Enh #462: Add support for viewing file differences on the CLI (rhertogh)
|
||||
|
||||
|
||||
2.2.2 May 06, 2021
|
||||
------------------
|
||||
|
||||
- Bug #433: Fix insufficient category validation (samdark)
|
||||
- Bug #439: Replace client-side generation of model class name with an AJAX request and a serverside implementation to take options into account (WinterSilence)
|
||||
- Enh #444: Updated reserved keywords in generator (WinterSilence)
|
||||
- Enh #450: Add behaviors merging, pagination example, sorting example, loading defaults for a model to CRUD controller (WinterSilence)
|
||||
|
||||
|
||||
2.2.1 May 02, 2020
|
||||
------------------
|
||||
|
||||
- Bug #428: Permit the usage of anonymous generators using dependency injection (aguevaraIL)
|
||||
|
||||
|
||||
2.2.0 March 24, 2020
|
||||
--------------------
|
||||
|
||||
- Enh #424: Added support for `via()` junction relations in model generator (rhertogh)
|
||||
|
||||
|
||||
2.1.4 January 17, 2020
|
||||
----------------------
|
||||
|
||||
- Bug #422: Fix relational query getter documentation style (mikk150)
|
||||
- Enh #287: Model generator is now generating relation's phpdoc hints with target ActiveQuery class (bscheshirwork)
|
||||
|
||||
|
||||
2.1.3 November 19, 2019
|
||||
-----------------------
|
||||
|
||||
- Bug #417: Fixed issue where RTL implementation for foreign keys causes problems with LTR tables names (NickvdMeij)
|
||||
- Enh #416: Improved generation of model attributes and type annotations (uldisn)
|
||||
|
||||
|
||||
2.1.2 October 08, 2019
|
||||
----------------------
|
||||
|
||||
- Bug #413: Controller Generator produces invalid alias when namespace starts with backslash (cebe)
|
||||
|
||||
|
||||
2.1.1 August 13, 2019
|
||||
---------------------
|
||||
|
||||
- Bug #410: Inserted rows in the diff were not highlighted (albertborsos)
|
||||
|
||||
|
||||
2.1.0 March 17, 2019
|
||||
--------------------
|
||||
|
||||
- Enh #390, Bug #260: Create (bootstrap)-independent version (simialbi)
|
||||
- Bug #386: Move "Create" button outside of pjax container to avoid redirect (alexkart)
|
||||
- Bug #398, #397: Use strict mode when generating view folder name (machour)
|
||||
- Enh #395: Made `yii\gii\CodeFile` independent of controller context, do not apply `$newDirMode` and `$newFileMode` if module is not available (CeBe)
|
||||
- Enh #399: Option to allow singularize class names in model generator (alexkart)
|
||||
|
||||
|
||||
2.0.8 December 08, 2018
|
||||
-----------------------
|
||||
|
||||
- Bug #327: Fixed bug in Model generator when $baseClass is an abstract class (rhertogh)
|
||||
- Bug #379: Fixed bug in view page where delete button not work well (zacksleo)
|
||||
- Bug #383: Fix incorrect title generation in CRUD update view (bscheshirwork)
|
||||
- Enh #366: Option to allow standardized class names capitals in model generator (slinstj)
|
||||
- Enh #378: Remove useless import of `Yii` from CRUD generator search model template (CeBe)
|
||||
|
||||
|
||||
2.0.7 May 3, 2018
|
||||
-----------------
|
||||
|
||||
- Bug #185: Fixed bug in Model generators when FKs pointing to non-existing tables (adipriyantobpn)
|
||||
- Bug #328: Fixed bug in CRUD update view generator (ricpelo)
|
||||
- Bug #333: Fixed incorrect validation rule for TINYINT column type (nostop8)
|
||||
- Bug #340: Fixed bug in CRUD SearchModel generator (JeanWolf)
|
||||
- Bug #351: Fixed incorrect validation rule for JSON column type (silverfire)
|
||||
|
||||
|
||||
2.0.6 December 23, 2017
|
||||
-----------------------
|
||||
|
||||
- Bug #97: Fixed errors and wrong directories created when using backslash in view paths and output paths of CRUD, Controller and Extension generators (lubosdz, samdark)
|
||||
- Bug #100, #102: Fixed "Check This File" button in the preview modal (Insensus, thiagotalma)
|
||||
- Bug #126, #139: Fixed model generator form validation when "ActiveQuery Class" is invalid but unused (kikimor)
|
||||
- Bug #149: Relation names no longer override existing methods and properties (Faryshta)
|
||||
- Bug #152: Fixed generating model without any rules (and800)
|
||||
- Bug #166: Fixed "Trying to get property of non-object" during model generation (zlakomanoff)
|
||||
- Bug #179: Fixed indentation and newlines for Pjax widget in CRUD index view (nkovacs)
|
||||
- Bug #182: Fixed wrong link after generating controller located in sub-namespace of controllers namespace (MKiselev)
|
||||
- Bug #186: Fixed incorrect database name exception (zlakomanoff, shirase)
|
||||
- Bug #198: Fixed false-positive detection of URL fields in CRUD generator (cebe)
|
||||
- Bug #200: Fixed Pjax and Listview with CRUD generator (ariestattoo)
|
||||
- Bug #224: Add default validator with `null` value for integers when db is PostgreSQL (MKiselev)
|
||||
- Bug #232: Fixed Help documentation link (drdim)
|
||||
- Bug #255: Fixed error when getting database driver name when db is not an instance of `yii\db\Connection` (MKiselev)
|
||||
- Bug #271: Fixed absolute namespace of model class in form generator (CeBe, amin3mej)
|
||||
- Bug #274: Added `useTablePrefix` and `generateQuery` to `stickyAttributes` (luyi61)
|
||||
- Bug #290: Fixed model generator to work properly with `schema.table` as table name (SwoDs)
|
||||
- Bug #317: Force HTML content type in response to display HTML when app is configured for REST API (microThread)
|
||||
- Bug #318: Use `yii\base\BaseObject` instead `yii\base\Object` in `CodeFile.php` (MKiselev)
|
||||
- Enh #131: Allow using table comments for PHPdoc property description (stmswitcher, michaelarnauts)
|
||||
- Enh #153: Added filename filter to generated files list preview (thiagotalma)
|
||||
- Enh #162: Model generator now detects foreign keys named as `id_*` (mootensai, samdark)
|
||||
- Enh #167: Added "generating relations from current schema" option to model generator (zlakomanoff)
|
||||
- Enh #174: `NotFoundHttpException` message in CRUD now uses i18n (bscheshirwork)
|
||||
- Enh #223: Use `ilike` operator when generating search model for PostgreSQL (MKiselev, arogachev)
|
||||
- Enh #230: Allowed underscores for extension namespaces (Nex Otaku)
|
||||
- Enh #234: Changed submit button label from "Update" and "Create" to "Save" (MKiselev)
|
||||
- Enh #238: Use `int`/`bool` instead of `integer`/`boolean` in phpdoc blocks generated (MKiselev)
|
||||
- Enh #241: Remove message for unique validator (MKiselev)
|
||||
- Enh #249: unique validation rule is now generated for tables with multiple primary keys (dmirogin)
|
||||
- Enh #252: Added meta tag to prevent indexing of debug by search engines in case it's exposed (bashkarev)
|
||||
- Enh #293: Do not generate redundant `else` after `return` (bscheshirwork)
|
||||
- Enh #295: Allowed to use aliases in generator's templates (dmirogin)
|
||||
- Enh #300: Removed space from commented out code so when uncommenting in IDEs there's no extra spacing (bscheshirwork)
|
||||
- Enh #315: Make `yii\gii\generators\model\Generator` `generateProperties` protected (claudejanz)
|
||||
- Enh #319: Added `@throws` tags for 404 exceptions in CRUD actions (and800)
|
||||
- Enh: `yii\gii\Module::defaultVersion()` implemented to pick up 'yiisoft/yii2-gii' extension version (klimov-paul)
|
||||
- Chg #246: Changed the way CRUD generator translates "Update X id". Now it's a whole string because of translation difficulties (bscheshirwork)
|
||||
|
||||
|
||||
2.0.5 March 18, 2016
|
||||
--------------------
|
||||
|
||||
- Bug #66: It was impossible to use tables with spaces (cornernote)
|
||||
- Bug #79: There was no form element to toggle using schema name for class name (phpniki)
|
||||
- Bug #83: Files were overwritten regardless of answers in console Gii (chernyshev, jeicd)
|
||||
- Bug #104: Allow reuse of the Gii Module for running multiple actions (cebe)
|
||||
- Bug #109: Exception was thrown when `yii\rest\UrlRule` was used in `UrlManager::ruleConfig` (lichunqiang)
|
||||
- Bug #116: Added table prefix autoremoving from the generated model className (umanamente, silverfire)
|
||||
- Bug #134: Model generator was not validating ActiveQuery namespace (zetamen)
|
||||
- Enh #20: Added support for composite (multi-column) foreign keys in junction tables (nineinchnick)
|
||||
- Enh #34: Model generator now skips FKs pointing to non-existing tables (samdark)
|
||||
- Enh #42: Entire preview code now can be copied by pressing CTRL+C (thiagotalma, samdark)
|
||||
- Enh #54: Model generator is now able to generate reverse relations (nineinchnick)
|
||||
- Enh #56: Model generator now generates exist rules based on table foreign keys (Faryshta, samdark)
|
||||
- Enh #95: More parameters are now available in `query.php` view of model generator (demisang)
|
||||
- Enh #99: Added `enablePjax` option to wrap GridView with Pjax (Faryshta, silverfire)
|
||||
- Enh #135: Footer now sticks to the bottom of the page (zetamen)
|
||||
- Chg #38: Added compatibility with latest Typeahead version (razvanphp)
|
||||
|
||||
|
||||
2.0.4 May 10, 2015
|
||||
------------------
|
||||
|
||||
- Bug #5098: Properly detect hasOne relations (nineinchnick)
|
||||
- Bug #6667: Gii form generator rendering mistake view (pana1990)
|
||||
- Bug (CVE-2015-3397): Using `Json::htmlEncode()` for safer JSON data encoding in HTML code (samdark, Tomasz Tokarski)
|
||||
- Enh #2109: Added ability to generate ActiveQuery class for model (klimov-paul)
|
||||
- Enh #7830: Added ability to detect relations between multiple schemas (nineinchnick)
|
||||
|
||||
|
||||
2.0.3 March 01, 2015
|
||||
--------------------
|
||||
|
||||
- Chg #7328: Changed the way CRUD generator translates "Create X". Now it's a whole string because of translation difficulties (samdark)
|
||||
|
||||
|
||||
2.0.2 January 11, 2015
|
||||
----------------------
|
||||
|
||||
- Bug #6463: The Gii controller generator generates incorrect controller namespace (pana1990)
|
||||
- Enh #3665: Better default behavior for ModelSearch generated by the crud generator (qiangxue, mdmunir)
|
||||
|
||||
|
||||
2.0.1 December 07, 2014
|
||||
-----------------------
|
||||
|
||||
- Bug #5070: Gii controller generator should use controller class name instead of controller ID to specify new controller (qiangxue)
|
||||
- Bug #5745: Gii and debug modules may cause 404 exception when the route contains dashes (qiangxue)
|
||||
- Bug #6367: Added `yii\gii\generators\crud\Generator` to support customizing view path for the generated CRUD controller (qiangxue)
|
||||
- Bug: Gii console command help information does not contain global options (qiangxue)
|
||||
- Enh #5613: Added `--overwrite` option to Gii console command to support overwriting all files (motin, qiangxue)
|
||||
|
||||
|
||||
2.0.0 October 12, 2014
|
||||
----------------------
|
||||
|
||||
- Bug #5408: Gii console command incorrectly reports errors when there is actually no error (qiangxue)
|
||||
- Bug: Fixed table name regression caused by changed introduced in #4971 (samdark)
|
||||
|
||||
|
||||
2.0.0-rc September 27, 2014
|
||||
---------------------------
|
||||
|
||||
- Bug #1263: Fixed the issue that Gii and Debug modules might be affected by incompatible asset manager configuration (qiangxue)
|
||||
- Bug #2314: Gii model generator does not generate correct relation type in some special case (qiangxue)
|
||||
- Bug #3265: Fixed incorrect controller class name validation (suralc)
|
||||
- Bug #3693: Fixed broken Gii preview when a file is unchanged (cebe)
|
||||
- Bug #4410: Fixed Gii to preserve database column order in generated _form.php (kmindi)
|
||||
- Bug #4971: Fixed hardcoded table names in `viaTable` expression in model generator (stepanselyuk)
|
||||
- Enh #2018: Search model is not required anymore in CRUD generator (johonunu)
|
||||
- Enh #3088: The gii module will manage their own URL rules now (qiangxue)
|
||||
- Enh #3222: Added `useTablePrefix` option to the model generator for Gii (horizons2)
|
||||
- Enh #3811: Now Gii model generator makes autocomplete for model class field (mitalcoi)
|
||||
- New #1280: Gii can now be run from command line (schmunk42, cebe, qiangxue)
|
||||
|
||||
|
||||
2.0.0-beta April 13, 2014
|
||||
-------------------------
|
||||
|
||||
- Bug #1405: fixed disambiguation of relation names generated by gii (qiangxue)
|
||||
- Bug #1904: Fixed autocomplete to work with underscore inputs "_" (tonydspaniard)
|
||||
- Bug #2298: Fixed the bug that Gii controller generator did not allow digit in the controller ID (qiangxue)
|
||||
- Bug #2712: Fixed missing id in code file preview url (klevron)
|
||||
- Bug: fixed controller in crud template to avoid returning query in findModel() (cebe)
|
||||
- Enh #1624: generate rules for unique indexes (lucianobaraglia)
|
||||
- Enh #1818: Do not display checkbox column if all rows are empty (johonunu)
|
||||
- Enh #1897: diff markup is now copy paste friendly (samdark)
|
||||
- Enh #2327: better visual representation of changed files, added header and refresh button to diff modal (thiagotalma)
|
||||
- Enh #2491: Added support for using the same base class name of search model and data model in Gii (qiangxue)
|
||||
- Enh #2595: Browse through all generated files using right and left arrows (thiagotalma)
|
||||
- Enh #2633: Keyboard shortcuts to browse through files (thiagotalma)
|
||||
- Enh #2822: possibility to generate I18N messages (lucianobaraglia)
|
||||
- Enh #2843: Option to filter files according to the action. (thiagotalma)
|
||||
|
||||
2.0.0-alpha, December 1, 2013
|
||||
-----------------------------
|
||||
|
||||
- Initial release.
|
||||
29
vendor/yiisoft/yii2-gii/LICENSE.md
vendored
Normal file
29
vendor/yiisoft/yii2-gii/LICENSE.md
vendored
Normal file
@ -0,0 +1,29 @@
|
||||
Copyright © 2008 by Yii Software LLC (http://www.yiisoft.com)
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions
|
||||
are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in
|
||||
the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
* Neither the name of Yii Software LLC nor the names of its
|
||||
contributors may be used to endorse or promote products derived
|
||||
from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||
BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
||||
ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGE.
|
||||
45
vendor/yiisoft/yii2-gii/Makefile
vendored
Normal file
45
vendor/yiisoft/yii2-gii/Makefile
vendored
Normal file
@ -0,0 +1,45 @@
|
||||
|
||||
# default versions to test against
|
||||
# these can be overridden by setting the environment variables in the shell
|
||||
PHP_VERSION=php-5.6.8
|
||||
YII_VERSION=dev-master
|
||||
PGSQL_VERSION=latest
|
||||
|
||||
# ensure all the configuration variables above are in environment of the shell commands below
|
||||
export
|
||||
|
||||
help:
|
||||
@echo "make test - run phpunit tests using a docker environment"
|
||||
@echo "make inspect - connect to the postrges docker container using psql"
|
||||
@echo "make clean - stop docker and remove container"
|
||||
|
||||
test: docker-php docker-pgsql adjust-config
|
||||
composer require "yiisoft/yii2:${YII_VERSION}" --prefer-dist
|
||||
composer install --prefer-dist
|
||||
docker run --rm=true -v $(shell pwd):/var/lib/postgresql/data --link $(shell cat tests/dockerids/pgsql):postgres postgres:${PGSQL_VERSION} sh -c 'psql -h postgres -U postgres -c "CREATE DATABASE yiitest;"; psql -h postgres -U postgres yiitest < /var/lib/postgresql/data/tests/data/pgsql.sql'
|
||||
docker run --rm=true -v $(shell pwd):/opt/test --link $(shell cat tests/dockerids/pgsql):postgres yiitest/php:${PHP_VERSION} phpunit --verbose --color
|
||||
|
||||
adjust-config:
|
||||
echo "<?php \$$config['databases']['pgsql']['dsn'] = 'pgsql:host=postgres;port=5432;dbname=yiitest'; \$$config['databases']['pgsql']['fixture'] = null;" > tests/data/config.local.php
|
||||
|
||||
docker-pgsql: dockerfiles
|
||||
docker pull postgres:${PGSQL_VERSION}
|
||||
docker run -d -P postgres:${PGSQL_VERSION} > tests/dockerids/pgsql
|
||||
sleep 2
|
||||
|
||||
docker-php: dockerfiles
|
||||
cd tests/docker/php && sh build.sh
|
||||
|
||||
dockerfiles:
|
||||
test -d tests/docker || git clone https://github.com/cebe/jenkins-test-docker tests/docker
|
||||
cd tests/docker && git checkout -- . && git pull
|
||||
mkdir -p tests/dockerids
|
||||
|
||||
inspect:
|
||||
docker run -it --rm=true --link $(shell cat tests/dockerids/pgsql):postgres postgres:${PGSQL_VERSION} sh -c 'exec psql -h postgres -U postgres yiitest'
|
||||
|
||||
clean:
|
||||
docker stop $(shell cat tests/dockerids/pgsql)
|
||||
docker rm $(shell cat tests/dockerids/pgsql)
|
||||
rm tests/dockerids/pgsql
|
||||
|
||||
86
vendor/yiisoft/yii2-gii/README.md
vendored
Normal file
86
vendor/yiisoft/yii2-gii/README.md
vendored
Normal file
@ -0,0 +1,86 @@
|
||||
<p align="center">
|
||||
<a href="https://github.com/yiisoft" target="_blank">
|
||||
<img src="https://avatars0.githubusercontent.com/u/993323" height="100px">
|
||||
</a>
|
||||
<h1 align="center">Gii Extension for Yii 2</h1>
|
||||
<br>
|
||||
</p>
|
||||
|
||||
This extension provides a Web-based code generator, called Gii, for [Yii framework 2.0](https://www.yiiframework.com) applications.
|
||||
You can use Gii to quickly generate models, forms, modules, CRUD, etc.
|
||||
|
||||
For license information check the [LICENSE](LICENSE.md)-file.
|
||||
|
||||
Documentation is at [docs/guide/README.md](docs/guide/README.md).
|
||||
|
||||
[](https://packagist.org/packages/yiisoft/yii2-gii)
|
||||
[](https://packagist.org/packages/yiisoft/yii2-gii)
|
||||
[](https://github.com/yiisoft/yii2-gii/actions)
|
||||
|
||||
|
||||
Installation
|
||||
------------
|
||||
|
||||
The preferred way to install this extension is through [composer](https://getcomposer.org/download/).
|
||||
|
||||
Either run
|
||||
|
||||
```
|
||||
php composer.phar require --dev --prefer-dist yiisoft/yii2-gii
|
||||
```
|
||||
|
||||
or add
|
||||
|
||||
```
|
||||
"yiisoft/yii2-gii": "~2.1.0"
|
||||
```
|
||||
|
||||
to the require-dev section of your `composer.json` file.
|
||||
|
||||
|
||||
Usage
|
||||
-----
|
||||
|
||||
Once the extension is installed, simply modify your application configuration as follows:
|
||||
|
||||
```php
|
||||
return [
|
||||
'bootstrap' => ['gii'],
|
||||
'modules' => [
|
||||
'gii' => [
|
||||
'class' => 'yii\gii\Module',
|
||||
],
|
||||
// ...
|
||||
],
|
||||
// ...
|
||||
];
|
||||
```
|
||||
|
||||
You can then access Gii through the following URL:
|
||||
|
||||
```
|
||||
http://localhost/path/to/index.php?r=gii
|
||||
```
|
||||
|
||||
or if you have enabled pretty URLs, you may use the following URL:
|
||||
|
||||
```
|
||||
http://localhost/path/to/index.php/gii
|
||||
```
|
||||
|
||||
Using the same configuration for your console application, you will also be able to access Gii via
|
||||
command line as follows,
|
||||
|
||||
```
|
||||
# change path to your application's base path
|
||||
cd path/to/AppBasePath
|
||||
|
||||
# show help information about Gii
|
||||
yii help gii
|
||||
|
||||
# show help information about the model generator in Gii
|
||||
yii help gii/model
|
||||
|
||||
# generate City model from city table
|
||||
yii gii/model --tableName=city --modelClass=City
|
||||
```
|
||||
56
vendor/yiisoft/yii2-gii/UPGRADE.md
vendored
Normal file
56
vendor/yiisoft/yii2-gii/UPGRADE.md
vendored
Normal file
@ -0,0 +1,56 @@
|
||||
Upgrading Instructions
|
||||
======================
|
||||
|
||||
This file contains the upgrade notes. These notes highlight changes that could break your
|
||||
application when you upgrade the package from one version to another.
|
||||
|
||||
Upgrade to 2.2.0
|
||||
----------------
|
||||
|
||||
* The return value of `generators/model/Generator::checkJunctionTable()` has changed.
|
||||
This will only have an impact if you have extended the `generators/model/Generator` class
|
||||
and use the return value of `checkJunctionTable()`.
|
||||
|
||||
Before version 2.2.0 the return value had the following structure (sample data, content may vary)
|
||||
|
||||
```php
|
||||
[ //list of junctions
|
||||
0 => [ // first junction
|
||||
0 => [ // "left" side of junction
|
||||
0 => 'schema1.multi_pk', //table name
|
||||
'multi_pk_id1' => 'id1', //foreign key
|
||||
'multi_pk_id2' => 'id2', //foreign key
|
||||
],
|
||||
1 => [ // "right" side of junction
|
||||
0 => 'schema1.table1', //table name
|
||||
'table1_id' => 'id', //foreign key
|
||||
],
|
||||
],
|
||||
];
|
||||
```
|
||||
|
||||
Since version 2.2.0 the "left" and "right" side junctions no longer contain the 'foreign key mapping' directly
|
||||
but contains an array of witch index 0 is the 'foreign key mapping' and index 1 the name of the foreign key.
|
||||
(sample data, content may vary)
|
||||
```php
|
||||
[ //list of junctions
|
||||
0 => [ // first junction
|
||||
0 => [ // "left" side of junction
|
||||
0 => [ // foreign key mapping
|
||||
0 => 'schema1.multi_pk', //table name
|
||||
'multi_pk_id1' => 'id1', //foreign key
|
||||
'multi_pk_id2' => 'id2', //foreign key
|
||||
],
|
||||
1 => 'schema1.junction1.j1_multi_pk_fkey' //New: Name of the foreign key
|
||||
],
|
||||
1 => [ // "right" side of junction
|
||||
0 => [ // foreign key mapping
|
||||
0 => 'schema1.table1', //table name
|
||||
'table1_id' => 'id', //foreign key
|
||||
],
|
||||
1 => 'schema1.junction1.j1_table1_fkey' //New: Name of the foreign key
|
||||
],
|
||||
],
|
||||
];
|
||||
```
|
||||
|
||||
80
vendor/yiisoft/yii2-gii/composer.json
vendored
Normal file
80
vendor/yiisoft/yii2-gii/composer.json
vendored
Normal file
@ -0,0 +1,80 @@
|
||||
{
|
||||
"name": "yiisoft/yii2-gii",
|
||||
"description": "The Gii extension for the Yii framework",
|
||||
"keywords": [
|
||||
"yii2",
|
||||
"gii",
|
||||
"code generator",
|
||||
"dev"
|
||||
],
|
||||
"type": "yii2-extension",
|
||||
"license": "BSD-3-Clause",
|
||||
"support": {
|
||||
"issues": "https://github.com/yiisoft/yii2-gii/issues",
|
||||
"forum": "https://www.yiiframework.com/forum/",
|
||||
"wiki": "https://www.yiiframework.com/wiki/",
|
||||
"irc": "ircs://irc.libera.chat:6697/yii",
|
||||
"source": "https://github.com/yiisoft/yii2-gii"
|
||||
},
|
||||
"authors": [
|
||||
{
|
||||
"name": "Qiang Xue",
|
||||
"email": "qiang.xue@gmail.com"
|
||||
}
|
||||
],
|
||||
"minimum-stability": "dev",
|
||||
"require": {
|
||||
"yiisoft/yii2": "~2.0.46",
|
||||
"phpspec/php-diff": "^1.1.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"yiisoft/yii2-coding-standards": "~2.0",
|
||||
"cweagans/composer-patches": "^1.7",
|
||||
"phpunit/phpunit": "4.8.34"
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"yii\\gii\\": "src"
|
||||
}
|
||||
},
|
||||
"autoload-dev": {
|
||||
"psr-4": {
|
||||
"yiiunit\\gii\\": "tests"
|
||||
}
|
||||
},
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "2.0.x-dev"
|
||||
},
|
||||
"composer-exit-on-patch-failure": true,
|
||||
"patches": {
|
||||
"phpunit/phpunit-mock-objects": {
|
||||
"Fix PHP 7 and 8 compatibility": "https://yiisoft.github.io/phpunit-patches/phpunit_mock_objects.patch"
|
||||
},
|
||||
"phpunit/php-file-iterator": {
|
||||
"Fix PHP 8.1 compatibility": "https://yiisoft.github.io/phpunit-patches/phpunit_path_file_iterator.patch"
|
||||
},
|
||||
"phpunit/phpunit": {
|
||||
"Fix PHP 7 compatibility": "https://yiisoft.github.io/phpunit-patches/phpunit_php7.patch",
|
||||
"Fix PHP 8 compatibility": "https://yiisoft.github.io/phpunit-patches/phpunit_php8.patch",
|
||||
"Fix PHP 8.1 compatibility": "https://yiisoft.github.io/phpunit-patches/phpunit_php81.patch"
|
||||
}
|
||||
}
|
||||
},
|
||||
"config": {
|
||||
"process-timeout": 1800,
|
||||
"fxp-asset": {
|
||||
"enabled": false
|
||||
},
|
||||
"allow-plugins": {
|
||||
"cweagans/composer-patches": true,
|
||||
"yiisoft/yii2-composer": true
|
||||
}
|
||||
},
|
||||
"repositories": [
|
||||
{
|
||||
"type": "composer",
|
||||
"url": "https://asset-packagist.org"
|
||||
}
|
||||
]
|
||||
}
|
||||
202
vendor/yiisoft/yii2-gii/src/CodeFile.php
vendored
Normal file
202
vendor/yiisoft/yii2-gii/src/CodeFile.php
vendored
Normal file
@ -0,0 +1,202 @@
|
||||
<?php
|
||||
/**
|
||||
* @link https://www.yiiframework.com/
|
||||
* @copyright Copyright (c) 2008 Yii Software LLC
|
||||
* @license https://www.yiiframework.com/license/
|
||||
*/
|
||||
|
||||
namespace yii\gii;
|
||||
|
||||
use Yii;
|
||||
use yii\base\BaseObject;
|
||||
use yii\gii\components\DiffRendererHtmlInline;
|
||||
use yii\helpers\Html;
|
||||
|
||||
/**
|
||||
* CodeFile represents a code file to be generated.
|
||||
*
|
||||
* @property-read string $relativePath The code file path relative to the application base path.
|
||||
* @property-read string $type The code file extension (e.g. php, txt).
|
||||
*
|
||||
* @author Qiang Xue <qiang.xue@gmail.com>
|
||||
* @since 2.0
|
||||
*/
|
||||
class CodeFile extends BaseObject
|
||||
{
|
||||
/**
|
||||
* The code file is new.
|
||||
*/
|
||||
const OP_CREATE = 'create';
|
||||
/**
|
||||
* The code file already exists, and the new one may need to overwrite it.
|
||||
*/
|
||||
const OP_OVERWRITE = 'overwrite';
|
||||
/**
|
||||
* The new code file and the existing one are identical.
|
||||
*/
|
||||
const OP_SKIP = 'skip';
|
||||
|
||||
/**
|
||||
* @var string an ID that uniquely identifies this code file.
|
||||
*/
|
||||
public $id;
|
||||
/**
|
||||
* @var string the file path that the new code should be saved to.
|
||||
*/
|
||||
public $path;
|
||||
/**
|
||||
* @var string the newly generated code content
|
||||
*/
|
||||
public $content;
|
||||
/**
|
||||
* @var string the operation to be performed. This can be [[OP_CREATE]], [[OP_OVERWRITE]] or [[OP_SKIP]].
|
||||
*/
|
||||
public $operation;
|
||||
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
* @param string $path the file path that the new code should be saved to.
|
||||
* @param string $content the newly generated code content.
|
||||
* @param array $config name-value pairs that will be used to initialize the object properties
|
||||
*/
|
||||
public function __construct($path, $content, $config = [])
|
||||
{
|
||||
parent::__construct($config);
|
||||
|
||||
$this->path = strtr($path, '/\\', DIRECTORY_SEPARATOR . DIRECTORY_SEPARATOR);
|
||||
$this->content = $content;
|
||||
$this->id = md5($this->path);
|
||||
if (is_file($path)) {
|
||||
$this->operation = file_get_contents($path) === $content ? self::OP_SKIP : self::OP_OVERWRITE;
|
||||
} else {
|
||||
$this->operation = self::OP_CREATE;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Saves the code into the file specified by [[path]].
|
||||
* @return string|bool the error occurred while saving the code file, or true if no error.
|
||||
*/
|
||||
public function save()
|
||||
{
|
||||
$module = isset(Yii::$app->controller) ? Yii::$app->controller->module : null;
|
||||
if ($this->operation === self::OP_CREATE) {
|
||||
$dir = dirname($this->path);
|
||||
if (!is_dir($dir)) {
|
||||
if ($module instanceof \yii\gii\Module) {
|
||||
$mask = @umask(0);
|
||||
$result = @mkdir($dir, $module->newDirMode, true);
|
||||
@umask($mask);
|
||||
} else {
|
||||
$result = @mkdir($dir, 0777, true);
|
||||
}
|
||||
if (!$result) {
|
||||
return "Unable to create the directory '$dir'.";
|
||||
}
|
||||
}
|
||||
}
|
||||
if (@file_put_contents($this->path, $this->content) === false) {
|
||||
return "Unable to write the file '{$this->path}'.";
|
||||
}
|
||||
|
||||
if ($module instanceof \yii\gii\Module) {
|
||||
$mask = @umask(0);
|
||||
@chmod($this->path, $module->newFileMode);
|
||||
@umask($mask);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string the code file path relative to the application base path.
|
||||
*/
|
||||
public function getRelativePath()
|
||||
{
|
||||
if (strpos($this->path, Yii::$app->basePath) === 0) {
|
||||
return substr($this->path, strlen(Yii::$app->basePath) + 1);
|
||||
}
|
||||
|
||||
return $this->path;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string the code file extension (e.g. php, txt)
|
||||
*/
|
||||
public function getType()
|
||||
{
|
||||
if (($pos = strrpos($this->path, '.')) !== false) {
|
||||
return substr($this->path, $pos + 1);
|
||||
}
|
||||
|
||||
return 'unknown';
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns preview or false if it cannot be rendered
|
||||
*
|
||||
* @return bool|string
|
||||
*/
|
||||
public function preview()
|
||||
{
|
||||
if (($pos = strrpos($this->path, '.')) !== false) {
|
||||
$type = substr($this->path, $pos + 1);
|
||||
} else {
|
||||
$type = 'unknown';
|
||||
}
|
||||
|
||||
if ($type === 'php') {
|
||||
return highlight_string($this->content, true);
|
||||
} elseif (!in_array($type, ['jpg', 'gif', 'png', 'exe'])) {
|
||||
return nl2br(Html::encode($this->content));
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns diff or false if it cannot be calculated
|
||||
*
|
||||
* @return bool|string
|
||||
*/
|
||||
public function diff()
|
||||
{
|
||||
$type = strtolower($this->getType());
|
||||
if (in_array($type, ['jpg', 'gif', 'png', 'exe'])) {
|
||||
return false;
|
||||
} elseif ($this->operation === self::OP_OVERWRITE) {
|
||||
return $this->renderDiff(file($this->path), $this->content);
|
||||
}
|
||||
|
||||
return '';
|
||||
}
|
||||
|
||||
/**
|
||||
* Renders diff between two sets of lines
|
||||
*
|
||||
* @param mixed $lines1
|
||||
* @param mixed $lines2
|
||||
* @return string
|
||||
*/
|
||||
private function renderDiff($lines1, $lines2)
|
||||
{
|
||||
if (!is_array($lines1)) {
|
||||
$lines1 = explode("\n", $lines1);
|
||||
}
|
||||
if (!is_array($lines2)) {
|
||||
$lines2 = explode("\n", $lines2);
|
||||
}
|
||||
foreach ($lines1 as $i => $line) {
|
||||
$lines1[$i] = rtrim($line, "\r\n");
|
||||
}
|
||||
foreach ($lines2 as $i => $line) {
|
||||
$lines2[$i] = rtrim($line, "\r\n");
|
||||
}
|
||||
|
||||
$renderer = new DiffRendererHtmlInline();
|
||||
$diff = new \Diff($lines1, $lines2);
|
||||
|
||||
return $diff->render($renderer);
|
||||
}
|
||||
}
|
||||
535
vendor/yiisoft/yii2-gii/src/Generator.php
vendored
Normal file
535
vendor/yiisoft/yii2-gii/src/Generator.php
vendored
Normal file
@ -0,0 +1,535 @@
|
||||
<?php
|
||||
/**
|
||||
* @link https://www.yiiframework.com/
|
||||
* @copyright Copyright (c) 2008 Yii Software LLC
|
||||
* @license https://www.yiiframework.com/license/
|
||||
*/
|
||||
|
||||
namespace yii\gii;
|
||||
|
||||
use Yii;
|
||||
use ReflectionClass;
|
||||
use yii\base\InvalidConfigException;
|
||||
use yii\base\Model;
|
||||
use yii\helpers\VarDumper;
|
||||
use yii\web\View;
|
||||
|
||||
/**
|
||||
* This is the base class for all generator classes.
|
||||
*
|
||||
* A generator instance is responsible for taking user inputs, validating them,
|
||||
* and using them to generate the corresponding code based on a set of code template files.
|
||||
*
|
||||
* A generator class typically needs to implement the following methods:
|
||||
*
|
||||
* - [[getName()]]: returns the name of the generator
|
||||
* - [[getDescription()]]: returns the detailed description of the generator
|
||||
* - [[requiredTemplates()]] returns the required template files
|
||||
* - [[generate()]]: generates the code based on the current user input and the specified code template files.
|
||||
* This is the place where main code generation code resides.
|
||||
*
|
||||
* @property-read string $name The name of the generator.
|
||||
* @property-read string $description The detailed description of the generator.
|
||||
* @property-read string $stickyDataFile The file path that stores the sticky attribute values.
|
||||
* @property-read string $templatePath The root path of the template files that are currently being used.
|
||||
*
|
||||
* @author Qiang Xue <qiang.xue@gmail.com>
|
||||
* @since 2.0
|
||||
*/
|
||||
abstract class Generator extends Model
|
||||
{
|
||||
/**
|
||||
* @var array[] a list of available code templates. The array keys are the template names,
|
||||
* the array values are the corresponding template paths or path aliases.
|
||||
*/
|
||||
public $templates = [];
|
||||
/**
|
||||
* @var string the name of the code template that the user has selected.
|
||||
* The value of this property is internally managed by this class.
|
||||
*/
|
||||
public $template = 'default';
|
||||
/**
|
||||
* @var bool whether the strings will be generated using `Yii::t()` or PHP strings.
|
||||
*/
|
||||
public $enableI18N = false;
|
||||
/**
|
||||
* @var string the message category used by `Yii::t()` when `$enableI18N` is `true`, defaults to `app`.
|
||||
*/
|
||||
public $messageCategory = 'app';
|
||||
|
||||
|
||||
/**
|
||||
* Returns the name of the code generator.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
abstract public function getName();
|
||||
|
||||
/**
|
||||
* Generates the code based on the current user input and the specified code template files.
|
||||
* Please refer to [[\yii\gii\generators\controller\Generator::generate()]] as an example on
|
||||
* how to implement this method.
|
||||
*
|
||||
* @return CodeFile[] a list of code files to be created.
|
||||
*/
|
||||
abstract public function generate();
|
||||
|
||||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
public function init()
|
||||
{
|
||||
parent::init();
|
||||
if (!isset($this->templates['default'])) {
|
||||
$this->templates['default'] = $this->defaultTemplate();
|
||||
}
|
||||
foreach ($this->templates as $i => $template) {
|
||||
$this->templates[$i] = Yii::getAlias($template);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
public function attributeLabels()
|
||||
{
|
||||
return [
|
||||
'template' => 'Template/view group',
|
||||
'enableI18N' => 'Enable I18N',
|
||||
'messageCategory' => 'Message Category',
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a list of code template files that are required.
|
||||
* Derived classes usually should override this method if they require the existence of
|
||||
* certain template files.
|
||||
* @return array list of code template files that are required. They should be file paths
|
||||
* relative to [[templatePath]].
|
||||
*/
|
||||
public function requiredTemplates()
|
||||
{
|
||||
return [];
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the list of sticky attributes.
|
||||
* A sticky attribute will remember its value and will initialize the attribute with this value
|
||||
* when the generator is restarted.
|
||||
* @return array list of sticky attributes
|
||||
*/
|
||||
public function stickyAttributes()
|
||||
{
|
||||
return ['template', 'enableI18N', 'messageCategory'];
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the list of hint messages.
|
||||
* The array keys are the attribute names, and the array values are the corresponding hint messages.
|
||||
* Hint messages will be displayed to end users when they are filling the form for the generator.
|
||||
* @return array the list of hint messages
|
||||
*/
|
||||
public function hints()
|
||||
{
|
||||
return [
|
||||
'enableI18N' => 'This indicates whether the generator should generate strings using <code>Yii::t()</code> method.
|
||||
Set this to <code>true</code> if you are planning to make your application translatable.',
|
||||
'messageCategory' => 'This is the category used by <code>Yii::t()</code> in case you enable I18N.',
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the list of auto complete values.
|
||||
* The array keys are the attribute names, and the array values are the corresponding auto complete values.
|
||||
* Auto complete values can also be callable typed in order one want to make postponed data generation.
|
||||
* @return array[] the list of auto complete values
|
||||
*/
|
||||
public function autoCompleteData()
|
||||
{
|
||||
return [];
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the message to be displayed when the newly generated code is saved successfully.
|
||||
* Child classes may override this method to customize the message.
|
||||
* @return string the message to be displayed when the newly generated code is saved successfully.
|
||||
*/
|
||||
public function successMessage()
|
||||
{
|
||||
return 'The code has been generated successfully.';
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the view file for the input form of the generator.
|
||||
* The default implementation will return the "form.php" file under the directory
|
||||
* that contains the generator class file.
|
||||
* @return string the view file for the input form of the generator.
|
||||
*/
|
||||
public function formView()
|
||||
{
|
||||
$class = new ReflectionClass($this);
|
||||
|
||||
return dirname($class->getFileName()) . '/form.php';
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the root path to the default code template files.
|
||||
* The default implementation will return the "templates" subdirectory of the
|
||||
* directory containing the generator class file.
|
||||
* @return string the root path to the default code template files.
|
||||
*/
|
||||
public function defaultTemplate()
|
||||
{
|
||||
$class = new ReflectionClass($this);
|
||||
|
||||
return dirname($class->getFileName()) . '/default';
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the detailed description of the generator.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getDescription()
|
||||
{
|
||||
return '';
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*
|
||||
* Child classes should override this method like the following so that the parent
|
||||
* rules are included:
|
||||
*
|
||||
* ~~~php
|
||||
* return array_merge(parent::rules(), [
|
||||
* ...rules for the child class...
|
||||
* ]);
|
||||
* ~~~
|
||||
*/
|
||||
public function rules()
|
||||
{
|
||||
return [
|
||||
[['template'], 'required', 'message' => 'A code template must be selected.'],
|
||||
[['template'], 'validateTemplate'],
|
||||
[['enableI18N'], 'boolean'],
|
||||
[['messageCategory'], 'string'],
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads sticky attributes from an internal file and populates them into the generator.
|
||||
* @internal
|
||||
*/
|
||||
public function loadStickyAttributes()
|
||||
{
|
||||
$stickyAttributes = $this->stickyAttributes();
|
||||
$path = $this->getStickyDataFile();
|
||||
if (is_file($path)) {
|
||||
$result = json_decode(file_get_contents($path), true);
|
||||
if (is_array($result)) {
|
||||
foreach ($stickyAttributes as $name) {
|
||||
if (isset($result[$name])) {
|
||||
$this->$name = $result[$name];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Saves sticky attributes into an internal file.
|
||||
* @internal
|
||||
*/
|
||||
public function saveStickyAttributes()
|
||||
{
|
||||
$stickyAttributes = $this->stickyAttributes();
|
||||
$stickyAttributes[] = 'template';
|
||||
$values = [];
|
||||
foreach ($stickyAttributes as $name) {
|
||||
$values[$name] = $this->$name;
|
||||
}
|
||||
$path = $this->getStickyDataFile();
|
||||
@mkdir(dirname($path), 0755, true);
|
||||
file_put_contents($path, json_encode($values));
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the file path that stores the sticky attribute values.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getStickyDataFile()
|
||||
{
|
||||
return Yii::$app->getRuntimePath() . '/gii-' . Yii::getVersion() . '/' . str_replace('\\', '-', get_class($this)) . '.json';
|
||||
}
|
||||
|
||||
/**
|
||||
* Saves the generated code into files.
|
||||
* @param CodeFile[] $files the code files to be saved
|
||||
* @param array $answers
|
||||
* @param string $results this parameter receives a value from this method indicating the log messages
|
||||
* generated while saving the code files.
|
||||
* @return bool whether files are successfully saved without any error.
|
||||
*/
|
||||
public function save($files, $answers, &$results)
|
||||
{
|
||||
$lines = ['Generating code using template "' . $this->getTemplatePath() . '"...'];
|
||||
$hasError = false;
|
||||
foreach ($files as $file) {
|
||||
$relativePath = $file->getRelativePath();
|
||||
if (isset($answers[$file->id]) && !empty($answers[$file->id]) && $file->operation !== CodeFile::OP_SKIP) {
|
||||
$error = $file->save();
|
||||
if (is_string($error)) {
|
||||
$hasError = true;
|
||||
$lines[] = "generating $relativePath\n<span class=\"error\">$error</span>";
|
||||
} else {
|
||||
$lines[] = $file->operation === CodeFile::OP_CREATE ? " generated $relativePath" : " overwrote $relativePath";
|
||||
}
|
||||
} else {
|
||||
$lines[] = " skipped $relativePath";
|
||||
}
|
||||
}
|
||||
$lines[] = "done!\n";
|
||||
$results = implode("\n", $lines);
|
||||
|
||||
return !$hasError;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string the root path of the template files that are currently being used.
|
||||
* @throws InvalidConfigException if [[template]] is invalid
|
||||
*/
|
||||
public function getTemplatePath()
|
||||
{
|
||||
if (isset($this->templates[$this->template])) {
|
||||
return $this->templates[$this->template];
|
||||
}
|
||||
|
||||
throw new InvalidConfigException("Unknown template: {$this->template}");
|
||||
}
|
||||
|
||||
/**
|
||||
* Generates code using the specified code template and parameters.
|
||||
* Note that the code template will be used as a PHP file.
|
||||
* @param string $template the code template file. This must be specified as a file path
|
||||
* relative to [[templatePath]].
|
||||
* @param array $params list of parameters to be passed to the template file.
|
||||
* @return string the generated code
|
||||
*/
|
||||
public function render($template, $params = [])
|
||||
{
|
||||
$view = new View();
|
||||
$params['generator'] = $this;
|
||||
|
||||
return $view->renderFile($this->getTemplatePath() . '/' . $template, $params, $this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Validates the template selection.
|
||||
* This method validates whether the user selects an existing template
|
||||
* and the template contains all required template files as specified in [[requiredTemplates()]].
|
||||
*/
|
||||
public function validateTemplate()
|
||||
{
|
||||
$templates = $this->templates;
|
||||
if (!isset($templates[$this->template])) {
|
||||
$this->addError('template', 'Invalid template selection.');
|
||||
} else {
|
||||
$templatePath = $this->templates[$this->template];
|
||||
foreach ($this->requiredTemplates() as $template) {
|
||||
if (!is_file(Yii::getAlias($templatePath . '/' . $template))) {
|
||||
$this->addError('template', "Unable to find the required code template file '$template'.");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* An inline validator that checks if the attribute value refers to an existing class name.
|
||||
* If the `extends` option is specified, it will also check if the class is a child class
|
||||
* of the class represented by the `extends` option.
|
||||
* @param string $attribute the attribute being validated
|
||||
* @param array $params the validation options
|
||||
*/
|
||||
public function validateClass($attribute, $params)
|
||||
{
|
||||
$class = $this->$attribute;
|
||||
try {
|
||||
if (class_exists($class)) {
|
||||
if (isset($params['extends'])) {
|
||||
if (ltrim($class, '\\') !== ltrim($params['extends'], '\\') && !is_subclass_of($class, $params['extends'])) {
|
||||
$this->addError($attribute, "'$class' must extend from {$params['extends']} or its child class.");
|
||||
}
|
||||
}
|
||||
} else {
|
||||
$this->addError($attribute, "Class '$class' does not exist or has syntax error.");
|
||||
}
|
||||
} catch (\Exception $e) {
|
||||
$this->addError($attribute, "Class '$class' does not exist or has syntax error.");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* An inline validator that checks if the attribute value refers to a valid namespaced class name.
|
||||
* The validator will check if the directory containing the new class file exist or not.
|
||||
* @param string $attribute the attribute being validated
|
||||
* @param array $params the validation options
|
||||
*/
|
||||
public function validateNewClass($attribute, $params)
|
||||
{
|
||||
$class = ltrim($this->$attribute, '\\');
|
||||
if (($pos = strrpos($class, '\\')) === false) {
|
||||
$this->addError($attribute, "The class name must contain fully qualified namespace name.");
|
||||
} else {
|
||||
$ns = substr($class, 0, $pos);
|
||||
$path = Yii::getAlias('@' . str_replace('\\', '/', $ns), false);
|
||||
if ($path === false) {
|
||||
$this->addError($attribute, "The class namespace is invalid: $ns");
|
||||
} elseif (!is_dir($path)) {
|
||||
$this->addError($attribute, "Please make sure the directory containing this class exists: $path");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if message category is not empty when I18N is enabled.
|
||||
*/
|
||||
public function validateMessageCategory()
|
||||
{
|
||||
if ($this->enableI18N) {
|
||||
if (empty($this->messageCategory)) {
|
||||
$this->addError('messageCategory', 'Message Category cannot be blank.');
|
||||
} elseif (!preg_match('~^[\w./-]+$~', $this->messageCategory)) {
|
||||
$this->addError('messageCategory', 'Message Category is not valid. It should contain only alphanumeric characters, ".", "-", "/", and "_".');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $value the attribute to be validated
|
||||
* @return bool whether the value is a reserved PHP keyword.
|
||||
*/
|
||||
public function isReservedKeyword($value)
|
||||
{
|
||||
static $keywords = [
|
||||
'__class__',
|
||||
'__dir__',
|
||||
'__file__',
|
||||
'__function__',
|
||||
'__line__',
|
||||
'__method__',
|
||||
'__namespace__',
|
||||
'__trait__',
|
||||
'abstract',
|
||||
'and',
|
||||
'array',
|
||||
'as',
|
||||
'break',
|
||||
'case',
|
||||
'catch',
|
||||
'callable',
|
||||
'cfunction',
|
||||
'class',
|
||||
'clone',
|
||||
'const',
|
||||
'continue',
|
||||
'declare',
|
||||
'default',
|
||||
'die',
|
||||
'do',
|
||||
'echo',
|
||||
'else',
|
||||
'elseif',
|
||||
'empty',
|
||||
'enddeclare',
|
||||
'endfor',
|
||||
'endforeach',
|
||||
'endif',
|
||||
'endswitch',
|
||||
'endwhile',
|
||||
'eval',
|
||||
'exception',
|
||||
'exit',
|
||||
'extends',
|
||||
'final',
|
||||
'finally',
|
||||
'for',
|
||||
'foreach',
|
||||
'function',
|
||||
'fn',
|
||||
'global',
|
||||
'goto',
|
||||
'if',
|
||||
'implements',
|
||||
'include',
|
||||
'include_once',
|
||||
'instanceof',
|
||||
'insteadof',
|
||||
'interface',
|
||||
'isset',
|
||||
'list',
|
||||
'namespace',
|
||||
'new',
|
||||
'old_function',
|
||||
'or',
|
||||
'parent',
|
||||
'php_user_filter',
|
||||
'print',
|
||||
'private',
|
||||
'protected',
|
||||
'public',
|
||||
'require',
|
||||
'require_once',
|
||||
'return',
|
||||
'static',
|
||||
'switch',
|
||||
'this',
|
||||
'throw',
|
||||
'trait',
|
||||
'try',
|
||||
'unset',
|
||||
'use',
|
||||
'var',
|
||||
'while',
|
||||
'xor',
|
||||
'yield'
|
||||
];
|
||||
|
||||
return in_array(strtolower($value), $keywords, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Generates a string depending on the `$enableI18N` property
|
||||
*
|
||||
* @param string $string the text be generated
|
||||
* @param array $placeholders the placeholders to use by `Yii::t()`
|
||||
* @return string
|
||||
*/
|
||||
public function generateString($string = '', $placeholders = [])
|
||||
{
|
||||
$string = addslashes($string);
|
||||
if ($this->enableI18N) {
|
||||
// If there are placeholders, use them
|
||||
if (!empty($placeholders)) {
|
||||
$ph = ', ' . VarDumper::export($placeholders);
|
||||
} else {
|
||||
$ph = '';
|
||||
}
|
||||
$str = "Yii::t('" . $this->messageCategory . "', '" . $string . "'" . $ph . ")";
|
||||
} else {
|
||||
// No I18N, replace placeholders by real words, if any
|
||||
if (!empty($placeholders)) {
|
||||
$phKeys = array_map(function($word) {
|
||||
return '{' . $word . '}';
|
||||
}, array_keys($placeholders));
|
||||
$phValues = array_values($placeholders);
|
||||
$str = "'" . str_replace($phKeys, $phValues, $string) . "'";
|
||||
} else {
|
||||
// No placeholders, just the given string
|
||||
$str = "'" . $string . "'";
|
||||
}
|
||||
}
|
||||
return $str;
|
||||
}
|
||||
}
|
||||
31
vendor/yiisoft/yii2-gii/src/GiiAsset.php
vendored
Normal file
31
vendor/yiisoft/yii2-gii/src/GiiAsset.php
vendored
Normal file
@ -0,0 +1,31 @@
|
||||
<?php
|
||||
/**
|
||||
* @link https://www.yiiframework.com/
|
||||
* @copyright Copyright (c) 2008 Yii Software LLC
|
||||
* @license https://www.yiiframework.com/license/
|
||||
*/
|
||||
|
||||
namespace yii\gii;
|
||||
|
||||
use yii\web\AssetBundle;
|
||||
|
||||
/**
|
||||
* This declares the asset files required by Gii.
|
||||
*
|
||||
* @author Qiang Xue <qiang.xue@gmail.com>
|
||||
* @since 2.0
|
||||
*/
|
||||
class GiiAsset extends AssetBundle
|
||||
{
|
||||
public $sourcePath = '@yii/gii/assets';
|
||||
public $css = [
|
||||
'css/main.css',
|
||||
];
|
||||
public $js = [
|
||||
'js/bs4-native.min.js',
|
||||
'js/gii.js',
|
||||
];
|
||||
public $depends = [
|
||||
'yii\web\YiiAsset'
|
||||
];
|
||||
}
|
||||
197
vendor/yiisoft/yii2-gii/src/Module.php
vendored
Normal file
197
vendor/yiisoft/yii2-gii/src/Module.php
vendored
Normal file
@ -0,0 +1,197 @@
|
||||
<?php
|
||||
/**
|
||||
* @link https://www.yiiframework.com/
|
||||
* @copyright Copyright (c) 2008 Yii Software LLC
|
||||
* @license https://www.yiiframework.com/license/
|
||||
*/
|
||||
|
||||
namespace yii\gii;
|
||||
|
||||
use Yii;
|
||||
use yii\base\BootstrapInterface;
|
||||
use yii\helpers\IpHelper;
|
||||
use yii\helpers\Json;
|
||||
use yii\web\ForbiddenHttpException;
|
||||
|
||||
/**
|
||||
* This is the main module class for the Gii module.
|
||||
*
|
||||
* To use Gii, include it as a module in the application configuration like the following:
|
||||
*
|
||||
* ~~~
|
||||
* return [
|
||||
* 'bootstrap' => ['gii'],
|
||||
* 'modules' => [
|
||||
* 'gii' => ['class' => 'yii\gii\Module'],
|
||||
* ],
|
||||
* ]
|
||||
* ~~~
|
||||
*
|
||||
* Because Gii generates new code files on the server, you should only use it on your own
|
||||
* development machine. To prevent other people from using this module, by default, Gii
|
||||
* can only be accessed by localhost. You may configure its [[allowedIPs]] property if
|
||||
* you want to make it accessible on other machines.
|
||||
*
|
||||
* With the above configuration, you will be able to access GiiModule in your browser using
|
||||
* the URL `http://localhost/path/to/index.php?r=gii`
|
||||
*
|
||||
* If your application enables [[\yii\web\UrlManager::enablePrettyUrl|pretty URLs]],
|
||||
* you can then access Gii via URL: `http://localhost/path/to/index.php/gii`
|
||||
*
|
||||
* @author Qiang Xue <qiang.xue@gmail.com>
|
||||
* @since 2.0
|
||||
*/
|
||||
class Module extends \yii\base\Module implements BootstrapInterface
|
||||
{
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public $controllerNamespace = 'yii\gii\controllers';
|
||||
/**
|
||||
* @var array the list of IPs that are allowed to access this module.
|
||||
* Each array element represents a single IP filter which can be either:
|
||||
* - an IP address (e.g. 1.2.3.4),
|
||||
* - an address with wildcard (e.g. 192.168.0.*) to represent a network segment
|
||||
* - a CIDR range (e.g. 172.16.0.0/12) (available since version 2.2.3).
|
||||
* The default value is `['127.0.0.1', '::1']`, which means the module can only be accessed
|
||||
* by localhost.
|
||||
*/
|
||||
public $allowedIPs = ['127.0.0.1', '::1'];
|
||||
/**
|
||||
* @var array|Generator[] a list of generator configurations or instances. The array keys
|
||||
* are the generator IDs (e.g. "crud"), and the array elements are the corresponding generator
|
||||
* configurations or the instances.
|
||||
*
|
||||
* After the module is initialized, this property will become an array of generator instances
|
||||
* which are created based on the configurations previously taken by this property.
|
||||
*
|
||||
* Newly assigned generators will be merged with the [[coreGenerators()|core ones]], and the former
|
||||
* takes precedence in case when they have the same generator ID.
|
||||
*/
|
||||
public $generators = [];
|
||||
/**
|
||||
* @var int the permission to be set for newly generated code files.
|
||||
* This value will be used by PHP chmod function.
|
||||
* Defaults to 0666, meaning the file is read-writable by all users.
|
||||
*/
|
||||
public $newFileMode = 0666;
|
||||
/**
|
||||
* @var int the permission to be set for newly generated directories.
|
||||
* This value will be used by PHP chmod function.
|
||||
* Defaults to 0777, meaning the directory can be read, written and executed by all users.
|
||||
*/
|
||||
public $newDirMode = 0777;
|
||||
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function bootstrap($app)
|
||||
{
|
||||
if ($app instanceof \yii\web\Application) {
|
||||
$app->getUrlManager()->addRules([
|
||||
['class' => 'yii\web\UrlRule', 'pattern' => $this->id, 'route' => $this->id . '/default/index'],
|
||||
['class' => 'yii\web\UrlRule', 'pattern' => $this->id . '/<id:\w+>', 'route' => $this->id . '/default/view'],
|
||||
['class' => 'yii\web\UrlRule', 'pattern' => $this->id . '/<controller:[\w\-]+>/<action:[\w\-]+>', 'route' => $this->id . '/<controller>/<action>'],
|
||||
], false);
|
||||
} elseif ($app instanceof \yii\console\Application) {
|
||||
$app->controllerMap[$this->id] = [
|
||||
'class' => 'yii\gii\console\GenerateController',
|
||||
'generators' => array_merge($this->coreGenerators(), $this->generators),
|
||||
'module' => $this,
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function beforeAction($action)
|
||||
{
|
||||
if (!parent::beforeAction($action)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (Yii::$app instanceof \yii\web\Application && !$this->checkAccess()) {
|
||||
throw new ForbiddenHttpException('You are not allowed to access this page.');
|
||||
}
|
||||
|
||||
foreach (array_merge($this->coreGenerators(), $this->generators) as $id => $config) {
|
||||
if (is_object($config)) {
|
||||
$this->generators[$id] = $config;
|
||||
} else {
|
||||
$this->generators[$id] = Yii::createObject($config);
|
||||
}
|
||||
}
|
||||
|
||||
$this->resetGlobalSettings();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Resets potentially incompatible global settings done in app config.
|
||||
*/
|
||||
protected function resetGlobalSettings()
|
||||
{
|
||||
if (Yii::$app instanceof \yii\web\Application) {
|
||||
Yii::$app->assetManager->bundles = [];
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @return int whether the module can be accessed by the current user
|
||||
*/
|
||||
protected function checkAccess()
|
||||
{
|
||||
$ip = Yii::$app->getRequest()->getUserIP();
|
||||
foreach ($this->allowedIPs as $filter) {
|
||||
if ($filter === '*'
|
||||
|| $filter === $ip
|
||||
|| (
|
||||
($pos = strpos($filter, '*')) !== false
|
||||
&& !strncmp($ip, $filter, $pos)
|
||||
)
|
||||
|| (
|
||||
strpos($filter, '/') !== false
|
||||
&& IpHelper::inRange($ip, $filter)
|
||||
)
|
||||
) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
Yii::warning('Access to Gii is denied due to IP address restriction. The requested IP is ' . $ip, __METHOD__);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the list of the core code generator configurations.
|
||||
* @return array the list of the core code generator configurations.
|
||||
*/
|
||||
protected function coreGenerators()
|
||||
{
|
||||
return [
|
||||
'model' => ['class' => 'yii\gii\generators\model\Generator'],
|
||||
'crud' => ['class' => 'yii\gii\generators\crud\Generator'],
|
||||
'controller' => ['class' => 'yii\gii\generators\controller\Generator'],
|
||||
'form' => ['class' => 'yii\gii\generators\form\Generator'],
|
||||
'module' => ['class' => 'yii\gii\generators\module\Generator'],
|
||||
'extension' => ['class' => 'yii\gii\generators\extension\Generator'],
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
* @since 2.0.6
|
||||
*/
|
||||
protected function defaultVersion()
|
||||
{
|
||||
$packageInfo = Json::decode(file_get_contents(dirname(__DIR__) . DIRECTORY_SEPARATOR . 'composer.json'));
|
||||
$extensionName = $packageInfo['name'];
|
||||
if (isset(Yii::$app->extensions[$extensionName])) {
|
||||
return Yii::$app->extensions[$extensionName]['version'];
|
||||
}
|
||||
return parent::defaultVersion();
|
||||
}
|
||||
}
|
||||
2
vendor/yiisoft/yii2-gii/src/assets/css/main.css
vendored
Normal file
2
vendor/yiisoft/yii2-gii/src/assets/css/main.css
vendored
Normal file
File diff suppressed because one or more lines are too long
7
vendor/yiisoft/yii2-gii/src/assets/css/main.css.map
vendored
Normal file
7
vendor/yiisoft/yii2-gii/src/assets/css/main.css.map
vendored
Normal file
File diff suppressed because one or more lines are too long
3
vendor/yiisoft/yii2-gii/src/assets/js/bs4-native.min.js
vendored
Normal file
3
vendor/yiisoft/yii2-gii/src/assets/js/bs4-native.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
297
vendor/yiisoft/yii2-gii/src/assets/js/gii.js
vendored
Normal file
297
vendor/yiisoft/yii2-gii/src/assets/js/gii.js
vendored
Normal file
@ -0,0 +1,297 @@
|
||||
yii.gii = (function ($) {
|
||||
|
||||
var $clipboardContainer = $("#clipboard-container"),
|
||||
valueToCopy = '',
|
||||
ajaxRequest = null,
|
||||
|
||||
onKeydown = function(e) {
|
||||
var $target;
|
||||
$target = $(e.target);
|
||||
|
||||
if ($target.is("input:visible, textarea:visible")) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (typeof window.getSelection === "function" && window.getSelection().toString()) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (document.selection != null && document.selection.createRange().text) {
|
||||
return;
|
||||
}
|
||||
|
||||
$clipboardContainer.empty().show();
|
||||
return $("<textarea id='clipboard'></textarea>").val(valueToCopy).appendTo($clipboardContainer).focus().select();
|
||||
},
|
||||
|
||||
onKeyup = function(e) {
|
||||
if ($(e.target).is("#clipboard")) {
|
||||
$("#clipboard-container").empty().hide();
|
||||
}
|
||||
return true;
|
||||
};
|
||||
|
||||
var initStickyInputs = function () {
|
||||
$('.sticky:not(.error)').find('input[type="text"],select,textarea').each(function () {
|
||||
var value,
|
||||
element = document.createElement('div');
|
||||
if (this.tagName === 'SELECT') {
|
||||
value = this.options[this.selectedIndex].text;
|
||||
} else if (this.tagName === 'TEXTAREA') {
|
||||
value = $(this).html();
|
||||
} else {
|
||||
value = $(this).val();
|
||||
}
|
||||
if (value === '') {
|
||||
value = '[empty]';
|
||||
}
|
||||
element.classList.add('sticky-value');
|
||||
element.title = value;
|
||||
element.innerText = value;
|
||||
new Tooltip(element, {placement: 'right'});
|
||||
$(this).before(element).hide();
|
||||
});
|
||||
$('.sticky-value').on('click', function () {
|
||||
$(this).hide();
|
||||
$(this).next().show().get(0).focus();
|
||||
});
|
||||
};
|
||||
|
||||
var fillModal = function($link, data) {
|
||||
var $modal = $('#preview-modal'),
|
||||
$modalBody = $modal.find('.modal-body');
|
||||
if (!$link.hasClass('modal-refresh')) {
|
||||
var filesSelector = 'a.' + $modal.data('action') + ':visible';
|
||||
var $files = $(filesSelector);
|
||||
var index = $files.filter('[href="' + $link.attr('href') + '"]').index(filesSelector);
|
||||
var $prev = $files.eq(index - 1);
|
||||
var $next = $files.eq((index + 1 == $files.length ? 0 : index + 1));
|
||||
$modal.data('current', $files.eq(index));
|
||||
$modal.find('.modal-previous').attr('href', $prev.attr('href')).data('title', $prev.data('title'));
|
||||
$modal.find('.modal-next').attr('href', $next.attr('href')).data('title', $next.data('title'));
|
||||
}
|
||||
$modalBody.html(data);
|
||||
valueToCopy = $("<div/>").html(data.replace(/(<(br[^>]*)>)/ig, '\n').replace(/ /ig, ' ')).text().trim() + '\n';
|
||||
$modal.find('.content').css('max-height', ($(window).height() - 200) + 'px');
|
||||
};
|
||||
|
||||
var initPreviewDiffLinks = function () {
|
||||
$('.preview-code, .diff-code, .modal-refresh, .modal-previous, .modal-next').on('click', function () {
|
||||
if (ajaxRequest !== null) {
|
||||
if ($.isFunction(ajaxRequest.abort)) {
|
||||
ajaxRequest.abort();
|
||||
}
|
||||
}
|
||||
var that = this;
|
||||
var $modal = $('#preview-modal');
|
||||
var $link = $(this);
|
||||
$modal.find('.modal-refresh').attr('href', $link.attr('href'));
|
||||
if ($link.hasClass('preview-code') || $link.hasClass('diff-code')) {
|
||||
$modal.data('action', ($link.hasClass('preview-code') ? 'preview-code' : 'diff-code'))
|
||||
}
|
||||
$modal.find('.modal-title').text($link.data('title'));
|
||||
$modal.find('.modal-body').html('Loading ...');
|
||||
|
||||
var modalInitJs = new Modal($modal[0]);
|
||||
modalInitJs.show();
|
||||
|
||||
var checkbox = $('a.' + $modal.data('action') + '[href="' + $link.attr('href') + '"]').closest('tr').find('input').get(0);
|
||||
var checked = false;
|
||||
if (checkbox) {
|
||||
checked = checkbox.checked;
|
||||
$modal.find('.modal-checkbox').removeClass('disabled');
|
||||
} else {
|
||||
$modal.find('.modal-checkbox').addClass('disabled');
|
||||
}
|
||||
$modal.find('.modal-checkbox').toggleClass('checked', checked).toggleClass('unchecked', !checked);
|
||||
|
||||
ajaxRequest = $.ajax({
|
||||
type: 'POST',
|
||||
cache: false,
|
||||
url: $link.prop('href'),
|
||||
data: $('.default-view form').serializeArray(),
|
||||
success: function (data) {
|
||||
fillModal($(that), data);
|
||||
},
|
||||
error: function (XMLHttpRequest, textStatus, errorThrown) {
|
||||
$modal.find('.modal-body').html('<div class="error">' + XMLHttpRequest.responseText + '</div>');
|
||||
}
|
||||
});
|
||||
return false;
|
||||
});
|
||||
|
||||
$('#preview-modal').on('keydown', function (e) {
|
||||
if (e.keyCode === 37) {
|
||||
$('.modal-previous').trigger('click');
|
||||
} else if (e.keyCode === 39) {
|
||||
$('.modal-next').trigger('click');
|
||||
} else if (e.keyCode === 82) {
|
||||
$('.modal-refresh').trigger('click');
|
||||
} else if (e.keyCode === 32) {
|
||||
$('.modal-checkbox').trigger('click');
|
||||
}
|
||||
});
|
||||
|
||||
$('.modal-checkbox').on('click', checkFileToggle);
|
||||
};
|
||||
|
||||
var checkFileToggle = function () {
|
||||
var $modal = $('#preview-modal');
|
||||
var $checkbox = $modal.data('current').closest('tr').find('input');
|
||||
var checked = !$checkbox.prop('checked');
|
||||
$checkbox.trigger('click');
|
||||
$modal.find('.modal-checkbox').toggleClass('checked', checked).toggleClass('unchecked', !checked);
|
||||
return false;
|
||||
};
|
||||
|
||||
var checkAllToggle = function () {
|
||||
$('#check-all').prop('checked', !$('.default-view-files table .check input:enabled:not(:checked)').length);
|
||||
};
|
||||
|
||||
var initConfirmationCheckboxes = function () {
|
||||
var $checkAll = $('#check-all');
|
||||
$checkAll.click(function () {
|
||||
$('.default-view-files table .check input:enabled').prop('checked', this.checked);
|
||||
});
|
||||
$('.default-view-files table .check input').click(function () {
|
||||
checkAllToggle();
|
||||
});
|
||||
checkAllToggle();
|
||||
};
|
||||
|
||||
var initToggleActions = function () {
|
||||
$('#action-toggle').find(':input').change(function () {
|
||||
$(this).parent('label').toggleClass('active', this.checked);
|
||||
var $rows = $('.' + this.value, '.default-view-files table').toggleClass('action-hidden', !this.checked);
|
||||
if (this.checked) {
|
||||
$rows.not('.filter-hidden').show();
|
||||
} else {
|
||||
$rows.hide();
|
||||
}
|
||||
$rows.find('.check input').attr('disabled', !this.checked);
|
||||
checkAllToggle();
|
||||
});
|
||||
};
|
||||
|
||||
var initFilterRows = function () {
|
||||
$('#filter-input').on('input', function () {
|
||||
var that = this,
|
||||
$rows = $('#files-body').find('tr');
|
||||
|
||||
$rows.hide().toggleClass('filter-hidden', true).filter(function () {
|
||||
return $(this).text().toUpperCase().indexOf(that.value.toUpperCase()) > -1;
|
||||
}).toggleClass('filter-hidden', false).not('.action-hidden').show();
|
||||
|
||||
$rows.find('input').each(function(){
|
||||
$(this).prop('disabled', $(this).is(':hidden'));
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
$(document).on("keydown", function(e) {
|
||||
if (valueToCopy && (e.ctrlKey || e.metaKey) && (e.which === 67)) {
|
||||
return onKeydown(e);
|
||||
}
|
||||
}).on("keyup", onKeyup);
|
||||
|
||||
return {
|
||||
init: function () {
|
||||
initStickyInputs();
|
||||
initPreviewDiffLinks();
|
||||
initConfirmationCheckboxes();
|
||||
initToggleActions();
|
||||
initFilterRows();
|
||||
|
||||
// model generator: hide class name inputs and show psr class name checkbox
|
||||
// when table name input contains *
|
||||
$('#model-generator #generator-tablename').change(function () {
|
||||
var show = ($(this).val().indexOf('*') === -1);
|
||||
$('.field-generator-modelclass').toggle(show);
|
||||
if ($('#generator-generatequery').is(':checked')) {
|
||||
$('.field-generator-queryclass').toggle(show);
|
||||
}
|
||||
$('.field-generator-caseinsensitive').toggle(!show);
|
||||
}).change();
|
||||
|
||||
// model generator: translate table name to model class
|
||||
$('#model-generator #generator-tablename').on('blur', function () {
|
||||
var $this = $(this);
|
||||
var $modelClass = $('#generator-modelclass');
|
||||
var tableName = $this.val();
|
||||
var tablePrefix = $this.data('table-prefix') || '';
|
||||
if (tablePrefix.length) {
|
||||
// if starts with prefix
|
||||
if (tableName.slice(0, tablePrefix.length) === tablePrefix) {
|
||||
// remove prefix
|
||||
tableName = tableName.slice(tablePrefix.length);
|
||||
}
|
||||
}
|
||||
if ($modelClass.val() === '' && tableName && tableName.indexOf('*') === -1) {
|
||||
// request to `default/action`(`Generator::actionGenerateClassName()`)
|
||||
ajaxRequest = $.ajax({
|
||||
type: 'POST',
|
||||
cache: false,
|
||||
url: $this.data('action'),
|
||||
data: $('#model-generator').serializeArray(),
|
||||
success: function (response) {
|
||||
$modelClass.val(response).blur();
|
||||
},
|
||||
error: function (XMLHttpRequest, textStatus, errorThrown) {
|
||||
$modal.find('.modal-body').html('<div class="error">' + XMLHttpRequest.responseText + '</div>');
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
// model generator: translate model class to query class
|
||||
$('#model-generator #generator-modelclass').on('blur', function () {
|
||||
var modelClass = $(this).val();
|
||||
if (modelClass !== '') {
|
||||
var queryClass = $('#generator-queryclass').val();
|
||||
if (queryClass === '') {
|
||||
queryClass = modelClass + 'Query';
|
||||
$('#generator-queryclass').val(queryClass);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// model generator: synchronize query namespace with model namespace
|
||||
$('#model-generator #generator-ns').on('blur', function () {
|
||||
var stickyValue = $('#model-generator .field-generator-queryns .sticky-value');
|
||||
var input = $('#model-generator #generator-queryns');
|
||||
if (stickyValue.is(':visible') || !input.is(':visible')) {
|
||||
var ns = $(this).val();
|
||||
stickyValue.html(ns);
|
||||
input.val(ns);
|
||||
}
|
||||
});
|
||||
|
||||
// model generator: toggle query fields
|
||||
$('form #generator-generatequery').change(function () {
|
||||
$('form .field-generator-queryns').toggle($(this).is(':checked'));
|
||||
$('form .field-generator-queryclass').toggle($(this).is(':checked'));
|
||||
$('form .field-generator-querybaseclass').toggle($(this).is(':checked'));
|
||||
$('#generator-queryclass').prop('disabled', $(this).is(':not(:checked)'));
|
||||
}).change();
|
||||
|
||||
// hide message category when I18N is disabled
|
||||
$('form #generator-enablei18n').change(function () {
|
||||
$('form .field-generator-messagecategory').toggle($(this).is(':checked'));
|
||||
}).change();
|
||||
|
||||
// hide Generate button if any input is changed
|
||||
$('#form-fields').find('input,select,textarea').change(function () {
|
||||
$('.default-view-results,.default-view-files').hide();
|
||||
$('.default-view button[name="generate"]').hide();
|
||||
});
|
||||
|
||||
$('.module-form #generator-moduleclass').change(function () {
|
||||
var value = $(this).val().match(/(\w+)\\\w+$/);
|
||||
var $idInput = $('#generator-moduleid');
|
||||
if (value && value[1] && $idInput.val() === '') {
|
||||
$idInput.val(value[1]);
|
||||
}
|
||||
});
|
||||
}
|
||||
};
|
||||
})(jQuery);
|
||||
BIN
vendor/yiisoft/yii2-gii/src/assets/logo.png
vendored
Normal file
BIN
vendor/yiisoft/yii2-gii/src/assets/logo.png
vendored
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 6.5 KiB |
47
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/_badge.scss
vendored
Normal file
47
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/_badge.scss
vendored
Normal file
@ -0,0 +1,47 @@
|
||||
// Base class
|
||||
//
|
||||
// Requires one of the contextual, color modifier classes for `color` and
|
||||
// `background-color`.
|
||||
|
||||
.badge {
|
||||
display: inline-block;
|
||||
padding: $badge-padding-y $badge-padding-x;
|
||||
font-size: $badge-font-size;
|
||||
font-weight: $badge-font-weight;
|
||||
line-height: 1;
|
||||
text-align: center;
|
||||
white-space: nowrap;
|
||||
vertical-align: baseline;
|
||||
@include border-radius($badge-border-radius);
|
||||
|
||||
// Empty badges collapse automatically
|
||||
&:empty {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
// Quick fix for badges in buttons
|
||||
.btn .badge {
|
||||
position: relative;
|
||||
top: -1px;
|
||||
}
|
||||
|
||||
// Pill badges
|
||||
//
|
||||
// Make them extra rounded with a modifier to replace v3's badges.
|
||||
|
||||
.badge-pill {
|
||||
padding-right: $badge-pill-padding-x;
|
||||
padding-left: $badge-pill-padding-x;
|
||||
@include border-radius($badge-pill-border-radius);
|
||||
}
|
||||
|
||||
// Colors
|
||||
//
|
||||
// Contextual variations (linked badges get darker on :hover).
|
||||
|
||||
@each $color, $value in $theme-colors {
|
||||
.badge-#{$color} {
|
||||
@include badge-variant($value);
|
||||
}
|
||||
}
|
||||
172
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/_button-group.scss
vendored
Normal file
172
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/_button-group.scss
vendored
Normal file
@ -0,0 +1,172 @@
|
||||
// stylelint-disable selector-no-qualifying-type
|
||||
|
||||
// Make the div behave like a button
|
||||
.btn-group,
|
||||
.btn-group-vertical {
|
||||
position: relative;
|
||||
display: inline-flex;
|
||||
vertical-align: middle; // match .btn alignment given font-size hack above
|
||||
|
||||
> .btn {
|
||||
position: relative;
|
||||
flex: 0 1 auto;
|
||||
|
||||
// Bring the hover, focused, and "active" buttons to the front to overlay
|
||||
// the borders properly
|
||||
@include hover {
|
||||
z-index: 1;
|
||||
}
|
||||
&:focus,
|
||||
&:active,
|
||||
&.active {
|
||||
z-index: 1;
|
||||
}
|
||||
}
|
||||
|
||||
// Prevent double borders when buttons are next to each other
|
||||
.btn + .btn,
|
||||
.btn + .btn-group,
|
||||
.btn-group + .btn,
|
||||
.btn-group + .btn-group {
|
||||
margin-left: -$btn-border-width;
|
||||
}
|
||||
}
|
||||
|
||||
// Optional: Group multiple button groups together for a toolbar
|
||||
.btn-toolbar {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
justify-content: flex-start;
|
||||
|
||||
.input-group {
|
||||
width: auto;
|
||||
}
|
||||
}
|
||||
|
||||
.btn-group {
|
||||
> .btn:first-child {
|
||||
margin-left: 0;
|
||||
}
|
||||
|
||||
// Reset rounded corners
|
||||
> .btn:not(:last-child):not(.dropdown-toggle),
|
||||
> .btn-group:not(:last-child) > .btn {
|
||||
@include border-right-radius(0);
|
||||
}
|
||||
|
||||
> .btn:not(:first-child),
|
||||
> .btn-group:not(:first-child) > .btn {
|
||||
@include border-left-radius(0);
|
||||
}
|
||||
}
|
||||
|
||||
// Sizing
|
||||
//
|
||||
// Remix the default button sizing classes into new ones for easier manipulation.
|
||||
|
||||
.btn-group-sm > .btn { @extend .btn-sm; }
|
||||
.btn-group-lg > .btn { @extend .btn-lg; }
|
||||
|
||||
|
||||
//
|
||||
// Split button dropdowns
|
||||
//
|
||||
|
||||
.dropdown-toggle-split {
|
||||
padding-right: $btn-padding-x * .75;
|
||||
padding-left: $btn-padding-x * .75;
|
||||
|
||||
&::after,
|
||||
.dropup &::after,
|
||||
.dropright &::after {
|
||||
margin-left: 0;
|
||||
}
|
||||
|
||||
.dropleft &::before {
|
||||
margin-right: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.btn-sm + .dropdown-toggle-split {
|
||||
padding-right: $btn-padding-x-sm * .75;
|
||||
padding-left: $btn-padding-x-sm * .75;
|
||||
}
|
||||
|
||||
.btn-lg + .dropdown-toggle-split {
|
||||
padding-right: $btn-padding-x-lg * .75;
|
||||
padding-left: $btn-padding-x-lg * .75;
|
||||
}
|
||||
|
||||
|
||||
// The clickable button for toggling the menu
|
||||
// Set the same inset shadow as the :active state
|
||||
.btn-group.show .dropdown-toggle {
|
||||
@include box-shadow($btn-active-box-shadow);
|
||||
|
||||
// Show no shadow for `.btn-link` since it has no other button styles.
|
||||
&.btn-link {
|
||||
@include box-shadow(none);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// Vertical button groups
|
||||
//
|
||||
|
||||
.btn-group-vertical {
|
||||
flex-direction: column;
|
||||
align-items: flex-start;
|
||||
justify-content: center;
|
||||
|
||||
.btn,
|
||||
.btn-group {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
> .btn + .btn,
|
||||
> .btn + .btn-group,
|
||||
> .btn-group + .btn,
|
||||
> .btn-group + .btn-group {
|
||||
margin-top: -$btn-border-width;
|
||||
margin-left: 0;
|
||||
}
|
||||
|
||||
// Reset rounded corners
|
||||
> .btn:not(:last-child):not(.dropdown-toggle),
|
||||
> .btn-group:not(:last-child) > .btn {
|
||||
@include border-bottom-radius(0);
|
||||
}
|
||||
|
||||
> .btn:not(:first-child),
|
||||
> .btn-group:not(:first-child) > .btn {
|
||||
@include border-top-radius(0);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Checkbox and radio options
|
||||
//
|
||||
// In order to support the browser's form validation feedback, powered by the
|
||||
// `required` attribute, we have to "hide" the inputs via `clip`. We cannot use
|
||||
// `display: none;` or `visibility: hidden;` as that also hides the popover.
|
||||
// Simply visually hiding the inputs via `opacity` would leave them clickable in
|
||||
// certain cases which is prevented by using `clip` and `pointer-events`.
|
||||
// This way, we ensure a DOM element is visible to position the popover from.
|
||||
//
|
||||
// See https://github.com/twbs/bootstrap/pull/12794 and
|
||||
// https://github.com/twbs/bootstrap/pull/14559 for more information.
|
||||
|
||||
.btn-group-toggle {
|
||||
> .btn,
|
||||
> .btn-group > .btn {
|
||||
margin-bottom: 0; // Override default `<label>` value
|
||||
|
||||
input[type="radio"],
|
||||
input[type="checkbox"] {
|
||||
position: absolute;
|
||||
clip: rect(0, 0, 0, 0);
|
||||
pointer-events: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
143
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/_buttons.scss
vendored
Normal file
143
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/_buttons.scss
vendored
Normal file
@ -0,0 +1,143 @@
|
||||
// stylelint-disable selector-no-qualifying-type
|
||||
|
||||
//
|
||||
// Base styles
|
||||
//
|
||||
|
||||
.btn {
|
||||
display: inline-block;
|
||||
font-weight: $btn-font-weight;
|
||||
text-align: center;
|
||||
white-space: nowrap;
|
||||
vertical-align: middle;
|
||||
user-select: none;
|
||||
border: $btn-border-width solid transparent;
|
||||
@include button-size($btn-padding-y, $btn-padding-x, $font-size-base, $btn-line-height, $btn-border-radius);
|
||||
@include transition($btn-transition);
|
||||
|
||||
// Share hover and focus styles
|
||||
@include hover-focus {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
&:focus,
|
||||
&.focus {
|
||||
outline: 0;
|
||||
box-shadow: $btn-focus-box-shadow;
|
||||
}
|
||||
|
||||
// Disabled comes first so active can properly restyle
|
||||
&.disabled,
|
||||
&:disabled {
|
||||
opacity: $btn-disabled-opacity;
|
||||
@include box-shadow(none);
|
||||
}
|
||||
|
||||
// Opinionated: add "hand" cursor to non-disabled .btn elements
|
||||
&:not(:disabled):not(.disabled) {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
&:not(:disabled):not(.disabled):active,
|
||||
&:not(:disabled):not(.disabled).active {
|
||||
@include box-shadow($btn-active-box-shadow);
|
||||
|
||||
&:focus {
|
||||
@include box-shadow($btn-focus-box-shadow, $btn-active-box-shadow);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Future-proof disabling of clicks on `<a>` elements
|
||||
a.btn.disabled,
|
||||
fieldset:disabled a.btn {
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// Alternate buttons
|
||||
//
|
||||
|
||||
@each $color, $value in $theme-colors {
|
||||
.btn-#{$color} {
|
||||
@include button-variant($value, $value);
|
||||
}
|
||||
}
|
||||
|
||||
@each $color, $value in $theme-colors {
|
||||
.btn-outline-#{$color} {
|
||||
@include button-outline-variant($value);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// Link buttons
|
||||
//
|
||||
|
||||
// Make a button look and behave like a link
|
||||
.btn-link {
|
||||
font-weight: $font-weight-normal;
|
||||
color: $link-color;
|
||||
background-color: transparent;
|
||||
|
||||
@include hover {
|
||||
color: $link-hover-color;
|
||||
text-decoration: $link-hover-decoration;
|
||||
background-color: transparent;
|
||||
border-color: transparent;
|
||||
}
|
||||
|
||||
&:focus,
|
||||
&.focus {
|
||||
text-decoration: $link-hover-decoration;
|
||||
border-color: transparent;
|
||||
box-shadow: none;
|
||||
}
|
||||
|
||||
&:disabled,
|
||||
&.disabled {
|
||||
color: $btn-link-disabled-color;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
// No need for an active state here
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// Button Sizes
|
||||
//
|
||||
|
||||
.btn-lg {
|
||||
@include button-size($btn-padding-y-lg, $btn-padding-x-lg, $font-size-lg, $btn-line-height-lg, $btn-border-radius-lg);
|
||||
}
|
||||
|
||||
.btn-sm {
|
||||
@include button-size($btn-padding-y-sm, $btn-padding-x-sm, $font-size-sm, $btn-line-height-sm, $btn-border-radius-sm);
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// Block button
|
||||
//
|
||||
|
||||
.btn-block {
|
||||
display: block;
|
||||
width: 100%;
|
||||
|
||||
// Vertically space out multiple block buttons
|
||||
+ .btn-block {
|
||||
margin-top: $btn-block-spacing-y;
|
||||
}
|
||||
}
|
||||
|
||||
// Specificity overrides
|
||||
input[type="submit"],
|
||||
input[type="reset"],
|
||||
input[type="button"] {
|
||||
&.btn-block {
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
35
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/_close.scss
vendored
Normal file
35
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/_close.scss
vendored
Normal file
@ -0,0 +1,35 @@
|
||||
.close {
|
||||
float: right;
|
||||
font-size: $close-font-size;
|
||||
font-weight: $close-font-weight;
|
||||
line-height: 1;
|
||||
color: $close-color;
|
||||
text-shadow: $close-text-shadow;
|
||||
opacity: .5;
|
||||
|
||||
&:not(:disabled):not(.disabled) {
|
||||
|
||||
@include hover-focus {
|
||||
color: $close-color;
|
||||
text-decoration: none;
|
||||
opacity: .75;
|
||||
}
|
||||
|
||||
// Opinionated: add "hand" cursor to non-disabled .close elements
|
||||
cursor: pointer;
|
||||
}
|
||||
}
|
||||
|
||||
// Additional properties for button version
|
||||
// iOS requires the button element instead of an anchor tag.
|
||||
// If you want the anchor version, it requires `href="#"`.
|
||||
// See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile
|
||||
|
||||
// stylelint-disable property-no-vendor-prefix, selector-no-qualifying-type
|
||||
button.close {
|
||||
padding: 0;
|
||||
background-color: transparent;
|
||||
border: 0;
|
||||
-webkit-appearance: none;
|
||||
}
|
||||
// stylelint-enable
|
||||
49
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/_code.scss
vendored
Normal file
49
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/_code.scss
vendored
Normal file
@ -0,0 +1,49 @@
|
||||
// Inline code
|
||||
code {
|
||||
font-size: $code-font-size;
|
||||
color: $code-color;
|
||||
background-color: $code-bg;
|
||||
word-break: break-word;
|
||||
|
||||
// Streamline the style when inside anchors to avoid broken underline and more
|
||||
a > & {
|
||||
color: inherit;
|
||||
}
|
||||
}
|
||||
|
||||
// User input typically entered via keyboard
|
||||
kbd {
|
||||
padding: $kbd-padding-y $kbd-padding-x;
|
||||
font-size: $kbd-font-size;
|
||||
color: $kbd-color;
|
||||
background-color: $kbd-bg;
|
||||
@include border-radius($border-radius-sm);
|
||||
@include box-shadow($kbd-box-shadow);
|
||||
|
||||
kbd {
|
||||
padding: 0;
|
||||
font-size: 100%;
|
||||
font-weight: $nested-kbd-font-weight;
|
||||
@include box-shadow(none);
|
||||
}
|
||||
}
|
||||
|
||||
// Blocks of code
|
||||
pre {
|
||||
display: block;
|
||||
font-size: $code-font-size;
|
||||
color: $pre-color;
|
||||
|
||||
// Account for some code outputs that place code tags in pre tags
|
||||
code {
|
||||
font-size: inherit;
|
||||
color: inherit;
|
||||
word-break: normal;
|
||||
}
|
||||
}
|
||||
|
||||
// Enable scrollable blocks of code
|
||||
.pre-scrollable {
|
||||
max-height: $pre-scrollable-max-height;
|
||||
overflow-y: scroll;
|
||||
}
|
||||
166
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/_dropdown.scss
vendored
Normal file
166
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/_dropdown.scss
vendored
Normal file
@ -0,0 +1,166 @@
|
||||
// The dropdown wrapper (`<div>`)
|
||||
.dropup,
|
||||
.dropright,
|
||||
.dropdown,
|
||||
.dropleft {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.dropdown-toggle {
|
||||
// Generate the caret automatically
|
||||
@include caret;
|
||||
}
|
||||
|
||||
// The dropdown menu
|
||||
.dropdown-menu {
|
||||
position: absolute;
|
||||
top: 100%;
|
||||
left: 0;
|
||||
z-index: $zindex-dropdown;
|
||||
display: none; // none by default, but block on "open" of the menu
|
||||
float: left;
|
||||
min-width: $dropdown-min-width;
|
||||
padding: $dropdown-padding-y 0;
|
||||
margin: $dropdown-spacer 0 0; // override default ul
|
||||
font-size: $font-size-base; // Redeclare because nesting can cause inheritance issues
|
||||
color: $body-color;
|
||||
text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer)
|
||||
list-style: none;
|
||||
background-color: $dropdown-bg;
|
||||
background-clip: padding-box;
|
||||
border: $dropdown-border-width solid $dropdown-border-color;
|
||||
@include border-radius($dropdown-border-radius);
|
||||
@include box-shadow($dropdown-box-shadow);
|
||||
}
|
||||
|
||||
.dropdown-menu-right {
|
||||
right: 0;
|
||||
left: auto;
|
||||
}
|
||||
|
||||
// Allow for dropdowns to go bottom up (aka, dropup-menu)
|
||||
// Just add .dropup after the standard .dropdown class and you're set.
|
||||
.dropup {
|
||||
.dropdown-menu {
|
||||
top: auto;
|
||||
bottom: 100%;
|
||||
margin-top: 0;
|
||||
margin-bottom: $dropdown-spacer;
|
||||
}
|
||||
|
||||
.dropdown-toggle {
|
||||
@include caret(up);
|
||||
}
|
||||
}
|
||||
|
||||
.dropright {
|
||||
.dropdown-menu {
|
||||
top: 0;
|
||||
right: auto;
|
||||
left: 100%;
|
||||
margin-top: 0;
|
||||
margin-left: $dropdown-spacer;
|
||||
}
|
||||
|
||||
.dropdown-toggle {
|
||||
@include caret(right);
|
||||
&::after {
|
||||
vertical-align: 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.dropleft {
|
||||
.dropdown-menu {
|
||||
top: 0;
|
||||
right: 100%;
|
||||
left: auto;
|
||||
margin-top: 0;
|
||||
margin-right: $dropdown-spacer;
|
||||
}
|
||||
|
||||
.dropdown-toggle {
|
||||
@include caret(left);
|
||||
&::before {
|
||||
vertical-align: 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// When enabled Popper.js, reset basic dropdown position
|
||||
// stylelint-disable no-duplicate-selectors
|
||||
.dropdown-menu {
|
||||
&[x-placement^="top"],
|
||||
&[x-placement^="right"],
|
||||
&[x-placement^="bottom"],
|
||||
&[x-placement^="left"] {
|
||||
right: auto;
|
||||
bottom: auto;
|
||||
}
|
||||
}
|
||||
// stylelint-enable no-duplicate-selectors
|
||||
|
||||
// Dividers (basically an `<hr>`) within the dropdown
|
||||
.dropdown-divider {
|
||||
@include nav-divider($dropdown-divider-bg);
|
||||
}
|
||||
|
||||
// Links, buttons, and more within the dropdown menu
|
||||
//
|
||||
// `<button>`-specific styles are denoted with `// For <button>s`
|
||||
.dropdown-item {
|
||||
display: block;
|
||||
width: 100%; // For `<button>`s
|
||||
padding: $dropdown-item-padding-y $dropdown-item-padding-x;
|
||||
clear: both;
|
||||
font-weight: $font-weight-normal;
|
||||
color: $dropdown-link-color;
|
||||
text-align: inherit; // For `<button>`s
|
||||
white-space: nowrap; // prevent links from randomly breaking onto new lines
|
||||
background-color: transparent; // For `<button>`s
|
||||
border: 0; // For `<button>`s
|
||||
|
||||
@include hover-focus {
|
||||
color: $dropdown-link-hover-color;
|
||||
text-decoration: none;
|
||||
@include gradient-bg($dropdown-link-hover-bg);
|
||||
}
|
||||
|
||||
&.active,
|
||||
&:active {
|
||||
color: $dropdown-link-active-color;
|
||||
text-decoration: none;
|
||||
@include gradient-bg($dropdown-link-active-bg);
|
||||
}
|
||||
|
||||
&.disabled,
|
||||
&:disabled {
|
||||
color: $dropdown-link-disabled-color;
|
||||
background-color: transparent;
|
||||
// Remove CSS gradients if they're enabled
|
||||
@if $enable-gradients {
|
||||
background-image: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.dropdown-menu.show {
|
||||
display: block;
|
||||
}
|
||||
|
||||
// Dropdown section headers
|
||||
.dropdown-header {
|
||||
display: block;
|
||||
padding: $dropdown-padding-y $dropdown-item-padding-x;
|
||||
margin-bottom: 0; // for use with heading elements
|
||||
font-size: $font-size-sm;
|
||||
color: $dropdown-header-color;
|
||||
white-space: nowrap; // as with > li > a
|
||||
}
|
||||
|
||||
// Dropdown text
|
||||
.dropdown-item-text {
|
||||
display: block;
|
||||
padding: $dropdown-item-padding-y $dropdown-item-padding-x;
|
||||
color: $dropdown-link-color;
|
||||
}
|
||||
333
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/_forms.scss
vendored
Normal file
333
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/_forms.scss
vendored
Normal file
@ -0,0 +1,333 @@
|
||||
// stylelint-disable selector-no-qualifying-type
|
||||
|
||||
//
|
||||
// Textual form controls
|
||||
//
|
||||
|
||||
.form-control {
|
||||
display: block;
|
||||
width: 100%;
|
||||
height: $input-height;
|
||||
padding: $input-padding-y $input-padding-x;
|
||||
font-size: $font-size-base;
|
||||
line-height: $input-line-height;
|
||||
color: $input-color;
|
||||
background-color: $input-bg;
|
||||
background-clip: padding-box;
|
||||
border: $input-border-width solid $input-border-color;
|
||||
|
||||
// Note: This has no effect on <select>s in some browsers, due to the limited stylability of `<select>`s in CSS.
|
||||
@if $enable-rounded {
|
||||
// Manually use the if/else instead of the mixin to account for iOS override
|
||||
border-radius: $input-border-radius;
|
||||
} @else {
|
||||
// Otherwise undo the iOS default
|
||||
border-radius: 0;
|
||||
}
|
||||
|
||||
@include box-shadow($input-box-shadow);
|
||||
@include transition($input-transition);
|
||||
|
||||
// Unstyle the caret on `<select>`s in IE10+.
|
||||
&::-ms-expand {
|
||||
background-color: transparent;
|
||||
border: 0;
|
||||
}
|
||||
|
||||
// Customize the `:focus` state to imitate native WebKit styles.
|
||||
@include form-control-focus();
|
||||
|
||||
// Placeholder
|
||||
&::placeholder {
|
||||
color: $input-placeholder-color;
|
||||
// Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526.
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
// Disabled and read-only inputs
|
||||
//
|
||||
// HTML5 says that controls under a fieldset > legend:first-child won't be
|
||||
// disabled if the fieldset is disabled. Due to implementation difficulty, we
|
||||
// don't honor that edge case; we style them as disabled anyway.
|
||||
&:disabled,
|
||||
&[readonly] {
|
||||
background-color: $input-disabled-bg;
|
||||
// iOS fix for unreadable disabled content; see https://github.com/twbs/bootstrap/issues/11655.
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
|
||||
select.form-control {
|
||||
&:focus::-ms-value {
|
||||
// Suppress the nested default white text on blue background highlight given to
|
||||
// the selected option text when the (still closed) <select> receives focus
|
||||
// in IE and (under certain conditions) Edge, as it looks bad and cannot be made to
|
||||
// match the appearance of the native widget.
|
||||
// See https://github.com/twbs/bootstrap/issues/19398.
|
||||
color: $input-color;
|
||||
background-color: $input-bg;
|
||||
}
|
||||
}
|
||||
|
||||
// Make file inputs better match text inputs by forcing them to new lines.
|
||||
.form-control-file,
|
||||
.form-control-range {
|
||||
display: block;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// Labels
|
||||
//
|
||||
|
||||
// For use with horizontal and inline forms, when you need the label (or legend)
|
||||
// text to align with the form controls.
|
||||
.col-form-label {
|
||||
padding-top: calc(#{$input-padding-y} + #{$input-border-width});
|
||||
padding-bottom: calc(#{$input-padding-y} + #{$input-border-width});
|
||||
margin-bottom: 0; // Override the `<label>/<legend>` default
|
||||
font-size: inherit; // Override the `<legend>` default
|
||||
line-height: $input-line-height;
|
||||
}
|
||||
|
||||
.col-form-label-lg {
|
||||
padding-top: calc(#{$input-padding-y-lg} + #{$input-border-width});
|
||||
padding-bottom: calc(#{$input-padding-y-lg} + #{$input-border-width});
|
||||
font-size: $font-size-lg;
|
||||
line-height: $input-line-height-lg;
|
||||
}
|
||||
|
||||
.col-form-label-sm {
|
||||
padding-top: calc(#{$input-padding-y-sm} + #{$input-border-width});
|
||||
padding-bottom: calc(#{$input-padding-y-sm} + #{$input-border-width});
|
||||
font-size: $font-size-sm;
|
||||
line-height: $input-line-height-sm;
|
||||
}
|
||||
|
||||
|
||||
// Readonly controls as plain text
|
||||
//
|
||||
// Apply class to a readonly input to make it appear like regular plain
|
||||
// text (without any border, background color, focus indicator)
|
||||
|
||||
.form-control-plaintext {
|
||||
display: block;
|
||||
width: 100%;
|
||||
padding-top: $input-padding-y;
|
||||
padding-bottom: $input-padding-y;
|
||||
margin-bottom: 0; // match inputs if this class comes on inputs with default margins
|
||||
line-height: $input-line-height;
|
||||
color: $input-plaintext-color;
|
||||
background-color: transparent;
|
||||
border: solid transparent;
|
||||
border-width: $input-border-width 0;
|
||||
|
||||
&.form-control-sm,
|
||||
&.form-control-lg {
|
||||
padding-right: 0;
|
||||
padding-left: 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Form control sizing
|
||||
//
|
||||
// Build on `.form-control` with modifier classes to decrease or increase the
|
||||
// height and font-size of form controls.
|
||||
//
|
||||
// Repeated in `_input_group.scss` to avoid Sass extend issues.
|
||||
|
||||
.form-control-sm {
|
||||
height: $input-height-sm;
|
||||
padding: $input-padding-y-sm $input-padding-x-sm;
|
||||
font-size: $font-size-sm;
|
||||
line-height: $input-line-height-sm;
|
||||
@include border-radius($input-border-radius-sm);
|
||||
}
|
||||
|
||||
.form-control-lg {
|
||||
height: $input-height-lg;
|
||||
padding: $input-padding-y-lg $input-padding-x-lg;
|
||||
font-size: $font-size-lg;
|
||||
line-height: $input-line-height-lg;
|
||||
@include border-radius($input-border-radius-lg);
|
||||
}
|
||||
|
||||
// stylelint-disable no-duplicate-selectors
|
||||
select.form-control {
|
||||
&[size],
|
||||
&[multiple] {
|
||||
height: auto;
|
||||
}
|
||||
}
|
||||
|
||||
textarea.form-control {
|
||||
height: auto;
|
||||
}
|
||||
// stylelint-enable no-duplicate-selectors
|
||||
|
||||
// Form groups
|
||||
//
|
||||
// Designed to help with the organization and spacing of vertical forms. For
|
||||
// horizontal forms, use the predefined grid classes.
|
||||
|
||||
.form-group {
|
||||
margin-bottom: $form-group-margin-bottom;
|
||||
}
|
||||
|
||||
.form-text {
|
||||
display: block;
|
||||
margin-top: $form-text-margin-top;
|
||||
}
|
||||
|
||||
|
||||
// Form grid
|
||||
//
|
||||
// Special replacement for our grid system's `.row` for tighter form layouts.
|
||||
|
||||
.form-row {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
margin-right: -5px;
|
||||
margin-left: -5px;
|
||||
|
||||
> .col,
|
||||
> [class*="col-"] {
|
||||
padding-right: 5px;
|
||||
padding-left: 5px;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Checkboxes and radios
|
||||
//
|
||||
// Indent the labels to position radios/checkboxes as hanging controls.
|
||||
|
||||
.form-check {
|
||||
position: relative;
|
||||
display: block;
|
||||
padding-left: $form-check-input-gutter;
|
||||
}
|
||||
|
||||
.form-check-input {
|
||||
position: absolute;
|
||||
margin-top: $form-check-input-margin-y;
|
||||
margin-left: -$form-check-input-gutter;
|
||||
|
||||
&:disabled ~ .form-check-label {
|
||||
color: $text-muted;
|
||||
}
|
||||
}
|
||||
|
||||
.form-check-label {
|
||||
margin-bottom: 0; // Override default `<label>` bottom margin
|
||||
}
|
||||
|
||||
.form-check-inline {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
padding-left: 0; // Override base .form-check
|
||||
margin-right: $form-check-inline-margin-x;
|
||||
|
||||
// Undo .form-check-input defaults and add some `margin-right`.
|
||||
.form-check-input {
|
||||
position: static;
|
||||
margin-top: 0;
|
||||
margin-right: $form-check-inline-input-margin-x;
|
||||
margin-left: 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Form validation
|
||||
//
|
||||
// Provide feedback to users when form field values are valid or invalid. Works
|
||||
// primarily for client-side validation via scoped `:invalid` and `:valid`
|
||||
// pseudo-classes but also includes `.is-invalid` and `.is-valid` classes for
|
||||
// server side validation.
|
||||
|
||||
@include form-validation-state("valid", $form-feedback-valid-color);
|
||||
@include form-validation-state("invalid", $form-feedback-invalid-color);
|
||||
|
||||
// Inline forms
|
||||
//
|
||||
// Make forms appear inline(-block) by adding the `.form-inline` class. Inline
|
||||
// forms begin stacked on extra small (mobile) devices and then go inline when
|
||||
// viewports reach <768px.
|
||||
//
|
||||
// Requires wrapping inputs and labels with `.form-group` for proper display of
|
||||
// default HTML form controls and our custom form controls (e.g., input groups).
|
||||
|
||||
.form-inline {
|
||||
display: flex;
|
||||
flex-flow: row wrap;
|
||||
align-items: center; // Prevent shorter elements from growing to same height as others (e.g., small buttons growing to normal sized button height)
|
||||
|
||||
// Because we use flex, the initial sizing of checkboxes is collapsed and
|
||||
// doesn't occupy the full-width (which is what we want for xs grid tier),
|
||||
// so we force that here.
|
||||
.form-check {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
// Kick in the inline
|
||||
@include media-breakpoint-up(sm) {
|
||||
label {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
// Inline-block all the things for "inline"
|
||||
.form-group {
|
||||
display: flex;
|
||||
flex: 0 0 auto;
|
||||
flex-flow: row wrap;
|
||||
align-items: center;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
// Allow folks to *not* use `.form-group`
|
||||
.form-control {
|
||||
display: inline-block;
|
||||
width: auto; // Prevent labels from stacking above inputs in `.form-group`
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
// Make static controls behave like regular ones
|
||||
.form-control-plaintext {
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.input-group,
|
||||
.custom-select {
|
||||
width: auto;
|
||||
}
|
||||
|
||||
// Remove default margin on radios/checkboxes that were used for stacking, and
|
||||
// then undo the floating of radios and checkboxes to match.
|
||||
.form-check {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
width: auto;
|
||||
padding-left: 0;
|
||||
}
|
||||
.form-check-input {
|
||||
position: relative;
|
||||
margin-top: 0;
|
||||
margin-right: $form-check-input-margin-x;
|
||||
margin-left: 0;
|
||||
}
|
||||
|
||||
.custom-control {
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
.custom-control-label {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
86
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/_functions.scss
vendored
Normal file
86
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/_functions.scss
vendored
Normal file
@ -0,0 +1,86 @@
|
||||
// Bootstrap functions
|
||||
//
|
||||
// Utility mixins and functions for evaluating source code across our variables, maps, and mixins.
|
||||
|
||||
// Ascending
|
||||
// Used to evaluate Sass maps like our grid breakpoints.
|
||||
@mixin _assert-ascending($map, $map-name) {
|
||||
$prev-key: null;
|
||||
$prev-num: null;
|
||||
@each $key, $num in $map {
|
||||
@if $prev-num == null {
|
||||
// Do nothing
|
||||
} @else if not comparable($prev-num, $num) {
|
||||
@warn "Potentially invalid value for #{$map-name}: This map must be in ascending order, but key '#{$key}' has value #{$num} whose unit makes it incomparable to #{$prev-num}, the value of the previous key '#{$prev-key}' !";
|
||||
} @else if $prev-num >= $num {
|
||||
@warn "Invalid value for #{$map-name}: This map must be in ascending order, but key '#{$key}' has value #{$num} which isn't greater than #{$prev-num}, the value of the previous key '#{$prev-key}' !";
|
||||
}
|
||||
$prev-key: $key;
|
||||
$prev-num: $num;
|
||||
}
|
||||
}
|
||||
|
||||
// Starts at zero
|
||||
// Another grid mixin that ensures the min-width of the lowest breakpoint starts at 0.
|
||||
@mixin _assert-starts-at-zero($map) {
|
||||
$values: map-values($map);
|
||||
$first-value: nth($values, 1);
|
||||
@if $first-value != 0 {
|
||||
@warn "First breakpoint in `$grid-breakpoints` must start at 0, but starts at #{$first-value}.";
|
||||
}
|
||||
}
|
||||
|
||||
// Replace `$search` with `$replace` in `$string`
|
||||
// Used on our SVG icon backgrounds for custom forms.
|
||||
//
|
||||
// @author Hugo Giraudel
|
||||
// @param {String} $string - Initial string
|
||||
// @param {String} $search - Substring to replace
|
||||
// @param {String} $replace ('') - New value
|
||||
// @return {String} - Updated string
|
||||
@function str-replace($string, $search, $replace: "") {
|
||||
$index: str-index($string, $search);
|
||||
|
||||
@if $index {
|
||||
@return str-slice($string, 1, $index - 1) + $replace + str-replace(str-slice($string, $index + str-length($search)), $search, $replace);
|
||||
}
|
||||
|
||||
@return $string;
|
||||
}
|
||||
|
||||
// Color contrast
|
||||
@function color-yiq($color) {
|
||||
$r: red($color);
|
||||
$g: green($color);
|
||||
$b: blue($color);
|
||||
|
||||
$yiq: (($r * 299) + ($g * 587) + ($b * 114)) / 1000;
|
||||
|
||||
@if ($yiq >= $yiq-contrasted-threshold) {
|
||||
@return $yiq-text-dark;
|
||||
} @else {
|
||||
@return $yiq-text-light;
|
||||
}
|
||||
}
|
||||
|
||||
// Retrieve color Sass maps
|
||||
@function color($key: "blue") {
|
||||
@return map-get($colors, $key);
|
||||
}
|
||||
|
||||
@function theme-color($key: "primary") {
|
||||
@return map-get($theme-colors, $key);
|
||||
}
|
||||
|
||||
@function gray($key: "100") {
|
||||
@return map-get($grays, $key);
|
||||
}
|
||||
|
||||
// Request a theme color level
|
||||
@function theme-color-level($color-name: "primary", $level: 0) {
|
||||
$color: theme-color($color-name);
|
||||
$color-base: if($level > 0, $black, $white);
|
||||
$level: abs($level);
|
||||
|
||||
@return mix($color-base, $color, $level * $theme-color-interval);
|
||||
}
|
||||
52
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/_grid.scss
vendored
Normal file
52
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/_grid.scss
vendored
Normal file
@ -0,0 +1,52 @@
|
||||
// Container widths
|
||||
//
|
||||
// Set the container width, and override it for fixed navbars in media queries.
|
||||
|
||||
@if $enable-grid-classes {
|
||||
.container {
|
||||
@include make-container();
|
||||
@include make-container-max-widths();
|
||||
}
|
||||
}
|
||||
|
||||
// Fluid container
|
||||
//
|
||||
// Utilizes the mixin meant for fixed width containers, but with 100% width for
|
||||
// fluid, full width layouts.
|
||||
|
||||
@if $enable-grid-classes {
|
||||
.container-fluid {
|
||||
@include make-container();
|
||||
}
|
||||
}
|
||||
|
||||
// Row
|
||||
//
|
||||
// Rows contain and clear the floats of your columns.
|
||||
|
||||
@if $enable-grid-classes {
|
||||
.row {
|
||||
@include make-row();
|
||||
}
|
||||
|
||||
// Remove the negative margin from default .row, then the horizontal padding
|
||||
// from all immediate children columns (to prevent runaway style inheritance).
|
||||
.no-gutters {
|
||||
margin-right: 0;
|
||||
margin-left: 0;
|
||||
|
||||
> .col,
|
||||
> [class*="col-"] {
|
||||
padding-right: 0;
|
||||
padding-left: 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Columns
|
||||
//
|
||||
// Common styles for small and large grid columns
|
||||
|
||||
@if $enable-grid-classes {
|
||||
@include make-grid-columns();
|
||||
}
|
||||
115
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/_list-group.scss
vendored
Normal file
115
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/_list-group.scss
vendored
Normal file
@ -0,0 +1,115 @@
|
||||
// Base class
|
||||
//
|
||||
// Easily usable on <ul>, <ol>, or <div>.
|
||||
|
||||
.list-group {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
|
||||
// No need to set list-style: none; since .list-group-item is block level
|
||||
padding-left: 0; // reset padding because ul and ol
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
|
||||
// Interactive list items
|
||||
//
|
||||
// Use anchor or button elements instead of `li`s or `div`s to create interactive
|
||||
// list items. Includes an extra `.active` modifier class for selected items.
|
||||
|
||||
.list-group-item-action {
|
||||
width: 100%; // For `<button>`s (anchors become 100% by default though)
|
||||
color: $list-group-action-color;
|
||||
text-align: inherit; // For `<button>`s (anchors inherit)
|
||||
|
||||
// Hover state
|
||||
@include hover-focus {
|
||||
color: $list-group-action-hover-color;
|
||||
text-decoration: none;
|
||||
background-color: $list-group-hover-bg;
|
||||
}
|
||||
|
||||
&:active {
|
||||
color: $list-group-action-active-color;
|
||||
background-color: $list-group-action-active-bg;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Individual list items
|
||||
//
|
||||
// Use on `li`s or `div`s within the `.list-group` parent.
|
||||
|
||||
.list-group-item {
|
||||
position: relative;
|
||||
display: block;
|
||||
padding: $list-group-item-padding-y $list-group-item-padding-x;
|
||||
// Place the border on the list items and negative margin up for better styling
|
||||
margin-bottom: -$list-group-border-width;
|
||||
background-color: $list-group-bg;
|
||||
border: $list-group-border-width solid $list-group-border-color;
|
||||
|
||||
&:first-child {
|
||||
@include border-top-radius($list-group-border-radius);
|
||||
}
|
||||
|
||||
&:last-child {
|
||||
margin-bottom: 0;
|
||||
@include border-bottom-radius($list-group-border-radius);
|
||||
}
|
||||
|
||||
@include hover-focus {
|
||||
z-index: 1; // Place hover/active items above their siblings for proper border styling
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
&.disabled,
|
||||
&:disabled {
|
||||
color: $list-group-disabled-color;
|
||||
background-color: $list-group-disabled-bg;
|
||||
}
|
||||
|
||||
// Include both here for `<a>`s and `<button>`s
|
||||
&.active {
|
||||
z-index: 2; // Place active items above their siblings for proper border styling
|
||||
color: $list-group-active-color;
|
||||
background-color: $list-group-active-bg;
|
||||
border-color: $list-group-active-border-color;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Flush list items
|
||||
//
|
||||
// Remove borders and border-radius to keep list group items edge-to-edge. Most
|
||||
// useful within other components (e.g., cards).
|
||||
|
||||
.list-group-flush {
|
||||
.list-group-item {
|
||||
border-right: 0;
|
||||
border-left: 0;
|
||||
@include border-radius(0);
|
||||
}
|
||||
|
||||
&:first-child {
|
||||
.list-group-item:first-child {
|
||||
border-top: 0;
|
||||
}
|
||||
}
|
||||
|
||||
&:last-child {
|
||||
.list-group-item:last-child {
|
||||
border-bottom: 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Contextual variants
|
||||
//
|
||||
// Add modifier classes to change text and background color on individual items.
|
||||
// Organizationally, this must come after the `:hover` states.
|
||||
|
||||
@each $color, $value in $theme-colors {
|
||||
@include list-group-item-variant($color, theme-color-level($color, -9), theme-color-level($color, 6));
|
||||
}
|
||||
41
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/_mixins.scss
vendored
Normal file
41
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/_mixins.scss
vendored
Normal file
@ -0,0 +1,41 @@
|
||||
// Toggles
|
||||
//
|
||||
// Used in conjunction with global variables to enable certain theme features.
|
||||
|
||||
// Utilities
|
||||
@import "mixins/breakpoints";
|
||||
@import "mixins/hover";
|
||||
@import "mixins/image";
|
||||
@import "mixins/badge";
|
||||
@import "mixins/resize";
|
||||
@import "mixins/screen-reader";
|
||||
@import "mixins/size";
|
||||
@import "mixins/reset-text";
|
||||
@import "mixins/text-emphasis";
|
||||
@import "mixins/text-hide";
|
||||
@import "mixins/text-truncate";
|
||||
@import "mixins/visibility";
|
||||
|
||||
// // Components
|
||||
@import "mixins/alert";
|
||||
@import "mixins/buttons";
|
||||
@import "mixins/caret";
|
||||
@import "mixins/pagination";
|
||||
@import "mixins/lists";
|
||||
@import "mixins/list-group";
|
||||
@import "mixins/nav-divider";
|
||||
@import "mixins/forms";
|
||||
@import "mixins/table-row";
|
||||
|
||||
// // Skins
|
||||
@import "mixins/background-variant";
|
||||
@import "mixins/border-radius";
|
||||
@import "mixins/box-shadow";
|
||||
@import "mixins/gradients";
|
||||
@import "mixins/transition";
|
||||
|
||||
// // Layout
|
||||
@import "mixins/clearfix";
|
||||
@import "mixins/grid-framework";
|
||||
@import "mixins/grid";
|
||||
@import "mixins/float";
|
||||
183
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/_modal.scss
vendored
Normal file
183
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/_modal.scss
vendored
Normal file
@ -0,0 +1,183 @@
|
||||
// .modal-open - body class for killing the scroll
|
||||
// .modal - container to scroll within
|
||||
// .modal-dialog - positioning shell for the actual modal
|
||||
// .modal-content - actual modal w/ bg and corners and stuff
|
||||
|
||||
|
||||
.modal-open {
|
||||
// Kill the scroll on the body
|
||||
overflow: hidden;
|
||||
|
||||
.modal {
|
||||
overflow-x: hidden;
|
||||
overflow-y: auto;
|
||||
}
|
||||
}
|
||||
|
||||
// Container that the modal scrolls within
|
||||
.modal {
|
||||
position: fixed;
|
||||
top: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
z-index: $zindex-modal;
|
||||
display: none;
|
||||
overflow: hidden;
|
||||
// Prevent Chrome on Windows from adding a focus outline. For details, see
|
||||
// https://github.com/twbs/bootstrap/pull/10951.
|
||||
outline: 0;
|
||||
// We deliberately don't use `-webkit-overflow-scrolling: touch;` due to a
|
||||
// gnarly iOS Safari bug: https://bugs.webkit.org/show_bug.cgi?id=158342
|
||||
// See also https://github.com/twbs/bootstrap/issues/17695
|
||||
}
|
||||
|
||||
// Shell div to position the modal with bottom padding
|
||||
.modal-dialog {
|
||||
position: relative;
|
||||
width: auto;
|
||||
margin: $modal-dialog-margin;
|
||||
// allow clicks to pass through for custom click handling to close modal
|
||||
pointer-events: none;
|
||||
|
||||
// When fading in the modal, animate it to slide down
|
||||
.modal.fade & {
|
||||
@include transition($modal-transition);
|
||||
transform: translate(0, -25%);
|
||||
}
|
||||
.modal.show & {
|
||||
transform: translate(0, 0);
|
||||
}
|
||||
}
|
||||
.modal.show {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
.modal-dialog-centered {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
min-height: calc(100% - (#{$modal-dialog-margin} * 2));
|
||||
|
||||
// Ensure `modal-dialog-centered` extends the full height of the view (IE10/11)
|
||||
&::before {
|
||||
display: block; // IE10
|
||||
height: calc(100vh - (#{$modal-dialog-margin} * 2));
|
||||
content: "";
|
||||
}
|
||||
}
|
||||
|
||||
// Actual modal
|
||||
.modal-content {
|
||||
position: relative;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
width: 100%; // Ensure `.modal-content` extends the full width of the parent `.modal-dialog`
|
||||
// counteract the pointer-events: none; in the .modal-dialog
|
||||
pointer-events: auto;
|
||||
background-color: $modal-content-bg;
|
||||
background-clip: padding-box;
|
||||
border: $modal-content-border-width solid $modal-content-border-color;
|
||||
@include border-radius($modal-content-border-radius);
|
||||
@include box-shadow($modal-content-box-shadow-xs);
|
||||
// Remove focus outline from opened modal
|
||||
outline: 0;
|
||||
}
|
||||
|
||||
// Modal background
|
||||
.modal-backdrop {
|
||||
position: fixed;
|
||||
top: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
z-index: $zindex-modal-backdrop;
|
||||
background-color: $modal-backdrop-bg;
|
||||
|
||||
// Fade for backdrop
|
||||
&.fade { opacity: 0; }
|
||||
&.show { opacity: $modal-backdrop-opacity; }
|
||||
}
|
||||
|
||||
// Modal header
|
||||
// Top section of the modal w/ title and dismiss
|
||||
.modal-header {
|
||||
display: flex;
|
||||
align-items: flex-start; // so the close btn always stays on the upper right corner
|
||||
justify-content: space-between; // Put modal header elements (title and dismiss) on opposite ends
|
||||
padding: $modal-header-padding;
|
||||
border-bottom: $modal-header-border-width solid $modal-header-border-color;
|
||||
@include border-top-radius($modal-content-border-radius);
|
||||
|
||||
.close {
|
||||
padding: $modal-header-padding;
|
||||
// auto on the left force icon to the right even when there is no .modal-title
|
||||
margin: (-$modal-header-padding) (-$modal-header-padding) (-$modal-header-padding) auto;
|
||||
}
|
||||
}
|
||||
|
||||
// Title text within header
|
||||
.modal-title {
|
||||
margin-bottom: 0;
|
||||
line-height: $modal-title-line-height;
|
||||
}
|
||||
|
||||
// Modal body
|
||||
// Where all modal content resides (sibling of .modal-header and .modal-footer)
|
||||
.modal-body {
|
||||
position: relative;
|
||||
// Enable `flex-grow: 1` so that the body take up as much space as possible
|
||||
// when should there be a fixed height on `.modal-dialog`.
|
||||
flex: 1 1 auto;
|
||||
padding: $modal-inner-padding;
|
||||
}
|
||||
|
||||
// Footer (for actions)
|
||||
.modal-footer {
|
||||
display: flex;
|
||||
align-items: center; // vertically center
|
||||
justify-content: flex-end; // Right align buttons with flex property because text-align doesn't work on flex items
|
||||
padding: $modal-inner-padding;
|
||||
border-top: $modal-footer-border-width solid $modal-footer-border-color;
|
||||
|
||||
// Easily place margin between footer elements
|
||||
> :not(:first-child) { margin-left: .25rem; }
|
||||
> :not(:last-child) { margin-right: .25rem; }
|
||||
}
|
||||
|
||||
// Measure scrollbar width for padding body during modal show/hide
|
||||
.modal-scrollbar-measure {
|
||||
position: absolute;
|
||||
top: -9999px;
|
||||
width: 50px;
|
||||
height: 50px;
|
||||
overflow: scroll;
|
||||
}
|
||||
|
||||
// Scale up the modal
|
||||
@include media-breakpoint-up(sm) {
|
||||
// Automatically set modal's width for larger viewports
|
||||
.modal-dialog {
|
||||
max-width: $modal-md;
|
||||
margin: $modal-dialog-margin-y-sm-up auto;
|
||||
}
|
||||
|
||||
.modal-dialog-centered {
|
||||
min-height: calc(100% - (#{$modal-dialog-margin-y-sm-up} * 2));
|
||||
|
||||
&::before {
|
||||
height: calc(100vh - (#{$modal-dialog-margin-y-sm-up} * 2));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
.modal-content {
|
||||
@include box-shadow($modal-content-box-shadow-sm-up);
|
||||
}
|
||||
|
||||
.modal-sm { max-width: $modal-sm; }
|
||||
|
||||
}
|
||||
|
||||
@include media-breakpoint-up(lg) {
|
||||
.modal-lg { max-width: $modal-lg; }
|
||||
}
|
||||
118
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/_nav.scss
vendored
Normal file
118
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/_nav.scss
vendored
Normal file
@ -0,0 +1,118 @@
|
||||
// Base class
|
||||
//
|
||||
// Kickstart any navigation component with a set of style resets. Works with
|
||||
// `<nav>`s or `<ul>`s.
|
||||
|
||||
.nav {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
padding-left: 0;
|
||||
margin-bottom: 0;
|
||||
list-style: none;
|
||||
}
|
||||
|
||||
.nav-link {
|
||||
display: block;
|
||||
padding: $nav-link-padding-y $nav-link-padding-x;
|
||||
|
||||
@include hover-focus {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
// Disabled state lightens text
|
||||
&.disabled {
|
||||
color: $nav-link-disabled-color;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Tabs
|
||||
//
|
||||
|
||||
.nav-tabs {
|
||||
border-bottom: $nav-tabs-border-width solid $nav-tabs-border-color;
|
||||
|
||||
.nav-item {
|
||||
margin-bottom: -$nav-tabs-border-width;
|
||||
}
|
||||
|
||||
.nav-link {
|
||||
border: $nav-tabs-border-width solid transparent;
|
||||
@include border-top-radius($nav-tabs-border-radius);
|
||||
|
||||
@include hover-focus {
|
||||
border-color: $nav-tabs-link-hover-border-color;
|
||||
}
|
||||
|
||||
&.disabled {
|
||||
color: $nav-link-disabled-color;
|
||||
background-color: transparent;
|
||||
border-color: transparent;
|
||||
}
|
||||
}
|
||||
|
||||
.nav-link.active,
|
||||
.nav-item.show .nav-link {
|
||||
color: $nav-tabs-link-active-color;
|
||||
background-color: $nav-tabs-link-active-bg;
|
||||
border-color: $nav-tabs-link-active-border-color;
|
||||
}
|
||||
|
||||
.dropdown-menu {
|
||||
// Make dropdown border overlap tab border
|
||||
margin-top: -$nav-tabs-border-width;
|
||||
// Remove the top rounded corners here since there is a hard edge above the menu
|
||||
@include border-top-radius(0);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// Pills
|
||||
//
|
||||
|
||||
.nav-pills {
|
||||
.nav-link {
|
||||
@include border-radius($nav-pills-border-radius);
|
||||
}
|
||||
|
||||
.nav-link.active,
|
||||
.show > .nav-link {
|
||||
color: $nav-pills-link-active-color;
|
||||
background-color: $nav-pills-link-active-bg;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// Justified variants
|
||||
//
|
||||
|
||||
.nav-fill {
|
||||
.nav-item {
|
||||
flex: 1 1 auto;
|
||||
text-align: center;
|
||||
}
|
||||
}
|
||||
|
||||
.nav-justified {
|
||||
.nav-item {
|
||||
flex-basis: 0;
|
||||
flex-grow: 1;
|
||||
text-align: center;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Tabbable tabs
|
||||
//
|
||||
// Hide tabbable panes to start, show them when `.active`
|
||||
|
||||
.tab-content {
|
||||
> .tab-pane {
|
||||
display: none;
|
||||
}
|
||||
> .active {
|
||||
display: block;
|
||||
}
|
||||
}
|
||||
299
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/_navbar.scss
vendored
Normal file
299
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/_navbar.scss
vendored
Normal file
@ -0,0 +1,299 @@
|
||||
// Contents
|
||||
//
|
||||
// Navbar
|
||||
// Navbar brand
|
||||
// Navbar nav
|
||||
// Navbar text
|
||||
// Navbar divider
|
||||
// Responsive navbar
|
||||
// Navbar position
|
||||
// Navbar themes
|
||||
|
||||
|
||||
// Navbar
|
||||
//
|
||||
// Provide a static navbar from which we expand to create full-width, fixed, and
|
||||
// other navbar variations.
|
||||
|
||||
.navbar {
|
||||
position: relative;
|
||||
display: flex;
|
||||
flex-wrap: wrap; // allow us to do the line break for collapsing content
|
||||
align-items: center;
|
||||
justify-content: space-between; // space out brand from logo
|
||||
padding: $navbar-padding-y $navbar-padding-x;
|
||||
|
||||
// Because flex properties aren't inherited, we need to redeclare these first
|
||||
// few properties so that content nested within behave properly.
|
||||
> .container,
|
||||
> .container-fluid {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Navbar brand
|
||||
//
|
||||
// Used for brand, project, or site names.
|
||||
|
||||
.navbar-brand {
|
||||
display: inline-block;
|
||||
padding-top: $navbar-brand-padding-y;
|
||||
padding-bottom: $navbar-brand-padding-y;
|
||||
margin-right: $navbar-padding-x;
|
||||
font-size: $navbar-brand-font-size;
|
||||
line-height: inherit;
|
||||
white-space: nowrap;
|
||||
|
||||
@include hover-focus {
|
||||
text-decoration: none;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Navbar nav
|
||||
//
|
||||
// Custom navbar navigation (doesn't require `.nav`, but does make use of `.nav-link`).
|
||||
|
||||
.navbar-nav {
|
||||
display: flex;
|
||||
flex-direction: column; // cannot use `inherit` to get the `.navbar`s value
|
||||
padding-left: 0;
|
||||
margin-bottom: 0;
|
||||
list-style: none;
|
||||
|
||||
.nav-link {
|
||||
padding-right: 0;
|
||||
padding-left: 0;
|
||||
}
|
||||
|
||||
.dropdown-menu {
|
||||
position: static;
|
||||
float: none;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Navbar text
|
||||
//
|
||||
//
|
||||
|
||||
.navbar-text {
|
||||
display: inline-block;
|
||||
padding-top: $nav-link-padding-y;
|
||||
padding-bottom: $nav-link-padding-y;
|
||||
}
|
||||
|
||||
|
||||
// Responsive navbar
|
||||
//
|
||||
// Custom styles for responsive collapsing and toggling of navbar contents.
|
||||
// Powered by the collapse Bootstrap JavaScript plugin.
|
||||
|
||||
// When collapsed, prevent the toggleable navbar contents from appearing in
|
||||
// the default flexbox row orientation. Requires the use of `flex-wrap: wrap`
|
||||
// on the `.navbar` parent.
|
||||
.navbar-collapse {
|
||||
flex-basis: 100%;
|
||||
flex-grow: 1;
|
||||
// For always expanded or extra full navbars, ensure content aligns itself
|
||||
// properly vertically. Can be easily overridden with flex utilities.
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
// Button for toggling the navbar when in its collapsed state
|
||||
.navbar-toggler {
|
||||
padding: $navbar-toggler-padding-y $navbar-toggler-padding-x;
|
||||
font-size: $navbar-toggler-font-size;
|
||||
line-height: 1;
|
||||
background-color: transparent; // remove default button style
|
||||
border: $border-width solid transparent; // remove default button style
|
||||
@include border-radius($navbar-toggler-border-radius);
|
||||
|
||||
@include hover-focus {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
// Opinionated: add "hand" cursor to non-disabled .navbar-toggler elements
|
||||
&:not(:disabled):not(.disabled) {
|
||||
cursor: pointer;
|
||||
}
|
||||
}
|
||||
|
||||
// Keep as a separate element so folks can easily override it with another icon
|
||||
// or image file as needed.
|
||||
.navbar-toggler-icon {
|
||||
display: inline-block;
|
||||
width: 1.5em;
|
||||
height: 1.5em;
|
||||
vertical-align: middle;
|
||||
content: "";
|
||||
background: no-repeat center center;
|
||||
background-size: 100% 100%;
|
||||
}
|
||||
|
||||
// Generate series of `.navbar-expand-*` responsive classes for configuring
|
||||
// where your navbar collapses.
|
||||
.navbar-expand {
|
||||
@each $breakpoint in map-keys($grid-breakpoints) {
|
||||
$next: breakpoint-next($breakpoint, $grid-breakpoints);
|
||||
$infix: breakpoint-infix($next, $grid-breakpoints);
|
||||
|
||||
&#{$infix} {
|
||||
@include media-breakpoint-down($breakpoint) {
|
||||
> .container,
|
||||
> .container-fluid {
|
||||
padding-right: 0;
|
||||
padding-left: 0;
|
||||
}
|
||||
}
|
||||
|
||||
@include media-breakpoint-up($next) {
|
||||
flex-flow: row nowrap;
|
||||
justify-content: flex-start;
|
||||
|
||||
.navbar-nav {
|
||||
flex-direction: row;
|
||||
|
||||
.dropdown-menu {
|
||||
position: absolute;
|
||||
}
|
||||
|
||||
.nav-link {
|
||||
padding-right: $navbar-nav-link-padding-x;
|
||||
padding-left: $navbar-nav-link-padding-x;
|
||||
}
|
||||
}
|
||||
|
||||
// For nesting containers, have to redeclare for alignment purposes
|
||||
> .container,
|
||||
> .container-fluid {
|
||||
flex-wrap: nowrap;
|
||||
}
|
||||
|
||||
.navbar-collapse {
|
||||
display: flex !important; // stylelint-disable-line declaration-no-important
|
||||
|
||||
// Changes flex-bases to auto because of an IE10 bug
|
||||
flex-basis: auto;
|
||||
}
|
||||
|
||||
.navbar-toggler {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Navbar themes
|
||||
//
|
||||
// Styles for switching between navbars with light or dark background.
|
||||
|
||||
// Dark links against a light background
|
||||
.navbar-light {
|
||||
.navbar-brand {
|
||||
color: $navbar-light-active-color;
|
||||
|
||||
@include hover-focus {
|
||||
color: $navbar-light-active-color;
|
||||
}
|
||||
}
|
||||
|
||||
.navbar-nav {
|
||||
.nav-link {
|
||||
color: $navbar-light-color;
|
||||
|
||||
@include hover-focus {
|
||||
color: $navbar-light-hover-color;
|
||||
}
|
||||
|
||||
&.disabled {
|
||||
color: $navbar-light-disabled-color;
|
||||
}
|
||||
}
|
||||
|
||||
.show > .nav-link,
|
||||
.active > .nav-link,
|
||||
.nav-link.show,
|
||||
.nav-link.active {
|
||||
color: $navbar-light-active-color;
|
||||
}
|
||||
}
|
||||
|
||||
.navbar-toggler {
|
||||
color: $navbar-light-color;
|
||||
border-color: $navbar-light-toggler-border-color;
|
||||
}
|
||||
|
||||
.navbar-toggler-icon {
|
||||
background-image: $navbar-light-toggler-icon-bg;
|
||||
}
|
||||
|
||||
.navbar-text {
|
||||
color: $navbar-light-color;
|
||||
a {
|
||||
color: $navbar-light-active-color;
|
||||
|
||||
@include hover-focus {
|
||||
color: $navbar-light-active-color;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// White links against a dark background
|
||||
.navbar-dark {
|
||||
.navbar-brand {
|
||||
color: $navbar-dark-active-color;
|
||||
|
||||
@include hover-focus {
|
||||
color: $navbar-dark-active-color;
|
||||
}
|
||||
}
|
||||
|
||||
.navbar-nav {
|
||||
.nav-link {
|
||||
color: $navbar-dark-color;
|
||||
|
||||
@include hover-focus {
|
||||
color: $navbar-dark-hover-color;
|
||||
}
|
||||
|
||||
&.disabled {
|
||||
color: $navbar-dark-disabled-color;
|
||||
}
|
||||
}
|
||||
|
||||
.show > .nav-link,
|
||||
.active > .nav-link,
|
||||
.nav-link.show,
|
||||
.nav-link.active {
|
||||
color: $navbar-dark-active-color;
|
||||
}
|
||||
}
|
||||
|
||||
.navbar-toggler {
|
||||
color: $navbar-dark-color;
|
||||
border-color: $navbar-dark-toggler-border-color;
|
||||
}
|
||||
|
||||
.navbar-toggler-icon {
|
||||
background-image: $navbar-dark-toggler-icon-bg;
|
||||
}
|
||||
|
||||
.navbar-text {
|
||||
color: $navbar-dark-color;
|
||||
a {
|
||||
color: $navbar-dark-active-color;
|
||||
|
||||
@include hover-focus {
|
||||
color: $navbar-dark-active-color;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
78
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/_pagination.scss
vendored
Normal file
78
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/_pagination.scss
vendored
Normal file
@ -0,0 +1,78 @@
|
||||
.pagination {
|
||||
display: flex;
|
||||
@include list-unstyled();
|
||||
@include border-radius();
|
||||
}
|
||||
|
||||
.page-link {
|
||||
position: relative;
|
||||
display: block;
|
||||
padding: $pagination-padding-y $pagination-padding-x;
|
||||
margin-left: -$pagination-border-width;
|
||||
line-height: $pagination-line-height;
|
||||
color: $pagination-color;
|
||||
background-color: $pagination-bg;
|
||||
border: $pagination-border-width solid $pagination-border-color;
|
||||
|
||||
&:hover {
|
||||
z-index: 2;
|
||||
color: $pagination-hover-color;
|
||||
text-decoration: none;
|
||||
background-color: $pagination-hover-bg;
|
||||
border-color: $pagination-hover-border-color;
|
||||
}
|
||||
|
||||
&:focus {
|
||||
z-index: 2;
|
||||
outline: $pagination-focus-outline;
|
||||
box-shadow: $pagination-focus-box-shadow;
|
||||
}
|
||||
|
||||
// Opinionated: add "hand" cursor to non-disabled .page-link elements
|
||||
&:not(:disabled):not(.disabled) {
|
||||
cursor: pointer;
|
||||
}
|
||||
}
|
||||
|
||||
.page-item {
|
||||
&:first-child {
|
||||
.page-link {
|
||||
margin-left: 0;
|
||||
@include border-left-radius($border-radius);
|
||||
}
|
||||
}
|
||||
&:last-child {
|
||||
.page-link {
|
||||
@include border-right-radius($border-radius);
|
||||
}
|
||||
}
|
||||
|
||||
&.active .page-link {
|
||||
z-index: 1;
|
||||
color: $pagination-active-color;
|
||||
background-color: $pagination-active-bg;
|
||||
border-color: $pagination-active-border-color;
|
||||
}
|
||||
|
||||
&.disabled .page-link {
|
||||
color: $pagination-disabled-color;
|
||||
pointer-events: none;
|
||||
// Opinionated: remove the "hand" cursor set previously for .page-link
|
||||
cursor: auto;
|
||||
background-color: $pagination-disabled-bg;
|
||||
border-color: $pagination-disabled-border-color;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// Sizing
|
||||
//
|
||||
|
||||
.pagination-lg {
|
||||
@include pagination-size($pagination-padding-y-lg, $pagination-padding-x-lg, $font-size-lg, $line-height-lg, $border-radius-lg);
|
||||
}
|
||||
|
||||
.pagination-sm {
|
||||
@include pagination-size($pagination-padding-y-sm, $pagination-padding-x-sm, $font-size-sm, $line-height-sm, $border-radius-sm);
|
||||
}
|
||||
183
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/_popover.scss
vendored
Normal file
183
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/_popover.scss
vendored
Normal file
@ -0,0 +1,183 @@
|
||||
.popover {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
z-index: $zindex-popover;
|
||||
display: block;
|
||||
max-width: $popover-max-width;
|
||||
// Our parent element can be arbitrary since tooltips are by default inserted as a sibling of their target element.
|
||||
// So reset our font and text properties to avoid inheriting weird values.
|
||||
@include reset-text();
|
||||
font-size: $popover-font-size;
|
||||
// Allow breaking very long words so they don't overflow the popover's bounds
|
||||
word-wrap: break-word;
|
||||
background-color: $popover-bg;
|
||||
background-clip: padding-box;
|
||||
border: $popover-border-width solid $popover-border-color;
|
||||
@include border-radius($popover-border-radius);
|
||||
@include box-shadow($popover-box-shadow);
|
||||
|
||||
.arrow {
|
||||
position: absolute;
|
||||
display: block;
|
||||
width: $popover-arrow-width;
|
||||
height: $popover-arrow-height;
|
||||
margin: 0 $border-radius-lg;
|
||||
|
||||
&::before,
|
||||
&::after {
|
||||
position: absolute;
|
||||
display: block;
|
||||
content: "";
|
||||
border-color: transparent;
|
||||
border-style: solid;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.bs-popover-top {
|
||||
margin-bottom: $popover-arrow-height;
|
||||
|
||||
.arrow {
|
||||
bottom: calc((#{$popover-arrow-height} + #{$popover-border-width}) * -1);
|
||||
}
|
||||
|
||||
.arrow::before,
|
||||
.arrow::after {
|
||||
border-width: $popover-arrow-height ($popover-arrow-width / 2) 0;
|
||||
}
|
||||
|
||||
.arrow::before {
|
||||
bottom: 0;
|
||||
border-top-color: $popover-arrow-outer-color;
|
||||
}
|
||||
|
||||
.arrow::after {
|
||||
bottom: $popover-border-width;
|
||||
border-top-color: $popover-arrow-color;
|
||||
}
|
||||
}
|
||||
|
||||
.bs-popover-right {
|
||||
margin-left: $popover-arrow-height;
|
||||
|
||||
.arrow {
|
||||
left: calc((#{$popover-arrow-height} + #{$popover-border-width}) * -1);
|
||||
width: $popover-arrow-height;
|
||||
height: $popover-arrow-width;
|
||||
margin: $border-radius-lg 0; // make sure the arrow does not touch the popover's rounded corners
|
||||
}
|
||||
|
||||
.arrow::before,
|
||||
.arrow::after {
|
||||
border-width: ($popover-arrow-width / 2) $popover-arrow-height ($popover-arrow-width / 2) 0;
|
||||
}
|
||||
|
||||
.arrow::before {
|
||||
left: 0;
|
||||
border-right-color: $popover-arrow-outer-color;
|
||||
}
|
||||
|
||||
.arrow::after {
|
||||
left: $popover-border-width;
|
||||
border-right-color: $popover-arrow-color;
|
||||
}
|
||||
}
|
||||
|
||||
.bs-popover-bottom {
|
||||
margin-top: $popover-arrow-height;
|
||||
|
||||
.arrow {
|
||||
top: calc((#{$popover-arrow-height} + #{$popover-border-width}) * -1);
|
||||
}
|
||||
|
||||
.arrow::before,
|
||||
.arrow::after {
|
||||
border-width: 0 ($popover-arrow-width / 2) $popover-arrow-height ($popover-arrow-width / 2);
|
||||
}
|
||||
|
||||
.arrow::before {
|
||||
top: 0;
|
||||
border-bottom-color: $popover-arrow-outer-color;
|
||||
}
|
||||
|
||||
.arrow::after {
|
||||
top: $popover-border-width;
|
||||
border-bottom-color: $popover-arrow-color;
|
||||
}
|
||||
|
||||
// This will remove the popover-header's border just below the arrow
|
||||
.popover-header::before {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 50%;
|
||||
display: block;
|
||||
width: $popover-arrow-width;
|
||||
margin-left: ($popover-arrow-width / -2);
|
||||
content: "";
|
||||
border-bottom: $popover-border-width solid $popover-header-bg;
|
||||
}
|
||||
}
|
||||
|
||||
.bs-popover-left {
|
||||
margin-right: $popover-arrow-height;
|
||||
|
||||
.arrow {
|
||||
right: calc((#{$popover-arrow-height} + #{$popover-border-width}) * -1);
|
||||
width: $popover-arrow-height;
|
||||
height: $popover-arrow-width;
|
||||
margin: $border-radius-lg 0; // make sure the arrow does not touch the popover's rounded corners
|
||||
}
|
||||
|
||||
.arrow::before,
|
||||
.arrow::after {
|
||||
border-width: ($popover-arrow-width / 2) 0 ($popover-arrow-width / 2) $popover-arrow-height;
|
||||
}
|
||||
|
||||
.arrow::before {
|
||||
right: 0;
|
||||
border-left-color: $popover-arrow-outer-color;
|
||||
}
|
||||
|
||||
.arrow::after {
|
||||
right: $popover-border-width;
|
||||
border-left-color: $popover-arrow-color;
|
||||
}
|
||||
}
|
||||
|
||||
.bs-popover-auto {
|
||||
&[x-placement^="top"] {
|
||||
@extend .bs-popover-top;
|
||||
}
|
||||
&[x-placement^="right"] {
|
||||
@extend .bs-popover-right;
|
||||
}
|
||||
&[x-placement^="bottom"] {
|
||||
@extend .bs-popover-bottom;
|
||||
}
|
||||
&[x-placement^="left"] {
|
||||
@extend .bs-popover-left;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Offset the popover to account for the popover arrow
|
||||
.popover-header {
|
||||
padding: $popover-header-padding-y $popover-header-padding-x;
|
||||
margin-bottom: 0; // Reset the default from Reboot
|
||||
font-size: $font-size-base;
|
||||
color: $popover-header-color;
|
||||
background-color: $popover-header-bg;
|
||||
border-bottom: $popover-border-width solid darken($popover-header-bg, 5%);
|
||||
$offset-border-width: calc(#{$border-radius-lg} - #{$popover-border-width});
|
||||
@include border-top-radius($offset-border-width);
|
||||
|
||||
&:empty {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
.popover-body {
|
||||
padding: $popover-body-padding-y $popover-body-padding-x;
|
||||
color: $popover-body-color;
|
||||
}
|
||||
463
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/_reboot.scss
vendored
Normal file
463
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/_reboot.scss
vendored
Normal file
@ -0,0 +1,463 @@
|
||||
// stylelint-disable at-rule-no-vendor-prefix, declaration-no-important, selector-no-qualifying-type, property-no-vendor-prefix
|
||||
|
||||
// Reboot
|
||||
//
|
||||
// Normalization of HTML elements, manually forked from Normalize.css to remove
|
||||
// styles targeting irrelevant browsers while applying new styles.
|
||||
//
|
||||
// Normalize is licensed MIT. https://github.com/necolas/normalize.css
|
||||
|
||||
|
||||
// Document
|
||||
//
|
||||
// 1. Change from `box-sizing: content-box` so that `width` is not affected by `padding` or `border`.
|
||||
// 2. Change the default font family in all browsers.
|
||||
// 3. Correct the line height in all browsers.
|
||||
// 4. Prevent adjustments of font size after orientation changes in IE on Windows Phone and in iOS.
|
||||
// 5. Setting @viewport causes scrollbars to overlap content in IE11 and Edge, so
|
||||
// we force a non-overlapping, non-auto-hiding scrollbar to counteract.
|
||||
// 6. Change the default tap highlight to be completely transparent in iOS.
|
||||
|
||||
*,
|
||||
*::before,
|
||||
*::after {
|
||||
box-sizing: border-box; // 1
|
||||
}
|
||||
|
||||
html {
|
||||
font-family: sans-serif; // 2
|
||||
line-height: 1.15; // 3
|
||||
-webkit-text-size-adjust: 100%; // 4
|
||||
-ms-text-size-adjust: 100%; // 4
|
||||
-ms-overflow-style: scrollbar; // 5
|
||||
-webkit-tap-highlight-color: rgba($black, 0); // 6
|
||||
}
|
||||
|
||||
// IE10+ doesn't honor `<meta name="viewport">` in some cases.
|
||||
@at-root {
|
||||
@-ms-viewport {
|
||||
width: device-width;
|
||||
}
|
||||
}
|
||||
|
||||
// stylelint-disable selector-list-comma-newline-after
|
||||
// Shim for "new" HTML5 structural elements to display correctly (IE10, older browsers)
|
||||
article, aside, figcaption, figure, footer, header, hgroup, main, nav, section {
|
||||
display: block;
|
||||
}
|
||||
|
||||
// stylelint-enable selector-list-comma-newline-after
|
||||
|
||||
// Body
|
||||
//
|
||||
// 1. Remove the margin in all browsers.
|
||||
// 2. As a best practice, apply a default `background-color`.
|
||||
// 3. Set an explicit initial text-align value so that we can later use the
|
||||
// the `inherit` value on things like `<th>` elements.
|
||||
|
||||
body {
|
||||
margin: 0; // 1
|
||||
font-family: $font-family-base;
|
||||
font-size: $font-size-base;
|
||||
font-weight: $font-weight-base;
|
||||
line-height: $line-height-base;
|
||||
color: $body-color;
|
||||
text-align: left; // 3
|
||||
background-color: $body-bg; // 2
|
||||
}
|
||||
|
||||
// Suppress the focus outline on elements that cannot be accessed via keyboard.
|
||||
// This prevents an unwanted focus outline from appearing around elements that
|
||||
// might still respond to pointer events.
|
||||
//
|
||||
// Credit: https://github.com/suitcss/base
|
||||
[tabindex="-1"]:focus {
|
||||
outline: 0 !important;
|
||||
}
|
||||
|
||||
|
||||
// Content grouping
|
||||
//
|
||||
// 1. Add the correct box sizing in Firefox.
|
||||
// 2. Show the overflow in Edge and IE.
|
||||
|
||||
hr {
|
||||
box-sizing: content-box; // 1
|
||||
height: 0; // 1
|
||||
overflow: visible; // 2
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// Typography
|
||||
//
|
||||
|
||||
// Remove top margins from headings
|
||||
//
|
||||
// By default, `<h1>`-`<h6>` all receive top and bottom margins. We nuke the top
|
||||
// margin for easier control within type scales as it avoids margin collapsing.
|
||||
// stylelint-disable selector-list-comma-newline-after
|
||||
h1, h2, h3, h4, h5, h6 {
|
||||
margin-top: 0;
|
||||
margin-bottom: $headings-margin-bottom;
|
||||
}
|
||||
// stylelint-enable selector-list-comma-newline-after
|
||||
|
||||
// Reset margins on paragraphs
|
||||
//
|
||||
// Similarly, the top margin on `<p>`s get reset. However, we also reset the
|
||||
// bottom margin to use `rem` units instead of `em`.
|
||||
p {
|
||||
margin-top: 0;
|
||||
margin-bottom: $paragraph-margin-bottom;
|
||||
}
|
||||
|
||||
ol,
|
||||
ul,
|
||||
dl {
|
||||
margin-top: 0;
|
||||
margin-bottom: 1rem;
|
||||
}
|
||||
|
||||
ol ol,
|
||||
ul ul,
|
||||
ol ul,
|
||||
ul ol {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
dt {
|
||||
font-weight: $dt-font-weight;
|
||||
}
|
||||
|
||||
dd {
|
||||
margin-bottom: .5rem;
|
||||
margin-left: 0; // Undo browser default
|
||||
}
|
||||
|
||||
blockquote {
|
||||
margin: 0 0 1rem;
|
||||
}
|
||||
|
||||
dfn {
|
||||
font-style: italic; // Add the correct font style in Android 4.3-
|
||||
}
|
||||
|
||||
// stylelint-disable font-weight-notation
|
||||
b,
|
||||
strong {
|
||||
font-weight: bolder; // Add the correct font weight in Chrome, Edge, and Safari
|
||||
}
|
||||
// stylelint-enable font-weight-notation
|
||||
|
||||
small {
|
||||
font-size: 80%; // Add the correct font size in all browsers
|
||||
}
|
||||
|
||||
//
|
||||
// Prevent `sub` and `sup` elements from affecting the line height in
|
||||
// all browsers.
|
||||
//
|
||||
|
||||
sub,
|
||||
sup {
|
||||
position: relative;
|
||||
font-size: 75%;
|
||||
line-height: 0;
|
||||
vertical-align: baseline;
|
||||
}
|
||||
|
||||
sub { bottom: -.25em; }
|
||||
sup { top: -.5em; }
|
||||
|
||||
|
||||
//
|
||||
// Links
|
||||
//
|
||||
|
||||
a {
|
||||
color: $link-color;
|
||||
text-decoration: $link-decoration;
|
||||
background-color: transparent; // Remove the gray background on active links in IE 10.
|
||||
-webkit-text-decoration-skip: objects; // Remove gaps in links underline in iOS 8+ and Safari 8+.
|
||||
|
||||
@include hover {
|
||||
color: $link-hover-color;
|
||||
text-decoration: $link-hover-decoration;
|
||||
}
|
||||
}
|
||||
|
||||
// And undo these styles for placeholder links/named anchors (without href)
|
||||
// which have not been made explicitly keyboard-focusable (without tabindex).
|
||||
// It would be more straightforward to just use a[href] in previous block, but that
|
||||
// causes specificity issues in many other styles that are too complex to fix.
|
||||
// See https://github.com/twbs/bootstrap/issues/19402
|
||||
|
||||
a:not([href]):not([tabindex]) {
|
||||
color: inherit;
|
||||
text-decoration: none;
|
||||
|
||||
@include hover-focus {
|
||||
color: inherit;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
&:focus {
|
||||
outline: 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// Code
|
||||
//
|
||||
|
||||
pre,
|
||||
code,
|
||||
kbd,
|
||||
samp {
|
||||
font-family: $font-family-monospace;
|
||||
font-size: 1em; // Correct the odd `em` font sizing in all browsers.
|
||||
}
|
||||
|
||||
pre {
|
||||
// Remove browser default top margin
|
||||
margin-top: 0;
|
||||
// Reset browser default of `1em` to use `rem`s
|
||||
margin-bottom: 1rem;
|
||||
// Don't allow content to break outside
|
||||
overflow: auto;
|
||||
// We have @viewport set which causes scrollbars to overlap content in IE11 and Edge, so
|
||||
// we force a non-overlapping, non-auto-hiding scrollbar to counteract.
|
||||
-ms-overflow-style: scrollbar;
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// Figures
|
||||
//
|
||||
|
||||
figure {
|
||||
// Apply a consistent margin strategy (matches our type styles).
|
||||
margin: 0 0 1rem;
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// Images and content
|
||||
//
|
||||
|
||||
img {
|
||||
vertical-align: middle;
|
||||
border-style: none; // Remove the border on images inside links in IE 10-.
|
||||
}
|
||||
|
||||
svg {
|
||||
// Workaround for the SVG overflow bug in IE10/11 is still required.
|
||||
// See https://github.com/twbs/bootstrap/issues/26878
|
||||
overflow: hidden;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// Tables
|
||||
//
|
||||
|
||||
table {
|
||||
border-collapse: collapse; // Prevent double borders
|
||||
}
|
||||
|
||||
caption {
|
||||
padding-top: $table-cell-padding;
|
||||
padding-bottom: $table-cell-padding;
|
||||
color: $table-caption-color;
|
||||
text-align: left;
|
||||
caption-side: bottom;
|
||||
}
|
||||
|
||||
th {
|
||||
// Matches default `<td>` alignment by inheriting from the `<body>`, or the
|
||||
// closest parent with a set `text-align`.
|
||||
text-align: inherit;
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// Forms
|
||||
//
|
||||
|
||||
label {
|
||||
// Allow labels to use `margin` for spacing.
|
||||
display: inline-block;
|
||||
margin-bottom: $label-margin-bottom;
|
||||
}
|
||||
|
||||
// Remove the default `border-radius` that macOS Chrome adds.
|
||||
//
|
||||
// Details at https://github.com/twbs/bootstrap/issues/24093
|
||||
button {
|
||||
border-radius: 0;
|
||||
}
|
||||
|
||||
// Work around a Firefox/IE bug where the transparent `button` background
|
||||
// results in a loss of the default `button` focus styles.
|
||||
//
|
||||
// Credit: https://github.com/suitcss/base/
|
||||
button:focus {
|
||||
outline: 1px dotted;
|
||||
outline: 5px auto -webkit-focus-ring-color;
|
||||
}
|
||||
|
||||
input,
|
||||
button,
|
||||
select,
|
||||
optgroup,
|
||||
textarea {
|
||||
margin: 0; // Remove the margin in Firefox and Safari
|
||||
font-family: inherit;
|
||||
font-size: inherit;
|
||||
line-height: inherit;
|
||||
}
|
||||
|
||||
button,
|
||||
input {
|
||||
overflow: visible; // Show the overflow in Edge
|
||||
}
|
||||
|
||||
button,
|
||||
select {
|
||||
text-transform: none; // Remove the inheritance of text transform in Firefox
|
||||
}
|
||||
|
||||
// 1. Prevent a WebKit bug where (2) destroys native `audio` and `video`
|
||||
// controls in Android 4.
|
||||
// 2. Correct the inability to style clickable types in iOS and Safari.
|
||||
button,
|
||||
html [type="button"], // 1
|
||||
[type="reset"],
|
||||
[type="submit"] {
|
||||
-webkit-appearance: button; // 2
|
||||
}
|
||||
|
||||
// Remove inner border and padding from Firefox, but don't restore the outline like Normalize.
|
||||
button::-moz-focus-inner,
|
||||
[type="button"]::-moz-focus-inner,
|
||||
[type="reset"]::-moz-focus-inner,
|
||||
[type="submit"]::-moz-focus-inner {
|
||||
padding: 0;
|
||||
border-style: none;
|
||||
}
|
||||
|
||||
input[type="radio"],
|
||||
input[type="checkbox"] {
|
||||
box-sizing: border-box; // 1. Add the correct box sizing in IE 10-
|
||||
padding: 0; // 2. Remove the padding in IE 10-
|
||||
}
|
||||
|
||||
|
||||
input[type="date"],
|
||||
input[type="time"],
|
||||
input[type="datetime-local"],
|
||||
input[type="month"] {
|
||||
// Remove the default appearance of temporal inputs to avoid a Mobile Safari
|
||||
// bug where setting a custom line-height prevents text from being vertically
|
||||
// centered within the input.
|
||||
// See https://bugs.webkit.org/show_bug.cgi?id=139848
|
||||
// and https://github.com/twbs/bootstrap/issues/11266
|
||||
-webkit-appearance: listbox;
|
||||
}
|
||||
|
||||
textarea {
|
||||
overflow: auto; // Remove the default vertical scrollbar in IE.
|
||||
// Textareas should really only resize vertically so they don't break their (horizontal) containers.
|
||||
resize: vertical;
|
||||
}
|
||||
|
||||
fieldset {
|
||||
// Browsers set a default `min-width: min-content;` on fieldsets,
|
||||
// unlike e.g. `<div>`s, which have `min-width: 0;` by default.
|
||||
// So we reset that to ensure fieldsets behave more like a standard block element.
|
||||
// See https://github.com/twbs/bootstrap/issues/12359
|
||||
// and https://html.spec.whatwg.org/multipage/#the-fieldset-and-legend-elements
|
||||
min-width: 0;
|
||||
// Reset the default outline behavior of fieldsets so they don't affect page layout.
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
border: 0;
|
||||
}
|
||||
|
||||
// 1. Correct the text wrapping in Edge and IE.
|
||||
// 2. Correct the color inheritance from `fieldset` elements in IE.
|
||||
legend {
|
||||
display: block;
|
||||
width: 100%;
|
||||
max-width: 100%; // 1
|
||||
padding: 0;
|
||||
margin-bottom: .5rem;
|
||||
font-size: 1.5rem;
|
||||
line-height: inherit;
|
||||
color: inherit; // 2
|
||||
white-space: normal; // 1
|
||||
}
|
||||
|
||||
progress {
|
||||
vertical-align: baseline; // Add the correct vertical alignment in Chrome, Firefox, and Opera.
|
||||
}
|
||||
|
||||
// Correct the cursor style of increment and decrement buttons in Chrome.
|
||||
[type="number"]::-webkit-inner-spin-button,
|
||||
[type="number"]::-webkit-outer-spin-button {
|
||||
height: auto;
|
||||
}
|
||||
|
||||
[type="search"] {
|
||||
// This overrides the extra rounded corners on search inputs in iOS so that our
|
||||
// `.form-control` class can properly style them. Note that this cannot simply
|
||||
// be added to `.form-control` as it's not specific enough. For details, see
|
||||
// https://github.com/twbs/bootstrap/issues/11586.
|
||||
outline-offset: -2px; // 2. Correct the outline style in Safari.
|
||||
-webkit-appearance: none;
|
||||
}
|
||||
|
||||
//
|
||||
// Remove the inner padding and cancel buttons in Chrome and Safari on macOS.
|
||||
//
|
||||
|
||||
[type="search"]::-webkit-search-cancel-button,
|
||||
[type="search"]::-webkit-search-decoration {
|
||||
-webkit-appearance: none;
|
||||
}
|
||||
|
||||
//
|
||||
// 1. Correct the inability to style clickable types in iOS and Safari.
|
||||
// 2. Change font properties to `inherit` in Safari.
|
||||
//
|
||||
|
||||
::-webkit-file-upload-button {
|
||||
font: inherit; // 2
|
||||
-webkit-appearance: button; // 1
|
||||
}
|
||||
|
||||
//
|
||||
// Correct element displays
|
||||
//
|
||||
|
||||
output {
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
summary {
|
||||
display: list-item; // Add the correct display in all browsers
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
template {
|
||||
display: none; // Add the correct display in IE
|
||||
}
|
||||
|
||||
// Always hide an element with the `hidden` HTML attribute (from PureCSS).
|
||||
// Needed for proper display in IE 10-.
|
||||
[hidden] {
|
||||
display: none !important;
|
||||
}
|
||||
19
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/_root.scss
vendored
Normal file
19
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/_root.scss
vendored
Normal file
@ -0,0 +1,19 @@
|
||||
:root {
|
||||
// Custom variable values only support SassScript inside `#{}`.
|
||||
@each $color, $value in $colors {
|
||||
--#{$color}: #{$value};
|
||||
}
|
||||
|
||||
@each $color, $value in $theme-colors {
|
||||
--#{$color}: #{$value};
|
||||
}
|
||||
|
||||
@each $bp, $value in $grid-breakpoints {
|
||||
--breakpoint-#{$bp}: #{$value};
|
||||
}
|
||||
|
||||
// Use `inspect` for lists so that quoted items keep the quotes.
|
||||
// See https://github.com/sass/sass/issues/2383#issuecomment-336349172
|
||||
--font-family-sans-serif: #{inspect($font-family-sans-serif)};
|
||||
--font-family-monospace: #{inspect($font-family-monospace)};
|
||||
}
|
||||
187
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/_tables.scss
vendored
Normal file
187
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/_tables.scss
vendored
Normal file
@ -0,0 +1,187 @@
|
||||
//
|
||||
// Basic Bootstrap table
|
||||
//
|
||||
|
||||
.table {
|
||||
width: 100%;
|
||||
margin-bottom: $spacer;
|
||||
background-color: $table-bg; // Reset for nesting within parents with `background-color`.
|
||||
|
||||
th,
|
||||
td {
|
||||
padding: $table-cell-padding;
|
||||
vertical-align: top;
|
||||
border-top: $table-border-width solid $table-border-color;
|
||||
}
|
||||
|
||||
thead th {
|
||||
vertical-align: bottom;
|
||||
border-bottom: (2 * $table-border-width) solid $table-border-color;
|
||||
}
|
||||
|
||||
tbody + tbody {
|
||||
border-top: (2 * $table-border-width) solid $table-border-color;
|
||||
}
|
||||
|
||||
.table {
|
||||
background-color: $body-bg;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// Condensed table w/ half padding
|
||||
//
|
||||
|
||||
.table-sm {
|
||||
th,
|
||||
td {
|
||||
padding: $table-cell-padding-sm;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Border versions
|
||||
//
|
||||
// Add or remove borders all around the table and between all the columns.
|
||||
|
||||
.table-bordered {
|
||||
border: $table-border-width solid $table-border-color;
|
||||
|
||||
th,
|
||||
td {
|
||||
border: $table-border-width solid $table-border-color;
|
||||
}
|
||||
|
||||
thead {
|
||||
th,
|
||||
td {
|
||||
border-bottom-width: (2 * $table-border-width);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.table-borderless {
|
||||
th,
|
||||
td,
|
||||
thead th,
|
||||
tbody + tbody {
|
||||
border: 0;
|
||||
}
|
||||
}
|
||||
|
||||
// Zebra-striping
|
||||
//
|
||||
// Default zebra-stripe styles (alternating gray and transparent backgrounds)
|
||||
|
||||
.table-striped {
|
||||
tbody tr:nth-of-type(#{$table-striped-order}) {
|
||||
background-color: $table-accent-bg;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Hover effect
|
||||
//
|
||||
// Placed here since it has to come after the potential zebra striping
|
||||
|
||||
.table-hover {
|
||||
tbody tr {
|
||||
@include hover {
|
||||
background-color: $table-hover-bg;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Table backgrounds
|
||||
//
|
||||
// Exact selectors below required to override `.table-striped` and prevent
|
||||
// inheritance to nested tables.
|
||||
|
||||
@each $color, $value in $theme-colors {
|
||||
@include table-row-variant($color, theme-color-level($color, -9));
|
||||
}
|
||||
|
||||
@include table-row-variant(active, $table-active-bg);
|
||||
|
||||
|
||||
// Dark styles
|
||||
//
|
||||
// Same table markup, but inverted color scheme: dark background and light text.
|
||||
|
||||
// stylelint-disable-next-line no-duplicate-selectors
|
||||
.table {
|
||||
.thead-dark {
|
||||
th {
|
||||
color: $table-dark-color;
|
||||
background-color: $table-dark-bg;
|
||||
border-color: $table-dark-border-color;
|
||||
}
|
||||
}
|
||||
|
||||
.thead-light {
|
||||
th {
|
||||
color: $table-head-color;
|
||||
background-color: $table-head-bg;
|
||||
border-color: $table-border-color;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.table-dark {
|
||||
color: $table-dark-color;
|
||||
background-color: $table-dark-bg;
|
||||
|
||||
th,
|
||||
td,
|
||||
thead th {
|
||||
border-color: $table-dark-border-color;
|
||||
}
|
||||
|
||||
&.table-bordered {
|
||||
border: 0;
|
||||
}
|
||||
|
||||
&.table-striped {
|
||||
tbody tr:nth-of-type(odd) {
|
||||
background-color: $table-dark-accent-bg;
|
||||
}
|
||||
}
|
||||
|
||||
&.table-hover {
|
||||
tbody tr {
|
||||
@include hover {
|
||||
background-color: $table-dark-hover-bg;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Responsive tables
|
||||
//
|
||||
// Generate series of `.table-responsive-*` classes for configuring the screen
|
||||
// size of where your table will overflow.
|
||||
|
||||
.table-responsive {
|
||||
@each $breakpoint in map-keys($grid-breakpoints) {
|
||||
$next: breakpoint-next($breakpoint, $grid-breakpoints);
|
||||
$infix: breakpoint-infix($next, $grid-breakpoints);
|
||||
|
||||
&#{$infix} {
|
||||
@include media-breakpoint-down($breakpoint) {
|
||||
display: block;
|
||||
width: 100%;
|
||||
overflow-x: auto;
|
||||
-webkit-overflow-scrolling: touch;
|
||||
-ms-overflow-style: -ms-autohiding-scrollbar; // See https://github.com/twbs/bootstrap/pull/10057
|
||||
|
||||
// Prevent double border on horizontal scroll due to use of `display: block;`
|
||||
> .table-bordered {
|
||||
border: 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
115
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/_tooltip.scss
vendored
Normal file
115
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/_tooltip.scss
vendored
Normal file
@ -0,0 +1,115 @@
|
||||
// Base class
|
||||
.tooltip {
|
||||
position: absolute;
|
||||
z-index: $zindex-tooltip;
|
||||
display: block;
|
||||
margin: $tooltip-margin;
|
||||
// Our parent element can be arbitrary since tooltips are by default inserted as a sibling of their target element.
|
||||
// So reset our font and text properties to avoid inheriting weird values.
|
||||
@include reset-text();
|
||||
font-size: $tooltip-font-size;
|
||||
// Allow breaking very long words so they don't overflow the tooltip's bounds
|
||||
word-wrap: break-word;
|
||||
opacity: 0;
|
||||
|
||||
&.show { opacity: $tooltip-opacity; }
|
||||
|
||||
.arrow {
|
||||
position: absolute;
|
||||
display: block;
|
||||
width: $tooltip-arrow-width;
|
||||
height: $tooltip-arrow-height;
|
||||
|
||||
&::before {
|
||||
position: absolute;
|
||||
content: "";
|
||||
border-color: transparent;
|
||||
border-style: solid;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.bs-tooltip-top {
|
||||
padding: $tooltip-arrow-height 0;
|
||||
|
||||
.arrow {
|
||||
bottom: 0;
|
||||
|
||||
&::before {
|
||||
top: 0;
|
||||
border-width: $tooltip-arrow-height ($tooltip-arrow-width / 2) 0;
|
||||
border-top-color: $tooltip-arrow-color;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.bs-tooltip-right {
|
||||
padding: 0 $tooltip-arrow-height;
|
||||
|
||||
.arrow {
|
||||
left: 0;
|
||||
width: $tooltip-arrow-height;
|
||||
height: $tooltip-arrow-width;
|
||||
|
||||
&::before {
|
||||
right: 0;
|
||||
border-width: ($tooltip-arrow-width / 2) $tooltip-arrow-height ($tooltip-arrow-width / 2) 0;
|
||||
border-right-color: $tooltip-arrow-color;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.bs-tooltip-bottom {
|
||||
padding: $tooltip-arrow-height 0;
|
||||
|
||||
.arrow {
|
||||
top: 0;
|
||||
|
||||
&::before {
|
||||
bottom: 0;
|
||||
border-width: 0 ($tooltip-arrow-width / 2) $tooltip-arrow-height;
|
||||
border-bottom-color: $tooltip-arrow-color;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.bs-tooltip-left {
|
||||
padding: 0 $tooltip-arrow-height;
|
||||
|
||||
.arrow {
|
||||
right: 0;
|
||||
width: $tooltip-arrow-height;
|
||||
height: $tooltip-arrow-width;
|
||||
|
||||
&::before {
|
||||
left: 0;
|
||||
border-width: ($tooltip-arrow-width / 2) 0 ($tooltip-arrow-width / 2) $tooltip-arrow-height;
|
||||
border-left-color: $tooltip-arrow-color;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.bs-tooltip-auto {
|
||||
&[x-placement^="top"] {
|
||||
@extend .bs-tooltip-top;
|
||||
}
|
||||
&[x-placement^="right"] {
|
||||
@extend .bs-tooltip-right;
|
||||
}
|
||||
&[x-placement^="bottom"] {
|
||||
@extend .bs-tooltip-bottom;
|
||||
}
|
||||
&[x-placement^="left"] {
|
||||
@extend .bs-tooltip-left;
|
||||
}
|
||||
}
|
||||
|
||||
// Wrapper for the tooltip content
|
||||
.tooltip-inner {
|
||||
max-width: $tooltip-max-width;
|
||||
padding: $tooltip-padding-y $tooltip-padding-x;
|
||||
color: $tooltip-color;
|
||||
text-align: center;
|
||||
background-color: $tooltip-bg;
|
||||
@include border-radius($tooltip-border-radius);
|
||||
}
|
||||
22
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/_transitions.scss
vendored
Normal file
22
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/_transitions.scss
vendored
Normal file
@ -0,0 +1,22 @@
|
||||
// stylelint-disable selector-no-qualifying-type
|
||||
|
||||
.fade {
|
||||
@include transition($transition-fade);
|
||||
|
||||
&:not(.show) {
|
||||
opacity: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.collapse {
|
||||
&:not(.show) {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
.collapsing {
|
||||
position: relative;
|
||||
height: 0;
|
||||
overflow: hidden;
|
||||
@include transition($transition-collapse);
|
||||
}
|
||||
48
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/_type.scss
vendored
Normal file
48
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/_type.scss
vendored
Normal file
@ -0,0 +1,48 @@
|
||||
// stylelint-disable declaration-no-important, selector-list-comma-newline-after
|
||||
|
||||
//
|
||||
// Headings
|
||||
//
|
||||
|
||||
h1, h2, h3, h4, h5, h6,
|
||||
.h1, .h2, .h3, .h4, .h5, .h6 {
|
||||
margin-bottom: $headings-margin-bottom;
|
||||
font-family: $headings-font-family;
|
||||
font-weight: $headings-font-weight;
|
||||
line-height: $headings-line-height;
|
||||
color: $headings-color;
|
||||
}
|
||||
|
||||
h1, .h1 { font-size: $h1-font-size; }
|
||||
h2, .h2 { font-size: $h2-font-size; }
|
||||
h3, .h3 { font-size: $h3-font-size; }
|
||||
h4, .h4 { font-size: $h4-font-size; }
|
||||
h5, .h5 { font-size: $h5-font-size; }
|
||||
h6, .h6 { font-size: $h6-font-size; }
|
||||
|
||||
.lead {
|
||||
font-size: $lead-font-size;
|
||||
font-weight: $lead-font-weight;
|
||||
}
|
||||
|
||||
//
|
||||
// Horizontal rules
|
||||
//
|
||||
|
||||
hr {
|
||||
margin-top: $hr-margin-y;
|
||||
margin-bottom: $hr-margin-y;
|
||||
border: 0;
|
||||
border-top: $hr-border-width solid $hr-border-color;
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// Emphasis
|
||||
//
|
||||
|
||||
small,
|
||||
.small {
|
||||
font-size: $small-font-size;
|
||||
font-weight: $font-weight-normal;
|
||||
}
|
||||
184
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/_utilities.scss
vendored
Normal file
184
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/_utilities.scss
vendored
Normal file
@ -0,0 +1,184 @@
|
||||
// stylelint-disable declaration-no-important
|
||||
|
||||
// Margin and Padding
|
||||
|
||||
@each $breakpoint in map-keys($grid-breakpoints) {
|
||||
@include media-breakpoint-up($breakpoint) {
|
||||
$infix: breakpoint-infix($breakpoint, $grid-breakpoints);
|
||||
|
||||
@each $prop, $abbrev in (margin: m, padding: p) {
|
||||
@each $size, $length in $spacers {
|
||||
|
||||
.#{$abbrev}#{$infix}-#{$size} {
|
||||
#{$prop}: $length !important;
|
||||
}
|
||||
.#{$abbrev}t#{$infix}-#{$size},
|
||||
.#{$abbrev}y#{$infix}-#{$size} {
|
||||
#{$prop}-top: $length !important;
|
||||
}
|
||||
.#{$abbrev}r#{$infix}-#{$size},
|
||||
.#{$abbrev}x#{$infix}-#{$size} {
|
||||
#{$prop}-right: $length !important;
|
||||
}
|
||||
.#{$abbrev}b#{$infix}-#{$size},
|
||||
.#{$abbrev}y#{$infix}-#{$size} {
|
||||
#{$prop}-bottom: $length !important;
|
||||
}
|
||||
.#{$abbrev}l#{$infix}-#{$size},
|
||||
.#{$abbrev}x#{$infix}-#{$size} {
|
||||
#{$prop}-left: $length !important;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Some special margin utils
|
||||
.m#{$infix}-auto {
|
||||
margin: auto !important;
|
||||
}
|
||||
.mt#{$infix}-auto,
|
||||
.my#{$infix}-auto {
|
||||
margin-top: auto !important;
|
||||
}
|
||||
.mr#{$infix}-auto,
|
||||
.mx#{$infix}-auto {
|
||||
margin-right: auto !important;
|
||||
}
|
||||
.mb#{$infix}-auto,
|
||||
.my#{$infix}-auto {
|
||||
margin-bottom: auto !important;
|
||||
}
|
||||
.ml#{$infix}-auto,
|
||||
.mx#{$infix}-auto {
|
||||
margin-left: auto !important;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@each $color, $value in $theme-colors {
|
||||
@include bg-variant(".bg-#{$color}", $value);
|
||||
}
|
||||
|
||||
@if $enable-gradients {
|
||||
@each $color, $value in $theme-colors {
|
||||
@include bg-gradient-variant(".bg-gradient-#{$color}", $value);
|
||||
}
|
||||
}
|
||||
|
||||
.bg-white {
|
||||
background-color: $white !important;
|
||||
}
|
||||
|
||||
.bg-transparent {
|
||||
background-color: transparent !important;
|
||||
}
|
||||
|
||||
.text-monospace { font-family: $font-family-monospace; }
|
||||
|
||||
// Alignment
|
||||
|
||||
.text-justify { text-align: justify !important; }
|
||||
.text-nowrap { white-space: nowrap !important; }
|
||||
.text-truncate { @include text-truncate; }
|
||||
|
||||
// Responsive alignment
|
||||
|
||||
@each $breakpoint in map-keys($grid-breakpoints) {
|
||||
@include media-breakpoint-up($breakpoint) {
|
||||
$infix: breakpoint-infix($breakpoint, $grid-breakpoints);
|
||||
|
||||
.text#{$infix}-left { text-align: left !important; }
|
||||
.text#{$infix}-right { text-align: right !important; }
|
||||
.text#{$infix}-center { text-align: center !important; }
|
||||
}
|
||||
}
|
||||
|
||||
// Transformation
|
||||
|
||||
.text-lowercase { text-transform: lowercase !important; }
|
||||
.text-uppercase { text-transform: uppercase !important; }
|
||||
.text-capitalize { text-transform: capitalize !important; }
|
||||
|
||||
// Weight and italics
|
||||
|
||||
.font-weight-light { font-weight: $font-weight-light !important; }
|
||||
.font-weight-normal { font-weight: $font-weight-normal !important; }
|
||||
.font-weight-bold { font-weight: $font-weight-bold !important; }
|
||||
.font-italic { font-style: italic !important; }
|
||||
|
||||
// Contextual colors
|
||||
|
||||
.text-white { color: $white !important; }
|
||||
|
||||
@each $color, $value in $theme-colors {
|
||||
@include text-emphasis-variant(".text-#{$color}", $value);
|
||||
}
|
||||
|
||||
.text-body { color: $body-color !important; }
|
||||
.text-muted { color: $text-muted !important; }
|
||||
|
||||
.text-black-50 { color: rgba($black, .5) !important; }
|
||||
.text-white-50 { color: rgba($white, .5) !important; }
|
||||
|
||||
// Misc
|
||||
|
||||
.text-hide {
|
||||
@include text-hide($ignore-warning: true);
|
||||
}
|
||||
|
||||
//
|
||||
// Border
|
||||
//
|
||||
|
||||
.border { border: $border-width solid $border-color !important; }
|
||||
.border-top { border-top: $border-width solid $border-color !important; }
|
||||
.border-right { border-right: $border-width solid $border-color !important; }
|
||||
.border-bottom { border-bottom: $border-width solid $border-color !important; }
|
||||
.border-left { border-left: $border-width solid $border-color !important; }
|
||||
|
||||
.border-0 { border: 0 !important; }
|
||||
.border-top-0 { border-top: 0 !important; }
|
||||
.border-right-0 { border-right: 0 !important; }
|
||||
.border-bottom-0 { border-bottom: 0 !important; }
|
||||
.border-left-0 { border-left: 0 !important; }
|
||||
|
||||
@each $color, $value in $theme-colors {
|
||||
.border-#{$color} {
|
||||
border-color: $value !important;
|
||||
}
|
||||
}
|
||||
|
||||
.border-white {
|
||||
border-color: $white !important;
|
||||
}
|
||||
|
||||
//
|
||||
// Border-radius
|
||||
//
|
||||
|
||||
.rounded {
|
||||
border-radius: $border-radius !important;
|
||||
}
|
||||
.rounded-top {
|
||||
border-top-left-radius: $border-radius !important;
|
||||
border-top-right-radius: $border-radius !important;
|
||||
}
|
||||
.rounded-right {
|
||||
border-top-right-radius: $border-radius !important;
|
||||
border-bottom-right-radius: $border-radius !important;
|
||||
}
|
||||
.rounded-bottom {
|
||||
border-bottom-right-radius: $border-radius !important;
|
||||
border-bottom-left-radius: $border-radius !important;
|
||||
}
|
||||
.rounded-left {
|
||||
border-top-left-radius: $border-radius !important;
|
||||
border-bottom-left-radius: $border-radius !important;
|
||||
}
|
||||
|
||||
.rounded-circle {
|
||||
border-radius: 50% !important;
|
||||
}
|
||||
|
||||
.rounded-0 {
|
||||
border-radius: 0 !important;
|
||||
}
|
||||
848
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/_variables.scss
vendored
Normal file
848
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/_variables.scss
vendored
Normal file
@ -0,0 +1,848 @@
|
||||
// Variables
|
||||
//
|
||||
// Variables should follow the `$component-state-property-size` formula for
|
||||
// consistent naming. Ex: $nav-link-disabled-color and $modal-content-box-shadow-xs.
|
||||
|
||||
|
||||
//
|
||||
// Color system
|
||||
//
|
||||
|
||||
$white: #fff !default;
|
||||
$gray-100: #f8f9fa !default;
|
||||
$gray-200: #e9ecef !default;
|
||||
$gray-300: #dee2e6 !default;
|
||||
$gray-400: #ced4da !default;
|
||||
$gray-500: #adb5bd !default;
|
||||
$gray-600: #6c757d !default;
|
||||
$gray-700: #495057 !default;
|
||||
$gray-800: #343a40 !default;
|
||||
$gray-900: #212529 !default;
|
||||
$black: #000 !default;
|
||||
|
||||
$grays: () !default;
|
||||
// stylelint-disable-next-line scss/dollar-variable-default
|
||||
$grays: map-merge(
|
||||
(
|
||||
"100": $gray-100,
|
||||
"200": $gray-200,
|
||||
"300": $gray-300,
|
||||
"400": $gray-400,
|
||||
"500": $gray-500,
|
||||
"600": $gray-600,
|
||||
"700": $gray-700,
|
||||
"800": $gray-800,
|
||||
"900": $gray-900
|
||||
),
|
||||
$grays
|
||||
);
|
||||
|
||||
|
||||
$blue: #337ab7 !default;
|
||||
$indigo: #6610f2 !default;
|
||||
$purple: #6f42c1 !default;
|
||||
$pink: #e83e8c !default;
|
||||
$red: #dc3545 !default;
|
||||
$orange: #fd7e14 !default;
|
||||
$yellow: #ffc107 !default;
|
||||
$green: #28a745 !default;
|
||||
$teal: #20c997 !default;
|
||||
$cyan: #17a2b8 !default;
|
||||
|
||||
$colors: () !default;
|
||||
// stylelint-disable-next-line scss/dollar-variable-default
|
||||
$colors: map-merge(
|
||||
(
|
||||
"blue": $blue,
|
||||
"indigo": $indigo,
|
||||
"purple": $purple,
|
||||
"pink": $pink,
|
||||
"red": $red,
|
||||
"orange": $orange,
|
||||
"yellow": $yellow,
|
||||
"green": $green,
|
||||
"teal": $teal,
|
||||
"cyan": $cyan,
|
||||
"white": $white,
|
||||
"gray": $gray-600,
|
||||
"gray-dark": $gray-800
|
||||
),
|
||||
$colors
|
||||
);
|
||||
|
||||
$primary: $blue !default;
|
||||
$secondary: $gray-600 !default;
|
||||
$success: $green !default;
|
||||
$info: $cyan !default;
|
||||
$warning: $yellow !default;
|
||||
$danger: $red !default;
|
||||
$light: $gray-100 !default;
|
||||
$dark: $gray-800 !default;
|
||||
|
||||
$theme-colors: () !default;
|
||||
// stylelint-disable-next-line scss/dollar-variable-default
|
||||
$theme-colors: map-merge(
|
||||
(
|
||||
"primary": $primary,
|
||||
"secondary": $secondary,
|
||||
"success": $success,
|
||||
"info": $info,
|
||||
"warning": $warning,
|
||||
"danger": $danger,
|
||||
"light": $light,
|
||||
"dark": $dark
|
||||
),
|
||||
$theme-colors
|
||||
);
|
||||
|
||||
// Set a specific jump point for requesting color jumps
|
||||
$theme-color-interval: 8% !default;
|
||||
|
||||
// The yiq lightness value that determines when the lightness of color changes from "dark" to "light". Acceptable values are between 0 and 255.
|
||||
$yiq-contrasted-threshold: 150 !default;
|
||||
|
||||
// Customize the light and dark text colors for use in our YIQ color contrast function.
|
||||
$yiq-text-dark: $gray-900 !default;
|
||||
$yiq-text-light: $white !default;
|
||||
|
||||
// Options
|
||||
//
|
||||
// Quickly modify global styling by enabling or disabling optional features.
|
||||
|
||||
$enable-caret: true !default;
|
||||
$enable-rounded: true !default;
|
||||
$enable-shadows: false !default;
|
||||
$enable-gradients: false !default;
|
||||
$enable-transitions: true !default;
|
||||
$enable-hover-media-query: false !default; // Deprecated, no longer affects any compiled CSS
|
||||
$enable-grid-classes: true !default;
|
||||
$enable-print-styles: true !default;
|
||||
|
||||
|
||||
// Spacing
|
||||
//
|
||||
// Control the default styling of most Bootstrap elements by modifying these
|
||||
// variables. Mostly focused on spacing.
|
||||
// You can add more entries to the $spacers map, should you need more variation.
|
||||
|
||||
$spacer: 1rem !default;
|
||||
$spacers: () !default;
|
||||
// stylelint-disable-next-line scss/dollar-variable-default
|
||||
$spacers: map-merge(
|
||||
(
|
||||
0: 0,
|
||||
1: ($spacer * .25),
|
||||
2: ($spacer * .5),
|
||||
3: $spacer,
|
||||
4: ($spacer * 1.5),
|
||||
5: ($spacer * 3)
|
||||
),
|
||||
$spacers
|
||||
);
|
||||
|
||||
// This variable affects the `.h-*` and `.w-*` classes.
|
||||
$sizes: () !default;
|
||||
// stylelint-disable-next-line scss/dollar-variable-default
|
||||
$sizes: map-merge(
|
||||
(
|
||||
25: 25%,
|
||||
50: 50%,
|
||||
75: 75%,
|
||||
100: 100%,
|
||||
auto: auto
|
||||
),
|
||||
$sizes
|
||||
);
|
||||
|
||||
// Body
|
||||
//
|
||||
// Settings for the `<body>` element.
|
||||
|
||||
$body-bg: $white !default;
|
||||
$body-color: $gray-900 !default;
|
||||
|
||||
// Links
|
||||
//
|
||||
// Style anchor elements.
|
||||
|
||||
$link-color: theme-color("primary") !default;
|
||||
$link-decoration: none !default;
|
||||
$link-hover-color: darken($link-color, 15%) !default;
|
||||
$link-hover-decoration: none !default;
|
||||
|
||||
// Paragraphs
|
||||
//
|
||||
// Style p element.
|
||||
|
||||
$paragraph-margin-bottom: 1rem !default;
|
||||
|
||||
|
||||
// Grid breakpoints
|
||||
//
|
||||
// Define the minimum dimensions at which your layout will change,
|
||||
// adapting to different screen sizes, for use in media queries.
|
||||
|
||||
$grid-breakpoints: (
|
||||
xs: 0,
|
||||
sm: 576px,
|
||||
md: 768px,
|
||||
lg: 992px,
|
||||
xl: 1200px
|
||||
) !default;
|
||||
|
||||
@include _assert-ascending($grid-breakpoints, "$grid-breakpoints");
|
||||
@include _assert-starts-at-zero($grid-breakpoints);
|
||||
|
||||
|
||||
// Grid containers
|
||||
//
|
||||
// Define the maximum width of `.container` for different screen sizes.
|
||||
|
||||
$container-max-widths: (
|
||||
sm: 540px,
|
||||
md: 720px,
|
||||
lg: 960px,
|
||||
xl: 1140px
|
||||
) !default;
|
||||
|
||||
@include _assert-ascending($container-max-widths, "$container-max-widths");
|
||||
|
||||
|
||||
// Grid columns
|
||||
//
|
||||
// Set the number of columns and specify the width of the gutters.
|
||||
|
||||
$grid-columns: 12 !default;
|
||||
$grid-gutter-width: 30px !default;
|
||||
|
||||
// Components
|
||||
//
|
||||
// Define common padding and border radius sizes and more.
|
||||
|
||||
$line-height-lg: 1.5 !default;
|
||||
$line-height-sm: 1.5 !default;
|
||||
|
||||
$border-width: 1px !default;
|
||||
$border-color: $gray-300 !default;
|
||||
|
||||
$border-radius: .25rem !default;
|
||||
$border-radius-lg: .3rem !default;
|
||||
$border-radius-sm: .2rem !default;
|
||||
|
||||
$box-shadow-sm: 0 .125rem .25rem rgba($black, .075) !default;
|
||||
$box-shadow: 0 .5rem 1rem rgba($black, .15) !default;
|
||||
$box-shadow-lg: 0 1rem 3rem rgba($black, .175) !default;
|
||||
|
||||
$component-active-color: $white !default;
|
||||
$component-active-bg: theme-color("primary") !default;
|
||||
|
||||
$caret-width: .3em !default;
|
||||
|
||||
$transition-base: all .2s ease-in-out !default;
|
||||
$transition-fade: opacity .15s linear !default;
|
||||
$transition-collapse: height .35s ease !default;
|
||||
|
||||
|
||||
// Fonts
|
||||
//
|
||||
// Font, line-height, and color for body text, headings, and more.
|
||||
|
||||
// stylelint-disable value-keyword-case
|
||||
$font-family-sans-serif: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji" !default;
|
||||
$font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace !default;
|
||||
$font-family-base: Verdana, Arial, $font-family-sans-serif !default;
|
||||
// stylelint-enable value-keyword-case
|
||||
|
||||
$font-size-base: 0.75rem !default; // Assumes the browser default, typically `16px`
|
||||
$font-size-lg: ($font-size-base * 1.25) !default;
|
||||
$font-size-sm: ($font-size-base * .875) !default;
|
||||
|
||||
$font-weight-light: 300 !default;
|
||||
$font-weight-normal: 400 !default;
|
||||
$font-weight-bold: 700 !default;
|
||||
|
||||
$font-weight-base: $font-weight-normal !default;
|
||||
$line-height-base: 1.5 !default;
|
||||
|
||||
$h1-font-size: $font-size-base * 2.5 !default;
|
||||
$h2-font-size: $font-size-base * 2 !default;
|
||||
$h3-font-size: $font-size-base * 1.75 !default;
|
||||
$h4-font-size: $font-size-base * 1.5 !default;
|
||||
$h5-font-size: $font-size-base * 1.25 !default;
|
||||
$h6-font-size: $font-size-base !default;
|
||||
|
||||
$headings-margin-bottom: ($spacer / 2) !default;
|
||||
$headings-font-family: inherit !default;
|
||||
$headings-font-weight: 500 !default;
|
||||
$headings-line-height: 1.2 !default;
|
||||
$headings-color: inherit !default;
|
||||
|
||||
$display1-size: 6rem !default;
|
||||
$display2-size: 5.5rem !default;
|
||||
$display3-size: 4.5rem !default;
|
||||
$display4-size: 3.5rem !default;
|
||||
|
||||
$display1-weight: 300 !default;
|
||||
$display2-weight: 300 !default;
|
||||
$display3-weight: 300 !default;
|
||||
$display4-weight: 300 !default;
|
||||
$display-line-height: $headings-line-height !default;
|
||||
|
||||
$lead-font-size: ($font-size-base * 1.25) !default;
|
||||
$lead-font-weight: 300 !default;
|
||||
|
||||
$small-font-size: 80% !default;
|
||||
|
||||
$text-muted: $gray-600 !default;
|
||||
|
||||
$blockquote-small-color: $gray-600 !default;
|
||||
$blockquote-font-size: ($font-size-base * 1.25) !default;
|
||||
|
||||
$hr-border-color: rgba($black, .1) !default;
|
||||
$hr-border-width: $border-width !default;
|
||||
|
||||
$mark-padding: .2em !default;
|
||||
|
||||
$dt-font-weight: $font-weight-bold !default;
|
||||
|
||||
$kbd-box-shadow: inset 0 -.1rem 0 rgba($black, .25) !default;
|
||||
$nested-kbd-font-weight: $font-weight-bold !default;
|
||||
|
||||
$list-inline-padding: .5rem !default;
|
||||
|
||||
$mark-bg: #fcf8e3 !default;
|
||||
|
||||
$hr-margin-y: $spacer !default;
|
||||
|
||||
|
||||
// Tables
|
||||
//
|
||||
// Customizes the `.table` component with basic values, each used across all table variations.
|
||||
|
||||
$table-cell-padding: .75rem !default;
|
||||
$table-cell-padding-sm: .3rem !default;
|
||||
|
||||
$table-bg: transparent !default;
|
||||
$table-accent-bg: rgba($black, .05) !default;
|
||||
$table-hover-bg: rgba($black, .075) !default;
|
||||
$table-active-bg: $table-hover-bg !default;
|
||||
|
||||
$table-border-width: $border-width !default;
|
||||
$table-border-color: $gray-300 !default;
|
||||
|
||||
$table-head-bg: $gray-200 !default;
|
||||
$table-head-color: $gray-700 !default;
|
||||
|
||||
$table-dark-bg: $gray-900 !default;
|
||||
$table-dark-accent-bg: rgba($white, .05) !default;
|
||||
$table-dark-hover-bg: rgba($white, .075) !default;
|
||||
$table-dark-border-color: lighten($gray-900, 7.5%) !default;
|
||||
$table-dark-color: $body-bg !default;
|
||||
|
||||
$table-striped-order: odd !default;
|
||||
|
||||
$table-caption-color: $text-muted !default;
|
||||
|
||||
// Buttons + Forms
|
||||
//
|
||||
// Shared variables that are reassigned to `$input-` and `$btn-` specific variables.
|
||||
|
||||
$input-btn-padding-y: .375rem !default;
|
||||
$input-btn-padding-x: .75rem !default;
|
||||
$input-btn-line-height: $line-height-base !default;
|
||||
|
||||
$input-btn-focus-width: .2rem !default;
|
||||
$input-btn-focus-color: rgba($component-active-bg, .25) !default;
|
||||
$input-btn-focus-box-shadow: 0 0 0 $input-btn-focus-width $input-btn-focus-color !default;
|
||||
|
||||
$input-btn-padding-y-sm: .25rem !default;
|
||||
$input-btn-padding-x-sm: .5rem !default;
|
||||
$input-btn-line-height-sm: $line-height-sm !default;
|
||||
|
||||
$input-btn-padding-y-lg: .5rem !default;
|
||||
$input-btn-padding-x-lg: 1rem !default;
|
||||
$input-btn-line-height-lg: $line-height-lg !default;
|
||||
|
||||
$input-btn-border-width: $border-width !default;
|
||||
|
||||
|
||||
// Buttons
|
||||
//
|
||||
// For each of Bootstrap's buttons, define text, background, and border color.
|
||||
|
||||
$btn-padding-y: $input-btn-padding-y !default;
|
||||
$btn-padding-x: $input-btn-padding-x !default;
|
||||
$btn-line-height: $input-btn-line-height !default;
|
||||
|
||||
$btn-padding-y-sm: $input-btn-padding-y-sm !default;
|
||||
$btn-padding-x-sm: $input-btn-padding-x-sm !default;
|
||||
$btn-line-height-sm: $input-btn-line-height-sm !default;
|
||||
|
||||
$btn-padding-y-lg: $input-btn-padding-y-lg !default;
|
||||
$btn-padding-x-lg: $input-btn-padding-x-lg !default;
|
||||
$btn-line-height-lg: $input-btn-line-height-lg !default;
|
||||
|
||||
$btn-border-width: $input-btn-border-width !default;
|
||||
|
||||
$btn-font-weight: $font-weight-normal !default;
|
||||
$btn-box-shadow: inset 0 1px 0 rgba($white, .15), 0 1px 1px rgba($black, .075) !default;
|
||||
$btn-focus-width: $input-btn-focus-width !default;
|
||||
$btn-focus-box-shadow: $input-btn-focus-box-shadow !default;
|
||||
$btn-disabled-opacity: .65 !default;
|
||||
$btn-active-box-shadow: inset 0 3px 5px rgba($black, .125) !default;
|
||||
|
||||
$btn-link-disabled-color: $gray-600 !default;
|
||||
|
||||
$btn-block-spacing-y: .5rem !default;
|
||||
|
||||
// Allows for customizing button radius independently from global border radius
|
||||
$btn-border-radius: $border-radius !default;
|
||||
$btn-border-radius-lg: $border-radius-lg !default;
|
||||
$btn-border-radius-sm: $border-radius-sm !default;
|
||||
|
||||
$btn-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;
|
||||
|
||||
// Forms
|
||||
|
||||
$label-margin-bottom: .5rem !default;
|
||||
|
||||
$input-padding-y: $input-btn-padding-y !default;
|
||||
$input-padding-x: $input-btn-padding-x !default;
|
||||
$input-line-height: $input-btn-line-height !default;
|
||||
|
||||
$input-padding-y-sm: $input-btn-padding-y-sm !default;
|
||||
$input-padding-x-sm: $input-btn-padding-x-sm !default;
|
||||
$input-line-height-sm: $input-btn-line-height-sm !default;
|
||||
|
||||
$input-padding-y-lg: $input-btn-padding-y-lg !default;
|
||||
$input-padding-x-lg: $input-btn-padding-x-lg !default;
|
||||
$input-line-height-lg: $input-btn-line-height-lg !default;
|
||||
|
||||
$input-bg: $white !default;
|
||||
$input-disabled-bg: $gray-200 !default;
|
||||
|
||||
$input-color: $gray-700 !default;
|
||||
$input-border-color: $gray-400 !default;
|
||||
$input-border-width: $input-btn-border-width !default;
|
||||
$input-box-shadow: inset 0 1px 1px rgba($black, .075) !default;
|
||||
|
||||
$input-border-radius: $border-radius !default;
|
||||
$input-border-radius-lg: $border-radius-lg !default;
|
||||
$input-border-radius-sm: $border-radius-sm !default;
|
||||
|
||||
$input-focus-bg: $input-bg !default;
|
||||
$input-focus-border-color: lighten($component-active-bg, 25%) !default;
|
||||
$input-focus-color: $input-color !default;
|
||||
$input-focus-width: $input-btn-focus-width !default;
|
||||
$input-focus-box-shadow: $input-btn-focus-box-shadow !default;
|
||||
|
||||
$input-placeholder-color: $gray-600 !default;
|
||||
$input-plaintext-color: $body-color !default;
|
||||
|
||||
$input-height-border: $input-border-width * 2 !default;
|
||||
|
||||
$input-height-inner: ($font-size-base * $input-btn-line-height) + ($input-btn-padding-y * 2) !default;
|
||||
$input-height: calc(#{$input-height-inner} + #{$input-height-border}) !default;
|
||||
|
||||
$input-height-inner-sm: ($font-size-sm * $input-btn-line-height-sm) + ($input-btn-padding-y-sm * 2) !default;
|
||||
$input-height-sm: calc(#{$input-height-inner-sm} + #{$input-height-border}) !default;
|
||||
|
||||
$input-height-inner-lg: ($font-size-lg * $input-btn-line-height-lg) + ($input-btn-padding-y-lg * 2) !default;
|
||||
$input-height-lg: calc(#{$input-height-inner-lg} + #{$input-height-border}) !default;
|
||||
|
||||
$input-transition: border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;
|
||||
|
||||
$form-text-margin-top: .25rem !default;
|
||||
|
||||
$form-check-input-gutter: 1.25rem !default;
|
||||
$form-check-input-margin-y: .3rem !default;
|
||||
$form-check-input-margin-x: .25rem !default;
|
||||
|
||||
$form-check-inline-margin-x: .75rem !default;
|
||||
$form-check-inline-input-margin-x: .3125rem !default;
|
||||
|
||||
$form-group-margin-bottom: 1rem !default;
|
||||
|
||||
$input-group-addon-color: $input-color !default;
|
||||
$input-group-addon-bg: $gray-200 !default;
|
||||
$input-group-addon-border-color: $input-border-color !default;
|
||||
|
||||
$custom-forms-transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;
|
||||
|
||||
$custom-control-gutter: 1.5rem !default;
|
||||
$custom-control-spacer-x: 1rem !default;
|
||||
|
||||
$custom-control-indicator-size: 1rem !default;
|
||||
$custom-control-indicator-bg: $gray-300 !default;
|
||||
$custom-control-indicator-bg-size: 50% 50% !default;
|
||||
$custom-control-indicator-box-shadow: inset 0 .25rem .25rem rgba($black, .1) !default;
|
||||
|
||||
$custom-control-indicator-disabled-bg: $gray-200 !default;
|
||||
$custom-control-label-disabled-color: $gray-600 !default;
|
||||
|
||||
$custom-control-indicator-checked-color: $component-active-color !default;
|
||||
$custom-control-indicator-checked-bg: $component-active-bg !default;
|
||||
$custom-control-indicator-checked-disabled-bg: rgba(theme-color("primary"), .5) !default;
|
||||
$custom-control-indicator-checked-box-shadow: none !default;
|
||||
|
||||
$custom-control-indicator-focus-box-shadow: 0 0 0 1px $body-bg, $input-btn-focus-box-shadow !default;
|
||||
|
||||
$custom-control-indicator-active-color: $component-active-color !default;
|
||||
$custom-control-indicator-active-bg: lighten($component-active-bg, 35%) !default;
|
||||
$custom-control-indicator-active-box-shadow: none !default;
|
||||
|
||||
$custom-checkbox-indicator-border-radius: $border-radius !default;
|
||||
$custom-checkbox-indicator-icon-checked: str-replace(url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='#{$custom-control-indicator-checked-color}' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E"), "#", "%23") !default;
|
||||
|
||||
$custom-checkbox-indicator-indeterminate-bg: $component-active-bg !default;
|
||||
$custom-checkbox-indicator-indeterminate-color: $custom-control-indicator-checked-color !default;
|
||||
$custom-checkbox-indicator-icon-indeterminate: str-replace(url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3E%3Cpath stroke='#{$custom-checkbox-indicator-indeterminate-color}' d='M0 2h4'/%3E%3C/svg%3E"), "#", "%23") !default;
|
||||
$custom-checkbox-indicator-indeterminate-box-shadow: none !default;
|
||||
|
||||
$custom-radio-indicator-border-radius: 50% !default;
|
||||
$custom-radio-indicator-icon-checked: str-replace(url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='#{$custom-control-indicator-checked-color}'/%3E%3C/svg%3E"), "#", "%23") !default;
|
||||
|
||||
$custom-select-padding-y: .375rem !default;
|
||||
$custom-select-padding-x: .75rem !default;
|
||||
$custom-select-height: $input-height !default;
|
||||
$custom-select-indicator-padding: 1rem !default; // Extra padding to account for the presence of the background-image based indicator
|
||||
$custom-select-line-height: $input-btn-line-height !default;
|
||||
$custom-select-color: $input-color !default;
|
||||
$custom-select-disabled-color: $gray-600 !default;
|
||||
$custom-select-bg: $input-bg !default;
|
||||
$custom-select-disabled-bg: $gray-200 !default;
|
||||
$custom-select-bg-size: 8px 10px !default; // In pixels because image dimensions
|
||||
$custom-select-indicator-color: $gray-800 !default;
|
||||
$custom-select-indicator: str-replace(url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='#{$custom-select-indicator-color}' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E"), "#", "%23") !default;
|
||||
$custom-select-border-width: $input-btn-border-width !default;
|
||||
$custom-select-border-color: $input-border-color !default;
|
||||
$custom-select-border-radius: $border-radius !default;
|
||||
$custom-select-box-shadow: inset 0 1px 2px rgba($black, .075) !default;
|
||||
|
||||
$custom-select-focus-border-color: $input-focus-border-color !default;
|
||||
$custom-select-focus-width: $input-btn-focus-width !default;
|
||||
$custom-select-focus-box-shadow: 0 0 0 $custom-select-focus-width rgba($custom-select-focus-border-color, .5) !default;
|
||||
|
||||
$custom-select-font-size-sm: 75% !default;
|
||||
$custom-select-height-sm: $input-height-sm !default;
|
||||
|
||||
$custom-select-font-size-lg: 125% !default;
|
||||
$custom-select-height-lg: $input-height-lg !default;
|
||||
|
||||
$custom-range-track-width: 100% !default;
|
||||
$custom-range-track-height: .5rem !default;
|
||||
$custom-range-track-cursor: pointer !default;
|
||||
$custom-range-track-bg: $gray-300 !default;
|
||||
$custom-range-track-border-radius: 1rem !default;
|
||||
$custom-range-track-box-shadow: inset 0 .25rem .25rem rgba($black, .1) !default;
|
||||
|
||||
$custom-range-thumb-width: 1rem !default;
|
||||
$custom-range-thumb-height: $custom-range-thumb-width !default;
|
||||
$custom-range-thumb-bg: $component-active-bg !default;
|
||||
$custom-range-thumb-border: 0 !default;
|
||||
$custom-range-thumb-border-radius: 1rem !default;
|
||||
$custom-range-thumb-box-shadow: 0 .1rem .25rem rgba($black, .1) !default;
|
||||
$custom-range-thumb-focus-box-shadow: 0 0 0 1px $body-bg, $input-btn-focus-box-shadow !default;
|
||||
$custom-range-thumb-focus-box-shadow-width: $input-btn-focus-width !default; // For focus box shadow issue in IE/Edge
|
||||
$custom-range-thumb-active-bg: lighten($component-active-bg, 35%) !default;
|
||||
|
||||
$custom-file-height: $input-height !default;
|
||||
$custom-file-height-inner: $input-height-inner !default;
|
||||
$custom-file-focus-border-color: $input-focus-border-color !default;
|
||||
$custom-file-focus-box-shadow: $input-btn-focus-box-shadow !default;
|
||||
$custom-file-disabled-bg: $input-disabled-bg !default;
|
||||
|
||||
$custom-file-padding-y: $input-btn-padding-y !default;
|
||||
$custom-file-padding-x: $input-btn-padding-x !default;
|
||||
$custom-file-line-height: $input-btn-line-height !default;
|
||||
$custom-file-color: $input-color !default;
|
||||
$custom-file-bg: $input-bg !default;
|
||||
$custom-file-border-width: $input-btn-border-width !default;
|
||||
$custom-file-border-color: $input-border-color !default;
|
||||
$custom-file-border-radius: $input-border-radius !default;
|
||||
$custom-file-box-shadow: $input-box-shadow !default;
|
||||
$custom-file-button-color: $custom-file-color !default;
|
||||
$custom-file-button-bg: $input-group-addon-bg !default;
|
||||
$custom-file-text: (
|
||||
en: "Browse"
|
||||
) !default;
|
||||
|
||||
|
||||
// Form validation
|
||||
$form-feedback-margin-top: $form-text-margin-top !default;
|
||||
$form-feedback-font-size: $small-font-size !default;
|
||||
$form-feedback-valid-color: theme-color("success") !default;
|
||||
$form-feedback-invalid-color: theme-color("danger") !default;
|
||||
// Dropdowns
|
||||
//
|
||||
// Dropdown menu container and contents.
|
||||
|
||||
$dropdown-min-width: 10rem !default;
|
||||
$dropdown-padding-y: .5rem !default;
|
||||
$dropdown-spacer: .125rem !default;
|
||||
$dropdown-bg: $white !default;
|
||||
$dropdown-border-color: rgba($black, .15) !default;
|
||||
$dropdown-border-radius: $border-radius !default;
|
||||
$dropdown-border-width: $border-width !default;
|
||||
$dropdown-divider-bg: $gray-200 !default;
|
||||
$dropdown-box-shadow: 0 .5rem 1rem rgba($black, .175) !default;
|
||||
|
||||
$dropdown-link-color: $gray-900 !default;
|
||||
$dropdown-link-hover-color: darken($gray-900, 5%) !default;
|
||||
$dropdown-link-hover-bg: $gray-100 !default;
|
||||
|
||||
$dropdown-link-active-color: $component-active-color !default;
|
||||
$dropdown-link-active-bg: $component-active-bg !default;
|
||||
|
||||
$dropdown-link-disabled-color: $gray-600 !default;
|
||||
|
||||
$dropdown-item-padding-y: .25rem !default;
|
||||
$dropdown-item-padding-x: 1.5rem !default;
|
||||
|
||||
$dropdown-header-color: $gray-600 !default;
|
||||
|
||||
|
||||
// Z-index master list
|
||||
//
|
||||
// Warning: Avoid customizing these values. They're used for a bird's eye view
|
||||
// of components dependent on the z-axis and are designed to all work together.
|
||||
|
||||
$zindex-dropdown: 1000 !default;
|
||||
$zindex-sticky: 1020 !default;
|
||||
$zindex-fixed: 1030 !default;
|
||||
$zindex-modal-backdrop: 1040 !default;
|
||||
$zindex-modal: 1050 !default;
|
||||
$zindex-popover: 1060 !default;
|
||||
$zindex-tooltip: 1070 !default;
|
||||
|
||||
// Navs
|
||||
|
||||
$nav-link-padding-y: .5rem !default;
|
||||
$nav-link-padding-x: 1rem !default;
|
||||
$nav-link-disabled-color: $gray-600 !default;
|
||||
|
||||
$nav-tabs-border-color: $gray-300 !default;
|
||||
$nav-tabs-border-width: $border-width !default;
|
||||
$nav-tabs-border-radius: $border-radius !default;
|
||||
$nav-tabs-link-hover-border-color: $gray-200 $gray-200 $nav-tabs-border-color !default;
|
||||
$nav-tabs-link-active-color: $gray-700 !default;
|
||||
$nav-tabs-link-active-bg: $body-bg !default;
|
||||
$nav-tabs-link-active-border-color: $gray-300 $gray-300 $nav-tabs-link-active-bg !default;
|
||||
|
||||
$nav-pills-border-radius: $border-radius !default;
|
||||
$nav-pills-link-active-color: $component-active-color !default;
|
||||
$nav-pills-link-active-bg: $component-active-bg !default;
|
||||
|
||||
$nav-divider-color: $gray-200 !default;
|
||||
$nav-divider-margin-y: ($spacer / 2) !default;
|
||||
|
||||
|
||||
|
||||
// Navbar
|
||||
|
||||
$navbar-padding-y: ($spacer / 2) !default;
|
||||
$navbar-padding-x: $spacer !default;
|
||||
|
||||
$navbar-nav-link-padding-x: .5rem !default;
|
||||
|
||||
$navbar-brand-font-size: $font-size-lg !default;
|
||||
// Compute the navbar-brand padding-y so the navbar-brand will have the same height as navbar-text and nav-link
|
||||
$nav-link-height: ($font-size-base * $line-height-base + $nav-link-padding-y * 2) !default;
|
||||
$navbar-brand-height: $navbar-brand-font-size * $line-height-base !default;
|
||||
$navbar-brand-padding-y: ($nav-link-height - $navbar-brand-height) / 2 !default;
|
||||
|
||||
$navbar-toggler-padding-y: .25rem !default;
|
||||
$navbar-toggler-padding-x: .75rem !default;
|
||||
$navbar-toggler-font-size: $font-size-lg !default;
|
||||
$navbar-toggler-border-radius: $btn-border-radius !default;
|
||||
|
||||
$navbar-dark-color: rgba($white, .5) !default;
|
||||
$navbar-dark-hover-color: rgba($white, .75) !default;
|
||||
$navbar-dark-active-color: $white !default;
|
||||
$navbar-dark-disabled-color: rgba($white, .25) !default;
|
||||
$navbar-dark-toggler-icon-bg: str-replace(url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='#{$navbar-dark-color}' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E"), "#", "%23") !default;
|
||||
$navbar-dark-toggler-border-color: rgba($white, .1) !default;
|
||||
|
||||
$navbar-light-color: rgba($black, .5) !default;
|
||||
$navbar-light-hover-color: rgba($black, .7) !default;
|
||||
$navbar-light-active-color: rgba($black, .9) !default;
|
||||
$navbar-light-disabled-color: rgba($black, .3) !default;
|
||||
$navbar-light-toggler-icon-bg: str-replace(url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='#{$navbar-light-color}' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E"), "#", "%23") !default;
|
||||
$navbar-light-toggler-border-color: rgba($black, .1) !default;
|
||||
|
||||
// Pagination
|
||||
|
||||
$pagination-padding-y: .5rem !default;
|
||||
$pagination-padding-x: .75rem !default;
|
||||
$pagination-padding-y-sm: .25rem !default;
|
||||
$pagination-padding-x-sm: .5rem !default;
|
||||
$pagination-padding-y-lg: .75rem !default;
|
||||
$pagination-padding-x-lg: 1.5rem !default;
|
||||
$pagination-line-height: 1.25 !default;
|
||||
|
||||
$pagination-color: $link-color !default;
|
||||
$pagination-bg: $white !default;
|
||||
$pagination-border-width: $border-width !default;
|
||||
$pagination-border-color: $gray-300 !default;
|
||||
|
||||
$pagination-focus-box-shadow: $input-btn-focus-box-shadow !default;
|
||||
$pagination-focus-outline: 0 !default;
|
||||
|
||||
$pagination-hover-color: $link-hover-color !default;
|
||||
$pagination-hover-bg: $gray-200 !default;
|
||||
$pagination-hover-border-color: $gray-300 !default;
|
||||
|
||||
$pagination-active-color: $component-active-color !default;
|
||||
$pagination-active-bg: $component-active-bg !default;
|
||||
$pagination-active-border-color: $pagination-active-bg !default;
|
||||
|
||||
$pagination-disabled-color: $gray-600 !default;
|
||||
$pagination-disabled-bg: $white !default;
|
||||
$pagination-disabled-border-color: $gray-300 !default;
|
||||
|
||||
// Tooltips
|
||||
|
||||
$tooltip-font-size: $font-size-sm !default;
|
||||
$tooltip-max-width: 500px !default;
|
||||
$tooltip-color: $white !default;
|
||||
$tooltip-bg: $black !default;
|
||||
$tooltip-border-radius: $border-radius !default;
|
||||
$tooltip-opacity: .9 !default;
|
||||
$tooltip-padding-y: .25rem !default;
|
||||
$tooltip-padding-x: .5rem !default;
|
||||
$tooltip-margin: 0 !default;
|
||||
|
||||
$tooltip-arrow-width: .8rem !default;
|
||||
$tooltip-arrow-height: .4rem !default;
|
||||
$tooltip-arrow-color: $tooltip-bg !default;
|
||||
|
||||
// Popovers
|
||||
|
||||
$popover-font-size: $font-size-base !default;
|
||||
$popover-bg: $white !default;
|
||||
$popover-max-width: 276px !default;
|
||||
$popover-border-width: $border-width !default;
|
||||
$popover-border-color: rgba($black, .2) !default;
|
||||
$popover-border-radius: $border-radius-lg !default;
|
||||
$popover-box-shadow: 0 .25rem .5rem rgba($black, .2) !default;
|
||||
|
||||
$popover-header-bg: darken($popover-bg, 3%) !default;
|
||||
$popover-header-color: $headings-color !default;
|
||||
$popover-header-padding-y: .5rem !default;
|
||||
$popover-header-padding-x: .75rem !default;
|
||||
|
||||
$popover-body-color: $body-color !default;
|
||||
$popover-body-padding-y: $popover-header-padding-y !default;
|
||||
$popover-body-padding-x: $popover-header-padding-x !default;
|
||||
|
||||
$popover-arrow-width: 1rem !default;
|
||||
$popover-arrow-height: .5rem !default;
|
||||
$popover-arrow-color: $popover-bg !default;
|
||||
|
||||
$popover-arrow-outer-color: fade-in($popover-border-color, .05) !default;
|
||||
|
||||
// Badges
|
||||
|
||||
$badge-font-size: 75% !default;
|
||||
$badge-font-weight: $font-weight-bold !default;
|
||||
$badge-padding-y: .25em !default;
|
||||
$badge-padding-x: .4em !default;
|
||||
$badge-border-radius: $border-radius !default;
|
||||
|
||||
$badge-pill-padding-x: .6em !default;
|
||||
// Use a higher than normal value to ensure completely rounded edges when
|
||||
// customizing padding or font-size on labels.
|
||||
$badge-pill-border-radius: 10rem !default;
|
||||
|
||||
// Modals
|
||||
|
||||
// Padding applied to the modal body
|
||||
$modal-inner-padding: 1rem !default;
|
||||
|
||||
$modal-dialog-margin: .5rem !default;
|
||||
$modal-dialog-margin-y-sm-up: 1.75rem !default;
|
||||
|
||||
$modal-title-line-height: $line-height-base !default;
|
||||
|
||||
$modal-content-bg: $white !default;
|
||||
$modal-content-border-color: rgba($black, .2) !default;
|
||||
$modal-content-border-width: $border-width !default;
|
||||
$modal-content-border-radius: $border-radius-lg !default;
|
||||
$modal-content-box-shadow-xs: 0 .25rem .5rem rgba($black, .5) !default;
|
||||
$modal-content-box-shadow-sm-up: 0 .5rem 1rem rgba($black, .5) !default;
|
||||
|
||||
$modal-backdrop-bg: $black !default;
|
||||
$modal-backdrop-opacity: .5 !default;
|
||||
$modal-header-border-color: $gray-200 !default;
|
||||
$modal-footer-border-color: $modal-header-border-color !default;
|
||||
$modal-header-border-width: $modal-content-border-width !default;
|
||||
$modal-footer-border-width: $modal-header-border-width !default;
|
||||
$modal-header-padding: 1rem !default;
|
||||
|
||||
$modal-lg: 800px !default;
|
||||
$modal-md: 500px !default;
|
||||
$modal-sm: 300px !default;
|
||||
|
||||
$modal-transition: transform .3s ease-out !default;
|
||||
|
||||
|
||||
// List group
|
||||
|
||||
$list-group-bg: $white !default;
|
||||
$list-group-border-color: rgba($black, .125) !default;
|
||||
$list-group-border-width: $border-width !default;
|
||||
$list-group-border-radius: $border-radius !default;
|
||||
|
||||
$list-group-item-padding-y: .75rem !default;
|
||||
$list-group-item-padding-x: 1.25rem !default;
|
||||
|
||||
$list-group-hover-bg: $gray-100 !default;
|
||||
$list-group-active-color: $component-active-color !default;
|
||||
$list-group-active-bg: $component-active-bg !default;
|
||||
$list-group-active-border-color: $list-group-active-bg !default;
|
||||
|
||||
$list-group-disabled-color: $gray-600 !default;
|
||||
$list-group-disabled-bg: $list-group-bg !default;
|
||||
|
||||
$list-group-action-color: $gray-700 !default;
|
||||
$list-group-action-hover-color: $list-group-action-color !default;
|
||||
|
||||
$list-group-action-active-color: $body-color !default;
|
||||
$list-group-action-active-bg: $gray-200 !default;
|
||||
|
||||
// Close
|
||||
|
||||
$close-font-size: $font-size-base * 1.5 !default;
|
||||
$close-font-weight: $font-weight-bold !default;
|
||||
$close-color: $black !default;
|
||||
$close-text-shadow: 0 1px 0 $white !default;
|
||||
|
||||
// Code
|
||||
|
||||
$code-font-size: $font-size-base !default;
|
||||
$code-color: $red !default;
|
||||
$code-bg: lighten(desaturate($code-color, 33%), 42%) !default;
|
||||
|
||||
$kbd-padding-y: .2rem !default;
|
||||
$kbd-padding-x: .4rem !default;
|
||||
$kbd-font-size: $code-font-size !default;
|
||||
$kbd-color: $white !default;
|
||||
$kbd-bg: $gray-900 !default;
|
||||
|
||||
$pre-color: $gray-900 !default;
|
||||
$pre-scrollable-max-height: 340px !default;
|
||||
|
||||
// Yii Gii variables
|
||||
$icon-angle-right: str-replace(url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 256 512'%3e%3cpath fill='#{$link-color}' d='M224.3 273l-136 136c-9.4 9.4-24.6 9.4-33.9 0l-22.6-22.6c-9.4-9.4-9.4-24.6 0-33.9l96.4-96.4-96.4-96.4c-9.4-9.4-9.4-24.6 0-33.9L54.3 103c9.4-9.4 24.6-9.4 33.9 0l136 136c9.5 9.4 9.5 24.6.1 34z'/%3e%3c/svg%3e"), "#", "%23") !default;
|
||||
$icon-angle-right-active: str-replace(url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 256 512'%3e%3cpath fill='#{$list-group-active-color}' d='M224.3 273l-136 136c-9.4 9.4-24.6 9.4-33.9 0l-22.6-22.6c-9.4-9.4-9.4-24.6 0-33.9l96.4-96.4-96.4-96.4c-9.4-9.4-9.4-24.6 0-33.9L54.3 103c9.4-9.4 24.6-9.4 33.9 0l136 136c9.5 9.4 9.5 24.6.1 34z'/%3e%3c/svg%3e"), "#", "%23") !default;
|
||||
|
||||
$icon-long-arrow-left: str-replace(url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 448 512'%3e%3cpath fill='#{$body-color}' d='M134.059 296H436c6.627 0 12-5.373 12-12v-56c0-6.627-5.373-12-12-12H134.059v-46.059c0-21.382-25.851-32.09-40.971-16.971L7.029 239.029c-9.373 9.373-9.373 24.569 0 33.941l86.059 86.059c15.119 15.119 40.971 4.411 40.971-16.971V296z'/%3e%3c/svg%3e"), "#", "%23") !default;
|
||||
$icon-long-arrow-left-hover: str-replace(url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 448 512'%3e%3cpath fill='#{$white}' d='M134.059 296H436c6.627 0 12-5.373 12-12v-56c0-6.627-5.373-12-12-12H134.059v-46.059c0-21.382-25.851-32.09-40.971-16.971L7.029 239.029c-9.373 9.373-9.373 24.569 0 33.941l86.059 86.059c15.119 15.119 40.971 4.411 40.971-16.971V296z'/%3e%3c/svg%3e"), "#", "%23") !default;
|
||||
$icon-long-arrow-right: str-replace(url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 448 512'%3e%3cpath fill='#{$body-color}' d='M313.941 216H12c-6.627 0-12 5.373-12 12v56c0 6.627 5.373 12 12 12h301.941v46.059c0 21.382 25.851 32.09 40.971 16.971l86.059-86.059c9.373-9.373 9.373-24.569 0-33.941l-86.059-86.059c-15.119-15.119-40.971-4.411-40.971 16.971V216z'/%3e%3c/svg%3e"), "#", "%23") !default;
|
||||
$icon-long-arrow-right-hover: str-replace(url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 448 512'%3e%3cpath fill='#{$white}' d='M313.941 216H12c-6.627 0-12 5.373-12 12v56c0 6.627 5.373 12 12 12h301.941v46.059c0 21.382 25.851 32.09 40.971 16.971l86.059-86.059c9.373-9.373 9.373-24.569 0-33.941l-86.059-86.059c-15.119-15.119-40.971-4.411-40.971 16.971V216z'/%3e%3c/svg%3e"), "#", "%23") !default;
|
||||
$icon-refresh: str-replace(url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512'%3e%3cpath fill='#{$body-color}' d='M370.72 133.28C339.458 104.008 298.888 87.962 255.848 88c-77.458.068-144.328 53.178-162.791 126.85-1.344 5.363-6.122 9.15-11.651 9.15H24.103c-7.498 0-13.194-6.807-11.807-14.176C33.933 94.924 134.813 8 256 8c66.448 0 126.791 26.136 171.315 68.685L463.03 40.97C478.149 25.851 504 36.559 504 57.941V192c0 13.255-10.745 24-24 24H345.941c-21.382 0-32.09-25.851-16.971-40.971l41.75-41.749zM32 296h134.059c21.382 0 32.09 25.851 16.971 40.971l-41.75 41.75c31.262 29.273 71.835 45.319 114.876 45.28 77.418-.07 144.315-53.144 162.787-126.849 1.344-5.363 6.122-9.15 11.651-9.15h57.304c7.498 0 13.194 6.807 11.807 14.176C478.067 417.076 377.187 504 256 504c-66.448 0-126.791-26.136-171.315-68.685L48.97 471.03C33.851 486.149 8 475.441 8 454.059V320c0-13.255 10.745-24 24-24z'/%3e%3c/svg%3e"), "#", "%23") !default;
|
||||
$icon-refresh-hover: str-replace(url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512'%3e%3cpath fill='#{$white}' d='M370.72 133.28C339.458 104.008 298.888 87.962 255.848 88c-77.458.068-144.328 53.178-162.791 126.85-1.344 5.363-6.122 9.15-11.651 9.15H24.103c-7.498 0-13.194-6.807-11.807-14.176C33.933 94.924 134.813 8 256 8c66.448 0 126.791 26.136 171.315 68.685L463.03 40.97C478.149 25.851 504 36.559 504 57.941V192c0 13.255-10.745 24-24 24H345.941c-21.382 0-32.09-25.851-16.971-40.971l41.75-41.749zM32 296h134.059c21.382 0 32.09 25.851 16.971 40.971l-41.75 41.75c31.262 29.273 71.835 45.319 114.876 45.28 77.418-.07 144.315-53.144 162.787-126.849 1.344-5.363 6.122-9.15 11.651-9.15h57.304c7.498 0 13.194 6.807 11.807 14.176C478.067 417.076 377.187 504 256 504c-66.448 0-126.791-26.136-171.315-68.685L48.97 471.03C33.851 486.149 8 475.441 8 454.059V320c0-13.255 10.745-24 24-24z'/%3e%3c/svg%3e"), "#", "%23") !default;
|
||||
$icon-square: str-replace(url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 448 512'%3e%3cpath fill='#{$body-color}' d='M400 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zm-6 400H54c-3.3 0-6-2.7-6-6V86c0-3.3 2.7-6 6-6h340c3.3 0 6 2.7 6 6v340c0 3.3-2.7 6-6 6z'/%3e%3c/svg%3e"), "#", "%23") !default;
|
||||
$icon-square-hover: str-replace(url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 448 512'%3e%3cpath fill='#{$white}' d='M400 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zm-6 400H54c-3.3 0-6-2.7-6-6V86c0-3.3 2.7-6 6-6h340c3.3 0 6 2.7 6 6v340c0 3.3-2.7 6-6 6z'/%3e%3c/svg%3e"), "#", "%23") !default;
|
||||
$icon-check-square: str-replace(url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 448 512'%3e%3cpath fill='#{$body-color}' d='M400 32H48C21.49 32 0 53.49 0 80v352c0 26.51 21.49 48 48 48h352c26.51 0 48-21.49 48-48V80c0-26.51-21.49-48-48-48zm0 400H48V80h352v352zm-35.864-241.724L191.547 361.48c-4.705 4.667-12.303 4.637-16.97-.068l-90.781-91.516c-4.667-4.705-4.637-12.303.069-16.971l22.719-22.536c4.705-4.667 12.303-4.637 16.97.069l59.792 60.277 141.352-140.216c4.705-4.667 12.303-4.637 16.97.068l22.536 22.718c4.667 4.706 4.637 12.304-.068 16.971z'/%3e%3c/svg%3e"), "#", "%23") !default;
|
||||
$icon-check-square-hover: str-replace(url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 448 512'%3e%3cpath fill='#{$white}' d='M400 32H48C21.49 32 0 53.49 0 80v352c0 26.51 21.49 48 48 48h352c26.51 0 48-21.49 48-48V80c0-26.51-21.49-48-48-48zm0 400H48V80h352v352zm-35.864-241.724L191.547 361.48c-4.705 4.667-12.303 4.637-16.97-.068l-90.781-91.516c-4.667-4.705-4.637-12.303.069-16.971l22.719-22.536c4.705-4.667 12.303-4.637 16.97.069l59.792 60.277 141.352-140.216c4.705-4.667 12.303-4.637 16.97.068l22.536 22.718c4.667 4.706 4.637 12.304-.068 16.971z'/%3e%3c/svg%3e"), "#", "%23") !default;
|
||||
13
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/mixins/_alert.scss
vendored
Normal file
13
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/mixins/_alert.scss
vendored
Normal file
@ -0,0 +1,13 @@
|
||||
@mixin alert-variant($background, $border, $color) {
|
||||
color: $color;
|
||||
@include gradient-bg($background);
|
||||
border-color: $border;
|
||||
|
||||
hr {
|
||||
border-top-color: darken($border, 5%);
|
||||
}
|
||||
|
||||
.alert-link {
|
||||
color: darken($color, 10%);
|
||||
}
|
||||
}
|
||||
21
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/mixins/_background-variant.scss
vendored
Normal file
21
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/mixins/_background-variant.scss
vendored
Normal file
@ -0,0 +1,21 @@
|
||||
// stylelint-disable declaration-no-important
|
||||
|
||||
// Contextual backgrounds
|
||||
|
||||
@mixin bg-variant($parent, $color) {
|
||||
#{$parent} {
|
||||
background-color: $color !important;
|
||||
}
|
||||
a#{$parent},
|
||||
button#{$parent} {
|
||||
@include hover-focus {
|
||||
background-color: darken($color, 10%) !important;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@mixin bg-gradient-variant($parent, $color) {
|
||||
#{$parent} {
|
||||
background: $color linear-gradient(180deg, mix($body-bg, $color, 15%), $color) repeat-x !important;
|
||||
}
|
||||
}
|
||||
12
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/mixins/_badge.scss
vendored
Normal file
12
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/mixins/_badge.scss
vendored
Normal file
@ -0,0 +1,12 @@
|
||||
@mixin badge-variant($bg) {
|
||||
color: color-yiq($bg);
|
||||
background-color: $bg;
|
||||
|
||||
&[href] {
|
||||
@include hover-focus {
|
||||
color: color-yiq($bg);
|
||||
text-decoration: none;
|
||||
background-color: darken($bg, 10%);
|
||||
}
|
||||
}
|
||||
}
|
||||
35
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/mixins/_border-radius.scss
vendored
Normal file
35
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/mixins/_border-radius.scss
vendored
Normal file
@ -0,0 +1,35 @@
|
||||
// Single side border-radius
|
||||
|
||||
@mixin border-radius($radius: $border-radius) {
|
||||
@if $enable-rounded {
|
||||
border-radius: $radius;
|
||||
}
|
||||
}
|
||||
|
||||
@mixin border-top-radius($radius) {
|
||||
@if $enable-rounded {
|
||||
border-top-left-radius: $radius;
|
||||
border-top-right-radius: $radius;
|
||||
}
|
||||
}
|
||||
|
||||
@mixin border-right-radius($radius) {
|
||||
@if $enable-rounded {
|
||||
border-top-right-radius: $radius;
|
||||
border-bottom-right-radius: $radius;
|
||||
}
|
||||
}
|
||||
|
||||
@mixin border-bottom-radius($radius) {
|
||||
@if $enable-rounded {
|
||||
border-bottom-right-radius: $radius;
|
||||
border-bottom-left-radius: $radius;
|
||||
}
|
||||
}
|
||||
|
||||
@mixin border-left-radius($radius) {
|
||||
@if $enable-rounded {
|
||||
border-top-left-radius: $radius;
|
||||
border-bottom-left-radius: $radius;
|
||||
}
|
||||
}
|
||||
5
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/mixins/_box-shadow.scss
vendored
Normal file
5
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/mixins/_box-shadow.scss
vendored
Normal file
@ -0,0 +1,5 @@
|
||||
@mixin box-shadow($shadow...) {
|
||||
@if $enable-shadows {
|
||||
box-shadow: $shadow;
|
||||
}
|
||||
}
|
||||
123
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/mixins/_breakpoints.scss
vendored
Normal file
123
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/mixins/_breakpoints.scss
vendored
Normal file
@ -0,0 +1,123 @@
|
||||
// Breakpoint viewport sizes and media queries.
|
||||
//
|
||||
// Breakpoints are defined as a map of (name: minimum width), order from small to large:
|
||||
//
|
||||
// (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px)
|
||||
//
|
||||
// The map defined in the `$grid-breakpoints` global variable is used as the `$breakpoints` argument by default.
|
||||
|
||||
// Name of the next breakpoint, or null for the last breakpoint.
|
||||
//
|
||||
// >> breakpoint-next(sm)
|
||||
// md
|
||||
// >> breakpoint-next(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))
|
||||
// md
|
||||
// >> breakpoint-next(sm, $breakpoint-names: (xs sm md lg xl))
|
||||
// md
|
||||
@function breakpoint-next($name, $breakpoints: $grid-breakpoints, $breakpoint-names: map-keys($breakpoints)) {
|
||||
$n: index($breakpoint-names, $name);
|
||||
@return if($n < length($breakpoint-names), nth($breakpoint-names, $n + 1), null);
|
||||
}
|
||||
|
||||
// Minimum breakpoint width. Null for the smallest (first) breakpoint.
|
||||
//
|
||||
// >> breakpoint-min(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))
|
||||
// 576px
|
||||
@function breakpoint-min($name, $breakpoints: $grid-breakpoints) {
|
||||
$min: map-get($breakpoints, $name);
|
||||
@return if($min != 0, $min, null);
|
||||
}
|
||||
|
||||
// Maximum breakpoint width. Null for the largest (last) breakpoint.
|
||||
// The maximum value is calculated as the minimum of the next one less 0.02px
|
||||
// to work around the limitations of `min-` and `max-` prefixes and viewports with fractional widths.
|
||||
// See https://www.w3.org/TR/mediaqueries-4/#mq-min-max
|
||||
// Uses 0.02px rather than 0.01px to work around a current rounding bug in Safari.
|
||||
// See https://bugs.webkit.org/show_bug.cgi?id=178261
|
||||
//
|
||||
// >> breakpoint-max(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))
|
||||
// 767.98px
|
||||
@function breakpoint-max($name, $breakpoints: $grid-breakpoints) {
|
||||
$next: breakpoint-next($name, $breakpoints);
|
||||
@return if($next, breakpoint-min($next, $breakpoints) - .02px, null);
|
||||
}
|
||||
|
||||
// Returns a blank string if smallest breakpoint, otherwise returns the name with a dash in front.
|
||||
// Useful for making responsive utilities.
|
||||
//
|
||||
// >> breakpoint-infix(xs, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))
|
||||
// "" (Returns a blank string)
|
||||
// >> breakpoint-infix(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))
|
||||
// "-sm"
|
||||
@function breakpoint-infix($name, $breakpoints: $grid-breakpoints) {
|
||||
@return if(breakpoint-min($name, $breakpoints) == null, "", "-#{$name}");
|
||||
}
|
||||
|
||||
// Media of at least the minimum breakpoint width. No query for the smallest breakpoint.
|
||||
// Makes the @content apply to the given breakpoint and wider.
|
||||
@mixin media-breakpoint-up($name, $breakpoints: $grid-breakpoints) {
|
||||
$min: breakpoint-min($name, $breakpoints);
|
||||
@if $min {
|
||||
@media (min-width: $min) {
|
||||
@content;
|
||||
}
|
||||
} @else {
|
||||
@content;
|
||||
}
|
||||
}
|
||||
|
||||
// Media of at most the maximum breakpoint width. No query for the largest breakpoint.
|
||||
// Makes the @content apply to the given breakpoint and narrower.
|
||||
@mixin media-breakpoint-down($name, $breakpoints: $grid-breakpoints) {
|
||||
$max: breakpoint-max($name, $breakpoints);
|
||||
@if $max {
|
||||
@media (max-width: $max) {
|
||||
@content;
|
||||
}
|
||||
} @else {
|
||||
@content;
|
||||
}
|
||||
}
|
||||
|
||||
// Media that spans multiple breakpoint widths.
|
||||
// Makes the @content apply between the min and max breakpoints
|
||||
@mixin media-breakpoint-between($lower, $upper, $breakpoints: $grid-breakpoints) {
|
||||
$min: breakpoint-min($lower, $breakpoints);
|
||||
$max: breakpoint-max($upper, $breakpoints);
|
||||
|
||||
@if $min != null and $max != null {
|
||||
@media (min-width: $min) and (max-width: $max) {
|
||||
@content;
|
||||
}
|
||||
} @else if $max == null {
|
||||
@include media-breakpoint-up($lower, $breakpoints) {
|
||||
@content;
|
||||
}
|
||||
} @else if $min == null {
|
||||
@include media-breakpoint-down($upper, $breakpoints) {
|
||||
@content;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Media between the breakpoint's minimum and maximum widths.
|
||||
// No minimum for the smallest breakpoint, and no maximum for the largest one.
|
||||
// Makes the @content apply only to the given breakpoint, not viewports any wider or narrower.
|
||||
@mixin media-breakpoint-only($name, $breakpoints: $grid-breakpoints) {
|
||||
$min: breakpoint-min($name, $breakpoints);
|
||||
$max: breakpoint-max($name, $breakpoints);
|
||||
|
||||
@if $min != null and $max != null {
|
||||
@media (min-width: $min) and (max-width: $max) {
|
||||
@content;
|
||||
}
|
||||
} @else if $max == null {
|
||||
@include media-breakpoint-up($name, $breakpoints) {
|
||||
@content;
|
||||
}
|
||||
} @else if $min == null {
|
||||
@include media-breakpoint-down($name, $breakpoints) {
|
||||
@content;
|
||||
}
|
||||
}
|
||||
}
|
||||
109
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/mixins/_buttons.scss
vendored
Normal file
109
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/mixins/_buttons.scss
vendored
Normal file
@ -0,0 +1,109 @@
|
||||
// Button variants
|
||||
//
|
||||
// Easily pump out default styles, as well as :hover, :focus, :active,
|
||||
// and disabled options for all buttons
|
||||
|
||||
@mixin button-variant($background, $border, $hover-background: darken($background, 7.5%), $hover-border: darken($border, 10%), $active-background: darken($background, 10%), $active-border: darken($border, 12.5%)) {
|
||||
color: color-yiq($background);
|
||||
@include gradient-bg($background);
|
||||
border-color: $border;
|
||||
@include box-shadow($btn-box-shadow);
|
||||
|
||||
@include hover {
|
||||
color: color-yiq($hover-background);
|
||||
@include gradient-bg($hover-background);
|
||||
border-color: $hover-border;
|
||||
}
|
||||
|
||||
&:focus,
|
||||
&.focus {
|
||||
// Avoid using mixin so we can pass custom focus shadow properly
|
||||
@if $enable-shadows {
|
||||
box-shadow: $btn-box-shadow, 0 0 0 $btn-focus-width rgba($border, .5);
|
||||
} @else {
|
||||
box-shadow: 0 0 0 $btn-focus-width rgba($border, .5);
|
||||
}
|
||||
}
|
||||
|
||||
// Disabled comes first so active can properly restyle
|
||||
&.disabled,
|
||||
&:disabled {
|
||||
color: color-yiq($background);
|
||||
background-color: $background;
|
||||
border-color: $border;
|
||||
}
|
||||
|
||||
&:not(:disabled):not(.disabled):active,
|
||||
&:not(:disabled):not(.disabled).active,
|
||||
.show > &.dropdown-toggle {
|
||||
color: color-yiq($active-background);
|
||||
background-color: $active-background;
|
||||
@if $enable-gradients {
|
||||
background-image: none; // Remove the gradient for the pressed/active state
|
||||
}
|
||||
border-color: $active-border;
|
||||
|
||||
&:focus {
|
||||
// Avoid using mixin so we can pass custom focus shadow properly
|
||||
@if $enable-shadows {
|
||||
box-shadow: $btn-active-box-shadow, 0 0 0 $btn-focus-width rgba($border, .5);
|
||||
} @else {
|
||||
box-shadow: 0 0 0 $btn-focus-width rgba($border, .5);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@mixin button-outline-variant($color, $color-hover: color-yiq($color), $active-background: $color, $active-border: $color) {
|
||||
color: $color;
|
||||
background-color: transparent;
|
||||
background-image: none;
|
||||
border-color: $color;
|
||||
|
||||
&:hover {
|
||||
color: $color-hover;
|
||||
background-color: $active-background;
|
||||
border-color: $active-border;
|
||||
}
|
||||
|
||||
&:focus,
|
||||
&.focus {
|
||||
box-shadow: 0 0 0 $btn-focus-width rgba($color, .5);
|
||||
}
|
||||
|
||||
&.disabled,
|
||||
&:disabled {
|
||||
color: $color;
|
||||
background-color: transparent;
|
||||
}
|
||||
|
||||
&:not(:disabled):not(.disabled):active,
|
||||
&:not(:disabled):not(.disabled).active,
|
||||
.show > &.dropdown-toggle {
|
||||
color: color-yiq($active-background);
|
||||
background-color: $active-background;
|
||||
border-color: $active-border;
|
||||
|
||||
&:focus {
|
||||
// Avoid using mixin so we can pass custom focus shadow properly
|
||||
@if $enable-shadows and $btn-active-box-shadow != none {
|
||||
box-shadow: $btn-active-box-shadow, 0 0 0 $btn-focus-width rgba($color, .5);
|
||||
} @else {
|
||||
box-shadow: 0 0 0 $btn-focus-width rgba($color, .5);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Button sizes
|
||||
@mixin button-size($padding-y, $padding-x, $font-size, $line-height, $border-radius) {
|
||||
padding: $padding-y $padding-x;
|
||||
font-size: $font-size;
|
||||
line-height: $line-height;
|
||||
// Manually declare to provide an override to the browser default
|
||||
@if $enable-rounded {
|
||||
border-radius: $border-radius;
|
||||
} @else {
|
||||
border-radius: 0;
|
||||
}
|
||||
}
|
||||
66
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/mixins/_caret.scss
vendored
Normal file
66
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/mixins/_caret.scss
vendored
Normal file
@ -0,0 +1,66 @@
|
||||
@mixin caret-down {
|
||||
border-top: $caret-width solid;
|
||||
border-right: $caret-width solid transparent;
|
||||
border-bottom: 0;
|
||||
border-left: $caret-width solid transparent;
|
||||
}
|
||||
|
||||
@mixin caret-up {
|
||||
border-top: 0;
|
||||
border-right: $caret-width solid transparent;
|
||||
border-bottom: $caret-width solid;
|
||||
border-left: $caret-width solid transparent;
|
||||
}
|
||||
|
||||
@mixin caret-right {
|
||||
border-top: $caret-width solid transparent;
|
||||
border-right: 0;
|
||||
border-bottom: $caret-width solid transparent;
|
||||
border-left: $caret-width solid;
|
||||
}
|
||||
|
||||
@mixin caret-left {
|
||||
border-top: $caret-width solid transparent;
|
||||
border-right: $caret-width solid;
|
||||
border-bottom: $caret-width solid transparent;
|
||||
}
|
||||
|
||||
@mixin caret($direction: down) {
|
||||
@if $enable-caret {
|
||||
&::after {
|
||||
display: inline-block;
|
||||
width: 0;
|
||||
height: 0;
|
||||
margin-left: $caret-width * .85;
|
||||
vertical-align: $caret-width * .85;
|
||||
content: "";
|
||||
@if $direction == down {
|
||||
@include caret-down;
|
||||
} @else if $direction == up {
|
||||
@include caret-up;
|
||||
} @else if $direction == right {
|
||||
@include caret-right;
|
||||
}
|
||||
}
|
||||
|
||||
@if $direction == left {
|
||||
&::after {
|
||||
display: none;
|
||||
}
|
||||
|
||||
&::before {
|
||||
display: inline-block;
|
||||
width: 0;
|
||||
height: 0;
|
||||
margin-right: $caret-width * .85;
|
||||
vertical-align: $caret-width * .85;
|
||||
content: "";
|
||||
@include caret-left;
|
||||
}
|
||||
}
|
||||
|
||||
&:empty::after {
|
||||
margin-left: 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
7
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/mixins/_clearfix.scss
vendored
Normal file
7
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/mixins/_clearfix.scss
vendored
Normal file
@ -0,0 +1,7 @@
|
||||
@mixin clearfix() {
|
||||
&::after {
|
||||
display: block;
|
||||
clear: both;
|
||||
content: "";
|
||||
}
|
||||
}
|
||||
11
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/mixins/_float.scss
vendored
Normal file
11
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/mixins/_float.scss
vendored
Normal file
@ -0,0 +1,11 @@
|
||||
// stylelint-disable declaration-no-important
|
||||
|
||||
@mixin float-left {
|
||||
float: left !important;
|
||||
}
|
||||
@mixin float-right {
|
||||
float: right !important;
|
||||
}
|
||||
@mixin float-none {
|
||||
float: none !important;
|
||||
}
|
||||
147
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/mixins/_forms.scss
vendored
Normal file
147
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/mixins/_forms.scss
vendored
Normal file
@ -0,0 +1,147 @@
|
||||
// Form control focus state
|
||||
//
|
||||
// Generate a customized focus state and for any input with the specified color,
|
||||
// which defaults to the `$input-focus-border-color` variable.
|
||||
//
|
||||
// We highly encourage you to not customize the default value, but instead use
|
||||
// this to tweak colors on an as-needed basis. This aesthetic change is based on
|
||||
// WebKit's default styles, but applicable to a wider range of browsers. Its
|
||||
// usability and accessibility should be taken into account with any change.
|
||||
//
|
||||
// Example usage: change the default blue border and shadow to white for better
|
||||
// contrast against a dark gray background.
|
||||
@mixin form-control-focus() {
|
||||
&:focus {
|
||||
color: $input-focus-color;
|
||||
background-color: $input-focus-bg;
|
||||
border-color: $input-focus-border-color;
|
||||
outline: 0;
|
||||
// Avoid using mixin so we can pass custom focus shadow properly
|
||||
@if $enable-shadows {
|
||||
box-shadow: $input-box-shadow, $input-focus-box-shadow;
|
||||
} @else {
|
||||
box-shadow: $input-focus-box-shadow;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@mixin form-validation-state($state, $color) {
|
||||
.#{$state}-feedback {
|
||||
display: none;
|
||||
width: 100%;
|
||||
margin-top: $form-feedback-margin-top;
|
||||
font-size: $form-feedback-font-size;
|
||||
color: $color;
|
||||
}
|
||||
|
||||
.#{$state}-tooltip {
|
||||
position: absolute;
|
||||
top: 100%;
|
||||
z-index: 5;
|
||||
display: none;
|
||||
max-width: 100%; // Contain to parent when possible
|
||||
padding: $tooltip-padding-y $tooltip-padding-x;
|
||||
margin-top: .1rem;
|
||||
font-size: $tooltip-font-size;
|
||||
line-height: $line-height-base;
|
||||
color: color-yiq($color);
|
||||
background-color: rgba($color, $tooltip-opacity);
|
||||
@include border-radius($tooltip-border-radius);
|
||||
}
|
||||
|
||||
.form-control,
|
||||
.custom-select {
|
||||
.was-validated &:#{$state},
|
||||
&.is-#{$state} {
|
||||
border-color: $color;
|
||||
|
||||
&:focus {
|
||||
border-color: $color;
|
||||
box-shadow: 0 0 0 $input-focus-width rgba($color, .25);
|
||||
}
|
||||
|
||||
~ .#{$state}-feedback,
|
||||
~ .#{$state}-tooltip {
|
||||
display: block;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.form-control-file {
|
||||
.was-validated &:#{$state},
|
||||
&.is-#{$state} {
|
||||
~ .#{$state}-feedback,
|
||||
~ .#{$state}-tooltip {
|
||||
display: block;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.form-check-input {
|
||||
.was-validated &:#{$state},
|
||||
&.is-#{$state} {
|
||||
~ .form-check-label {
|
||||
color: $color;
|
||||
}
|
||||
|
||||
~ .#{$state}-feedback,
|
||||
~ .#{$state}-tooltip {
|
||||
display: block;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.custom-control-input {
|
||||
.was-validated &:#{$state},
|
||||
&.is-#{$state} {
|
||||
~ .custom-control-label {
|
||||
color: $color;
|
||||
|
||||
&::before {
|
||||
background-color: lighten($color, 25%);
|
||||
}
|
||||
}
|
||||
|
||||
~ .#{$state}-feedback,
|
||||
~ .#{$state}-tooltip {
|
||||
display: block;
|
||||
}
|
||||
|
||||
&:checked {
|
||||
~ .custom-control-label::before {
|
||||
@include gradient-bg(lighten($color, 10%));
|
||||
}
|
||||
}
|
||||
|
||||
&:focus {
|
||||
~ .custom-control-label::before {
|
||||
box-shadow: 0 0 0 1px $body-bg, 0 0 0 $input-focus-width rgba($color, .25);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// custom file
|
||||
.custom-file-input {
|
||||
.was-validated &:#{$state},
|
||||
&.is-#{$state} {
|
||||
~ .custom-file-label {
|
||||
border-color: $color;
|
||||
|
||||
&::after { border-color: inherit; }
|
||||
}
|
||||
|
||||
~ .#{$state}-feedback,
|
||||
~ .#{$state}-tooltip {
|
||||
display: block;
|
||||
}
|
||||
|
||||
&:focus {
|
||||
~ .custom-file-label {
|
||||
box-shadow: 0 0 0 $input-focus-width rgba($color, .25);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
45
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/mixins/_gradients.scss
vendored
Normal file
45
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/mixins/_gradients.scss
vendored
Normal file
@ -0,0 +1,45 @@
|
||||
// Gradients
|
||||
|
||||
@mixin gradient-bg($color) {
|
||||
@if $enable-gradients {
|
||||
background: $color linear-gradient(180deg, mix($body-bg, $color, 15%), $color) repeat-x;
|
||||
} @else {
|
||||
background-color: $color;
|
||||
}
|
||||
}
|
||||
|
||||
// Horizontal gradient, from left to right
|
||||
//
|
||||
// Creates two color stops, start and end, by specifying a color and position for each color stop.
|
||||
@mixin gradient-x($start-color: $gray-700, $end-color: $gray-800, $start-percent: 0%, $end-percent: 100%) {
|
||||
background-image: linear-gradient(to right, $start-color $start-percent, $end-color $end-percent);
|
||||
background-repeat: repeat-x;
|
||||
}
|
||||
|
||||
// Vertical gradient, from top to bottom
|
||||
//
|
||||
// Creates two color stops, start and end, by specifying a color and position for each color stop.
|
||||
@mixin gradient-y($start-color: $gray-700, $end-color: $gray-800, $start-percent: 0%, $end-percent: 100%) {
|
||||
background-image: linear-gradient(to bottom, $start-color $start-percent, $end-color $end-percent);
|
||||
background-repeat: repeat-x;
|
||||
}
|
||||
|
||||
@mixin gradient-directional($start-color: $gray-700, $end-color: $gray-800, $deg: 45deg) {
|
||||
background-image: linear-gradient($deg, $start-color, $end-color);
|
||||
background-repeat: repeat-x;
|
||||
}
|
||||
@mixin gradient-x-three-colors($start-color: $blue, $mid-color: $purple, $color-stop: 50%, $end-color: $red) {
|
||||
background-image: linear-gradient(to right, $start-color, $mid-color $color-stop, $end-color);
|
||||
background-repeat: no-repeat;
|
||||
}
|
||||
@mixin gradient-y-three-colors($start-color: $blue, $mid-color: $purple, $color-stop: 50%, $end-color: $red) {
|
||||
background-image: linear-gradient($start-color, $mid-color $color-stop, $end-color);
|
||||
background-repeat: no-repeat;
|
||||
}
|
||||
@mixin gradient-radial($inner-color: $gray-700, $outer-color: $gray-800) {
|
||||
background-image: radial-gradient(circle, $inner-color, $outer-color);
|
||||
background-repeat: no-repeat;
|
||||
}
|
||||
@mixin gradient-striped($color: rgba($white, .15), $angle: 45deg) {
|
||||
background-image: linear-gradient($angle, $color 25%, transparent 25%, transparent 50%, $color 50%, $color 75%, transparent 75%, transparent);
|
||||
}
|
||||
67
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/mixins/_grid-framework.scss
vendored
Normal file
67
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/mixins/_grid-framework.scss
vendored
Normal file
@ -0,0 +1,67 @@
|
||||
// Framework grid generation
|
||||
//
|
||||
// Used only by Bootstrap to generate the correct number of grid classes given
|
||||
// any value of `$grid-columns`.
|
||||
|
||||
@mixin make-grid-columns($columns: $grid-columns, $gutter: $grid-gutter-width, $breakpoints: $grid-breakpoints) {
|
||||
// Common properties for all breakpoints
|
||||
%grid-column {
|
||||
position: relative;
|
||||
width: 100%;
|
||||
min-height: 1px; // Prevent columns from collapsing when empty
|
||||
padding-right: ($gutter / 2);
|
||||
padding-left: ($gutter / 2);
|
||||
}
|
||||
|
||||
@each $breakpoint in map-keys($breakpoints) {
|
||||
$infix: breakpoint-infix($breakpoint, $breakpoints);
|
||||
|
||||
// Allow columns to stretch full width below their breakpoints
|
||||
@for $i from 1 through $columns {
|
||||
.col#{$infix}-#{$i} {
|
||||
@extend %grid-column;
|
||||
}
|
||||
}
|
||||
.col#{$infix},
|
||||
.col#{$infix}-auto {
|
||||
@extend %grid-column;
|
||||
}
|
||||
|
||||
@include media-breakpoint-up($breakpoint, $breakpoints) {
|
||||
// Provide basic `.col-{bp}` classes for equal-width flexbox columns
|
||||
.col#{$infix} {
|
||||
flex-basis: 0;
|
||||
flex-grow: 1;
|
||||
max-width: 100%;
|
||||
}
|
||||
.col#{$infix}-auto {
|
||||
flex: 0 0 auto;
|
||||
width: auto;
|
||||
max-width: none; // Reset earlier grid tiers
|
||||
}
|
||||
|
||||
@for $i from 1 through $columns {
|
||||
.col#{$infix}-#{$i} {
|
||||
@include make-col($i, $columns);
|
||||
}
|
||||
}
|
||||
|
||||
.order#{$infix}-first { order: -1; }
|
||||
|
||||
.order#{$infix}-last { order: $columns + 1; }
|
||||
|
||||
@for $i from 0 through $columns {
|
||||
.order#{$infix}-#{$i} { order: $i; }
|
||||
}
|
||||
|
||||
// `$columns - 1` because offsetting by the width of an entire row isn't possible
|
||||
@for $i from 0 through ($columns - 1) {
|
||||
@if not ($infix == "" and $i == 0) { // Avoid emitting useless .offset-0
|
||||
.offset#{$infix}-#{$i} {
|
||||
@include make-col-offset($i, $columns);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
52
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/mixins/_grid.scss
vendored
Normal file
52
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/mixins/_grid.scss
vendored
Normal file
@ -0,0 +1,52 @@
|
||||
/// Grid system
|
||||
//
|
||||
// Generate semantic grid columns with these mixins.
|
||||
|
||||
@mixin make-container() {
|
||||
width: 100%;
|
||||
padding-right: ($grid-gutter-width / 2);
|
||||
padding-left: ($grid-gutter-width / 2);
|
||||
margin-right: auto;
|
||||
margin-left: auto;
|
||||
}
|
||||
|
||||
|
||||
// For each breakpoint, define the maximum width of the container in a media query
|
||||
@mixin make-container-max-widths($max-widths: $container-max-widths, $breakpoints: $grid-breakpoints) {
|
||||
@each $breakpoint, $container-max-width in $max-widths {
|
||||
@include media-breakpoint-up($breakpoint, $breakpoints) {
|
||||
max-width: $container-max-width;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@mixin make-row() {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
margin-right: ($grid-gutter-width / -2);
|
||||
margin-left: ($grid-gutter-width / -2);
|
||||
}
|
||||
|
||||
@mixin make-col-ready() {
|
||||
position: relative;
|
||||
// Prevent columns from becoming too narrow when at smaller grid tiers by
|
||||
// always setting `width: 100%;`. This works because we use `flex` values
|
||||
// later on to override this initial width.
|
||||
width: 100%;
|
||||
min-height: 1px; // Prevent collapsing
|
||||
padding-right: ($grid-gutter-width / 2);
|
||||
padding-left: ($grid-gutter-width / 2);
|
||||
}
|
||||
|
||||
@mixin make-col($size, $columns: $grid-columns) {
|
||||
flex: 0 0 percentage($size / $columns);
|
||||
// Add a `max-width` to ensure content within each column does not blow out
|
||||
// the width of the column. Applies to IE10+ and Firefox. Chrome and Safari
|
||||
// do not appear to require this.
|
||||
max-width: percentage($size / $columns);
|
||||
}
|
||||
|
||||
@mixin make-col-offset($size, $columns: $grid-columns) {
|
||||
$num: $size / $columns;
|
||||
margin-left: if($num == 0, 0, percentage($num));
|
||||
}
|
||||
37
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/mixins/_hover.scss
vendored
Normal file
37
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/mixins/_hover.scss
vendored
Normal file
@ -0,0 +1,37 @@
|
||||
// Hover mixin and `$enable-hover-media-query` are deprecated.
|
||||
//
|
||||
// Originally added during our alphas and maintained during betas, this mixin was
|
||||
// designed to prevent `:hover` stickiness on iOS-an issue where hover styles
|
||||
// would persist after initial touch.
|
||||
//
|
||||
// For backward compatibility, we've kept these mixins and updated them to
|
||||
// always return their regular pseudo-classes instead of a shimmed media query.
|
||||
//
|
||||
// Issue: https://github.com/twbs/bootstrap/issues/25195
|
||||
|
||||
@mixin hover {
|
||||
&:hover { @content; }
|
||||
}
|
||||
|
||||
@mixin hover-focus {
|
||||
&:hover,
|
||||
&:focus {
|
||||
@content;
|
||||
}
|
||||
}
|
||||
|
||||
@mixin plain-hover-focus {
|
||||
&,
|
||||
&:hover,
|
||||
&:focus {
|
||||
@content;
|
||||
}
|
||||
}
|
||||
|
||||
@mixin hover-focus-active {
|
||||
&:hover,
|
||||
&:focus,
|
||||
&:active {
|
||||
@content;
|
||||
}
|
||||
}
|
||||
36
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/mixins/_image.scss
vendored
Normal file
36
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/mixins/_image.scss
vendored
Normal file
@ -0,0 +1,36 @@
|
||||
// Image Mixins
|
||||
// - Responsive image
|
||||
// - Retina image
|
||||
|
||||
|
||||
// Responsive image
|
||||
//
|
||||
// Keep images from scaling beyond the width of their parents.
|
||||
|
||||
@mixin img-fluid {
|
||||
// Part 1: Set a maximum relative to the parent
|
||||
max-width: 100%;
|
||||
// Part 2: Override the height to auto, otherwise images will be stretched
|
||||
// when setting a width and height attribute on the img element.
|
||||
height: auto;
|
||||
}
|
||||
|
||||
|
||||
// Retina image
|
||||
//
|
||||
// Short retina mixin for setting background-image and -size.
|
||||
|
||||
// stylelint-disable indentation, media-query-list-comma-newline-after
|
||||
@mixin img-retina($file-1x, $file-2x, $width-1x, $height-1x) {
|
||||
background-image: url($file-1x);
|
||||
|
||||
// Autoprefixer takes care of adding -webkit-min-device-pixel-ratio and -o-min-device-pixel-ratio,
|
||||
// but doesn't convert dppx=>dpi.
|
||||
// There's no such thing as unprefixed min-device-pixel-ratio since it's nonstandard.
|
||||
// Compatibility info: https://caniuse.com/#feat=css-media-resolution
|
||||
@media only screen and (min-resolution: 192dpi), // IE9-11 don't support dppx
|
||||
only screen and (min-resolution: 2dppx) { // Standardized
|
||||
background-image: url($file-2x);
|
||||
background-size: $width-1x $height-1x;
|
||||
}
|
||||
}
|
||||
21
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/mixins/_list-group.scss
vendored
Normal file
21
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/mixins/_list-group.scss
vendored
Normal file
@ -0,0 +1,21 @@
|
||||
// List Groups
|
||||
|
||||
@mixin list-group-item-variant($state, $background, $color) {
|
||||
.list-group-item-#{$state} {
|
||||
color: $color;
|
||||
background-color: $background;
|
||||
|
||||
&.list-group-item-action {
|
||||
@include hover-focus {
|
||||
color: $color;
|
||||
background-color: darken($background, 5%);
|
||||
}
|
||||
|
||||
&.active {
|
||||
color: $white;
|
||||
background-color: $color;
|
||||
border-color: $color;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
7
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/mixins/_lists.scss
vendored
Normal file
7
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/mixins/_lists.scss
vendored
Normal file
@ -0,0 +1,7 @@
|
||||
// Lists
|
||||
|
||||
// Unstyled keeps list items block level, just removes default browser padding and list-style
|
||||
@mixin list-unstyled {
|
||||
padding-left: 0;
|
||||
list-style: none;
|
||||
}
|
||||
10
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/mixins/_nav-divider.scss
vendored
Normal file
10
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/mixins/_nav-divider.scss
vendored
Normal file
@ -0,0 +1,10 @@
|
||||
// Horizontal dividers
|
||||
//
|
||||
// Dividers (basically an hr) within dropdowns and nav lists
|
||||
|
||||
@mixin nav-divider($color: $nav-divider-color, $margin-y: $nav-divider-margin-y) {
|
||||
height: 0;
|
||||
margin: $margin-y 0;
|
||||
overflow: hidden;
|
||||
border-top: 1px solid $color;
|
||||
}
|
||||
22
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/mixins/_pagination.scss
vendored
Normal file
22
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/mixins/_pagination.scss
vendored
Normal file
@ -0,0 +1,22 @@
|
||||
// Pagination
|
||||
|
||||
@mixin pagination-size($padding-y, $padding-x, $font-size, $line-height, $border-radius) {
|
||||
.page-link {
|
||||
padding: $padding-y $padding-x;
|
||||
font-size: $font-size;
|
||||
line-height: $line-height;
|
||||
}
|
||||
|
||||
.page-item {
|
||||
&:first-child {
|
||||
.page-link {
|
||||
@include border-left-radius($border-radius);
|
||||
}
|
||||
}
|
||||
&:last-child {
|
||||
.page-link {
|
||||
@include border-right-radius($border-radius);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
17
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/mixins/_reset-text.scss
vendored
Normal file
17
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/mixins/_reset-text.scss
vendored
Normal file
@ -0,0 +1,17 @@
|
||||
@mixin reset-text {
|
||||
font-family: $font-family-base;
|
||||
// We deliberately do NOT reset font-size or word-wrap.
|
||||
font-style: normal;
|
||||
font-weight: $font-weight-normal;
|
||||
line-height: $line-height-base;
|
||||
text-align: left; // Fallback for where `start` is not supported
|
||||
text-align: start; // stylelint-disable-line declaration-block-no-duplicate-properties
|
||||
text-decoration: none;
|
||||
text-shadow: none;
|
||||
text-transform: none;
|
||||
letter-spacing: normal;
|
||||
word-break: normal;
|
||||
word-spacing: normal;
|
||||
white-space: normal;
|
||||
line-break: auto;
|
||||
}
|
||||
6
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/mixins/_resize.scss
vendored
Normal file
6
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/mixins/_resize.scss
vendored
Normal file
@ -0,0 +1,6 @@
|
||||
// Resize anything
|
||||
|
||||
@mixin resizable($direction) {
|
||||
overflow: auto; // Per CSS3 UI, `resize` only applies when `overflow` isn't `visible`
|
||||
resize: $direction; // Options: horizontal, vertical, both
|
||||
}
|
||||
33
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/mixins/_screen-reader.scss
vendored
Normal file
33
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/mixins/_screen-reader.scss
vendored
Normal file
@ -0,0 +1,33 @@
|
||||
// Only display content to screen readers
|
||||
//
|
||||
// See: https://a11yproject.com/posts/how-to-hide-content/
|
||||
// See: https://hugogiraudel.com/2016/10/13/css-hide-and-seek/
|
||||
|
||||
@mixin sr-only {
|
||||
position: absolute;
|
||||
width: 1px;
|
||||
height: 1px;
|
||||
padding: 0;
|
||||
overflow: hidden;
|
||||
clip: rect(0, 0, 0, 0);
|
||||
white-space: nowrap;
|
||||
border: 0;
|
||||
}
|
||||
|
||||
// Use in conjunction with .sr-only to only display content when it's focused.
|
||||
//
|
||||
// Useful for "Skip to main content" links; see https://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1
|
||||
//
|
||||
// Credit: HTML5 Boilerplate
|
||||
|
||||
@mixin sr-only-focusable {
|
||||
&:active,
|
||||
&:focus {
|
||||
position: static;
|
||||
width: auto;
|
||||
height: auto;
|
||||
overflow: visible;
|
||||
clip: auto;
|
||||
white-space: normal;
|
||||
}
|
||||
}
|
||||
6
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/mixins/_size.scss
vendored
Normal file
6
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/mixins/_size.scss
vendored
Normal file
@ -0,0 +1,6 @@
|
||||
// Sizing shortcuts
|
||||
|
||||
@mixin size($width, $height: $width) {
|
||||
width: $width;
|
||||
height: $height;
|
||||
}
|
||||
30
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/mixins/_table-row.scss
vendored
Normal file
30
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/mixins/_table-row.scss
vendored
Normal file
@ -0,0 +1,30 @@
|
||||
// Tables
|
||||
|
||||
@mixin table-row-variant($state, $background) {
|
||||
// Exact selectors below required to override `.table-striped` and prevent
|
||||
// inheritance to nested tables.
|
||||
.table-#{$state} {
|
||||
&,
|
||||
> th,
|
||||
> td {
|
||||
background-color: $background;
|
||||
}
|
||||
}
|
||||
|
||||
// Hover states for `.table-hover`
|
||||
// Note: this is not available for cells or rows within `thead` or `tfoot`.
|
||||
.table-hover {
|
||||
$hover-background: darken($background, 5%);
|
||||
|
||||
.table-#{$state} {
|
||||
@include hover {
|
||||
background-color: $hover-background;
|
||||
|
||||
> td,
|
||||
> th {
|
||||
background-color: $hover-background;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
14
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/mixins/_text-emphasis.scss
vendored
Normal file
14
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/mixins/_text-emphasis.scss
vendored
Normal file
@ -0,0 +1,14 @@
|
||||
// stylelint-disable declaration-no-important
|
||||
|
||||
// Typography
|
||||
|
||||
@mixin text-emphasis-variant($parent, $color) {
|
||||
#{$parent} {
|
||||
color: $color !important;
|
||||
}
|
||||
a#{$parent} {
|
||||
@include hover-focus {
|
||||
color: darken($color, 10%) !important;
|
||||
}
|
||||
}
|
||||
}
|
||||
13
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/mixins/_text-hide.scss
vendored
Normal file
13
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/mixins/_text-hide.scss
vendored
Normal file
@ -0,0 +1,13 @@
|
||||
// CSS image replacement
|
||||
@mixin text-hide($ignore-warning: false) {
|
||||
// stylelint-disable-next-line font-family-no-missing-generic-family-keyword
|
||||
font: 0/0 a;
|
||||
color: transparent;
|
||||
text-shadow: none;
|
||||
background-color: transparent;
|
||||
border: 0;
|
||||
|
||||
@if ($ignore-warning != true) {
|
||||
@warn "The `text-hide()` mixin has been deprecated as of v4.1.0. It will be removed entirely in v5.";
|
||||
}
|
||||
}
|
||||
8
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/mixins/_text-truncate.scss
vendored
Normal file
8
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/mixins/_text-truncate.scss
vendored
Normal file
@ -0,0 +1,8 @@
|
||||
// Text truncate
|
||||
// Requires inline-block or block for proper styling
|
||||
|
||||
@mixin text-truncate() {
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
}
|
||||
13
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/mixins/_transition.scss
vendored
Normal file
13
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/mixins/_transition.scss
vendored
Normal file
@ -0,0 +1,13 @@
|
||||
@mixin transition($transition...) {
|
||||
@if $enable-transitions {
|
||||
@if length($transition) == 0 {
|
||||
transition: $transition-base;
|
||||
} @else {
|
||||
transition: $transition;
|
||||
}
|
||||
}
|
||||
|
||||
@media screen and (prefers-reduced-motion: reduce) {
|
||||
transition: none;
|
||||
}
|
||||
}
|
||||
7
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/mixins/_visibility.scss
vendored
Normal file
7
vendor/yiisoft/yii2-gii/src/assets/scss/bs4/mixins/_visibility.scss
vendored
Normal file
@ -0,0 +1,7 @@
|
||||
// stylelint-disable declaration-no-important
|
||||
|
||||
// Visibility
|
||||
|
||||
@mixin invisible($visibility) {
|
||||
visibility: $visibility !important;
|
||||
}
|
||||
373
vendor/yiisoft/yii2-gii/src/assets/scss/main.scss
vendored
Normal file
373
vendor/yiisoft/yii2-gii/src/assets/scss/main.scss
vendored
Normal file
@ -0,0 +1,373 @@
|
||||
@import "bs4/functions";
|
||||
@import "bs4/variables";
|
||||
@import "bs4/mixins";
|
||||
|
||||
@import "bs4/reboot";
|
||||
@import "bs4/type";
|
||||
@import "bs4/code";
|
||||
@import "bs4/grid";
|
||||
@import "bs4/tables";
|
||||
@import "bs4/forms";
|
||||
@import "bs4/buttons";
|
||||
@import "bs4/transitions";
|
||||
@import "bs4/dropdown";
|
||||
@import "bs4/button-group";
|
||||
@import "bs4/nav";
|
||||
@import "bs4/navbar";
|
||||
@import "bs4/pagination";
|
||||
@import "bs4/badge";
|
||||
@import "bs4/list-group";
|
||||
@import "bs4/close";
|
||||
@import "bs4/modal";
|
||||
@import "bs4/tooltip";
|
||||
@import "bs4/popover";
|
||||
@import "bs4/utilities";
|
||||
|
||||
.tab-pane {
|
||||
padding: $list-group-item-padding-y 0;
|
||||
}
|
||||
|
||||
html,
|
||||
body {
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.page-container {
|
||||
min-height: 100%;
|
||||
}
|
||||
|
||||
.content-container {
|
||||
padding-top: 90px;
|
||||
}
|
||||
|
||||
.footer-fix {
|
||||
height: 100px;
|
||||
}
|
||||
|
||||
.footer {
|
||||
margin-top: -60px;
|
||||
height: 59px;
|
||||
line-height: 59px;
|
||||
box-sizing: border-box;
|
||||
|
||||
p {
|
||||
margin: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.navbar {
|
||||
position: fixed;
|
||||
width: 100%;
|
||||
z-index: $zindex-fixed;
|
||||
}
|
||||
|
||||
.navbar-brand {
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.default-index .generator {
|
||||
min-height: 200px;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
.list-group {
|
||||
.active {
|
||||
.icon::after {
|
||||
background-image: $icon-angle-right-active;
|
||||
}
|
||||
}
|
||||
|
||||
.icon {
|
||||
float: right;
|
||||
|
||||
&::after {
|
||||
background: $icon-angle-right no-repeat;
|
||||
background-size: contain;
|
||||
content: "";
|
||||
display: inline-block;
|
||||
height: 1em;
|
||||
line-height: 1;
|
||||
position: relative;
|
||||
top: 2px;
|
||||
width: 1em;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.popover {
|
||||
max-width: 400px;
|
||||
width: 400px;
|
||||
}
|
||||
|
||||
.hint-block {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.error-summary {
|
||||
color: #a94442;
|
||||
background: gray("100");
|
||||
border-left: 3px solid #eed3d7;
|
||||
padding: 10px 20px;
|
||||
margin: 0 0 15px 0;
|
||||
}
|
||||
|
||||
.default-view {
|
||||
.sticky-value {
|
||||
@include text-truncate;
|
||||
|
||||
padding: $input-padding-x $input-padding-y;
|
||||
background: lightyellow;
|
||||
white-space: pre;
|
||||
word-wrap: break-word;
|
||||
}
|
||||
.form-group label.help {
|
||||
border-bottom: 1px dashed gray("600");
|
||||
cursor: help;
|
||||
}
|
||||
.modal-dialog {
|
||||
.modal-header {
|
||||
.btn-group {
|
||||
.icon {
|
||||
&::after {
|
||||
background-repeat: no-repeat;
|
||||
background-size: contain;
|
||||
content: "";
|
||||
display: inline-block;
|
||||
height: 1.2em;
|
||||
line-height: 1;
|
||||
position: relative;
|
||||
top: 2px;
|
||||
width: 1.2em;
|
||||
}
|
||||
}
|
||||
|
||||
.modal-previous {
|
||||
.icon::after {
|
||||
background-image: $icon-long-arrow-left;
|
||||
}
|
||||
|
||||
@include hover {
|
||||
.icon::after {
|
||||
background-image: $icon-long-arrow-left-hover;
|
||||
}
|
||||
}
|
||||
}
|
||||
.modal-next {
|
||||
.icon::after {
|
||||
background-image: $icon-long-arrow-right;
|
||||
}
|
||||
|
||||
@include hover {
|
||||
.icon::after {
|
||||
background-image: $icon-long-arrow-right-hover;
|
||||
}
|
||||
}
|
||||
}
|
||||
.modal-refresh {
|
||||
.icon::after {
|
||||
background-image: $icon-refresh;
|
||||
}
|
||||
|
||||
@include hover {
|
||||
.icon::after {
|
||||
background-image: $icon-refresh-hover;
|
||||
}
|
||||
}
|
||||
}
|
||||
.modal-checkbox {
|
||||
.icon::after, &.checked .icon::after {
|
||||
background-image: $icon-check-square;
|
||||
}
|
||||
&.unchecked .icon::after {
|
||||
background-image: $icon-square;
|
||||
}
|
||||
|
||||
@include hover {
|
||||
.icon::after, &.checked .icon::after {
|
||||
background-image: $icon-check-square-hover;
|
||||
}
|
||||
&.unchecked .icon::after {
|
||||
background-image: $icon-square-hover;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.error {
|
||||
color: theme-color("red");
|
||||
}
|
||||
.content {
|
||||
background: gray("100");
|
||||
border-left: gray("200") 5px solid;
|
||||
padding: 5px 10px;
|
||||
overflow: auto;
|
||||
}
|
||||
code {
|
||||
background: transparent;
|
||||
}
|
||||
.modal-copy-hint {
|
||||
margin-right: 10px;
|
||||
|
||||
kbd {
|
||||
margin: 0 2px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.default-view-files {
|
||||
table {
|
||||
.action {
|
||||
width: 100px;
|
||||
}
|
||||
.check {
|
||||
width: 25px;
|
||||
text-align: center;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.default-view-results {
|
||||
pre {
|
||||
overflow: auto;
|
||||
background-color: gray("800");
|
||||
max-height: 300px;
|
||||
color: $white;
|
||||
padding: 10px;
|
||||
border-radius: 0;
|
||||
white-space: nowrap;
|
||||
|
||||
.error {
|
||||
background: #FFE0E1;
|
||||
color: $black;
|
||||
padding: 1px;
|
||||
}
|
||||
}
|
||||
.alert pre {
|
||||
background: white;
|
||||
}
|
||||
}
|
||||
|
||||
.default-diff {
|
||||
pre {
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
background: transparent;
|
||||
border: none;
|
||||
|
||||
del {
|
||||
background: pink;
|
||||
}
|
||||
ins {
|
||||
background: lightgreen;
|
||||
text-decoration: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.Differences {
|
||||
width: 100%;
|
||||
border-collapse: collapse;
|
||||
border-spacing: 0;
|
||||
empty-cells: show;
|
||||
|
||||
thead {
|
||||
display: none;
|
||||
}
|
||||
tbody th {
|
||||
text-align: right;
|
||||
background: gray("100");
|
||||
padding: 1px 2px;
|
||||
border-right: 1px solid gray("200");
|
||||
vertical-align: top;
|
||||
font-size: 13px;
|
||||
font-family: Monaco, Menlo, Consolas, 'Courier New', monospace;
|
||||
font-weight: normal;
|
||||
color: gray("500");
|
||||
width: 5px;
|
||||
}
|
||||
td {
|
||||
padding: 1px 2px;
|
||||
font-size: 13px;
|
||||
font-family: Monaco, Menlo, Consolas, 'Courier New', monospace;
|
||||
}
|
||||
ins, del {
|
||||
text-decoration: none;
|
||||
}
|
||||
.Skipped {
|
||||
background: gray("100");
|
||||
}
|
||||
}
|
||||
|
||||
.DifferencesSideBySide {
|
||||
.ChangeInsert td {
|
||||
&.Left {
|
||||
background: #dfd;
|
||||
}
|
||||
&.Right {
|
||||
background: #cfc;
|
||||
}
|
||||
}
|
||||
.ChangeDelete td {
|
||||
&.Left {
|
||||
background: #f88;
|
||||
}
|
||||
&.Right {
|
||||
background: #faa;
|
||||
}
|
||||
}
|
||||
.ChangeReplace {
|
||||
td {
|
||||
&.Left {
|
||||
background: #fe9;
|
||||
}
|
||||
&.Right {
|
||||
background: #fd8;
|
||||
}
|
||||
}
|
||||
ins, del {
|
||||
background: #fc0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.DifferencesInline {
|
||||
.ChangeReplace, .ChangeDelete, .ChangeInsert {
|
||||
.Left {
|
||||
background: #fdd;
|
||||
}
|
||||
.Right {
|
||||
background: #dfd;
|
||||
}
|
||||
}
|
||||
|
||||
.ChangeReplace {
|
||||
ins {
|
||||
background: #9e9;
|
||||
}
|
||||
del {
|
||||
background: #e99;
|
||||
}
|
||||
}
|
||||
th[data-line-number]:before {
|
||||
content: attr(data-line-number);
|
||||
}
|
||||
}
|
||||
|
||||
#clipboard-container {
|
||||
position: fixed;
|
||||
left: 0;
|
||||
top: 0;
|
||||
width: 0;
|
||||
height: 0;
|
||||
z-index: 100;
|
||||
/*display: none;*/
|
||||
opacity: 0;
|
||||
}
|
||||
#clipboard {
|
||||
width: 1px;
|
||||
height: 1px;
|
||||
padding: 0;
|
||||
}
|
||||
124
vendor/yiisoft/yii2-gii/src/components/ActiveField.php
vendored
Normal file
124
vendor/yiisoft/yii2-gii/src/components/ActiveField.php
vendored
Normal file
@ -0,0 +1,124 @@
|
||||
<?php
|
||||
/**
|
||||
* @link https://www.yiiframework.com/
|
||||
* @copyright Copyright (c) 2008 Yii Software LLC
|
||||
* @license https://www.yiiframework.com/license/
|
||||
*/
|
||||
|
||||
namespace yii\gii\components;
|
||||
|
||||
use yii\gii\Generator;
|
||||
use yii\helpers\ArrayHelper;
|
||||
use yii\helpers\Html;
|
||||
|
||||
/**
|
||||
* @author Qiang Xue <qiang.xue@gmail.com>
|
||||
* @since 2.0
|
||||
*/
|
||||
class ActiveField extends \yii\widgets\ActiveField
|
||||
{
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public $template = "{label}\n{input}\n{list}\n{error}";
|
||||
/**
|
||||
* @var Generator
|
||||
*/
|
||||
public $model;
|
||||
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function init()
|
||||
{
|
||||
parent::init();
|
||||
$stickyAttributes = $this->model->stickyAttributes();
|
||||
if (in_array($this->attribute, $stickyAttributes, true)) {
|
||||
$this->sticky();
|
||||
}
|
||||
$hints = $this->model->hints();
|
||||
if (isset($hints[$this->attribute])) {
|
||||
$this->hint($hints[$this->attribute]);
|
||||
}
|
||||
$autoCompleteData = $this->model->autoCompleteData();
|
||||
if (isset($autoCompleteData[$this->attribute])) {
|
||||
if (is_callable($autoCompleteData[$this->attribute])) {
|
||||
$this->autoComplete(call_user_func($autoCompleteData[$this->attribute]));
|
||||
} else {
|
||||
$this->autoComplete($autoCompleteData[$this->attribute]);
|
||||
}
|
||||
} else {
|
||||
$this->parts['{list}'] = '';
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Makes field remember its value between page reloads
|
||||
* @return $this the field object itself
|
||||
*/
|
||||
public function sticky()
|
||||
{
|
||||
Html::addCssClass($this->options, 'sticky');
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Makes field auto completable
|
||||
* @param array $data auto complete data (array of callables or scalars)
|
||||
* @return $this the field object itself
|
||||
*/
|
||||
public function autoComplete($data)
|
||||
{
|
||||
$inputID = $this->getInputId();
|
||||
ArrayHelper::setValue($this->inputOptions, 'list', "$inputID-list");
|
||||
|
||||
$html = Html::beginTag('datalist', ['id' => "$inputID-list"]) . "\n";
|
||||
foreach ($data as $item) {
|
||||
$html .= Html::tag('option', $item) . "\n";
|
||||
}
|
||||
$html .= Html::endTag('datalist');
|
||||
|
||||
$this->parts['{list}'] = $html;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function hint($content, $options = [])
|
||||
{
|
||||
Html::addCssClass($this->labelOptions, 'help');
|
||||
ArrayHelper::setValue($this->labelOptions, 'data.toggle', 'popover');
|
||||
ArrayHelper::setValue($this->labelOptions, 'data.content', $content);
|
||||
ArrayHelper::setValue($this->labelOptions, 'data.placement', 'right');
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function checkbox($options = [], $enclosedByLabel = false)
|
||||
{
|
||||
$this->template = "{input}\n{label}\n{error}";
|
||||
Html::addCssClass($this->options, 'form-check');
|
||||
Html::addCssClass($options, 'form-check-input');
|
||||
Html::addCssClass($this->labelOptions, 'form-check-label');
|
||||
return parent::checkbox($options, $enclosedByLabel);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function radio($options = [], $enclosedByLabel = false)
|
||||
{
|
||||
$this->template = "{input}\n{label}\n{error}";
|
||||
Html::addCssClass($this->options, 'form-check');
|
||||
Html::addCssClass($options, 'form-check-input');
|
||||
Html::addCssClass($this->labelOptions, 'form-check-label');
|
||||
return parent::radio($options, $enclosedByLabel);
|
||||
}
|
||||
}
|
||||
136
vendor/yiisoft/yii2-gii/src/components/DiffRendererHtmlInline.php
vendored
Normal file
136
vendor/yiisoft/yii2-gii/src/components/DiffRendererHtmlInline.php
vendored
Normal file
@ -0,0 +1,136 @@
|
||||
<?php
|
||||
/**
|
||||
* @link https://www.yiiframework.com/
|
||||
* @copyright Copyright (c) 2008 Yii Software LLC
|
||||
* @license https://www.yiiframework.com/license/
|
||||
*/
|
||||
|
||||
namespace yii\gii\components;
|
||||
|
||||
/**
|
||||
* Renders diff to HTML. Output adjusted to be copy-paste friendly.
|
||||
*
|
||||
* @author Alexander Makarov <sam@rmcreative.ru>
|
||||
* @since 2.0
|
||||
*/
|
||||
class DiffRendererHtmlInline extends \Diff_Renderer_Html_Array
|
||||
{
|
||||
/**
|
||||
* Render a and return diff with changes between the two sequences
|
||||
* displayed inline (under each other)
|
||||
*
|
||||
* @return string The generated inline diff.
|
||||
*/
|
||||
public function render()
|
||||
{
|
||||
$changes = parent::render();
|
||||
$html = '';
|
||||
if (empty($changes)) {
|
||||
return $html;
|
||||
}
|
||||
|
||||
$html .= <<<HTML
|
||||
<table class="Differences DifferencesInline">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Old</th>
|
||||
<th>New</th>
|
||||
<th>Differences</th>
|
||||
</tr>
|
||||
</thead>
|
||||
HTML;
|
||||
foreach ($changes as $i => $blocks) {
|
||||
// If this is a separate block, we're condensing code so output ...,
|
||||
// indicating a significant portion of the code has been collapsed as
|
||||
// it is the same
|
||||
if ($i > 0) {
|
||||
$html .= <<<HTML
|
||||
<tbody class="Skipped">
|
||||
<th data-line-number="…"></th>
|
||||
<th data-line-number="…"></th>
|
||||
<td> </td>
|
||||
</tbody>
|
||||
HTML;
|
||||
}
|
||||
|
||||
foreach ($blocks as $change) {
|
||||
$tag = ucfirst($change['tag']);
|
||||
$html .= <<<HTML
|
||||
<tbody class="Change{$tag}">
|
||||
HTML;
|
||||
// Equal changes should be shown on both sides of the diff
|
||||
if ($change['tag'] === 'equal') {
|
||||
foreach ($change['base']['lines'] as $no => $line) {
|
||||
$fromLine = $change['base']['offset'] + $no + 1;
|
||||
$toLine = $change['changed']['offset'] + $no + 1;
|
||||
$html .= <<<HTML
|
||||
<tr>
|
||||
<th data-line-number="{$fromLine}"></th>
|
||||
<th data-line-number="{$toLine}"></th>
|
||||
<td class="Left">{$line}</td>
|
||||
</tr>
|
||||
HTML;
|
||||
}
|
||||
}
|
||||
// Added lines only on the right side
|
||||
elseif ($change['tag'] === 'insert') {
|
||||
foreach ($change['changed']['lines'] as $no => $line) {
|
||||
$toLine = $change['changed']['offset'] + $no + 1;
|
||||
$html .= <<<HTML
|
||||
<tr>
|
||||
<th data-line-number=" "></th>
|
||||
<th data-line-number="{$toLine}"></th>
|
||||
<td class="Right"><ins>{$line}</ins> </td>
|
||||
</tr>
|
||||
HTML;
|
||||
}
|
||||
}
|
||||
// Show deleted lines only on the left side
|
||||
elseif ($change['tag'] === 'delete') {
|
||||
foreach ($change['base']['lines'] as $no => $line) {
|
||||
$fromLine = $change['base']['offset'] + $no + 1;
|
||||
$html .= <<<HTML
|
||||
<tr>
|
||||
<th data-line-number="{$fromLine}"></th>
|
||||
<th data-line-number=" "></th>
|
||||
<td class="Left"><del>{$line}</del> </td>
|
||||
</tr>
|
||||
HTML;
|
||||
}
|
||||
}
|
||||
// Show modified lines on both sides
|
||||
elseif ($change['tag'] === 'replace') {
|
||||
foreach ($change['base']['lines'] as $no => $line) {
|
||||
$fromLine = $change['base']['offset'] + $no + 1;
|
||||
$html .= <<<HTML
|
||||
<tr>
|
||||
<th data-line-number="{$fromLine}"></th>
|
||||
<th data-line-number=" "></th>
|
||||
<td class="Left"><span>{$line}</span></td>
|
||||
</tr>
|
||||
HTML;
|
||||
}
|
||||
|
||||
foreach ($change['changed']['lines'] as $no => $line) {
|
||||
$toLine = $change['changed']['offset'] + $no + 1;
|
||||
$html .= <<<HTML
|
||||
<tr>
|
||||
<th data-line-number="{$toLine}"></th>
|
||||
<th data-line-number=" "></th>
|
||||
<td class="Right"><span>{$line}</span></td>
|
||||
</tr>
|
||||
HTML;
|
||||
}
|
||||
}
|
||||
$html .= <<<HTML
|
||||
</tbody>
|
||||
HTML;
|
||||
}
|
||||
}
|
||||
$html .= <<<HTML
|
||||
</table>
|
||||
HTML;
|
||||
|
||||
return $html;
|
||||
}
|
||||
}
|
||||
124
vendor/yiisoft/yii2-gii/src/console/GenerateAction.php
vendored
Normal file
124
vendor/yiisoft/yii2-gii/src/console/GenerateAction.php
vendored
Normal file
@ -0,0 +1,124 @@
|
||||
<?php
|
||||
/**
|
||||
* @link https://www.yiiframework.com/
|
||||
* @copyright Copyright (c) 2008 Yii Software LLC
|
||||
* @license https://www.yiiframework.com/license/
|
||||
*/
|
||||
|
||||
namespace yii\gii\console;
|
||||
|
||||
use yii\helpers\Console;
|
||||
|
||||
/**
|
||||
* @author Qiang Xue <qiang.xue@gmail.com>
|
||||
* @since 2.0
|
||||
*/
|
||||
class GenerateAction extends \yii\base\Action
|
||||
{
|
||||
/**
|
||||
* @var \yii\gii\Generator
|
||||
*/
|
||||
public $generator;
|
||||
/**
|
||||
* @var GenerateController
|
||||
*/
|
||||
public $controller;
|
||||
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function run()
|
||||
{
|
||||
echo "Running '{$this->generator->getName()}'...\n\n";
|
||||
|
||||
if ($this->generator->validate()) {
|
||||
$this->generateCode();
|
||||
} else {
|
||||
$this->displayValidationErrors();
|
||||
return \yii\console\ExitCode::USAGE;
|
||||
}
|
||||
}
|
||||
|
||||
protected function displayValidationErrors()
|
||||
{
|
||||
$this->controller->stdout("Code not generated. Please fix the following errors:\n\n", Console::FG_RED);
|
||||
foreach ($this->generator->errors as $attribute => $errors) {
|
||||
$this->controller->stdout(' - ' . $this->controller->ansiFormat($attribute, Console::FG_CYAN) . ': ' . implode('; ', $errors) . "\n");
|
||||
}
|
||||
$this->controller->stdout("\n");
|
||||
}
|
||||
|
||||
protected function generateCode()
|
||||
{
|
||||
$files = $this->generator->generate();
|
||||
$n = count($files);
|
||||
if ($n === 0) {
|
||||
echo "No code to be generated.\n";
|
||||
return;
|
||||
}
|
||||
echo "The following files will be generated:\n";
|
||||
$skipAll = $this->controller->interactive ? null : !$this->controller->overwrite;
|
||||
$answers = [];
|
||||
foreach ($files as $file) {
|
||||
$path = $file->getRelativePath();
|
||||
if (is_file($file->path)) {
|
||||
$existingFileContents = file_get_contents($file->path);
|
||||
if ($existingFileContents === $file->content) {
|
||||
echo ' ' . $this->controller->ansiFormat('[unchanged]', Console::FG_GREY);
|
||||
echo $this->controller->ansiFormat(" $path\n", Console::FG_CYAN);
|
||||
$answers[$file->id] = false;
|
||||
} else {
|
||||
echo ' ' . $this->controller->ansiFormat('[changed]', Console::FG_RED);
|
||||
echo $this->controller->ansiFormat(" $path\n", Console::FG_CYAN);
|
||||
if ($skipAll !== null) {
|
||||
$answers[$file->id] = !$skipAll;
|
||||
} else {
|
||||
do {
|
||||
$answer = $this->controller->select("Do you want to overwrite this file?", [
|
||||
'y' => 'Overwrite this file.',
|
||||
'n' => 'Skip this file.',
|
||||
'ya' => 'Overwrite this and the rest of the changed files.',
|
||||
'na' => 'Skip this and the rest of the changed files.',
|
||||
'v' => 'View difference',
|
||||
]);
|
||||
|
||||
if ($answer === 'v') {
|
||||
$diff = new \Diff(explode("\n", $existingFileContents), explode("\n", $file->content));
|
||||
echo $diff->render(new \Diff_Renderer_Text_Unified());
|
||||
}
|
||||
} while ($answer === 'v');
|
||||
|
||||
$answers[$file->id] = $answer === 'y' || $answer === 'ya';
|
||||
if ($answer === 'ya') {
|
||||
$skipAll = false;
|
||||
} elseif ($answer === 'na') {
|
||||
$skipAll = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
echo ' ' . $this->controller->ansiFormat('[new]', Console::FG_GREEN);
|
||||
echo $this->controller->ansiFormat(" $path\n", Console::FG_CYAN);
|
||||
$answers[$file->id] = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (!array_sum($answers)) {
|
||||
$this->controller->stdout("\nNo files were chosen to be generated.\n", Console::FG_CYAN);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!$this->controller->confirm("\nReady to generate the selected files?", true)) {
|
||||
$this->controller->stdout("\nNo file was generated.\n", Console::FG_CYAN);
|
||||
return;
|
||||
}
|
||||
|
||||
if ($this->generator->save($files, (array) $answers, $results)) {
|
||||
$this->controller->stdout("\nFiles were generated successfully!\n", Console::FG_GREEN);
|
||||
} else {
|
||||
$this->controller->stdout("\nSome errors occurred while generating the files.", Console::FG_RED);
|
||||
}
|
||||
echo preg_replace('%<span class="error">(.*?)</span>%', '\1', $results) . "\n";
|
||||
}
|
||||
}
|
||||
213
vendor/yiisoft/yii2-gii/src/console/GenerateController.php
vendored
Normal file
213
vendor/yiisoft/yii2-gii/src/console/GenerateController.php
vendored
Normal file
@ -0,0 +1,213 @@
|
||||
<?php
|
||||
/**
|
||||
* @link https://www.yiiframework.com/
|
||||
* @copyright Copyright (c) 2008 Yii Software LLC
|
||||
* @license https://www.yiiframework.com/license/
|
||||
*/
|
||||
|
||||
namespace yii\gii\console;
|
||||
|
||||
use Yii;
|
||||
use yii\base\InlineAction;
|
||||
use yii\console\Controller;
|
||||
use yii\di\Instance;
|
||||
use yii\gii\Generator;
|
||||
|
||||
/**
|
||||
* This is the command line version of Gii - a code generator.
|
||||
*
|
||||
* You can use this command to generate models, controllers, etc. For example,
|
||||
* to generate an ActiveRecord model based on a DB table, you can run:
|
||||
*
|
||||
* ```
|
||||
* $ ./yii gii/model --tableName=city --modelClass=City
|
||||
* ```
|
||||
*
|
||||
* @author Tobias Munk <schmunk@usrbin.de>
|
||||
* @author Qiang Xue <qiang.xue@gmail.com>
|
||||
* @since 2.0
|
||||
*/
|
||||
class GenerateController extends Controller
|
||||
{
|
||||
/**
|
||||
* @var \yii\gii\Module
|
||||
*/
|
||||
public $module;
|
||||
/**
|
||||
* @var bool whether to overwrite all existing code files when in non-interactive mode.
|
||||
* Defaults to false, meaning none of the existing code files will be overwritten.
|
||||
* This option is used only when `--interactive=0`.
|
||||
*/
|
||||
public $overwrite = false;
|
||||
/**
|
||||
* @var array a list of the available code generators
|
||||
*/
|
||||
public $generators = [];
|
||||
|
||||
/**
|
||||
* @var array generator option values
|
||||
*/
|
||||
private $_options = [];
|
||||
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function __get($name)
|
||||
{
|
||||
return isset($this->_options[$name]) ? $this->_options[$name] : null;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function __set($name, $value)
|
||||
{
|
||||
$this->_options[$name] = $value;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function init()
|
||||
{
|
||||
parent::init();
|
||||
foreach ($this->generators as $id => $config) {
|
||||
$this->generators[$id] = Instance::ensure(
|
||||
$config,
|
||||
Generator::className()
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function createAction($id)
|
||||
{
|
||||
/** @var $action GenerateAction */
|
||||
$action = parent::createAction($id);
|
||||
foreach ($this->_options as $name => $value) {
|
||||
$action->generator->$name = $value;
|
||||
}
|
||||
return $action;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function actions()
|
||||
{
|
||||
$actions = [];
|
||||
foreach ($this->generators as $name => $generator) {
|
||||
$actions[$name] = [
|
||||
'class' => 'yii\gii\console\GenerateAction',
|
||||
'generator' => $generator,
|
||||
];
|
||||
}
|
||||
return $actions;
|
||||
}
|
||||
|
||||
public function actionIndex()
|
||||
{
|
||||
$this->run('/help', ['gii']);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getUniqueID()
|
||||
{
|
||||
return $this->id;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function options($id)
|
||||
{
|
||||
$options = parent::options($id);
|
||||
$options[] = 'overwrite';
|
||||
|
||||
if (!isset($this->generators[$id])) {
|
||||
return $options;
|
||||
}
|
||||
|
||||
$attributes = $this->generators[$id]->attributes;
|
||||
unset($attributes['templates']);
|
||||
return array_merge(
|
||||
$options,
|
||||
array_keys($attributes)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getActionHelpSummary($action)
|
||||
{
|
||||
if ($action instanceof InlineAction) {
|
||||
return parent::getActionHelpSummary($action);
|
||||
}
|
||||
|
||||
/** @var $action GenerateAction */
|
||||
return $action->generator->getName();
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getActionHelp($action)
|
||||
{
|
||||
if ($action instanceof InlineAction) {
|
||||
return parent::getActionHelp($action);
|
||||
}
|
||||
|
||||
/** @var $action GenerateAction */
|
||||
$description = $action->generator->getDescription();
|
||||
|
||||
return wordwrap(preg_replace('/\s+/', ' ', $description));
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getActionArgsHelp($action)
|
||||
{
|
||||
return [];
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getActionOptionsHelp($action)
|
||||
{
|
||||
if ($action instanceof InlineAction) {
|
||||
return parent::getActionOptionsHelp($action);
|
||||
}
|
||||
/** @var $action GenerateAction */
|
||||
$attributes = $action->generator->attributes;
|
||||
unset($attributes['templates']);
|
||||
$hints = $action->generator->hints();
|
||||
|
||||
$options = parent::getActionOptionsHelp($action);
|
||||
foreach ($attributes as $name => $value) {
|
||||
$type = gettype($value);
|
||||
$options[$name] = [
|
||||
'type' => $type === 'NULL' ? 'string' : $type,
|
||||
'required' => $value === null && $action->generator->isAttributeRequired($name),
|
||||
'default' => $value,
|
||||
'comment' => isset($hints[$name]) ? $this->formatHint($hints[$name]) : '',
|
||||
];
|
||||
}
|
||||
|
||||
return $options;
|
||||
}
|
||||
|
||||
protected function formatHint($hint)
|
||||
{
|
||||
$hint = preg_replace('%<code>(.*?)</code>%', '\1', $hint);
|
||||
$hint = preg_replace('/\s+/', ' ', $hint);
|
||||
return wordwrap($hint);
|
||||
}
|
||||
}
|
||||
143
vendor/yiisoft/yii2-gii/src/controllers/DefaultController.php
vendored
Normal file
143
vendor/yiisoft/yii2-gii/src/controllers/DefaultController.php
vendored
Normal file
@ -0,0 +1,143 @@
|
||||
<?php
|
||||
/**
|
||||
* @link https://www.yiiframework.com/
|
||||
* @copyright Copyright (c) 2008 Yii Software LLC
|
||||
* @license https://www.yiiframework.com/license/
|
||||
*/
|
||||
|
||||
namespace yii\gii\controllers;
|
||||
|
||||
use Yii;
|
||||
use yii\web\Controller;
|
||||
use yii\web\NotFoundHttpException;
|
||||
use yii\web\Response;
|
||||
|
||||
/**
|
||||
* @author Qiang Xue <qiang.xue@gmail.com>
|
||||
* @since 2.0
|
||||
*/
|
||||
class DefaultController extends Controller
|
||||
{
|
||||
public $layout = 'generator';
|
||||
/**
|
||||
* @var \yii\gii\Module
|
||||
*/
|
||||
public $module;
|
||||
/**
|
||||
* @var \yii\gii\Generator
|
||||
*/
|
||||
public $generator;
|
||||
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function beforeAction($action)
|
||||
{
|
||||
Yii::$app->response->format = Response::FORMAT_HTML;
|
||||
return parent::beforeAction($action);
|
||||
}
|
||||
|
||||
|
||||
public function actionIndex()
|
||||
{
|
||||
$this->layout = 'main';
|
||||
|
||||
return $this->render('index');
|
||||
}
|
||||
|
||||
public function actionView($id)
|
||||
{
|
||||
$generator = $this->loadGenerator($id);
|
||||
$params = ['generator' => $generator, 'id' => $id];
|
||||
|
||||
$preview = Yii::$app->request->post('preview');
|
||||
$generate = Yii::$app->request->post('generate');
|
||||
$answers = Yii::$app->request->post('answers');
|
||||
|
||||
if ($preview !== null || $generate !== null) {
|
||||
if ($generator->validate()) {
|
||||
$generator->saveStickyAttributes();
|
||||
$files = $generator->generate();
|
||||
if ($generate !== null && !empty($answers)) {
|
||||
$params['hasError'] = !$generator->save($files, (array) $answers, $results);
|
||||
$params['results'] = $results;
|
||||
} else {
|
||||
$params['files'] = $files;
|
||||
$params['answers'] = $answers;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $this->render('view', $params);
|
||||
}
|
||||
|
||||
public function actionPreview($id, $file)
|
||||
{
|
||||
$generator = $this->loadGenerator($id);
|
||||
if ($generator->validate()) {
|
||||
foreach ($generator->generate() as $f) {
|
||||
if ($f->id === $file) {
|
||||
$content = $f->preview();
|
||||
if ($content !== false) {
|
||||
return '<div class="content">' . $content . '</div>';
|
||||
}
|
||||
return '<div class="error">Preview is not available for this file type.</div>';
|
||||
}
|
||||
}
|
||||
}
|
||||
throw new NotFoundHttpException("Code file not found: $file");
|
||||
}
|
||||
|
||||
public function actionDiff($id, $file)
|
||||
{
|
||||
$generator = $this->loadGenerator($id);
|
||||
if ($generator->validate()) {
|
||||
foreach ($generator->generate() as $f) {
|
||||
if ($f->id === $file) {
|
||||
return $this->renderPartial('diff', [
|
||||
'diff' => $f->diff(),
|
||||
]);
|
||||
}
|
||||
}
|
||||
}
|
||||
throw new NotFoundHttpException("Code file not found: $file");
|
||||
}
|
||||
|
||||
/**
|
||||
* Runs an action defined in the generator.
|
||||
* Given an action named "xyz", the method "actionXyz()" in the generator will be called.
|
||||
* If the method does not exist, a 400 HTTP exception will be thrown.
|
||||
* @param string $id the ID of the generator
|
||||
* @param string $name the action name
|
||||
* @return mixed the result of the action.
|
||||
* @throws NotFoundHttpException if the action method does not exist.
|
||||
*/
|
||||
public function actionAction($id, $name)
|
||||
{
|
||||
$generator = $this->loadGenerator($id);
|
||||
$method = 'action' . $name;
|
||||
if (method_exists($generator, $method)) {
|
||||
return $generator->$method();
|
||||
}
|
||||
throw new NotFoundHttpException("Unknown generator action: $name");
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads the generator with the specified ID.
|
||||
* @param string $id the ID of the generator to be loaded.
|
||||
* @return \yii\gii\Generator the loaded generator
|
||||
* @throws NotFoundHttpException
|
||||
*/
|
||||
protected function loadGenerator($id)
|
||||
{
|
||||
if (isset($this->module->generators[$id])) {
|
||||
$this->generator = $this->module->generators[$id];
|
||||
$this->generator->loadStickyAttributes();
|
||||
$this->generator->load(Yii::$app->request->post());
|
||||
|
||||
return $this->generator;
|
||||
}
|
||||
throw new NotFoundHttpException("Code generator not found: $id");
|
||||
}
|
||||
}
|
||||
255
vendor/yiisoft/yii2-gii/src/generators/controller/Generator.php
vendored
Normal file
255
vendor/yiisoft/yii2-gii/src/generators/controller/Generator.php
vendored
Normal file
@ -0,0 +1,255 @@
|
||||
<?php
|
||||
/**
|
||||
* @link https://www.yiiframework.com/
|
||||
* @copyright Copyright (c) 2008 Yii Software LLC
|
||||
* @license https://www.yiiframework.com/license/
|
||||
*/
|
||||
|
||||
namespace yii\gii\generators\controller;
|
||||
|
||||
use Yii;
|
||||
use yii\gii\CodeFile;
|
||||
use yii\helpers\Html;
|
||||
use yii\helpers\Inflector;
|
||||
use yii\helpers\StringHelper;
|
||||
|
||||
/**
|
||||
* This generator will generate a controller and one or a few action view files.
|
||||
*
|
||||
* @property-read array $actionIDs An array of action IDs entered by the user.
|
||||
* @property-read string $controllerFile The controller class file path.
|
||||
* @property-read string $controllerID The controller ID.
|
||||
* @property-read string $controllerNamespace The namespace of the controller class.
|
||||
* @property-read string $controllerSubPath The controller sub path.
|
||||
*
|
||||
* @author Qiang Xue <qiang.xue@gmail.com>
|
||||
* @since 2.0
|
||||
*/
|
||||
class Generator extends \yii\gii\Generator
|
||||
{
|
||||
/**
|
||||
* @var string the controller class name
|
||||
*/
|
||||
public $controllerClass;
|
||||
/**
|
||||
* @var string the controller's view path
|
||||
*/
|
||||
public $viewPath;
|
||||
/**
|
||||
* @var string the base class of the controller
|
||||
*/
|
||||
public $baseClass = 'yii\web\Controller';
|
||||
/**
|
||||
* @var string list of action IDs separated by commas or spaces
|
||||
*/
|
||||
public $actions = 'index';
|
||||
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getName()
|
||||
{
|
||||
return 'Controller Generator';
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getDescription()
|
||||
{
|
||||
return 'This generator helps you to quickly generate a new controller class with
|
||||
one or several controller actions and their corresponding views.';
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function rules()
|
||||
{
|
||||
return array_merge(parent::rules(), [
|
||||
[['controllerClass', 'actions', 'baseClass'], 'trim'],
|
||||
[['controllerClass', 'baseClass'], 'required'],
|
||||
['controllerClass', 'match', 'pattern' => '/^[\w\\\\]*Controller$/', 'message' => 'Only word characters and backslashes are allowed, and the class name must end with "Controller".'],
|
||||
['controllerClass', 'validateNewClass'],
|
||||
['baseClass', 'match', 'pattern' => '/^[\w\\\\]*$/', 'message' => 'Only word characters and backslashes are allowed.'],
|
||||
['actions', 'match', 'pattern' => '/^[a-z][a-z0-9\\-,\\s]*$/', 'message' => 'Only a-z, 0-9, dashes (-), spaces and commas are allowed.'],
|
||||
['viewPath', 'safe'],
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function attributeLabels()
|
||||
{
|
||||
return [
|
||||
'baseClass' => 'Base Class',
|
||||
'controllerClass' => 'Controller Class',
|
||||
'viewPath' => 'View Path',
|
||||
'actions' => 'Action IDs',
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function requiredTemplates()
|
||||
{
|
||||
return [
|
||||
'controller.php',
|
||||
'view.php',
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function stickyAttributes()
|
||||
{
|
||||
return ['baseClass'];
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function hints()
|
||||
{
|
||||
return [
|
||||
'controllerClass' => 'This is the name of the controller class to be generated. You should
|
||||
provide a fully qualified namespaced class (e.g. <code>app\controllers\PostController</code>),
|
||||
and class name should be in CamelCase ending with the word <code>Controller</code>. Make sure the class
|
||||
is using the same namespace as specified by your application\'s controllerNamespace property.',
|
||||
'actions' => 'Provide one or multiple action IDs to generate empty action method(s) in the controller. Separate multiple action IDs with commas or spaces.
|
||||
Action IDs should be in lower case. For example:
|
||||
<ul>
|
||||
<li><code>index</code> generates <code>actionIndex()</code></li>
|
||||
<li><code>create-order</code> generates <code>actionCreateOrder()</code></li>
|
||||
</ul>',
|
||||
'viewPath' => 'Specify the directory for storing the view scripts for the controller. You may use path alias here, e.g.,
|
||||
<code>/var/www/basic/controllers/views/order</code>, <code>@app/views/order</code>. If not set, it will default
|
||||
to <code>@app/views/ControllerID</code>',
|
||||
'baseClass' => 'This is the class that the new controller class will extend from. Please make sure the class exists and can be autoloaded.',
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function successMessage()
|
||||
{
|
||||
return 'The controller has been generated successfully.' . $this->getLinkToTry();
|
||||
}
|
||||
|
||||
/**
|
||||
* This method returns a link to try controller generated
|
||||
* @see https://github.com/yiisoft/yii2-gii/issues/182
|
||||
* @return string
|
||||
* @since 2.0.6
|
||||
*/
|
||||
private function getLinkToTry()
|
||||
{
|
||||
if (strpos($this->controllerNamespace, Yii::$app->controllerNamespace) !== 0) {
|
||||
return '';
|
||||
}
|
||||
|
||||
$actions = $this->getActionIDs();
|
||||
if (in_array('index', $actions, true)) {
|
||||
$route = $this->getControllerSubPath() . $this->getControllerID() . '/index';
|
||||
} else {
|
||||
$route = $this->getControllerSubPath() . $this->getControllerID() . '/' . reset($actions);
|
||||
}
|
||||
return ' You may ' . Html::a('try it now', Yii::$app->getUrlManager()->createUrl($route), ['target' => '_blank', 'rel' => 'noopener noreferrer']) . '.';
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function generate()
|
||||
{
|
||||
$files = [];
|
||||
|
||||
$files[] = new CodeFile(
|
||||
$this->getControllerFile(),
|
||||
$this->render('controller.php')
|
||||
);
|
||||
|
||||
foreach ($this->getActionIDs() as $action) {
|
||||
$files[] = new CodeFile(
|
||||
$this->getViewFile($action),
|
||||
$this->render('view.php', ['action' => $action])
|
||||
);
|
||||
}
|
||||
|
||||
return $files;
|
||||
}
|
||||
|
||||
/**
|
||||
* Normalizes [[actions]] into an array of action IDs.
|
||||
* @return array an array of action IDs entered by the user
|
||||
*/
|
||||
public function getActionIDs()
|
||||
{
|
||||
$actions = array_unique(preg_split('/[\s,]+/', $this->actions, -1, PREG_SPLIT_NO_EMPTY));
|
||||
sort($actions);
|
||||
|
||||
return $actions;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string the controller class file path
|
||||
*/
|
||||
public function getControllerFile()
|
||||
{
|
||||
return Yii::getAlias('@' . str_replace('\\', '/', ltrim($this->controllerClass, '\\'))) . '.php';
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string the controller ID
|
||||
*/
|
||||
public function getControllerID()
|
||||
{
|
||||
$name = StringHelper::basename($this->controllerClass);
|
||||
return Inflector::camel2id(substr($name, 0, strlen($name) - 10));
|
||||
}
|
||||
|
||||
/**
|
||||
* This method will return sub path for controller if it
|
||||
* is located in subdirectory of application controllers dir
|
||||
* @see https://github.com/yiisoft/yii2-gii/issues/182
|
||||
* @since 2.0.6
|
||||
* @return string the controller sub path
|
||||
*/
|
||||
public function getControllerSubPath()
|
||||
{
|
||||
$subPath = '';
|
||||
$controllerNamespace = $this->getControllerNamespace();
|
||||
if (strpos($controllerNamespace, Yii::$app->controllerNamespace) === 0) {
|
||||
$subPath = substr($controllerNamespace, strlen(Yii::$app->controllerNamespace));
|
||||
$subPath = ($subPath !== '') ? str_replace('\\', '/', substr($subPath, 1)) . '/' : '';
|
||||
}
|
||||
return $subPath;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $action the action ID
|
||||
* @return string the action view file path
|
||||
*/
|
||||
public function getViewFile($action)
|
||||
{
|
||||
if (empty($this->viewPath)) {
|
||||
return Yii::getAlias('@app/views/' . $this->getControllerSubPath() . $this->getControllerID() . "/$action.php");
|
||||
}
|
||||
|
||||
return Yii::getAlias(str_replace('\\', '/', $this->viewPath) . "/$action.php");
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string the namespace of the controller class
|
||||
*/
|
||||
public function getControllerNamespace()
|
||||
{
|
||||
$name = StringHelper::basename($this->controllerClass);
|
||||
return ltrim(substr($this->controllerClass, 0, - (strlen($name) + 1)), '\\');
|
||||
}
|
||||
}
|
||||
26
vendor/yiisoft/yii2-gii/src/generators/controller/default/controller.php
vendored
Normal file
26
vendor/yiisoft/yii2-gii/src/generators/controller/default/controller.php
vendored
Normal file
@ -0,0 +1,26 @@
|
||||
<?php
|
||||
/**
|
||||
* This is the template for generating a controller class file.
|
||||
*/
|
||||
|
||||
use yii\helpers\Inflector;
|
||||
use yii\helpers\StringHelper;
|
||||
|
||||
/** @var yii\web\View $this */
|
||||
/** @var yii\gii\generators\controller\Generator $generator */
|
||||
|
||||
echo "<?php\n";
|
||||
?>
|
||||
|
||||
namespace <?= $generator->getControllerNamespace() ?>;
|
||||
|
||||
class <?= StringHelper::basename($generator->controllerClass) ?> extends <?= '\\' . trim($generator->baseClass, '\\') . "\n" ?>
|
||||
{
|
||||
<?php foreach ($generator->getActionIDs() as $action): ?>
|
||||
public function action<?= Inflector::id2camel($action) ?>()
|
||||
{
|
||||
return $this->render('<?= $action ?>');
|
||||
}
|
||||
|
||||
<?php endforeach; ?>
|
||||
}
|
||||
20
vendor/yiisoft/yii2-gii/src/generators/controller/default/view.php
vendored
Normal file
20
vendor/yiisoft/yii2-gii/src/generators/controller/default/view.php
vendored
Normal file
@ -0,0 +1,20 @@
|
||||
<?php
|
||||
/**
|
||||
* This is the template for generating an action view file.
|
||||
*/
|
||||
|
||||
/** @var yii\web\View $this */
|
||||
/** @var yii\gii\generators\controller\Generator $generator */
|
||||
/** @var string $action the action ID */
|
||||
|
||||
echo "<?php\n";
|
||||
?>
|
||||
/** @var yii\web\View $this */
|
||||
<?= "?>" ?>
|
||||
|
||||
<h1><?= $generator->getControllerSubPath() . $generator->getControllerID() . '/' . $action ?></h1>
|
||||
|
||||
<p>
|
||||
You may change the content of this page by modifying
|
||||
the file <code><?= '<?=' ?> __FILE__; ?></code>.
|
||||
</p>
|
||||
9
vendor/yiisoft/yii2-gii/src/generators/controller/form.php
vendored
Normal file
9
vendor/yiisoft/yii2-gii/src/generators/controller/form.php
vendored
Normal file
@ -0,0 +1,9 @@
|
||||
<?php
|
||||
/** @var yii\web\View $this */
|
||||
/** @var yii\widgets\ActiveForm $form */
|
||||
/** @var yii\gii\generators\controller\Generator $generator */
|
||||
|
||||
echo $form->field($generator, 'controllerClass');
|
||||
echo $form->field($generator, 'actions');
|
||||
echo $form->field($generator, 'viewPath');
|
||||
echo $form->field($generator, 'baseClass');
|
||||
598
vendor/yiisoft/yii2-gii/src/generators/crud/Generator.php
vendored
Normal file
598
vendor/yiisoft/yii2-gii/src/generators/crud/Generator.php
vendored
Normal file
@ -0,0 +1,598 @@
|
||||
<?php
|
||||
/**
|
||||
* @link https://www.yiiframework.com/
|
||||
* @copyright Copyright (c) 2008 Yii Software LLC
|
||||
* @license https://www.yiiframework.com/license/
|
||||
*/
|
||||
|
||||
namespace yii\gii\generators\crud;
|
||||
|
||||
use Yii;
|
||||
use yii\db\ActiveRecord;
|
||||
use yii\db\BaseActiveRecord;
|
||||
use yii\db\Schema;
|
||||
use yii\gii\CodeFile;
|
||||
use yii\helpers\Inflector;
|
||||
use yii\helpers\VarDumper;
|
||||
use yii\web\Controller;
|
||||
|
||||
/**
|
||||
* Generates CRUD controller and views.
|
||||
*
|
||||
* @property-read string[] $columnNames Model column/attribute names.
|
||||
* @property-read string $controllerID The controller ID (without the module ID prefix).
|
||||
* @property-read string $nameAttribute
|
||||
* @property-read string[] $searchAttributes Searchable attributes.
|
||||
* @property-read \yii\db\TableSchema|false $tableSchema
|
||||
* @property-read string $viewPath The controller view path.
|
||||
*
|
||||
* @author Qiang Xue <qiang.xue@gmail.com>
|
||||
* @since 2.0
|
||||
*/
|
||||
class Generator extends \yii\gii\Generator
|
||||
{
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
public $modelClass;
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
public $controllerClass;
|
||||
/**
|
||||
* @var string The controller view path
|
||||
*/
|
||||
public $viewPath;
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
public $baseControllerClass = 'yii\web\Controller';
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
public $indexWidgetType = 'grid';
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
public $searchModelClass = '';
|
||||
/**
|
||||
* @var bool whether to wrap the `GridView` or `ListView` widget with the `yii\widgets\Pjax` widget
|
||||
* @since 2.0.5
|
||||
*/
|
||||
public $enablePjax = false;
|
||||
/**
|
||||
* @var bool whether to use strict inflection for controller IDs (insert a separator between two consecutive uppercase chars)
|
||||
* @since 2.1.0
|
||||
*/
|
||||
public $strictInflector = true;
|
||||
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getName()
|
||||
{
|
||||
return 'CRUD Generator';
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getDescription()
|
||||
{
|
||||
return 'This generator generates a controller and views that implement CRUD (Create, Read, Update, Delete)
|
||||
operations for the specified data model.';
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function rules()
|
||||
{
|
||||
return array_merge(parent::rules(), [
|
||||
[['controllerClass', 'modelClass', 'searchModelClass', 'baseControllerClass'], 'trim', 'chars' => '\ '],
|
||||
[['modelClass', 'controllerClass', 'baseControllerClass', 'indexWidgetType'], 'required'],
|
||||
[['searchModelClass'], 'compare', 'compareAttribute' => 'modelClass', 'operator' => '!==', 'message' => 'Search Model Class must not be equal to Model Class.'],
|
||||
[['modelClass', 'controllerClass', 'baseControllerClass', 'searchModelClass'], 'match', 'pattern' => '/^[\w\\\\]*$/', 'message' => 'Only word characters and backslashes are allowed.'],
|
||||
['modelClass', 'validateClass', 'params' => ['extends' => BaseActiveRecord::className()]],
|
||||
[['baseControllerClass'], 'validateClass', 'params' => ['extends' => Controller::className()]],
|
||||
[['controllerClass'], 'match', 'pattern' => '/Controller$/', 'message' => 'Controller class name must be suffixed with "Controller".'],
|
||||
[['controllerClass'], 'match', 'pattern' => '/(^|\\\\)[A-Z][^\\\\]+Controller$/', 'message' => 'Controller class name must start with an uppercase letter.'],
|
||||
[['controllerClass', 'searchModelClass'], 'validateNewClass'],
|
||||
['indexWidgetType', 'in', 'range' => ['grid', 'list']],
|
||||
['modelClass', 'validateModelClass'],
|
||||
[['enableI18N', 'enablePjax'], 'boolean'],
|
||||
['messageCategory', 'validateMessageCategory', 'skipOnEmpty' => false],
|
||||
['viewPath', 'safe'],
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function attributeLabels()
|
||||
{
|
||||
return array_merge(parent::attributeLabels(), [
|
||||
'modelClass' => 'Model Class',
|
||||
'controllerClass' => 'Controller Class',
|
||||
'viewPath' => 'View Path',
|
||||
'baseControllerClass' => 'Base Controller Class',
|
||||
'indexWidgetType' => 'Widget Used in Index Page',
|
||||
'searchModelClass' => 'Search Model Class',
|
||||
'enablePjax' => 'Enable Pjax',
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function hints()
|
||||
{
|
||||
return array_merge(parent::hints(), [
|
||||
'modelClass' => 'This is the <code>BaseActiveRecord</code> class associated with the table that CRUD will be built upon.
|
||||
You should provide a fully qualified class name, e.g., <code>app\models\Post</code>.',
|
||||
'controllerClass' => 'This is the name of the controller class to be generated. You should
|
||||
provide a fully qualified namespaced class (e.g. <code>app\controllers\PostController</code>),
|
||||
and class name should be in CamelCase with an uppercase first letter. Make sure the class
|
||||
is using the same namespace as specified by your application\'s controllerNamespace property.',
|
||||
'viewPath' => 'Specify the directory for storing the view scripts for the controller. You may use path alias here, e.g.,
|
||||
<code>/var/www/basic/controllers/views/post</code>, <code>@app/views/post</code>. If not set, it will default
|
||||
to <code>@app/views/ControllerID</code>',
|
||||
'baseControllerClass' => 'This is the class that the new CRUD controller class will extend from.
|
||||
You should provide a fully qualified class name, e.g., <code>yii\web\Controller</code>.',
|
||||
'indexWidgetType' => 'This is the widget type to be used in the index page to display list of the models.
|
||||
You may choose either <code>GridView</code> or <code>ListView</code>',
|
||||
'searchModelClass' => 'This is the name of the search model class to be generated. You should provide a fully
|
||||
qualified namespaced class name, e.g., <code>app\models\PostSearch</code>.',
|
||||
'enablePjax' => 'This indicates whether the generator should wrap the <code>GridView</code> or <code>ListView</code>
|
||||
widget on the index page with <code>yii\widgets\Pjax</code> widget. Set this to <code>true</code> if you want to get
|
||||
sorting, filtering and pagination without page refreshing.',
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function requiredTemplates()
|
||||
{
|
||||
return ['controller.php'];
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function stickyAttributes()
|
||||
{
|
||||
return array_merge(parent::stickyAttributes(), ['baseControllerClass', 'indexWidgetType']);
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if model class is valid
|
||||
*/
|
||||
public function validateModelClass()
|
||||
{
|
||||
$class = $this->modelClass;
|
||||
if (!method_exists($class, 'primaryKey') || !$class::primaryKey()) {
|
||||
$this->addError('modelClass', "The table associated with $class must have primary key(s).");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function generate()
|
||||
{
|
||||
$controllerFile = Yii::getAlias('@' . str_replace('\\', '/', ltrim($this->controllerClass, '\\')) . '.php');
|
||||
|
||||
$files = [
|
||||
new CodeFile($controllerFile, $this->render('controller.php')),
|
||||
];
|
||||
|
||||
if (!empty($this->searchModelClass)) {
|
||||
$searchModel = Yii::getAlias('@' . str_replace('\\', '/', ltrim($this->searchModelClass, '\\') . '.php'));
|
||||
$files[] = new CodeFile($searchModel, $this->render('search.php'));
|
||||
}
|
||||
|
||||
$viewPath = $this->getViewPath();
|
||||
$templatePath = $this->getTemplatePath() . '/views';
|
||||
foreach (scandir($templatePath) as $file) {
|
||||
if (empty($this->searchModelClass) && $file === '_search.php') {
|
||||
continue;
|
||||
}
|
||||
if (is_file($templatePath . '/' . $file) && pathinfo($file, PATHINFO_EXTENSION) === 'php') {
|
||||
$files[] = new CodeFile("$viewPath/$file", $this->render("views/$file"));
|
||||
}
|
||||
}
|
||||
|
||||
return $files;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string the controller ID (without the module ID prefix)
|
||||
*/
|
||||
public function getControllerID()
|
||||
{
|
||||
$pos = strrpos($this->controllerClass, '\\');
|
||||
$class = substr($this->controllerClass, $pos + 1, -10);
|
||||
|
||||
return Inflector::camel2id($class, '-', $this->strictInflector);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string the controller view path
|
||||
*/
|
||||
public function getViewPath()
|
||||
{
|
||||
if (empty($this->viewPath)) {
|
||||
return Yii::getAlias('@app/views/' . $this->getControllerID());
|
||||
}
|
||||
|
||||
return Yii::getAlias(str_replace('\\', '/', $this->viewPath));
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getNameAttribute()
|
||||
{
|
||||
foreach ($this->getColumnNames() as $name) {
|
||||
if (!strcasecmp($name, 'name') || !strcasecmp($name, 'title')) {
|
||||
return $name;
|
||||
}
|
||||
}
|
||||
/* @var $class \yii\db\ActiveRecord */
|
||||
$class = $this->modelClass;
|
||||
$pk = $class::primaryKey();
|
||||
|
||||
return $pk[0];
|
||||
}
|
||||
|
||||
/**
|
||||
* Generates code for active field
|
||||
* @param string $attribute
|
||||
* @return string
|
||||
*/
|
||||
public function generateActiveField($attribute)
|
||||
{
|
||||
$tableSchema = $this->getTableSchema();
|
||||
if ($tableSchema === false || !isset($tableSchema->columns[$attribute])) {
|
||||
if (preg_match('/^(password|pass|passwd|passcode)$/i', $attribute)) {
|
||||
return "\$form->field(\$model, '$attribute')->passwordInput()";
|
||||
}
|
||||
|
||||
return "\$form->field(\$model, '$attribute')";
|
||||
}
|
||||
$column = $tableSchema->columns[$attribute];
|
||||
if ($column->phpType === 'boolean') {
|
||||
return "\$form->field(\$model, '$attribute')->checkbox()";
|
||||
}
|
||||
|
||||
if ($column->type === 'text') {
|
||||
return "\$form->field(\$model, '$attribute')->textarea(['rows' => 6])";
|
||||
}
|
||||
|
||||
if (preg_match('/^(password|pass|passwd|passcode)$/i', $column->name)) {
|
||||
$input = 'passwordInput';
|
||||
} else {
|
||||
$input = 'textInput';
|
||||
}
|
||||
|
||||
if (is_array($column->enumValues) && count($column->enumValues) > 0) {
|
||||
$dropDownOptions = [];
|
||||
foreach ($column->enumValues as $enumValue) {
|
||||
$dropDownOptions[$enumValue] = Inflector::humanize($enumValue);
|
||||
}
|
||||
return "\$form->field(\$model, '$attribute')->dropDownList("
|
||||
. preg_replace("/\n\s*/", ' ', VarDumper::export($dropDownOptions)).", ['prompt' => ''])";
|
||||
}
|
||||
|
||||
if ($column->phpType !== 'string' || $column->size === null) {
|
||||
return "\$form->field(\$model, '$attribute')->$input()";
|
||||
}
|
||||
|
||||
return "\$form->field(\$model, '$attribute')->$input(['maxlength' => true])";
|
||||
}
|
||||
|
||||
/**
|
||||
* Generates code for active search field
|
||||
* @param string $attribute
|
||||
* @return string
|
||||
*/
|
||||
public function generateActiveSearchField($attribute)
|
||||
{
|
||||
$tableSchema = $this->getTableSchema();
|
||||
if ($tableSchema === false) {
|
||||
return "\$form->field(\$model, '$attribute')";
|
||||
}
|
||||
|
||||
$column = $tableSchema->columns[$attribute];
|
||||
if ($column->phpType === 'boolean') {
|
||||
return "\$form->field(\$model, '$attribute')->checkbox()";
|
||||
}
|
||||
|
||||
return "\$form->field(\$model, '$attribute')";
|
||||
}
|
||||
|
||||
/**
|
||||
* Generates column format
|
||||
* @param \yii\db\ColumnSchema $column
|
||||
* @return string
|
||||
*/
|
||||
public function generateColumnFormat($column)
|
||||
{
|
||||
if ($column->phpType === 'boolean') {
|
||||
return 'boolean';
|
||||
}
|
||||
|
||||
if ($column->type === 'text') {
|
||||
return 'ntext';
|
||||
}
|
||||
|
||||
if (stripos($column->name, 'time') !== false && $column->phpType === 'integer') {
|
||||
return 'datetime';
|
||||
}
|
||||
|
||||
if (stripos($column->name, 'email') !== false) {
|
||||
return 'email';
|
||||
}
|
||||
|
||||
if (preg_match('/(\b|[_-])url(\b|[_-])/i', $column->name)) {
|
||||
return 'url';
|
||||
}
|
||||
|
||||
return 'text';
|
||||
}
|
||||
|
||||
/**
|
||||
* Generates validation rules for the search model.
|
||||
* @return array the generated validation rules
|
||||
*/
|
||||
public function generateSearchRules()
|
||||
{
|
||||
if (($table = $this->getTableSchema()) === false) {
|
||||
return ["[['" . implode("', '", $this->getColumnNames()) . "'], 'safe']"];
|
||||
}
|
||||
$types = [];
|
||||
foreach ($table->columns as $column) {
|
||||
switch ($column->type) {
|
||||
case Schema::TYPE_TINYINT:
|
||||
case Schema::TYPE_SMALLINT:
|
||||
case Schema::TYPE_INTEGER:
|
||||
case Schema::TYPE_BIGINT:
|
||||
$types['integer'][] = $column->name;
|
||||
break;
|
||||
case Schema::TYPE_BOOLEAN:
|
||||
$types['boolean'][] = $column->name;
|
||||
break;
|
||||
case Schema::TYPE_FLOAT:
|
||||
case Schema::TYPE_DOUBLE:
|
||||
case Schema::TYPE_DECIMAL:
|
||||
case Schema::TYPE_MONEY:
|
||||
$types['number'][] = $column->name;
|
||||
break;
|
||||
case Schema::TYPE_DATE:
|
||||
case Schema::TYPE_TIME:
|
||||
case Schema::TYPE_DATETIME:
|
||||
case Schema::TYPE_TIMESTAMP:
|
||||
default:
|
||||
$types['safe'][] = $column->name;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
$rules = [];
|
||||
foreach ($types as $type => $columns) {
|
||||
$rules[] = "[['" . implode("', '", $columns) . "'], '$type']";
|
||||
}
|
||||
|
||||
return $rules;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string[] searchable attributes
|
||||
*/
|
||||
public function getSearchAttributes()
|
||||
{
|
||||
return $this->getColumnNames();
|
||||
}
|
||||
|
||||
/**
|
||||
* Generates the attribute labels for the search model.
|
||||
* @return string[] the generated attribute labels (name => label)
|
||||
*/
|
||||
public function generateSearchLabels()
|
||||
{
|
||||
$class = $this->modelClass;
|
||||
/* @var $model \yii\db\BaseActiveRecord */
|
||||
$model = new $class();
|
||||
$attributeLabels = $model->attributeLabels();
|
||||
$labels = [];
|
||||
foreach ($this->getColumnNames() as $name) {
|
||||
if (isset($attributeLabels[$name])) {
|
||||
$labels[$name] = $attributeLabels[$name];
|
||||
} else {
|
||||
if (!strcasecmp($name, 'id')) {
|
||||
$labels[$name] = 'ID';
|
||||
} else {
|
||||
$label = Inflector::camel2words($name);
|
||||
if (!empty($label) && substr_compare($label, ' id', -3, 3, true) === 0) {
|
||||
$label = substr($label, 0, -3) . ' ID';
|
||||
}
|
||||
$labels[$name] = $label;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $labels;
|
||||
}
|
||||
|
||||
/**
|
||||
* Generates search conditions
|
||||
* @return array
|
||||
*/
|
||||
public function generateSearchConditions()
|
||||
{
|
||||
$columns = [];
|
||||
if (($table = $this->getTableSchema()) === false) {
|
||||
$class = $this->modelClass;
|
||||
/* @var $model \yii\db\BaseActiveRecord */
|
||||
$model = new $class();
|
||||
foreach ($model->attributes() as $attribute) {
|
||||
$columns[$attribute] = 'unknown';
|
||||
}
|
||||
} else {
|
||||
foreach ($table->columns as $column) {
|
||||
$columns[$column->name] = $column->type;
|
||||
}
|
||||
}
|
||||
|
||||
$likeConditions = [];
|
||||
$hashConditions = [];
|
||||
foreach ($columns as $column => $type) {
|
||||
switch ($type) {
|
||||
case Schema::TYPE_TINYINT:
|
||||
case Schema::TYPE_SMALLINT:
|
||||
case Schema::TYPE_INTEGER:
|
||||
case Schema::TYPE_BIGINT:
|
||||
case Schema::TYPE_BOOLEAN:
|
||||
case Schema::TYPE_FLOAT:
|
||||
case Schema::TYPE_DOUBLE:
|
||||
case Schema::TYPE_DECIMAL:
|
||||
case Schema::TYPE_MONEY:
|
||||
case Schema::TYPE_DATE:
|
||||
case Schema::TYPE_TIME:
|
||||
case Schema::TYPE_DATETIME:
|
||||
case Schema::TYPE_TIMESTAMP:
|
||||
$hashConditions[] = "'{$column}' => \$this->{$column},";
|
||||
break;
|
||||
default:
|
||||
$likeKeyword = $this->getClassDbDriverName() === 'pgsql' ? 'ilike' : 'like';
|
||||
$likeConditions[] = "->andFilterWhere(['{$likeKeyword}', '{$column}', \$this->{$column}])";
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
$conditions = [];
|
||||
if (!empty($hashConditions)) {
|
||||
$conditions[] = "\$query->andFilterWhere([\n"
|
||||
. str_repeat(' ', 12) . implode("\n" . str_repeat(' ', 12), $hashConditions)
|
||||
. "\n" . str_repeat(' ', 8) . "]);\n";
|
||||
}
|
||||
if (!empty($likeConditions)) {
|
||||
$conditions[] = "\$query" . implode("\n" . str_repeat(' ', 12), $likeConditions) . ";\n";
|
||||
}
|
||||
|
||||
return $conditions;
|
||||
}
|
||||
|
||||
/**
|
||||
* Generates URL parameters
|
||||
* @return string
|
||||
*/
|
||||
public function generateUrlParams()
|
||||
{
|
||||
$class = $this->modelClass;
|
||||
$pks = $class::primaryKey();
|
||||
$isMongoModel = is_subclass_of($class, '\yii\mongodb\ActiveRecord');
|
||||
$params = [];
|
||||
foreach ($pks as $pk) {
|
||||
if ($isMongoModel) {
|
||||
$params[] = "'$pk' => (string) \$model->$pk";
|
||||
} else {
|
||||
$params[] = "'$pk' => \$model->$pk";
|
||||
}
|
||||
}
|
||||
|
||||
return implode(', ', $params);
|
||||
}
|
||||
|
||||
/**
|
||||
* Generates action parameters.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function generateActionParams()
|
||||
{
|
||||
$class = $this->modelClass;
|
||||
$pks = $class::primaryKey();
|
||||
return '$' . implode(', $', $pks);
|
||||
}
|
||||
|
||||
/**
|
||||
* Generates parameter tags for PhpDoc.
|
||||
*
|
||||
* @return string[]
|
||||
*/
|
||||
public function generateActionParamComments()
|
||||
{
|
||||
$table = $this->getTableSchema();
|
||||
$class = $this->modelClass;
|
||||
$pks = $class::primaryKey();
|
||||
$model = new $class();
|
||||
$labels = $model->attributeLabels();
|
||||
$aliasTypes = ['boolean' => 'bool', 'integer' => 'int', 'double' => 'float'];
|
||||
|
||||
$comments = [];
|
||||
foreach ($pks as $pk) {
|
||||
if ($table) {
|
||||
$type = $table->columns[$pk]->phpType;
|
||||
if (isset($aliasTypes[$type])) {
|
||||
$type = $aliasTypes[$type];
|
||||
}
|
||||
} else {
|
||||
$type = strtolower(substr($pk, -3)) === '_id' ? 'int' : 'string';
|
||||
}
|
||||
$descr = isset($labels[$pk]) ? ' ' . $labels[$pk] : '';
|
||||
$comments[] = '@param ' . $type . ' $' . $pk . $descr;
|
||||
}
|
||||
|
||||
return $comments;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns table schema for current model class or false if it is not an active record
|
||||
* @return \yii\db\TableSchema|false
|
||||
*/
|
||||
public function getTableSchema()
|
||||
{
|
||||
$class = $this->modelClass;
|
||||
if (is_subclass_of($class, '\yii\db\ActiveRecord')) {
|
||||
return $class::getTableSchema();
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string[] model column/attribute names
|
||||
*/
|
||||
public function getColumnNames()
|
||||
{
|
||||
$schema = $this->getTableSchema();
|
||||
if ($schema) {
|
||||
return $schema->getColumnNames();
|
||||
}
|
||||
|
||||
$class = $this->modelClass;
|
||||
/* @var $model \yii\db\BaseActiveRecord */
|
||||
$model = new $class();
|
||||
|
||||
return $model->attributes();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string|null driver name of modelClass db connection.
|
||||
* In case db is not instance of \yii\db\Connection null will be returned.
|
||||
* @since 2.0.6
|
||||
*/
|
||||
protected function getClassDbDriverName()
|
||||
{
|
||||
if (is_subclass_of($this->modelClass, '\yii\db\ActiveRecord')) {
|
||||
$class = $this->modelClass;
|
||||
$db = $class::getDb();
|
||||
return $db instanceof \yii\db\Connection ? $db->driverName : null;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
194
vendor/yiisoft/yii2-gii/src/generators/crud/default/controller.php
vendored
Normal file
194
vendor/yiisoft/yii2-gii/src/generators/crud/default/controller.php
vendored
Normal file
@ -0,0 +1,194 @@
|
||||
<?php
|
||||
/**
|
||||
* This is the template for generating a CRUD controller class file.
|
||||
*/
|
||||
|
||||
use yii\db\ActiveRecordInterface;
|
||||
use yii\helpers\StringHelper;
|
||||
|
||||
|
||||
/** @var yii\web\View $this */
|
||||
/** @var yii\gii\generators\crud\Generator $generator */
|
||||
|
||||
$controllerClass = StringHelper::basename($generator->controllerClass);
|
||||
$modelClass = StringHelper::basename($generator->modelClass);
|
||||
$searchModelClass = StringHelper::basename($generator->searchModelClass);
|
||||
if ($modelClass === $searchModelClass) {
|
||||
$searchModelAlias = $searchModelClass . 'Search';
|
||||
}
|
||||
|
||||
/* @var $class ActiveRecordInterface */
|
||||
$class = $generator->modelClass;
|
||||
$pks = $class::primaryKey();
|
||||
$urlParams = $generator->generateUrlParams();
|
||||
$actionParams = $generator->generateActionParams();
|
||||
$actionParamComments = $generator->generateActionParamComments();
|
||||
|
||||
echo "<?php\n";
|
||||
?>
|
||||
|
||||
namespace <?= StringHelper::dirname(ltrim($generator->controllerClass, '\\')) ?>;
|
||||
|
||||
use <?= ltrim($generator->modelClass, '\\') ?>;
|
||||
<?php if (!empty($generator->searchModelClass)): ?>
|
||||
use <?= ltrim($generator->searchModelClass, '\\') . (isset($searchModelAlias) ? " as $searchModelAlias" : "") ?>;
|
||||
<?php else: ?>
|
||||
use yii\data\ActiveDataProvider;
|
||||
<?php endif; ?>
|
||||
use <?= ltrim($generator->baseControllerClass, '\\') ?>;
|
||||
use yii\web\NotFoundHttpException;
|
||||
use yii\filters\VerbFilter;
|
||||
|
||||
/**
|
||||
* <?= $controllerClass ?> implements the CRUD actions for <?= $modelClass ?> model.
|
||||
*/
|
||||
class <?= $controllerClass ?> extends <?= StringHelper::basename($generator->baseControllerClass) . "\n" ?>
|
||||
{
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
public function behaviors()
|
||||
{
|
||||
return array_merge(
|
||||
parent::behaviors(),
|
||||
[
|
||||
'verbs' => [
|
||||
'class' => VerbFilter::className(),
|
||||
'actions' => [
|
||||
'delete' => ['POST'],
|
||||
],
|
||||
],
|
||||
]
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Lists all <?= $modelClass ?> models.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function actionIndex()
|
||||
{
|
||||
<?php if (!empty($generator->searchModelClass)): ?>
|
||||
$searchModel = new <?= isset($searchModelAlias) ? $searchModelAlias : $searchModelClass ?>();
|
||||
$dataProvider = $searchModel->search($this->request->queryParams);
|
||||
|
||||
return $this->render('index', [
|
||||
'searchModel' => $searchModel,
|
||||
'dataProvider' => $dataProvider,
|
||||
]);
|
||||
<?php else: ?>
|
||||
$dataProvider = new ActiveDataProvider([
|
||||
'query' => <?= $modelClass ?>::find(),
|
||||
/*
|
||||
'pagination' => [
|
||||
'pageSize' => 50
|
||||
],
|
||||
'sort' => [
|
||||
'defaultOrder' => [
|
||||
<?php foreach ($pks as $pk): ?>
|
||||
<?= "'$pk' => SORT_DESC,\n" ?>
|
||||
<?php endforeach; ?>
|
||||
]
|
||||
],
|
||||
*/
|
||||
]);
|
||||
|
||||
return $this->render('index', [
|
||||
'dataProvider' => $dataProvider,
|
||||
]);
|
||||
<?php endif; ?>
|
||||
}
|
||||
|
||||
/**
|
||||
* Displays a single <?= $modelClass ?> model.
|
||||
* <?= implode("\n * ", $actionParamComments) . "\n" ?>
|
||||
* @return string
|
||||
* @throws NotFoundHttpException if the model cannot be found
|
||||
*/
|
||||
public function actionView(<?= $actionParams ?>)
|
||||
{
|
||||
return $this->render('view', [
|
||||
'model' => $this->findModel(<?= $actionParams ?>),
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new <?= $modelClass ?> model.
|
||||
* If creation is successful, the browser will be redirected to the 'view' page.
|
||||
* @return string|\yii\web\Response
|
||||
*/
|
||||
public function actionCreate()
|
||||
{
|
||||
$model = new <?= $modelClass ?>();
|
||||
|
||||
if ($this->request->isPost) {
|
||||
if ($model->load($this->request->post()) && $model->save()) {
|
||||
return $this->redirect(['view', <?= $urlParams ?>]);
|
||||
}
|
||||
} else {
|
||||
$model->loadDefaultValues();
|
||||
}
|
||||
|
||||
return $this->render('create', [
|
||||
'model' => $model,
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates an existing <?= $modelClass ?> model.
|
||||
* If update is successful, the browser will be redirected to the 'view' page.
|
||||
* <?= implode("\n * ", $actionParamComments) . "\n" ?>
|
||||
* @return string|\yii\web\Response
|
||||
* @throws NotFoundHttpException if the model cannot be found
|
||||
*/
|
||||
public function actionUpdate(<?= $actionParams ?>)
|
||||
{
|
||||
$model = $this->findModel(<?= $actionParams ?>);
|
||||
|
||||
if ($this->request->isPost && $model->load($this->request->post()) && $model->save()) {
|
||||
return $this->redirect(['view', <?= $urlParams ?>]);
|
||||
}
|
||||
|
||||
return $this->render('update', [
|
||||
'model' => $model,
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Deletes an existing <?= $modelClass ?> model.
|
||||
* If deletion is successful, the browser will be redirected to the 'index' page.
|
||||
* <?= implode("\n * ", $actionParamComments) . "\n" ?>
|
||||
* @return \yii\web\Response
|
||||
* @throws NotFoundHttpException if the model cannot be found
|
||||
*/
|
||||
public function actionDelete(<?= $actionParams ?>)
|
||||
{
|
||||
$this->findModel(<?= $actionParams ?>)->delete();
|
||||
|
||||
return $this->redirect(['index']);
|
||||
}
|
||||
|
||||
/**
|
||||
* Finds the <?= $modelClass ?> model based on its primary key value.
|
||||
* If the model is not found, a 404 HTTP exception will be thrown.
|
||||
* <?= implode("\n * ", $actionParamComments) . "\n" ?>
|
||||
* @return <?= $modelClass ?> the loaded model
|
||||
* @throws NotFoundHttpException if the model cannot be found
|
||||
*/
|
||||
protected function findModel(<?= $actionParams ?>)
|
||||
{
|
||||
<?php
|
||||
$condition = [];
|
||||
foreach ($pks as $pk) {
|
||||
$condition[] = "'$pk' => \$$pk";
|
||||
}
|
||||
$condition = '[' . implode(', ', $condition) . ']';
|
||||
?>
|
||||
if (($model = <?= $modelClass ?>::findOne(<?= $condition ?>)) !== null) {
|
||||
return $model;
|
||||
}
|
||||
|
||||
throw new NotFoundHttpException(<?= $generator->generateString('The requested page does not exist.') ?>);
|
||||
}
|
||||
}
|
||||
87
vendor/yiisoft/yii2-gii/src/generators/crud/default/search.php
vendored
Normal file
87
vendor/yiisoft/yii2-gii/src/generators/crud/default/search.php
vendored
Normal file
@ -0,0 +1,87 @@
|
||||
<?php
|
||||
/**
|
||||
* This is the template for generating CRUD search class of the specified model.
|
||||
*/
|
||||
|
||||
use yii\helpers\StringHelper;
|
||||
|
||||
|
||||
/** @var yii\web\View $this */
|
||||
/** @var yii\gii\generators\crud\Generator $generator */
|
||||
|
||||
$modelClass = StringHelper::basename($generator->modelClass);
|
||||
$searchModelClass = StringHelper::basename($generator->searchModelClass);
|
||||
if ($modelClass === $searchModelClass) {
|
||||
$modelAlias = $modelClass . 'Model';
|
||||
}
|
||||
$rules = $generator->generateSearchRules();
|
||||
$labels = $generator->generateSearchLabels();
|
||||
$searchAttributes = $generator->getSearchAttributes();
|
||||
$searchConditions = $generator->generateSearchConditions();
|
||||
|
||||
echo "<?php\n";
|
||||
?>
|
||||
|
||||
namespace <?= StringHelper::dirname(ltrim($generator->searchModelClass, '\\')) ?>;
|
||||
|
||||
use yii\base\Model;
|
||||
use yii\data\ActiveDataProvider;
|
||||
use <?= ltrim($generator->modelClass, '\\') . (isset($modelAlias) ? " as $modelAlias" : "") ?>;
|
||||
|
||||
/**
|
||||
* <?= $searchModelClass ?> represents the model behind the search form of `<?= $generator->modelClass ?>`.
|
||||
*/
|
||||
class <?= $searchModelClass ?> extends <?= isset($modelAlias) ? $modelAlias : $modelClass ?>
|
||||
|
||||
{
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function rules()
|
||||
{
|
||||
return [
|
||||
<?= implode(",\n ", $rules) ?>,
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function scenarios()
|
||||
{
|
||||
// bypass scenarios() implementation in the parent class
|
||||
return Model::scenarios();
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates data provider instance with search query applied
|
||||
*
|
||||
* @param array $params
|
||||
* @param string|null $formName Form name to be used into `->load()` method.
|
||||
*
|
||||
* @return ActiveDataProvider
|
||||
*/
|
||||
public function search($params, $formName = null)
|
||||
{
|
||||
$query = <?= isset($modelAlias) ? $modelAlias : $modelClass ?>::find();
|
||||
|
||||
// add conditions that should always apply here
|
||||
|
||||
$dataProvider = new ActiveDataProvider([
|
||||
'query' => $query,
|
||||
]);
|
||||
|
||||
$this->load($params, $formName);
|
||||
|
||||
if (!$this->validate()) {
|
||||
// uncomment the following line if you do not want to return any records when validation fails
|
||||
// $query->where('0=1');
|
||||
return $dataProvider;
|
||||
}
|
||||
|
||||
// grid filtering conditions
|
||||
<?= implode("\n ", $searchConditions) ?>
|
||||
|
||||
return $dataProvider;
|
||||
}
|
||||
}
|
||||
42
vendor/yiisoft/yii2-gii/src/generators/crud/default/views/_form.php
vendored
Normal file
42
vendor/yiisoft/yii2-gii/src/generators/crud/default/views/_form.php
vendored
Normal file
@ -0,0 +1,42 @@
|
||||
<?php
|
||||
|
||||
use yii\helpers\Inflector;
|
||||
use yii\helpers\StringHelper;
|
||||
|
||||
/** @var yii\web\View $this */
|
||||
/** @var yii\gii\generators\crud\Generator $generator */
|
||||
|
||||
/* @var $model \yii\db\ActiveRecord */
|
||||
$model = new $generator->modelClass();
|
||||
$safeAttributes = $model->safeAttributes();
|
||||
if (empty($safeAttributes)) {
|
||||
$safeAttributes = $model->attributes();
|
||||
}
|
||||
|
||||
echo "<?php\n";
|
||||
?>
|
||||
|
||||
use yii\helpers\Html;
|
||||
use yii\widgets\ActiveForm;
|
||||
|
||||
/** @var yii\web\View $this */
|
||||
/** @var <?= ltrim($generator->modelClass, '\\') ?> $model */
|
||||
/** @var yii\widgets\ActiveForm $form */
|
||||
?>
|
||||
|
||||
<div class="<?= Inflector::camel2id(StringHelper::basename($generator->modelClass)) ?>-form">
|
||||
|
||||
<?= "<?php " ?>$form = ActiveForm::begin(); ?>
|
||||
|
||||
<?php foreach ($generator->getColumnNames() as $attribute) {
|
||||
if (in_array($attribute, $safeAttributes)) {
|
||||
echo " <?= " . $generator->generateActiveField($attribute) . " ?>\n\n";
|
||||
}
|
||||
} ?>
|
||||
<div class="form-group">
|
||||
<?= "<?= " ?>Html::submitButton(<?= $generator->generateString('Save') ?>, ['class' => 'btn btn-success']) ?>
|
||||
</div>
|
||||
|
||||
<?= "<?php " ?>ActiveForm::end(); ?>
|
||||
|
||||
</div>
|
||||
49
vendor/yiisoft/yii2-gii/src/generators/crud/default/views/_search.php
vendored
Normal file
49
vendor/yiisoft/yii2-gii/src/generators/crud/default/views/_search.php
vendored
Normal file
@ -0,0 +1,49 @@
|
||||
<?php
|
||||
|
||||
use yii\helpers\Inflector;
|
||||
use yii\helpers\StringHelper;
|
||||
|
||||
/** @var yii\web\View $this */
|
||||
/** @var yii\gii\generators\crud\Generator $generator */
|
||||
|
||||
echo "<?php\n";
|
||||
?>
|
||||
|
||||
use yii\helpers\Html;
|
||||
use yii\widgets\ActiveForm;
|
||||
|
||||
/** @var yii\web\View $this */
|
||||
/** @var <?= ltrim($generator->searchModelClass, '\\') ?> $model */
|
||||
/** @var yii\widgets\ActiveForm $form */
|
||||
?>
|
||||
|
||||
<div class="<?= Inflector::camel2id(StringHelper::basename($generator->modelClass)) ?>-search">
|
||||
|
||||
<?= "<?php " ?>$form = ActiveForm::begin([
|
||||
'action' => ['index'],
|
||||
'method' => 'get',
|
||||
<?php if ($generator->enablePjax): ?>
|
||||
'options' => [
|
||||
'data-pjax' => 1
|
||||
],
|
||||
<?php endif; ?>
|
||||
]); ?>
|
||||
|
||||
<?php
|
||||
$count = 0;
|
||||
foreach ($generator->getColumnNames() as $attribute) {
|
||||
if (++$count < 6) {
|
||||
echo " <?= " . $generator->generateActiveSearchField($attribute) . " ?>\n\n";
|
||||
} else {
|
||||
echo " <?php // echo " . $generator->generateActiveSearchField($attribute) . " ?>\n\n";
|
||||
}
|
||||
}
|
||||
?>
|
||||
<div class="form-group">
|
||||
<?= "<?= " ?>Html::submitButton(<?= $generator->generateString('Search') ?>, ['class' => 'btn btn-primary']) ?>
|
||||
<?= "<?= " ?>Html::resetButton(<?= $generator->generateString('Reset') ?>, ['class' => 'btn btn-outline-secondary']) ?>
|
||||
</div>
|
||||
|
||||
<?= "<?php " ?>ActiveForm::end(); ?>
|
||||
|
||||
</div>
|
||||
29
vendor/yiisoft/yii2-gii/src/generators/crud/default/views/create.php
vendored
Normal file
29
vendor/yiisoft/yii2-gii/src/generators/crud/default/views/create.php
vendored
Normal file
@ -0,0 +1,29 @@
|
||||
<?php
|
||||
|
||||
use yii\helpers\Inflector;
|
||||
use yii\helpers\StringHelper;
|
||||
|
||||
/** @var yii\web\View $this */
|
||||
/** @var yii\gii\generators\crud\Generator $generator */
|
||||
|
||||
echo "<?php\n";
|
||||
?>
|
||||
|
||||
use yii\helpers\Html;
|
||||
|
||||
/** @var yii\web\View $this */
|
||||
/** @var <?= ltrim($generator->modelClass, '\\') ?> $model */
|
||||
|
||||
$this->title = <?= $generator->generateString('Create ' . Inflector::camel2words(StringHelper::basename($generator->modelClass))) ?>;
|
||||
$this->params['breadcrumbs'][] = ['label' => <?= $generator->generateString(Inflector::pluralize(Inflector::camel2words(StringHelper::basename($generator->modelClass)))) ?>, 'url' => ['index']];
|
||||
$this->params['breadcrumbs'][] = $this->title;
|
||||
?>
|
||||
<div class="<?= Inflector::camel2id(StringHelper::basename($generator->modelClass)) ?>-create">
|
||||
|
||||
<h1><?= "<?= " ?>Html::encode($this->title) ?></h1>
|
||||
|
||||
<?= "<?= " ?>$this->render('_form', [
|
||||
'model' => $model,
|
||||
]) ?>
|
||||
|
||||
</div>
|
||||
88
vendor/yiisoft/yii2-gii/src/generators/crud/default/views/index.php
vendored
Normal file
88
vendor/yiisoft/yii2-gii/src/generators/crud/default/views/index.php
vendored
Normal file
@ -0,0 +1,88 @@
|
||||
<?php
|
||||
|
||||
use yii\helpers\Inflector;
|
||||
use yii\helpers\StringHelper;
|
||||
|
||||
/** @var yii\web\View $this */
|
||||
/** @var yii\gii\generators\crud\Generator $generator */
|
||||
|
||||
$modelClass = StringHelper::basename($generator->modelClass);
|
||||
|
||||
echo "<?php\n";
|
||||
?>
|
||||
|
||||
use <?= $generator->modelClass ?>;
|
||||
use yii\helpers\Html;
|
||||
use yii\helpers\Url;
|
||||
use yii\grid\ActionColumn;
|
||||
use <?= $generator->indexWidgetType === 'grid' ? "yii\\grid\\GridView" : "yii\\widgets\\ListView" ?>;
|
||||
<?= $generator->enablePjax ? 'use yii\widgets\Pjax;' : '' ?>
|
||||
|
||||
/** @var yii\web\View $this */
|
||||
<?= !empty($generator->searchModelClass) ? "/** @var " . ltrim($generator->searchModelClass, '\\') . " \$searchModel */\n" : '' ?>
|
||||
/** @var yii\data\ActiveDataProvider $dataProvider */
|
||||
|
||||
$this->title = <?= $generator->generateString(Inflector::pluralize(Inflector::camel2words(StringHelper::basename($generator->modelClass)))) ?>;
|
||||
$this->params['breadcrumbs'][] = $this->title;
|
||||
?>
|
||||
<div class="<?= Inflector::camel2id(StringHelper::basename($generator->modelClass)) ?>-index">
|
||||
|
||||
<h1><?= "<?= " ?>Html::encode($this->title) ?></h1>
|
||||
|
||||
<p>
|
||||
<?= "<?= " ?>Html::a(<?= $generator->generateString('Create ' . Inflector::camel2words(StringHelper::basename($generator->modelClass))) ?>, ['create'], ['class' => 'btn btn-success']) ?>
|
||||
</p>
|
||||
|
||||
<?= $generator->enablePjax ? " <?php Pjax::begin(); ?>\n" : '' ?>
|
||||
<?php if(!empty($generator->searchModelClass)): ?>
|
||||
<?= " <?php " . ($generator->indexWidgetType === 'grid' ? "// " : "") ?>echo $this->render('_search', ['model' => $searchModel]); ?>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if ($generator->indexWidgetType === 'grid'): ?>
|
||||
<?= "<?= " ?>GridView::widget([
|
||||
'dataProvider' => $dataProvider,
|
||||
<?= !empty($generator->searchModelClass) ? "'filterModel' => \$searchModel,\n 'columns' => [\n" : "'columns' => [\n"; ?>
|
||||
['class' => 'yii\grid\SerialColumn'],
|
||||
|
||||
<?php
|
||||
$count = 0;
|
||||
if (($tableSchema = $generator->getTableSchema()) === false) {
|
||||
foreach ($generator->getColumnNames() as $name) {
|
||||
if (++$count < 6) {
|
||||
echo " '" . $name . "',\n";
|
||||
} else {
|
||||
echo " //'" . $name . "',\n";
|
||||
}
|
||||
}
|
||||
} else {
|
||||
foreach ($tableSchema->columns as $column) {
|
||||
$format = $generator->generateColumnFormat($column);
|
||||
if (++$count < 6) {
|
||||
echo " '" . $column->name . ($format === 'text' ? "" : ":" . $format) . "',\n";
|
||||
} else {
|
||||
echo " //'" . $column->name . ($format === 'text' ? "" : ":" . $format) . "',\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
?>
|
||||
[
|
||||
'class' => ActionColumn::className(),
|
||||
'urlCreator' => function ($action, <?= $modelClass ?> $model, $key, $index, $column) {
|
||||
return Url::toRoute([$action, <?= $generator->generateUrlParams() ?>]);
|
||||
}
|
||||
],
|
||||
],
|
||||
]); ?>
|
||||
<?php else: ?>
|
||||
<?= "<?= " ?>ListView::widget([
|
||||
'dataProvider' => $dataProvider,
|
||||
'itemOptions' => ['class' => 'item'],
|
||||
'itemView' => function ($model, $key, $index, $widget) {
|
||||
return Html::a(Html::encode($model-><?= $generator->getNameAttribute() ?>), ['view', <?= $generator->generateUrlParams() ?>]);
|
||||
},
|
||||
]) ?>
|
||||
<?php endif; ?>
|
||||
|
||||
<?= $generator->enablePjax ? " <?php Pjax::end(); ?>\n" : '' ?>
|
||||
|
||||
</div>
|
||||
40
vendor/yiisoft/yii2-gii/src/generators/crud/default/views/update.php
vendored
Normal file
40
vendor/yiisoft/yii2-gii/src/generators/crud/default/views/update.php
vendored
Normal file
@ -0,0 +1,40 @@
|
||||
<?php
|
||||
|
||||
use yii\helpers\Inflector;
|
||||
use yii\helpers\StringHelper;
|
||||
|
||||
/** @var yii\web\View $this */
|
||||
/** @var yii\gii\generators\crud\Generator $generator */
|
||||
|
||||
$urlParams = $generator->generateUrlParams();
|
||||
$modelClassName = Inflector::camel2words(StringHelper::basename($generator->modelClass));
|
||||
$nameAttributeTemplate = '$model->' . $generator->getNameAttribute();
|
||||
$titleTemplate = $generator->generateString('Update ' . $modelClassName . ': {name}', ['name' => '{nameAttribute}']);
|
||||
if ($generator->enableI18N) {
|
||||
$title = strtr($titleTemplate, ['\'{nameAttribute}\'' => $nameAttributeTemplate]);
|
||||
} else {
|
||||
$title = strtr($titleTemplate, ['{nameAttribute}\'' => '\' . ' . $nameAttributeTemplate]);
|
||||
}
|
||||
|
||||
echo "<?php\n";
|
||||
?>
|
||||
|
||||
use yii\helpers\Html;
|
||||
|
||||
/** @var yii\web\View $this */
|
||||
/** @var <?= ltrim($generator->modelClass, '\\') ?> $model */
|
||||
|
||||
$this->title = <?= $title ?>;
|
||||
$this->params['breadcrumbs'][] = ['label' => <?= $generator->generateString(Inflector::pluralize(Inflector::camel2words(StringHelper::basename($generator->modelClass)))) ?>, 'url' => ['index']];
|
||||
$this->params['breadcrumbs'][] = ['label' => $model-><?= $generator->getNameAttribute() ?>, 'url' => ['view', <?= $urlParams ?>]];
|
||||
$this->params['breadcrumbs'][] = <?= $generator->generateString('Update') ?>;
|
||||
?>
|
||||
<div class="<?= Inflector::camel2id(StringHelper::basename($generator->modelClass)) ?>-update">
|
||||
|
||||
<h1><?= '<?= ' ?>Html::encode($this->title) ?></h1>
|
||||
|
||||
<?= '<?= ' ?>$this->render('_form', [
|
||||
'model' => $model,
|
||||
]) ?>
|
||||
|
||||
</div>
|
||||
58
vendor/yiisoft/yii2-gii/src/generators/crud/default/views/view.php
vendored
Normal file
58
vendor/yiisoft/yii2-gii/src/generators/crud/default/views/view.php
vendored
Normal file
@ -0,0 +1,58 @@
|
||||
<?php
|
||||
|
||||
use yii\helpers\Inflector;
|
||||
use yii\helpers\StringHelper;
|
||||
|
||||
/** @var yii\web\View $this */
|
||||
/** @var yii\gii\generators\crud\Generator $generator */
|
||||
|
||||
$urlParams = $generator->generateUrlParams();
|
||||
|
||||
echo "<?php\n";
|
||||
?>
|
||||
|
||||
use yii\helpers\Html;
|
||||
use yii\widgets\DetailView;
|
||||
|
||||
/** @var yii\web\View $this */
|
||||
/** @var <?= ltrim($generator->modelClass, '\\') ?> $model */
|
||||
|
||||
$this->title = $model-><?= $generator->getNameAttribute() ?>;
|
||||
$this->params['breadcrumbs'][] = ['label' => <?= $generator->generateString(Inflector::pluralize(Inflector::camel2words(StringHelper::basename($generator->modelClass)))) ?>, 'url' => ['index']];
|
||||
$this->params['breadcrumbs'][] = $this->title;
|
||||
\yii\web\YiiAsset::register($this);
|
||||
?>
|
||||
<div class="<?= Inflector::camel2id(StringHelper::basename($generator->modelClass)) ?>-view">
|
||||
|
||||
<h1><?= "<?= " ?>Html::encode($this->title) ?></h1>
|
||||
|
||||
<p>
|
||||
<?= "<?= " ?>Html::a(<?= $generator->generateString('Update') ?>, ['update', <?= $urlParams ?>], ['class' => 'btn btn-primary']) ?>
|
||||
<?= "<?= " ?>Html::a(<?= $generator->generateString('Delete') ?>, ['delete', <?= $urlParams ?>], [
|
||||
'class' => 'btn btn-danger',
|
||||
'data' => [
|
||||
'confirm' => <?= $generator->generateString('Are you sure you want to delete this item?') ?>,
|
||||
'method' => 'post',
|
||||
],
|
||||
]) ?>
|
||||
</p>
|
||||
|
||||
<?= "<?= " ?>DetailView::widget([
|
||||
'model' => $model,
|
||||
'attributes' => [
|
||||
<?php
|
||||
if (($tableSchema = $generator->getTableSchema()) === false) {
|
||||
foreach ($generator->getColumnNames() as $name) {
|
||||
echo " '" . $name . "',\n";
|
||||
}
|
||||
} else {
|
||||
foreach ($generator->getTableSchema()->columns as $column) {
|
||||
$format = $generator->generateColumnFormat($column);
|
||||
echo " '" . $column->name . ($format === 'text' ? "" : ":" . $format) . "',\n";
|
||||
}
|
||||
}
|
||||
?>
|
||||
],
|
||||
]) ?>
|
||||
|
||||
</div>
|
||||
17
vendor/yiisoft/yii2-gii/src/generators/crud/form.php
vendored
Normal file
17
vendor/yiisoft/yii2-gii/src/generators/crud/form.php
vendored
Normal file
@ -0,0 +1,17 @@
|
||||
<?php
|
||||
/** @var yii\web\View $this */
|
||||
/** @var yii\widgets\ActiveForm $form */
|
||||
/** @var yii\gii\generators\crud\Generator $generator */
|
||||
|
||||
echo $form->field($generator, 'modelClass');
|
||||
echo $form->field($generator, 'searchModelClass');
|
||||
echo $form->field($generator, 'controllerClass');
|
||||
echo $form->field($generator, 'viewPath');
|
||||
echo $form->field($generator, 'baseControllerClass');
|
||||
echo $form->field($generator, 'indexWidgetType')->dropDownList([
|
||||
'grid' => 'GridView',
|
||||
'list' => 'ListView',
|
||||
]);
|
||||
echo $form->field($generator, 'enableI18N')->checkbox();
|
||||
echo $form->field($generator, 'enablePjax')->checkbox();
|
||||
echo $form->field($generator, 'messageCategory');
|
||||
272
vendor/yiisoft/yii2-gii/src/generators/extension/Generator.php
vendored
Normal file
272
vendor/yiisoft/yii2-gii/src/generators/extension/Generator.php
vendored
Normal file
@ -0,0 +1,272 @@
|
||||
<?php
|
||||
/**
|
||||
* @link https://www.yiiframework.com/
|
||||
* @copyright Copyright (c) 2008 Yii Software LLC
|
||||
* @license https://www.yiiframework.com/license/
|
||||
*/
|
||||
|
||||
namespace yii\gii\generators\extension;
|
||||
|
||||
use Yii;
|
||||
use yii\gii\CodeFile;
|
||||
|
||||
/**
|
||||
* This generator will generate the skeleton files needed by an extension.
|
||||
*
|
||||
* @property-read string $keywordsArrayJson A json encoded array with the given keywords.
|
||||
* @property-read bool $outputPath The directory that contains the module class.
|
||||
*
|
||||
* @author Tobias Munk <schmunk@usrbin.de>
|
||||
* @since 2.0
|
||||
*/
|
||||
class Generator extends \yii\gii\Generator
|
||||
{
|
||||
public $vendorName;
|
||||
public $packageName = "yii2-";
|
||||
public $namespace;
|
||||
public $type = "yii2-extension";
|
||||
public $keywords = "yii2,extension";
|
||||
public $title;
|
||||
public $description;
|
||||
public $outputPath = "@app/runtime/tmp-extensions";
|
||||
public $license;
|
||||
public $authorName;
|
||||
public $authorEmail;
|
||||
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getName()
|
||||
{
|
||||
return 'Extension Generator';
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getDescription()
|
||||
{
|
||||
return 'This generator helps you to generate the files needed by a Yii extension.';
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function rules()
|
||||
{
|
||||
return array_merge(
|
||||
parent::rules(),
|
||||
[
|
||||
[['vendorName', 'packageName'], 'filter', 'filter' => 'trim'],
|
||||
[
|
||||
[
|
||||
'vendorName',
|
||||
'packageName',
|
||||
'namespace',
|
||||
'type',
|
||||
'license',
|
||||
'title',
|
||||
'description',
|
||||
'authorName',
|
||||
'authorEmail',
|
||||
'outputPath'
|
||||
],
|
||||
'required'
|
||||
],
|
||||
[['keywords'], 'safe'],
|
||||
[['authorEmail'], 'email'],
|
||||
[
|
||||
['vendorName', 'packageName'],
|
||||
'match',
|
||||
'pattern' => '/^[a-z0-9\-\.]+$/',
|
||||
'message' => 'Only lowercase word characters, dashes and dots are allowed.'
|
||||
],
|
||||
[
|
||||
['namespace'],
|
||||
'match',
|
||||
'pattern' => '/^[a-zA-Z0-9_\\\]+\\\$/',
|
||||
'message' => 'Only letters, numbers, underscores and backslashes are allowed. PSR-4 namespaces must end with a namespace separator.'
|
||||
],
|
||||
]
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function attributeLabels()
|
||||
{
|
||||
return [
|
||||
'vendorName' => 'Vendor Name',
|
||||
'packageName' => 'Package Name',
|
||||
'license' => 'License',
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function hints()
|
||||
{
|
||||
return [
|
||||
'vendorName' => 'This refers to the name of the publisher, your GitHub user name is usually a good choice, eg. <code>myself</code>.',
|
||||
'packageName' => 'This is the name of the extension on packagist, eg. <code>yii2-foobar</code>.',
|
||||
'namespace' => 'PSR-4, eg. <code>myself\foobar\</code> This will be added to your autoloading by composer. Do not use yii, yii2 or yiisoft in the namespace.',
|
||||
'keywords' => 'Comma separated keywords for this extension.',
|
||||
'outputPath' => 'The temporary location of the generated files.',
|
||||
'title' => 'A more descriptive name of your application for the README file.',
|
||||
'description' => 'A sentence or subline describing the main purpose of the extension.',
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function stickyAttributes()
|
||||
{
|
||||
return ['vendorName', 'outputPath', 'authorName', 'authorEmail'];
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function successMessage()
|
||||
{
|
||||
$outputPath = realpath(\Yii::getAlias($this->outputPath));
|
||||
$output1 = <<<EOD
|
||||
<p><em>The extension has been generated successfully.</em></p>
|
||||
<p>To enable it in your application, you need to create a git repository
|
||||
and require it via composer.</p>
|
||||
EOD;
|
||||
$code1 = <<<EOD
|
||||
cd {$outputPath}/{$this->packageName}
|
||||
|
||||
git init
|
||||
git add -A
|
||||
git commit
|
||||
git remote add origin https://path.to/your/repo
|
||||
git push -u origin master
|
||||
EOD;
|
||||
$output2 = <<<EOD
|
||||
<p>The next step is just for <em>initial development</em>, skip it if you directly publish the extension on packagist.org</p>
|
||||
<p>Add the newly created repo to your composer.json.</p>
|
||||
EOD;
|
||||
$code2 = <<<EOD
|
||||
"repositories":[
|
||||
{
|
||||
"type": "git",
|
||||
"url": "https://path.to/your/repo"
|
||||
}
|
||||
]
|
||||
EOD;
|
||||
$output3 = <<<EOD
|
||||
<p class="well">Note: You may use the url <code>file://{$outputPath}/{$this->packageName}</code> for testing.</p>
|
||||
<p>Require the package with composer</p>
|
||||
EOD;
|
||||
$code3 = <<<EOD
|
||||
composer.phar require {$this->vendorName}/{$this->packageName}:dev-master
|
||||
EOD;
|
||||
$output4 = <<<EOD
|
||||
<p>And use it in your application.</p>
|
||||
EOD;
|
||||
$code4 = <<<EOD
|
||||
\\{$this->namespace}AutoloadExample::widget();
|
||||
EOD;
|
||||
$output5 = <<<EOD
|
||||
<p>When you have finished development register your extension at <a href='https://packagist.org/' target='_blank'>packagist.org</a>.</p>
|
||||
EOD;
|
||||
|
||||
$return = $output1 . '<pre>' . highlight_string($code1, true) . '</pre>';
|
||||
$return .= $output2 . '<pre>' . highlight_string($code2, true) . '</pre>';
|
||||
$return .= $output3 . '<pre>' . highlight_string($code3, true) . '</pre>';
|
||||
$return .= $output4 . '<pre>' . highlight_string($code4, true) . '</pre>';
|
||||
$return .= $output5;
|
||||
|
||||
return $return;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function requiredTemplates()
|
||||
{
|
||||
return ['composer.json', 'AutoloadExample.php', 'README.md'];
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function generate()
|
||||
{
|
||||
$files = [];
|
||||
$modulePath = $this->getOutputPath();
|
||||
$files[] = new CodeFile(
|
||||
$modulePath . '/' . $this->packageName . '/composer.json',
|
||||
$this->render("composer.json")
|
||||
);
|
||||
$files[] = new CodeFile(
|
||||
$modulePath . '/' . $this->packageName . '/AutoloadExample.php',
|
||||
$this->render("AutoloadExample.php")
|
||||
);
|
||||
$files[] = new CodeFile(
|
||||
$modulePath . '/' . $this->packageName . '/README.md',
|
||||
$this->render("README.md")
|
||||
);
|
||||
|
||||
return $files;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return bool the directory that contains the module class
|
||||
*/
|
||||
public function getOutputPath()
|
||||
{
|
||||
return Yii::getAlias(str_replace('\\', '/', $this->outputPath));
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string a json encoded array with the given keywords
|
||||
*/
|
||||
public function getKeywordsArrayJson()
|
||||
{
|
||||
return json_encode(explode(',', $this->keywords), JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array options for type drop-down
|
||||
*/
|
||||
public function optsType()
|
||||
{
|
||||
$types = [
|
||||
'yii2-extension',
|
||||
'library',
|
||||
];
|
||||
|
||||
return array_combine($types, $types);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array options for license drop-down
|
||||
*/
|
||||
public function optsLicense()
|
||||
{
|
||||
$licenses = [
|
||||
'Apache-2.0',
|
||||
'BSD-2-Clause',
|
||||
'BSD-3-Clause',
|
||||
'BSD-4-Clause',
|
||||
'GPL-2.0',
|
||||
'GPL-2.0+',
|
||||
'GPL-3.0',
|
||||
'GPL-3.0+',
|
||||
'LGPL-2.1',
|
||||
'LGPL-2.1+',
|
||||
'LGPL-3.0',
|
||||
'LGPL-3.0+',
|
||||
'MIT'
|
||||
];
|
||||
|
||||
return array_combine($licenses, $licenses);
|
||||
}
|
||||
}
|
||||
14
vendor/yiisoft/yii2-gii/src/generators/extension/default/AutoloadExample.php
vendored
Normal file
14
vendor/yiisoft/yii2-gii/src/generators/extension/default/AutoloadExample.php
vendored
Normal file
@ -0,0 +1,14 @@
|
||||
<?= "<?php\n" ?>
|
||||
|
||||
namespace <?= substr($generator->namespace, 0, -1) ?>;
|
||||
|
||||
/**
|
||||
* This is just an example.
|
||||
*/
|
||||
class AutoloadExample extends \yii\base\Widget
|
||||
{
|
||||
public function run()
|
||||
{
|
||||
return "Hello!";
|
||||
}
|
||||
}
|
||||
35
vendor/yiisoft/yii2-gii/src/generators/extension/default/README.md
vendored
Normal file
35
vendor/yiisoft/yii2-gii/src/generators/extension/default/README.md
vendored
Normal file
@ -0,0 +1,35 @@
|
||||
<?= $generator->title ?>
|
||||
|
||||
<?= str_repeat('=', mb_strlen($generator->title, \Yii::$app->charset)) ?>
|
||||
|
||||
<?= $generator->description ?>
|
||||
|
||||
|
||||
Installation
|
||||
------------
|
||||
|
||||
The preferred way to install this extension is through [composer](https://getcomposer.org/download/).
|
||||
|
||||
Either run
|
||||
|
||||
```
|
||||
php composer.phar require --prefer-dist <?= $generator->vendorName ?>/<?= $generator->packageName ?> "*"
|
||||
```
|
||||
|
||||
or add
|
||||
|
||||
```
|
||||
"<?= $generator->vendorName ?>/<?= $generator->packageName ?>": "*"
|
||||
```
|
||||
|
||||
to the require section of your `composer.json` file.
|
||||
|
||||
|
||||
Usage
|
||||
-----
|
||||
|
||||
Once the extension is installed, simply use it in your code by :
|
||||
|
||||
```php
|
||||
<?= "<?= \\{$generator->namespace}AutoloadExample::widget(); ?>" ?>
|
||||
```
|
||||
21
vendor/yiisoft/yii2-gii/src/generators/extension/default/composer.json
vendored
Normal file
21
vendor/yiisoft/yii2-gii/src/generators/extension/default/composer.json
vendored
Normal file
@ -0,0 +1,21 @@
|
||||
{
|
||||
"name": "<?= $generator->vendorName ?>/<?= $generator->packageName ?>",
|
||||
"description": "<?= $generator->description ?>",
|
||||
"type": "<?= $generator->type ?>",
|
||||
"keywords": <?= $generator->keywordsArrayJson ?>,
|
||||
"license": "<?= $generator->license ?>",
|
||||
"authors": [
|
||||
{
|
||||
"name": "<?= $generator->authorName ?>",
|
||||
"email": "<?= $generator->authorEmail ?>"
|
||||
}
|
||||
],
|
||||
"require": {
|
||||
"yiisoft/yii2": "~2.0.0"
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"<?= str_replace('\\','\\\\',$generator->namespace) ?>": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
26
vendor/yiisoft/yii2-gii/src/generators/extension/form.php
vendored
Normal file
26
vendor/yiisoft/yii2-gii/src/generators/extension/form.php
vendored
Normal file
@ -0,0 +1,26 @@
|
||||
<?php
|
||||
/** @var yii\web\View $this */
|
||||
/** @var yii\widgets\ActiveForm $form */
|
||||
/** @var yii\gii\generators\extension\Generator $generator */
|
||||
|
||||
?>
|
||||
<div class="alert alert-info">
|
||||
Please read the
|
||||
<?= \yii\helpers\Html::a('Extension Guidelines', 'https://www.yiiframework.com/doc-2.0/guide-structure-extensions.html', ['target'=>'new']) ?>
|
||||
before creating an extension.
|
||||
</div>
|
||||
<div class="module-form">
|
||||
<?php
|
||||
echo $form->field($generator, 'vendorName');
|
||||
echo $form->field($generator, 'packageName');
|
||||
echo $form->field($generator, 'namespace');
|
||||
echo $form->field($generator, 'type')->dropDownList($generator->optsType());
|
||||
echo $form->field($generator, 'keywords');
|
||||
echo $form->field($generator, 'license')->dropDownList($generator->optsLicense(), ['prompt'=>'Choose...']);
|
||||
echo $form->field($generator, 'title');
|
||||
echo $form->field($generator, 'description');
|
||||
echo $form->field($generator, 'authorName');
|
||||
echo $form->field($generator, 'authorEmail');
|
||||
echo $form->field($generator, 'outputPath');
|
||||
?>
|
||||
</div>
|
||||
159
vendor/yiisoft/yii2-gii/src/generators/form/Generator.php
vendored
Normal file
159
vendor/yiisoft/yii2-gii/src/generators/form/Generator.php
vendored
Normal file
@ -0,0 +1,159 @@
|
||||
<?php
|
||||
/**
|
||||
* @link https://www.yiiframework.com/
|
||||
* @copyright Copyright (c) 2008 Yii Software LLC
|
||||
* @license https://www.yiiframework.com/license/
|
||||
*/
|
||||
|
||||
namespace yii\gii\generators\form;
|
||||
|
||||
use Yii;
|
||||
use yii\base\Model;
|
||||
use yii\gii\CodeFile;
|
||||
|
||||
/**
|
||||
* This generator will generate an action view file based on the specified model class.
|
||||
*
|
||||
* @property-read array $modelAttributes List of safe attributes of [[modelClass]].
|
||||
*
|
||||
* @author Qiang Xue <qiang.xue@gmail.com>
|
||||
* @since 2.0
|
||||
*/
|
||||
class Generator extends \yii\gii\Generator
|
||||
{
|
||||
public $modelClass;
|
||||
public $viewPath = '@app/views';
|
||||
public $viewName;
|
||||
public $scenarioName;
|
||||
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getName()
|
||||
{
|
||||
return 'Form Generator';
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getDescription()
|
||||
{
|
||||
return 'This generator generates a view script file that displays a form to collect input for the specified model class.';
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function generate()
|
||||
{
|
||||
$files = [];
|
||||
$files[] = new CodeFile(
|
||||
Yii::getAlias($this->viewPath) . '/' . $this->viewName . '.php',
|
||||
$this->render('form.php')
|
||||
);
|
||||
|
||||
return $files;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function rules()
|
||||
{
|
||||
return array_merge(parent::rules(), [
|
||||
[['modelClass', 'viewName', 'scenarioName', 'viewPath'], 'trim'],
|
||||
[['modelClass', 'viewName', 'viewPath'], 'required'],
|
||||
[['modelClass'], 'match', 'pattern' => '/^[\w\\\\]*$/', 'message' => 'Only word characters and backslashes are allowed.'],
|
||||
[['modelClass'], 'validateClass', 'params' => ['extends' => Model::className()]],
|
||||
[['viewName'], 'match', 'pattern' => '/^\w+[\\-\\/\w]*$/', 'message' => 'Only word characters, dashes and slashes are allowed.'],
|
||||
[['viewPath'], 'match', 'pattern' => '/^@?\w+[\\-\\/\w]*$/', 'message' => 'Only word characters, dashes, slashes and @ are allowed.'],
|
||||
[['viewPath'], 'validateViewPath'],
|
||||
[['scenarioName'], 'match', 'pattern' => '/^[\w\\-]+$/', 'message' => 'Only word characters and dashes are allowed.'],
|
||||
[['enableI18N'], 'boolean'],
|
||||
[['messageCategory'], 'validateMessageCategory', 'skipOnEmpty' => false],
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function attributeLabels()
|
||||
{
|
||||
return array_merge(parent::attributeLabels(), [
|
||||
'modelClass' => 'Model Class',
|
||||
'viewName' => 'View Name',
|
||||
'viewPath' => 'View Path',
|
||||
'scenarioName' => 'Scenario',
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function requiredTemplates()
|
||||
{
|
||||
return ['form.php', 'action.php'];
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function stickyAttributes()
|
||||
{
|
||||
return array_merge(parent::stickyAttributes(), ['viewPath', 'scenarioName']);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function hints()
|
||||
{
|
||||
return array_merge(parent::hints(), [
|
||||
'modelClass' => 'This is the model class for collecting the form input. You should provide a fully qualified class name, e.g., <code>app\models\Post</code>.',
|
||||
'viewName' => 'This is the view name with respect to the view path. For example, <code>site/index</code> would generate a <code>site/index.php</code> view file under the view path.',
|
||||
'viewPath' => 'This is the root view path to keep the generated view files. You may provide either a directory or a path alias, e.g., <code>@app/views</code>.',
|
||||
'scenarioName' => 'This is the scenario to be used by the model when collecting the form input. If empty, the default scenario will be used.',
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function successMessage()
|
||||
{
|
||||
$code = highlight_string($this->render('action.php'), true);
|
||||
|
||||
return <<<EOD
|
||||
<p>The form has been generated successfully.</p>
|
||||
<p>You may add the following code in an appropriate controller class to invoke the view:</p>
|
||||
<pre>$code</pre>
|
||||
EOD;
|
||||
}
|
||||
|
||||
/**
|
||||
* Validates [[viewPath]] to make sure it is a valid path or path alias and exists.
|
||||
*/
|
||||
public function validateViewPath()
|
||||
{
|
||||
$path = Yii::getAlias($this->viewPath, false);
|
||||
if ($path === false || !is_dir($path)) {
|
||||
$this->addError('viewPath', 'View path does not exist.');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array list of safe attributes of [[modelClass]]
|
||||
*/
|
||||
public function getModelAttributes()
|
||||
{
|
||||
/* @var $model Model */
|
||||
$model = new $this->modelClass();
|
||||
if (!empty($this->scenarioName)) {
|
||||
$model->setScenario($this->scenarioName);
|
||||
}
|
||||
|
||||
return $model->safeAttributes();
|
||||
}
|
||||
}
|
||||
28
vendor/yiisoft/yii2-gii/src/generators/form/default/action.php
vendored
Normal file
28
vendor/yiisoft/yii2-gii/src/generators/form/default/action.php
vendored
Normal file
@ -0,0 +1,28 @@
|
||||
<?php
|
||||
/**
|
||||
* This is the template for generating an action view file.
|
||||
*/
|
||||
|
||||
use yii\helpers\Inflector;
|
||||
|
||||
/** @var yii\web\View $this */
|
||||
/** @var yii\gii\generators\form\Generator $generator */
|
||||
|
||||
echo "<?php\n";
|
||||
?>
|
||||
|
||||
public function action<?= Inflector::id2camel(trim(basename($generator->viewName), '_')) ?>()
|
||||
{
|
||||
$model = new \<?= ltrim($generator->modelClass, '\\') ?><?= empty($generator->scenarioName) ? "()" : "(['scenario' => '{$generator->scenarioName}'])" ?>;
|
||||
|
||||
if ($model->load(Yii::$app->request->post())) {
|
||||
if ($model->validate()) {
|
||||
// form inputs are valid, do something here
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
return $this->render('<?= basename($generator->viewName) ?>', [
|
||||
'model' => $model,
|
||||
]);
|
||||
}
|
||||
35
vendor/yiisoft/yii2-gii/src/generators/form/default/form.php
vendored
Normal file
35
vendor/yiisoft/yii2-gii/src/generators/form/default/form.php
vendored
Normal file
@ -0,0 +1,35 @@
|
||||
<?php
|
||||
/**
|
||||
* This is the template for generating an action view file.
|
||||
*/
|
||||
|
||||
/** @var yii\web\View $this */
|
||||
/** @var yii\gii\generators\form\Generator $generator */
|
||||
|
||||
$class = str_replace('/', '-', trim($generator->viewName, '_'));
|
||||
|
||||
echo "<?php\n";
|
||||
?>
|
||||
|
||||
use yii\helpers\Html;
|
||||
use yii\widgets\ActiveForm;
|
||||
|
||||
/** @var yii\web\View $this */
|
||||
/** @var <?= ltrim($generator->modelClass, '\\') ?> $model */
|
||||
/** @var ActiveForm $form */
|
||||
<?= "?>" ?>
|
||||
|
||||
<div class="<?= $class ?>">
|
||||
|
||||
<?= "<?php " ?>$form = ActiveForm::begin(); ?>
|
||||
|
||||
<?php foreach ($generator->getModelAttributes() as $attribute): ?>
|
||||
<?= "<?= " ?>$form->field($model, '<?= $attribute ?>') ?>
|
||||
<?php endforeach; ?>
|
||||
|
||||
<div class="form-group">
|
||||
<?= "<?= " ?>Html::submitButton(<?= $generator->generateString('Submit') ?>, ['class' => 'btn btn-primary']) ?>
|
||||
</div>
|
||||
<?= "<?php " ?>ActiveForm::end(); ?>
|
||||
|
||||
</div><!-- <?= $class ?> -->
|
||||
11
vendor/yiisoft/yii2-gii/src/generators/form/form.php
vendored
Normal file
11
vendor/yiisoft/yii2-gii/src/generators/form/form.php
vendored
Normal file
@ -0,0 +1,11 @@
|
||||
<?php
|
||||
/** @var yii\web\View $this */
|
||||
/** @var yii\widgets\ActiveForm $form */
|
||||
/** @var yii\gii\generators\form\Generator $generator */
|
||||
|
||||
echo $form->field($generator, 'viewName');
|
||||
echo $form->field($generator, 'modelClass');
|
||||
echo $form->field($generator, 'scenarioName');
|
||||
echo $form->field($generator, 'viewPath');
|
||||
echo $form->field($generator, 'enableI18N')->checkbox();
|
||||
echo $form->field($generator, 'messageCategory');
|
||||
1260
vendor/yiisoft/yii2-gii/src/generators/model/Generator.php
vendored
Normal file
1260
vendor/yiisoft/yii2-gii/src/generators/model/Generator.php
vendored
Normal file
File diff suppressed because it is too large
Load Diff
167
vendor/yiisoft/yii2-gii/src/generators/model/default/model.php
vendored
Normal file
167
vendor/yiisoft/yii2-gii/src/generators/model/default/model.php
vendored
Normal file
@ -0,0 +1,167 @@
|
||||
<?php
|
||||
/**
|
||||
* This is the template for generating the model class of a specified table.
|
||||
*/
|
||||
|
||||
/** @var $enum array list of ENUM fields */
|
||||
/** @var yii\web\View $this */
|
||||
/** @var yii\gii\generators\model\Generator $generator */
|
||||
/** @var string $tableName full table name */
|
||||
/** @var string $className class name */
|
||||
/** @var string $queryClassName query class name */
|
||||
/** @var yii\db\TableSchema $tableSchema */
|
||||
/** @var array $properties list of properties (property => [type, name. comment]) */
|
||||
/** @var string[] $labels list of attribute labels (name => label) */
|
||||
/** @var string[] $rules list of validation rules */
|
||||
/** @var array $relations list of relations (name => relation declaration) */
|
||||
/** @var array $relationsClassHints */
|
||||
|
||||
echo "<?php\n";
|
||||
?>
|
||||
|
||||
namespace <?= $generator->ns ?>;
|
||||
|
||||
use Yii;
|
||||
|
||||
/**
|
||||
* This is the model class for table "<?= $generator->generateTableName($tableName) ?>".
|
||||
*
|
||||
<?php foreach ($properties as $property => $data): ?>
|
||||
* @property <?= "{$data['type']} \${$property}" . ($data['comment'] ? ' ' . strtr($data['comment'], ["\n" => ' ']) : '') . "\n" ?>
|
||||
<?php endforeach; ?>
|
||||
<?php if (!empty($relations)): ?>
|
||||
*
|
||||
<?php foreach ($relations as $name => $relation): ?>
|
||||
* @property <?= $relation[1] . ($relation[2] ? '[]' : '') . ' $' . lcfirst($name) . "\n" ?>
|
||||
<?php endforeach; ?>
|
||||
<?php endif; ?>
|
||||
*/
|
||||
class <?= $className ?> extends <?= '\\' . ltrim($generator->baseClass, '\\') . "\n" ?>
|
||||
{
|
||||
|
||||
<?php if (!empty($enum)): ?>
|
||||
/**
|
||||
* ENUM field values
|
||||
*/
|
||||
<?php
|
||||
foreach($enum as $columnName => $columnData) {
|
||||
foreach ($columnData['values'] as $enumValue){
|
||||
echo ' const ' . $enumValue['constName'] . ' = \'' . $enumValue['value'] . '\';' . PHP_EOL;
|
||||
}
|
||||
}
|
||||
endif
|
||||
?>
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public static function tableName()
|
||||
{
|
||||
return '<?= $generator->generateTableName($tableName) ?>';
|
||||
}
|
||||
<?php if ($generator->db !== 'db'): ?>
|
||||
|
||||
/**
|
||||
* @return \yii\db\Connection the database connection used by this AR class.
|
||||
*/
|
||||
public static function getDb()
|
||||
{
|
||||
return Yii::$app->get('<?= $generator->db ?>');
|
||||
}
|
||||
<?php endif; ?>
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function rules()
|
||||
{
|
||||
return [<?= empty($rules) ? '' : ("\n " . implode(",\n ", $rules) . ",\n ") ?>];
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function attributeLabels()
|
||||
{
|
||||
return [
|
||||
<?php foreach ($labels as $name => $label): ?>
|
||||
<?= "'$name' => " . $generator->generateString($label) . ",\n" ?>
|
||||
<?php endforeach; ?>
|
||||
];
|
||||
}
|
||||
<?php foreach ($relations as $name => $relation): ?>
|
||||
|
||||
/**
|
||||
* Gets query for [[<?= $name ?>]].
|
||||
*
|
||||
* @return <?= $relationsClassHints[$name] . "\n" ?>
|
||||
*/
|
||||
public function get<?= $name ?>()
|
||||
{
|
||||
<?= $relation[0] . "\n" ?>
|
||||
}
|
||||
<?php endforeach; ?>
|
||||
<?php if ($queryClassName): ?>
|
||||
<?php
|
||||
$queryClassFullName = ($generator->ns === $generator->queryNs) ? $queryClassName : '\\' . $generator->queryNs . '\\' . $queryClassName;
|
||||
echo "\n";
|
||||
?>
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
* @return <?= $queryClassFullName ?> the active query used by this AR class.
|
||||
*/
|
||||
public static function find()
|
||||
{
|
||||
return new <?= $queryClassFullName ?>(get_called_class());
|
||||
}
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if ($enum): ?>
|
||||
<?php foreach ($enum as $columnName => $columnData): ?>
|
||||
|
||||
/**
|
||||
* column <?= $columnName ?> ENUM value labels
|
||||
* @return string[]
|
||||
*/
|
||||
public static function <?= $columnData['funcOptsName'] ?>()
|
||||
{
|
||||
return [
|
||||
<?php foreach ($columnData['values'] as $k => $value): ?>
|
||||
<?php
|
||||
if ($generator->enableI18N) {
|
||||
echo ' self::' . $value['constName'] . ' => Yii::t(\'' . $generator->messageCategory . '\', \'' . $value['value'] . "'),\n";
|
||||
} else {
|
||||
echo ' self::' . $value['constName'] . ' => \'' . $value['value'] . "',\n";
|
||||
}
|
||||
?>
|
||||
<?php endforeach; ?>
|
||||
];
|
||||
}
|
||||
<?php endforeach; ?>
|
||||
<?php foreach ($enum as $columnName => $columnData): ?>
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function <?= $columnData['displayFunctionPrefix'] ?>()
|
||||
{
|
||||
return self::<?= $columnData['funcOptsName'] ?>()[$this-><?=$columnName?>];
|
||||
}
|
||||
<?php foreach ($columnData['values'] as $enumValue): ?>
|
||||
|
||||
/**
|
||||
* @return bool
|
||||
*/
|
||||
public function <?= $columnData['isFunctionPrefix'] . $enumValue['functionSuffix'] ?>()
|
||||
{
|
||||
return $this-><?= $columnName ?> === self::<?= $enumValue['constName'] ?>;
|
||||
}
|
||||
|
||||
public function <?= $columnData['setFunctionPrefix'] . $enumValue['functionSuffix'] ?>()
|
||||
{
|
||||
$this-><?= $columnName ?> = self::<?= $enumValue['constName'] ?>;
|
||||
}
|
||||
<?php endforeach; ?>
|
||||
<?php endforeach; ?>
|
||||
<?php endif; ?>
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user