├── .github └── FUNDING.yml ├── .gitignore ├── .travis.yml ├── LICENSE ├── README.md ├── composer.json ├── koot ├── .htaccess ├── bin │ ├── metrics │ └── phpserver ├── config │ ├── config.php │ ├── databases.php │ ├── exception.php │ ├── mysql │ │ ├── ku_admin.mwb │ │ └── ku_admin.sql │ └── routes.php ├── controllers │ ├── admin │ │ ├── resources_controller.php │ │ ├── roles_controller.php │ │ └── users_controller.php │ ├── index_controller.php │ └── pages_controller.php ├── extensions │ ├── console │ │ └── empty │ ├── filters │ │ └── empty │ ├── helpers │ │ └── empty │ └── scaffolds │ │ └── empty ├── libs │ ├── active_record.php │ ├── app_controller.php │ ├── bootstrap.php │ ├── controller_admin.php │ ├── controller_rest.php │ ├── controller_scaffold.php │ ├── controller_scaffold_lite.php │ ├── httpk.php │ ├── lite_record.php │ ├── pages_trait.php │ └── view.php ├── locale │ └── es_ES │ │ └── LC_MESSAGES │ │ ├── default.mo │ │ └── default.po ├── models │ ├── permissions.php │ ├── resources.php │ ├── roles.php │ ├── users.php │ └── users_roles.php ├── phpunit.xml.dist ├── temp │ ├── cache │ │ └── empty │ ├── logs │ │ └── empty │ └── sqlite │ │ └── ku_admin.db ├── tests │ ├── Controller │ │ └── PagesControllerTest.php │ ├── KumbiaTestTrait.php │ └── bootstrap.php └── views │ ├── _shared │ ├── errors │ │ └── 404.phtml │ ├── partials │ │ ├── kumbia │ │ │ └── footer.phtml │ │ └── paginators │ │ │ ├── classic.phtml │ │ │ └── digg.phtml │ ├── scaffolds │ │ ├── kumbia │ │ │ ├── crear.phtml │ │ │ ├── index.phtml │ │ │ └── ver.phtml │ │ └── lite │ │ │ ├── page.phtml │ │ │ └── show.phtml │ └── templates │ │ ├── admin.phtml │ │ ├── csv.phtml │ │ ├── default.phtml │ │ ├── json.phtml │ │ ├── login │ │ └── login.phtml │ │ └── xml.phtml │ ├── admin │ ├── resources │ │ └── create.phtml │ ├── roles │ │ └── create.phtml │ └── users │ │ └── create.phtml │ ├── index │ └── index.phtml │ └── pages │ └── kumbia │ └── status.phtml ├── phpunit.xml.dist └── public ├── .htaccess ├── .user.ini ├── css ├── index.html ├── koot.min.css ├── koot.scss ├── koot │ ├── _koot.css │ ├── admin.css │ ├── flash.css │ ├── icons.css │ ├── logo.css │ ├── paginator.css │ ├── pico.css │ └── scaffold.css ├── kumbia.min.css └── kumbia │ ├── flash.css │ ├── icons.css │ ├── kumbia.css │ ├── paginator.css │ └── scaffold.css ├── favicon.ico ├── files ├── index.html └── upload │ └── index.html ├── img ├── datepicker │ ├── backstripes.gif │ ├── bg_header.jpg │ ├── bullet1.gif │ ├── bullet2.gif │ ├── cal-grey.gif │ ├── cal.gif │ └── gradient-e5e5e5-ffffff.gif ├── icons │ ├── delete.svg │ └── edit.svg ├── index.html ├── koot.svg ├── kumbia.svg ├── kumbiaphp.svg ├── login.jpg ├── logo.png ├── php7.svg ├── upload │ └── index.html └── welcome │ ├── permission_handling.avif │ ├── permission_handling.png │ ├── resource_management.avif │ ├── resource_management.png │ ├── role_based_access_control.avif │ ├── role_based_access_control.png │ ├── user_management.avif │ └── user_management.png ├── index.html ├── index.php ├── javascript ├── index.html └── jquery │ ├── jquery+kumbiaphp.min.js │ ├── jquery.kumbiaphp.js │ ├── jquery.kumbiaphp.min.js │ └── jquery.min.js ├── js ├── app.js └── minimal-theme-switcher.js ├── robots.txt ├── temp └── index.html └── web.config /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] 4 | patreon: # Replace with a single Patreon username 5 | open_collective: kumbiaphp 6 | ko_fi: # Replace with a single Ko-fi username 7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry 9 | liberapay: # Replace with a single Liberapay username 10 | issuehunt: # Replace with a single IssueHunt username 11 | otechie: # Replace with a single Otechie username 12 | custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /vendor 2 | /composer.lock 3 | /public/index.php 4 | 5 | /app/config/exception.php 6 | # temp 7 | /app/temp/* 8 | 9 | # custom configs 10 | phpunit.xml 11 | 12 | # IDEs 13 | .vscode/ 14 | .idea/ 15 | /nbproject 16 | 17 | # Mac filesystem dust 18 | .DS_Store 19 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: php 2 | dist: bionic 3 | 4 | php: 5 | - 7.4 6 | - 8.0 7 | - master 8 | 9 | matrix: 10 | allow_failures: 11 | - php: master 12 | # 7.2 and 7.3 for the Mockery class 13 | 14 | notifications: 15 | slack: kumbiaphp:51JaKQTXASwf52D8b32OyWb9 16 | # irc: "irc.freenode.org#kumbiaphp" 17 | # email: 18 | # - xxxxx@gmail.com 19 | 20 | 21 | # env: 22 | # - DB=mysql 23 | # - DB=pgsql 24 | # - DB=sqlite 25 | 26 | install: 27 | - composer install 28 | 29 | script: 30 | - vendor/bin/phpunit --configuration phpunit.xml.dist 31 | # - phpunit --configuration core/phpunit.xml.dist --coverage-text --colors --coverage-clover=coverage.clover 32 | # - wget https://scrutinizer-ci.com/ocular.phar 33 | # - php ocular.phar code-coverage:upload --format=php-clover coverage.clover -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | BSD 3-Clause License 2 | 3 | Copyright (c) 2019 - 2020, KumbiaPHP Team www.kumbiaphp.com 4 | All rights reserved. 5 | 6 | Redistribution and use in source and binary forms, with or without 7 | modification, are permitted provided that the following conditions are met: 8 | 9 | * Redistributions of source code must retain the above copyright notice, this 10 | list of conditions and the following disclaimer. 11 | 12 | * Redistributions in binary form must reproduce the above copyright notice, 13 | this list of conditions and the following disclaimer in the documentation 14 | and/or other materials provided with the distribution. 15 | 16 | * Neither the name of the copyright holder nor the names of its 17 | contributors may be used to endorse or promote products derived from 18 | this software without specific prior written permission. 19 | 20 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 21 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 22 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 23 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 24 | FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 25 | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 26 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 27 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 28 | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![Koot logo](https://raw.githubusercontent.com/KumbiaPHP/Koot/master/public/img/koot.svg) 2 | 3 | ## Koot 4 | 5 | Community backend to avoid repeating ourselves in new applications. 6 | 7 | ### Requirements 8 | 9 | * PHP >= 8.0 10 | * Composer 11 | * Multi language 12 | 13 | ### Install 14 | 15 | 1. Clone or download this repository 16 | 2. Rename folder to `koot` 17 | 3. Open the console and enter the `koot/` folder 18 | 4. Run command `composer install` to get the dependencies 19 | 20 | ### Run 21 | 22 | 1. Open the console and enter the `koot/app/` folder 23 | 2. Run command `bin/phpserver` 24 | 3. Open http://0.0.0.0:8001 in your browser 25 | 26 | ### Support us 27 | 28 | [Donate our collective](https://opencollective.com/kumbiaphp) 29 | 30 | Chat with us 31 | 32 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "kumbia/koot", 3 | "description": "KumbiaPHP admin", 4 | "keywords": [ 5 | "KumbiaPHP", 6 | "admin" 7 | ], 8 | "type": "project", 9 | "homepage": "https://kumbiaphp.com", 10 | "license": "BSD-3-Clause", 11 | "support": { 12 | "issues": "https://github.com/KumbiaPHP/Koot/issues", 13 | "slack": "https://slack.kumbiaphp.com" 14 | }, 15 | "authors": [ 16 | { 17 | "name": "Kumbia Community", 18 | "homepage": "https://github.com/KumbiaPHP/Koot/graphs/contributors" 19 | } 20 | ], 21 | "require": { 22 | "php": ">=8.0", 23 | "ext-pdo": "*", 24 | "ext-json": "*", 25 | "ext-curl": "*", 26 | "ext-gettext": "*", 27 | "kumbia/framework": "^1", 28 | "kumbia/activerecord": "^0.5" 29 | }, 30 | "require-dev": { 31 | "phpunit/phpunit": "^9" 32 | }, 33 | "autoload": { 34 | "psr-4": { 35 | "Koot\\": "koot/" 36 | } 37 | }, 38 | "config": { 39 | "optimize-autoloader": true, 40 | "sort-packages": true 41 | }, 42 | "funding": [ 43 | { 44 | "type": "Open Collective", 45 | "url": "https://opencollective.com/kumbiaphp" 46 | } 47 | ] 48 | } 49 | -------------------------------------------------------------------------------- /koot/.htaccess: -------------------------------------------------------------------------------- 1 | deny from all 2 | -------------------------------------------------------------------------------- /koot/bin/metrics: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | PATH=./vendor/bin:../../vendor/bin:~/.config/composer/vendor/bin:~/.composer/vendor/bin:$PATH 4 | 5 | phpmetrics --report-html="./temp/metrics" --exclude="tests,temp,features" . 6 | 7 | if [[ $? > 0 ]]; then 8 | #do log_error; 9 | echo 10 | echo phpmetrics not installed. Install with: 11 | echo composer global require phpmetrics/phpmetrics 12 | echo 13 | exit 1; 14 | fi 15 | 16 | echo 17 | echo Control+click to open: 18 | echo file://$PWD/temp/metrics/index.html 19 | echo 20 | # If you want open it in browser directly 21 | # xdg-open file://$PWD/temp/metrics/index.html 22 | # in Mac 23 | # open file://$PWD/temp/metrics/index.html 24 | 25 | # composer global require 'phpmetrics/phpmetrics' -------------------------------------------------------------------------------- /koot/bin/phpserver: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | php -S 0.0.0.0:8001 -t ../public -------------------------------------------------------------------------------- /koot/config/config.php: -------------------------------------------------------------------------------- 1 | [ 8 | /** 9 | * name: es el nombre de la aplicacion 10 | */ 11 | 'name' => 'KuAdmin', 12 | /** 13 | * database: base de datos a utilizar 14 | */ 15 | 'database' => 'development', 16 | /** 17 | * dbdate: formato de fecha por defecto de la aplicacion 18 | */ 19 | 'dbdate' => 'YYYY-MM-DD', 20 | /** 21 | * debug: muestra los errores en pantalla (On/off) 22 | */ 23 | 'debug' => 'On', 24 | /** 25 | * log_exceptions: muestra las excepciones en pantalla (On/off) 26 | */ 27 | 'log_exceptions' => 'On', 28 | /** 29 | * cache_template: descomentar para habilitar cache de template 30 | */ 31 | //'cache_template' => 'On', 32 | /** 33 | * cache_driver: driver para la cache (file, sqlite, memsqlite) 34 | */ 35 | 'cache_driver' => 'file', 36 | /** 37 | * metadata_lifetime: tiempo de vida de la metadata en cache 38 | */ 39 | 'metadata_lifetime' => '+1 year', 40 | /** 41 | * namespace_auth: espacio de nombres por defecto para Auth 42 | */ 43 | 'namespace_auth' => 'default', 44 | /** 45 | * routes: descomentar para activar routes en routes.php 46 | */ 47 | //'routes' => '1', 48 | ], 49 | ]; 50 | -------------------------------------------------------------------------------- /koot/config/databases.php: -------------------------------------------------------------------------------- 1 | [ 8 | 'dsn' => 'mysql:host=127.0.0.1;dbname=ku_admin;charset=utf8', 9 | 'username' => 'root', 10 | 'password' => '', 11 | 'params' => [ 12 | //PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8', //UTF8 en PHP < 5.3.6 13 | \PDO::ATTR_PERSISTENT => \true, //conexión persistente 14 | \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION 15 | ] 16 | ] 17 | ];*/ 18 | 19 | /** 20 | * Ejemplo de SQLite 21 | */ 22 | return ['default' => [ 23 | 'dsn' => 'sqlite:'.APP_PATH.'temp/sqlite/ku_admin.db', 24 | 'pdo' => 'On', 25 | ] 26 | ]; 27 | -------------------------------------------------------------------------------- /koot/config/exception.php: -------------------------------------------------------------------------------- 1 | [] 7 | ]; 8 | -------------------------------------------------------------------------------- /koot/config/mysql/ku_admin.mwb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KumbiaPHP/Koot/0636044c4d4e2285472ff4a714059c9f1a4621e9/koot/config/mysql/ku_admin.mwb -------------------------------------------------------------------------------- /koot/config/mysql/ku_admin.sql: -------------------------------------------------------------------------------- 1 | -- MySQL Script generated by MySQL Workbench 2 | -- Sun May 10 19:28:53 2020 3 | -- Model: New Model Version: 1.0 4 | -- MySQL Workbench Forward Engineering 5 | 6 | SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0; 7 | SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0; 8 | SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'; 9 | 10 | -- ----------------------------------------------------- 11 | -- Schema ku_admin 12 | -- ----------------------------------------------------- 13 | DROP SCHEMA IF EXISTS `ku_admin` ; 14 | 15 | -- ----------------------------------------------------- 16 | -- Schema ku_admin 17 | -- ----------------------------------------------------- 18 | CREATE SCHEMA IF NOT EXISTS `ku_admin` DEFAULT CHARACTER SET utf8 ; 19 | USE `ku_admin` ; 20 | 21 | -- ----------------------------------------------------- 22 | -- Table `ku_admin`.`permissions` 23 | -- ----------------------------------------------------- 24 | CREATE TABLE IF NOT EXISTS `ku_admin`.`permissions` ( 25 | `id` INT NOT NULL AUTO_INCREMENT, 26 | `roles_id` INT NOT NULL, 27 | `resources_id` INT NOT NULL, 28 | PRIMARY KEY (`id`), 29 | CONSTRAINT `fk_permissions__roles` 30 | FOREIGN KEY (`roles_id`) 31 | REFERENCES `ku_admin`.`roles` (`id`) 32 | ON DELETE NO ACTION 33 | ON UPDATE NO ACTION, 34 | CONSTRAINT `fk_permissions__resources` 35 | FOREIGN KEY (`resources_id`) 36 | REFERENCES `ku_admin`.`resources` (`id`) 37 | ON DELETE NO ACTION 38 | ON UPDATE NO ACTION) 39 | ENGINE = InnoDB; 40 | 41 | CREATE INDEX `fk_permissions_roles_idx` ON `ku_admin`.`permissions` (`roles_id` ASC); 42 | 43 | CREATE INDEX `fk_permissions_resources_idx` ON `ku_admin`.`permissions` (`resources_id` ASC); 44 | 45 | 46 | -- ----------------------------------------------------- 47 | -- Table `ku_admin`.`resources` 48 | -- ----------------------------------------------------- 49 | CREATE TABLE IF NOT EXISTS `ku_admin`.`resources` ( 50 | `id` INT NOT NULL AUTO_INCREMENT, 51 | `name` VARCHAR(127) NOT NULL, 52 | `description` VARCHAR(255) NULL, 53 | `url` VARCHAR(255) NOT NULL, 54 | `module` VARCHAR(45) NULL, 55 | `controller` VARCHAR(45) NOT NULL, 56 | `action` VARCHAR(45) NOT NULL, 57 | `status` INT NOT NULL, 58 | PRIMARY KEY (`id`)) 59 | ENGINE = InnoDB; 60 | 61 | CREATE UNIQUE INDEX `resources_name_UNIQUE` ON `ku_admin`.`resources` (`name` ASC); 62 | 63 | CREATE UNIQUE INDEX `resources_url_UNIQUE` ON `ku_admin`.`resources` (`url` ASC); 64 | 65 | 66 | -- ----------------------------------------------------- 67 | -- Table `ku_admin`.`roles` 68 | -- ----------------------------------------------------- 69 | CREATE TABLE IF NOT EXISTS `ku_admin`.`roles` ( 70 | `id` INT NOT NULL AUTO_INCREMENT, 71 | `name` VARCHAR(45) NULL, 72 | `status` INT NOT NULL, 73 | PRIMARY KEY (`id`)) 74 | ENGINE = InnoDB; 75 | 76 | 77 | -- ----------------------------------------------------- 78 | -- Table `ku_admin`.`users` 79 | -- ----------------------------------------------------- 80 | CREATE TABLE IF NOT EXISTS `ku_admin`.`users` ( 81 | `id` INT NOT NULL AUTO_INCREMENT, 82 | `email` VARCHAR(255) NOT NULL, 83 | `username` VARCHAR(45) NULL, 84 | `password` VARCHAR(255) NULL, 85 | `first_name` VARCHAR(255) NULL, 86 | `middle_name` VARCHAR(255) NULL, 87 | `last_name` VARCHAR(255) NULL, 88 | `status` INT NOT NULL, 89 | PRIMARY KEY (`id`)) 90 | ENGINE = InnoDB; 91 | 92 | CREATE UNIQUE INDEX `users_email_UNIQUE` ON `ku_admin`.`users` (`email` ASC); 93 | 94 | 95 | -- ----------------------------------------------------- 96 | -- Table `ku_admin`.`users_roles` 97 | -- ----------------------------------------------------- 98 | CREATE TABLE IF NOT EXISTS `ku_admin`.`users_roles` ( 99 | `id` INT NOT NULL AUTO_INCREMENT, 100 | `users_id` INT NOT NULL, 101 | `roles_id` INT NOT NULL, 102 | PRIMARY KEY (`id`), 103 | CONSTRAINT `fk_users_roles__users` 104 | FOREIGN KEY (`users_id`) 105 | REFERENCES `ku_admin`.`users` (`id`) 106 | ON DELETE NO ACTION 107 | ON UPDATE NO ACTION, 108 | CONSTRAINT `fk_users_roles__roles` 109 | FOREIGN KEY (`roles_id`) 110 | REFERENCES `ku_admin`.`roles` (`id`) 111 | ON DELETE NO ACTION 112 | ON UPDATE NO ACTION) 113 | ENGINE = InnoDB; 114 | 115 | CREATE INDEX `fk_users_roles_users_idx` ON `ku_admin`.`users_roles` (`users_id` ASC); 116 | 117 | CREATE INDEX `fk_users_roles_roles_idx` ON `ku_admin`.`users_roles` (`roles_id` ASC); 118 | 119 | 120 | SET SQL_MODE=@OLD_SQL_MODE; 121 | SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS; 122 | SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS; 123 | -------------------------------------------------------------------------------- /koot/config/routes.php: -------------------------------------------------------------------------------- 1 | 'controlador2/accion2/valor_id2' 11 | * 12 | * Ej: 13 | * Enrutar cualquier petición a posts/adicionar a posts/insertar/* 14 | * '/posts/adicionar/*' => 'posts/insertar/*' 15 | * 16 | * Otros ejemplos: 17 | * 18 | * '/prueba/ruta1/*' => 'prueba/ruta2/*', 19 | * '/prueba/ruta2/*' => 'prueba/ruta3/*', 20 | */ 21 | return [ 22 | 'routes' => [ 23 | /** 24 | * Muestra la info relacionado con el framework 25 | */ 26 | '/' => 'index/index', 27 | /** 28 | * Status del config.php/config.ini 29 | */ 30 | '/status' => 'pages/kumbia/status' 31 | 32 | ], 33 | ]; 34 | -------------------------------------------------------------------------------- /koot/controllers/admin/resources_controller.php: -------------------------------------------------------------------------------- 1 | 26 | * Muestra un enlace que al hacer click irá a dominio.com/pages/aviso 27 | * 28 | */ 29 | class PagesController extends AppController 30 | { 31 | protected function before_filter() 32 | { 33 | // If is AJAX, send only the view 34 | if (Input::isAjax()) { 35 | View::template(null); 36 | } 37 | } 38 | 39 | public function __call($name, $params) 40 | { 41 | View::select(implode('/', [$name, ...$params])); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /koot/extensions/console/empty: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KumbiaPHP/Koot/0636044c4d4e2285472ff4a714059c9f1a4621e9/koot/extensions/console/empty -------------------------------------------------------------------------------- /koot/extensions/filters/empty: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KumbiaPHP/Koot/0636044c4d4e2285472ff4a714059c9f1a4621e9/koot/extensions/filters/empty -------------------------------------------------------------------------------- /koot/extensions/helpers/empty: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KumbiaPHP/Koot/0636044c4d4e2285472ff4a714059c9f1a4621e9/koot/extensions/helpers/empty -------------------------------------------------------------------------------- /koot/extensions/scaffolds/empty: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KumbiaPHP/Koot/0636044c4d4e2285472ff4a714059c9f1a4621e9/koot/extensions/scaffolds/empty -------------------------------------------------------------------------------- /koot/libs/active_record.php: -------------------------------------------------------------------------------- 1 | data = (new $this->model)->paginate("page: $page", 'order: id desc'); 22 | } 23 | 24 | /** 25 | * Crea un Registro 26 | */ 27 | public function crear() 28 | { 29 | if (Input::hasPost($this->model)) { 30 | 31 | $obj = new $this->model; 32 | //En caso que falle la operación de guardar 33 | if (!$obj->save(Input::post($this->model))) { 34 | Flash::error('Falló Operación'); 35 | //se hacen persistente los datos en el formulario 36 | $this->{$this->model} = $obj; 37 | return; 38 | } 39 | return Redirect::to(); 40 | } 41 | // Sólo es necesario para el autoForm 42 | $this->{$this->model} = new $this->model; 43 | } 44 | 45 | /** 46 | * Edita un Registro 47 | */ 48 | public function editar($id) 49 | { 50 | View::select('crear'); 51 | 52 | //se verifica si se ha enviado via POST los datos 53 | if (Input::hasPost($this->model)) { 54 | $obj = new $this->model; 55 | if (!$obj->update(Input::post($this->model))) { 56 | Flash::error('Falló Operación'); 57 | //se hacen persistente los datos en el formulario 58 | $this->{$this->model} = Input::post($this->model); 59 | } else { 60 | return Redirect::to(); 61 | } 62 | } 63 | 64 | //Aplicando la autocarga de objeto, para comenzar la edición 65 | $this->{$this->model} = (new $this->model)->find((int) $id); 66 | } 67 | 68 | /** 69 | * Borra un Registro 70 | */ 71 | public function borrar($id) 72 | { 73 | if (!(new $this->model)->delete((int) $id)) { 74 | Flash::error('Falló Operación'); 75 | } 76 | //enrutando al index para listar los articulos 77 | Redirect::to(); 78 | } 79 | 80 | /** 81 | * Ver un Registro 82 | */ 83 | public function ver($id) 84 | { 85 | $this->data = (new $this->model)->find_first((int) $id); 86 | } 87 | } -------------------------------------------------------------------------------- /koot/libs/controller_scaffold_lite.php: -------------------------------------------------------------------------------- 1 | data = $this->model::paginateQuery('SELECT * FROM ' . strtolower($this->model), 1, $this->perPage); 21 | } 22 | 23 | public function page(int $page = 1) 24 | { 25 | if ($page === 1) { 26 | Redirect::toAction(''); 27 | return; 28 | } 29 | 30 | $this->data = $this->model::paginateQuery('SELECT * FROM ' . strtolower($this->model), $page, $this->perPage); 31 | } 32 | 33 | public function create() 34 | { 35 | // It is verified if the data has been sent via POST 36 | if (Input::hasPost('data')) { 37 | $obj = new $this->model; 38 | // Try to save the user 39 | if ($obj->create(Input::post('data'))) { 40 | // Success message and return to the list 41 | Flash::valid(_('Record created ')); 42 | Redirect::toAction(''); 43 | return; 44 | } 45 | // If it fails the data is persistent in the form 46 | $this->data = Input::post('data'); 47 | } 48 | } 49 | 50 | public function edit(int $id) 51 | { 52 | View::select('create'); 53 | // Load the data from database 54 | $this->data = $this->model::get($id); 55 | //If not exist 56 | if (!$this->data) { 57 | Flash::warning(_('Record not found')); 58 | Redirect::toAction(''); 59 | return; 60 | } 61 | // It is verified if the data has been sent via POST 62 | if (Input::hasPost('data')) { 63 | // Try to save changes 64 | if ($this->data->update(Input::post('data'))) { 65 | // Success message and return to the list 66 | Flash::valid(_('Record updated')); 67 | Redirect::toAction(''); 68 | return; 69 | } 70 | // If it fails the data is persistent in the form 71 | $this->data = Input::post('data'); 72 | } 73 | } 74 | 75 | public function show(int $id) 76 | { 77 | $this->data = $this->model::get($id); 78 | } 79 | 80 | public function delete(int $id) 81 | { 82 | if (!$this->model::delete($id)) { 83 | Flash::error(_('Something was wrong')); 84 | } 85 | 86 | Redirect::toAction(''); 87 | } 88 | } 89 | -------------------------------------------------------------------------------- /koot/libs/httpk.php: -------------------------------------------------------------------------------- 1 | query = '?' . http_build_query($params); 41 | return $this; 42 | } 43 | 44 | public function header(string $header, string $value): self 45 | { 46 | $this->headers[$header] = $value; 47 | return $this; 48 | } 49 | 50 | public function headerArray(array $headers): self 51 | { 52 | $this->headers = array_merge($this->headers, $headers); // mmm review 53 | return $this; 54 | } 55 | 56 | public function body(string $data, string $type = 'application/json') 57 | { 58 | $this->body = $data; 59 | $this->headers['Content-Type'] = $type; 60 | return $this; 61 | } 62 | 63 | public function jsonBody(array $data): self 64 | { 65 | //añadir exception si falla 66 | return $this->body(json_encode($data)); 67 | } 68 | 69 | /** 70 | * Create a form urlencoded from an array 71 | * 72 | * @param array $data 73 | * @return self 74 | */ 75 | public function formBody(array $data): self 76 | { 77 | return $this->body(http_build_query($data), 'application/x-www-form-urlencoded'); 78 | } 79 | 80 | /** 81 | * https://www.php.net/manual/en/function.curl-setopt.php 82 | * https://curl.se/libcurl/c/curl_easy_setopt.html 83 | * 84 | * @param int $key A constant CURLOPT_xxxx 85 | * @param mixed $value 86 | */ 87 | public function setopt(int $key, $value): self 88 | { 89 | $this->curlopts[$key] = $value; 90 | return $this; 91 | } 92 | 93 | /** 94 | * https://www.php.net/manual/en/function.curl-setopt.php 95 | * https://curl.se/libcurl/c/curl_easy_setopt.html 96 | * 97 | * @param array $options A list of constants CURLOPT_XXXXXS and values 98 | */ 99 | public function setoptArray(array $options): self 100 | { 101 | $this->curlopts = $options + $this->curlopts; 102 | return $this; 103 | } 104 | 105 | protected function joinHeaders(): array 106 | { 107 | $headers = []; 108 | foreach ($this->headers as $key => $value) { 109 | $headers[] = "$key: $value"; 110 | } 111 | return $headers; 112 | } 113 | 114 | 115 | protected function getOptions(): array 116 | { 117 | $options = [ 118 | CURLOPT_USERAGENT => self::USER_AGENT, 119 | CURLOPT_URL => $this->url . $this->query, 120 | CURLOPT_CUSTOMREQUEST => $this->method, 121 | CURLOPT_HTTPHEADER => $this->joinHeaders(), 122 | CURLOPT_ENCODING => '', 123 | CURLOPT_RETURNTRANSFER => true, 124 | CURLOPT_FOLLOWLOCATION => true, 125 | CURLOPT_MAXREDIRS => 10, 126 | CURLOPT_CONNECTTIMEOUT => 5, 127 | CURLOPT_TIMEOUT => 5 128 | ]; 129 | 130 | if (isset($this->body)) { 131 | $options[CURLOPT_POSTFIELDS] = $this->body; 132 | } 133 | 134 | if ($this->curlopts) { 135 | $options = $this->curlopts + $options; 136 | } 137 | 138 | return $options; 139 | } 140 | 141 | public function send(): string 142 | { 143 | $ch = curl_init(); 144 | curl_setopt_array($ch, $this->getOptions()); 145 | 146 | $result = curl_exec($ch); 147 | if ($result === false) { 148 | $error = curl_error($ch); 149 | $errno = curl_errno($ch); 150 | curl_close($ch); 151 | throw new RuntimeException($error, $errno); 152 | } 153 | curl_close($ch); 154 | return $result; 155 | } 156 | 157 | /** 158 | * @return mixed 159 | */ 160 | public function getJson(bool $assoc = true, int $depth = 512, int $flags = 0) 161 | { 162 | $this->headers['Accept'] = 'application/json'; 163 | return json_decode($this->send(), $assoc, $depth, JSON_THROW_ON_ERROR|$flags); 164 | } 165 | // Use Kumbia parsers 166 | } 167 | -------------------------------------------------------------------------------- /koot/libs/lite_record.php: -------------------------------------------------------------------------------- 1 | getFields()); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /koot/libs/pages_trait.php: -------------------------------------------------------------------------------- 1 | status = 1; 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /koot/models/roles.php: -------------------------------------------------------------------------------- 1 | 'Super Admin', 7 | 2 => 'Editor', 8 | 3 => 'Author' 9 | ]; 10 | } 11 | -------------------------------------------------------------------------------- /koot/models/users.php: -------------------------------------------------------------------------------- 1 | status = 1; 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /koot/models/users_roles.php: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | ./tests 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | ./tests 27 | ../../core 28 | ../../vendor 29 | 30 | 31 | -------------------------------------------------------------------------------- /koot/temp/cache/empty: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KumbiaPHP/Koot/0636044c4d4e2285472ff4a714059c9f1a4621e9/koot/temp/cache/empty -------------------------------------------------------------------------------- /koot/temp/logs/empty: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KumbiaPHP/Koot/0636044c4d4e2285472ff4a714059c9f1a4621e9/koot/temp/logs/empty -------------------------------------------------------------------------------- /koot/temp/sqlite/ku_admin.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KumbiaPHP/Koot/0636044c4d4e2285472ff4a714059c9f1a4621e9/koot/temp/sqlite/ku_admin.db -------------------------------------------------------------------------------- /koot/tests/Controller/PagesControllerTest.php: -------------------------------------------------------------------------------- 1 | get('/pages/kumbia/status/'); 31 | $this->assertStringContainsString('

