Skip to content

Commit 8d386bd

Browse files
committed
Add desktop settings page accessible via menu
1 parent b48fe03 commit 8d386bd

13 files changed

+277
-75
lines changed

electron/index.js

+5-4
Original file line numberDiff line numberDiff line change
@@ -101,15 +101,16 @@ function doCreateWindow(url) {
101101
// showInspectElement: false
102102
});
103103

104-
const menu = Menu.buildFromTemplate(mainMenu(mainWindow));
105-
Menu.setApplicationMenu(menu)
106-
107104
// Load the UI from the dev version beign served by `ng serve`
108105
if (isDev()) {
109106
url = '127.0.0.1:4200'
110107
}
108+
url = `https://${url}`
109+
110+
const menu = Menu.buildFromTemplate(mainMenu(mainWindow, url));
111+
Menu.setApplicationMenu(menu)
111112

112-
mainWindow.loadURL(`https://${url}`);
113+
mainWindow.loadURL(url);
113114

114115
// Open the DevTools.
115116
//mainWindow.webContents.openDevTools({mode:'undocked'});

electron/menu.js

+156-70
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,30 @@
1-
const { app, Menu, BrowserWindow } = require('electron')
1+
const {
2+
app,
3+
Menu,
4+
BrowserWindow
5+
} = require('electron')
26

37
const isMac = process.platform === 'darwin'
48

59
let appMainWindow;
10+
let appHomeUrl;
611

