├── .docker └── php.Dockerfile ├── .github └── workflows │ └── docker-image.yml ├── .gitignore ├── LICENSE ├── README.md ├── assets ├── compiled │ ├── .gitignore │ ├── css │ │ ├── styles.css │ │ └── styles.css.map │ ├── fonts │ │ ├── glyphicons-halflings-regular.eot │ │ ├── glyphicons-halflings-regular.svg │ │ ├── glyphicons-halflings-regular.ttf │ │ └── glyphicons-halflings-regular.woff │ └── js │ │ └── scripts.js ├── docs │ ├── overall_view.png │ └── setup_connection.png └── src │ ├── .gitignore │ ├── Gruntfile.js │ ├── bootstrap │ ├── .editorconfig │ ├── .gitattributes │ ├── .gitignore │ ├── .travis.yml │ ├── CNAME │ ├── CONTRIBUTING.md │ ├── Gruntfile.js │ ├── LICENSE │ ├── README.md │ ├── _config.yml │ ├── bower.json │ ├── composer.json │ ├── dist │ │ ├── css │ │ │ ├── bootstrap-theme.css │ │ │ ├── bootstrap-theme.css.map │ │ │ ├── bootstrap-theme.min.css │ │ │ ├── bootstrap.css │ │ │ ├── bootstrap.css.map │ │ │ └── bootstrap.min.css │ │ ├── fonts │ │ │ ├── glyphicons-halflings-regular.eot │ │ │ ├── glyphicons-halflings-regular.svg │ │ │ ├── glyphicons-halflings-regular.ttf │ │ │ └── glyphicons-halflings-regular.woff │ │ └── js │ │ │ ├── bootstrap.js │ │ │ └── bootstrap.min.js │ ├── docs │ │ ├── LICENSE │ │ ├── _data │ │ │ ├── core-team.yml │ │ │ ├── glyphicons.yml │ │ │ ├── sass-team.yml │ │ │ ├── showcase.yml │ │ │ └── translations.yml │ │ ├── _includes │ │ │ ├── ads.html │ │ │ ├── components │ │ │ │ ├── alerts.html │ │ │ │ ├── badges.html │ │ │ │ ├── breadcrumbs.html │ │ │ │ ├── button-dropdowns.html │ │ │ │ ├── button-groups.html │ │ │ │ ├── dropdowns.html │ │ │ │ ├── glyphicons.html │ │ │ │ ├── input-groups.html │ │ │ │ ├── jumbotron.html │ │ │ │ ├── labels.html │ │ │ │ ├── list-group.html │ │ │ │ ├── media.html │ │ │ │ ├── navbar.html │ │ │ │ ├── navs.html │ │ │ │ ├── page-header.html │ │ │ │ ├── pagination.html │ │ │ │ ├── panels.html │ │ │ │ ├── progress-bars.html │ │ │ │ ├── responsive-embed.html │ │ │ │ ├── thumbnails.html │ │ │ │ └── wells.html │ │ │ ├── css │ │ │ │ ├── buttons.html │ │ │ │ ├── code.html │ │ │ │ ├── forms.html │ │ │ │ ├── grid.html │ │ │ │ ├── helpers.html │ │ │ │ ├── images.html │ │ │ │ ├── less.html │ │ │ │ ├── overview.html │ │ │ │ ├── responsive-utilities.html │ │ │ │ ├── sass.html │ │ │ │ ├── tables.html │ │ │ │ └── type.html │ │ │ ├── customizer-variables.html │ │ │ ├── footer.html │ │ │ ├── getting-started │ │ │ │ ├── accessibility.html │ │ │ │ ├── browser-device-support.html │ │ │ │ ├── community.html │ │ │ │ ├── disabling-responsiveness.html │ │ │ │ ├── download.html │ │ │ │ ├── examples.html │ │ │ │ ├── grunt.html │ │ │ │ ├── license.html │ │ │ │ ├── template.html │ │ │ │ ├── third-party-support.html │ │ │ │ ├── translations.html │ │ │ │ └── whats-included.html │ │ │ ├── header.html │ │ │ ├── js │ │ │ │ ├── affix.html │ │ │ │ ├── alerts.html │ │ │ │ ├── buttons.html │ │ │ │ ├── carousel.html │ │ │ │ ├── collapse.html │ │ │ │ ├── dropdowns.html │ │ │ │ ├── modal.html │ │ │ │ ├── overview.html │ │ │ │ ├── popovers.html │ │ │ │ ├── scrollspy.html │ │ │ │ ├── tabs.html │ │ │ │ ├── tooltips.html │ │ │ │ └── transitions.html │ │ │ ├── nav │ │ │ │ ├── about.html │ │ │ │ ├── components.html │ │ │ │ ├── css.html │ │ │ │ ├── customize.html │ │ │ │ ├── getting-started.html │ │ │ │ ├── javascript.html │ │ │ │ ├── main.html │ │ │ │ └── migration.html │ │ │ └── social-buttons.html │ │ ├── _jade │ │ │ ├── customizer-nav.jade │ │ │ └── customizer-variables.jade │ │ ├── _layouts │ │ │ ├── default.html │ │ │ └── home.html │ │ ├── about.html │ │ ├── apple-touch-icon-precomposed.png │ │ ├── assets │ │ │ ├── brand │ │ │ │ ├── bootstrap-outline.svg │ │ │ │ ├── bootstrap-punchout.svg │ │ │ │ └── bootstrap-solid.svg │ │ │ ├── css │ │ │ │ ├── _src │ │ │ │ │ ├── docs.css │ │ │ │ │ └── pygments-manni.css │ │ │ │ └── docs.min.css │ │ │ ├── flash │ │ │ │ └── ZeroClipboard.swf │ │ │ ├── img │ │ │ │ ├── components.png │ │ │ │ ├── devices.png │ │ │ │ └── sass-less.png │ │ │ └── js │ │ │ │ ├── _src │ │ │ │ ├── application.js │ │ │ │ └── customizer.js │ │ │ │ ├── _vendor │ │ │ │ ├── ZeroClipboard.min.js │ │ │ │ ├── blob.js │ │ │ │ ├── filesaver.js │ │ │ │ ├── holder.js │ │ │ │ ├── jszip.min.js │ │ │ │ ├── less.min.js │ │ │ │ └── uglify.min.js │ │ │ │ ├── customize.min.js │ │ │ │ ├── docs.min.js │ │ │ │ ├── ie-emulation-modes-warning.js │ │ │ │ ├── ie10-viewport-bug-workaround.js │ │ │ │ ├── ie8-responsive-file-warning.js │ │ │ │ └── raw-files.min.js │ │ ├── browser-bugs.html │ │ ├── components.html │ │ ├── css.html │ │ ├── customize.html │ │ ├── dist │ │ │ ├── css │ │ │ │ ├── bootstrap-theme.css.map │ │ │ │ ├── bootstrap-theme.min.css │ │ │ │ ├── bootstrap.css.map │ │ │ │ └── bootstrap.min.css │ │ │ ├── fonts │ │ │ │ ├── glyphicons-halflings-regular.eot │ │ │ │ ├── glyphicons-halflings-regular.svg │ │ │ │ ├── glyphicons-halflings-regular.ttf │ │ │ │ └── glyphicons-halflings-regular.woff │ │ │ └── js │ │ │ │ └── bootstrap.min.js │ │ ├── examples │ │ │ ├── blog │ │ │ │ ├── blog.css │ │ │ │ └── index.html │ │ │ ├── carousel │ │ │ │ ├── carousel.css │ │ │ │ └── index.html │ │ │ ├── cover │ │ │ │ ├── cover.css │ │ │ │ └── index.html │ │ │ ├── dashboard │ │ │ │ ├── dashboard.css │ │ │ │ └── index.html │ │ │ ├── grid │ │ │ │ ├── grid.css │ │ │ │ └── index.html │ │ │ ├── jumbotron-narrow │ │ │ │ ├── index.html │ │ │ │ └── jumbotron-narrow.css │ │ │ ├── jumbotron │ │ │ │ ├── index.html │ │ │ │ └── jumbotron.css │ │ │ ├── justified-nav │ │ │ │ ├── index.html │ │ │ │ └── justified-nav.css │ │ │ ├── navbar-fixed-top │ │ │ │ ├── index.html │ │ │ │ └── navbar-fixed-top.css │ │ │ ├── navbar-static-top │ │ │ │ ├── index.html │ │ │ │ └── navbar-static-top.css │ │ │ ├── navbar │ │ │ │ ├── index.html │ │ │ │ └── navbar.css │ │ │ ├── non-responsive │ │ │ │ ├── index.html │ │ │ │ └── non-responsive.css │ │ │ ├── offcanvas │ │ │ │ ├── index.html │ │ │ │ ├── offcanvas.css │ │ │ │ └── offcanvas.js │ │ │ ├── screenshots │ │ │ │ ├── blog.jpg │ │ │ │ ├── carousel.jpg │ │ │ │ ├── cover.jpg │ │ │ │ ├── dashboard.jpg │ │ │ │ ├── equal-height-columns.jpg │ │ │ │ ├── grid.jpg │ │ │ │ ├── jumbotron-narrow.jpg │ │ │ │ ├── jumbotron.jpg │ │ │ │ ├── justified-nav.jpg │ │ │ │ ├── navbar-fixed.jpg │ │ │ │ ├── navbar-static.jpg │ │ │ │ ├── navbar.jpg │ │ │ │ ├── non-responsive.jpg │ │ │ │ ├── offcanvas.jpg │ │ │ │ ├── sign-in.jpg │ │ │ │ ├── starter-template.jpg │ │ │ │ ├── sticky-footer-navbar.jpg │ │ │ │ ├── sticky-footer.jpg │ │ │ │ └── theme.jpg │ │ │ ├── signin │ │ │ │ ├── index.html │ │ │ │ └── signin.css │ │ │ ├── starter-template │ │ │ │ ├── index.html │ │ │ │ └── starter-template.css │ │ │ ├── sticky-footer-navbar │ │ │ │ ├── index.html │ │ │ │ └── sticky-footer-navbar.css │ │ │ ├── sticky-footer │ │ │ │ ├── index.html │ │ │ │ └── sticky-footer.css │ │ │ ├── theme │ │ │ │ ├── index.html │ │ │ │ └── theme.css │ │ │ └── tooltip-viewport │ │ │ │ ├── index.html │ │ │ │ ├── tooltip-viewport.css │ │ │ │ └── tooltip-viewport.js │ │ ├── favicon.ico │ │ ├── getting-started.html │ │ ├── index.html │ │ ├── javascript.html │ │ ├── migration.html │ │ ├── robots.txt │ │ └── sitemap.xml │ ├── fonts │ │ ├── glyphicons-halflings-regular.eot │ │ ├── glyphicons-halflings-regular.svg │ │ ├── glyphicons-halflings-regular.ttf │ │ └── glyphicons-halflings-regular.woff │ ├── grunt │ │ ├── .jshintrc │ │ ├── bs-glyphicons-data-generator.js │ │ ├── bs-lessdoc-parser.js │ │ ├── bs-raw-files-generator.js │ │ └── sauce_browsers.yml │ ├── js │ │ ├── .jscsrc │ │ ├── .jshintrc │ │ ├── affix.js │ │ ├── alert.js │ │ ├── button.js │ │ ├── carousel.js │ │ ├── collapse.js │ │ ├── dropdown.js │ │ ├── modal.js │ │ ├── popover.js │ │ ├── scrollspy.js │ │ ├── tab.js │ │ ├── tests │ │ │ ├── index.html │ │ │ ├── unit │ │ │ │ ├── .jshintrc │ │ │ │ ├── affix.js │ │ │ │ ├── alert.js │ │ │ │ ├── button.js │ │ │ │ ├── carousel.js │ │ │ │ ├── collapse.js │ │ │ │ ├── dropdown.js │ │ │ │ ├── modal.js │ │ │ │ ├── phantom.js │ │ │ │ ├── popover.js │ │ │ │ ├── scrollspy.js │ │ │ │ ├── tab.js │ │ │ │ └── tooltip.js │ │ │ ├── vendor │ │ │ │ ├── jquery.min.js │ │ │ │ ├── qunit.css │ │ │ │ └── qunit.js │ │ │ └── visual │ │ │ │ ├── affix.html │ │ │ │ ├── alert.html │ │ │ │ ├── button.html │ │ │ │ ├── carousel.html │ │ │ │ ├── collapse.html │ │ │ │ ├── dropdown.html │ │ │ │ ├── modal.html │ │ │ │ ├── popover.html │ │ │ │ ├── scrollspy.html │ │ │ │ ├── tab.html │ │ │ │ └── tooltip.html │ │ ├── tooltip.js │ │ └── transition.js │ ├── less │ │ ├── .csscomb.json │ │ ├── .csslintrc │ │ ├── alerts.less │ │ ├── badges.less │ │ ├── bootstrap.less │ │ ├── breadcrumbs.less │ │ ├── button-groups.less │ │ ├── buttons.less │ │ ├── carousel.less │ │ ├── close.less │ │ ├── code.less │ │ ├── component-animations.less │ │ ├── dropdowns.less │ │ ├── forms.less │ │ ├── glyphicons.less │ │ ├── grid.less │ │ ├── input-groups.less │ │ ├── jumbotron.less │ │ ├── labels.less │ │ ├── list-group.less │ │ ├── media.less │ │ ├── mixins.less │ │ ├── mixins │ │ │ ├── alerts.less │ │ │ ├── background-variant.less │ │ │ ├── border-radius.less │ │ │ ├── buttons.less │ │ │ ├── center-block.less │ │ │ ├── clearfix.less │ │ │ ├── forms.less │ │ │ ├── gradients.less │ │ │ ├── grid-framework.less │ │ │ ├── grid.less │ │ │ ├── hide-text.less │ │ │ ├── image.less │ │ │ ├── labels.less │ │ │ ├── list-group.less │ │ │ ├── nav-divider.less │ │ │ ├── nav-vertical-align.less │ │ │ ├── opacity.less │ │ │ ├── pagination.less │ │ │ ├── panels.less │ │ │ ├── progress-bar.less │ │ │ ├── reset-filter.less │ │ │ ├── resize.less │ │ │ ├── responsive-visibility.less │ │ │ ├── size.less │ │ │ ├── tab-focus.less │ │ │ ├── table-row.less │ │ │ ├── text-emphasis.less │ │ │ ├── text-overflow.less │ │ │ └── vendor-prefixes.less │ │ ├── modals.less │ │ ├── navbar.less │ │ ├── navs.less │ │ ├── normalize.less │ │ ├── pager.less │ │ ├── pagination.less │ │ ├── panels.less │ │ ├── popovers.less │ │ ├── print.less │ │ ├── progress-bars.less │ │ ├── responsive-embed.less │ │ ├── responsive-utilities.less │ │ ├── scaffolding.less │ │ ├── tables.less │ │ ├── theme.less │ │ ├── thumbnails.less │ │ ├── tooltip.less │ │ ├── type.less │ │ ├── utilities.less │ │ ├── variables.less │ │ └── wells.less │ ├── package.json │ └── test-infra │ │ ├── README.md │ │ ├── S3Cachefile.json │ │ ├── npm-shrinkwrap.json │ │ ├── requirements.txt │ │ ├── s3_cache.py │ │ └── uncached-npm-install.sh │ ├── datetimepicker │ ├── MIT-LICENSE.txt │ ├── README.md │ ├── jquery.datetimepicker.css │ └── jquery.datetimepicker.js │ ├── js │ ├── extend.js │ ├── jquery-2.1.1.min.js │ ├── jquery │ │ └── jquery.form.js │ ├── kz │ │ ├── ajaxLink.js │ │ ├── ajaxResponse.js │ │ ├── app.js │ │ ├── form.js │ │ ├── grid.js │ │ ├── loading.js │ │ ├── modal.js │ │ ├── modalMsg.js │ │ ├── util.js │ │ └── widget.js │ └── project │ │ └── sqlGrid.js │ ├── less │ ├── styles.less │ └── variables.less │ └── package.json ├── composer.json ├── docker-compose.yml ├── index.php ├── protected ├── bootstrap.php ├── config │ └── main.php ├── libs │ ├── KZ │ │ ├── Controller.php │ │ ├── FlashMessenger.php │ │ ├── Link.php │ │ ├── Model.php │ │ ├── Registry.php │ │ ├── View.php │ │ ├── app │ │ │ ├── Facade.php │ │ │ ├── Facade │ │ │ │ └── Http.php │ │ │ ├── Kit.php │ │ │ ├── Registry.php │ │ │ └── interfaces │ │ │ │ ├── Kit.php │ │ │ │ └── Registry.php │ │ ├── controller │ │ │ ├── Chain.php │ │ │ ├── Front.php │ │ │ ├── Kit.php │ │ │ ├── Request.php │ │ │ ├── Response.php │ │ │ ├── interfaces │ │ │ │ ├── Chain.php │ │ │ │ ├── Request.php │ │ │ │ └── Response.php │ │ │ └── request │ │ │ │ └── Http.php │ │ ├── db │ │ │ ├── ConnectionStorage.php │ │ │ ├── PDOMock.php │ │ │ ├── Table.php │ │ │ ├── interfaces │ │ │ │ ├── ConnectionStorage.php │ │ │ │ └── TableModel.php │ │ │ └── table │ │ │ │ ├── Mysql.php │ │ │ │ └── SQLite.php │ │ ├── event │ │ │ ├── Event.php │ │ │ ├── Observer.php │ │ │ └── interfaces │ │ │ │ ├── Event.php │ │ │ │ └── Observer.php │ │ ├── flashMessenger │ │ │ └── interfaces │ │ │ │ └── FlashMessenger.php │ │ ├── grid │ │ │ ├── Grid.php │ │ │ ├── Pager.php │ │ │ └── interfaces │ │ │ │ ├── Grid.php │ │ │ │ └── Pager.php │ │ ├── link │ │ │ └── interfaces │ │ │ │ └── Link.php │ │ ├── model │ │ │ ├── Filter.php │ │ │ └── interfaces │ │ │ │ ├── Filter.php │ │ │ │ └── Model.php │ │ └── view │ │ │ ├── Helper.php │ │ │ ├── HelperKit.php │ │ │ ├── helpers │ │ │ ├── FlashMessenger.php │ │ │ ├── Html.php │ │ │ └── Link.php │ │ │ └── interfaces │ │ │ ├── Helper.php │ │ │ ├── HelperKit.php │ │ │ └── View.php │ └── SqlFormatter.php ├── project │ ├── components │ │ └── app │ │ │ └── Registry.php │ ├── controllers │ │ ├── Exec.php │ │ ├── Index.php │ │ └── Setup.php │ ├── eventHandlers │ │ └── Setup.php │ ├── grids │ │ └── GeneralLog.php │ ├── helpers │ │ └── SqlFormatter.php │ ├── models │ │ ├── ExecDbQuery.php │ │ ├── ExecSql.php │ │ ├── ExecSqlForm.php │ │ ├── ExplainQuery.php │ │ ├── GeneralLogFilter.php │ │ └── SetupMysql.php │ ├── tables │ │ ├── GeneralLog.php │ │ └── MysqlCredentials.php │ └── views │ │ ├── errors │ │ ├── error.php │ │ └── modal.php │ │ ├── exec │ │ ├── explain.php │ │ ├── sql.php │ │ └── sql │ │ │ ├── form.php │ │ │ └── result.php │ │ ├── index │ │ ├── controls.php │ │ ├── grid.php │ │ ├── grid │ │ │ ├── filter.php │ │ │ ├── manageSqlButtons.php │ │ │ ├── pagination.php │ │ │ └── paginationInfo.php │ │ ├── index.php │ │ └── switchOn.php │ │ ├── layout.php │ │ ├── layout │ │ ├── flashMessenger.php │ │ ├── navBar.php │ │ └── pageHeader.php │ │ └── setup │ │ ├── index.php │ │ └── mysqlForm.php └── tests │ ├── KZ │ ├── FlashMessengerTest.php │ ├── LinkTest.php │ ├── ModelTest.php │ ├── RegistryTest.php │ ├── ViewTest.php │ ├── app │ │ ├── FacadeTest.php │ │ ├── KitTest.php │ │ └── RegistryTest.php │ ├── controller │ │ ├── ChainTest.php │ │ ├── FrontTest.php │ │ ├── KitTest.php │ │ ├── RequestTest.php │ │ └── ResponseTest.php │ ├── db │ │ ├── ConnectionStorageTest.php │ │ ├── TableTest.php │ │ └── table │ │ │ └── SQLiteTest.php │ ├── event │ │ ├── EventTest.php │ │ └── ObserverTest.php │ ├── grid │ │ ├── GridTest.php │ │ └── PagerTest.php │ └── view │ │ ├── HelperKitTest.php │ │ └── helpers │ │ └── HtmlTest.php │ ├── bootstrap.php │ ├── phpunit.xml │ └── project │ └── components │ └── app │ └── RegistryTest.php └── runtime └── .gitignore /.docker/php.Dockerfile: -------------------------------------------------------------------------------- 1 | FROM composer/composer:latest-bin as composer 2 | 3 | FROM php:8.4-alpine as php-server-basic 4 | RUN apk add --update --no-cache openssl-dev linux-headers 5 | RUN apk add --no-cache $PHPIZE_DEPS 6 | RUN docker-php-ext-install pdo_mysql 7 | 8 | COPY --from=composer/composer:latest-bin /composer /usr/bin/composer 9 | WORKDIR /var/www/html 10 | 11 | FROM php-server-basic as php-server-dev 12 | 13 | RUN pecl install xdebug && docker-php-ext-enable xdebug 14 | 15 | CMD [ "php", "-S", "0.0.0.0:8080", "-t", "/var/www/html" ] 16 | 17 | FROM php-server-basic as php-server-prod 18 | 19 | #COPY composer.json composer.lock ./ 20 | #RUN composer install 21 | 22 | COPY assets assets 23 | COPY protected protected 24 | COPY index.php index.php 25 | RUN mkdir -p /var/www/html/runtime && chmod -R 0777 /var/www/html/runtime 26 | 27 | CMD [ "php", "-S", "0.0.0.0:8080", "-t", "/var/www/html" ] -------------------------------------------------------------------------------- /.github/workflows/docker-image.yml: -------------------------------------------------------------------------------- 1 | name: Create and publish a Docker image 2 | 3 | on: 4 | push: 5 | branches: ["master"] 6 | 7 | jobs: 8 | build-and-push-image: 9 | runs-on: ubuntu-latest 10 | 11 | permissions: 12 | contents: read 13 | packages: write 14 | 15 | steps: 16 | - name: Checkout repository 17 | uses: actions/checkout@v4 18 | 19 | - name: Login to Docker Hub 20 | uses: docker/login-action@v3 21 | with: 22 | username: ${{ secrets.DOCKERHUB_USERNAME }} 23 | password: ${{ secrets.DOCKERHUB_TOKEN }} 24 | 25 | - name: Set up Docker Buildx 26 | uses: docker/setup-buildx-action@v3 27 | 28 | - name: Build and push Api 29 | uses: docker/build-push-action@v5 30 | with: 31 | platforms: linux/amd64,linux/arm64 32 | context: . 33 | file: ./.docker/php.Dockerfile 34 | target: php-server-prod 35 | push: true 36 | tags: ${{ secrets.DOCKERHUB_USERNAME }}/beaver-mysql-logger:latest 37 | 38 | - name: Docker Hub Description 39 | uses: peter-evans/dockerhub-description@v4 40 | with: 41 | username: ${{ secrets.DOCKERHUB_USERNAME }} 42 | password: ${{ secrets.DOCKERHUB_TOKEN }} 43 | repository: ${{ secrets.DOCKERHUB_USERNAME }}/beaver-mysql-logger 44 | short-description: ${{ github.event.repository.description }} 45 | enable-url-completion: true 46 | 47 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.DS_Store 2 | .idea 3 | /vendor/ 4 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2014 kirill-zhirnov 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Mysql Query Logger - Log all queries for MySQL/MariaDB 2 | 3 | The ultimate tool for: 4 | 5 | - [x] Debugging 6 | - [x] Reverse engineering 7 | - [x] Performance optimization. 8 | 9 | Free, Easy to use and install! 10 | 11 | ![Overall View](/assets/docs/overall_view.png) 12 | 13 | # How to launch with Docker? 14 | 15 | `docker run -p 8181:8080 kirillzh87/beaver-mysql-logger` 16 | 17 | Where `8181` is your local port. Then open [http://localhost:8181](http://localhost:8181) 18 | 19 | MySQL connection could be specified via Web Interface: 20 | 21 | ![Setup Connection](/assets/docs/setup_connection.png) 22 | 23 | ## Supported Variables 24 | 25 | `MYSQL_DSN` - A [PDO DSN](https://www.php.net/manual/en/ref.pdo-mysql.connection.php) for connection. Example: `mysql:host=host.docker.internal;port=32775;dbname=mysql` 26 | 27 | `MYSQL_USERNAME` - Username 28 | 29 | `MYSQL_PASS` - Password 30 | 31 | ## How to launch with Docker Compose 32 | 33 | ``` 34 | services: 35 | mysql-logger: 36 | image: kirillzh87/beaver-mysql-logger 37 | environment: 38 | MYSQL_DSN: "mysql:host=host.docker.internal;port=32775;dbname=mysql" 39 | MYSQL_USERNAME: root 40 | MYSQL_PASS: root 41 | ports: 42 | - "9090:8080" 43 | ``` -------------------------------------------------------------------------------- /assets/compiled/.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kirill-zhirnov/beaver-mysql-logger/dbe3f01e7d7d46d6c7ef772478097a3c2fb177a1/assets/compiled/.gitignore -------------------------------------------------------------------------------- /assets/compiled/fonts/glyphicons-halflings-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kirill-zhirnov/beaver-mysql-logger/dbe3f01e7d7d46d6c7ef772478097a3c2fb177a1/assets/compiled/fonts/glyphicons-halflings-regular.eot -------------------------------------------------------------------------------- /assets/compiled/fonts/glyphicons-halflings-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kirill-zhirnov/beaver-mysql-logger/dbe3f01e7d7d46d6c7ef772478097a3c2fb177a1/assets/compiled/fonts/glyphicons-halflings-regular.ttf -------------------------------------------------------------------------------- /assets/compiled/fonts/glyphicons-halflings-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kirill-zhirnov/beaver-mysql-logger/dbe3f01e7d7d46d6c7ef772478097a3c2fb177a1/assets/compiled/fonts/glyphicons-halflings-regular.woff -------------------------------------------------------------------------------- /assets/docs/overall_view.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kirill-zhirnov/beaver-mysql-logger/dbe3f01e7d7d46d6c7ef772478097a3c2fb177a1/assets/docs/overall_view.png -------------------------------------------------------------------------------- /assets/docs/setup_connection.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kirill-zhirnov/beaver-mysql-logger/dbe3f01e7d7d46d6c7ef772478097a3c2fb177a1/assets/docs/setup_connection.png -------------------------------------------------------------------------------- /assets/src/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules -------------------------------------------------------------------------------- /assets/src/bootstrap/.editorconfig: -------------------------------------------------------------------------------- 1 | # editorconfig.org 2 | 3 | root = true 4 | 5 | [*] 6 | indent_style = space 7 | indent_size = 2 8 | end_of_line = lf 9 | charset = utf-8 10 | trim_trailing_whitespace = true 11 | insert_final_newline = true 12 | 13 | [*.py] 14 | indent_size = 4 15 | -------------------------------------------------------------------------------- /assets/src/bootstrap/.gitattributes: -------------------------------------------------------------------------------- 1 | # Enforce Unix newlines 2 | *.css text eol=lf 3 | *.html text eol=lf 4 | *.js text eol=lf 5 | *.json text eol=lf 6 | *.less text eol=lf 7 | *.md text eol=lf 8 | *.svg text eol=lf 9 | *.yml text eol=lf 10 | -------------------------------------------------------------------------------- /assets/src/bootstrap/.gitignore: -------------------------------------------------------------------------------- 1 | # Ignore docs files 2 | _gh_pages 3 | _site 4 | .ruby-version 5 | 6 | # Numerous always-ignore extensions 7 | *.diff 8 | *.err 9 | *.orig 10 | *.log 11 | *.rej 12 | *.swo 13 | *.swp 14 | *.zip 15 | *.vi 16 | *~ 17 | 18 | # OS or Editor folders 19 | .DS_Store 20 | ._* 21 | Thumbs.db 22 | .cache 23 | .project 24 | .settings 25 | .tmproj 26 | *.esproj 27 | nbproject 28 | *.sublime-project 29 | *.sublime-workspace 30 | .idea 31 | 32 | # Komodo 33 | *.komodoproject 34 | .komodotools 35 | 36 | # grunt-html-validation 37 | validation-status.json 38 | validation-report.json 39 | 40 | # Folders to ignore 41 | node_modules 42 | bower_components 43 | -------------------------------------------------------------------------------- /assets/src/bootstrap/CNAME: -------------------------------------------------------------------------------- 1 | getbootstrap.com 2 | -------------------------------------------------------------------------------- /assets/src/bootstrap/LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2011-2014 Twitter, Inc 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /assets/src/bootstrap/_config.yml: -------------------------------------------------------------------------------- 1 | # Dependencies 2 | markdown: kramdown 3 | highlighter: pygments 4 | 5 | # Permalinks 6 | permalink: pretty 7 | 8 | # Server 9 | source: docs 10 | destination: _gh_pages 11 | host: 0.0.0.0 12 | port: 9001 13 | baseurl: / 14 | url: http://getbootstrap.com 15 | encoding: UTF-8 16 | 17 | # Custom vars 18 | current_version: 3.2.0 19 | repo: https://github.com/twbs/bootstrap 20 | sass_repo: https://github.com/twbs/bootstrap-sass 21 | 22 | download: 23 | source: https://github.com/twbs/bootstrap/archive/v3.2.0.zip 24 | dist: https://github.com/twbs/bootstrap/releases/download/v3.2.0/bootstrap-3.2.0-dist.zip 25 | sass: https://github.com/twbs/bootstrap-sass/archive/v3.2.0.tar.gz 26 | 27 | blog: http://blog.getbootstrap.com 28 | expo: http://expo.getbootstrap.com 29 | 30 | cdn: 31 | css: //maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css 32 | css_theme: //maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap-theme.min.css 33 | js: //maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.min.js 34 | -------------------------------------------------------------------------------- /assets/src/bootstrap/bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "bootstrap", 3 | "description": "The most popular front-end framework for developing responsive, mobile first projects on the web.", 4 | "version": "3.2.0", 5 | "keywords": [ 6 | "css", 7 | "js", 8 | "less", 9 | "mobile-first", 10 | "responsive", 11 | "front-end", 12 | "framework", 13 | "web" 14 | ], 15 | "homepage": "http://getbootstrap.com", 16 | "main": [ 17 | "less/bootstrap.less", 18 | "dist/css/bootstrap.css", 19 | "dist/js/bootstrap.js", 20 | "dist/fonts/glyphicons-halflings-regular.eot", 21 | "dist/fonts/glyphicons-halflings-regular.svg", 22 | "dist/fonts/glyphicons-halflings-regular.ttf", 23 | "dist/fonts/glyphicons-halflings-regular.woff" 24 | ], 25 | "ignore": [ 26 | ".*", 27 | "_config.yml", 28 | "CNAME", 29 | "composer.json", 30 | "CONTRIBUTING.md", 31 | "docs", 32 | "js/tests", 33 | "test-infra" 34 | ], 35 | "dependencies": { 36 | "jquery": ">= 1.9.0" 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /assets/src/bootstrap/composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "twbs/bootstrap", 3 | "description": "The most popular front-end framework for developing responsive, mobile first projects on the web.", 4 | "keywords": [ 5 | "css", 6 | "js", 7 | "less", 8 | "mobile-first", 9 | "responsive", 10 | "front-end", 11 | "framework", 12 | "web" 13 | ], 14 | "homepage": "http://getbootstrap.com", 15 | "authors": [ 16 | { 17 | "name": "Mark Otto", 18 | "email": "markdotto@gmail.com" 19 | }, 20 | { 21 | "name": "Jacob Thornton", 22 | "email": "jacobthornton@gmail.com" 23 | } 24 | ], 25 | "support": { 26 | "issues": "https://github.com/twbs/bootstrap/issues" 27 | }, 28 | "license": "MIT", 29 | "extra": { 30 | "branch-alias": { 31 | "dev-master": "3.2.x-dev" 32 | } 33 | }, 34 | "replace": { 35 | "twitter/bootstrap": "self.version" 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /assets/src/bootstrap/dist/fonts/glyphicons-halflings-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kirill-zhirnov/beaver-mysql-logger/dbe3f01e7d7d46d6c7ef772478097a3c2fb177a1/assets/src/bootstrap/dist/fonts/glyphicons-halflings-regular.eot -------------------------------------------------------------------------------- /assets/src/bootstrap/dist/fonts/glyphicons-halflings-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kirill-zhirnov/beaver-mysql-logger/dbe3f01e7d7d46d6c7ef772478097a3c2fb177a1/assets/src/bootstrap/dist/fonts/glyphicons-halflings-regular.ttf -------------------------------------------------------------------------------- /assets/src/bootstrap/dist/fonts/glyphicons-halflings-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kirill-zhirnov/beaver-mysql-logger/dbe3f01e7d7d46d6c7ef772478097a3c2fb177a1/assets/src/bootstrap/dist/fonts/glyphicons-halflings-regular.woff -------------------------------------------------------------------------------- /assets/src/bootstrap/docs/_data/core-team.yml: -------------------------------------------------------------------------------- 1 | - name: Mark Otto 2 | user: mdo 3 | gravatar: bc4ab438f7a4ce1c406aadc688427f2c 4 | 5 | - name: Jacob Thornton 6 | user: fat 7 | gravatar: a98244cbdacaf1c0b55499466002f7a8 8 | 9 | - name: Chris Rebert 10 | user: cvrebert 11 | gravatar: edec428c425453955f770095a7d26c50 12 | 13 | - name: Julian Thilo 14 | user: juthilo 15 | gravatar: 0f7dd3ce58a416be5685ea6194f82b11 16 | 17 | - name: XhmikosR 18 | user: xhmikosr 19 | gravatar: e37759b1ea0125d4e97b1e00b5eed26f 20 | -------------------------------------------------------------------------------- /assets/src/bootstrap/docs/_data/sass-team.yml: -------------------------------------------------------------------------------- 1 | - name: Thomas McDonald 2 | user: thomas-mcdonald 3 | gravatar: 24cd55ab1a62ffb113ab8c02f64c9301 4 | 5 | - name: Gleb Mazovetskiy 6 | user: glebm 7 | gravatar: 729f685b8e8d7e9feed18c177c82e59b 8 | -------------------------------------------------------------------------------- /assets/src/bootstrap/docs/_data/showcase.yml: -------------------------------------------------------------------------------- 1 | - name: Red Antler 2 | url: http://www.redantler.com/ 3 | expo_url: http://expo.getbootstrap.com/2014/02/24/redantler/ 4 | img: redantler 5 | 6 | - name: Riot Design 7 | url: http://riotdesign.eu/en/ 8 | expo_url: http://expo.getbootstrap.com/2014/03/13/riot-design/ 9 | img: riot 10 | 11 | - name: Newsweek 12 | url: http://www.newsweek.com/ 13 | expo_url: http://expo.getbootstrap.com/2014/02/12/newsweek/ 14 | img: newsweek 15 | 16 | - name: Robinhood 17 | url: https://www.robinhood.com 18 | expo_url: http://expo.getbootstrap.com/2014/02/26/robinhood/ 19 | img: robinhood 20 | -------------------------------------------------------------------------------- /assets/src/bootstrap/docs/_data/translations.yml: -------------------------------------------------------------------------------- 1 | - name: Chinese 2 | code: zh 3 | description: Bootstrap 中文文档 4 | url: http://v3.bootcss.com/ 5 | 6 | - name: French 7 | code: fr 8 | description: Bootstrap en Français 9 | url: http://www.oneskyapp.com/docs/bootstrap/fr 10 | 11 | - name: German 12 | code: de 13 | description: Bootstrap auf Deutsch 14 | url: http://holdirbootstrap.de/ 15 | 16 | - name: Italian 17 | code: it 18 | description: Bootstrap in Italiano 19 | url: http://www.hackerstribe.com/guide/IT-bootstrap-3.1.1/ 20 | 21 | - name: Korean 22 | code: ko 23 | description: Bootstrap 한국어 24 | url: http://bootstrapk.com/BS3/ 25 | 26 | - name: Russian 27 | code: ru 28 | description: Bootstrap по-русски 29 | url: http://www.oneskyapp.com/docs/bootstrap/ru 30 | 31 | - name: Spanish 32 | code: es 33 | description: Bootstrap en Español 34 | url: http://www.oneskyapp.com/docs/bootstrap/es 35 | 36 | - name: Ukrainian 37 | code: uk 38 | description: Bootstrap ua Українською 39 | url: http://twbs.site-konstruktor.com.ua 40 | -------------------------------------------------------------------------------- /assets/src/bootstrap/docs/_includes/ads.html: -------------------------------------------------------------------------------- 1 |
2 | -------------------------------------------------------------------------------- /assets/src/bootstrap/docs/_includes/components/breadcrumbs.html: -------------------------------------------------------------------------------- 1 |
2 |

