Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
15c4f3093f
|
||
|
|
4ddad68439
|
||
|
|
bed2435ba2
|
||
|
|
a6a98b755a
|
||
|
|
f84be5504e
|
||
|
|
99515ab8e2
|
||
|
|
b7fa3a74cc
|
||
|
|
d8747ee7b3
|
||
|
|
f4ef258dd5
|
+24
-27
@@ -1,32 +1,29 @@
|
||||
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
|
||||
|
||||
# dependencies
|
||||
/node_modules
|
||||
/.pnp
|
||||
.pnp.js
|
||||
|
||||
# testing
|
||||
/coverage
|
||||
|
||||
# production
|
||||
/build
|
||||
|
||||
# misc
|
||||
.DS_Store
|
||||
.env.local
|
||||
.env.development.local
|
||||
.env.test.local
|
||||
.env.production.local
|
||||
.eslintcache
|
||||
|
||||
# Logs
|
||||
logs
|
||||
*.log
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
.eslintcache
|
||||
pnpm-debug.log*
|
||||
lerna-debug.log*
|
||||
|
||||
# database contents
|
||||
/dl-limit-items.csv
|
||||
/public/database
|
||||
node_modules
|
||||
dist
|
||||
dist-ssr
|
||||
coverage
|
||||
*.local
|
||||
|
||||
# Editor directories and files
|
||||
.vscode/*
|
||||
!.vscode/extensions.json
|
||||
.idea
|
||||
.DS_Store
|
||||
*.suo
|
||||
*.ntvs*
|
||||
*.njsproj
|
||||
*.sln
|
||||
*.sw?
|
||||
|
||||
# Converted XOOPS data, symlinked in from the archive storage
|
||||
/public/modules
|
||||
/public/uploads
|
||||
/src/database/assets/*.json
|
||||
/src/customs/assets/*.json
|
||||
|
||||
@@ -1,44 +1,85 @@
|
||||
This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app).
|
||||
# BSI-Neuroinformatics
|
||||
|
||||
## Available Scripts
|
||||
RIKEN BSI Research Database Portal — a [Vite](https://vite.dev/) + React + TypeScript single page application.
|
||||
|
||||
In the project directory, you can run:
|
||||
## Requirements
|
||||
|
||||
### `npm start`
|
||||
- Node.js 22.22.2+ / 24.15+ / 26+ (developed on Node 24)
|
||||
- npm
|
||||
|
||||
Runs the app in the development mode.<br>
|
||||
Open [http://localhost:3000](http://localhost:3000) to view it in the browser.
|
||||
## Setup
|
||||
|
||||
The page will reload if you make edits.<br>
|
||||
You will also see any lint errors in the console.
|
||||
```sh
|
||||
npm install
|
||||
```
|
||||
|
||||
### `npm test`
|
||||
The converted XOOPS data (`modules/`, `uploads/`) is not tracked in git and is not part of the
|
||||
build. Symlink it into `public/` so the dev server can serve it:
|
||||
|
||||
Launches the test runner in the interactive watch mode.<br>
|
||||
See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information.
|
||||
```sh
|
||||
ln -s ../../static-contents/modules public/modules
|
||||
ln -s ../../static-contents/uploads public/uploads
|
||||
```
|
||||
|
||||
That assumes the repository is checked out next to `static-contents/`:
|
||||
|
||||
```
|
||||
bsi-ni.brain.riken.jp/
|
||||
├── bsi-ni.brain.riken.jp/ this repository
|
||||
└── static-contents/ modules/ and uploads/
|
||||
```
|
||||
|
||||
That data is produced by [xoops-static-exporter](https://git.ni.riken.jp/niu/xoops-static-exporter)
|
||||
(`sites/bsi-ni.brain.riken.jp/`).
|
||||
|
||||
## Scripts
|
||||
|
||||
### `npm run dev`
|
||||
|
||||
Starts the Vite dev server on [http://localhost:5173](http://localhost:5173) with hot module replacement.
|
||||
|
||||
### `npm run build`
|
||||
|
||||
Builds the app for production to the `build` folder.<br>
|
||||
It correctly bundles React in production mode and optimizes the build for the best performance.
|
||||
Type-checks the project (`tsc -b`) and builds the production bundle into `dist/`.
|
||||
|
||||
The build is minified and the filenames include the hashes.<br>
|
||||
Your app is ready to be deployed!
|
||||
### `npm run preview`
|
||||
|
||||
See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information.
|
||||
Serves the contents of `dist/` locally to verify a production build.
|
||||
|
||||
### `npm run eject`
|
||||
### `npm run typecheck`
|
||||
|
||||
**Note: this is a one-way operation. Once you `eject`, you can’t go back!**
|
||||
Runs the TypeScript project references build without emitting output.
|
||||
|
||||
If you aren’t satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project.
|
||||
### `npm run lint` / `npm run format` / `npm run check`
|
||||
|
||||
Instead, it will copy all the configuration files and the transitive dependencies (Webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point you’re on your own.
|
||||
Runs [Biome](https://biomejs.dev/) (`biome.json`): `lint` reports problems, `format` rewrites
|
||||
formatting, and `check` applies both plus import sorting.
|
||||
|
||||
You don’t have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn’t feel obligated to use this feature. However we understand that this tool wouldn’t be useful if you couldn’t customize it when you are ready for it.
|
||||
## Deployment
|
||||
|
||||
`npm run build` writes a static bundle to `dist/` (a few MB). The archive data is deliberately left
|
||||
out of it: `build.copyPublicDir` is off and only the real files in `public/` are emitted, so the
|
||||
symlinked `modules/` and `uploads/` are skipped.
|
||||
|
||||
On the server, place `dist/` at the document root and symlink the archive data into it:
|
||||
|
||||
```sh
|
||||
ln -s /path/to/archive/modules /var/www/bsi-ni/modules
|
||||
ln -s /path/to/archive/uploads /var/www/bsi-ni/uploads
|
||||
```
|
||||
|
||||
Apache needs `Options FollowSymLinks` and `Require all granted` on the archive directory.
|
||||
|
||||
Use symlinks rather than `Alias`. An `Alias /modules ...` maps the URL outside the document root,
|
||||
so `public/.htaccess` no longer applies to it and every legacy `/modules/<module>/*.php` URL stops
|
||||
reaching the SPA redirect handler. With symlinks the existing precedence still holds: real files
|
||||
are served directly, everything else falls through to `index.html`.
|
||||
|
||||
Because the app uses HTML5 history routing, the web server must fall back to `index.html` for
|
||||
unknown paths — see `public/.htaccess`.
|
||||
|
||||
## Learn More
|
||||
|
||||
You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started).
|
||||
|
||||
To learn React, check out the [React documentation](https://reactjs.org/).
|
||||
- [Vite documentation](https://vite.dev/guide/)
|
||||
- [React documentation](https://react.dev/)
|
||||
- [React Router documentation](https://reactrouter.com/)
|
||||
|
||||
+39
@@ -0,0 +1,39 @@
|
||||
{
|
||||
"$schema": "https://biomejs.dev/schemas/2.5.13/schema.json",
|
||||
"vcs": {
|
||||
"enabled": true,
|
||||
"clientKind": "git",
|
||||
"useIgnoreFile": true
|
||||
},
|
||||
"files": {
|
||||
"includes": ["**", "!**/dist", "!public/modules", "!public/uploads", "!src/common/assets"]
|
||||
},
|
||||
"formatter": {
|
||||
"enabled": true,
|
||||
"indentStyle": "space",
|
||||
"indentWidth": 4,
|
||||
"lineWidth": 120
|
||||
},
|
||||
"javascript": {
|
||||
"formatter": {
|
||||
"quoteStyle": "single",
|
||||
"jsxQuoteStyle": "double",
|
||||
"semicolons": "always",
|
||||
"trailingCommas": "es5",
|
||||
"arrowParentheses": "always"
|
||||
}
|
||||
},
|
||||
"linter": {
|
||||
"enabled": true,
|
||||
"rules": {
|
||||
"preset": "recommended"
|
||||
}
|
||||
},
|
||||
"assist": {
|
||||
"actions": {
|
||||
"source": {
|
||||
"organizeImports": "on"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,197 +0,0 @@
|
||||
<?php
|
||||
|
||||
require_once __DIR__.'/config.inc.php';
|
||||
|
||||
define('PROTECTOR_SKIP_DOS_CHECK', 1);
|
||||
define('PROTECTOR_SKIP_FILESCHECKER', 1);
|
||||
|
||||
// disable query logger
|
||||
define('XOOPS_LOGGER_ADDQUERY_DISABLED', true);
|
||||
|
||||
// ----
|
||||
if (!file_exists($mainfile)) {
|
||||
echo 'ERROR : mainfile.php not found'.PHP_EOL;
|
||||
exit(1);
|
||||
}
|
||||
$xoops_path = '';
|
||||
$xoops_url = '';
|
||||
|
||||
foreach (file($mainfile) as $line) {
|
||||
if (preg_match('/^\s*define\s*\(\s*[\'"]XOOPS_ROOT_PATH[\'"]\s*,\s*[\'"](.+)[\'"]\)\s*;\s*$/', $line, $matches)) {
|
||||
$xoops_path = $matches[1];
|
||||
}
|
||||
if (preg_match('/^\s*define\s*\(\s*[\'"]XOOPS_URL[\'"]\s*,\s*[\'"](.+)[\'"]\)\s*;\s*$/', $line, $matches)) {
|
||||
$xoops_url = $matches[1];
|
||||
}
|
||||
}
|
||||
|
||||
if (isset($method) && 'POST' == strtoupper($method)) {
|
||||
$method = 'POST';
|
||||
} else {
|
||||
$method = 'GET';
|
||||
}
|
||||
$_SERVER['HTTP_USER_AGENT'] = 'php-cli';
|
||||
$_SERVER['REQUEST_METHOD'] = $method;
|
||||
$_ENV['HTTP_REFERER'] = $xoops_url.'/index.php';
|
||||
$_SERVER['QUERY_STRING'] = '/index.php';
|
||||
$_SERVER['REMOTE_ADDR'] = '192.168.0.1';
|
||||
|
||||
if (file_exists($xoops_path.'/modules/xoonips/include/common.inc.php')) {
|
||||
require_once $xoops_path.'/modules/xoonips/include/common.inc.php';
|
||||
} else {
|
||||
require_once $xoops_path.'/mainfile.php';
|
||||
require_once $xoops_path.'/modules/xoonips/condefs.php';
|
||||
require_once $xoops_path.'/modules/xoonips/include/functions.php';
|
||||
}
|
||||
|
||||
if (defined('XOOPS_DB_PROXY') && XOOPS_DB_PROXY == 1 && 'POST' == $method) {
|
||||
die('Error: not accept POST request'."\n");
|
||||
}
|
||||
|
||||
error_reporting(E_ALL);
|
||||
|
||||
// remove ob fileters
|
||||
while (ob_get_level()) {
|
||||
ob_end_clean();
|
||||
}
|
||||
|
||||
define('MYDUMPTOOL_OUTPUTDIR', __DIR__.'/data');
|
||||
MyDumpTool::makeDirectory('');
|
||||
MyDumpTool::makeDirectory('src');
|
||||
MyDumpTool::makeDirectory('public');
|
||||
|
||||
class MyDumpTool
|
||||
{
|
||||
public static function decode(&$data)
|
||||
{
|
||||
$textutil = xoonips_getutility('text');
|
||||
foreach ($data as $k => $v) {
|
||||
if (is_string($v)) {
|
||||
$v = $textutil->html_numeric_entities($v);
|
||||
$v = mb_decode_numericentity($v, array(0x0, 0x10000, 0, 0xfffff), 'UTF-8');
|
||||
$data[$k] = \Normalizer::normalize(trim($v), \Normalizer::FORM_C);
|
||||
} elseif (null === $v) {
|
||||
$data[$k] = '';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static function convertToInt(&$data, $keys, $zerofill = false)
|
||||
{
|
||||
foreach ($keys as $key) {
|
||||
if (isset($data[$key])) {
|
||||
$data[$key] = '' === $data[$key] ? ($zerofill ? 0 : null) : (int) $data[$key];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static function dropColumn(&$data, $keys)
|
||||
{
|
||||
foreach ($keys as $key) {
|
||||
if (isset($data[$key])) {
|
||||
unset($data[$key]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static function fileCopy($from, $to)
|
||||
{
|
||||
system('rsync -aq '.escapeshellarg($from).' '.escapeshellarg($to), $ret);
|
||||
|
||||
return 0 === $ret;
|
||||
}
|
||||
|
||||
public static function fixHtml($text)
|
||||
{
|
||||
static $config = [
|
||||
//'clean' => true,
|
||||
'hide-comments' => true,
|
||||
'indent' => true,
|
||||
'output-xhtml' => true,
|
||||
'preserve-entities' => true,
|
||||
'show-body-only' => true,
|
||||
'wrap' => 0,
|
||||
'input-encoding' => 'utf8',
|
||||
'output-encoding' => 'utf8',
|
||||
'output-bom' => false,
|
||||
];
|
||||
$text = tidy_repair_string($text, $config);
|
||||
$text = preg_replace('/<table([^>]*)>((?:\s*<caption[^>]*>.*<\/caption>)?\s*)<tr([^>]*)>/Us', '<table\1>\2<tbody><tr\3>', $text);
|
||||
$text = preg_replace('/<\/tr>(\s*)<\/table>/s', '</tr></tbody>\1</table>', $text);
|
||||
|
||||
return $text;
|
||||
}
|
||||
|
||||
public static function tableExists($name)
|
||||
{
|
||||
global $xoopsDB;
|
||||
$prefix = $xoopsDB->prefix();
|
||||
$sql = <<< SQL
|
||||
SELECT 1
|
||||
FROM `${prefix}_${name}`
|
||||
LIMIT 1
|
||||
SQL;
|
||||
if (!($res = $xoopsDB->query($sql))) {
|
||||
return false;
|
||||
}
|
||||
$xoopsDB->freeRecordSet($res);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public static function makeDirectory($dirname)
|
||||
{
|
||||
$path = MYDUMPTOOL_OUTPUTDIR.('' !== $dirname ? '/'.$dirname : '');
|
||||
if (!is_dir($path)) {
|
||||
if (!@mkdir($path)) {
|
||||
exit('Failed to create directory: '.$path.PHP_EOL);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static function saveJson($fname, $data)
|
||||
{
|
||||
$path = MYDUMPTOOL_OUTPUTDIR.'/'.$fname;
|
||||
if (false === file_put_contents($path, json_encode($data, JSON_UNESCAPED_UNICODE))) {
|
||||
exit('Failed to save json file: '.$path.PHP_EOL);
|
||||
}
|
||||
}
|
||||
|
||||
public static function fileDownload($url, $fpath)
|
||||
{
|
||||
$fp = fopen($fpath, 'w');
|
||||
if (false === $fp) {
|
||||
exit('Failed to open file: '.$fpath.PHP_EOL);
|
||||
}
|
||||
$curl = curl_init();
|
||||
curl_setopt($curl, CURLOPT_URL, $url);
|
||||
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
|
||||
curl_setopt($curl, CURLOPT_AUTOREFERER, true);
|
||||
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
|
||||
curl_setopt($curl, CURLOPT_FAILONERROR, true);
|
||||
curl_setopt($curl, CURLOPT_FILE, $fp);
|
||||
curl_setopt($curl, CURLOPT_TIMEOUT, 10);
|
||||
$ret = curl_exec($curl);
|
||||
fclose($fp);
|
||||
if (false === $ret) {
|
||||
exit('Failed to download file, unexpected error: '.$url.PHP_EOL);
|
||||
}
|
||||
$code = curl_getinfo($curl, CURLINFO_HTTP_CODE);
|
||||
if (200 !== $code) {
|
||||
exit('Failed to download file, invalid status code('.$code.'): '.$url.PHP_EOL);
|
||||
}
|
||||
curl_close($curl);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public static function getMimeType($fpath)
|
||||
{
|
||||
$finfo = finfo_open(FILEINFO_MIME);
|
||||
$mime = finfo_file($finfo, $fpath);
|
||||
finfo_close($finfo);
|
||||
$mime = preg_replace('/(;.*)$/', '', $mime);
|
||||
|
||||
return $mime;
|
||||
}
|
||||
}
|
||||
@@ -1,9 +0,0 @@
|
||||
<?php
|
||||
|
||||
$mainfile = '/data/www/html/mainfile.php';
|
||||
|
||||
$XOONIPS_SIMPF_LINKFILE = __DIR__.'/simpflink.csv';
|
||||
#$XOOPS_MODULE_D3FORUM = ['forum'];
|
||||
$XOOPS_MODULE_PICO = ['dbtools', 'news', 'about', 'publication', 'contact', 'page'];
|
||||
|
||||
define('XOONIPS_RANNKING_LIMIT', 10);
|
||||
@@ -1,166 +0,0 @@
|
||||
<?php
|
||||
|
||||
require_once __DIR__.'/common.inc.php';
|
||||
|
||||
if (!isset($XOOPS_MODULE_PICO) || empty($XOOPS_MODULE_PICO)) {
|
||||
exit('Not configured for pico module'.PHP_EOL);
|
||||
}
|
||||
|
||||
error_reporting(0);
|
||||
require_once XOOPS_TRUST_PATH.'/modules/pico/include/main_functions.php';
|
||||
require_once XOOPS_TRUST_PATH.'/modules/pico/include/common_functions.php';
|
||||
require_once XOOPS_TRUST_PATH.'/modules/pico/class/pico.textsanitizer.php';
|
||||
require_once XOOPS_TRUST_PATH.'/modules/pico/class/PicoUriMapper.class.php';
|
||||
require_once XOOPS_TRUST_PATH.'/modules/pico/class/PicoPermission.class.php';
|
||||
require_once XOOPS_TRUST_PATH.'/modules/pico/class/PicoModelCategory.class.php';
|
||||
require_once XOOPS_TRUST_PATH.'/modules/pico/class/PicoModelContent.class.php';
|
||||
require_once XOOPS_TRUST_PATH.'/libs/altsys/class/AltsysBreadcrumbs.class.php';
|
||||
error_reporting(E_ALL);
|
||||
|
||||
$config = [];
|
||||
foreach ($XOOPS_MODULE_PICO as $pico) {
|
||||
dumpPico($pico, $config);
|
||||
}
|
||||
MyDumpTool::makeDirectory('src/pico');
|
||||
MyDumpTool::makeDirectory('src/pico/assets');
|
||||
MyDumpTool::saveJson('src/pico/assets/config.json', $config);
|
||||
|
||||
function dumpPico($pico, &$config)
|
||||
{
|
||||
global $xoopsDB;
|
||||
$prefix = $xoopsDB->prefix();
|
||||
$table = $pico.'_contents';
|
||||
if (!MyDumpTool::tableExists($table)) {
|
||||
exit('pico('.$pico.') module not found'.PHP_EOL);
|
||||
}
|
||||
MyDumpTool::makeDirectory('public/'.$pico);
|
||||
MyDumpTool::makeDirectory('public/'.$pico.'/images');
|
||||
$moduleHandler = xoops_gethandler('module');
|
||||
$module = $moduleHandler->getByDirname($pico);
|
||||
$moduleConfigHandler = xoops_gethandler('config');
|
||||
$moduleConfig = $moduleConfigHandler->getConfigsByDirname($pico);
|
||||
$permObj = PicoPermission::getInstance();
|
||||
$perms = $permObj->getPermissions($pico);
|
||||
$categoryHandler = new PicoCategoryHandler($pico, $perms);
|
||||
$contentHandler = new PicoContentHandler($pico);
|
||||
$cats = $categoryHandler->getAllCategories();
|
||||
$confContents = [];
|
||||
$confCategories = [];
|
||||
foreach ($cats as $cat) {
|
||||
$catData = $cat->getData();
|
||||
$modConfig = $cat->getOverriddenModConfig();
|
||||
$link = pico_common_make_category_link4html($modConfig, $catData, $pico);
|
||||
MyDumpTool::decode($catData);
|
||||
$confCategories[] = [
|
||||
'id' => $catData['id'],
|
||||
'title' => $catData['cat_title'],
|
||||
'desc' => (string) $catData['cat_desc'],
|
||||
'pid' => (int) $catData['pid'],
|
||||
'weight' => (int) $catData['cat_weight'],
|
||||
'link' => $link,
|
||||
];
|
||||
$contents = $contentHandler->getCategoryContents($cat);
|
||||
foreach ($contents as $content) {
|
||||
$data = $content->getData();
|
||||
$link = pico_common_make_content_link4html($modConfig, $data);
|
||||
MyDumpTool::decode($data);
|
||||
$content = MyDumpTool::fixHtml($data['body_cached']);
|
||||
$imageId = 1;
|
||||
$dataId = [];
|
||||
$content = preg_replace_callback('/<img ([^>]*)src="(.*)"([^>]*)\/>/Us', function ($matches) use (&$imageId, $pico, $data, $link) {
|
||||
$url = $matches[2];
|
||||
if (!preg_match('/^http/', $url)) {
|
||||
if (preg_match('/^\//', $url)) {
|
||||
$url = XOOPS_URL.$url;
|
||||
} else {
|
||||
$xpath = dirname($link);
|
||||
$url = XOOPS_URL.'/modules/'.$pico.'/'.$xpath.'/'.$url;
|
||||
}
|
||||
}
|
||||
$fname = '/'.$pico.'/images/'.$data['id'].'_'.$imageId.'.dat';
|
||||
$fpath = MYDUMPTOOL_OUTPUTDIR.'/public'.$fname;
|
||||
MyDumpTool::fileDownload($url, $fpath);
|
||||
$mime = MyDumpTool::getMimeType($fpath);
|
||||
switch ($mime) {
|
||||
case 'image/gif':
|
||||
$fpath_ = preg_replace('/.dat$/', '.gif', $fpath);
|
||||
$fname = preg_replace('/.dat$/', '.gif', $fname);
|
||||
rename($fpath, $fpath_);
|
||||
$fpath = $fpath_;
|
||||
break;
|
||||
case 'image/png':
|
||||
$fpath_ = preg_replace('/.dat$/', '.png', $fpath);
|
||||
$fname = preg_replace('/.dat$/', '.png', $fname);
|
||||
rename($fpath, $fpath_);
|
||||
$fpath = $fpath_;
|
||||
break;
|
||||
case 'image/jpeg':
|
||||
$fpath_ = preg_replace('/.dat$/', '.jpeg', $fpath);
|
||||
$fname = preg_replace('/.dat$/', '.jpeg', $fname);
|
||||
rename($fpath, $fpath_);
|
||||
$fpath = $fpath_;
|
||||
break;
|
||||
default:
|
||||
exit('unknown mime type '.$mime.' found: '.$fname.' from '.$url.PHP_EOL);
|
||||
}
|
||||
++$imageId;
|
||||
|
||||
return '<img '.$matches[1].'src="'.$fname.'"'.$matches[3].'/>';
|
||||
}, $content);
|
||||
$content = preg_replace_callback('/<a ([^>]*)href="([^"]+)"([^>]*)>/Us', function ($matches) use (&$dataId, $pico, $data, $link) {
|
||||
$url = $matches[2];
|
||||
if (preg_match('/^(.+)\/([^\/]+\.pdf)(\?.+)?$/', $url, $m)) {
|
||||
if (!isset($dataId[$m[1]])) {
|
||||
$dataId[$m[1]] = count($dataId) + 1;
|
||||
}
|
||||
$id = $dataId[$m[1]];
|
||||
$fname = '/'.$pico.'/data/'.$data['id'].'/'.$id.'/'.urldecode($m[2]);
|
||||
$fpath = MYDUMPTOOL_OUTPUTDIR.'/public'.$fname;
|
||||
if (!file_exists($fpath)) {
|
||||
MyDumpTool::makeDirectory('public/'.$pico.'/data');
|
||||
MyDumpTool::makeDirectory('public/'.$pico.'/data/'.$data['id']);
|
||||
MyDumpTool::makeDirectory('public/'.$pico.'/data/'.$data['id'].'/'.$id);
|
||||
if (preg_match('/^\//', $url)) {
|
||||
$url = XOOPS_URL.$url;
|
||||
}
|
||||
MyDumpTool::fileDownload($url, $fpath);
|
||||
}
|
||||
$url = '/'.$pico.'/data/'.$data['id'].'/'.$id.'/'.$m[2];
|
||||
}
|
||||
|
||||
return '<a '.$matches[1].'href="'.$url.'"'.$matches[3].'>';
|
||||
}, $content);
|
||||
$item = [
|
||||
'id' => $data['id'],
|
||||
'title' => $data['subject_raw'],
|
||||
'content' => $content,
|
||||
'created' => $data['created_time'],
|
||||
'last_update' => $data['modified_time'],
|
||||
'extra' => pico_common_unserialize($data['extra_fields']),
|
||||
];
|
||||
MyDumpTool::saveJson('public/'.$pico.'/'.$data['id'].'.json', $item);
|
||||
$confContents[] = [
|
||||
'id' => $item['id'],
|
||||
'title' => $data['subject_raw'],
|
||||
'cat_id' => (int) $data['cat_id'],
|
||||
'weight' => (int) $data['weight'],
|
||||
'link' => $link,
|
||||
];
|
||||
}
|
||||
}
|
||||
$moduleinfo = [
|
||||
'name' => $module->get('name'),
|
||||
'dirname' => $pico,
|
||||
'message' => $moduleConfig['top_message'],
|
||||
'show_menuinmoduletop' => (int) $moduleConfig['show_menuinmoduletop'],
|
||||
'show_listasindex' => (int) $moduleConfig['show_listasindex'],
|
||||
'show_breadcrumbs' => (int) $moduleConfig['show_breadcrumbs'],
|
||||
'show_pagenavi' => (int) $moduleConfig['show_pagenavi'],
|
||||
];
|
||||
MyDumpTool::decode($moduleinfo);
|
||||
$config[] = [
|
||||
'module' => $moduleinfo,
|
||||
'categories' => $confCategories,
|
||||
'contents' => $confContents,
|
||||
];
|
||||
}
|
||||
-1176
File diff suppressed because it is too large
Load Diff
@@ -1,92 +0,0 @@
|
||||
<?php
|
||||
|
||||
require_once __DIR__.'/common.inc.php';
|
||||
|
||||
if (!isset($XOOPS_MODULE_PICO) || empty($XOOPS_MODULE_PICO)) {
|
||||
exit('Not configured for pico module'.PHP_EOL);
|
||||
}
|
||||
|
||||
$config_fpath = __DIR__.'/data/src/pico/assets/config.json';
|
||||
|
||||
if (!file_exists($config_fpath)) {
|
||||
die('config file not found'.PHP_EOL);
|
||||
}
|
||||
$config = json_decode(file_get_contents($config_fpath), true);
|
||||
|
||||
MyDumpTool::makeDirectory('dist');
|
||||
MyDumpTool::makeDirectory('dist/src');
|
||||
MyDumpTool::makeDirectory('dist/src/custom');
|
||||
MyDumpTool::makeDirectory('dist/src/custom/assets');
|
||||
MyDumpTool::makeDirectory('dist/public');
|
||||
MyDumpTool::makeDirectory('dist/public/uploads');
|
||||
|
||||
// news
|
||||
$news = array_pop(array_filter($config, function ($module) {return $module['module']['dirname'] === 'news';}));
|
||||
$data = [];
|
||||
foreach ($news['contents'] as $meta) {
|
||||
if ($meta['cat_id'] !== 1) {
|
||||
continue;
|
||||
}
|
||||
$content = json_decode(file_get_contents(__DIR__.'/data/public/news/'.$meta['id'].'.json'), true);
|
||||
$data[] = [
|
||||
'id' => $meta['id'],
|
||||
'title' => $meta['title'],
|
||||
'date' => date('Y.m.d', $content['created']),
|
||||
'content' => str_replace('/news/data/40/1/BSI-NI_access201803.pdf', '/uploads/BSI-NI_access201803.pdf', $content['content']),
|
||||
];
|
||||
}
|
||||
$fname = '/uploads/BSI-NI_access201803.pdf';
|
||||
$ifpath = XOOPS_ROOT_PATH.$fname;
|
||||
$ofpath = __DIR__.'/data/dist/public'.$fname;
|
||||
MyDumpTool::fileCopy($ifpath, $ofpath);
|
||||
file_put_contents(__DIR__.'/data/dist/src/custom/assets/news.json', json_encode($data, JSON_UNESCAPED_UNICODE));
|
||||
|
||||
// dbtools
|
||||
MyDumpTool::makeDirectory('dist/public/uploads/dbtools');
|
||||
$dbtools = array_pop(array_filter($config, function ($module) {return $module['module']['dirname'] === 'dbtools';}));
|
||||
$data = [];
|
||||
foreach ($dbtools['contents'] as $meta) {
|
||||
if ($meta['cat_id'] !== 1) {
|
||||
continue;
|
||||
}
|
||||
$content = json_decode(file_get_contents(__DIR__.'/data/public/dbtools/'.$meta['id'].'.json'), true);
|
||||
$summary = trim(preg_replace('/<\/?p[^>]*>/', '', $content['content']));
|
||||
$summary = trim(preg_replace('/\s+/', ' ', $summary));
|
||||
$summary = trim(preg_replace('/(?:\s+)?\[\/(ja|en)\]\s+\[(ja|en)\](?:\s+)?/', '[/\1][\2]', $summary));
|
||||
$image0 = '/uploads/dbtools/imagefile_0_'.$content['extra']['imagefile'];
|
||||
$ifpath = XOOPS_ROOT_PATH.$image0;
|
||||
$ofpath = __DIR__.'/data/dist/public'.$image0;
|
||||
MyDumpTool::fileCopy($ifpath, $ofpath);
|
||||
$image1 = '/uploads/dbtools/imagefiles_1_'.$content['extra']['imagefiles'];
|
||||
$ifpath = XOOPS_ROOT_PATH.$image1;
|
||||
$ofpath = __DIR__.'/data/dist/public'.$image1;
|
||||
MyDumpTool::fileCopy($ifpath, $ofpath);
|
||||
$data[] = [
|
||||
'id' => $meta['id'],
|
||||
'title' => $meta['title'],
|
||||
'summary' => $summary,
|
||||
'type' => $content['extra']['databaseortool'] == 1 ? 'database' : 'tool',
|
||||
'jnode' => $content['extra']['kind'] == 2 ? true : false,
|
||||
'group' => $content['extra']['contactgroup'],
|
||||
'person' => $content['extra']['contactperson'],
|
||||
'email' => $content['extra']['contactemail'],
|
||||
'url' => $content['extra']['url'],
|
||||
'image0' => $image0,
|
||||
'image1' => $image1,
|
||||
];
|
||||
}
|
||||
file_put_contents(__DIR__.'/data/dist/src/custom/assets/dbtools.json', json_encode($data, JSON_UNESCAPED_UNICODE));
|
||||
|
||||
// page
|
||||
MyDumpTool::makeDirectory('dist/public/uploads/page');
|
||||
$page = array_pop(array_filter($config, function ($module) {return $module['module']['dirname'] === 'page';}));
|
||||
foreach ($page['contents'] as $meta) {
|
||||
$content = json_decode(file_get_contents(__DIR__.'/data/public/page/'.$meta['id'].'.json'), true);
|
||||
$image0 = '/uploads/page/imagefile_0_'.$content['extra']['imagefile'];
|
||||
$ifpath = XOOPS_ROOT_PATH.$image0;
|
||||
$ofpath = __DIR__.'/data/dist/public'.$image0;
|
||||
MyDumpTool::fileCopy($ifpath, $ofpath);
|
||||
}
|
||||
|
||||
//var_dump($config);
|
||||
//data/public/dbtools/15.json
|
||||
@@ -1,17 +0,0 @@
|
||||
<?php
|
||||
|
||||
require_once __DIR__.'/common.inc.php';
|
||||
|
||||
MyDumpTool::makeDirectory('dist/src/database');
|
||||
MyDumpTool::makeDirectory('dist/src/database/assets');
|
||||
MyDumpTool::makeDirectory('dist/public/database');
|
||||
$ifpath = __DIR__.'/data/public/database/';
|
||||
$ofpath = __DIR__.'/data/dist/public/database/';
|
||||
MyDumpTool::fileCopy($ifpath, $ofpath);
|
||||
|
||||
$ifpath = __DIR__.'/data/src/database/assets/tree.json';
|
||||
$ofpath = __DIR__.'/data/dist/src/database/assets/tree.json';
|
||||
MyDumpTool::fileCopy($ifpath, $ofpath);
|
||||
|
||||
//var_dump($config);
|
||||
//data/public/dbtools/15.json
|
||||
@@ -1,465 +0,0 @@
|
||||
visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=6045,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=25
|
||||
visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=909,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=27
|
||||
visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=1648,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=28
|
||||
visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=913,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=29
|
||||
visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=1623,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=30
|
||||
visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=1620,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=32
|
||||
visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=896,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=33
|
||||
visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=2434,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=34
|
||||
visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=2441,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=35
|
||||
visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=5307,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=37
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?id=943,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=38
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=403,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=39
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=398,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=40
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=350,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=41
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=366,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=43
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=370,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=44
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=361,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=45
|
||||
visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?id=4449054b,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=46
|
||||
visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=6110,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=47
|
||||
visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?id=7252867b,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=48
|
||||
visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=6105,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=49
|
||||
visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=2861,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=50
|
||||
visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?id=16625198b,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=51
|
||||
visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=6422,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=52
|
||||
visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?id=19281836b,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=53
|
||||
visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?id=7941380b,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=54
|
||||
visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=6448,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=55
|
||||
visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=6106,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=56
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1027,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=57
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1030,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=58
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1031,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=59
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1033,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=61
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1034,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=62
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1035,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=63
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1036,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=64
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1037,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=65
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1038,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=66
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1041,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=67
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1042,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=68
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1043,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=69
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1044,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=70
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1045,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=71
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1046,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=72
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1047,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=73
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1048,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=74
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1051,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=76
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1052,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=77
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1054,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=78
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1056,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=79
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1057,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=80
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1059,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=81
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1060,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=82
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1061,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=83
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1062,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=84
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1064,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=85
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1065,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=86
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1066,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=87
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1067,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=114
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1068,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=116
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1069,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=117
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1071,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=119
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1073,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=121
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1076,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=124
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1077,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=125
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1078,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=126
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1079,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=127
|
||||
visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=296,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=128
|
||||
visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=5586,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=129
|
||||
visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=297,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=130
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1080,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=131
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1081,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=132
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1082,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=133
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1084,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=134
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1085,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=135
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1086,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=136
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1087,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=137
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1088,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=138
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1089,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=139
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1098,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=140
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1099,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=141
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1100,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=142
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1101,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=143
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1102,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=144
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1103,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=145
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1105,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=146
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1106,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=147
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1107,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=148
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1108,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=149
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1109,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=150
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1110,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=151
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1111,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=152
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1112,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=153
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1113,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=154
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1114,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=155
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1115,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=156
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1119,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=159
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1120,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=160
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1121,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=161
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1122,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=162
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1123,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=163
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1124,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=164
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1125,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=165
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1127,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=167
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1128,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=168
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1129,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=169
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1130,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=170
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1131,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=171
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1132,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=172
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1134,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=174
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1135,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=175
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1136,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=176
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1137,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=177
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1138,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=178
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1139,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=179
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1140,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=180
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1141,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=181
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1142,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=182
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1143,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=183
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1144,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=184
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1146,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=186
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1147,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=187
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1148,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=188
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1149,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=189
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1150,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=190
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1152,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=192
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1153,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=193
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1154,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=194
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1156,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=195
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1157,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=196
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1159,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=198
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1160,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=199
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1161,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=200
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1162,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=201
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1163,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=202
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1164,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=203
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1165,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=204
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1166,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=205
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1167,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=206
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1168,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=207
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1169,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=208
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1170,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=209
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1171,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=210
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1173,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=212
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1174,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=213
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1175,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=214
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1176,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=215
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1177,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=216
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1178,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=217
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1179,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=218
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1180,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=219
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1181,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=220
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1182,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=221
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1183,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=222
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1184,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=223
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1185,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=224
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1186,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=225
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1187,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=226
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1188,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=227
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1189,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=228
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1190,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=229
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1191,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=230
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1192,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=231
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1193,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=232
|
||||
visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?id=15929656d,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=233
|
||||
visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=376,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=234
|
||||
visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=298,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=235
|
||||
visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=1629,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=236
|
||||
visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=1647,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=237
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1209,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=239
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1210,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=240
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1211,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=241
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1212,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=242
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1213,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=243
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1214,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=244
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1215,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=245
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1216,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=246
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1218,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=248
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1219,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=249
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1220,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=250
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1222,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=251
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1223,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=252
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1224,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=253
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1225,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=254
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1226,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=255
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1227,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=256
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1228,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=257
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1230,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=258
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1231,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=259
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1232,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=260
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1233,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=261
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1234,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=262
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1235,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=263
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1236,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=264
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1237,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=265
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1238,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=266
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1239,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=267
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1240,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=268
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1241,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=269
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1242,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=270
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1243,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=271
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1244,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=272
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1245,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=273
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1246,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=274
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1247,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=275
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1248,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=276
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1251,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=279
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1252,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=280
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1255,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=281
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1256,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=282
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1257,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=283
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1258,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=284
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1262,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=286
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1263,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=287
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1264,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=288
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1265,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=289
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1266,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=290
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1268,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=292
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1269,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=293
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1270,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=294
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1271,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=295
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1272,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=296
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1273,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=297
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1278,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=302
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1279,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=303
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1280,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=304
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1281,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=305
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1282,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=306
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1283,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=307
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1284,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=308
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1285,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=309
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1286,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=310
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1287,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=311
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1288,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=312
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1289,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=313
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1291,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=315
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1292,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=316
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1293,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=317
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1294,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=318
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1295,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=319
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1296,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=320
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1298,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=322
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1299,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=323
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1300,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=324
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1302,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=326
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1306,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=330
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1312,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=336
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1313,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=337
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1314,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=338
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1315,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=339
|
||||
visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=162,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=341
|
||||
visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=5936,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=342
|
||||
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/558/weaverWearne06.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=360
|
||||
visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?id=4449054c,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=367
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1039,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=416
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1040,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=417
|
||||
visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=7051,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=444
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1427,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=485
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1425,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=486
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1424,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=487
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1423,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=488
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1422,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=489
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1421,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=490
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1420,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=491
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1419,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=492
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1418,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=493
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1417,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=494
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1416,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=496
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1415,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=497
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1362,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=498
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1414,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=499
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1363,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=500
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1413,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=501
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1411,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=502
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1409,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=503
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1365,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=504
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1369,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=505
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1408,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=506
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1406,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=507
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1362,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=511
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1364,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=514
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1367,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=515
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1366,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=516
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1405,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=517
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1364,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=518
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1401,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=519
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1415,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=520
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1368,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=521
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1399,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=523
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1370,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=524
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1398,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=525
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1371,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=526
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1397,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=527
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1396,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=528
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1372,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=529
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1373,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=530
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1374,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=531
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1375,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=532
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1376,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=533
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1380,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=534
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1395,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=535
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1394,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=536
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1393,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=537
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1392,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=538
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1391,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=539
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1390,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=540
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1389,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=541
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1387,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=542
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1386,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=543
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1385,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=544
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1384,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=545
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1382,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=546
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1381,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=547
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1362,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=550
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1363,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=551
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1364,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=552
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1365,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=553
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1366,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=554
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1367,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=555
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1368,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=556
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1369,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=557
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1370,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=558
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1371,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=559
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1372,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=560
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1374,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=562
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1375,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=563
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1376,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=564
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1379,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=565
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1380,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=566
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1381,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=567
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1382,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=568
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1384,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=569
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1385,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=571
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1386,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=572
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1387,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=573
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1045,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=574
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1389,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=575
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1390,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=576
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1391,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=577
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1392,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=578
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1393,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=579
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1394,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=580
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1395,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=581
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1396,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=582
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1397,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=583
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1398,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=584
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1399,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=585
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1400,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=586
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1401,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=587
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1402,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=588
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1405,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=589
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1409,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=590
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1409,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=591
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1411,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=592
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1413,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=593
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1414,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=594
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1415,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=595
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1416,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=596
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1418,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=598
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1419,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=599
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1420,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=600
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1421,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=601
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1422,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=602
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1423,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=603
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1424,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=604
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1425,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=605
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1427,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=606
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1428,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=607
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1429,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=608
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1430,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=609
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1431,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=610
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1432,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=611
|
||||
visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=7252,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=612
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1434,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=613
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1435,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=614
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1450,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=615
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1452,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=616
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1453,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=617
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1454,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=618
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1455,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=619
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1458,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=620
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1460,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=621
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1461,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=622
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1462,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=623
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1463,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=624
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1466,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=625
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1465,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=626
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1467,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=627
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1470,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=628
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1471,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=629
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1472,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=630
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1473,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=631
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1474,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=632
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1476,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=633
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1477,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=634
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1479,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=635
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1481,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=636
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1482,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=637
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1483,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=638
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1486,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=639
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1487,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=640
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1488,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=641
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1489,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=642
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1490,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=643
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1493,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=644
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1496,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=645
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1497,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=646
|
||||
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1498,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=647
|
||||
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/533/SundtEtAl2015.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=656
|
||||
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/536/baker_etal_JCNS_2010.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=657
|
||||
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/538/CS56PyModelDB.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=659
|
||||
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/539/TCconvergenceModel.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=660
|
||||
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/540/BahlEtAl2012.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=661
|
||||
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/541/ACh_ModelDB.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=662
|
||||
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/543/OLMmodel_r3.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=664
|
||||
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/548/GentilettiEtAl2016.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=668
|
||||
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/556/FUS_model.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=677
|
||||
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/560/ShepherdBrayton1979.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=680
|
||||
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/561/gc-1.1_r2.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=681
|
||||
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/564/VladimirovTuTraub2012.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=683
|
||||
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/565/xiaoshenli.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=684
|
||||
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/566/kv72-R213QW-mutations_r2.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=685
|
||||
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/567/Ih_current.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=686
|
||||
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/569/Schizophr.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=687
|
||||
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/570/SaudargieneEtAl2015.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=688
|
||||
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/571/bpap.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=689
|
||||
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/572/magical7.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=691
|
||||
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/575/HyunEtAl2015.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=696
|
||||
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/576/MasurkarChen2011_r1.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=697
|
||||
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/577/Nakano_FICN_model_r1.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=698
|
||||
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/582/AshhadNarayanan2013.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=699
|
||||
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/583/DiFrancescoNoble1985.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=700
|
||||
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/584/DGC.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=701
|
||||
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/586/DG_BC.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=703
|
||||
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/587/DRG_Devor.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=704
|
||||
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/588/Kv72_ModelDB.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=705
|
||||
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/589/SousaEtAl2014.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=706
|
||||
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/590/MiglioreEtAl2015.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=707
|
||||
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/592/Chloride_Model.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=708
|
||||
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/593/MiglioreEJN2016_r2.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=709
|
||||
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/595/Moore2015.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=711
|
||||
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/597/FFI_CA1_r3.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=713
|
||||
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/598/stadler2014_layerV_r1.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=714
|
||||
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/600/2VN.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=716
|
||||
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/602/Branch_Point_Tapering.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=718
|
||||
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/604/MenonEtAl2009_r1.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=720
|
||||
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/606/CA3Atrophy.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=722
|
||||
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/607/Gorin_et_al_2016.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=723
|
||||
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/608/Poleg-PolskyDiamond2011.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=724
|
||||
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/613/Demo.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=728
|
||||
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/614/ShortEtAl2016.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=729
|
||||
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/618/Casaleggio2014.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=733
|
||||
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/623/MiglioreMcTavish2013.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=736
|
||||
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/624/KimEtAl2017.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=737
|
||||
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/626/fig1b.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=738
|
||||
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/627/cortex_r1.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=739
|
||||
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/629/oltedal.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=741
|
||||
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/632/ka_rgc.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=744
|
||||
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/634/na_rgc.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=745
|
||||
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/636/V1_PFC_ModelDB.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=747
|
||||
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/640/moore83.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=751
|
||||
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/642/SpaceClampDemo.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=753
|
||||
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/644/anderson.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=755
|
||||
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/645/VNO.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=756
|
||||
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/645/VNO.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=757
|
||||
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/647/Watanabe-et-al_2017_r1.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=758
|
||||
|
@@ -1,8 +1,8 @@
|
||||
<!DOCTYPE html>
|
||||
<!doctype html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<link rel="shortcut icon" href="%PUBLIC_URL%/favicon.ico" />
|
||||
<link rel="shortcut icon" href="/favicon.ico" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<meta name="theme-color" content="#000000" />
|
||||
<meta
|
||||
@@ -13,11 +13,12 @@
|
||||
<meta name="keywords" content="neuroinformatics, bsi, bsi-ni, brain science, xoonips, database" />
|
||||
<meta name="author" content="RIKEN Brain Science Institute" />
|
||||
<meta name="copyright" content="Copyright © 2018" />
|
||||
<link rel="manifest" href="%PUBLIC_URL%/manifest.json" />
|
||||
<link rel="manifest" href="/manifest.json" />
|
||||
<title>BSI-Neuroinformatics - RIKEN BSI Research Database Portal</title>
|
||||
</head>
|
||||
<body>
|
||||
<noscript>You need to enable JavaScript to run this app.</noscript>
|
||||
<div id="root"></div>
|
||||
<script type="module" src="/src/main.tsx"></script>
|
||||
</body>
|
||||
</html>
|
||||
Generated
+1947
File diff suppressed because it is too large
Load Diff
+39
-57
@@ -1,59 +1,41 @@
|
||||
{
|
||||
"name": "bsi-ni",
|
||||
"version": "1.0.0",
|
||||
"private": true,
|
||||
"dependencies": {
|
||||
"@types/async-lock": "^1.1.2",
|
||||
"@types/jest": "26.0.23",
|
||||
"@types/lokijs": "^1.5.4",
|
||||
"@types/node": "15.6.1",
|
||||
"@types/react": "17.0.8",
|
||||
"@types/react-dom": "17.0.5",
|
||||
"@types/react-helmet": "^6.1.1",
|
||||
"@types/react-html-parser": "^2.0.1",
|
||||
"@types/react-router-dom": "^5.1.7",
|
||||
"@types/react-router-hash-link": "^2.4.0",
|
||||
"async-lock": "^1.3.0",
|
||||
"axios": "^0.21.1",
|
||||
"lokijs": "^1.5.12",
|
||||
"moment": "^2.29.1",
|
||||
"react": "^17.0.2",
|
||||
"react-app-polyfill": "^2.0.0",
|
||||
"react-cookie": "^4.0.3",
|
||||
"react-dom": "^17.0.2",
|
||||
"react-ga": "^3.3.0",
|
||||
"react-helmet": "^6.1.0",
|
||||
"react-html-parser": "^2.0.2",
|
||||
"react-image-lightbox": "^5.1.1",
|
||||
"react-overlays": "^5.0.1",
|
||||
"react-router-dom": "^5.2.0",
|
||||
"react-router-hash-link": "^2.4.3",
|
||||
"react-scripts": "4.0.3",
|
||||
"react-spinner-material": "^1.3.1",
|
||||
"typescript": "4.3.2",
|
||||
"xregexp": "^5.0.2"
|
||||
},
|
||||
"scripts": {
|
||||
"start": "react-scripts start",
|
||||
"build": "react-scripts build",
|
||||
"test": "react-scripts test",
|
||||
"eject": "react-scripts eject"
|
||||
},
|
||||
"eslintConfig": {
|
||||
"extends": "react-app"
|
||||
},
|
||||
"browserslist": {
|
||||
"production": [
|
||||
">0.2%",
|
||||
"not dead",
|
||||
"not op_mini all",
|
||||
"ie 11"
|
||||
],
|
||||
"development": [
|
||||
"last 1 chrome version",
|
||||
"last 1 firefox version",
|
||||
"last 1 safari version",
|
||||
"ie 11"
|
||||
]
|
||||
}
|
||||
"name": "bsi-ni",
|
||||
"version": "2.0.0",
|
||||
"private": true,
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"dev": "vite",
|
||||
"build": "tsc -b && vite build",
|
||||
"preview": "vite preview",
|
||||
"lint": "biome lint",
|
||||
"format": "biome format --write",
|
||||
"check": "biome check --write",
|
||||
"typecheck": "tsc -b --noEmit"
|
||||
},
|
||||
"dependencies": {
|
||||
"@dr.pogodin/react-helmet": "^3.2.3",
|
||||
"@orrisroot/react-html-parser": "^3.0.1",
|
||||
"async-lock": "^1.4.1",
|
||||
"ky": "^2.1.0",
|
||||
"lokijs": "^1.5.12",
|
||||
"normalize.css": "^8.0.1",
|
||||
"react": "^19.3.0",
|
||||
"react-cookie": "^8.1.2",
|
||||
"react-dom": "^19.3.0",
|
||||
"react-ga4": "^3.0.1",
|
||||
"react-overlays": "^5.2.1",
|
||||
"react-router": "^8.3.1",
|
||||
"yet-another-react-lightbox": "^3.32.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@biomejs/biome": "^2.5.13",
|
||||
"@types/async-lock": "^1.4.2",
|
||||
"@types/lokijs": "^1.5.14",
|
||||
"@types/node": "^24.13.3",
|
||||
"@types/react": "^19.3.0",
|
||||
"@types/react-dom": "^19.3.0",
|
||||
"@vitejs/plugin-react": "^6.1.1",
|
||||
"typescript": "~7.0.2",
|
||||
"vite": "^8.3.0"
|
||||
}
|
||||
}
|
||||
|
||||
+4
-1
@@ -2,7 +2,10 @@ RewriteEngine on
|
||||
RewriteBase /
|
||||
|
||||
RewriteCond %{QUERY_STRING} (^|&)file_id=([0-9]+)($|&)
|
||||
RewriteRule ^modules/xoonips/download.php /database/file/%2? [R=301,L]
|
||||
RewriteRule ^modules/xoonips/download.php /modules/xoonips/file/%2? [R=301,L]
|
||||
|
||||
# File downloads moved under /modules/xoonips/ ; keep the old links alive.
|
||||
RewriteRule ^database/file/(.*)$ /modules/xoonips/file/$1 [R=301,L]
|
||||
|
||||
RewriteCond %{REQUEST_FILENAME} !-f
|
||||
RewriteCond %{REQUEST_FILENAME} !-d [OR]
|
||||
|
||||
+13
-13
@@ -1,15 +1,15 @@
|
||||
{
|
||||
"short_name": "BSI-NI",
|
||||
"name": "BSI Neuroinformatics Research Database",
|
||||
"icons": [
|
||||
{
|
||||
"src": "favicon.ico",
|
||||
"sizes": "32x32 24x24",
|
||||
"type": "image/x-icon"
|
||||
}
|
||||
],
|
||||
"start_url": ".",
|
||||
"display": "standalone",
|
||||
"theme_color": "#000000",
|
||||
"background_color": "#ffffff"
|
||||
"short_name": "BSI-NI",
|
||||
"name": "BSI Neuroinformatics Research Database",
|
||||
"icons": [
|
||||
{
|
||||
"src": "favicon.ico",
|
||||
"sizes": "32x32 24x24",
|
||||
"type": "image/x-icon"
|
||||
}
|
||||
],
|
||||
"start_url": ".",
|
||||
"display": "standalone",
|
||||
"theme_color": "#000000",
|
||||
"background_color": "#ffffff"
|
||||
}
|
||||
|
||||
+2
-2
@@ -1,2 +1,2 @@
|
||||
@import url('./common/assets/xoops.css');
|
||||
@import url('./common/assets/theme/style.css');
|
||||
@import url("./common/assets/xoops.css");
|
||||
@import url("./common/assets/theme/style.css");
|
||||
|
||||
@@ -1,9 +0,0 @@
|
||||
import React from 'react';
|
||||
import ReactDOM from 'react-dom';
|
||||
import App from './App';
|
||||
|
||||
it('renders without crashing', () => {
|
||||
const div = document.createElement('div');
|
||||
ReactDOM.render(<App />, div);
|
||||
ReactDOM.unmountComponentAtNode(div);
|
||||
});
|
||||
+11
-9
@@ -1,17 +1,19 @@
|
||||
import React from 'react';
|
||||
import { HelmetProvider } from '@dr.pogodin/react-helmet';
|
||||
import { CookiesProvider } from 'react-cookie';
|
||||
import { BrowserRouter } from 'react-router-dom';
|
||||
import { BrowserRouter } from 'react-router';
|
||||
import './App.css';
|
||||
import AppRoot from './common/AppRoot';
|
||||
|
||||
const App: React.FC = () => {
|
||||
const App = () => {
|
||||
return (
|
||||
<CookiesProvider>
|
||||
<BrowserRouter>
|
||||
<AppRoot />
|
||||
</BrowserRouter>
|
||||
</CookiesProvider>
|
||||
<HelmetProvider>
|
||||
<CookiesProvider>
|
||||
<BrowserRouter>
|
||||
<AppRoot />
|
||||
</BrowserRouter>
|
||||
</CookiesProvider>
|
||||
</HelmetProvider>
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
export default App;
|
||||
|
||||
+49
-61
@@ -1,78 +1,66 @@
|
||||
import React, { Component } from 'react';
|
||||
import { ReactCookieProps, withCookies } from 'react-cookie';
|
||||
import ReactGA from 'react-ga';
|
||||
import { RouteComponentProps, withRouter } from 'react-router-dom';
|
||||
import Config, { MultiLang } from '../config';
|
||||
import { useEffect, useRef } from 'react';
|
||||
import { useCookies } from 'react-cookie';
|
||||
import ReactGA from 'react-ga4';
|
||||
import { useLocation } from 'react-router';
|
||||
import Config, { type MultiLang } from '../config';
|
||||
import Footer from './Footer';
|
||||
import Header from './Header';
|
||||
import MainContent from './MainContent';
|
||||
|
||||
const isAnalyticsEnabled = import.meta.env.PROD && Config.GOOGLE_ANALYTICS_TRACKING_ID !== '';
|
||||
|
||||
interface Props extends RouteComponentProps, ReactCookieProps { }
|
||||
interface State {
|
||||
lang: MultiLang;
|
||||
if (isAnalyticsEnabled) {
|
||||
ReactGA.initialize(Config.GOOGLE_ANALYTICS_TRACKING_ID);
|
||||
}
|
||||
|
||||
class AppRoot extends Component<Props, State> {
|
||||
const toMultiLang = (value: unknown): MultiLang | null => {
|
||||
return value === 'en' || value === 'ja' ? value : null;
|
||||
};
|
||||
|
||||
constructor(props: Props) {
|
||||
super(props);
|
||||
this.state = { lang: 'en' };
|
||||
if (process.env.NODE_ENV === 'production' && Config.GOOGLE_ANALYTICS_TRACKING_ID !== '') {
|
||||
ReactGA.initialize(Config.GOOGLE_ANALYTICS_TRACKING_ID);
|
||||
}
|
||||
}
|
||||
const AppRoot = () => {
|
||||
const location = useLocation();
|
||||
const [cookies, setCookie] = useCookies(['ml_lang']);
|
||||
const previousLocation = useRef<string | null>(null);
|
||||
|
||||
static getDerivedStateFromProps(nextProps: Props, prevState: State) {
|
||||
const params = new URLSearchParams(nextProps.location.search);
|
||||
const param_lang = params.get('ml_lang');
|
||||
const cookie_lang = typeof nextProps.cookies !== 'undefined' ? nextProps.cookies.get('ml_lang') : null;
|
||||
let lang = param_lang || (typeof cookie_lang === 'string' ? cookie_lang : null) || prevState.lang;
|
||||
if (lang !== 'en' && lang !== 'ja') {
|
||||
lang = 'en';
|
||||
const paramLang = toMultiLang(new URLSearchParams(location.search).get('ml_lang'));
|
||||
const cookieLang = toMultiLang(cookies.ml_lang);
|
||||
const lang: MultiLang = paramLang ?? cookieLang ?? 'en';
|
||||
|
||||
useEffect(() => {
|
||||
if (cookies.ml_lang !== lang) {
|
||||
setCookie('ml_lang', lang, { path: '/' });
|
||||
}
|
||||
if (cookie_lang !== lang) {
|
||||
if (typeof nextProps.cookies !== 'undefined') {
|
||||
nextProps.cookies.set('ml_lang', lang, { path: '/' });
|
||||
}, [cookies.ml_lang, lang, setCookie]);
|
||||
|
||||
useEffect(() => {
|
||||
if (isAnalyticsEnabled) {
|
||||
ReactGA.send({ hitType: 'pageview', page: location.pathname });
|
||||
}
|
||||
const current = location.pathname + location.search + location.hash;
|
||||
const changed = previousLocation.current !== null && previousLocation.current !== current;
|
||||
previousLocation.current = current;
|
||||
if (location.hash !== '') {
|
||||
// React Router does not restore hash anchors on its own.
|
||||
const target = document.getElementById(decodeURIComponent(location.hash.slice(1)));
|
||||
if (target !== null) {
|
||||
target.scrollIntoView();
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (prevState.lang !== lang) {
|
||||
return { lang };
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
componentDidMount() {
|
||||
const { pathname } = this.props.location;
|
||||
if (process.env.NODE_ENV === 'production' && Config.GOOGLE_ANALYTICS_TRACKING_ID !== '') {
|
||||
ReactGA.set({ page: pathname });
|
||||
ReactGA.pageview(pathname);
|
||||
}
|
||||
}
|
||||
|
||||
componentDidUpdate(prevProps: Props) {
|
||||
const { pathname, search } = this.props.location;
|
||||
if (process.env.NODE_ENV === 'production' && Config.GOOGLE_ANALYTICS_TRACKING_ID !== '') {
|
||||
ReactGA.set({ page: pathname });
|
||||
ReactGA.pageview(pathname);
|
||||
}
|
||||
if (pathname !== prevProps.location.pathname || search !== prevProps.location.search) {
|
||||
if (changed) {
|
||||
window.scrollTo(0, 0);
|
||||
}
|
||||
}
|
||||
}, [location.pathname, location.search, location.hash]);
|
||||
|
||||
render() {
|
||||
const { lang } = this.state;
|
||||
return (
|
||||
<div id="page">
|
||||
<Header lang={lang} />
|
||||
<div id="main">
|
||||
<MainContent lang={lang} />
|
||||
</div>
|
||||
<Footer lang={lang} />
|
||||
return (
|
||||
<div id="page">
|
||||
<Header lang={lang} />
|
||||
<div id="main">
|
||||
<MainContent lang={lang} />
|
||||
</div>
|
||||
);
|
||||
}
|
||||
}
|
||||
<Footer />
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default withCookies(withRouter(AppRoot));
|
||||
export default AppRoot;
|
||||
|
||||
+31
-23
@@ -1,40 +1,48 @@
|
||||
import React from 'react';
|
||||
import { MultiLang } from '../config';
|
||||
import bannerJNODE from './assets/theme/images/banner_incf-japan-node.png';
|
||||
import bannerINCF from './assets/theme/images/banner_incf.png';
|
||||
import bannerNIU from './assets/theme/images/banner_riken-cbs-niu.png';
|
||||
import bannerCBS from './assets/theme/images/banner_riken-cbs.png';
|
||||
import bannerJNODE from './assets/theme/images/banner_incf-japan-node.png';
|
||||
import bannerRIKEN from './assets/theme/images/banner_riken.png';
|
||||
import bannerCBS from './assets/theme/images/banner_riken-cbs.png';
|
||||
import bannerNIU from './assets/theme/images/banner_riken-cbs-niu.png';
|
||||
import bannerXOONIPS from './assets/theme/images/banner_xoonips.png';
|
||||
|
||||
|
||||
interface Props {
|
||||
lang: MultiLang;
|
||||
}
|
||||
|
||||
const links = [
|
||||
{title: 'RIKEN', url: 'http://www.riken.jp/', image: bannerRIKEN},
|
||||
{title: 'RIKEN Center for Brain Science', url: 'https://cbs.riken.jp/', image: bannerCBS},
|
||||
{title: 'Neuroinformatics Unit, RIKEN Center for Brain Science', url: 'https://www.ni.riken.jp/', image: bannerNIU},
|
||||
{title: 'INCF Japan Node', url: 'https://www.neuroinf.jp/', image: bannerJNODE},
|
||||
{title: 'INCF', url: 'https://www.incf.org/', image: bannerINCF},
|
||||
{title: 'XooNIps Offical Site', url: 'https://xoonips.osdn.jp/', image: bannerXOONIPS},
|
||||
]
|
||||
{ title: 'RIKEN', url: 'http://www.riken.jp/', image: bannerRIKEN },
|
||||
{ title: 'RIKEN Center for Brain Science', url: 'https://cbs.riken.jp/', image: bannerCBS },
|
||||
{
|
||||
title: 'Neuroinformatics Unit, RIKEN Center for Brain Science',
|
||||
url: 'https://www.ni.riken.jp/',
|
||||
image: bannerNIU,
|
||||
},
|
||||
{ title: 'INCF Japan Node', url: 'https://www.neuroinf.jp/', image: bannerJNODE },
|
||||
{ title: 'INCF', url: 'https://www.incf.org/', image: bannerINCF },
|
||||
{ title: 'XooNIps Offical Site', url: 'https://xoonips.osdn.jp/', image: bannerXOONIPS },
|
||||
];
|
||||
|
||||
const Footer: React.FC<Props> = (props: Props) => {
|
||||
const Footer = () => {
|
||||
return (
|
||||
<footer id="footer" className="clearfix">
|
||||
<div className="copyright">
|
||||
© 2007-2018 RIKEN Brain Science Institute,<br />
|
||||
© 2007-2018 RIKEN Brain Science Institute,
|
||||
<br />
|
||||
© 2018- RIKEN Center for Brain Science, All rights reserved.
|
||||
</div>
|
||||
<div className="links">
|
||||
{links.map((item)=> {
|
||||
return <a key={item.title} href={item.url} title={item.title} target="_blank" rel="noopener noreferrer"><img src={item.image} alt={item.title} /></a>
|
||||
{links.map((item) => {
|
||||
return (
|
||||
<a
|
||||
key={item.title}
|
||||
href={item.url}
|
||||
title={item.title}
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
>
|
||||
<img src={item.image} alt={item.title} />
|
||||
</a>
|
||||
);
|
||||
})}
|
||||
</div>
|
||||
</footer>
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
export default Footer;
|
||||
export default Footer;
|
||||
|
||||
+23
-13
@@ -1,19 +1,19 @@
|
||||
import React from 'react';
|
||||
import { Link, RouteComponentProps, withRouter } from 'react-router-dom';
|
||||
import Config, { MultiLang } from '../config';
|
||||
import { Link, useLocation } from 'react-router';
|
||||
import Config, { type MultiLang } from '../config';
|
||||
import Functions from '../functions';
|
||||
|
||||
interface Props extends RouteComponentProps {
|
||||
interface Props {
|
||||
lang: MultiLang;
|
||||
}
|
||||
|
||||
const Header: React.FC<Props> = (props: Props) => {
|
||||
const { lang, location } = props;
|
||||
const Header = (props: Props) => {
|
||||
const { lang } = props;
|
||||
const location = useLocation();
|
||||
const params = new URLSearchParams(location.search);
|
||||
const nextLang = lang === 'en' ? 'ja' : 'en';
|
||||
const nextLangTitle = lang === 'en' ? '日本語' : 'English';
|
||||
params.set('ml_lang', nextLang);
|
||||
const nextLangUrl = location.pathname + '?' + params.toString();
|
||||
const nextLangUrl = `${location.pathname}?${params.toString()}`;
|
||||
const links = [
|
||||
{ title: 'Home', link: '/' },
|
||||
{ title: '[en]Databases & Tools[/en][ja]データベース・ツール[/ja]', link: '/dbtools' },
|
||||
@@ -21,23 +21,33 @@ const Header: React.FC<Props> = (props: Props) => {
|
||||
{ title: '[en]About BSI-NI[/en][ja]プロジェクト概要[/ja]', link: '/about' },
|
||||
{ title: '[en]Related Publications[/en][ja]関連論文[/ja]', link: '/publication' },
|
||||
{ title: '[en]Contact[/en][ja]お問い合わせ先[/ja]', link: '/contact' },
|
||||
]
|
||||
];
|
||||
|
||||
return (
|
||||
<header id="header">
|
||||
<div className="main-visual">
|
||||
<Link className="title-link" to="/"><span className="hidden">{Config.SITE_TITLE}</span></Link>
|
||||
<Link className="title-link" to="/">
|
||||
<span className="hidden">{Config.SITE_TITLE}</span>
|
||||
</Link>
|
||||
</div>
|
||||
<div className="nav">
|
||||
<ul className="global-nav">
|
||||
{links.map((item) => {
|
||||
return <li key={item.title}><Link to={item.link}>{Functions.mlang(item.title, lang)}</Link></li>
|
||||
return (
|
||||
<li key={item.title}>
|
||||
<Link to={item.link}>{Functions.mlang(item.title, lang)}</Link>
|
||||
</li>
|
||||
);
|
||||
})}
|
||||
</ul>
|
||||
<div className="lang-nav"><Link className={`lang-nav-${nextLang}`} to={nextLangUrl}><span className="hidden">{nextLangTitle}</span></Link></div>
|
||||
<div className="lang-nav">
|
||||
<Link className={`lang-nav-${nextLang}`} to={nextLangUrl}>
|
||||
<span className="hidden">{nextLangTitle}</span>
|
||||
</Link>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
export default withRouter(Header);
|
||||
export default Header;
|
||||
|
||||
+32
-28
@@ -1,6 +1,5 @@
|
||||
import React from 'react';
|
||||
import { Route, RouteComponentProps, Switch } from 'react-router-dom';
|
||||
import { MultiLang } from '../config';
|
||||
import { Route, Routes, useParams } from 'react-router';
|
||||
import type { MultiLang } from '../config';
|
||||
import About from '../custom/About';
|
||||
import Contact from '../custom/Contact';
|
||||
import DbTools from '../custom/DbTools';
|
||||
@@ -18,36 +17,41 @@ interface Props {
|
||||
lang: MultiLang;
|
||||
}
|
||||
|
||||
const MainContent: React.FC<Props> = (props: Props) => {
|
||||
const PageRoute = (props: Props) => {
|
||||
const { lang } = props;
|
||||
const { id: rawId } = useParams<{ id: string }>();
|
||||
const id = rawId === '6' ? 6 : rawId === '9' ? 9 : 0;
|
||||
if (id === 0) {
|
||||
return <PageNotFound lang={lang} />;
|
||||
}
|
||||
return <Page lang={lang} id={id} />;
|
||||
};
|
||||
|
||||
const MainContent = (props: Props) => {
|
||||
const { lang } = props;
|
||||
return (
|
||||
<div className="mainContent">
|
||||
<Switch>
|
||||
<Route exact path="/" render={() => <WhatsNew lang={lang} />} />
|
||||
</Switch>
|
||||
<Routes>
|
||||
<Route path="/" element={<WhatsNew lang={lang} />} />
|
||||
{/* React Router warns about unmatched locations, so opt out explicitly. */}
|
||||
<Route path="*" element={null} />
|
||||
</Routes>
|
||||
<div className="block">
|
||||
<Switch>
|
||||
<Route exact path="/" render={() => <DbToolsTop lang={lang} />} />
|
||||
<Route path="/dbtools" render={() => <DbTools lang={lang} />} />
|
||||
<Route path="/news" render={() => <News lang={lang} />} />
|
||||
<Route path="/about" render={() => <About lang={lang} />} />
|
||||
<Route path="/publication" render={() => <Publication lang={lang} />} />
|
||||
<Route path="/contact" render={() => <Contact lang={lang} />} />
|
||||
<Route path='/database' render={() => <Database lang={lang} />} />
|
||||
<Route path='/page/:id' render={(props: RouteComponentProps<{ id: string }>) => {
|
||||
const {match} = props;
|
||||
const id = match.params.id === '6' ? 6 : (match.params.id === '9' ? 9 : 0);
|
||||
if (id === 0) {
|
||||
return <PageNotFound lang={lang} />
|
||||
}
|
||||
return <Page lang={lang} id={id} />;
|
||||
}} />
|
||||
<Route path="/modules/xoonips" render={() => <DatabaseXoopsPathRedirect lang={lang} />} />
|
||||
<Route component={XoopsPathRedirect} />
|
||||
</Switch>
|
||||
<Routes>
|
||||
<Route path="/" element={<DbToolsTop lang={lang} />} />
|
||||
<Route path="/dbtools/*" element={<DbTools lang={lang} />} />
|
||||
<Route path="/news/*" element={<News lang={lang} />} />
|
||||
<Route path="/about/*" element={<About lang={lang} />} />
|
||||
<Route path="/publication/*" element={<Publication lang={lang} />} />
|
||||
<Route path="/contact/*" element={<Contact lang={lang} />} />
|
||||
<Route path="/database/*" element={<Database lang={lang} />} />
|
||||
<Route path="/page/:id" element={<PageRoute lang={lang} />} />
|
||||
<Route path="/modules/xoonips/*" element={<DatabaseXoopsPathRedirect lang={lang} />} />
|
||||
<Route path="*" element={<XoopsPathRedirect lang={lang} />} />
|
||||
</Routes>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
export default MainContent;
|
||||
export default MainContent;
|
||||
|
||||
@@ -1,60 +1,45 @@
|
||||
import React, { Component } from 'react';
|
||||
import { Redirect, RouteComponentProps } from 'react-router';
|
||||
import { MultiLang } from '../config';
|
||||
import { Navigate, useLocation } from 'react-router';
|
||||
import type { MultiLang } from '../config';
|
||||
import PageNotFound from './lib/PageNotFound';
|
||||
|
||||
interface Params {
|
||||
module: string;
|
||||
pathname: string;
|
||||
}
|
||||
|
||||
interface Props extends RouteComponentProps<Params> {
|
||||
interface Props {
|
||||
lang: MultiLang;
|
||||
}
|
||||
|
||||
class XoopsPathRedirect extends Component<Props> {
|
||||
|
||||
getRedirectUrl() {
|
||||
const { pathname, search } = this.props.location;
|
||||
const query = new URLSearchParams(search);
|
||||
switch (pathname || '') {
|
||||
case '/index.php': {
|
||||
return '/';
|
||||
}
|
||||
case '/modules/dbtools/index.php': {
|
||||
return '/dbtools';
|
||||
}
|
||||
case '/modules/news/index.php': {
|
||||
return '/news';
|
||||
}
|
||||
case '/modules/about/index.php': {
|
||||
return '/about';
|
||||
}
|
||||
case '/modules/publication/index.php': {
|
||||
return '/publication';
|
||||
}
|
||||
case '/modules/contact/index.php': {
|
||||
return '/contact';
|
||||
}
|
||||
case '/modules/page/index.php': {
|
||||
const id = query.get('content_id') || '';
|
||||
return `/page/${id}`;
|
||||
}
|
||||
const getRedirectUrl = (pathname: string, search: string): string => {
|
||||
const query = new URLSearchParams(search);
|
||||
switch (pathname || '') {
|
||||
case '/index.php':
|
||||
return '/';
|
||||
case '/modules/dbtools/index.php':
|
||||
return '/dbtools';
|
||||
case '/modules/news/index.php':
|
||||
return '/news';
|
||||
case '/modules/about/index.php':
|
||||
return '/about';
|
||||
case '/modules/publication/index.php':
|
||||
return '/publication';
|
||||
case '/modules/contact/index.php':
|
||||
return '/contact';
|
||||
case '/modules/page/index.php': {
|
||||
const id = query.get('content_id') || '';
|
||||
return `/page/${id}`;
|
||||
}
|
||||
return '';
|
||||
}
|
||||
return '';
|
||||
};
|
||||
|
||||
render() {
|
||||
const { lang } = this.props;
|
||||
if (this.props.location.pathname === '/') {
|
||||
return null;
|
||||
}
|
||||
const url = this.getRedirectUrl();
|
||||
if (url === '') {
|
||||
return <PageNotFound lang={lang} />;
|
||||
}
|
||||
return <Redirect to={url} />;
|
||||
const XoopsPathRedirect = (props: Props) => {
|
||||
const { lang } = props;
|
||||
const location = useLocation();
|
||||
if (location.pathname === '/') {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
const url = getRedirectUrl(location.pathname, location.search);
|
||||
if (url === '') {
|
||||
return <PageNotFound lang={lang} />;
|
||||
}
|
||||
return <Navigate to={url} replace />;
|
||||
};
|
||||
|
||||
export default XoopsPathRedirect;
|
||||
|
||||
+310
-306
@@ -1,23 +1,23 @@
|
||||
*,
|
||||
*::before,
|
||||
*::after {
|
||||
box-sizing: border-box;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
html,
|
||||
body,
|
||||
#root,
|
||||
#page {
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
body {
|
||||
font-family: arial, sans-serif;
|
||||
color: #333333;
|
||||
background-color: #ffffff;
|
||||
margin: 0;
|
||||
font-size: 80%;
|
||||
font-family: arial, sans-serif;
|
||||
color: #333333;
|
||||
background-color: #ffffff;
|
||||
margin: 0;
|
||||
font-size: 80%;
|
||||
}
|
||||
|
||||
h1,
|
||||
@@ -26,593 +26,597 @@ h3,
|
||||
h4,
|
||||
h5,
|
||||
h6 {
|
||||
margin-bottom: 0.5rem;
|
||||
font-family: inherit;
|
||||
font-weight: bold;
|
||||
line-height: 1.2;
|
||||
color: inherit;
|
||||
margin-bottom: 0.5rem;
|
||||
font-family: inherit;
|
||||
font-weight: bold;
|
||||
line-height: 1.2;
|
||||
color: inherit;
|
||||
}
|
||||
h1 {
|
||||
font-size: 1.802em;
|
||||
/*
|
||||
font-size: 1.802em;
|
||||
/*
|
||||
background: url(images/indent_h1.png) no-repeat left center;
|
||||
text-indent: 40px;
|
||||
*/
|
||||
}
|
||||
h2 {
|
||||
font-size: 1.602em;
|
||||
/*
|
||||
font-size: 1.602em;
|
||||
/*
|
||||
background: url(images/indent_h2.png) no-repeat left center;
|
||||
text-indent: 30px;
|
||||
*/
|
||||
}
|
||||
h3 {
|
||||
font-size: 1.424em;
|
||||
/*
|
||||
font-size: 1.424em;
|
||||
/*
|
||||
background: url(images/indent_h3.png) no-repeat left center;
|
||||
text-indent: 25px;
|
||||
*/
|
||||
}
|
||||
h4 {
|
||||
font-size: 1.266em;
|
||||
font-size: 1.266em;
|
||||
}
|
||||
h5 {
|
||||
font-size: 1.125em;
|
||||
font-size: 1.125em;
|
||||
}
|
||||
h6 {
|
||||
font-size: 1em;
|
||||
font-size: 1em;
|
||||
}
|
||||
|
||||
a {
|
||||
color: #333333;
|
||||
text-decoration: none;
|
||||
color: #333333;
|
||||
text-decoration: none;
|
||||
}
|
||||
a:visited {
|
||||
color: #333333;
|
||||
color: #333333;
|
||||
}
|
||||
a:hover {
|
||||
color: #ff3333;
|
||||
color: #ff3333;
|
||||
}
|
||||
|
||||
p {
|
||||
font-size: 93%;
|
||||
font-size: 93%;
|
||||
}
|
||||
|
||||
hr {
|
||||
border-width: 1px 0px 0px 0px;
|
||||
border-style: solid;
|
||||
border-color: #cccccc;
|
||||
height: 1px;
|
||||
border-width: 1px 0px 0px 0px;
|
||||
border-style: solid;
|
||||
border-color: #cccccc;
|
||||
height: 1px;
|
||||
}
|
||||
|
||||
ul,
|
||||
ol {
|
||||
padding-left: 1.5em;
|
||||
padding-left: 1.5em;
|
||||
}
|
||||
|
||||
table {
|
||||
width: 100%;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
td,
|
||||
th {
|
||||
text-align: left;
|
||||
vertical-align: top;
|
||||
text-align: left;
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
th {
|
||||
padding: 3px;
|
||||
vertical-align: middle;
|
||||
font-weight: normal;
|
||||
color: #666;
|
||||
border-bottom: 1px solid #ccc;
|
||||
background: #eee;
|
||||
padding: 3px;
|
||||
vertical-align: middle;
|
||||
font-weight: normal;
|
||||
color: #666;
|
||||
border-bottom: 1px solid #ccc;
|
||||
background: #eee;
|
||||
}
|
||||
|
||||
tr.even td {
|
||||
padding: 2px;
|
||||
padding: 2px;
|
||||
}
|
||||
tr.odd td {
|
||||
padding: 2px;
|
||||
padding: 2px;
|
||||
}
|
||||
tr.even {
|
||||
color: inherit;
|
||||
background: #f7f7f7;
|
||||
color: inherit;
|
||||
background: #f7f7f7;
|
||||
}
|
||||
tr.odd {
|
||||
color: inherit;
|
||||
background: #fafafa;
|
||||
color: inherit;
|
||||
background: #fafafa;
|
||||
}
|
||||
tr.odd:hover,
|
||||
tr.even:hover {
|
||||
color: #000;
|
||||
border-bottom: 1px solid #cacaca;
|
||||
background: #dfdfdf;
|
||||
color: #000;
|
||||
border-bottom: 1px solid #cacaca;
|
||||
background: #dfdfdf;
|
||||
}
|
||||
.outer {
|
||||
border: 1px solid #eee;
|
||||
border: 1px solid #eee;
|
||||
}
|
||||
|
||||
.head {
|
||||
padding: 5px;
|
||||
color: inherit;
|
||||
border-bottom: 1px solid #cacaca;
|
||||
background: #f2f2f2;
|
||||
padding: 5px;
|
||||
color: inherit;
|
||||
border-bottom: 1px solid #cacaca;
|
||||
background: #f2f2f2;
|
||||
}
|
||||
|
||||
.even {
|
||||
padding: 2px;
|
||||
color: inherit;
|
||||
border-bottom: 1px solid #cacaca;
|
||||
background: #f7f7f7;
|
||||
padding: 2px;
|
||||
color: inherit;
|
||||
border-bottom: 1px solid #cacaca;
|
||||
background: #f7f7f7;
|
||||
}
|
||||
|
||||
.odd {
|
||||
padding: 2px;
|
||||
color: inherit;
|
||||
border-bottom: 1px solid #cacaca;
|
||||
background: #fafafa;
|
||||
padding: 2px;
|
||||
color: inherit;
|
||||
border-bottom: 1px solid #cacaca;
|
||||
background: #fafafa;
|
||||
}
|
||||
|
||||
.foot {
|
||||
padding: 5px;
|
||||
font-weight: bold;
|
||||
padding: 5px;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.clearfix::after {
|
||||
content: "";
|
||||
display: block;
|
||||
clear: both;
|
||||
content: "";
|
||||
display: block;
|
||||
clear: both;
|
||||
}
|
||||
|
||||
.hidden {
|
||||
display: none;
|
||||
display: none;
|
||||
}
|
||||
|
||||
.text-center {
|
||||
text-align: center;
|
||||
text-align: center;
|
||||
}
|
||||
.text-left {
|
||||
text-align: left;
|
||||
text-align: left;
|
||||
}
|
||||
.text-right {
|
||||
text-align: right;
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
.font-weight-bold {
|
||||
font-weight: bold;
|
||||
font-weight: bold;
|
||||
}
|
||||
.font-italic {
|
||||
font-style: italic;
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
.block .blockTitle {
|
||||
height: 21px;
|
||||
margin-bottom: 0.4rem;
|
||||
padding: 0 10px 0 32px;
|
||||
color: #369;
|
||||
line-height: 21px;
|
||||
font-weight: bold;
|
||||
height: 21px;
|
||||
margin-bottom: 0.4rem;
|
||||
padding: 0 10px 0 32px;
|
||||
color: #369;
|
||||
line-height: 21px;
|
||||
font-weight: bold;
|
||||
}
|
||||
.block .blockContent {
|
||||
padding: 0 10px;
|
||||
padding: 0 10px;
|
||||
}
|
||||
|
||||
#main {
|
||||
width: 902px;
|
||||
margin: 10px auto;
|
||||
line-height: 1.5;
|
||||
border: 1px solid #c2c7c7;
|
||||
background-color: #e2e7e7;
|
||||
width: 902px;
|
||||
margin: 10px auto;
|
||||
line-height: 1.5;
|
||||
border: 1px solid #c2c7c7;
|
||||
background-color: #e2e7e7;
|
||||
}
|
||||
|
||||
.mainContent {
|
||||
margin: 10px;
|
||||
margin: 10px;
|
||||
}
|
||||
|
||||
.block {
|
||||
padding: 10px;
|
||||
margin-bottom: 10px;
|
||||
border: 1px solid #c2c7c7;
|
||||
background-color: #fff;
|
||||
padding: 10px;
|
||||
margin-bottom: 10px;
|
||||
border: 1px solid #c2c7c7;
|
||||
background-color: #fff;
|
||||
}
|
||||
|
||||
#header {
|
||||
background: url(images/header_background.png) repeat-x;
|
||||
background: url(images/header_background.png) repeat-x;
|
||||
}
|
||||
#header .main-visual {
|
||||
margin: 0 auto;
|
||||
width: 902px;
|
||||
height: 175px;
|
||||
background-image: url(images/header_main.png);
|
||||
margin: 0 auto;
|
||||
width: 902px;
|
||||
height: 175px;
|
||||
background-image: url(images/header_main.png);
|
||||
}
|
||||
#header .main-visual .title-link {
|
||||
display: inline-block;
|
||||
width: 420px;
|
||||
height: 100px;
|
||||
display: inline-block;
|
||||
width: 420px;
|
||||
height: 100px;
|
||||
}
|
||||
#header .nav {
|
||||
margin: 0 auto;
|
||||
height: 40px;
|
||||
width: 902px;
|
||||
margin: 0 auto;
|
||||
height: 40px;
|
||||
width: 902px;
|
||||
}
|
||||
#header .global-nav {
|
||||
float: left;
|
||||
margin: 0;
|
||||
padding: 0 2px;
|
||||
overflow: hidden;
|
||||
background: url(images/header_global-nav-separator.png) no-repeat;
|
||||
float: left;
|
||||
margin: 0;
|
||||
padding: 0 2px;
|
||||
overflow: hidden;
|
||||
background: url(images/header_global-nav-separator.png) no-repeat;
|
||||
}
|
||||
#main .global-nav::after {
|
||||
content: "";
|
||||
display: block;
|
||||
clear: both;
|
||||
content: "";
|
||||
display: block;
|
||||
clear: both;
|
||||
}
|
||||
#header .global-nav li {
|
||||
display: inline-block;
|
||||
height: 40px;
|
||||
padding: 0 2px 0 0;
|
||||
background: url(images/header_global-nav-separator.png) no-repeat right;
|
||||
display: inline-block;
|
||||
height: 40px;
|
||||
padding: 0 2px 0 0;
|
||||
background: url(images/header_global-nav-separator.png) no-repeat right;
|
||||
}
|
||||
#header .global-nav li a {
|
||||
display: inline-block;
|
||||
height: 40px;
|
||||
padding: 0 8px;
|
||||
line-height: 40px;
|
||||
display: inline-block;
|
||||
height: 40px;
|
||||
padding: 0 8px;
|
||||
line-height: 40px;
|
||||
}
|
||||
#header .lang-nav {
|
||||
float: right;
|
||||
position: relative;
|
||||
top: 13px;
|
||||
float: right;
|
||||
position: relative;
|
||||
top: 13px;
|
||||
}
|
||||
#header .lang-nav a {
|
||||
display: inline-block;
|
||||
height: 11px;
|
||||
background-image: url(images/header_lang-nav.png);
|
||||
display: inline-block;
|
||||
height: 11px;
|
||||
background-image: url(images/header_lang-nav.png);
|
||||
}
|
||||
#header .lang-nav a.lang-nav-ja {
|
||||
width: 37px;
|
||||
background-position: 0 0;
|
||||
width: 37px;
|
||||
background-position: 0 0;
|
||||
}
|
||||
#header .lang-nav a.lang-nav-ja:hover {
|
||||
background-position: 0 -11px;
|
||||
background-position: 0 -11px;
|
||||
}
|
||||
#header .lang-nav a.lang-nav-en {
|
||||
width: 50px;
|
||||
background-position: -37px 0;
|
||||
width: 50px;
|
||||
background-position: -37px 0;
|
||||
}
|
||||
#header .lang-nav a.lang-nav-en:hover {
|
||||
background-position: -37px -11px;
|
||||
background-position: -37px -11px;
|
||||
}
|
||||
|
||||
#footer {
|
||||
margin: 0 auto;
|
||||
width: 902px;
|
||||
margin: 0 auto;
|
||||
width: 902px;
|
||||
}
|
||||
#footer .copyright {
|
||||
float: left;
|
||||
font-size: 13px;
|
||||
float: left;
|
||||
font-size: 13px;
|
||||
}
|
||||
#footer .links {
|
||||
float: right;
|
||||
float: right;
|
||||
}
|
||||
#footer .links a {
|
||||
display: inline-block;
|
||||
margin: 0 5px;
|
||||
display: inline-block;
|
||||
margin: 0 5px;
|
||||
}
|
||||
|
||||
#main a {
|
||||
text-decoration: underline;
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
#main section {
|
||||
margin: 1em 0.5em;
|
||||
margin: 1em 0.5em;
|
||||
}
|
||||
|
||||
#main section p {
|
||||
margin-left: 5px;
|
||||
margin-right: 5px;
|
||||
margin-left: 5px;
|
||||
margin-right: 5px;
|
||||
}
|
||||
|
||||
#main h2 {
|
||||
margin: 0.8rem 0 0.5rem;
|
||||
position: relative;
|
||||
padding-left: 20px;
|
||||
border: 1px solid #cccccc;
|
||||
border-radius: 3px;
|
||||
background: linear-gradient(#ffffff 0%, #eeeeee 100%);
|
||||
box-shadow: inset -1px -1px 0 rgba(255, 255, 255, 1);
|
||||
font-size: 123.1%;
|
||||
font-weight: bold;
|
||||
line-height: 37px;
|
||||
height: 37px;
|
||||
margin: 0.8rem 0 0.5rem;
|
||||
position: relative;
|
||||
padding-left: 20px;
|
||||
border: 1px solid #cccccc;
|
||||
border-radius: 3px;
|
||||
background: linear-gradient(#ffffff 0%, #eeeeee 100%);
|
||||
box-shadow: inset -1px -1px 0 rgba(255, 255, 255, 1);
|
||||
font-size: 123.1%;
|
||||
font-weight: bold;
|
||||
line-height: 37px;
|
||||
height: 37px;
|
||||
}
|
||||
|
||||
#main h2::after {
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
left: 10px;
|
||||
transform: translateY(-50%);
|
||||
content: "";
|
||||
width: 2px;
|
||||
height: 24px;
|
||||
background-color: #c40018;
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
left: 10px;
|
||||
transform: translateY(-50%);
|
||||
content: "";
|
||||
width: 2px;
|
||||
height: 24px;
|
||||
background-color: #c40018;
|
||||
}
|
||||
|
||||
#main h3 {
|
||||
margin-left: 5px;
|
||||
background: url(images/h3-bullet.png) no-repeat left center;
|
||||
text-indent: 16px;
|
||||
line-height: 20px;
|
||||
padding: 0 0 5px 0;
|
||||
font-size: 108%;
|
||||
height: 24px;
|
||||
border-bottom: 3px double #cccccc;
|
||||
margin-left: 5px;
|
||||
background: url(images/h3-bullet.png) no-repeat left center;
|
||||
text-indent: 16px;
|
||||
line-height: 20px;
|
||||
padding: 0 0 5px 0;
|
||||
font-size: 108%;
|
||||
height: 24px;
|
||||
border-bottom: 3px double #cccccc;
|
||||
}
|
||||
|
||||
#main .whatsnew::after {
|
||||
content: "";
|
||||
display: block;
|
||||
clear: both;
|
||||
content: "";
|
||||
display: block;
|
||||
clear: both;
|
||||
}
|
||||
#main .whatsnew .title {
|
||||
float: left;
|
||||
width: 130px;
|
||||
float: left;
|
||||
width: 130px;
|
||||
}
|
||||
#main .whatsnew .title h3 {
|
||||
font-weight: 123.1%;
|
||||
line-height: 24px;
|
||||
border-bottom: none;
|
||||
font-weight: 123.1%;
|
||||
line-height: 24px;
|
||||
border-bottom: none;
|
||||
}
|
||||
#main .whatsnew .news {
|
||||
float: left;
|
||||
border-left: 1px dotted #cccccc;
|
||||
width: calc(100% - 150px);
|
||||
float: left;
|
||||
border-left: 1px dotted #cccccc;
|
||||
width: calc(100% - 150px);
|
||||
}
|
||||
#main .whatsnew .title .more {
|
||||
margin: 0.3em 20px;
|
||||
padding-left: 5px;
|
||||
background: url(images/more-bullet.png) no-repeat left center;
|
||||
margin: 0.3em 20px;
|
||||
padding-left: 5px;
|
||||
background: url(images/more-bullet.png) no-repeat left center;
|
||||
}
|
||||
#main .whatsnew .title .more a {
|
||||
color: #22528d;
|
||||
color: #22528d;
|
||||
}
|
||||
#main .whatsnew .title .more a:hover {
|
||||
color: #ff3333;
|
||||
color: #ff3333;
|
||||
}
|
||||
#main .whatsnew .news ul {
|
||||
padding-left: 10px;
|
||||
width: 100%;
|
||||
padding-left: 10px;
|
||||
width: 100%;
|
||||
}
|
||||
#main .whatsnew .news ul li {
|
||||
list-style: none;
|
||||
white-space: nowrap;
|
||||
height: 35px;
|
||||
line-height: 35px;
|
||||
border-top: 1px dotted #cccccc;
|
||||
font-size: 93%;
|
||||
list-style: none;
|
||||
white-space: nowrap;
|
||||
height: 35px;
|
||||
line-height: 35px;
|
||||
border-top: 1px dotted #cccccc;
|
||||
font-size: 93%;
|
||||
}
|
||||
#main .whatsnew .news ul li:last-child {
|
||||
border-bottom: 1px dotted #cccccc;
|
||||
border-bottom: 1px dotted #cccccc;
|
||||
}
|
||||
#main .whatsnew .news ul li .date {
|
||||
display: inline-block;
|
||||
width: 75px;
|
||||
display: inline-block;
|
||||
width: 75px;
|
||||
}
|
||||
|
||||
#main .dbtools-top {
|
||||
margin: 5px;
|
||||
margin: 5px;
|
||||
}
|
||||
#main .dbtools-top ul {
|
||||
padding-left: 0;
|
||||
padding-left: 0;
|
||||
}
|
||||
#main .dbtools-top ul li {
|
||||
list-style-type: none;
|
||||
list-style-type: none;
|
||||
}
|
||||
#main .dbtools-top .incf-japan-node {
|
||||
color: #22528d;
|
||||
font-weight: normal;
|
||||
color: #22528d;
|
||||
font-weight: normal;
|
||||
}
|
||||
|
||||
#main .dbtools-top h3 {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
text-indent: 0;
|
||||
background: none;
|
||||
border-bottom: none;
|
||||
line-height: 1.2em;
|
||||
font-size: 93%;
|
||||
height: auto;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
text-indent: 0;
|
||||
background: none;
|
||||
border-bottom: none;
|
||||
line-height: 1.2em;
|
||||
font-size: 93%;
|
||||
height: auto;
|
||||
}
|
||||
#main .dbtools-top h3 a {
|
||||
text-decoration: none;
|
||||
text-decoration: none;
|
||||
}
|
||||
#main .dbtools-top h3 span.incf-japan-node {
|
||||
color: #ff0000;
|
||||
font-weight: bold;
|
||||
color: #ff0000;
|
||||
font-weight: bold;
|
||||
}
|
||||
#main .dbtools-top ul {
|
||||
margin: 10px 10px;
|
||||
overflow: hidden;
|
||||
zoom: 1;
|
||||
margin: 10px 10px;
|
||||
overflow: hidden;
|
||||
zoom: 1;
|
||||
}
|
||||
#main .dbtools-top ul li {
|
||||
float: left;
|
||||
width: 265px;
|
||||
margin: 10px 5px;
|
||||
float: left;
|
||||
width: 265px;
|
||||
margin: 10px 5px;
|
||||
}
|
||||
#main .dbtools-top ul li:nth-child(3n + 1) {
|
||||
clear: left;
|
||||
margin-left: 0;
|
||||
clear: left;
|
||||
margin-left: 0;
|
||||
}
|
||||
#main .dbtools-top ul li:first-child,
|
||||
#main .dbtools-top ul li:nth-child(2),
|
||||
#main .dbtools-top ul li:nth-child(3) {
|
||||
margin-top: 0;
|
||||
margin-top: 0;
|
||||
}
|
||||
#main .dbtools-top ul li .icon {
|
||||
float: left;
|
||||
width: 82px;
|
||||
float: left;
|
||||
width: 82px;
|
||||
}
|
||||
#main .dbtools-top ul li .info {
|
||||
float: right;
|
||||
width: 170px;
|
||||
float: right;
|
||||
width: 170px;
|
||||
}
|
||||
#main .dbtools-top ul li .info .detail {
|
||||
display: inline-block;
|
||||
margin-top: 5px;
|
||||
display: inline-block;
|
||||
margin-top: 5px;
|
||||
}
|
||||
#main .dbtools-top ul li .info .detail a,
|
||||
#main .dbtools-top ul li .info .detail span {
|
||||
padding-left: 8px;
|
||||
background: url(images/more-bullet.png) no-repeat left center;
|
||||
font-size: 93%;
|
||||
padding-left: 8px;
|
||||
background: url(images/more-bullet.png) no-repeat left center;
|
||||
font-size: 93%;
|
||||
}
|
||||
#main .dbtools-top ul li .info .detail a {
|
||||
color: #22528d;
|
||||
text-decoration: none;
|
||||
color: #22528d;
|
||||
text-decoration: none;
|
||||
}
|
||||
#main .dbtools-top ul li .info .detail a:hover {
|
||||
color: #ff3333;
|
||||
color: #ff3333;
|
||||
}
|
||||
#main .dbtools-top .legend {
|
||||
margin: 0;
|
||||
text-align: right;
|
||||
margin: 0;
|
||||
text-align: right;
|
||||
}
|
||||
#main .dbtools-top .legend::before {
|
||||
content: "* ";
|
||||
color: #ff0000;
|
||||
font-weight: bold;
|
||||
content: "* ";
|
||||
color: #ff0000;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
#main .dbtools .types::after {
|
||||
content: "";
|
||||
display: block;
|
||||
clear: both;
|
||||
content: "";
|
||||
display: block;
|
||||
clear: both;
|
||||
}
|
||||
#main .dbtools .index .databases {
|
||||
float: left;
|
||||
width: 50%;
|
||||
float: left;
|
||||
width: 50%;
|
||||
}
|
||||
#main .dbtools .index .tools {
|
||||
float: right;
|
||||
float: right;
|
||||
}
|
||||
#main .dbtools .index section {
|
||||
margin: 0;
|
||||
padding: 0 10px;
|
||||
width: 50%;
|
||||
margin: 0;
|
||||
padding: 0 10px;
|
||||
width: 50%;
|
||||
}
|
||||
#main .dbtools .index ul {
|
||||
padding-left: 5px;
|
||||
padding-left: 5px;
|
||||
}
|
||||
#main .dbtools .index ul li {
|
||||
list-style-type: none;
|
||||
line-height: 1.2;
|
||||
padding-bottom: 5px;
|
||||
list-style-type: none;
|
||||
line-height: 1.2;
|
||||
padding-bottom: 5px;
|
||||
}
|
||||
#main .dbtools .legend {
|
||||
margin: 0;
|
||||
text-align: right;
|
||||
margin: 0;
|
||||
text-align: right;
|
||||
}
|
||||
#main .dbtools .legend::before {
|
||||
content: "* ";
|
||||
color: #ff0000;
|
||||
font-weight: bold;
|
||||
content: "* ";
|
||||
color: #ff0000;
|
||||
font-weight: bold;
|
||||
}
|
||||
#main .dbtools .incf-japan-node {
|
||||
color: #ff0000;
|
||||
font-weight: bold;
|
||||
color: #ff0000;
|
||||
font-weight: bold;
|
||||
}
|
||||
#main .dbtools .detail ul {
|
||||
padding-left: 0;
|
||||
padding-left: 0;
|
||||
}
|
||||
#main .dbtools .detail ul li {
|
||||
list-style-type: none;
|
||||
line-height: 1.2;
|
||||
padding-bottom: 5px;
|
||||
border-bottom: 1px dotted #cccccc;
|
||||
list-style-type: none;
|
||||
line-height: 1.2;
|
||||
padding-bottom: 5px;
|
||||
border-bottom: 1px dotted #cccccc;
|
||||
}
|
||||
#main .dbtools .item::after {
|
||||
content: "";
|
||||
display: block;
|
||||
clear: both;
|
||||
content: "";
|
||||
display: block;
|
||||
clear: both;
|
||||
}
|
||||
#main .dbtools .item .icon {
|
||||
float: left;
|
||||
width: 100px;
|
||||
float: left;
|
||||
width: 100px;
|
||||
}
|
||||
#main .dbtools .item .info {
|
||||
float: right;
|
||||
width: 720px;
|
||||
float: right;
|
||||
width: 720px;
|
||||
}
|
||||
#main .dbtools .item .summary {
|
||||
margin: 0 0 0.5em;
|
||||
margin: 0 0 0.5em;
|
||||
}
|
||||
#main .dbtools .contact,
|
||||
#main .dbtools .url {
|
||||
margin: 0.5em 0;
|
||||
margin: 0.5em 0;
|
||||
}
|
||||
|
||||
#main .news .date {
|
||||
text-align: right;
|
||||
margin-right: 20px;
|
||||
text-align: right;
|
||||
margin-right: 20px;
|
||||
}
|
||||
|
||||
#main .about table {
|
||||
border-collapse: collapse;
|
||||
border-collapse: collapse;
|
||||
}
|
||||
#main .about td {
|
||||
border: 1px solid #999999;
|
||||
padding: 10px;
|
||||
border: 1px solid #999999;
|
||||
padding: 10px;
|
||||
}
|
||||
#main .about .date {
|
||||
font-weight: bold;
|
||||
text-align: right;
|
||||
font-weight: bold;
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
#main .publication h3.name {
|
||||
text-indent: 30px;
|
||||
font-size: 123.1%;
|
||||
line-height: 30px;
|
||||
height: 30px;
|
||||
#main .publication .category h3 {
|
||||
text-indent: 30px;
|
||||
font-size: 123.1%;
|
||||
line-height: 30px;
|
||||
height: 30px;
|
||||
}
|
||||
#main .publication h3.name.cdtdb {
|
||||
background: url(images/icon-cdt-db-24x17.png) no-repeat left center;
|
||||
#main .publication #section-cdt-db h3 {
|
||||
background: url(images/icon-cdt-db-24x17.png) no-repeat left center;
|
||||
}
|
||||
#main .publication h3.name.eeg {
|
||||
background: url(images/icon-multichannel-eeg-data-for-bmi-and-or-he-24x17.png) no-repeat left center;
|
||||
#main .publication #section-multichannel-eeg-data-for-bmi-and-or-he h3 {
|
||||
background: url(images/icon-multichannel-eeg-data-for-bmi-and-or-he-24x17.png) no-repeat left center;
|
||||
}
|
||||
#main .publication article {
|
||||
margin: 5px;
|
||||
#main .publication .publication {
|
||||
margin: 5px;
|
||||
}
|
||||
#main .publication h4.title {
|
||||
padding-left: 13px;
|
||||
background: url(images/h4-bullet.png) no-repeat left 5px;
|
||||
font-size: 108%;
|
||||
font-weight: bold;
|
||||
#main .publication h4 {
|
||||
padding-left: 13px;
|
||||
background: url(images/h4-bullet.png) no-repeat left 5px;
|
||||
font-size: 108%;
|
||||
font-weight: bold;
|
||||
}
|
||||
#main .publication p.author,
|
||||
#main .publication p.description,
|
||||
#main .publication p.journal,
|
||||
#main .publication p.pmid {
|
||||
margin: 3px 0;
|
||||
margin: 3px 0;
|
||||
}
|
||||
/* XOOPS 時代のページ内ナビゲーション。SPA では機能しないため隠す */
|
||||
#main .publication .page-top {
|
||||
display: none;
|
||||
}
|
||||
#main .publication p.pmid a {
|
||||
display: inline-block;
|
||||
padding: 0 4px;
|
||||
background-color: #999999;
|
||||
color: white;
|
||||
text-decoration: none;
|
||||
display: inline-block;
|
||||
padding: 0 4px;
|
||||
background-color: #999999;
|
||||
color: white;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
#main .contact .division {
|
||||
font-weight: bold;
|
||||
font-weight: bold;
|
||||
}
|
||||
#main .contact .address {
|
||||
font-style: italic;
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
#main .page .summary {
|
||||
padding: 10px;
|
||||
background: #cccccc;
|
||||
border: 1px dotted #cccccc;
|
||||
padding: 10px;
|
||||
background: #cccccc;
|
||||
border: 1px dotted #cccccc;
|
||||
}
|
||||
|
||||
+62
-17
@@ -1,17 +1,62 @@
|
||||
img {border: 0;}
|
||||
|
||||
#xoopsHiddenText {visibility: hidden; color: #000000; font-weight: normal; font-style: normal; text-decoration: none;}
|
||||
|
||||
.pagneutral {font-size: 10px; width: 16px; height: 19px;text-align: center; background-image: url(./images/pagneutral.gif);}
|
||||
.pagact {font-size: 10px; width: 16px; height: 19px;text-align: center; background-image: url(./images/pagact.gif);}
|
||||
.paginact {font-size: 10px; width: 16px; height: 19px;text-align: center; background-image: url(./images/paginact.gif);}
|
||||
|
||||
|
||||
#mainmenu a {text-align:left; display: block; margin: 0; padding: 4px;}
|
||||
#mainmenu a.menuTop {padding-left: 3px;}
|
||||
#mainmenu a.menuMain {padding-left: 3px;}
|
||||
#mainmenu a.menuSub {padding-left: 9px;}
|
||||
|
||||
#usermenu a {text-align:left; display: block; margin: 0; padding: 4px;}
|
||||
#usermenu a.menuTop {}
|
||||
#usermenu a.highlight {color: #0000ff; background-color: #fcc;}
|
||||
img {
|
||||
border: 0;
|
||||
}
|
||||
|
||||
#xoopsHiddenText {
|
||||
visibility: hidden;
|
||||
color: #000000;
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.pagneutral {
|
||||
font-size: 10px;
|
||||
width: 16px;
|
||||
height: 19px;
|
||||
text-align: center;
|
||||
background-image: url(./images/pagneutral.gif);
|
||||
}
|
||||
.pagact {
|
||||
font-size: 10px;
|
||||
width: 16px;
|
||||
height: 19px;
|
||||
text-align: center;
|
||||
background-image: url(./images/pagact.gif);
|
||||
}
|
||||
.paginact {
|
||||
font-size: 10px;
|
||||
width: 16px;
|
||||
height: 19px;
|
||||
text-align: center;
|
||||
background-image: url(./images/paginact.gif);
|
||||
}
|
||||
|
||||
#mainmenu a {
|
||||
text-align: left;
|
||||
display: block;
|
||||
margin: 0;
|
||||
padding: 4px;
|
||||
}
|
||||
#mainmenu a.menuTop {
|
||||
padding-left: 3px;
|
||||
}
|
||||
#mainmenu a.menuMain {
|
||||
padding-left: 3px;
|
||||
}
|
||||
#mainmenu a.menuSub {
|
||||
padding-left: 9px;
|
||||
}
|
||||
|
||||
#usermenu a {
|
||||
text-align: left;
|
||||
display: block;
|
||||
margin: 0;
|
||||
padding: 4px;
|
||||
}
|
||||
#usermenu a.menuTop {
|
||||
}
|
||||
#usermenu a.highlight {
|
||||
color: #0000ff;
|
||||
background-color: #fcc;
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import React, { Component } from 'react';
|
||||
import { Link } from 'react-router-dom';
|
||||
import { Component } from 'react';
|
||||
import { Link } from 'react-router';
|
||||
|
||||
interface Props {
|
||||
url: string;
|
||||
@@ -13,7 +13,6 @@ interface State {
|
||||
}
|
||||
|
||||
class LinkImage extends Component<Props, State> {
|
||||
|
||||
constructor(props: Props) {
|
||||
super(props);
|
||||
this.state = {
|
||||
@@ -26,14 +25,14 @@ class LinkImage extends Component<Props, State> {
|
||||
handleMouseOver() {
|
||||
const { imageHover } = this.props;
|
||||
if (typeof imageHover !== 'undefined') {
|
||||
this.setState({ image: imageHover })
|
||||
this.setState({ image: imageHover });
|
||||
}
|
||||
}
|
||||
|
||||
handleMouseOut() {
|
||||
const { image: imageNormal, imageHover } = this.props;
|
||||
if (typeof imageHover !== 'undefined') {
|
||||
this.setState({ image: imageNormal })
|
||||
this.setState({ image: imageNormal });
|
||||
}
|
||||
}
|
||||
|
||||
@@ -42,13 +41,27 @@ class LinkImage extends Component<Props, State> {
|
||||
const image = <img style={{ verticalAlign: 'middle' }} src={this.state.image} alt={title} title={title} />;
|
||||
if (url.match(/^(\/|\.)/) === null) {
|
||||
return (
|
||||
<a href={url} target="_blank" rel="noopener noreferrer" onMouseOver={this.handleMouseOver} onMouseOut={this.handleMouseOut}>
|
||||
<a
|
||||
href={url}
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
onMouseOver={this.handleMouseOver}
|
||||
onMouseOut={this.handleMouseOut}
|
||||
onFocus={this.handleMouseOver}
|
||||
onBlur={this.handleMouseOut}
|
||||
>
|
||||
{image}
|
||||
</a>
|
||||
);
|
||||
}
|
||||
return (
|
||||
<Link to={url} onMouseOver={this.handleMouseOver} onMouseOut={this.handleMouseOut}>
|
||||
<Link
|
||||
to={url}
|
||||
onMouseOver={this.handleMouseOver}
|
||||
onMouseOut={this.handleMouseOut}
|
||||
onFocus={this.handleMouseOver}
|
||||
onBlur={this.handleMouseOut}
|
||||
>
|
||||
{image}
|
||||
</Link>
|
||||
);
|
||||
|
||||
@@ -0,0 +1,27 @@
|
||||
.wrapper {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-content: center;
|
||||
margin: 100px 0;
|
||||
}
|
||||
|
||||
.spinner {
|
||||
width: 120px;
|
||||
height: 120px;
|
||||
border: 8px solid #cccccc;
|
||||
border-top-color: transparent;
|
||||
border-radius: 50%;
|
||||
animation: spin 1s linear infinite;
|
||||
}
|
||||
|
||||
@keyframes spin {
|
||||
to {
|
||||
transform: rotate(360deg);
|
||||
}
|
||||
}
|
||||
|
||||
@media (prefers-reduced-motion: reduce) {
|
||||
.spinner {
|
||||
animation-duration: 4s;
|
||||
}
|
||||
}
|
||||
@@ -1,12 +1,11 @@
|
||||
import React from 'react';
|
||||
import Spinner from 'react-spinner-material';
|
||||
import styles from './Loading.module.css';
|
||||
|
||||
const Loading = () => {
|
||||
return (
|
||||
<div style={{ display: 'flex', justifyContent: 'center', alignContent: 'center', margin: '100px 0' }}>
|
||||
<Spinner radius={60} color={'#cccccc'} stroke={8} visible={true} />
|
||||
<div className={styles.wrapper}>
|
||||
<div className={styles.spinner} role="progressbar" aria-label="Loading" />
|
||||
</div>
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
export default Loading;
|
||||
export default Loading;
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
import React from 'react';
|
||||
import { MultiLang } from '../../config';
|
||||
import type { MultiLang } from '../../config';
|
||||
import Functions from '../../functions';
|
||||
|
||||
interface Props {
|
||||
@@ -8,8 +7,9 @@ interface Props {
|
||||
|
||||
const NoticeSiteHasBeenArchived = (props: Props) => {
|
||||
const { lang } = props;
|
||||
const notice = '[en]This site has been archived since FY2019 and is no longer updated.[/en][ja]このサイトは、2019年度よりアーカイブサイトとして運用されています。[/ja]';
|
||||
const notice =
|
||||
'[en]This site has been archived since FY2019 and is no longer updated.[/en][ja]このサイトは、2019年度よりアーカイブサイトとして運用されています。[/ja]';
|
||||
return <p style={{ color: 'red' }}>{Functions.mlang(notice, lang)}</p>;
|
||||
}
|
||||
};
|
||||
|
||||
export default NoticeSiteHasBeenArchived;
|
||||
export default NoticeSiteHasBeenArchived;
|
||||
|
||||
@@ -1,54 +1,44 @@
|
||||
import React, { Component } from 'react';
|
||||
import { Helmet } from 'react-helmet';
|
||||
import { RouteComponentProps, withRouter } from 'react-router';
|
||||
import { MultiLang } from '../../config';
|
||||
import { Helmet } from '@dr.pogodin/react-helmet';
|
||||
import { useEffect } from 'react';
|
||||
import { useLocation, useNavigate } from 'react-router';
|
||||
import type { MultiLang } from '../../config';
|
||||
import Functions from '../../functions';
|
||||
|
||||
interface Props extends RouteComponentProps {
|
||||
interface Props {
|
||||
lang: MultiLang;
|
||||
}
|
||||
|
||||
class PageNotFound extends Component<Props> {
|
||||
const TOP_URL = '/';
|
||||
|
||||
private url = '/';
|
||||
private timer: NodeJS.Timer | null = null;
|
||||
const PageNotFound = (props: Props) => {
|
||||
const { lang } = props;
|
||||
const location = useLocation();
|
||||
const navigate = useNavigate();
|
||||
|
||||
goToTopPage() {
|
||||
if (this.props.location.pathname !== '/') {
|
||||
if (this.timer) {
|
||||
clearTimeout(this.timer);
|
||||
}
|
||||
this.timer = setTimeout(() => {
|
||||
this.timer = null;
|
||||
this.props.history.push(this.url);
|
||||
}, 5000);
|
||||
useEffect(() => {
|
||||
if (!import.meta.env.PROD || location.pathname === TOP_URL) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
const timer = setTimeout(() => {
|
||||
void navigate(TOP_URL);
|
||||
}, 5000);
|
||||
return () => clearTimeout(timer);
|
||||
}, [location.pathname, navigate]);
|
||||
|
||||
componentWillUnmount() {
|
||||
if (this.timer) {
|
||||
clearTimeout(this.timer);
|
||||
}
|
||||
}
|
||||
return (
|
||||
<div>
|
||||
<Helmet>
|
||||
<title>Page Not Found - {Functions.siteTitle(lang)}</title>
|
||||
</Helmet>
|
||||
<h1>Page Not Found</h1>
|
||||
<section>
|
||||
<p>The page you were trying to access doesn't exist.</p>
|
||||
<p>
|
||||
If the page does not automatically reload, please go to the <a href={TOP_URL}>top page</a>.
|
||||
</p>
|
||||
</section>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
render() {
|
||||
const { lang } = this.props;
|
||||
if (process.env.NODE_ENV === 'production') {
|
||||
this.goToTopPage();
|
||||
}
|
||||
return (
|
||||
<div>
|
||||
<Helmet>
|
||||
<title>Page Not Found - {Functions.siteTitle(lang)}</title>
|
||||
</Helmet>
|
||||
<h1>Page Not Found</h1>
|
||||
<section>
|
||||
<p>The page you were trying to access doesn't exist.</p>
|
||||
<p>If the page does not automatically reload, please click <a href={this.url}>here</a></p>
|
||||
</section>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
export default withRouter(PageNotFound);
|
||||
export default PageNotFound;
|
||||
|
||||
@@ -1,8 +1,7 @@
|
||||
import React from 'react';
|
||||
import { MultiLang } from '../../config';
|
||||
import type { MultiLang } from '../../config';
|
||||
import Functions from '../../functions';
|
||||
import imageRank2 from '../assets/images/rank3dbf8e94a6f72.gif';
|
||||
import imageRank3 from '../assets/images/rank3dbf8e9e7d88d.gif';
|
||||
import imageRank2 from '../assets/images/rank3dbf8e94a6f72.gif';
|
||||
import imageRank4 from '../assets/images/rank3dbf8ea81e642.gif';
|
||||
import imageRank5 from '../assets/images/rank3dbf8eb1a72e7.gif';
|
||||
import imageRank6 from '../assets/images/rank3dbf8edf15093.gif';
|
||||
@@ -19,7 +18,7 @@ const userRanks = [
|
||||
{ title: '[en]Just popping in[/en][ja]新米[/ja]', min: 0, max: 20, special: false, image: imageRank1 },
|
||||
{ title: '[en]Not too shy to talk[/en][ja]半人前[/ja]', min: 21, max: 40, special: false, image: imageRank2 },
|
||||
{ title: '[en]Quite a regular[/en][ja]常連[/ja]', min: 41, max: 70, special: false, image: imageRank3 },
|
||||
{ title: '[en]Just can\'t stay away[/en][ja]一人前[/ja]', min: 71, max: 150, special: false, image: imageRank4 },
|
||||
{ title: "[en]Just can't stay away[/en][ja]一人前[/ja]", min: 71, max: 150, special: false, image: imageRank4 },
|
||||
{ title: '[en]Home away from home[/en][ja]長老[/ja]', min: 151, max: 10000, special: false, image: imageRank5 },
|
||||
{ title: '[en]Moderator[/en][ja]モデレータ[/ja]', min: 0, max: 0, special: true, image: imageRank6 },
|
||||
{ title: '[en]Webmaster[/en][ja]管理人[/ja]', min: 0, max: 0, special: true, image: imageRank7 },
|
||||
@@ -35,11 +34,10 @@ const UserRankStarImage = (props: Props) => {
|
||||
return false;
|
||||
});
|
||||
return typeof rank !== 'undefined' ? rank : userRanks[0];
|
||||
|
||||
}
|
||||
};
|
||||
const userRank = rank > 0 && rank <= 7 ? userRanks[rank - 1] : findRank(posts);
|
||||
const title = Functions.mlang(userRank.title, lang);
|
||||
return <img src={userRank.image} alt={title} title={title} />;
|
||||
}
|
||||
};
|
||||
|
||||
export default UserRankStarImage;
|
||||
export default UserRankStarImage;
|
||||
|
||||
@@ -1,7 +1,12 @@
|
||||
import React, { ReactElement } from 'react';
|
||||
import ReactHtmlParser, { convertNodeToElement } from 'react-html-parser';
|
||||
import { HashLink } from 'react-router-hash-link';
|
||||
import { MultiLang } from '../../config';
|
||||
import ReactHtmlParser, {
|
||||
convertNodeToElement,
|
||||
type DomElement,
|
||||
type DomNode,
|
||||
type Transform,
|
||||
} from '@orrisroot/react-html-parser';
|
||||
import type { CSSProperties } from 'react';
|
||||
import { Link } from 'react-router';
|
||||
import Config, { type MultiLang } from '../../config';
|
||||
import Functions from '../../functions';
|
||||
|
||||
interface Props {
|
||||
@@ -16,98 +21,109 @@ interface Props {
|
||||
|
||||
const preConvertXCode = (text: string, doxcode: boolean): string => {
|
||||
if (doxcode) {
|
||||
return text.replace(/\[code\](.*)\[\/code\]/sg, (m0, m1) => {
|
||||
return '[code]' + Functions.base64Encode(m1) + '[/code]';
|
||||
return text.replace(/\[code\](.*)\[\/code\]/gs, (_m0, m1) => {
|
||||
return `[code]${Functions.base64Encode(m1)}[/code]`;
|
||||
});
|
||||
}
|
||||
return text;
|
||||
}
|
||||
};
|
||||
|
||||
const postConvertXCode = (text: string, doxcode: boolean, doimage: boolean): string => {
|
||||
if (doxcode) {
|
||||
return text.replace(/\[code\](.*)\[\/code\]/sg, (m0, m1) => {
|
||||
return text.replace(/\[code\](.*)\[\/code\]/gs, (_m0, m1) => {
|
||||
const text = convertXCode(Functions.htmlspecialchars(Functions.base64Decode(m1)), doimage);
|
||||
return '<div class="xoopsCode"><pre><code>' + text + '</code></pre></div>';
|
||||
return `<div class="xoopsCode"><pre><code>${text}</code></pre></div>`;
|
||||
});
|
||||
}
|
||||
return text;
|
||||
}
|
||||
};
|
||||
|
||||
const convertClickable = (text: string) => {
|
||||
text = text.replace(/(^|[^\]_a-zA-Z0-9-="'/]+)((?:https?|ftp)(?::\/\/[-_.!~*'()a-zA-Z0-9;/?:@&=+$,%#]+[a-zA-Z0-9=]))/g, (...matches) => {
|
||||
return matches[1] + '<a href="' + matches[2] + '" target="_blank" rel="external noopener noreferrer">' + matches[2] + '</a>';
|
||||
});
|
||||
text = text.replace(/(^|[^\]_a-zA-Z0-9-="'/:.]+)([a-zA-Z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)+)/g, (...matches) => {
|
||||
return matches[1] + '<a href="mailto:' + matches[2] + '">' + matches[2] + '</a>';
|
||||
});
|
||||
text = text.replace(
|
||||
/(^|[^\]_a-zA-Z0-9-="'/]+)((?:https?|ftp)(?::\/\/[-_.!~*'()a-zA-Z0-9;/?:@&=+$,%#]+[a-zA-Z0-9=]))/g,
|
||||
(...matches) => {
|
||||
return (
|
||||
matches[1] +
|
||||
'<a href="' +
|
||||
matches[2] +
|
||||
'" target="_blank" rel="external noopener noreferrer">' +
|
||||
matches[2] +
|
||||
'</a>'
|
||||
);
|
||||
}
|
||||
);
|
||||
text = text.replace(
|
||||
/(^|[^\]_a-zA-Z0-9-="'/:.]+)([a-zA-Z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)+)/g,
|
||||
(...matches) => {
|
||||
return `${matches[1]}<a href="mailto:${matches[2]}">${matches[2]}</a>`;
|
||||
}
|
||||
);
|
||||
return text;
|
||||
}
|
||||
};
|
||||
|
||||
const convertXCode = (text: string, doimage: boolean): string => {
|
||||
const convertXCode = (text: string, _doimage: boolean): string => {
|
||||
// TODO: implement
|
||||
return text;
|
||||
}
|
||||
};
|
||||
|
||||
const convertSmiley = (text: string) => {
|
||||
// TODO: implement
|
||||
return text;
|
||||
}
|
||||
};
|
||||
|
||||
const convertBr = (text: string): string => {
|
||||
return text.replace(/(\r?\n|\r)/g, '<br />');
|
||||
}
|
||||
};
|
||||
|
||||
interface TransformParsedNode {
|
||||
type: string;
|
||||
next: object | null;
|
||||
prev: object | null;
|
||||
parent: object | null;
|
||||
name: string;
|
||||
attribs: any;
|
||||
children: object[];
|
||||
data: string;
|
||||
}
|
||||
|
||||
const cssConvert = (text: string): object => {
|
||||
const ret: any = {};
|
||||
const cssConvert = (text: string): CSSProperties => {
|
||||
const ret: Record<string, string> = {};
|
||||
text.split(';').forEach((line) => {
|
||||
const line_ = line.trim();
|
||||
if (line.length === 0) {
|
||||
if (line_.length === 0) {
|
||||
return;
|
||||
}
|
||||
const kv = line_.split(':');
|
||||
if (kv.length < 2) {
|
||||
return;
|
||||
}
|
||||
const key = Functions.camelCase(kv[0].trim());
|
||||
const value = kv[1].trim();
|
||||
ret[key] = value;
|
||||
})
|
||||
return ret;
|
||||
}
|
||||
ret[key] = kv[1].trim();
|
||||
});
|
||||
return ret as CSSProperties;
|
||||
};
|
||||
|
||||
const transform = (node: object, idx: number): ReactElement | null | void => {
|
||||
const node_ = node as TransformParsedNode;
|
||||
if (node_.type === 'tag' && node_.name === 'a') {
|
||||
const url = (node_.attribs && node_.attribs['href']) || '/';
|
||||
const download = (node_.attribs && node_.attribs['download']) || '';
|
||||
const rel = (node_.attribs && node_.attribs['rel']) || '';
|
||||
const klass = (node_.attribs && node_.attribs['class']) || '';
|
||||
const isElement = (node: DomNode): node is DomElement => {
|
||||
return node.type === 'tag' || node.type === 'script' || node.type === 'style';
|
||||
};
|
||||
|
||||
const transform: Transform = (node, idx) => {
|
||||
if (!isElement(node)) {
|
||||
return;
|
||||
}
|
||||
if (node.name === 'a') {
|
||||
const url = node.attribs.href || '/';
|
||||
const download = node.attribs.download || '';
|
||||
const rel = node.attribs.rel || '';
|
||||
const klass = node.attribs.class || '';
|
||||
const isFile = download !== '' || /\.(zip|pdf|png|gif|jpg)$/.test(url);
|
||||
const isExternal = /external/.test(rel) || /external/.test(klass) || /^(mailto|https?:?\/\/)/.test(url);
|
||||
if (!isFile && !isExternal) {
|
||||
const style = (node_.attribs && node_.attribs['style']) || '';
|
||||
const title = (node_.attribs && node_.attribs['title']) || null;
|
||||
return <HashLink key={idx} to={url} style={cssConvert(style)} title={title}>
|
||||
{node_.children.map((value: object, index: number) => {
|
||||
return convertNodeToElement(value, index, transform);
|
||||
})}
|
||||
</HashLink>;
|
||||
const style = node.attribs.style || '';
|
||||
const title = node.attribs.title;
|
||||
return (
|
||||
<Link key={idx} to={url} style={cssConvert(style)} title={title}>
|
||||
{node.children.map((child, index) => convertNodeToElement(child, index, transform))}
|
||||
</Link>
|
||||
);
|
||||
}
|
||||
return;
|
||||
}
|
||||
if (node_.type === 'tag' && node_.name === 'img') {
|
||||
const src = (node_.attribs && node_.attribs['src']) || '';
|
||||
node_.attribs['src'] = src.replace('`XOOPS_URL`', process.env.PUBLIC_URL);
|
||||
return convertNodeToElement(node_ as object, idx, transform);
|
||||
if (node.name === 'img') {
|
||||
const src = node.attribs.src || '';
|
||||
node.attribs.src = src.replace('`XOOPS_URL`', Config.BASE_URL);
|
||||
return convertNodeToElement(node, idx, transform);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
const XoopsCode = (props: Props) => {
|
||||
const { lang } = props;
|
||||
@@ -134,6 +150,6 @@ const XoopsCode = (props: Props) => {
|
||||
text = postConvertXCode(text, doxcode, doimage);
|
||||
text = Functions.mlang(text, lang);
|
||||
return <div>{ReactHtmlParser(text, { transform })}</div>;
|
||||
}
|
||||
};
|
||||
|
||||
export default XoopsCode;
|
||||
export default XoopsCode;
|
||||
|
||||
+8
-2
@@ -1,8 +1,13 @@
|
||||
const SITE_TITLE = 'BSI-Neuroinformatics';
|
||||
const SITE_SLOGAN = 'RIKEN BSI Research Database Portal';
|
||||
const GOOGLE_ANALYTICS_TRACKING_ID = 'UA-25489807-3';
|
||||
const GOOGLE_ANALYTICS_TRACKING_ID = 'G-37HZE599Q9';
|
||||
const XOONIPS_ITEMTYPES = ['paper', 'book', 'data'];
|
||||
|
||||
// Vite's BASE_URL always carries a trailing slash ('/' when the app is served
|
||||
// from the document root). Strip it so it can be concatenated the same way
|
||||
// CRA's Config.BASE_URL was.
|
||||
const BASE_URL = import.meta.env.BASE_URL.replace(/\/$/, '');
|
||||
|
||||
export type MultiLang = 'en' | 'ja';
|
||||
|
||||
const Config = {
|
||||
@@ -10,6 +15,7 @@ const Config = {
|
||||
SITE_SLOGAN,
|
||||
GOOGLE_ANALYTICS_TRACKING_ID,
|
||||
XOONIPS_ITEMTYPES,
|
||||
}
|
||||
BASE_URL,
|
||||
};
|
||||
|
||||
export default Config;
|
||||
|
||||
+68
-50
@@ -1,6 +1,6 @@
|
||||
import React from 'react';
|
||||
import { Helmet } from 'react-helmet';
|
||||
import Config, { MultiLang } from '../config';
|
||||
import { Helmet } from '@dr.pogodin/react-helmet';
|
||||
import type React from 'react';
|
||||
import Config, { type MultiLang } from '../config';
|
||||
import Functions from '../functions';
|
||||
|
||||
interface Props {
|
||||
@@ -9,18 +9,21 @@ interface Props {
|
||||
|
||||
const outlineTitle = {
|
||||
en: 'Outline',
|
||||
ja: '概要'
|
||||
}
|
||||
ja: '概要',
|
||||
};
|
||||
const outlineContent = {
|
||||
en: 'The BSI-NI (Neuroinformatics) Project was pursued in FY2007-FY 2017 to create a database covering research achievements of RIKEN Brain Science Institute (BSI) to promote information sharing within its organization and with the public domain. Developments by BSI laboratories were supported by the BSI Director\'s Fund.Operation of the project and services were supported by BSI- NI committee and Neuroinformatics Japan Center at RIKEN BSI.Since April 2018, this website is managed by Neuroinformatics Unit, RIKEN Center for Brain Science by aiming the sustainable accessibility of the database. Some of contents are continuously updated by labs at RIKEN Center for Brain Science.',
|
||||
ja: 'BSI-NI(Neuroinformatics)プロジェクトは、理化学研究所脳科学総合研究センター(1997年度-2017年度)の研究成果をデータベース化し公開するために設置されました。脳科学総合研究センター(BSI)では、BSI内外において情報共有を進め、生みだされた膨大かつ高品質なオリジナルデータをデータベースに構築・公開・運用する為に、BSIの予算(BSI-NIファンド)を活用してBSI-NIプロジェクト(2007年度-2017年度)を推進し情報公開に努めた成果です。当サイトはBSI-NI委員会とBSI-NI事務局である神経情報基盤センターによって運用されてきました。 2018年度の脳神経科学研究センターの開始に伴いBSI-NIプロジェクトは終了しましたが、本サイトは引き続き同センター内神経情報基盤開発ユニットが管理運用致します。コンテンツの一部は脳神経科学研究センターのラボにより今後も更新されます。引き続きご利用下さい。'
|
||||
en: "The BSI-NI (Neuroinformatics) Project was pursued in FY2007-FY 2017 to create a database covering research achievements of RIKEN Brain Science Institute (BSI) to promote information sharing within its organization and with the public domain. Developments by BSI laboratories were supported by the BSI Director's Fund.Operation of the project and services were supported by BSI- NI committee and Neuroinformatics Japan Center at RIKEN BSI.Since April 2018, this website is managed by Neuroinformatics Unit, RIKEN Center for Brain Science by aiming the sustainable accessibility of the database. Some of contents are continuously updated by labs at RIKEN Center for Brain Science.",
|
||||
ja: 'BSI-NI(Neuroinformatics)プロジェクトは、理化学研究所脳科学総合研究センター(1997年度-2017年度)の研究成果をデータベース化し公開するために設置されました。脳科学総合研究センター(BSI)では、BSI内外において情報共有を進め、生みだされた膨大かつ高品質なオリジナルデータをデータベースに構築・公開・運用する為に、BSIの予算(BSI-NIファンド)を活用してBSI-NIプロジェクト(2007年度-2017年度)を推進し情報公開に努めた成果です。当サイトはBSI-NI委員会とBSI-NI事務局である神経情報基盤センターによって運用されてきました。 2018年度の脳神経科学研究センターの開始に伴いBSI-NIプロジェクトは終了しましたが、本サイトは引き続き同センター内神経情報基盤開発ユニットが管理運用致します。コンテンツの一部は脳神経科学研究センターのラボにより今後も更新されます。引き続きご利用下さい。',
|
||||
};
|
||||
|
||||
const projectMembers = {
|
||||
en: [
|
||||
{ name: 'Tomoki Fukai, Ph.D.', lab: 'Laboratory Head, Lab. for Neural Circuit Theory' },
|
||||
{ name: 'Atsushi Iriki, D.D.S., Ph.D.', lab: 'Laboratory Head, Lab. for Symbolic Cognitive Development' },
|
||||
{ name: 'Keiichi Kitajo, Ph.D.', lab: 'Deputy Laboratory Head, Advanced Brain Signal Processing\nUnit Leader, Rhythm-based Brain Information Processing Unit, BTCC' },
|
||||
{
|
||||
name: 'Keiichi Kitajo, Ph.D.',
|
||||
lab: 'Deputy Laboratory Head, Advanced Brain Signal Processing\nUnit Leader, Rhythm-based Brain Information Processing Unit, BTCC',
|
||||
},
|
||||
{ name: 'Hajime Hirase, Ph.D.', lab: 'Laboratory Head, Neuron-Glia Circuitry' },
|
||||
{ name: 'Taro Toyoizumi, Ph.D.', lab: 'Laboratory Head, Neural Computation and Adaptation' },
|
||||
{ name: 'Shiro Usui, Ph.D.', lab: 'Senior Advisor, Neuroinformatics Japan Center' },
|
||||
@@ -30,7 +33,10 @@ const projectMembers = {
|
||||
ja: [
|
||||
{ name: '深井 朋樹', lab: '脳回路機能理論研究チーム チームリーダー' },
|
||||
{ name: '入來 篤史', lab: '象徴概念発達研究チーム チームリーダー' },
|
||||
{ name: '北城 圭一', lab: '脳信号処理研究チーム 副チームリーダー\n脳リズム情報処理連携ユニット, BTCC ユニットリーダー' },
|
||||
{
|
||||
name: '北城 圭一',
|
||||
lab: '脳信号処理研究チーム 副チームリーダー\n脳リズム情報処理連携ユニット, BTCC ユニットリーダー',
|
||||
},
|
||||
{ name: '平瀬 肇', lab: '神経グリア回路研究チーム チームリーダー' },
|
||||
{ name: '豊泉 太郎', lab: '神経適応理論研究チーム チームリーダー' },
|
||||
{ name: '臼井 支朗', lab: '神経情報基盤センター 特別顧問' },
|
||||
@@ -54,49 +60,61 @@ const About: React.FC<Props> = (props: Props) => {
|
||||
const { lang } = props;
|
||||
const title = Functions.mlang('[en]About BSI-NI[/en][ja]プロジェクト概要[/ja]', lang);
|
||||
const fy2017 = Functions.mlang('[en]As of FY2017[/en][ja]2017年度[/ja]', lang);
|
||||
return <div className="about">
|
||||
<Helmet><title>{title} - {Config.SITE_TITLE}</title></Helmet>
|
||||
<section>
|
||||
<h2>{Functions.mlang('[en]Project Summary[/en][ja]プロジェクト概要[/ja]', lang)}</h2>
|
||||
return (
|
||||
<div className="about">
|
||||
<Helmet>
|
||||
<title>
|
||||
{title} - {Config.SITE_TITLE}
|
||||
</title>
|
||||
</Helmet>
|
||||
<section>
|
||||
<h3>{outlineTitle[lang]}</h3>
|
||||
<p>{outlineContent[lang]}</p>
|
||||
</section>
|
||||
</section>
|
||||
<section>
|
||||
<h2>{Functions.mlang('[en]Organization (until FY2017)[/en][ja]運営組織 (2017年度まで)[/ja]', lang)}</h2>
|
||||
<section>
|
||||
<h3>{Functions.mlang('[en]BSI-NI Committee Member List[/en][ja]BSI-NI委員会メンバー表[/ja]', lang)}</h3>
|
||||
<table>
|
||||
<caption className="date">{fy2017}</caption>
|
||||
<tbody>
|
||||
{projectMembers[lang].map(member => {
|
||||
const regex = /(\n)/g;
|
||||
return <tr key={member.name}><td>{member.name}</td><td>{member.lab.split(regex).map((line, idx) => {
|
||||
if (line.match(regex)) {
|
||||
return <br key={idx} />;
|
||||
} else {
|
||||
return line;
|
||||
}
|
||||
})}</td></tr>;
|
||||
})}
|
||||
</tbody>
|
||||
</table>
|
||||
<p>{Functions.mlang('◎ [en]acting Chairman[/en][ja]は委員長代行[/ja]', lang)}</p>
|
||||
<h2>{Functions.mlang('[en]Project Summary[/en][ja]プロジェクト概要[/ja]', lang)}</h2>
|
||||
<section>
|
||||
<h3>{outlineTitle[lang]}</h3>
|
||||
<p>{outlineContent[lang]}</p>
|
||||
</section>
|
||||
</section>
|
||||
<section>
|
||||
<h3>{Functions.mlang('[en]BSI-NI Project Secretariat[/en][ja]BSI-NIプロジェクト事務局[/ja]', lang)}</h3>
|
||||
<table>
|
||||
<caption className="date">{fy2017}</caption>
|
||||
<tbody>
|
||||
{projectOffice[lang].map(member => {
|
||||
return <tr key={member.name}><td>{member.name}</td><td>{member.lab}</td></tr>;
|
||||
})}
|
||||
</tbody>
|
||||
</table>
|
||||
<h2>{Functions.mlang('[en]Organization (until FY2017)[/en][ja]運営組織 (2017年度まで)[/ja]', lang)}</h2>
|
||||
<section>
|
||||
<h3>
|
||||
{Functions.mlang('[en]BSI-NI Committee Member List[/en][ja]BSI-NI委員会メンバー表[/ja]', lang)}
|
||||
</h3>
|
||||
<table>
|
||||
<caption className="date">{fy2017}</caption>
|
||||
<tbody>
|
||||
{projectMembers[lang].map((member) => (
|
||||
<tr key={member.name}>
|
||||
<td>{member.name}</td>
|
||||
{/* lab holds newline separated roles */}
|
||||
<td style={{ whiteSpace: 'pre-line' }}>{member.lab}</td>
|
||||
</tr>
|
||||
))}
|
||||
</tbody>
|
||||
</table>
|
||||
<p>{Functions.mlang('◎ [en]acting Chairman[/en][ja]は委員長代行[/ja]', lang)}</p>
|
||||
</section>
|
||||
<section>
|
||||
<h3>
|
||||
{Functions.mlang('[en]BSI-NI Project Secretariat[/en][ja]BSI-NIプロジェクト事務局[/ja]', lang)}
|
||||
</h3>
|
||||
<table>
|
||||
<caption className="date">{fy2017}</caption>
|
||||
<tbody>
|
||||
{projectOffice[lang].map((member) => {
|
||||
return (
|
||||
<tr key={member.name}>
|
||||
<td>{member.name}</td>
|
||||
<td>{member.lab}</td>
|
||||
</tr>
|
||||
);
|
||||
})}
|
||||
</tbody>
|
||||
</table>
|
||||
</section>
|
||||
</section>
|
||||
</section>
|
||||
</div>;
|
||||
}
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default About;
|
||||
export default About;
|
||||
|
||||
+39
-18
@@ -1,6 +1,6 @@
|
||||
import React from 'react';
|
||||
import { Helmet } from 'react-helmet';
|
||||
import Config, { MultiLang } from '../config';
|
||||
import { Helmet } from '@dr.pogodin/react-helmet';
|
||||
import type React from 'react';
|
||||
import Config, { type MultiLang } from '../config';
|
||||
import Functions from '../functions';
|
||||
|
||||
interface Props {
|
||||
@@ -10,19 +10,40 @@ interface Props {
|
||||
const Contact: React.FC<Props> = (props: Props) => {
|
||||
const { lang } = props;
|
||||
const title = Functions.mlang('[en]Contact[/en][ja]お問い合わせ先[/ja]', lang);
|
||||
return <div className="contact">
|
||||
<Helmet><title>{title} - {Config.SITE_TITLE}</title></Helmet>
|
||||
<section>
|
||||
<h2>{title}</h2>
|
||||
<p className="division">{Functions.mlang('[en]Neuroinformatics Unit, Integrative Computational Brain Science Collaboration Center, RIKEN Center for Brain Science[/en][ja]理化学研究所 脳神経科学研究センター 統合計算脳科学連携部門 神経情報基盤開発ユニット[/ja]', lang)}</p>
|
||||
<p className="address">email: cbs-is(at)ml.riken.jp</p>
|
||||
</section>
|
||||
<section>
|
||||
<h2>{Functions.mlang('[en]Request[/en][ja]お願い[/ja]', lang)}</h2>
|
||||
<p>{Functions.mlang('[en]If you use databases or tools provided through the BSI-NI project in a paper, we ask that you cite the source in the acknowledgements for the paper, as designated by each database or tool. Please confirm the details with each person in charge of the database.[/en][ja]このサイトのDBやツールを使用して論文を発表される場合は、それぞれのDB・ツールで指定している方法で謝辞に記載下さい。詳細は個々のDB担当者にご確認下さい。[/ja]', lang)}</p>
|
||||
<p>{Functions.mlang('[en]Also please let us know with the name and volume number of the publication, and the title of your paper.[/en][ja]また、記載掲載誌・掲載号・タイトルをBSI-NIプロジェクト事務局までお知らせ頂ければ幸いです。[/ja]', lang)}</p>
|
||||
</section>
|
||||
</div>;
|
||||
}
|
||||
return (
|
||||
<div className="contact">
|
||||
<Helmet>
|
||||
<title>
|
||||
{title} - {Config.SITE_TITLE}
|
||||
</title>
|
||||
</Helmet>
|
||||
<section>
|
||||
<h2>{title}</h2>
|
||||
<p className="division">
|
||||
{Functions.mlang(
|
||||
'[en]Neuroinformatics Unit, Integrative Computational Brain Science Collaboration Center, RIKEN Center for Brain Science[/en][ja]理化学研究所 脳神経科学研究センター 統合計算脳科学連携部門 神経情報基盤開発ユニット[/ja]',
|
||||
lang
|
||||
)}
|
||||
</p>
|
||||
<p className="address">email: cbs-is(at)ml.riken.jp</p>
|
||||
</section>
|
||||
<section>
|
||||
<h2>{Functions.mlang('[en]Request[/en][ja]お願い[/ja]', lang)}</h2>
|
||||
<p>
|
||||
{Functions.mlang(
|
||||
'[en]If you use databases or tools provided through the BSI-NI project in a paper, we ask that you cite the source in the acknowledgements for the paper, as designated by each database or tool. Please confirm the details with each person in charge of the database.[/en][ja]このサイトのDBやツールを使用して論文を発表される場合は、それぞれのDB・ツールで指定している方法で謝辞に記載下さい。詳細は個々のDB担当者にご確認下さい。[/ja]',
|
||||
lang
|
||||
)}
|
||||
</p>
|
||||
<p>
|
||||
{Functions.mlang(
|
||||
'[en]Also please let us know with the name and volume number of the publication, and the title of your paper.[/en][ja]また、記載掲載誌・掲載号・タイトルをBSI-NIプロジェクト事務局までお知らせ頂ければ幸いです。[/ja]',
|
||||
lang
|
||||
)}
|
||||
</p>
|
||||
</section>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default Contact;
|
||||
export default Contact;
|
||||
|
||||
@@ -5,6 +5,12 @@ export interface NewsItem {
|
||||
content: string;
|
||||
}
|
||||
|
||||
export interface PublicationItem {
|
||||
id: number;
|
||||
title: string;
|
||||
content: string;
|
||||
}
|
||||
|
||||
export interface DbToolsItem {
|
||||
id: number;
|
||||
title: string;
|
||||
@@ -23,4 +29,4 @@ export const fixDbToolsUrl = (url: string): string => {
|
||||
let ret = url.replace(/^https?:\/\/bsi-ni\.brain\.riken\.jp/, '');
|
||||
ret = ret.replace(/^\/modules\/page\/index\.php\?content_id=/, '/page/');
|
||||
return ret;
|
||||
}
|
||||
};
|
||||
|
||||
+111
-62
@@ -1,11 +1,12 @@
|
||||
import React from 'react';
|
||||
import { Helmet } from 'react-helmet';
|
||||
import { HashLink } from 'react-router-hash-link';
|
||||
import { Helmet } from '@dr.pogodin/react-helmet';
|
||||
import type React from 'react';
|
||||
import { Link } from 'react-router';
|
||||
|
||||
import XoopsCode from '../common/lib/XoopsCode';
|
||||
import Config, { MultiLang } from '../config';
|
||||
import Config, { type MultiLang } from '../config';
|
||||
import Functions from '../functions';
|
||||
import dbtoolsJson from './assets/dbtools.json';
|
||||
import { DbToolsItem, fixDbToolsUrl } from './CustomUtil';
|
||||
import { siteData } from '../siteData';
|
||||
import { type DbToolsItem, fixDbToolsUrl } from './CustomUtil';
|
||||
|
||||
interface DbToolProps {
|
||||
lang: MultiLang;
|
||||
@@ -15,34 +16,49 @@ interface DbToolProps {
|
||||
const DbTool: React.FC<DbToolProps> = (props: DbToolProps) => {
|
||||
const { lang, item } = props;
|
||||
const title = Functions.mlang(item.title, lang);
|
||||
return <div id={`jump${item.id}`}>
|
||||
<h5>{title}</h5>
|
||||
<div className="item">
|
||||
<div className="icon">
|
||||
<img src={item.image0} alt={title} />
|
||||
</div>
|
||||
<div className="info">
|
||||
<div className="summary">
|
||||
<{Functions.mlang('[en]Summary[/en][ja]概要[/ja]', lang)}>
|
||||
<div><XoopsCode lang={lang} text={item.summary} dohtml={true} /></div>
|
||||
return (
|
||||
<div id={`jump${item.id}`}>
|
||||
<h5>{title}</h5>
|
||||
<div className="item">
|
||||
<div className="icon">
|
||||
<img src={item.image0} alt={title} />
|
||||
</div>
|
||||
<div className="contact">
|
||||
<{Functions.mlang('[en]Contact Information[/en][ja]問い合わせ先[/ja]', lang)}>
|
||||
<div>
|
||||
{Functions.mlang(item.group, lang)}
|
||||
{item.person !== '' && <> ({Functions.mlang(item.person, lang)} : <em>{item.email}</em>)</>}
|
||||
<div className="info">
|
||||
<div className="summary">
|
||||
<{Functions.mlang('[en]Summary[/en][ja]概要[/ja]', lang)}>
|
||||
<div>
|
||||
<XoopsCode lang={lang} text={item.summary} dohtml={true} />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div className="url">
|
||||
<URL>
|
||||
<div>
|
||||
{item.url !== '' ? <a href={fixDbToolsUrl(item.url)} target="_blank" rel="noopener noreferrer">{item.url}</a> : <>(unreleased)</>}
|
||||
<div className="contact">
|
||||
<{Functions.mlang('[en]Contact Information[/en][ja]問い合わせ先[/ja]', lang)}>
|
||||
<div>
|
||||
{Functions.mlang(item.group, lang)}
|
||||
{item.person !== '' && (
|
||||
<>
|
||||
{' '}
|
||||
({Functions.mlang(item.person, lang)} : <em>{item.email}</em>)
|
||||
</>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
<div className="url">
|
||||
<URL>
|
||||
<div>
|
||||
{item.url !== '' ? (
|
||||
<a href={fixDbToolsUrl(item.url)} target="_blank" rel="noopener noreferrer">
|
||||
{item.url}
|
||||
</a>
|
||||
) : (
|
||||
<>(unreleased)</>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>;
|
||||
}
|
||||
);
|
||||
};
|
||||
|
||||
interface Props {
|
||||
lang: MultiLang;
|
||||
@@ -50,48 +66,81 @@ interface Props {
|
||||
|
||||
const DbTools: React.FC<Props> = (props: Props) => {
|
||||
const { lang } = props;
|
||||
const dbtools = dbtoolsJson as DbToolsItem[];
|
||||
const databases = dbtools.filter((dbtool) => { return dbtool.type === 'database'; });
|
||||
const tools = dbtools.filter((dbtool) => { return dbtool.type === 'tool'; });
|
||||
const dbtools: DbToolsItem[] = siteData().dbtools;
|
||||
const databases = dbtools.filter((dbtool) => {
|
||||
return dbtool.type === 'database';
|
||||
});
|
||||
const tools = dbtools.filter((dbtool) => {
|
||||
return dbtool.type === 'tool';
|
||||
});
|
||||
const title = Functions.mlang('[en]Databases & Tools[/en][ja]データベース・ツール[/ja]', lang);
|
||||
const titleDatabases = Functions.mlang('[en]Databases[/en][ja]データベース[/ja]', lang);
|
||||
const titleTools = Functions.mlang('[en]Tools[/en][ja]ツール[/ja]', lang);
|
||||
return <div className="dbtools">
|
||||
<Helmet><title>{title} - {Config.SITE_TITLE}</title></Helmet>
|
||||
<section className="index">
|
||||
<h2>{title}</h2>
|
||||
<div className="types">
|
||||
<section className="databases">
|
||||
<h3>{titleDatabases}</h3>
|
||||
return (
|
||||
<div className="dbtools">
|
||||
<Helmet>
|
||||
<title>
|
||||
{title} - {Config.SITE_TITLE}
|
||||
</title>
|
||||
</Helmet>
|
||||
<section className="index">
|
||||
<h2>{title}</h2>
|
||||
<div className="types">
|
||||
<section className="databases">
|
||||
<h3>{titleDatabases}</h3>
|
||||
<ul>
|
||||
{databases.map((item) => (
|
||||
<li key={item.id}>
|
||||
<Link to={`#jump${item.id}`}>{Functions.mlang(item.title, lang)}</Link>
|
||||
{item.jnode && <span className="incf-japan-node"> *</span>}
|
||||
</li>
|
||||
))}
|
||||
</ul>
|
||||
</section>
|
||||
<section className="tools">
|
||||
<h3>{titleTools}</h3>
|
||||
<ul>
|
||||
{tools.map((item) => (
|
||||
<li key={item.id}>
|
||||
<Link to={`#jump${item.id}`}>{Functions.mlang(item.title, lang)}</Link>
|
||||
{item.jnode && <span className="incf-japan-node"> *</span>}
|
||||
</li>
|
||||
))}
|
||||
</ul>
|
||||
</section>
|
||||
</div>
|
||||
<p className="legend">INCF Japan Node Platform</p>
|
||||
</section>
|
||||
<section className="detail">
|
||||
<h3>
|
||||
{Functions.mlang(
|
||||
'[en]Ongoing assignment and its progress[/en][ja]各継続課題とその進捗について[/ja]',
|
||||
lang
|
||||
)}
|
||||
</h3>
|
||||
<section>
|
||||
<h4>{titleDatabases}</h4>
|
||||
<ul>
|
||||
{databases.map(item => <li key={item.id}><HashLink to={`#jump${item.id}`}>{Functions.mlang(item.title, lang)}</HashLink>{item.jnode && <span className="incf-japan-node"> *</span>}</li>)}
|
||||
{databases.map((item) => (
|
||||
<li key={item.id}>
|
||||
<DbTool lang={lang} item={item} />
|
||||
</li>
|
||||
))}
|
||||
</ul>
|
||||
</section>
|
||||
<section className="tools">
|
||||
<h3>{titleTools}</h3>
|
||||
<section>
|
||||
<h4>{titleTools}</h4>
|
||||
<ul>
|
||||
{tools.map(item => <li key={item.id}><HashLink to={`#jump${item.id}`}>{Functions.mlang(item.title, lang)}</HashLink>{item.jnode && <span className="incf-japan-node"> *</span>}</li>)}
|
||||
{tools.map((item) => (
|
||||
<li key={item.id}>
|
||||
<DbTool lang={lang} item={item} />
|
||||
</li>
|
||||
))}
|
||||
</ul>
|
||||
</section>
|
||||
</div>
|
||||
<p className="legend">INCF Japan Node Platform</p>
|
||||
</section>
|
||||
<section className="detail">
|
||||
<h3>{Functions.mlang('[en]Ongoing assignment and its progress[/en][ja]各継続課題とその進捗について[/ja]', lang)}</h3>
|
||||
<section>
|
||||
<h4>{titleDatabases}</h4>
|
||||
<ul>
|
||||
{databases.map(item => <li key={item.id}><DbTool lang={lang} item={item} /></li>)}
|
||||
</ul>
|
||||
</section>
|
||||
<section>
|
||||
<h4>{titleTools}</h4>
|
||||
<ul>
|
||||
{tools.map(item => <li key={item.id}><DbTool lang={lang} item={item} /></li>)}
|
||||
</ul>
|
||||
</section>
|
||||
</section>
|
||||
</div >;
|
||||
}
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default DbTools;
|
||||
export default DbTools;
|
||||
|
||||
+44
-29
@@ -1,9 +1,10 @@
|
||||
import React from 'react';
|
||||
import { HashLink } from 'react-router-hash-link';
|
||||
import { MultiLang } from '../config';
|
||||
import type React from 'react';
|
||||
import { Link } from 'react-router';
|
||||
|
||||
import type { MultiLang } from '../config';
|
||||
import Functions from '../functions';
|
||||
import dbtoolsJson from './assets/dbtools.json';
|
||||
import { DbToolsItem, fixDbToolsUrl } from './CustomUtil';
|
||||
import { siteData } from '../siteData';
|
||||
import { type DbToolsItem, fixDbToolsUrl } from './CustomUtil';
|
||||
|
||||
interface Props {
|
||||
lang: MultiLang;
|
||||
@@ -11,29 +12,43 @@ interface Props {
|
||||
|
||||
const DbToolsTop: React.FC<Props> = (props: Props) => {
|
||||
const { lang } = props;
|
||||
const dbtools = dbtoolsJson as DbToolsItem[];
|
||||
const dbtools: DbToolsItem[] = siteData().dbtools;
|
||||
const more = Functions.mlang('[en]Detail[/en][ja]概要へ[/ja]', lang);
|
||||
return <div className="dbtools-top">
|
||||
<ul>
|
||||
{dbtools.map(item => {
|
||||
const title = Functions.mlang(item.title, lang);
|
||||
const link = item.url === '' ? title : <a href={fixDbToolsUrl(item.url)} target="_blank" rel="noopener noreferrer">{title}</a>;
|
||||
return <li key={item.id}>
|
||||
<div className="icon">
|
||||
<img src={item.image1} alt={title} />
|
||||
</div>
|
||||
<div className="info">
|
||||
<h3>{link}{item.jnode && <span className="incf-japan-node"> *</span>}</h3>
|
||||
<span className="detail">
|
||||
<HashLink to={`/dbtools#jump${item.id}`}>{more}</HashLink>
|
||||
</span>
|
||||
{item.url === '' && <div>(unreleased)</div>}
|
||||
</div>
|
||||
</li>;
|
||||
})}
|
||||
</ul>
|
||||
<p className="legend">INCF Japan Node Platform</p>
|
||||
</div>;
|
||||
}
|
||||
return (
|
||||
<div className="dbtools-top">
|
||||
<ul>
|
||||
{dbtools.map((item) => {
|
||||
const title = Functions.mlang(item.title, lang);
|
||||
const link =
|
||||
item.url === '' ? (
|
||||
title
|
||||
) : (
|
||||
<a href={fixDbToolsUrl(item.url)} target="_blank" rel="noopener noreferrer">
|
||||
{title}
|
||||
</a>
|
||||
);
|
||||
return (
|
||||
<li key={item.id}>
|
||||
<div className="icon">
|
||||
<img src={item.image1} alt={title} />
|
||||
</div>
|
||||
<div className="info">
|
||||
<h3>
|
||||
{link}
|
||||
{item.jnode && <span className="incf-japan-node"> *</span>}
|
||||
</h3>
|
||||
<span className="detail">
|
||||
<Link to={`/dbtools#jump${item.id}`}>{more}</Link>
|
||||
</span>
|
||||
{item.url === '' && <div>(unreleased)</div>}
|
||||
</div>
|
||||
</li>
|
||||
);
|
||||
})}
|
||||
</ul>
|
||||
<p className="legend">INCF Japan Node Platform</p>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default DbToolsTop;
|
||||
export default DbToolsTop;
|
||||
|
||||
+32
-24
@@ -1,10 +1,10 @@
|
||||
import React from 'react';
|
||||
import { Helmet } from 'react-helmet';
|
||||
import { Helmet } from '@dr.pogodin/react-helmet';
|
||||
import type React from 'react';
|
||||
import XoopsCode from '../common/lib/XoopsCode';
|
||||
import Config, { MultiLang } from '../config';
|
||||
import Config, { type MultiLang } from '../config';
|
||||
import Functions from '../functions';
|
||||
import newsJson from './assets/news.json';
|
||||
import { NewsItem } from './CustomUtil';
|
||||
import { siteData } from '../siteData';
|
||||
import type { NewsItem } from './CustomUtil';
|
||||
|
||||
interface Props {
|
||||
lang: MultiLang;
|
||||
@@ -13,23 +13,31 @@ interface Props {
|
||||
const News: React.FC<Props> = (props: Props) => {
|
||||
const { lang } = props;
|
||||
const title = Functions.mlang('[en]News[/en][ja]ニュース[/ja]', lang);
|
||||
return <div className="news">
|
||||
<Helmet><title>{title} - {Config.SITE_TITLE}</title></Helmet>
|
||||
<section>
|
||||
<h2>{title}</h2>
|
||||
{newsJson.map((item) => {
|
||||
const article = item as NewsItem;
|
||||
const key = `news${article.id}`;
|
||||
return <section key={key}>
|
||||
<h3 id={key}>{Functions.mlang(article.title, lang)}</h3>
|
||||
<div className="date">{article.date}</div>
|
||||
<div className="contents">
|
||||
<XoopsCode lang={lang} text={article.content} dohtml={true} />
|
||||
</div>
|
||||
</section>;
|
||||
})}
|
||||
</section>
|
||||
</div>;
|
||||
}
|
||||
return (
|
||||
<div className="news">
|
||||
<Helmet>
|
||||
<title>
|
||||
{title} - {Config.SITE_TITLE}
|
||||
</title>
|
||||
</Helmet>
|
||||
<section>
|
||||
<h2>{title}</h2>
|
||||
{siteData().news.map((item) => {
|
||||
const article = item as NewsItem;
|
||||
const key = `news${article.id}`;
|
||||
return (
|
||||
<section key={key}>
|
||||
<h3 id={key}>{Functions.mlang(article.title, lang)}</h3>
|
||||
<div className="date">{article.date}</div>
|
||||
<div className="contents">
|
||||
<XoopsCode lang={lang} text={article.content} dohtml={true} />
|
||||
</div>
|
||||
</section>
|
||||
);
|
||||
})}
|
||||
</section>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default News;
|
||||
export default News;
|
||||
|
||||
+39
-27
@@ -1,14 +1,14 @@
|
||||
import { Helmet } from '@dr.pogodin/react-helmet';
|
||||
import React from 'react';
|
||||
import { Helmet } from 'react-helmet';
|
||||
import Config, { MultiLang } from '../config';
|
||||
import Config, { type MultiLang } from '../config';
|
||||
import styles from '../database/Database.module.css';
|
||||
import DatabaseListItem from '../database/lib/DatabaseListItem';
|
||||
import ItemUtil, { SearchCallbackFunc, SortCondition } from '../database/lib/ItemUtil';
|
||||
import ItemUtil, { type SearchCallbackFunc, type SortCondition } from '../database/lib/ItemUtil';
|
||||
import Functions from '../functions';
|
||||
|
||||
interface Props {
|
||||
lang: MultiLang;
|
||||
id: 6 | 9
|
||||
id: 6 | 9;
|
||||
}
|
||||
|
||||
const pageDetails = {
|
||||
@@ -27,14 +27,13 @@ const pageDetails = {
|
||||
group: '[en]Laboratory for Mathematical Neuroscience[/en][ja]脳数理研究チーム[/ja]',
|
||||
person: '',
|
||||
email: '',
|
||||
summary: '[en]Mathematical neuroscience searches for fundamental principles of information processing by using simples models of neural networks through mathematical analysis, although the brain has found the same principles through a long history of evolution. The current project is a historical one, integrating published and unpublished papers towards establishment of mathematical neuroscience.[/en][ja]数理脳科学は、脳が長い進化の歴史の中で見出した脳型情報処理の基本原理を、簡単なモデルを用いて数理の力で見つけようとする。このプロジェクトは、数理脳科学の確立に向けた努力を文献を中心にまとめた歴史的な資料である。[/ja]',
|
||||
summary:
|
||||
'[en]Mathematical neuroscience searches for fundamental principles of information processing by using simples models of neural networks through mathematical analysis, although the brain has found the same principles through a long history of evolution. The current project is a historical one, integrating published and unpublished papers towards establishment of mathematical neuroscience.[/en][ja]数理脳科学は、脳が長い進化の歴史の中で見出した脳型情報処理の基本原理を、簡単なモデルを用いて数理の力で見つけようとする。このプロジェクトは、数理脳科学の確立に向けた努力を文献を中心にまとめた歴史的な資料である。[/ja]',
|
||||
indexId: 39,
|
||||
}
|
||||
}
|
||||
|
||||
},
|
||||
};
|
||||
|
||||
class Page extends React.Component<Props> {
|
||||
|
||||
constructor(props: Props) {
|
||||
super(props);
|
||||
this.searchFunc = this.searchFunc.bind(this);
|
||||
@@ -49,25 +48,38 @@ class Page extends React.Component<Props> {
|
||||
render() {
|
||||
const { lang, id: type } = this.props;
|
||||
const detail = pageDetails[type];
|
||||
return <div className="page">
|
||||
<Helmet><title>{detail.title} - {Config.SITE_TITLE}</title></Helmet>
|
||||
<section>
|
||||
<h2>{detail.title}</h2>
|
||||
<p className="logo"><img src={detail.image} alt={detail.title} /></p>
|
||||
{detail.summary && <p className="summary">{Functions.mlang(detail.summary, lang)}</p>}
|
||||
<div className={styles.database}>
|
||||
<DatabaseListItem lang={lang} url={`/page/${type}`} search={this.searchFunc} />
|
||||
</div>
|
||||
<p className="contact">
|
||||
<{Functions.mlang('[en]Contact Information[/en][ja]問い合わせ先[/ja]', lang)}>
|
||||
<div>
|
||||
{Functions.mlang(detail.group, lang)}
|
||||
{detail.person !== '' && <> ({Functions.mlang(detail.person, lang)} : <em>{detail.email}</em>)</>}
|
||||
return (
|
||||
<div className="page">
|
||||
<Helmet>
|
||||
<title>
|
||||
{detail.title} - {Config.SITE_TITLE}
|
||||
</title>
|
||||
</Helmet>
|
||||
<section>
|
||||
<h2>{detail.title}</h2>
|
||||
<p className="logo">
|
||||
<img src={detail.image} alt={detail.title} />
|
||||
</p>
|
||||
{detail.summary && <p className="summary">{Functions.mlang(detail.summary, lang)}</p>}
|
||||
<div className={styles.database}>
|
||||
<DatabaseListItem lang={lang} url={`/page/${type}`} search={this.searchFunc} />
|
||||
</div>
|
||||
</p>
|
||||
</section>
|
||||
</div>;
|
||||
<p className="contact">
|
||||
<{Functions.mlang('[en]Contact Information[/en][ja]問い合わせ先[/ja]', lang)}>
|
||||
<div>
|
||||
{Functions.mlang(detail.group, lang)}
|
||||
{detail.person !== '' && (
|
||||
<>
|
||||
{' '}
|
||||
({Functions.mlang(detail.person, lang)} : <em>{detail.email}</em>)
|
||||
</>
|
||||
)}
|
||||
</div>
|
||||
</p>
|
||||
</section>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
export default Page;
|
||||
export default Page;
|
||||
|
||||
+21
-86
@@ -1,95 +1,30 @@
|
||||
import React from 'react';
|
||||
import { Helmet } from 'react-helmet';
|
||||
import Config, { MultiLang } from '../config';
|
||||
import { Helmet } from '@dr.pogodin/react-helmet';
|
||||
import XoopsCode from '../common/lib/XoopsCode';
|
||||
import Config, { type MultiLang } from '../config';
|
||||
import Functions from '../functions';
|
||||
import { siteData } from '../siteData';
|
||||
|
||||
interface Props {
|
||||
lang: MultiLang;
|
||||
}
|
||||
|
||||
const publications = [
|
||||
{
|
||||
key: 'cdtdb',
|
||||
name: 'BrainTx (Former CDT-DB)',
|
||||
items: [
|
||||
{
|
||||
title: 'Cerebellar development transcriptome (CDT-DB): profiling of spatio-temporal gene expression during the postnatal development of mouse cerebellum.',
|
||||
author: 'Sato, A., Sekine, Y., Saruta, C., Nishibe, H., Morita, N., Sato, Y., Sadakata, T., Shinoda, Y., Kojima, T., and Furuichi, T.',
|
||||
description: 'Neural Networks 21:1056-1069. (2008)',
|
||||
pmid: '18603407',
|
||||
},
|
||||
{
|
||||
title: 'Deciphering the genetic blueprint of cerebellar development by the gene expression profiling informatics. Neural information processing.',
|
||||
author: 'Sato, A., Morita, N., Sadakata, T., Yoshikawa, F., Shiraishi-Yamaguchi, Y., Huang, JH., Shoji, S., Tomomura, M., Sato, Y., Suga, E., Sekine, Y., Kitamura, A., Shibata, Y., Furuichi, T.',
|
||||
description: 'Lecture Notes in Computer Science 3316:880-884. (2004) Springer-Verlag, Berlin, Heidelberger, Germany',
|
||||
pmid: '',
|
||||
},
|
||||
{
|
||||
title: 'Investigation of differentially expressed genes during the development of mouse cerebellum.',
|
||||
author: 'Kagami, Y., and Furuichi, T.',
|
||||
description: 'Brain Research Gene Expression Patterns 1:39-59. (2001)',
|
||||
pmid: '15018818',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
key: 'eeg',
|
||||
name: 'Multichannel EEG data for BMI and Human Emotions',
|
||||
items: [
|
||||
{
|
||||
title: 'Tensor Decompositions for Feature Extraction and Classification of High Dimensional Datasets.',
|
||||
author: 'Phan A-H, Cichocki A.',
|
||||
description: 'Nonlinear Theory and Its Applications, IEICE, 1(1), 37-68 (2010).',
|
||||
pmid: '',
|
||||
|
||||
},
|
||||
{
|
||||
title: 'Generalizing the column-row matrix decomposition to multi-way arrays.',
|
||||
author: 'Caiafa C, Cichocki A.',
|
||||
description: 'Linear Algebra and its Applications, 433 (3), 557-573 (2010).',
|
||||
pmid: '',
|
||||
},
|
||||
{
|
||||
title: 'Extended HALS Algorithm for Nonnegative Tucker Decomposition and its Applications for Multi-Way Analysis and Classification.',
|
||||
author: 'Phan A-H, Cichocki A.',
|
||||
description: 'Neurocomputing 2011 (in press).',
|
||||
pmid: '',
|
||||
},
|
||||
{
|
||||
title: 'Fast Local Algorithms for Large Scale Nonnegative Matrix and Tensor Factorizations.',
|
||||
author: 'Cichocki A, Phan A-H.',
|
||||
description: 'IEICE Trans. Fundamentals E92-A(3), 708-721 (invited paper) (2009).',
|
||||
pmid: '',
|
||||
},
|
||||
{
|
||||
title: 'Nonnegative Matrix and Tensor Factorizations: Applications to Exploratory Multi-way Data Analysis,',
|
||||
author: 'Cichock A., Zdunek R.. Phan, A.H. and Amari: S.',
|
||||
description: 'John Wiley (2009), ISBN: 978-0-470-74666-0,',
|
||||
pmid: '',
|
||||
},
|
||||
]
|
||||
}
|
||||
];
|
||||
|
||||
|
||||
const Publication: React.FC<Props> = (props: Props) => {
|
||||
const Publication = (props: Props) => {
|
||||
const { lang } = props;
|
||||
const title = Functions.mlang('[en]Related Publications[/en][ja]関連論文[/ja]', lang);
|
||||
return <div className="publication">
|
||||
<Helmet><title>{title} - {Config.SITE_TITLE}</title></Helmet>
|
||||
<section>
|
||||
<h2>{title}</h2>
|
||||
{publications.map(publication => <section key={publication.key}>
|
||||
<h3 className={`name ${publication.key}`}>{publication.name}</h3>
|
||||
{publication.items.map(item => <article key={item.title}>
|
||||
<h4 className="title">{item.title}</h4>
|
||||
<p className="author">{item.author}</p>
|
||||
<p className="description">{item.description}</p>
|
||||
{item.pmid !== '' && <p className="pmid"><a href={`https://www.ncbi.nlm.nih.gov/pubmed/${item.pmid}`} target="_blank" rel="noopener noreferrer">PMID: {item.pmid}</a></p>}
|
||||
</article>)}
|
||||
</section>)}
|
||||
</section>
|
||||
</div>;
|
||||
}
|
||||
return (
|
||||
<div className="publication">
|
||||
<Helmet>
|
||||
<title>
|
||||
{title} - {Config.SITE_TITLE}
|
||||
</title>
|
||||
</Helmet>
|
||||
<section>
|
||||
{siteData().publication.map((item) => (
|
||||
<XoopsCode key={item.id} lang={lang} text={item.content} dohtml={true} />
|
||||
))}
|
||||
</section>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default Publication;
|
||||
export default Publication;
|
||||
|
||||
+37
-31
@@ -1,11 +1,11 @@
|
||||
import React from 'react';
|
||||
import { Link } from 'react-router-dom';
|
||||
import { HashLink } from 'react-router-hash-link';
|
||||
import type React from 'react';
|
||||
import { Link } from 'react-router';
|
||||
|
||||
import NoticeSiteHasBeenArchived from '../common/lib/NoticeSiteHasBeenArchived';
|
||||
import { MultiLang } from '../config';
|
||||
import type { MultiLang } from '../config';
|
||||
import Functions from '../functions';
|
||||
import newsJson from './assets/news.json';
|
||||
import { NewsItem } from './CustomUtil';
|
||||
import { siteData } from '../siteData';
|
||||
import type { NewsItem } from './CustomUtil';
|
||||
|
||||
interface Props {
|
||||
lang: MultiLang;
|
||||
@@ -13,33 +13,39 @@ interface Props {
|
||||
|
||||
const message = {
|
||||
en: 'Databases and tools created by RIKEN BSI laboratories in BSI-NI Project(FY2007-FY2017) are available from this website. Since FY2018, this website is managed by Neuroinformatics Unit, RIKEN Center for Brain Science. We hope this site helps to promote further development of brain research.',
|
||||
ja: 'このウェブサイトは、理化学研究所 脳科学総合研究センター(1997年度-2017年度)のBSI-NIプロジェクト(2007年度-2017年度)にて構築されたBSI研究室のデーターベース・ツールを公開しています。本サイトは2018年度より理化学研究所 脳神経科学研究センター 神経情報基盤開発ユニットが運用を担当し、コンテンツ公開を継続して行っています。これらのデータベース・ツールのご利用が神経科学の発展に役立つことを期待しています。'
|
||||
ja: 'このウェブサイトは、理化学研究所 脳科学総合研究センター(1997年度-2017年度)のBSI-NIプロジェクト(2007年度-2017年度)にて構築されたBSI研究室のデーターベース・ツールを公開しています。本サイトは2018年度より理化学研究所 脳神経科学研究センター 神経情報基盤開発ユニットが運用を担当し、コンテンツ公開を継続して行っています。これらのデータベース・ツールのご利用が神経科学の発展に役立つことを期待しています。',
|
||||
};
|
||||
|
||||
const WhatsNew: React.FC<Props> = (props: Props) => {
|
||||
const { lang } = props;
|
||||
let items: NewsItem[] = [];
|
||||
for (let i = 0; i < 3; i++) {
|
||||
items.push(newsJson[i] as NewsItem);
|
||||
}
|
||||
return <div className="block">
|
||||
<section>
|
||||
<NoticeSiteHasBeenArchived lang={lang} />
|
||||
<p>{message[lang]}</p>
|
||||
</section>
|
||||
<hr />
|
||||
<section className="whatsnew">
|
||||
<div className="title">
|
||||
<h3>{Functions.mlang('[en]What\'s new[/en][ja]最新ニュース[/ja]', lang)}</h3>
|
||||
<p className="more"><Link to="/news">More ...</Link></p>
|
||||
</div>
|
||||
<div className="news">
|
||||
<ul>
|
||||
{items.map((item) => <li key={item.id}><span className="date">{item.date}</span><HashLink to={`/news#news${item.id}`} >{Functions.mlang(item.title, lang)}</HashLink></li>)}
|
||||
</ul>
|
||||
</div>
|
||||
</section>
|
||||
</div>;
|
||||
}
|
||||
const items: NewsItem[] = siteData().news.slice(0, 3);
|
||||
return (
|
||||
<div className="block">
|
||||
<section>
|
||||
<NoticeSiteHasBeenArchived lang={lang} />
|
||||
<p>{message[lang]}</p>
|
||||
</section>
|
||||
<hr />
|
||||
<section className="whatsnew">
|
||||
<div className="title">
|
||||
<h3>{Functions.mlang("[en]What's new[/en][ja]最新ニュース[/ja]", lang)}</h3>
|
||||
<p className="more">
|
||||
<Link to="/news">More ...</Link>
|
||||
</p>
|
||||
</div>
|
||||
<div className="news">
|
||||
<ul>
|
||||
{items.map((item) => (
|
||||
<li key={item.id}>
|
||||
<span className="date">{item.date}</span>
|
||||
<Link to={`/news#news${item.id}`}>{Functions.mlang(item.title, lang)}</Link>
|
||||
</li>
|
||||
))}
|
||||
</ul>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default WhatsNew;
|
||||
export default WhatsNew;
|
||||
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+24
-20
@@ -1,8 +1,7 @@
|
||||
import React from 'react';
|
||||
import { Helmet } from 'react-helmet';
|
||||
import { Route, RouteComponentProps, Switch } from 'react-router-dom';
|
||||
import { Helmet } from '@dr.pogodin/react-helmet';
|
||||
import { Route, Routes } from 'react-router';
|
||||
import PageNotFound from '../common/lib/PageNotFound';
|
||||
import { MultiLang } from '../config';
|
||||
import type { MultiLang } from '../config';
|
||||
import Functions from '../functions';
|
||||
import styles from './Database.module.css';
|
||||
import DatabaseAdvancedSearch from './DatabaseAdvancedSearch';
|
||||
@@ -22,23 +21,28 @@ const Database = (props: Props) => {
|
||||
return (
|
||||
<div className={styles.database}>
|
||||
<Helmet>
|
||||
<title>{Functions.mlang('[en]Database[/en][ja]データベース[/ja]', lang)} - {Functions.siteTitle(lang)}</title>
|
||||
<title>
|
||||
{Functions.mlang('[en]Database[/en][ja]データベース[/ja]', lang)} - {Functions.siteTitle(lang)}
|
||||
</title>
|
||||
</Helmet>
|
||||
<Switch>
|
||||
<Route exact path="/database" render={(props: RouteComponentProps) => <DatabaseTop lang={lang} {...props} />} />
|
||||
<Route exact path="/database/item/:id" render={(props: RouteComponentProps<{ id: string }>) => <DatabaseDetailItem lang={lang} {...props} />} />
|
||||
<Route exact path="/database/item/id/:doi" render={(props: RouteComponentProps<{ doi: string }>) => <DatabaseDetailItem lang={lang} {...props} />} />
|
||||
<Route exact path="/database/advanced" render={(props: RouteComponentProps) => <DatabaseAdvancedSearch lang={lang} {...props} />} />
|
||||
<Route exact path="/database/list" render={(props: RouteComponentProps) => <DatabaseSearchByIndexId lang={lang} {...props} />} />
|
||||
<Route exact path="/database/list/:id" render={(props: RouteComponentProps<{ id: string }>) => <DatabaseSearchByIndexId lang={lang} {...props} />} />
|
||||
<Route exact path="/database/search" render={(props: RouteComponentProps) => <DatabaseSearchByKeyword lang={lang} {...props} />} />
|
||||
<Route exact path="/database/search/advanced" render={(props: RouteComponentProps) => <DatabaseSearchByAdvancedKeyword lang={lang} {...props} />} />
|
||||
<Route exact path="/database/search/itemtype/:itemType" render={(props: RouteComponentProps<{ itemType: string }>) => <DatabaseSearchByItemType lang={lang} {...props} />} />
|
||||
<Route exact path="/database/search/itemtype/:itemType/:subItemType" render={(props: RouteComponentProps<{ itemType: string; subItemType: string }>) => <DatabaseSearchByItemType lang={lang} {...props} />} />
|
||||
<Route component={PageNotFound} />
|
||||
</Switch>
|
||||
<Routes>
|
||||
<Route index element={<DatabaseTop lang={lang} />} />
|
||||
<Route path="item/:id" element={<DatabaseDetailItem lang={lang} />} />
|
||||
<Route path="item/id/:doi" element={<DatabaseDetailItem lang={lang} />} />
|
||||
<Route path="advanced" element={<DatabaseAdvancedSearch lang={lang} />} />
|
||||
<Route path="list" element={<DatabaseSearchByIndexId lang={lang} />} />
|
||||
<Route path="list/:id" element={<DatabaseSearchByIndexId lang={lang} />} />
|
||||
<Route path="search" element={<DatabaseSearchByKeyword lang={lang} />} />
|
||||
<Route path="search/advanced" element={<DatabaseSearchByAdvancedKeyword lang={lang} />} />
|
||||
<Route path="search/itemtype/:itemType" element={<DatabaseSearchByItemType lang={lang} />} />
|
||||
<Route
|
||||
path="search/itemtype/:itemType/:subItemType"
|
||||
element={<DatabaseSearchByItemType lang={lang} />}
|
||||
/>
|
||||
<Route path="*" element={<PageNotFound lang={lang} />} />
|
||||
</Routes>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
export default Database;
|
||||
export default Database;
|
||||
|
||||
@@ -1,48 +1,45 @@
|
||||
import React, { Component } from 'react';
|
||||
import { RouteComponentProps } from 'react-router';
|
||||
import Config, { MultiLang } from '../config';
|
||||
import { useState } from 'react';
|
||||
import { useNavigate } from 'react-router';
|
||||
import Config, { type MultiLang } from '../config';
|
||||
import Functions from '../functions';
|
||||
import ItemType from './item-type';
|
||||
import AdvancedSearchQuery from './lib/AdvancedSearchQuery';
|
||||
import ItemUtil from './lib/ItemUtil';
|
||||
|
||||
interface Props extends RouteComponentProps {
|
||||
interface Props {
|
||||
lang: MultiLang;
|
||||
}
|
||||
|
||||
class DatabaseAdvancedSearch extends Component<Props> {
|
||||
const DatabaseAdvancedSearch = (props: Props) => {
|
||||
const { lang } = props;
|
||||
const navigate = useNavigate();
|
||||
// The child fields mutate this instance directly, so it must survive re-renders.
|
||||
const [query] = useState(() => new AdvancedSearchQuery());
|
||||
|
||||
private query: AdvancedSearchQuery = new AdvancedSearchQuery();
|
||||
|
||||
constructor(props: Props) {
|
||||
super(props);
|
||||
this.handleClickSearchButton = this.handleClickSearchButton.bind(this);
|
||||
}
|
||||
|
||||
handleClickSearchButton() {
|
||||
if (!this.query.empty()) {
|
||||
const url = ItemUtil.getSearchByAdvancedKeywordsUrl(this.query);
|
||||
this.props.history.push(url);
|
||||
const handleClickSearchButton = () => {
|
||||
if (!query.empty()) {
|
||||
void navigate(ItemUtil.getSearchByAdvancedKeywordsUrl(query));
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
render() {
|
||||
const { lang } = this.props;
|
||||
return (
|
||||
<div className="advancedSearch">
|
||||
<h3>{Functions.mlang('[en]Search Items[/en][ja]アイテム検索[/ja]', lang)}</h3>
|
||||
<div className="search">
|
||||
<button className="formButton" onClick={this.handleClickSearchButton}>Search</button>
|
||||
</div>
|
||||
{Config.XOONIPS_ITEMTYPES.map((type) => {
|
||||
return <ItemType.AdvancedSearch key={type} type={'xnp' + type} lang={lang} query={this.query} />;
|
||||
})}
|
||||
<div className="search">
|
||||
<button className="formButton" onClick={this.handleClickSearchButton}>Search</button>
|
||||
</div>
|
||||
return (
|
||||
<div className="advancedSearch">
|
||||
<h3>{Functions.mlang('[en]Search Items[/en][ja]アイテム検索[/ja]', lang)}</h3>
|
||||
<div className="search">
|
||||
<button type="button" className="formButton" onClick={handleClickSearchButton}>
|
||||
Search
|
||||
</button>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
}
|
||||
{Config.XOONIPS_ITEMTYPES.map((type) => {
|
||||
return <ItemType.AdvancedSearch key={type} type={`xnp${type}`} lang={lang} query={query} />;
|
||||
})}
|
||||
<div className="search">
|
||||
<button type="button" className="formButton" onClick={handleClickSearchButton}>
|
||||
Search
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default DatabaseAdvancedSearch;
|
||||
export default DatabaseAdvancedSearch;
|
||||
|
||||
@@ -1,89 +1,64 @@
|
||||
import React, { Component } from 'react';
|
||||
import { Helmet } from 'react-helmet';
|
||||
import { RouteComponentProps } from 'react-router';
|
||||
import { Helmet } from '@dr.pogodin/react-helmet';
|
||||
import { useEffect, useState } from 'react';
|
||||
import { useParams } from 'react-router';
|
||||
import Loading from '../common/lib/Loading';
|
||||
import PageNotFound from '../common/lib/PageNotFound';
|
||||
import { MultiLang } from '../config';
|
||||
import type { MultiLang } from '../config';
|
||||
import Functions from '../functions';
|
||||
import ItemType from './item-type';
|
||||
import ItemUtil, { Item } from './lib/ItemUtil';
|
||||
import ItemUtil, { type Item } from './lib/ItemUtil';
|
||||
|
||||
interface Params {
|
||||
id?: string;
|
||||
doi?: string;
|
||||
}
|
||||
|
||||
interface Props extends RouteComponentProps<Params> {
|
||||
interface Props {
|
||||
lang: MultiLang;
|
||||
}
|
||||
|
||||
interface State {
|
||||
loading: boolean;
|
||||
item: Item | null;
|
||||
}
|
||||
const DatabaseDetailItem = (props: Props) => {
|
||||
const { lang } = props;
|
||||
const params = useParams<{ id?: string; doi?: string }>();
|
||||
const id = typeof params.id !== 'undefined' ? (params.id.match(/^\d+$/) !== null ? parseInt(params.id, 10) : 0) : 0;
|
||||
const doi = params.doi ?? '';
|
||||
const [loading, setLoading] = useState(true);
|
||||
const [item, setItem] = useState<Item | null>(null);
|
||||
|
||||
class DatabaseDetailItem extends Component<Props, State> {
|
||||
|
||||
private id: number;
|
||||
private doi: string;
|
||||
|
||||
constructor(props: Props) {
|
||||
super(props);
|
||||
this.state = {
|
||||
loading: true,
|
||||
item: null,
|
||||
useEffect(() => {
|
||||
let active = true;
|
||||
const receive = (found: Item | null) => {
|
||||
if (active) {
|
||||
setItem(found);
|
||||
setLoading(false);
|
||||
}
|
||||
};
|
||||
const { params } = this.props.match;
|
||||
this.id = typeof params.id !== 'undefined' ? (params.id.match(/^\d+$/) !== null ? parseInt(params.id, 10) : 0) : 0;
|
||||
this.doi = typeof params.doi !== 'undefined' ? params.doi : '';
|
||||
}
|
||||
|
||||
componentDidMount() {
|
||||
this.updateItem();
|
||||
}
|
||||
|
||||
componentDidUpdate() {
|
||||
const { params } = this.props.match;
|
||||
const id = typeof params.id !== 'undefined' ? (params.id.match(/^\d+$/) !== null ? parseInt(params.id, 10) : 0) : 0;
|
||||
const doi = typeof params.doi !== 'undefined' ? params.doi : '';
|
||||
if (this.id !== id || this.doi !== doi) {
|
||||
this.id = id;
|
||||
this.doi = doi;
|
||||
this.updateItem();
|
||||
if (doi !== '') {
|
||||
ItemUtil.getByDoi(doi, receive);
|
||||
} else if (id !== 0) {
|
||||
ItemUtil.get(id, receive);
|
||||
} else {
|
||||
receive(null);
|
||||
}
|
||||
}
|
||||
return () => {
|
||||
active = false;
|
||||
};
|
||||
}, [id, doi]);
|
||||
|
||||
updateItem() {
|
||||
if (this.doi !== '') {
|
||||
ItemUtil.getByDoi(this.doi, (item) => {
|
||||
this.setState({ loading: false, item });
|
||||
});
|
||||
} else if (this.id !== 0) {
|
||||
ItemUtil.get(this.id, (item) => {
|
||||
this.setState({ loading: false, item });
|
||||
});
|
||||
}
|
||||
if (loading) {
|
||||
return <Loading />;
|
||||
}
|
||||
|
||||
render() {
|
||||
const { lang } = this.props;
|
||||
if (this.state.loading) {
|
||||
return <Loading />;
|
||||
}
|
||||
if (this.state.item === null) {
|
||||
return <PageNotFound lang={lang} />;
|
||||
}
|
||||
return (
|
||||
<>
|
||||
<Helmet>
|
||||
<title>{Functions.mlang(this.state.item.title, lang)} - {Functions.mlang('[en]Database[/en][ja]データベース[/ja]', lang)} - {Functions.siteTitle(lang)}</title>
|
||||
</Helmet>
|
||||
<h3>{Functions.mlang('[en]Item Detail[/en][ja]アイテム詳細[/ja]', lang)}</h3>
|
||||
<br />
|
||||
<ItemType.Detail lang={lang} item={this.state.item} />
|
||||
</>
|
||||
);
|
||||
if (item === null) {
|
||||
return <PageNotFound lang={lang} />;
|
||||
}
|
||||
}
|
||||
return (
|
||||
<>
|
||||
<Helmet>
|
||||
<title>
|
||||
{Functions.mlang(item.title, lang)} -{' '}
|
||||
{Functions.mlang('[en]Database[/en][ja]データベース[/ja]', lang)} - {Functions.siteTitle(lang)}
|
||||
</title>
|
||||
</Helmet>
|
||||
<h3>{Functions.mlang('[en]Item Detail[/en][ja]アイテム詳細[/ja]', lang)}</h3>
|
||||
<br />
|
||||
<ItemType.Detail lang={lang} item={item} />
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
||||
export default DatabaseDetailItem;
|
||||
export default DatabaseDetailItem;
|
||||
|
||||
@@ -1,56 +1,32 @@
|
||||
import React, { Component } from 'react';
|
||||
import { RouteComponentProps } from 'react-router';
|
||||
import { MultiLang } from '../config';
|
||||
import AdvancedSearchQuery from './lib/AdvancedSearchQuery';
|
||||
import { useCallback, useMemo } from 'react';
|
||||
import { useLocation } from 'react-router';
|
||||
import type { MultiLang } from '../config';
|
||||
import DatabaseListItem from './lib/DatabaseListItem';
|
||||
import ItemUtil, { SearchCallbackFunc, SortCondition } from './lib/ItemUtil';
|
||||
import ItemUtil, { type SearchCallbackFunc, type SortCondition } from './lib/ItemUtil';
|
||||
|
||||
interface Props extends RouteComponentProps {
|
||||
lang: MultiLang
|
||||
interface Props {
|
||||
lang: MultiLang;
|
||||
}
|
||||
|
||||
interface State {
|
||||
search: string;
|
||||
query: AdvancedSearchQuery;
|
||||
}
|
||||
const DatabaseSearchByAdvancedKeyword = (props: Props) => {
|
||||
const { lang } = props;
|
||||
const location = useLocation();
|
||||
const query = useMemo(() => ItemUtil.getAdvancedSearchQueryByQuery(location.search), [location.search]);
|
||||
|
||||
class DatabaseSearchByAdvancedKeyword extends Component<Props, State> {
|
||||
const searchFunc = useCallback(
|
||||
(condition: SortCondition, func: SearchCallbackFunc) => {
|
||||
ItemUtil.getListByAdvancedSearchQuery(query, condition, func);
|
||||
},
|
||||
[query]
|
||||
);
|
||||
|
||||
constructor(props: Props) {
|
||||
super(props);
|
||||
const search = props.location.search;
|
||||
const query = ItemUtil.getAdvancedSearchQueryByQuery(search);
|
||||
this.state = { search, query };
|
||||
this.searchFunc = this.searchFunc.bind(this);
|
||||
}
|
||||
|
||||
static getDerivedStateFromProps(nextProps: Props, prevState: State) {
|
||||
const search = nextProps.location.search;
|
||||
if (prevState.search !== search) {
|
||||
const query = ItemUtil.getAdvancedSearchQueryByQuery(search);
|
||||
return { search, query };
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
getUrl() {
|
||||
return ItemUtil.getSearchByAdvancedKeywordsUrl(this.state.query);
|
||||
}
|
||||
|
||||
searchFunc(condition: SortCondition, func: SearchCallbackFunc) {
|
||||
ItemUtil.getListByAdvancedSearchQuery(this.state.query, condition, func);
|
||||
}
|
||||
|
||||
render() {
|
||||
const { lang } = this.props;
|
||||
const baseUrl = this.getUrl();
|
||||
return (
|
||||
<div className="list">
|
||||
<h3>Listing item</h3>
|
||||
<DatabaseListItem lang={lang} url={baseUrl} search={this.searchFunc} />
|
||||
</div>
|
||||
);
|
||||
}
|
||||
}
|
||||
const baseUrl = ItemUtil.getSearchByAdvancedKeywordsUrl(query);
|
||||
return (
|
||||
<div className="list">
|
||||
<h3>Listing item</h3>
|
||||
<DatabaseListItem lang={lang} url={baseUrl} search={searchFunc} />
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default DatabaseSearchByAdvancedKeyword;
|
||||
|
||||
@@ -1,89 +1,64 @@
|
||||
import React, { Component, Fragment } from 'react';
|
||||
import { Helmet } from 'react-helmet';
|
||||
import { RouteComponentProps } from 'react-router';
|
||||
import { Link } from 'react-router-dom';
|
||||
import { Helmet } from '@dr.pogodin/react-helmet';
|
||||
import { Fragment, useCallback } from 'react';
|
||||
import { Link, useParams } from 'react-router';
|
||||
import PageNotFound from '../common/lib/PageNotFound';
|
||||
import { MultiLang } from '../config';
|
||||
import type { MultiLang } from '../config';
|
||||
import Functions from '../functions';
|
||||
import DatabaseListIndex from './lib/DatabaseListIndex';
|
||||
import DatabaseListItem from './lib/DatabaseListItem';
|
||||
import IndexUtil, { Index, INDEX_ID_PUBLIC } from './lib/IndexUtil';
|
||||
import ItemUtil, { SearchCallbackFunc, SortCondition } from './lib/ItemUtil';
|
||||
import IndexUtil, { INDEX_ID_PUBLIC, type Index } from './lib/IndexUtil';
|
||||
import ItemUtil, { type SearchCallbackFunc, type SortCondition } from './lib/ItemUtil';
|
||||
|
||||
interface Params {
|
||||
id?: string;
|
||||
}
|
||||
|
||||
export interface Props extends RouteComponentProps<Params> {
|
||||
export interface Props {
|
||||
lang: MultiLang;
|
||||
}
|
||||
|
||||
interface State {
|
||||
indexId: number;
|
||||
}
|
||||
const DatabaseSearchByIndexId = (props: Props) => {
|
||||
const { lang } = props;
|
||||
const { id } = useParams<{ id?: string }>();
|
||||
const indexId = id ? (id.match(/^\d+$/) !== null ? parseInt(id, 10) : 0) : INDEX_ID_PUBLIC;
|
||||
|
||||
class DatabaseSearchByIndexId extends Component<Props, State> {
|
||||
const searchFunc = useCallback(
|
||||
(condition: SortCondition, func: SearchCallbackFunc) => {
|
||||
if (indexId === 0) {
|
||||
func({ total: 0, data: [] });
|
||||
} else {
|
||||
ItemUtil.getListByIndexId(indexId, condition, func);
|
||||
}
|
||||
},
|
||||
[indexId]
|
||||
);
|
||||
|
||||
constructor(props: Props) {
|
||||
super(props);
|
||||
const { params } = props.match;
|
||||
this.state = {
|
||||
indexId: params.id ? (params.id.match(/^\d+$/) !== null ? parseInt(params.id, 10) : 0) : INDEX_ID_PUBLIC,
|
||||
}
|
||||
this.searchFunc = this.searchFunc.bind(this);
|
||||
const index = IndexUtil.get(indexId);
|
||||
if (index === null) {
|
||||
return <PageNotFound lang={lang} />;
|
||||
}
|
||||
|
||||
static getDerivedStateFromProps(nextProps: Props, prevState: State) {
|
||||
const { params } = nextProps.match;
|
||||
const indexId = params.id ? (params.id.match(/^\d+$/) !== null ? parseInt(params.id, 10) : 0) : INDEX_ID_PUBLIC;
|
||||
if (prevState.indexId !== indexId) {
|
||||
return { indexId };
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
getUrl() {
|
||||
if (this.state.indexId === 0) {
|
||||
return '/';
|
||||
}
|
||||
return IndexUtil.getUrl(this.state.indexId);
|
||||
}
|
||||
|
||||
searchFunc(condition: SortCondition, func: SearchCallbackFunc) {
|
||||
if (this.state.indexId === 0) {
|
||||
const res = { total: 0, data: [] };
|
||||
func(res);
|
||||
} else {
|
||||
ItemUtil.getListByIndexId(this.state.indexId, condition, func);
|
||||
}
|
||||
}
|
||||
|
||||
render() {
|
||||
const { lang } = this.props;
|
||||
const index = IndexUtil.get(this.state.indexId);
|
||||
if (index === null) {
|
||||
return <PageNotFound lang={lang} />;
|
||||
}
|
||||
const baseUrl = this.getUrl();
|
||||
const pIndexes = IndexUtil.getParents(this.state.indexId);
|
||||
const parents = pIndexes.map((value: Index) => {
|
||||
const url: string = IndexUtil.getUrl(value.id);
|
||||
const title = Functions.mlang(value.title, lang);
|
||||
return <Fragment key={value.id}>/ <Link to={url}>{title}</Link> </Fragment>;
|
||||
});
|
||||
const title = pIndexes.map((value) => { return '/' + Functions.mlang(value.title, lang); }).join('');
|
||||
const baseUrl = indexId === 0 ? '/' : IndexUtil.getUrl(indexId);
|
||||
const pIndexes = IndexUtil.getParents(indexId);
|
||||
const parents = pIndexes.map((value: Index) => {
|
||||
const url: string = IndexUtil.getUrl(value.id);
|
||||
const title = Functions.mlang(value.title, lang);
|
||||
return (
|
||||
<div className="list">
|
||||
<Helmet>
|
||||
<title>{Functions.mlang(title, lang)} - {Functions.mlang('[en]Database[/en][ja]データベース[/ja]', lang)} - {Functions.siteTitle(lang)}</title>
|
||||
</Helmet>
|
||||
<h3>{Functions.mlang('[en]Listing item[/en][ja]アイテム一覧[/ja]', lang)}</h3>
|
||||
<div>{parents}</div>
|
||||
<DatabaseListIndex lang={lang} index={index} />
|
||||
<DatabaseListItem lang={lang} url={baseUrl} search={this.searchFunc} />
|
||||
</div>
|
||||
<Fragment key={value.id}>
|
||||
/ <Link to={url}>{title}</Link>{' '}
|
||||
</Fragment>
|
||||
);
|
||||
}
|
||||
}
|
||||
});
|
||||
const title = pIndexes.map((value) => `/${Functions.mlang(value.title, lang)}`).join('');
|
||||
return (
|
||||
<div className="list">
|
||||
<Helmet>
|
||||
<title>
|
||||
{Functions.mlang(title, lang)} - {Functions.mlang('[en]Database[/en][ja]データベース[/ja]', lang)} -{' '}
|
||||
{Functions.siteTitle(lang)}
|
||||
</title>
|
||||
</Helmet>
|
||||
<h3>{Functions.mlang('[en]Listing item[/en][ja]アイテム一覧[/ja]', lang)}</h3>
|
||||
<div>{parents}</div>
|
||||
<DatabaseListIndex lang={lang} index={index} />
|
||||
<DatabaseListItem lang={lang} url={baseUrl} search={searchFunc} />
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default DatabaseSearchByIndexId;
|
||||
|
||||
@@ -1,73 +1,41 @@
|
||||
import React, { Component } from 'react';
|
||||
import { RouteComponentProps } from 'react-router';
|
||||
import { MultiLang } from '../config';
|
||||
import { useCallback } from 'react';
|
||||
import { useParams } from 'react-router';
|
||||
import type { MultiLang } from '../config';
|
||||
import Functions from '../functions';
|
||||
import DatabaseListItem from './lib/DatabaseListItem';
|
||||
import ItemUtil, { SearchCallbackFunc, SortCondition } from './lib/ItemUtil';
|
||||
import ItemUtil, { type SearchCallbackFunc, type SortCondition } from './lib/ItemUtil';
|
||||
|
||||
interface Params {
|
||||
itemType: string;
|
||||
subItemType?: string;
|
||||
}
|
||||
|
||||
interface Props extends RouteComponentProps<Params> {
|
||||
interface Props {
|
||||
lang: MultiLang;
|
||||
}
|
||||
|
||||
interface State {
|
||||
itemType: string;
|
||||
subItemType: string;
|
||||
}
|
||||
const DatabaseSearchByItemType = (props: Props) => {
|
||||
const { lang } = props;
|
||||
const params = useParams<{ itemType?: string; subItemType?: string }>();
|
||||
const itemType = params.itemType ?? '';
|
||||
const subItemType = params.subItemType ?? '';
|
||||
|
||||
class DatabaseSearchByItemType extends Component<Props, State> {
|
||||
const searchFunc = useCallback(
|
||||
(condition: SortCondition, func: SearchCallbackFunc) => {
|
||||
if (itemType === '') {
|
||||
func({ total: 0, data: [] });
|
||||
} else {
|
||||
ItemUtil.getListByItemType(itemType, subItemType, condition, func);
|
||||
}
|
||||
},
|
||||
[itemType, subItemType]
|
||||
);
|
||||
|
||||
constructor(props: Props) {
|
||||
super(props);
|
||||
const { params } = this.props.match;
|
||||
this.state = {
|
||||
itemType: params.itemType ? params.itemType : '',
|
||||
subItemType: params.subItemType ? params.subItemType : '',
|
||||
};
|
||||
this.searchFunc = this.searchFunc.bind(this);
|
||||
let baseUrl = ItemUtil.getItemTypeSearchUrl(itemType);
|
||||
if (subItemType !== '') {
|
||||
baseUrl += `/${subItemType}`;
|
||||
}
|
||||
|
||||
static getDerivedStateFromProps(nextProps: Props, prevState: State) {
|
||||
const { params } = nextProps.match;
|
||||
const item_type = params.itemType ? params.itemType : '';
|
||||
const sub_item_type = params.subItemType ? params.subItemType : '';
|
||||
if (prevState.itemType !== item_type || prevState.subItemType !== sub_item_type) {
|
||||
return { item_type, sub_item_type };
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
searchFunc(condition: SortCondition, func: SearchCallbackFunc) {
|
||||
if (this.state.itemType === '') {
|
||||
const res = { total: 0, data: [] };
|
||||
func(res);
|
||||
} else {
|
||||
ItemUtil.getListByItemType(this.state.itemType, this.state.subItemType, condition, func);
|
||||
}
|
||||
}
|
||||
|
||||
getUrl() {
|
||||
let url = ItemUtil.getItemTypeSearchUrl(this.state.itemType);
|
||||
if (this.state.subItemType !== '') {
|
||||
url += '/' + this.state.subItemType;
|
||||
}
|
||||
return url;
|
||||
}
|
||||
|
||||
render() {
|
||||
const { lang } = this.props;
|
||||
const baseUrl = this.getUrl();
|
||||
return (
|
||||
<div className="list">
|
||||
<h3>{Functions.mlang('[en]Listing item[/en][ja]アイテム一覧[/ja]', lang)}</h3>
|
||||
<DatabaseListItem lang={lang} url={baseUrl} search={this.searchFunc} />
|
||||
</div>
|
||||
);
|
||||
}
|
||||
}
|
||||
return (
|
||||
<div className="list">
|
||||
<h3>{Functions.mlang('[en]Listing item[/en][ja]アイテム一覧[/ja]', lang)}</h3>
|
||||
<DatabaseListItem lang={lang} url={baseUrl} search={searchFunc} />
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default DatabaseSearchByItemType;
|
||||
|
||||
@@ -1,60 +1,40 @@
|
||||
import React, { Component } from 'react';
|
||||
import { RouteComponentProps } from 'react-router';
|
||||
import { MultiLang } from '../config';
|
||||
import { useCallback } from 'react';
|
||||
import { useLocation } from 'react-router';
|
||||
import type { MultiLang } from '../config';
|
||||
import Functions from '../functions';
|
||||
import DatabaseListItem from './lib/DatabaseListItem';
|
||||
import ItemUtil, { KeywordSearchType, SearchCallbackFunc, SortCondition } from './lib/ItemUtil';
|
||||
import ItemUtil, { type SearchCallbackFunc, type SortCondition } from './lib/ItemUtil';
|
||||
|
||||
interface Props extends RouteComponentProps {
|
||||
interface Props {
|
||||
lang: MultiLang;
|
||||
}
|
||||
|
||||
interface State {
|
||||
type: KeywordSearchType;
|
||||
keyword: string;
|
||||
}
|
||||
const DatabaseSearchByKeyword = (props: Props) => {
|
||||
const { lang } = props;
|
||||
const location = useLocation();
|
||||
const { type, keyword } = ItemUtil.getSearchKeywordByQuery(location.search);
|
||||
|
||||
class DatabaseSearchByKeyword extends Component<Props, State> {
|
||||
const searchFunc = useCallback(
|
||||
(condition: SortCondition, func: SearchCallbackFunc) => {
|
||||
if (keyword === '') {
|
||||
func({ total: 0, data: [] });
|
||||
} else {
|
||||
ItemUtil.getListByKeyword(type, keyword, condition, func);
|
||||
}
|
||||
},
|
||||
[type, keyword]
|
||||
);
|
||||
|
||||
constructor(props: Props) {
|
||||
super(props);
|
||||
const { type, keyword } = ItemUtil.getSearchKeywordByQuery(this.props.location.search);
|
||||
this.state = { type, keyword };
|
||||
this.searchFunc = this.searchFunc.bind(this);
|
||||
}
|
||||
|
||||
static getDerivedStateFromProps(nextProps: Props, prevState: State) {
|
||||
const { type, keyword } = ItemUtil.getSearchKeywordByQuery(nextProps.location.search);
|
||||
if (prevState.type !== type || prevState.keyword !== keyword) {
|
||||
return { type, keyword };
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
getUrl() {
|
||||
return ItemUtil.getSearchByKeywordUrl(this.state.type, this.state.keyword);
|
||||
}
|
||||
|
||||
searchFunc(condition: SortCondition, func: SearchCallbackFunc) {
|
||||
if (this.state.keyword === '') {
|
||||
const res = { total: 0, data: [] };
|
||||
func(res);
|
||||
} else {
|
||||
ItemUtil.getListByKeyword(this.state.type, this.state.keyword, condition, func);
|
||||
}
|
||||
}
|
||||
|
||||
render() {
|
||||
const { lang } = this.props;
|
||||
const baseUrl = this.getUrl();
|
||||
return (
|
||||
<div className="list">
|
||||
<h3>{Functions.mlang('[en]Listing item[/en][ja]アイテム一覧[/ja]', lang)}</h3>
|
||||
<p>{Functions.mlang('[en]Search Keyword[/en][ja]検索キーワード[/ja]', lang)} : {this.state.keyword}</p>
|
||||
<DatabaseListItem lang={lang} url={baseUrl} search={this.searchFunc} />
|
||||
</div>
|
||||
);
|
||||
}
|
||||
}
|
||||
const baseUrl = ItemUtil.getSearchByKeywordUrl(type, keyword);
|
||||
return (
|
||||
<div className="list">
|
||||
<h3>{Functions.mlang('[en]Listing item[/en][ja]アイテム一覧[/ja]', lang)}</h3>
|
||||
<p>
|
||||
{Functions.mlang('[en]Search Keyword[/en][ja]検索キーワード[/ja]', lang)} : {keyword}
|
||||
</p>
|
||||
<DatabaseListItem lang={lang} url={baseUrl} search={searchFunc} />
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default DatabaseSearchByKeyword;
|
||||
|
||||
@@ -10,4 +10,4 @@
|
||||
.itemTypes .itemType :global(table .itemTypeName) {
|
||||
vertical-align: middle;
|
||||
font-size: large;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
import React from 'react';
|
||||
import Config, { MultiLang } from '../config';
|
||||
import Config, { type MultiLang } from '../config';
|
||||
import styles from './DatabaseTop.module.css';
|
||||
import ItemType from './item-type';
|
||||
|
||||
@@ -19,13 +18,13 @@ const DatabaseTop = (props: Props) => {
|
||||
return (
|
||||
<table className={styles.itemTypes}>
|
||||
<tbody>
|
||||
{types.map((value, idx) => {
|
||||
{types.map((value) => {
|
||||
return (
|
||||
<tr key={idx}>
|
||||
{value.map((type, idx) => {
|
||||
<tr key={value.join('-')}>
|
||||
{value.map((type) => {
|
||||
return (
|
||||
<td key={idx} className={styles.itemType}>
|
||||
{type !== '' && <ItemType.Top lang={lang} type={'xnp' + type} />}
|
||||
<td key={type} className={styles.itemType}>
|
||||
{type !== '' && <ItemType.Top lang={lang} type={`xnp${type}`} />}
|
||||
</td>
|
||||
);
|
||||
})}
|
||||
@@ -35,6 +34,6 @@ const DatabaseTop = (props: Props) => {
|
||||
</tbody>
|
||||
</table>
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
export default DatabaseTop;
|
||||
|
||||
@@ -1,21 +1,17 @@
|
||||
import React, { Component } from 'react';
|
||||
import { Redirect, RouteComponentProps, withRouter } from 'react-router';
|
||||
import { Navigate, useLocation } from 'react-router';
|
||||
import PageNotFound from '../common/lib/PageNotFound';
|
||||
import { MultiLang } from '../config';
|
||||
import type { MultiLang } from '../config';
|
||||
import Functions from '../functions';
|
||||
|
||||
interface Props extends RouteComponentProps {
|
||||
interface Props {
|
||||
lang: MultiLang;
|
||||
}
|
||||
|
||||
class DatabaseXoopsPathRedirect extends Component<Props> {
|
||||
|
||||
getRedirectUrl(): string {
|
||||
const { location } = this.props;
|
||||
const pathname = location.pathname || '';
|
||||
const query = new URLSearchParams(location.search);
|
||||
const search = new RegExp('^/modules/xoonips(?:/+(.*))?$');
|
||||
const matches = pathname.match(search);
|
||||
const getRedirectUrl = (pathname: string, search: string): string => {
|
||||
const query = new URLSearchParams(search);
|
||||
const pattern = /^\/modules\/xoonips(?:\/+(.*))?$/;
|
||||
const matches = pathname.match(pattern);
|
||||
{
|
||||
if (matches === null) {
|
||||
return '';
|
||||
}
|
||||
@@ -28,11 +24,11 @@ class DatabaseXoopsPathRedirect extends Component<Props> {
|
||||
case 'detail.php': {
|
||||
const id = query.get('id');
|
||||
if (id !== null) {
|
||||
return '/database/item/id/' + Functions.escape(id);
|
||||
return `/database/item/id/${Functions.escape(id)}`;
|
||||
}
|
||||
const itemId = query.get('item_id');
|
||||
if (itemId !== null && itemId.match(/^\d+$/) !== null) {
|
||||
return '/database/item/' + Functions.escape(itemId);
|
||||
return `/database/item/${Functions.escape(itemId)}`;
|
||||
}
|
||||
return '';
|
||||
}
|
||||
@@ -40,13 +36,13 @@ class DatabaseXoopsPathRedirect extends Component<Props> {
|
||||
const indexId = query.get('index_id');
|
||||
if (indexId !== null && indexId.match(/^\d+$/) !== null) {
|
||||
const params = new URLSearchParams();
|
||||
const map: any = {
|
||||
const map: Record<string, { key: string; isNumber: boolean }> = {
|
||||
orderby: { key: 'orderby', isNumber: false },
|
||||
order_dir: { key: 'order_dir', isNumber: true },
|
||||
itemcount: { key: 'itemcount', isNumber: true },
|
||||
page: { key: 'page', isNumber: true }
|
||||
page: { key: 'page', isNumber: true },
|
||||
};
|
||||
for (let k in map) {
|
||||
for (const k in map) {
|
||||
const v = query.get(k);
|
||||
if (v === null || v.length === 0) {
|
||||
continue;
|
||||
@@ -57,7 +53,7 @@ class DatabaseXoopsPathRedirect extends Component<Props> {
|
||||
params.set(map[k].key, v);
|
||||
}
|
||||
const paramStr = params.toString();
|
||||
return '/database/list/' + Functions.escape(indexId) + (paramStr.length > 0 ? '?' + paramStr : '');
|
||||
return `/database/list/${Functions.escape(indexId)}${paramStr.length > 0 ? `?${paramStr}` : ''}`;
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -78,13 +74,13 @@ class DatabaseXoopsPathRedirect extends Component<Props> {
|
||||
return '';
|
||||
}
|
||||
const params = new URLSearchParams({ type, keyword });
|
||||
const map: any = {
|
||||
const map: Record<string, { key: string; isNumber: boolean }> = {
|
||||
orderby: { key: 'orderby', isNumber: false },
|
||||
orderdir: { key: 'order_dir', isNumber: true },
|
||||
item_per_page: { key: 'itemcount', isNumber: true },
|
||||
page: { key: 'page', isNumber: true }
|
||||
page: { key: 'page', isNumber: true },
|
||||
};
|
||||
for (let k in map) {
|
||||
for (const k in map) {
|
||||
const v = query.get(k);
|
||||
if (v === null || v.length === 0) {
|
||||
continue;
|
||||
@@ -94,7 +90,7 @@ class DatabaseXoopsPathRedirect extends Component<Props> {
|
||||
}
|
||||
params.set(map[k].key, v);
|
||||
}
|
||||
return '/database/search?' + params.toString();
|
||||
return `/database/search?${params.toString()}`;
|
||||
}
|
||||
case 'itemtypesearch': {
|
||||
const itemType = query.get('search_itemtype');
|
||||
@@ -102,22 +98,22 @@ class DatabaseXoopsPathRedirect extends Component<Props> {
|
||||
return '';
|
||||
}
|
||||
const type = itemType.replace('xnp', '');
|
||||
return '/database/search/itemtype/' + Functions.escape(type);
|
||||
return `/database/search/itemtype/${Functions.escape(type)}`;
|
||||
}
|
||||
case 'itemsubtypesearch': {
|
||||
let type = '';
|
||||
let subtype = '';
|
||||
query.forEach((v, k) => {
|
||||
if (k.match(/^xnp[a-z]+$/) !== null && !!v) {
|
||||
if (k.match(/^xnp[a-z]+$/) !== null && v) {
|
||||
type = k.replace('xnp', '');
|
||||
return;
|
||||
}
|
||||
})
|
||||
});
|
||||
if (type === '') {
|
||||
return '';
|
||||
}
|
||||
query.forEach((v, k) => {
|
||||
if (k.match(`^xnp${type}_.+$`) !== null && !!v) {
|
||||
if (k.match(`^xnp${type}_.+$`) !== null && v) {
|
||||
subtype = v;
|
||||
return;
|
||||
}
|
||||
@@ -125,7 +121,7 @@ class DatabaseXoopsPathRedirect extends Component<Props> {
|
||||
if (subtype === '') {
|
||||
return '';
|
||||
}
|
||||
return '/database/search/itemtype/' + Functions.escape(type) + '/' + Functions.escape(subtype);
|
||||
return `/database/search/itemtype/${Functions.escape(type)}/${Functions.escape(subtype)}`;
|
||||
}
|
||||
}
|
||||
return '';
|
||||
@@ -134,17 +130,18 @@ class DatabaseXoopsPathRedirect extends Component<Props> {
|
||||
return '/database/advanced';
|
||||
}
|
||||
}
|
||||
return '';
|
||||
}
|
||||
return '';
|
||||
};
|
||||
|
||||
render() {
|
||||
const { lang } = this.props;
|
||||
const url = this.getRedirectUrl();
|
||||
if (url === '') {
|
||||
return <PageNotFound lang={lang} />;
|
||||
}
|
||||
return <Redirect to={url} />;
|
||||
const DatabaseXoopsPathRedirect = (props: Props) => {
|
||||
const { lang } = props;
|
||||
const location = useLocation();
|
||||
const url = getRedirectUrl(location.pathname || '', location.search);
|
||||
if (url === '') {
|
||||
return <PageNotFound lang={lang} />;
|
||||
}
|
||||
}
|
||||
return <Navigate to={url} replace />;
|
||||
};
|
||||
|
||||
export default withRouter(DatabaseXoopsPathRedirect);
|
||||
export default DatabaseXoopsPathRedirect;
|
||||
|
||||
@@ -1,21 +1,23 @@
|
||||
import AdvancedSearchBase, { AdvancedSearchBaseProps } from '../lib/AdvancedSearchBase';
|
||||
import AdvancedSearchBase, { type AdvancedSearchBaseProps } from '../lib/AdvancedSearchBase';
|
||||
|
||||
class BinderAdvancedSearch extends AdvancedSearchBase {
|
||||
|
||||
constructor(props: AdvancedSearchBaseProps) {
|
||||
super(props);
|
||||
this.type = 'binder';
|
||||
this.title = 'Binder';
|
||||
this.state.values['title'] = '';
|
||||
this.state.values['keyword'] = '';
|
||||
this.state.values['description'] = '';
|
||||
this.state.values['doi'] = '';
|
||||
this.state.values.title = '';
|
||||
this.state.values.keyword = '';
|
||||
this.state.values.description = '';
|
||||
this.state.values.doi = '';
|
||||
}
|
||||
|
||||
getRows() {
|
||||
const rows = [
|
||||
{ label: '[en]Title[/en][ja]タイトル[/ja]', value: this.renderFieldInputText('title', 50) },
|
||||
{ label: '[en]Free Keywords[/en][ja]フリーキーワード[/ja]', value: this.renderFieldInputText('keyword', 50) },
|
||||
{
|
||||
label: '[en]Free Keywords[/en][ja]フリーキーワード[/ja]',
|
||||
value: this.renderFieldInputText('keyword', 50),
|
||||
},
|
||||
{ label: '[en]Description[/en][ja]概要[/ja]', value: this.renderFieldInputText('description', 50) },
|
||||
{ label: 'ID', value: this.renderFieldInputText('doi', 50) },
|
||||
];
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
import React, { Component } from 'react';
|
||||
import { Component } from 'react';
|
||||
import type { MultiLang } from '../../../config';
|
||||
import Functions from '../../../functions';
|
||||
import ItemUtil, { ItemBinder, Item } from '../../lib/ItemUtil';
|
||||
import ItemUtil, { type Item, type ItemBinder } from '../../lib/ItemUtil';
|
||||
import ItemType from '..';
|
||||
import DetailBase from '../lib/DetailBase';
|
||||
import ItemTypeField from '../lib/field';
|
||||
import { MultiLang } from '../../../config';
|
||||
import ItemType from '..';
|
||||
|
||||
interface Props {
|
||||
lang: MultiLang;
|
||||
@@ -27,7 +27,7 @@ class BinderLinkItems extends Component<Props, State> {
|
||||
this.updateItems();
|
||||
}
|
||||
|
||||
componentDidUpdate(prevProps: Props, prevState: State) {
|
||||
componentDidUpdate(prevProps: Props) {
|
||||
const prevItemIds = prevProps.item.item_link;
|
||||
const nextItemIds = this.props.item.item_link;
|
||||
if (prevItemIds.toString() !== nextItemIds.toString()) {
|
||||
@@ -51,7 +51,13 @@ class BinderLinkItems extends Component<Props, State> {
|
||||
<tbody>
|
||||
{this.state.items.map((item, idx) => {
|
||||
const evenodd = idx % 2 ? 'even' : 'odd';
|
||||
return <tr key={item.item_id}><td className={evenodd}><ItemType.List lang={lang} item={item} /></td></tr>;
|
||||
return (
|
||||
<tr key={item.item_id}>
|
||||
<td className={evenodd}>
|
||||
<ItemType.List lang={lang} item={item} />
|
||||
</td>
|
||||
</tr>
|
||||
);
|
||||
})}
|
||||
</tbody>
|
||||
</table>
|
||||
@@ -60,20 +66,37 @@ class BinderLinkItems extends Component<Props, State> {
|
||||
}
|
||||
|
||||
class BinderDetail extends DetailBase {
|
||||
|
||||
getFields() {
|
||||
const { lang } = this.props;
|
||||
const item = this.props.item as ItemBinder;
|
||||
return [
|
||||
{ label: 'ID', value: item.doi },
|
||||
{ label: '[en]Title[/en][ja]タイトル[/ja]', value: Functions.mlang(item.title, lang) },
|
||||
{ label: '[en]Free Keywords[/en][ja]フリーキーワード[/ja]', value: <ItemTypeField.FreeKeyword lang={lang} keyword={item.keyword} /> },
|
||||
{ label: '[en]Description[/en][ja]概要[/ja]', value: <ItemTypeField.Description lang={lang} description={item.description} /> },
|
||||
{ label: '[en]Last Modified Date[/en][ja]最終更新日[/ja]', value: <ItemTypeField.DateTime lang={lang} date={item.last_update_date} /> },
|
||||
{ label: '[en]Created Date[/en][ja]作成日[/ja]', value: <ItemTypeField.DateTime lang={lang} date={item.creation_date} /> },
|
||||
{ label: '[en]Contributor[/en][ja]登録者[/ja]', value: <ItemTypeField.Contributer lang={lang} uname={item.uname} name={item.name} /> },
|
||||
{
|
||||
label: '[en]Free Keywords[/en][ja]フリーキーワード[/ja]',
|
||||
value: <ItemTypeField.FreeKeyword lang={lang} keyword={item.keyword} />,
|
||||
},
|
||||
{
|
||||
label: '[en]Description[/en][ja]概要[/ja]',
|
||||
value: <ItemTypeField.Description lang={lang} description={item.description} />,
|
||||
},
|
||||
{
|
||||
label: '[en]Last Modified Date[/en][ja]最終更新日[/ja]',
|
||||
value: <ItemTypeField.DateTime lang={lang} date={item.last_update_date} />,
|
||||
},
|
||||
{
|
||||
label: '[en]Created Date[/en][ja]作成日[/ja]',
|
||||
value: <ItemTypeField.DateTime lang={lang} date={item.creation_date} />,
|
||||
},
|
||||
{
|
||||
label: '[en]Contributor[/en][ja]登録者[/ja]',
|
||||
value: <ItemTypeField.Contributer lang={lang} uname={item.uname} name={item.name} />,
|
||||
},
|
||||
{ label: '[en]Item Type[/en][ja]アイテムタイプ[/ja]', value: item.item_type_display_name },
|
||||
{ label: '[en]Change Log(History)[/en][ja]変更履歴[/ja]', value: <ItemTypeField.ChangeLog lang={lang} changelog={item.changelog} /> },
|
||||
{
|
||||
label: '[en]Change Log(History)[/en][ja]変更履歴[/ja]',
|
||||
value: <ItemTypeField.ChangeLog lang={lang} changelog={item.changelog} />,
|
||||
},
|
||||
{ label: 'Index', value: <ItemTypeField.ItemIndex lang={lang} index={item.index} /> },
|
||||
];
|
||||
}
|
||||
@@ -92,4 +115,4 @@ class BinderDetail extends DetailBase {
|
||||
}
|
||||
}
|
||||
|
||||
export default BinderDetail;
|
||||
export default BinderDetail;
|
||||
|
||||
@@ -1,12 +1,10 @@
|
||||
import React from 'react';
|
||||
import { Link } from 'react-router-dom';
|
||||
import { Link } from 'react-router';
|
||||
import Functions from '../../../functions';
|
||||
import iconFile from '../../assets/images/icon_binder.gif';
|
||||
import { ItemBinder } from '../../lib/ItemUtil';
|
||||
import ListBase, { ListBaseProps } from '../lib/ListBase';
|
||||
import type { ItemBinder } from '../../lib/ItemUtil';
|
||||
import ListBase, { type ListBaseProps } from '../lib/ListBase';
|
||||
|
||||
class BinderList extends ListBase {
|
||||
|
||||
constructor(props: ListBaseProps) {
|
||||
super(props);
|
||||
this.label = 'Binder';
|
||||
@@ -18,7 +16,8 @@ class BinderList extends ListBase {
|
||||
const item = this.props.item as ItemBinder;
|
||||
return (
|
||||
<>
|
||||
<Link to={this.url}>{Functions.mlang(item.title, lang)}</Link><br />
|
||||
<Link to={this.url}>{Functions.mlang(item.title, lang)}</Link>
|
||||
<br />
|
||||
{Functions.mlang(item.description, lang)}
|
||||
</>
|
||||
);
|
||||
|
||||
@@ -1,8 +1,7 @@
|
||||
import TopBase, { TopBaseProps } from '../lib/TopBase';
|
||||
import iconFile from '../../assets/images/icon_binder.gif';
|
||||
import TopBase, { type TopBaseProps } from '../lib/TopBase';
|
||||
|
||||
class BinderTop extends TopBase {
|
||||
|
||||
constructor(props: TopBaseProps) {
|
||||
super(props);
|
||||
this.type = 'binder';
|
||||
@@ -12,4 +11,4 @@ class BinderTop extends TopBase {
|
||||
}
|
||||
}
|
||||
|
||||
export default BinderTop;
|
||||
export default BinderTop;
|
||||
|
||||
@@ -1,35 +1,43 @@
|
||||
import AdvancedSearchBase, { AdvancedSearchBaseProps } from '../lib/AdvancedSearchBase';
|
||||
import AdvancedSearchBase, { type AdvancedSearchBaseProps } from '../lib/AdvancedSearchBase';
|
||||
|
||||
class BookAdvancedSearch extends AdvancedSearchBase {
|
||||
|
||||
constructor(props: AdvancedSearchBaseProps) {
|
||||
super(props);
|
||||
this.type = 'book';
|
||||
this.title = 'Book';
|
||||
this.state.values['title'] = '';
|
||||
this.state.values['keyword'] = '';
|
||||
this.state.values['description'] = '';
|
||||
this.state.values['doi'] = '';
|
||||
this.state.values['author'] = '';
|
||||
this.state.values['editor'] = '';
|
||||
this.state.values['publisher'] = '';
|
||||
this.state.values['publication_year'] = '';
|
||||
this.state.values['isbn'] = '';
|
||||
this.state.values.title = '';
|
||||
this.state.values.keyword = '';
|
||||
this.state.values.description = '';
|
||||
this.state.values.doi = '';
|
||||
this.state.values.author = '';
|
||||
this.state.values.editor = '';
|
||||
this.state.values.publisher = '';
|
||||
this.state.values.publication_year = '';
|
||||
this.state.values.isbn = '';
|
||||
this.state.values['file.book_pdf.original_file_name'] = '';
|
||||
}
|
||||
|
||||
getRows() {
|
||||
const rows = [
|
||||
{ label: '[en]Book Title[/en][ja]著書名[/ja]', value: this.renderFieldInputText('title', 50) },
|
||||
{ label: '[en]Free Keywords[/en][ja]フリーキーワード[/ja]', value: this.renderFieldInputText('keyword', 50) },
|
||||
{
|
||||
label: '[en]Free Keywords[/en][ja]フリーキーワード[/ja]',
|
||||
value: this.renderFieldInputText('keyword', 50),
|
||||
},
|
||||
{ label: '[en]Description[/en][ja]概要[/ja]', value: this.renderFieldInputText('description', 50) },
|
||||
{ label: 'ID', value: this.renderFieldInputText('doi', 50) },
|
||||
{ label: '[en]Author[/en][ja]著者[/ja]', value: this.renderFieldInputText('author', 50) },
|
||||
{ label: '[en]Editor[/en][ja]編集者[/ja]', value: this.renderFieldInputText('editor', 50) },
|
||||
{ label: '[en]Publisher[/en][ja]出版社[/ja]', value: this.renderFieldInputText('publisher', 50) },
|
||||
{ label: '[en]Publication Year[/en][ja]出版年[/ja]', value: this.renderFieldInputText('publication_year', 10) },
|
||||
{
|
||||
label: '[en]Publication Year[/en][ja]出版年[/ja]',
|
||||
value: this.renderFieldInputText('publication_year', 10),
|
||||
},
|
||||
{ label: 'ISBN', value: this.renderFieldInputText('isbn', 50) },
|
||||
{ label: '[en]PDF File[/en][ja]PDF ファイル[/ja]', value: this.renderFieldInputText('file.book_pdf.original_file_name', 50) },
|
||||
{
|
||||
label: '[en]PDF File[/en][ja]PDF ファイル[/ja]',
|
||||
value: this.renderFieldInputText('file.book_pdf.original_file_name', 50),
|
||||
},
|
||||
];
|
||||
return rows;
|
||||
}
|
||||
|
||||
@@ -1,33 +1,72 @@
|
||||
import React from 'react';
|
||||
import Functions from '../../../functions';
|
||||
import { ItemBook } from '../../lib/ItemUtil';
|
||||
import type { ItemBook } from '../../lib/ItemUtil';
|
||||
import DetailBase from '../lib/DetailBase';
|
||||
import ItemTypeField from '../lib/field';
|
||||
|
||||
class BookDetail extends DetailBase {
|
||||
|
||||
getFields() {
|
||||
const { lang } = this.props;
|
||||
const item = this.props.item as ItemBook;
|
||||
return [
|
||||
{ label: 'ID', value: item.doi },
|
||||
{ label: '[en]Language[/en][ja]言語[/ja]', value: <ItemTypeField.Language lang={lang} itemLang={item.lang} /> },
|
||||
{
|
||||
label: '[en]Language[/en][ja]言語[/ja]',
|
||||
value: <ItemTypeField.Language lang={lang} itemLang={item.lang} />,
|
||||
},
|
||||
{ label: '[en]Book Title[/en][ja]著書名[/ja]', value: Functions.mlang(item.title, lang) },
|
||||
{ label: '[en]Free Keywords[/en][ja]フリーキーワード[/ja]', value: <ItemTypeField.FreeKeyword lang={lang} keyword={item.keyword} /> },
|
||||
{ label: '[en]Description[/en][ja]概要[/ja]', value: <ItemTypeField.Description lang={lang} description={item.description} /> },
|
||||
{ label: '[en]Last Modified Date[/en][ja]最終更新日[/ja]', value: <ItemTypeField.DateTime lang={lang} date={item.last_update_date} /> },
|
||||
{ label: '[en]Created Date[/en][ja]作成日[/ja]', value: <ItemTypeField.DateTime lang={lang} date={item.creation_date} /> },
|
||||
{ label: '[en]Contributor[/en][ja]登録者[/ja]', value: <ItemTypeField.Contributer lang={lang} uname={item.uname} name={item.name} /> },
|
||||
{
|
||||
label: '[en]Free Keywords[/en][ja]フリーキーワード[/ja]',
|
||||
value: <ItemTypeField.FreeKeyword lang={lang} keyword={item.keyword} />,
|
||||
},
|
||||
{
|
||||
label: '[en]Description[/en][ja]概要[/ja]',
|
||||
value: <ItemTypeField.Description lang={lang} description={item.description} />,
|
||||
},
|
||||
{
|
||||
label: '[en]Last Modified Date[/en][ja]最終更新日[/ja]',
|
||||
value: <ItemTypeField.DateTime lang={lang} date={item.last_update_date} />,
|
||||
},
|
||||
{
|
||||
label: '[en]Created Date[/en][ja]作成日[/ja]',
|
||||
value: <ItemTypeField.DateTime lang={lang} date={item.creation_date} />,
|
||||
},
|
||||
{
|
||||
label: '[en]Contributor[/en][ja]登録者[/ja]',
|
||||
value: <ItemTypeField.Contributer lang={lang} uname={item.uname} name={item.name} />,
|
||||
},
|
||||
{ label: '[en]Item Type[/en][ja]アイテムタイプ[/ja]', value: item.item_type_display_name },
|
||||
{ label: '[en]Change Log(History)[/en][ja]変更履歴[/ja]', value: <ItemTypeField.ChangeLog lang={lang} changelog={item.changelog} /> },
|
||||
{
|
||||
label: '[en]Change Log(History)[/en][ja]変更履歴[/ja]',
|
||||
value: <ItemTypeField.ChangeLog lang={lang} changelog={item.changelog} />,
|
||||
},
|
||||
{ label: '[en]Author[/en][ja]著者[/ja]', value: <ItemTypeField.Author lang={lang} author={item.author} /> },
|
||||
{ label: '[en]Editor[/en][ja]編集者[/ja]', value: Functions.mlang(item.editor, lang) },
|
||||
{ label: '[en]Publisher[/en][ja]出版社[/ja]', value: Functions.mlang(item.publisher, lang) },
|
||||
{ label: '[en]Publication Year[/en][ja]出版年[/ja]', value: item.publication_year },
|
||||
{ label: 'URL', value: <a href={item.url} target="_blank" rel="noopener noreferrer">{item.url}</a> },
|
||||
{ label: '[en]PDF File[/en][ja]PDF ファイル[/ja]', value: <ItemTypeField.ItemFile lang={lang} file={item.file} type="book_pdf" downloadLimit={item.attachment_dl_limit} /> },
|
||||
{
|
||||
label: 'URL',
|
||||
value: (
|
||||
<a href={item.url} target="_blank" rel="noopener noreferrer">
|
||||
{item.url}
|
||||
</a>
|
||||
),
|
||||
},
|
||||
{
|
||||
label: '[en]PDF File[/en][ja]PDF ファイル[/ja]',
|
||||
value: (
|
||||
<ItemTypeField.ItemFile
|
||||
lang={lang}
|
||||
file={item.file}
|
||||
type="book_pdf"
|
||||
downloadLimit={item.attachment_dl_limit}
|
||||
/>
|
||||
),
|
||||
},
|
||||
{ label: 'Index', value: <ItemTypeField.ItemIndex lang={lang} index={item.index} /> },
|
||||
{ label: '[en]Related to[/en][ja]関連アイテム[/ja]', value: <ItemTypeField.RelatedTo lang={lang} relatedTo={item.related_to} /> },
|
||||
{
|
||||
label: '[en]Related to[/en][ja]関連アイテム[/ja]',
|
||||
value: <ItemTypeField.RelatedTo lang={lang} relatedTo={item.related_to} />,
|
||||
},
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,12 +1,10 @@
|
||||
import React, { Fragment } from 'react';
|
||||
import { Link } from 'react-router-dom';
|
||||
import { Link } from 'react-router';
|
||||
import Functions from '../../../functions';
|
||||
import iconFile from '../../assets/images/icon_book.gif';
|
||||
import { ItemBook } from '../../lib/ItemUtil';
|
||||
import ListBase, { ListBaseProps } from '../lib/ListBase';
|
||||
import type { ItemBook } from '../../lib/ItemUtil';
|
||||
import ListBase, { type ListBaseProps } from '../lib/ListBase';
|
||||
|
||||
class BookList extends ListBase {
|
||||
|
||||
constructor(props: ListBaseProps) {
|
||||
super(props);
|
||||
this.label = 'Book';
|
||||
@@ -16,12 +14,11 @@ class BookList extends ListBase {
|
||||
renderBody() {
|
||||
const { lang } = this.props;
|
||||
const item = this.props.item as ItemBook;
|
||||
const authors = item.author.map((author, i) => {
|
||||
return <Fragment key={i}>{i > 0 && ', '}{Functions.mlang(author, lang)}</Fragment>
|
||||
});
|
||||
const authors = item.author.map((author) => Functions.mlang(author, lang)).join(', ');
|
||||
return (
|
||||
<>
|
||||
<Link to={this.url}>{Functions.mlang(item.title, lang)}</Link><br />
|
||||
<Link to={this.url}>{Functions.mlang(item.title, lang)}</Link>
|
||||
<br />
|
||||
{authors}
|
||||
</>
|
||||
);
|
||||
|
||||
@@ -1,8 +1,7 @@
|
||||
import TopBase, { TopBaseProps } from '../lib/TopBase';
|
||||
import iconFile from '../../assets/images/icon_book.gif';
|
||||
import TopBase, { type TopBaseProps } from '../lib/TopBase';
|
||||
|
||||
class BookTop extends TopBase {
|
||||
|
||||
constructor(props: TopBaseProps) {
|
||||
super(props);
|
||||
this.type = 'book';
|
||||
@@ -12,4 +11,4 @@ class BookTop extends TopBase {
|
||||
}
|
||||
}
|
||||
|
||||
export default BookTop;
|
||||
export default BookTop;
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import BookTop from './BookTop';
|
||||
import BookList from './BookList';
|
||||
import BookDetail from './BookDetail';
|
||||
import BookAdvancedSearch from './BookAdvancedSearch';
|
||||
import BookDetail from './BookDetail';
|
||||
import BookList from './BookList';
|
||||
import BookTop from './BookTop';
|
||||
|
||||
const ItemTypeBook = {
|
||||
Top: BookTop,
|
||||
|
||||
@@ -1,9 +1,7 @@
|
||||
import React from 'react';
|
||||
import { ItemConferenceSubTypes } from '../../lib/ItemUtil';
|
||||
import AdvancedSearchBase, { AdvancedSearchBaseProps } from '../lib/AdvancedSearchBase';
|
||||
import AdvancedSearchBase, { type AdvancedSearchBaseProps } from '../lib/AdvancedSearchBase';
|
||||
|
||||
class ConferenceAdvancedSearch extends AdvancedSearchBase {
|
||||
|
||||
constructor(props: AdvancedSearchBaseProps) {
|
||||
super(props);
|
||||
this.type = 'conference';
|
||||
@@ -12,15 +10,15 @@ class ConferenceAdvancedSearch extends AdvancedSearchBase {
|
||||
const year = String(now.getFullYear());
|
||||
const month = String(now.getMonth() + 1);
|
||||
const mday = String(now.getDate());
|
||||
this.state.values['title'] = '';
|
||||
this.state.values['presentation_type'] = '';
|
||||
this.state.values['author'] = '';
|
||||
this.state.values['conference_from_year'] = year;
|
||||
this.state.values['conference_from_month'] = month;
|
||||
this.state.values['conference_from_mday'] = mday;
|
||||
this.state.values['conference_to_year'] = year;
|
||||
this.state.values['conference_to_month'] = month;
|
||||
this.state.values['conference_to_mday'] = mday;
|
||||
this.state.values.title = '';
|
||||
this.state.values.presentation_type = '';
|
||||
this.state.values.author = '';
|
||||
this.state.values.conference_from_year = year;
|
||||
this.state.values.conference_from_month = month;
|
||||
this.state.values.conference_from_mday = mday;
|
||||
this.state.values.conference_to_year = year;
|
||||
this.state.values.conference_to_month = month;
|
||||
this.state.values.conference_to_mday = mday;
|
||||
this.setIgnoreKey('conference_from_year');
|
||||
this.setIgnoreKey('conference_from_month');
|
||||
this.setIgnoreKey('conference_from_mday');
|
||||
@@ -33,8 +31,12 @@ class ConferenceAdvancedSearch extends AdvancedSearchBase {
|
||||
return (
|
||||
<>
|
||||
<div>
|
||||
{this.renderFieldDate('From', 'conference_from_year', 'conference_from_month', 'conference_from_mday')}
|
||||
|
||||
{this.renderFieldDate(
|
||||
'From',
|
||||
'conference_from_year',
|
||||
'conference_from_month',
|
||||
'conference_from_mday'
|
||||
)}
|
||||
</div>
|
||||
<div>
|
||||
{this.renderFieldDate('To', 'conference_to_year', 'conference_to_month', 'conference_to_mday')}
|
||||
@@ -46,12 +48,15 @@ class ConferenceAdvancedSearch extends AdvancedSearchBase {
|
||||
getRows() {
|
||||
const rows = [
|
||||
{ label: '[en]Presentation Title[/en][ja]発表議題[/ja]', value: this.renderFieldInputText('title', 50) },
|
||||
{ label: '[en]Presentation Type[/en][ja]発表資料ファイル形式[/ja]', value: this.renderFieldSelect('presentation_type', ItemConferenceSubTypes) },
|
||||
{
|
||||
label: '[en]Presentation Type[/en][ja]発表資料ファイル形式[/ja]',
|
||||
value: this.renderFieldSelect('presentation_type', ItemConferenceSubTypes),
|
||||
},
|
||||
{ label: '[en]Author[/en][ja]発表者[/ja]', value: this.renderFieldInputText('author', 50) },
|
||||
{ label: '[en]Date[/en][ja]日付[/ja]', value: this.renderDate() }
|
||||
{ label: '[en]Date[/en][ja]日付[/ja]', value: this.renderDate() },
|
||||
];
|
||||
return rows;
|
||||
}
|
||||
}
|
||||
|
||||
export default ConferenceAdvancedSearch;
|
||||
export default ConferenceAdvancedSearch;
|
||||
|
||||
@@ -1,36 +1,67 @@
|
||||
import React from 'react';
|
||||
import Functions from '../../../functions';
|
||||
import { ItemConference } from '../../lib/ItemUtil';
|
||||
import type { ItemConference } from '../../lib/ItemUtil';
|
||||
import DetailBase from '../lib/DetailBase';
|
||||
import ItemTypeField from '../lib/field';
|
||||
import ConferenceUtil from './ConferenceUtil';
|
||||
|
||||
class ConferenceDetail extends DetailBase {
|
||||
|
||||
getFields() {
|
||||
const { lang } = this.props;
|
||||
const item = this.props.item as ItemConference;
|
||||
return [
|
||||
{ label: 'ID', value: item.doi },
|
||||
{ label: '[en]Language[/en][ja]言語[/ja]', value: <ItemTypeField.Language lang={lang} itemLang={item.lang} /> },
|
||||
{
|
||||
label: '[en]Language[/en][ja]言語[/ja]',
|
||||
value: <ItemTypeField.Language lang={lang} itemLang={item.lang} />,
|
||||
},
|
||||
{ label: '[en]Conference Title[/en][ja]学会名[/ja]', value: Functions.mlang(item.conference_title, lang) },
|
||||
{ label: '[en]Place[/en][ja]開催地[/ja]', value: item.place },
|
||||
{ label: '[en]Date[/en][ja]日付[/ja]', value: <ConferenceUtil.ConferenceDate lang={lang} item={item} /> },
|
||||
{ label: '[en]Last Modified Date[/en][ja]最終更新日[/ja]', value: <ItemTypeField.DateTime lang={lang} date={item.last_update_date} /> },
|
||||
{ label: '[en]Created Date[/en][ja]作成日[/ja]', value: <ItemTypeField.DateTime lang={lang} date={item.creation_date} /> },
|
||||
{ label: '[en]Contributor[/en][ja]登録者[/ja]', value: <ItemTypeField.Contributer lang={lang} uname={item.uname} name={item.name} /> },
|
||||
{
|
||||
label: '[en]Last Modified Date[/en][ja]最終更新日[/ja]',
|
||||
value: <ItemTypeField.DateTime lang={lang} date={item.last_update_date} />,
|
||||
},
|
||||
{
|
||||
label: '[en]Created Date[/en][ja]作成日[/ja]',
|
||||
value: <ItemTypeField.DateTime lang={lang} date={item.creation_date} />,
|
||||
},
|
||||
{
|
||||
label: '[en]Contributor[/en][ja]登録者[/ja]',
|
||||
value: <ItemTypeField.Contributer lang={lang} uname={item.uname} name={item.name} />,
|
||||
},
|
||||
{ label: '[en]Item Type[/en][ja]アイテムタイプ[/ja]', value: item.item_type_display_name },
|
||||
{ label: '[en]Change Log(History)[/en][ja]変更履歴[/ja]', value: <ItemTypeField.ChangeLog lang={lang} changelog={item.changelog} /> },
|
||||
{
|
||||
label: '[en]Change Log(History)[/en][ja]変更履歴[/ja]',
|
||||
value: <ItemTypeField.ChangeLog lang={lang} changelog={item.changelog} />,
|
||||
},
|
||||
{ label: '[en]Presentation Title[/en][ja]発表議題[/ja]', value: Functions.mlang(item.title, lang) },
|
||||
{ label: '[en]Author[/en][ja]発表者[/ja]', value: <ItemTypeField.Author lang={lang} author={item.author} /> },
|
||||
{ label: '[en]Abstract[/en][ja]要約[/ja]', value: <ItemTypeField.Description lang={lang} description={item.abstract} /> },
|
||||
{ label: '[en]Presentation File[/en][ja]発表資料[/ja]', value: <ItemTypeField.ItemFile lang={lang} file={item.file} type="conference_file" /> },
|
||||
{ label: '[en]Presentation Type[/en][ja]発表資料ファイル形式[/ja]', value: <ConferenceUtil.PresentationType lang={lang} type={item.presentation_type} /> },
|
||||
{ label: '[en]Conference Paper[/en][ja]学会資料[/ja]', value: <ItemTypeField.ItemFile lang={lang} file={item.file} type="conference_paper" /> },
|
||||
{
|
||||
label: '[en]Author[/en][ja]発表者[/ja]',
|
||||
value: <ItemTypeField.Author lang={lang} author={item.author} />,
|
||||
},
|
||||
{
|
||||
label: '[en]Abstract[/en][ja]要約[/ja]',
|
||||
value: <ItemTypeField.Description lang={lang} description={item.abstract} />,
|
||||
},
|
||||
{
|
||||
label: '[en]Presentation File[/en][ja]発表資料[/ja]',
|
||||
value: <ItemTypeField.ItemFile lang={lang} file={item.file} type="conference_file" />,
|
||||
},
|
||||
{
|
||||
label: '[en]Presentation Type[/en][ja]発表資料ファイル形式[/ja]',
|
||||
value: <ConferenceUtil.PresentationType lang={lang} type={item.presentation_type} />,
|
||||
},
|
||||
{
|
||||
label: '[en]Conference Paper[/en][ja]学会資料[/ja]',
|
||||
value: <ItemTypeField.ItemFile lang={lang} file={item.file} type="conference_paper" />,
|
||||
},
|
||||
{ label: 'Index', value: <ItemTypeField.ItemIndex lang={lang} index={item.index} /> },
|
||||
{ label: '[en]Related to[/en][ja]関連アイテム[/ja]', value: <ItemTypeField.RelatedTo lang={lang} relatedTo={item.related_to} /> },
|
||||
{
|
||||
label: '[en]Related to[/en][ja]関連アイテム[/ja]',
|
||||
value: <ItemTypeField.RelatedTo lang={lang} relatedTo={item.related_to} />,
|
||||
},
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
export default ConferenceDetail;
|
||||
export default ConferenceDetail;
|
||||
|
||||
@@ -1,13 +1,11 @@
|
||||
import React, { Fragment } from 'react';
|
||||
import { Link } from 'react-router-dom';
|
||||
import { ItemConference } from '../../lib/ItemUtil';
|
||||
import ListBase, { ListBaseProps } from '../lib/ListBase';
|
||||
import ConferenceUtil from './ConferenceUtil';
|
||||
import iconFile from '../../assets/images/icon_conference.gif';
|
||||
import { Link } from 'react-router';
|
||||
import Functions from '../../../functions';
|
||||
import iconFile from '../../assets/images/icon_conference.gif';
|
||||
import type { ItemConference } from '../../lib/ItemUtil';
|
||||
import ListBase, { type ListBaseProps } from '../lib/ListBase';
|
||||
import ConferenceUtil from './ConferenceUtil';
|
||||
|
||||
class ConferenceList extends ListBase {
|
||||
|
||||
constructor(props: ListBaseProps) {
|
||||
super(props);
|
||||
this.label = 'Conference';
|
||||
@@ -17,17 +15,17 @@ class ConferenceList extends ListBase {
|
||||
renderBody() {
|
||||
const { lang } = this.props;
|
||||
const item = this.props.item as ItemConference;
|
||||
const authors = item.author.map((author, i) => {
|
||||
return <Fragment key={i}>{i > 0 && ', '}{Functions.mlang(author, lang)}</Fragment>
|
||||
});
|
||||
const authors = item.author.map((author) => Functions.mlang(author, lang)).join(', ');
|
||||
return (
|
||||
<>
|
||||
<Link to={this.url}>{Functions.mlang(item.title, lang)}</Link><br />
|
||||
{Functions.mlang(item.conference_title, lang)} (<ConferenceUtil.PresentationType lang={lang} type={item.presentation_type} />)<br />
|
||||
<Link to={this.url}>{Functions.mlang(item.title, lang)}</Link>
|
||||
<br />
|
||||
{Functions.mlang(item.conference_title, lang)} (
|
||||
<ConferenceUtil.PresentationType lang={lang} type={item.presentation_type} />)<br />
|
||||
{authors}
|
||||
</>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
export default ConferenceList;
|
||||
export default ConferenceList;
|
||||
|
||||
@@ -1,9 +1,8 @@
|
||||
import { ItemConferenceSubTypes } from '../../lib/ItemUtil';
|
||||
import TopBase, { TopBaseProps } from '../lib/TopBase';
|
||||
import iconFile from '../../assets/images/icon_conference.gif';
|
||||
import { ItemConferenceSubTypes } from '../../lib/ItemUtil';
|
||||
import TopBase, { type TopBaseProps } from '../lib/TopBase';
|
||||
|
||||
class ConferenceTop extends TopBase {
|
||||
|
||||
constructor(props: TopBaseProps) {
|
||||
super(props);
|
||||
this.type = 'conference';
|
||||
@@ -14,4 +13,4 @@ class ConferenceTop extends TopBase {
|
||||
}
|
||||
}
|
||||
|
||||
export default ConferenceTop;
|
||||
export default ConferenceTop;
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
import React from 'react';
|
||||
import { MultiLang } from '../../../config';
|
||||
import { ItemConference, ItemConferenceSubType, ItemConferenceSubTypes } from '../../lib/ItemUtil';
|
||||
import type { MultiLang } from '../../../config';
|
||||
import { type ItemConference, type ItemConferenceSubType, ItemConferenceSubTypes } from '../../lib/ItemUtil';
|
||||
|
||||
interface PresentationTypeProps {
|
||||
lang: MultiLang;
|
||||
@@ -9,12 +8,14 @@ interface PresentationTypeProps {
|
||||
|
||||
const PresentationType = (props: PresentationTypeProps) => {
|
||||
const { type } = props;
|
||||
const subtype = ItemConferenceSubTypes.find((value) => { return value.type === type; });
|
||||
const subtype = ItemConferenceSubTypes.find((value) => {
|
||||
return value.type === type;
|
||||
});
|
||||
if (typeof subtype === 'undefined') {
|
||||
return null;
|
||||
}
|
||||
return (<span>{subtype.label}</span>);
|
||||
}
|
||||
return <span>{subtype.label}</span>;
|
||||
};
|
||||
|
||||
interface ConferenceDateProps {
|
||||
lang: MultiLang;
|
||||
@@ -24,14 +25,30 @@ interface ConferenceDateProps {
|
||||
const ConferenceDate = (props: ConferenceDateProps) => {
|
||||
const { item } = props;
|
||||
const monthStr = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
|
||||
const from = 'From: ' + monthStr[item.conference_from_month - 1] + ' ' + item.conference_from_mday + ', ' + item.conference_from_year;
|
||||
const to = 'To: ' + monthStr[item.conference_to_month - 1] + ' ' + item.conference_to_mday + ', ' + item.conference_to_year;
|
||||
return (<span>{from} {to}</span>);
|
||||
}
|
||||
const from =
|
||||
'From: ' +
|
||||
monthStr[item.conference_from_month - 1] +
|
||||
' ' +
|
||||
item.conference_from_mday +
|
||||
', ' +
|
||||
item.conference_from_year;
|
||||
const to =
|
||||
'To: ' +
|
||||
monthStr[item.conference_to_month - 1] +
|
||||
' ' +
|
||||
item.conference_to_mday +
|
||||
', ' +
|
||||
item.conference_to_year;
|
||||
return (
|
||||
<span>
|
||||
{from} {to}
|
||||
</span>
|
||||
);
|
||||
};
|
||||
|
||||
const ConferenceUtil = {
|
||||
PresentationType,
|
||||
ConferenceDate,
|
||||
}
|
||||
};
|
||||
|
||||
export default ConferenceUtil;
|
||||
export default ConferenceUtil;
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import ConferenceTop from './ConferenceTop';
|
||||
import ConferenceList from './ConferenceList';
|
||||
import ConferenceDetail from './ConferenceDetail';
|
||||
import ConferenceAdvancedSearch from './ConferenceAdvancedSearch';
|
||||
import ConferenceDetail from './ConferenceDetail';
|
||||
import ConferenceList from './ConferenceList';
|
||||
import ConferenceTop from './ConferenceTop';
|
||||
|
||||
const ItemTypeConference = {
|
||||
Top: ConferenceTop,
|
||||
@@ -10,4 +10,4 @@ const ItemTypeConference = {
|
||||
AdvancedSearch: ConferenceAdvancedSearch,
|
||||
};
|
||||
|
||||
export default ItemTypeConference;
|
||||
export default ItemTypeConference;
|
||||
|
||||
@@ -1,8 +1,7 @@
|
||||
import { ItemDataSubTypes } from '../../lib/ItemUtil';
|
||||
import AdvancedSearchBase, { AdvancedSearchBaseProps } from '../lib/AdvancedSearchBase';
|
||||
import AdvancedSearchBase, { type AdvancedSearchBaseProps } from '../lib/AdvancedSearchBase';
|
||||
|
||||
class DataAdvancedSearch extends AdvancedSearchBase {
|
||||
|
||||
constructor(props: AdvancedSearchBaseProps) {
|
||||
super(props);
|
||||
this.type = 'data';
|
||||
@@ -11,15 +10,15 @@ class DataAdvancedSearch extends AdvancedSearchBase {
|
||||
const year = String(now.getFullYear());
|
||||
const month = String(now.getMonth() + 1);
|
||||
const mday = String(now.getDate());
|
||||
this.state.values['title'] = '';
|
||||
this.state.values['keyword'] = '';
|
||||
this.state.values['description'] = '';
|
||||
this.state.values['doi'] = '';
|
||||
this.state.values['data_type'] = '';
|
||||
this.state.values['experimenter'] = '';
|
||||
this.state.values['publication_year'] = year;
|
||||
this.state.values['publication_month'] = month;
|
||||
this.state.values['publication_mday'] = mday;
|
||||
this.state.values.title = '';
|
||||
this.state.values.keyword = '';
|
||||
this.state.values.description = '';
|
||||
this.state.values.doi = '';
|
||||
this.state.values.data_type = '';
|
||||
this.state.values.experimenter = '';
|
||||
this.state.values.publication_year = year;
|
||||
this.state.values.publication_month = month;
|
||||
this.state.values.publication_mday = mday;
|
||||
this.state.values['file.preview.caption'] = '';
|
||||
this.state.values['file.data_file.original_file_name'] = '';
|
||||
this.setIgnoreKey('publication_year');
|
||||
@@ -30,17 +29,32 @@ class DataAdvancedSearch extends AdvancedSearchBase {
|
||||
getRows() {
|
||||
const rows = [
|
||||
{ label: '[en]Title[/en][ja]タイトル[/ja]', value: this.renderFieldInputText('title', 50) },
|
||||
{ label: '[en]Free Keywords[/en][ja]フリーキーワード[/ja]', value: this.renderFieldInputText('keyword', 50) },
|
||||
{
|
||||
label: '[en]Free Keywords[/en][ja]フリーキーワード[/ja]',
|
||||
value: this.renderFieldInputText('keyword', 50),
|
||||
},
|
||||
{ label: '[en]Description[/en][ja]概要[/ja]', value: this.renderFieldInputText('description', 50) },
|
||||
{ label: 'ID', value: this.renderFieldInputText('doi', 50) },
|
||||
{ label: '[en]Data Type[/en][ja]データタイプ[/ja]', value: this.renderFieldSelect('data_type', ItemDataSubTypes) },
|
||||
{
|
||||
label: '[en]Data Type[/en][ja]データタイプ[/ja]',
|
||||
value: this.renderFieldSelect('data_type', ItemDataSubTypes),
|
||||
},
|
||||
{ label: '[en]Experimenter[/en][ja]実験者[/ja]', value: this.renderFieldInputText('experimenter', 50) },
|
||||
{ label: '[en]Date[/en][ja]日付[/ja]', value: this.renderFieldDate('', 'publication_year', 'publication_month', 'publication_mday') },
|
||||
{ label: '[en]Caption[/en][ja]キャプション[/ja]', value: this.renderFieldInputText('file.preview.caption', 50) },
|
||||
{ label: '[en]Data File[/en][ja]データファイル[/ja]', value: this.renderFieldInputText('file.data_file.original_file_name', 50) },
|
||||
{
|
||||
label: '[en]Date[/en][ja]日付[/ja]',
|
||||
value: this.renderFieldDate('', 'publication_year', 'publication_month', 'publication_mday'),
|
||||
},
|
||||
{
|
||||
label: '[en]Caption[/en][ja]キャプション[/ja]',
|
||||
value: this.renderFieldInputText('file.preview.caption', 50),
|
||||
},
|
||||
{
|
||||
label: '[en]Data File[/en][ja]データファイル[/ja]',
|
||||
value: this.renderFieldInputText('file.data_file.original_file_name', 50),
|
||||
},
|
||||
];
|
||||
return rows;
|
||||
}
|
||||
}
|
||||
|
||||
export default DataAdvancedSearch;
|
||||
export default DataAdvancedSearch;
|
||||
|
||||
@@ -1,44 +1,113 @@
|
||||
import React from 'react';
|
||||
import Functions from '../../../functions';
|
||||
import ItemUtil, { ItemData } from '../../lib/ItemUtil';
|
||||
import ItemUtil, { type ItemData } from '../../lib/ItemUtil';
|
||||
import DetailBase from '../lib/DetailBase';
|
||||
import ItemTypeField from '../lib/field';
|
||||
import SimPFLinkIcon from '../lib/field/SimPFLinkIcon';
|
||||
import DataUtil from './DataUtil';
|
||||
|
||||
class DataDetail extends DetailBase {
|
||||
|
||||
getFields() {
|
||||
const { lang } = this.props;
|
||||
const item = this.props.item as ItemData;
|
||||
const fields = [
|
||||
{ label: 'ID', value: item.doi },
|
||||
{ label: '[en]Language[/en][ja]言語[/ja]', value: <ItemTypeField.Language lang={lang} itemLang={item.lang} /> },
|
||||
{
|
||||
label: '[en]Language[/en][ja]言語[/ja]',
|
||||
value: <ItemTypeField.Language lang={lang} itemLang={item.lang} />,
|
||||
},
|
||||
{ label: '[en]Title[/en][ja]タイトル[/ja]', value: Functions.mlang(item.title, lang) },
|
||||
{ label: '[en]Free Keywords[/en][ja]フリーキーワード[/ja]', value: <ItemTypeField.FreeKeyword lang={lang} keyword={item.keyword} /> },
|
||||
{ label: '[en]Description[/en][ja]概要[/ja]', value: <ItemTypeField.Description lang={lang} description={item.description} /> },
|
||||
{ label: '[en]Date[/en][ja]日付[/ja]', value: <ItemTypeField.PublicationDate lang={lang} year={item.publication_year} month={item.publication_month} mday={item.publication_mday} /> },
|
||||
{ label: '[en]Last Modified Date[/en][ja]最終更新日[/ja]', value: <ItemTypeField.DateTime lang={lang} date={item.last_update_date} /> },
|
||||
{ label: '[en]Created Date[/en][ja]作成日[/ja]', value: <ItemTypeField.DateTime lang={lang} date={item.creation_date} /> },
|
||||
{ label: '[en]Contributor[/en][ja]登録者[/ja]', value: <ItemTypeField.Contributer lang={lang} uname={item.uname} name={item.name} /> },
|
||||
{
|
||||
label: '[en]Free Keywords[/en][ja]フリーキーワード[/ja]',
|
||||
value: <ItemTypeField.FreeKeyword lang={lang} keyword={item.keyword} />,
|
||||
},
|
||||
{
|
||||
label: '[en]Description[/en][ja]概要[/ja]',
|
||||
value: <ItemTypeField.Description lang={lang} description={item.description} />,
|
||||
},
|
||||
{
|
||||
label: '[en]Date[/en][ja]日付[/ja]',
|
||||
value: (
|
||||
<ItemTypeField.PublicationDate
|
||||
lang={lang}
|
||||
year={item.publication_year}
|
||||
month={item.publication_month}
|
||||
mday={item.publication_mday}
|
||||
/>
|
||||
),
|
||||
},
|
||||
{
|
||||
label: '[en]Last Modified Date[/en][ja]最終更新日[/ja]',
|
||||
value: <ItemTypeField.DateTime lang={lang} date={item.last_update_date} />,
|
||||
},
|
||||
{
|
||||
label: '[en]Created Date[/en][ja]作成日[/ja]',
|
||||
value: <ItemTypeField.DateTime lang={lang} date={item.creation_date} />,
|
||||
},
|
||||
{
|
||||
label: '[en]Contributor[/en][ja]登録者[/ja]',
|
||||
value: <ItemTypeField.Contributer lang={lang} uname={item.uname} name={item.name} />,
|
||||
},
|
||||
{ label: '[en]Item Type[/en][ja]アイテムタイプ[/ja]', value: item.item_type_display_name },
|
||||
{ label: '[en]Change Log(History)[/en][ja]変更履歴[/ja]', value: <ItemTypeField.ChangeLog lang={lang} changelog={item.changelog} /> },
|
||||
{ label: '[en]Data Type[/en][ja]データタイプ[/ja]', value: <DataUtil.DataType lang={lang} type={item.data_type} /> },
|
||||
{ label: '[en]Experimenter[/en][ja]実験者[/ja]', value: <ItemTypeField.Author lang={lang} author={item.experimenter} /> },
|
||||
{ label: '[en]Preview[/en][ja]プレビュー[/ja]', value: <ItemTypeField.Preview lang={lang} file={item.file} /> },
|
||||
{ label: '[en]Data File[/en][ja]データファイル[/ja]', value: <ItemTypeField.ItemFile lang={lang} file={item.file} type="data_file" rights={item.rights} useCc={item.use_cc} ccCommercialUse={item.cc_commercial_use} ccModification={item.cc_modification} downloadLimit={item.attachment_dl_limit} /> },
|
||||
{
|
||||
label: '[en]Change Log(History)[/en][ja]変更履歴[/ja]',
|
||||
value: <ItemTypeField.ChangeLog lang={lang} changelog={item.changelog} />,
|
||||
},
|
||||
{
|
||||
label: '[en]Data Type[/en][ja]データタイプ[/ja]',
|
||||
value: <DataUtil.DataType lang={lang} type={item.data_type} />,
|
||||
},
|
||||
{
|
||||
label: '[en]Experimenter[/en][ja]実験者[/ja]',
|
||||
value: <ItemTypeField.Author lang={lang} author={item.experimenter} />,
|
||||
},
|
||||
{
|
||||
label: '[en]Preview[/en][ja]プレビュー[/ja]',
|
||||
value: <ItemTypeField.Preview lang={lang} file={item.file} />,
|
||||
},
|
||||
{
|
||||
label: '[en]Data File[/en][ja]データファイル[/ja]',
|
||||
value: (
|
||||
<ItemTypeField.ItemFile
|
||||
lang={lang}
|
||||
file={item.file}
|
||||
type="data_file"
|
||||
rights={item.rights}
|
||||
useCc={item.use_cc}
|
||||
ccCommercialUse={item.cc_commercial_use}
|
||||
ccModification={item.cc_modification}
|
||||
downloadLimit={item.attachment_dl_limit}
|
||||
/>
|
||||
),
|
||||
},
|
||||
{ label: 'Readme', value: <ItemTypeField.Readme lang={lang} readme={item.readme} /> },
|
||||
{ label: 'Rights', value: <ItemTypeField.Rights lang={lang} rights={item.rights} useCc={item.use_cc} ccCommercialUse={item.cc_commercial_use} ccModification={item.cc_modification} /> },
|
||||
{
|
||||
label: 'Rights',
|
||||
value: (
|
||||
<ItemTypeField.Rights
|
||||
lang={lang}
|
||||
rights={item.rights}
|
||||
useCc={item.use_cc}
|
||||
ccCommercialUse={item.cc_commercial_use}
|
||||
ccModification={item.cc_modification}
|
||||
/>
|
||||
),
|
||||
},
|
||||
{ label: 'Index', value: <ItemTypeField.ItemIndex lang={lang} index={item.index} /> },
|
||||
{ label: '[en]Related to[/en][ja]関連アイテム[/ja]', value: <ItemTypeField.RelatedTo lang={lang} relatedTo={item.related_to} /> },
|
||||
{
|
||||
label: '[en]Related to[/en][ja]関連アイテム[/ja]',
|
||||
value: <ItemTypeField.RelatedTo lang={lang} relatedTo={item.related_to} />,
|
||||
},
|
||||
];
|
||||
const simpfLinkUrl = ItemUtil.getSimPFLinkUrl(item.item_id);
|
||||
if (simpfLinkUrl !== '') {
|
||||
const field = { label: 'Online Simulation', value: <SimPFLinkIcon lang={lang} url={simpfLinkUrl} isDetail={true} /> };
|
||||
const field = {
|
||||
label: 'Online Simulation',
|
||||
value: <SimPFLinkIcon lang={lang} url={simpfLinkUrl} isDetail={true} />,
|
||||
};
|
||||
fields.splice(14, 0, field);
|
||||
}
|
||||
return fields;
|
||||
}
|
||||
}
|
||||
|
||||
export default DataDetail;
|
||||
export default DataDetail;
|
||||
|
||||
@@ -1,12 +1,10 @@
|
||||
import React, { Fragment } from 'react';
|
||||
import { Link } from 'react-router-dom';
|
||||
import { Link } from 'react-router';
|
||||
import Functions from '../../../functions';
|
||||
import iconFile from '../../assets/images/icon_data.gif';
|
||||
import { ItemData } from '../../lib/ItemUtil';
|
||||
import ListBase, { ListBaseProps } from '../lib/ListBase';
|
||||
import type { ItemData } from '../../lib/ItemUtil';
|
||||
import ListBase, { type ListBaseProps } from '../lib/ListBase';
|
||||
|
||||
class DataList extends ListBase {
|
||||
|
||||
constructor(props: ListBaseProps) {
|
||||
super(props);
|
||||
this.label = 'Data';
|
||||
@@ -16,16 +14,15 @@ class DataList extends ListBase {
|
||||
renderBody() {
|
||||
const { lang } = this.props;
|
||||
const item = this.props.item as ItemData;
|
||||
const authors = item.experimenter.map((author, i) => {
|
||||
return <Fragment key={i}>{i > 0 && ', '}{Functions.mlang(author, lang)}</Fragment>
|
||||
});
|
||||
const authors = item.experimenter.map((author) => Functions.mlang(author, lang)).join(', ');
|
||||
return (
|
||||
<>
|
||||
<Link to={this.url}>{Functions.mlang(item.title, lang)}</Link><br />
|
||||
<Link to={this.url}>{Functions.mlang(item.title, lang)}</Link>
|
||||
<br />
|
||||
{authors}
|
||||
</>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
export default DataList;
|
||||
export default DataList;
|
||||
|
||||
@@ -1,17 +1,17 @@
|
||||
import { ItemDataSubTypes } from '../../lib/ItemUtil';
|
||||
import TopBase, { TopBaseProps } from '../lib/TopBase';
|
||||
import iconFile from '../../assets/images/icon_data.gif';
|
||||
import { ItemDataSubTypes } from '../../lib/ItemUtil';
|
||||
import TopBase, { type TopBaseProps } from '../lib/TopBase';
|
||||
|
||||
class DataTop extends TopBase {
|
||||
|
||||
constructor(props: TopBaseProps) {
|
||||
super(props);
|
||||
this.type = 'data';
|
||||
this.label = 'Data';
|
||||
this.icon = iconFile;
|
||||
this.description = '[en]Result data in numerical text/image/movie formats.[/en][ja]実験結果の数値データ/画像/動画など[/ja]';
|
||||
this.description =
|
||||
'[en]Result data in numerical text/image/movie formats.[/en][ja]実験結果の数値データ/画像/動画など[/ja]';
|
||||
this.subTypes = ItemDataSubTypes;
|
||||
}
|
||||
}
|
||||
|
||||
export default DataTop;
|
||||
export default DataTop;
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
import React from 'react';
|
||||
import { MultiLang } from '../../../config';
|
||||
import { ItemDataSubType, ItemDataSubTypes } from '../../lib/ItemUtil';
|
||||
import type { MultiLang } from '../../../config';
|
||||
import { type ItemDataSubType, ItemDataSubTypes } from '../../lib/ItemUtil';
|
||||
|
||||
interface DataTypeProps {
|
||||
lang: MultiLang;
|
||||
@@ -9,15 +8,17 @@ interface DataTypeProps {
|
||||
|
||||
const DataType = (props: DataTypeProps) => {
|
||||
const { type } = props;
|
||||
const subtype = ItemDataSubTypes.find((value) => { return value.type === type; });
|
||||
const subtype = ItemDataSubTypes.find((value) => {
|
||||
return value.type === type;
|
||||
});
|
||||
if (typeof subtype === 'undefined') {
|
||||
return null;
|
||||
}
|
||||
return (<span>{subtype.label}</span>);
|
||||
}
|
||||
return <span>{subtype.label}</span>;
|
||||
};
|
||||
|
||||
const DataUtil = {
|
||||
DataType,
|
||||
}
|
||||
};
|
||||
|
||||
export default DataUtil;
|
||||
export default DataUtil;
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import DataTop from './DataTop';
|
||||
import DataList from './DataList';
|
||||
import DataDetail from './DataDetail';
|
||||
import DataAdvancedSearch from './DataAdvancedSearch';
|
||||
import DataDetail from './DataDetail';
|
||||
import DataList from './DataList';
|
||||
import DataTop from './DataTop';
|
||||
|
||||
const ItemTypeData = {
|
||||
Top: DataTop,
|
||||
@@ -10,4 +10,4 @@ const ItemTypeData = {
|
||||
AdvancedSearch: DataAdvancedSearch,
|
||||
};
|
||||
|
||||
export default ItemTypeData;
|
||||
export default ItemTypeData;
|
||||
|
||||
@@ -1,30 +1,41 @@
|
||||
import AdvancedSearchBase, { AdvancedSearchBaseProps } from '../lib/AdvancedSearchBase';
|
||||
import AdvancedSearchBase, { type AdvancedSearchBaseProps } from '../lib/AdvancedSearchBase';
|
||||
|
||||
class FilesAdvancedSearch extends AdvancedSearchBase {
|
||||
|
||||
constructor(props: AdvancedSearchBaseProps) {
|
||||
super(props);
|
||||
this.type = 'files';
|
||||
this.title = 'Files';
|
||||
this.state.values['title'] = '';
|
||||
this.state.values['data_file_name'] = '';
|
||||
this.state.values['data_file_mimetype'] = '';
|
||||
this.state.values['data_file_filetype'] = '';
|
||||
this.state.values['keyword'] = '';
|
||||
this.state.values['description'] = '';
|
||||
this.state.values.title = '';
|
||||
this.state.values.data_file_name = '';
|
||||
this.state.values.data_file_mimetype = '';
|
||||
this.state.values.data_file_filetype = '';
|
||||
this.state.values.keyword = '';
|
||||
this.state.values.description = '';
|
||||
}
|
||||
|
||||
getRows() {
|
||||
const rows = [
|
||||
{ label: '[en]Title[/en][ja]タイトル[/ja]', value: this.renderFieldInputText('title', 50) },
|
||||
{ label: '- [en]File Name[/en][ja]ファイル名[/ja]', value: this.renderFieldInputText('data_file_name', 50) },
|
||||
{ label: '- [en]MIME Type[/en][ja]MIMEタイプ[/ja]', value: this.renderFieldInputText('data_file_mimetype', 50) },
|
||||
{ label: '- [en]File Type[/en][ja]ファイルタイプ[/ja]', value: this.renderFieldInputText('data_file_filetype', 20) },
|
||||
{ label: '[en]Free Keywords[/en][ja]フリーキーワード[/ja]', value: this.renderFieldInputText('keyword', 50) },
|
||||
{
|
||||
label: '- [en]File Name[/en][ja]ファイル名[/ja]',
|
||||
value: this.renderFieldInputText('data_file_name', 50),
|
||||
},
|
||||
{
|
||||
label: '- [en]MIME Type[/en][ja]MIMEタイプ[/ja]',
|
||||
value: this.renderFieldInputText('data_file_mimetype', 50),
|
||||
},
|
||||
{
|
||||
label: '- [en]File Type[/en][ja]ファイルタイプ[/ja]',
|
||||
value: this.renderFieldInputText('data_file_filetype', 20),
|
||||
},
|
||||
{
|
||||
label: '[en]Free Keywords[/en][ja]フリーキーワード[/ja]',
|
||||
value: this.renderFieldInputText('keyword', 50),
|
||||
},
|
||||
{ label: '[en]Description[/en][ja]概要[/ja]', value: this.renderFieldInputText('description', 50) },
|
||||
];
|
||||
return rows;
|
||||
}
|
||||
}
|
||||
|
||||
export default FilesAdvancedSearch;
|
||||
export default FilesAdvancedSearch;
|
||||
|
||||
@@ -1,31 +1,56 @@
|
||||
import React from 'react';
|
||||
import Functions from '../../../functions';
|
||||
import { ItemFiles } from '../../lib/ItemUtil';
|
||||
import type { ItemFiles } from '../../lib/ItemUtil';
|
||||
import DetailBase from '../lib/DetailBase';
|
||||
import ItemTypeField from '../lib/field';
|
||||
|
||||
class FilesDetail extends DetailBase {
|
||||
|
||||
getFields() {
|
||||
const { lang } = this.props;
|
||||
const item = this.props.item as ItemFiles;
|
||||
return [
|
||||
{ label: 'ID', value: item.doi },
|
||||
{ label: '[en]Language[/en][ja]言語[/ja]', value: <ItemTypeField.Language lang={lang} itemLang={item.lang} /> },
|
||||
{
|
||||
label: '[en]Language[/en][ja]言語[/ja]',
|
||||
value: <ItemTypeField.Language lang={lang} itemLang={item.lang} />,
|
||||
},
|
||||
{ label: '[en]Title[/en][ja]タイトル[/ja]', value: Functions.mlang(item.title, lang) },
|
||||
{ label: '[en]Last Modified Date[/en][ja]最終更新日[/ja]', value: <ItemTypeField.DateTime lang={lang} date={item.last_update_date} /> },
|
||||
{ label: '[en]Created Date[/en][ja]作成日[/ja]', value: <ItemTypeField.DateTime lang={lang} date={item.creation_date} /> },
|
||||
{ label: '[en]Contributor[/en][ja]登録者[/ja]', value: <ItemTypeField.Contributer lang={lang} uname={item.uname} name={item.name} /> },
|
||||
{
|
||||
label: '[en]Last Modified Date[/en][ja]最終更新日[/ja]',
|
||||
value: <ItemTypeField.DateTime lang={lang} date={item.last_update_date} />,
|
||||
},
|
||||
{
|
||||
label: '[en]Created Date[/en][ja]作成日[/ja]',
|
||||
value: <ItemTypeField.DateTime lang={lang} date={item.creation_date} />,
|
||||
},
|
||||
{
|
||||
label: '[en]Contributor[/en][ja]登録者[/ja]',
|
||||
value: <ItemTypeField.Contributer lang={lang} uname={item.uname} name={item.name} />,
|
||||
},
|
||||
{ label: '[en]Item Type[/en][ja]アイテムタイプ[/ja]', value: item.item_type_display_name },
|
||||
{ label: '[en]Change Log(History)[/en][ja]変更履歴[/ja]', value: <ItemTypeField.ChangeLog lang={lang} changelog={item.changelog} /> },
|
||||
{ label: '[en]Data File[/en][ja]データファイル[/ja]', value: <ItemTypeField.ItemFile lang={lang} file={item.file} type="files_file" /> },
|
||||
{
|
||||
label: '[en]Change Log(History)[/en][ja]変更履歴[/ja]',
|
||||
value: <ItemTypeField.ChangeLog lang={lang} changelog={item.changelog} />,
|
||||
},
|
||||
{
|
||||
label: '[en]Data File[/en][ja]データファイル[/ja]',
|
||||
value: <ItemTypeField.ItemFile lang={lang} file={item.file} type="files_file" />,
|
||||
},
|
||||
{ label: '- [en]File Name[/en][ja]ファイル名[/ja]', value: item.data_file_name },
|
||||
{ label: '- [en]MIME Type[/en][ja]MIMEタイプ[/ja]', value: item.data_file_mimetype },
|
||||
{ label: '- [en]File Type[/en][ja]ファイルタイプ[/ja]', value: item.data_file_filetype },
|
||||
{ label: '[en]Free Keywords[/en][ja]フリーキーワード[/ja]', value: <ItemTypeField.FreeKeyword lang={lang} keyword={item.keyword} /> },
|
||||
{ label: '[en]Description[/en][ja]概要[/ja]', value: <ItemTypeField.Description lang={lang} description={item.description} /> },
|
||||
{
|
||||
label: '[en]Free Keywords[/en][ja]フリーキーワード[/ja]',
|
||||
value: <ItemTypeField.FreeKeyword lang={lang} keyword={item.keyword} />,
|
||||
},
|
||||
{
|
||||
label: '[en]Description[/en][ja]概要[/ja]',
|
||||
value: <ItemTypeField.Description lang={lang} description={item.description} />,
|
||||
},
|
||||
{ label: 'Index', value: <ItemTypeField.ItemIndex lang={lang} index={item.index} /> },
|
||||
{ label: '[en]Related to[/en][ja]関連アイテム[/ja]', value: <ItemTypeField.RelatedTo lang={lang} relatedTo={item.related_to} /> },
|
||||
{
|
||||
label: '[en]Related to[/en][ja]関連アイテム[/ja]',
|
||||
value: <ItemTypeField.RelatedTo lang={lang} relatedTo={item.related_to} />,
|
||||
},
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,13 +1,11 @@
|
||||
import React from 'react';
|
||||
import { Link } from 'react-router-dom';
|
||||
import { Link } from 'react-router';
|
||||
import Functions from '../../../functions';
|
||||
import iconFile from '../../assets/images/icon_files.gif';
|
||||
import { ItemFiles } from '../../lib/ItemUtil';
|
||||
import type { ItemFiles } from '../../lib/ItemUtil';
|
||||
import Contributer from '../lib/field/Contributer';
|
||||
import ListBase, { ListBaseProps } from '../lib/ListBase';
|
||||
import ListBase, { type ListBaseProps } from '../lib/ListBase';
|
||||
|
||||
class FilesList extends ListBase {
|
||||
|
||||
constructor(props: ListBaseProps) {
|
||||
super(props);
|
||||
this.label = 'Files';
|
||||
@@ -19,12 +17,14 @@ class FilesList extends ListBase {
|
||||
const item = this.props.item as ItemFiles;
|
||||
return (
|
||||
<>
|
||||
<Link to={this.url}>{Functions.mlang(item.title, lang)}</Link><br />
|
||||
<Contributer lang={lang} uname={item.uname} name={item.name} /><br />
|
||||
<Link to={this.url}>{Functions.mlang(item.title, lang)}</Link>
|
||||
<br />
|
||||
<Contributer lang={lang} uname={item.uname} name={item.name} />
|
||||
<br />
|
||||
{item.data_file_mimetype}
|
||||
</>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
export default FilesList;
|
||||
export default FilesList;
|
||||
|
||||
@@ -1,9 +1,8 @@
|
||||
import TopBase, { TopBaseProps } from '../lib/TopBase';
|
||||
import iconFile from '../../assets/images/icon_files.gif';
|
||||
import { ItemFilesSubTypes } from '../../lib/ItemUtil';
|
||||
import TopBase, { type TopBaseProps } from '../lib/TopBase';
|
||||
|
||||
class FilesTop extends TopBase {
|
||||
|
||||
constructor(props: TopBaseProps) {
|
||||
super(props);
|
||||
this.type = 'files';
|
||||
@@ -14,4 +13,4 @@ class FilesTop extends TopBase {
|
||||
}
|
||||
}
|
||||
|
||||
export default FilesTop;
|
||||
export default FilesTop;
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
const FilesUtil = {};
|
||||
|
||||
const FilesUtil = {
|
||||
}
|
||||
|
||||
export default FilesUtil;
|
||||
export default FilesUtil;
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import FilesTop from './FilesTop';
|
||||
import FilesList from './FilesList';
|
||||
import FilesDetail from './FilesDetail';
|
||||
import FilesAdvancedSearch from './FilesAdvancedSearch';
|
||||
import FilesDetail from './FilesDetail';
|
||||
import FilesList from './FilesList';
|
||||
import FilesTop from './FilesTop';
|
||||
|
||||
const ItemTypeFiles = {
|
||||
Top: FilesTop,
|
||||
@@ -10,4 +10,4 @@ const ItemTypeFiles = {
|
||||
AdvancedSearch: FilesAdvancedSearch,
|
||||
};
|
||||
|
||||
export default ItemTypeFiles;
|
||||
export default ItemTypeFiles;
|
||||
|
||||
@@ -1,7 +1,21 @@
|
||||
import React from 'react';
|
||||
import { MultiLang } from '../../config';
|
||||
import AdvancedSearchQuery from '../lib/AdvancedSearchQuery';
|
||||
import { Item, ItemBinder, ItemBook, ItemConference, ItemData, ItemFiles, ItemModel, ItemPaper, ItemPresentation, ItemSimulator, ItemStimulus, ItemTool, ItemUrl, ItemMemo } from '../lib/ItemUtil';
|
||||
import type { MultiLang } from '../../config';
|
||||
import type AdvancedSearchQuery from '../lib/AdvancedSearchQuery';
|
||||
import type {
|
||||
Item,
|
||||
ItemBinder,
|
||||
ItemBook,
|
||||
ItemConference,
|
||||
ItemData,
|
||||
ItemFiles,
|
||||
ItemMemo,
|
||||
ItemModel,
|
||||
ItemPaper,
|
||||
ItemPresentation,
|
||||
ItemSimulator,
|
||||
ItemStimulus,
|
||||
ItemTool,
|
||||
ItemUrl,
|
||||
} from '../lib/ItemUtil';
|
||||
import ItemTypeBinder from './binder';
|
||||
import ItemTypeBook from './book';
|
||||
import ItemTypeConference from './conference';
|
||||
@@ -52,7 +66,7 @@ const Top = (props: TopProps) => {
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
interface ListProps {
|
||||
lang: MultiLang;
|
||||
@@ -90,7 +104,7 @@ const List = (props: ListProps) => {
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
interface DetailProps {
|
||||
lang: MultiLang;
|
||||
@@ -128,7 +142,7 @@ const Detail = (props: DetailProps) => {
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
interface AdvancedSearchProps {
|
||||
lang: MultiLang;
|
||||
@@ -167,13 +181,13 @@ const AdvancedSearch = (props: AdvancedSearchProps) => {
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
const ItemType = {
|
||||
Top,
|
||||
List,
|
||||
Detail,
|
||||
AdvancedSearch
|
||||
}
|
||||
AdvancedSearch,
|
||||
};
|
||||
|
||||
export default ItemType;
|
||||
export default ItemType;
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
import React, { ChangeEvent, Component } from 'react';
|
||||
import { MultiLang } from '../../../config';
|
||||
import React, { type ChangeEvent, Component } from 'react';
|
||||
import type { MultiLang } from '../../../config';
|
||||
import Functions from '../../../functions';
|
||||
import AdvancedSearchQuery from '../../lib/AdvancedSearchQuery';
|
||||
import { ItemSubTypes } from '../../lib/ItemUtil';
|
||||
import type AdvancedSearchQuery from '../../lib/AdvancedSearchQuery';
|
||||
import type { ItemSubTypes } from '../../lib/ItemUtil';
|
||||
|
||||
export interface AdvancedSearchBaseProps {
|
||||
lang: MultiLang;
|
||||
@@ -11,12 +11,11 @@ export interface AdvancedSearchBaseProps {
|
||||
|
||||
interface State {
|
||||
show: boolean;
|
||||
values: any;
|
||||
values: Record<string, string>;
|
||||
}
|
||||
|
||||
class AdvancedSearchBase extends Component<AdvancedSearchBaseProps, State> {
|
||||
|
||||
protected type: string = 'base'
|
||||
protected type: string = 'base';
|
||||
protected title: string = 'Base';
|
||||
protected query: AdvancedSearchQuery;
|
||||
protected ignoreKeys: string[] = [];
|
||||
@@ -26,7 +25,7 @@ class AdvancedSearchBase extends Component<AdvancedSearchBaseProps, State> {
|
||||
this.state = {
|
||||
show: false,
|
||||
values: {},
|
||||
}
|
||||
};
|
||||
this.query = props.query;
|
||||
this.handleChangeTitleCheck = this.handleChangeTitleCheck.bind(this);
|
||||
}
|
||||
@@ -49,14 +48,14 @@ class AdvancedSearchBase extends Component<AdvancedSearchBaseProps, State> {
|
||||
deleteIgnoreKey(key: string) {
|
||||
if (this.ignoreKeys.includes(key)) {
|
||||
this.ignoreKeys = this.ignoreKeys.filter((v) => {
|
||||
return (v !== key);
|
||||
return v !== key;
|
||||
});
|
||||
}
|
||||
this.query.set(this.type, key, this.state.values[key]);
|
||||
}
|
||||
|
||||
updateField(key: string, value: string) {
|
||||
let values = Object.assign({}, this.state.values);
|
||||
const values = Object.assign({}, this.state.values);
|
||||
values[key] = value;
|
||||
this.updateQuery(key, value);
|
||||
this.setState({ values });
|
||||
@@ -75,7 +74,7 @@ class AdvancedSearchBase extends Component<AdvancedSearchBaseProps, State> {
|
||||
this.setState({ show });
|
||||
}
|
||||
|
||||
getRows(): { label: string, value: JSX.Element }[] {
|
||||
getRows(): { label: string; value: React.JSX.Element }[] {
|
||||
return [];
|
||||
}
|
||||
|
||||
@@ -84,20 +83,30 @@ class AdvancedSearchBase extends Component<AdvancedSearchBaseProps, State> {
|
||||
this.updateField(key, e.target.value);
|
||||
};
|
||||
return (
|
||||
<input className="fieldInputText" type="text" value={this.state.values[key]} size={size} onChange={onChange} />
|
||||
<input
|
||||
className="fieldInputText"
|
||||
type="text"
|
||||
value={this.state.values[key]}
|
||||
size={size}
|
||||
onChange={onChange}
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
||||
renderFieldSelect(key: string, values: ItemSubTypes<any>) {
|
||||
renderFieldSelect(key: string, values: ItemSubTypes<string>) {
|
||||
const onChange = (e: ChangeEvent<HTMLSelectElement>) => {
|
||||
this.updateField(key, e.target.value);
|
||||
};
|
||||
const options = values.map(({ type, label }, i) => {
|
||||
return <option key={i} value={type}>{label}</option>;
|
||||
const options = values.map(({ type, label }) => {
|
||||
return (
|
||||
<option key={type} value={type}>
|
||||
{label}
|
||||
</option>
|
||||
);
|
||||
});
|
||||
return (
|
||||
<select className="fieldSelect" value={this.state.values[key]} onChange={onChange}>
|
||||
<option value=''>Any</option>
|
||||
<option value="">Any</option>
|
||||
{options}
|
||||
</select>
|
||||
);
|
||||
@@ -117,27 +126,52 @@ class AdvancedSearchBase extends Component<AdvancedSearchBaseProps, State> {
|
||||
};
|
||||
const month = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
|
||||
const monthOptions = month.map((value, i) => {
|
||||
return <option key={i} value={i + 1}>{value}</option>;
|
||||
})
|
||||
let mdayOptions: JSX.Element[] = [];
|
||||
return (
|
||||
<option key={value} value={i + 1}>
|
||||
{value}
|
||||
</option>
|
||||
);
|
||||
});
|
||||
const mdayOptions: React.JSX.Element[] = [];
|
||||
for (let i = 1; i <= 31; i++) {
|
||||
mdayOptions.push(<option key={i} value={i}>{i}</option>)
|
||||
mdayOptions.push(
|
||||
<option key={i} value={i}>
|
||||
{i}
|
||||
</option>
|
||||
);
|
||||
}
|
||||
return (
|
||||
<div className="fieldDate">
|
||||
<input type="checkbox" onChange={onChange} />
|
||||
{label.length !== 0 && <label className="fieldDateLabel">{label}</label>}
|
||||
{keyMonth !== '' &&
|
||||
<select value={this.state.values[keyMonth]} onChange={(e) => this.updateField(keyMonth, e.target.value)}>
|
||||
{label.length !== 0 ? (
|
||||
<label className="fieldDateLabel">
|
||||
<input type="checkbox" onChange={onChange} />
|
||||
{label}
|
||||
</label>
|
||||
) : (
|
||||
<input type="checkbox" onChange={onChange} />
|
||||
)}
|
||||
{keyMonth !== '' && (
|
||||
<select
|
||||
value={this.state.values[keyMonth]}
|
||||
onChange={(e) => this.updateField(keyMonth, e.target.value)}
|
||||
>
|
||||
{monthOptions}
|
||||
</select>
|
||||
}
|
||||
{keyMday !== '' &&
|
||||
<select value={this.state.values[keyMday]} onChange={(e) => this.updateField(keyMday, e.target.value)}>
|
||||
)}
|
||||
{keyMday !== '' && (
|
||||
<select
|
||||
value={this.state.values[keyMday]}
|
||||
onChange={(e) => this.updateField(keyMday, e.target.value)}
|
||||
>
|
||||
{mdayOptions}
|
||||
</select>
|
||||
}
|
||||
<input type="text" value={this.state.values[keyYear]} size={5} onChange={(e) => this.updateField(keyYear, e.target.value)} />
|
||||
)}
|
||||
<input
|
||||
type="text"
|
||||
value={this.state.values[keyYear]}
|
||||
size={5}
|
||||
onChange={(e) => this.updateField(keyYear, e.target.value)}
|
||||
/>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@@ -151,7 +185,7 @@ class AdvancedSearchBase extends Component<AdvancedSearchBaseProps, State> {
|
||||
const fields = rows.map((value, idx) => {
|
||||
const evenodd = idx % 2 === 0 ? 'even' : 'odd';
|
||||
return (
|
||||
<tr key={idx}>
|
||||
<tr key={value.label}>
|
||||
<td className="head">{Functions.mlang(value.label, lang)}</td>
|
||||
<td className={evenodd}>{value.value}</td>
|
||||
</tr>
|
||||
@@ -159,9 +193,7 @@ class AdvancedSearchBase extends Component<AdvancedSearchBaseProps, State> {
|
||||
});
|
||||
return (
|
||||
<table className="itemtypeFields outer">
|
||||
<tbody>
|
||||
{fields}
|
||||
</tbody>
|
||||
<tbody>{fields}</tbody>
|
||||
</table>
|
||||
);
|
||||
}
|
||||
@@ -173,7 +205,11 @@ class AdvancedSearchBase extends Component<AdvancedSearchBaseProps, State> {
|
||||
<tbody>
|
||||
<tr>
|
||||
<th align="left">
|
||||
<input type="checkbox" checked={this.state.show} onChange={this.handleChangeTitleCheck} />
|
||||
<input
|
||||
type="checkbox"
|
||||
checked={this.state.show}
|
||||
onChange={this.handleChangeTitleCheck}
|
||||
/>
|
||||
{this.title}
|
||||
</th>
|
||||
</tr>
|
||||
@@ -183,7 +219,6 @@ class AdvancedSearchBase extends Component<AdvancedSearchBaseProps, State> {
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
export default AdvancedSearchBase;
|
||||
export default AdvancedSearchBase;
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import React, { Component, ReactNode } from 'react';
|
||||
import { MultiLang } from '../../../config';
|
||||
import { Component, type ReactNode } from 'react';
|
||||
import type { MultiLang } from '../../../config';
|
||||
import Functions from '../../../functions';
|
||||
import { Item } from '../../lib/ItemUtil';
|
||||
import type { Item } from '../../lib/ItemUtil';
|
||||
|
||||
export interface DetailBaseField {
|
||||
label: string;
|
||||
@@ -10,11 +10,10 @@ export interface DetailBaseField {
|
||||
|
||||
export interface DetailBaseProps {
|
||||
lang: MultiLang;
|
||||
item: Item
|
||||
item: Item;
|
||||
}
|
||||
|
||||
class DetailBase extends Component<DetailBaseProps> {
|
||||
|
||||
getFields(): DetailBaseField[] {
|
||||
return [];
|
||||
}
|
||||
@@ -24,20 +23,18 @@ class DetailBase extends Component<DetailBaseProps> {
|
||||
const elements = this.getFields().map((value, idx) => {
|
||||
const evenodd = idx % 2 === 0 ? 'even' : 'odd';
|
||||
return (
|
||||
<tr key={idx}>
|
||||
<tr key={value.label}>
|
||||
<td className="head">{Functions.mlang(value.label, lang)}</td>
|
||||
<td className={evenodd}>{value.value}</td>
|
||||
</tr>
|
||||
)
|
||||
);
|
||||
});
|
||||
return (
|
||||
<table className="outer itemDetail">
|
||||
<tbody>
|
||||
{elements}
|
||||
</tbody>
|
||||
<tbody>{elements}</tbody>
|
||||
</table>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
export default DetailBase;
|
||||
export default DetailBase;
|
||||
|
||||
@@ -1,15 +1,14 @@
|
||||
import React, { Component } from 'react';
|
||||
import { MultiLang } from '../../../config';
|
||||
import ItemUtil, { Item } from '../../lib/ItemUtil';
|
||||
import { Component } from 'react';
|
||||
import type { MultiLang } from '../../../config';
|
||||
import ItemUtil, { type Item } from '../../lib/ItemUtil';
|
||||
import SimPFLinkIcon from './field/SimPFLinkIcon';
|
||||
|
||||
export interface ListBaseProps {
|
||||
lang: MultiLang;
|
||||
item: Item
|
||||
};
|
||||
item: Item;
|
||||
}
|
||||
|
||||
class ListBase extends Component<ListBaseProps> {
|
||||
|
||||
protected label = '';
|
||||
protected icon = '';
|
||||
protected url: string;
|
||||
@@ -21,8 +20,8 @@ class ListBase extends Component<ListBaseProps> {
|
||||
this.simpfLinkUrl = ItemUtil.getSimPFLinkUrl(props.item.item_id);
|
||||
}
|
||||
|
||||
renderBody() {
|
||||
return <></>;
|
||||
renderBody(): React.ReactNode {
|
||||
return null;
|
||||
}
|
||||
|
||||
render() {
|
||||
@@ -34,9 +33,7 @@ class ListBase extends Component<ListBaseProps> {
|
||||
<td className="listIcon">
|
||||
<img src={this.icon} alt={this.label} />
|
||||
</td>
|
||||
<td>
|
||||
{this.renderBody()}
|
||||
</td>
|
||||
<td>{this.renderBody()}</td>
|
||||
<td className="listExtra">
|
||||
<SimPFLinkIcon lang={lang} url={this.simpfLinkUrl} isDetail={false} />
|
||||
</td>
|
||||
@@ -47,4 +44,4 @@ class ListBase extends Component<ListBaseProps> {
|
||||
}
|
||||
}
|
||||
|
||||
export default ListBase;
|
||||
export default ListBase;
|
||||
|
||||
@@ -1,26 +1,30 @@
|
||||
import React, { Component, Fragment } from 'react';
|
||||
import { Link } from 'react-router-dom';
|
||||
import { MultiLang } from '../../../config';
|
||||
import { Component, Fragment } from 'react';
|
||||
import { Link } from 'react-router';
|
||||
import type { MultiLang } from '../../../config';
|
||||
import Functions from '../../../functions';
|
||||
import ItemUtil, { ItemSubTypes } from '../../lib/ItemUtil';
|
||||
import ItemUtil, { type ItemSubTypes } from '../../lib/ItemUtil';
|
||||
|
||||
export interface TopBaseProps {
|
||||
lang: MultiLang;
|
||||
}
|
||||
|
||||
class TopBase extends Component<TopBaseProps> {
|
||||
|
||||
protected type: string = '';
|
||||
protected label: string = '';
|
||||
protected icon: string = '';
|
||||
protected description: string = '';
|
||||
protected subTypes: ItemSubTypes<any> = [];
|
||||
protected subTypes: ItemSubTypes<string> = [];
|
||||
|
||||
render() {
|
||||
const { lang } = this.props;
|
||||
const url = ItemUtil.getItemTypeSearchUrl(this.type);
|
||||
const links = this.subTypes.map(({ type, label }, i) => {
|
||||
return <Fragment key={i}>{i > 0 && ' / '}<Link to={url + '/' + type}>{label}</Link></Fragment>;
|
||||
return (
|
||||
<Fragment key={type}>
|
||||
{i > 0 && ' / '}
|
||||
<Link to={`${url}/${type}`}>{label}</Link>
|
||||
</Fragment>
|
||||
);
|
||||
});
|
||||
return (
|
||||
<div>
|
||||
@@ -44,4 +48,4 @@ class TopBase extends Component<TopBaseProps> {
|
||||
}
|
||||
}
|
||||
|
||||
export default TopBase;
|
||||
export default TopBase;
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
import React from 'react';
|
||||
import { MultiLang } from '../../../../config';
|
||||
import type { MultiLang } from '../../../../config';
|
||||
|
||||
interface Props {
|
||||
lang: MultiLang;
|
||||
@@ -13,9 +12,17 @@ const Author = (props: Props) => {
|
||||
}
|
||||
const elements = author.map((value, idx) => {
|
||||
const evenodd = idx % 2 === 0 ? 'even' : 'odd';
|
||||
return <tr key={idx}><td className={evenodd}>{value}</td></tr>;
|
||||
return (
|
||||
<tr key={value}>
|
||||
<td className={evenodd}>{value}</td>
|
||||
</tr>
|
||||
);
|
||||
});
|
||||
return <table><tbody>{elements}</tbody></table>;
|
||||
}
|
||||
return (
|
||||
<table>
|
||||
<tbody>{elements}</tbody>
|
||||
</table>
|
||||
);
|
||||
};
|
||||
|
||||
export default Author;
|
||||
export default Author;
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
import React from 'react';
|
||||
import { MultiLang } from '../../../../config';
|
||||
import type { MultiLang } from '../../../../config';
|
||||
import Functions from '../../../../functions';
|
||||
import { ItemBasicChangeLog } from '../../../lib/ItemUtil';
|
||||
import type { ItemBasicChangeLog } from '../../../lib/ItemUtil';
|
||||
import DateTime from './DateTime';
|
||||
|
||||
interface Props {
|
||||
@@ -14,15 +13,21 @@ const ChangeLog = (props: Props) => {
|
||||
if (changelog.length === 0) {
|
||||
return null;
|
||||
}
|
||||
const elements = changelog.map((value, i) => {
|
||||
const elements = changelog.map((value) => {
|
||||
return (
|
||||
<tr key={i}>
|
||||
<td><DateTime lang={lang} date={value.log_date} onlyDate={true} /></td>
|
||||
<tr key={`${value.log_date}:${value.log}`}>
|
||||
<td>
|
||||
<DateTime lang={lang} date={value.log_date} onlyDate={true} />
|
||||
</td>
|
||||
<td>{Functions.mlang(value.log, lang)}</td>
|
||||
</tr>
|
||||
);
|
||||
});
|
||||
return (<table><tbody>{elements}</tbody></table>);
|
||||
}
|
||||
return (
|
||||
<table>
|
||||
<tbody>{elements}</tbody>
|
||||
</table>
|
||||
);
|
||||
};
|
||||
|
||||
export default ChangeLog;
|
||||
export default ChangeLog;
|
||||
|
||||
@@ -1,18 +1,17 @@
|
||||
import React from 'react';
|
||||
import { MultiLang } from '../../../../config';
|
||||
import type { MultiLang } from '../../../../config';
|
||||
import Functions from '../../../../functions';
|
||||
|
||||
interface Props {
|
||||
lang: MultiLang;
|
||||
uname: string;
|
||||
name: string
|
||||
name: string;
|
||||
}
|
||||
|
||||
const Contributer = (props: Props) => {
|
||||
const { lang, name, uname } = props;
|
||||
const unsubscribed = '([en]Unsubscribed User[/en][ja]退会済みユーザ[/ja])';
|
||||
const label = uname === '' ? unsubscribed : (name === '' ? uname : name + ' (' + uname + ')');
|
||||
const label = uname === '' ? unsubscribed : name === '' ? uname : `${name} (${uname})`;
|
||||
return <span>{Functions.mlang(label, lang)}</span>;
|
||||
}
|
||||
};
|
||||
|
||||
export default Contributer;
|
||||
export default Contributer;
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
import React from 'react';
|
||||
import { MultiLang } from '../../../../config';
|
||||
import type { MultiLang } from '../../../../config';
|
||||
|
||||
export type CreativeCommonsType = 'by' | 'by-nc' | 'by-nc-nd' | 'by-nc-sa' | 'by-nd' | 'by-sa';
|
||||
|
||||
@@ -16,11 +15,10 @@ export const getCreativeCommonsType = (ccCommercialUse: number, ccModification:
|
||||
return 'by-nd';
|
||||
case 11:
|
||||
return 'by-sa';
|
||||
case 12:
|
||||
default:
|
||||
return 'by';
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
interface Props {
|
||||
lang: MultiLang;
|
||||
@@ -29,28 +27,41 @@ interface Props {
|
||||
|
||||
const CreativeCommons = (props: Props) => {
|
||||
const { type } = props;
|
||||
const url = 'http://creativecommons.org/licenses/' + type + '/4.0/';
|
||||
const logoUrl = 'https://i.creativecommons.org/l/' + type + '/4.0/88x31.png';
|
||||
const url = `http://creativecommons.org/licenses/${type}/4.0/`;
|
||||
const logoUrl = `https://i.creativecommons.org/l/${type}/4.0/88x31.png`;
|
||||
const labels = {
|
||||
by: 'Attribution',
|
||||
nc: 'NonCommercial',
|
||||
nd: 'NoDerivatives',
|
||||
sa: 'ShareAlike',
|
||||
}
|
||||
const label = type.split('-').map((value) => {
|
||||
const prop = value as 'by' | 'nc' | 'nd' | 'sa';
|
||||
return labels[prop];
|
||||
}).join('-');
|
||||
};
|
||||
const label = type
|
||||
.split('-')
|
||||
.map((value) => {
|
||||
const prop = value as 'by' | 'nc' | 'nd' | 'sa';
|
||||
return labels[prop];
|
||||
})
|
||||
.join('-');
|
||||
return (
|
||||
<table style={{borderCollapse: 'separate', borderSpacing: '5px'}}>
|
||||
<table style={{ borderCollapse: 'separate', borderSpacing: '5px' }}>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><a href={url} target="_blank" rel="license noopener noreferrer"><img alt="Creative Commons License" src={logoUrl} /></a></td>
|
||||
<td>This work is licensed under a <a href={url} target="_blank" rel="license noopener noreferrer">Criative Commons {label} 4.0 International License</a>.</td>
|
||||
<td>
|
||||
<a href={url} target="_blank" rel="license noopener noreferrer">
|
||||
<img alt="Creative Commons License" src={logoUrl} />
|
||||
</a>
|
||||
</td>
|
||||
<td>
|
||||
This work is licensed under a{' '}
|
||||
<a href={url} target="_blank" rel="license noopener noreferrer">
|
||||
Criative Commons {label} 4.0 International License
|
||||
</a>
|
||||
.
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
export default CreativeCommons;
|
||||
export default CreativeCommons;
|
||||
|
||||
@@ -1,21 +1,25 @@
|
||||
import moment from 'moment';
|
||||
import React from 'react';
|
||||
import { MultiLang } from '../../../../config';
|
||||
import type { MultiLang } from '../../../../config';
|
||||
|
||||
interface Props {
|
||||
lang: MultiLang;
|
||||
date: number;
|
||||
onlyDate?: boolean
|
||||
onlyDate?: boolean;
|
||||
}
|
||||
|
||||
// Kept on en-US so the output matches the previous moment format 'MMM D, Y HH:mm:ss'.
|
||||
const dateFormat = new Intl.DateTimeFormat('en-US', { year: 'numeric', month: 'short', day: 'numeric' });
|
||||
const timeFormat = new Intl.DateTimeFormat('en-US', {
|
||||
hour: '2-digit',
|
||||
minute: '2-digit',
|
||||
second: '2-digit',
|
||||
hour12: false,
|
||||
});
|
||||
|
||||
const DateTime = (props: Props) => {
|
||||
const { date, onlyDate } = props;
|
||||
const d = moment(new Date(date * 1000));
|
||||
let format = 'MMM D, Y';
|
||||
if (typeof onlyDate === 'undefined' || !onlyDate) {
|
||||
format += ' HH:mm:ss';
|
||||
}
|
||||
return <span>{d.format(format)}</span>;
|
||||
}
|
||||
const d = new Date(date * 1000);
|
||||
const text = onlyDate ? dateFormat.format(d) : `${dateFormat.format(d)} ${timeFormat.format(d)}`;
|
||||
return <span>{text}</span>;
|
||||
};
|
||||
|
||||
export default DateTime;
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
import React from 'react';
|
||||
import XoopsCode from '../../../../common/lib/XoopsCode';
|
||||
import { MultiLang } from '../../../../config';
|
||||
import type { MultiLang } from '../../../../config';
|
||||
|
||||
interface Props {
|
||||
lang: MultiLang;
|
||||
@@ -12,7 +11,7 @@ const Description = (props: Props) => {
|
||||
const { lang, description, className } = props;
|
||||
const textarea = <XoopsCode lang={lang} text={description} dobr={true} />;
|
||||
const name = typeof className === 'undefined' ? 'description' : className;
|
||||
return (<div className={name}>{textarea}</div>);
|
||||
}
|
||||
return <div className={name}>{textarea}</div>;
|
||||
};
|
||||
|
||||
export default Description;
|
||||
export default Description;
|
||||
|
||||
@@ -1,21 +1,21 @@
|
||||
.downloadButton {
|
||||
display: inline-block;
|
||||
padding: 7px 20px;
|
||||
text-decoration: none !important;
|
||||
font-weight: normal !important;
|
||||
text-decoration: none;
|
||||
font-weight: normal;
|
||||
background: #f0f0f0;
|
||||
color: #000 !important;
|
||||
color: #000;
|
||||
border: solid 1px #e0e0e0;
|
||||
box-shadow: 2px 2px #bbbbbb;
|
||||
border-radius: 5px;
|
||||
}
|
||||
|
||||
.downloadButton:hover {
|
||||
background: #e8e8e8 !important;
|
||||
background: #e8e8e8;
|
||||
border: solid 1px #cccccc;
|
||||
}
|
||||
|
||||
.downloadButton:active {
|
||||
transform: translate(2px, 2px);
|
||||
box-shadow: none;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import React, { Component } from 'react';
|
||||
import { MultiLang } from '../../../../config';
|
||||
import ItemUtil, { ItemBasicFile } from '../../../lib/ItemUtil';
|
||||
import type React from 'react';
|
||||
import { Component } from 'react';
|
||||
import type { MultiLang } from '../../../../config';
|
||||
import ItemUtil, { type ItemBasicFile } from '../../../lib/ItemUtil';
|
||||
import styles from './FileDownloadButton.module.css';
|
||||
import LicenseAgreementDialog from './LicenseAgreementDialog';
|
||||
|
||||
@@ -18,7 +19,6 @@ interface State {
|
||||
}
|
||||
|
||||
class FileDownloadButton extends Component<Props, State> {
|
||||
|
||||
constructor(props: Props) {
|
||||
super(props);
|
||||
this.state = {
|
||||
@@ -45,11 +45,29 @@ class FileDownloadButton extends Component<Props, State> {
|
||||
const url = ItemUtil.getFileUrl(this.props.file);
|
||||
return (
|
||||
<>
|
||||
<a className={styles.downloadButton} href={url} download={file.original_file_name} target="_blank" rel="noopener noreferrer" onClick={this.handleClickDownload}>Download</a>
|
||||
<LicenseAgreementDialog lang={lang} file={file} rights={rights} useCc={useCc} ccCommercialUse={ccCommercialUse} ccModification={ccModification} show={this.state.show} unsetShow={this.unsetShow} />
|
||||
<a
|
||||
className={styles.downloadButton}
|
||||
href={url}
|
||||
download={file.original_file_name}
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
onClick={this.handleClickDownload}
|
||||
>
|
||||
Download
|
||||
</a>
|
||||
<LicenseAgreementDialog
|
||||
lang={lang}
|
||||
file={file}
|
||||
rights={rights}
|
||||
useCc={useCc}
|
||||
ccCommercialUse={ccCommercialUse}
|
||||
ccModification={ccModification}
|
||||
show={this.state.show}
|
||||
unsetShow={this.unsetShow}
|
||||
/>
|
||||
</>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
export default FileDownloadButton;
|
||||
export default FileDownloadButton;
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
import React from 'react';
|
||||
import { MultiLang } from '../../../../config';
|
||||
import type { MultiLang } from '../../../../config';
|
||||
|
||||
interface Props {
|
||||
lang: MultiLang;
|
||||
@@ -10,8 +9,8 @@ const FileSize = (props: Props) => {
|
||||
const { size } = props;
|
||||
const units = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];
|
||||
const power = size > 0 ? Math.floor(Math.log(size) / Math.log(1024)) : 0;
|
||||
const label = Math.round(size / Math.pow(1024, power) * 10) / 10 + ' ' + units[power]
|
||||
const label = `${Math.round((size / 1024 ** power) * 10) / 10} ${units[power]}`;
|
||||
return <span>{label}</span>;
|
||||
}
|
||||
};
|
||||
|
||||
export default FileSize;
|
||||
export default FileSize;
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
import React from 'react';
|
||||
import { MultiLang } from '../../../../config';
|
||||
import type { MultiLang } from '../../../../config';
|
||||
|
||||
interface Props {
|
||||
lang: MultiLang;
|
||||
@@ -12,7 +11,7 @@ const FreeKeyword = (props: Props) => {
|
||||
return null;
|
||||
}
|
||||
const label = keyword.join(', ');
|
||||
return (<span>{label}</span>);
|
||||
}
|
||||
return <span>{label}</span>;
|
||||
};
|
||||
|
||||
export default FreeKeyword;
|
||||
export default FreeKeyword;
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
import React from 'react';
|
||||
import { MultiLang } from '../../../../config';
|
||||
import type { MultiLang } from '../../../../config';
|
||||
import Functions from '../../../../functions';
|
||||
import { ItemBasicFile } from '../../../lib/ItemUtil';
|
||||
import type { ItemBasicFile } from '../../../lib/ItemUtil';
|
||||
import DateTime from './DateTime';
|
||||
import FileDownloadButton from './FileDownloadButton';
|
||||
import FileSize from './FileSize';
|
||||
@@ -34,17 +33,47 @@ const ItemFile = (props: Props) => {
|
||||
const timestamp = Math.floor(date.valueOf() / 1000);
|
||||
return (
|
||||
<div>
|
||||
{data.original_file_name}<br />
|
||||
{data.original_file_name}
|
||||
<br />
|
||||
<table>
|
||||
<tbody>
|
||||
<tr><td>Type</td><td>: {data.mime_type}</td><td rowSpan={4}>{downloadLimit === 0 && <FileDownloadButton lang={lang} file={data} rights={rights} useCc={useCc} ccCommercialUse={ccCommercialUse} ccModification={ccModification} />}</td></tr>
|
||||
<tr><td>Size</td><td>: <FileSize lang={lang} size={data.file_size} /></td></tr>
|
||||
<tr><td>Last updated</td><td>: <DateTime lang={lang} date={timestamp} onlyDate={true} /></td></tr>
|
||||
<tr>
|
||||
<td>Type</td>
|
||||
<td>: {data.mime_type}</td>
|
||||
<td rowSpan={4}>
|
||||
{downloadLimit === 0 && (
|
||||
<FileDownloadButton
|
||||
lang={lang}
|
||||
file={data}
|
||||
rights={rights}
|
||||
useCc={useCc}
|
||||
ccCommercialUse={ccCommercialUse}
|
||||
ccModification={ccModification}
|
||||
/>
|
||||
)}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Size</td>
|
||||
<td>
|
||||
: <FileSize lang={lang} size={data.file_size} />
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Last updated</td>
|
||||
<td>
|
||||
: <DateTime lang={lang} date={timestamp} onlyDate={true} />
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
{downloadLimit === 1 && <><br />({Functions.mlang('[en]File has been removed[/en][ja]ファイルは削除されました[/ja]', lang)})</>}
|
||||
{downloadLimit === 1 && (
|
||||
<>
|
||||
<br />({Functions.mlang('[en]File has been removed[/en][ja]ファイルは削除されました[/ja]', lang)})
|
||||
</>
|
||||
)}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
export default ItemFile;
|
||||
export default ItemFile;
|
||||
|
||||
@@ -1,9 +1,8 @@
|
||||
import React from 'react';
|
||||
import { Link } from 'react-router-dom';
|
||||
import { MultiLang } from '../../../../config';
|
||||
import { Link } from 'react-router';
|
||||
import type { MultiLang } from '../../../../config';
|
||||
import Functions from '../../../../functions';
|
||||
import IndexUtil from '../../../lib/IndexUtil';
|
||||
import { ItemBasicIndex } from '../../../lib/ItemUtil';
|
||||
import type { ItemBasicIndex } from '../../../lib/ItemUtil';
|
||||
|
||||
interface Props {
|
||||
lang: MultiLang;
|
||||
@@ -18,9 +17,19 @@ const ItemIndex = (props: Props) => {
|
||||
const elements = index.map((value, idx) => {
|
||||
const evenodd = idx % 2 === 0 ? 'even' : 'odd';
|
||||
const url = IndexUtil.getUrl(value.index_id);
|
||||
return (<tr key={value.index_id}><td className={evenodd}><Link to={url}>{Functions.mlang(value.title, lang)}</Link></td></tr>);
|
||||
return (
|
||||
<tr key={value.index_id}>
|
||||
<td className={evenodd}>
|
||||
<Link to={url}>{Functions.mlang(value.title, lang)}</Link>
|
||||
</td>
|
||||
</tr>
|
||||
);
|
||||
});
|
||||
return (<table><tbody>{elements}</tbody></table>);
|
||||
}
|
||||
return (
|
||||
<table>
|
||||
<tbody>{elements}</tbody>
|
||||
</table>
|
||||
);
|
||||
};
|
||||
|
||||
export default ItemIndex;
|
||||
export default ItemIndex;
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
import React from 'react';
|
||||
import { ItemBasicLang } from '../../../lib/ItemUtil';
|
||||
import { MultiLang } from '../../../../config';
|
||||
import type { MultiLang } from '../../../../config';
|
||||
import Functions from '../../../../functions';
|
||||
import type { ItemBasicLang } from '../../../lib/ItemUtil';
|
||||
|
||||
interface Props {
|
||||
lang: MultiLang;
|
||||
@@ -25,11 +24,11 @@ const Language = (props: Props) => {
|
||||
por: '[en]Portuguese[/en][ja]ポルトガル語[/ja]',
|
||||
chi: '[en]Chinese[/en][ja]中国語[/ja]',
|
||||
kor: '[en]Korean[/en][ja]韓国語[/ja]',
|
||||
}
|
||||
};
|
||||
if (!(itemLang in langStr)) {
|
||||
return null;
|
||||
}
|
||||
return (<span>{Functions.mlang(langStr[itemLang], lang)}</span>);
|
||||
}
|
||||
return <span>{Functions.mlang(langStr[itemLang], lang)}</span>;
|
||||
};
|
||||
|
||||
export default Language;
|
||||
export default Language;
|
||||
|
||||
@@ -35,4 +35,4 @@
|
||||
|
||||
.download button {
|
||||
margin: 5px 5px 0;
|
||||
}
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user