29 |
30 | }
31 | { realms.length !== 0 &&
32 |
33 | { return item.id === 'ROOT' ? item.coreLabel : `${item.coreLabel} / ${item.label}` }}
44 | onChange={(event) => {
45 | setRealm(event.selectedItem)
46 | history.push(`/cores/${event.selectedItem.coreID}/realms/${event.selectedItem.id}/`)
47 | }}
48 | />
49 |
50 | }
51 |
52 |
53 | If you arrived here by a broken link, please submit a bug report.
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 | )
62 | }
63 |
64 | Landing.propTypes = {
65 | realms: PropTypes.array,
66 | realm: PropTypes.object,
67 | setRealm: PropTypes.func
68 | }
69 |
70 | export default Landing
71 |
--------------------------------------------------------------------------------
/readme.md:
--------------------------------------------------------------------------------
1 | # Boreal Director
2 | A Broadcast Orchestration Platform.
3 |
4 | Effective Jan 1st 2022, Boreal Director is no longer actively maintained.
5 |
6 | Due to changes in my employment (funnily enough, as a result of this project)
7 | I no longer have the time nor motivation to continue in depth development on it.
8 |
9 | I will attempt to continue occasional maintenance with security and stability updates,
10 | but will not be adding any features for the foreseeable future, the whole
11 | thing may be revived at some point in the future when circumstances change
12 | but don't count on it.
13 |
14 | Feel free to hack it and use it to learn about React/NodeJS and Broadcast Control
15 | and hopefully it can help you gain a better understanding of the broadcast world
16 | like it did for me. I got a good job out of it so while it hasn't achieved it's
17 | original goal of changing how we think of broadcast control, it did change how I
18 | get to interact with and solve problems in the work I do, so it's not all bad.
19 |
20 | Huge thank you to everyone who helped with design, development, testing,
21 | and feedback. Without you I would have had no hope of learning as much as I did
22 | nor had the chance to develop something that could be practically used in a
23 | large scale production.
24 |
25 | Thanks for coming on the journey and I'm sorry it didn't last very long.
26 | Keep doing great things, Oliver Herrmann
27 |
28 | ## License
29 | Boreal Director is licensed under the GPLv3 License.
30 | Copyright (C) 2020 - 2022 Boreal Systems - Oliver Herrmann, https://boreal.systems
31 |
32 | This program is free software: you can redistribute it and/or modify
33 | it under the terms of the GNU General Public License as published by
34 | the Free Software Foundation, either version 3 of the License, or
35 | (at your option) any later version.
36 |
37 | This program is distributed in the hope that it will be useful,
38 | but WITHOUT ANY WARRANTY; without even the implied warranty of
39 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
40 | GNU General Public License for more details.
41 |
42 | You should have received a copy of the GNU General Public License
43 | along with this program. If not, see .
44 |
--------------------------------------------------------------------------------
/packages/ui/src/View/components/SidebarNav.jsx:
--------------------------------------------------------------------------------
1 | import React, { useContext } from 'react'
2 | import { SideNav, SideNavItems } from 'carbon-components-react'
3 | import { Application24, Dashboard24, DataBase24, DeploymentPolicy24, FolderDetails24, Apps24, Rocket24, Workspace24, FunctionMath24, Tag24 } from '@carbon/icons-react'
4 | import globalContext from '../../globalContext'
5 | import SideNavLink from './SideNavLink.jsx'
6 | import useWindowDimensions from '../hooks/useWindowDimensions'
7 |
8 | const SidebarNav = ({ isActive }) => {
9 | const { contextRealm } = useContext(globalContext)
10 | const { width } = useWindowDimensions();
11 |
12 | return (
13 | 1055}>
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 | )
31 | }
32 |
33 | export default SidebarNav
34 |
--------------------------------------------------------------------------------
/packages/ui/src/App.js:
--------------------------------------------------------------------------------
1 | import React, { useState } from 'react'
2 | import { hot } from 'react-hot-loader/root'
3 | import { Provider, Client, defaultExchanges, subscriptionExchange } from 'urql'
4 | import { SubscriptionClient } from 'subscriptions-transport-ws'
5 | import { BrowserRouter as Router } from 'react-router-dom'
6 | import BorealDirector from './View/Index.jsx'
7 | import globalContext from './globalContext'
8 | import './theme.scss'
9 |
10 | const subscriptionClient = new SubscriptionClient(`${window.location.protocol === 'https:' ? 'wss:' : 'ws:'}//${window.location.hostname}:${window.location.port}/graphql`, { reconnect: true })
11 |
12 | const client = new Client({
13 | url: '/graphql',
14 | requestPolicy: 'network-only',
15 | maskTypename: true,
16 | exchanges: [
17 | ...defaultExchanges,
18 | subscriptionExchange({
19 | forwardSubscription (operation) {
20 | return subscriptionClient.request(operation)
21 | }
22 | })
23 | ]
24 | })
25 |
26 | const App = () => {
27 | const [contextRealm, _setContextRealm] = useState(JSON.parse(localStorage.getItem('contextRealm')) ?? {})
28 | const setContextRealm = (event) => {
29 | localStorage.setItem('contextRealm', JSON.stringify(event))
30 | _setContextRealm(event)
31 | }
32 |
33 | const darkClass = 'dx--dark'
34 | const lightClass = 'dx--light'
35 |
36 | const [theme, _setTheme] = useState(localStorage.getItem('uiTheme') ?? darkClass)
37 |
38 | const toggleTheme = () => {
39 | switch (theme) {
40 | case darkClass :
41 | document.body.classList.remove(darkClass)
42 | document.body.classList.add(lightClass)
43 | localStorage.setItem('uiTheme', lightClass)
44 | _setTheme(lightClass)
45 | break
46 | case lightClass :
47 | document.body.classList.remove(lightClass)
48 | document.body.classList.add(darkClass)
49 | localStorage.setItem('uiTheme', darkClass)
50 | _setTheme(darkClass)
51 | break
52 | }
53 | }
54 |
55 | return (
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 | )
64 | }
65 |
66 | export default hot(App)
67 |
--------------------------------------------------------------------------------
/packages/ui/src/View/Shotbox/ShotboxPanel.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import PropTypes from 'prop-types'
3 | import { Button, Grid, Row, Column } from 'carbon-components-react'
4 | import { useMutation } from 'urql'
5 |
6 | const getEnabledProps = (button) => {
7 | if (button.stack) {
8 | return { kind: 'primary' }
9 | } else {
10 | return { disabled: true, kind: 'secondary' }
11 | }
12 | }
13 |
14 | const ShotboxPanel = ({ inline, panel, controller }) => {
15 | const executeStackMutationGQL = `mutation executeStack($executeID: String, $controller: String) {
16 | executeStack(id: $executeID, controller: $controller)
17 | }`
18 |
19 | var [, executeStackMutation] = useMutation(executeStackMutationGQL)
20 | return (
21 |
22 | { !inline &&
23 |
24 |
25 |
58 | Director is a FOSS project from BorealSystems.
59 |
We are very greatful for everyones support during ongoing development, in particular we would like to thank our contributers,
60 | both Code/Design and Financial,
61 | as well as everyone on the Video Engineering Discord who provided much needed beta testing and motivation.
62 |
If you find any bugs or would like to request features/devices you can do so on our Phabricator.
63 |