documentation feature v1 (add, read)
This commit is contained in:
244
config.php
244
config.php
@@ -668,7 +668,8 @@ class Databap extends PhpObject
|
|||||||
{
|
{
|
||||||
$asSearchTypes = array( self::CODE_TYPE=>MySqlManager::CODE_TABLE,
|
$asSearchTypes = array( self::CODE_TYPE=>MySqlManager::CODE_TABLE,
|
||||||
self::PROC_TYPE=>MySqlManager::PROC_TABLE,
|
self::PROC_TYPE=>MySqlManager::PROC_TABLE,
|
||||||
self::ART_TYPE=>MySqlManager::ART_TABLE);
|
self::ART_TYPE=>MySqlManager::ART_TABLE,
|
||||||
|
self::DOC_TYPE=>MySqlManager::DOC_TABLE);
|
||||||
|
|
||||||
$this->oMySql->getArrayQuery("TRUNCATE ".MySqlManager::SEARCH_TABLE);
|
$this->oMySql->getArrayQuery("TRUNCATE ".MySqlManager::SEARCH_TABLE);
|
||||||
foreach($asSearchTypes as $sSearchType=>$sSearchTable)
|
foreach($asSearchTypes as $sSearchType=>$sSearchTable)
|
||||||
@@ -813,7 +814,7 @@ class Databap extends PhpObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
//Load doc into database
|
//Load doc into database
|
||||||
$asData = array('title'=>$sTitle, 'description'=>$sDescription, 'file_name'=>$sFileName, MySqlManager::getId(MySqlManager::USER_TABLE)=>$iUserId);
|
$asData = array('title'=>$sTitle, 'description'=>$sDescription, MySqlManager::getId(MySqlManager::USER_TABLE)=>$iUserId);
|
||||||
$iDbDocId = $this->oMySql->insertRow(MySqlManager::DOC_TABLE, $asData);
|
$iDbDocId = $this->oMySql->insertRow(MySqlManager::DOC_TABLE, $asData);
|
||||||
|
|
||||||
//Load doc files into database
|
//Load doc files into database
|
||||||
@@ -840,14 +841,7 @@ class Databap extends PhpObject
|
|||||||
$this->oMySql->updateRow(MySqlManager::DOC_TABLE, $iDbDocId, array('refer_id'=>$iReferId));
|
$this->oMySql->updateRow(MySqlManager::DOC_TABLE, $iDbDocId, array('refer_id'=>$iReferId));
|
||||||
|
|
||||||
//Add Message in chat
|
//Add Message in chat
|
||||||
if($bCreation)
|
$this->addMessage($iDbDocId, $bCreation?self::MESSAGE_ADD_DOC:self::MESSAGE_EDIT_DOC, self::ALL_CHAN_ID);
|
||||||
{
|
|
||||||
$this->addMessage($iDbDocId, self::MESSAGE_ADD_DOC, self::ALL_CHAN_ID);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
$this->addMessage($iDbDocId, self::MESSAGE_EDIT_DOC, self::ALL_CHAN_ID);
|
|
||||||
}
|
|
||||||
|
|
||||||
//Add record in Search Table
|
//Add record in Search Table
|
||||||
$this->oSearchEngine->buildIndex($iDbDocId, self::DOC_TYPE);
|
$this->oSearchEngine->buildIndex($iDbDocId, self::DOC_TYPE);
|
||||||
@@ -869,7 +863,7 @@ class Databap extends PhpObject
|
|||||||
$asFiles = $this->oMySql->selectRows(array('from'=>MySqlManager::FILE_TABLE, 'constraint'=>array('id_doc'=>$iDocId)));
|
$asFiles = $this->oMySql->selectRows(array('from'=>MySqlManager::FILE_TABLE, 'constraint'=>array('id_doc'=>$iDocId)));
|
||||||
foreach($asFiles as $asFile)
|
foreach($asFiles as $asFile)
|
||||||
{
|
{
|
||||||
$asDoc['files'][$asFile[MySqlManager::getId(MySqlManager::FILE_TABLE)]] = array('description'=>$asFile['description']);
|
$asDoc['files'][$asFile[MySqlManager::getId(MySqlManager::FILE_TABLE)]] = array('description'=>$asFile['description'], 'ext'=>pathinfo($asFile['file_name'], PATHINFO_EXTENSION));
|
||||||
}
|
}
|
||||||
|
|
||||||
return self::jsonExport($asDoc);
|
return self::jsonExport($asDoc);
|
||||||
@@ -967,25 +961,39 @@ class Databap extends PhpObject
|
|||||||
$asCode = $this->oMySql->selectRow(MySqlManager::CODE_TABLE, $iCodeId, $asSelect);
|
$asCode = $this->oMySql->selectRow(MySqlManager::CODE_TABLE, $iCodeId, $asSelect);
|
||||||
$asCode['description'] = self::getDescriptionFormat($asCode['description']);
|
$asCode['description'] = self::getDescriptionFormat($asCode['description']);
|
||||||
$asCode['led'] = self::getDateFormat($asCode['led']);
|
$asCode['led'] = self::getDateFormat($asCode['led']);
|
||||||
|
$asCode['timestamp'] = strtotime($asCode['led']);
|
||||||
return $asCode;
|
return $asCode;
|
||||||
}
|
}
|
||||||
|
|
||||||
private function getProcInfo($iProcId)
|
private function getProcInfo($iProcId)
|
||||||
{
|
{
|
||||||
$asProc = $this->oMySql->selectRow(MySqlManager::PROC_TABLE, $iProcId);
|
$asProc = $this->oMySql->selectRow(MySqlManager::PROC_TABLE, $iProcId);
|
||||||
|
$asProc['title'] = self::getDescriptionFormat($asProc['title']);
|
||||||
$asProc['description'] = self::getDescriptionFormat($asProc['description']);
|
$asProc['description'] = self::getDescriptionFormat($asProc['description']);
|
||||||
$asProc['led'] = self::getDateFormat($asProc['led']);
|
$asProc['led'] = self::getDateFormat($asProc['led']);
|
||||||
|
$asProc['timestamp'] = strtotime($asCode['led']);
|
||||||
return $asProc;
|
return $asProc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private function getDocInfo($iDocId)
|
||||||
|
{
|
||||||
|
$asDoc = $this->oMySql->selectRow(MySqlManager::DOC_TABLE, $iDocId);
|
||||||
|
$asDoc['title'] = self::getDescriptionFormat($asDoc['title']);
|
||||||
|
$asDoc['description'] = self::getDescriptionFormat($asDoc['description']);
|
||||||
|
$asDoc['led'] = self::getDateFormat($asDoc['led']);
|
||||||
|
$asDoc['timestamp'] = strtotime($asCode['led']);
|
||||||
|
return $asDoc;
|
||||||
|
}
|
||||||
|
|
||||||
private function getArticleInfo($iArtId)
|
private function getArticleInfo($iArtId)
|
||||||
{
|
{
|
||||||
$asArt = $this->oMySql->selectRow(MySqlManager::ART_TABLE, $iArtId);
|
$asArt = $this->oMySql->selectRow(MySqlManager::ART_TABLE, $iArtId);
|
||||||
$asTransferredInfo = array('link_art'=>$asArt['link'], 'title'=>$asArt['title'], 'link_auth'=>$asArt['email']);
|
$asTransferredInfo = array('link_art'=>$asArt['link'], 'art_title'=>$asArt['title'], 'link_auth'=>$asArt['email']);
|
||||||
$asTransferredInfo['date'] = self::getDateFormat($asArt['date'], self::DATE_FORMAT);
|
$asTransferredInfo['art_date'] = self::getDateFormat($asArt['date'], self::DATE_FORMAT);
|
||||||
$asTransferredInfo['name'] = self::getNameFormat($asArt['first_name'], $asArt['last_name']);
|
$asTransferredInfo['name'] = self::getNameFormat($asArt['first_name'], $asArt['last_name']);
|
||||||
$asTransferredInfo['description'] = self::getDescriptionFormat($asArt['title']);
|
$asTransferredInfo['description'] = self::getDescriptionFormat($asArt['title']);
|
||||||
$asTransferredInfo['led'] = self::getDateFormat($asArt['led']);
|
$asTransferredInfo['led'] = self::getDateFormat($asArt['led']);
|
||||||
|
$asTransferredInfo['timestamp'] = strtotime($asCode['led']);
|
||||||
$asTransferredInfo['company'] = 'SAP';
|
$asTransferredInfo['company'] = 'SAP';
|
||||||
return $asTransferredInfo;
|
return $asTransferredInfo;
|
||||||
}
|
}
|
||||||
@@ -1688,12 +1696,17 @@ class Databap extends PhpObject
|
|||||||
elseif($sMessageType==self::MESSAGE_ADD_PROC || $sMessageType==self::MESSAGE_EDIT_PROC)
|
elseif($sMessageType==self::MESSAGE_ADD_PROC || $sMessageType==self::MESSAGE_EDIT_PROC)
|
||||||
{
|
{
|
||||||
$asProc = $this->getProcInfo($asMessages['messages'][$iMessageId]['message']);
|
$asProc = $this->getProcInfo($asMessages['messages'][$iMessageId]['message']);
|
||||||
$asMessages['messages'][$iMessageId]['description'] = $asProc['description'];
|
$asMessages['messages'][$iMessageId]['description'] = $asProc['title'];
|
||||||
|
}
|
||||||
|
elseif($sMessageType==self::MESSAGE_ADD_DOC || $sMessageType==self::MESSAGE_EDIT_DOC)
|
||||||
|
{
|
||||||
|
$asDoc = $this->getDocInfo($asMessages['messages'][$iMessageId]['message']);
|
||||||
|
$asMessages['messages'][$iMessageId]['description'] = $asDoc['title'];
|
||||||
}
|
}
|
||||||
elseif($sMessageType==self::MESSAGE_ARTICLE)
|
elseif($sMessageType==self::MESSAGE_ARTICLE)
|
||||||
{
|
{
|
||||||
$asTransferredInfo = $this->getArticleInfo($asMessages['messages'][$iMessageId]['message']);
|
$asTransferredInfo = $this->getArticleInfo($asMessages['messages'][$iMessageId]['message']);
|
||||||
$asMessages['messages'][$iMessageId]['message'] = $this->getJsonMessage($asTransferredInfo);
|
$asMessages['messages'][$iMessageId] = array_merge($asMessages['messages'][$iMessageId], $asTransferredInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
//Switch Chan ID with name for the user to join
|
//Switch Chan ID with name for the user to join
|
||||||
@@ -1959,71 +1972,63 @@ class Databap extends PhpObject
|
|||||||
$sIdCodeCol = MySqlManager::getId(MySqlManager::CODE_TABLE);
|
$sIdCodeCol = MySqlManager::getId(MySqlManager::CODE_TABLE);
|
||||||
$sIdProcCol = MySqlManager::getId(MySqlManager::PROC_TABLE);
|
$sIdProcCol = MySqlManager::getId(MySqlManager::PROC_TABLE);
|
||||||
$sIdArtCol = MySqlManager::getId(MySqlManager::ART_TABLE);
|
$sIdArtCol = MySqlManager::getId(MySqlManager::ART_TABLE);
|
||||||
|
$sIdDocCol = MySqlManager::getId(MySqlManager::DOC_TABLE);
|
||||||
$sIdCodeColFull = MySqlManager::getId(MySqlManager::CODE_TABLE, true);
|
$sIdCodeColFull = MySqlManager::getId(MySqlManager::CODE_TABLE, true);
|
||||||
$sIdUserCol = MySqlManager::getId(MySqlManager::USER_TABLE);
|
$sIdUserCol = MySqlManager::getId(MySqlManager::USER_TABLE);
|
||||||
$sIdUserColFull = MySqlManager::getId(MySqlManager::USER_TABLE, true);
|
$sIdUserColFull = MySqlManager::getId(MySqlManager::USER_TABLE, true);
|
||||||
$sLedColFull = MySqlManager::getFullColumnName(MySqlManager::CODE_TABLE, 'led') ;
|
$sLedColFull = MySqlManager::getFullColumnName(MySqlManager::CODE_TABLE, 'led') ;
|
||||||
|
|
||||||
//Get code Ids
|
//Get code Ids
|
||||||
$asInfo = array('select'=>array("MAX($sIdCodeCol) AS id_item"),
|
$asInfo = array('select'=>array("MAX($sIdCodeCol) AS id_item"), //selecting last version among codes having the same refer_id
|
||||||
'from'=>MySqlManager::CODE_TABLE,
|
'from'=>MySqlManager::CODE_TABLE,
|
||||||
'groupBy'=>array('refer_id'),
|
'groupBy'=>array('refer_id'),
|
||||||
'orderBy'=>array('id_item'=>'desc'));
|
'orderBy'=>array('id_item'=>'desc'));
|
||||||
$asCodeIds = $this->oMySql->selectRows($asInfo);
|
$asItemIds[Databap::CODE_TYPE] = $this->oMySql->selectRows($asInfo);
|
||||||
|
|
||||||
//get Proc Ids
|
//get Proc Ids
|
||||||
$asInfo = array('select'=>array("MAX($sIdProcCol) AS id_item"),
|
$asInfo = array('select'=>array("MAX($sIdProcCol) AS id_item"),
|
||||||
'from'=>MySqlManager::PROC_TABLE,
|
'from'=>MySqlManager::PROC_TABLE,
|
||||||
'constraint'=>array('refer_id'=>"0"),
|
'constraint'=>array('refer_id'=>"0"), //meaning that there is no newer version
|
||||||
'orderBy'=>array('id_item'=>'desc'));
|
'orderBy'=>array('id_item'=>'desc'));
|
||||||
$asProcIds = $this->oMySql->selectRows($asInfo);
|
$asItemIds[Databap::PROC_TYPE] = $this->oMySql->selectRows($asInfo);
|
||||||
|
|
||||||
//get Article Ids
|
//get Article Ids
|
||||||
$asInfo = array('select'=>array($sIdArtCol." AS id_item"),
|
$asInfo = array('select'=>array($sIdArtCol." AS id_item"),
|
||||||
'from'=>MySqlManager::ART_TABLE,
|
'from'=>MySqlManager::ART_TABLE,
|
||||||
'orderBy'=>array('id_item'=>'desc'));
|
'orderBy'=>array('id_item'=>'desc'));
|
||||||
$asArtIds = $this->oMySql->selectRows($asInfo);
|
$asItemIds[Databap::ART_TYPE] = $this->oMySql->selectRows($asInfo);
|
||||||
|
|
||||||
$asItemIds = array(Databap::CODE_TYPE=>$asCodeIds, Databap::PROC_TYPE=>$asProcIds, Databap::ART_TYPE=>$asArtIds);
|
//Get documentation
|
||||||
|
$asInfo = array('select'=>array("MAX($sIdDocCol) AS id_item"), //selecting last version among docs having the same refer_id
|
||||||
|
'from'=>MySqlManager::DOC_TABLE,
|
||||||
|
'groupBy'=>array('refer_id'),
|
||||||
|
'orderBy'=>array('id_item'=>'desc'));
|
||||||
|
$asItemIds[Databap::DOC_TYPE] = $this->oMySql->selectRows($asInfo);
|
||||||
|
|
||||||
|
$asTypeFunc = array(Databap::CODE_TYPE=>'Code', Databap::PROC_TYPE=>'Proc', Databap::ART_TYPE=>'Article', Databap::DOC_TYPE=>'Doc');
|
||||||
|
|
||||||
//Build code info structure
|
//Build code info structure
|
||||||
|
//TODO phrases for all item types?
|
||||||
$asUsers = $asCode = $asItemList = array();
|
$asUsers = $asCode = $asItemList = array();
|
||||||
foreach($asItemIds as $sType=>$asTypedItemIds)
|
foreach($asItemIds as $sType=>$asTypedItemIds)
|
||||||
{
|
{
|
||||||
switch($sType)
|
$asTypedItemIds = array_filter($asTypedItemIds); //null value returned from query (MAX(...))
|
||||||
{
|
|
||||||
case Databap::CODE_TYPE:
|
|
||||||
$sFuncType = 'Code';
|
|
||||||
break;
|
|
||||||
case Databap::PROC_TYPE:
|
|
||||||
$sFuncType = 'Proc';
|
|
||||||
break;
|
|
||||||
case Databap::ART_TYPE:
|
|
||||||
$sFuncType = 'Article';
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
foreach($asTypedItemIds as $iItemId)
|
foreach($asTypedItemIds as $iItemId)
|
||||||
{
|
{
|
||||||
//null value returned from query (MAX(...))
|
$asItem = call_user_func(array($this, 'get'.$asTypeFunc[$sType].'Info'), $iItemId);
|
||||||
if($iItemId>0)
|
$asItem['type'] = $sType;
|
||||||
|
$asItem['id_item'] = $iItemId;
|
||||||
|
if(array_key_exists($sIdUserCol, $asItem)) //replacing user's id with user's name & company (if not done already)
|
||||||
{
|
{
|
||||||
$asItem = call_user_func(array($this, 'get'.$sFuncType.'Info'), $iItemId);
|
$iUserId = $asItem[$sIdUserCol];
|
||||||
if(array_key_exists($sIdUserCol, $asItem))
|
if(!array_key_exists($iUserId, $asUsers)) $asUsers[$iUserId] = $this->getUserInfo($iUserId);
|
||||||
{
|
$asItem['name'] = $asUsers[$iUserId]['name'];
|
||||||
$iUserId = $asItem[$sIdUserCol];
|
$asItem['company'] = $asUsers[$iUserId]['company'];
|
||||||
if(!array_key_exists($iUserId, $asUsers))
|
|
||||||
{
|
|
||||||
$asUsers[$iUserId] = $this->getUserInfo($iUserId);
|
|
||||||
}
|
|
||||||
$asItemList[$sType][$iItemId] = array_merge($asUsers[$iUserId], $asItem);
|
|
||||||
}
|
|
||||||
else $asItemList[$sType][$iItemId] = $asItem;
|
|
||||||
|
|
||||||
//$asCodeList[$iItemId]['phrase'] = $this->getPhraseFromIdCode($iCodeId);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
$asItemList[$asItem['timestamp'].$asItem['type'].$asItem['id_item']] = $asItem;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
krsort($asItemList);
|
||||||
return $this->jsonExport($asItemList);
|
return $this->jsonExport($asItemList);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2614,6 +2619,18 @@ class Procedure extends PhpObject
|
|||||||
id_code
|
id_code
|
||||||
line
|
line
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Search Engine : Search through all types of databap documents
|
||||||
|
*
|
||||||
|
* Procedure to add a new type in the search
|
||||||
|
* - Add type in the index builder : SearchEngine->buildIndex()
|
||||||
|
* - Add type in the rebuild index function : Databap->buildCompleteIndex()
|
||||||
|
* - Add type in item info : SearchEngine->setItemInfo()
|
||||||
|
* - Add type in .htaccess
|
||||||
|
* - Add type in getItemList() and create a get<type>info()
|
||||||
|
* - consider the message types : add + edit in Databap->getMessages() and in chat.html
|
||||||
|
*/
|
||||||
class SearchEngine extends PhpObject
|
class SearchEngine extends PhpObject
|
||||||
{
|
{
|
||||||
//Objects
|
//Objects
|
||||||
@@ -2643,32 +2660,35 @@ class SearchEngine extends PhpObject
|
|||||||
public function buildIndex($iItemId, $sType)
|
public function buildIndex($iItemId, $sType)
|
||||||
{
|
{
|
||||||
//Build keywords
|
//Build keywords
|
||||||
$sWords = '';
|
|
||||||
switch($sType)
|
switch($sType)
|
||||||
{
|
{
|
||||||
case Databap::CODE_TYPE:
|
case Databap::CODE_TYPE:
|
||||||
$asItemData = $this->oMySql->selectRow(MySqlManager::CODE_TABLE, $iItemId);
|
$asItemData = $this->oMySql->selectRow(MySqlManager::CODE_TABLE, $iItemId);
|
||||||
$sWords = $asItemData[MySqlManager::getText(MySqlManager::CODE_TABLE)].self::KEYWORDS_SEPARATOR.$asItemData['description'];
|
$asWords = array($asItemData[MySqlManager::getText(MySqlManager::CODE_TABLE)], $asItemData['description']);
|
||||||
break;
|
break;
|
||||||
case Databap::PROC_TYPE:
|
case Databap::PROC_TYPE:
|
||||||
|
$sItemIdCol = MySqlManager::getId(MySqlManager::PROC_TABLE);
|
||||||
$asItemData = $this->oMySql->selectRow(MySqlManager::PROC_TABLE, $iItemId);
|
$asItemData = $this->oMySql->selectRow(MySqlManager::PROC_TABLE, $iItemId);
|
||||||
$asItemStepsData = $this->oMySql->selectRows(array('select'=>'description', 'from'=>MySqlManager::STEP_TABLE, 'constraint'=>array('id_procedure'=>$iItemId)));
|
$asItemStepsData = $this->oMySql->selectRows(array('select'=>'description', 'from'=>MySqlManager::STEP_TABLE, 'constraint'=>array($sItemIdCol=>$iItemId)));
|
||||||
$sWords = $asItemData['description'].self::KEYWORDS_SEPARATOR.
|
$asWords = array('desc'=>$asItemData['description'], 'title'=>$asItemData['title']) + $asItemStepsData;
|
||||||
$asItemData['title'].self::KEYWORDS_SEPARATOR.
|
|
||||||
implode(self::KEYWORDS_SEPARATOR, $asItemStepsData);
|
|
||||||
break;
|
break;
|
||||||
case Databap::ART_TYPE:
|
case Databap::ART_TYPE:
|
||||||
$asItemData = $this->oMySql->selectRow(MySqlManager::ART_TABLE, $iItemId);
|
$asItemData = $this->oMySql->selectRow(MySqlManager::ART_TABLE, $iItemId);
|
||||||
$sWords = $asItemData['first_name'].self::KEYWORDS_SEPARATOR.
|
$asWords = array($asItemData['first_name'], $asItemData['last_name'], $asItemData['title']);
|
||||||
$asItemData['last_name'].self::KEYWORDS_SEPARATOR.
|
break;
|
||||||
$asItemData['title'];
|
case Databap::DOC_TYPE:
|
||||||
|
$sItemIdCol = MySqlManager::getId(MySqlManager::DOC_TABLE);
|
||||||
|
$asItemData = $this->oMySql->selectRow(MySqlManager::DOC_TABLE, $iItemId);
|
||||||
|
$asItemFilesData = $this->oMySql->selectRows(array('select'=>'description', 'from'=>MySqlManager::FILE_TABLE, 'constraint'=>array($sItemIdCol=>$iItemId)));
|
||||||
|
$asWords = array('desc'=>$asItemData['description'], 'title'=>$asItemData['title']) + $asItemFilesData;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
$this->addError('function'.__FUNCTION__.'(): Incorrect type "'.$sType.'"');
|
$this->addError('function '.__FUNCTION__.'(): Incorrect type "'.$sType.'"');
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
$sWords = implode(self::KEYWORDS_SEPARATOR, $asWords);
|
||||||
$sWords = strtolower(str_replace("\n", self::KEYWORDS_SEPARATOR, $sWords));
|
$sWords = strtolower(str_replace("\n", self::KEYWORDS_SEPARATOR, $sWords));
|
||||||
$sWords = preg_replace('/(\W+)/', self::KEYWORDS_SEPARATOR, $sWords);
|
$sWords = preg_replace('/(\W+)/', self::KEYWORDS_SEPARATOR, $sWords); //remove all non-word characters
|
||||||
|
|
||||||
//Add / Modify search database
|
//Add / Modify search database
|
||||||
$asData = array('id_item'=>$iItemId, 'type'=>$sType, 'refer_id'=>$asItemData['refer_id'], 'keywords'=>$sWords);
|
$asData = array('id_item'=>$iItemId, 'type'=>$sType, 'refer_id'=>$asItemData['refer_id'], 'keywords'=>$sWords);
|
||||||
@@ -2682,6 +2702,12 @@ class SearchEngine extends PhpObject
|
|||||||
$this->setResults();
|
$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)
|
private function setItemInfo($iSearchId, $iItemType, $iItemId)
|
||||||
{
|
{
|
||||||
if(!array_key_exists($iSearchId, $this->asItemInfos))
|
if(!array_key_exists($iSearchId, $this->asItemInfos))
|
||||||
@@ -2690,43 +2716,60 @@ class SearchEngine extends PhpObject
|
|||||||
switch($iItemType)
|
switch($iItemType)
|
||||||
{
|
{
|
||||||
case Databap::CODE_TYPE:
|
case Databap::CODE_TYPE:
|
||||||
$asItemInfo = $this->oMySql->selectRow
|
$sItemTable = MySqlManager::CODE_TABLE;
|
||||||
(
|
$asItemFields = array(MySqlManager::getId(MySqlManager::USER_TABLE), 'description', 'led');
|
||||||
MySqlManager::CODE_TABLE,
|
|
||||||
$iItemId,
|
|
||||||
array(MySqlManager::getId(MySqlManager::USER_TABLE), 'description', 'led')
|
|
||||||
);
|
|
||||||
break;
|
break;
|
||||||
case Databap::PROC_TYPE:
|
case Databap::PROC_TYPE:
|
||||||
$asItemInfo = $this->oMySql->selectRow
|
$sItemTable = MySqlManager::PROC_TABLE;
|
||||||
(
|
$asItemFields = array(MySqlManager::getId(MySqlManager::USER_TABLE), 'title AS description', 'led');
|
||||||
MySqlManager::PROC_TABLE,
|
|
||||||
$iItemId,
|
|
||||||
array(MySqlManager::getId(MySqlManager::USER_TABLE), 'title AS description', 'led')
|
|
||||||
);
|
|
||||||
break;
|
break;
|
||||||
case Databap::ART_TYPE:
|
case Databap::ART_TYPE:
|
||||||
$asItemInfo = $this->oMySql->selectRow
|
$sItemTable = MySqlManager::ART_TABLE;
|
||||||
(
|
$asItemFields = array('first_name', 'last_name', 'title AS description', 'led');
|
||||||
MySqlManager::ART_TABLE,
|
break;
|
||||||
$iItemId,
|
case Databap::DOC_TYPE:
|
||||||
array('first_name', 'last_name', 'title AS description', 'led')
|
$sItemTable = MySqlManager::DOC_TABLE;
|
||||||
);
|
$asItemFields = array(MySqlManager::getId(MySqlManager::USER_TABLE), 'title AS description', 'led');
|
||||||
$asItemInfo[MySqlManager::getId(MySqlManager::USER_TABLE)] = 0;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
$this->asItemInfos[$iSearchId] += $asItemInfo;
|
$this->asItemInfos[$iSearchId] += $this->oMySql->selectRow($sItemTable, $iItemId, $asItemFields);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private function getItemInfo($iSearchId, $sInfoName)
|
private function getItemInfo($iSearchId, $sInfoName)
|
||||||
{
|
{
|
||||||
return array_key_exists($iSearchId, $this->asItemInfos)?$this->asItemInfos[$iSearchId][$sInfoName]:false;
|
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(!array_key_exists($iUserId, $this->asUserInfos) && $iUserId > 0)
|
||||||
|
{
|
||||||
|
$sCompanyIdCol = MySqlManager::getId(MySqlManager::COMP_TABLE);
|
||||||
|
$this->asUserInfos[$iUserId] = $this->oMySql->selectRow
|
||||||
|
(
|
||||||
|
MySqlManager::USER_TABLE,
|
||||||
|
$iUserId,
|
||||||
|
array('first_name', 'last_name', $sCompanyIdCol)
|
||||||
|
);
|
||||||
|
|
||||||
|
$this->asUserInfos[$iUserId]['company'] = $this->oMySql->selectValue(MySqlManager::COMP_TABLE, MySqlManager::getText(MySqlManager::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()
|
private function setResults()
|
||||||
{
|
{
|
||||||
if($this->iLevelMax>0)
|
if($this->iLevelMax > 0)
|
||||||
{
|
{
|
||||||
//set Results and Ranking
|
//set Results and Ranking
|
||||||
$aiLevels = range(1, $this->iLevelMax);
|
$aiLevels = range(1, $this->iLevelMax);
|
||||||
@@ -2745,7 +2788,7 @@ class SearchEngine extends PhpObject
|
|||||||
$sRegExp = implode(self::KEYWORDS_SEPARATOR.'?', $asSequence);
|
$sRegExp = implode(self::KEYWORDS_SEPARATOR.'?', $asSequence);
|
||||||
|
|
||||||
//TODO replace with selectRow()
|
//TODO replace with selectRow()
|
||||||
$sQuery = "SELECT id_search, id_item, type FROM searchs WHERE keywords REGEXP '{$sRegExp}'";
|
$sQuery = "SELECT id_search, id_item, type/*, keywords*/ FROM searchs WHERE keywords REGEXP '{$sRegExp}'";
|
||||||
|
|
||||||
//search sequence
|
//search sequence
|
||||||
$asItems = $this->oMySql->getArrayQuery($sQuery, true);
|
$asItems = $this->oMySql->getArrayQuery($sQuery, true);
|
||||||
@@ -2754,6 +2797,10 @@ class SearchEngine extends PhpObject
|
|||||||
$iSearchId = $asItem['id_search'];
|
$iSearchId = $asItem['id_search'];
|
||||||
$iItemId = $asItem['id_item'];;
|
$iItemId = $asItem['id_item'];;
|
||||||
$iItemType = $asItem['type'];
|
$iItemType = $asItem['type'];
|
||||||
|
//$sWords = self::KEYWORDS_SEPARATOR.$asItem['keywords'].self::KEYWORDS_SEPARATOR;
|
||||||
|
|
||||||
|
//Calculate hit value
|
||||||
|
//$iCount =
|
||||||
|
|
||||||
$this->incItemRank($iSearchId, $iLevel);
|
$this->incItemRank($iSearchId, $iLevel);
|
||||||
|
|
||||||
@@ -2774,20 +2821,13 @@ class SearchEngine extends PhpObject
|
|||||||
arsort($this->asItemRanks);
|
arsort($this->asItemRanks);
|
||||||
foreach($this->asItemRanks as $iSearchId=>$iRank)
|
foreach($this->asItemRanks as $iSearchId=>$iRank)
|
||||||
{
|
{
|
||||||
/* TODO Customized item preview
|
|
||||||
//code
|
|
||||||
$sCodeLines = implode("\n...\n", $this->getCodeInfo($iItemId, 'code'));
|
|
||||||
$oCode = new Reader($sCodeLines);
|
|
||||||
$sCodeLines = $oCode->getColoredCode();
|
|
||||||
*/
|
|
||||||
|
|
||||||
$iUserId = $this->getItemInfo($iSearchId, MySqlManager::getId(MySqlManager::USER_TABLE));
|
$iUserId = $this->getItemInfo($iSearchId, MySqlManager::getId(MySqlManager::USER_TABLE));
|
||||||
$sFirstName = $this->getUserInfo($iUserId, 'first_name')?$this->getUserInfo($iUserId, 'first_name'):$this->getItemInfo($iSearchId, 'first_name');
|
$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');
|
$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';
|
$sCompany = $this->getUserInfo($iUserId, 'company')?$this->getUserInfo($iUserId, 'company'):'SAP';
|
||||||
$asResult[] = array('id_item'=>$this->getItemInfo($iSearchId, 'id_item'),
|
$asResult[] = array('id_item'=>$this->getItemInfo($iSearchId, 'id_item'),
|
||||||
'type'=>$this->getItemInfo($iSearchId, 'type'),
|
'type'=>$this->getItemInfo($iSearchId, 'type'),
|
||||||
'description'=>$this->getItemInfo($iSearchId, 'description'),
|
'description'=>/*'['.$iRank.'] '.*/$this->getItemInfo($iSearchId, 'description'),
|
||||||
'name'=>Databap::getNameFormat($sFirstName, $sLastName),
|
'name'=>Databap::getNameFormat($sFirstName, $sLastName),
|
||||||
'company'=>Databap::getCompanyFormat($sCompany),
|
'company'=>Databap::getCompanyFormat($sCompany),
|
||||||
'led'=>Databap::getDateFormat($this->getItemInfo($iSearchId, 'led')));
|
'led'=>Databap::getDateFormat($this->getItemInfo($iSearchId, 'led')));
|
||||||
@@ -2795,28 +2835,6 @@ class SearchEngine extends PhpObject
|
|||||||
return $asResult;
|
return $asResult;
|
||||||
}
|
}
|
||||||
|
|
||||||
private function getUserInfo($iUserId, $sInfoName)
|
|
||||||
{
|
|
||||||
return array_key_exists($iUserId, $this->asUserInfos)?$this->asUserInfos[$iUserId][$sInfoName]:false;
|
|
||||||
}
|
|
||||||
|
|
||||||
private function setUserInfo($iUserId)
|
|
||||||
{
|
|
||||||
if(!array_key_exists($iUserId, $this->asUserInfos) && $iUserId > 0)
|
|
||||||
{
|
|
||||||
$sCompanyIdCol = MySqlManager::getId(MySqlManager::COMP_TABLE);
|
|
||||||
$this->asUserInfos[$iUserId] = $this->oMySql->selectRow
|
|
||||||
(
|
|
||||||
MySqlManager::USER_TABLE,
|
|
||||||
$iUserId,
|
|
||||||
array('first_name', 'last_name', $sCompanyIdCol)
|
|
||||||
);
|
|
||||||
|
|
||||||
$this->asUserInfos[$iUserId]['company'] = $this->oMySql->selectValue(MySqlManager::COMP_TABLE, MySqlManager::getText(MySqlManager::COMP_TABLE), $this->asUserInfos[$iUserId][$sCompanyIdCol]);
|
|
||||||
unset($this->asUserInfos[$iUserId][$sCompanyIdCol]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private function incItemRank($iSearchId, $iRank)
|
private function incItemRank($iSearchId, $iRank)
|
||||||
{
|
{
|
||||||
if(array_key_exists($iSearchId, $this->asItemRanks))
|
if(array_key_exists($iSearchId, $this->asItemRanks))
|
||||||
|
|||||||
14
jquery/fileuploader.js
vendored
14
jquery/fileuploader.js
vendored
@@ -493,8 +493,14 @@ qq.FileUploader = function(o){
|
|||||||
listElement: null,
|
listElement: null,
|
||||||
|
|
||||||
template:'<div class="uploader_box">' +
|
template:'<div class="uploader_box">' +
|
||||||
'<div class="uploader_droparea round"><span>Glisser les images ici</span></div>' +
|
'<div class="uploader_droparea round">' +
|
||||||
'<span class="uploader_button button add round">Ajouter une image</span>' +
|
'<span>' +
|
||||||
|
((typeof o.addSlideText !== 'undefined')?o.addSlideText:'Glisser les images ici') +
|
||||||
|
'</span>' +
|
||||||
|
'</div>' +
|
||||||
|
'<span class="uploader_button button add round">'+
|
||||||
|
((typeof o.addFileText !== 'undefined')?o.addFileText:'Ajouter une image') +
|
||||||
|
'</span>' +
|
||||||
'<div class="uploader_buffer"></div>' +
|
'<div class="uploader_buffer"></div>' +
|
||||||
'<ul id="uploader_list" class="uploader_list"></ul>' +
|
'<ul id="uploader_list" class="uploader_list"></ul>' +
|
||||||
'</div>',
|
'</div>',
|
||||||
@@ -504,7 +510,7 @@ qq.FileUploader = function(o){
|
|||||||
'<span class="uploader_item_loading"></span>' +
|
'<span class="uploader_item_loading"></span>' +
|
||||||
'<span class="uploader_item_file"></span>' +
|
'<span class="uploader_item_file"></span>' +
|
||||||
'<span class="uploader_item_size"></span>' +
|
'<span class="uploader_item_size"></span>' +
|
||||||
'<a class="uploader_item_cancel" href="#">Cancel</a>' +
|
'<a class="uploader_item_cancel" href="#">Annuler</a>' +
|
||||||
'<span class="uploader_item_failed_notice">Echoué</span>' +
|
'<span class="uploader_item_failed_notice">Echoué</span>' +
|
||||||
'</li>',
|
'</li>',
|
||||||
|
|
||||||
@@ -527,7 +533,7 @@ qq.FileUploader = function(o){
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
// overwrite options with user supplied
|
// overwrite options with user supplied
|
||||||
qq.extend(this._options, o);
|
qq.extend(this._options, o);
|
||||||
|
|
||||||
this._element = this._options.element;
|
this._element = this._options.element;
|
||||||
this._options.template = this._options.template.replace('id="uploader_list"', 'id="'+databap.getElemTag('uploader_list', this._options.stepId)+'"');
|
this._options.template = this._options.template.replace('id="uploader_list"', 'id="'+databap.getElemTag('uploader_list', this._options.stepId)+'"');
|
||||||
|
|||||||
2
jquery/handler.js
vendored
2
jquery/handler.js
vendored
@@ -188,7 +188,7 @@ var databap =
|
|||||||
databap.$menu.find('#profile_ln').click(function(){databap.loadProfilePage();});
|
databap.$menu.find('#profile_ln').click(function(){databap.loadProfilePage();});
|
||||||
databap.$menu.find('#chat_ln').click(function(){databap.loadChatPage();});
|
databap.$menu.find('#chat_ln').click(function(){databap.loadChatPage();});
|
||||||
databap.$menu.find('#options_ln').click(function(){databap.loadOptionsPage();});
|
databap.$menu.find('#options_ln').click(function(){databap.loadOptionsPage();});
|
||||||
//databap.$menu.find('#doc').click(function(){databap.loadDocPage();});
|
databap.$menu.find('#doc_ln').click(function(){databap.loadDocPage();});
|
||||||
databap.$menu.find('#log_me_out_ln').click(function(){databap.logMeOut();});
|
databap.$menu.find('#log_me_out_ln').click(function(){databap.logMeOut();});
|
||||||
|
|
||||||
//Close menu on click
|
//Close menu on click
|
||||||
|
|||||||
@@ -664,13 +664,21 @@ function addMessage(message_info, bReset)
|
|||||||
if(!bReset) joinChan(sChanKeyName, false, [], false);
|
if(!bReset) joinChan(sChanKeyName, false, [], false);
|
||||||
break;
|
break;
|
||||||
case 'B':
|
case 'B':
|
||||||
msg_body = '<span class="text action">Nouvel article sur le blog BI de SAP : <a href="'+message_info.message.link_art+'" target="_blank">'+message_info.message.title+'</a> ';
|
msg_body = '<span class="text action">Nouvel article sur le blog BI de SAP : <a href="'+databap.getExternalLink('a', message_info.message)+'" target="_blank">'+message_info.art_title+'</a> ';
|
||||||
msg_body+= 'par <a title="Lien vers la page de l\'auteur" href="'+message_info.message.link_auth+'" target="_blank">'+message_info.message.name+'</a> ('+message_info.message.date+')'+'</span>';
|
msg_body+= 'par <a title="Lien vers la page de l\'auteur" href="'+message_info.link_auth+'" target="_blank">'+message_info.name+'</a> ('+message_info.art_date+')'+'</span>';
|
||||||
break;
|
break;
|
||||||
case 'S':
|
case 'S':
|
||||||
updateUsersList = true;
|
updateUsersList = true;
|
||||||
msg_body = '<span class="text action">'+message_info.nickname+' '+message_info.message+'</span>';
|
msg_body = '<span class="text action">'+message_info.nickname+' '+message_info.message+'</span>';
|
||||||
break;
|
break;
|
||||||
|
case 'DA':
|
||||||
|
var url = databap.getExternalLink('doc', message_info.message);
|
||||||
|
msg_body = '<span class="text">'+message_info.nickname+' a ajouté une nouvelle documentation : <a href="'+url+'" target="_blank">'+message_info.description+'</a></span>';
|
||||||
|
break;
|
||||||
|
case 'DE':
|
||||||
|
var url = databap.getExternalLink('doc', message_info.message);
|
||||||
|
msg_body = '<span class="text">'+message_info.nickname+' a modifié la documentation <a href="'+url+'" target="_blank">'+message_info.description+'</a></span>';
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(msg_body != '')
|
if(msg_body != '')
|
||||||
|
|||||||
@@ -59,6 +59,8 @@ databap.pageInit = function()
|
|||||||
action: databap.getActionLink('upload_file'),
|
action: databap.getActionLink('upload_file'),
|
||||||
allowedExtensions: databap.consts.authorized_file_exts,
|
allowedExtensions: databap.consts.authorized_file_exts,
|
||||||
sizeLimit: parseInt(databap.consts.max_size)*100,
|
sizeLimit: parseInt(databap.consts.max_size)*100,
|
||||||
|
addSlideText: 'Glisser les fichier ici',
|
||||||
|
addFileText: 'Ajouter un fichier',
|
||||||
debug:true,
|
debug:true,
|
||||||
stepId:1
|
stepId:1
|
||||||
}
|
}
|
||||||
@@ -94,7 +96,6 @@ function loadDoc(iDocId, fOnSuccess)
|
|||||||
'get_doc',
|
'get_doc',
|
||||||
function(doc_info)
|
function(doc_info)
|
||||||
{
|
{
|
||||||
debug(doc_info);
|
|
||||||
databap.getMainElem('#titles_read_title').html(doc_info.title);
|
databap.getMainElem('#titles_read_title').html(doc_info.title);
|
||||||
databap.getMainElem('#titles_read_user').html(doc_info.name);
|
databap.getMainElem('#titles_read_user').html(doc_info.name);
|
||||||
databap.getMainElem('#titles_read_company').html(doc_info.company);
|
databap.getMainElem('#titles_read_company').html(doc_info.company);
|
||||||
@@ -104,11 +105,14 @@ function loadDoc(iDocId, fOnSuccess)
|
|||||||
//links
|
//links
|
||||||
for(i in doc_info.files)
|
for(i in doc_info.files)
|
||||||
{
|
{
|
||||||
var $Link = $('<a href="#" title="Télécharger cette documentation"></a><br />');
|
databap.getMainElem('#doc_links')
|
||||||
var sLink = databap.getActionLink('dl_file&id='+i);debug(sLink);
|
.append(
|
||||||
$Link.attr('href', sLink);
|
$('<a>', {title:'Télécharger cette documentation', href:databap.getActionLink('dl_file&id='+i)})
|
||||||
$Link.html(doc_info.files[i].description);
|
.addClass(doc_info.files[i].ext)
|
||||||
databap.getMainElem('#doc_links').append($Link);
|
.text(doc_info.files[i].description)
|
||||||
|
)
|
||||||
|
.append('<br />');
|
||||||
|
|
||||||
}
|
}
|
||||||
setDisplay('read');
|
setDisplay('read');
|
||||||
fOnSuccess();
|
fOnSuccess();
|
||||||
|
|||||||
@@ -46,7 +46,7 @@
|
|||||||
<ul style="list-style: none;" id="menu_items">
|
<ul style="list-style: none;" id="menu_items">
|
||||||
<li id="add_ln">Ajouter du code</li>
|
<li id="add_ln">Ajouter du code</li>
|
||||||
<li id="procedure_ln">Ajouter une procédure</li>
|
<li id="procedure_ln">Ajouter une procédure</li>
|
||||||
<!-- <li id="doc_ln">Doc</li>-->
|
<!-- <li id="doc_ln">Doc</li> -->
|
||||||
<li id="list_ln">Liste complète</li>
|
<li id="list_ln">Liste complète</li>
|
||||||
<!-- <li id="quick_code_access_ln">N°<input type="text" name="quick_code_access_id" id="quick_code_access_id" class="round" value="code" /></li>-->
|
<!-- <li id="quick_code_access_ln">N°<input type="text" name="quick_code_access_id" id="quick_code_access_id" class="round" value="code" /></li>-->
|
||||||
<li id="profile_ln">Profil</li>
|
<li id="profile_ln">Profil</li>
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ databap.pageInit = function()
|
|||||||
'list',
|
'list',
|
||||||
function(items)
|
function(items)
|
||||||
{
|
{
|
||||||
buildList(items);
|
for(id in items) databap.appendItem(items[id], databap.getMainElem('#list_container'));
|
||||||
|
|
||||||
//Init's end
|
//Init's end
|
||||||
databap.setInitEnd(true);
|
databap.setInitEnd(true);
|
||||||
@@ -24,19 +24,4 @@ databap.pageInit = function()
|
|||||||
'json'
|
'json'
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
function buildList(asAllItems)
|
|
||||||
{
|
|
||||||
var sType ='';
|
|
||||||
var iItemId = 0;
|
|
||||||
for(sType in asAllItems)
|
|
||||||
{
|
|
||||||
for(iItemId in asAllItems[sType])
|
|
||||||
{
|
|
||||||
asAllItems[sType][iItemId]['type'] = sType;
|
|
||||||
asAllItems[sType][iItemId]['id_item'] = iItemId;
|
|
||||||
databap.appendItem(asAllItems[sType][iItemId], databap.getMainElem('#list_container'));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
</script>
|
||||||
15
style.css
15
style.css
@@ -1731,12 +1731,25 @@ img {
|
|||||||
|
|
||||||
#doc #doc_links a {
|
#doc #doc_links a {
|
||||||
padding:20px 0 20px 30px;
|
padding:20px 0 20px 30px;
|
||||||
background:url(images/xls_24.png) 0 50% no-repeat;
|
background:url('images/raw_24.png') 0 50% no-repeat;
|
||||||
line-height:40px;
|
line-height:40px;
|
||||||
font-size:14px;
|
font-size:14px;
|
||||||
text-decoration:underline;
|
text-decoration:underline;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#doc #doc_links a.xls, #doc #doc_links a.xlsx {
|
||||||
|
background-image:url('images/xls_24.png');
|
||||||
|
}
|
||||||
|
#doc #doc_links a.doc, #doc #doc_links a.docx {
|
||||||
|
background-image:url('images/doc_24.png');
|
||||||
|
}
|
||||||
|
#doc #doc_links a.ppt, #doc #doc_links a.pptx {
|
||||||
|
background-image:url('images/ppt_24.png');
|
||||||
|
}
|
||||||
|
#doc #doc_links a.pdf {
|
||||||
|
background-image:url('images/pdf_24.png');
|
||||||
|
}
|
||||||
|
|
||||||
/* 404 */
|
/* 404 */
|
||||||
|
|
||||||
#err_404 .h1_wrap h1 {
|
#err_404 .h1_wrap h1 {
|
||||||
|
|||||||
Reference in New Issue
Block a user