Skip to content

Commit e028a44

Browse files
authored
Merge pull request #157 from dainst/editor_name_prompt
Add editor name prompt on startup
2 parents 07f7729 + 45f6d2f commit e028a44

29 files changed

+432
-59
lines changed

desktop/src/app/components/app.component.ts

+33
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { ChangeDetectorRef, Component } from '@angular/core';
22
import { Event, NavigationStart, Router } from '@angular/router';
3+
import { NgbModal, NgbModalRef } from '@ng-bootstrap/ng-bootstrap';
34
import { I18n } from '@ngx-translate/i18n-polyfill';
45
import { Messages } from './messages/messages';
56
import { SettingsService } from '../services/settings/settings-service';
@@ -10,6 +11,9 @@ import { UtilTranslations } from '../util/util-translations';
1011
import { AppController } from '../services/app-controller';
1112
import { ImageUrlMaker } from '../services/imagestore/image-url-maker';
1213
import { ConfigurationChangeNotifications } from './configuration/notifications/configuration-change-notifications';
14+
import { UpdateUsernameModalComponent } from './settings/update-username-modal.component';
15+
import { MenuContext } from '../services/menu-context';
16+
import { Menus } from '../services/menus';
1317

1418
const remote = typeof window !== 'undefined' ? window.require('@electron/remote') : undefined;
1519
const ipcRenderer = typeof window !== 'undefined' ? window.require('electron').ipcRenderer : undefined;
@@ -34,6 +38,8 @@ export class AppComponent {
3438
configurationChangeNotifications: ConfigurationChangeNotifications,
3539
imageUrlMaker: ImageUrlMaker,
3640
settingsService: SettingsService,
41+
private menus: Menus,
42+
private modalService: NgbModal,
3743
private messages: Messages,
3844
private i18n: I18n,
3945
private utilTranslations: UtilTranslations,
@@ -61,6 +67,10 @@ export class AppComponent {
6167
AppComponent.preventDefaultDragAndDropBehavior();
6268
this.initializeUtilTranslations();
6369
this.listenToSettingsChangesFromMenu();
70+
71+
if (!Settings.hasUsername(settingsProvider.getSettings())) {
72+
this.openUpdateUsernameModal(true);
73+
}
6474
}
6575

6676

@@ -131,4 +141,27 @@ export class AppComponent {
131141
document.addEventListener('dragover', event => event.preventDefault());
132142
document.addEventListener('drop', event => event.preventDefault());
133143
}
144+
145+
146+
public async openUpdateUsernameModal(welcomeMode: boolean = false) {
147+
148+
const menuContext: MenuContext = this.menus.getContext();
149+
this.menus.setContext(
150+
menuContext === MenuContext.CONFIGURATION
151+
? MenuContext.CONFIGURATION_MODAL
152+
: MenuContext.MODAL
153+
);
154+
155+
try {
156+
const modalRef: NgbModalRef = this.modalService.open(
157+
UpdateUsernameModalComponent, { animation: false, backdrop: 'static', keyboard: false }
158+
);
159+
modalRef.componentInstance.welcomeMode = welcomeMode;
160+
await modalRef.result;
161+
} catch (_) {
162+
// Modal has been canceled
163+
} finally {
164+
this.menus.setContext(menuContext);
165+
}
166+
}
134167
}

