Skip to content

Commit 8715cd6

Browse files
committed
feat: edit shortcuts
1 parent fa35f3a commit 8715cd6

File tree

10 files changed

+246
-10
lines changed

10 files changed

+246
-10
lines changed

client/components/admin/admin-general.vue

+108-3
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@
144144
//- )
145145
146146
//- v-divider.mt-3
147-
v-switch(
147+
v-switch.mt-0(
148148
inset
149149
label='Comments'
150150
color='indigo'
@@ -177,6 +177,76 @@
177177
persistent-hint
178178
)
179179

180+
v-card.mt-5.animated.fadeInUp.wait-p7s
181+
v-toolbar(color='primary', dark, dense, flat)
182+
v-toolbar-title.subtitle-1 {{$t('admin:general.editShortcuts')}}
183+
v-card-text
184+
v-switch.mt-0(
185+
inset
186+
:label='$t(`admin:general.editFab`)'
187+
color='primary'
188+
v-model='config.editFab'
189+
persistent-hint
190+
:hint='$t(`admin:general.editFabHint`)'
191+
)
192+
v-divider
193+
.overline.grey--text.pa-4 {{$t('admin:general.editMenuBar')}}
194+
.px-3.pb-3
195+
v-switch.mt-0.ml-1(
196+
inset
197+
:label='$t(`admin:general.displayEditMenuBar`)'
198+
color='primary'
199+
v-model='config.editMenuBar'
200+
persistent-hint
201+
:hint='$t(`admin:general.displayEditMenuBarHint`)'
202+
)
203+
v-switch.mt-4.ml-1(
204+
v-if='config.editMenuBar'
205+
inset
206+
:label='$t(`admin:general.displayEditMenuBtn`)'
207+
color='primary'
208+
v-model='config.editMenuBtn'
209+
persistent-hint
210+
:hint='$t(`admin:general.displayEditMenuBtnHint`)'
211+
)
212+
v-switch.mt-4.ml-1(
213+
v-if='config.editMenuBar'
214+
inset
215+
:label='$t(`admin:general.displayEditMenuExternalBtn`)'
216+
color='primary'
217+
v-model='config.editMenuExternalBtn'
218+
persistent-hint
219+
:hint='$t(`admin:general.displayEditMenuExternalBtnHint`)'
220+
)
221+
template(v-if='config.editMenuBar && config.editMenuExternalBtn')
222+
v-divider
223+
.overline.grey--text.pa-4 External Edit Button
224+
.px-3.pb-3
225+
v-text-field(
226+
outlined
227+
:label='$t(`admin:general.editMenuExternalName`)'
228+
v-model='config.editMenuExternalName'
229+
prepend-icon='mdi-format-title'
230+
:hint='$t(`admin:general.editMenuExternalNameHint`)'
231+
persistent-hint
232+
)
233+
v-text-field.mt-3(
234+
outlined
235+
:label='$t(`admin:general.editMenuExternalIcon`)'
236+
v-model='config.editMenuExternalIcon'
237+
prepend-icon='mdi-dice-5'
238+
:hint='$t(`admin:general.editMenuExternalIconHint`)'
239+
persistent-hint
240+
)
241+
v-text-field.mt-3(
242+
outlined
243+
:label='$t(`admin:general.editMenuExternalUrl`)'
244+
v-model='config.editMenuExternalUrl'
245+
prepend-icon='mdi-near-me'
246+
:hint='$t(`admin:general.editMenuExternalUrlHint`)'
247+
persistent-hint
248+
)
249+
180250
component(:is='activeModal')
181251

182252
</template>
@@ -216,7 +286,14 @@ export default {
216286
featurePageComments: false,
217287
featurePersonalWikis: false,
218288
featureTinyPNG: false,
219-
pageExtensions: ''
289+
pageExtensions: '',
290+
editFab: false,
291+
editMenuBar: false,
292+
editMenuBtn: false,
293+
editMenuExternalBtn: false,
294+
editMenuExternalName: '',
295+
editMenuExternalIcon: '',
296+
editMenuExternalUrl: ''
220297
},
221298
metaRobots: [
222299
{ text: 'Index', value: 'index' },
@@ -274,6 +351,13 @@ export default {
274351
$featurePageRatings: Boolean
275352
$featurePageComments: Boolean
276353
$featurePersonalWikis: Boolean
354+
$editFab: Boolean
355+
$editMenuBar: Boolean
356+
$editMenuBtn: Boolean
357+
$editMenuExternalBtn: Boolean
358+
$editMenuExternalName: String
359+
$editMenuExternalIcon: String
360+
$editMenuExternalUrl: String
277361
) {
278362
site {
279363
updateConfig(
@@ -290,6 +374,13 @@ export default {
290374
featurePageRatings: $featurePageRatings
291375
featurePageComments: $featurePageComments
292376
featurePersonalWikis: $featurePersonalWikis
377+
editFab: $editFab
378+
editMenuBar: $editMenuBar
379+
editMenuBtn: $editMenuBtn
380+
editMenuExternalBtn: $editMenuExternalBtn
381+
editMenuExternalName: $editMenuExternalName
382+
editMenuExternalIcon: $editMenuExternalIcon
383+
editMenuExternalUrl: $editMenuExternalUrl
293384
) {
294385
responseResult {
295386
succeeded
@@ -314,7 +405,14 @@ export default {
314405
pageExtensions: _.get(this.config, 'pageExtensions', ''),
315406
featurePageRatings: _.get(this.config, 'featurePageRatings', false),
316407
featurePageComments: _.get(this.config, 'featurePageComments', false),
317-
featurePersonalWikis: _.get(this.config, 'featurePersonalWikis', false)
408+
featurePersonalWikis: _.get(this.config, 'featurePersonalWikis', false),
409+
editFab: _.get(this.config, 'editFab', false),
410+
editMenuBar: _.get(this.config, 'editMenuBar', false),
411+
editMenuBtn: _.get(this.config, 'editMenuBtn', false),
412+
editMenuExternalBtn: _.get(this.config, 'editMenuExternalBtn', false),
413+
editMenuExternalName: _.get(this.config, 'editMenuExternalName', ''),
414+
editMenuExternalIcon: _.get(this.config, 'editMenuExternalIcon', ''),
415+
editMenuExternalUrl: _.get(this.config, 'editMenuExternalUrl', '')
318416
},
319417
watchLoading (isLoading) {
320418
this.$store.commit(`loading${isLoading ? 'Start' : 'Stop'}`, 'admin-site-update')
@@ -368,6 +466,13 @@ export default {
368466
featurePageRatings
369467
featurePageComments
370468
featurePersonalWikis
469+
editFab
470+
editMenuBar
471+
editMenuBtn
472+
editMenuExternalBtn
473+
editMenuExternalName
474+
editMenuExternalIcon
475+
editMenuExternalUrl
371476
}
372477
}
373478
}

client/store/page.js

+10-1
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,16 @@ const state = {
4141
manage: false
4242
}
4343
},
44-
commentsCount: 0
44+
commentsCount: 0,
45+
editShortcuts: {
46+
editFab: false,
47+
editMenuBar: false,
48+
editMenuBtn: false,
49+
editMenuExternalBtn: false,
50+
editMenuExternalName: '',
51+
editMenuExternalIcon: '',
52+
editMenuExternalUrl: ''
53+
}
4554
}
4655

4756
export default {

client/themes/default/components/page.vue

+79-3
Original file line numberDiff line numberDiff line change
@@ -49,10 +49,28 @@
4949
status-indicator.ml-3(negative, pulse)
5050
v-divider
5151
v-container.grey.pa-0(fluid, :class='$vuetify.theme.dark ? `darken-4-l3` : `lighten-4`')
52-
v-row(no-gutters, align-content='center', style='height: 90px;')
52+
v-row.page-header-section(no-gutters, align-content='center', style='height: 90px;')
5353
v-col.page-col-content.is-page-header(offset-xl='2', offset-lg='3', style='margin-top: auto; margin-bottom: auto;', :class='$vuetify.rtl ? `pr-4` : `pl-4`')
5454
.headline.grey--text(:class='$vuetify.theme.dark ? `text--lighten-2` : `text--darken-3`') {{title}}
5555
.caption.grey--text.text--darken-1 {{description}}
56+
.page-edit-shortcuts(v-if='editShortcutsObj.editMenuBar')
57+
v-btn(
58+
v-if='editShortcutsObj.editMenuBtn'
59+
@click='pageEdit'
60+
depressed
61+
small
62+
)
63+
v-icon.mr-2(small) mdi-pencil
64+
span.text-none {{$t(`common:actions.edit`)}}
65+
v-btn(
66+
v-if='editShortcutsObj.editMenuExternalBtn'
67+
:href='editMenuExternalUrl'
68+
target='_blank'
69+
depressed
70+
small
71+
)
72+
v-icon.mr-2(small) {{ editShortcutsObj.editMenuExternalIcon }}
73+
span.text-none {{$t(`common:page.editExternal`, { name: editShortcutsObj.editMenuExternalName })}}
5674
v-divider
5775
v-container.pl-5.pt-4(fluid, grid-list-xl)
5876
v-layout(row)
@@ -186,7 +204,7 @@
186204
v-spacer
187205

188206
v-flex.page-col-content(xs12, lg9, xl10)
189-
v-tooltip(:right='$vuetify.rtl', :left='!$vuetify.rtl', v-if='hasAnyPagePermissions')
207+
v-tooltip(:right='$vuetify.rtl', :left='!$vuetify.rtl', v-if='hasAnyPagePermissions && editShortcutsObj.editFab')
190208
template(v-slot:activator='{ on: onEditActivator }')
191209
v-speed-dial(
192210
v-model='pageEditFab'
@@ -440,6 +458,14 @@ export default {
440458
commentsExternal: {
441459
type: Boolean,
442460
default: false
461+
},
462+
editShortcuts: {
463+
type: String,
464+
default: ''
465+
},
466+
filename: {
467+
type: String,
468+
default: ''
443469
}
444470
},
445471
data() {
@@ -478,6 +504,7 @@ export default {
478504
isAuthenticated: get('user/authenticated'),
479505
commentsCount: get('page/commentsCount'),
480506
commentsPerms: get('page/effectivePermissions@comments'),
507+
editShortcutsObj: get('page/editShortcuts'),
481508
rating: {
482509
get () {
483510
return 3.5
@@ -519,7 +546,14 @@ export default {
519546
return this.hasAdminPermission || this.hasWritePagesPermission || this.hasManagePagesPermission ||
520547
this.hasDeletePagesPermission || this.hasReadSourcePermission || this.hasReadHistoryPermission
521548
},
522-
printView: sync('site/printView')
549+
printView: sync('site/printView'),
550+
editMenuExternalUrl () {
551+
if (this.editShortcutsObj.editMenuBar && this.editShortcutsObj.editMenuExternalBtn) {
552+
return this.editShortcutsObj.editMenuExternalUrl.replace('{filename}', this.filename)
553+
} else {
554+
return ''
555+
}
556+
}
523557
},
524558
created() {
525559
this.$store.set('page/authorId', this.authorId)
@@ -537,6 +571,9 @@ export default {
537571
if (this.effectivePermissions) {
538572
this.$store.set('page/effectivePermissions', JSON.parse(Buffer.from(this.effectivePermissions, 'base64').toString()))
539573
}
574+
if (this.editShortcuts) {
575+
this.$store.set('page/editShortcuts', JSON.parse(Buffer.from(this.editShortcuts, 'base64').toString()))
576+
}
540577
541578
this.$store.set('page/mode', 'view')
542579
},
@@ -676,4 +713,43 @@ export default {
676713
display: none;
677714
}
678715
716+
.page-header-section {
717+
position: relative;
718+
719+
.page-edit-shortcuts {
720+
position: absolute;
721+
bottom: -14px;
722+
right: 10px;
723+
724+
.v-btn {
725+
border-right: 1px solid #DDD !important;
726+
border-bottom: 1px solid #DDD !important;
727+
border-radius: 0;
728+
color: #777;
729+
background-color: #FFF !important;
730+
731+
@at-root .theme--dark & {
732+
background-color: #222 !important;
733+
border-right-color: #444 !important;
734+
border-bottom-color: #444 !important;
735+
color: #CCC;
736+
}
737+
738+
.v-icon {
739+
color: mc('blue', '700');
740+
}
741+
742+
&:first-child {
743+
border-top-left-radius: 5px;
744+
border-bottom-left-radius: 5px;
745+
}
746+
747+
&:last-child {
748+
border-top-right-radius: 5px;
749+
border-bottom-right-radius: 5px;
750+
}
751+
}
752+
}
753+
}
754+
679755
</style>

client/themes/default/scss/app.scss

+4
Original file line numberDiff line numberDiff line change
@@ -1036,4 +1036,8 @@
10361036
.comments-container {
10371037
display: none;
10381038
}
1039+
1040+
.page-edit-shortcuts {
1041+
display: none;
1042+
}
10391043
}

server/app/data.yml

+8
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,14 @@ defaults:
6767
audience: 'urn:wiki.js'
6868
tokenExpiration: '30m'
6969
tokenRenewal: '14d'
70+
editShortcuts:
71+
editFab: true
72+
editMenuBar: false
73+
editMenuBtn: true
74+
editMenuExternalBtn: true
75+
editMenuExternalName: 'GitHub'
76+
editMenuExternalIcon: 'mdi-github'
77+
editMenuExternalUrl: 'https://github.com/org/repo/blob/main/{filename}'
7078
features:
7179
featurePageRatings: true
7280
featurePageComments: true

server/controllers/common.js

+6-1
Original file line numberDiff line numberDiff line change
@@ -542,13 +542,18 @@ router.get('/*', async (req, res, next) => {
542542
})
543543
}
544544

545+
// -> Page Filename (for edit on external repo button)
546+
let pageFilename = WIKI.config.lang.namespacing ? `${pageArgs.locale}/${page.path}` : page.path
547+
pageFilename += page.contentType === 'markdown' ? '.md' : '.html'
548+
545549
// -> Render view
546550
res.render('page', {
547551
page,
548552
sidebar,
549553
injectCode,
550554
comments: commentTmpl,
551-
effectivePermissions
555+
effectivePermissions,
556+
pageFilename
552557
})
553558
}
554559
} else if (pageArgs.path === 'home') {

server/graph/resolvers/site.js

+12-1
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ module.exports = {
2020
logoUrl: WIKI.config.logoUrl,
2121
pageExtensions: WIKI.config.pageExtensions.join(', '),
2222
...WIKI.config.seo,
23+
...WIKI.config.editShortcuts,
2324
...WIKI.config.features,
2425
...WIKI.config.security,
2526
authAutoLogin: WIKI.config.auth.autoLogin,
@@ -84,6 +85,16 @@ module.exports = {
8485
tokenRenewal: _.get(args, 'authJwtRenewablePeriod', WIKI.config.auth.tokenRenewal)
8586
}
8687

88+
WIKI.config.editShortcuts = {
89+
editFab: _.get(args, 'editFab', WIKI.config.editShortcuts.editFab),
90+
editMenuBar: _.get(args, 'editMenuBar', WIKI.config.editShortcuts.editMenuBar),
91+
editMenuBtn: _.get(args, 'editMenuBtn', WIKI.config.editShortcuts.editMenuBtn),
92+
editMenuExternalBtn: _.get(args, 'editMenuExternalBtn', WIKI.config.editShortcuts.editMenuExternalBtn),
93+
editMenuExternalName: _.get(args, 'editMenuExternalName', WIKI.config.editShortcuts.editMenuExternalName),
94+
editMenuExternalIcon: _.get(args, 'editMenuExternalIcon', WIKI.config.editShortcuts.editMenuExternalIcon),
95+
editMenuExternalUrl: _.get(args, 'editMenuExternalUrl', WIKI.config.editShortcuts.editMenuExternalUrl)
96+
}
97+
8798
WIKI.config.features = {
8899
featurePageRatings: _.get(args, 'featurePageRatings', WIKI.config.features.featurePageRatings),
89100
featurePageComments: _.get(args, 'featurePageComments', WIKI.config.features.featurePageComments),
@@ -109,7 +120,7 @@ module.exports = {
109120
forceDownload: _.get(args, 'uploadForceDownload', WIKI.config.uploads.forceDownload)
110121
}
111122

112-
await WIKI.configSvc.saveToDb(['host', 'title', 'company', 'contentLicense', 'seo', 'logoUrl', 'pageExtensions', 'auth', 'features', 'security', 'uploads'])
123+
await WIKI.configSvc.saveToDb(['host', 'title', 'company', 'contentLicense', 'seo', 'logoUrl', 'pageExtensions', 'auth', 'editShortcuts', 'features', 'security', 'uploads'])
113124

114125
if (WIKI.config.security.securityTrustProxy) {
115126
WIKI.app.enable('trust proxy')

0 commit comments

Comments
 (0)