New Full Text Search
This commit is contained in:
1 parent
c4d77d38b3
commit
0dac58742d
8 files changed
+98
-265
No files matched your search
+14
-37
@@ -41,7 +41,6 @@ class Databap extends PhpObject
|
||||
const IMG_TABLE = 'images';
|
||||
const DOC_TABLE = 'docs';
|
||||
const FILE_TABLE = 'files';
|
||||
const SEARCH_TABLE = 'searchs';
|
||||
const TABL_TABLE = 'tables';
|
||||
const TITLE_LEN = 200;
|
||||
|
||||
@@ -183,7 +182,6 @@ class Databap extends PhpObject
|
||||
|
||||
//Objects
|
||||
private $oMySql;
|
||||
private $oSearchEngine;
|
||||
private $oClassManagement;
|
||||
private $oAuth;
|
||||
|
||||
@@ -226,9 +224,6 @@ class Databap extends PhpObject
|
||||
//Passing settings down to mySQL
|
||||
$this->oMySql = new MySqlManager(Settings::DB_SERVER, Settings::DB_LOGIN, Settings::DB_PASS, Settings::DB_NAME, self::getSqlOptions(), Settings::DB_ENC);
|
||||
if($this->oMySql->sDbState == MySqlManager::DB_NO_DATA && Settings::DEBUG==true) $this->install();
|
||||
|
||||
//Init Search Engine
|
||||
$this->oSearchEngine = new SearchEngine($this->oMySql);
|
||||
}
|
||||
|
||||
public static function getSqlOptions()
|
||||
@@ -251,7 +246,6 @@ class Databap extends PhpObject
|
||||
self::IMG_TABLE => array(MySqlManager::getId(self::PROC_TABLE), MySqlManager::getId(self::STEP_TABLE), 'description', 'file_name'),
|
||||
self::DOC_TABLE => array(MySqlManager::getId(self::USER_TABLE), 'title', 'description', 'refer_id'),
|
||||
self::FILE_TABLE => array('id_item', 'type', 'description', 'hash', 'extension'),
|
||||
self::SEARCH_TABLE => array('id_item', 'refer_id', 'type', 'keywords'),
|
||||
self::ART_TABLE => array('title', 'link', 'date', 'first_name', 'last_name', 'email'),
|
||||
self::TABL_TABLE => array(MySqlManager::getId(self::USER_TABLE), 'title', 'description', 'system', 'keywords', 'refer_id')
|
||||
);
|
||||
@@ -292,10 +286,16 @@ class Databap extends PhpObject
|
||||
);
|
||||
$asOptions['constraints'] = array
|
||||
(
|
||||
self::USER_TABLE => "UNIQUE KEY `user_first_and_last_name` (`first_name`, `last_name`)",
|
||||
self::URL_TABLE => "UNIQUE KEY `uni_phrase` (`phrase`)",
|
||||
self::MSG_TABLE => "INDEX(`date`)",
|
||||
self::ART_TABLE => "INDEX(`title`)"
|
||||
self::USER_TABLE => "UNIQUE KEY `user_first_and_last_name` (`first_name`, `last_name`)",
|
||||
self::URL_TABLE => "UNIQUE KEY `uni_phrase` (`phrase`)",
|
||||
self::MSG_TABLE => "INDEX(`date`)",
|
||||
self::ART_TABLE => "INDEX(`title`), FULLTEXT(`title`)",
|
||||
self::CODE_TABLE => "FULLTEXT(`".MySqlManager::getText(self::CODE_TABLE)."`, `description`)",
|
||||
self::PROC_TABLE => "FULLTEXT(`title`, `description`)",
|
||||
self::STEP_TABLE => "FULLTEXT(`description`)",
|
||||
self::DOC_TABLE => "FULLTEXT(`title`, `description`)",
|
||||
self::FILE_TABLE => "FULLTEXT(`description`)",
|
||||
self::TABL_TABLE => "FULLTEXT(`title`, `description`, `keywords`)"
|
||||
);
|
||||
$asOptions['cascading_delete'] = array
|
||||
(
|
||||
@@ -629,7 +629,6 @@ class Databap extends PhpObject
|
||||
{
|
||||
$iArticleId = $this->oMySql->insertRow(self::ART_TABLE, $asArticle);
|
||||
$this->addMessage($iArticleId, self::MESSAGE_ARTICLE, self::DEFAULT_CHAN_ID);
|
||||
$this->oSearchEngine->buildIndex($iArticleId, self::ART_TYPE);
|
||||
$sResult = 'ADDED';
|
||||
}
|
||||
else $sResult = 'OK';
|
||||
@@ -888,16 +887,6 @@ class Databap extends PhpObject
|
||||
return $bExt?$this->getJsonPostResult(true, ''):$iUserId;
|
||||
}
|
||||
|
||||
public function buildCompleteIndex()
|
||||
{
|
||||
$this->oMySql->emptyTable(self::SEARCH_TABLE);
|
||||
foreach($this->getTypeInfo('table') as $sSearchType=>$sSearchTable)
|
||||
{
|
||||
$asItemIds = $this->oMySql->selectRows(array('select'=>MySqlManager::getId($sSearchTable), 'from'=>$sSearchTable));
|
||||
foreach($asItemIds as $iItemId) $this->oSearchEngine->buildIndex($iItemId, $sSearchType);
|
||||
}
|
||||
}
|
||||
|
||||
//insert new code / version
|
||||
public function addCode($asData)
|
||||
{
|
||||
@@ -924,9 +913,6 @@ class Databap extends PhpObject
|
||||
//Add message
|
||||
$this->addMessage($iCodeId, self::MESSAGE_ADD_CODE, self::DEFAULT_CHAN_ID);
|
||||
|
||||
//Add record in Search Table
|
||||
$this->oSearchEngine->buildIndex($iCodeId, self::CODE_TYPE);
|
||||
|
||||
return $iCodeId;
|
||||
}
|
||||
|
||||
@@ -944,9 +930,6 @@ class Databap extends PhpObject
|
||||
//Add message
|
||||
$this->addMessage($iCodeId, self::MESSAGE_EDIT_CODE, self::DEFAULT_CHAN_ID);
|
||||
|
||||
//Add record in Search Table
|
||||
$this->oSearchEngine->buildIndex($iCodeId, self::CODE_TYPE);
|
||||
|
||||
return $iCodeId;
|
||||
}
|
||||
|
||||
@@ -984,9 +967,6 @@ class Databap extends PhpObject
|
||||
{
|
||||
$this->addMessage($iNewProcId, self::MESSAGE_EDIT_PROC, self::DEFAULT_CHAN_ID);
|
||||
}
|
||||
|
||||
//Add record in Search Table
|
||||
$this->oSearchEngine->buildIndex($iNewProcId, self::PROC_TYPE);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -1065,9 +1045,6 @@ class Databap extends PhpObject
|
||||
//Add Message in chat
|
||||
$this->addMessage($iDbDocId, $bCreation?self::MESSAGE_ADD_DOC:self::MESSAGE_EDIT_DOC, self::DEFAULT_CHAN_ID);
|
||||
|
||||
//Add record in Search Table
|
||||
$this->oSearchEngine->buildIndex($iDbDocId, self::DOC_TYPE);
|
||||
|
||||
//TODO add error handling
|
||||
return $this->getJsonPostResult(true, '', array('doc_id'=>$iDbDocId));
|
||||
}
|
||||
@@ -1133,9 +1110,6 @@ class Databap extends PhpObject
|
||||
|
||||
//Add Message in chat
|
||||
$this->addMessage($iDbTableId, $bCreation?self::MESSAGE_ADD_TABLE:self::MESSAGE_EDIT_TABLE, self::DEFAULT_CHAN_ID);
|
||||
|
||||
//Add record in Search Table
|
||||
$this->oSearchEngine->buildIndex($iDbTableId, self::TABLE_TYPE);
|
||||
}
|
||||
}
|
||||
return $this->getJsonPostResult($iDbTableId>0, $sDesc, array('id'=>$iDbTableId, 'name'=>$sTitle));
|
||||
@@ -2859,8 +2833,11 @@ class Databap extends PhpObject
|
||||
return $sChanSafeName;
|
||||
}
|
||||
|
||||
public function getResults($sSearchWords)
|
||||
public function search($sSearchWords)
|
||||
{
|
||||
//Init Search Engine
|
||||
$this->oSearchEngine = new SearchEngine($this->oMySql);
|
||||
|
||||
$this->oSearchEngine->setWords($sSearchWords);
|
||||
$asResults = $this->oSearchEngine->getResults();
|
||||
|
||||
|
||||
@@ -150,7 +150,7 @@ class MySqlManager extends PhpObject
|
||||
$asForeignKeyQueries = array();
|
||||
foreach($asTableNames as $sTableName)
|
||||
{
|
||||
$asTableColumns = array_keys($this->getTablecolumns($sTableName));
|
||||
$asTableColumns = $this->getTablecolumns($sTableName, false);
|
||||
foreach($asTableColumns as $sColumnName)
|
||||
{
|
||||
if($this->isId($sColumnName) && $sColumnName!=self::getId($sTableName))
|
||||
@@ -269,7 +269,7 @@ class MySqlManager extends PhpObject
|
||||
}
|
||||
}
|
||||
|
||||
public function getTablecolumns($sTableName)
|
||||
public function getTablecolumns($sTableName, $bTypes=true)
|
||||
{
|
||||
if(!array_key_exists($sTableName, $this->asOptions['tables'])) return false;
|
||||
|
||||
@@ -277,9 +277,16 @@ class MySqlManager extends PhpObject
|
||||
foreach($this->asOptions['tables'][$sTableName] as $sFieldName) $asTableColumns[] = $sFieldName;
|
||||
$asTableColumns[] = 'led';
|
||||
|
||||
if(!$bTypes) return $asTableColumns;
|
||||
|
||||
$asTableName = array_fill(0, count($asTableColumns), $sTableName);
|
||||
return array_combine($asTableColumns, array_map(array('self', 'getColumnType'), $asTableColumns, $asTableName));
|
||||
}
|
||||
|
||||
public function isColumnInTable($sTableName, $sColName) {
|
||||
$asCols = $this->getTablecolumns($sTableName, false);
|
||||
return ($asCols && in_array($sColName, $asCols));
|
||||
}
|
||||
|
||||
private function getColumnType($sColumnName, $sTableName)
|
||||
{
|
||||
|
||||
+68
-216
@@ -5,254 +5,106 @@
|
||||
*
|
||||
* Procedure to add a new type in the search
|
||||
* - Add type in Databap->getItemTables()
|
||||
* - Add type in the index builder : SearchEngine->buildIndex()
|
||||
* - Add type in item info : SearchEngine->setItemInfo()
|
||||
* - Add type in searched fields : SearchEngine->setResults()
|
||||
* - Add type in Databap->getItemList() and create a Databap->get<type>info()
|
||||
* - Add type text in Databap->getProfile()
|
||||
* - Consider the message types : add + edit in Databap->getMessages() and in chat.html
|
||||
*/
|
||||
class SearchEngine extends PhpObject
|
||||
{
|
||||
//Objects
|
||||
/**
|
||||
* DB Handle
|
||||
* @var MySqlManager
|
||||
*/
|
||||
private $oMySql;
|
||||
|
||||
//variables
|
||||
private $asWords;
|
||||
private $iLevelMax;
|
||||
private $asItemRanks;
|
||||
private $asItemInfos;
|
||||
private $asUserInfos;
|
||||
|
||||
//Constants
|
||||
const RESULT_A_PAGE = 20;
|
||||
const KEYWORDS_SEPARATOR = ' ';
|
||||
private $sWords;
|
||||
private $asItems;
|
||||
|
||||
function __construct($oMySql)
|
||||
{
|
||||
parent::__construct(__CLASS__, Settings::DEBUG);
|
||||
$this->oMySql = $oMySql;
|
||||
$this->asWords = $this->setWords('');
|
||||
$this->asItemRanks = array();
|
||||
$this->asItemInfos = array();
|
||||
$this->asUserInfos = array();
|
||||
}
|
||||
|
||||
public function buildIndex($iItemId, $sType)
|
||||
{
|
||||
//Build keywords
|
||||
switch($sType)
|
||||
{
|
||||
case Databap::CODE_TYPE:
|
||||
$asItemData = $this->oMySql->selectRow(Databap::CODE_TABLE, $iItemId);
|
||||
$asWords = array($asItemData[MySqlManager::getText(Databap::CODE_TABLE)], $asItemData['description']);
|
||||
break;
|
||||
case Databap::PROC_TYPE:
|
||||
$sItemIdCol = MySqlManager::getId(Databap::PROC_TABLE);
|
||||
$asItemData = $this->oMySql->selectRow(Databap::PROC_TABLE, $iItemId);
|
||||
$asItemStepsData = $this->oMySql->selectRows(array('select'=>'description', 'from'=>Databap::STEP_TABLE, 'constraint'=>array($sItemIdCol=>$iItemId)));
|
||||
$asWords = array('desc'=>$asItemData['description'], 'title'=>$asItemData['title']) + $asItemStepsData;
|
||||
break;
|
||||
case Databap::ART_TYPE:
|
||||
$asItemData = $this->oMySql->selectRow(Databap::ART_TABLE, $iItemId);
|
||||
$asWords = array($asItemData['first_name'], $asItemData['last_name'], $asItemData['title']);
|
||||
break;
|
||||
case Databap::DOC_TYPE:
|
||||
$asItemData = $this->oMySql->selectRow(Databap::DOC_TABLE, $iItemId);
|
||||
$asItemFilesData = $this->oMySql->selectRows(array('select'=>'description', 'from'=>Databap::FILE_TABLE, 'constraint'=>array('id_item'=>$iItemId, 'type'=>Databap::DOC_TYPE)));
|
||||
$asWords = array('desc'=>$asItemData['description'], 'title'=>$asItemData['title']) + $asItemFilesData;
|
||||
break;
|
||||
case Databap::TABLE_TYPE:
|
||||
$asItemData = $this->oMySql->selectRow(Databap::TABL_TABLE, $iItemId);
|
||||
$asWords = array('desc'=>$asItemData['description'], 'title'=>$asItemData['title'], 'keywords'=>$asItemData['keywords'], 'system'=>$asItemData['system']);
|
||||
break;
|
||||
default:
|
||||
$this->addError('function '.__FUNCTION__.'(): Incorrect type "'.$sType.'"');
|
||||
break;
|
||||
}
|
||||
$sWords = implode(self::KEYWORDS_SEPARATOR, $asWords);
|
||||
$sWords = mb_strtolower(str_replace("\n", self::KEYWORDS_SEPARATOR, $sWords));
|
||||
$sWords = preg_replace('/(\W+)/u', self::KEYWORDS_SEPARATOR, $sWords); //remove all non-word characters
|
||||
|
||||
//Add / Modify search database
|
||||
$asData = array('id_item'=>$iItemId, 'type'=>$sType, 'refer_id'=>(array_key_exists('refer_id', $asItemData)?$asItemData['refer_id']:$iItemId), 'keywords'=>$sWords);
|
||||
$this->oMySql->insertUpdateRow(Databap::SEARCH_TABLE, $asData, array('id_item', 'type'));
|
||||
$this->sWords = '';
|
||||
$this->asItems = array();
|
||||
}
|
||||
|
||||
public function setWords($sSearchWords)
|
||||
{
|
||||
$this->asWords = $this->getParsedWords($sSearchWords);
|
||||
$this->iLevelMax = count($this->asWords);
|
||||
$this->oMySql->cleanSql($sSearchWords);
|
||||
$this->sWords = $sSearchWords;
|
||||
$this->setResults();
|
||||
}
|
||||
|
||||
/**
|
||||
* TODO Customized item preview
|
||||
$sCodeLines = implode("\n...\n", $this->getCodeInfo($iItemId, 'code'));
|
||||
$oCode = new Reader($sCodeLines);
|
||||
$sCodeLines = $oCode->getColoredCode();
|
||||
*/
|
||||
private function setItemInfo($iSearchId, $iItemType, $iItemId)
|
||||
{
|
||||
if(!array_key_exists($iSearchId, $this->asItemInfos))
|
||||
{
|
||||
/*switch($iItemType)
|
||||
{
|
||||
case Databap::CODE_TYPE:
|
||||
$sItemTable = Databap::CODE_TABLE;
|
||||
$asItemFields = array(MySqlManager::getId(Databap::USER_TABLE), 'description', 'led');
|
||||
break;
|
||||
case Databap::PROC_TYPE:
|
||||
$sItemTable = Databap::PROC_TABLE;
|
||||
$asItemFields = array(MySqlManager::getId(Databap::USER_TABLE), 'title AS description', 'led');
|
||||
break;
|
||||
case Databap::ART_TYPE:
|
||||
$sItemTable = Databap::ART_TABLE;
|
||||
$asItemFields = array('first_name', 'last_name', 'title AS description', 'led');
|
||||
break;
|
||||
case Databap::DOC_TYPE:
|
||||
$sItemTable = Databap::DOC_TABLE;
|
||||
$asItemFields = array(MySqlManager::getId(Databap::USER_TABLE), 'title AS description', 'led');
|
||||
break;
|
||||
case Databap::TABLE_TYPE:
|
||||
$sItemTable = Databap::TABL_TABLE;
|
||||
$asItemFields = array(MySqlManager::getId(Databap::USER_TABLE), 'title AS description', 'led');
|
||||
break;
|
||||
}
|
||||
$this->asItemInfos[$iSearchId] = $this->oMySql->selectRow($sItemTable, $iItemId, $asItemFields);*/
|
||||
$this->asItemInfos[$iSearchId]['type'] = $iItemType;
|
||||
$this->asItemInfos[$iSearchId]['id_item'] = $iItemId;
|
||||
}
|
||||
}
|
||||
|
||||
private function getItemInfo($iSearchId, $sInfoName)
|
||||
{
|
||||
if(array_key_exists($iSearchId, $this->asItemInfos) && array_key_exists($sInfoName, $this->asItemInfos[$iSearchId]))
|
||||
return $this->asItemInfos[$iSearchId][$sInfoName];
|
||||
else return false;
|
||||
}
|
||||
|
||||
/*
|
||||
private function setUserInfo($iUserId)
|
||||
{
|
||||
if($iUserId > 0 && !array_key_exists($iUserId, $this->asUserInfos))
|
||||
{
|
||||
$sCompanyIdCol = MySqlManager::getId(Databap::COMP_TABLE);
|
||||
$this->asUserInfos[$iUserId] = $this->oMySql->selectRow
|
||||
(
|
||||
Databap::USER_TABLE,
|
||||
$iUserId,
|
||||
array('first_name', 'last_name', $sCompanyIdCol)
|
||||
);
|
||||
|
||||
$this->asUserInfos[$iUserId]['company'] = $this->oMySql->selectValue(Databap::COMP_TABLE, MySqlManager::getText(Databap::COMP_TABLE), $this->asUserInfos[$iUserId][$sCompanyIdCol]);
|
||||
unset($this->asUserInfos[$iUserId][$sCompanyIdCol]);
|
||||
}
|
||||
}
|
||||
|
||||
private function getUserInfo($iUserId, $sInfoName)
|
||||
{
|
||||
if(array_key_exists($iUserId, $this->asUserInfos) && array_key_exists($sInfoName, $this->asUserInfos[$iUserId]))
|
||||
return $this->asUserInfos[$iUserId][$sInfoName];
|
||||
else return false;
|
||||
}
|
||||
*/
|
||||
|
||||
private function setResults()
|
||||
{
|
||||
if($this->iLevelMax > 0)
|
||||
$this->asItems = array();
|
||||
if($this->sWords != '')
|
||||
{
|
||||
//set Results and Ranking
|
||||
$aiLevels = range(1, $this->iLevelMax);
|
||||
arsort($aiLevels);
|
||||
foreach($aiLevels as $iLevel)
|
||||
{
|
||||
//all possibilies at level $iLevel
|
||||
$iIndex = 0;
|
||||
while(($iIndex + $iLevel) <= $this->iLevelMax)
|
||||
{
|
||||
//building query
|
||||
$asSequence = array_slice($this->asWords, $iIndex, $iLevel);
|
||||
$this->oMySql->cleanSql($asSequence);
|
||||
|
||||
//$sRegExp = implode('(.{0,2})', $asSequence);
|
||||
$sRegExp = implode(self::KEYWORDS_SEPARATOR.'?', $asSequence);
|
||||
$sSequence = implode(self::KEYWORDS_SEPARATOR, $asSequence);
|
||||
|
||||
//TODO replace with selectRow()
|
||||
$sQuery = "SELECT id_search, MAX(id_item) AS id_item, type, keywords FROM searchs WHERE keywords REGEXP '{$sRegExp}' GROUP BY type, refer_id";
|
||||
|
||||
//search sequence
|
||||
$asItems = $this->oMySql->getArrayQuery($sQuery, true);
|
||||
foreach($asItems as $asItem)
|
||||
{
|
||||
$iSearchId = $asItem['id_search'];
|
||||
$iItemId = $asItem['id_item'];;
|
||||
$iItemType = $asItem['type'];
|
||||
$sWords = $asItem['keywords'];
|
||||
|
||||
//Calculate bonus points
|
||||
$sWords = str_replace(self::KEYWORDS_SEPARATOR.$sSequence.self::KEYWORDS_SEPARATOR, self::KEYWORDS_SEPARATOR, self::KEYWORDS_SEPARATOR.$sWords.self::KEYWORDS_SEPARATOR, $iSeqCount);
|
||||
$sWords = str_replace(self::KEYWORDS_SEPARATOR.$sSequence, self::KEYWORDS_SEPARATOR, self::KEYWORDS_SEPARATOR.$sWords.self::KEYWORDS_SEPARATOR, $iStaCount);
|
||||
$sWords = str_replace($sSequence.self::KEYWORDS_SEPARATOR, self::KEYWORDS_SEPARATOR, self::KEYWORDS_SEPARATOR.$sWords.self::KEYWORDS_SEPARATOR, $iEndCount);
|
||||
$iBonus = $iSeqCount*5 + $iStaCount*2 + $iEndCount;
|
||||
|
||||
$this->incItemRank($iSearchId, $iLevel*10+$iBonus);
|
||||
$this->setItemInfo($iSearchId, $iItemType, $iItemId);
|
||||
//$this->setUserInfo($this->getItemInfo($iSearchId, MySqlManager::getId(Databap::USER_TABLE)));
|
||||
$asSearches = array(
|
||||
Databap::CODE_TYPE => array(
|
||||
Databap::CODE_TABLE => array(MySqlManager::getText(Databap::CODE_TABLE), 'description')
|
||||
),
|
||||
Databap::PROC_TYPE => array(
|
||||
Databap::PROC_TABLE => array('title', 'description'),
|
||||
Databap::STEP_TABLE => array('description')
|
||||
),
|
||||
Databap::ART_TYPE => array(
|
||||
Databap::ART_TABLE => array('title')
|
||||
),
|
||||
Databap::DOC_TYPE => array(
|
||||
Databap::DOC_TABLE => array('title', 'description'),
|
||||
Databap::FILE_TABLE => array('description')
|
||||
),
|
||||
Databap::TABLE_TYPE=> array(
|
||||
Databap::TABL_TABLE => array('title', 'description', 'keywords')
|
||||
)
|
||||
);
|
||||
|
||||
foreach($asSearches as $sType=>$asTables) {
|
||||
$sMainTableName = $sJoin = '';
|
||||
$asMatchAgainst = array();
|
||||
foreach($asTables as $sTableName=>$asFields) {
|
||||
if($sMainTableName=='') { //First table contains main object
|
||||
$sMainTableName = $sTableName;
|
||||
$sMainTableIdCol = MySqlManager::getId($sMainTableName);
|
||||
$sMainTableIdColFull = MySqlManager::getId($sMainTableName, true);
|
||||
}
|
||||
$iIndex++;
|
||||
else { //Other tables must be joined
|
||||
$sJoin .= "LEFT JOIN {$sTableName} ";
|
||||
if($this->oMySql->isColumnInTable($sTableName, $sMainTableIdCol)) $sJoin .= "USING({$sMainTableIdCol}) ";
|
||||
else $sJoin .= "ON {$sTableName}.id_item = {$sMainTableIdColFull} ";
|
||||
}
|
||||
|
||||
$asMatchFields = array();
|
||||
foreach($asFields as $sField) $asMatchFields[] = MySqlManager::getFullColumnName($sTableName, $sField);
|
||||
$asMatchAgainst[] = "MATCH (".implode(',', $asMatchFields).") AGAINST ('".$this->sWords."' IN BOOLEAN MODE)";
|
||||
}
|
||||
|
||||
$sGroupByCol = $this->oMySql->isColumnInTable($sMainTableName, 'refer_id')?'refer_id':$sMainTableIdColFull;
|
||||
|
||||
$sQuery = "SELECT MAX({$sMainTableIdColFull}) AS id_item, '{$sType}' AS type, (".(implode(" + ", $asMatchAgainst)).") AS rank ".
|
||||
"FROM {$sMainTableName} ".
|
||||
$sJoin.
|
||||
"WHERE ".implode(" OR ", $asMatchAgainst)." ".
|
||||
"GROUP BY {$sGroupByCol}";
|
||||
|
||||
$asItems = $this->oMySql->getArrayQuery($sQuery, true);
|
||||
foreach($asItems as $asItem) {
|
||||
$asItem['rank'] = round($asItem['rank'] * 100);
|
||||
$this->asItems[] = $asItem;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
public function getResults()
|
||||
{
|
||||
$asResult = array();
|
||||
|
||||
//Mixing info
|
||||
arsort($this->asItemRanks);
|
||||
foreach($this->asItemRanks as $iSearchId=>$iRank)
|
||||
{
|
||||
/*$iUserId = $this->getItemInfo($iSearchId, MySqlManager::getId(Databap::USER_TABLE));
|
||||
$sFirstName = $this->getUserInfo($iUserId, 'first_name')?$this->getUserInfo($iUserId, 'first_name'):$this->getItemInfo($iSearchId, 'first_name');
|
||||
$sLastName = $this->getUserInfo($iUserId, 'last_name')?$this->getUserInfo($iUserId, 'last_name'):$this->getItemInfo($iSearchId, 'last_name');
|
||||
$sCompany = $this->getUserInfo($iUserId, 'company')?$this->getUserInfo($iUserId, 'company'):'SAP';
|
||||
$asResult[] = array('id_item'=>$this->getItemInfo($iSearchId, 'id_item'),
|
||||
'type'=>$this->getItemInfo($iSearchId, 'type'),
|
||||
'description'=>$this->getItemInfo($iSearchId, 'description'),
|
||||
'rank'=>$iRank,
|
||||
'name'=>Databap::getNameFormat($sFirstName, $sLastName),
|
||||
'company'=>Databap::getCompanyFormat($sCompany),
|
||||
'led'=>Databap::getDateFormat($this->getItemInfo($iSearchId, 'led')));
|
||||
*/
|
||||
$asResult[] = array('id_item'=>$this->getItemInfo($iSearchId, 'id_item'),
|
||||
'type'=>$this->getItemInfo($iSearchId, 'type'),
|
||||
'rank'=>$iRank);
|
||||
}
|
||||
return $asResult;
|
||||
}
|
||||
|
||||
private function incItemRank($iSearchId, $iRank)
|
||||
{
|
||||
if(array_key_exists($iSearchId, $this->asItemRanks))
|
||||
{
|
||||
$this->asItemRanks[$iSearchId] += $iRank;
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->asItemRanks[$iSearchId] = $iRank;
|
||||
}
|
||||
}
|
||||
|
||||
private function getParsedWords($sSearchWords)
|
||||
{
|
||||
return array_unique(array_filter(explode(' ', $sSearchWords), array($this, 'checkSearchedWords')));
|
||||
}
|
||||
|
||||
private function checkSearchedWords($sWord)
|
||||
{
|
||||
return (mb_strlen($sWord) >= 2);
|
||||
usort($this->asItems, function($a, $b) {return ($a['rank'] < $b['rank']);});
|
||||
return $this->asItems;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -143,7 +143,7 @@ if($bUserOk && $sAction!=Databap::EXT_ACCESS)
|
||||
$sResult = $oDatabap->getProfile($oItemId);
|
||||
break;
|
||||
case 'search':
|
||||
$sResult = $oDatabap->getResults($sKeyWords);
|
||||
$sResult = $oDatabap->search($sKeyWords);
|
||||
break;
|
||||
case 'code_block':
|
||||
$sResult = $oDatabap->getCodeBlock();
|
||||
@@ -211,10 +211,6 @@ if($bUserOk && $sAction!=Databap::EXT_ACCESS)
|
||||
case 'assign_user':
|
||||
$sResult = $oDatabap->assignUser($oUser, $sCompany);
|
||||
break;
|
||||
case 'build_index':
|
||||
$oDatabap->buildCompleteIndex();
|
||||
$sResult = 'Index ok';
|
||||
break;
|
||||
case 'install_queries':
|
||||
$oMySqlInstall = new MySqlManager(Settings::DB_SERVER, Settings::DB_LOGIN, Settings::DB_PASS, Settings::DB_NAME, Databap::getSqlOptions(), Settings::DB_ENC);
|
||||
$sResult = $oMySqlInstall->getFullInstallQuery();
|
||||
|
||||
@@ -347,6 +347,9 @@ a[href^="table"].internal_link span.item {
|
||||
padding:0;
|
||||
display:block;
|
||||
width: 100%;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.author_box i.fa-30 {
|
||||
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
@CHARSET "UTF-8";/*!
|
||||
* Font Awesome 4.2.0 by @davegandy - http://fontawesome.io - @fontawesome
|
||||
* License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
|
||||
*/@font-face{font-family:"FontAwesome";src:url("style/fontawesome-webfont.eot?v=4.2.0");src:url("style/fontawesome-webfont.eot?#iefix&v=4.2.0") format("embedded-opentype"),url("style/fontawesome-webfont.woff?v=4.2.0") format("woff"),url("style/fontawesome-webfont.ttf?v=4.2.0") format("truetype"),url("style/fontawesome-webfont.svg?v=4.2.0#fontawesomeregular") format("svg");font-weight:normal;font-style:normal}.fa{display:inline-block;font-family:FontAwesome;font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:spin 2s infinite linear;-moz-animation:spin 2s infinite linear;-o-animation:spin 2s infinite linear;animation:spin 2s infinite linear}@-moz-keyframes spin{0%{-moz-transform:rotate(0deg)}100%{-moz-transform:rotate(359deg)}}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg)}}@-o-keyframes spin{0%{-o-transform:rotate(0deg)}100%{-o-transform:rotate(359deg)}}@keyframes spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);-webkit-transform:scale(-1, 1);-moz-transform:scale(-1, 1);-ms-transform:scale(-1, 1);-o-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);-webkit-transform:scale(1, -1);-moz-transform:scale(1, -1);-ms-transform:scale(1, -1);-o-transform:scale(1, -1);transform:scale(1, -1)}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-inline{margin-right:5px}.fa-10{font-size:1.1111111111em;line-height:.9166666667em;vertical-align:-5%}.fa-20,#chat_messages p span.text a.img_box.hidden .banner .button .fa{font-size:1.2222222222em;line-height:.8333333333em;vertical-align:-10%}.fa-30{font-size:1.3333333333em;line-height:.75em;vertical-align:-15%}.fa-40{font-size:1.4444444444em;line-height:.6666666667em;vertical-align:-20%}.fa-60,a.button .fa{font-size:1.6666666667em;line-height:.5em;vertical-align:-30%}.fa-c-c:before,.fa-c-code:before{content:""}.fa-c-procedure:before,.fa-c-proc:before,.fa-c-p:before{content:""}.fa-c-table:before,.fa-c-t:before{content:""}.fa-c-documentation:before,.fa-c-doc:before,.fa-c-d:before{content:""}.fa-c-article:before,.fa-c-art:before,.fa-c-a:before{content:""}.fa-c-note:before{content:""}.fa-c-list:before{content:""}.fa-c-profile:before{content:""}.fa-c-chat:before{content:""}.fa-c-news:before{content:""}.fa-c-version:before{content:""}.fa-c-details:before{content:""}.fa-c-bug:before{content:""}.fa-c-date:before{content:""}.fa-c-git:before{content:""}.fa-c-afk:before{content:""}.fa-c-comment{color:#04357b}.fa-c-comment:before{content:""}.fa-c-options:before{content:""}.fa-c-param:before{content:""}.fa-c-wip:before{content:""}.fa-c-rss:before{content:""}.fa-c-logmeout:before,.fa-c-logout:before{content:""}.fa-c-fold{color:#04357b}.fa-c-fold:before{content:""}.fa-c-success:before,.fa-c-ok:before,.available .fa:before{content:""}.fa-c-warning{color:orange}.fa-c-warning:before{content:""}.fa-c-error{color:red}.fa-c-error:before{content:""}.fa-c-ko{color:red}.fa-c-ko:before,.unavailable .fa:before{content:""}.fa-c-search:before{content:""}.fa-c-welcome:before{content:""}.fa-c-loading:before{content:""}.fa-c-edit:before{content:""}.fa-Line truncated
|
||||
*/@font-face{font-family:"FontAwesome";src:url("style/fontawesome-webfont.eot?v=4.2.0");src:url("style/fontawesome-webfont.eot?#iefix&v=4.2.0") format("embedded-opentype"),url("style/fontawesome-webfont.woff?v=4.2.0") format("woff"),url("style/fontawesome-webfont.ttf?v=4.2.0") format("truetype"),url("style/fontawesome-webfont.svg?v=4.2.0#fontawesomeregular") format("svg");font-weight:normal;font-style:normal}.fa{display:inline-block;font-family:FontAwesome;font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:spin 2s infinite linear;-moz-animation:spin 2s infinite linear;-o-animation:spin 2s infinite linear;animation:spin 2s infinite linear}@-moz-keyframes spin{0%{-moz-transform:rotate(0deg)}100%{-moz-transform:rotate(359deg)}}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg)}}@-o-keyframes spin{0%{-o-transform:rotate(0deg)}100%{-o-transform:rotate(359deg)}}@keyframes spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);-webkit-transform:scale(-1, 1);-moz-transform:scale(-1, 1);-ms-transform:scale(-1, 1);-o-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);-webkit-transform:scale(1, -1);-moz-transform:scale(1, -1);-ms-transform:scale(1, -1);-o-transform:scale(1, -1);transform:scale(1, -1)}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-inline{margin-right:5px}.fa-10{font-size:1.1111111111em;line-height:.9166666667em;vertical-align:-5%}.fa-20,#chat_messages p span.text a.img_box.hidden .banner .button .fa{font-size:1.2222222222em;line-height:.8333333333em;vertical-align:-10%}.fa-30{font-size:1.3333333333em;line-height:.75em;vertical-align:-15%}.fa-40{font-size:1.4444444444em;line-height:.6666666667em;vertical-align:-20%}.fa-60,a.button .fa{font-size:1.6666666667em;line-height:.5em;vertical-align:-30%}.fa-c-c:before,.fa-c-code:before{content:""}.fa-c-procedure:before,.fa-c-proc:before,.fa-c-p:before{content:""}.fa-c-table:before,.fa-c-t:before{content:""}.fa-c-documentation:before,.fa-c-doc:before,.fa-c-d:before{content:""}.fa-c-article:before,.fa-c-art:before,.fa-c-a:before{content:""}.fa-c-note:before{content:""}.fa-c-list:before{content:""}.fa-c-profile:before{content:""}.fa-c-chat:before{content:""}.fa-c-news:before{content:""}.fa-c-version:before{content:""}.fa-c-details:before{content:""}.fa-c-bug:before{content:""}.fa-c-date:before{content:""}.fa-c-git:before{content:""}.fa-c-afk:before{content:""}.fa-c-comment{color:#04357b}.fa-c-comment:before{content:""}.fa-c-options:before{content:""}.fa-c-param:before{content:""}.fa-c-wip:before{content:""}.fa-c-rss:before{content:""}.fa-c-logmeout:before,.fa-c-logout:before{content:""}.fa-c-fold{color:#04357b}.fa-c-fold:before{content:""}.fa-c-success:before,.fa-c-ok:before,.available .fa:before{content:""}.fa-c-warning{color:orange}.fa-c-warning:before{content:""}.fa-c-error{color:red}.fa-c-error:before{content:""}.fa-c-ko{color:red}.fa-c-ko:before,.unavailable .fa:before{content:""}.fa-c-search:before{content:""}.fa-c-welcome:before{content:""}.fa-c-loading:before{content:""}.fa-c-edit:before{content:""}.fa-Line truncated
|
||||
@@ -1 +1 @@
|
||||
{"version":3,"sourceRoot":"","sources":["_variables.scss","_fa.scss","_fa-custom.scss","_lightbox.scss","_common.scss","databap.scss"],"names":[],"mappings":"CAAA;AAAA;AAAA;AAAA,GCMA,WACE,0BACA,iDACA,+RACA,mBACA,kBAEF,IACE,qBACA,wBACA,kBACA,mBACA,cACA,mCACA,kCAGF,OACE,uBACA,kBACA,oBAEF,OACE,cAEF,OACE,cAEF,OACE,cAEF,OACE,cAEF,OACE,mBACA,kBAEF,OACE,eACA,yBACA,qBAEF,UACE,kBAEF,OACE,kBACA,mBACA,mBACA,gBACA,kBAEF,aACE,mBAEF,WACE,yBACA,wBACA,mBAEF,YACE,YAEF,WACE,WAEF,cACE,kBAEF,eACE,iBAEF,SACE,0CACA,uCACA,qCACA,kCAEF,qBACE,GACE,4BAEF,KACE,+BAGJ,wBACE,GACE,+BAEF,KACE,kCAGJ,mBACE,GACE,0BAEF,KACE,6BAGJ,gBACE,GACE,+BACA,uBAEF,KACE,iCACA,0BAGJ,cACE,gEACA,gCACA,6BACA,4BACA,2BACA,wBAEF,eACE,gEACA,iCACA,8BACA,6BACA,4BACA,yBAEF,eACE,gEACA,iCACA,8BACA,6BACA,4BACA,yBAEF,oBACE,0EACA,+BACA,4BACA,2BACA,0BACA,uBAEF,kBACE,0EACA,+BACA,4BACA,2BACA,0BACA,uBAEF,UACE,kBACA,qBACA,UACA,WACA,gBACA,sBAEF,0BAEE,kBACA,OACA,WACA,kBAEF,aACE,oBAEF,aACE,cAEF,YACE,WCnLF,WACC,iBAUD,OACC,yBACA,0BACA,mBAED,uEACC,yBACA,0BACA,oBAED,OACC,yBACA,kBACA,oBAED,OACC,yBACA,0BACA,oBAED,oBACC,yBACA,iBACA,oBAGD,iCACE,YAGF,wDACC,YAGD,kCACC,YAGD,2DACC,YAGD,qDACC,YAGD,kBACC,YAGD,kBACC,YAGD,qBACE,YAGF,kBACC,YAGD,kBACC,YAGD,qBACC,YAGD,qBACC,YAGD,iBACC,YAGD,kBACC,YAGD,iBACC,YAGD,iBACC,YAGD,cACC,MFnGY,QEqGb,qBACC,YAGD,qBACC,YAGD,mBACC,YAGD,iBACC,YAGD,iBACE,YAGF,0CACE,YAGF,WACC,MF9HY,QEgIb,kBACC,YAGD,2DACC,YAGD,cACC,MF7Ha,OE+Hd,qBACC,YAGD,YACC,MFnIW,IEqIZ,mBACC,YAGD,SACC,MF1IW,IE4IZ,wCACC,YAGD,oBACE,YAGF,qBACE,YAGF,qBACC,YAGD,kBACC,YAGD,kBACC,YAGD,iBACC,YAGD,mBACC,YAGD,mBACC,YAGD,yCACC,YAGD,mCACC,YAGD,uCACC,YAGD,gBACC,YAGD,kBACC,YAGD,kBACC,YAGD,kBACC,YAGD,mBACC,YAGD,kBACC,YAGD,qBACC,YAGD,kBACC,YAGD,wBACC,YAGD,kBACC,YAED,oBACC,YAGD,oBACC,YAGD,kBACC,YAGD,sBACC,YAGD,uBACC,YAGD,qBACC,YAGD,uBACC,YAGD,iBACC,YAGD,+BACC,cAED,6CACC,YAGD,+BACC,cAED,6CACC,YAGD,+BACC,cAED,6CACC,YAGD,eACC,cAED,sBACC,YAGD,sBACC,YAGD,yFACC,YAGD,mBACC,YAGD,+BACC,YAED,gCACC,YAGD,iBACC,YCrUD,iBACE,kBACA,MACA,OACA,aACA,sBACA,2DACA,WACA,aAGF,UACE,kBACA,OACA,WACA,cACA,kBACA,cACA,mBAGF,oBACE,cACA,YACA,kBACA,0BACA,uBACA,sBACA,qBACA,kBAGF,gBACE,YAGF,mBACE,kBACA,iBHjCW,QGkCX,QACA,YACA,aACA,cACA,0BACA,uBACA,sBACA,qBACA,kBAGF,yBACE,WACA,cACA,WAGF,cACE,YAGF,WACE,kBACA,QACA,OACA,WACA,WACA,kBACA,cAGF,WACE,cACA,WACA,YACA,cACA,eACA,MHtEuB,QGyEzB,QACE,kBACA,MACA,OACA,YACA,WACA,WAGF,mBACE,OAGF,UACE,aACA,2GAGF,kBACE,YACA,eACA,cAGF,kBACE,UACA,OACA,WACA,gBACA,0DACA,UACA,+BACA,4BACA,0BACA,uBAGF,wBACE,4DACA,UAGF,kBACE,UACA,QACA,YACA,iBACA,0DACA,UACA,+BACA,4BACA,0BACA,uBAGF,wBACE,4DACA,UAGF,0BACC,kBACA,QACA,eACA,mCACA,+BACA,2BACA,MH7IY,QG8IZ,eAGD,aACC,iCAGD,aACC,gCAGD,kBACE,cACA,gBACA,QACA,WACA,kCACA,sCACA,8BACA,mCACA,uCACA,+BAGF,wBACE,WACA,cACA,WAGF,SACE,cACA,MH9KW,QGiLb,qBACE,UACA,WACA,gBACA,kBAGF,qBACE,eACA,iBACA,gBAGF,oBACE,cACA,WACA,mBACA,eACA,MHnMW,QGsMb,mBACE,cACA,YACA,WACA,YACA,eACA,MH5MW,QG6MX,iBACA,aACA,2DACA,WACA,+BACA,4BACA,0BACA,uBAGF,yBACE,eACA,4DACA,UC7NF,WACE,sBACA,kBACA,gBACA,0EAEF,WACE,sBACA,kBACA,gBACA,mGAEF,WACE,sBACA,kBACA,gBACA,yGAEF,WACE,sBACA,kBACA,gBACA,gHAKF,UACC,WJRU,KISV,iCACA,MJ3BY,QI4BZ,WJ5BY,QI6BZ,UACA,SACA,iBAGD,MACC,YACA,gBACA,kBACA,SACA,UACA,iBAGD,SACC,UAGD,sBACC,iCACA,UJzBS,KI0BT,WJjCU,KIkCV,YAED,sCACC,YACA,YAGD,2HACC,iBJrDa,QIwDd,sFACC,iBJ9DwB,QIiEzB,8GACC,iBJlEwB,QIqEzB,6LACC,YAGD,8BACC,eAGD,OACC,WACA,YACA,SACA,gBACA,WJjFwB,QIkFxB,YAGD,OACC,WJvEU,KIwEV,YACA,MJ1FY,QI2FZ,SAGD,SACC,gBAGD,sCACC,MJnGY,QIsGb,EACC,SACA,UAGD,YACC,qBAGD,0CACC,aAGD,IACC,YAyBD,WARC,iCACA,oCACA,mCACA,4BAQD,cAXC,iCACA,oCACA,mCACA,4BAWD,aAdC,iCACA,oCACA,mCACA,4BAcD,YAjBC,iCACA,oCACA,mCACA,4BAiBD,mBApBC,8BACA,iCACA,gCACA,yBAoBD,OAvBC,uCACA,0CACA,yCACA,kCAuBD,YA1BC,mCACA,sCACA,qCACA,8BA0BD,gBA7BC,iCACA,oCACA,mCACA,4BA8BD,YACC,sBACA,2BACA,8BAGD,SACC,eACA,WACA,kBAGD,yBACC,cACA,iBACA,mBACA,YACA,uBACA,0BACA,yBACA,kBACA,WAGD,+BACC,0BAGD,gBACC,MJtLW,IIuLX,aJvLW,IIwLX,UJ5KU,KI6KV,iBAGD,oBACC,MJ9La,OI+Lb,aJ/La,OIgMb,UJnLU,KIoLV,kBAGD,oBACC,MJvMa,MIwMb,aJxMa,MIyMb,UJ1LU,KI6LX,cACC,yBAGD,SACC,YACA,iBACA,WJ3NwB,QI4NxB,UJrMU,KIsMV,eAEA,qBAED,eACC,iBJ9Na,QIgOd,gBACC,iBJvOY,QIwOZ,MJvNU,KI0NX,aAEC,iBAGD,qBACC,eAGD,oCACC,gBACA,MJrOU,KIsOV,kBACA,UAED,yBACC,MJrPa,QIwPd,uBACC,iBAGD,iBACC,iBJnQY,QIoQZ,MJnQwB,QIsQzB,uBACC,iBJlQa,QImQb,MJzQY,QI4Qb,eACC,iBACA,iBAGD,oBACC,iBACA,kBAGD,MACC,YAGD,YACC,iBJ1QU,KI6QX,WACC,WAGD,QACC,iBAGD,YACC,YAGD,OACC,gBAGD,cACC,mBAGD,gBACC,0BACA,kBACA,WJpTwB,QIqTxB,wBACA,SAED,gDACC,WAED,0BACC,0BAED,uCACC,yBAGD,YACC,iBACA,MJrUY,QIsUZ,kBACA,UJ/SS,KIiTV,2BACC,WJzTU,KI2TX,4BACC,WJ1UW,QI4UZ,oBACC,MJ1Ua,QI6Ud,cACC,gBACA,UACA,cACA,WAGD,oBACC,mBAGD,6BACC,iBACA,kBACA,UJxUU,KI2UX,sBACC,iBACA,iBAGD,wBACC,gBAGD,cACC,aAKD,UACC,eACA,kBACA,aACA,WJrXwB,QIsXxB,MJxXY,QI0Xb,0BACC,WJxXW,QI2XZ,mGACC,gBACA,WJ/WU,KIgXV,UJxWU,KIyWV,iBAED,gLACC,iBJpXU,KIsXX,6FACC,WAED,4CACC,iBACA,YACA,WJ5XU,KI8XX,+CACC,aJ/YwB,QIgZxB,iBAED,yBACC,iBJlZwB,QIoZzB,yCACC,iBJpZW,QIsZZ,sBACC,iBJzZwB,QI0ZxB,eAGD,iDACC,gCACA,UAKD,eACC,kBACA,WACA,gBAGD,iCACC,kBACA,OACA,MACA,WAGD,WACC,kBACA,YACA,WACA,gBAGD,yCACC,iBJ1bY,QI2bZ,WAED,kBACC,iBJ7bwB,QI8bxB,YACA,WACA,kBACALine truncated
|
||||
{"version":3,"sourceRoot":"","sources":["_variables.scss","_fa.scss","_fa-custom.scss","_lightbox.scss","_common.scss","databap.scss"],"names":[],"mappings":"CAAA;AAAA;AAAA;AAAA,GCMA,WACE,0BACA,iDACA,+RACA,mBACA,kBAEF,IACE,qBACA,wBACA,kBACA,mBACA,cACA,mCACA,kCAGF,OACE,uBACA,kBACA,oBAEF,OACE,cAEF,OACE,cAEF,OACE,cAEF,OACE,cAEF,OACE,mBACA,kBAEF,OACE,eACA,yBACA,qBAEF,UACE,kBAEF,OACE,kBACA,mBACA,mBACA,gBACA,kBAEF,aACE,mBAEF,WACE,yBACA,wBACA,mBAEF,YACE,YAEF,WACE,WAEF,cACE,kBAEF,eACE,iBAEF,SACE,0CACA,uCACA,qCACA,kCAEF,qBACE,GACE,4BAEF,KACE,+BAGJ,wBACE,GACE,+BAEF,KACE,kCAGJ,mBACE,GACE,0BAEF,KACE,6BAGJ,gBACE,GACE,+BACA,uBAEF,KACE,iCACA,0BAGJ,cACE,gEACA,gCACA,6BACA,4BACA,2BACA,wBAEF,eACE,gEACA,iCACA,8BACA,6BACA,4BACA,yBAEF,eACE,gEACA,iCACA,8BACA,6BACA,4BACA,yBAEF,oBACE,0EACA,+BACA,4BACA,2BACA,0BACA,uBAEF,kBACE,0EACA,+BACA,4BACA,2BACA,0BACA,uBAEF,UACE,kBACA,qBACA,UACA,WACA,gBACA,sBAEF,0BAEE,kBACA,OACA,WACA,kBAEF,aACE,oBAEF,aACE,cAEF,YACE,WCnLF,WACC,iBAUD,OACC,yBACA,0BACA,mBAED,uEACC,yBACA,0BACA,oBAED,OACC,yBACA,kBACA,oBAED,OACC,yBACA,0BACA,oBAED,oBACC,yBACA,iBACA,oBAGD,iCACE,YAGF,wDACC,YAGD,kCACC,YAGD,2DACC,YAGD,qDACC,YAGD,kBACC,YAGD,kBACC,YAGD,qBACE,YAGF,kBACC,YAGD,kBACC,YAGD,qBACC,YAGD,qBACC,YAGD,iBACC,YAGD,kBACC,YAGD,iBACC,YAGD,iBACC,YAGD,cACC,MFnGY,QEqGb,qBACC,YAGD,qBACC,YAGD,mBACC,YAGD,iBACC,YAGD,iBACE,YAGF,0CACE,YAGF,WACC,MF9HY,QEgIb,kBACC,YAGD,2DACC,YAGD,cACC,MF7Ha,OE+Hd,qBACC,YAGD,YACC,MFnIW,IEqIZ,mBACC,YAGD,SACC,MF1IW,IE4IZ,wCACC,YAGD,oBACE,YAGF,qBACE,YAGF,qBACC,YAGD,kBACC,YAGD,kBACC,YAGD,iBACC,YAGD,mBACC,YAGD,mBACC,YAGD,yCACC,YAGD,mCACC,YAGD,uCACC,YAGD,gBACC,YAGD,kBACC,YAGD,kBACC,YAGD,kBACC,YAGD,mBACC,YAGD,kBACC,YAGD,qBACC,YAGD,kBACC,YAGD,wBACC,YAGD,kBACC,YAED,oBACC,YAGD,oBACC,YAGD,kBACC,YAGD,sBACC,YAGD,uBACC,YAGD,qBACC,YAGD,uBACC,YAGD,iBACC,YAGD,+BACC,cAED,6CACC,YAGD,+BACC,cAED,6CACC,YAGD,+BACC,cAED,6CACC,YAGD,eACC,cAED,sBACC,YAGD,sBACC,YAGD,yFACC,YAGD,mBACC,YAGD,+BACC,YAED,gCACC,YAGD,iBACC,YCrUD,iBACE,kBACA,MACA,OACA,aACA,sBACA,2DACA,WACA,aAGF,UACE,kBACA,OACA,WACA,cACA,kBACA,cACA,mBAGF,oBACE,cACA,YACA,kBACA,0BACA,uBACA,sBACA,qBACA,kBAGF,gBACE,YAGF,mBACE,kBACA,iBHjCW,QGkCX,QACA,YACA,aACA,cACA,0BACA,uBACA,sBACA,qBACA,kBAGF,yBACE,WACA,cACA,WAGF,cACE,YAGF,WACE,kBACA,QACA,OACA,WACA,WACA,kBACA,cAGF,WACE,cACA,WACA,YACA,cACA,eACA,MHtEuB,QGyEzB,QACE,kBACA,MACA,OACA,YACA,WACA,WAGF,mBACE,OAGF,UACE,aACA,2GAGF,kBACE,YACA,eACA,cAGF,kBACE,UACA,OACA,WACA,gBACA,0DACA,UACA,+BACA,4BACA,0BACA,uBAGF,wBACE,4DACA,UAGF,kBACE,UACA,QACA,YACA,iBACA,0DACA,UACA,+BACA,4BACA,0BACA,uBAGF,wBACE,4DACA,UAGF,0BACC,kBACA,QACA,eACA,mCACA,+BACA,2BACA,MH7IY,QG8IZ,eAGD,aACC,iCAGD,aACC,gCAGD,kBACE,cACA,gBACA,QACA,WACA,kCACA,sCACA,8BACA,mCACA,uCACA,+BAGF,wBACE,WACA,cACA,WAGF,SACE,cACA,MH9KW,QGiLb,qBACE,UACA,WACA,gBACA,kBAGF,qBACE,eACA,iBACA,gBAGF,oBACE,cACA,WACA,mBACA,eACA,MHnMW,QGsMb,mBACE,cACA,YACA,WACA,YACA,eACA,MH5MW,QG6MX,iBACA,aACA,2DACA,WACA,+BACA,4BACA,0BACA,uBAGF,yBACE,eACA,4DACA,UC7NF,WACE,sBACA,kBACA,gBACA,0EAEF,WACE,sBACA,kBACA,gBACA,mGAEF,WACE,sBACA,kBACA,gBACA,yGAEF,WACE,sBACA,kBACA,gBACA,gHAKF,UACC,WJRU,KISV,iCACA,MJ3BY,QI4BZ,WJ5BY,QI6BZ,UACA,SACA,iBAGD,MACC,YACA,gBACA,kBACA,SACA,UACA,iBAGD,SACC,UAGD,sBACC,iCACA,UJzBS,KI0BT,WJjCU,KIkCV,YAED,sCACC,YACA,YAGD,2HACC,iBJrDa,QIwDd,sFACC,iBJ9DwB,QIiEzB,8GACC,iBJlEwB,QIqEzB,6LACC,YAGD,8BACC,eAGD,OACC,WACA,YACA,SACA,gBACA,WJjFwB,QIkFxB,YAGD,OACC,WJvEU,KIwEV,YACA,MJ1FY,QI2FZ,SAGD,SACC,gBAGD,sCACC,MJnGY,QIsGb,EACC,SACA,UAGD,YACC,qBAGD,0CACC,aAGD,IACC,YAyBD,WARC,iCACA,oCACA,mCACA,4BAQD,cAXC,iCACA,oCACA,mCACA,4BAWD,aAdC,iCACA,oCACA,mCACA,4BAcD,YAjBC,iCACA,oCACA,mCACA,4BAiBD,mBApBC,8BACA,iCACA,gCACA,yBAoBD,OAvBC,uCACA,0CACA,yCACA,kCAuBD,YA1BC,mCACA,sCACA,qCACA,8BA0BD,gBA7BC,iCACA,oCACA,mCACA,4BA8BD,YACC,sBACA,2BACA,8BAGD,SACC,eACA,WACA,kBAGD,yBACC,cACA,iBACA,mBACA,YACA,uBACA,0BACA,yBACA,kBACA,WAGD,+BACC,0BAGD,gBACC,MJtLW,IIuLX,aJvLW,IIwLX,UJ5KU,KI6KV,iBAGD,oBACC,MJ9La,OI+Lb,aJ/La,OIgMb,UJnLU,KIoLV,kBAGD,oBACC,MJvMa,MIwMb,aJxMa,MIyMb,UJ1LU,KI6LX,cACC,yBAGD,SACC,YACA,iBACA,WJ3NwB,QI4NxB,UJrMU,KIsMV,eAEA,qBAED,eACC,iBJ9Na,QIgOd,gBACC,iBJvOY,QIwOZ,MJvNU,KI0NX,aAEC,iBAGD,qBACC,eAGD,oCACC,gBACA,MJrOU,KIsOV,kBACA,UAED,yBACC,MJrPa,QIwPd,uBACC,iBAGD,iBACC,iBJnQY,QIoQZ,MJnQwB,QIsQzB,uBACC,iBJlQa,QImQb,MJzQY,QI4Qb,eACC,iBACA,iBAGD,oBACC,iBACA,kBAGD,MACC,YAGD,YACC,iBJ1QU,KI6QX,WACC,WAGD,QACC,iBAGD,YACC,YAGD,OACC,gBAGD,cACC,mBAGD,gBACC,0BACA,kBACA,WJpTwB,QIqTxB,wBACA,SAED,gDACC,WAED,0BACC,0BAED,uCACC,yBAGD,YACC,iBACA,MJrUY,QIsUZ,kBACA,UJ/SS,KIiTV,2BACC,WJzTU,KI2TX,4BACC,WJ1UW,QI4UZ,oBACC,MJ1Ua,QI6Ud,cACC,gBACA,UACA,cACA,WACA,gBACA,uBACA,mBAGD,oBACC,mBAGD,6BACC,iBACA,kBACA,UJ3UU,KI8UX,sBACC,iBACA,iBAGD,wBACC,gBAGD,cACC,aAKD,UACC,eACA,kBACA,aACA,WJxXwB,QIyXxB,MJ3XY,QI6Xb,0BACC,WJ3XW,QI8XZ,mGACC,gBACA,WJlXU,KImXV,UJ3WU,KI4WV,iBAED,gLACC,iBJvXU,KIyXX,6FACC,WAED,4CACC,iBACA,YACA,WJ/XU,KIiYX,+CACC,aJlZwB,QImZxB,iBAED,yBACC,iBJrZwB,QIuZzB,yCACC,iBJvZW,QIyZZ,sBACC,iBJ5ZwB,QI6ZxB,eAGD,iDACC,gCACA,UAKD,eACC,kBACA,WACA,gBAGD,iCACC,kBACA,OACA,MACA,WAGD,WACC,kBACA,YACA,WACA,gBAGD,yCACC,iBJ7bY,QI8bZ,WAED,kBACC,iBJhcwB,QIicLine truncated
|
||||
@@ -14,7 +14,6 @@ Internal:
|
||||
Bug fix:
|
||||
- Delete link to scss map
|
||||
- add big company logo in db (new col). Use it in profile ?
|
||||
- [1.1.1] Resize .gif + fix unresized ones
|
||||
- Fix les "xxx se déconnecte" intempestives
|
||||
- code reader : mettre la scrollbar à l'intérieur du code
|
||||
|
||||
@@ -30,7 +29,6 @@ New features:
|
||||
- [1.3.0] Reward on post
|
||||
- modification code : possibilité de modifier la description d'un code après enregistrement + entre les versions
|
||||
- Add functionality to modify docs
|
||||
- compatibilité ie8+
|
||||
- accès externe à certains fichiers (partage temporaire)
|
||||
- ajout code : ajouter un bouton "aperçu"
|
||||
- code page : hover -> wait 1sec -> if(focus) -> expand {-5 lines, + 5 lines}
|
||||
@@ -58,4 +56,4 @@ Testing
|
||||
MEP 1.2
|
||||
-------
|
||||
|
||||
-
|
||||
-
|
||||
Reference in new issue
Block a user