From d2cb17038b8537a609be06be2ed7013dbe27117e Mon Sep 17 00:00:00 2001 From: Jules Laplace Date: Mon, 8 Mar 2021 22:11:55 +0100 Subject: beginning the BIG refactor. moving editor stuff into per-episode hierarchy --- animism-align/cli/app/sql/models/episode.py | 2 + animism-align/cli/app/sql/models/paragraph.py | 2 + ...3082204_add_episode_project_field_everywhere.py | 31 ++ animism-align/frontend/app/actions.js | 6 +- animism-align/frontend/app/router.js | 31 +- animism-align/frontend/app/store.js | 11 +- .../frontend/app/views/align/align.actions.js | 136 --------- .../frontend/app/views/align/align.container.js | 27 -- animism-align/frontend/app/views/align/align.css | 160 ---------- .../frontend/app/views/align/align.reducer.js | 86 ------ .../components/annotations/annotation.form.css | 67 ---- .../components/annotations/annotation.form.js | 190 ------------ .../components/annotations/annotation.index.css | 125 -------- .../components/annotations/annotation.index.js | 125 -------- .../annotationForms/annotationForm.gallery.js | 132 -------- .../annotationForms/annotationForm.image.js | 120 -------- .../annotationForms/annotationForm.text.js | 153 ---------- .../annotationForms/annotationForm.utility.js | 172 ----------- .../annotationForms/annotationForm.video.js | 160 ---------- .../annotations/annotationForms/index.js | 46 --- .../annotationTypes/annotationTypes.gallery.js | 75 ----- .../annotationTypes/annotationTypes.image.js | 54 ---- .../annotationTypes/annotationTypes.text.js | 121 -------- .../annotationTypes/annotationTypes.utility.js | 107 ------- .../annotationTypes/annotationTypes.video.js | 51 ---- .../annotations/annotationTypes/index.js | 57 ---- .../components/player/playButton.component.js | 22 -- .../align/components/sidebar/script.component.js | 23 -- .../sidebar/tableOfContents.component.js | 30 -- .../align/components/timeline/cursor.component.js | 26 -- .../components/timeline/cursorRegion.component.js | 28 -- .../components/timeline/playCursor.component.js | 36 --- .../align/components/timeline/ticks.component.js | 88 ------ .../components/timeline/waveform.component.js | 105 ------- .../align/containers/annotations.container.js | 28 -- .../views/align/containers/sidebar.container.js | 35 --- .../views/align/containers/timeline.container.js | 196 ------------ .../app/views/annotation/annotation.reducer.js | 20 -- animism-align/frontend/app/views/auth/auth.gate.js | 1 - .../app/views/editor/align/align.actions.js | 136 +++++++++ .../app/views/editor/align/align.container.js | 27 ++ .../frontend/app/views/editor/align/align.css | 160 ++++++++++ .../app/views/editor/align/align.reducer.js | 97 ++++++ .../components/annotations/annotation.form.css | 67 ++++ .../components/annotations/annotation.form.js | 190 ++++++++++++ .../components/annotations/annotation.index.css | 125 ++++++++ .../components/annotations/annotation.index.js | 125 ++++++++ .../annotationForms/annotationForm.gallery.js | 132 ++++++++ .../annotationForms/annotationForm.image.js | 120 ++++++++ .../annotationForms/annotationForm.text.js | 153 ++++++++++ .../annotationForms/annotationForm.utility.js | 172 +++++++++++ .../annotationForms/annotationForm.video.js | 160 ++++++++++ .../annotations/annotationForms/index.js | 46 +++ .../annotationTypes/annotationTypes.gallery.js | 75 +++++ .../annotationTypes/annotationTypes.image.js | 54 ++++ .../annotationTypes/annotationTypes.text.js | 121 ++++++++ .../annotationTypes/annotationTypes.utility.js | 107 +++++++ .../annotationTypes/annotationTypes.video.js | 51 ++++ .../annotations/annotationTypes/index.js | 57 ++++ .../components/player/playButton.component.js | 22 ++ .../align/components/sidebar/script.component.js | 23 ++ .../sidebar/tableOfContents.component.js | 30 ++ .../align/components/timeline/cursor.component.js | 26 ++ .../components/timeline/cursorRegion.component.js | 28 ++ .../components/timeline/playCursor.component.js | 36 +++ .../align/components/timeline/ticks.component.js | 88 ++++++ .../components/timeline/waveform.component.js | 105 +++++++ .../align/containers/annotations.container.js | 28 ++ .../editor/align/containers/sidebar.container.js | 35 +++ .../editor/align/containers/timeline.container.js | 196 ++++++++++++ .../views/editor/annotation/annotation.reducer.js | 20 ++ .../frontend/app/views/editor/editor.container.js | 22 ++ .../frontend/app/views/editor/editor.gate.js | 32 ++ .../views/editor/media/components/media.form.js | 287 +++++++++++++++++ .../editor/media/components/media.formFile.js | 67 ++++ .../editor/media/components/media.formGallery.js | 338 +++++++++++++++++++++ .../media/components/media.formGalleryImage.js | 129 ++++++++ .../editor/media/components/media.formImage.js | 169 +++++++++++ .../media/components/media.formImageSelection.js | 213 +++++++++++++ .../editor/media/components/media.formVideo.js | 118 +++++++ .../editor/media/components/media.indexOptions.js | 59 ++++ .../views/editor/media/components/media.menu.js | 58 ++++ .../views/editor/media/containers/media.edit.js | 57 ++++ .../views/editor/media/containers/media.index.js | 160 ++++++++++ .../app/views/editor/media/containers/media.new.js | 81 +++++ .../app/views/editor/media/media.actions.js | 9 + .../app/views/editor/media/media.container.js | 38 +++ .../frontend/app/views/editor/media/media.css | 110 +++++++ .../app/views/editor/media/media.reducer.js | 22 ++ .../editor/paragraph/components/paragraph.form.js | 107 +++++++ .../editor/paragraph/components/paragraph.list.js | 103 +++++++ .../paragraph/components/paragraphTypes/index.js | 26 ++ .../paragraphTypes/paragraphTypes.image.js | 17 ++ .../paragraphTypes/paragraphTypes.text.js | 55 ++++ .../paragraphTypes/paragraphTypes.video.js | 16 + .../containers/paragraphEditor.container.js | 93 ++++++ .../views/editor/paragraph/paragraph.container.js | 66 ++++ .../app/views/editor/paragraph/paragraph.css | 126 ++++++++ .../views/editor/paragraph/paragraph.reducer.js | 28 ++ .../views/editor/paragraph/transcript.actions.js | 10 + animism-align/frontend/app/views/index.js | 9 - .../app/views/media/components/media.form.js | 287 ----------------- .../app/views/media/components/media.formFile.js | 67 ---- .../views/media/components/media.formGallery.js | 338 --------------------- .../media/components/media.formGalleryImage.js | 129 -------- .../app/views/media/components/media.formImage.js | 169 ----------- .../media/components/media.formImageSelection.js | 213 ------------- .../app/views/media/components/media.formVideo.js | 118 ------- .../views/media/components/media.indexOptions.js | 59 ---- .../app/views/media/components/media.menu.js | 58 ---- .../app/views/media/containers/media.edit.js | 57 ---- .../app/views/media/containers/media.index.js | 160 ---------- .../app/views/media/containers/media.new.js | 81 ----- .../frontend/app/views/media/media.actions.js | 9 - .../frontend/app/views/media/media.container.js | 38 --- animism-align/frontend/app/views/media/media.css | 110 ------- .../frontend/app/views/media/media.reducer.js | 22 -- .../frontend/app/views/nav/header.component.js | 46 +-- .../views/paragraph/components/paragraph.form.js | 107 ------- .../views/paragraph/components/paragraph.list.js | 103 ------- .../paragraph/components/paragraphTypes/index.js | 26 -- .../paragraphTypes/paragraphTypes.image.js | 17 -- .../paragraphTypes/paragraphTypes.text.js | 55 ---- .../paragraphTypes/paragraphTypes.video.js | 16 - .../containers/paragraphEditor.container.js | 93 ------ .../app/views/paragraph/paragraph.container.js | 66 ---- .../frontend/app/views/paragraph/paragraph.css | 126 -------- .../app/views/paragraph/paragraph.reducer.js | 28 -- .../app/views/paragraph/transcript.actions.js | 10 - .../app/views/project/components/project.form.js | 11 +- .../frontend/app/views/site/site.actions.js | 31 +- .../frontend/app/views/site/site.reducer.js | 12 - .../app/views/viewer/player/player.transcript.js | 2 +- .../viewer/transcript/transcript.container.js | 2 +- .../frontend/app/views/viewer/viewer.container.js | 2 +- animism-align/frontend/site/actions.js | 3 +- animism-align/frontend/site/store.js | 7 +- 137 files changed, 5545 insertions(+), 5455 deletions(-) create mode 100644 animism-align/cli/app/sql/versions/202103082204_add_episode_project_field_everywhere.py delete mode 100644 animism-align/frontend/app/views/align/align.actions.js delete mode 100644 animism-align/frontend/app/views/align/align.container.js delete mode 100644 animism-align/frontend/app/views/align/align.css delete mode 100644 animism-align/frontend/app/views/align/align.reducer.js delete mode 100644 animism-align/frontend/app/views/align/components/annotations/annotation.form.css delete mode 100644 animism-align/frontend/app/views/align/components/annotations/annotation.form.js delete mode 100644 animism-align/frontend/app/views/align/components/annotations/annotation.index.css delete mode 100644 animism-align/frontend/app/views/align/components/annotations/annotation.index.js delete mode 100644 animism-align/frontend/app/views/align/components/annotations/annotationForms/annotationForm.gallery.js delete mode 100644 animism-align/frontend/app/views/align/components/annotations/annotationForms/annotationForm.image.js delete mode 100644 animism-align/frontend/app/views/align/components/annotations/annotationForms/annotationForm.text.js delete mode 100644 animism-align/frontend/app/views/align/components/annotations/annotationForms/annotationForm.utility.js delete mode 100644 animism-align/frontend/app/views/align/components/annotations/annotationForms/annotationForm.video.js delete mode 100644 animism-align/frontend/app/views/align/components/annotations/annotationForms/index.js delete mode 100644 animism-align/frontend/app/views/align/components/annotations/annotationTypes/annotationTypes.gallery.js delete mode 100644 animism-align/frontend/app/views/align/components/annotations/annotationTypes/annotationTypes.image.js delete mode 100644 animism-align/frontend/app/views/align/components/annotations/annotationTypes/annotationTypes.text.js delete mode 100644 animism-align/frontend/app/views/align/components/annotations/annotationTypes/annotationTypes.utility.js delete mode 100644 animism-align/frontend/app/views/align/components/annotations/annotationTypes/annotationTypes.video.js delete mode 100644 animism-align/frontend/app/views/align/components/annotations/annotationTypes/index.js delete mode 100644 animism-align/frontend/app/views/align/components/player/playButton.component.js delete mode 100644 animism-align/frontend/app/views/align/components/sidebar/script.component.js delete mode 100644 animism-align/frontend/app/views/align/components/sidebar/tableOfContents.component.js delete mode 100644 animism-align/frontend/app/views/align/components/timeline/cursor.component.js delete mode 100644 animism-align/frontend/app/views/align/components/timeline/cursorRegion.component.js delete mode 100644 animism-align/frontend/app/views/align/components/timeline/playCursor.component.js delete mode 100644 animism-align/frontend/app/views/align/components/timeline/ticks.component.js delete mode 100644 animism-align/frontend/app/views/align/components/timeline/waveform.component.js delete mode 100644 animism-align/frontend/app/views/align/containers/annotations.container.js delete mode 100644 animism-align/frontend/app/views/align/containers/sidebar.container.js delete mode 100644 animism-align/frontend/app/views/align/containers/timeline.container.js delete mode 100644 animism-align/frontend/app/views/annotation/annotation.reducer.js create mode 100644 animism-align/frontend/app/views/editor/align/align.actions.js create mode 100644 animism-align/frontend/app/views/editor/align/align.container.js create mode 100644 animism-align/frontend/app/views/editor/align/align.css create mode 100644 animism-align/frontend/app/views/editor/align/align.reducer.js create mode 100644 animism-align/frontend/app/views/editor/align/components/annotations/annotation.form.css create mode 100644 animism-align/frontend/app/views/editor/align/components/annotations/annotation.form.js create mode 100644 animism-align/frontend/app/views/editor/align/components/annotations/annotation.index.css create mode 100644 animism-align/frontend/app/views/editor/align/components/annotations/annotation.index.js create mode 100644 animism-align/frontend/app/views/editor/align/components/annotations/annotationForms/annotationForm.gallery.js create mode 100644 animism-align/frontend/app/views/editor/align/components/annotations/annotationForms/annotationForm.image.js create mode 100644 animism-align/frontend/app/views/editor/align/components/annotations/annotationForms/annotationForm.text.js create mode 100644 animism-align/frontend/app/views/editor/align/components/annotations/annotationForms/annotationForm.utility.js create mode 100644 animism-align/frontend/app/views/editor/align/components/annotations/annotationForms/annotationForm.video.js create mode 100644 animism-align/frontend/app/views/editor/align/components/annotations/annotationForms/index.js create mode 100644 animism-align/frontend/app/views/editor/align/components/annotations/annotationTypes/annotationTypes.gallery.js create mode 100644 animism-align/frontend/app/views/editor/align/components/annotations/annotationTypes/annotationTypes.image.js create mode 100644 animism-align/frontend/app/views/editor/align/components/annotations/annotationTypes/annotationTypes.text.js create mode 100644 animism-align/frontend/app/views/editor/align/components/annotations/annotationTypes/annotationTypes.utility.js create mode 100644 animism-align/frontend/app/views/editor/align/components/annotations/annotationTypes/annotationTypes.video.js create mode 100644 animism-align/frontend/app/views/editor/align/components/annotations/annotationTypes/index.js create mode 100644 animism-align/frontend/app/views/editor/align/components/player/playButton.component.js create mode 100644 animism-align/frontend/app/views/editor/align/components/sidebar/script.component.js create mode 100644 animism-align/frontend/app/views/editor/align/components/sidebar/tableOfContents.component.js create mode 100644 animism-align/frontend/app/views/editor/align/components/timeline/cursor.component.js create mode 100644 animism-align/frontend/app/views/editor/align/components/timeline/cursorRegion.component.js create mode 100644 animism-align/frontend/app/views/editor/align/components/timeline/playCursor.component.js create mode 100644 animism-align/frontend/app/views/editor/align/components/timeline/ticks.component.js create mode 100644 animism-align/frontend/app/views/editor/align/components/timeline/waveform.component.js create mode 100644 animism-align/frontend/app/views/editor/align/containers/annotations.container.js create mode 100644 animism-align/frontend/app/views/editor/align/containers/sidebar.container.js create mode 100644 animism-align/frontend/app/views/editor/align/containers/timeline.container.js create mode 100644 animism-align/frontend/app/views/editor/annotation/annotation.reducer.js create mode 100644 animism-align/frontend/app/views/editor/editor.container.js create mode 100644 animism-align/frontend/app/views/editor/editor.gate.js create mode 100644 animism-align/frontend/app/views/editor/media/components/media.form.js create mode 100644 animism-align/frontend/app/views/editor/media/components/media.formFile.js create mode 100644 animism-align/frontend/app/views/editor/media/components/media.formGallery.js create mode 100644 animism-align/frontend/app/views/editor/media/components/media.formGalleryImage.js create mode 100644 animism-align/frontend/app/views/editor/media/components/media.formImage.js create mode 100644 animism-align/frontend/app/views/editor/media/components/media.formImageSelection.js create mode 100644 animism-align/frontend/app/views/editor/media/components/media.formVideo.js create mode 100644 animism-align/frontend/app/views/editor/media/components/media.indexOptions.js create mode 100644 animism-align/frontend/app/views/editor/media/components/media.menu.js create mode 100644 animism-align/frontend/app/views/editor/media/containers/media.edit.js create mode 100644 animism-align/frontend/app/views/editor/media/containers/media.index.js create mode 100644 animism-align/frontend/app/views/editor/media/containers/media.new.js create mode 100644 animism-align/frontend/app/views/editor/media/media.actions.js create mode 100644 animism-align/frontend/app/views/editor/media/media.container.js create mode 100644 animism-align/frontend/app/views/editor/media/media.css create mode 100644 animism-align/frontend/app/views/editor/media/media.reducer.js create mode 100644 animism-align/frontend/app/views/editor/paragraph/components/paragraph.form.js create mode 100644 animism-align/frontend/app/views/editor/paragraph/components/paragraph.list.js create mode 100644 animism-align/frontend/app/views/editor/paragraph/components/paragraphTypes/index.js create mode 100644 animism-align/frontend/app/views/editor/paragraph/components/paragraphTypes/paragraphTypes.image.js create mode 100644 animism-align/frontend/app/views/editor/paragraph/components/paragraphTypes/paragraphTypes.text.js create mode 100644 animism-align/frontend/app/views/editor/paragraph/components/paragraphTypes/paragraphTypes.video.js create mode 100644 animism-align/frontend/app/views/editor/paragraph/containers/paragraphEditor.container.js create mode 100644 animism-align/frontend/app/views/editor/paragraph/paragraph.container.js create mode 100644 animism-align/frontend/app/views/editor/paragraph/paragraph.css create mode 100644 animism-align/frontend/app/views/editor/paragraph/paragraph.reducer.js create mode 100644 animism-align/frontend/app/views/editor/paragraph/transcript.actions.js delete mode 100644 animism-align/frontend/app/views/index.js delete mode 100644 animism-align/frontend/app/views/media/components/media.form.js delete mode 100644 animism-align/frontend/app/views/media/components/media.formFile.js delete mode 100644 animism-align/frontend/app/views/media/components/media.formGallery.js delete mode 100644 animism-align/frontend/app/views/media/components/media.formGalleryImage.js delete mode 100644 animism-align/frontend/app/views/media/components/media.formImage.js delete mode 100644 animism-align/frontend/app/views/media/components/media.formImageSelection.js delete mode 100644 animism-align/frontend/app/views/media/components/media.formVideo.js delete mode 100644 animism-align/frontend/app/views/media/components/media.indexOptions.js delete mode 100644 animism-align/frontend/app/views/media/components/media.menu.js delete mode 100644 animism-align/frontend/app/views/media/containers/media.edit.js delete mode 100644 animism-align/frontend/app/views/media/containers/media.index.js delete mode 100644 animism-align/frontend/app/views/media/containers/media.new.js delete mode 100644 animism-align/frontend/app/views/media/media.actions.js delete mode 100644 animism-align/frontend/app/views/media/media.container.js delete mode 100644 animism-align/frontend/app/views/media/media.css delete mode 100644 animism-align/frontend/app/views/media/media.reducer.js delete mode 100644 animism-align/frontend/app/views/paragraph/components/paragraph.form.js delete mode 100644 animism-align/frontend/app/views/paragraph/components/paragraph.list.js delete mode 100644 animism-align/frontend/app/views/paragraph/components/paragraphTypes/index.js delete mode 100644 animism-align/frontend/app/views/paragraph/components/paragraphTypes/paragraphTypes.image.js delete mode 100644 animism-align/frontend/app/views/paragraph/components/paragraphTypes/paragraphTypes.text.js delete mode 100644 animism-align/frontend/app/views/paragraph/components/paragraphTypes/paragraphTypes.video.js delete mode 100644 animism-align/frontend/app/views/paragraph/containers/paragraphEditor.container.js delete mode 100644 animism-align/frontend/app/views/paragraph/paragraph.container.js delete mode 100644 animism-align/frontend/app/views/paragraph/paragraph.css delete mode 100644 animism-align/frontend/app/views/paragraph/paragraph.reducer.js delete mode 100644 animism-align/frontend/app/views/paragraph/transcript.actions.js diff --git a/animism-align/cli/app/sql/models/episode.py b/animism-align/cli/app/sql/models/episode.py index 916c5dc..13b12c8 100644 --- a/animism-align/cli/app/sql/models/episode.py +++ b/animism-align/cli/app/sql/models/episode.py @@ -12,6 +12,7 @@ class Episode(Base): """Table for storing episodes and their metadata""" __tablename__ = 'episode' id = Column(Integer, primary_key=True) + project_id = Column(Integer) episode_number = Column(Integer) title = Column(String(256, convert_unicode=True), nullable=False) release_date = Column(String(256, convert_unicode=True)) @@ -22,6 +23,7 @@ class Episode(Base): def toJSON(self): return { 'id': self.id, + 'project_id': self.project_id, 'episode_number': self.episode_number, 'title': self.title, 'release_date': self.release_date, diff --git a/animism-align/cli/app/sql/models/paragraph.py b/animism-align/cli/app/sql/models/paragraph.py index 5623db0..ee4aa5b 100644 --- a/animism-align/cli/app/sql/models/paragraph.py +++ b/animism-align/cli/app/sql/models/paragraph.py @@ -13,6 +13,7 @@ class Paragraph(Base): """Table for storing paragraphs, which contain annotations""" __tablename__ = 'paragraph' id = Column(Integer, primary_key=True) + episode_id = Column(Integer) type = Column(String(16, convert_unicode=True), nullable=False) start_ts = Column(Float, nullable=False) end_ts = Column(Float, nullable=True) @@ -21,6 +22,7 @@ class Paragraph(Base): def toJSON(self): return { 'id': self.id, + 'episode_id': self.episode_id, 'type': self.type, 'start_ts': self.start_ts, 'end_ts': self.end_ts, diff --git a/animism-align/cli/app/sql/versions/202103082204_add_episode_project_field_everywhere.py b/animism-align/cli/app/sql/versions/202103082204_add_episode_project_field_everywhere.py new file mode 100644 index 0000000..ea672fd --- /dev/null +++ b/animism-align/cli/app/sql/versions/202103082204_add_episode_project_field_everywhere.py @@ -0,0 +1,31 @@ +"""add episode/project field everywhere + +Revision ID: 639488f6e800 +Revises: 0664d913e352 +Create Date: 2021-03-08 22:04:58.133358 + +""" +from alembic import op +import sqlalchemy as sa +import sqlalchemy_utc + + +# revision identifiers, used by Alembic. +revision = '639488f6e800' +down_revision = '0664d913e352' +branch_labels = None +depends_on = None + + +def upgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.add_column('episode', sa.Column('project_id', sa.Integer(), nullable=True)) + op.add_column('paragraph', sa.Column('episode_id', sa.Integer(), nullable=True)) + # ### end Alembic commands ### + + +def downgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.drop_column('paragraph', 'episode_id') + op.drop_column('episode', 'project_id') + # ### end Alembic commands ### diff --git a/animism-align/frontend/app/actions.js b/animism-align/frontend/app/actions.js index 4b75fce..4a2aaed 100644 --- a/animism-align/frontend/app/actions.js +++ b/animism-align/frontend/app/actions.js @@ -1,10 +1,12 @@ import { bindActionCreators } from 'redux' import { crud_actions } from 'app/api/crud.actions' +import * as transcriptActions from 'app/views/editor/paragraph/transcript.actions' +import * as alignActions from 'app/views/editor/align/align.actions' + import * as viewerActions from 'app/views/viewer/viewer.actions' -import * as transcriptActions from 'app/views/paragraph/transcript.actions' + import * as audioActions from 'app/views/audio/audio.actions' -import * as alignActions from 'app/views/align/align.actions' import * as siteActions from 'app/views/site/site.actions' import * as authActions from 'app/views/auth/auth.actions' diff --git a/animism-align/frontend/app/router.js b/animism-align/frontend/app/router.js index e4ea05e..df4d647 100644 --- a/animism-align/frontend/app/router.js +++ b/animism-align/frontend/app/router.js @@ -4,16 +4,13 @@ import { Route } from 'react-router' import AuthGate from 'app/views/auth/auth.gate' import Header from 'app/views/nav/header.component' -import * as views from 'app/views' -const viewList = Object.keys(views).map(name => { - const view = views[name] - let path, exact = false - path = '/' + name - return ( - - ) -}) +import ProjectContainer from 'app/views/project/project.container' +import EpisodeContainer from 'app/views/episode/episode.container' +import VenueContainer from 'app/views/venue/venue.container' +import UploadContainer from 'app/views/upload/upload.container' +import UserContainer from 'app/views/user/user.container' +import EditorContainer from 'app/views/editor/editor.container' export default class Router extends Component { render() { @@ -22,15 +19,19 @@ export default class Router extends Component {
- {viewList} - { - // redirect to index!! - setTimeout(() => this.props.history.push('/align'), 10) - return null - }} /> + + + + + +
) } } + +/* + +*/ diff --git a/animism-align/frontend/app/store.js b/animism-align/frontend/app/store.js index 980437a..d1e10f0 100644 --- a/animism-align/frontend/app/store.js +++ b/animism-align/frontend/app/store.js @@ -1,14 +1,11 @@ import { applyMiddleware, compose, combineReducers, createStore } from 'redux' import { connectRouter, routerMiddleware } from 'connected-react-router' import { createBrowserHistory } from 'history' -// import createDebounce from 'redux-debounced' import thunk from 'redux-thunk' // cms import uploadReducer from 'app/views/upload/upload.reducer' -import annotationReducer from 'app/views/annotation/annotation.reducer' import siteReducer from 'app/views/site/site.reducer' -import mediaReducer from 'app/views/media/media.reducer' import episodeReducer from 'app/views/episode/episode.reducer' import projectReducer from 'app/views/project/project.reducer' import venueReducer from 'app/views/venue/venue.reducer' @@ -16,12 +13,14 @@ import authReducer from 'app/views/auth/auth.reducer' import userReducer from 'app/views/user/user.reducer' // editor -import alignReducer from 'app/views/align/align.reducer' -import paragraphReducer from 'app/views/paragraph/paragraph.reducer' +import mediaReducer from 'app/views/editor/media/media.reducer' +import annotationReducer from 'app/views/editor/annotation/annotation.reducer' +import alignReducer from 'app/views/editor/align/align.reducer' +import paragraphReducer from 'app/views/editor/paragraph/paragraph.reducer' // viewer -import audioReducer from 'app/views/audio/audio.reducer' import viewerReducer from 'app/views/viewer/viewer.reducer' +import audioReducer from 'app/views/audio/audio.reducer' const createRootReducer = history => ( combineReducers({ diff --git a/animism-align/frontend/app/views/align/align.actions.js b/animism-align/frontend/app/views/align/align.actions.js deleted file mode 100644 index 1583e4e..0000000 --- a/animism-align/frontend/app/views/align/align.actions.js +++ /dev/null @@ -1,136 +0,0 @@ -import * as types from 'app/types' -import { store } from 'app/store' -import actions from 'app/actions' -// import { session } from 'app/session' -import throttle from 'lodash.throttle' -import debounce from 'lodash.debounce' - -import { ZOOM_STEPS } from 'app/constants' -import { timestampToSeconds, post } from 'app/utils' -import { cutFirstSentence } from 'app/utils/align.utils' -import { annotationFadeTimings } from 'app/utils/annotation.utils' - -export const setScrollPosition = start_ts => dispatch => ( - dispatch({ type: types.align.set_display_setting, key: 'start_ts', value: start_ts }) -) - -export const setZoom = zoom => dispatch => { - if (0 <= zoom && zoom < ZOOM_STEPS.length) { - dispatch({ type: types.align.set_display_setting, key: 'zoom', value: zoom }) - } -} -export const throttledSetZoom = throttle(zoom => dispatch => { - setZoom(zoom)(dispatch) -}, 250, { leading: true }) - -export const setCursor = cursor_ts => dispatch => ( - dispatch({ type: types.align.set_display_setting, key: 'cursor_ts', value: cursor_ts }) -) -export const setCursorRegion = (a_ts, b_ts) => dispatch => ( - dispatch({ type: types.align.set_display_setting, key: 'cursor_region', value: { a_ts, b_ts } }) -) -export const clearCursorRegion = () => dispatch => ( - dispatch({ type: types.align.set_display_setting, key: 'cursor_region', value: null }) -) - -export const setSelectedAnnotation = annotation => dispatch => { - debouncedUpdateAnnotation.flush() - dispatch({ type: types.align.set_selected_annotation, data: annotation }) -} -export const clearSelectedAnnotation = () => dispatch => { - debouncedUpdateAnnotation.flush() - dispatch({ type: types.align.clear_selected_annotation }) -} -export const updateSelectedAnnotation = annotation => dispatch => { - debouncedUpdateAnnotation(annotation) - dispatch({ type: types.align.set_selected_annotation, data: { ...annotation } }) -} -export const debouncedUpdateAnnotation = debounce(annotation => { - console.log('updating annotation', annotation) - actions.annotation.update(annotation) -}, 2000, { leading: false, trailing: true }) - -export const cloneSelectedAnnotation = annotation => dispatch => { - const newAnnotation = { ...annotation } - delete newAnnotation.id - if (annotation.settings.fullscreen) { - const { - fadeInDuration, fadeOutDuration, duration, - start_ts, end_ts, fade_in_end_ts, fade_out_start_ts, - } = annotationFadeTimings(annotation) - newAnnotation.start_ts += duration - fadeOutDuration - fadeInDuration - } else { - newAnnotation.start_ts += 1 - } - actions.annotation.create(newAnnotation) - .then(res => { - console.log('cloned annotation', res.res) - setSelectedParagraph(res.res) - }) -} - -export const setSelectedParagraph = paragraph_id => dispatch => { - dispatch({ type: types.align.set_display_setting, key: 'selected_paragraph_id', value: paragraph_id }) -} -export const clearSelectedParagraph = () => dispatch => { - dispatch({ type: types.align.set_display_setting, key: 'selected_paragraph_id', value: -1 }) -} - -export const showNewAnnotationForm = (start_ts, text) => dispatch => { - let croppedText; - if (store.getState().align.annotation.start_ts) { - croppedText = store.getState().align.annotation.text - } else { - croppedText = cutFirstSentence(text) - } - // console.log(croppedText) - dispatch({ - type: types.align.set_temporary_annotation, - data: { - id: 'new', - start_ts, - end_ts: 0.0, - text: croppedText, - type: 'sentence', - settings: {}, - } - }) -} -export const showEditAnnotationForm = (annotation) => dispatch => { - dispatch({ - type: types.align.set_temporary_annotation, - data: annotation, - }) -} - -export const updateAnnotationForm = (key, value) => dispatch => { - dispatch({ type: types.align.update_temporary_annotation, key, value }) -} -export const updateAnnotationSettings = (key, value) => dispatch => { - dispatch({ type: types.align.update_temporary_annotation_settings, key, value }) -} - -export const hideAnnotationForm = () => dispatch => { - dispatch({ - type: types.align.set_temporary_annotation, - data: {} - }) -} - - -export const spliceTime = start_ts => dispatch => { - let duration = timestampToSeconds(prompt("How many seconds to add or remove? Enter a positive / negative number")) - if (!duration) { - return - } - console.log(start_ts, duration) - const data = { - start_ts, duration, - } - post(dispatch, types.api, 'splice', '/api/v1/annotation/splice', data) - .then(res => { - console.log(res) - alert(res.count + ' records updated!') - actions.annotation.index() - }) -} \ No newline at end of file diff --git a/animism-align/frontend/app/views/align/align.container.js b/animism-align/frontend/app/views/align/align.container.js deleted file mode 100644 index 168feb8..0000000 --- a/animism-align/frontend/app/views/align/align.container.js +++ /dev/null @@ -1,27 +0,0 @@ -import React, { Component } from 'react' - -import './align.css' -import './components/annotations/annotation.form.css' -import './components/annotations/annotation.index.css' - -import Timeline from 'app/views/align/containers/timeline.container.js' -import Sidebar from 'app/views/align/containers/sidebar.container.js' - -class Container extends Component { - componentDidMount() { - document.body.scrollTo(0, 0) - document.body.parentNode.scrollTo(0, 0) - } - render() { - return ( -
-
- -
- -
- ) - } -} - -export default Container diff --git a/animism-align/frontend/app/views/align/align.css b/animism-align/frontend/app/views/align/align.css deleted file mode 100644 index d10b601..0000000 --- a/animism-align/frontend/app/views/align/align.css +++ /dev/null @@ -1,160 +0,0 @@ -* { - -} -.body.loading > div { - padding: 1rem; -} -.body { - width: 100%; - height: 100%; - display: flex; - flex-direction: row; - justify-content: space-between; - background: linear-gradient( - 0deg, - rgba(0, 0, 64, 0.5), - rgba(64, 64, 128, 0.5) - ); - padding: 0; -} - -.body.alignmentEditor { - height: calc(100% - 3rem); -} - -/* Timeline */ - -canvas { - display: block; -} -.timeline { - display: flex; - flex-direction: row; - position: relative; - width: 300px; - cursor: crosshair; -} -.timelineColumn { - position: relative; -} -.ticks .tick { - position: absolute; - right: 0; - width: 4px; - height: 1px; - background: #ddd; - pointer-events: none; -} -.ticks .tickLabel { - pointer-events: none; - position: absolute; - right: 6px; - font-size: 12px; - width: 40px; - margin-top: -7px; - text-align: right; - text-shadow: 0 0 2px #00f; -} -.timeline .cursor { - width: 100%; - position: absolute; - left: 0; - pointer-events: none; -} -.timeline .cursor .line { - width: 100%; - height: 1px; - background: #00f; -} -.timeline .cursor.playCursor .line { - background: #ddd; -} -.timeline .cursor .tickLabel { - position: absolute; - pointer-events: none; - right: 6px; - font-size: 12px; - width: 40px; - margin-top: -7px; - text-align: right; - text-shadow: 0 0 2px #000, 0 0 2px #000, 0 0 2px #000; - user-select: none; -} -.timeline .cursor_region { - position: absolute; - left: 0; - width: 100%; - border-top: 1px solid #33f; - border-bottom: 1px solid #33f; - background: rgba(32,64,255,0.2); -} -.timeline .cursor_region .tickLabel { - position: absolute; - top: 2px; - left: 6px; - user-select: none; -} - -/* Audio player */ - -.playButton { - /*position: absolute;*/ - /*top: 0; left: 0;*/ - width: 3rem; height: 3rem; - padding: 1rem; - background: transparent; - cursor: pointer; - background-size: contain; - background-repeat: no-repeat; - background-position: center; -} -.playButton.playing { - background-image: url('/static/img/icons_pause_white.svg'); -} -.playButton.paused { - background-image: url('/static/img/icons_play_white.svg'); -} - -/* Script */ - -.sidebar { - position: absolute; - top: 0; - right: 0; - min-width: 4rem; - z-index: 8; -} -.sidebar textarea { - height: calc(100vh - 3.15rem); -} -.sidebar button { - position: absolute; - top: 0.25rem; - right: 0.25rem; - z-index: 9; - border: 0; - background: transparent; -} - -/* Annotations */ - -.annotations { - position: relative; - width: 450px; -} - -/* table of contents */ - -.toc { - background: #222; - width: 15rem; - padding: 0.5rem 0; -} -.toc div { - width: 15rem; - padding: 0.25rem 0.75rem; - cursor: pointer; -} -.toc div:hover { - background: #213; -} \ No newline at end of file diff --git a/animism-align/frontend/app/views/align/align.reducer.js b/animism-align/frontend/app/views/align/align.reducer.js deleted file mode 100644 index 8a660c0..0000000 --- a/animism-align/frontend/app/views/align/align.reducer.js +++ /dev/null @@ -1,86 +0,0 @@ -import * as types from 'app/types' -// import { session, getDefault, getDefaultInt } from 'app/session' - -const initialState = { - timeline: { - cursor_ts: -1, - cursor_region: null, - start_ts: 0, - zoom: 1, - duration: 0, - selected_annotation_id: -1, - selected_paragraph_id: -1, - }, - annotation: {}, - selectedAnnotation: {}, - options: { - } -} - -export default function alignReducer(state = initialState, action) { - // console.log(action.type, action) - switch (action.type) { - case types.peaks.loaded: - // console.log('peaks duration:', action.data.length / 10) - return state - - case types.align.set_display_setting: - return { - ...state, - timeline: { - ...state.timeline, - [action.key]: action.value, - } - } - - case types.align.set_selected_annotation: - return { - ...state, - timeline: { - ...state.timeline, - selected_annotation_id: action.data.id, - }, - selectedAnnotation: action.data, - } - - case types.align.clear_selected_annotation: - return { - ...state, - timeline: { - ...state.timeline, - selected_annotation_id: -1, - }, - selectedAnnotation: {}, - } - - case types.align.set_temporary_annotation: - return { - ...state, - annotation: action.data, - } - - case types.align.update_temporary_annotation: - return { - ...state, - annotation: { - ...state.annotation, - [action.key]: action.value, - } - } - - case types.align.update_temporary_annotation_settings: - return { - ...state, - annotation: { - ...state.annotation, - settings: { - ...state.annotation.settings, - [action.key]: action.value, - } - } - } - - default: - return state - } -} diff --git a/animism-align/frontend/app/views/align/components/annotations/annotation.form.css b/animism-align/frontend/app/views/align/components/annotations/annotation.form.css deleted file mode 100644 index fa663c7..0000000 --- a/animism-align/frontend/app/views/align/components/annotations/annotation.form.css +++ /dev/null @@ -1,67 +0,0 @@ -/* Annotation form */ - -.annotationForm { - width: 401px; - padding: 0.5rem; - position: absolute; - left: 0.25rem; - background: #448; - box-shadow: 0 0 2px #000, 0 0 4px #000; - z-index: 10; -} -.annotationForm textarea { - width: 100%; -} -.annotationForm .row { - justify-content: space-between; - align-items: center; -} -.annotationForm .row > div { - display: flex; - align-items: center; -} -.annotationForm .buttons { - margin-bottom: 0.5rem; -} -.annotationForm .ts { - color: #fff; -} -.annotationForm .select.media_id { - width: 100%; - margin-right: 0; -} -.annotationForm div.textarea { - margin-bottom: 0.5rem; -} -.annotationForm img { - max-width: 100%; - max-height: 6rem; -} - -.annotationForm .options label span:first-child { - display: inline-block; - width: 6rem; -} -.annotationForm .options .description { - font-size: 0.75rem; - margin-top: 0.25rem; - margin-bottom: 0.5rem; -} -.annotationForm .color input[type="text"].number { - width: 8rem; -} -.annotationForm .color input[type="text"] { - width: 8rem; -} -.annotationForm .color input[type="color"] { - background: transparent; - border: 0; - height: 1.7rem; - padding: 0; - margin: 0 0.5rem 0 0; - width: 1.4rem; -} -.annotationForm .checkbox { - margin-top: 0.5rem; - margin-bottom: 0.5rem; -} \ No newline at end of file diff --git a/animism-align/frontend/app/views/align/components/annotations/annotation.form.js b/animism-align/frontend/app/views/align/components/annotations/annotation.form.js deleted file mode 100644 index 7b1918a..0000000 --- a/animism-align/frontend/app/views/align/components/annotations/annotation.form.js +++ /dev/null @@ -1,190 +0,0 @@ -import React, { Component } from 'react' -// import { Link } from 'react-router-dom' -import { bindActionCreators } from 'redux' -import { connect } from 'react-redux' - -import actions from 'app/actions' - -import { ANNOTATION_SELECT_OPTIONS, MEDIA_ANNOTATION_TYPES } from 'app/constants' -import { timestamp } from 'app/utils' -import { timeToPosition } from 'app/utils/align.utils' -import { Select } from 'app/common' - -import { annotationFormLookup } from './annotationForms' - -const annotationTextTypes = new Set([ - 'sentence', 'section_heading', 'heading_text', 'pullquote_credit', 'footnote', 'text_plate', -]) - -class AnnotationForm extends Component { - constructor(props){ - super(props) - this.handleChange = this.handleChange.bind(this) - this.handleSelect = this.handleSelect.bind(this) - this.handleSettingsChange = this.handleSettingsChange.bind(this) - this.handleSettingsSelect = this.handleSettingsSelect.bind(this) - this.handleKeyDown = this.handleKeyDown.bind(this) - this.handleSubmit = this.handleSubmit.bind(this) - this.handleDestroy = this.handleDestroy.bind(this) - this.textareaRef = React.createRef() - } - componentDidMount() { - if (this.textareaRef && this.textareaRef.current) { - this.textareaRef.current.focus() - } - } - handleKeyDown(e) { - if (e.keyCode === 27) { // escape - actions.align.hideAnnotationForm() - return - } - // console.log(e.keyCode) - if (!e.metaKey && !e.ctrlKey) return - let { start_ts } = this.props.annotation - switch (e.keyCode) { - case 38: // up - e.preventDefault() - start_ts -= 0.1 - actions.align.updateAnnotationForm('start_ts', Math.max(0, start_ts)) - actions.audio.seek(start_ts) - actions.align.setCursor(start_ts) - break - case 40: // down - e.preventDefault() - start_ts += 0.1 - actions.align.updateAnnotationForm('start_ts', Math.max(0, start_ts)) - actions.audio.seek(start_ts) - actions.align.setCursor(start_ts) - break - case 83: // ctrl-S - e.preventDefault() - this.handleSubmit() - default: - break - } - } - handleChange(e) { - const { name, value } = e.target - this.handleSelect(name, value) - } - handleSelect(name, value) { - actions.align.updateAnnotationForm(name, value) - } - handleSettingsChange(e) { - const { name, value } = e.target - this.handleSettingsSelect(name, value) - } - handleSettingsSelect(name, value) { - if (name.indexOf('_id') !== -1) value = parseInt(value) || 0 - actions.align.updateAnnotationSettings(name, value) - } - handleSubmit() { - const { annotation } = this.props - if (annotation.type === 'paragraph_end') { - annotation.text = '' - } - if (annotation.type in MEDIA_ANNOTATION_TYPES) { - if (!annotation.settings.media_id) return - annotation.text = '' - } - if (annotation.id === 'new') { - delete annotation.id - actions.annotation.create(annotation) - .then(response => { - console.log(response) - actions.align.hideAnnotationForm() - }) - } else { - actions.annotation.update(annotation) - .then(response => { - console.log(response) - actions.align.hideAnnotationForm() - }) - } - } - handleDestroy() { - const { annotation } = this.props - if (annotation.id === 'new') { - actions.align.hideAnnotationForm() - } else { - actions.annotation.destroy(annotation) - .then(response => { - console.log(response) - actions.align.hideAnnotationForm() - }) - } - } - render() { - const { timeline, annotation } = this.props - return ( -
- {this.renderButtons()} - {annotationTextTypes.has(annotation.type) && this.renderTextarea()} - {(annotation.type in annotationFormLookup) && this.renderElementForm()} -
- ) - } - renderButtons() { - const { annotation } = this.props - return ( -
-
-