config.php', $actual); 32 | $this->assertResponseCode(200); 33 | } 34 | /** 35 | * Test no page to show 36 | */ 37 | public function testDisplayNoPage(): void 38 | { 39 | $this->expectWarning(); 40 | $this->expectWarningMessageMatches('/No such file or directory/'); 41 | 42 | $actual = $this->get('/pages/no_page/'); 43 | 44 | $this->expectException(KumbiaException::class); 45 | $this->assertResponseCode(404); 46 | $this->assertStringContainsString('

Vista "pages/no_page.phtml" no encontrada

', $actual); 47 | } 48 | 49 | /** 50 | * Test for bad people 51 | */ 52 | public function testBadPeople(): void 53 | { 54 | $this->expectException(KumbiaException::class); 55 | $actual = $this->get('/pages/../no_page/'); 56 | 57 | $this->assertResponseCode(404); 58 | $this->assertStringContainsString("Posible intento de hack en URL: '/pages/../no_page/'", $actual); 59 | } 60 | 61 | public function testObLevel(): void 62 | { 63 | $this->assertEquals(1, ob_get_level()); 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /koot/tests/KumbiaTestTrait.php: -------------------------------------------------------------------------------- 1 | assertSame( 29 | $code, 30 | $actual, 31 | "Status code is not $code but $actual." 32 | ); 33 | } 34 | /** 35 | * Request to Controller 36 | * 37 | * @param string $method HTTP method 38 | * @param string $url controller/method/arg|uri 39 | * @param array $params POST parameters/Query string 40 | */ 41 | protected function request($method, $url, $params = []) 42 | { 43 | $_SERVER['REQUEST_METHOD'] = $method; 44 | 45 | ob_start(); 46 | $start_ob_level = ob_get_level(); 47 | ob_start(); 48 | View::render(Router::execute($url)); 49 | while (ob_get_level() > $start_ob_level) { 50 | ob_end_flush(); 51 | } 52 | 53 | //$content = $this->getActualOutput(); 54 | return ob_get_clean(); 55 | } 56 | /** 57 | * GET Request to Controller 58 | * 59 | * @param string $url controller/method/arg|uri 60 | * @param array $params Query string 61 | */ 62 | public function get($url, $params = []) 63 | { 64 | return $this->request('GET', $url, $params); 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /koot/tests/bootstrap.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | ERROR 404 6 | 7 | 8 | 40 | 41 | 42 |
43 | 44 |

