Pwirth has uploaded a new change for review. https://gerrit.wikimedia.org/r/207777
Change subject: [WIP] BSApiExtJSStoreFileBackend Pt. II ...................................................................... [WIP] BSApiExtJSStoreFileBackend 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(-) git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/BlueSpiceExtensions refs/changes/77/207777/1 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: newchange Gerrit-Change-Id: Ia785ab9ad839cbf93c6de0a6fdbf15056595c08f Gerrit-PatchSet: 1 Gerrit-Project: mediawiki/extensions/BlueSpiceExtensions Gerrit-Branch: master Gerrit-Owner: Pwirth <wi...@hallowelt.biz> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits