mirror of https://github.com/requarks/wiki
parent
0adb4dc3e3
commit
72eccb7a2a
After Width: | Height: | Size: 1.3 KiB |
@ -0,0 +1,234 @@
|
|||||||
|
<template lang="pug">
|
||||||
|
.page-header.row
|
||||||
|
//- PAGE ICON
|
||||||
|
.col-auto.q-pl-md.flex.items-center
|
||||||
|
q-btn.rounded-borders(
|
||||||
|
v-if='editorStore.isActive'
|
||||||
|
padding='none'
|
||||||
|
size='37px'
|
||||||
|
:icon='pageStore.icon'
|
||||||
|
color='primary'
|
||||||
|
flat
|
||||||
|
)
|
||||||
|
q-menu(content-class='shadow-7')
|
||||||
|
icon-picker-dialog(v-model='pageStore.icon')
|
||||||
|
q-icon.rounded-borders(
|
||||||
|
v-else
|
||||||
|
:name='pageStore.icon'
|
||||||
|
size='64px'
|
||||||
|
color='primary'
|
||||||
|
)
|
||||||
|
//- PAGE HEADER
|
||||||
|
.col.q-pa-md
|
||||||
|
.text-h4.page-header-title
|
||||||
|
span {{pageStore.title}}
|
||||||
|
template(v-if='editorStore.isActive')
|
||||||
|
span.text-grey(v-if='!pageStore.title') {{ t(`editor.props.title`)}}
|
||||||
|
q-btn.acrylic-btn.q-ml-md(
|
||||||
|
icon='las la-pen'
|
||||||
|
flat
|
||||||
|
padding='xs'
|
||||||
|
size='sm'
|
||||||
|
)
|
||||||
|
q-popup-edit(
|
||||||
|
v-model='pageStore.title'
|
||||||
|
auto-save
|
||||||
|
v-slot='scope'
|
||||||
|
)
|
||||||
|
q-input(
|
||||||
|
outlined
|
||||||
|
style='width: 450px;'
|
||||||
|
v-model='scope.value'
|
||||||
|
dense
|
||||||
|
autofocus
|
||||||
|
@keyup.enter='scope.set'
|
||||||
|
:label='t(`editor.props.title`)'
|
||||||
|
)
|
||||||
|
.text-subtitle2.page-header-subtitle
|
||||||
|
span {{ pageStore.description }}
|
||||||
|
template(v-if='editorStore.isActive')
|
||||||
|
span.text-grey(v-if='!pageStore.description') {{ t(`editor.props.shortDescription`)}}
|
||||||
|
q-btn.acrylic-btn.q-ml-md(
|
||||||
|
icon='las la-pen'
|
||||||
|
flat
|
||||||
|
padding='none xs'
|
||||||
|
size='xs'
|
||||||
|
)
|
||||||
|
q-popup-edit(
|
||||||
|
v-model='pageStore.description'
|
||||||
|
auto-save
|
||||||
|
v-slot='scope'
|
||||||
|
)
|
||||||
|
q-input(
|
||||||
|
outlined
|
||||||
|
style='width: 450px;'
|
||||||
|
v-model='scope.value'
|
||||||
|
dense
|
||||||
|
autofocus
|
||||||
|
@keyup.enter='scope.set'
|
||||||
|
:label='t(`editor.props.shortDescription`)'
|
||||||
|
)
|
||||||
|
//- PAGE ACTIONS
|
||||||
|
.col-auto.q-pa-md.flex.items-center.justify-end
|
||||||
|
template(v-if='!editorStore.isActive')
|
||||||
|
q-btn.q-mr-md(
|
||||||
|
flat
|
||||||
|
dense
|
||||||
|
icon='las la-bell'
|
||||||
|
color='grey'
|
||||||
|
aria-label='Watch Page'
|
||||||
|
)
|
||||||
|
q-tooltip Watch Page
|
||||||
|
q-btn.q-mr-md(
|
||||||
|
flat
|
||||||
|
dense
|
||||||
|
icon='las la-bookmark'
|
||||||
|
color='grey'
|
||||||
|
aria-label='Bookmark Page'
|
||||||
|
)
|
||||||
|
q-tooltip Bookmark Page
|
||||||
|
q-btn.q-mr-md(
|
||||||
|
flat
|
||||||
|
dense
|
||||||
|
icon='las la-share-alt'
|
||||||
|
color='grey'
|
||||||
|
aria-label='Share'
|
||||||
|
)
|
||||||
|
q-tooltip Share
|
||||||
|
social-sharing-menu
|
||||||
|
q-btn.q-mr-md(
|
||||||
|
flat
|
||||||
|
dense
|
||||||
|
icon='las la-print'
|
||||||
|
color='grey'
|
||||||
|
aria-label='Print'
|
||||||
|
)
|
||||||
|
q-tooltip Print
|
||||||
|
template(v-if='editorStore.isActive || editorStore.hasPendingChanges')
|
||||||
|
q-btn.acrylic-btn.q-mr-sm(
|
||||||
|
flat
|
||||||
|
icon='las la-times'
|
||||||
|
color='negative'
|
||||||
|
label='Discard'
|
||||||
|
aria-label='Discard'
|
||||||
|
no-caps
|
||||||
|
@click='discardChanges'
|
||||||
|
)
|
||||||
|
q-btn.acrylic-btn(
|
||||||
|
flat
|
||||||
|
icon='las la-check'
|
||||||
|
color='positive'
|
||||||
|
label='Save Changes'
|
||||||
|
aria-label='Save Changes'
|
||||||
|
no-caps
|
||||||
|
@click='saveChanges'
|
||||||
|
)
|
||||||
|
template(v-else)
|
||||||
|
q-btn.acrylic-btn(
|
||||||
|
flat
|
||||||
|
icon='las la-edit'
|
||||||
|
color='deep-orange-9'
|
||||||
|
label='Edit'
|
||||||
|
aria-label='Edit'
|
||||||
|
no-caps
|
||||||
|
@click='editPage'
|
||||||
|
)
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
import { useQuasar } from 'quasar'
|
||||||
|
import { computed, defineAsyncComponent, onMounted, reactive, ref, watch } from 'vue'
|
||||||
|
import { useRouter, useRoute } from 'vue-router'
|
||||||
|
import { useI18n } from 'vue-i18n'
|
||||||
|
|
||||||
|
import { useEditorStore } from 'src/stores/editor'
|
||||||
|
import { useFlagsStore } from 'src/stores/flags'
|
||||||
|
import { usePageStore } from 'src/stores/page'
|
||||||
|
import { useSiteStore } from 'src/stores/site'
|
||||||
|
import { useUserStore } from 'src/stores/user'
|
||||||
|
|
||||||
|
import IconPickerDialog from 'src/components/IconPickerDialog.vue'
|
||||||
|
import SocialSharingMenu from 'src/components/SocialSharingMenu.vue'
|
||||||
|
|
||||||
|
// QUASAR
|
||||||
|
|
||||||
|
const $q = useQuasar()
|
||||||
|
|
||||||
|
// STORES
|
||||||
|
|
||||||
|
const editorStore = useEditorStore()
|
||||||
|
const flagsStore = useFlagsStore()
|
||||||
|
const pageStore = usePageStore()
|
||||||
|
const siteStore = useSiteStore()
|
||||||
|
const userStore = useUserStore()
|
||||||
|
|
||||||
|
// ROUTER
|
||||||
|
|
||||||
|
const router = useRouter()
|
||||||
|
const route = useRoute()
|
||||||
|
|
||||||
|
// I18N
|
||||||
|
|
||||||
|
const { t } = useI18n()
|
||||||
|
|
||||||
|
// COMPUTED
|
||||||
|
|
||||||
|
const editMode = computed(() => {
|
||||||
|
return pageStore.mode === 'edit'
|
||||||
|
})
|
||||||
|
const editCreateMode = computed(() => {
|
||||||
|
return pageStore.mode === 'edit' && pageStore.mode === 'create'
|
||||||
|
})
|
||||||
|
const editUrl = computed(() => {
|
||||||
|
let pagePath = siteStore.useLocales ? `${pageStore.locale}/` : ''
|
||||||
|
pagePath += !pageStore.path ? 'home' : pageStore.path
|
||||||
|
return `/_edit/${pagePath}`
|
||||||
|
})
|
||||||
|
|
||||||
|
// METHODS
|
||||||
|
|
||||||
|
async function discardChanges () {
|
||||||
|
$q.loading.show()
|
||||||
|
try {
|
||||||
|
editorStore.$patch({
|
||||||
|
isActive: false,
|
||||||
|
editor: ''
|
||||||
|
})
|
||||||
|
await pageStore.pageLoad({ id: pageStore.id })
|
||||||
|
$q.notify({
|
||||||
|
type: 'positive',
|
||||||
|
message: 'Page has been reverted to the last saved state.'
|
||||||
|
})
|
||||||
|
} catch (err) {
|
||||||
|
$q.notify({
|
||||||
|
type: 'negative',
|
||||||
|
message: 'Failed to reload page state.'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
$q.loading.hide()
|
||||||
|
}
|
||||||
|
|
||||||
|
async function saveChanges () {
|
||||||
|
$q.loading.show()
|
||||||
|
try {
|
||||||
|
await pageStore.pageSave()
|
||||||
|
$q.notify({
|
||||||
|
type: 'positive',
|
||||||
|
message: 'Page saved successfully.'
|
||||||
|
})
|
||||||
|
} catch (err) {
|
||||||
|
$q.notify({
|
||||||
|
type: 'negative',
|
||||||
|
message: 'Failed to save page changes.'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
$q.loading.hide()
|
||||||
|
}
|
||||||
|
|
||||||
|
function editPage () {
|
||||||
|
editorStore.$patch({
|
||||||
|
isActive: true,
|
||||||
|
editor: 'markdown'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
</script>
|
@ -0,0 +1,33 @@
|
|||||||
|
const protanopia = {
|
||||||
|
negative: '#fb8c00',
|
||||||
|
positive: '#2196f3',
|
||||||
|
primary: '#1976D2',
|
||||||
|
secondary: '#2196f3'
|
||||||
|
}
|
||||||
|
|
||||||
|
const deuteranopia = {
|
||||||
|
negative: '#ef6c00',
|
||||||
|
positive: '#2196f3',
|
||||||
|
primary: '#1976D2',
|
||||||
|
secondary: '#2196f3'
|
||||||
|
}
|
||||||
|
|
||||||
|
const tritanopia = {
|
||||||
|
primary: '#e91e63',
|
||||||
|
secondary: '#02C39A'
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getAccessibleColor (name, base, cvd) {
|
||||||
|
switch (cvd) {
|
||||||
|
case 'protanopia': {
|
||||||
|
return protanopia[name] ?? base
|
||||||
|
}
|
||||||
|
case 'deuteranopia': {
|
||||||
|
return deuteranopia[name] ?? base
|
||||||
|
}
|
||||||
|
case 'tritanopia': {
|
||||||
|
return tritanopia[name] ?? base
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return base
|
||||||
|
}
|
Loading…
Reference in new issue