Breadcrumbs

3 | 4 |

Indicate the current page's location within a navigational hierarchy.

5 |

Separators are automatically added in CSS through :before and content.

6 |
7 | 10 | 14 | 19 |
20 | {% highlight html %} 21 | 26 | {% endhighlight %} 27 |
28 | -------------------------------------------------------------------------------- /assets/src/bootstrap/docs/_includes/components/jumbotron.html: -------------------------------------------------------------------------------- 1 |
2 |

Jumbotron

3 | 4 |

A lightweight, flexible component that can optionally extend the entire viewport to showcase key content on your site.

5 |
6 |
7 |

Hello, world!

8 |

This is a simple hero unit, a simple jumbotron-style component for calling extra attention to featured content or information.

9 |

Learn more

10 |
11 |
12 | {% highlight html %} 13 |
14 |

Hello, world!

15 |

...

16 |

Learn more

17 |
18 | {% endhighlight %} 19 |

To make the jumbotron full width, and without rounded corners, place it outside all .containers and instead add a .container within.

20 | {% highlight html %} 21 |
22 |
23 | ... 24 |
25 |
26 | {% endhighlight %} 27 |
28 | -------------------------------------------------------------------------------- /assets/src/bootstrap/docs/_includes/components/labels.html: -------------------------------------------------------------------------------- 1 |
2 |

Labels

3 | 4 |

Example

5 |
6 |

Example heading New

7 |

Example heading New

8 |

Example heading New

9 |

Example heading New

10 |
Example heading New
11 |
Example heading New
12 |
13 | {% highlight html %} 14 |

Example heading New

15 | {% endhighlight %} 16 | 17 |

Available variations

18 |

Add any of the below mentioned modifier classes to change the appearance of a label.

19 |
20 | Default 21 | Primary 22 | Success 23 | Info 24 | Warning 25 | Danger 26 |
27 | {% highlight html %} 28 | Default 29 | Primary 30 | Success 31 | Info 32 | Warning 33 | Danger 34 | {% endhighlight %} 35 | 36 |
37 |

Have tons of labels?

38 |

Rendering problems can arise when you have dozens of inline labels within a narrow container, each containing its own inline-block element (like an icon). The way around this is setting display: inline-block;. For context and an example, see #13219.

39 |
40 |
41 | -------------------------------------------------------------------------------- /assets/src/bootstrap/docs/_includes/components/page-header.html: -------------------------------------------------------------------------------- 1 |
2 |

Page header

3 | 4 |

A simple shell for an h1 to appropriately space out and segment sections of content on a page. It can utilize the h1's default small element, as well as most other components (with additional styles).

5 |
6 | 9 |
10 | {% highlight html %} 11 | 14 | {% endhighlight %} 15 |
16 | -------------------------------------------------------------------------------- /assets/src/bootstrap/docs/_includes/components/responsive-embed.html: -------------------------------------------------------------------------------- 1 |
2 |

Responsive embed

3 | 4 |

Allow browsers to determine video or slideshow dimensions based on the width of their containing block by creating an intrinsic ratio that will properly scale on any device.

5 |

Rules are directly applied to <iframe>, <embed>, and <object> elements; optionally use an explicit descendant class .embed-responsive-item when you want to match the styling for other attributes.

6 |

Pro-Tip! You don't need to include frameborder="0" in your <iframe>s as we override that for you.

7 |
8 |
9 | 10 |
11 |
12 | {% highlight html %} 13 | 14 |
15 | 16 |
17 | 18 | 19 |
20 | 21 |
22 | {% endhighlight %} 23 |
24 | -------------------------------------------------------------------------------- /assets/src/bootstrap/docs/_includes/components/wells.html: -------------------------------------------------------------------------------- 1 |
2 |

Wells

3 | 4 |

Default well

5 |

Use the well as a simple effect on an element to give it an inset effect.

6 |
7 |
8 | Look, I'm in a well! 9 |
10 |
11 | {% highlight html %} 12 |
...
13 | {% endhighlight %} 14 |

Optional classes

15 |

Control padding and rounded corners with two optional modifier classes.

16 |
17 |
18 | Look, I'm in a large well! 19 |
20 |
21 | {% highlight html %} 22 |
...
23 | {% endhighlight %} 24 | 25 |
26 |
27 | Look, I'm in a small well! 28 |
29 |
30 | {% highlight html %} 31 |
...
32 | {% endhighlight %} 33 |
34 | -------------------------------------------------------------------------------- /assets/src/bootstrap/docs/_includes/css/images.html: -------------------------------------------------------------------------------- 1 |
2 |

Images

3 | 4 |

Responsive images

5 |

Images in Bootstrap 3 can be made responsive-friendly via the addition of the .img-responsive class. This applies max-width: 100%; and height: auto; to the image so that it scales nicely to the parent element.

6 | {% highlight html %} 7 | Responsive image 8 | {% endhighlight %} 9 | 10 |

Image shapes

11 |

Add classes to an <img> element to easily style images in any project.

12 |
13 |

Cross-browser compatibility

14 |

Keep in mind that Internet Explorer 8 lacks support for rounded corners.

15 |
16 |
17 | A generic square placeholder image with rounded corners 18 | A generic square placeholder image where only the portion within the circle circumscribed about said square is visible 19 | A generic square placeholder image with a white border around it, making it resemble a photograph taken with an old instant camera 20 |
21 | {% highlight html %} 22 | ... 23 | ... 24 | ... 25 | {% endhighlight %} 26 |
27 | -------------------------------------------------------------------------------- /assets/src/bootstrap/docs/_includes/getting-started/accessibility.html: -------------------------------------------------------------------------------- 1 |
2 |

Accessibility

3 |

Bootstrap follows common web standards and—with minimal extra effort—can be used to create sites that are accessible to those using AT.

4 | 5 |

Skip navigation

6 |

If your navigation contains many links and comes before the main content in the DOM, add a Skip to main content link immediately after your opening <body> tag. (read why)

7 | {% highlight html %} 8 | 9 | Skip to main content 10 |
11 | The main page content. 12 |
13 | 14 | {% endhighlight %} 15 | 16 |

Nested headings

17 |

When nesting headings (<h1> - <h6>), your primary document header should be an <h1>. Subsequent headings should make logical use of <h2> - <h6> such that screen readers can construct a table of contents for your pages.

18 |

Learn more at HTML CodeSniffer and Penn State's AccessAbility.

19 | 20 |

Additional resources

21 | 26 |
27 | -------------------------------------------------------------------------------- /assets/src/bootstrap/docs/_includes/getting-started/community.html: -------------------------------------------------------------------------------- 1 |
2 |

Community

3 | 4 |

Stay up to date on the development of Bootstrap and reach out to the community with these helpful resources.

5 | 11 |

You can also follow @twbootstrap on Twitter for the latest gossip and awesome music videos.

12 |
13 | -------------------------------------------------------------------------------- /assets/src/bootstrap/docs/_includes/getting-started/disabling-responsiveness.html: -------------------------------------------------------------------------------- 1 |
2 |

Disabling responsiveness

3 | 4 |

Bootstrap automatically adapts your pages for various screen sizes. 5 | Here's how to disable this feature so your page works like in this non-responsive example.

6 | 7 |

Steps to disable page responsiveness

8 |
    9 |
  1. Omit the viewport <meta> mentioned in the CSS docs
  2. 10 |
  3. Override the width on the .container for each grid tier with a single width, for example width: 970px !important; Be sure that this comes after the default Bootstrap CSS. You can optionally avoid the !important with media queries or some selector-fu.
  4. 11 |
  5. If using navbars, remove all navbar collapsing and expanding behavior.
  6. 12 |
  7. For grid layouts, use .col-xs-* classes in addition to, or in place of, the medium/large ones. Don't worry, the extra-small device grid scales to all resolutions.
  8. 13 |
14 |

You'll still need Respond.js for IE8 (since our media queries are still there and need to be processed). 15 | This disables the "mobile site" aspects of Bootstrap.

16 | 17 |

Bootstrap template with responsiveness disabled

18 |

We've applied these steps to an example. Read its source code to see the specific changes implemented.

19 |

20 | View non-responsive example 21 |

22 |
23 | -------------------------------------------------------------------------------- /assets/src/bootstrap/docs/_includes/getting-started/license.html: -------------------------------------------------------------------------------- 1 |
2 |

License FAQs

3 |

Bootstrap is released under the MIT license and is copyright {{ site.time | date: "%Y" }} Twitter. Boiled down to smaller chunks, it can be described with the following conditions.

4 | 5 |

It requires you to:

6 | 9 | 10 |

It permits you to:

11 | 17 | 18 |

It forbids you to:

19 | 26 | 27 |

It does not require you to:

28 | 32 | 33 |

The full Bootstrap license is located in the project repository for more information.

34 |
35 | -------------------------------------------------------------------------------- /assets/src/bootstrap/docs/_includes/getting-started/template.html: -------------------------------------------------------------------------------- 1 |
2 |

Basic template

3 | 4 |

Start with this basic HTML template, or modify these examples. We hope you'll customize our templates and examples, adapting them to suit your needs.

5 | 6 |

Copy the HTML below to begin working with a minimal Bootstrap document.

7 | {% highlight html %} 8 | 9 | 10 | 11 | 12 | 13 | 14 | Bootstrap 101 Template 15 | 16 | 17 | 18 | 19 | 20 | 21 | 25 | 26 | 27 |

Hello, world!

28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | {% endhighlight %} 36 |
37 | -------------------------------------------------------------------------------- /assets/src/bootstrap/docs/_includes/getting-started/third-party-support.html: -------------------------------------------------------------------------------- 1 |
2 |

Third party support

3 |

While we don't officially support any third party plugins or add-ons, we do offer some useful advice to help avoid potential issues in your projects.

4 | 5 |

Box-sizing

6 |

Some third party software, including Google Maps and Google Custom Search Engine, conflict with Bootstrap due to * { box-sizing: border-box; }, a rule which makes it so padding does not affect the final computed width of an element. Learn more about box model and sizing at CSS Tricks.

7 |

Depending on the context, you may override as-needed (Option 1) or reset the box-sizing for entire regions (Option 2).

8 | {% highlight scss %} 9 | /* Box-sizing resets 10 | * 11 | * Reset individual elements or override regions to avoid conflicts due to 12 | * global box model settings of Bootstrap. Two options, individual overrides and 13 | * region resets, are available as plain CSS and uncompiled Less formats. 14 | */ 15 | 16 | /* Option 1A: Override a single element's box model via CSS */ 17 | .element { 18 | -webkit-box-sizing: content-box; 19 | -moz-box-sizing: content-box; 20 | box-sizing: content-box; 21 | } 22 | 23 | /* Option 1B: Override a single element's box model by using a Bootstrap Less mixin */ 24 | .element { 25 | .box-sizing(content-box); 26 | } 27 | 28 | /* Option 2A: Reset an entire region via CSS */ 29 | .reset-box-sizing, 30 | .reset-box-sizing *, 31 | .reset-box-sizing *:before, 32 | .reset-box-sizing *:after { 33 | -webkit-box-sizing: content-box; 34 | -moz-box-sizing: content-box; 35 | box-sizing: content-box; 36 | } 37 | 38 | /* Option 2B: Reset an entire region with a custom Less mixin */ 39 | .reset-box-sizing { 40 | &, 41 | *, 42 | *:before, 43 | *:after { 44 | .box-sizing(content-box); 45 | } 46 | } 47 | .element { 48 | .reset-box-sizing(); 49 | } 50 | {% endhighlight %} 51 |
52 | -------------------------------------------------------------------------------- /assets/src/bootstrap/docs/_includes/getting-started/translations.html: -------------------------------------------------------------------------------- 1 |
2 |

