Skip to content

Commit d3d5a17

Browse files
authored
Merge pull request #885 from dreamteamprod/dev
Release 0.25.0
2 parents 84e824f + 7fb6eb6 commit d3d5a17

150 files changed

Lines changed: 20043 additions & 4240 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/nodelint.yml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ jobs:
1111
run:
1212
working-directory: ./client
1313
steps:
14-
- uses: actions/checkout@v3
15-
- uses: actions/setup-node@v3
14+
- uses: actions/checkout@v4
15+
- uses: actions/setup-node@v4
1616
with:
1717
node-version: 24
1818
- run: npm ci
@@ -23,8 +23,8 @@ jobs:
2323
run:
2424
working-directory: ./electron
2525
steps:
26-
- uses: actions/checkout@v3
27-
- uses: actions/setup-node@v3
26+
- uses: actions/checkout@v4
27+
- uses: actions/setup-node@v4
2828
with:
2929
node-version: 24
3030
- run: npm ci

.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
CLAUDE.md
44
.idea/
55
.playwright-mcp/
6-
PLAN.md
6+
plans/
77

88
# Gradle and Maven with auto-import
99
# When using Gradle or Maven with auto-import, you should exclude module files,

client/package-lock.json

Lines changed: 862 additions & 950 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

client/package.json

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "client",
3-
"version": "0.24.2",
3+
"version": "0.25.0",
44
"description": "DigiScript front end",
55
"author": "DreamTeamProd",
66
"private": true,
@@ -30,17 +30,18 @@
3030
"bootstrap-vue": "2.23.1",
3131
"bootswatch": "4.6.2",
3232
"contrast-color": "1.0.1",
33-
"core-js": "3.48.0",
33+
"core-js": "3.49.0",
3434
"d3-hierarchy": "^3.1.2",
3535
"d3-selection": "^3.0.0",
3636
"d3-zoom": "^3.0.0",
3737
"deep-object-diff": "1.1.9",
38-
"dompurify": "3.3.1",
39-
"fuse.js": "7.1.0",
38+
"dompurify": "3.4.1",
39+
"fuse.js": "7.3.0",
4040
"jquery": "3.7.1",
41-
"lodash": "4.17.23",
41+
"lodash": "4.18.1",
4242
"loglevel": "1.9.2",
4343
"marked": "11.2.0",
44+
"splitpanes": "^2.4.1",
4445
"vue": "2.7.14",
4546
"vue-multiselect": "2.1.9",
4647
"vue-native-websocket": "2.0.15",
@@ -51,24 +52,24 @@
5152
"vuex-persistedstate": "3.2.1"
5253
},
5354
"devDependencies": {
54-
"@babel/core": "7.28.6",
55+
"@babel/core": "7.29.0",
5556
"@babel/eslint-parser": "7.28.6",
56-
"@babel/preset-env": "7.28.6",
57+
"@babel/preset-env": "7.29.2",
5758
"@eslint/js": "^9.39.2",
5859
"@types/vuelidate": "^0.7.22",
5960
"@vitejs/plugin-vue2": "2.3.4",
60-
"@vitest/ui": "^4.0.18",
61-
"@vue/test-utils": "^2.4.6",
61+
"@vitest/ui": "^4.1.5",
62+
"@vue/test-utils": "^2.4.8",
6263
"eslint": "^9.39.2",
6364
"eslint-config-prettier": "^10.1.8",
6465
"eslint-plugin-prettier": "^5.5.5",
6566
"eslint-plugin-vue": "^9.33.0",
6667
"globals": "^15.14.0",
6768
"jsdom": "^27.4.0",
68-
"prettier": "^3.8.1",
69-
"sass": "1.97.3",
69+
"prettier": "^3.8.3",
70+
"sass": "1.99.0",
7071
"vite": "^7.3.1",
71-
"vitest": "^4.0.18"
72+
"vitest": "^4.1.5"
7273
},
7374
"browserslist": [
7475
"> 1%",

client/src/App.vue

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,17 @@
6060
>
6161
Jump To Page
6262
</b-dropdown-item>
63+
<b-dropdown-item-btn
64+
:disabled="
65+
CURRENT_SHOW_SESSION == null ||
66+
!WEBSOCKET_HEALTHY ||
67+
stoppingSession ||
68+
startingSession
69+
"
70+
@click.stop.prevent="SET_STAGE_MANAGER_MODE(!STAGE_MANAGER_MODE)"
71+
>
72+
{{ STAGE_MANAGER_MODE ? 'Disable' : 'Enable' }} Stage Manager
73+
</b-dropdown-item-btn>
6374
</b-nav-item-dropdown>
6475
</template>
6576
<b-nav-item
@@ -162,7 +173,7 @@
162173
</template>
163174

164175
<script>
165-
import { mapGetters, mapActions } from 'vuex';
176+
import { mapGetters, mapActions, mapMutations } from 'vuex';
166177
import log from 'loglevel';
167178
import CreateUser from '@/vue_components/user/CreateUser.vue';
168179
import { makeURL } from '@/js/utils';
@@ -227,6 +238,7 @@ export default {
227238
'IS_SCRIPT_EDITOR',
228239
'IS_CUE_READER',
229240
'IS_CUE_EDITOR',
241+
'STAGE_MANAGER_MODE',
230242
]),
231243
},
232244
async created() {
@@ -285,6 +297,7 @@ export default {
285297
'CHECK_WEBSOCKET_STATE',
286298
'GET_USER_SETTINGS',
287299
]),
300+
...mapMutations(['SET_STAGE_MANAGER_MODE']),
288301
isElectron,
289302
async switchServer() {
290303
// Clear the active connection and disconnect WebSocket
@@ -311,19 +324,15 @@ export default {
311324
async awaitWSConnect() {
312325
if (this.WEBSOCKET_HEALTHY) {
313326
clearTimeout(this.loadTimer);
314-
await this.GET_RBAC_ROLES();
315327
316-
// Check WebSocket state for any pending operations
317-
if (this.WEBSOCKET_HAS_PENDING_OPERATIONS) {
318-
await this.CHECK_WEBSOCKET_STATE();
319-
}
328+
await Promise.all([
329+
this.GET_RBAC_ROLES(),
330+
this.WEBSOCKET_HAS_PENDING_OPERATIONS ? this.CHECK_WEBSOCKET_STATE() : Promise.resolve(),
331+
]);
320332
321-
// Check for authentication via token first
322333
if (this.AUTH_TOKEN) {
323-
// Then get user data
324334
await this.GET_CURRENT_USER();
325-
await this.GET_CURRENT_RBAC();
326-
await this.GET_USER_SETTINGS();
335+
await Promise.all([this.GET_CURRENT_RBAC(), this.GET_USER_SETTINGS()]);
327336
}
328337
329338
if (this.SETTINGS.current_show != null) {

client/src/assets/styles/dark.scss

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,11 @@
1010
:root {
1111
--body-background: #{$body-bg};
1212
}
13+
14+
.splitpanes {
15+
background: inherit !important;
16+
}
17+
18+
.splitpanes__pane {
19+
background: inherit !important;
20+
}
Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
/**
2+
* Shared styles for timeline visualization components (MicTimeline, StageTimeline).
3+
*
4+
* Usage: Import in Vue component <style> block:
5+
* @use '@/assets/styles/timeline';
6+
*
7+
* Then apply the container class to your root element:
8+
* <div class="timeline-container">
9+
*/
10+
11+
.timeline-container {
12+
position: relative;
13+
background-color: var(--body-background);
14+
border: 1px solid #dee2e6;
15+
border-radius: 0.25rem;
16+
overflow: hidden;
17+
min-height: 400px;
18+
height: calc(100vh - 200px);
19+
}
20+
21+
.timeline-wrapper {
22+
position: relative;
23+
width: 100%;
24+
height: 100%;
25+
display: flex;
26+
flex-direction: column;
27+
}
28+
29+
.timeline-controls-bar {
30+
display: flex;
31+
justify-content: space-between;
32+
align-items: center;
33+
padding: 10px;
34+
background-color: rgba(52, 58, 64, 0.95);
35+
border-bottom: 1px solid #6c757d;
36+
z-index: 10;
37+
flex-shrink: 0;
38+
}
39+
40+
.svg-container {
41+
flex: 1;
42+
overflow: auto;
43+
position: relative;
44+
min-height: 0;
45+
}
46+
47+
.timeline-svg {
48+
display: block;
49+
background-color: var(--body-background);
50+
}
51+
52+
// Scene dividers (vertical lines)
53+
.scene-divider {
54+
stroke: #6c757d;
55+
stroke-width: 1;
56+
opacity: 0.6;
57+
shape-rendering: crispEdges;
58+
}
59+
60+
// Act labels
61+
.act-header {
62+
fill: #343a40;
63+
stroke: #6c757d;
64+
stroke-width: 1px;
65+
}
66+
67+
.act-label {
68+
fill: #dee2e6;
69+
font-size: 14px;
70+
font-weight: 600;
71+
pointer-events: none;
72+
user-select: none;
73+
}
74+
75+
// Scene labels
76+
.scene-label {
77+
fill: #adb5bd;
78+
font-size: 11px;
79+
pointer-events: none;
80+
user-select: none;
81+
}
82+
83+
// Row labels
84+
.row-label {
85+
fill: #dee2e6;
86+
font-size: 12px;
87+
font-weight: 500;
88+
pointer-events: none;
89+
user-select: none;
90+
}
91+
92+
// Row separators (horizontal lines)
93+
.row-separator {
94+
stroke: #6c757d;
95+
stroke-width: 1px;
96+
opacity: 0.5;
97+
}
98+
99+
// Allocation bars
100+
.allocation-bar {
101+
stroke: #212529;
102+
stroke-width: 1px;
103+
cursor: pointer;
104+
transition:
105+
opacity 0.2s ease,
106+
stroke-width 0.2s ease;
107+
108+
&:hover {
109+
opacity: 0.8;
110+
stroke-width: 2px;
111+
stroke: #fff;
112+
}
113+
}
114+
115+
.bar-label {
116+
fill: #fff;
117+
font-size: 12px;
118+
font-weight: 600;
119+
text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.8);
120+
user-select: none;
121+
}

0 commit comments

Comments
 (0)