7-
function getMenu(mainWindow) {
12+
function getMenu(mainWindow, homeUrl) {
813
appMainWindow = mainWindow;
14+
appHomeUrl = homeUrl
915
return template;
1016
}
1117

1218
function about() {
1319
let child = new BrowserWindow({
14-
parent: appMainWindow,
15-
modal: true,
16-
width:300, height:300,
17-
webPreferences: {
18-
enableRemoteModule: true,
19-
nodeIntegration: true
20-
}
20+
parent: appMainWindow,
21+
modal: true,
22+
width: 300,
23+
height: 300,
24+
webPreferences: {
25+
enableRemoteModule: true,
26+
nodeIntegration: true
27+
}
2128
});
2229
child.loadFile('about.html');
2330
}
@@ -26,100 +33,179 @@ const template = [
2633
// { role: 'appMenu' }
2734
...(isMac ? [{
2835
label: 'Stratos',
29-
submenu: [
30-
{ label: 'About Stratos', click: function() {
31-
about();
32-
console.log('about');
33-
} },
34-
{ type: 'separator' },
35-
{ role: 'services' },
36-
{ type: 'separator' },
37-
{ role: 'hide' },
38-
{ role: 'hideothers' },
39-
{ role: 'unhide' },
40-
{ type: 'separator' },
41-
{ role: 'quit' }
36+
submenu: [{
37+
label: 'About Stratos',
38+
click: function () {
39+
about();
40+
console.log('about');
41+
}
42+
},
43+
{
44+
type: 'separator'
45+
},
46+
{
47+
role: 'services'
48+
},
49+
{
50+
type: 'separator'
51+
},
52+
{
53+
role: 'hide'
54+
},
55+
{
56+
role: 'hideothers'
57+
},
58+
{
59+
role: 'unhide'
60+
},
61+
{
62+
type: 'separator'
63+
},
64+
{
65+
role: 'quit'
66+
}
4267
]
4368
}] : []),
4469
// { role: 'fileMenu' }
4570
{
4671
label: 'File',
4772
submenu: [
48-
isMac ? { role: 'close' } : { role: 'quit' }
73+
isMac ? {
74+
role: 'close'
75+
} : {
76+
role: 'quit'
77+
}
4978
]
5079
},
5180
// { role: 'editMenu' }
5281
{
5382
label: 'Edit',
54-
submenu: [
55-
{ role: 'undo' },
56-
{ role: 'redo' },
57-
{ type: 'separator' },
58-
{ role: 'cut' },
59-
{ role: 'copy' },
60-
{ role: 'paste' },
61-
...(isMac ? [
62-
{ role: 'pasteAndMatchStyle' },
63-
{ role: 'delete' },
64-
{ role: 'selectAll' },
65-
{ type: 'separator' },
83+
submenu: [{
84+
role: 'undo'
85+
},
86+
{
87+
role: 'redo'
88+
},
89+
{
90+
type: 'separator'
91+
},
92+
{
93+
role: 'cut'
94+
},
95+
{
96+
role: 'copy'
97+
},
98+
{
99+
role: 'paste'
100+
},
101+
...(isMac ? [{
102+
role: 'pasteAndMatchStyle'
103+
},
104+
{
105+
role: 'delete'
106+
},
107+
{
108+
role: 'selectAll'
109+
},
110+
{
111+
type: 'separator'
112+
},
66113
// {
67114
// label: 'Speech',
68115
// submenu: [
69116
// { role: 'startspeaking' },
70117
// { role: 'stopspeaking' }
71118
// ]
72119
// }
73-
] : [
74-
{ role: 'delete' },
75-
{ type: 'separator' },
76-
{ role: 'selectAll' }
77-
])
120+
] : [{
121+
role: 'delete'
122+
},
123+
{
124+
type: 'separator'
125+
},
126+
{
127+
role: 'selectAll'
128+
}
129+
]),
130+
{
131+
label: 'Settings',
132+
click(menuItem, browserWindow, event) {
133+
const url = `${appHomeUrl}/desktop-settings`
134+
browserWindow.loadURL(url)
135+
}
136+
}
78137
]
79138
},
80139
// { role: 'viewMenu' }
81140
{
82141
label: 'View',
83-
submenu: [
84-
{ role: 'reload' },
85-
{ role: 'forcereload' },
86-
{ role: 'toggledevtools' },
87-
{ type: 'separator' },
88-
{ role: 'resetzoom' },
89-
{ role: 'zoomin' },
90-
{ role: 'zoomout' },
91-
{ type: 'separator' },
92-
{ role: 'togglefullscreen' }
142+
submenu: [{
143+
role: 'reload'
144+
},
145+
{
146+
role: 'forcereload'
147+
},
148+
{
149+
role: 'toggledevtools'
150+
},
151+
{
152+
type: 'separator'
153+
},
154+
{
155+
role: 'resetzoom'
156+
},
157+
{
158+
role: 'zoomin'
159+
},
160+
{
161+
role: 'zoomout'
162+
},
163+
{
164+
type: 'separator'
165+
},
166+
{
167+
role: 'togglefullscreen'
168+
}
93169
]
94170
},
95171
// { role: 'windowMenu' }
96172
{
97173
label: 'Window',
98-
submenu: [
99-
{ role: 'minimize' },
100-
{ role: 'zoom' },
101-
...(isMac ? [
102-
{ type: 'separator' },
103-
{ role: 'front' },
104-
{ type: 'separator' },
105-
{ role: 'window' }
106-
] : [
107-
{ role: 'close' }
108-
])
174+
submenu: [{
175+
role: 'minimize'
176+
},
177+
{
178+
role: 'zoom'
179+
},
180+
...(isMac ? [{
181+
type: 'separator'
182+
},
183+
{
184+
role: 'front'
185+
},
186+
{
187+
type: 'separator'
188+
},
189+
{
190+
role: 'window'
191+
}
192+
] : [{
193+
role: 'close'
194+
}])
109195
]
110196
},
111197
{
112198
role: 'help',
113-
submenu: [
114-
{
115-
label: 'Learn More',
116-
click: async () => {
117-
const { shell } = require('electron')
118-
await shell.openExternal('https://electronjs.org')
119-
}
199+
submenu: [{
200+
label: 'Learn More',
201+
click: async () => {
202+
const {
203+
shell
204+
} = require('electron')
205+
await shell.openExternal('https://electronjs.org')
120206
}
121-
]
207+
}]
122208
}
123209
]
124210

125-
module.exports = getMenu;
211+
module.exports = getMenu;

src/frontend/packages/desktop-extensions/package.json

+1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
"loadingCss": "loader/loading.css",
77
"loadingHtml": "loader/loading.html"
88
},
9+
"routingModule": "DesktopRoutingModule",
910
"theming": "sass/_all-theme#apply-theme-desktop-extensions"
1011
},
1112
"peerDependencies": {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import { NgModule } from '@angular/core';
2+
import { RouterModule, Routes } from '@angular/router';
3+
4+
const customRoutes: Routes = [
5+
{
6+
path: 'desktop-settings',
7+
loadChildren: () => import('./settings/settings.module').then(m => m.DesktopSettingsModule),
8+
data: {
9+
stratosNavigationPage: true
10+
},
11+
},
12+
]
13+
14+
@NgModule({
15+
imports: [
16+
RouterModule.forRoot(customRoutes),
17+
],
18+
declarations: []
19+
})
20+
export class DesktopRoutingModule { }
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
2+
export * from './desktop-routing.module';
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
<app-page-header>
2+
<h1>Settings</h1>
3+
</app-page-header>
4+
<div class="desktop-settings">
5+
<mat-card>
6+
<app-profile-settings [show]="settings"></app-profile-settings>
7+
</mat-card>
8+
</div>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
.desktop-settings {
2+
align-items: center;
3+
display: flex;
4+
justify-content: center;
5+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
2+
3+
import { DesktopSettingsComponent } from './desktop-settings.component';
4+
5+
describe('DesktopSettingsComponent', () => {
6+
let component: DesktopSettingsComponent;
7+
let fixture: ComponentFixture<DesktopSettingsComponent>;
8+
9+
beforeEach(async(() => {
10+
TestBed.configureTestingModule({
11+
declarations: [ DesktopSettingsComponent ]
12+
})
13+
.compileComponents();
14+
}));
15+
16+
beforeEach(() => {
17+
fixture = TestBed.createComponent(DesktopSettingsComponent);
18+
component = fixture.componentInstance;
19+
fixture.detectChanges();
20+
});
21+
22+
it('should create', () => {
23+
expect(component).toBeTruthy();
24+
});
25+
});
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import { Component } from '@angular/core';
2+
import { ProfileSettingsTypes } from '@stratosui/core';
3+
4+
@Component({
5+
selector: 'app-desktop-settings',
6+
templateUrl: './desktop-settings.component.html',
7+
styleUrls: ['./desktop-settings.component.scss']
8+
})
9+
export class DesktopSettingsComponent {
10+
11+
public settings: { [settingName: string]: boolean } = {
12+
[ProfileSettingsTypes.POLLING]: true,
13+
[ProfileSettingsTypes.THEME]: true,
14+
}
15+
16+
}

0 commit comments

Comments
 (0)