404

45 |

¡OOPS! Esta página no existe.

46 |

Ir a la página de inicio

47 |
48 | 49 | 50 | 51 | 52 | -------------------------------------------------------------------------------- /koot/views/_shared/partials/kumbia/footer.phtml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /koot/views/_shared/partials/paginators/classic.phtml: -------------------------------------------------------------------------------- 1 | totalPages(); 31 | $prev = $page->prevPage(); 32 | $next = $page->nextPage(); 33 | $page = $page->page(); 34 | // Calculando el inicio de paginador centrado 35 | if ($page <= $half) { 36 | $start = 1; 37 | } elseif (($pagetotal - $page) < $half) { 38 | $start = $pagetotal - $show + 1; 39 | if ($start < 1) { 40 | $start = 1; 41 | } 42 | } else { 43 | $start = $page - $half; 44 | } 45 | 46 | if ($pagetotal > 1) : ?> 47 | 66 | 67 | count(), ' items.' ?> -------------------------------------------------------------------------------- /koot/views/_shared/partials/paginators/digg.phtml: -------------------------------------------------------------------------------- 1 | page() <= $half) { 34 | $start = 1; 35 | } elseif (($page->totalPages() - $page->page()) < $half) { 36 | $start = $page->totalPages() - $show + 1; 37 | if ($start < 1) { 38 | $start = 1; 39 | } 40 | } else { 41 | $start = $page->page() - $half; 42 | } 43 | $last = false; 44 | if ($start === $page->totalPages()) { 45 | if ($start - 1 > 0) { 46 | $start -= 1; 47 | } 48 | 49 | $last = true; 50 | } 51 | ?> 52 | 53 | -------------------------------------------------------------------------------- /koot/views/_shared/scaffolds/kumbia/crear.phtml: -------------------------------------------------------------------------------- 1 |
2 | 3 |

$action_name" ?>

4 | 5 |
6 | 7 |
8 | 9 |
10 | Listado 11 |
12 | 13 |
14 | -------------------------------------------------------------------------------- /koot/views/_shared/scaffolds/kumbia/index.phtml: -------------------------------------------------------------------------------- 1 |
2 | 3 |

$action_name" ?>

4 |
5 | 6 |
7 | items) && (count($data->items) > 0)) : ?> 8 | 9 | 10 | items)->fields as $field) : ?> 11 | 12 | 13 | 14 | 15 | 16 | items as $item) : ?> 17 | 18 | fields as $field) : ?> 19 | 20 | 21 | 25 | 26 | 27 | 28 |
items)->get_alias($field))?>Acciones
$field)?>id", 'Ver')?> | 22 | id", 'Editar')?> | 23 | id", 'Borrar', 'onclick="return confirm(\'¿Está seguro?\')"') ?> 24 |
29 | $data ,'url' => Router::get('controller_path').'/index')) ?> 30 | 31 | 32 |

No hay ningún registro

33 | 34 |
35 | -------------------------------------------------------------------------------- /koot/views/_shared/scaffolds/kumbia/ver.phtml: -------------------------------------------------------------------------------- 1 |
2 | 3 | 4 |

$action_name" ?>

5 |
    6 | fields as $field) : ?> 7 |
  • alias[$field]?> : $field) ?>
  • 8 | 9 |
10 | 11 |
12 | Listado 13 | Crear registro 14 | Editar 15 | Borrar 16 |
17 | 18 | 19 |

No existe

20 |
21 | Listado 22 | Crear registro 23 |
24 | 25 |
26 | -------------------------------------------------------------------------------- /koot/views/_shared/scaffolds/lite/page.phtml: -------------------------------------------------------------------------------- 1 |
2 | 3 |

4 |
5 | 6 |
7 | 8 |

9 |
10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | getAlias() as $alias) : ?> 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | getFields() as $field) : ?> 27 | 28 | 29 | 33 | 34 | 35 | 36 |
id" ?>">$field) ?> 30 | id" ?>" class="icon"><?= _('Edit') ?> 31 | id" ?>" class="icon" title="" onclick="return confirm('');"><?= _('Delete') ?> 32 |
37 |
38 | $data]) ?> 39 | 40 | -------------------------------------------------------------------------------- /koot/views/_shared/scaffolds/lite/show.phtml: -------------------------------------------------------------------------------- 1 |
2 | 3 | 4 | 5 |

