{"version":3,"file":"index-BtrhDO0i.js","sources":["../../src/assets/images/dallmeier_logo_white.svg","../../src/assets/javascript/components/Header.vue","../../src/assets/javascript/components/Footer.vue","../../src/assets/javascript/App.vue","../../src/assets/javascript/components/ModalContentMedia.vue","../../src/assets/javascript/components/Content.vue","../../src/assets/javascript/components/FileList.vue","../../src/assets/javascript/components/FileContent.vue","../../src/assets/javascript/components/CameraCardContent.vue","../../src/index.html?html-proxy&index=0.js"],"sourcesContent":["export default \"__VITE_ASSET__NKkP$xE0__\"","<script setup>\nimport {computed, inject, reactive} from 'vue'\n\n const { file_filter, setFilter } = inject('filter');\n const icons = reactive({});\n const icon_visible = computed(()=>{\n let show = false;\n let icons_keys = Object.keys(icons);\n icons_keys.forEach((icon_class) => {\n if(icons[icon_class] === true){\n show = true;\n return show;\n }\n });\n return show;\n })\n const setIcons = function (icons_set){\n Object.assign(icons,icons_set);\n };\n defineExpose({setIcons});\n\n const toggleFilter = function(type, value) {\n if(file_filter.value.hasOwnProperty(type)){\n let filter = Object.assign({}, file_filter.value);\n if(filter[type].value === value){\n filter[type].active = false;\n filter[type].value = '';\n }else{\n filter[type].active = value.length > 1;\n filter[type].value = value;\n }\n\n setFilter(filter);\n }else{\n console.error('filter type is not defined', type);\n }\n };\n\n const filter_active = computed(() => {\n let active = false;\n Object.entries(file_filter.value).forEach(([filter_type, filter]) => {\n if(filter.active){\n active = true;\n }\n });\n return active;\n })\n\n</script>\n\n<template>\n <header class=\"row w-100 justify-content-center header position-fixed start-0 top-0 z-1 g-0 shadow\">\n <div class=\"col\">\n <img src=\"../../images/dallmeier_logo_white.svg\" alt=\"Dallmeier electronic\" class=\"logo\">\n <h3>Presentations</h3>\n <i class=\"icon header mx-auto\" :class=\"icons\" v-show=\"icon_visible\"></i>\n\n <div class=\"filter w-100 mx-auto\">\n <div class=\"btn-group dropdown text-end\" v-show=\"icon_visible\">\n <button type=\"button\" class=\"btn btn-outline-light btn-lg dropdown-toggle btn-filter align-self-end\" :class=\"{'filter_active': filter_active}\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n <i class=\"icon filter\"></i>\n </button>\n <ul class=\"dropdown-menu\">\n <li v-for=\"(title, filter) in file_filter.language.options\">\n <a class=\"dropdown-item\" :class=\"{active:file_filter.language.value === filter}\" href=\"#\" @click.prevent=\"toggleFilter('language',filter)\">{{title}}</a>\n </li>\n </ul>\n </div>\n </div>\n\n </div>\n </header>\n</template>","<script setup>\nimport {computed, inject, ref, watch} from \"vue\";\nimport SecuredBadge from \"./SecuredBadge.vue\";\n\nconst emit = defineEmits(['shareLink']);\n\nconst { CHANNEL_PRIVATE, CHANNEL_PUBLIC, channel_selected, selectChannel } = inject('channel');\nconst router = inject('router');\nconst { getAuthBearer,userLoggedIn,openLogin } = inject('userApi');\n\nconst directory_depth = ref(1);\nconst share_modal = ref();\n\nconst registerShareModal = function (modal) {\n share_modal.value = modal;\n};\n\nwatch(router.currentRoute,(ro)=>{\n let route_elements = ro.name.split('.');\n let channel = route_elements[0];\n directory_depth.value = route_elements.length;\n selectChannel(channel);\n});\n\nwatch(userLoggedIn, (is_logged_in)=>{\n let route_elements = channel_selected.value.split('.');\n let channel = route_elements[0];\n if(channel === CHANNEL_PRIVATE && !is_logged_in){\n router.replace({ name: CHANNEL_PUBLIC });\n }\n});\n\nconst openPrivateChannel = function () {\n if(userLoggedIn.value){\n router.replace({ name: CHANNEL_PRIVATE });\n }else{\n openLogin(CHANNEL_PRIVATE);\n }\n};\n\nconst navigateBack = function () {\n router.replace({ name: channel_selected.value });\n};\n\nconst shareLink = function () {\n emit('shareLink',document.URL);\n};\n\n</script>\n<template>\n <teleport to=\"body\">\n <div class=\"footer container-fluid position-fixed bottom-0 z-2\" :class=\"{'private': CHANNEL_PRIVATE === channel_selected}\">\n <div class=\"row justify-content-center\">\n <div class=\"col-10 align-self-center text-center\" v-if=\"directory_depth === 1\">\n <a href=\"/#/\" class=\"btn btn-footer\" :class=\"{'active': CHANNEL_PUBLIC === channel_selected}\" role=\"button\"><i class=\"icon public\"></i></a>\n <a href=\"/#/private\" class=\"btn btn-footer\" :class=\"{'active': CHANNEL_PRIVATE === channel_selected}\" @click.prevent=\"openPrivateChannel\" role=\"button\"><i class=\"icon private\"><SecuredBadge :class=\"'secured'\"/></i></a>\n </div>\n <div class=\"col-10 align-self-center text-center\" v-else>\n <a href=\"#\" @click.prevent=\"navigateBack\" class=\"btn btn-footer\" >\n <i class=\"icon back\"></i>\n </a>\n <a href=\"#\" @click.prevent=\"shareLink\" class=\"btn btn-footer\">\n <i class=\"icon share\">\n <SecuredBadge :class=\"['position-relative','secured']\" v-if=\"CHANNEL_PRIVATE === channel_selected\"/>\n </i>\n </a>\n </div>\n\n </div>\n </div>\n </teleport>\n\n</template>","<script setup>\nimport { provide, ref, computed, inject, onMounted } from 'vue';\nimport Auth from \"./components/Auth.vue\";\nimport Header from \"./components/Header.vue\";\nimport Footer from \"./components/Footer.vue\";\nimport MessageBox from \"./components/MessageBox.vue\";\n\n\nconst router = inject('router');\nconst messageBox = ref();\nconst headerIcons = ref();\nconst authApi = ref();\n\nconst CHANNEL_PRIVATE = 'private';\nconst CHANNEL_PUBLIC = 'public';\nconst channel_selected = ref(CHANNEL_PUBLIC);\nconst selectChannel = (channel) => {\n channel_selected.value = channel;\n};\n\nprovide('channel',{\n CHANNEL_PRIVATE,\n CHANNEL_PUBLIC,\n channel_selected,\n selectChannel,\n});\n\nconst file_filter = ref({\n language: {\n options: {de:'DE',en:'EN'},\n active: true,\n value: ''\n }\n});\n\nconst setDefaultLanguage = function () {\n if(file_filter.value.language.value.length > 0){\n return false;\n }\n let browser_language = navigator.language.substring(0,2).toLowerCase();\n if(file_filter.value.language.options.hasOwnProperty(browser_language)){\n file_filter.value.language.value = browser_language;\n }else{\n file_filter.value.language.value = 'en';\n }\n};\n\nconst setFilter = (filter) => {\n filter.value = Object.assign({},filter);\n};\n\nprovide('filter',{\n file_filter,\n setFilter\n});\n\nconst getAuthBearer = () => {\n try {\n return authApi.value.getBearer();\n }catch (e){\n return false;\n }\n};\n\nconst userLoggedIn = computed(() => {\n try {\n return authApi.value.userLoggedIn;\n }catch (e){\n return false;\n }\n});\n\nconst openLogin = (callback = false | '') => {\n try {\n return authApi.value.openLoginModal(callback);\n }catch (e){\n return false;\n }\n};\n\nprovide('userApi',{\n getAuthBearer,\n userLoggedIn,\n openLogin\n});\n\nconst shareLink = function (url) {\n navigator.clipboard.writeText(url).then(() => {\n showMessage('Share Link','Link to this file is added to your clipboard.', 'success', 'share');\n });\n}\n\nconst showMessage = function (header, message, type = 'success', icon) {\n messageBox.value.addMessage(header,message, type, icon);\n};\n\nconst setHeaderIcons = function (icons) {\n headerIcons.value.setIcons(icons);\n};\n\nprovide('shareLink',shareLink);\nprovide('showMessage',showMessage);\n\nonMounted(()=>{\n setDefaultLanguage();\n})\n\n</script>\n\n<template>\n <Auth ref=\"authApi\"></Auth>\n <Header ref=\"headerIcons\"></Header>\n <router-view @set-open-file-icon=\"setHeaderIcons\"></router-view>\n <Footer @share-link=\"shareLink\"></Footer>\n <message-box ref=\"messageBox\"></message-box>\n</template>","<script setup>\nimport {computed} from \"vue\";\n\nconst props = defineProps(['fileData','href']);\n\nconst media_url = computed(()=>{\n if(is_youtube){\n return props.href\n }\n return new URL(props.href,window.location.origin);\n})\nconst get_filetype = function () {\n if(props.fileData !== null){\n if(Object.hasOwn(props.fileData, 'filetype') ){\n return props.fileData.filetype.filetype_id;\n }\n }\n return '';\n};\n\nconst is_video = computed(()=>{\n return get_filetype() === 'FILE_VIDEO';\n});\n\nconst is_pdf = computed(()=>{\n return get_filetype() === 'FILE_PDF';\n});\n\nconst is_image = computed(()=>{\n return get_filetype() === 'FILE_IMAGE';\n});\n\nconst is_youtube = computed(()=>{\n if(get_filetype() === 'FILE_LINK'){\n return props.href.indexOf('.youtube');\n }\n return false;\n});\n\n</script>\n\n<template>\n <div class=\"content-video\" v-if=\"is_video\">\n <video width=\"100%\" height=\"100%\" controls autoplay class=\"align-content-center\">\n <source :src=\"media_url\" type=\"video/mp4\">\n Your browser does not support the video tag.\n </video>\n </div>\n <div class=\"content-pdf\" v-if=\"is_pdf\">\n <iframe width=\"100%\" height=\"100%\" :src=\"media_url\"></iframe>\n </div>\n <div class=\"content-image\" v-if=\"is_image\">\n <img :src=\"media_url\" :alt=\"fileData.title\" />\n </div>\n <div class=\"content-youtube\" v-if=\"is_youtube\">\n <iframe width=\"100%\" height=\"100%\" :src=\"media_url\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; allow-same-origin\" allowfullscreen ></iframe>\n </div>\n</template>","<script async setup>\nimport {ref, onMounted, watch, inject, provide, computed} from \"vue\";\nimport {getApiClient} from \"../services/apiClientService\"\nimport Modal from \"./bootstrap/Modal.vue\";\nimport ModalContentMedia from \"./ModalContentMedia.vue\";\nimport NotFound from \"./NotFound.vue\";\nimport { useRoute } from 'vue-router'\n\nconst emit = defineEmits(['setOpenFileIcon', 'setCameraCards']);\nconst { CHANNEL_PRIVATE, CHANNEL_PUBLIC, channel_selected, selectChannel } = inject('channel');\nconst { getAuthBearer,userLoggedIn,openLogin } = inject('userApi');\nconst { file_filter, setFilter } = inject('filter');\n\nconst route = useRoute()\nconst contentModal = ref(null);\nconst fileModalDataInit = {\n fileData: null,\n href: '',\n title: ''\n};\nconst fileModalData = ref(Object.assign({},fileModalDataInit));\n\nconst icon_set = {\n city: false,\n casino: false,\n stadium: false,\n airport: false,\n harbour: false,\n industry: false,\n logistic: false,\n perimeter: false,\n about: false,\n document: false,\n camera: false,\n panomera: false,\n domera: false,\n project: false,\n video: false,\n youtube: false,\n pdf: false,\n image: false,\n ppt: false,\n security: false,\n critical: false,\n software: false,\n integration: false,\n link: false,\n website: false,\n default: false\n};\n\nconst getIcons = function (file_data) {\n let filetype = file_data.filetype.filetype_id;\n let filetype_pattern = file_data.filetype.filetype_pattern\n let icons_keys = Object.keys(icon_set);\n let icons = Object.assign({},icon_set);\n let is_root = file_data.hasOwnProperty('file_children');\n\n let icon_pattern = file_data.file_name;\n if( filetype !== 'DIRECTORY'){\n icon_pattern = filetype.split('FILE_')[1];\n }else if(!is_root){\n icon_pattern = 'project';\n }\n icons_keys.forEach((icon_class) => {\n let match_class = new RegExp(icon_class);\n if(filetype_pattern !== undefined){\n let match_pattern = new RegExp(filetype_pattern);\n icons[icon_class] = match_pattern.test(file_data.url) ? match_class.test(file_data.url):false;\n }\n icons[icon_class] = !icons[icon_class] ? match_class.test(icon_pattern.toLowerCase()):true;\n });\n return icons\n};\n\nprovide('icons',{\n icon_set,\n getIcons\n});\n\nconst file_list = ref({\n channels:{\n public:[],\n private:[],\n camera_cards:[]\n },\n open_file_id: false,\n list: [],\n depth: 1\n});\n\n\nwatch(\n () => route.name,\n (name) => {\n parseRoute();\n }\n)\n\nconst parseRoute = function () {\n let route_segments = route.name.split('.');\n let channel = route_segments[0];\n let secured = channel === CHANNEL_PRIVATE;\n selectChannel(channel)\n file_list.value.depth = route_segments.length;\n if(secured && userLoggedIn.value || !secured){\n loadFile(secured);\n if(secured){\n loadCameraCards();\n }\n }else{\n openLogin(route.fullPath);\n route.replace({ name: CHANNEL_PUBLIC });\n }\n};\n\nconst filterListItem = function (item) {\n let filter_matched = true;\n Object.entries(file_filter.value).forEach(([filter_type, filter]) => {\n if(filter.active){\n if(filter_type === 'language'){\n const filter_rule = /_(de|en)(\\.|_|$)/mgi;\n const filter_exec = new RegExp(`_(${filter.value})(\\.|_|$)`, 'gmi');\n if(filter_rule.exec(item.file_name) !== null){\n filter_matched = filter_exec.exec(item.file_name) !== null;\n }else{\n filter_matched = true;\n }\n }\n }\n });\n return filter_matched;\n}\n\nconst filterList = function (file_list) {\n let file_list_filtered = [];\n file_list.forEach((item) => {\n if(filterListItem(item)){\n file_list_filtered.push(item);\n }\n })\n return file_list_filtered;\n}\n\nconst setActiveList = function() {\n let file_id = getSelectedFileId();\n if(file_id){\n file_list.value.open_file_id = file_id;\n let children = getFileChildren(file_list.value.open_file_id);\n if(children.length > 0){\n let open_file = getOpenFile(file_id);\n emit('setOpenFileIcon', getIcons(open_file[0]));\n\n file_list.value.list = filterList(children);\n }else{\n route.replace({name: 'NotFound'});\n }\n }else{\n if(route.name.split('.').pop()==='camera_cards'){\n emit('setOpenFileIcon', {project: true});\n }else{\n emit('setOpenFileIcon', Object.assign({},icon_set));\n }\n file_list.value.open_file_id = false;\n file_list.value.list = getActiveChannelList();\n }\n};\n\nconst list_empty = computed(()=>{\n let item_count = 0;\n for (let listItem of file_list.value.list) {\n if(listItem.parent_file_id !== undefined) {\n item_count++;\n continue;\n }\n if(listItem.file_children.length > 0){\n item_count++;\n }\n }\n return item_count === 0;\n})\n\nconst getSelectedFileId = function () {\n let file_id = false;\n if(Object.hasOwn(route.params, 'file_id')){\n file_id = route.params.file_id;\n }\n return file_id;\n};\n\nconst getActiveChannelList = function () {\n return file_list.value.channels[channel_selected.value]\n};\n\nconst getOpenFile = function (file_id) {\n let active_channel_list = getActiveChannelList();\n return active_channel_list.filter((file) => {\n return file.file_id === file_id;\n });\n};\n\nconst getFileChildren = function (file_id){\n let children = [];\n let open_file = getOpenFile(file_id);\n if(open_file.length > 0){\n children = open_file[0].file_children\n }\n return children;\n};\n\nconst loadFile = function (secured = false) {\n let active_channel_list = getActiveChannelList()\n if(active_channel_list.length === 0 || channel_selected.value === CHANNEL_PRIVATE){\n const apiClient = getApiClient();\n apiClient.get(`/file/${channel_selected.value}`,).then(response => {\n file_list.value.channels[channel_selected.value] = response.data;\n setActiveList();\n }).catch(error => {\n console.error(error.message);\n }).finally(() => {\n // loadingState.value = false;\n });\n }else{\n setActiveList();\n }\n};\n\nwatch(file_filter.value,(filter)=>{\n setActiveList();\n});\n\nconst loadCameraCards = () => {\n if(file_list.value.channels.camera_cards.length === 0){\n const apiClient = getApiClient();\n apiClient.get('/camera_cards').then(response => {\n file_list.value.channels.camera_cards = response.data;\n }).catch(error => {\n console.error('camera cards load error',error.message);\n })\n }\n}\n\nconst modalCreated = function (modal) {\n contentModal.value = modal;\n contentModal.value._element.addEventListener('hidden.bs.modal', event => {\n fileModalData.value = Object.assign({},fileModalDataInit);\n })\n};\n\nconst openInModal = function ({file,href,title}) {\n fileModalData.value.fileData = file;\n fileModalData.value.href = href;\n fileModalData.value.title = title;\n contentModal.value.show();\n};\n\nonMounted(()=>{\n parseRoute();\n});\n\n</script>\n\n<template>\n <div class=\"row content\" :class=\"{'directory-root': file_list.depth < 2}\">\n <div class=\"list-group list-group-flush pe-0\">\n <NotFound v-if=\"list_empty\"></NotFound>\n <router-view :file-list=\"file_list\" @open-in-modal=\"openInModal\"></router-view>\n </div>\n </div>\n <teleport to=\"body\">\n <Modal :title=\"fileModalData.title\" :share=\"fileModalData.href\" :size=\"'modal-fullscreen'\" :footer-close=\"true\" @modal-created=\"modalCreated\">\n <ModalContentMedia :file-data=\"fileModalData.fileData\" :href=\"fileModalData.href\"></ModalContentMedia>\n </Modal>\n </teleport>\n</template>","<script setup>\nimport { computed, reactive, onMounted, onUpdated, inject } from \"vue\";\nimport SecuredBadge from \"./SecuredBadge.vue\";\n\nconst props = defineProps(['fileData','channel','openFileId']);\nconst emit = defineEmits(['openInModal']);\nconst shareLink = inject('shareLink');\n\nconst visible = computed(()=>{\n if(props.fileData.parent_file_id !== undefined) {\n return true\n }\n return props.fileData.file_children.length > 0\n});\n\nconst direct_link = computed(()=>{\n return props.fileData.parent_file_id === props.openFileId;\n});\n\nconst secured = computed(()=>{\n return props.channel === 'private';\n});\n\nconst file_title = computed(()=>{\n let pattern = /\\d{2}_|\\.\\w{2,7}/ig;\n return props.fileData.title.replace(pattern, '').replace(/_/ig, ' ');\n});\n\nconst href = computed(()=> {\n if(direct_link.value){\n return props.fileData.url;\n }\n return ['',props.channel, props.fileData.file_id, props.fileData.file_name].join('/');\n});\n\nconst { icon_set, getIcons } = inject('icons');\n\nconst icons = reactive(Object.assign({},icon_set));\n\nconst setIcon = function () {\n let icons_list = getIcons(props.fileData);\n let icons_keys = Object.keys(icons);\n icons_keys.forEach((icons_key) => {\n icons[icons_key] = icons_list[icons_key];\n });\n};\n\nconst shareUrl = function () {\n let url = new URL(href.value,window.location.origin);\n shareLink(url.toString());\n};\n\nconst openFile = function (href, isMobile) {\n if(!openInModal(href, isMobile)){\n window.open(href,\"_blank\");\n }else{\n emit('openInModal', {file:props.fileData,href:href,title:file_title});\n }\n}\n\nconst openInModal = function (href, isMobile) {\n let filetype = props.fileData.filetype.filetype_id;\n let link_pattern = new RegExp('.*\\.link');\n if(filetype === 'FILE_PDF' && isMobile) {\n return false;\n }else if(filetype === 'FILE_LINK' && link_pattern.test(href)) {\n return false\n }else if(filetype !== 'FILE_VIDEO' && filetype !== 'FILE_PDF' && filetype !== 'FILE_LINK' && filetype !== 'FILE_IMAGE'){\n return false;\n }\n return true;\n}\n\nonMounted(()=>{\n setIcon();\n});\n\nonUpdated(()=>{\n setIcon();\n document.activeElement.blur();\n});\n\n</script>\n\n<template>\n <router-link :to=\"href\" class=\"list-group-item list-group-item-action icon-link overflow-x-hidden px-lg-4 px-sm-1 py-2\" v-if=\"!direct_link && visible\">\n <i class=\"icon bi me-lg-4 me-sm-2\" :class=\"icons\"></i>\n {{file_title}}\n <SecuredBadge :class=\"['position-relative','float-end','top-50','translate-middle', 'secured','position-absolute', 'end-0']\" v-if=\"secured\"/>\n </router-link>\n <div class=\"list-group-item list-group-item-action overflow-x-hidden px-lg-4 px-sm-1 py-2\" v-if=\"direct_link && visible\">\n <a :href=\"href\" @click.prevent=\"openFile(href, $isMobile())\" target=\"_blank\" class=\"icon-link col-11 col-lg-12 col-md-11 col-sm-6\">\n <i class=\"icon bi me-lg-3 me-sm-1\" :class=\"icons\"></i>\n {{file_title}}\n </a>\n <a href=\"#\" @click.prevent=\"shareUrl\" class=\"btn btn-outline-light btn-share end-0 top-50 translate-middle-y position-absolute\">\n <i class=\"icon share\">\n <SecuredBadge :class=\"['position-relative',{'secured': secured}]\" v-if=\"secured\"/>\n </i>\n </a>\n </div>\n\n</template>","<script setup>\nimport {inject} from \"vue\";\nimport SecuredBadge from \"./SecuredBadge.vue\";\nimport FileList from \"./FileList.vue\";\n\nconst { CHANNEL_PRIVATE, CHANNEL_PUBLIC, channel_selected, selectChannel } = inject('channel');\n\nconst {fileList} = defineProps(['fileList']);\nconst emit = defineEmits(['openInModal']);\n\nconst openInModal = function ({file,href,title}) {\n emit('openInModal', {file,href,title});\n};\n</script>\n\n<template>\n <FileList v-for=\"(file, index) in fileList.list\" :file-data=\"file\" :open-file-id=\"fileList.open_file_id\" :channel=\"channel_selected\" @share-link=\"shareLink\" @open-in-modal=\"openInModal\"></FileList>\n\n <router-link :to=\"{ name: 'private.camera_cards' }\" v-if=\"fileList.channels.camera_cards.length > 0 && CHANNEL_PRIVATE === channel_selected && fileList.depth < 2\" class=\"list-group-item list-group-item-action icon-link overflow-x-hidden px-lg-4 px-sm-1 py-2\">\n <i class=\"icon bi me-lg-4 me-sm-2 project\"></i>\n Camera Cards\n <SecuredBadge :class=\"['position-relative','float-end','top-50','translate-middle', 'secured','position-absolute', 'end-0']\" />\n </router-link>\n</template>","<script setup>\nimport {inject} from \"vue\";\nimport SecuredBadge from \"./SecuredBadge.vue\";\n\nconst shareLink = inject('shareLink');\n\nconst {fileList} = defineProps(['fileList']);\n\nconst shareUrl = function (href) {\n let url = new URL(href,window.location.origin);\n shareLink(url.toString());\n};\n\n\n</script>\n\n<template>\n <div v-for=\"camera_card in fileList.channels.camera_cards\" class=\"list-group-item list-group-item-action overflow-x-hidden px-lg-4 px-sm-1 py-2\" >\n <a :href=\"camera_card.url\" target=\"_blank\" class=\"icon-link col-11 col-lg-12 col-md-11 col-sm-6\">\n <i class=\"icon bi me-lg-3 me-sm-1 project\"></i>\n {{camera_card.project_name}}\n </a>\n <a href=\"#\" @click.prevent=\"shareUrl(camera_card.url)\" class=\"btn btn-outline-light btn-share end-0 top-50 translate-middle-y position-absolute\">\n <i class=\"icon share\">\n <SecuredBadge class=\"position-relative, secured\" />\n </i>\n </a>\n </div>\n</template>\n","\n import { createApp } from 'vue';\n import { createRouter, createWebHashHistory } from \"vue-router\";\n import VueMobileDetection from 'vue-mobile-detection';\n import App from './assets/javascript/App.vue';\n import Content from \"./assets/javascript/components/Content.vue\";\n import FileContent from \"./assets/javascript/components/FileContent.vue\";\n import CameraCardContent from \"./assets/javascript/components/CameraCardContent.vue\";\n import NotFound from \"./assets/javascript/components/NotFound.vue\";\n\n const routes = [\n { path: '/:pathMatch(.*)*', name: 'NotFound', component: NotFound },\n { path: '/', name: 'root', component: Content,\n children: [\n { path: '', name: 'public', alias:'/public', component: FileContent ,\n children: [\n { path: ':file_id/:file_name', name: 'public.directory', component: FileContent }\n ]\n },\n { path: '/private', name: 'private',component: FileContent,\n children: [\n { path: ':file_id/:file_name', name: 'private.directory', component: FileContent }\n ]\n },\n { path: '/private/camera_cards', name: 'private.camera_cards', component: CameraCardContent },\n ]\n }\n ];\n const router = createRouter({\n history: createWebHashHistory(),\n routes\n })\n\n const app = createApp(App);\n app.use(VueMobileDetection)\n app.use(router);\n app.provide('router',router);\n app.mount('#app');\n\n "],"names":["_imports_0","file_filter","setFilter","inject","icons","reactive","icon_visible","computed","show","icon_class","__expose","icons_set","toggleFilter","type","value","filter","filter_active","active","filter_type","emit","__emit","CHANNEL_PRIVATE","CHANNEL_PUBLIC","channel_selected","selectChannel","router","getAuthBearer","userLoggedIn","openLogin","directory_depth","ref","watch","ro","route_elements","channel","is_logged_in","openPrivateChannel","navigateBack","shareLink","messageBox","headerIcons","authApi","provide","setDefaultLanguage","browser_language","callback","url","showMessage","header","message","icon","setHeaderIcons","onMounted","props","__props","media_url","is_youtube","get_filetype","is_video","is_pdf","is_image","route","useRoute","contentModal","fileModalDataInit","fileModalData","icon_set","getIcons","file_data","filetype","filetype_pattern","icons_keys","is_root","icon_pattern","match_class","match_pattern","file_list","name","parseRoute","route_segments","secured","loadFile","loadCameraCards","filterListItem","item","filter_matched","filter_rule","filter_exec","filterList","file_list_filtered","setActiveList","file_id","getSelectedFileId","children","getFileChildren","open_file","getOpenFile","getActiveChannelList","list_empty","item_count","listItem","file","getApiClient","response","error","modalCreated","modal","event","openInModal","href","title","visible","direct_link","file_title","pattern","setIcon","icons_list","icons_key","shareUrl","openFile","isMobile","link_pattern","onUpdated","routes","NotFound","Content","FileContent","CameraCardContent","createRouter","createWebHashHistory","app","createApp","App","VueMobileDetection"],"mappings":"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"}