Translations

3 | 4 |

Community members have translated Bootstrap's documentation into various languages. None are officially supported and they may not always be up to date.

5 | 10 |

We don't help organize or host translations, we just link to them.

11 |

Finished a new or better translation? Open a pull request to add it to our list.

12 |
13 | -------------------------------------------------------------------------------- /assets/src/bootstrap/docs/_includes/js/transitions.html: -------------------------------------------------------------------------------- 1 |
2 |

Transitions transition.js

3 | 4 |

About transitions

5 |

For simple transition effects, include transition.js once alongside the other JS files. If you're using the compiled (or minified) bootstrap.js, there is no need to include this—it's already there.

6 |

What's inside

7 |

Transition.js is a basic helper for transitionEnd events as well as a CSS transition emulator. It's used by the other plugins to check for CSS transition support and to catch hanging transitions.

8 |
9 | -------------------------------------------------------------------------------- /assets/src/bootstrap/docs/_includes/nav/about.html: -------------------------------------------------------------------------------- 1 |
  • 2 | History 3 |
  • 4 |
  • 5 | Team 6 |
  • 7 |
  • 8 | Brand guidelines 9 |
  • 10 | -------------------------------------------------------------------------------- /assets/src/bootstrap/docs/_includes/nav/main.html: -------------------------------------------------------------------------------- 1 | 37 | -------------------------------------------------------------------------------- /assets/src/bootstrap/docs/_includes/nav/migration.html: -------------------------------------------------------------------------------- 1 |
  • 2 | Major class changes 3 |
  • 4 |
  • 5 | What's new 6 |
  • 7 |
  • 8 | What's removed 9 |
  • 10 |
  • 11 | Additional notes 12 |
  • 13 | -------------------------------------------------------------------------------- /assets/src/bootstrap/docs/_includes/social-buttons.html: -------------------------------------------------------------------------------- 1 |
    2 | 16 |
    17 | -------------------------------------------------------------------------------- /assets/src/bootstrap/docs/_jade/customizer-nav.jade: -------------------------------------------------------------------------------- 1 | // NOTE: DO NOT EDIT THE FOLLOWING SECTION DIRECTLY! It is autogenerated via the `build-customizer-html` Grunt task using the customizer-nav.jade template. 2 | li 3 | a(href='#less') Less components 4 | li 5 | a(href='#plugins') jQuery plugins 6 | li 7 | a(href='#less-variables') Less variables 8 | ul.nav 9 | each section in sections 10 | if section.customizable 11 | li 12 | a(href='#'+section.id)= section.heading 13 | li 14 | a(href='#download') Download 15 | // NOTE: DO NOT EDIT THE PRECEDING SECTION DIRECTLY! It is autogenerated via the `build-customizer-html` Grunt task using the customizer-nav.jade template. 16 | -------------------------------------------------------------------------------- /assets/src/bootstrap/docs/_jade/customizer-variables.jade: -------------------------------------------------------------------------------- 1 | // NOTE: DO NOT EDIT THE FOLLOWING SECTION DIRECTLY! It is autogenerated via the `build-customizer-html` Grunt task using the customizer-variables.jade template. 2 | each section in sections 3 | if section.customizable 4 | h2(id=section.id)= section.heading 5 | if section.docstring 6 | p!= section.docstring.html 7 | each subsection in section.subsections 8 | if subsection.heading 9 | h3(id=subsection.id)= subsection.heading 10 | div.row 11 | each variable in subsection.variables 12 | div.bs-customizer-input 13 | label(for="input-" + variable.name)= variable.name 14 | input.form-control( 15 | id="input-" + variable.name 16 | type="text" 17 | value=variable.defaultValue 18 | data-var=variable.name) 19 | if variable.docstring 20 | p.help-block!= variable.docstring.html 21 | // NOTE: DO NOT EDIT THE PRECEDING SECTION DIRECTLY! It is autogenerated via the `build-customizer-html` Grunt task using the customizer-variables.jade template. 22 | -------------------------------------------------------------------------------- /assets/src/bootstrap/docs/_layouts/home.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | {% include header.html %} 6 | 7 | 8 | Skip to main content 9 | 10 | 11 | {% include nav/main.html %} 12 | 13 | 14 | {{ content }} 15 | 16 | {% include footer.html %} 17 | 18 | 19 | -------------------------------------------------------------------------------- /assets/src/bootstrap/docs/apple-touch-icon-precomposed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kirill-zhirnov/beaver-mysql-logger/dbe3f01e7d7d46d6c7ef772478097a3c2fb177a1/assets/src/bootstrap/docs/apple-touch-icon-precomposed.png -------------------------------------------------------------------------------- /assets/src/bootstrap/docs/assets/brand/bootstrap-outline.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 8 | 11 | 12 | 13 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /assets/src/bootstrap/docs/assets/brand/bootstrap-punchout.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 8 | 10 | 12 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /assets/src/bootstrap/docs/assets/brand/bootstrap-solid.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 9 | 10 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /assets/src/bootstrap/docs/assets/flash/ZeroClipboard.swf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kirill-zhirnov/beaver-mysql-logger/dbe3f01e7d7d46d6c7ef772478097a3c2fb177a1/assets/src/bootstrap/docs/assets/flash/ZeroClipboard.swf -------------------------------------------------------------------------------- /assets/src/bootstrap/docs/assets/img/components.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kirill-zhirnov/beaver-mysql-logger/dbe3f01e7d7d46d6c7ef772478097a3c2fb177a1/assets/src/bootstrap/docs/assets/img/components.png -------------------------------------------------------------------------------- /assets/src/bootstrap/docs/assets/img/devices.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kirill-zhirnov/beaver-mysql-logger/dbe3f01e7d7d46d6c7ef772478097a3c2fb177a1/assets/src/bootstrap/docs/assets/img/devices.png -------------------------------------------------------------------------------- /assets/src/bootstrap/docs/assets/img/sass-less.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kirill-zhirnov/beaver-mysql-logger/dbe3f01e7d7d46d6c7ef772478097a3c2fb177a1/assets/src/bootstrap/docs/assets/img/sass-less.png -------------------------------------------------------------------------------- /assets/src/bootstrap/docs/assets/js/ie10-viewport-bug-workaround.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * IE10 viewport hack for Surface/desktop Windows 8 bug 3 | * Copyright 2014 Twitter, Inc. 4 | * Licensed under the Creative Commons Attribution 3.0 Unported License. For 5 | * details, see http://creativecommons.org/licenses/by/3.0/. 6 | */ 7 | 8 | // See the Getting Started docs for more information: 9 | // http://getbootstrap.com/getting-started/#support-ie10-width 10 | 11 | (function () { 12 | 'use strict'; 13 | if (navigator.userAgent.match(/IEMobile\/10\.0/)) { 14 | var msViewportStyle = document.createElement('style') 15 | msViewportStyle.appendChild( 16 | document.createTextNode( 17 | '@-ms-viewport{width:auto!important}' 18 | ) 19 | ) 20 | document.querySelector('head').appendChild(msViewportStyle) 21 | } 22 | })(); 23 | -------------------------------------------------------------------------------- /assets/src/bootstrap/docs/assets/js/ie8-responsive-file-warning.js: -------------------------------------------------------------------------------- 1 | // NOTICE!! DO NOT USE ANY OF THIS JAVASCRIPT 2 | // IT'S JUST JUNK FOR OUR DOCS! 3 | // ++++++++++++++++++++++++++++++++++++++++++ 4 | /*! 5 | * Copyright 2011-2014 Twitter, Inc. 6 | * 7 | * Licensed under the Creative Commons Attribution 3.0 Unported License. For 8 | * details, see http://creativecommons.org/licenses/by/3.0/. 9 | */ 10 | // Intended to prevent false-positive bug reports about responsive styling supposedly not working in IE8. 11 | if (window.location.protocol == 'file:') { 12 | window.alert('ERROR: Bootstrap\'s responsive CSS is disabled!\nSee getbootstrap.com/getting-started/#respond-file-proto for details.') 13 | } 14 | -------------------------------------------------------------------------------- /assets/src/bootstrap/docs/components.html: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | title: Components 4 | slug: components 5 | lead: "Over a dozen reusable components built to provide iconography, dropdowns, input groups, navigation, alerts, and much more." 6 | --- 7 | 8 | {% include components/glyphicons.html %} 9 | {% include components/dropdowns.html %} 10 | {% include components/button-groups.html %} 11 | {% include components/button-dropdowns.html %} 12 | {% include components/input-groups.html %} 13 | {% include components/navs.html %} 14 | {% include components/navbar.html %} 15 | {% include components/breadcrumbs.html %} 16 | {% include components/pagination.html %} 17 | {% include components/labels.html %} 18 | {% include components/badges.html %} 19 | {% include components/jumbotron.html %} 20 | {% include components/page-header.html %} 21 | {% include components/thumbnails.html %} 22 | {% include components/alerts.html %} 23 | {% include components/progress-bars.html %} 24 | {% include components/media.html %} 25 | {% include components/list-group.html %} 26 | {% include components/panels.html %} 27 | {% include components/responsive-embed.html %} 28 | {% include components/wells.html %} 29 | -------------------------------------------------------------------------------- /assets/src/bootstrap/docs/css.html: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | title: CSS 4 | slug: css 5 | lead: "Global CSS settings, fundamental HTML elements styled and enhanced with extensible classes, and an advanced grid system." 6 | --- 7 | 8 | {% include css/overview.html %} 9 | {% include css/grid.html %} 10 | {% include css/type.html %} 11 | {% include css/code.html %} 12 | {% include css/tables.html %} 13 | {% include css/forms.html %} 14 | {% include css/buttons.html %} 15 | {% include css/images.html %} 16 | {% include css/helpers.html %} 17 | {% include css/responsive-utilities.html %} 18 | {% include css/less.html %} 19 | {% include css/sass.html %} 20 | -------------------------------------------------------------------------------- /assets/src/bootstrap/docs/dist/fonts/glyphicons-halflings-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kirill-zhirnov/beaver-mysql-logger/dbe3f01e7d7d46d6c7ef772478097a3c2fb177a1/assets/src/bootstrap/docs/dist/fonts/glyphicons-halflings-regular.eot -------------------------------------------------------------------------------- /assets/src/bootstrap/docs/dist/fonts/glyphicons-halflings-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kirill-zhirnov/beaver-mysql-logger/dbe3f01e7d7d46d6c7ef772478097a3c2fb177a1/assets/src/bootstrap/docs/dist/fonts/glyphicons-halflings-regular.ttf -------------------------------------------------------------------------------- /assets/src/bootstrap/docs/dist/fonts/glyphicons-halflings-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kirill-zhirnov/beaver-mysql-logger/dbe3f01e7d7d46d6c7ef772478097a3c2fb177a1/assets/src/bootstrap/docs/dist/fonts/glyphicons-halflings-regular.woff -------------------------------------------------------------------------------- /assets/src/bootstrap/docs/examples/grid/grid.css: -------------------------------------------------------------------------------- 1 | h4 { 2 | margin-top: 25px; 3 | } 4 | .row { 5 | margin-bottom: 20px; 6 | } 7 | .row .row { 8 | margin-top: 10px; 9 | margin-bottom: 0; 10 | } 11 | [class*="col-"] { 12 | padding-top: 15px; 13 | padding-bottom: 15px; 14 | background-color: #eee; 15 | background-color: rgba(86,61,124,.15); 16 | border: 1px solid #ddd; 17 | border: 1px solid rgba(86,61,124,.2); 18 | } 19 | 20 | hr { 21 | margin-top: 40px; 22 | margin-bottom: 40px; 23 | } 24 | -------------------------------------------------------------------------------- /assets/src/bootstrap/docs/examples/jumbotron-narrow/jumbotron-narrow.css: -------------------------------------------------------------------------------- 1 | /* Space out content a bit */ 2 | body { 3 | padding-top: 20px; 4 | padding-bottom: 20px; 5 | } 6 | 7 | /* Everything but the jumbotron gets side spacing for mobile first views */ 8 | .header, 9 | .marketing, 10 | .footer { 11 | padding-right: 15px; 12 | padding-left: 15px; 13 | } 14 | 15 | /* Custom page header */ 16 | .header { 17 | border-bottom: 1px solid #e5e5e5; 18 | } 19 | /* Make the masthead heading the same height as the navigation */ 20 | .header h3 { 21 | padding-bottom: 19px; 22 | margin-top: 0; 23 | margin-bottom: 0; 24 | line-height: 40px; 25 | } 26 | 27 | /* Custom page footer */ 28 | .footer { 29 | padding-top: 19px; 30 | color: #777; 31 | border-top: 1px solid #e5e5e5; 32 | } 33 | 34 | /* Customize container */ 35 | @media (min-width: 768px) { 36 | .container { 37 | max-width: 730px; 38 | } 39 | } 40 | .container-narrow > hr { 41 | margin: 30px 0; 42 | } 43 | 44 | /* Main marketing message and sign up button */ 45 | .jumbotron { 46 | text-align: center; 47 | border-bottom: 1px solid #e5e5e5; 48 | } 49 | .jumbotron .btn { 50 | padding: 14px 24px; 51 | font-size: 21px; 52 | } 53 | 54 | /* Supporting marketing content */ 55 | .marketing { 56 | margin: 40px 0; 57 | } 58 | .marketing p + h4 { 59 | margin-top: 28px; 60 | } 61 | 62 | /* Responsive: Portrait tablets and up */ 63 | @media screen and (min-width: 768px) { 64 | /* Remove the padding we set earlier */ 65 | .header, 66 | .marketing, 67 | .footer { 68 | padding-right: 0; 69 | padding-left: 0; 70 | } 71 | /* Space out the masthead */ 72 | .header { 73 | margin-bottom: 30px; 74 | } 75 | /* Remove the bottom border on the jumbotron for visual effect */ 76 | .jumbotron { 77 | border-bottom: 0; 78 | } 79 | } 80 | -------------------------------------------------------------------------------- /assets/src/bootstrap/docs/examples/jumbotron/jumbotron.css: -------------------------------------------------------------------------------- 1 | /* Move down content because we have a fixed navbar that is 50px tall */ 2 | body { 3 | padding-top: 50px; 4 | padding-bottom: 20px; 5 | } 6 | -------------------------------------------------------------------------------- /assets/src/bootstrap/docs/examples/navbar-fixed-top/navbar-fixed-top.css: -------------------------------------------------------------------------------- 1 | body { 2 | min-height: 2000px; 3 | padding-top: 70px; 4 | } 5 | -------------------------------------------------------------------------------- /assets/src/bootstrap/docs/examples/navbar-static-top/navbar-static-top.css: -------------------------------------------------------------------------------- 1 | body { 2 | min-height: 2000px; 3 | } 4 | 5 | .navbar-static-top { 6 | margin-bottom: 19px; 7 | } 8 | -------------------------------------------------------------------------------- /assets/src/bootstrap/docs/examples/navbar/navbar.css: -------------------------------------------------------------------------------- 1 | body { 2 | padding-top: 20px; 3 | padding-bottom: 20px; 4 | } 5 | 6 | .navbar { 7 | margin-bottom: 20px; 8 | } 9 | -------------------------------------------------------------------------------- /assets/src/bootstrap/docs/examples/offcanvas/offcanvas.css: -------------------------------------------------------------------------------- 1 | /* 2 | * Style tweaks 3 | * -------------------------------------------------- 4 | */ 5 | html, 6 | body { 7 | overflow-x: hidden; /* Prevent scroll on narrow devices */ 8 | } 9 | body { 10 | padding-top: 70px; 11 | } 12 | footer { 13 | padding: 30px 0; 14 | } 15 | 16 | /* 17 | * Off Canvas 18 | * -------------------------------------------------- 19 | */ 20 | @media screen and (max-width: 767px) { 21 | .row-offcanvas { 22 | position: relative; 23 | -webkit-transition: all .25s ease-out; 24 | -o-transition: all .25s ease-out; 25 | transition: all .25s ease-out; 26 | } 27 | 28 | .row-offcanvas-right { 29 | right: 0; 30 | } 31 | 32 | .row-offcanvas-left { 33 | left: 0; 34 | } 35 | 36 | .row-offcanvas-right 37 | .sidebar-offcanvas { 38 | right: -50%; /* 6 columns */ 39 | } 40 | 41 | .row-offcanvas-left 42 | .sidebar-offcanvas { 43 | left: -50%; /* 6 columns */ 44 | } 45 | 46 | .row-offcanvas-right.active { 47 | right: 50%; /* 6 columns */ 48 | } 49 | 50 | .row-offcanvas-left.active { 51 | left: 50%; /* 6 columns */ 52 | } 53 | 54 | .sidebar-offcanvas { 55 | position: absolute; 56 | top: 0; 57 | width: 50%; /* 6 columns */ 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /assets/src/bootstrap/docs/examples/offcanvas/offcanvas.js: -------------------------------------------------------------------------------- 1 | $(document).ready(function () { 2 | $('[data-toggle="offcanvas"]').click(function () { 3 | $('.row-offcanvas').toggleClass('active') 4 | }); 5 | }); -------------------------------------------------------------------------------- /assets/src/bootstrap/docs/examples/screenshots/blog.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kirill-zhirnov/beaver-mysql-logger/dbe3f01e7d7d46d6c7ef772478097a3c2fb177a1/assets/src/bootstrap/docs/examples/screenshots/blog.jpg -------------------------------------------------------------------------------- /assets/src/bootstrap/docs/examples/screenshots/carousel.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kirill-zhirnov/beaver-mysql-logger/dbe3f01e7d7d46d6c7ef772478097a3c2fb177a1/assets/src/bootstrap/docs/examples/screenshots/carousel.jpg -------------------------------------------------------------------------------- /assets/src/bootstrap/docs/examples/screenshots/cover.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kirill-zhirnov/beaver-mysql-logger/dbe3f01e7d7d46d6c7ef772478097a3c2fb177a1/assets/src/bootstrap/docs/examples/screenshots/cover.jpg -------------------------------------------------------------------------------- /assets/src/bootstrap/docs/examples/screenshots/dashboard.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kirill-zhirnov/beaver-mysql-logger/dbe3f01e7d7d46d6c7ef772478097a3c2fb177a1/assets/src/bootstrap/docs/examples/screenshots/dashboard.jpg -------------------------------------------------------------------------------- /assets/src/bootstrap/docs/examples/screenshots/equal-height-columns.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kirill-zhirnov/beaver-mysql-logger/dbe3f01e7d7d46d6c7ef772478097a3c2fb177a1/assets/src/bootstrap/docs/examples/screenshots/equal-height-columns.jpg -------------------------------------------------------------------------------- /assets/src/bootstrap/docs/examples/screenshots/grid.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kirill-zhirnov/beaver-mysql-logger/dbe3f01e7d7d46d6c7ef772478097a3c2fb177a1/assets/src/bootstrap/docs/examples/screenshots/grid.jpg -------------------------------------------------------------------------------- /assets/src/bootstrap/docs/examples/screenshots/jumbotron-narrow.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kirill-zhirnov/beaver-mysql-logger/dbe3f01e7d7d46d6c7ef772478097a3c2fb177a1/assets/src/bootstrap/docs/examples/screenshots/jumbotron-narrow.jpg -------------------------------------------------------------------------------- /assets/src/bootstrap/docs/examples/screenshots/jumbotron.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kirill-zhirnov/beaver-mysql-logger/dbe3f01e7d7d46d6c7ef772478097a3c2fb177a1/assets/src/bootstrap/docs/examples/screenshots/jumbotron.jpg -------------------------------------------------------------------------------- /assets/src/bootstrap/docs/examples/screenshots/justified-nav.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kirill-zhirnov/beaver-mysql-logger/dbe3f01e7d7d46d6c7ef772478097a3c2fb177a1/assets/src/bootstrap/docs/examples/screenshots/justified-nav.jpg -------------------------------------------------------------------------------- /assets/src/bootstrap/docs/examples/screenshots/navbar-fixed.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kirill-zhirnov/beaver-mysql-logger/dbe3f01e7d7d46d6c7ef772478097a3c2fb177a1/assets/src/bootstrap/docs/examples/screenshots/navbar-fixed.jpg -------------------------------------------------------------------------------- /assets/src/bootstrap/docs/examples/screenshots/navbar-static.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kirill-zhirnov/beaver-mysql-logger/dbe3f01e7d7d46d6c7ef772478097a3c2fb177a1/assets/src/bootstrap/docs/examples/screenshots/navbar-static.jpg -------------------------------------------------------------------------------- /assets/src/bootstrap/docs/examples/screenshots/navbar.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kirill-zhirnov/beaver-mysql-logger/dbe3f01e7d7d46d6c7ef772478097a3c2fb177a1/assets/src/bootstrap/docs/examples/screenshots/navbar.jpg -------------------------------------------------------------------------------- /assets/src/bootstrap/docs/examples/screenshots/non-responsive.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kirill-zhirnov/beaver-mysql-logger/dbe3f01e7d7d46d6c7ef772478097a3c2fb177a1/assets/src/bootstrap/docs/examples/screenshots/non-responsive.jpg -------------------------------------------------------------------------------- /assets/src/bootstrap/docs/examples/screenshots/offcanvas.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kirill-zhirnov/beaver-mysql-logger/dbe3f01e7d7d46d6c7ef772478097a3c2fb177a1/assets/src/bootstrap/docs/examples/screenshots/offcanvas.jpg -------------------------------------------------------------------------------- /assets/src/bootstrap/docs/examples/screenshots/sign-in.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kirill-zhirnov/beaver-mysql-logger/dbe3f01e7d7d46d6c7ef772478097a3c2fb177a1/assets/src/bootstrap/docs/examples/screenshots/sign-in.jpg -------------------------------------------------------------------------------- /assets/src/bootstrap/docs/examples/screenshots/starter-template.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kirill-zhirnov/beaver-mysql-logger/dbe3f01e7d7d46d6c7ef772478097a3c2fb177a1/assets/src/bootstrap/docs/examples/screenshots/starter-template.jpg -------------------------------------------------------------------------------- /assets/src/bootstrap/docs/examples/screenshots/sticky-footer-navbar.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kirill-zhirnov/beaver-mysql-logger/dbe3f01e7d7d46d6c7ef772478097a3c2fb177a1/assets/src/bootstrap/docs/examples/screenshots/sticky-footer-navbar.jpg -------------------------------------------------------------------------------- /assets/src/bootstrap/docs/examples/screenshots/sticky-footer.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kirill-zhirnov/beaver-mysql-logger/dbe3f01e7d7d46d6c7ef772478097a3c2fb177a1/assets/src/bootstrap/docs/examples/screenshots/sticky-footer.jpg -------------------------------------------------------------------------------- /assets/src/bootstrap/docs/examples/screenshots/theme.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kirill-zhirnov/beaver-mysql-logger/dbe3f01e7d7d46d6c7ef772478097a3c2fb177a1/assets/src/bootstrap/docs/examples/screenshots/theme.jpg -------------------------------------------------------------------------------- /assets/src/bootstrap/docs/examples/signin/signin.css: -------------------------------------------------------------------------------- 1 | body { 2 | padding-top: 40px; 3 | padding-bottom: 40px; 4 | background-color: #eee; 5 | } 6 | 7 | .form-signin { 8 | max-width: 330px; 9 | padding: 15px; 10 | margin: 0 auto; 11 | } 12 | .form-signin .form-signin-heading, 13 | .form-signin .checkbox { 14 | margin-bottom: 10px; 15 | } 16 | .form-signin .checkbox { 17 | font-weight: normal; 18 | } 19 | .form-signin .form-control { 20 | position: relative; 21 | height: auto; 22 | -webkit-box-sizing: border-box; 23 | -moz-box-sizing: border-box; 24 | box-sizing: border-box; 25 | padding: 10px; 26 | font-size: 16px; 27 | } 28 | .form-signin .form-control:focus { 29 | z-index: 2; 30 | } 31 | .form-signin input[type="email"] { 32 | margin-bottom: -1px; 33 | border-bottom-right-radius: 0; 34 | border-bottom-left-radius: 0; 35 | } 36 | .form-signin input[type="password"] { 37 | margin-bottom: 10px; 38 | border-top-left-radius: 0; 39 | border-top-right-radius: 0; 40 | } 41 | -------------------------------------------------------------------------------- /assets/src/bootstrap/docs/examples/starter-template/starter-template.css: -------------------------------------------------------------------------------- 1 | body { 2 | padding-top: 50px; 3 | } 4 | .starter-template { 5 | padding: 40px 15px; 6 | text-align: center; 7 | } 8 | -------------------------------------------------------------------------------- /assets/src/bootstrap/docs/examples/sticky-footer-navbar/sticky-footer-navbar.css: -------------------------------------------------------------------------------- 1 | /* Sticky footer styles 2 | -------------------------------------------------- */ 3 | html { 4 | position: relative; 5 | min-height: 100%; 6 | } 7 | body { 8 | /* Margin bottom by footer height */ 9 | margin-bottom: 60px; 10 | } 11 | .footer { 12 | position: absolute; 13 | bottom: 0; 14 | width: 100%; 15 | /* Set the fixed height of the footer here */ 16 | height: 60px; 17 | background-color: #f5f5f5; 18 | } 19 | 20 | 21 | /* Custom page CSS 22 | -------------------------------------------------- */ 23 | /* Not required for template or sticky footer method. */ 24 | 25 | body > .container { 26 | padding: 60px 15px 0; 27 | } 28 | .container .text-muted { 29 | margin: 20px 0; 30 | } 31 | 32 | .footer > .container { 33 | padding-right: 15px; 34 | padding-left: 15px; 35 | } 36 | 37 | code { 38 | font-size: 80%; 39 | } 40 | -------------------------------------------------------------------------------- /assets/src/bootstrap/docs/examples/sticky-footer/sticky-footer.css: -------------------------------------------------------------------------------- 1 | /* Sticky footer styles 2 | -------------------------------------------------- */ 3 | html { 4 | position: relative; 5 | min-height: 100%; 6 | } 7 | body { 8 | /* Margin bottom by footer height */ 9 | margin-bottom: 60px; 10 | } 11 | .footer { 12 | position: absolute; 13 | bottom: 0; 14 | width: 100%; 15 | /* Set the fixed height of the footer here */ 16 | height: 60px; 17 | background-color: #f5f5f5; 18 | } 19 | 20 | 21 | /* Custom page CSS 22 | -------------------------------------------------- */ 23 | /* Not required for template or sticky footer method. */ 24 | 25 | .container { 26 | width: auto; 27 | max-width: 680px; 28 | padding: 0 15px; 29 | } 30 | .container .text-muted { 31 | margin: 20px 0; 32 | } 33 | -------------------------------------------------------------------------------- /assets/src/bootstrap/docs/examples/theme/theme.css: -------------------------------------------------------------------------------- 1 | body { 2 | padding-top: 70px; 3 | padding-bottom: 30px; 4 | } 5 | 6 | .theme-dropdown .dropdown-menu { 7 | position: static; 8 | display: block; 9 | margin-bottom: 20px; 10 | } 11 | 12 | .theme-showcase > p > .btn { 13 | margin: 5px 0; 14 | } 15 | 16 | .theme-showcase .navbar .container { 17 | width: auto; 18 | } 19 | -------------------------------------------------------------------------------- /assets/src/bootstrap/docs/examples/tooltip-viewport/tooltip-viewport.css: -------------------------------------------------------------------------------- 1 | body { 2 | height: 1200px; 3 | } 4 | .tooltip { 5 | min-width: 250px; 6 | max-width: 500px; 7 | } 8 | .tooltip .tooltip-inner { 9 | min-width: 250px; 10 | max-width: 500px; 11 | min-height: 100px; 12 | text-align: left; 13 | } 14 | .container-viewport { 15 | position: absolute; 16 | top: 100px; 17 | right: 250px; 18 | left: 250px; 19 | height: 300px; 20 | background-color: #eee; 21 | } 22 | .btn-bottom { 23 | position: absolute; 24 | bottom: 0; 25 | left: 0; 26 | } 27 | -------------------------------------------------------------------------------- /assets/src/bootstrap/docs/examples/tooltip-viewport/tooltip-viewport.js: -------------------------------------------------------------------------------- 1 | $(document).ready(function () { 2 | $('.tooltip-right').tooltip({ 3 | placement: 'right', 4 | viewport: {selector: 'body', padding: 2} 5 | }) 6 | $('.tooltip-bottom').tooltip({ 7 | placement: 'bottom', 8 | viewport: {selector: 'body', padding: 2} 9 | }) 10 | $('.tooltip-viewport-right').tooltip({ 11 | placement: 'right', 12 | viewport: {selector: '.container-viewport', padding: 2} 13 | }) 14 | $('.tooltip-viewport-bottom').tooltip({ 15 | placement: 'bottom', 16 | viewport: {selector: '.container-viewport', padding: 2} 17 | }) 18 | }) 19 | -------------------------------------------------------------------------------- /assets/src/bootstrap/docs/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kirill-zhirnov/beaver-mysql-logger/dbe3f01e7d7d46d6c7ef772478097a3c2fb177a1/assets/src/bootstrap/docs/favicon.ico -------------------------------------------------------------------------------- /assets/src/bootstrap/docs/getting-started.html: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | title: Getting started 4 | slug: getting-started 5 | lead: "An overview of Bootstrap, how to download and use, basic templates and examples, and more." 6 | --- 7 | 8 | {% include getting-started/download.html %} 9 | {% include getting-started/whats-included.html %} 10 | {% include getting-started/grunt.html %} 11 | {% include getting-started/template.html %} 12 | {% include getting-started/examples.html %} 13 | {% include getting-started/community.html %} 14 | {% include getting-started/disabling-responsiveness.html %} 15 | 16 | 17 |
    18 |

    Migrating from v2.x to v3.x

    19 |

    Looking to migrate from an older version of Bootstrap to v3.x? Check out our migration guide.

    20 |
    21 | 22 | {% include getting-started/browser-device-support.html %} 23 | {% include getting-started/third-party-support.html %} 24 | {% include getting-started/accessibility.html %} 25 | {% include getting-started/license.html %} 26 | {% include getting-started/translations.html %} 27 | -------------------------------------------------------------------------------- /assets/src/bootstrap/docs/javascript.html: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | title: JavaScript 4 | slug: js 5 | lead: "Bring Bootstrap's components to life with over a dozen custom jQuery plugins. Easily include them all, or one by one." 6 | --- 7 | 8 | {% include js/overview.html %} 9 | {% include js/transitions.html %} 10 | {% include js/modal.html %} 11 | {% include js/dropdowns.html %} 12 | {% include js/scrollspy.html %} 13 | {% include js/tabs.html %} 14 | {% include js/tooltips.html %} 15 | {% include js/popovers.html %} 16 | {% include js/alerts.html %} 17 | {% include js/buttons.html %} 18 | {% include js/collapse.html %} 19 | {% include js/carousel.html %} 20 | {% include js/affix.html %} 21 | -------------------------------------------------------------------------------- /assets/src/bootstrap/docs/robots.txt: -------------------------------------------------------------------------------- 1 | --- 2 | layout: nil 3 | --- 4 | 5 | # www.robotstxt.org/ 6 | 7 | # Allow crawling of all content 8 | User-agent: * 9 | Disallow: 10 | Sitemap: {{ site.url }}/sitemap.xml 11 | -------------------------------------------------------------------------------- /assets/src/bootstrap/docs/sitemap.xml: -------------------------------------------------------------------------------- 1 | --- 2 | layout: nil 3 | --- 4 | 5 | 6 | 7 | 8 | {{ site.url }}/ 9 | {{ site.time | date_to_xmlschema }} 10 | daily 11 | 1.0 12 | 13 | {% for page in site.html_pages %} 14 | {% if page.layout != "home" %} 15 | 16 | {{ site.url }}{{ page.url }} 17 | {{ site.time | date_to_xmlschema }} 18 | weekly 19 | 0.7 20 | 21 | {% endif %} 22 | {% endfor %} 23 | 24 | -------------------------------------------------------------------------------- /assets/src/bootstrap/fonts/glyphicons-halflings-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kirill-zhirnov/beaver-mysql-logger/dbe3f01e7d7d46d6c7ef772478097a3c2fb177a1/assets/src/bootstrap/fonts/glyphicons-halflings-regular.eot -------------------------------------------------------------------------------- /assets/src/bootstrap/fonts/glyphicons-halflings-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kirill-zhirnov/beaver-mysql-logger/dbe3f01e7d7d46d6c7ef772478097a3c2fb177a1/assets/src/bootstrap/fonts/glyphicons-halflings-regular.ttf -------------------------------------------------------------------------------- /assets/src/bootstrap/fonts/glyphicons-halflings-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kirill-zhirnov/beaver-mysql-logger/dbe3f01e7d7d46d6c7ef772478097a3c2fb177a1/assets/src/bootstrap/fonts/glyphicons-halflings-regular.woff -------------------------------------------------------------------------------- /assets/src/bootstrap/grunt/.jshintrc: -------------------------------------------------------------------------------- 1 | { 2 | "extends" : "../js/.jshintrc", 3 | "browser" : false, 4 | "es3" : false, 5 | "node" : true 6 | } 7 | -------------------------------------------------------------------------------- /assets/src/bootstrap/grunt/bs-glyphicons-data-generator.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap Grunt task for Glyphicons data generation 3 | * http://getbootstrap.com 4 | * Copyright 2014 Twitter, Inc. 5 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 6 | */ 7 | 'use strict'; 8 | var fs = require('fs'); 9 | 10 | module.exports = function generateGlyphiconsData(grunt) { 11 | // Pass encoding, utf8, so `readFileSync` will return a string instead of a 12 | // buffer 13 | var glyphiconsFile = fs.readFileSync('less/glyphicons.less', 'utf8'); 14 | var glyphiconsLines = glyphiconsFile.split('\n'); 15 | 16 | // Use any line that starts with ".glyphicon-" and capture the class name 17 | var iconClassName = /^\.(glyphicon-[^\s]+)/; 18 | var glyphiconsData = '# This file is generated via Grunt task. **Do not edit directly.**\n' + 19 | '# See the \'build-glyphicons-data\' task in Gruntfile.js.\n\n'; 20 | var glyphiconsYml = 'docs/_data/glyphicons.yml'; 21 | for (var i = 0, len = glyphiconsLines.length; i < len; i++) { 22 | var match = glyphiconsLines[i].match(iconClassName); 23 | 24 | if (match !== null) { 25 | glyphiconsData += '- ' + match[1] + '\n'; 26 | } 27 | } 28 | 29 | // Create the `_data` directory if it doesn't already exist 30 | if (!fs.existsSync('docs/_data')) { 31 | fs.mkdirSync('docs/_data'); 32 | } 33 | 34 | try { 35 | fs.writeFileSync(glyphiconsYml, glyphiconsData); 36 | } 37 | catch (err) { 38 | grunt.fail.warn(err); 39 | } 40 | grunt.log.writeln('File ' + glyphiconsYml.cyan + ' created.'); 41 | }; 42 | -------------------------------------------------------------------------------- /assets/src/bootstrap/grunt/bs-raw-files-generator.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap Grunt task for generating raw-files.min.js for the Customizer 3 | * http://getbootstrap.com 4 | * Copyright 2014 Twitter, Inc. 5 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 6 | */ 7 | 8 | /* global btoa: true */ 9 | 10 | 'use strict'; 11 | var fs = require('fs'); 12 | var btoa = require('btoa'); 13 | var glob = require('glob'); 14 | 15 | function getFiles(type) { 16 | var files = {}; 17 | var recursive = (type === 'less'); 18 | var globExpr = (recursive ? '/**/*' : '/*'); 19 | glob.sync(type + globExpr) 20 | .filter(function (path) { 21 | return type === 'fonts' ? true : new RegExp('\\.' + type + '$').test(path); 22 | }) 23 | .forEach(function (fullPath) { 24 | var relativePath = fullPath.replace(/^[^/]+\//, ''); 25 | files[relativePath] = (type === 'fonts' ? btoa(fs.readFileSync(fullPath)) : fs.readFileSync(fullPath, 'utf8')); 26 | }); 27 | return 'var __' + type + ' = ' + JSON.stringify(files) + '\n'; 28 | } 29 | 30 | module.exports = function generateRawFilesJs(grunt, banner) { 31 | if (!banner) { 32 | banner = ''; 33 | } 34 | var dirs = ['js', 'less', 'fonts']; 35 | var files = banner + dirs.map(getFiles).reduce(function (combined, file) { 36 | return combined + file; 37 | }, ''); 38 | var rawFilesJs = 'docs/assets/js/raw-files.min.js'; 39 | try { 40 | fs.writeFileSync(rawFilesJs, files); 41 | } 42 | catch (err) { 43 | grunt.fail.warn(err); 44 | } 45 | grunt.log.writeln('File ' + rawFilesJs.cyan + ' created.'); 46 | }; 47 | -------------------------------------------------------------------------------- /assets/src/bootstrap/grunt/sauce_browsers.yml: -------------------------------------------------------------------------------- 1 | [ 2 | # Docs: https://saucelabs.com/docs/platforms/webdriver 3 | 4 | { 5 | browserName: "safari", 6 | platform: "OS X 10.9" 7 | }, 8 | { 9 | browserName: "chrome", 10 | platform: "OS X 10.9" 11 | }, 12 | { 13 | browserName: "firefox", 14 | platform: "OS X 10.9" 15 | }, 16 | 17 | # Mac Opera not currently supported by Sauce Labs 18 | 19 | { 20 | browserName: "internet explorer", 21 | version: "11", 22 | platform: "Windows 8.1" 23 | }, 24 | { 25 | browserName: "internet explorer", 26 | version: "10", 27 | platform: "Windows 8" 28 | }, 29 | { 30 | browserName: "internet explorer", 31 | version: "9", 32 | platform: "Windows 7" 33 | }, 34 | { 35 | browserName: "internet explorer", 36 | version: "8", 37 | platform: "Windows 7" 38 | }, 39 | 40 | # { # Unofficial 41 | # browserName: "internet explorer", 42 | # version: "7", 43 | # platform: "Windows XP" 44 | # }, 45 | 46 | { 47 | browserName: "chrome", 48 | platform: "Windows 8.1" 49 | }, 50 | { 51 | browserName: "firefox", 52 | platform: "Windows 8.1" 53 | }, 54 | 55 | # Win Opera 15+ not currently supported by Sauce Labs 56 | 57 | { 58 | browserName: "iphone", 59 | platform: "OS X 10.9", 60 | version: "7.1" 61 | }, 62 | 63 | # iOS Chrome not currently supported by Sauce Labs 64 | 65 | # Linux (unofficial) 66 | { 67 | browserName: "chrome", 68 | platform: "Linux" 69 | }, 70 | { 71 | browserName: "firefox", 72 | platform: "Linux" 73 | } 74 | 75 | # Android Chrome not currently supported by Sauce Labs 76 | 77 | # { # Android Browser (super-unofficial) 78 | # browserName: "android", 79 | # version: "4.0", 80 | # platform: "Linux" 81 | # } 82 | ] 83 | -------------------------------------------------------------------------------- /assets/src/bootstrap/js/.jscsrc: -------------------------------------------------------------------------------- 1 | { 2 | "disallowEmptyBlocks": true, 3 | "disallowKeywords": ["with"], 4 | "disallowMixedSpacesAndTabs": true, 5 | "disallowMultipleLineStrings": true, 6 | "disallowMultipleVarDecl": true, 7 | "disallowQuotedKeysInObjects": "allButReserved", 8 | "disallowSpaceAfterPrefixUnaryOperators": ["!"], 9 | "disallowSpaceBeforeBinaryOperators": [","], 10 | "disallowSpaceAfterPrefixUnaryOperators": ["++", "--", "+", "-", "~", "!"], 11 | "disallowSpaceBeforePostfixUnaryOperators": ["++", "--"], 12 | "disallowSpacesInNamedFunctionExpression": { "beforeOpeningRoundBrace": true }, 13 | "disallowSpacesInsideArrayBrackets": true, 14 | "disallowSpacesInsideParentheses": true, 15 | "disallowTrailingComma": true, 16 | "disallowTrailingWhitespace": true, 17 | "requireCamelCaseOrUpperCaseIdentifiers": true, 18 | "requireCapitalizedConstructors": true, 19 | "requireCommaBeforeLineBreak": true, 20 | "requireDotNotation": true, 21 | "requireLineFeedAtFileEnd": true, 22 | "requireSpaceAfterBinaryOperators": ["+", "-", "/", "*", "=", "==", "===", "!=", "!==", ">", "<", ">=", "<="], 23 | "requireSpaceAfterKeywords": ["if", "else", "for", "while", "do", "switch", "return", "try", "catch"], 24 | "requireSpaceAfterLineComment": true, 25 | "requireSpaceBeforeBinaryOperators": ["+", "-", "/", "*", "=", "==", "===", "!=", "!==", ">", "<", ">=", "<="], 26 | "requireSpacesInAnonymousFunctionExpression": { "beforeOpeningCurlyBrace": true, "beforeOpeningRoundBrace": true }, 27 | "requireSpacesInConditionalExpression": true, 28 | "requireSpacesInFunctionDeclaration": { "beforeOpeningCurlyBrace": true }, 29 | "requireSpacesInFunctionExpression": { "beforeOpeningCurlyBrace": true }, 30 | "requireSpacesInNamedFunctionExpression": { "beforeOpeningCurlyBrace": true }, 31 | "requireSpacesInsideObjectBrackets": "allButNested", 32 | "validateIndentation": 2, 33 | "validateLineBreaks": "LF", 34 | "validateQuoteMarks": "'" 35 | } 36 | -------------------------------------------------------------------------------- /assets/src/bootstrap/js/.jshintrc: -------------------------------------------------------------------------------- 1 | { 2 | "asi" : true, 3 | "browser" : true, 4 | "eqeqeq" : false, 5 | "eqnull" : true, 6 | "es3" : true, 7 | "expr" : true, 8 | "jquery" : true, 9 | "latedef" : true, 10 | "laxbreak" : true, 11 | "nonbsp" : true, 12 | "strict" : true, 13 | "undef" : true, 14 | "unused" : true 15 | } 16 | -------------------------------------------------------------------------------- /assets/src/bootstrap/js/tests/unit/.jshintrc: -------------------------------------------------------------------------------- 1 | { 2 | "extends" : "../../.jshintrc", 3 | "devel" : true, 4 | "qunit" : true 5 | } 6 | -------------------------------------------------------------------------------- /assets/src/bootstrap/js/tests/visual/alert.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Alert 5 | 6 | 7 | 8 | 9 |
    10 | 11 | 14 | 15 |
    16 | 17 | Holy guacamole! Best check yo self, you're not looking too good. 18 |
    19 | 20 |
    21 | 22 |

    Oh snap! You got an error!

    23 |

    Change this and that and try again. Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit. Cras mattis consectetur purus sit amet fermentum.

    24 |

    25 | 26 | 27 |

    28 |
    29 | 30 |
    31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /assets/src/bootstrap/js/tests/visual/button.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Button 5 | 6 | 7 | 8 | 9 |
    10 | 11 | 14 | 15 | 18 | 19 | 20 | 21 |
    22 | 25 | 28 | 31 |
    32 | 33 |
    34 | 37 | 40 | 43 |
    44 | 45 |
    46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 63 | 64 | 65 | -------------------------------------------------------------------------------- /assets/src/bootstrap/js/tests/visual/carousel.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Carousel 5 | 6 | 7 | 8 | 9 |
    10 | 11 | 14 | 15 | 39 | 40 |
    41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | -------------------------------------------------------------------------------- /assets/src/bootstrap/js/tests/visual/popover.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Popover 5 | 6 | 7 | 8 | 9 |
    10 | 11 | 14 | 15 | 18 | 21 | 24 | 27 | 28 |
    29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /assets/src/bootstrap/js/transition.js: -------------------------------------------------------------------------------- 1 | /* ======================================================================== 2 | * Bootstrap: transition.js v3.2.0 3 | * http://getbootstrap.com/javascript/#transitions 4 | * ======================================================================== 5 | * Copyright 2011-2014 Twitter, Inc. 6 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 7 | * ======================================================================== */ 8 | 9 | 10 | +function ($) { 11 | 'use strict'; 12 | 13 | // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/) 14 | // ============================================================ 15 | 16 | function transitionEnd() { 17 | var el = document.createElement('bootstrap') 18 | 19 | var transEndEventNames = { 20 | WebkitTransition : 'webkitTransitionEnd', 21 | MozTransition : 'transitionend', 22 | OTransition : 'oTransitionEnd otransitionend', 23 | transition : 'transitionend' 24 | } 25 | 26 | for (var name in transEndEventNames) { 27 | if (el.style[name] !== undefined) { 28 | return { end: transEndEventNames[name] } 29 | } 30 | } 31 | 32 | return false // explicit for ie8 ( ._.) 33 | } 34 | 35 | // http://blog.alexmaccaw.com/css-transitions 36 | $.fn.emulateTransitionEnd = function (duration) { 37 | var called = false 38 | var $el = this 39 | $(this).one('bsTransitionEnd', function () { called = true }) 40 | var callback = function () { if (!called) $($el).trigger($.support.transition.end) } 41 | setTimeout(callback, duration) 42 | return this 43 | } 44 | 45 | $(function () { 46 | $.support.transition = transitionEnd() 47 | 48 | if (!$.support.transition) return 49 | 50 | $.event.special.bsTransitionEnd = { 51 | bindType: $.support.transition.end, 52 | delegateType: $.support.transition.end, 53 | handle: function (e) { 54 | if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments) 55 | } 56 | } 57 | }) 58 | 59 | }(jQuery); 60 | -------------------------------------------------------------------------------- /assets/src/bootstrap/less/.csslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "adjoining-classes": false, 3 | "box-sizing": false, 4 | "box-model": false, 5 | "compatible-vendor-prefixes": false, 6 | "floats": false, 7 | "font-sizes": false, 8 | "gradients": false, 9 | "important": false, 10 | "known-properties": false, 11 | "outline-none": false, 12 | "qualified-headings": false, 13 | "regex-selectors": false, 14 | "shorthand": false, 15 | "text-indent": false, 16 | "unique-headings": false, 17 | "universal-selector": false, 18 | "unqualified-attributes": false 19 | } 20 | -------------------------------------------------------------------------------- /assets/src/bootstrap/less/alerts.less: -------------------------------------------------------------------------------- 1 | // 2 | // Alerts 3 | // -------------------------------------------------- 4 | 5 | 6 | // Base styles 7 | // ------------------------- 8 | 9 | .alert { 10 | padding: @alert-padding; 11 | margin-bottom: @line-height-computed; 12 | border: 1px solid transparent; 13 | border-radius: @alert-border-radius; 14 | 15 | // Headings for larger alerts 16 | h4 { 17 | margin-top: 0; 18 | // Specified for the h4 to prevent conflicts of changing @headings-color 19 | color: inherit; 20 | } 21 | // Provide class for links that match alerts 22 | .alert-link { 23 | font-weight: @alert-link-font-weight; 24 | } 25 | 26 | // Improve alignment and spacing of inner content 27 | > p, 28 | > ul { 29 | margin-bottom: 0; 30 | } 31 | > p + p { 32 | margin-top: 5px; 33 | } 34 | } 35 | 36 | // Dismissible alerts 37 | // 38 | // Expand the right padding and account for the close button's positioning. 39 | 40 | .alert-dismissable, // The misspelled .alert-dismissable was deprecated in 3.2.0. 41 | .alert-dismissible { 42 | padding-right: (@alert-padding + 20); 43 | 44 | // Adjust close link position 45 | .close { 46 | position: relative; 47 | top: -2px; 48 | right: -21px; 49 | color: inherit; 50 | } 51 | } 52 | 53 | // Alternate styles 54 | // 55 | // Generate contextual modifier classes for colorizing the alert. 56 | 57 | .alert-success { 58 | .alert-variant(@alert-success-bg; @alert-success-border; @alert-success-text); 59 | } 60 | .alert-info { 61 | .alert-variant(@alert-info-bg; @alert-info-border; @alert-info-text); 62 | } 63 | .alert-warning { 64 | .alert-variant(@alert-warning-bg; @alert-warning-border; @alert-warning-text); 65 | } 66 | .alert-danger { 67 | .alert-variant(@alert-danger-bg; @alert-danger-border; @alert-danger-text); 68 | } 69 | -------------------------------------------------------------------------------- /assets/src/bootstrap/less/badges.less: -------------------------------------------------------------------------------- 1 | // 2 | // Badges 3 | // -------------------------------------------------- 4 | 5 | 6 | // Base class 7 | .badge { 8 | display: inline-block; 9 | min-width: 10px; 10 | padding: 3px 7px; 11 | font-size: @font-size-small; 12 | font-weight: @badge-font-weight; 13 | color: @badge-color; 14 | line-height: @badge-line-height; 15 | vertical-align: baseline; 16 | white-space: nowrap; 17 | text-align: center; 18 | background-color: @badge-bg; 19 | border-radius: @badge-border-radius; 20 | 21 | // Empty badges collapse automatically (not available in IE8) 22 | &:empty { 23 | display: none; 24 | } 25 | 26 | // Quick fix for badges in buttons 27 | .btn & { 28 | position: relative; 29 | top: -1px; 30 | } 31 | .btn-xs & { 32 | top: 0; 33 | padding: 1px 5px; 34 | } 35 | 36 | // Hover state, but only for links 37 | a& { 38 | &:hover, 39 | &:focus { 40 | color: @badge-link-hover-color; 41 | text-decoration: none; 42 | cursor: pointer; 43 | } 44 | } 45 | 46 | // Account for badges in navs 47 | a.list-group-item.active > &, 48 | .nav-pills > .active > a > & { 49 | color: @badge-active-color; 50 | background-color: @badge-active-bg; 51 | } 52 | .nav-pills > li > a > & { 53 | margin-left: 3px; 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /assets/src/bootstrap/less/bootstrap.less: -------------------------------------------------------------------------------- 1 | // Core variables and mixins 2 | @import "variables.less"; 3 | @import "mixins.less"; 4 | 5 | // Reset and dependencies 6 | @import "normalize.less"; 7 | @import "print.less"; 8 | @import "glyphicons.less"; 9 | 10 | // Core CSS 11 | @import "scaffolding.less"; 12 | @import "type.less"; 13 | @import "code.less"; 14 | @import "grid.less"; 15 | @import "tables.less"; 16 | @import "forms.less"; 17 | @import "buttons.less"; 18 | 19 | // Components 20 | @import "component-animations.less"; 21 | @import "dropdowns.less"; 22 | @import "button-groups.less"; 23 | @import "input-groups.less"; 24 | @import "navs.less"; 25 | @import "navbar.less"; 26 | @import "breadcrumbs.less"; 27 | @import "pagination.less"; 28 | @import "pager.less"; 29 | @import "labels.less"; 30 | @import "badges.less"; 31 | @import "jumbotron.less"; 32 | @import "thumbnails.less"; 33 | @import "alerts.less"; 34 | @import "progress-bars.less"; 35 | @import "media.less"; 36 | @import "list-group.less"; 37 | @import "panels.less"; 38 | @import "responsive-embed.less"; 39 | @import "wells.less"; 40 | @import "close.less"; 41 | 42 | // Components w/ JavaScript 43 | @import "modals.less"; 44 | @import "tooltip.less"; 45 | @import "popovers.less"; 46 | @import "carousel.less"; 47 | 48 | // Utility classes 49 | @import "utilities.less"; 50 | @import "responsive-utilities.less"; 51 | -------------------------------------------------------------------------------- /assets/src/bootstrap/less/breadcrumbs.less: -------------------------------------------------------------------------------- 1 | // 2 | // Breadcrumbs 3 | // -------------------------------------------------- 4 | 5 | 6 | .breadcrumb { 7 | padding: @breadcrumb-padding-vertical @breadcrumb-padding-horizontal; 8 | margin-bottom: @line-height-computed; 9 | list-style: none; 10 | background-color: @breadcrumb-bg; 11 | border-radius: @border-radius-base; 12 | 13 | > li { 14 | display: inline-block; 15 | 16 | + li:before { 17 | content: "@{breadcrumb-separator}\00a0"; // Unicode space added since inline-block means non-collapsing white-space 18 | padding: 0 5px; 19 | color: @breadcrumb-color; 20 | } 21 | } 22 | 23 | > .active { 24 | color: @breadcrumb-active-color; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /assets/src/bootstrap/less/close.less: -------------------------------------------------------------------------------- 1 | // 2 | // Close icons 3 | // -------------------------------------------------- 4 | 5 | 6 | .close { 7 | float: right; 8 | font-size: (@font-size-base * 1.5); 9 | font-weight: @close-font-weight; 10 | line-height: 1; 11 | color: @close-color; 12 | text-shadow: @close-text-shadow; 13 | .opacity(.2); 14 | 15 | &:hover, 16 | &:focus { 17 | color: @close-color; 18 | text-decoration: none; 19 | cursor: pointer; 20 | .opacity(.5); 21 | } 22 | 23 | // Additional properties for button version 24 | // iOS requires the button element instead of an anchor tag. 25 | // If you want the anchor version, it requires `href="#"`. 26 | button& { 27 | padding: 0; 28 | cursor: pointer; 29 | background: transparent; 30 | border: 0; 31 | -webkit-appearance: none; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /assets/src/bootstrap/less/code.less: -------------------------------------------------------------------------------- 1 | // 2 | // Code (inline and block) 3 | // -------------------------------------------------- 4 | 5 | 6 | // Inline and block code styles 7 | code, 8 | kbd, 9 | pre, 10 | samp { 11 | font-family: @font-family-monospace; 12 | } 13 | 14 | // Inline code 15 | code { 16 | padding: 2px 4px; 17 | font-size: 90%; 18 | color: @code-color; 19 | background-color: @code-bg; 20 | border-radius: @border-radius-base; 21 | } 22 | 23 | // User input typically entered via keyboard 24 | kbd { 25 | padding: 2px 4px; 26 | font-size: 90%; 27 | color: @kbd-color; 28 | background-color: @kbd-bg; 29 | border-radius: @border-radius-small; 30 | box-shadow: inset 0 -1px 0 rgba(0,0,0,.25); 31 | 32 | kbd { 33 | padding: 0; 34 | font-size: 100%; 35 | box-shadow: none; 36 | } 37 | } 38 | 39 | // Blocks of code 40 | pre { 41 | display: block; 42 | padding: ((@line-height-computed - 1) / 2); 43 | margin: 0 0 (@line-height-computed / 2); 44 | font-size: (@font-size-base - 1); // 14px to 13px 45 | line-height: @line-height-base; 46 | word-break: break-all; 47 | word-wrap: break-word; 48 | color: @pre-color; 49 | background-color: @pre-bg; 50 | border: 1px solid @pre-border-color; 51 | border-radius: @border-radius-base; 52 | 53 | // Account for some code outputs that place code tags in pre tags 54 | code { 55 | padding: 0; 56 | font-size: inherit; 57 | color: inherit; 58 | white-space: pre-wrap; 59 | background-color: transparent; 60 | border-radius: 0; 61 | } 62 | } 63 | 64 | // Enable scrollable blocks of code 65 | .pre-scrollable { 66 | max-height: @pre-scrollable-max-height; 67 | overflow-y: scroll; 68 | } 69 | -------------------------------------------------------------------------------- /assets/src/bootstrap/less/component-animations.less: -------------------------------------------------------------------------------- 1 | // 2 | // Component animations 3 | // -------------------------------------------------- 4 | 5 | // Heads up! 6 | // 7 | // We don't use the `.opacity()` mixin here since it causes a bug with text 8 | // fields in IE7-8. Source: https://github.com/twbs/bootstrap/pull/3552. 9 | 10 | .fade { 11 | opacity: 0; 12 | .transition(opacity .15s linear); 13 | &.in { 14 | opacity: 1; 15 | } 16 | } 17 | 18 | .collapse { 19 | display: none; 20 | 21 | &.in { display: block; } 22 | tr&.in { display: table-row; } 23 | tbody&.in { display: table-row-group; } 24 | } 25 | 26 | .collapsing { 27 | position: relative; 28 | height: 0; 29 | overflow: hidden; 30 | .transition(height .35s ease); 31 | } 32 | -------------------------------------------------------------------------------- /assets/src/bootstrap/less/grid.less: -------------------------------------------------------------------------------- 1 | // 2 | // Grid system 3 | // -------------------------------------------------- 4 | 5 | 6 | // Container widths 7 | // 8 | // Set the container width, and override it for fixed navbars in media queries. 9 | 10 | .container { 11 | .container-fixed(); 12 | 13 | @media (min-width: @screen-sm-min) { 14 | width: @container-sm; 15 | } 16 | @media (min-width: @screen-md-min) { 17 | width: @container-md; 18 | } 19 | @media (min-width: @screen-lg-min) { 20 | width: @container-lg; 21 | } 22 | } 23 | 24 | 25 | // Fluid container 26 | // 27 | // Utilizes the mixin meant for fixed width containers, but without any defined 28 | // width for fluid, full width layouts. 29 | 30 | .container-fluid { 31 | .container-fixed(); 32 | } 33 | 34 | 35 | // Row 36 | // 37 | // Rows contain and clear the floats of your columns. 38 | 39 | .row { 40 | .make-row(); 41 | } 42 | 43 | 44 | // Columns 45 | // 46 | // Common styles for small and large grid columns 47 | 48 | .make-grid-columns(); 49 | 50 | 51 | // Extra small grid 52 | // 53 | // Columns, offsets, pushes, and pulls for extra small devices like 54 | // smartphones. 55 | 56 | .make-grid(xs); 57 | 58 | 59 | // Small grid 60 | // 61 | // Columns, offsets, pushes, and pulls for the small device range, from phones 62 | // to tablets. 63 | 64 | @media (min-width: @screen-sm-min) { 65 | .make-grid(sm); 66 | } 67 | 68 | 69 | // Medium grid 70 | // 71 | // Columns, offsets, pushes, and pulls for the desktop device range. 72 | 73 | @media (min-width: @screen-md-min) { 74 | .make-grid(md); 75 | } 76 | 77 | 78 | // Large grid 79 | // 80 | // Columns, offsets, pushes, and pulls for the large desktop device range. 81 | 82 | @media (min-width: @screen-lg-min) { 83 | .make-grid(lg); 84 | } 85 | -------------------------------------------------------------------------------- /assets/src/bootstrap/less/jumbotron.less: -------------------------------------------------------------------------------- 1 | // 2 | // Jumbotron 3 | // -------------------------------------------------- 4 | 5 | 6 | .jumbotron { 7 | padding: @jumbotron-padding; 8 | margin-bottom: @jumbotron-padding; 9 | color: @jumbotron-color; 10 | background-color: @jumbotron-bg; 11 | 12 | h1, 13 | .h1 { 14 | color: @jumbotron-heading-color; 15 | } 16 | p { 17 | margin-bottom: (@jumbotron-padding / 2); 18 | font-size: @jumbotron-font-size; 19 | font-weight: 200; 20 | } 21 | 22 | > hr { 23 | border-top-color: darken(@jumbotron-bg, 10%); 24 | } 25 | 26 | .container & { 27 | border-radius: @border-radius-large; // Only round corners at higher resolutions if contained in a container 28 | } 29 | 30 | .container { 31 | max-width: 100%; 32 | } 33 | 34 | @media screen and (min-width: @screen-sm-min) { 35 | padding-top: (@jumbotron-padding * 1.6); 36 | padding-bottom: (@jumbotron-padding * 1.6); 37 | 38 | .container & { 39 | padding-left: (@jumbotron-padding * 2); 40 | padding-right: (@jumbotron-padding * 2); 41 | } 42 | 43 | h1, 44 | .h1 { 45 | font-size: (@font-size-base * 4.5); 46 | } 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /assets/src/bootstrap/less/labels.less: -------------------------------------------------------------------------------- 1 | // 2 | // Labels 3 | // -------------------------------------------------- 4 | 5 | .label { 6 | display: inline; 7 | padding: .2em .6em .3em; 8 | font-size: 75%; 9 | font-weight: bold; 10 | line-height: 1; 11 | color: @label-color; 12 | text-align: center; 13 | white-space: nowrap; 14 | vertical-align: baseline; 15 | border-radius: .25em; 16 | 17 | // Add hover effects, but only for links 18 | a& { 19 | &:hover, 20 | &:focus { 21 | color: @label-link-hover-color; 22 | text-decoration: none; 23 | cursor: pointer; 24 | } 25 | } 26 | 27 | // Empty labels collapse automatically (not available in IE8) 28 | &:empty { 29 | display: none; 30 | } 31 | 32 | // Quick fix for labels in buttons 33 | .btn & { 34 | position: relative; 35 | top: -1px; 36 | } 37 | } 38 | 39 | // Colors 40 | // Contextual variations (linked labels get darker on :hover) 41 | 42 | .label-default { 43 | .label-variant(@label-default-bg); 44 | } 45 | 46 | .label-primary { 47 | .label-variant(@label-primary-bg); 48 | } 49 | 50 | .label-success { 51 | .label-variant(@label-success-bg); 52 | } 53 | 54 | .label-info { 55 | .label-variant(@label-info-bg); 56 | } 57 | 58 | .label-warning { 59 | .label-variant(@label-warning-bg); 60 | } 61 | 62 | .label-danger { 63 | .label-variant(@label-danger-bg); 64 | } 65 | -------------------------------------------------------------------------------- /assets/src/bootstrap/less/media.less: -------------------------------------------------------------------------------- 1 | // Media objects 2 | // Source: http://stubbornella.org/content/?p=497 3 | // -------------------------------------------------- 4 | 5 | 6 | // Common styles 7 | // ------------------------- 8 | 9 | // Clear the floats 10 | .media, 11 | .media-body { 12 | overflow: hidden; 13 | zoom: 1; 14 | } 15 | 16 | // Proper spacing between instances of .media 17 | .media, 18 | .media .media { 19 | margin-top: 15px; 20 | } 21 | .media:first-child { 22 | margin-top: 0; 23 | } 24 | 25 | // For images and videos, set to block 26 | .media-object { 27 | display: block; 28 | } 29 | 30 | // Reset margins on headings for tighter default spacing 31 | .media-heading { 32 | margin: 0 0 5px; 33 | } 34 | 35 | 36 | // Media image alignment 37 | // ------------------------- 38 | 39 | .media { 40 | > .pull-left { 41 | margin-right: 10px; 42 | } 43 | > .pull-right { 44 | margin-left: 10px; 45 | } 46 | } 47 | 48 | 49 | // Media list variation 50 | // ------------------------- 51 | 52 | // Undo default ul/ol styles 53 | .media-list { 54 | padding-left: 0; 55 | list-style: none; 56 | } 57 | -------------------------------------------------------------------------------- /assets/src/bootstrap/less/mixins.less: -------------------------------------------------------------------------------- 1 | // Mixins 2 | // -------------------------------------------------- 3 | 4 | // Utilities 5 | @import "mixins/hide-text.less"; 6 | @import "mixins/opacity.less"; 7 | @import "mixins/image.less"; 8 | @import "mixins/labels.less"; 9 | @import "mixins/reset-filter.less"; 10 | @import "mixins/resize.less"; 11 | @import "mixins/responsive-visibility.less"; 12 | @import "mixins/size.less"; 13 | @import "mixins/tab-focus.less"; 14 | @import "mixins/text-emphasis.less"; 15 | @import "mixins/text-overflow.less"; 16 | @import "mixins/vendor-prefixes.less"; 17 | 18 | // Components 19 | @import "mixins/alerts.less"; 20 | @import "mixins/buttons.less"; 21 | @import "mixins/panels.less"; 22 | @import "mixins/pagination.less"; 23 | @import "mixins/list-group.less"; 24 | @import "mixins/nav-divider.less"; 25 | @import "mixins/forms.less"; 26 | @import "mixins/progress-bar.less"; 27 | @import "mixins/table-row.less"; 28 | 29 | // Skins 30 | @import "mixins/background-variant.less"; 31 | @import "mixins/border-radius.less"; 32 | @import "mixins/gradients.less"; 33 | 34 | // Layout 35 | @import "mixins/clearfix.less"; 36 | @import "mixins/center-block.less"; 37 | @import "mixins/nav-vertical-align.less"; 38 | @import "mixins/grid-framework.less"; 39 | @import "mixins/grid.less"; 40 | -------------------------------------------------------------------------------- /assets/src/bootstrap/less/mixins/alerts.less: -------------------------------------------------------------------------------- 1 | // Alerts 2 | 3 | .alert-variant(@background; @border; @text-color) { 4 | background-color: @background; 5 | border-color: @border; 6 | color: @text-color; 7 | 8 | hr { 9 | border-top-color: darken(@border, 5%); 10 | } 11 | .alert-link { 12 | color: darken(@text-color, 10%); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /assets/src/bootstrap/less/mixins/background-variant.less: -------------------------------------------------------------------------------- 1 | // Contextual backgrounds 2 | 3 | .bg-variant(@color) { 4 | background-color: @color; 5 | a&:hover { 6 | background-color: darken(@color, 10%); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /assets/src/bootstrap/less/mixins/border-radius.less: -------------------------------------------------------------------------------- 1 | // Single side border-radius 2 | 3 | .border-top-radius(@radius) { 4 | border-top-right-radius: @radius; 5 | border-top-left-radius: @radius; 6 | } 7 | .border-right-radius(@radius) { 8 | border-bottom-right-radius: @radius; 9 | border-top-right-radius: @radius; 10 | } 11 | .border-bottom-radius(@radius) { 12 | border-bottom-right-radius: @radius; 13 | border-bottom-left-radius: @radius; 14 | } 15 | .border-left-radius(@radius) { 16 | border-bottom-left-radius: @radius; 17 | border-top-left-radius: @radius; 18 | } 19 | -------------------------------------------------------------------------------- /assets/src/bootstrap/less/mixins/buttons.less: -------------------------------------------------------------------------------- 1 | // Button variants 2 | // 3 | // Easily pump out default styles, as well as :hover, :focus, :active, 4 | // and disabled options for all buttons 5 | 6 | .button-variant(@color; @background; @border) { 7 | color: @color; 8 | background-color: @background; 9 | border-color: @border; 10 | 11 | &:hover, 12 | &:focus, 13 | &:active, 14 | &.active, 15 | .open > .dropdown-toggle& { 16 | color: @color; 17 | background-color: darken(@background, 10%); 18 | border-color: darken(@border, 12%); 19 | } 20 | &:active, 21 | &.active, 22 | .open > .dropdown-toggle& { 23 | background-image: none; 24 | } 25 | &.disabled, 26 | &[disabled], 27 | fieldset[disabled] & { 28 | &, 29 | &:hover, 30 | &:focus, 31 | &:active, 32 | &.active { 33 | background-color: @background; 34 | border-color: @border; 35 | } 36 | } 37 | 38 | .badge { 39 | color: @background; 40 | background-color: @color; 41 | } 42 | } 43 | 44 | // Button sizes 45 | .button-size(@padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) { 46 | padding: @padding-vertical @padding-horizontal; 47 | font-size: @font-size; 48 | line-height: @line-height; 49 | border-radius: @border-radius; 50 | } 51 | -------------------------------------------------------------------------------- /assets/src/bootstrap/less/mixins/center-block.less: -------------------------------------------------------------------------------- 1 | // Center-align a block level element 2 | 3 | .center-block() { 4 | display: block; 5 | margin-left: auto; 6 | margin-right: auto; 7 | } 8 | -------------------------------------------------------------------------------- /assets/src/bootstrap/less/mixins/clearfix.less: -------------------------------------------------------------------------------- 1 | // Clearfix 2 | // 3 | // For modern browsers 4 | // 1. The space content is one way to avoid an Opera bug when the 5 | // contenteditable attribute is included anywhere else in the document. 6 | // Otherwise it causes space to appear at the top and bottom of elements 7 | // that are clearfixed. 8 | // 2. The use of `table` rather than `block` is only necessary if using 9 | // `:before` to contain the top-margins of child elements. 10 | // 11 | // Source: http://nicolasgallagher.com/micro-clearfix-hack/ 12 | 13 | .clearfix() { 14 | &:before, 15 | &:after { 16 | content: " "; // 1 17 | display: table; // 2 18 | } 19 | &:after { 20 | clear: both; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /assets/src/bootstrap/less/mixins/hide-text.less: -------------------------------------------------------------------------------- 1 | // CSS image replacement 2 | // 3 | // Heads up! v3 launched with with only `.hide-text()`, but per our pattern for 4 | // mixins being reused as classes with the same name, this doesn't hold up. As 5 | // of v3.0.1 we have added `.text-hide()` and deprecated `.hide-text()`. 6 | // 7 | // Source: https://github.com/h5bp/html5-boilerplate/commit/aa0396eae757 8 | 9 | // Deprecated as of v3.0.1 (will be removed in v4) 10 | .hide-text() { 11 | font: ~"0/0" a; 12 | color: transparent; 13 | text-shadow: none; 14 | background-color: transparent; 15 | border: 0; 16 | } 17 | 18 | // New mixin to use as of v3.0.1 19 | .text-hide() { 20 | .hide-text(); 21 | } 22 | -------------------------------------------------------------------------------- /assets/src/bootstrap/less/mixins/image.less: -------------------------------------------------------------------------------- 1 | // Image Mixins 2 | // - Responsive image 3 | // - Retina image 4 | 5 | 6 | // Responsive image 7 | // 8 | // Keep images from scaling beyond the width of their parents. 9 | .img-responsive(@display: block) { 10 | display: @display; 11 | width: 100% \9; // Force IE10 and below to size SVG images correctly 12 | max-width: 100%; // Part 1: Set a maximum relative to the parent 13 | height: auto; // Part 2: Scale the height according to the width, otherwise you get stretching 14 | } 15 | 16 | 17 | // Retina image 18 | // 19 | // Short retina mixin for setting background-image and -size. Note that the 20 | // spelling of `min--moz-device-pixel-ratio` is intentional. 21 | .img-retina(@file-1x; @file-2x; @width-1x; @height-1x) { 22 | background-image: url("@{file-1x}"); 23 | 24 | @media 25 | only screen and (-webkit-min-device-pixel-ratio: 2), 26 | only screen and ( min--moz-device-pixel-ratio: 2), 27 | only screen and ( -o-min-device-pixel-ratio: 2/1), 28 | only screen and ( min-device-pixel-ratio: 2), 29 | only screen and ( min-resolution: 192dpi), 30 | only screen and ( min-resolution: 2dppx) { 31 | background-image: url("@{file-2x}"); 32 | background-size: @width-1x @height-1x; 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /assets/src/bootstrap/less/mixins/labels.less: -------------------------------------------------------------------------------- 1 | // Labels 2 | 3 | .label-variant(@color) { 4 | background-color: @color; 5 | 6 | &[href] { 7 | &:hover, 8 | &:focus { 9 | background-color: darken(@color, 10%); 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /assets/src/bootstrap/less/mixins/list-group.less: -------------------------------------------------------------------------------- 1 | // List Groups 2 | 3 | .list-group-item-variant(@state; @background; @color) { 4 | .list-group-item-@{state} { 5 | color: @color; 6 | background-color: @background; 7 | 8 | a& { 9 | color: @color; 10 | 11 | .list-group-item-heading { 12 | color: inherit; 13 | } 14 | 15 | &:hover, 16 | &:focus { 17 | color: @color; 18 | background-color: darken(@background, 5%); 19 | } 20 | &.active, 21 | &.active:hover, 22 | &.active:focus { 23 | color: #fff; 24 | background-color: @color; 25 | border-color: @color; 26 | } 27 | } 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /assets/src/bootstrap/less/mixins/nav-divider.less: -------------------------------------------------------------------------------- 1 | // Horizontal dividers 2 | // 3 | // Dividers (basically an hr) within dropdowns and nav lists 4 | 5 | .nav-divider(@color: #e5e5e5) { 6 | height: 1px; 7 | margin: ((@line-height-computed / 2) - 1) 0; 8 | overflow: hidden; 9 | background-color: @color; 10 | } 11 | -------------------------------------------------------------------------------- /assets/src/bootstrap/less/mixins/nav-vertical-align.less: -------------------------------------------------------------------------------- 1 | // Navbar vertical align 2 | // 3 | // Vertically center elements in the navbar. 4 | // Example: an element has a height of 30px, so write out `.navbar-vertical-align(30px);` to calculate the appropriate top margin. 5 | 6 | .navbar-vertical-align(@element-height) { 7 | margin-top: ((@navbar-height - @element-height) / 2); 8 | margin-bottom: ((@navbar-height - @element-height) / 2); 9 | } 10 | -------------------------------------------------------------------------------- /assets/src/bootstrap/less/mixins/opacity.less: -------------------------------------------------------------------------------- 1 | // Opacity 2 | 3 | .opacity(@opacity) { 4 | opacity: @opacity; 5 | // IE8 filter 6 | @opacity-ie: (@opacity * 100); 7 | filter: ~"alpha(opacity=@{opacity-ie})"; 8 | } 9 | -------------------------------------------------------------------------------- /assets/src/bootstrap/less/mixins/pagination.less: -------------------------------------------------------------------------------- 1 | // Pagination 2 | 3 | .pagination-size(@padding-vertical; @padding-horizontal; @font-size; @border-radius) { 4 | > li { 5 | > a, 6 | > span { 7 | padding: @padding-vertical @padding-horizontal; 8 | font-size: @font-size; 9 | } 10 | &:first-child { 11 | > a, 12 | > span { 13 | .border-left-radius(@border-radius); 14 | } 15 | } 16 | &:last-child { 17 | > a, 18 | > span { 19 | .border-right-radius(@border-radius); 20 | } 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /assets/src/bootstrap/less/mixins/panels.less: -------------------------------------------------------------------------------- 1 | // Panels 2 | 3 | .panel-variant(@border; @heading-text-color; @heading-bg-color; @heading-border) { 4 | border-color: @border; 5 | 6 | & > .panel-heading { 7 | color: @heading-text-color; 8 | background-color: @heading-bg-color; 9 | border-color: @heading-border; 10 | 11 | + .panel-collapse > .panel-body { 12 | border-top-color: @border; 13 | } 14 | .badge { 15 | color: @heading-bg-color; 16 | background-color: @heading-text-color; 17 | } 18 | } 19 | & > .panel-footer { 20 | + .panel-collapse > .panel-body { 21 | border-bottom-color: @border; 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /assets/src/bootstrap/less/mixins/progress-bar.less: -------------------------------------------------------------------------------- 1 | // Progress bars 2 | 3 | .progress-bar-variant(@color) { 4 | background-color: @color; 5 | 6 | // Deprecated parent class requirement as of v3.2.0 7 | .progress-striped & { 8 | #gradient > .striped(); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /assets/src/bootstrap/less/mixins/reset-filter.less: -------------------------------------------------------------------------------- 1 | // Reset filters for IE 2 | // 3 | // When you need to remove a gradient background, do not forget to use this to reset 4 | // the IE filter for IE9 and below. 5 | 6 | .reset-filter() { 7 | filter: e(%("progid:DXImageTransform.Microsoft.gradient(enabled = false)")); 8 | } 9 | -------------------------------------------------------------------------------- /assets/src/bootstrap/less/mixins/resize.less: -------------------------------------------------------------------------------- 1 | // Resize anything 2 | 3 | .resizable(@direction) { 4 | resize: @direction; // Options: horizontal, vertical, both 5 | overflow: auto; // Per CSS3 UI, `resize` only applies when `overflow` isn't `visible` 6 | } 7 | -------------------------------------------------------------------------------- /assets/src/bootstrap/less/mixins/responsive-visibility.less: -------------------------------------------------------------------------------- 1 | // Responsive utilities 2 | 3 | // 4 | // More easily include all the states for responsive-utilities.less. 5 | .responsive-visibility() { 6 | display: block !important; 7 | table& { display: table; } 8 | tr& { display: table-row !important; } 9 | th&, 10 | td& { display: table-cell !important; } 11 | } 12 | 13 | .responsive-invisibility() { 14 | display: none !important; 15 | } 16 | -------------------------------------------------------------------------------- /assets/src/bootstrap/less/mixins/size.less: -------------------------------------------------------------------------------- 1 | // Sizing shortcuts 2 | 3 | .size(@width; @height) { 4 | width: @width; 5 | height: @height; 6 | } 7 | 8 | .square(@size) { 9 | .size(@size; @size); 10 | } 11 | -------------------------------------------------------------------------------- /assets/src/bootstrap/less/mixins/tab-focus.less: -------------------------------------------------------------------------------- 1 | // WebKit-style focus 2 | 3 | .tab-focus() { 4 | // Default 5 | outline: thin dotted; 6 | // WebKit 7 | outline: 5px auto -webkit-focus-ring-color; 8 | outline-offset: -2px; 9 | } 10 | -------------------------------------------------------------------------------- /assets/src/bootstrap/less/mixins/table-row.less: -------------------------------------------------------------------------------- 1 | // Tables 2 | 3 | .table-row-variant(@state; @background) { 4 | // Exact selectors below required to override `.table-striped` and prevent 5 | // inheritance to nested tables. 6 | .table > thead > tr, 7 | .table > tbody > tr, 8 | .table > tfoot > tr { 9 | > td.@{state}, 10 | > th.@{state}, 11 | &.@{state} > td, 12 | &.@{state} > th { 13 | background-color: @background; 14 | } 15 | } 16 | 17 | // Hover states for `.table-hover` 18 | // Note: this is not available for cells or rows within `thead` or `tfoot`. 19 | .table-hover > tbody > tr { 20 | > td.@{state}:hover, 21 | > th.@{state}:hover, 22 | &.@{state}:hover > td, 23 | &:hover > .@{state}, 24 | &.@{state}:hover > th { 25 | background-color: darken(@background, 5%); 26 | } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /assets/src/bootstrap/less/mixins/text-emphasis.less: -------------------------------------------------------------------------------- 1 | // Typography 2 | 3 | .text-emphasis-variant(@color) { 4 | color: @color; 5 | a&:hover { 6 | color: darken(@color, 10%); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /assets/src/bootstrap/less/mixins/text-overflow.less: -------------------------------------------------------------------------------- 1 | // Text overflow 2 | // Requires inline-block or block for proper styling 3 | 4 | .text-overflow() { 5 | overflow: hidden; 6 | text-overflow: ellipsis; 7 | white-space: nowrap; 8 | } 9 | -------------------------------------------------------------------------------- /assets/src/bootstrap/less/pager.less: -------------------------------------------------------------------------------- 1 | // 2 | // Pager pagination 3 | // -------------------------------------------------- 4 | 5 | 6 | .pager { 7 | padding-left: 0; 8 | margin: @line-height-computed 0; 9 | list-style: none; 10 | text-align: center; 11 | &:extend(.clearfix all); 12 | li { 13 | display: inline; 14 | > a, 15 | > span { 16 | display: inline-block; 17 | padding: 5px 14px; 18 | background-color: @pager-bg; 19 | border: 1px solid @pager-border; 20 | border-radius: @pager-border-radius; 21 | } 22 | 23 | > a:hover, 24 | > a:focus { 25 | text-decoration: none; 26 | background-color: @pager-hover-bg; 27 | } 28 | } 29 | 30 | .next { 31 | > a, 32 | > span { 33 | float: right; 34 | } 35 | } 36 | 37 | .previous { 38 | > a, 39 | > span { 40 | float: left; 41 | } 42 | } 43 | 44 | .disabled { 45 | > a, 46 | > a:hover, 47 | > a:focus, 48 | > span { 49 | color: @pager-disabled-color; 50 | background-color: @pager-bg; 51 | cursor: not-allowed; 52 | } 53 | } 54 | 55 | } 56 | -------------------------------------------------------------------------------- /assets/src/bootstrap/less/responsive-embed.less: -------------------------------------------------------------------------------- 1 | // Embeds responsive 2 | // 3 | // Credit: Nicolas Gallagher and SUIT CSS. 4 | 5 | .embed-responsive { 6 | position: relative; 7 | display: block; 8 | height: 0; 9 | padding: 0; 10 | overflow: hidden; 11 | 12 | .embed-responsive-item, 13 | iframe, 14 | embed, 15 | object { 16 | position: absolute; 17 | top: 0; 18 | left: 0; 19 | bottom: 0; 20 | height: 100%; 21 | width: 100%; 22 | border: 0; 23 | } 24 | 25 | // Modifier class for 16:9 aspect ratio 26 | &.embed-responsive-16by9 { 27 | padding-bottom: 56.25%; 28 | } 29 | 30 | // Modifier class for 4:3 aspect ratio 31 | &.embed-responsive-4by3 { 32 | padding-bottom: 75%; 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /assets/src/bootstrap/less/thumbnails.less: -------------------------------------------------------------------------------- 1 | // 2 | // Thumbnails 3 | // -------------------------------------------------- 4 | 5 | 6 | // Mixin and adjust the regular image class 7 | .thumbnail { 8 | display: block; 9 | padding: @thumbnail-padding; 10 | margin-bottom: @line-height-computed; 11 | line-height: @line-height-base; 12 | background-color: @thumbnail-bg; 13 | border: 1px solid @thumbnail-border; 14 | border-radius: @thumbnail-border-radius; 15 | .transition(all .2s ease-in-out); 16 | 17 | > img, 18 | a > img { 19 | &:extend(.img-responsive); 20 | margin-left: auto; 21 | margin-right: auto; 22 | } 23 | 24 | // Add a hover state for linked versions only 25 | a&:hover, 26 | a&:focus, 27 | a&.active { 28 | border-color: @link-color; 29 | } 30 | 31 | // Image captions 32 | .caption { 33 | padding: @thumbnail-caption-padding; 34 | color: @thumbnail-caption-color; 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /assets/src/bootstrap/less/utilities.less: -------------------------------------------------------------------------------- 1 | // 2 | // Utility classes 3 | // -------------------------------------------------- 4 | 5 | 6 | // Floats 7 | // ------------------------- 8 | 9 | .clearfix { 10 | .clearfix(); 11 | } 12 | .center-block { 13 | .center-block(); 14 | } 15 | .pull-right { 16 | float: right !important; 17 | } 18 | .pull-left { 19 | float: left !important; 20 | } 21 | 22 | 23 | // Toggling content 24 | // ------------------------- 25 | 26 | // Note: Deprecated .hide in favor of .hidden or .sr-only (as appropriate) in v3.0.1 27 | .hide { 28 | display: none !important; 29 | } 30 | .show { 31 | display: block !important; 32 | } 33 | .invisible { 34 | visibility: hidden; 35 | } 36 | .text-hide { 37 | .text-hide(); 38 | } 39 | 40 | 41 | // Hide from screenreaders and browsers 42 | // 43 | // Credit: HTML5 Boilerplate 44 | 45 | .hidden { 46 | display: none !important; 47 | visibility: hidden !important; 48 | } 49 | 50 | 51 | // For Affix plugin 52 | // ------------------------- 53 | 54 | .affix { 55 | position: fixed; 56 | .translate3d(0, 0, 0); 57 | } 58 | -------------------------------------------------------------------------------- /assets/src/bootstrap/less/wells.less: -------------------------------------------------------------------------------- 1 | // 2 | // Wells 3 | // -------------------------------------------------- 4 | 5 | 6 | // Base class 7 | .well { 8 | min-height: 20px; 9 | padding: 19px; 10 | margin-bottom: 20px; 11 | background-color: @well-bg; 12 | border: 1px solid @well-border; 13 | border-radius: @border-radius-base; 14 | .box-shadow(inset 0 1px 1px rgba(0,0,0,.05)); 15 | blockquote { 16 | border-color: #ddd; 17 | border-color: rgba(0,0,0,.15); 18 | } 19 | } 20 | 21 | // Sizes 22 | .well-lg { 23 | padding: 24px; 24 | border-radius: @border-radius-large; 25 | } 26 | .well-sm { 27 | padding: 9px; 28 | border-radius: @border-radius-small; 29 | } 30 | -------------------------------------------------------------------------------- /assets/src/bootstrap/test-infra/S3Cachefile.json: -------------------------------------------------------------------------------- 1 | { 2 | "npm-modules": { 3 | "key": "./npm-shrinkwrap.json", 4 | "cache": "../node_modules", 5 | "generate": "./uncached-npm-install.sh" 6 | }, 7 | "rubygems": { 8 | "key": "../pseudo_Gemfile.lock", 9 | "cache": "$GEMDIR", 10 | "generate": "gem install -N jekyll -v $JEKYLL_VERSION" 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /assets/src/bootstrap/test-infra/requirements.txt: -------------------------------------------------------------------------------- 1 | boto==2.25.0 2 | -------------------------------------------------------------------------------- /assets/src/bootstrap/test-infra/uncached-npm-install.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -e 3 | cd .. # /bootstrap/ 4 | cp test-infra/npm-shrinkwrap.json npm-shrinkwrap.json 5 | npm install 6 | rm npm-shrinkwrap.json 7 | -------------------------------------------------------------------------------- /assets/src/datetimepicker/MIT-LICENSE.txt: -------------------------------------------------------------------------------- 1 | Copyright (c) 2013 http://xdsoft.net 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in 11 | all copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 19 | THE SOFTWARE. -------------------------------------------------------------------------------- /assets/src/datetimepicker/README.md: -------------------------------------------------------------------------------- 1 | datetimepicker 2 | ============== 3 | [Documentation][doc] 4 | 5 | 6 | jQuery Plugin Date and Time Picker 7 | 8 | DateTimePicker 9 | 10 | ![ScreenShot](https://raw2.github.com/xdan/datetimepicker/master/screen/1.png) 11 | 12 | DatePicker 13 | 14 | ![ScreenShot](https://raw2.github.com/xdan/datetimepicker/master/screen/2.png) 15 | 16 | TimePicker 17 | 18 | ![ScreenShot](https://raw2.github.com/xdan/datetimepicker/master/screen/3.png) 19 | 20 | [doc]: http://xdsoft.net/jqplugins/datetimepicker/ 21 | -------------------------------------------------------------------------------- /assets/src/js/extend.js: -------------------------------------------------------------------------------- 1 | function extend(Child, Parent) 2 | { 3 | var F = function() { } 4 | F.prototype = Parent.prototype 5 | Child.prototype = new F() 6 | Child.prototype.constructor = Child 7 | Child.superclass = Parent.prototype 8 | } -------------------------------------------------------------------------------- /assets/src/js/jquery/jquery.form.js: -------------------------------------------------------------------------------- 1 | /** 2 | * How to use: 3 | * 4 | * $('form').form(); - will setup kz.form with default config. 5 | * 6 | * $('form').form({custom : 'val'}); - will setup form with custom config. 7 | * 8 | * $('form').form('myClass', {custom : 'val'}); - will setup kz.myCalss with custom config. 9 | */ 10 | (function($) { 11 | $.fn.form = function() 12 | { 13 | var config, name; 14 | if (arguments.length > 1) { 15 | name = arguments[0]; 16 | config = arguments[1]; 17 | } else if (arguments.length == 1) { 18 | if (typeof(arguments[0]) == 'object') { 19 | config = arguments[0]; 20 | } else if (typeof(arguments[0]) == 'string') { 21 | name = arguments[0]; 22 | } 23 | } 24 | 25 | if (typeof(name) == 'undefined') 26 | name = 'form'; 27 | 28 | if (typeof(kz[name]) != 'function') 29 | throw new Error('Form "' + name + '" does not exist!'); 30 | 31 | $(this).each(function() { 32 | var obj = new kz[name]($(this), config); 33 | obj.setup(); 34 | }); 35 | } 36 | }) (jQuery); -------------------------------------------------------------------------------- /assets/src/js/kz/ajaxLink.js: -------------------------------------------------------------------------------- 1 | if (typeof(kz) == 'undefined' || !kz) { 2 | var kz = {}; 3 | } 4 | 5 | (function($) { 6 | kz.ajaxLink = function(el, config) 7 | { 8 | if (!(el instanceof jQuery)) 9 | throw new Error('Element must be instance of JQuery.'); 10 | 11 | this.el = el; 12 | this.config = $.extend({ 13 | /** 14 | * Bind initial events 15 | */ 16 | bindEvents : true, 17 | 18 | confirm : false 19 | }, config); 20 | } 21 | 22 | kz.ajaxLink.prototype.setup = function() 23 | { 24 | if (this.config.bindEvents) 25 | this.el.on('click', $.proxy(this.onClick, this)); 26 | } 27 | 28 | kz.ajaxLink.prototype.onClick = function(e) 29 | { 30 | e.preventDefault(); 31 | 32 | if (this.config.confirm && !confirm(this.config.confirm)) 33 | return; 34 | 35 | var that = this; 36 | $.post(this.el.attr('href'), {}, function(data) { 37 | that.el.trigger('afterPost.ajaxLink', [this, data]); 38 | }, 'json'); 39 | } 40 | }) (jQuery); -------------------------------------------------------------------------------- /assets/src/js/kz/ajaxResponse.js: -------------------------------------------------------------------------------- 1 | if (typeof(kz) == 'undefined' || !kz) { 2 | var kz = {}; 3 | } 4 | 5 | (function($) { 6 | kz.ajaxResponse = function() 7 | { 8 | } 9 | 10 | kz.ajaxResponse.prototype.response = function(responseJSON) 11 | { 12 | if (typeof(responseJSON.redirect) == 'string') { 13 | kz.util.redirect(responseJSON.redirect); 14 | 15 | return; 16 | } 17 | 18 | if (typeof(responseJSON.reload) == 'boolean' && responseJSON.reload) { 19 | kz.util.reload(); 20 | 21 | return; 22 | } 23 | 24 | if (typeof(responseJSON.openPopup) == 'string') { 25 | var modal = new kz.modal(); 26 | modal.load(responseJSON.openPopup); 27 | 28 | return; 29 | } 30 | } 31 | }) (jQuery); 32 | -------------------------------------------------------------------------------- /assets/src/js/kz/form.js: -------------------------------------------------------------------------------- 1 | if (typeof(kz) == 'undefined' || !kz) { 2 | var kz = {}; 3 | } 4 | 5 | (function($) { 6 | kz.form = function(el, config) 7 | { 8 | kz.form.superclass.constructor.call(this, el, $.extend({ 9 | buttonsSelector : ':button, input[type=submit]' 10 | }, config)); 11 | } 12 | 13 | extend(kz.form, kz.widget); 14 | 15 | kz.form.prototype.onSetup = function() 16 | { 17 | if (this.config.bindEvents) 18 | this.el.bind('submit', $.proxy(this.onSubmit, this)); 19 | } 20 | 21 | kz.form.prototype.onSubmit = function(e) 22 | { 23 | e.preventDefault(); 24 | 25 | //disable buttons 26 | if (this.config.buttonsSelector) 27 | this.el.find(this.config.buttonsSelector).attr('disabled', true); 28 | 29 | var that = this; 30 | $.post(this.el.attr('action'), this.el.serializeArray(), function(data) { 31 | if (typeof(data.html) != 'undefined') 32 | that.replace(data.html); 33 | 34 | that.afterSubmit(data); 35 | }, 'json'); 36 | } 37 | 38 | kz.form.prototype.afterSubmit = function(data) 39 | { 40 | this.el.trigger('afterSubmit.widget', [this, data]); 41 | } 42 | 43 | }) (jQuery); -------------------------------------------------------------------------------- /assets/src/js/kz/grid.js: -------------------------------------------------------------------------------- 1 | if (typeof(kz) == 'undefined' || !kz) { 2 | var kz = {}; 3 | } 4 | 5 | (function($) { 6 | kz.grid = function(el, config) 7 | { 8 | kz.grid.superclass.constructor.call(this, el, $.extend({ 9 | paginationSelector : '.pagination a', 10 | filterSelector : '.grid-filter', 11 | filterReset : '.grid-filter .grid-reset' 12 | }, config)); 13 | 14 | this.filter = null; 15 | } 16 | 17 | extend(kz.grid, kz.widget); 18 | 19 | kz.grid.prototype.onSetup = function() 20 | { 21 | if (this.config.bindEvents) 22 | this.bindEvents(); 23 | 24 | this.filter = this.el.find(this.config.filterSelector); 25 | } 26 | 27 | kz.grid.prototype.bindEvents = function() 28 | { 29 | this.el.on('update.grid', $.proxy(function(e, url, params) { 30 | this.update(url, params); 31 | }, this)); 32 | 33 | this.el.on('click', this.config.paginationSelector, $.proxy(this.onPaginationClick, this)); 34 | 35 | this.el.on('submit', this.config.filterSelector, $.proxy(this.onFilterSubmit, this)); 36 | this.el.on('click', this.config.filterReset, $.proxy(this.onFilterReset, this)); 37 | } 38 | 39 | kz.grid.prototype.update = function(url, params) 40 | { 41 | var that = this; 42 | $.post(url, params, function(data) { 43 | if (typeof(data.html) != 'undefined') 44 | that.replace(data.html); 45 | }, 'json'); 46 | } 47 | 48 | kz.grid.prototype.onFilterReset = function(e) 49 | { 50 | e.preventDefault(); 51 | 52 | this.update(this.filter.attr('action'), {}); 53 | } 54 | 55 | kz.grid.prototype.onFilterSubmit = function(e) 56 | { 57 | e.preventDefault(); 58 | 59 | this.update(this.filter.attr('action'), this.filter.serializeArray()); 60 | } 61 | 62 | kz.grid.prototype.onPaginationClick = function(e) 63 | { 64 | e.preventDefault(); 65 | 66 | this.update($(e.target).attr('href'), {}); 67 | } 68 | }) (jQuery); -------------------------------------------------------------------------------- /assets/src/js/kz/loading.js: -------------------------------------------------------------------------------- 1 | if (typeof(kz) == 'undefined' || !kz) { 2 | var kz = {}; 3 | } 4 | 5 | (function($) { 6 | kz.loading = function(config) 7 | { 8 | this.config = $.extend({ 9 | selector : '#loading' 10 | }, config); 11 | 12 | this.el = $(this.config.selector); 13 | } 14 | 15 | kz.loading.prototype.show = function() 16 | { 17 | this.el.show(); 18 | } 19 | 20 | kz.loading.prototype.hide = function() 21 | { 22 | this.el.hide(); 23 | } 24 | }) (jQuery); -------------------------------------------------------------------------------- /assets/src/js/kz/modal.js: -------------------------------------------------------------------------------- 1 | if (typeof(kz) == 'undefined' || !kz) { 2 | var kz = {}; 3 | } 4 | 5 | (function($) { 6 | kz.modal = (function() { 7 | var instances = {}; 8 | 9 | return function modalSingletone (config) { 10 | config = $.extend({ 11 | wrapperSelector : '#modal', 12 | bsConfig : { 13 | show : false 14 | }, 15 | closeOnFormSuccess : true, 16 | elSelector : '.modal-dialog' 17 | }, config); 18 | 19 | //singleton part 20 | if (typeof(instances[config.wrapperSelector]) != 'undefined') 21 | return instances[config.wrapperSelector]; 22 | 23 | if (this && this.constructor === modalSingletone) 24 | instances[config.wrapperSelector] = this; 25 | else 26 | return new modalSingletone(config); 27 | 28 | //prepare args and call parent constructor 29 | this.wrapperEl = $(config.wrapperSelector).modal(config.bsConfig); 30 | el = this.wrapperEl.find(config.elSelector); 31 | 32 | kz.modal.superclass.constructor.call(this, el, config); 33 | 34 | this.setupInstance(); 35 | }; 36 | } ()); 37 | 38 | extend(kz.modal, kz.widget); 39 | 40 | kz.modal.prototype.setupInstance = function() 41 | { 42 | this.setupFormListeners(); 43 | } 44 | 45 | kz.modal.prototype.setupFormListeners = function() 46 | { 47 | var that = this; 48 | this.wrapperEl.on('afterSubmit.widget', 'form', function(e, formWidget, data) { 49 | if (that.config.closeOnFormSuccess && typeof(data.result) != 'undefined' && data.result) 50 | that.hide(); 51 | }); 52 | } 53 | 54 | kz.modal.prototype.show = function() 55 | { 56 | this.wrapperEl.modal('show'); 57 | } 58 | 59 | kz.modal.prototype.hide = function() 60 | { 61 | this.wrapperEl.modal('hide'); 62 | } 63 | 64 | kz.modal.prototype.load = function(url) 65 | { 66 | var that = this; 67 | $.post(url, {}, function(data) { 68 | if (typeof(data.html) != 'undefined') 69 | that.replace(data.html); 70 | 71 | that.show(); 72 | }, 'json'); 73 | } 74 | 75 | kz.modal.prototype.makeReplaceSelector = function() 76 | { 77 | return 'div.modal-dialog'; 78 | } 79 | }) (jQuery); 80 | -------------------------------------------------------------------------------- /assets/src/js/kz/modalMsg.js: -------------------------------------------------------------------------------- 1 | if (typeof(kz) == 'undefined' || !kz) { 2 | var kz = {}; 3 | } 4 | 5 | (function($) { 6 | kz.modalMsg = function(config) { 7 | config = $.extend({ 8 | wrapperSelector : '#modal-msg', 9 | bsConfig : { 10 | keyboard : false, 11 | show : false, 12 | backdrop : 'static' 13 | }, 14 | elSelector : '.modal-msg' 15 | }, config); 16 | 17 | /** 18 | * @type kz.modal 19 | */ 20 | this.modal = new kz.modal(config); 21 | }; 22 | 23 | kz.modalMsg.prototype.show = function(message) 24 | { 25 | this.modal.el.text(message); 26 | this.modal.show(); 27 | } 28 | 29 | kz.modalMsg.prototype.hide = function(message) 30 | { 31 | this.modal.hide(); 32 | } 33 | }) (jQuery); -------------------------------------------------------------------------------- /assets/src/js/kz/util.js: -------------------------------------------------------------------------------- 1 | if (typeof(kz) == 'undefined' || !kz) { 2 | var kz = {}; 3 | } 4 | 5 | (function($) { 6 | kz.util = { 7 | redirect : function(url) 8 | { 9 | if (window.location.href == url) { 10 | this.reload(); 11 | return; 12 | } 13 | 14 | var modalMsg = new kz.modalMsg(); 15 | modalMsg.show('You are being redirected...'); 16 | 17 | window.location = url; 18 | }, 19 | 20 | reload : function() 21 | { 22 | var modalMsg = new kz.modalMsg(); 23 | modalMsg.show('You are being redirected...'); 24 | 25 | window.location.reload(); 26 | } 27 | }; 28 | }) (jQuery); -------------------------------------------------------------------------------- /assets/src/js/kz/widget.js: -------------------------------------------------------------------------------- 1 | if (typeof(kz) == 'undefined' || !kz) { 2 | var kz = {}; 3 | } 4 | 5 | (function($) { 6 | kz.widget = function(el, config) 7 | { 8 | if (!(el instanceof jQuery)) 9 | throw new Error('Element must be instance of JQuery.'); 10 | 11 | this.el = el; 12 | this.config = $.extend({ 13 | /** 14 | * Bind initial events 15 | */ 16 | bindEvents : true, 17 | 18 | /** 19 | * Selector will be used to find new element during replacement. 20 | */ 21 | replaceSelector : 'div:first', 22 | 23 | /** 24 | * Callback which will be called after setup. 25 | */ 26 | afterSetup : null 27 | }, config); 28 | } 29 | 30 | kz.widget.prototype.setup = function() 31 | { 32 | this.config.replaceSelector = this.makeReplaceSelector(); 33 | 34 | this.onSetup(); 35 | 36 | this.afterSetup(); 37 | } 38 | 39 | /** 40 | * This method for children: redefine it to have additional logic. 41 | */ 42 | kz.widget.prototype.onSetup = function() 43 | {} 44 | 45 | kz.widget.prototype.afterSetup = function() 46 | { 47 | if (typeof(this.config.afterSetup) == 'function') 48 | this.config.afterSetup.call(this); 49 | 50 | this.el.trigger('afterSetup.widget', [this]); 51 | } 52 | 53 | kz.widget.prototype.makeReplaceSelector = function() 54 | { 55 | var selector = this.el.prop('tagName').toLowerCase(), 56 | classes = this.el.attr('class'); 57 | 58 | if (typeof(classes) == 'string') 59 | $.each(classes.split(/\s+/), function(key, val) { 60 | selector += '.' + val; 61 | }); 62 | 63 | selector += ':first'; 64 | 65 | return selector; 66 | } 67 | 68 | kz.widget.prototype.replace = function(html) 69 | { 70 | html = (html instanceof jQuery) ? html : $(html); 71 | 72 | var wrapper = $('
    ').append(html), 73 | newEl = wrapper.find(this.config.replaceSelector); 74 | 75 | if (newEl.size() == 0) 76 | throw new Error('Cannot find new element'); 77 | 78 | this.el.replaceWith(newEl); 79 | this.el = newEl; 80 | 81 | this.setup(); 82 | 83 | return this; 84 | } 85 | }) (jQuery); -------------------------------------------------------------------------------- /assets/src/js/project/sqlGrid.js: -------------------------------------------------------------------------------- 1 | if (typeof(project) == 'undefined' || !project) { 2 | var project = {}; 3 | } 4 | 5 | (function($) { 6 | project.sqlGrid = function(el, config) 7 | { 8 | project.sqlGrid.superclass.constructor.call(this, el, config); 9 | } 10 | 11 | extend(project.sqlGrid, kz.grid); 12 | 13 | project.sqlGrid.prototype.onSetup = function() 14 | { 15 | project.sqlGrid.superclass.onSetup.call(this); 16 | 17 | this.setupExpand(); 18 | this.setupDatePicker(); 19 | this.setupThreadLinkFilter() 20 | } 21 | 22 | project.sqlGrid.prototype.setupThreadLinkFilter = function() 23 | { 24 | var that = this; 25 | this.el.on('click', '.thread-id a', function(e) { 26 | e.preventDefault(); 27 | 28 | that.filter.find('.thread-id input').val($(this).data('thread-id')); 29 | that.filter.trigger('submit'); 30 | }); 31 | } 32 | 33 | project.sqlGrid.prototype.setupDatePicker = function() 34 | { 35 | //date picker: 36 | this.el.find('.grid-filter .event-time input').datetimepicker({ 37 | format : 'Y-m-d H:i:s', 38 | validateOnBlur : false 39 | }); 40 | } 41 | 42 | project.sqlGrid.prototype.setupExpand = function() 43 | { 44 | this.el.find('.argument .sql').each(function() { 45 | $el = $(this); 46 | 47 | if ($el.innerHeight() > 100) 48 | $el.addClass('pointer'); 49 | }); 50 | 51 | this.el.on('click', '.argument .sql.pointer', function(e) { 52 | e.preventDefault(); 53 | 54 | $(this).removeClass('pointer').addClass('opened'); 55 | }); 56 | 57 | this.el.on('click', '.argument .close-top,.argument .close-bottom', function(e) { 58 | e.preventDefault(); 59 | 60 | var $sql = $(this).parents('.sql'); 61 | $sql.removeClass('opened').addClass('pointer'); 62 | }); 63 | } 64 | }) (jQuery); 65 | -------------------------------------------------------------------------------- /assets/src/less/variables.less: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kirill-zhirnov/beaver-mysql-logger/dbe3f01e7d7d46d6c7ef772478097a3c2fb177a1/assets/src/less/variables.less -------------------------------------------------------------------------------- /assets/src/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "mysqldebug", 3 | "description": "", 4 | "devDependencies": { 5 | "grunt": "~0.4.5", 6 | "grunt-autoprefixer": "~0.7.6", 7 | "grunt-banner": "~0.2.3", 8 | "grunt-contrib-clean": "~0.5.0", 9 | "load-grunt-tasks": "~0.6.0", 10 | "grunt-contrib-less": "~0.11.3", 11 | "grunt-contrib-csslint": "~0.2.0", 12 | "grunt-csscomb": "~2.0.1", 13 | "grunt-contrib-watch": "~0.6.1", 14 | "grunt-contrib-concat": "~0.4.0", 15 | "grunt-contrib-uglify": "~0.5.0", 16 | "grunt-contrib-copy": "~0.5.0" 17 | } 18 | } -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "kirill-zhirnov/beaver-mysql-logger", 3 | "description": "Trace And Debug MySQL queries", 4 | "license": "MIT", 5 | "authors": [ 6 | { 7 | "name": "Kirill Zhirnov", 8 | "email": "kirill@boundless-commerce.com" 9 | } 10 | ], 11 | "require": {} 12 | } 13 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | services: 2 | php: 3 | build : 4 | context: ./ 5 | dockerfile: ./.docker/php.Dockerfile 6 | target: php-server-dev 7 | volumes: 8 | - ./:/var/www/html 9 | ports: 10 | - "9090:8080" 11 | # environment: 12 | # MYSQL_DSN: "mysql:host=host.docker.internal;port=32775;dbname=mysql" 13 | # MYSQL_USERNAME: root 14 | # MYSQL_PASS: root 15 | 16 | # php-prod: 17 | # build : 18 | # context: ./ 19 | # dockerfile: ./.docker/php.Dockerfile 20 | # target: php-server-prod 21 | # ports: 22 | # - "9095:8080" -------------------------------------------------------------------------------- /index.php: -------------------------------------------------------------------------------- 1 | run(); 6 | -------------------------------------------------------------------------------- /protected/bootstrap.php: -------------------------------------------------------------------------------- 1 | [ 5 | 'db' => [ 6 | 'connection' => [ 7 | 'dsn' => 'sqlite:' . realpath(__DIR__ . '/../../runtime') . '/db.sq3', 8 | 'username' => null, 9 | 'password' => null, 10 | 'options' => [], 11 | ], 12 | 'type' => \KZ\db\interfaces\ConnectionStorage::SQLITE, 13 | 'tableModelClass' => '\KZ\db\table\SQLite' 14 | ], 15 | 16 | 'httpControllerKit' => [ 17 | 'path' => realpath(PROTECTED_PATH . '/project/controllers') 18 | ], 19 | 20 | 'view' => [ 21 | 'templatesPath' => realpath(PROTECTED_PATH . '/project/views'), 22 | 'config' => [ 23 | 'helperKit' => [ 24 | 'config' => [ 25 | 'helpers' => [ 26 | 'sqlFormatter' => '\helpers\SqlFormatter' 27 | ] 28 | ] 29 | ] 30 | ] 31 | ], 32 | 33 | 'registry' => [ 34 | 'class' => '\components\app\Registry' 35 | ], 36 | 37 | 'observer' => [ 38 | 'events' => [ 39 | [ 40 | 'KZ\controller\Front', 41 | 'beforeRunControllerChain', 42 | function($event) { 43 | $handler = new \eventHandlers\Setup(); 44 | $handler->onBeforeRunControllerChain($event); 45 | } 46 | ], 47 | [ 48 | 'KZ\app\Facade\Http', 49 | 'beforeInitialize', 50 | function($event) { 51 | $handler = new \eventHandlers\Setup(); 52 | $handler->onBeforeInitialize($event); 53 | } 54 | ], 55 | ] 56 | ] 57 | ] 58 | ]; -------------------------------------------------------------------------------- /protected/libs/KZ/app/Facade/Http.php: -------------------------------------------------------------------------------- 1 | kit->makeHttpRequest(); 16 | } 17 | 18 | /** 19 | * Makes controllers factory. 20 | * 21 | * @throws \OutOfBoundsException 22 | * @return \KZ\controller\Kit 23 | */ 24 | public function makeControllerKit() 25 | { 26 | if (!array_key_exists('httpControllerKit', $this->config['components'])) 27 | throw new \OutOfBoundsException('Key "httpControllerKit" must be in config!'); 28 | 29 | return $this->kit->makeControllerKit($this->config['components']['httpControllerKit']); 30 | } 31 | } -------------------------------------------------------------------------------- /protected/libs/KZ/controller/interfaces/Chain.php: -------------------------------------------------------------------------------- 1 | $result and outputted as JSON. 34 | * 35 | * If it is simple request from browser - result will be outputted as string. 36 | * 37 | * @param $localPath 38 | * @param array $data 39 | * @return void 40 | */ 41 | public function render($localPath, array $data = []); 42 | 43 | /** 44 | * if it is ajax request - will be outputted json: 'redirect' => 'url' 45 | * if it is simple request - header "Location" will be sent. 46 | * 47 | * @param \KZ\link\interfaces\Link|string $url 48 | * @return void 49 | */ 50 | public function redirect($url); 51 | 52 | /** 53 | * Set additional data to ajax response. 54 | * 55 | * @param array $json 56 | * @return $this 57 | */ 58 | public function setJson(array $json); 59 | 60 | /** 61 | * Output Json with special headers. 62 | * 63 | * @param array $json 64 | * @return void 65 | */ 66 | public function json(array $json = []); 67 | 68 | /** 69 | * @param bool $value 70 | * @return $this 71 | */ 72 | public function exitAfterRedirect($value); 73 | 74 | /** 75 | * @return bool 76 | */ 77 | public function isExitAfterRedirect(); 78 | } -------------------------------------------------------------------------------- /protected/libs/KZ/controller/request/Http.php: -------------------------------------------------------------------------------- 1 | params)) 18 | return $this->params[$key]; 19 | elseif (isset($_POST[$key])) 20 | return $_POST[$key]; 21 | else 22 | return $_GET[$key]; 23 | 24 | return $default; 25 | } 26 | 27 | public function getScriptName() 28 | { 29 | return $_SERVER['SCRIPT_NAME']; 30 | } 31 | 32 | public function isAjaxRequest() 33 | { 34 | return isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH'] === 'XMLHttpRequest'; 35 | } 36 | } -------------------------------------------------------------------------------- /protected/libs/KZ/db/ConnectionStorage.php: -------------------------------------------------------------------------------- 1 | ['type' => 'mysql', 'pdo' => $pdo]] 10 | * 11 | * @var array 12 | */ 13 | protected $data = []; 14 | 15 | /** 16 | * Name of default connection 17 | * 18 | * @var string 19 | */ 20 | protected $defaultConnection; 21 | 22 | public function add(\PDO $connection, $type, $name = null, $isDefault = false) 23 | { 24 | if (is_null($name)) 25 | $name = $type . sizeof($this->data); 26 | 27 | $this->data[$name] = [ 28 | 'type' => $type, 29 | 'pdo' => $connection 30 | ]; 31 | 32 | if ($isDefault) 33 | $this->defaultConnection = $name; 34 | 35 | return $name; 36 | } 37 | 38 | public function getByType($type) 39 | { 40 | $out = []; 41 | 42 | foreach ($this->data as $name => $row) 43 | if ($row['type'] == $type) 44 | $out[$name] = $row['pdo']; 45 | 46 | return $out; 47 | } 48 | 49 | public function getByName($name) 50 | { 51 | return isset($this->data[$name]) ? $this->data[$name]['pdo'] : null; 52 | } 53 | 54 | public function getDefault() 55 | { 56 | return $this->defaultConnection ? $this->getByName($this->defaultConnection) : null; 57 | } 58 | } -------------------------------------------------------------------------------- /protected/libs/KZ/db/PDOMock.php: -------------------------------------------------------------------------------- 1 | dsn = $dsn; 17 | } 18 | 19 | public function getDsn() 20 | { 21 | return $this->dsn; 22 | } 23 | } -------------------------------------------------------------------------------- /protected/libs/KZ/db/interfaces/ConnectionStorage.php: -------------------------------------------------------------------------------- 1 | makeStmt('show databases'); 14 | $stmt->execute(); 15 | 16 | $out = []; 17 | foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $row) 18 | $out[] = $row['Database']; 19 | 20 | sort($out); 21 | 22 | $stmt->closeCursor(); 23 | 24 | return $out; 25 | } 26 | } -------------------------------------------------------------------------------- /protected/libs/KZ/db/table/SQLite.php: -------------------------------------------------------------------------------- 1 | sender = $sender; 31 | $this->setParams($params); 32 | } 33 | 34 | /** 35 | * @return bool 36 | */ 37 | public function isDefaultPrevented() 38 | { 39 | return $this->defaultPrevented; 40 | } 41 | 42 | /** 43 | * @param string $key 44 | * @return mixed 45 | * @throws \OutOfBoundsException 46 | */ 47 | public function getParam($key) 48 | { 49 | if (!$this->hasParam($key)) 50 | throw new \OutOfBoundsException('Key "' . $key . '" not found!'); 51 | 52 | return $this->params[$key]; 53 | } 54 | 55 | /** 56 | * @param string $key 57 | * @return bool 58 | */ 59 | public function hasParam($key) 60 | { 61 | return isset($this->params[$key]); 62 | } 63 | 64 | /** 65 | * @param array $params 66 | * @return $this 67 | */ 68 | public function setParams(array $params) 69 | { 70 | foreach ($params as $key => $val) 71 | $this->params[$key] = $val; 72 | 73 | return $this; 74 | } 75 | 76 | /** 77 | * @return array 78 | */ 79 | public function getParams() 80 | { 81 | return $this->params; 82 | } 83 | 84 | /** 85 | * @return Object 86 | */ 87 | public function getSender() 88 | { 89 | return $this->sender; 90 | } 91 | 92 | /** 93 | * @return $this 94 | */ 95 | public function preventDefault() 96 | { 97 | $this->defaultPrevented = true; 98 | 99 | return $this; 100 | } 101 | } -------------------------------------------------------------------------------- /protected/libs/KZ/event/interfaces/Event.php: -------------------------------------------------------------------------------- 1 | 20 | * 23 | * 24 | * @return $this 25 | */ 26 | public function bindEvents(array $events); 27 | 28 | /** 29 | * Bind single event. 30 | * 31 | * @param $class - Class name or object. If object passed, basic parent class will be used. 32 | * @param $name 33 | * @param callable $callback 34 | * @return int - Position in listeners array. 35 | */ 36 | public function bind($class, $name, callable $callback); 37 | 38 | /** 39 | * Trigger event. 40 | * 41 | * @param object $sender - Basic parent class will be used as $class. 42 | * @param $name 43 | * @param array $params 44 | * @return Event 45 | */ 46 | public function trigger($sender, $name, array $params = []); 47 | 48 | /** 49 | * Unbind event|s. 50 | * 51 | * @param null $class - if $class passed - only event related to this class will be removed. 52 | * @param null $name - if $name passed, $class has to be passed too. Only $class => $name events will be removed. 53 | * @param null $key 54 | * @return boolean - if listeners exist - it will unset and return true, if not - false. 55 | */ 56 | public function unbind($class = null, $name = null, $key = null); 57 | 58 | /** 59 | * Get listeners. 60 | * 61 | * @param null $class 62 | * @param null $name 63 | * @param null $key 64 | * @return array|callable|boolean 65 | */ 66 | public function getListeners($class = null, $name = null, $key = null); 67 | } -------------------------------------------------------------------------------- /protected/libs/KZ/flashMessenger/interfaces/FlashMessenger.php: -------------------------------------------------------------------------------- 1 | 16 | * 'myPrefix']; 18 | * 19 | */ 20 | public function __construct(array $config = []); 21 | 22 | /** 23 | * Add message, 24 | * 25 | * @param $text 26 | * @param string $type - Message type. 27 | * @return int - Return position for added item. 28 | */ 29 | public function add($text, $type = self::SUCCESS); 30 | 31 | /** 32 | * Extend messages to next time. 33 | * 34 | * @return $this 35 | */ 36 | public function extend(); 37 | 38 | /** 39 | * Delete message. 40 | * 41 | * @param $position 42 | * @return $this 43 | */ 44 | public function delete($position); 45 | 46 | /** 47 | * Get all messages by type. 48 | * 49 | * @param $type 50 | * @return array 51 | */ 52 | public function getAllByType($type); 53 | 54 | /** 55 | * Set prefix for session. 56 | * 57 | * @param string $prefix 58 | * @return $this 59 | */ 60 | public function setSessionPrefix($prefix); 61 | 62 | /** 63 | * @return string 64 | */ 65 | public function getSessionPrefix(); 66 | 67 | /** 68 | * @param array $config 69 | * @return $this 70 | */ 71 | public function setConfig(array $config); 72 | } -------------------------------------------------------------------------------- /protected/libs/KZ/grid/interfaces/Grid.php: -------------------------------------------------------------------------------- 1 | getAttrNames() as $attr) 17 | if ($this->getErrors($attr)) 18 | $this->{$attr} = $this->getDefaultValue($attr); 19 | } 20 | } -------------------------------------------------------------------------------- /protected/libs/KZ/model/interfaces/Filter.php: -------------------------------------------------------------------------------- 1 | registry = $registry; 21 | 22 | return $this; 23 | } 24 | 25 | /** 26 | * @throws \RuntimeException 27 | * @return appInterfaces\Registry 28 | */ 29 | public function getRegistry() 30 | { 31 | if (!$this->registry) 32 | throw new \RuntimeException('You must set registry before calling this method.'); 33 | 34 | return $this->registry; 35 | } 36 | } -------------------------------------------------------------------------------- /protected/libs/KZ/view/helpers/FlashMessenger.php: -------------------------------------------------------------------------------- 1 | getRegistry()->getFlashMessenger(); 15 | } 16 | } -------------------------------------------------------------------------------- /protected/libs/KZ/view/helpers/Link.php: -------------------------------------------------------------------------------- 1 | getConnectionStorage()->getByType(db\interfaces\ConnectionStorage::MYSQL); 22 | 23 | if (!$mysql) 24 | return null; 25 | 26 | return $mysql[array_keys($mysql)[0]]; 27 | } 28 | } -------------------------------------------------------------------------------- /protected/project/controllers/Exec.php: -------------------------------------------------------------------------------- 1 | request->getParam('sql'); 10 | 11 | $model = new \models\ExplainQuery( 12 | $this->registry, 13 | $this->request->getParam('db'), 14 | $this->request->getParam('commandType'), 15 | $sql 16 | ); 17 | 18 | $explain = $model->exec(); 19 | $this->view->assignData([ 20 | 'result' => $explain, 21 | 'query' => $sql, 22 | 'error' => $model->getLastException() ? $model->getLastException()->getMessage() : null, 23 | 'queriesInThread' => $model->getGeneralLogModel() 24 | ->calcQueriesInThread($this->request->getParam('threadId')) 25 | ]); 26 | 27 | $tpl = $explain ? 'exec/explain' : 'errors/modal'; 28 | $this->render($tpl); 29 | } 30 | 31 | public function actionSql() 32 | { 33 | $model = new \models\ExecSqlForm(); 34 | $this->applyGetAttributes($model); 35 | $model->run = 1; 36 | 37 | if ($this->posted($model) && $model->validate()) { 38 | $execSql = new \models\ExecSql( 39 | $this->registry, 40 | $model->db, 41 | $model->commandType, 42 | $model->sql 43 | ); 44 | 45 | $this->view->assignData([ 46 | 'result' => $execSql->exec(), 47 | 'error' => $execSql->getLastException() ? $execSql->getLastException()->getMessage() : null, 48 | ]); 49 | } 50 | 51 | $this->render('exec/sql', [ 52 | 'model' => $model 53 | ]); 54 | } 55 | } -------------------------------------------------------------------------------- /protected/project/controllers/Index.php: -------------------------------------------------------------------------------- 1 | view->getLayout()->curLink = 'generalLog'; 12 | $this->view->getLayout()->assignData([ 13 | 'pageTitle' => 'General log' 14 | ]); 15 | } 16 | 17 | public function actionIndex() 18 | { 19 | $generalLog = new \tables\GeneralLog(); 20 | 21 | $filter = new \models\GeneralLogFilter(); 22 | $this->setAttrsForModels([$filter], ['post', 'get']); 23 | 24 | $grid = new \grids\GeneralLog($this->registry, $generalLog); 25 | $grid->setFilter($filter); 26 | 27 | $this->render('index/index', [ 28 | 'generalLog' => $generalLog, 29 | 'grid' => $grid 30 | ]); 31 | } 32 | 33 | public function actionSetLoggerActive() 34 | { 35 | $mysqlLog = new \tables\GeneralLog(); 36 | $mysqlLog->setLogActive((boolean) $this->request->getParam('value')); 37 | 38 | $this->redirect($this->makeLink('index/index')); 39 | } 40 | 41 | public function actionCreateKeys() 42 | { 43 | $model = new \tables\GeneralLog(); 44 | 45 | if (!$model->isKeysCreated()) 46 | $model->createKeys(); 47 | 48 | $this->redirect($this->makeLink('index/index')); 49 | } 50 | 51 | public function actionClearLogs() 52 | { 53 | $model = new \tables\GeneralLog(); 54 | $model->clearLogs(); 55 | 56 | $this->flashMessenger->add('Logs was successfully cleared.'); 57 | $this->redirect($this->makeLink('index/index')); 58 | } 59 | } -------------------------------------------------------------------------------- /protected/project/controllers/Setup.php: -------------------------------------------------------------------------------- 1 | view->getLayout()->assignData([ 15 | 'curLink' => 'setup', 16 | 'pageHeader' => 'Setup mysql connection', 17 | 'pageTitle' => 'Setup mysql connection' 18 | ]); 19 | } 20 | 21 | public function actionIndex() 22 | { 23 | $mysqlDSN = getenv('MYSQL_DSN') ?: ''; 24 | if (!empty($mysqlDSN)) { 25 | $this->flashMessenger->add('Setup available only if you dont specify ENV variables.', FlashMessenger::ERROR); 26 | $this->redirect($this->makeLink('index/index')); 27 | return; 28 | } 29 | 30 | $model = new \models\SetupMysql(); 31 | 32 | if ($this->posted($model) && $model->validate()) { 33 | $model->save(); 34 | 35 | $this->flashMessenger->add('Form was successfully saved.'); 36 | $this->redirect($this->makeLink('index/index')); 37 | } 38 | 39 | $this->render('setup/index', [ 40 | 'model' => $model 41 | ]); 42 | } 43 | } -------------------------------------------------------------------------------- /protected/project/helpers/SqlFormatter.php: -------------------------------------------------------------------------------- 1 | generalLogModel->isAllowExecute($this->commandType, $this->sql)) 10 | throw new \RuntimeException('This query is not allowed to explain!'); 11 | 12 | $stmt = $this->connection->prepare($this->sql); 13 | $stmt->execute(); 14 | 15 | $out = $stmt->fetchAll(\PDO::FETCH_ASSOC); 16 | $stmt->closeCursor(); 17 | 18 | return $out; 19 | } 20 | } -------------------------------------------------------------------------------- /protected/project/models/ExecSqlForm.php: -------------------------------------------------------------------------------- 1 | [ 21 | ['required'] 22 | ], 23 | 'commandType' => [ 24 | ['required'] 25 | ], 26 | 'sql' => [ 27 | ['required'] 28 | ], 29 | 'db' => [ 30 | ['required'] 31 | ], 32 | 'run' => [ 33 | ['required'] 34 | ], 35 | ]; 36 | } 37 | } -------------------------------------------------------------------------------- /protected/project/models/ExplainQuery.php: -------------------------------------------------------------------------------- 1 | generalLogModel->isAllowExplain($this->commandType, $this->sql)) 11 | throw new \RuntimeException('This query is not allowed to explain!'); 12 | 13 | $stmt = $this->connection->prepare('explain ' . $this->sql); 14 | $stmt->execute(); 15 | 16 | $out = $stmt->fetchAll(\PDO::FETCH_ASSOC); 17 | $stmt->closeCursor(); 18 | 19 | return $out; 20 | } 21 | } -------------------------------------------------------------------------------- /protected/project/models/GeneralLogFilter.php: -------------------------------------------------------------------------------- 1 | [], 29 | 'serverId' => [], 30 | 'commandType' => [ 31 | ['validateCommandType'] 32 | ], 33 | 'argument' => [], 34 | 'eventTime' => [], 35 | 'userHost' => [], 36 | 'sortBy' => [ 37 | ['validateSortBy'] 38 | ], 39 | 'p' => [] 40 | ]; 41 | } 42 | 43 | public function validateCommandType($attr) 44 | { 45 | if (!array_key_exists($this->commandType, $this->getCommandTypeOptions())) 46 | $this->addError($attr, 'Incorrect value'); 47 | } 48 | 49 | public function getCommandTypeOptions(array $out = []) 50 | { 51 | if (!isset($this->commandTypeOptions)) { 52 | $table = new \tables\GeneralLog(); 53 | $this->commandTypeOptions = $table->getCommandTypeOptions(); 54 | } 55 | 56 | return array_merge($out, $this->commandTypeOptions); 57 | } 58 | 59 | public function validateSortBy($attr) 60 | { 61 | if (!array_key_exists($this->sortBy, $this->getSortByOptions())) 62 | $this->addError($attr, 'Incorrect value'); 63 | } 64 | 65 | public function getSortByOptions(array $out = []) 66 | { 67 | return array_merge($out, [ 68 | 'default' => 'By event time desc, grouped by thread', 69 | 'event_time_asc' => 'Event time ASC', 70 | 'event_time_desc' => 'Event time DESC', 71 | 'thread_id_asc' => 'Thread id ASC', 72 | 'thread_id_desc' => 'Thread id DESC', 73 | ]); 74 | } 75 | } -------------------------------------------------------------------------------- /protected/project/tables/MysqlCredentials.php: -------------------------------------------------------------------------------- 1 | makeStmt(" 12 | create table if not exists mysql_credentials ( 13 | mysql_id INTEGER PRIMARY KEY, 14 | mysql_dsn TEXT NULL default null, 15 | mysql_username TEXT NULL default null, 16 | mysql_password TEXT NULL default null, 17 | mysql_options TEXT NULL default null 18 | ) 19 | "); 20 | $stmt->execute(); 21 | } 22 | 23 | public function getMysqlConnection(): PDO|false|null 24 | { 25 | $this->createTable(); 26 | $row = $this->findMysqlCredentials(); 27 | 28 | if (!$row) { 29 | return null; 30 | } 31 | 32 | return self::createConnectionByRow($row); 33 | } 34 | 35 | public static function createConnectionByRow(array $row): PDO|false 36 | { 37 | try { 38 | $options = ($row['mysql_options']) ? json_decode($row['mysql_options'], true) : []; 39 | $pdo = new PDO($row['mysql_dsn'], $row['mysql_username'], $row['mysql_password'], $options); 40 | $pdo->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION); 41 | $pdo->exec('set names utf8'); 42 | } catch (\Exception $e) { 43 | return false; 44 | } 45 | 46 | return $pdo; 47 | } 48 | 49 | public function findMysqlCredentials() 50 | { 51 | return $this->find(); 52 | } 53 | 54 | /** 55 | * Return table name. 56 | * 57 | * @return string 58 | */ 59 | public function getTableName() 60 | { 61 | return 'mysql_credentials'; 62 | } 63 | 64 | /** 65 | * Primary keys fields. 66 | * 67 | * @return array 68 | */ 69 | public function getPk() 70 | { 71 | return ['mysql_id']; 72 | } 73 | } -------------------------------------------------------------------------------- /protected/project/views/errors/error.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Error! 9 | 10 | 11 |
    12 | renderPartial('layout/navBar')?> 13 |

    14 |
    15 | 16 | -------------------------------------------------------------------------------- /protected/project/views/errors/modal.php: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /protected/project/views/exec/explain.php: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /protected/project/views/exec/sql.php: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /protected/project/views/exec/sql/form.php: -------------------------------------------------------------------------------- 1 | helper('html'); 5 | ?> 6 |
    7 | 8 |

    9 | 10 | 11 | renderPartial('exec/sql/result'); 14 | ?> 15 | 16 | hidden($model, 'threadId')?> 17 | hidden($model, 'commandType')?> 18 | hidden($model, 'db')?> 19 | hidden($model, 'run')?> 20 | 21 | formGroup($model, 'sql')?> 22 | label($model, 'sql', 'SQL:')?> 23 | textArea($model, 'sql', [ 24 | 'class' => 'form-control', 25 | 'rows' => 8, 26 | 'value' => $this->helper('sqlFormatter')->format($model->sql, false) 27 | ])?> 28 | errors($model, 'sql')?> 29 | errors($model, 'threadId')?> 30 | errors($model, 'commandType')?> 31 | errors($model, 'run')?> 32 | 33 |
    34 | 35 |
    36 |
    -------------------------------------------------------------------------------- /protected/project/views/exec/sql/result.php: -------------------------------------------------------------------------------- 1 | helper('html'); 4 | ?> 5 | 6 |

    Empty result

    7 | 8 |
    9 | 10 | 11 | 12 | $value):?> 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | $value):?> 21 | 22 | 23 | 24 | 25 | 26 |
    encode($value)?>
    27 |
    28 | -------------------------------------------------------------------------------- /protected/project/views/index/controls.php: -------------------------------------------------------------------------------- 1 | helper('link'); 5 | ?> 6 | isLogActive()):?> 7 | isKeysCreated()):?> 8 |
    9 | Warning! General_log table does not have indexes. Selecting from this table can be slow. 10 | Create keys 11 |
    12 | 13 | 14 |
    15 |

    16 | 22 | 23 | Clear logs 24 | 25 |

    26 |
    27 |
    28 | isLogActive()):?> 29 |

    30 | Logger is active. 31 | 36 | 37 | Turn off 38 | 39 |

    40 | 41 |
    42 |
    -------------------------------------------------------------------------------- /protected/project/views/index/grid/pagination.php: -------------------------------------------------------------------------------- 1 | helper('html'); 7 | $link = $this->helper('link'); 8 | 9 | $pager = $grid->getPager(); 10 | $pagesInRange = $pager->getPagesInRange(); 11 | $filter = $grid->getFilter(); 12 | 13 | $attrName = $html->name($filter, 'p'); 14 | 15 | $url = $link->get('index/index'); 16 | $url->appendModelAttrs($filter); 17 | ?> 18 | -------------------------------------------------------------------------------- /protected/project/views/index/grid/paginationInfo.php: -------------------------------------------------------------------------------- 1 | getPager(); 4 | ?> 5 |

    6 | Treads count: getTreadsCount()?> 7 | Rows: getItemCount()?>, 8 | Pages: getPageCount()?> 9 |

    -------------------------------------------------------------------------------- /protected/project/views/index/index.php: -------------------------------------------------------------------------------- 1 | isLogActive()) { 5 | echo $this->renderPartial('index/switchOn'); 6 | } 7 | 8 | echo $this->renderPartial('index/controls'); 9 | echo $this->renderPartial('index/grid'); -------------------------------------------------------------------------------- /protected/project/views/index/switchOn.php: -------------------------------------------------------------------------------- 1 | helper('link'); 5 | ?> 6 |
    7 |

    Logger is disabled!

    8 |

    9 | 14 | 15 | Turn on! 16 | 17 |

    18 |
    -------------------------------------------------------------------------------- /protected/project/views/layout.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 16 | <?=isset($pageTitle) ? $pageTitle : 'Beaver mysql logger'?> 17 | 18 | 19 |
    20 | renderPartial('layout/navBar')?> 21 | renderPartial('layout/pageHeader')?> 22 | renderPartial('layout/flashMessenger')?> 23 | 24 |
    25 |
    Loading...
    26 | 29 | 32 | 33 | -------------------------------------------------------------------------------- /protected/project/views/layout/flashMessenger.php: -------------------------------------------------------------------------------- 1 | helper('flashMessenger')->get() as $type => $text):?> 2 | 5 | -------------------------------------------------------------------------------- /protected/project/views/layout/navBar.php: -------------------------------------------------------------------------------- 1 | helper('link'); 4 | $links = [ 5 | 'generalLog' => ['General log', $link->get('index/index')], 6 | ]; 7 | 8 | if (!\eventHandlers\Setup::isMySQLDSNSpecified()) { 9 | $links['setup'] = ['Setup', $link->get('setup/index')]; 10 | } 11 | 12 | $curLink = isset($curLink) ? $curLink : null; 13 | ?> 14 | -------------------------------------------------------------------------------- /protected/project/views/layout/pageHeader.php: -------------------------------------------------------------------------------- 1 | 5 | -------------------------------------------------------------------------------- /protected/project/views/setup/index.php: -------------------------------------------------------------------------------- 1 |
    2 |
    3 | renderPartial('setup/mysqlForm')?> 4 |
    5 |
    -------------------------------------------------------------------------------- /protected/project/views/setup/mysqlForm.php: -------------------------------------------------------------------------------- 1 | helper('html'); 4 | ?> 5 |
    6 | formGroup($model, 'dsn')?> 7 | label($model, 'dsn', 'DSN (PDO):')?> 8 | text($model, 'dsn', [ 9 | 'class' => 'form-control', 10 | 'placeholder' => 'mysql:host=localhost;dbname=mysql' 11 | ])?> 12 |

    13 | Database must be "mysql". DSN example: mysql:host=localhost;dbname=mysql. 14 | About DSN. 15 |

    16 | errors($model, 'dsn')?> 17 | 18 | formGroup($model, 'username')?> 19 | label($model, 'username', 'Username:')?> 20 | text($model, 'username', ['class' => 'form-control'])?> 21 | errors($model, 'username')?> 22 | 23 | formGroup($model, 'password')?> 24 | label($model, 'password', 'Password:')?> 25 | text($model, 'password', [ 26 | 'type' => 'password', 27 | 'class' => 'form-control' 28 | ])?> 29 | errors($model, 'password')?> 30 | 31 | formGroup($model, 'options')?> 32 | label($model, 'options', 'Options (json):')?> 33 | textArea($model, 'options', ['class' => 'form-control'])?> 34 | errors($model, 'options')?> 35 | 36 |
    37 | 38 |
    39 |
    -------------------------------------------------------------------------------- /protected/tests/KZ/FlashMessengerTest.php: -------------------------------------------------------------------------------- 1 | 'test' 11 | ]); 12 | $this->assertEquals('test', $messenger->getSessionPrefix()); 13 | $this->assertTrue(isset($_SESSION['test'])); 14 | 15 | $this->assertEquals(0, $messenger->add('success msg')); 16 | $this->assertEquals(1, $messenger->add('error msg', FlashMessenger::ERROR)); 17 | 18 | foreach ($messenger as $type => $text) { 19 | if ($type == FlashMessenger::SUCCESS) { 20 | $this->assertEquals('success msg', $text); 21 | } else { 22 | $this->assertEquals('error msg', $text); 23 | } 24 | } 25 | 26 | $messenger->delete(0); 27 | $messenger->delete(1); 28 | 29 | $noItems = true; 30 | foreach ($messenger as $type => $text) 31 | $noItems = false; 32 | 33 | $this->assertTrue($noItems); 34 | } 35 | 36 | public function testAutoRemoving() 37 | { 38 | $messenger = new FlashMessenger(); 39 | $messenger->add('test'); 40 | 41 | $messenger = new FlashMessenger(); 42 | $itemsExists = false; 43 | foreach ($messenger as $type => $text) 44 | $itemsExists = true; 45 | 46 | $this->assertTrue($itemsExists); 47 | 48 | $messenger = new FlashMessenger(); 49 | $itemsExists = false; 50 | foreach ($messenger as $type => $text) 51 | $itemsExists = true; 52 | 53 | //on third time, no items should be. 54 | $this->assertFalse($itemsExists); 55 | } 56 | 57 | public function testExtendLivePeriod() 58 | { 59 | $messenger = new FlashMessenger(); 60 | $messenger->add('test'); 61 | 62 | $messenger = new FlashMessenger(); 63 | $messenger->extend(); 64 | 65 | $messenger = new FlashMessenger(); 66 | 67 | $itemsExists = false; 68 | foreach ($messenger as $type => $text) 69 | $itemsExists = true; 70 | 71 | $this->assertTrue($itemsExists); 72 | } 73 | } -------------------------------------------------------------------------------- /protected/tests/KZ/LinkTest.php: -------------------------------------------------------------------------------- 1 | 'b', 11 | 'c' => 'd' 12 | ]; 13 | 14 | $link = new Link('test/action', $params); 15 | $this->assertEquals('test/action', $link->getRoute()); 16 | $this->assertEquals($params, $link->getParams()); 17 | 18 | $link->setParams([ 19 | 'c' => 1, 20 | 'e' => 2 21 | ]); 22 | $this->assertEquals([ 23 | 'a' => 'b', 24 | 'c' => 1, 25 | 'e' => 2 26 | ], $link->getParams()); 27 | 28 | $url = '?r=test%2Faction&a=b&c=1&e=2'; 29 | $this->assertEquals($url, $link->getLink()); 30 | $this->assertEquals($url, $link->__toString()); 31 | 32 | $link->setScriptName('/htdocs/test.php'); 33 | $this->assertEquals('/htdocs/test.php', $link->getScriptName()); 34 | $this->assertEquals('/htdocs/test.php' . $url, $link->getLink()); 35 | 36 | $link->clearParams(); 37 | $this->assertEquals([], $link->getParams()); 38 | } 39 | 40 | public function testSettingRequest() 41 | { 42 | $request = $this->makeRequest(); 43 | $request 44 | ->expects($this->once()) 45 | ->method('getScriptName') 46 | ->will($this->returnValue('/htdocs/test.php')) 47 | ; 48 | 49 | $link = new Link('test'); 50 | $link->setRequest($request); 51 | 52 | $this->assertEquals('/htdocs/test.php?r=test', $link->getLink()); 53 | } 54 | 55 | /** 56 | * @return controller\interfaces\Request 57 | */ 58 | protected function makeRequest() 59 | { 60 | return $this->getMock('\KZ\controller\Request', ['getScriptName', 'isAjaxRequest']); 61 | } 62 | } -------------------------------------------------------------------------------- /protected/tests/KZ/app/RegistryTest.php: -------------------------------------------------------------------------------- 1 | add($sqlite, db\ConnectionStorage::SQLITE, 'db', true); 16 | 17 | $registry = new app\Registry(); 18 | $registry->connectionStorage = $cs; 19 | 20 | $this->assertEquals($cs, $registry->getConnectionStorage()); 21 | $this->assertEquals($sqlite, $registry->getDb()); 22 | } 23 | 24 | public function testKit() 25 | { 26 | $kit = new app\Kit([]); 27 | 28 | $registry = new app\Registry(); 29 | $registry->setKit($kit); 30 | 31 | $this->assertEquals($kit, $registry->getKit()); 32 | } 33 | } -------------------------------------------------------------------------------- /protected/tests/KZ/db/ConnectionStorageTest.php: -------------------------------------------------------------------------------- 1 | getMock('\KZ\db\PDOMock'); 11 | $connectionStorage = new db\ConnectionStorage(); 12 | 13 | $this->assertEquals('test', $connectionStorage->add($pdo, db\ConnectionStorage::MYSQL, 'test')); 14 | $this->assertInstanceOf('PDO', $connectionStorage->getByName('test')); 15 | $this->assertEquals(['test' => $pdo], $connectionStorage->getByType(db\ConnectionStorage::MYSQL)); 16 | $this->assertNull($connectionStorage->getDefault()); 17 | 18 | $connectionStorage->add($pdo, db\ConnectionStorage::MYSQL, null, true); 19 | $this->assertInstanceOf('PDO', $connectionStorage->getDefault()); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /protected/tests/KZ/db/TableTest.php: -------------------------------------------------------------------------------- 1 | getMock('\KZ\db\PDOMock', null, ['dsnA']); 10 | $pdoB = $this->getMock('\KZ\db\PDOMock', null, ['dsnB']); 11 | 12 | table\Mysql::setDefaultConnection($pdoA); 13 | table\SQLite::setDefaultConnection($pdoB); 14 | 15 | $this->assertEquals('dsnA', table\Mysql::getDefaultConnection()->getDsn()); 16 | $this->assertEquals('dsnB', table\SQLite::getDefaultConnection()->getDsn()); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /protected/tests/KZ/event/EventTest.php: -------------------------------------------------------------------------------- 1 | 'b', 13 | 'c' => 'd' 14 | ]); 15 | 16 | $this->assertFalse($event->isDefaultPrevented()); 17 | $event->preventDefault(); 18 | 19 | $this->assertTrue($event->isDefaultPrevented()); 20 | $this->assertTrue($event->hasParam('a')); 21 | $this->assertTrue($event->hasParam('c')); 22 | 23 | $this->assertEquals('b', $event->getParam('a')); 24 | $this->assertEquals('d', $event->getParam('c')); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /protected/tests/KZ/grid/PagerTest.php: -------------------------------------------------------------------------------- 1 | assertEquals(100, $pager->getItemCount()); 12 | 13 | $pager->setPageSize(100); 14 | $this->assertEquals(100, $pager->getPageSize()); 15 | } 16 | 17 | public function testCalc() 18 | { 19 | $pager = new Pager(27); 20 | $pager 21 | ->setPageSize(4) 22 | ->setCurrentPage(7) 23 | ; 24 | 25 | $this->assertEquals(4, $pager->getLimit()); 26 | $this->assertEquals(24, $pager->getOffset()); 27 | $this->assertEquals(7, $pager->getPageCount()); 28 | 29 | $pager->setCurrentPage(1); 30 | $this->assertEquals(0, $pager->getOffset()); 31 | } 32 | 33 | public function testUnavailablePage() 34 | { 35 | $pager = new Pager(27); 36 | $pager 37 | ->setPageSize(4) 38 | ->setCurrentPage(10) // this page is un-available! 39 | ; 40 | 41 | $this->assertEquals(0, $pager->getOffset()); 42 | $this->assertEquals(1, $pager->getCurrentPage()); 43 | } 44 | 45 | public function testPagesInRange() 46 | { 47 | $pager = new Pager(100); 48 | $pager 49 | ->setPageSize(2) 50 | ->setPageRange(5) 51 | ; 52 | 53 | $this->assertEquals([1,2,3,4,5], $pager->getPagesInRange()); 54 | 55 | $pager->setCurrentPage(50); 56 | $this->assertEquals([46,47,48,49,50], $pager->getPagesInRange()); 57 | 58 | $pager->setCurrentPage(30); 59 | $this->assertEquals([28,29,30,31,32], $pager->getPagesInRange()); 60 | 61 | $pager = new Pager(10); 62 | $pager 63 | ->setPageSize(5) 64 | ->setPageRange(5) 65 | ; 66 | $this->assertEquals([1,2], $pager->getPagesInRange()); 67 | } 68 | 69 | public function testEmptyPager() 70 | { 71 | $pager = new Pager(0); 72 | $pager 73 | ->setPageSize(2) 74 | ->setPageRange(5) 75 | ; 76 | 77 | $this->assertEquals([], $pager->getPagesInRange()); 78 | } 79 | } 80 | -------------------------------------------------------------------------------- /protected/tests/KZ/view/HelperKitTest.php: -------------------------------------------------------------------------------- 1 | [ 11 | 'a' => 'b' 12 | ] 13 | ]; 14 | 15 | $helperKit = new HelperKit($config); 16 | $this->assertEquals($config, $helperKit->getConfig()); 17 | } 18 | 19 | public function testHelper() 20 | { 21 | $helper = $this->makeHelper(); 22 | 23 | $helperKit = new HelperKit(); 24 | $helperKit->setConfig([ 25 | 'helpers' => [ 26 | 'test' => get_class($helper) 27 | ] 28 | ]); 29 | 30 | $this->assertTrue($helperKit->helperExists('test')); 31 | $this->assertEquals(get_class($helper), $helperKit->getHelperClass('test')); 32 | 33 | $helperInstance = $helperKit->getHelper('test'); 34 | $this->assertInstanceOf(get_class($helper), $helperInstance); 35 | 36 | $this->assertEquals($helperInstance, $helperKit->getHelper('test')); 37 | } 38 | 39 | public function testException() 40 | { 41 | $helperKit = new HelperKit([ 42 | 'helpers' => [ 43 | 'test' => 'stdClass' 44 | ] 45 | ]); 46 | 47 | $this->setExpectedException('RuntimeException', '"test" must be instance \KZ\view\interfaces\Helper.'); 48 | $helperKit->getHelper('test'); 49 | } 50 | 51 | /** 52 | * @return interfaces\Helper 53 | */ 54 | protected function makeHelper() 55 | { 56 | return $this->getMock('\KZ\view\interfaces\Helper'); 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /protected/tests/bootstrap.php: -------------------------------------------------------------------------------- 1 | 5 | 6 | ./ 7 | 8 | 9 | -------------------------------------------------------------------------------- /protected/tests/project/components/app/RegistryTest.php: -------------------------------------------------------------------------------- 1 | add($sqlite, db\ConnectionStorage::SQLITE, 'db', true); 15 | $cs->add($mysql, db\ConnectionStorage::MYSQL, null, false); 16 | 17 | $registry = new \components\app\Registry(); 18 | $registry->connectionStorage = $cs; 19 | 20 | $this->assertEquals($cs, $registry->getConnectionStorage()); 21 | $this->assertEquals($sqlite, $registry->getDb()); 22 | $this->assertEquals($mysql, $registry->getMysql()); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /runtime/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore --------------------------------------------------------------------------------