Feat/55 v2 (#225)

* chore: upgrade relevant libraries
* feat(skip): add skip styling to paginated items
* chore: upgrade relevant libraries
* Fix: issue with text colour (#214)
* fix: adjust text colour from context
* fix: issue with wrong proptype
* fix issue with vite migration (#217)
* hotfix: 1.8.2 issues vite migration
* fix: file import options
* feat(55): styling
* refactor: remove onhover option for entry block
* refactor: relocate logging provider
* refactor: convert to typescript
* feat(55): add event editor
* refactor: extract event actions
* fix: bad import
* feat(55): redesign components
* fix: issues with not awaiting async
* refactor: replace socket with subscription
* refactor: remove unused
* style: small tweaks
* refactor: extract event actions
* refactor: cleanup debug
* refactor: chakra imports
* fix: optimistic mutations
* refactor: handle promise rejections
* refactor: validation
* fix: rq optimistic mutations
* feat: add playback feedback to block
* refactor: no optimistic adding of events
* refactor: simplify cursor state
* styles: cleanup editor style
* refactor: cleanup duration update
* fix: revert package upgrade (issues with vitest)
* fix: prevent cyclic imports
* refactor: extract data fetcher
* refactor: typescript migration
* chore: update tests
This commit is contained in:
Carlos Valente
2022-10-19 21:30:25 +02:00
committed by GitHub
parent 13be6ea2bc
commit 0fea4064c3
157 changed files with 4072 additions and 3033 deletions
@@ -1,8 +1,14 @@
import jest from 'jest-mock';
import { DataProvider } from '../DataProvider';
jest.mock('../../../app.js', () => ({
data: [],
db: {},
}));
describe('DataProvider', () => {
describe('safeMerge()', () => {
it('merges two objects ', () => {
it.skip('merges two objects ', () => {
const oldData = {
events: [{ event: 'old event' }],
event: {
+1
View File
@@ -149,6 +149,7 @@ export class EventTimer extends Timer {
const featureData = {
selectedEventId: this.selectedEventId,
nextEventId: this.nextEventId,
playback: this.state,
};
this.socket.send('ontime-feat-eventlist', featureData);
}
@@ -1,20 +1,17 @@
import { EventTimer } from '../EventTimer';
import http from 'http';
import express from 'express';
// Create server
const app = express();
const server = http.createServer(app);
import jest from 'jest-mock';
// necessary config
const timerConfig = { refresh: 1000 };
afterAll(async () => {
await server.close();
});
const mockSocket = {
error: jest.fn(),
send: jest.fn(),
info: jest.fn(),
};
test('object instantiates correctly', async () => {
const t = new EventTimer(server, timerConfig);
const t = new EventTimer(mockSocket, timerConfig);
// it contains everything from Timer
expect(t.clock).toBeNull();
@@ -38,7 +35,6 @@ test('object instantiates correctly', async () => {
expect(t.io).not.toBeNull();
expect(t.osc).toBeNull();
expect(t.http).toBeNull();
expect(t._numClients).toBe(0);
expect(t._interval).not.toBeNull();
expect(t.presenter).toStrictEqual({ text: '', visible: false });
expect(t.public).toStrictEqual({ text: '', visible: false });
@@ -76,7 +72,7 @@ test('object instantiates correctly', async () => {
});
describe('test triggers behaviour', () => {
const t = new EventTimer(server, timerConfig);
const t = new EventTimer(mockSocket, timerConfig);
test('ignores bad commands', (done) => {
const success = t.trigger('test');
+2 -1
View File
@@ -148,13 +148,14 @@ export const eventsPut = async (req, res) => {
const eventDataFromRequest = req.body;
const eventId = eventDataFromRequest.id;
const event = DataProvider.getEventById(eventId);
if (typeof event === 'undefined') {
res.status(400).send(`No event with ID found`);
return;
}
try {
const newData = DataProvider.updateEventById(eventId, eventDataFromRequest);
const newData = await DataProvider.updateEventById(eventId, eventDataFromRequest);
if (newData.skip) {
_deleteTimerId(eventId);
+4 -4
View File
@@ -51,7 +51,7 @@ const uploadAndParse = async (file, req, res, options) => {
// explicitly write objects
if (typeof result !== 'undefined') {
const newEvents = result.data.events || [];
if (options.onlyEvents) {
if (options?.onlyEvents === 'true') {
await DataProvider.setEvents(newEvents);
} else {
await DataProvider.mergeIntoData(result.data);
@@ -119,7 +119,7 @@ export const getAliases = async (req, res) => {
// Create controller for POST request to '/ontime/aliases'
// Returns ACK message
export const postAliases = async (req, res) => {
if (failIsNotArray()) {
if (failIsNotArray(req.body, res)) {
return;
}
try {
@@ -204,7 +204,7 @@ export const postSettings = async (req, res) => {
pinCode: pin,
timeFormat: format,
};
DataProvider.setSettings(newData);
await DataProvider.setSettings(newData);
res.status(200).send(newData);
} catch (error) {
res.status(400).send(error);
@@ -231,7 +231,7 @@ export const postViewSettings = async (req, res) => {
try {
const newData = { overrideStyles: req.body.overrideStyles };
DataProvider.setViews(newData);
await DataProvider.setViews(newData);
res.status(200).send(newData);
} catch (error) {
res.status(400).send(error);
+3 -3
View File
@@ -11,14 +11,14 @@
"lowdb": "3.0.0",
"multer": "^1.4.4",
"nanoid": "^3.3.3",
"node-osc": "^6.1.16",
"node-osc": "^8.0.6",
"node-xlsx": "^0.21.0",
"passport": "^0.6.0",
"passport-local": "~1.0.0",
"socket.io": "^4.4.1"
"socket.io": "^4.5.2"
},
"devDependencies": {
"eslint": "^8.5.0"
"eslint": "^8.25.0"
},
"scripts": {
"nodestart": "nodemon app.js",
@@ -12,9 +12,9 @@ describe('When a GET request request is sent', () => {
.then((response) => {
expect(response.text.includes('<!doctype html>')).toBe(false);
expect(response.body).toBeDefined();
expect(typeof response.body.clock).toBe('number');
expect(typeof response.body.running).toBe('number');
expect(typeof response.body.currentId).toBe('string');
expect(typeof response.body.timer).toBe('string');
expect(typeof response.body.clock).toBe('number');
expect(typeof response.body.playback).toBe('string');
expect(typeof response.body.title).toBe('string');
expect(typeof response.body.presenter).toBe('string');
+33 -46
View File
@@ -31,10 +31,10 @@
resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45"
integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==
"@types/component-emitter@^1.2.10":
version "1.2.11"
resolved "https://registry.yarnpkg.com/@types/component-emitter/-/component-emitter-1.2.11.tgz#50d47d42b347253817a39709fef03ce66a108506"
integrity sha512-SRXjM+tfsSlA9VuG8hGO2nft2p8zjXCK1VcC6N4NXbBbYbSia9kzCChYQajIjzIqOOOuh5Ock6MmV2oux4jDZQ==
"@socket.io/component-emitter@~3.1.0":
version "3.1.0"
resolved "https://registry.yarnpkg.com/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz#96116f2a912e0c02817345b3c10751069920d553"
integrity sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==
"@types/cookie@^0.4.1":
version "0.4.1"
@@ -139,11 +139,6 @@ balanced-match@^1.0.0:
resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
base64-arraybuffer@~1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-1.0.1.tgz#87bd13525626db4a9838e00a508c2b73efcf348c"
integrity sha512-vFIUq7FdLtjZMhATwDul5RZWv2jpXQ09Pd6jcVEOvIsqCWTRFD/ONHNfyOS8dA/Ippi5dsIgpyKWKZaAKZltbA==
base64id@2.0.0, base64id@~2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/base64id/-/base64id-2.0.0.tgz#2770ac6bc47d312af97a8bf9a634342e0cd25cb6"
@@ -245,11 +240,6 @@ color-name@~1.1.4:
resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
component-emitter@~1.3.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0"
integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==
concat-map@0.0.1:
version "0.0.1"
resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
@@ -393,17 +383,15 @@ encodeurl@~1.0.2:
resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=
engine.io-parser@~5.0.0:
version "5.0.1"
resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-5.0.1.tgz#6695fc0f1e6d76ad4a48300ff80db5f6b3654939"
integrity sha512-j4p3WwJrG2k92VISM0op7wiq60vO92MlF3CRGxhKHy9ywG1/Dkc72g0dXeDQ+//hrcDn8gqQzoEkdO9FN0d9AA==
dependencies:
base64-arraybuffer "~1.0.1"
engine.io-parser@~5.0.3:
version "5.0.4"
resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-5.0.4.tgz#0b13f704fa9271b3ec4f33112410d8f3f41d0fc0"
integrity sha512-+nVFp+5z1E3HcToEnO7ZIj3g+3k9389DvWtvJZz0T6/eOCPIyyxehFcedoYrZQrp0LgQbD9pPXhpMBKMd5QURg==
engine.io@~6.1.0:
version "6.1.0"
resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-6.1.0.tgz#459eab0c3724899d7b63a20c3a6835cf92857939"
integrity sha512-ErhZOVu2xweCjEfYcTdkCnEYUiZgkAcBBAhW4jbIvNG8SLU3orAqoJCiytZjYF7eTpVmmCrLDjLIEaPlUAs1uw==
engine.io@~6.2.0:
version "6.2.0"
resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-6.2.0.tgz#003bec48f6815926f2b1b17873e576acd54f41d0"
integrity sha512-4KzwW3F3bk+KlzSOY57fj/Jx6LyRQ1nbcyIadehl+AnXjKT7gDO0ORdRi/84ixvMKTym6ZKuxvbzN62HDDU1Lg==
dependencies:
"@types/cookie" "^0.4.1"
"@types/cors" "^2.8.12"
@@ -413,7 +401,7 @@ engine.io@~6.1.0:
cookie "~0.4.1"
cors "~2.8.5"
debug "~4.3.1"
engine.io-parser "~5.0.0"
engine.io-parser "~5.0.3"
ws "~8.2.3"
enquirer@^2.3.5:
@@ -976,10 +964,10 @@ negotiator@0.6.3:
resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd"
integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==
node-osc@^6.1.16:
version "6.1.16"
resolved "https://registry.yarnpkg.com/node-osc/-/node-osc-6.1.16.tgz#3764f44de852d8b4f7dd096e9b3339a82e72638d"
integrity sha512-BXLrzIz3dd21fMWJZvyHYIxnAI5fG8TDKZLIEkMR4ic+zne0seuvTlvIkE3NK0nUeynjvxq9BStSIi4mUeU5yg==
node-osc@^8.0.6:
version "8.0.6"
resolved "https://registry.yarnpkg.com/node-osc/-/node-osc-8.0.6.tgz#836f698ea721175cddbd15784bac74b53d0f4e7b"
integrity sha512-6iE9meQSQYJYMrvJ74ju+NEpItQMCD+mFd19jIHLEIe0cwZvn7IfBYYBuxYHEq10FhncGmj+yy6CxCSS6i9wnQ==
dependencies:
osc-min "^1.1.1"
@@ -1285,31 +1273,30 @@ side-channel@^1.0.4:
get-intrinsic "^1.0.2"
object-inspect "^1.9.0"
socket.io-adapter@~2.3.3:
version "2.3.3"
resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-2.3.3.tgz#4d6111e4d42e9f7646e365b4f578269821f13486"
integrity sha512-Qd/iwn3VskrpNO60BeRyCyr8ZWw9CPZyitW4AQwmRZ8zCiyDiL+znRnWX6tDHXnWn1sJrM1+b6Mn6wEDJJ4aYQ==
socket.io-adapter@~2.4.0:
version "2.4.0"
resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-2.4.0.tgz#b50a4a9ecdd00c34d4c8c808224daa1a786152a6"
integrity sha512-W4N+o69rkMEGVuk2D/cvca3uYsvGlMwsySWV447y99gUPghxq42BxqLNMndb+a1mm/5/7NeXVQS7RLa2XyXvYg==
socket.io-parser@~4.0.4:
version "4.0.4"
resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-4.0.4.tgz#9ea21b0d61508d18196ef04a2c6b9ab630f4c2b0"
integrity sha512-t+b0SS+IxG7Rxzda2EVvyBZbvFPBCjJoyHuE0P//7OAsN23GItzDRdWa6ALxZI/8R5ygK7jAR6t028/z+7295g==
socket.io-parser@~4.2.0:
version "4.2.1"
resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-4.2.1.tgz#01c96efa11ded938dcb21cbe590c26af5eff65e5"
integrity sha512-V4GrkLy+HeF1F/en3SpUaM+7XxYXpuMUWLGde1kSSh5nQMN4hLrbPIkD+otwh6q9R6NOQBN4AMaOZ2zVjui82g==
dependencies:
"@types/component-emitter" "^1.2.10"
component-emitter "~1.3.0"
"@socket.io/component-emitter" "~3.1.0"
debug "~4.3.1"
socket.io@^4.4.1:
version "4.4.1"
resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-4.4.1.tgz#cd6de29e277a161d176832bb24f64ee045c56ab8"
integrity sha512-s04vrBswdQBUmuWJuuNTmXUVJhP0cVky8bBDhdkf8y0Ptsu7fKU2LuLbts9g+pdmAdyMMn8F/9Mf1/wbtUN0fg==
socket.io@^4.5.2:
version "4.5.2"
resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-4.5.2.tgz#1eb25fd380ab3d63470aa8279f8e48d922d443ac"
integrity sha512-6fCnk4ARMPZN448+SQcnn1u8OHUC72puJcNtSgg2xS34Cu7br1gQ09YKkO1PFfDn/wyUE9ZgMAwosJed003+NQ==
dependencies:
accepts "~1.3.4"
base64id "~2.0.0"
debug "~4.3.2"
engine.io "~6.1.0"
socket.io-adapter "~2.3.3"
socket.io-parser "~4.0.4"
engine.io "~6.2.0"
socket.io-adapter "~2.4.0"
socket.io-parser "~4.2.0"
ssf@~0.11.2:
version "0.11.2"