_('Record not found')

6 |
7 | Listado 8 | Crear registro 9 |
10 | 11 |

12 |
    13 | getFields() as $key => $field) : ?> 14 |
  • getAlias()[$key] ?> $field) ?>
  • 15 | 16 |
17 | 18 |
19 | 20 | 21 | <?= _('Edit') ?> 22 | <?= _('Delete') ?> 23 |
24 | 25 | -------------------------------------------------------------------------------- /koot/views/_shared/templates/admin.phtml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | > 5 | Koot Fast App 6 | 7 | 8 | 9 | 10 |
11 |
12 | 27 |
28 | 37 | 38 | 39 |
40 |
41 |
42 | 43 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /koot/views/_shared/templates/csv.phtml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | > 5 | Koot Fast App 6 | 7 | 8 | 9 | 10 |
11 |
12 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
32 | 33 | 34 | -------------------------------------------------------------------------------- /koot/views/_shared/templates/json.phtml: -------------------------------------------------------------------------------- 1 | 5 | 6 | 7 | 8 | Login KuAdmin 9 | 216 | 217 | 218 | 219 |
220 |
221 | 222 |
223 | 251 |
252 | 253 | 254 | -------------------------------------------------------------------------------- /koot/views/_shared/templates/xml.phtml: -------------------------------------------------------------------------------- 1 | $value) { 9 | if (is_numeric($key)) { 10 | $key = $nodeName; 11 | } 12 | $xml .= '<' . $key . '>' . "\n" . generate_xml_from_array($value, $nodeName) . '' . "\n"; 13 | } 14 | } else { 15 | $xml = htmlspecialchars($array, ENT_QUOTES) . "\n"; 16 | } 17 | return $xml; 18 | } 19 | 20 | function generate_valid_xml_from_array($array, $nodeBlock = 'nodes', $nodeName = 'node') 21 | { 22 | $xml = '' . "\n"; 23 | $xml .= '<' . $nodeBlock . '>' . "\n"; 24 | $xml .= generate_xml_from_array($array, $nodeName); 25 | $xml .= '' . "\n"; 26 | return $xml; 27 | } 28 | 29 | //First element 30 | $first = is_array($data) ? $data[key($data)] : $data; 31 | $block = $first == $data && is_object($first) ? strtolower(get_class($first)) : 'data'; 32 | $node = is_object($first) ? strtolower(get_class($first)) : 'node'; 33 | 34 | echo generate_valid_xml_from_array($data, $block, $node); 35 | /* 36 | TODO use Simple XML 37 | function printElem($xml, $elem){ 38 | $xml->startElement(); 39 | $a = get_object_vars($elem); 40 | foreach($a as $key=>$value) { 41 | $xml->startElement($key); 42 | $xml->text($value); 43 | $xml->endElement(); 44 | } 45 | $xml->endElement(); 46 | } 47 | 48 | $xml=new XMLWriter(); 49 | $xml->openMemory(); 50 | $xml->startDocument('1.0','UTF-8'); 51 | $xml->startElement('xml'); 52 | $xml->setIndent(true); 53 | 54 | if(is_array($data)){ 55 | foreach($data as $elem) { 56 | printElem($xml, $elem); 57 | } 58 | }else{ 59 | printElem($xml, $data); 60 | } 61 | 62 | $xml->endElement(); 63 | echo $xml->outputMemory(true); 64 | */ 65 | -------------------------------------------------------------------------------- /koot/views/admin/resources/create.phtml: -------------------------------------------------------------------------------- 1 | 2 |

3 |
4 |
5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 |
22 |
23 |
24 | 25 |
26 |
-------------------------------------------------------------------------------- /koot/views/admin/roles/create.phtml: -------------------------------------------------------------------------------- 1 | 2 |

3 |
4 | 5 | 8 | 9 | 10 | 11 |
12 |
13 | 14 |
-------------------------------------------------------------------------------- /koot/views/admin/users/create.phtml: -------------------------------------------------------------------------------- 1 | 2 |

3 |
4 | 5 |
6 | 9 | 10 | 13 |
14 | 17 | 18 | 19 | 20 |
21 |
22 | 23 |
-------------------------------------------------------------------------------- /koot/views/index/index.phtml: -------------------------------------------------------------------------------- 1 |
2 |

Welcome to Koot

3 |

Koot is your go-to community backend solution, built on the robust and fast KumbiaPHP framework.

4 |
5 | 6 |
7 |

Features

8 | 9 |
10 |
11 | 12 | 13 | Diverse Group of Avatars Representing Users 14 | 15 | 16 |

User Management

17 |

Handle user registrations, logins, and profiles efficiently.

18 |
19 | 20 |
21 | 22 | 23 | Hierarchical Structure of User Roles 24 | 25 | 26 |

Role-Based Access Control

27 |

Define roles and assign them to users for granular access control.

28 |
29 | 30 |
31 | 32 | 33 | Digital Library of Resources 34 | 35 | 36 |

Resource Management

37 |

Manage your application's resources with ease.

38 |
39 | 40 |
41 | 42 | 43 | Security Themed Image for Permissions 44 | 45 | 46 |

Permission Handling

47 |

Fine-tune permissions for different user roles.

48 |
49 |
50 |
51 | 52 |
53 |

About Koot

54 |

Koot is designed to streamline backend development, minimizing repetitive tasks and focusing on unique features of your applications.

55 |
56 | 57 | 58 |
59 |

Contact Us

60 |

Have questions or want to get involved? Chat us or visit our GitHub page.

61 |
-------------------------------------------------------------------------------- /koot/views/pages/kumbia/status.phtml: -------------------------------------------------------------------------------- 1 |
2 | '; 6 | } else { 7 | echo strftime("%e de %B del %Y") , '
'; 8 | } 9 | 10 | 11 | /** 12 | * Verificando permisos del dir temp/ 13 | */ 14 | if (!is_writable(APP_PATH.'temp')) { 15 | $tmp = "Debes darle permiso a: '".basename(APP_PATH)."/temp/'"; 16 | } else { 17 | $tmp = 'Directorio temp... ok'; 18 | } 19 | 20 | $status = PRODUCTION ? 'Production' : 'Development'; 21 | 22 | 23 | /** 24 | * Configuracion del config.ini 25 | */ 26 | $config = Config::read('config'); 27 | 28 | if (isset($config['application']['cache_driver'])) { 29 | $cahe_driver = $config['application']['cache_driver']; 30 | } else { 31 | $cache_driver = 'No ha seleccionado un driver para la cache'; 32 | } 33 | 34 | $locale = str_replace(';', '
', setlocale(LC_ALL, '0')); 35 | 36 | if (! $timezone = date_default_timezone_get()) { 37 | $timezone = 'No se ha especificado un Timezone.'; 38 | } 39 | ?> 40 |

config.php de

41 | 42 |
43 |

Directorio temp/:

44 |

45 | 46 |

Estado Actual del Framework:

47 |

Ver Modos de ejecución

48 | 49 |

Base de Datos:

50 |

Datos de la conexión a la BD que será utilizada, ver configuración databases.ini.

51 | 52 |

Cache Driver:

53 |

Driver que se utilizará para realizar las operaciones de cache.

54 | 55 |

Charset:

56 |

Codificación de caracteres. Recomendado UTF-8

57 | 58 |

Valores del servidor

59 |

Como cambiar estos valores enlace TODO

60 | 61 |

TimeZone:

62 |

Zona horaria que usará la aplicación.

63 | 64 |

Locale:

65 | 66 |

Localización. Característica que depende de los locale instalados en el servidor.

