diff --git a/package.json b/package.json index 0e98ea60..4392945a 100755 --- a/package.json +++ b/package.json @@ -24,9 +24,9 @@ "npm": ">=5.0.0", "yarn": ">=1.0.0" }, - "browserslist": [ - "last 1 Electron versions" - ], + "browserslist": [ + "last 1 Electron versions" + ], "main": "main.js", "scripts": { "prod": "webpack --mode production --config webpack.build.config.js && electron --noDevServer .", @@ -51,6 +51,7 @@ "react-apollo": "^2.5.1", "react-dom": "^16.8.3", "react-redux": "^6.0.0", + "react-select": "^2.4.3", "react-sortablejs": "^1.4.0", "redux": "^4.0.1", "rmc-tabs": "^1.2.27", diff --git a/src/assets/css/Settings.css b/src/assets/css/Settings.css index ca0c78ce..cf706027 100644 --- a/src/assets/css/Settings.css +++ b/src/assets/css/Settings.css @@ -4,7 +4,7 @@ top: 0px; left: 2vw; width: 96vw; - background-color: rgb(44, 44, 44); + background-color: rgb(31, 31, 31); border-width: 1px; border-style: solid; border-color: rgba(156, 156, 156, 0.63); @@ -27,20 +27,33 @@ display:flex; flex-direction: row; flex-wrap: wrap; - margin-top: 10px; + margin-top: 20px; font-size: 1.1em; - background-color: rgb(31, 31, 31); + text-align: left; + background-color: rgb(56, 56, 56); + border-width: 1px; + border-style: solid; + border-color: rgba(230, 230, 230, 0.63); } .Settings-input-field { white-space: nowrap; margin: 5px; + min-width: 220px; color: rgb(255, 255, 255); + background-color: rgb(49, 49, 49); + border-width: 1px; + border-style: solid; + border-color: rgb(34, 34, 34); } +.Settings-input-selector { + color: rgb(13, 13, 66); + margin: 5px; +} input[type=text] { - text-align: right; + text-align: left; margin: 5px; font-size: 1.1em; border: 1px solid rgb(104, 104, 104); diff --git a/src/components/App.js b/src/components/App.js index e9e3c7d8..ff069164 100755 --- a/src/components/App.js +++ b/src/components/App.js @@ -4,7 +4,7 @@ import { Tabs } from 'rmc-tabs'; //Apollo-Client Graphql implementation: import gql from "graphql-tag"; -import { ALL_CHANNELS_QUERY, ALL_CHANNELS_SUBSCRIPTION } from '../graphql/CasparCgQuery'; +import { ALL_CHANNELS_QUERY, ALL_CHANNELS_SUBSCRIPTION, MEDIA_FOLDERS_QUERY } from '../graphql/CasparCgQuery'; //Redux: import { connect } from "react-redux"; @@ -77,6 +77,10 @@ class App extends PureComponent { port: this.props.store.settings[0].port, autoConnect: true, }); + this.ccgConnection.infoPaths() + .then((response) =>{ + console.log("List of paths : ", response); + }); loadClipToolCommonSettings(this.ccgConnection, this.props.store.settings, this.props.store.appNav[0].showSettingsActive); this.ccgLoadPlay = new CcgLoadPlay(this.ccgConnection); @@ -192,11 +196,13 @@ class App extends PureComponent { type:'SET_TIMELEFT', data: response.data, }); - response.data.timeLeft.map((item, index) => { - _this2.handleAutoNext.autoNext(item, index); - _this2.handleOverlay.handleOverlay(item, index); - _this2.handleOverlay.handleWipe(item, index); - }); + if (!_this2.props.store.settings[0].disableOverlay) { + response.data.timeLeft.map((item, index) => { + _this2.handleAutoNext.autoNext(item, index); + _this2.handleOverlay.handleOverlay(item, index); + _this2.handleOverlay.handleWipe(item, index); + }); + } }, error(err) { console.error('Subscription error: ', err); }, }); @@ -244,6 +250,49 @@ class App extends PureComponent { ccgMediaFilesChanged() { var _this2 = this; + + //Get list of media folders: + window.apolloClient.query({ + query: gql`{ + mediaFolders { + folder + } + }` + }) + .then((response) => { + this.mediaFolders = response.data.mediaFolders.map((item)=> { + return {value: item.folder, label: item.folder}; + }); + }); + + //Get list of data folders: + window.apolloClient.query({ + query: gql`{ + dataFolders { + folder + } + }` + }) + .then((response) => { + this.dataFolders = response.data.dataFolders.map((item)=> { + return {value: item.folder, label: item.folder}; + }); + }); + + //Get list of template folders: + window.apolloClient.query({ + query: gql`{ + templateFolders { + folder + } + }` + }) + .then((response) => { + this.templateFolders = response.data.templateFolders.map((item)=> { + return {value: item.folder, label: item.folder}; + }); + }); + //Subscribe to CasparCG-State changes: window.apolloClient.subscribe({ query: gql` @@ -600,7 +649,12 @@ class App extends PureComponent { : "" } {this.props.store.appNav[0].showSettingsActive ? - + : null }
diff --git a/src/components/Settings.js b/src/components/Settings.js index 6fa2cbf4..5018ad73 100644 --- a/src/components/Settings.js +++ b/src/components/Settings.js @@ -1,5 +1,7 @@ import React, { Component } from 'react'; import '../assets/css/Settings.css'; +import Select from 'react-select'; + //Redux: import { connect } from "react-redux"; @@ -7,6 +9,19 @@ import { connect } from "react-redux"; //Utils: import { saveSettings } from '../util/SettingsStorage'; +//Set style for Select dropdown component: +const selectorColorStyles = { + control: styles => ({ ...styles, backgroundColor: '#676767', color: 'white', border: 0 }), + option: (styles) => { + return { + backgroundColor: '#AAAAAA', + color: 'white' + }; + }, + singleValue: styles => ({ ...styles, color: 'white' }), +}; + + class SettingsPage extends Component { constructor(props) { @@ -16,6 +31,7 @@ class SettingsPage extends Component { }; this.handleChange = this.handleChange.bind(this); this.handleDisableDragNDrop = this.handleDisableDragNDrop.bind(this); + this.handleDisableOverlay = this.handleDisableOverlay.bind(this); this.handleTabTitle = this.handleTabTitle.bind(this); this.handleTabMediaFolder = this.handleTabMediaFolder.bind(this); this.handleTabDataFolder = this.handleTabDataFolder.bind(this); @@ -39,11 +55,20 @@ class SettingsPage extends Component { handleDisableDragNDrop(event) { var settingsCopy= Object.assign({}, this.state.settings); - settingsCopy[event.target.name] = event.target.checked; + settingsCopy.disableDragNDrop = event.target.checked; this.setState( {settings: settingsCopy} ); } + + handleDisableOverlay(event) { + var settingsCopy= Object.assign({}, this.state.settings); + settingsCopy.disableOverlay = event.target.checked; + this.setState( + {settings: settingsCopy} + ); + } + handleTabTitle(event) { var settingsCopy= Object.assign({}, this.state.settings); settingsCopy.tabData[event.target.name].title = event.target.value; @@ -52,26 +77,26 @@ class SettingsPage extends Component { ); } - handleTabMediaFolder(event) { + handleTabMediaFolder(index, event) { var settingsCopy= Object.assign({}, this.state.settings); - settingsCopy.tabData[event.target.name].subFolder = event.target.value; + settingsCopy.tabData[index].subFolder = event.value + "/"; this.setState( {settings: settingsCopy} ); } - handleTabDataFolder(event) { + handleTabDataFolder(index, event) { var settingsCopy= Object.assign({}, this.state.settings); - settingsCopy.tabData[event.target.name].dataFolder = event.target.value; + settingsCopy.tabData[index].dataFolder = event.value + "/"; this.setState( {settings: settingsCopy} ); } - handleTabOverlayFolder(event) { + handleTabOverlayFolder(index, event) { var settingsCopy= Object.assign({}, this.state.settings); - settingsCopy.tabData[event.target.name].overlayFolder = event.target.value; + settingsCopy.tabData[index].overlayFolder = event.value + "/"; this.setState( {settings: settingsCopy} ); @@ -102,27 +127,48 @@ class SettingsPage extends Component { return (
@@ -137,16 +183,24 @@ class SettingsPage extends Component {
+

diff --git a/src/reducers/settingsReducer.js b/src/reducers/settingsReducer.js index f8d08267..2aa4dafc 100644 --- a/src/reducers/settingsReducer.js +++ b/src/reducers/settingsReducer.js @@ -6,6 +6,7 @@ const defaultSettingsReducerState = () => { port: '5250', selectView: 0, disableDragNDrop: false, + disableOverlay: false, tabData: [] }]; for (let i=0; i<4; i++) { @@ -33,6 +34,7 @@ export const settings = ((state = defaultSettingsReducerState(), action) => { nextState[0].port = action.data.port; nextState[0].selectView = action.data.selectView || 0; nextState[0].disableDragNDrop = action.data.disableDragNDrop || false; + nextState[0].disableOverlay = action.data.disableOverlay || false; nextState[0].tabData.map((item, index) => { item.title = tabData[index].title || ''; item.subFolder = tabData[index].subFolder || ''; diff --git a/src/util/filePathStringHandling.js b/src/util/filePathStringHandling.js index d7ea8eed..4bc9b12c 100644 --- a/src/util/filePathStringHandling.js +++ b/src/util/filePathStringHandling.js @@ -2,8 +2,6 @@ export const cleanUpFilename = (filename) => { // casparcg-connection library bug: returns filename with media// or media/ return (filename.replace(/\\/g, '/') - .replace('media//', '') - .replace('media/', '') .toUpperCase() .replace(/\..+$/, '') );