1). Microhistory added in classes for modular code 2). Code is structured and camel casing of varables is done for removing linter warnings. 3). JQuery plugins are added in some files. 4). jQplot is working for server_status_queries and server_status_monitor. 5). Work started for Dabatase, SQl and Table files. Some changes are stll left for server_status_monitor and sql.js Signed-Off-By: Piyush Vijay <piyushvijay.1997@gmail.com>
256 lines
7.0 KiB
PHP
256 lines
7.0 KiB
PHP
<?php
|
|
/* vim: set expandtab sw=4 ts=4 sts=4: */
|
|
/**
|
|
* JavaScript management
|
|
*
|
|
* @package PhpMyAdmin
|
|
*/
|
|
declare(strict_types=1);
|
|
|
|
namespace PhpMyAdmin;
|
|
|
|
use PhpMyAdmin\Header;
|
|
use PhpMyAdmin\Sanitize;
|
|
use PhpMyAdmin\Url;
|
|
|
|
/**
|
|
* Collects information about which JavaScript
|
|
* files and objects are necessary to render
|
|
* the page and generates the relevant code.
|
|
*
|
|
* @package PhpMyAdmin
|
|
*/
|
|
class Scripts
|
|
{
|
|
/**
|
|
* An array of SCRIPT tags
|
|
*
|
|
* @access private
|
|
* @var array of strings
|
|
*/
|
|
private $_files;
|
|
/**
|
|
* An array of discrete javascript code snippets
|
|
*
|
|
* @access private
|
|
* @var array of strings
|
|
*/
|
|
private $_code;
|
|
/**
|
|
* An array of discrete javascript code snippets for top script
|
|
*
|
|
* @access private
|
|
* @var array of strings
|
|
*/
|
|
private $_codeNew;
|
|
|
|
/**
|
|
* Returns HTML code to include javascript file.
|
|
*
|
|
* @param array $files The list of js file to include
|
|
*
|
|
* @return string HTML code for javascript inclusion.
|
|
*/
|
|
private function _includeFiles(array $files)
|
|
{
|
|
$result = '';
|
|
foreach ($files as $value) {
|
|
if (strpos($value['filename'], ".php") !== false) {
|
|
$file_name = $value['filename'] . Url::getCommon($value['params'] + ['v' => PMA_VERSION]);
|
|
$result .= "<script data-cfasync='false' "
|
|
. "type='text/javascript' src='js/" . $file_name
|
|
. "'></script>\n";
|
|
} else if (strpos($value['filename'], "_new") !== false) {
|
|
/**
|
|
* This piece of code is for appending the new revamped files into the
|
|
* DOM so that both new and old files can be used simultaneously
|
|
* It checks whether the file contains new in its name or not
|
|
*/
|
|
$src = "";
|
|
if ($GLOBALS['cfg']['environment'] === 'development') {
|
|
$src = $GLOBALS['cfg']['webpack_host'] . ":" . $GLOBALS['cfg']['webpack_port'] . "/";
|
|
}
|
|
$result .= '<script data-cfasync="false" type="text/javascript" src="' . $src . 'js/dist/'
|
|
. $value['filename'] . '?' . Header::getVersionParameter() . '"></script>' . "\n";
|
|
} else if (strpos($value['filename'], ".js") !== false) {
|
|
$result .= '<script data-cfasync="false" type="text/javascript" src="js/'
|
|
. $value['filename'] . '?' . Header::getVersionParameter() . '"></script>' . "\n";
|
|
}
|
|
}
|
|
return $result;
|
|
}
|
|
|
|
/**
|
|
* Generates new Scripts objects
|
|
*
|
|
*/
|
|
public function __construct()
|
|
{
|
|
$this->_files = [];
|
|
$this->_code = '';
|
|
}
|
|
|
|
/**
|
|
* Adds a new file to the list of scripts
|
|
*
|
|
* @param string $filename The name of the file to include
|
|
* @param array $params Additional parameters to pass to the file
|
|
*
|
|
* @return void
|
|
*/
|
|
public function addFile(
|
|
$filename,
|
|
array $params = []
|
|
) {
|
|
$hash = md5($filename);
|
|
if (!empty($this->_files[$hash])) {
|
|
return;
|
|
}
|
|
|
|
$has_onload = $this->_eventBlacklist($filename);
|
|
$this->_files[$hash] = [
|
|
'has_onload' => $has_onload,
|
|
'filename' => $filename,
|
|
'params' => $params,
|
|
];
|
|
}
|
|
|
|
/**
|
|
* Add new files to the list of scripts
|
|
*
|
|
* @param array $filelist The array of file names
|
|
*
|
|
* @return void
|
|
*/
|
|
public function addFiles(array $filelist)
|
|
{
|
|
foreach ($filelist as $filename) {
|
|
$this->addFile($filename);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Determines whether to fire up an onload event for a file
|
|
*
|
|
* @param string $filename The name of the file to be checked
|
|
* against the blacklist
|
|
*
|
|
* @return int 1 to fire up the event, 0 not to
|
|
*/
|
|
private function _eventBlacklist($filename)
|
|
{
|
|
if (strpos($filename, 'jquery') !== false
|
|
|| strpos($filename, 'codemirror') !== false
|
|
|| strpos($filename, 'messages.php') !== false
|
|
|| strpos($filename, 'ajax.js') !== false
|
|
|| strpos($filename, 'cross_framing_protection.js') !== false
|
|
|| strpos($filename, 'index_new.js') !== false
|
|
) {
|
|
return 0;
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
/**
|
|
* Adds a new code snippet to the code to be executed
|
|
*
|
|
* @param string $code The JS code to be added
|
|
*
|
|
* @return void
|
|
*/
|
|
public function addCode($code)
|
|
{
|
|
$this->_code .= "$code\n";
|
|
}
|
|
|
|
/**
|
|
* Adds a temporary new code snippet to the code to be executed
|
|
* at the top of the script before other scripts
|
|
*
|
|
* @param string $code The JS code to be added
|
|
*
|
|
* @return void
|
|
*/
|
|
public function addCodeNew($code)
|
|
{
|
|
$this->_codeNew .= "$code\n";
|
|
}
|
|
|
|
/**
|
|
* Returns a list with filenames and a flag to indicate
|
|
* whether to register onload events for this file
|
|
*
|
|
* @return array
|
|
*/
|
|
public function getFiles()
|
|
{
|
|
$retval = [];
|
|
foreach ($this->_files as $file) {
|
|
//If filename contains a "?", continue.
|
|
if (strpos($file['filename'], "?") !== false) {
|
|
continue;
|
|
}
|
|
$retval[] = [
|
|
'name' => $file['filename'],
|
|
'fire' => $file['has_onload']
|
|
];
|
|
}
|
|
return $retval;
|
|
}
|
|
|
|
/**
|
|
* Renders all the JavaScript file inclusions, code and events
|
|
*
|
|
* @return string
|
|
*/
|
|
public function getDisplay()
|
|
{
|
|
$retval = '';
|
|
|
|
$retval .= '<script data-cfasync="false" type="text/javascript">';
|
|
$retval .= "// <![CDATA[\n";
|
|
$retval .= $this->_codeNew;
|
|
$retval .= '// ]]>';
|
|
$retval .= '</script>';
|
|
|
|
if (count($this->_files) > 0) {
|
|
$retval .= $this->_includeFiles(
|
|
$this->_files
|
|
);
|
|
}
|
|
|
|
$code = 'AJAX.scriptHandler';
|
|
foreach ($this->_files as $file) {
|
|
if (strpos($file['filename'], ".js") !== false) {
|
|
$code .= sprintf(
|
|
'.add("%s",%d)',
|
|
Sanitize::escapeJsString($file['filename']),
|
|
$file['has_onload'] ? 1 : 0
|
|
);
|
|
}
|
|
}
|
|
$code .= ';';
|
|
$this->addCode($code);
|
|
|
|
$code = '$(function() {';
|
|
foreach ($this->_files as $file) {
|
|
if ($file['has_onload'] && strpos($file['filename'], ".js") !== false) {
|
|
$code .= 'AJAX.fireOnload("';
|
|
$code .= Sanitize::escapeJsString($file['filename']);
|
|
$code .= '");';
|
|
}
|
|
}
|
|
$code .= '});';
|
|
$this->addCode($code);
|
|
|
|
$retval .= '<script data-cfasync="false" type="text/javascript">';
|
|
$retval .= "// <![CDATA[\n";
|
|
$retval .= $this->_code;
|
|
$retval .= '// ]]>';
|
|
$retval .= '</script>';
|
|
|
|
return $retval;
|
|
}
|
|
}
|