import React from "react" ; import { Menu, MenuList, MenuButton, MenuItem } from "@reach/menu-button" ; import "./PublicationSearchResult.css" ; import { PublicationSearchResult2 } from "./PublicationSearchResult2.js" ; import { gAppRef } from "./index.js" ; import { pluralString, applyUpdatedVals, removeSpecialFields } from "./utils.js" ; const axios = require( "axios" ) ; // -------------------------------------------------------------------- export class PublicationSearchResult extends React.Component { render() { const display_description = this.props.data[ "pub_description!" ] || this.props.data.pub_description ; const publ = gAppRef.caches.publishers[ this.props.data.publ_id ] ; const image_url = gAppRef.makeFlaskImageUrl( "publication", this.props.data.pub_image_id, true ) ; let tags = [] ; if ( this.props.data[ "tags!" ] ) { // the backend has provided us with a list of tags (possibly highlighted) - use them directly // NOTE: We don't normally show HTML in tags, but in this case we need to, in order to be able to highlight // matching search terms. This will have the side-effect of rendering any HTML that may be in the tag, // but we can live with that. this.props.data[ "tags!" ].map( t => tags.push(
) ) ; } else { if ( this.props.data.pub_tags ) { this.props.data.pub_tags.map( t => tags.push(
{t}
) ) ; } } const menu = ( Edit Delete ) ; return (
gAppRef.setTestAttribute( r, "pub_id", this.props.data.pub_id ) } >
{menu} { publ && {publ.publ_name} } { this.props.data.pub_url && Open publication. }
{ image_url && Publication. }
{ this.props.data.pub_date &&
{this.props.data.pub_date}
} { tags.length > 0 &&
{tags}
}
) ; } static onNewPublication( notify ) { PublicationSearchResult2._doEditPublication( {}, null, (newVals,refs) => { axios.post( gAppRef.makeFlaskUrl( "/publication/create", {list:1} ), newVals ) .then( resp => { // update the caches gAppRef.caches.publications = resp.data.publications ; gAppRef.caches.tags = resp.data.tags ; // unload any updated values applyUpdatedVals( newVals, newVals, resp.data.updated, refs ) ; // update the UI with the new details notify( resp.data.pub_id, newVals ) ; if ( resp.data.warnings ) gAppRef.showWarnings( "The new publication was created OK.", resp.data.warnings ) ; else gAppRef.showInfoToast(
The new publication was created OK.
) ; gAppRef.closeModalForm() ; } ) .catch( err => { gAppRef.showErrorMsg(
Couldn't create the publication:
{err.toString()}
) ; } ) ; } ) ; } onEditPublication() { // get the articles for this publication axios.get( gAppRef.makeFlaskUrl( "/publication/" + this.props.data.pub_id + "/articles" ) ) .then( resp => { let articles = resp.data ; // nb: _doEditPublication() might modify this list PublicationSearchResult2._doEditPublication( this.props.data, articles, (newVals,refs) => { // send the updated details to the server newVals.pub_id = this.props.data.pub_id ; newVals.article_order = articles.map( a => a.article_id ) ; axios.post( gAppRef.makeFlaskUrl( "/publication/update", {list:1} ), newVals ) .then( resp => { // update the caches gAppRef.caches.publications = resp.data.publications ; gAppRef.caches.tags = resp.data.tags ; // update the UI with the new details applyUpdatedVals( this.props.data, newVals, resp.data.updated, refs ) ; removeSpecialFields( this.props.data ) ; this.forceUpdate() ; if ( resp.data.warnings ) gAppRef.showWarnings( "The publication was updated OK.", resp.data.warnings ) ; else gAppRef.showInfoToast(
The publication was updated OK.
) ; gAppRef.closeModalForm() ; } ) .catch( err => { gAppRef.showErrorMsg(
Couldn't update the publication:
{err.toString()}
) ; } ) ; } ) ; } ) .catch( err => { gAppRef.showErrorMsg(
Couldn't load the articles:
{err.toString()}
) ; } ) ; } onDeletePublication() { let doDelete = ( nArticles ) => { // confirm the operation let warning ; if ( typeof nArticles === "number" ) { if ( nArticles === 0 ) warning =
No articles will be deleted.
; else warning =
{ pluralString(nArticles,"associated article") + " will also be deleted." }
; } else { warning = (
Error. WARNING: Couldn't check if any associated articles will be deleted:
{nArticles.toString()}
) ; } const content = (
Delete this publication?
{warning}
) ; gAppRef.ask( content, "ask", { "OK": () => { // delete the publication on the server axios.get( gAppRef.makeFlaskUrl( "/publication/delete/" + this.props.data.pub_id, {list:1} ) ) .then( resp => { // update the caches gAppRef.caches.publications = resp.data.publications ; gAppRef.caches.tags = resp.data.tags ; // update the UI this.props.onDelete( "pub_id", this.props.data.pub_id ) ; resp.data.deleteArticles.forEach( article_id => { this.props.onDelete( "article_id", article_id ) ; } ) ; if ( resp.data.warnings ) gAppRef.showWarnings( "The publication was deleted.", resp.data.warnings ) ; else gAppRef.showInfoToast(
The publication was deleted.
) ; } ) .catch( err => { gAppRef.showErrorToast(
Couldn't delete the publication:
{err.toString()}
) ; } ) ; }, "Cancel": null, } ) ; } // get the publication details axios.get( gAppRef.makeFlaskUrl( "/publication/" + this.props.data.pub_id ) ) .then( resp => { doDelete( resp.data.nArticles ) ; } ) .catch( err => { doDelete( err ) ; } ) ; } static makeDisplayName( vals, allowAlternateContent ) { let pub_name = null ; if ( allowAlternateContent && vals["pub_name!"] ) pub_name = vals[ "pub_name!" ] ; if ( ! pub_name ) pub_name = vals.pub_name ; if ( vals.pub_edition ) return pub_name + " (" + vals.pub_edition + ")" ; else return pub_name ; } _makeDisplayName( allowAlternateContent ) { return PublicationSearchResult.makeDisplayName( this.props.data, allowAlternateContent ) ; } }