feat: read only mode

This commit is contained in:
Jannat Patel
2025-04-29 18:39:22 +05:30
parent b1a9af5de8
commit 6d5a02e2a8
7 changed files with 30 additions and 5 deletions

View File

@@ -32,6 +32,7 @@
<script> <script>
document.getElementById('seo-content').style.display = 'none'; document.getElementById('seo-content').style.display = 'none';
window.csrf_token = '{{ csrf_token }}' window.csrf_token = '{{ csrf_token }}'
window.read_only_mode = '{{ read_only }}'
</script> </script>
<script type="module" src="/src/main.js"></script> <script type="module" src="/src/main.js"></script>
</body> </body>

View File

@@ -48,12 +48,13 @@
</span> </span>
</Button> </Button>
</router-link> </router-link>
<div <Badge
v-else-if="course.data.disable_self_learning" v-else-if="course.data.disable_self_learning"
class="bg-surface-blue-2 text-blue-900 text-sm rounded-md py-1 px-3" theme="blue"
size="lg"
> >
{{ __('Contact the Administrator to enroll for this course.') }} {{ __('Contact the Administrator to enroll for this course.') }}
</div> </Badge>
<Button <Button
v-else v-else
@click="enrollStudent()" @click="enrollStudent()"
@@ -140,7 +141,7 @@
<script setup> <script setup>
import { BookOpen, Users, Star, GraduationCap } from 'lucide-vue-next' import { BookOpen, Users, Star, GraduationCap } from 'lucide-vue-next'
import { computed, inject } from 'vue' import { computed, inject } from 'vue'
import { Button, createResource, Tooltip } from 'frappe-ui' import { Badge, Button, createResource } from 'frappe-ui'
import { showToast, formatAmount } from '@/utils/' import { showToast, formatAmount } from '@/utils/'
import { capture } from '@/telemetry' import { capture } from '@/telemetry'
import { useRouter } from 'vue-router' import { useRouter } from 'vue-router'

View File

@@ -8,6 +8,18 @@
<AppSidebar /> <AppSidebar />
</div> </div>
<div class="w-full overflow-auto" id="scrollContainer"> <div class="w-full overflow-auto" id="scrollContainer">
<div
v-if="readOnlyMode"
class="right-0 top-0 mb-3 bg-surface-gray-2 py-3 text-sm text-ink-gray-5"
>
<div class="mx-auto px-10">
{{
__(
'This site is running in read-only mode. Full functionality will be restored soon.'
)
}}
</div>
</div>
<slot /> <slot />
</div> </div>
</div> </div>
@@ -16,4 +28,6 @@
</template> </template>
<script setup> <script setup>
import AppSidebar from './AppSidebar.vue' import AppSidebar from './AppSidebar.vue'
const readOnlyMode = window.read_only_mode
</script> </script>

View File

@@ -26,5 +26,7 @@ app.mount('#app')
const { userResource, allUsers } = usersStore() const { userResource, allUsers } = usersStore()
app.provide('$user', userResource) app.provide('$user', userResource)
app.provide('$allUsers', allUsers) app.provide('$allUsers', allUsers)
app.config.globalProperties.$user = userResource app.config.globalProperties.$user = userResource
app.config.globalProperties.$dialog = createDialog app.config.globalProperties.$dialog = createDialog
app.config.globalProperties.readOnlyMode = window.read_only_mode

View File

@@ -121,6 +121,7 @@ const certification = ref(false)
const filters = ref({}) const filters = ref({})
const currentTab = ref('Live') const currentTab = ref('Live')
const { brand } = sessionStore() const { brand } = sessionStore()
const readOnlyMode = window.read_only_mode
onMounted(() => { onMounted(() => {
identifyUserPersona() identifyUserPersona()

View File

@@ -16,6 +16,8 @@ import SimpleImage from '@editorjs/simple-image'
import Table from '@editorjs/table' import Table from '@editorjs/table'
import { usersStore } from '../stores/user' import { usersStore } from '../stores/user'
const readOnlyMode = window.read_only_mode
export function createToast(options) { export function createToast(options) {
toast({ toast({
position: 'bottom-right', position: 'bottom-right',
@@ -543,5 +545,8 @@ export const escapeHTML = (text) => {
export const canCreateCourse = () => { export const canCreateCourse = () => {
const { userResource } = usersStore() const { userResource } = usersStore()
return userResource.data?.is_instructor || userResource.data?.is_moderator return (
!readOnlyMode &&
(userResource.data?.is_instructor || userResource.data?.is_moderator)
)
} }

View File

@@ -20,6 +20,7 @@ def get_context():
context = frappe._dict() context = frappe._dict()
context.csrf_token = csrf_token context.csrf_token = csrf_token
context.read_only = frappe.flags.read_only
context.meta = get_meta(app_path, title, favicon) context.meta = get_meta(app_path, title, favicon)
capture("active_site", "lms") capture("active_site", "lms")
context.title = title context.title = title