67 |
68 |
69 | -------------------------------------------------------------------------------- /phpunit.xml.dist: -------------------------------------------------------------------------------- 1 | 2 | 11 | 12 | 13 | . 14 | 15 | 16 | app/tests 17 | app/temp 18 | vendor 19 | app/config 20 | 21 | 22 | 23 | 24 | app/tests/ 25 | 26 | 27 | 28 | 30 | 31 | 32 | 33 | 34 | 37 | 38 | -------------------------------------------------------------------------------- /public/.htaccess: -------------------------------------------------------------------------------- 1 | DirectoryIndex index.php 2 | # Si esta mod_rewrite habilitado 3 | 4 | # Activar modo de reescritura 5 | RewriteEngine On 6 | 7 | # Directorio de instalacion, puede ser necesario si 8 | # la aplicacion se ubica en public_html 9 | #RewriteBase / 10 | 11 | # No permite reescritura si el archivo o directorio existe 12 | RewriteCond %{REQUEST_FILENAME} !-f 13 | RewriteCond %{REQUEST_FILENAME} !-d 14 | 15 | # Para peticiones que no son archivos ni directorios 16 | # Reescribe a index.php/ 17 | RewriteRule (.*) index.php/$1 [L] 18 | 19 | # Reescribe a index.php?_url=URL 20 | #RewriteRule ^(.*)$ index.php?_url=/$1 [QSA,L] 21 | 22 | -------------------------------------------------------------------------------- /public/.user.ini: -------------------------------------------------------------------------------- 1 | ; Config PHP for FastCGi, FPM,... (nginx for example) 2 | ; like .htaccess but better 3 | ; see http://php.net/manual/en/configuration.file.per-user.php 4 | ; see http://php.net/manual/en/ini.core.php 5 | ; check your php.ini for: 6 | ;user_ini.filename 7 | ;user_ini.cache_ttl 8 | 9 | display_errors = On ; OFF in production 10 | ;html_errors = On 11 | ;error_reporting = -1 12 | ;default_charset = "UTF-8" ; before PHP 5.6 13 | ;date.timezone = "Europe/Madrid" 14 | ;magic_quotes_gpc = Off 15 | ;open_basedir = "/your-path" 16 | 17 | 18 | ;upload_max_filesize = 1000M 19 | ;post_max_size = 1005M 20 | ;memory_limit = 64M 21 | ;max_execution_time = 120 22 | 23 | ;session see http://php.net/manual/en/session.configuration.php 24 | ;session.name = "SSID" 25 | session.cookie_httponly = 1 ; No access from DOM (js) 26 | ;session.cookie_secure = 1 ;only send with https 27 | ;session.save_handler=memcache ; handler (redis, rediscluster, memcache, ...) 28 | ;session.auto_start = 1 ; always start session automatically 29 | ;session.cookie_lifetime = 84600 ; session lifetime to 1 day 30 | ;session.gc_maxlifetime = 84600 ; session lifetime to 1 day -------------------------------------------------------------------------------- /public/css/index.html: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KumbiaPHP/Koot/0636044c4d4e2285472ff4a714059c9f1a4621e9/public/css/index.html -------------------------------------------------------------------------------- /public/css/koot.scss: -------------------------------------------------------------------------------- 1 | // Import Flash 2 | @import "koot/flash"; 3 | 4 | // Import Icons 5 | @import "koot/icons"; 6 | 7 | // Import Admin 8 | @import "koot/admin"; 9 | 10 | // Import Paginator 11 | @import "koot/paginator"; 12 | 13 | // Import Pico 14 | @import "koot/pico"; 15 | 16 | // Import Scaffold 17 | @import "koot/scaffold"; 18 | 19 | // Import Logo 20 | @import "koot/logo"; -------------------------------------------------------------------------------- /public/css/koot/_koot.css: -------------------------------------------------------------------------------- 1 | /*! Koot 2024 */ 2 | @import "pico.css"; 3 | /* @import "admin.css"; */ 4 | @import "flash.css"; 5 | @import "icons.css"; 6 | @import "logo.css"; 7 | @import "paginator.css"; 8 | -------------------------------------------------------------------------------- /public/css/koot/admin.css: -------------------------------------------------------------------------------- 1 | @media (min-width: 992px) { 2 | #develop { 3 | --block-spacing-horizontal: calc(var(--spacing) * 1.75); 4 | grid-column-gap: calc(var(--block-spacing-horizontal)); 5 | display: grid; 6 | grid-template-columns:200px auto; 7 | height: 100vh; 8 | padding: 0 9 | } 10 | 11 | #develop > aside { 12 | border-right: 1px solid var(--muted-border-color) 13 | } 14 | 15 | #doc > nav { 16 | border-bottom: 1px solid var(--muted-border-color) 17 | } 18 | 19 | #menu { 20 | background-color: var(); 21 | } 22 | 23 | .settings { 24 | text-decoration: none; 25 | position: absolute; 26 | bottom: 0; 27 | padding-bottom: 1em; 28 | width: 200px; 29 | border-top: 1px solid solid var(--muted-border-color) 30 | } 31 | } -------------------------------------------------------------------------------- /public/css/koot/flash.css: -------------------------------------------------------------------------------- 1 | /* Formatea los mensajes Flash::xxx() de KumbiaPHP */ 2 | 3 | .flash { 4 | margin: 5px 0; 5 | min-height: 32px; 6 | padding: 3px 10px 3px 50px; 7 | background-repeat: no-repeat; 8 | background-position: 10px center; 9 | line-height: 32px; 10 | border-radius: 2px; 11 | } 12 | 13 | .error { 14 | color: #D8000C; 15 | background-color: #FFBABA; 16 | } 17 | 18 | .info { 19 | color: #00529B; 20 | background-color: #BDE5F8; 21 | } 22 | 23 | .valid { 24 | color: #4F8A10; 25 | background-color: #DFF2BF; 26 | } 27 | 28 | .warning { 29 | color: #9F6000; 30 | background-color: #FEEFB3; 31 | } -------------------------------------------------------------------------------- /public/css/koot/icons.css: -------------------------------------------------------------------------------- 1 | /* Using https://feathericons.com/ */ 2 | .icon { 3 | filter: invert(0.5); 4 | } 5 | 6 | .icon:hover { 7 | filter: none 8 | } 9 | 10 | /* .actions .icon { 11 | border: 1px solid gray; 12 | padding: .5em; 13 | border-radius: 6px; 14 | } */ 15 | /* .delete { 16 | 17 | } 18 | 19 | .edit { 20 | /* background-image: url("data:image/svg+xml;utf8,") 21 | background-image: url(/img/edit.svg); 22 | } */ -------------------------------------------------------------------------------- /public/css/koot/logo.css: -------------------------------------------------------------------------------- 1 | /* Dark color scheme (Auto) */ 2 | /* Automatically enabled if user has Dark mode enabled */ 3 | @media only screen and (prefers-color-scheme: dark) { 4 | :root:not([data-theme]) { 5 | --koot-logo-wordmark: #bdecee; 6 | } 7 | } 8 | 9 | /* Can be forced with data-theme="light" */ 10 | [data-theme="light"], 11 | :root:not([data-theme="dark"]) { 12 | --koot-logo-wordmark: #002741; 13 | } 14 | 15 | [data-theme="dark"], 16 | :root:not([data-theme="light"]) { 17 | --koot-logo-wordmark: #bdecee; 18 | } 19 | 20 | svg.logo { 21 | width: 5rem; 22 | height: auto; 23 | margin: -.5rem; 24 | } 25 | 26 | @media (min-width: 576px) { 27 | svg.logo { 28 | width: 10rem; 29 | margin: -1rem; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /public/css/koot/paginator.css: -------------------------------------------------------------------------------- 1 | .paginator { 2 | justify-content: flex-start; 3 | } 4 | 5 | .paginator .nextprev { 6 | color: #000; 7 | } 8 | 9 | .paginator a { 10 | border: 1px solid #e8ebf1; 11 | padding: .5em; 12 | text-decoration: none; 13 | margin: .5em .1em; 14 | background: #FFF; 15 | } 16 | 17 | .paginator a:hover { 18 | background: #e8ebf1; 19 | } 20 | 21 | .paginator strong { 22 | background: #e8ebf1; 23 | border: 1px solid #e8ebf1; 24 | padding: .5em; 25 | margin: .5em .1em; 26 | } -------------------------------------------------------------------------------- /public/css/koot/scaffold.css: -------------------------------------------------------------------------------- 1 | /* #scaffold table a { 2 | color: #333; 3 | font-weight: normal; 4 | } 5 | 6 | #scaffold table a:hover { 7 | color: #0ac; 8 | text-decoration: none; 9 | } */ 10 | 11 | #scaffold table { 12 | width: 100% 13 | } 14 | 15 | #scaffold th { 16 | text-align: left; 17 | } 18 | 19 | #scaffold caption { 20 | font-size: 2em; 21 | text-align: left; 22 | } 23 | 24 | #scaffold .show { 25 | list-style: none; 26 | padding: 1em 27 | } 28 | 29 | #scaffold .show strong { 30 | width: 30%; 31 | display: inline-block; 32 | } 33 | 34 | #scaffold .show li { 35 | padding: 8px; 36 | line-height: 1.5; 37 | border-top: 1px solid #ddd; 38 | } 39 | 40 | #scaffold .show li:hover { 41 | background-color: #f5f5f5 42 | } 43 | -------------------------------------------------------------------------------- /public/css/kumbia.min.css: -------------------------------------------------------------------------------- 1 | .flash{margin:5px 0;min-height:32px;padding:3px 10px 3px 50px;background-repeat:no-repeat;background-position:10px center;line-height:32px;border-radius:2px}.error{color:#d8000c;background-color:#ffbaba}.info{color:#00529b;background-color:#bde5f8}.valid{color:#4f8a10;background-color:#dff2bf}.warning{color:#9f6000;background-color:#feefb3}.icon{filter:invert(.5)}.icon:hover{filter:none}article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,video{display:inline-block}audio:not([controls]){display:none;height:0}[hidden]{display:none}html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}a:focus{outline:thin dotted}a:active,a:hover{outline:0}mark{background:#ff0;color:#000}code,kbd,pre,samp{font-family:monospace,serif;font-size:1em}pre{white-space:pre-wrap}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:0}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}*,:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}body{font-family:Helvetica,Arial,sans-serif;font-size:15px;line-height:1.5;color:#333;background-color:#fff;margin:0}a{color:#0ac;font-weight:700;text-decoration:none}a:focus,a:hover{color:#ff4d4d;text-decoration:underline}a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}img{vertical-align:middle}.img-rounded{border-radius:9px}.img-circle{border-radius:50%}hr{margin-top:22px;margin-bottom:22px;border:0;border-top:1px solid #eee}p{margin:0 0 11px}small{font-size:85%}cite{font-style:normal}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}h1,h2,h3,h4,h5,h6{font-family:Helvetica,Arial,sans-serif;font-weight:500;line-height:1.1}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:400;line-height:1;color:#999;font-size:60%}h1,h2,h3,h4,h5,h6{margin-top:22px;margin-bottom:11px}h1{font-size:42px}h2{font-size:36px}h3{font-size:29px}h4{font-size:22px}h5{font-size:19px}h6{font-size:16px}header.top{padding-bottom:10px;margin:44px 0 22px;border-bottom:1px solid #eee}ol,ul{margin-top:0;margin-bottom:11px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}ul.unstyled{padding-left:0;list-style:none}ul.inline{padding-left:0;list-style:none}ul.inline>li{display:inline-block;padding-left:5px;padding-right:5px}dl{margin-bottom:22px}dd,dt{line-height:1.5}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){dl.horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}dl.horizontal dd{margin-left:180px}dl.horizontal dd:after,dl.horizontal dd:before{content:" ";display:table}dl.horizontal dd:after{clear:both}}blockquote{padding:11px 22px;margin:0 0 22px;border-left:5px solid #eee}blockquote p{font-size:18.75px;font-weight:300;line-height:1.25}blockquote p:last-child{margin-bottom:0}blockquote small{display:block;line-height:1.5;color:#999}blockquote small:before{content:'\2014 \00A0'}blockquote:after,blockquote:before,q:after,q:before{content:""}address{display:block;margin-bottom:22px;font-style:normal;line-height:1.5}code,pre{font-family:Monaco,Menlo,Consolas,"Courier New",monospace}code{padding:2px 4px;color:#c7254e;white-space:nowrap;border-radius:6px}pre{display:block;padding:10.5px;margin:0 0 11px;line-height:1.5;word-break:break-all;word-wrap:break-word;color:#333;background-color:#f5f5f5;border-radius:5px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;border:0}.container{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.container:after,.container:before{content:" ";display:table}.container:after{clear:both}.row{margin-left:15px;margin-right:15px}.row:after,.row:before{content:" ";display:table}.row:after{clear:both}.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9{position:relative;min-height:1px;padding-left:15px;padding-right:15px;float:left}.col-1{width:8.333333333333332%}.col-2{width:16.666666666666664%}.col-3{width:25%}.col-4{width:33.33333333333333%}.col-5{width:41.66666666666667%}.col-6{width:50%}.col-7{width:58.333333333333336%}.col-8{width:66.66666666666666%}.col-9{width:75%}.col-10{width:83.33333333333334%}.col-11{width:91.66666666666666%}.col-12{width:100%}.offset-0{margin-left:0}.offset-1{margin-left:8.333333333333332%}.offset-2{margin-left:16.666666666666664%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333333333333%}.offset-5{margin-left:41.66666666666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.333333333333336%}.offset-8{margin-left:66.66666666666666%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333333333334%}.offset-11{margin-left:91.66666666666666%}@media (min-width:992px){.container{max-width:970px}}@media (min-width:1200px){.container{max-width:1170px}}table{max-width:100%;border-collapse:collapse}table{margin:auto;margin-bottom:22px}table tr>td,table tr>th{padding:8px;line-height:1.5;border-top:1px solid #ddd}table thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}table.condensed td,table.condensed th{padding:5px}table.border{border:1px solid #ddd}table.border td,table.border th{border:1px solid #ddd}table.zebra>tbody>tr:nth-child(odd)>td,table.zebra>tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}table.hover>tbody>tr:hover{background-color:#f5f5f5}legend{display:block;width:100%;padding:0;margin-bottom:22px;font-size:22.5px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}fieldset{border:0}label{display:inline-block;margin-bottom:5px;font-weight:700}.control::-moz-placeholder{color:#999}.control:-ms-input-placeholder{color:#999}.control::-webkit-input-placeholder{color:#999}input.control,select.control,textarea.control{display:block;width:100%;height:36px;padding:6px 12px;line-height:1.5;color:#555;background-color:#fff;border:1px solid #ccc;border-radius:6px;-webkit-transition:all ease-in .4s;transition:all ease-in .4s}input.control:focus,select.control:focus,textarea.control:focus{border-color:#66afe9;outline:0}fieldset[disabled] input.control,fieldset[disabled] select.control,fieldset[disabled] textarea.control,input.control[disabled],input.control[readonly],select.control[disabled],select.control[readonly],textarea.control[disabled],textarea.control[readonly]{cursor:not-allowed;background-color:#eee}textareainput.control,textareaselect.control,textareatextarea.control{height:auto}@media (min-width:768px){form.inline .form-group,form.inline input.control,form.inline select.control,form.inline textarea.control{display:inline-block}form.inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}form.inline .control{display:inline-block}}.form-group{margin-bottom:15px}form.horizontal .form-group{margin-left:-15px;margin-right:-15px}form.horizontal .form-group:after,form.horizontal .form-group:before{content:" ";display:table}form.horizontal .form-group:after{clear:both}.form-horizontal{padding-top:6px}@media (min-width:768px){form.horizontal .control-label{text-align:right}}.btn{display:inline-block;text-decoration:none;color:#fff;border-radius:6px;border-width:1px;line-height:1.5;padding:6px 12px;-webkit-box-shadow:1px 1px 3px #555;box-shadow:1px 1px 3px #555}.btn:hover{text-decoration:none;-webkit-box-shadow:1px 2px 5px #777;box-shadow:1px 2px 5px #777}.btn-default{color:#000;border-color:#ccc;border-bottom-color:#b3b3b3;background-repeat:repeat-x;background-image:-webkit-linear-gradient(45deg,#fff,#e6e6e6);background-image:-moz-linear-gradient(45deg,#fff,#e6e6e6);background-image:linear-gradient(45deg,#fff,#e6e6e6)}.btn-default:hover{background:#ccc}.btn-inverse{border-color:#222;border-bottom-color:#080808;background-repeat:repeat-x;background-image:-webkit-linear-gradient(45deg,#555,#3b3b3b);background-image:-moz-linear-gradient(45deg,#555,#3b3b3b);background-image:linear-gradient(45deg,#555,#3b3b3b)}.btn-inverse:hover{background:#222}.btn-danger{border-color:#a02622;border-bottom-color:#761c19;background-repeat:repeat-x;background-image:-webkit-linear-gradient(45deg,#d9534f,#c9302c);background-image:-moz-linear-gradient(45deg,#d9534f,#c9302c);background-image:linear-gradient(45deg,#d9534f,#c9302c)}.btn-danger:hover{background:#a02622}.btn-info{border-color:#2390b0;border-bottom-color:#1b6d85;background-repeat:repeat-x;background-image:-webkit-linear-gradient(45deg,#5bc0de,#31b0d5);background-image:-moz-linear-gradient(45deg,#5bc0de,#31b0d5);background-image:linear-gradient(45deg,#5bc0de,#31b0d5)}.btn-info:hover{background:#2390b0}.btn-success{border-color:#357935;border-bottom-color:#255625;background-repeat:repeat-x;background-image:-webkit-linear-gradient(45deg,#5cb85c,#449d44);background-image:-moz-linear-gradient(45deg,#5cb85c,#449d44);background-image:linear-gradient(45deg,#5cb85c,#449d44)}.btn-success:hover{background:#357935}.btn-primary{border-color:#245682;border-bottom-color:#193c5a;background-repeat:repeat-x;background-image:-webkit-linear-gradient(45deg,#428bca,#3071a9);background-image:-moz-linear-gradient(45deg,#428bca,#3071a9);background-image:linear-gradient(45deg,#428bca,#3071a9)}.btn-primary:hover{background:#245682}.btn-warning{border-color:#c77c11;border-bottom-color:#985f0d;background-repeat:repeat-x;background-image:-webkit-linear-gradient(45deg,#f0ad4e,#ec971f);background-image:-moz-linear-gradient(45deg,#f0ad4e,#ec971f);background-image:linear-gradient(45deg,#f0ad4e,#ec971f)}.btn-warning:hover{background:#c77c11}.btn-sm{font-size:.7em}.btn-lg{font-size:1.2em}.btn-round{border-radius:20px}.btn-active,.btn-active:hover,.btn-disabled,.btn-disabled:hover,.btn.disabled,.btn[disabled]{opacity:1;background:#d1d1d1;border:1px solid #b3b3b3;text-shadow:0 1px 1px #fff}.btn.disabled,.btn[disabled]{color:#999}.hero{padding:30px;margin-bottom:30px;font-size:22.5px;font-weight:200;line-height:2.25;color:#fff;background-color:#0ac;border-radius:6px}.hero h1{line-height:1;color:inherit}.hero p{line-height:1.4}@media screen and (min-width:768px){.hero{padding-top:50px;padding-bottom:50px}.hero h1{font-size:67.5px}}.actions{border-top:dotted 1px grey;padding-top:1em;margin:.5em 0 0}input,label,select,textarea{display:block}footer{padding-top:1em;margin-top:2em;border-top:1px solid #ccc}.paginator .nextprev{color:#000}.paginator a{border:1px solid #e8ebf1;padding:.5em;text-decoration:none;margin:.5em .1em;background:#fff}.paginator a:hover{background:#e8ebf1}.paginator strong{background:#e8ebf1;border:1px solid #e8ebf1;padding:.5em;margin:.5em .1em}#scaffold table a{color:#333;font-weight:400}#scaffold table a:hover{color:#0ac;text-decoration:none}#scaffold table{width:100%}#scaffold th{text-align:left}#scaffold caption{font-size:2em;text-align:left}#scaffold .show{list-style:none;padding:1em}#scaffold .show strong{width:30%;display:inline-block}#scaffold .show li{padding:8px;line-height:1.5;border-top:1px solid #ddd}#scaffold .show li:hover{background-color:#f5f5f5} -------------------------------------------------------------------------------- /public/css/kumbia/flash.css: -------------------------------------------------------------------------------- 1 | /* Formatea los mensajes Flash::xxx() de KumbiaPHP */ 2 | 3 | .flash { 4 | margin: 5px 0; 5 | min-height: 32px; 6 | padding: 3px 10px 3px 50px; 7 | background-repeat: no-repeat; 8 | background-position: 10px center; 9 | line-height: 32px; 10 | border-radius: 2px; 11 | } 12 | 13 | .error { 14 | color: #D8000C; 15 | background-color: #FFBABA; 16 | } 17 | 18 | .info { 19 | color: #00529B; 20 | background-color: #BDE5F8; 21 | } 22 | 23 | .valid { 24 | color: #4F8A10; 25 | background-color: #DFF2BF; 26 | } 27 | 28 | .warning { 29 | color: #9F6000; 30 | background-color: #FEEFB3; 31 | } -------------------------------------------------------------------------------- /public/css/kumbia/icons.css: -------------------------------------------------------------------------------- 1 | /* Using https://feathericons.com/ */ 2 | .icon { 3 | filter: invert(0.5); 4 | } 5 | 6 | .icon:hover { 7 | filter: none 8 | } 9 | 10 | /* .actions .icon { 11 | border: 1px solid gray; 12 | padding: .5em; 13 | border-radius: 6px; 14 | } */ 15 | /* .delete { 16 | 17 | } 18 | 19 | .edit { 20 | /* background-image: url("data:image/svg+xml;utf8,") 21 | background-image: url(/img/edit.svg); 22 | } */ -------------------------------------------------------------------------------- /public/css/kumbia/kumbia.css: -------------------------------------------------------------------------------- 1 | article, aside, details, figcaption, figure, footer, header, hgroup, main, nav, section, summary { 2 | display: block 3 | } 4 | 5 | audio, canvas, video { 6 | display: inline-block 7 | } 8 | 9 | audio:not([controls]) { 10 | display: none; 11 | height: 0 12 | } 13 | 14 | [hidden] { 15 | display: none 16 | } 17 | 18 | html { 19 | font-family: sans-serif; 20 | -webkit-text-size-adjust: 100%; 21 | -ms-text-size-adjust: 100% 22 | } 23 | 24 | a:focus { 25 | outline: thin dotted 26 | } 27 | 28 | a:active, a:hover { 29 | outline: 0 30 | } 31 | 32 | mark { 33 | background: #ff0; 34 | color: #000 35 | } 36 | 37 | code, kbd, pre, samp { 38 | font-family: monospace, serif; 39 | font-size: 1em 40 | } 41 | 42 | pre { 43 | white-space: pre-wrap 44 | } 45 | 46 | sub, sup { 47 | font-size: 75%; 48 | line-height: 0; 49 | position: relative; 50 | vertical-align: baseline 51 | } 52 | 53 | sup { 54 | top: -0.5em 55 | } 56 | 57 | sub { 58 | bottom: -0.25em 59 | } 60 | 61 | img { 62 | border: 0 63 | } 64 | 65 | svg:not(:root) { 66 | overflow: hidden 67 | } 68 | 69 | figure { 70 | margin: 0 71 | } 72 | 73 | input[type="search"]::-webkit-search-cancel-button, input[type="search"]::-webkit-search-decoration { 74 | -webkit-appearance: none 75 | } 76 | 77 | *, *:before, *:after { 78 | -webkit-box-sizing: border-box; 79 | -moz-box-sizing: border-box; 80 | box-sizing: border-box 81 | } 82 | 83 | body { 84 | font-family: Helvetica, Arial, sans-serif; 85 | font-size: 15px; 86 | line-height: 1.5; 87 | color: #333; 88 | background-color: #fff; 89 | margin: 0 90 | } 91 | 92 | a { 93 | color: #0ac; 94 | font-weight: bold; 95 | text-decoration: none 96 | } 97 | 98 | a:hover, a:focus { 99 | color: #ff4d4d; 100 | text-decoration: underline 101 | } 102 | 103 | a:focus { 104 | outline: thin dotted #333; 105 | outline: 5px auto -webkit-focus-ring-color; 106 | outline-offset: -2px 107 | } 108 | 109 | img { 110 | vertical-align: middle 111 | } 112 | 113 | .img-rounded { 114 | border-radius: 9px 115 | } 116 | 117 | .img-circle { 118 | border-radius: 50% 119 | } 120 | 121 | hr { 122 | margin-top: 22px; 123 | margin-bottom: 22px; 124 | border: 0; 125 | border-top: 1px solid #eee 126 | } 127 | 128 | p { 129 | margin: 0 0 11px 130 | } 131 | 132 | small { 133 | font-size: 85% 134 | } 135 | 136 | cite { 137 | font-style: normal 138 | } 139 | 140 | .text-left { 141 | text-align: left 142 | } 143 | 144 | .text-right { 145 | text-align: right 146 | } 147 | 148 | .text-center { 149 | text-align: center 150 | } 151 | 152 | h1, h2, h3, h4, h5, h6 { 153 | font-family: Helvetica, Arial, sans-serif; 154 | font-weight: 500; 155 | line-height: 1.1 156 | } 157 | 158 | h1 small, h2 small, h3 small, h4 small, h5 small, h6 small { 159 | font-weight: normal; 160 | line-height: 1; 161 | color: #999; 162 | font-size: 60% 163 | } 164 | 165 | h1, h2, h3, h4, h5, h6 { 166 | margin-top: 22px; 167 | margin-bottom: 11px 168 | } 169 | 170 | h1 { 171 | font-size: 42px 172 | } 173 | 174 | h2 { 175 | font-size: 36px 176 | } 177 | 178 | h3 { 179 | font-size: 29px 180 | } 181 | 182 | h4 { 183 | font-size: 22px 184 | } 185 | 186 | h5 { 187 | font-size: 19px 188 | } 189 | 190 | h6 { 191 | font-size: 16px 192 | } 193 | 194 | header.top { 195 | padding-bottom: 10px; 196 | margin: 44px 0 22px; 197 | border-bottom: 1px solid #eee 198 | } 199 | 200 | ul, ol { 201 | margin-top: 0; 202 | margin-bottom: 11px 203 | } 204 | 205 | ul ul, ol ul, ul ol, ol ol { 206 | margin-bottom: 0 207 | } 208 | 209 | ul.unstyled { 210 | padding-left: 0; 211 | list-style: none 212 | } 213 | 214 | ul.inline { 215 | padding-left: 0; 216 | list-style: none 217 | } 218 | 219 | ul.inline>li { 220 | display: inline-block; 221 | padding-left: 5px; 222 | padding-right: 5px 223 | } 224 | 225 | dl { 226 | margin-bottom: 22px 227 | } 228 | 229 | dt, dd { 230 | line-height: 1.5 231 | } 232 | 233 | dt { 234 | font-weight: bold 235 | } 236 | 237 | dd { 238 | margin-left: 0 239 | } 240 | 241 | @media (min-width:768px) { 242 | dl.horizontal dt { 243 | float: left; 244 | width: 160px; 245 | clear: left; 246 | text-align: right; 247 | overflow: hidden; 248 | text-overflow: ellipsis; 249 | white-space: nowrap 250 | } 251 | dl.horizontal dd { 252 | margin-left: 180px 253 | } 254 | dl.horizontal dd:before, dl.horizontal dd:after { 255 | content: " "; 256 | display: table; 257 | } 258 | dl.horizontal dd:after { 259 | clear: both 260 | } 261 | } 262 | 263 | blockquote { 264 | padding: 11px 22px; 265 | margin: 0 0 22px; 266 | border-left: 5px solid #eee 267 | } 268 | 269 | blockquote p { 270 | font-size: 18.75px; 271 | font-weight: 300; 272 | line-height: 1.25 273 | } 274 | 275 | blockquote p:last-child { 276 | margin-bottom: 0 277 | } 278 | 279 | blockquote small { 280 | display: block; 281 | line-height: 1.5; 282 | color: #999 283 | } 284 | 285 | blockquote small:before { 286 | content: '\2014 \00A0' 287 | } 288 | 289 | q:before, q:after, blockquote:before, blockquote:after { 290 | content: "" 291 | } 292 | 293 | address { 294 | display: block; 295 | margin-bottom: 22px; 296 | font-style: normal; 297 | line-height: 1.5 298 | } 299 | 300 | code, pre { 301 | font-family: Monaco, Menlo, Consolas, "Courier New", monospace 302 | } 303 | 304 | code { 305 | padding: 2px 4px; 306 | color: #c7254e; 307 | white-space: nowrap; 308 | border-radius: 6px 309 | } 310 | 311 | pre { 312 | display: block; 313 | padding: 10.5px; 314 | margin: 0 0 11px; 315 | line-height: 1.5; 316 | word-break: break-all; 317 | word-wrap: break-word; 318 | color: #333; 319 | background-color: #f5f5f5; 320 | border-radius: 5px; 321 | } 322 | 323 | pre code { 324 | padding: 0; 325 | font-size: inherit; 326 | color: inherit; 327 | white-space: pre-wrap; 328 | border: 0 329 | } 330 | 331 | .container { 332 | margin-right: auto; 333 | margin-left: auto; 334 | padding-left: 15px; 335 | padding-right: 15px 336 | } 337 | 338 | .container:before, .container:after { 339 | content: " "; 340 | display: table; 341 | } 342 | 343 | .container:after { 344 | clear: both 345 | } 346 | 347 | .row { 348 | margin-left: 15px; 349 | margin-right: 15px 350 | } 351 | 352 | .row:before, .row:after { 353 | content: " "; 354 | display: table; 355 | } 356 | 357 | .row:after { 358 | clear: both 359 | } 360 | 361 | .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12 { 362 | position: relative; 363 | min-height: 1px; 364 | padding-left: 15px; 365 | padding-right: 15px; 366 | float: left 367 | } 368 | 369 | .col-1 { 370 | width: 8.333333333333332% 371 | } 372 | 373 | .col-2 { 374 | width: 16.666666666666664% 375 | } 376 | 377 | .col-3 { 378 | width: 25% 379 | } 380 | 381 | .col-4 { 382 | width: 33.33333333333333% 383 | } 384 | 385 | .col-5 { 386 | width: 41.66666666666667% 387 | } 388 | 389 | .col-6 { 390 | width: 50% 391 | } 392 | 393 | .col-7 { 394 | width: 58.333333333333336% 395 | } 396 | 397 | .col-8 { 398 | width: 66.66666666666666% 399 | } 400 | 401 | .col-9 { 402 | width: 75% 403 | } 404 | 405 | .col-10 { 406 | width: 83.33333333333334% 407 | } 408 | 409 | .col-11 { 410 | width: 91.66666666666666% 411 | } 412 | 413 | .col-12 { 414 | width: 100% 415 | } 416 | 417 | .offset-0 { 418 | margin-left: 0 419 | } 420 | 421 | .offset-1 { 422 | margin-left: 8.333333333333332% 423 | } 424 | 425 | .offset-2 { 426 | margin-left: 16.666666666666664% 427 | } 428 | 429 | .offset-3 { 430 | margin-left: 25% 431 | } 432 | 433 | .offset-4 { 434 | margin-left: 33.33333333333333% 435 | } 436 | 437 | .offset-5 { 438 | margin-left: 41.66666666666667% 439 | } 440 | 441 | .offset-6 { 442 | margin-left: 50% 443 | } 444 | 445 | .offset-7 { 446 | margin-left: 58.333333333333336% 447 | } 448 | 449 | .offset-8 { 450 | margin-left: 66.66666666666666% 451 | } 452 | 453 | .offset-9 { 454 | margin-left: 75% 455 | } 456 | 457 | .offset-10 { 458 | margin-left: 83.33333333333334% 459 | } 460 | 461 | .offset-11 { 462 | margin-left: 91.66666666666666% 463 | } 464 | 465 | @media (min-width:992px) { 466 | .container { 467 | max-width: 970px 468 | } 469 | } 470 | 471 | @media (min-width:1200px) { 472 | .container { 473 | max-width: 1170px 474 | } 475 | } 476 | 477 | table { 478 | max-width: 100%; 479 | border-collapse: collapse 480 | } 481 | 482 | table { 483 | margin: auto; 484 | margin-bottom: 22px 485 | } 486 | 487 | table tr>th, table tr>td { 488 | padding: 8px; 489 | line-height: 1.5; 490 | border-top: 1px solid #ddd 491 | } 492 | 493 | table thead>tr>th { 494 | vertical-align: bottom; 495 | border-bottom: 2px solid #ddd 496 | } 497 | 498 | table.condensed th, table.condensed td { 499 | padding: 5px 500 | } 501 | 502 | table.border { 503 | border: 1px solid #ddd 504 | } 505 | 506 | table.border th, table.border td { 507 | border: 1px solid #ddd 508 | } 509 | 510 | table.zebra>tbody>tr:nth-child(odd)>td, table.zebra>tbody>tr:nth-child(odd)>th { 511 | background-color: #f9f9f9 512 | } 513 | 514 | table.hover>tbody>tr:hover { 515 | background-color: #f5f5f5 516 | } 517 | 518 | legend { 519 | display: block; 520 | width: 100%; 521 | padding: 0; 522 | margin-bottom: 22px; 523 | font-size: 22.5px; 524 | line-height: inherit; 525 | color: #333; 526 | border: 0; 527 | border-bottom: 1px solid #e5e5e5 528 | } 529 | 530 | fieldset { 531 | border: 0 532 | } 533 | 534 | label { 535 | display: inline-block; 536 | margin-bottom: 5px; 537 | font-weight: bold 538 | } 539 | 540 | .control::-moz-placeholder { 541 | color: #999 542 | } 543 | 544 | .control:-ms-input-placeholder { 545 | color: #999 546 | } 547 | 548 | .control::-webkit-input-placeholder { 549 | color: #999 550 | } 551 | 552 | input.control, select.control, textarea.control { 553 | display: block; 554 | width: 100%; 555 | height: 36px; 556 | padding: 6px 12px; 557 | line-height: 1.5; 558 | color: #555; 559 | background-color: #fff; 560 | border: 1px solid #ccc; 561 | border-radius: 6px; 562 | -webkit-transition: all ease-in .4s; 563 | transition: all ease-in .4s 564 | } 565 | 566 | input.control:focus, select.control:focus, textarea.control:focus { 567 | border-color: #66afe9; 568 | outline: 0 569 | } 570 | 571 | input.control[disabled], select.control[disabled], textarea.control[disabled], input.control[readonly], select.control[readonly], textarea.control[readonly], fieldset[disabled] input.control, fieldset[disabled] select.control, fieldset[disabled] textarea.control { 572 | cursor: not-allowed; 573 | background-color: #eee 574 | } 575 | 576 | textareainput.control, textareaselect.control, textareatextarea.control { 577 | height: auto 578 | } 579 | 580 | @media (min-width:768px) { 581 | form.inline input.control, form.inline select.control, form.inline textarea.control, form.inline .form-group { 582 | display: inline-block 583 | } 584 | form.inline .form-group { 585 | display: inline-block; 586 | margin-bottom: 0; 587 | vertical-align: middle 588 | } 589 | form.inline .control { 590 | display: inline-block 591 | } 592 | } 593 | 594 | .form-group { 595 | margin-bottom: 15px 596 | } 597 | 598 | form.horizontal .form-group { 599 | margin-left: -15px; 600 | margin-right: -15px 601 | } 602 | 603 | form.horizontal .form-group:before, form.horizontal .form-group:after { 604 | content: " "; 605 | display: table; 606 | } 607 | 608 | form.horizontal .form-group:after { 609 | clear: both 610 | } 611 | 612 | .form-horizontal { 613 | padding-top: 6px 614 | } 615 | 616 | @media (min-width:768px) { 617 | form.horizontal .control-label { 618 | text-align: right 619 | } 620 | } 621 | 622 | .btn { 623 | display: inline-block; 624 | text-decoration: none; 625 | color: #fff; 626 | border-radius: 6px; 627 | border-width: 1px; 628 | line-height: 1.5; 629 | padding: 6px 12px; 630 | -webkit-box-shadow: 1px 1px 3px #555; 631 | box-shadow: 1px 1px 3px #555 632 | } 633 | 634 | .btn:hover { 635 | text-decoration: none; 636 | -webkit-box-shadow: 1px 2px 5px #777; 637 | box-shadow: 1px 2px 5px #777 638 | } 639 | 640 | .btn-default { 641 | color: #000; 642 | border-color: #ccc; 643 | border-bottom-color: #b3b3b3; 644 | background-repeat: repeat-x; 645 | background-image: -webkit-linear-gradient(45deg, #fff, #e6e6e6); 646 | background-image: -moz-linear-gradient(45deg, #fff, #e6e6e6); 647 | background-image: linear-gradient(45deg, #fff, #e6e6e6) 648 | } 649 | 650 | .btn-default:hover { 651 | background: #ccc 652 | } 653 | 654 | .btn-inverse { 655 | border-color: #222; 656 | border-bottom-color: #080808; 657 | background-repeat: repeat-x; 658 | background-image: -webkit-linear-gradient(45deg, #555, #3b3b3b); 659 | background-image: -moz-linear-gradient(45deg, #555, #3b3b3b); 660 | background-image: linear-gradient(45deg, #555, #3b3b3b) 661 | } 662 | 663 | .btn-inverse:hover { 664 | background: #222 665 | } 666 | 667 | .btn-danger { 668 | border-color: #a02622; 669 | border-bottom-color: #761c19; 670 | background-repeat: repeat-x; 671 | background-image: -webkit-linear-gradient(45deg, #d9534f, #c9302c); 672 | background-image: -moz-linear-gradient(45deg, #d9534f, #c9302c); 673 | background-image: linear-gradient(45deg, #d9534f, #c9302c) 674 | } 675 | 676 | .btn-danger:hover { 677 | background: #a02622 678 | } 679 | 680 | .btn-info { 681 | border-color: #2390b0; 682 | border-bottom-color: #1b6d85; 683 | background-repeat: repeat-x; 684 | background-image: -webkit-linear-gradient(45deg, #5bc0de, #31b0d5); 685 | background-image: -moz-linear-gradient(45deg, #5bc0de, #31b0d5); 686 | background-image: linear-gradient(45deg, #5bc0de, #31b0d5) 687 | } 688 | 689 | .btn-info:hover { 690 | background: #2390b0 691 | } 692 | 693 | .btn-success { 694 | border-color: #357935; 695 | border-bottom-color: #255625; 696 | background-repeat: repeat-x; 697 | background-image: -webkit-linear-gradient(45deg, #5cb85c, #449d44); 698 | background-image: -moz-linear-gradient(45deg, #5cb85c, #449d44); 699 | background-image: linear-gradient(45deg, #5cb85c, #449d44) 700 | } 701 | 702 | .btn-success:hover { 703 | background: #357935 704 | } 705 | 706 | .btn-primary { 707 | border-color: #245682; 708 | border-bottom-color: #193c5a; 709 | background-repeat: repeat-x; 710 | background-image: -webkit-linear-gradient(45deg, #428bca, #3071a9); 711 | background-image: -moz-linear-gradient(45deg, #428bca, #3071a9); 712 | background-image: linear-gradient(45deg, #428bca, #3071a9) 713 | } 714 | 715 | .btn-primary:hover { 716 | background: #245682 717 | } 718 | 719 | .btn-warning { 720 | border-color: #c77c11; 721 | border-bottom-color: #985f0d; 722 | background-repeat: repeat-x; 723 | background-image: -webkit-linear-gradient(45deg, #f0ad4e, #ec971f); 724 | background-image: -moz-linear-gradient(45deg, #f0ad4e, #ec971f); 725 | background-image: linear-gradient(45deg, #f0ad4e, #ec971f) 726 | } 727 | 728 | .btn-warning:hover { 729 | background: #c77c11 730 | } 731 | 732 | .btn-sm { 733 | font-size: .7em 734 | } 735 | 736 | .btn-lg { 737 | font-size: 1.2em 738 | } 739 | 740 | .btn-round { 741 | border-radius: 20px 742 | } 743 | 744 | .btn-active, .btn-active:hover, .btn.disabled, .btn[disabled], .btn-disabled, .btn-disabled:hover { 745 | opacity: 1; 746 | filter: alpha(opacity=100); 747 | background: #d1d1d1; 748 | border: 1px solid #b3b3b3; 749 | text-shadow: 0 1px 1px #fff 750 | } 751 | 752 | .btn.disabled, .btn[disabled] { 753 | color: #999 754 | } 755 | 756 | .hero { 757 | padding: 30px; 758 | margin-bottom: 30px; 759 | font-size: 22.5px; 760 | font-weight: 200; 761 | line-height: 2.25; 762 | color: #fff; 763 | background-color: #0ac; 764 | border-radius: 6px 765 | } 766 | 767 | .hero h1 { 768 | line-height: 1; 769 | color: inherit 770 | } 771 | 772 | .hero p { 773 | line-height: 1.4 774 | } 775 | 776 | @media screen and (min-width:768px) { 777 | .hero { 778 | padding-top: 50px; 779 | padding-bottom: 50px 780 | } 781 | .hero h1 { 782 | font-size: 67.5px 783 | } 784 | } 785 | 786 | .actions { 787 | border-top: dotted 1px grey; 788 | padding-top: 1em; 789 | margin: .5em 0 0; 790 | } 791 | 792 | label, input, textarea, select { 793 | display: block; 794 | } 795 | 796 | footer { 797 | padding-top: 1em; 798 | margin-top: 2em; 799 | border-top: 1px solid #ccc; 800 | } 801 | 802 | -------------------------------------------------------------------------------- /public/css/kumbia/paginator.css: -------------------------------------------------------------------------------- 1 | .paginator .nextprev { 2 | color: #000; 3 | } 4 | 5 | .paginator a { 6 | border: 1px solid #e8ebf1; 7 | padding: .5em; 8 | text-decoration: none; 9 | margin: .5em .1em; 10 | background: #FFF; 11 | } 12 | 13 | .paginator a:hover { 14 | background: #e8ebf1; 15 | } 16 | 17 | .paginator strong { 18 | background: #e8ebf1; 19 | border: 1px solid #e8ebf1; 20 | padding: .5em; 21 | margin: .5em .1em; 22 | } -------------------------------------------------------------------------------- /public/css/kumbia/scaffold.css: -------------------------------------------------------------------------------- 1 | #scaffold table a { 2 | color: #333; 3 | font-weight: normal; 4 | } 5 | 6 | #scaffold table a:hover { 7 | color: #0ac; 8 | text-decoration: none; 9 | } 10 | 11 | #scaffold table { 12 | width: 100% 13 | } 14 | 15 | #scaffold th { 16 | text-align: left; 17 | } 18 | 19 | #scaffold caption { 20 | font-size: 2em; 21 | text-align: left; 22 | } 23 | 24 | #scaffold .show { 25 | list-style: none; 26 | padding: 1em 27 | } 28 | 29 | #scaffold .show strong { 30 | width: 30%; 31 | display: inline-block; 32 | } 33 | 34 | #scaffold .show li { 35 | padding: 8px; 36 | line-height: 1.5; 37 | border-top: 1px solid #ddd; 38 | } 39 | 40 | #scaffold .show li:hover { 41 | background-color: #f5f5f5 42 | } 43 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KumbiaPHP/Koot/0636044c4d4e2285472ff4a714059c9f1a4621e9/public/favicon.ico -------------------------------------------------------------------------------- /public/files/index.html: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KumbiaPHP/Koot/0636044c4d4e2285472ff4a714059c9f1a4621e9/public/files/index.html -------------------------------------------------------------------------------- /public/files/upload/index.html: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KumbiaPHP/Koot/0636044c4d4e2285472ff4a714059c9f1a4621e9/public/files/upload/index.html -------------------------------------------------------------------------------- /public/img/datepicker/backstripes.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KumbiaPHP/Koot/0636044c4d4e2285472ff4a714059c9f1a4621e9/public/img/datepicker/backstripes.gif -------------------------------------------------------------------------------- /public/img/datepicker/bg_header.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KumbiaPHP/Koot/0636044c4d4e2285472ff4a714059c9f1a4621e9/public/img/datepicker/bg_header.jpg -------------------------------------------------------------------------------- /public/img/datepicker/bullet1.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KumbiaPHP/Koot/0636044c4d4e2285472ff4a714059c9f1a4621e9/public/img/datepicker/bullet1.gif -------------------------------------------------------------------------------- /public/img/datepicker/bullet2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KumbiaPHP/Koot/0636044c4d4e2285472ff4a714059c9f1a4621e9/public/img/datepicker/bullet2.gif -------------------------------------------------------------------------------- /public/img/datepicker/cal-grey.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KumbiaPHP/Koot/0636044c4d4e2285472ff4a714059c9f1a4621e9/public/img/datepicker/cal-grey.gif -------------------------------------------------------------------------------- /public/img/datepicker/cal.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KumbiaPHP/Koot/0636044c4d4e2285472ff4a714059c9f1a4621e9/public/img/datepicker/cal.gif -------------------------------------------------------------------------------- /public/img/datepicker/gradient-e5e5e5-ffffff.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KumbiaPHP/Koot/0636044c4d4e2285472ff4a714059c9f1a4621e9/public/img/datepicker/gradient-e5e5e5-ffffff.gif -------------------------------------------------------------------------------- /public/img/icons/delete.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/img/icons/edit.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/img/index.html: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KumbiaPHP/Koot/0636044c4d4e2285472ff4a714059c9f1a4621e9/public/img/index.html -------------------------------------------------------------------------------- /public/img/koot.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/img/kumbia.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /public/img/kumbiaphp.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/img/login.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KumbiaPHP/Koot/0636044c4d4e2285472ff4a714059c9f1a4621e9/public/img/login.jpg -------------------------------------------------------------------------------- /public/img/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KumbiaPHP/Koot/0636044c4d4e2285472ff4a714059c9f1a4621e9/public/img/logo.png -------------------------------------------------------------------------------- /public/img/php7.svg: -------------------------------------------------------------------------------- 1 | PHP7PHP7readyready -------------------------------------------------------------------------------- /public/img/upload/index.html: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KumbiaPHP/Koot/0636044c4d4e2285472ff4a714059c9f1a4621e9/public/img/upload/index.html -------------------------------------------------------------------------------- /public/img/welcome/permission_handling.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KumbiaPHP/Koot/0636044c4d4e2285472ff4a714059c9f1a4621e9/public/img/welcome/permission_handling.avif -------------------------------------------------------------------------------- /public/img/welcome/permission_handling.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KumbiaPHP/Koot/0636044c4d4e2285472ff4a714059c9f1a4621e9/public/img/welcome/permission_handling.png -------------------------------------------------------------------------------- /public/img/welcome/resource_management.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KumbiaPHP/Koot/0636044c4d4e2285472ff4a714059c9f1a4621e9/public/img/welcome/resource_management.avif -------------------------------------------------------------------------------- /public/img/welcome/resource_management.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KumbiaPHP/Koot/0636044c4d4e2285472ff4a714059c9f1a4621e9/public/img/welcome/resource_management.png -------------------------------------------------------------------------------- /public/img/welcome/role_based_access_control.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KumbiaPHP/Koot/0636044c4d4e2285472ff4a714059c9f1a4621e9/public/img/welcome/role_based_access_control.avif -------------------------------------------------------------------------------- /public/img/welcome/role_based_access_control.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KumbiaPHP/Koot/0636044c4d4e2285472ff4a714059c9f1a4621e9/public/img/welcome/role_based_access_control.png -------------------------------------------------------------------------------- /public/img/welcome/user_management.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KumbiaPHP/Koot/0636044c4d4e2285472ff4a714059c9f1a4621e9/public/img/welcome/user_management.avif -------------------------------------------------------------------------------- /public/img/welcome/user_management.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KumbiaPHP/Koot/0636044c4d4e2285472ff4a714059c9f1a4621e9/public/img/welcome/user_management.png -------------------------------------------------------------------------------- /public/index.html: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KumbiaPHP/Koot/0636044c4d4e2285472ff4a714059c9f1a4621e9/public/index.html -------------------------------------------------------------------------------- /public/index.php: -------------------------------------------------------------------------------- 1 | ').text(d[i]).val(i); 117 | $u.append(a); 118 | } 119 | }, 'json'); 120 | }, 121 | 122 | /** 123 | * Enlaza a las clases por defecto 124 | * 125 | */ 126 | bind : function() { 127 | // Enlace y boton con confirmacion 128 | $("body").on('click', "a.js-confirm, input.js-confirm",this.cConfirm); 129 | 130 | // Enlace ajax 131 | $("body").on('click', "a.js-remote",this.cRemote); 132 | 133 | // Enlace ajax con confirmacion 134 | $("body").on('click', "a.js-remote-confirm",this.cRemoteConfirm); 135 | 136 | // Efecto show 137 | $("body").on('click', "a.js-show",this.cFx('show')); 138 | 139 | // Efecto hide 140 | $("body").on('click', "a.js-hide",this.cFx('hide')); 141 | 142 | // Efecto toggle 143 | $("body").on('click', "a.js-toggle",this.cFx('toggle')); 144 | 145 | // Efecto fadeIn 146 | $("body").on('click', "a.js-fade-in",this.cFx('fadeIn')); 147 | 148 | // Efecto fadeOut 149 | $("body").on('click', "a.js-fade-out",this.cFx('fadeOut')); 150 | 151 | // Formulario ajax 152 | $("body").on('submit',"form.js-remote", this.cFRemote); 153 | 154 | // Lista desplegable que actualiza con ajax 155 | $("body").on('change',"select.js-remote", this.cUpdaterSelect); 156 | 157 | // Enlazar DatePicker 158 | $.KumbiaPHP.bindDatePicker(); 159 | 160 | }, 161 | 162 | /** 163 | * Implementa la autocarga de plugins, estos deben seguir 164 | * una convención para que pueda funcionar correctamente 165 | */ 166 | autoload: function(){ 167 | var elem = $("[class*='jp-']"); 168 | $.each(elem, function(i, val){ 169 | var este = $(this); //apunta al elemento con clase jp-* 170 | var classes = este.attr('class').split(' '); 171 | for (i in classes){ 172 | if(classes[i].substr(0, 3) == 'jp-'){ 173 | if($.inArray(classes[i].substr(3),$.KumbiaPHP.plugin) != -1) 174 | continue; 175 | $.KumbiaPHP.plugin.push(classes[i].substr(3)) 176 | } 177 | } 178 | }); 179 | var head = $('head'); 180 | for(i in $.KumbiaPHP.plugin){ 181 | $.ajaxSetup({ cache: true}); 182 | head.append(''); 183 | $.getScript($.KumbiaPHP.publicPath + 'javascript/jquery/jquery.' + $.KumbiaPHP.plugin[i] + '.js', function(data, text){}); 184 | } 185 | }, 186 | 187 | /** 188 | * Carga y Enlaza Unobstrusive DatePicker en caso de ser necesario 189 | * 190 | */ 191 | bindDatePicker: function() { 192 | 193 | // Selecciona los campos input 194 | var inputs = $('input.js-datepicker'); 195 | /** 196 | * Funcion encargada de enlazar el DatePicker a los Input 197 | * 198 | */ 199 | var bindInputs = function() { 200 | inputs.each(function() { 201 | var opts = {monthSelector: true,yearSelector:true}; 202 | var input = $(this); 203 | // Verifica si hay mínimo 204 | if(input.attr('min') != undefined) { 205 | opts.dateMin = input.attr('min').split('-'); 206 | } 207 | // Verifica si ha máximo 208 | if(input.attr('max') != undefined) { 209 | opts.dateMax = input.attr('max').split('-'); 210 | } 211 | 212 | // Crea el calendario 213 | input.pickadate(opts); 214 | }); 215 | } 216 | 217 | // Si ya esta cargado Unobstrusive DatePicker, lo integra de una vez 218 | if(typeof($.pickadate) != "undefined") { 219 | return bindInputs(); 220 | } 221 | 222 | // Carga la hoja de estilos 223 | $('head').append(''); 224 | 225 | // Carga Unobstrusive DatePicker, para poder usar cache 226 | jQuery.ajax({ dataType: "script",cache: true, url: this.publicPath + 'javascript/jquery/pickadate.js'}).done(function(){ 227 | bindInputs(); 228 | }); 229 | }, 230 | 231 | /** 232 | * Inicializa el plugin 233 | * 234 | */ 235 | initialize: function() { 236 | // Obtiene el publicPath, restando los caracteres que sobran 237 | // de la ruta, respecto a la ruta de ubicacion del plugin de KumbiaPHP 238 | // "javascript/jquery/jquery.kumbiaphp.js" 239 | var src = $('script:last').attr('src'); 240 | this.publicPath = src.substr(0, src.length - 37); 241 | 242 | // Enlaza a las clases por defecto 243 | $(function(){ 244 | $.KumbiaPHP.bind(); 245 | $.KumbiaPHP.autoload(); 246 | 247 | }); 248 | } 249 | } 250 | 251 | // Inicializa el plugin 252 | $.KumbiaPHP.initialize(); 253 | })(jQuery); 254 | -------------------------------------------------------------------------------- /public/javascript/jquery/jquery.kumbiaphp.min.js: -------------------------------------------------------------------------------- 1 | /* 2 | http://wiki.kumbiaphp.com/Licencia New BSD License 3 | */ 4 | (function(a){a.KumbiaPHP={publicPath:null,plugin:[],cConfirm:function(b){var c=a(this);confirm(c.data("msg"))||b.preventDefault()},cFx:function(b){return function(c){c.preventDefault();c=a(this);a("#"+c.data("to"))[b]()}},cRemote:function(b){var c=a(this),c=a("#"+c.data("to"));b.preventDefault();c.load(this.href)},cRemoteConfirm:function(b){var c=a(this),d=a("#"+c.data("to"));b.preventDefault();confirm(c.data("msg"))&&d.load(this.href)},cFRemote:function(b){b.preventDefault();este=a(this);var c=a("[type=submit]", 5 | este);c.attr("disabled","disabled");b=este.attr("action");var d=este.attr("data-to");a.post(b,este.serialize(),function(b){var e=a("#"+d);e.html(b);e.hide();e.show("slow");c.attr("disabled",null)})},cUpdaterSelect:function(){var b=a(this),c=a("#"+b.data("update"));url=b.data("url");c.empty();a.get(url,{id:b.val()},function(b){for(i in b){var f=a("