|
1 | 1 | <template> |
2 | 2 | <v-app v-if="state === 'success'" class="app"> |
3 | 3 | <EditDialog |
4 | | - v-model="passwordDialog" |
5 | | - save-button-text="Save" |
6 | | - title="Change password" |
7 | | - v-if="user" |
8 | | - event-name="i-user" |
| 4 | + v-model="passwordDialog" |
| 5 | + save-button-text="Save" |
| 6 | + title="Change password" |
| 7 | + v-if="user" |
| 8 | + event-name="i-user" |
9 | 9 | > |
10 | 10 | <template v-slot:form="{ onSave, onError, needSave, needReset }"> |
11 | 11 | <ChangePasswordForm |
12 | | - :project-id="projectId" |
13 | | - :item-id="user.id" |
14 | | - @save="onSave" |
15 | | - @error="onError" |
16 | | - :need-save="needSave" |
17 | | - :need-reset="needReset" |
| 12 | + :project-id="projectId" |
| 13 | + :item-id="user.id" |
| 14 | + @save="onSave" |
| 15 | + @error="onError" |
| 16 | + :need-save="needSave" |
| 17 | + :need-reset="needReset" |
18 | 18 | /> |
19 | 19 | </template> |
20 | 20 | </EditDialog> |
21 | 21 |
|
22 | 22 | <EditDialog |
23 | | - v-model="userDialog" |
24 | | - save-button-text="Save" |
25 | | - title="Edit User" |
26 | | - v-if="user" |
27 | | - event-name="i-user" |
| 23 | + v-model="userDialog" |
| 24 | + save-button-text="Save" |
| 25 | + title="Edit User" |
| 26 | + v-if="user" |
| 27 | + event-name="i-user" |
28 | 28 | > |
29 | 29 | <template v-slot:form="{ onSave, onError, needSave, needReset }"> |
30 | 30 | <UserForm |
31 | | - :project-id="projectId" |
32 | | - :item-id="user.id" |
33 | | - @save="onSave" |
34 | | - @error="onError" |
35 | | - :need-save="needSave" |
36 | | - :need-reset="needReset" |
| 31 | + :project-id="projectId" |
| 32 | + :item-id="user.id" |
| 33 | + @save="onSave" |
| 34 | + @error="onError" |
| 35 | + :need-save="needSave" |
| 36 | + :need-reset="needReset" |
37 | 37 | /> |
38 | 38 | </template> |
39 | 39 | </EditDialog> |
40 | 40 |
|
41 | 41 | <EditDialog |
42 | | - v-model="taskLogDialog" |
43 | | - save-button-text="Delete" |
44 | | - :max-width="1000" |
45 | | - :hide-buttons="true" |
46 | | - @close="onTaskLogDialogClosed()" |
| 42 | + v-model="taskLogDialog" |
| 43 | + save-button-text="Delete" |
| 44 | + :max-width="1000" |
| 45 | + :hide-buttons="true" |
| 46 | + @close="onTaskLogDialogClosed()" |
47 | 47 | > |
48 | 48 | <template v-slot:title={}> |
49 | 49 | <div class="text-truncate" style="max-width: calc(100% - 36px);"> |
50 | 50 | <router-link |
51 | 51 | class="breadcrumbs__item breadcrumbs__item--link" |
52 | 52 | :to="`/project/${projectId}/templates/${template ? template.id : null}`" |
53 | 53 | @click="taskLogDialog = false" |
54 | | - >{{ template ? template.alias : null }}</router-link> |
| 54 | + >{{ template ? template.alias : null }} |
| 55 | + </router-link> |
55 | 56 | <v-icon>mdi-chevron-right</v-icon> |
56 | 57 | <span class="breadcrumbs__item">Task #{{ task ? task.id : null }}</span> |
57 | 58 | </div> |
58 | 59 |
|
59 | 60 | <v-spacer></v-spacer> |
60 | 61 | <v-btn |
61 | | - icon |
62 | | - @click="taskLogDialog = false; onTaskLogDialogClosed()" |
| 62 | + icon |
| 63 | + @click="taskLogDialog = false; onTaskLogDialogClosed()" |
63 | 64 | > |
64 | 65 | <v-icon>mdi-close</v-icon> |
65 | 66 | </v-btn> |
66 | 67 | </template> |
67 | 68 | <template v-slot:form="{}"> |
68 | | - <TaskLogView :project-id="projectId" :item-id="task ? task.id : null" /> |
| 69 | + <TaskLogView :project-id="projectId" :item-id="task ? task.id : null"/> |
69 | 70 | </template> |
70 | 71 | </EditDialog> |
71 | 72 |
|
72 | 73 | <EditDialog |
73 | | - v-model="newProjectDialog" |
74 | | - save-button-text="Create" |
75 | | - title="New Project" |
76 | | - event-name="i-project" |
| 74 | + v-model="newProjectDialog" |
| 75 | + save-button-text="Create" |
| 76 | + title="New Project" |
| 77 | + event-name="i-project" |
77 | 78 | > |
78 | 79 | <template v-slot:form="{ onSave, onError, needSave, needReset }"> |
79 | 80 | <ProjectForm |
80 | | - item-id="new" |
81 | | - @save="onSave" |
82 | | - @error="onError" |
83 | | - :need-save="needSave" |
84 | | - :need-reset="needReset" |
| 81 | + item-id="new" |
| 82 | + @save="onSave" |
| 83 | + @error="onError" |
| 84 | + :need-save="needSave" |
| 85 | + :need-reset="needReset" |
85 | 86 | /> |
86 | 87 | </template> |
87 | 88 | </EditDialog> |
88 | 89 |
|
89 | 90 | <v-snackbar |
90 | | - v-model="snackbar" |
91 | | - :color="snackbarColor" |
92 | | - :timeout="3000" |
93 | | - top |
| 91 | + v-model="snackbar" |
| 92 | + :color="snackbarColor" |
| 93 | + :timeout="3000" |
| 94 | + top |
94 | 95 | > |
95 | 96 | {{ snackbarText }} |
96 | 97 | <v-btn |
97 | | - text |
98 | | - @click="snackbar = false" |
| 98 | + text |
| 99 | + @click="snackbar = false" |
99 | 100 | > |
100 | 101 | Close |
101 | 102 | </v-btn> |
102 | 103 | </v-snackbar> |
103 | 104 |
|
104 | 105 | <v-navigation-drawer |
105 | | - app |
106 | | - dark |
107 | | - color="#005057" |
108 | | - fixed |
109 | | - width="260" |
110 | | - v-model="drawer" |
111 | | - mobile-breakpoint="960" |
112 | | - v-if="$route.path.startsWith('/project/')" |
| 106 | + app |
| 107 | + dark |
| 108 | + color="#005057" |
| 109 | + fixed |
| 110 | + width="260" |
| 111 | + v-model="drawer" |
| 112 | + mobile-breakpoint="960" |
| 113 | + v-if="$route.path.startsWith('/project/')" |
113 | 114 | > |
114 | 115 | <v-menu bottom max-width="235" max-height="100%" v-if="project"> |
115 | 116 | <template v-slot:activator="{ on, attrs }"> |
116 | 117 | <v-list class="pa-0 overflow-y-auto"> |
117 | 118 | <v-list-item |
118 | | - key="project" |
119 | | - class="app__project-selector" |
120 | | - v-bind="attrs" |
121 | | - v-on="on" |
| 119 | + key="project" |
| 120 | + class="app__project-selector" |
| 121 | + v-bind="attrs" |
| 122 | + v-on="on" |
122 | 123 | > |
123 | 124 | <v-list-item-icon> |
124 | 125 | <v-avatar |
125 | | - :color="getProjectColor(project)" |
126 | | - size="24" |
127 | | - style="font-size: 13px; font-weight: bold;" |
| 126 | + :color="getProjectColor(project)" |
| 127 | + size="24" |
| 128 | + style="font-size: 13px; font-weight: bold;" |
128 | 129 | > |
129 | 130 | <span class="white--text">{{ getProjectInitials(project) }}</span> |
130 | 131 | </v-avatar> |
|
144 | 145 | </template> |
145 | 146 | <v-list> |
146 | 147 | <v-list-item |
147 | | - v-for="(item, i) in projects" |
148 | | - :key="i" |
149 | | - :to="`/project/${item.id}`" |
150 | | - @click="selectProject(item.id)" |
| 148 | + v-for="(item, i) in projects" |
| 149 | + :key="i" |
| 150 | + :to="`/project/${item.id}`" |
| 151 | + @click="selectProject(item.id)" |
151 | 152 | > |
152 | 153 | <v-list-item-icon> |
153 | 154 | <v-avatar |
154 | | - :color="getProjectColor(item)" |
155 | | - size="24" |
156 | | - style="font-size: 13px; font-weight: bold;" |
| 155 | + :color="getProjectColor(item)" |
| 156 | + size="24" |
| 157 | + style="font-size: 13px; font-weight: bold;" |
157 | 158 | > |
158 | 159 | <span class="white--text">{{ getProjectInitials(item) }}</span> |
159 | 160 | </v-avatar> |
|
196 | 197 | </v-list-item-content> |
197 | 198 | </v-list-item> |
198 | 199 |
|
199 | | - <v-list-item key="templates" :to="`/project/${projectId}/templates`"> |
| 200 | + <v-list-item key="templates" :to="templatesUrl"> |
200 | 201 | <v-list-item-icon> |
201 | 202 | <v-icon>mdi-check-all</v-icon> |
202 | 203 | </v-list-item-icon> |
|
262 | 263 | <template v-slot:activator="{ on, attrs }"> |
263 | 264 | <v-list class="pa-0"> |
264 | 265 | <v-list-item |
265 | | - key="project" |
266 | | - v-bind="attrs" |
267 | | - v-on="on" |
| 266 | + key="project" |
| 267 | + v-bind="attrs" |
| 268 | + v-on="on" |
268 | 269 | > |
269 | 270 | <v-list-item-icon> |
270 | 271 | <v-icon>mdi-account</v-icon> |
|
330 | 331 | <v-app v-else-if="state === 'loading'"> |
331 | 332 | <v-main> |
332 | 333 | <v-container |
333 | | - fluid |
334 | | - fill-height |
335 | | - align-center |
336 | | - justify-center |
337 | | - class="pa-0" |
| 334 | + fluid |
| 335 | + fill-height |
| 336 | + align-center |
| 337 | + justify-center |
| 338 | + class="pa-0" |
338 | 339 | > |
339 | 340 | <v-progress-circular |
340 | | - :size="70" |
341 | | - color="primary" |
342 | | - indeterminate |
| 341 | + :size="70" |
| 342 | + color="primary" |
| 343 | + indeterminate |
343 | 344 | ></v-progress-circular> |
344 | 345 | </v-container> |
345 | 346 | </v-main> |
346 | 347 | </v-app> |
347 | 348 | <v-app v-else-if="state === 'error'"> |
348 | 349 | <v-main> |
349 | 350 | <v-container |
350 | | - fluid |
351 | | - flex-column |
352 | | - fill-height |
353 | | - align-center |
354 | | - justify-center |
355 | | - class="pa-0 text-center" |
| 351 | + fluid |
| 352 | + flex-column |
| 353 | + fill-height |
| 354 | + align-center |
| 355 | + justify-center |
| 356 | + class="pa-0 text-center" |
356 | 357 | > |
357 | 358 | <v-alert text color="error" class="d-inline-block"> |
358 | 359 | <h3 class="headline"> |
|
383 | 384 | .v-data-table tbody tr.v-data-table__expanded__content { |
384 | 385 | box-shadow: none !important; |
385 | 386 | } |
| 387 | +
|
386 | 388 | .v-data-table a { |
387 | 389 | text-decoration-line: none; |
| 390 | +
|
388 | 391 | &:hover { |
389 | 392 | text-decoration-line: underline; |
390 | 393 | } |
391 | 394 | } |
392 | 395 |
|
393 | 396 | .breadcrumbs__item--link { |
394 | 397 | text-decoration-line: none; |
| 398 | +
|
395 | 399 | &:hover { |
396 | 400 | text-decoration-line: underline; |
397 | 401 | } |
|
403 | 407 |
|
404 | 408 | .app__project-selector { |
405 | 409 | height: 64px; |
| 410 | +
|
406 | 411 | .v-list-item__icon { |
407 | 412 | margin-top: 20px !important; |
408 | 413 | } |
|
432 | 437 |
|
433 | 438 | .v-data-table > .v-data-table__wrapper > table > tbody > tr { |
434 | 439 | background: transparent !important; |
| 440 | +
|
435 | 441 | & > td { |
436 | 442 | white-space: nowrap; |
437 | 443 | } |
| 444 | +
|
438 | 445 | & > td:first-child { |
439 | 446 | //font-weight: bold !important; |
440 | 447 | } |
@@ -525,8 +532,8 @@ export default { |
525 | 532 | watch: { |
526 | 533 | async projects(val) { |
527 | 534 | if (val.length === 0 |
528 | | - && this.$route.path.startsWith('/project/') |
529 | | - && this.$route.path !== '/project/new') { |
| 535 | + && this.$route.path.startsWith('/project/') |
| 536 | + && this.$route.path !== '/project/new') { |
530 | 537 | await this.$router.push({ path: '/project/new' }); |
531 | 538 | } |
532 | 539 | }, |
@@ -555,6 +562,17 @@ export default { |
555 | 562 | isAuthenticated() { |
556 | 563 | return document.cookie.includes('semaphore='); |
557 | 564 | }, |
| 565 | +
|
| 566 | + templatesUrl() { |
| 567 | + let viewId = localStorage.getItem(`project${this.projectId}__lastVisitedViewId`); |
| 568 | + if (viewId) { |
| 569 | + viewId = parseInt(viewId, 10); |
| 570 | + if (!Number.isNaN(viewId)) { |
| 571 | + return `/project/${this.projectId}/views/${viewId}/templates`; |
| 572 | + } |
| 573 | + } |
| 574 | + return `/project/${this.projectId}/templates`; |
| 575 | + }, |
558 | 576 | }, |
559 | 577 |
|
560 | 578 | async created() { |
@@ -704,8 +722,8 @@ export default { |
704 | 722 |
|
705 | 723 | // try to find project and switch to it if URL not pointing to any project |
706 | 724 | if (this.$route.path === '/' |
707 | | - || this.$route.path === '/project' |
708 | | - || (this.$route.path.startsWith('/project/'))) { |
| 725 | + || this.$route.path === '/project' |
| 726 | + || (this.$route.path.startsWith('/project/'))) { |
709 | 727 | await this.trySelectMostSuitableProject(); |
710 | 728 | } |
711 | 729 |
|
@@ -733,7 +751,7 @@ export default { |
733 | 751 | } |
734 | 752 |
|
735 | 753 | if ((projectId == null || !this.projects.some((p) => p.id === projectId)) |
736 | | - && localStorage.getItem('projectId')) { |
| 754 | + && localStorage.getItem('projectId')) { |
737 | 755 | projectId = parseInt(localStorage.getItem('projectId'), 10); |
738 | 756 | } |
739 | 757 |
|
@@ -775,7 +793,7 @@ export default { |
775 | 793 |
|
776 | 794 | getProjectColor(projectData) { |
777 | 795 | const projectIndex = this.projects.length |
778 | | - - this.projects.findIndex((p) => p.id === projectData.id); |
| 796 | + - this.projects.findIndex((p) => p.id === projectData.id); |
779 | 797 | return PROJECT_COLORS[projectIndex % PROJECT_COLORS.length]; |
780 | 798 | }, |
781 | 799 |
|
|
0 commit comments