diff --git a/src/components/database/item-type/book/BookDetail.tsx b/src/components/database/item-type/book/BookDetail.tsx index 0a727ef..adbcf36 100644 --- a/src/components/database/item-type/book/BookDetail.tsx +++ b/src/components/database/item-type/book/BookDetail.tsx @@ -1,46 +1,34 @@ -import React, { ReactNode } from 'react'; -import ItemTypeField from '../lib/field'; +import React from 'react'; import { ItemBook } from '../../lib/ItemUtil'; +import DetailBase, { DetailBaseProps } from '../lib/DetailBase'; +import ItemTypeField from '../lib/field'; -const BookDetail = (props: { item: ItemBook }) => { - const { item } = props; - const fields: { label: ReactNode, value: ReactNode }[] = [ - { label: 'ID', value: item.doi }, - { label: 'Language', value: }, - { label: 'Title', value: item.title }, - { label: 'Free Keywords', value: }, - { label: 'Description', value: }, - { label: 'Last Modified Date', value: }, - { label: 'Created Date', value: }, - { label: 'Contributor', value: }, - { label: 'Item Type', value: item.item_type_display_name }, - { label: 'Change Log(History)', value: }, - { label: 'Author', value: }, - { label: 'Editor', value: item.editor }, - { label: 'Publisher', value: item.publisher }, - { label: 'Publication Year', value: item.publication_year }, - { label: 'URL', value: {item.url} }, - { label: 'PDF File', value: }, - { label: 'Index', value: }, - { label: 'Related to', value: }, - ]; - let evenodd = 'even'; - const elements = fields.map((value, i) => { - evenodd = evenodd === 'even' ? 'odd' : 'even' - return ( - - {value.label} - {value.value} - - ) - }); - return ( - - - {elements} - -
- ); -}; +class BookDetail extends DetailBase { + + constructor(props: DetailBaseProps) { + super(props); + const item = this.item as ItemBook; + this.fields = [ + { label: 'ID', value: item.doi }, + { label: 'Language', value: }, + { label: 'Title', value: item.title }, + { label: 'Free Keywords', value: }, + { label: 'Description', value: }, + { label: 'Last Modified Date', value: }, + { label: 'Created Date', value: }, + { label: 'Contributor', value: }, + { label: 'Item Type', value: item.item_type_display_name }, + { label: 'Change Log(History)', value: }, + { label: 'Author', value: }, + { label: 'Editor', value: item.editor }, + { label: 'Publisher', value: item.publisher }, + { label: 'Publication Year', value: item.publication_year }, + { label: 'URL', value: {item.url} }, + { label: 'PDF File', value: }, + { label: 'Index', value: }, + { label: 'Related to', value: }, + ]; + } +} export default BookDetail; diff --git a/src/components/database/item-type/conference/ConferenceDetail.tsx b/src/components/database/item-type/conference/ConferenceDetail.tsx index cda87c0..915369c 100644 --- a/src/components/database/item-type/conference/ConferenceDetail.tsx +++ b/src/components/database/item-type/conference/ConferenceDetail.tsx @@ -1,47 +1,35 @@ -import React, { ReactNode } from 'react'; -import ItemTypeField from '../lib/field'; +import React from 'react'; import { ItemConference } from '../../lib/ItemUtil'; +import DetailBase, { DetailBaseProps } from '../lib/DetailBase'; +import ItemTypeField from '../lib/field'; import ConferenceUtil from './ConferenceUtil'; -const ConferenceDetail = (props: { item: ItemConference }) => { - const { item } = props; - const fields: { label: ReactNode, value: ReactNode }[] = [ - { label: 'ID', value: item.doi }, - { label: 'Language', value: }, - { label: 'Conference Title', value: item.conference_title }, - { label: 'Place', value: item.place }, - { label: 'Date', value: }, - { label: 'Last Modified Date', value: }, - { label: 'Created Date', value: }, - { label: 'Contributor', value: }, - { label: 'Item Type', value: item.item_type_display_name }, - { label: 'Change Log(History)', value: }, - { label: 'Presentation Title', value: item.title }, - { label: 'Author', value: }, - { label: 'Abstract', value: }, - { label: 'Presentation File', value: }, - { label: 'Presentation Type', value: }, - { label: 'Conference Paper', value: }, - { label: 'Index', value: }, - { label: 'Related to', value: }, - ]; - let evenodd = 'even'; - const elements = fields.map((value, i) => { - evenodd = evenodd === 'even' ? 'odd' : 'even' - return ( - - {value.label} - {value.value} - - ) - }); - return ( - - - {elements} - -
- ); -}; +class ConferenceDetail extends DetailBase { + + constructor(props: DetailBaseProps) { + super(props); + const item = this.item as ItemConference; + this.fields = [ + { label: 'ID', value: item.doi }, + { label: 'Language', value: }, + { label: 'Conference Title', value: item.conference_title }, + { label: 'Place', value: item.place }, + { label: 'Date', value: }, + { label: 'Last Modified Date', value: }, + { label: 'Created Date', value: }, + { label: 'Contributor', value: }, + { label: 'Item Type', value: item.item_type_display_name }, + { label: 'Change Log(History)', value: }, + { label: 'Presentation Title', value: item.title }, + { label: 'Author', value: }, + { label: 'Abstract', value: }, + { label: 'Presentation File', value: }, + { label: 'Presentation Type', value: }, + { label: 'Conference Paper', value: }, + { label: 'Index', value: }, + { label: 'Related to', value: }, + ]; + } +} export default ConferenceDetail; \ No newline at end of file diff --git a/src/components/database/item-type/data/DataDetail.tsx b/src/components/database/item-type/data/DataDetail.tsx index efbb397..938e0c5 100644 --- a/src/components/database/item-type/data/DataDetail.tsx +++ b/src/components/database/item-type/data/DataDetail.tsx @@ -1,48 +1,36 @@ -import React, { ReactNode } from 'react'; -import ItemTypeField from '../lib/field'; +import React from 'react'; import { ItemData } from '../../lib/ItemUtil'; +import DetailBase, { DetailBaseProps } from '../lib/DetailBase'; +import ItemTypeField from '../lib/field'; import DataUtil from './DataUtil'; -const DataDetail = (props: { item: ItemData }) => { - const { item } = props; - const fields: { label: ReactNode, value: ReactNode }[] = [ - { label: 'ID', value: item.doi }, - { label: 'Language', value: }, - { label: 'Title', value: item.title }, - { label: 'Free Keywords', value: }, - { label: 'Description', value: }, - { label: 'Date', value: }, - { label: 'Last Modified Date', value: }, - { label: 'Created Date', value: }, - { label: 'Contributor', value: }, - { label: 'Item Type', value: item.item_type_display_name }, - { label: 'Change Log(History)', value: }, - { label: 'Data Type', value: }, - { label: 'Experimenter', value: }, - { label: 'Preview', value: }, - { label: 'Data File', value: }, - { label: 'Readme', value: }, - { label: 'Rights', value: }, - { label: 'Index', value: }, - { label: 'Related to', value: }, - ]; - let evenodd = 'even'; - const elements = fields.map((value, i) => { - evenodd = evenodd === 'even' ? 'odd' : 'even' - return ( - - {value.label} - {value.value} - - ) - }); - return ( - - - {elements} - -
- ); -}; +class DataDetail extends DetailBase { + + constructor(props: DetailBaseProps) { + super(props); + const item = this.item as ItemData; + this.fields = [ + { label: 'ID', value: item.doi }, + { label: 'Language', value: }, + { label: 'Title', value: item.title }, + { label: 'Free Keywords', value: }, + { label: 'Description', value: }, + { label: 'Date', value: }, + { label: 'Last Modified Date', value: }, + { label: 'Created Date', value: }, + { label: 'Contributor', value: }, + { label: 'Item Type', value: item.item_type_display_name }, + { label: 'Change Log(History)', value: }, + { label: 'Data Type', value: }, + { label: 'Experimenter', value: }, + { label: 'Preview', value: }, + { label: 'Data File', value: }, + { label: 'Readme', value: }, + { label: 'Rights', value: }, + { label: 'Index', value: }, + { label: 'Related to', value: }, + ]; + } +} export default DataDetail; \ No newline at end of file diff --git a/src/components/database/item-type/lib/DetailBase.tsx b/src/components/database/item-type/lib/DetailBase.tsx new file mode 100644 index 0000000..389690c --- /dev/null +++ b/src/components/database/item-type/lib/DetailBase.tsx @@ -0,0 +1,40 @@ +import React, { ReactNode, Component } from 'react'; +import ItemUtil, { Item } from '../../lib/ItemUtil'; + +export interface DetailBaseProps { item: Item } +export interface DetailBaseField { label: ReactNode, value: ReactNode } + +class DetailBase extends Component { + + protected item: Item; + protected fields: DetailBaseField[] = []; + protected url: string; + + constructor(props: DetailBaseProps) { + super(props); + this.item = props.item; + this.url = ItemUtil.getUrl(this.item); + } + + render() { + let evenodd = 'even'; + const elements = this.fields.map((value, i) => { + evenodd = evenodd === 'even' ? 'odd' : 'even' + return ( + + {value.label} + {value.value} + + ) + }); + return ( + + + {elements} + +
+ ); + } +} + +export default DetailBase; diff --git a/src/components/database/item-type/lib/ListBase.tsx b/src/components/database/item-type/lib/ListBase.tsx index cfdd67c..398f3b2 100644 --- a/src/components/database/item-type/lib/ListBase.tsx +++ b/src/components/database/item-type/lib/ListBase.tsx @@ -8,7 +8,7 @@ class ListBase extends Component { protected item: Item; protected label = ''; protected icon = ''; - protected url = ''; + protected url: string; constructor(props: ListBaseProps) { super(props); diff --git a/src/components/database/item-type/model/ModelDetail.tsx b/src/components/database/item-type/model/ModelDetail.tsx index 95d5495..18e1f81 100644 --- a/src/components/database/item-type/model/ModelDetail.tsx +++ b/src/components/database/item-type/model/ModelDetail.tsx @@ -1,47 +1,35 @@ -import React, { ReactNode } from 'react'; -import ItemTypeField from '../lib/field'; +import React from 'react'; import { ItemModel } from '../../lib/ItemUtil'; +import DetailBase, { DetailBaseProps } from '../lib/DetailBase'; +import ItemTypeField from '../lib/field'; import ModelUtil from './ModelUtil'; -const ModelDetail = (props: { item: ItemModel }) => { - const { item } = props; - const fields: { label: ReactNode, value: ReactNode }[] = [ - { label: 'ID', value: item.doi }, - { label: 'Language', value: }, - { label: 'Title', value: item.title }, - { label: 'Free Keywords', value: }, - { label: 'Description', value: }, - { label: 'Last Modified Date', value: }, - { label: 'Created Date', value: }, - { label: 'Contributor', value: }, - { label: 'Item Type', value: item.item_type_display_name }, - { label: 'Change Log(History)', value: }, - { label: 'Model Type', value: }, - { label: 'Creator', value: }, - { label: 'Preview', value: }, - { label: 'Model File', value: }, - { label: 'Readme', value: }, - { label: 'Rights', value: }, - { label: 'Index', value: }, - { label: 'Related to', value: }, - ]; - let evenodd = 'even'; - const elements = fields.map((value, i) => { - evenodd = evenodd === 'even' ? 'odd' : 'even' - return ( - - {value.label} - {value.value} - - ) - }); - return ( - - - {elements} - -
- ); -}; +class ModelDetail extends DetailBase { + + constructor(props: DetailBaseProps) { + super(props); + const item = this.item as ItemModel; + this.fields = [ + { label: 'ID', value: item.doi }, + { label: 'Language', value: }, + { label: 'Title', value: item.title }, + { label: 'Free Keywords', value: }, + { label: 'Description', value: }, + { label: 'Last Modified Date', value: }, + { label: 'Created Date', value: }, + { label: 'Contributor', value: }, + { label: 'Item Type', value: item.item_type_display_name }, + { label: 'Change Log(History)', value: }, + { label: 'Model Type', value: }, + { label: 'Creator', value: }, + { label: 'Preview', value: }, + { label: 'Model File', value: }, + { label: 'Readme', value: }, + { label: 'Rights', value: }, + { label: 'Index', value: }, + { label: 'Related to', value: }, + ]; + } +} export default ModelDetail; \ No newline at end of file diff --git a/src/components/database/item-type/paper/PaperDetail.tsx b/src/components/database/item-type/paper/PaperDetail.tsx index 8a3e77a..c6f0822 100644 --- a/src/components/database/item-type/paper/PaperDetail.tsx +++ b/src/components/database/item-type/paper/PaperDetail.tsx @@ -1,48 +1,36 @@ -import React, { ReactNode } from 'react'; -import ItemTypeField from '../lib/field'; +import React from 'react'; import { ItemPaper } from '../../lib/ItemUtil'; +import DetailBase, { DetailBaseProps } from '../lib/DetailBase'; +import ItemTypeField from '../lib/field'; import PaperUtil from './PaperUtil'; -const PaperDetail = (props: { item: ItemPaper }) => { - const { item } = props; - const fields: { label: ReactNode, value: ReactNode }[] = [ - { label: 'ID', value: item.doi }, - { label: 'Language', value: }, - { label: 'PubmedID', value: }, - { label: 'Title', value: item.title }, - { label: 'Free Keywords', value: }, - { label: 'Description', value: }, - { label: 'Last Modified Date', value: }, - { label: 'Created Date', value: }, - { label: 'Contributor', value: }, - { label: 'Item Type', value: item.item_type_display_name }, - { label: 'Change Log(History)', value: }, - { label: 'Author', value: }, - { label: 'Journal', value: item.journal }, - { label: 'Publication Year', value: item.publication_year }, - { label: 'Volume', value: item.volume }, - { label: 'Number', value: item.number }, - { label: 'Page', value: item.page }, - { label: 'Index', value: }, - { label: 'Related to', value: }, - ]; - let evenodd = 'even'; - const elements = fields.map((value, i) => { - evenodd = evenodd === 'even' ? 'odd' : 'even' - return ( - - {value.label} - {value.value} - - ) - }); - return ( - - - {elements} - -
- ); -}; +class PaperDetail extends DetailBase { + + constructor(props: DetailBaseProps) { + super(props); + const item = this.item as ItemPaper; + this.fields = [ + { label: 'ID', value: item.doi }, + { label: 'Language', value: }, + { label: 'PubmedID', value: }, + { label: 'Title', value: item.title }, + { label: 'Free Keywords', value: }, + { label: 'Description', value: }, + { label: 'Last Modified Date', value: }, + { label: 'Created Date', value: }, + { label: 'Contributor', value: }, + { label: 'Item Type', value: item.item_type_display_name }, + { label: 'Change Log(History)', value: }, + { label: 'Author', value: }, + { label: 'Journal', value: item.journal }, + { label: 'Publication Year', value: item.publication_year }, + { label: 'Volume', value: item.volume }, + { label: 'Number', value: item.number }, + { label: 'Page', value: item.page }, + { label: 'Index', value: }, + { label: 'Related to', value: }, + ]; + } +} export default PaperDetail; \ No newline at end of file diff --git a/src/components/database/item-type/url/UrlDetail.tsx b/src/components/database/item-type/url/UrlDetail.tsx index 8db7658..e93cf2f 100644 --- a/src/components/database/item-type/url/UrlDetail.tsx +++ b/src/components/database/item-type/url/UrlDetail.tsx @@ -1,43 +1,31 @@ -import React, { ReactNode } from 'react'; -import ItemTypeField from '../lib/field'; +import React from 'react'; import { ItemUrl } from '../../lib/ItemUtil'; +import DetailBase, { DetailBaseProps } from '../lib/DetailBase'; +import ItemTypeField from '../lib/field'; import UrlUtil from './UrlUtil'; -const UrlDetail = (props: { item: ItemUrl }) => { - const { item } = props; - const fields: { label: ReactNode, value: ReactNode }[] = [ - { label: 'ID', value: item.doi }, - { label: 'Language', value: }, - { label: 'Title', value: item.title }, - { label: 'Free Keywords', value: }, - { label: 'Description', value: }, - { label: 'Last Modified Date', value: }, - { label: 'Created Date', value: }, - { label: 'Contributor', value: }, - { label: 'Item Type', value: item.item_type_display_name }, - { label: 'Change Log(History)', value: }, - { label: 'URL', value: {item.url} }, - { label: 'Banner File', value: }, - { label: 'Index', value: }, - { label: 'Related to', value: }, - ]; - let evenodd = 'even'; - const elements = fields.map((value, i) => { - evenodd = evenodd === 'even' ? 'odd' : 'even' - return ( - - {value.label} - {value.value} - - ) - }); - return ( - - - {elements} - -
- ); -}; +class UrlDetail extends DetailBase { -export default UrlDetail; + constructor(props: DetailBaseProps) { + super(props); + const item = this.item as ItemUrl; + this.fields = [ + { label: 'ID', value: item.doi }, + { label: 'Language', value: }, + { label: 'Title', value: item.title }, + { label: 'Free Keywords', value: }, + { label: 'Description', value: }, + { label: 'Last Modified Date', value: }, + { label: 'Created Date', value: }, + { label: 'Contributor', value: }, + { label: 'Item Type', value: item.item_type_display_name }, + { label: 'Change Log(History)', value: }, + { label: 'URL', value: {item.url} }, + { label: 'Banner File', value: }, + { label: 'Index', value: }, + { label: 'Related to', value: }, + ]; + } +} + +export default UrlDetail; \ No newline at end of file