diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md
index 48f93b23a..8d7d45b60 100644
--- a/DEVELOPMENT.md
+++ b/DEVELOPMENT.md
@@ -82,9 +82,6 @@ From the project root, run the following commands
The build distribution assets will be at `.apps/electron/dist`
-Note: The MacOS build will only work in CI, locally it will fail due to notarisation issues.
-Use the `pnpm dist-mac:local` command to build a MacOS distribution locally and skip the notary process.
-
## DOCKER
Ontime provides a docker-compose file to aid with building and running docker images.
diff --git a/apps/cli/package.json b/apps/cli/package.json
index 53d05de53..5c68967d8 100644
--- a/apps/cli/package.json
+++ b/apps/cli/package.json
@@ -1,6 +1,6 @@
{
"name": "@getontime/cli",
- "version": "4.0.0-beta.5",
+ "version": "4.0.0-beta.6",
"author": "Carlos Valente",
"description": "Time keeping for live events",
"repository": "https://github.com/cpvalente/ontime",
diff --git a/apps/client/package.json b/apps/client/package.json
index 40258b8a4..a3dc44156 100644
--- a/apps/client/package.json
+++ b/apps/client/package.json
@@ -1,6 +1,6 @@
{
"name": "ontime-ui",
- "version": "4.0.0-beta.5",
+ "version": "4.0.0-beta.6",
"private": true,
"type": "module",
"dependencies": {
diff --git a/apps/client/src/common/components/copy-tag/CopyTag.tsx b/apps/client/src/common/components/copy-tag/CopyTag.tsx
index 8edf6d5ad..15cd21c51 100644
--- a/apps/client/src/common/components/copy-tag/CopyTag.tsx
+++ b/apps/client/src/common/components/copy-tag/CopyTag.tsx
@@ -1,6 +1,5 @@
import { PropsWithChildren, useRef, useState } from 'react';
-import { IoCheckmark } from 'react-icons/io5';
-import { IoCopy } from 'react-icons/io5';
+import { IoCheckmark, IoCopy } from 'react-icons/io5';
import copyToClipboard from '../../utils/copyToClipboard';
import { cx } from '../../utils/styleUtils';
diff --git a/apps/client/src/common/components/navigation-menu/floating-navigation/FloatingNavigation.tsx b/apps/client/src/common/components/navigation-menu/floating-navigation/FloatingNavigation.tsx
index 9c695b04a..0efcea798 100644
--- a/apps/client/src/common/components/navigation-menu/floating-navigation/FloatingNavigation.tsx
+++ b/apps/client/src/common/components/navigation-menu/floating-navigation/FloatingNavigation.tsx
@@ -1,5 +1,4 @@
-import { IoApps } from 'react-icons/io5';
-import { IoSettingsOutline } from 'react-icons/io5';
+import { IoApps, IoSettingsOutline } from 'react-icons/io5';
import { useFadeOutOnInactivity } from '../../../hooks/useFadeOutOnInactivity';
import { cx } from '../../../utils/styleUtils';
diff --git a/apps/client/src/features/app-settings/panel/automations-panel/OntimeActionForm.tsx b/apps/client/src/features/app-settings/panel/automations-panel/OntimeActionForm.tsx
index 6bdf47c47..b11577ecf 100644
--- a/apps/client/src/features/app-settings/panel/automations-panel/OntimeActionForm.tsx
+++ b/apps/client/src/features/app-settings/panel/automations-panel/OntimeActionForm.tsx
@@ -77,7 +77,7 @@ export default function OntimeActionForm({
New time
maxDuration || valueInMillis < 0) {
+ if (value > maxDuration || value < 0) {
throw new Error('Times should be from 0 to 23:59:59');
}
- return valueInMillis;
+ return value;
}
const propertyConversion = {
@@ -34,6 +33,9 @@ const propertyConversion = {
endAction: (value: unknown) => coerceEnum(value, EndAction),
timerType: (value: unknown) => coerceEnum(value, TimerType),
+ linkStart: coerceBoolean,
+ timeStrategy: (value: unknown) => coerceEnum(value, TimeStrategy),
+
duration: (value: unknown) => clampDuration(coerceNumber(value)),
timeStart: (value: unknown) => clampDuration(coerceNumber(value)),
timeEnd: (value: unknown) => clampDuration(coerceNumber(value)),
diff --git a/e2e/tests/001-smoke-tests.spec.ts b/e2e/tests/001-smoke-tests.spec.ts
index 2c3a4f027..0c580c7fb 100644
--- a/e2e/tests/001-smoke-tests.spec.ts
+++ b/e2e/tests/001-smoke-tests.spec.ts
@@ -1,11 +1,10 @@
import { expect, test } from '@playwright/test';
-// TODO: can we replace the clicks with something else?
test.describe('pages routes are available', () => {
test.use({ viewport: { width: 1920, height: 1080 } });
test.describe('main views', () => {
test('editor', async ({ page }) => {
- await page.goto('http://localhost:4001/editor');
+ await page.goto('/editor');
await expect(page).toHaveTitle(/ontime/);
await expect(page.getByTestId('editor-container')).toBeVisible();
@@ -15,44 +14,41 @@ test.describe('pages routes are available', () => {
});
test('cuesheet', async ({ page }) => {
- await page.goto('http://localhost:4001/cuesheet');
+ await page.goto('/cuesheet');
await expect(page).toHaveTitle(/ontime/);
- await page.getByTestId('cuesheet').click();
+ await expect(page.getByTestId('cuesheet')).toBeVisible();
});
test('operator', async ({ page }) => {
- await page.goto('http://localhost:4001/op');
+ await page.goto('/op');
await expect(page).toHaveTitle(/ontime/);
});
test('timer', async ({ page }) => {
- await page.goto('http://localhost:4001/timer');
+ await page.goto('/timer');
await expect(page).toHaveTitle(/ontime/);
});
test('backstage', async ({ page }) => {
- await page.goto('http://localhost:4001/backstage');
+ await page.goto('/backstage');
await expect(page).toHaveTitle(/ontime/);
});
test('studio', async ({ page }) => {
- await page.goto('http://localhost:4001/studio');
+ await page.goto('/studio');
await expect(page).toHaveTitle(/ontime/);
});
test('countdown', async ({ page }) => {
- await page.goto('http://localhost:4001/countdown');
+ await page.goto('/countdown?sub=32d31');
await expect(page).toHaveTitle(/ontime/);
- await page.getByRole('button', { name: 'Add' }).click();
- await page.getByText('Albania').click();
- await page.getByRole('button', { name: 'Save' }).click();
await expect(page.getByText('Albania')).toBeVisible();
await expect(page.getByText('Latvia')).toBeHidden();
});
@@ -60,15 +56,15 @@ test.describe('pages routes are available', () => {
test.describe('detached views', () => {
test('rundown', async ({ page }) => {
- await page.goto('http://localhost:4001/rundown');
+ await page.goto('/rundown');
await expect(page.getByTestId('panel-rundown')).toBeVisible();
});
test('timer control', async ({ page }) => {
- await page.goto('http://localhost:4001/timercontrol');
+ await page.goto('/timercontrol');
await expect(page.getByTestId('panel-timer-control')).toBeVisible();
});
test('message control', async ({ page }) => {
- await page.goto('http://localhost:4001/messagecontrol');
+ await page.goto('/messagecontrol');
await expect(page.getByTestId('panel-messages-control')).toBeVisible();
});
});
diff --git a/e2e/tests/features/205-operator.spec.ts b/e2e/tests/features/205-operator.spec.ts
index ab247c944..45100b803 100644
--- a/e2e/tests/features/205-operator.spec.ts
+++ b/e2e/tests/features/205-operator.spec.ts
@@ -62,9 +62,4 @@ test('smoke test operator', async ({ page }) => {
await expect(page.getByTestId('--1')).toHaveCSS('opacity', '1'); // BUG: ensure event doesn't inherit the past state of the group
await expect(page.getByText('title 2')).toBeInViewport();
await expect(page.getByText('title 3')).toBeInViewport();
-
- // TODO: this part seems particularly flaky, to revise
- // await expect(page.getByText('00:01 - 00:02')).toBeInViewport();
- // await expect(page.getByText('00:02 - 00:03')).toBeInViewport();
- // await expect(page.getByText('00:03 - 00:04')).toBeInViewport();
});
diff --git a/e2e/tests/features/211-report-data.spec.ts b/e2e/tests/features/211-report-data.spec.ts
index 75c97c4bb..180031e13 100644
--- a/e2e/tests/features/211-report-data.spec.ts
+++ b/e2e/tests/features/211-report-data.spec.ts
@@ -1,7 +1,5 @@
import { expect, test } from '@playwright/test';
-//TODO:
-
test('show warning when event crosses midnight', async ({ page }) => {
await page.goto('http://localhost:4001/editor');
diff --git a/e2e/tests/features/212-time-until.spec.ts b/e2e/tests/features/212-time-until.spec.ts
index ace6e1d5b..1569b6aa2 100644
--- a/e2e/tests/features/212-time-until.spec.ts
+++ b/e2e/tests/features/212-time-until.spec.ts
@@ -1,4 +1,4 @@
-import { expect, Locator, Page, test } from '@playwright/test';
+import { expect, Locator, test } from '@playwright/test';
test('time until absolute', async ({ context }) => {
const editor = await context.newPage();
diff --git a/package.json b/package.json
index 285c47f27..2a84d57d8 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "ontime",
- "version": "4.0.0-beta.5",
+ "version": "4.0.0-beta.6",
"description": "Time keeping for live events",
"keywords": [
"ontime",
diff --git a/packages/types/src/definitions/core/Automation.type.ts b/packages/types/src/definitions/core/Automation.type.ts
index b48bb0c5b..6e4fd6e2d 100644
--- a/packages/types/src/definitions/core/Automation.type.ts
+++ b/packages/types/src/definitions/core/Automation.type.ts
@@ -90,7 +90,7 @@ export type OntimeAction =
| {
type: 'ontime';
action: OntimeAuxSetAction;
- time: string; //TODO:(automation set aux) not sure what way around to have the string and where to have the ms value
+ time: string;
}
| {
type: 'ontime';
diff --git a/packages/types/src/index.ts b/packages/types/src/index.ts
index a4d07e3a8..24c921943 100644
--- a/packages/types/src/index.ts
+++ b/packages/types/src/index.ts
@@ -14,7 +14,7 @@ export {
type OntimeEvent,
type PlayableEvent,
type TimeField,
- SupportedEntry as SupportedEntry,
+ SupportedEntry,
} from './definitions/core/OntimeEntry.js';
export type { RundownEntries, Rundown, ProjectRundowns } from './definitions/core/Rundown.type.js';
export { TimeStrategy } from './definitions/TimeStrategy.type.js';
diff --git a/turbo.json b/turbo.json
index bbc081411..c88e9c7f6 100644
--- a/turbo.json
+++ b/turbo.json
@@ -46,10 +46,6 @@
"dependsOn": ["build"],
"outputs": ["dist/**"]
},
- "dist-mac:local": {
- "dependsOn": ["build"],
- "outputs": ["dist/**"]
- },
"dist-linux": {
"dependsOn": ["build"],
"outputs": ["dist/**"]