Mirador3プラグイン開発: ウインドウをコピーする
概要
Mirador3のプラグインとして、ウインドウをコピーするプラグインを作成しました。
なお本機能は以下のプラグインですでに提供されているものです。
そのため、本プラグインはプラグインの開発手順を学ぶために作成しています。そのような観点で、本プラグインが参考になりましたら幸いです。
画面例は以下です。
ソースコードは以下です。
デモサイトは以下です。
開発メモ
本プラグインの開発にあたり、まず以下のリポジトリをcloneし、変更を加えていきました。
src/index.js
まず以下のファイルについて、miradorDownload
をMiradorCopyWindow
に書き換えました。
src/MiradorCopyWindow.js
以下のファイルが主に編集するファイルです。
本ファイルは、まず以下のファイルの内容をコピーしました。
まず末尾の以下の記述から説明します。
export default {
target: 'WindowTopMenu',
mode: 'add',
component: CopyWindowComponent,
mapDispatchToProps: mapDispatchToProps,
mapStateToProps: mapStateToProps,
}
target
とmode
target
はコンポーネントを設置する場所を指定します。またmode
はコンポーネントの追加方法を指定します。mode
については、add
やwrap
という選択肢があるようでした。
以下、target
の値の例です。
- WindowTopMenu
各ウインドウ上部のメニューの部分です。
- WorkspaceControlPanelButtons
ワークスペースのパネル部分です。
- AnnotationSettings
アノテーションの設定画面です。
最後のAnnotationSettings
およびmode
にwrap
が指定されているプラグインとして、以下のMiradorのアノテーション付与モジュールがありました。
mapDispatchToProps
とmapStateToProps
これがはじめ理解しづらかった(そしてまだ適切に説明できるほど理解できていない)のですが、props
に渡すdispath
とstate
を定めた変数を指定します。
dispatch
については、以下の変数を与えてます。
const mapDispatchToProps = (dispatch, { windowId }) => ({
copyWindow: () => dispatch(copyWindowAction(windowId)),
});
copyWindowAction
の具体的な内容は以下です。既存のwindowを取得して(1)、不要な変数を削除した上でwindowをコピーして(2)、それをaddWindow(3)しています。
const copyWindowAction = (windowId) => (dispatch, getState) => {
const window = getState().windows[windowId]; // 1
const cleanedWindow = omit(window, [
'id',
'companionWindowIds',
'thumbnailNavigationId',
]); // 2
dispatch(mirador.actions.addWindow(cleanedWindow)); // 3
};
state
については、以下の変数を与えています。以下の例は少し特殊で、state
をすべてprops
に渡す設定となっています。他のプラグインでは、必要な値のみをstate
から抽出して、props
に渡しているようでした。
const mapStateToProps = (state) => ({
state: state,
});
実際、本プラグインでは、mapStateToProps
でprops
に渡された値は使用されていないため、この記述はなくてもよいはずです。そのため、以下でもmapStateToProps
の記述は省略しています。
component
最後にcomponent
です。以下のように、コンポーネントで表示する内容を記述しています。
class CopyWindowComponent extends Component {
render() {
const { copyWindow } = this.props; // 1
return (
<MenuItem onClick={() => copyWindow()}>
<ListItemIcon>
<OpenInNewIcon />
</ListItemIcon>
<ListItemText primaryTypographyProps={{ variant: 'body1' }}>
Copy Window
</ListItemText>
</MenuItem>
);
}
}
上記の(1)でコメントした部分は、先にmapDispatchToProps
でprops
に与えたdispatch
を使用しています。メニューをクリックしたら、dispatch
であるcopyWindow
が実行されます。
合わせて、以下の部分で、copyWindow
の型を与えています。mapDispatchToProps
やmapStateToProps
でprops
に渡した変数の方を定義するようです。
CopyWindowComponent.propTypes = {
copyWindow: PropTypes.func,
};
CopyWindowComponent.defaultProps = {
copyWindow: () => { },
};
まとめ
間違っている部分があるかもしれませんが、Mirador3のプラグイン開発に関するメモを紹介しました。引き続き、他のプラグイン開発を通じて、メモを共有したいと思います。
他の方の参考になりましたら幸いです。
Discussion