├── app ├── utils │ ├── .gitkeep │ ├── rendererUtils.js │ ├── data.js │ └── bootstrap.js ├── variables.scss ├── app.icns ├── assets │ └── logo.png ├── components │ ├── Home.css │ ├── Home.js │ ├── Counter.css │ ├── Counter.js │ └── ItemList.jsx ├── managers │ └── screenManager.js ├── pages │ ├── settings │ │ ├── CountdownPage.jsx │ │ ├── LanguagePage.jsx │ │ ├── MigrationsPage.jsx │ │ ├── BibleTranslationsPage.jsx │ │ └── ProjectorsPage.jsx │ ├── elements │ │ ├── AnnouncementsPage.jsx │ │ ├── PresentationsPage.jsx │ │ ├── ScripturePage.jsx │ │ ├── media │ │ │ ├── MediaPage.jsx │ │ │ ├── MediaPickerDialog.jsx │ │ │ └── MediaComponent.jsx │ │ ├── background │ │ │ ├── BackgroundsPage.jsx │ │ │ ├── BackgroundsPickerDialog.jsx │ │ │ └── BackgroundsComponent.jsx │ │ └── songs │ │ │ ├── SongsPage.jsx │ │ │ └── SongsPageComponent.jsx │ ├── NewsPage.jsx │ ├── live │ │ └── LivePage.jsx │ └── productions │ │ ├── ProductionPage.jsx │ │ └── ProductionPageComponent.jsx ├── layout │ ├── Root.jsx │ ├── SettingsLayout.jsx │ ├── DashboardLayout.jsx │ └── ElementsLayout.jsx ├── index.jsx ├── data │ └── stores │ │ ├── AppStore.js │ │ ├── localdb.js │ │ ├── ScreenStore.js │ │ ├── ElementStore.js │ │ └── ProductionStore.js ├── app.global.scss ├── app.html ├── main.dev.js ├── menu.js └── projector │ └── projector.html ├── .npmrc ├── internals ├── mocks │ └── fileMock.js ├── flow │ ├── WebpackAsset.js.flow │ └── CSSModule.js.flow ├── img │ ├── js.png │ ├── npm.png │ ├── flow.png │ ├── jest.png │ ├── mobx.png │ ├── react.png │ ├── redux.png │ ├── yarn.png │ ├── eslint.png │ ├── webpack.png │ ├── js-padded.png │ ├── eslint-padded.png │ ├── flow-padded.png │ ├── jest-padded.png │ ├── react-padded.png │ ├── react-router.png │ ├── redux-padded.png │ ├── yarn-padded.png │ ├── flow-padded-90.png │ ├── jest-padded-90.png │ ├── react-padded-90.png │ ├── redux-padded-90.png │ ├── webpack-padded.png │ ├── yarn-padded-90.png │ ├── eslint-padded-90.png │ ├── webpack-padded-90.png │ ├── react-router-padded.png │ └── react-router-padded-90.png └── scripts │ ├── CheckNodeEnv.js │ ├── CheckPortInUse.js │ └── CheckBuiltsExist.js ├── resources ├── icon.ico ├── icon.png ├── icon.icns └── icons │ ├── 16x16.png │ ├── 24x24.png │ ├── 32x32.png │ ├── 48x48.png │ ├── 64x64.png │ ├── 96x96.png │ ├── 128x128.png │ ├── 256x256.png │ ├── 512x512.png │ └── 1024x1024.png ├── flow-typed └── module_vx.x.x.js ├── test ├── example.js ├── e2e │ ├── helpers.js │ └── HomePage.e2e.js ├── .eslintrc ├── actions │ ├── __snapshots__ │ │ └── counter.spec.js.snap │ └── counter.spec.js ├── reducers │ ├── __snapshots__ │ │ └── counter.spec.js.snap │ └── counter.spec.js ├── components │ ├── __snapshots__ │ │ └── Counter.spec.js.snap │ └── Counter.spec.js └── containers │ └── CounterPage.spec.js ├── renovate.json ├── configs ├── webpack.config.eslint.js ├── webpack.config.base.js ├── webpack.config.renderer.dev.dll.babel.js ├── webpack.config.main.prod.babel.js ├── webpack.config.renderer.prod.babel.js └── webpack.config.renderer.dev.babel.js ├── appveyor.yml ├── .vscode └── launch.json ├── .gitignore ├── LICENSE ├── babel.config.js ├── i18n ├── languages │ └── en.js └── i18n.js ├── README.md ├── package.json └── CHANGELOG.md /app/utils/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | scripts-prepend-node-path=true -------------------------------------------------------------------------------- /app/variables.scss: -------------------------------------------------------------------------------- 1 | $bgColor: #f8f5f4; 2 | $borderColor: #e4d7cc; -------------------------------------------------------------------------------- /internals/mocks/fileMock.js: -------------------------------------------------------------------------------- 1 | export default 'test-file-stub'; 2 | -------------------------------------------------------------------------------- /app/app.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iyobo/epicworshipneo/HEAD/app/app.icns -------------------------------------------------------------------------------- /internals/flow/WebpackAsset.js.flow: -------------------------------------------------------------------------------- 1 | // @flow 2 | declare export default string 3 | -------------------------------------------------------------------------------- /resources/icon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iyobo/epicworshipneo/HEAD/resources/icon.ico -------------------------------------------------------------------------------- /resources/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iyobo/epicworshipneo/HEAD/resources/icon.png -------------------------------------------------------------------------------- /app/assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iyobo/epicworshipneo/HEAD/app/assets/logo.png -------------------------------------------------------------------------------- /flow-typed/module_vx.x.x.js: -------------------------------------------------------------------------------- 1 | declare module 'module' { 2 | declare module.exports: any; 3 | } 4 | -------------------------------------------------------------------------------- /internals/flow/CSSModule.js.flow: -------------------------------------------------------------------------------- 1 | // @flow 2 | 3 | declare export default { [key: string]: string } -------------------------------------------------------------------------------- /internals/img/js.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iyobo/epicworshipneo/HEAD/internals/img/js.png -------------------------------------------------------------------------------- /internals/img/npm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iyobo/epicworshipneo/HEAD/internals/img/npm.png -------------------------------------------------------------------------------- /resources/icon.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iyobo/epicworshipneo/HEAD/resources/icon.icns -------------------------------------------------------------------------------- /internals/img/flow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iyobo/epicworshipneo/HEAD/internals/img/flow.png -------------------------------------------------------------------------------- /internals/img/jest.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iyobo/epicworshipneo/HEAD/internals/img/jest.png -------------------------------------------------------------------------------- /internals/img/mobx.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iyobo/epicworshipneo/HEAD/internals/img/mobx.png -------------------------------------------------------------------------------- /internals/img/react.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iyobo/epicworshipneo/HEAD/internals/img/react.png -------------------------------------------------------------------------------- /internals/img/redux.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iyobo/epicworshipneo/HEAD/internals/img/redux.png -------------------------------------------------------------------------------- /internals/img/yarn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iyobo/epicworshipneo/HEAD/internals/img/yarn.png -------------------------------------------------------------------------------- /internals/img/eslint.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iyobo/epicworshipneo/HEAD/internals/img/eslint.png -------------------------------------------------------------------------------- /internals/img/webpack.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iyobo/epicworshipneo/HEAD/internals/img/webpack.png -------------------------------------------------------------------------------- /resources/icons/16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iyobo/epicworshipneo/HEAD/resources/icons/16x16.png -------------------------------------------------------------------------------- /resources/icons/24x24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iyobo/epicworshipneo/HEAD/resources/icons/24x24.png -------------------------------------------------------------------------------- /resources/icons/32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iyobo/epicworshipneo/HEAD/resources/icons/32x32.png -------------------------------------------------------------------------------- /resources/icons/48x48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iyobo/epicworshipneo/HEAD/resources/icons/48x48.png -------------------------------------------------------------------------------- /resources/icons/64x64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iyobo/epicworshipneo/HEAD/resources/icons/64x64.png -------------------------------------------------------------------------------- /resources/icons/96x96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iyobo/epicworshipneo/HEAD/resources/icons/96x96.png -------------------------------------------------------------------------------- /internals/img/js-padded.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iyobo/epicworshipneo/HEAD/internals/img/js-padded.png -------------------------------------------------------------------------------- /resources/icons/128x128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iyobo/epicworshipneo/HEAD/resources/icons/128x128.png -------------------------------------------------------------------------------- /resources/icons/256x256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iyobo/epicworshipneo/HEAD/resources/icons/256x256.png -------------------------------------------------------------------------------- /resources/icons/512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iyobo/epicworshipneo/HEAD/resources/icons/512x512.png -------------------------------------------------------------------------------- /internals/img/eslint-padded.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iyobo/epicworshipneo/HEAD/internals/img/eslint-padded.png -------------------------------------------------------------------------------- /internals/img/flow-padded.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iyobo/epicworshipneo/HEAD/internals/img/flow-padded.png -------------------------------------------------------------------------------- /internals/img/jest-padded.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iyobo/epicworshipneo/HEAD/internals/img/jest-padded.png -------------------------------------------------------------------------------- /internals/img/react-padded.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iyobo/epicworshipneo/HEAD/internals/img/react-padded.png -------------------------------------------------------------------------------- /internals/img/react-router.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iyobo/epicworshipneo/HEAD/internals/img/react-router.png -------------------------------------------------------------------------------- /internals/img/redux-padded.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iyobo/epicworshipneo/HEAD/internals/img/redux-padded.png -------------------------------------------------------------------------------- /internals/img/yarn-padded.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iyobo/epicworshipneo/HEAD/internals/img/yarn-padded.png -------------------------------------------------------------------------------- /resources/icons/1024x1024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iyobo/epicworshipneo/HEAD/resources/icons/1024x1024.png -------------------------------------------------------------------------------- /internals/img/flow-padded-90.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iyobo/epicworshipneo/HEAD/internals/img/flow-padded-90.png -------------------------------------------------------------------------------- /internals/img/jest-padded-90.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iyobo/epicworshipneo/HEAD/internals/img/jest-padded-90.png -------------------------------------------------------------------------------- /internals/img/react-padded-90.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iyobo/epicworshipneo/HEAD/internals/img/react-padded-90.png -------------------------------------------------------------------------------- /internals/img/redux-padded-90.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iyobo/epicworshipneo/HEAD/internals/img/redux-padded-90.png -------------------------------------------------------------------------------- /internals/img/webpack-padded.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iyobo/epicworshipneo/HEAD/internals/img/webpack-padded.png -------------------------------------------------------------------------------- /internals/img/yarn-padded-90.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iyobo/epicworshipneo/HEAD/internals/img/yarn-padded-90.png -------------------------------------------------------------------------------- /internals/img/eslint-padded-90.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iyobo/epicworshipneo/HEAD/internals/img/eslint-padded-90.png -------------------------------------------------------------------------------- /internals/img/webpack-padded-90.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iyobo/epicworshipneo/HEAD/internals/img/webpack-padded-90.png -------------------------------------------------------------------------------- /internals/img/react-router-padded.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iyobo/epicworshipneo/HEAD/internals/img/react-router-padded.png -------------------------------------------------------------------------------- /internals/img/react-router-padded-90.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iyobo/epicworshipneo/HEAD/internals/img/react-router-padded-90.png -------------------------------------------------------------------------------- /test/example.js: -------------------------------------------------------------------------------- 1 | describe('description', () => { 2 | it('should have description', () => { 3 | expect(1 + 2).toBe(3); 4 | }); 5 | }); 6 | -------------------------------------------------------------------------------- /test/e2e/helpers.js: -------------------------------------------------------------------------------- 1 | /* eslint import/prefer-default-export: off */ 2 | import { ClientFunction } from 'testcafe'; 3 | 4 | export const getPageUrl = ClientFunction(() => window.location.href); 5 | -------------------------------------------------------------------------------- /renovate.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": ["config:base"], 3 | "rangeStrategy": "bump", 4 | "baseBranches": ["next"], 5 | "automerge": true, 6 | "major": { 7 | "automerge": false 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /configs/webpack.config.eslint.js: -------------------------------------------------------------------------------- 1 | /* eslint import/no-unresolved: off, import/no-self-import: off */ 2 | require('@babel/register'); 3 | 4 | module.exports = require('./webpack.config.renderer.dev.babel').default; 5 | -------------------------------------------------------------------------------- /app/components/Home.css: -------------------------------------------------------------------------------- 1 | .container { 2 | position: absolute; 3 | top: 30%; 4 | left: 10px; 5 | text-align: center; 6 | } 7 | 8 | .container h2 { 9 | font-size: 5rem; 10 | } 11 | 12 | .container a { 13 | font-size: 1.4rem; 14 | } 15 | -------------------------------------------------------------------------------- /app/managers/screenManager.js: -------------------------------------------------------------------------------- 1 | import electron from 'electron'; 2 | 3 | let screens = [] 4 | 5 | export const initializeScreens = (app) =>{ 6 | console.log('Initializing Message Pipes...'); 7 | 8 | screens = electron.screen.getAllDisplays() 9 | 10 | console.log('screens defined.') 11 | } -------------------------------------------------------------------------------- /test/.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "plugin:testcafe/recommended", 3 | "env": { 4 | "jest/globals": true 5 | }, 6 | "plugins": ["jest", "testcafe"], 7 | "rules": { 8 | "jest/no-disabled-tests": "warn", 9 | "jest/no-focused-tests": "error", 10 | "jest/no-identical-title": "error" 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /app/pages/settings/CountdownPage.jsx: -------------------------------------------------------------------------------- 1 | import React, { Component } from "react"; 2 | import { inject, observer } from "mobx-react"; 3 | 4 | @inject("store") 5 | @observer 6 | export default class CountdownPage extends Component { 7 | render() { 8 | return ( 9 |
, nextContext: any): void {
25 |
26 | this.props.store.productionStore.setLastSelectedProduction(nextProps.match.params.id);
27 | }
28 |
29 | getSelectedId() {
30 | const prodStore = this.props.store.productionStore;
31 | return this.props.match.params.id || prodStore.lastSelectedProductionId;
32 | }
33 |
34 | componentDidCatch(error) {
35 | toast.error({ title: "Oops", message: error.message });
36 | }
37 |
38 | onClone = async () => {
39 | const prodStore = this.props.store.productionStore;
40 | const selectedProdId = this.getSelectedId();
41 |
42 | await prodStore.cloneProduction(selectedProdId);
43 | };
44 |
45 | onDelete = async () => {
46 | const prodStore = this.props.store.productionStore;
47 | const selectedProdId = this.getSelectedId();
48 |
49 | await prodStore.deleteProduction(selectedProdId);
50 | };
51 |
52 | onMakeLive = async (itemId) => {
53 | const prodStore = this.props.store.productionStore;
54 | console.log('Making production live',itemId)
55 | await prodStore.makeProductionLive(itemId);
56 | };
57 |
58 | buttons: array , nextContext: any): void {
35 |
36 | // this.props.store.elementStore.setLastSelectedProduction(nextProps.match.params.id);
37 | }
38 |
39 | getSelectedId() {
40 | return this.props.match.params.id;
41 | }
42 |
43 | componentDidCatch(error) {
44 | toast.error({ title: "Oops", message: error.message });
45 | }
46 |
47 | onClone = async () => {
48 | const store = this.props.store.elementStore;
49 | const selectedElementId = this.getSelectedId();
50 |
51 | await store.cloneElement(elementType, selectedElementId);
52 | };
53 |
54 | onDelete = async () => {
55 | const store = this.props.store.elementStore;
56 | const selectedElementId = this.getSelectedId();
57 |
58 | await store.deleteElement(elementType, selectedElementId);
59 | };
60 |
61 | onAddToProduction = async () => {
62 | const store = this.props.store.productionStore;
63 | const selectedElementId = this.getSelectedId();
64 |
65 | const elemStore = this.props.store.elementStore;
66 | const element = await elemStore.findElement(selectedElementId);
67 | await store.addToLiveProduction(element);
68 | };
69 |
70 |
71 | buttons: array {dict.production_page_noElements}. {dict.production_page_noElementsGoAdd} {dict.production_page_noElements} , nextContext: any): void {
31 | if (this.props.selectedId !== nextProps.selectedId) {
32 | this._refresh(nextProps)
33 | }
34 | }
35 |
36 | _refresh=(props)=>{
37 | const elementStore = props.store.elementStore;
38 | const element = elementStore.getElement(elementType, props.selectedId);
39 |
40 | // debugger;
41 |
42 | if (element) {
43 | // console.log(element);
44 | this.setState({ name: element.name, text: element.text });
45 | } else if (props.selectedId === "new") {
46 | this.setState({ name: "", text: "" });
47 | }
48 | }
49 |
50 |
51 | onSubmit = async (evt) => {
52 | evt.preventDefault();
53 |
54 | if (!this.state.name) return toast.error({
55 | title: `Empty ${elementType} name`,
56 | message: `Every ${elementType} needs a good name`
57 | });
58 | if (!this.state.text) return toast.error({
59 | title: `Empty ${elementType} body`,
60 | message: `Every ${elementType} needs a good body`
61 | });
62 |
63 | const elementStore = this.props.store.elementStore;
64 | const elementId = this.props.selectedId;
65 | let element = elementStore.getElement(elementType, elementId);
66 |
67 | if (!element) {
68 | element = await elementStore.createElement(elementType, this.state.name, this.state.text);
69 | } else {
70 | element.name = this.state.name;
71 | element.text = this.state.text;
72 | await elementStore.updateElement(element);
73 | }
74 | // debugger;
75 | // this.setState({ name: "" });
76 | this.props.store.navigateToElement(elementType, element._id);
77 |
78 | };
79 |
80 | render() {
81 | const elementStore = this.props.store.elementStore;
82 | const elementId = this.props.selectedId; //if id='new' go all the way down and work with null element
83 | // debugger;
84 | // console.log({ elementId });
85 |
86 | // If still no id then no current or previous selection
87 | if (!elementId) return , nextContext: any): void {
45 |
46 | // this.props.store.elementStore.setLastSelectedProduction(nextProps.match.params.id);
47 | }
48 |
49 | getSelectedId() {
50 | return this.state.selectedId || this.props.selectedId;
51 | }
52 |
53 | componentDidCatch(error) {
54 | toast.error({ title: "Oops", message: error.message });
55 | }
56 |
57 | onDelete = async () => {
58 | const store = this.props.store.elementStore;
59 | const selectedElementId = this.getSelectedId();
60 |
61 | await store.deleteElement(elementType, selectedElementId);
62 | };
63 |
64 | onAddToProduction = async () => {
65 | const productionStore = this.props.store.productionStore;
66 | const selectedElementId = this.getSelectedId();
67 |
68 | const elementStore = this.props.store.elementStore;
69 | const element = await elementStore.findElement(selectedElementId);
70 | await productionStore.addToLiveProduction(element);
71 | };
72 |
73 | buttons: array{dict.menu_productions}
73 |
74 | {dict.menu_songs}
85 |
86 |
49 |
60 | {/*Order of routes is important*/}
61 | Production Set
88 | {selectedElement.name}
90 |
91 |
{selectedElement.name}
96 | {dict.menu_backgrounds}
105 |
106 |