desktop/src/app/components/app.module.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ registerLocaleData(localeUk, 'uk');
102102
TaskbarSyncStatusComponent,
103103
TaskbarUpdateComponent,
104104
ProjectsComponent,
105-
HelpComponent,
105+
HelpComponent
106106
],
107107
providers: [
108108
Modals,

desktop/src/app/components/messages/m.ts

+11-1
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ export class M extends MD { // = Messages Dictionary. For reasons of brevity of
2828
// Settings Package
2929
public static SETTINGS_SUCCESS = 'settings.success';
3030
public static SETTINGS_ERROR_MALFORMED_ADDRESS = 'settings.error.malformedAddress';
31+
public static SETTINGS_ERROR_MISSING_USERNAME = 'settings.error.missingUsername';
3132

3233
// Projects Package
3334
public static PROJECTS_DELETE_SUCCESS = 'projects.deleteSuccess';
@@ -319,7 +320,16 @@ export class M extends MD { // = Messages Dictionary. For reasons of brevity of
319320
this.msgs[M.SETTINGS_ERROR_MALFORMED_ADDRESS] = {
320321
content: i18n({
321322
id: 'messages.settings.error.malformedAddress',
322-
value: 'Die angegebene Serveradresse entspricht nicht dem angegebenen Format.'
323+
value: 'Bitte geben Sie als Adresse eine gültige URL ein.'
324+
}),
325+
level: 'danger',
326+
params: [],
327+
hidden: false
328+
};
329+
this.msgs[M.SETTINGS_ERROR_MISSING_USERNAME] = {
330+
content: i18n({
331+
id: 'messages.settings.error.missingUsername',
332+
value: 'Bitte geben Sie Ihren Namen im Feld "Name des Bearbeiters/der Bearbeiterin" ein.'
323333
}),
324334
level: 'danger',
325335
params: [],

desktop/src/app/components/navbar/navbar.scss

+9-5
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ $border-radius: 4px;
1111
.navbar {
1212
-webkit-app-region: drag;
1313
padding: 0 10px;
14-
height: 45px;
14+
height: $navbar-height;
1515

1616
.nav-item {
1717
-webkit-app-region: no-drag;
@@ -87,6 +87,7 @@ $border-radius: 4px;
8787
border-top-left-radius: $border-radius;
8888
border-top-right-radius: $border-radius;
8989
position: relative;
90+
height: $navbar-height - 3px;
9091

9192
&:before,
9293
&:after {
@@ -111,8 +112,10 @@ $border-radius: 4px;
111112
}
112113

113114
.mdi-home {
115+
position: relative;
116+
top: 1px;
114117
font-size: 22px;
115-
line-height: 22px;
118+
line-height: 25px;
116119

117120
&:hover {
118121
color: inherit;
@@ -199,11 +202,12 @@ $border-radius: 4px;
199202
}
200203

201204
a.nav-link {
202-
height: $navbar-height - 3px;
203205
padding-right: 9px !important;
204206

205207
.closable-tab-label {
206208
display: inline-block;
209+
position: relative;
210+
top: 1px;
207211
margin-left: 5px;
208212
margin-right: 5px;
209213
max-width: 425px;
@@ -214,7 +218,7 @@ $border-radius: 4px;
214218

215219
.mdi-close {
216220
position: relative;
217-
top: -7px;
221+
top: -6px;
218222
border-radius: 5px;
219223
padding-left: 1px;
220224
width: 16px;
@@ -223,7 +227,7 @@ $border-radius: 4px;
223227
category-icon {
224228
position: relative;
225229
left: -4px;
226-
top: -6px;
230+
top: -5px;
227231
}
228232
}
229233
}

desktop/src/app/components/navbar/projects.component.ts

+14-3
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { Component, OnInit } from '@angular/core';
22
import { Labels } from 'idai-field-core';
33
import { ProjectModalLauncher } from '../../services/project-modal-launcher';
44
import { SettingsProvider } from '../../services/settings/settings-provider';
5+
import { AppComponent } from '../app.component';
56

67

78
@Component({
@@ -15,15 +16,25 @@ import { SettingsProvider } from '../../services/settings/settings-provider';
1516
export class ProjectsComponent implements OnInit {
1617

1718
public selectedProject: string;
19+
public username: string;
1820

1921

2022
constructor(private settingsProvider: SettingsProvider,
2123
private projectModalLauncher: ProjectModalLauncher,
22-
private labels: Labels) {}
24+
private appComponent: AppComponent,
25+
private labels: Labels) {
26+
27+
this.username = this.settingsProvider.getSettings().username;
28+
this.settingsProvider.settingsChangesNotifications().subscribe((settings) => {
29+
this.username = settings.username;
30+
});
31+
}
2332

2433

2534
public openModal = () => this.projectModalLauncher.editProject();
2635

36+
public openUsernameModal = () => this.appComponent.openUpdateUsernameModal();
37+
2738

2839
ngOnInit() {
2940

@@ -33,8 +44,8 @@ export class ProjectsComponent implements OnInit {
3344

3445
public getProjectName(): string {
3546

36-
return this.labels.getFromI18NString(
47+
return this.labels.getFromI18NString(
3748
this.settingsProvider.getSettings().projectNames[this.selectedProject]
3849
) ?? this.selectedProject;
39-
}
50+
}
4051
}
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,11 @@
1-
<a id="projects-badge" class="nav-link px-1" type="button" (click)="openModal()">
2-
{{getProjectName()}}
3-
</a>
1+
<div id="projects-badge"
2+
class="nav-link"
3+
(click)="openModal()">
4+
{{getProjectName()}}
5+
</div>
6+
7+
<div id="username"
8+
class="nav-link"
9+
(click)="openUsernameModal()">
10+
{{username}}
11+
</div>
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,27 @@
1-
#projects-badge {
2-
padding: 0.5em !important;
3-
max-width: 400px;
1+
#projects-badge,
2+
#username {
3+
position: relative;
4+
max-width: 300px;
5+
padding: 0 !important;
46
white-space: nowrap;
57
overflow: hidden;
68
text-overflow: ellipsis;
9+
text-align: right;
710

811
&:hover {
912
color: #777;
1013
}
1114
}
15+
16+
#projects-badge {
17+
top: 2px;
18+
font-size: 14px;
19+
font-weight: 600;
20+
line-height: 18px;
21+
}
22+
23+
#username {
24+
top: 3px;
25+
font-size: 13px;
26+
line-height: 16px;
27+
}

desktop/src/app/components/navbar/taskbar.html

+4-3
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,14 @@
77
<taskbar-conflicts></taskbar-conflicts>
88
</li>
99

10+
<li id="editor" class="nav-item pr-2">
11+
</li>
12+
1013
<li *ngIf="showSyncStatus()" class="nav-item pr-2">
1114
<taskbar-sync-status></taskbar-sync-status>
1215
</li>
1316

14-
<li class="nav-item">
17+
<li class="nav-item projects-nav-item">
1518
<projects></projects>
1619
</li>
1720
</ul>
18-
19-

desktop/src/app/components/navbar/taskbar.scss

+4
Original file line numberDiff line numberDiff line change
@@ -58,4 +58,8 @@
5858
top: 22px;
5959
right: 0;
6060
}
61+
62+
.projects-nav-item {
63+
margin-left: 5px;
64+
}
6165
}

desktop/src/app/components/project/synchronization-modal.component.ts

+12-3
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@ import { Settings } from '../../services/settings/settings';
77
import { SyncTarget } from '../../services/settings/sync-target';
88
import { SettingsProvider } from '../../services/settings/settings-provider';
99
import { SettingsService } from '../../services/settings/settings-service';
10+
import { Messages } from '../messages/messages';
11+
import { M } from '../messages/m';
12+
import { SettingsErrors } from '../../services/settings/settings-errors';
1013

1114

1215
const CREDENTIALS_TIMER_INTERVAL: number = 500;
@@ -44,7 +47,8 @@ export class SynchronizationModalComponent implements OnInit {
4447
private remoteImageStore: RemoteImageStore,
4548
private settingsProvider: SettingsProvider,
4649
private settingsService: SettingsService,
47-
private decimalPipe: DecimalPipe) {}
50+
private decimalPipe: DecimalPipe,
51+
private messages: Messages) {}
4852

4953

5054
async ngOnInit() {
@@ -210,9 +214,14 @@ export class SynchronizationModalComponent implements OnInit {
210214
public async apply() {
211215

212216
try {
213-
this.settings = await this.settingsService.updateSettings(this.settings);
217+
this.settings = await this.settingsService.updateSettings(this.settings, 'synchronization');
214218
} catch (err) {
215-
return console.error(err);
219+
if (err === SettingsErrors.MALFORMED_ADDRESS) {
220+
this.messages.add([M.SETTINGS_ERROR_MALFORMED_ADDRESS]);
221+
} else {
222+
console.error(err);
223+
}
224+
return;
216225
}
217226

218227
this.syncTarget = this.settings.syncTargets[this.settings.selectedProject];

desktop/src/app/components/settings/settings.component.ts

+7-2
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import { SettingsProvider } from '../../services/settings/settings-provider';
99
import { SettingsService } from '../../services/settings/settings-service';
1010
import { Menus } from '../../services/menus';
1111
import { MenuContext } from '../../services/menu-context';
12+
import { SettingsErrors } from '../../services/settings/settings-errors';
1213

1314
const address = typeof window !== 'undefined' ? window.require('address') : require('address');
1415
const remote = typeof window !== 'undefined' ? window.require('@electron/remote') : undefined;
@@ -97,10 +98,14 @@ export class SettingsComponent implements OnInit, AfterViewChecked {
9798
= !equal(this.settings.languages)(this.settingsProvider.getSettings().languages);
9899

99100
try {
100-
await this.settingsService.updateSettings(this.settings);
101+
await this.settingsService.updateSettings(this.settings, 'settings');
101102
} catch (err) {
102103
this.saving = false;
103-
this.messages.add([M.SETTINGS_ERROR_MALFORMED_ADDRESS]);
104+
if (err === SettingsErrors.MISSING_USERNAME) {
105+
this.messages.add([M.SETTINGS_ERROR_MISSING_USERNAME]);
106+
} else {
107+
console.error(err);
108+
}
104109
return;
105110
}
106111

desktop/src/app/components/settings/settings.html

+1-6
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ <h5 i18n="@@settings.general">Allgemeine Einstellungen</h5>
3535
<label class="control-label col-form-label"
3636
for="username-input"
3737
i18n="@@settings.userName">
38-
Name des Bearbeiters/der Bearbeiterin
38+
Name der Benutzerin/des Benutzers
3939
</label>
4040
<input id="username-input"
4141
[ngModel]="settings.username"
@@ -46,11 +46,6 @@ <h5 i18n="@@settings.general">Allgemeine Einstellungen</h5>
4646
<div class="small-info-text" i18n="@@settings.userName.info">
4747
Dieser Name wird in der Bearbeitungshistorie gespeichert,
4848
damit Änderungen an Datensätzen einer Person zugeordnet werden können.
49-
Diese Einstellung ist sehr <b>wichtig</b> bei der Datenbanksynchronisation,
50-
sowohl zwischen Nutzern bzw. Nutzerinnen als auch zum Field-Server, da das System
51-
so eventuelle Konflikte besser zuordnen und lösen kann. Sie sollte also in jedem Fall
52-
vor Inbetriebnahme gesetzt werden. Empfohlen wird, den vollen Namen des aktuellen
53-
Datenbanknutzers bzw. der Datenbanknutzerin einzutragen.
5449
</div>
5550

5651
<hr>

desktop/src/app/components/settings/settings.module.ts

+4-1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ import { WidgetsModule } from '../widgets/widgets.module';
77
import { SettingsComponent } from './settings.component';
88
import { LanguageSettingsComponent } from './language-settings.component';
99
import { LanguagePickerModalComponent } from '../widgets/languages/language-picker-modal.component';
10+
import { UpdateUsernameModalComponent } from './update-username-modal.component';
11+
1012

1113

1214
@NgModule({
@@ -20,7 +22,8 @@ import { LanguagePickerModalComponent } from '../widgets/languages/language-pick
2022
declarations: [
2123
SettingsComponent,
2224
LanguageSettingsComponent,
23-
LanguagePickerModalComponent
25+
LanguagePickerModalComponent,
26+
UpdateUsernameModalComponent
2427
],
2528
providers: [],
2629
entryComponents: [

desktop/src/app/components/settings/settings.scss

+1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
*/
55

66
@import 'language-settings';
7+
@import 'update-username-modal';
78

89
.settings {
910
#save-settings-button:active,

0 commit comments

Comments
 (0)