├── .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 | 
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 | 
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 |
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 |
8 | Home
9 |
10 |
11 | Home
12 | Library
13 |
14 |
15 | Home
16 | Library
17 | Data
18 |
19 |
20 | {% highlight html %}
21 |
22 | Home
23 | Library
24 | Data
25 |
26 | {% endhighlight %}
27 |
28 |
--------------------------------------------------------------------------------
/assets/src/bootstrap/docs/_includes/components/jumbotron.html:
--------------------------------------------------------------------------------
1 |
2 |
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 |
18 | {% endhighlight %}
19 |
To make the jumbotron full width, and without rounded corners, place it outside all .container
s and instead add a .container
within.
20 | {% highlight html %}
21 |
26 | {% endhighlight %}
27 |
28 |
--------------------------------------------------------------------------------
/assets/src/bootstrap/docs/_includes/components/labels.html:
--------------------------------------------------------------------------------
1 |
2 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
21 | {% highlight html %}
22 |
23 |
24 |
25 | {% endhighlight %}
26 |
27 |
--------------------------------------------------------------------------------
/assets/src/bootstrap/docs/_includes/getting-started/accessibility.html:
--------------------------------------------------------------------------------
1 |
2 |
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 |
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 |
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 | Omit the viewport <meta>
mentioned in the CSS docs
10 | 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.
11 | If using navbars, remove all navbar collapsing and expanding behavior.
12 | 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.
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 |
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 |
7 | Include the license and copyright notice in your works
8 |
9 |
10 |
It permits you to:
11 |
12 | Freely download and use Bootstrap, in whole or in part, for personal, private, company internal, or commercial purposes
13 | Use Bootstrap in packages or distributions that you create
14 | Modify the source code
15 | Grant a sublicense to modify and distribute Bootstrap to third parties not included in the license
16 |
17 |
18 |
It forbids you to:
19 |
20 | Hold the authors and license owners liable for damages as Bootstrap is provided without warranty
21 | Hold the creators or copyright holders of Bootstrap liable
22 | Redistribute any piece of Bootstrap without proper attribution
23 | Use any marks owned by Twitter in any way that might state or imply that Twitter endorses your distribution
24 | Use any marks owned by Twitter in any way that might state or imply that you created the Twitter software in question
25 |
26 |
27 |
It does not require you to:
28 |
29 | Include the source of Bootstrap itself, or of any modifications you may have made to it, in any redistribution you may assemble that includes it
30 | Submit changes that you make to Bootstrap back to the Bootstrap project (though such feedback is encouraged)
31 |
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 |
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 |
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 |
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 |
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 |
2 |
3 |
12 |
13 |
30 |
34 |
35 |
36 |
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 |
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 | Take this action
26 | Or do this
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 |
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 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
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 |
16 | Popover on left
17 |
18 |
19 | Popover on top
20 |
21 |
22 | Popover on bottom
23 |
24 |
25 | Popover on right
26 |
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 | 
11 |
12 | DatePicker
13 |
14 | 
15 |
16 | TimePicker
17 |
18 | 
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 | =$this->renderPartial('layout/navBar')?>
13 |
=$error?>
14 |
15 |
16 |
--------------------------------------------------------------------------------
/protected/project/views/errors/modal.php:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/protected/project/views/exec/explain.php:
--------------------------------------------------------------------------------
1 |
2 |
3 |
7 |
8 |
9 |
10 |
11 |
12 | ID
13 | Select type
14 | Table
15 | Type
16 | Possible keys
17 | Key
18 | Key len
19 | Ref
20 | Rows
21 | Extra
22 |
23 |
24 |
25 |
26 |
27 | =$row['id']?>
28 | =$row['select_type']?>
29 | =$row['table']?>
30 | =$row['type']?>
31 |
32 | =implode(' ', explode(',', strval($row['possible_keys'])))?>
33 |
34 | =$row['key']?>
35 | =$row['key_len']?>
36 |
37 | =implode(' ', explode(',', strval($row['ref'])))?>
38 |
39 | =$row['rows']?>
40 |
41 | =implode(' ', explode(';', strval($row['Extra'])))?>
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 | =$this->helper('sqlFormatter')->format($query)?>
50 |
51 |
52 | Queries in tread: =$queriesInThread?>
53 |
54 |
55 |
58 |
59 |
--------------------------------------------------------------------------------
/protected/project/views/exec/sql.php:
--------------------------------------------------------------------------------
1 |
2 |
3 |
7 |
8 | =$this->renderPartial('exec/sql/form')?>
9 |
10 |
13 |
14 |
--------------------------------------------------------------------------------
/protected/project/views/exec/sql/form.php:
--------------------------------------------------------------------------------
1 | helper('html');
5 | ?>
6 |
--------------------------------------------------------------------------------
/protected/project/views/exec/sql/result.php:
--------------------------------------------------------------------------------
1 | helper('html');
4 | ?>
5 |
6 | Empty result
7 |
8 |
9 |
10 |
11 |
12 | $value):?>
13 | =$column?>
14 |
15 |
16 |
17 |
18 |
19 |
20 | $value):?>
21 | =$html->encode($value)?>
22 |
23 |
24 |
25 |
26 |
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 |
27 |
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: =$grid->getTreadsCount()?>
7 | Rows: =$pager->getItemCount()?>,
8 | Pages: =$pager->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 |
--------------------------------------------------------------------------------
/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 | =$this->renderPartial('layout/navBar')?>
21 | =$this->renderPartial('layout/pageHeader')?>
22 | =$this->renderPartial('layout/flashMessenger')?>
23 | =$content?>
24 |
25 |
26 |
29 |
32 |
33 |
--------------------------------------------------------------------------------
/protected/project/views/layout/flashMessenger.php:
--------------------------------------------------------------------------------
1 | helper('flashMessenger')->get() as $type => $text):?>
2 |
3 | =$text?>
4 |
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 |
15 |
16 |
27 |
28 |
29 | $props):?>
30 | class="active">
31 | =$props[0]?>
32 |
33 |
34 |
35 |
40 |
41 |
42 |
--------------------------------------------------------------------------------
/protected/project/views/layout/pageHeader.php:
--------------------------------------------------------------------------------
1 |
5 |
--------------------------------------------------------------------------------
/protected/project/views/setup/index.php:
--------------------------------------------------------------------------------
1 |
2 |
3 | =$this->renderPartial('setup/mysqlForm')?>
4 |
5 |
--------------------------------------------------------------------------------
/protected/project/views/setup/mysqlForm.php:
--------------------------------------------------------------------------------
1 | helper('html');
4 | ?>
5 |
--------------------------------------------------------------------------------
/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
--------------------------------------------------------------------------------