jenkins-bot has submitted this change and it was merged.
Change subject: BSApiFileBackendStore Pt. II
......................................................................
BSApiFileBackendStore Pt. II
* InsertImage uses BSApiFileBackendStore
Change-Id: Ia785ab9ad839cbf93c6de0a6fdbf15056595c08f
---
M InsertFile/InsertFile.setup.php
M InsertFile/includes/InsertFileAJAXBackend.php
M InsertFile/resources/BS.InsertFile/BaseDialog.js
M InsertFile/resources/BS.InsertFile/FileDialog.js
M InsertFile/resources/BS.InsertFile/ImageDialog.js
M InsertFile/resources/BS.InsertFile/UploadPanel.js
6 files changed, 71 insertions(+), 435 deletions(-)
Approvals:
Robert Vogel: Looks good to me, approved
jenkins-bot: Verified
diff --git a/InsertFile/InsertFile.setup.php b/InsertFile/InsertFile.setup.php
index 5a65c49..c7340c5 100644
--- a/InsertFile/InsertFile.setup.php
+++ b/InsertFile/InsertFile.setup.php
@@ -10,10 +10,7 @@
$wgAutoloadClasses['JsonLicenses'] = __DIR__ .
'/includes/JsonLicenses.php';
$wgAutoloadClasses['InsertFileAJAXBackend'] = __DIR__ .
'/includes/InsertFileAJAXBackend.php';
-$wgAjaxExportList[] = 'InsertFileAJAXBackend::getFilePage';
-$wgAjaxExportList[] = 'InsertFileAJAXBackend::getFiles';
$wgAjaxExportList[] = 'InsertFileAJAXBackend::getLicenses';
-$wgAjaxExportList[] = 'InsertFileAJAXBackend::getExistsWarning';
$aResourceModuleTemplate = array(
'localBasePath' => __DIR__ . '/resources',
diff --git a/InsertFile/includes/InsertFileAJAXBackend.php
b/InsertFile/includes/InsertFileAJAXBackend.php
index 3f81120..2302a47 100644
--- a/InsertFile/includes/InsertFileAJAXBackend.php
+++ b/InsertFile/includes/InsertFileAJAXBackend.php
@@ -2,387 +2,10 @@
class InsertFileAJAXBackend {
+ //There is an api action "licences" in mw 2.24, but it is described as
+ //"Get media license dropdown HTML."
public static function getLicenses() {
$oLicenses = new JsonLicenses();
return $oLicenses->getJsonOutput();
- }
-
- /**
- * Calculate on which page an file is shown and put it to ajax output.
- * @param type $output The ajax output which have to be valid JSON.
- */
- public static function getFilePage() {
- global $wgDBtype;
- $oRequest = RequestContext::getMain()->getRequest();
- $filename = $oRequest->getVal( 'filename', false );
- $type = $oRequest->getVal( 'type', 'image' );
- $pagesize = $oRequest->getInt( 'pagesize', 12 );
-
- if ( strstr( $filename, 'index.php' ) ) {
- $token = array( );
- parse_str( $filename, $token );
- if ( isset( $token[ 'f' ] ) ) {
- $token = explode( ':', $token[ 'f' ] );
- $filename = $token[ 1 ];
- }
- }
-
- if ( !$filename ) {
- return FormatJson::encode(
- array(
- 'file' => '',
- 'page' => 0
- )
- );
- }
-
- $dbr = wfGetDB( DB_SLAVE );
-
- switch ( $type ) {
- // TODO MRG (01.07.11 12:08): see above: Tiff special
case only makes sense with PAgedTiffHandler activated.
- case 'image':
- switch ( $wgDBtype ) {
- case 'postgres':
- $sql = "SELECT
insertfile_getImagePosition('{$filename}') AS rank";
- break;
- case 'oracle':
- $sql = "SELECT
if_getImagePosition('{$filename}') AS rank FROM dual";
- break;
- case 'mysql':
- default:
- $tbl = $dbr->tableName( 'image'
);
- $sql = "SELECT tmp.rank FROM
- (SELECT
@row:=@row+1 rank, i.img_name
- FROM
{$tbl} i, (SELECT @row:=0) r
- WHERE
(i.img_major_mime = 'image' OR i.img_minor_mime = 'tiff')
- ORDER
BY i.img_name ASC) tmp
- WHERE
tmp.img_name = '{$filename}'";
- break;
- }
- break;
- case 'file':
- switch ( $wgDBtype ) {
- case 'postgres':
- $sql = "SELECT
insertfile_getFileUploadPosition('{$filename}') AS rank";
- break;
- case 'oracle':
- $sql = "SELECT
if_getFileUploadPosition('{$filename}') AS rank FROM dual";
- break;
- case 'mysql':
- default:
- $tbl = $dbr->tableName( 'image'
);
- $sql = "SELECT tmp.rank FROM
- (SELECT
@row:=@row+1 rank, i.img_name
- FROM
{$tbl} i, (SELECT @row:=0) r
- WHERE
(i.img_major_mime != 'image' AND i.img_minor_mime != 'tiff')
- ORDER
BY i.img_name ASC) tmp
- WHERE
tmp.img_name = '{$filename}'";
- break;
- }
- break;
- }
-
- $res = $dbr->query( $sql );
- if ( $res && $res->numRows() ) {
- $row = $res->fetchObject();
- $page = ceil( $row->rank / $pagesize );
- } else {
- $page = 0;
- }
- return FormatJson::encode(
- array(
- 'file' => $filename,
- 'page' => $page
- )
- );
- }
-
- /**
- * Calculate on which page an uploaded file is shown and put it to ajax
output.
- * @param type $output The ajax output which have to be valid JSON.
- */
- public static function getUploadedFilePage() {
- global $wgDBtype;
- $oRequest = RequestContext::getMain()->getRequest();
- $type = $oRequest->getVal( 'type', 'image' );
- $sort = $oRequest->getVal( 'sort', 'name' );
- $pagesize = $oRequest->getInt( 'pagesize', 12 );
-
- switch ( $sort ) {
- case 'size':
- $sql_sort = 'i.img_size DESC';
- break;
- case 'lastmod':
- $sql_sort = 'i.img_timestamp DESC';
- break;
- case 'name':
- default:
- $sql_sort = 'i.img_name ASC';
- }
-
- $dbr = wfGetDB( DB_SLAVE );
-
- if ( $wgDBtype == 'mysql' || $wgDBtype == 'sqlite' ) {
- if ( $type == 'image' ) {
- $tbl = $dbr->tableName( 'image' );
- $sql = "SELECT tmp.rank, tmp.img_name FROM
- (SELECT @row:=@row+1
rank, i.img_name, i.img_timestamp
- FROM {$tbl} i, (SELECT
@row:=0) r
- WHERE
(i.img_major_mime = 'image' OR i.img_minor_mime = 'tiff')
- ORDER BY {$sql_sort})
tmp
- ORDER BY tmp.img_timestamp DESC
- LIMIT 1";
- } else {
- $tbl = $dbr->tableName( 'image' );
- $sql = "SELECT tmp.rank, tmp.img_name FROM
- (SELECT @row:=@row+1
rank, i.img_name, i.img_timestamp
- FROM {$tbl} i, (SELECT
@row:=0) r
- WHERE
(i.img_major_mime != 'image' AND i.img_minor_mime != 'tiff')
- ORDER BY {$sql_sort})
tmp
- ORDER BY tmp.img_timestamp DESC
- LIMIT 1";
- }
-
- $filename = '';
-
- $res = $dbr->query( $sql );
- if ( $res && $res->numRows() ) {
- $row = $res->fetchObject();
- $page = ceil( $row->rank / $pagesize );
- $filename = $row->img_name;
- } else {
- $page = 0;
- }
- } else {
- if ( $type == 'image' ) {
- $tbl = $dbr->tableName( 'image' );
- $sql = "SELECT i.img_name, i.img_timestamp
- FROM {$tbl} i
- WHERE (i.img_major_mime =
'image' OR i.img_minor_mime = 'tiff')
- ORDER BY {$sql_sort}";
- } else {
- $tbl = $dbr->tableName( 'image' );
- $sql = "SELECT i.img_name, i.img_timestamp
- FROM {$tbl} i
- WHERE (i.img_major_mime !=
'image' AND i.img_minor_mime != 'tiff')
- ORDER BY {$sql_sort}";
- }
-
- $filename = '';
-
- $res = $dbr->query( $sql );
- $rows = array();
- $rank = 0;
- $newestRow = null;
- if ( $res && $res->numRows() ) {
- while($row = $res->fetchObject()) {
- $rank++;
- $rows[$rank] = array('rank' => $rank,
'filename' => $row->img_name, 'time' => $row->img_timestamp);
- if(!$newestRow || $newestRow['time'] <
$row->img_timestamp) {
- $newestRow = &$rows[$rank];
- }
- }
- $page = ceil( $newestRow['rank'] / $pagesize );
- $filename = $newestRow['filename'];
- } else {
- $page = 0;
- }
- }
-
- return FormatJson::encode(
- array(
- 'file' => $filename,
- 'page' => $page
- )
- );
- }
-
- public static function getExistsWarning( $sFilename ) {
- $oFile = wfFindFile( $sFilename );
- if( !$oFile ) {
- $oFile = wfLocalFile( $sFilename );
- }
-
- $s = ' ';
- if ( $oFile ) {
- $exists = UploadBase::getExistsWarning( $oFile );
- $warning = SpecialUpload::getExistsWarning( $exists );
- if ( $warning !== '' ) {
- if ( BsExtensionManager::getExtension(
'SecureFileStore' ) !== null ) {
- $warning =
SecureFileStore::secureStuff( $warning );
- }
- $s = "<div>$warning</div>";
- }
- }
-
- return $s;
- }
-
- /**
- * Process the dataset for the ExtJS file store and put it to ajax
output.
- */
- public static function getFiles() {
- $thumbs_width = 128;
- $thumbs_height = 128;
-
- $oStoreParams = BsExtJSStoreParams::newFromRequest();
- $sFileType = $oStoreParams->getRequest()->getVal('type',
'image');
- //$aFileExtensions =
$oStoreParams->getRequest()->getArray('type'); //TODO: For future use
-
- $sStart = $oStoreParams->getStart();
- $sLimit = $oStoreParams->getLimit();
-
- switch ( $oStoreParams->getSort() ) {
- case 'size':
- $sSort = 'i.img_size';
- break;
- case 'name':
- $sSort = 'i.img_name';
- break;
- case 'lastmod':
- default:
- $sSort = 'i.img_timestamp';
- }
- $sSort .= ' '.$oStoreParams->getDirection();
-
- $sType = '';
- switch ( $sFileType ) {
- case 'image':
- $sType = "(i.img_major_mime = 'image' OR
i.img_minor_mime = 'tiff')";
- break;
- case 'file':
- $sType = "(i.img_major_mime != 'image' AND
i.img_minor_mime != 'tiff')";
- break;
- }
-
- $aConds = array();
- $aConds[] = $sType;
-
- $aNameFilters = array();
- //We need to replace spaces, because the DB value does not have
spaces
- $aNameFilters[] = str_replace( ' ', '_',
$oStoreParams->getQuery() );
-
- $dbr = wfGetDB( DB_SLAVE );
- $sImageTable = $dbr->tableName( 'image' );
- $sCategoryLinksTable = $dbr->tableName( 'categorylinks' );
- $sPageTable = $dbr->tableName( 'page' );
-
- wfRunHooks( 'BSInsertFileGetFilesBeforeQuery', array( &$aConds,
&$aNameFilters ) );
-
- global $wgDBtype;
- $sNameFilters = self::buildNameFiltersSQL( $aNameFilters,
$wgDBtype );
- if( !empty( $sNameFilters ) ) $aConds[] = $sNameFilters;
- $sConds = implode( ' AND ', $aConds );
-
- // Searching for images/files in categories with name
$sCategoryFilter
- // TODO SW: verify that this image is found by category, may be
join in statement
- $sCategoryFilter = self::buildNameFiltersSQL( $aNameFilters,
$wgDBtype, 'cl_to' );
- $sConds .= " OR i.img_name IN (SELECT page_title FROM
$sCategoryLinksTable, $sPageTable where $sCategoryFilter and page_namespace=6
and page_id=cl_from) AND $sType";
-
- if ( $wgDBtype == 'oracle' ) {
- $sql =
- "SELECT * FROM
- (
- SELECT i.img_name, i.img_size,
i.img_width, i.img_height, i.img_timestamp,
- row_number()
over (ORDER BY {$sSort}) rnk
- FROM {$sImageTable} i
- WHERE {$sConds}
- )
- WHERE rnk BETWEEN {$sStart}+1 AND " . ( $sStart
+ $sLimit );
- } elseif ( $wgDBtype == 'postgres' ) {
- $sql = "SELECT i.img_name, i.img_size, i.img_width,
i.img_height, i.img_timestamp
- FROM {$sImageTable} i
- WHERE {$sConds}
- ORDER BY {$sSort}
- OFFSET {$sStart}
- LIMIT {$sLimit}";
- } else {
- $sql = "SELECT i.img_name, i.img_size, i.img_width,
i.img_height, i.img_timestamp
- FROM {$sImageTable} i
- WHERE {$sConds}
- ORDER BY {$sSort}
- LIMIT {$sStart}, {$sLimit}";
- }
-
- $rowTotal = $dbr->selectRow(
- array( 'i' => 'image' ),
- array( 'total' => 'COUNT(img_name)' ),
- $sConds
- );
-
- $aOutput = array(
- 'total' => $rowTotal->total,
- 'images' => array()
- );
-
- $res = $dbr->query( $sql );
-
- foreach ( $res as $row ) {
- $img = self::newFromName( $row->img_name );
-
- $url = $img->createThumb( 48, 48 );//img size for
preview in grid cell
-
- if ( BsExtensionManager::isContextActive(
'MW::SecureFileStore::Active' ) ) {
- $url = SecureFileStore::secureStuff( $url, true
);
- }
-
- $aOutput['images'][] = array(
- 'name' => $row->img_name,
- 'url' => $url,
- 'size' => $row->img_size,
- 'lastmod' => wfTimestamp(TS_UNIX,
$row->img_timestamp),
- 'width' => $row->img_width,
- 'height' => $row->img_height
- );
- }
- return FormatJson::encode( $aOutput );
- }
-
-
- /**
- * Builds filter conditions for SQL query
- * @param array $nameFilters
- * @param string $dbType
- * @return string A SQL fragment containing all filter conditions
- */
- protected static function buildNameFiltersSQL( $nameFilters, $dbType,
$sTableName = 'i.img_name' ) {
- //HINT: CONVERT is needed because field type is VARBINARY.
- //Converting to UTF8 is just a heuristics. SQL is probably
- //nonstandard.
- $sFormat = "LOWER(CONVERT($sTableName USING 'UTF8')) LIKE %s";
-
- if( $dbType == 'oracle' || $dbType == 'postgres' || $dbType ==
'sqlite') {
- $sFormat = "LOWER($sTableName) LIKE %s";
- }
- $dbr = wfGetDB( DB_SLAVE );
- $aFormattedFilters = array();
- foreach( $nameFilters as $nameFilter ) {
- //if( empty($nameFilter) ) continue;
- $aFormattedFilters[] = sprintf(
- $sFormat,
- $dbr->addQuotes('%'.strtolower($nameFilter).'%')
- );
- }
-
- $sNameFilters = implode( ' OR ', $aFormattedFilters );
-
- if( !empty($sNameFilters) ) {
- $sNameFilters = '('.$sNameFilters.')';
- }
-
- return $sNameFilters;
- }
-
- protected static function newFromName( $name ) {
- $title = Title::makeTitleSafe( NS_FILE, $name );
- if ( is_object( $title ) ) {
- $img = wfFindFile( $title );
- if ( !$img ) {
- $img = wfLocalFile( $title );
- }
- return $img;
- } else {
- return null;
- }
}
}
\ No newline at end of file
diff --git a/InsertFile/resources/BS.InsertFile/BaseDialog.js
b/InsertFile/resources/BS.InsertFile/BaseDialog.js
index c417299..280ad85 100644
--- a/InsertFile/resources/BS.InsertFile/BaseDialog.js
+++ b/InsertFile/resources/BS.InsertFile/BaseDialog.js
@@ -34,22 +34,22 @@
this.conf = {
columns: {
items: [{
- dataIndex: 'url',
+ dataIndex: 'img_thumbnail',
renderer: this.renderThumb,
width: 56,
sortable: false
},{
text:
mw.message('bs-insertfile-filename').plain(),
- dataIndex: 'name',
+ dataIndex: 'img_name',
flex: 1
},{
text:
mw.message('bs-insertfile-filesize').plain(),
- dataIndex: 'size',
+ dataIndex: 'img_size',
renderer:this.renderSize,
width: 100
},{
text:
mw.message('bs-insertfile-lastmodified').plain(),
- dataIndex: 'lastmod',
+ dataIndex: 'page_touched',
renderer:this.renderLastModified,
width: 150
}],
@@ -66,21 +66,29 @@
leadingBufferZone: 60,
proxy: {
type: 'ajax',
- url:
bs.util.getAjaxDispatcherUrl('InsertFileAJAXBackend::getFiles'),
+ url: mw.util.wikiScript('api'),
reader: {
type: 'json',
- root: 'images',
- idProperty: 'name'
+ root: 'results',
+ idProperty: 'img_name',
+ totalProperty: 'total'
},
extraParams: {
- type: this.storeFileType
+ format: 'json',
+ action: 'bs-filebackend-store',
+ filter: Ext.encode([{
+ type: 'string',
+ comparison: 'eq',
+ field: 'img_major_mime',
+ value: this.storeFileType
+ }])
}
},
remoteFilter: true,
autoLoad: true,
- fields: ['name', 'lastmod', 'url', 'size', 'width',
'height' ],
+ fields: ['img_name', 'page_touched', 'img_thumbnail',
'img_size', 'img_width', 'img_height' ],
sortInfo: {
- field: 'lastmod',
+ field: 'page_touched',
direction: 'ASC'
}
});
@@ -228,14 +236,6 @@
},
renderThumb: function( url ) {
- /*return mw.html.element(
- 'img',
- {
- src: url,
- height: 48,
- width: 48
- }
- );*/
return '<img src="'+url+'" height="48" width="48" />';
},
@@ -244,14 +244,16 @@
},
renderLastModified: function( lastmod ){
+ //mw timestamp to date params
+ var aDate = lastmod.match(new RegExp('.{1,2}', 'g'));
return Ext.Date.format(
- new Date(lastmod * 1000),
+ new Date(aDate[0] + aDate[1], aDate[2], aDate[3],
aDate[4], aDate[5], aDate[6] ),
'd.m.Y G:i'
);
},
onGdImagesSelect: function( grid, record, index, eOpts ){
- this.tfFileName.setValue( record.get('name') );
+ this.tfFileName.setValue( record.get('img_name') );
this.pnlConfig.expand();
},
diff --git a/InsertFile/resources/BS.InsertFile/FileDialog.js
b/InsertFile/resources/BS.InsertFile/FileDialog.js
index 741472e..2e2ccd6 100644
--- a/InsertFile/resources/BS.InsertFile/FileDialog.js
+++ b/InsertFile/resources/BS.InsertFile/FileDialog.js
@@ -14,7 +14,16 @@
this.configPanel.items = [];
this.callParent(arguments);
},
+ afterInitComponent: function() {
+ this.callParent(arguments);
+ this.stImageGrid.proxy.extraParams.filter = Ext.encode([{
+ type: 'string',
+ comparison: 'neq',
+ field: 'img_major_mime',
+ value: 'image'
+ }]);
+ },
onPnlConfigExpand: function(panel, eOpts){
this.callParent(arguments);
- },
+ }
});
\ No newline at end of file
diff --git a/InsertFile/resources/BS.InsertFile/ImageDialog.js
b/InsertFile/resources/BS.InsertFile/ImageDialog.js
index f584ae0..2f70661 100644
--- a/InsertFile/resources/BS.InsertFile/ImageDialog.js
+++ b/InsertFile/resources/BS.InsertFile/ImageDialog.js
@@ -170,8 +170,8 @@
if( this.nbWidth.getValue() === null &&
this.nbHeight.getValue() === null ) {
var record = records[0];
this.isSetData = true;
- this.nbWidth.setValue(+record.get('width'));
- this.nbHeight.setValue(+record.get('height'));
+ this.nbWidth.setValue(+record.get('img_width'));
+
this.nbHeight.setValue(+record.get('img_height'));
this.isSetData = false;
}
}
@@ -195,8 +195,8 @@
if ((w === 0 && h === 0) || record === null ) {
return 0;
}
- var orgW = record.get('width');
- var orgH = record.get('height');
+ var orgW = record.get('img_width');
+ var orgH = record.get('img_height');
if (w === 0) {
return Math.round(orgW / (orgH / h));
@@ -271,7 +271,7 @@
var height = this.nbHeight.getValue();
var width = this.nbWidth.getValue();
- if( height != record.get('height') || width !=
record.get('width') ) {
+ if( height != record.get('img_height') || width !=
record.get('img_width') ) {
cfg.sizeheight = height;
cfg.sizewidth = width;
}
@@ -352,12 +352,12 @@
onGdImagesSelect: function( grid, record, index, eOpts ){
this.callParent(arguments);
- this.hdnUrl.setValue( record.get('url') );
+ this.hdnUrl.setValue( record.get('img_thumbnail') );
//This is to avoid an overriding of the dimension that may have
been
//set by this.setData()
if( grid.getStore().filters.items.length === 0 ||
grid.getStore().getCount() !== 1 ) {
- this.nbWidth.setValue( record.get('width') );
- this.nbHeight.setValue( record.get('height') );
+ this.nbWidth.setValue( record.get('img_width') );
+ this.nbHeight.setValue( record.get('img_height') );
}
$(document).trigger("BSInsertFileInsertImageDialogAfterImageSelect", [this,
grid, record, index]);
},
diff --git a/InsertFile/resources/BS.InsertFile/UploadPanel.js
b/InsertFile/resources/BS.InsertFile/UploadPanel.js
index cfa824d..6064f9e 100644
--- a/InsertFile/resources/BS.InsertFile/UploadPanel.js
+++ b/InsertFile/resources/BS.InsertFile/UploadPanel.js
@@ -176,31 +176,36 @@
},
tfFileNameChange: function(field, value) {
- Ext.Ajax.request({
- url: bs.util.getAjaxDispatcherUrl(
'InsertFileAJAXBackend::getExistsWarning', [ value ] ),
- success: function(response, options) {
- if(!(response.responseText.trim() === ''
- || response.responseText === ' '
- || response.responseText === ' '))
{
-
- bs.util.alert(
- this.getId()+'-existswarning',
- {
- titleMsg:
'bs-extjs-title-warning',
- text:
response.responseText
- },
- {
- ok: function() {
- //User is
noticed. Now let's set the
- //ignore
warnings flag automatically
-
this.cbxWarnings.setValue(true);
- },
- scope: this
- }
- );
+ var Api = new mw.Api();
+ var me = this;
+ Api.get({
+ action: 'query',
+ format: 'json',
+ titles: 'File:' + value,
+ prop: 'imageinfo',
+ iiprop: 'uploadwarning',
+ indexpageids: ''
+ }).done( function ( response ) {
+ if( response.query.pageids[0] === "-1" ) {
+ return null;
+ }
+ bs.util.alert(
+ me.getId()+'-existswarning',
+ {
+ titleMsg: 'bs-extjs-title-warning',
+ text:
response.query.pages[response.query.pageids[0]]
+ .imageinfo[0]
+ .html
+ },
+ {
+ ok: function() {
+ //User is noticed. Now let's
set the
+ //ignore warnings flag
automatically
+ me.cbxWarnings.setValue(true);
+ },
+ scope: me
}
- },
- scope: this
+ );
});
},
--
To view, visit https://gerrit.wikimedia.org/r/207777
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: merged
Gerrit-Change-Id: Ia785ab9ad839cbf93c6de0a6fdbf15056595c08f
Gerrit-PatchSet: 2
Gerrit-Project: mediawiki/extensions/BlueSpiceExtensions
Gerrit-Branch: master
Gerrit-Owner: Pwirth <[email protected]>
Gerrit-Reviewer: Mglaser <[email protected]>
Gerrit-Reviewer: Robert Vogel <[email protected]>
Gerrit-Reviewer: Tweichart <[email protected]>
Gerrit-Reviewer: jenkins-bot <>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits