1 line
20 KiB
Plaintext
1 line
20 KiB
Plaintext
{"version":3,"file":"SessionList-BWAaC3iT.chunk.mjs","sources":["../node_modules/vue-material-design-icons/AccountMultipleOutline.vue","../src/composables/useSessions.ts","../node_modules/vue-material-design-icons/AccountOutline.vue","../src/components/Editor/AvatarWrapper.vue","../src/components/Editor/GuestNameDialog.vue","../src/components/Editor/SessionList.vue"],"sourcesContent":["<template>\n <span v-bind=\"$attrs\"\n :aria-hidden=\"title ? null : 'true'\"\n :aria-label=\"title\"\n class=\"material-design-icon account-multiple-outline-icon\"\n role=\"img\"\n @click=\"$emit('click', $event)\">\n <svg :fill=\"fillColor\"\n class=\"material-design-icon__svg\"\n :width=\"size\"\n :height=\"size\"\n viewBox=\"0 0 24 24\">\n <path d=\"M13.07 10.41A5 5 0 0 0 13.07 4.59A3.39 3.39 0 0 1 15 4A3.5 3.5 0 0 1 15 11A3.39 3.39 0 0 1 13.07 10.41M5.5 7.5A3.5 3.5 0 1 1 9 11A3.5 3.5 0 0 1 5.5 7.5M7.5 7.5A1.5 1.5 0 1 0 9 6A1.5 1.5 0 0 0 7.5 7.5M16 17V19H2V17S2 13 9 13 16 17 16 17M14 17C13.86 16.22 12.67 15 9 15S4.07 16.31 4 17M15.95 13A5.32 5.32 0 0 1 18 17V19H22V17S22 13.37 15.94 13Z\">\n <title v-if=\"title\">{{ title }}</title>\n </path>\n </svg>\n </span>\n</template>\n\n<script>\nexport default {\n name: \"AccountMultipleOutlineIcon\",\n emits: ['click'],\n props: {\n title: {\n type: String,\n },\n fillColor: {\n type: String,\n default: \"currentColor\"\n },\n size: {\n type: Number,\n default: 24\n }\n }\n}\n</script>","/**\n * SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport {\n\tcomputed,\n\tonMounted,\n\tonUnmounted,\n\treadonly,\n\tref,\n\tshallowRef,\n\twatch,\n\ttype ShallowRef,\n} from 'vue'\nimport type { OpenData } from '../apis/connect.js'\nimport {\n\tCOLLABORATOR_DISCONNECT_TIME,\n\tisGuest,\n\tSyncService,\n\ttype Session,\n} from '../services/SyncService.js'\nimport { useConnection } from './useConnection.js'\n\n/**\n * Get the sessions from the sync service.\n *\n * @param syncService to watch for changes to the sessions.\n */\nexport function useSessions(syncService: SyncService) {\n\tconst { openData } = useConnection() as {\n\t\topenData: ShallowRef<OpenData | undefined>\n\t}\n\tconst currentSession = ref(openData.value?.session)\n\tconst sessions = shallowRef<Session[]>([])\n\n\twatch(openData, (val) => {\n\t\tif (val?.session) {\n\t\t\tcurrentSession.value = val.session\n\t\t}\n\t})\n\n\tconst currentGuestSession = computed({\n\t\tget() {\n\t\t\tif (currentSession.value && isGuest(currentSession.value)) {\n\t\t\t\treturn currentSession.value\n\t\t\t}\n\t\t},\n\t\tset(newValue) {\n\t\t\tcurrentSession.value = newValue\n\t\t},\n\t})\n\n\tconst updateSessions = ({ sessions: updated }: { sessions: Session[] }) => {\n\t\tconst cutoff = Date.now() / 1000 - COLLABORATOR_DISCONNECT_TIME\n\t\tsessions.value = updated\n\t\t\t.filter((session) => session.lastContact > cutoff)\n\t\t\t.sort((a, b) => b.lastContact - a.lastContact)\n\t\t\t.filter(uniqueUserId)\n\n\t\t// Make sure we get our own session updated\n\t\tconst currentUpdatedSession = sessions.value.find(\n\t\t\t(session) => session.id === currentSession.value?.id,\n\t\t)\n\t\tif (currentUpdatedSession) {\n\t\t\tcurrentSession.value = currentUpdatedSession\n\t\t}\n\t}\n\tonMounted(() => {\n\t\tsyncService.bus.on('change', updateSessions)\n\t})\n\tonUnmounted(() => {\n\t\tsyncService.bus.off('change', updateSessions)\n\t})\n\treturn {\n\t\tcurrentGuestSession,\n\t\tcurrentSession: readonly(currentSession),\n\t\tsessions: readonly(sessions),\n\t}\n}\n\n/**\n * Return true for entries with a unique user id or with no user id (Guests).\n *\n * To be used in filter. Will keep the first entry and remove duplicates.\n *\n * @param val the current value\n * @param idx index of the current value\n * @param arr the entire array\n */\nfunction uniqueUserId(val: Session, idx: number, arr: Session[]): boolean {\n\tif (!('userId' in val)) {\n\t\treturn true\n\t}\n\treturn !arr\n\t\t.slice(0, idx)\n\t\t.some((session) => 'userId' in session && session.userId === val.userId)\n}\n","<template>\n <span v-bind=\"$attrs\"\n :aria-hidden=\"title ? null : 'true'\"\n :aria-label=\"title\"\n class=\"material-design-icon account-outline-icon\"\n role=\"img\"\n @click=\"$emit('click', $event)\">\n <svg :fill=\"fillColor\"\n class=\"material-design-icon__svg\"\n :width=\"size\"\n :height=\"size\"\n viewBox=\"0 0 24 24\">\n <path d=\"M12,4A4,4 0 0,1 16,8A4,4 0 0,1 12,12A4,4 0 0,1 8,8A4,4 0 0,1 12,4M12,6A2,2 0 0,0 10,8A2,2 0 0,0 12,10A2,2 0 0,0 14,8A2,2 0 0,0 12,6M12,13C14.67,13 20,14.33 20,17V20H4V17C4,14.33 9.33,13 12,13M12,14.9C9.03,14.9 5.9,16.36 5.9,17V18.1H18.1V17C18.1,16.36 14.97,14.9 12,14.9Z\">\n <title v-if=\"title\">{{ title }}</title>\n </path>\n </svg>\n </span>\n</template>\n\n<script>\nexport default {\n name: \"AccountOutlineIcon\",\n emits: ['click'],\n props: {\n title: {\n type: String,\n },\n fillColor: {\n type: String,\n default: \"currentColor\"\n },\n size: {\n type: Number,\n default: 24\n }\n }\n}\n</script>","<!--\n - SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n<template>\n\t<div class=\"avatar-wrapper\" :style=\"sessionAvatarStyle\">\n\t\t<NcAvatar\n\t\t\tv-if=\"session.userId\"\n\t\t\t:user=\"session.userId\"\n\t\t\t:is-guest=\"false\"\n\t\t\t:disable-menu=\"true\"\n\t\t\thide-status\n\t\t\t:disable-tooltip=\"true\" />\n\t\t<div v-else class=\"avatar\" :style=\"sessionBackgroundStyle\">\n\t\t\t<template v-if=\"session.guestName\">\n\t\t\t\t{{ guestInitial }}\n\t\t\t</template>\n\t\t\t<AccountOutlineIcon v-else />\n\t\t</div>\n\t</div>\n</template>\n\n<script>\nimport NcAvatar from '@nextcloud/vue/components/NcAvatar'\nimport AccountOutlineIcon from 'vue-material-design-icons/AccountOutline.vue'\n\nexport default {\n\tname: 'AvatarWrapper',\n\tcomponents: {\n\t\tNcAvatar,\n\t\tAccountOutlineIcon,\n\t},\n\tprops: {\n\t\tsession: {\n\t\t\ttype: Object,\n\t\t\trequired: true,\n\t\t},\n\t},\n\tcomputed: {\n\t\tsessionAvatarStyle() {\n\t\t\treturn {\n\t\t\t\t...this.sessionBackgroundStyle,\n\t\t\t\t'border-color': this.session.color,\n\t\t\t}\n\t\t},\n\t\tsessionBackgroundStyle() {\n\t\t\treturn {\n\t\t\t\t'background-color': this.session.userId\n\t\t\t\t\t? this.session.color + ' !important'\n\t\t\t\t\t: 'var(--color-background-dark)',\n\t\t\t}\n\t\t},\n\t\tguestInitial() {\n\t\t\treturn this.session.guestName === ''\n\t\t\t\t? '?'\n\t\t\t\t: this.session.guestName.slice(0, 1).toUpperCase()\n\t\t},\n\t},\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.avatar-wrapper {\n\toverflow: hidden;\n}\n\n.avatar,\n.avatar-wrapper {\n\t--size: var(--default-clickable-area);\n\tborder-radius: 50%;\n\twidth: var(--size);\n\theight: var(--size);\n\ttext-align: center;\n\tcolor: var(--color-text-maxcontrast);\n\tline-height: var(--size);\n\tfont-size: calc(var(--size) / 2);\n\tfont-weight: normal;\n\tdisplay: flex;\n\tjustify-content: center;\n\talign-items: center;\n\tborder-width: 2px;\n\tborder-style: solid;\n\tbox-sizing: border-box;\n}\n</style>\n","<!--\n - SPDX-FileCopyrightText: 2019 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n<template>\n\t<li>\n\t\t<form\n\t\t\tv-if=\"editing\"\n\t\t\t:title=\"\n\t\t\t\tt('text', 'Enter your name so other people can see who is editing')\n\t\t\t\"\n\t\t\tclass=\"guest-name-dialog\"\n\t\t\t@submit.prevent=\"setGuestName\">\n\t\t\t<NcInputField\n\t\t\t\tv-model=\"guestName\"\n\t\t\t\tmaxlength=\"60\"\n\t\t\t\t:disabled=\"loading\"\n\t\t\t\t:label=\"t('text', 'Enter your name')\"\n\t\t\t\t:placeholder=\"t('text', 'Guest')\" />\n\t\t\t<NcButton\n\t\t\t\tvariant=\"primary\"\n\t\t\t\t:aria-label=\"t('text', 'submit')\"\n\t\t\t\t@click=\"setGuestName\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<CheckIcon :size=\"20\" />\n\t\t\t\t</template>\n\t\t\t</NcButton>\n\t\t</form>\n\t\t<template v-else>\n\t\t\t<AvatarWrapper :session=\"session\" />\n\t\t\t<span class=\"session-label guest\">\n\t\t\t\t{{ guestName || t('text', 'you') }}\n\t\t\t</span>\n\t\t\t<NcButton :aria-label=\"t('text', 'edit')\" @click=\"editing = true\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<PencilOutlineIcon :size=\"20\" />\n\t\t\t\t</template>\n\t\t\t</NcButton>\n\t\t</template>\n\t</li>\n</template>\n\n<script setup>\nimport { showError, showWarning } from '@nextcloud/dialogs'\nimport { t } from '@nextcloud/l10n'\nimport NcButton from '@nextcloud/vue/components/NcButton'\nimport NcInputField from '@nextcloud/vue/components/NcInputField'\nimport { ref, watch } from 'vue'\nimport CheckIcon from 'vue-material-design-icons/Check.vue'\nimport PencilOutlineIcon from 'vue-material-design-icons/PencilOutline.vue'\nimport { update } from '../../apis/connect.ts'\nimport { useConnection } from '../../composables/useConnection.ts'\nimport { useEditor } from '../../composables/useEditor.ts'\nimport { useEditorMethods } from '../../composables/useEditorMethods.ts'\nimport AvatarWrapper from './AvatarWrapper.vue'\n\nconst props = defineProps({\n\tsession: {\n\t\ttype: Object,\n\t\trequired: true,\n\t},\n})\nconst emit = defineEmits(['update:session'])\nconst { connection } = useConnection()\nconst { editor } = useEditor()\nconst { updateUser } = useEditorMethods(editor)\nconst editing = ref(false)\nconst loading = ref(false)\nconst guestName = ref(props.session.guestName)\nwatch(\n\t() => props.session.guestName,\n\t(newName) => {\n\t\tif (!editing.value) {\n\t\t\tguestName.value = newName\n\t\t}\n\t},\n)\nconst setGuestName = async () => {\n\tif (!connection.value) {\n\t\tshowError(t('text', 'Not connected. Cannot update guest name.'))\n\t\treturn\n\t}\n\tconst previousGuestName = props.session.guestName\n\tloading.value = true\n\ttry {\n\t\tconst session = await update(guestName.value, connection.value)\n\t\tloading.value = false\n\t\tediting.value = false\n\t\ttry {\n\t\t\tlocalStorage.setItem('nick', session.guestName)\n\t\t} catch (e) {\n\t\t\tconsole.warn('Could not store guest name in local storage.', e)\n\t\t}\n\t\temit('update:session', session)\n\t\tupdateUser(session)\n\t} catch (error) {\n\t\tloading.value = false\n\t\tconsole.warn('Failed to update the session', { error })\n\t\tshowWarning(t('text', 'Failed to update the guest name.'))\n\t\tguestName.value = previousGuestName\n\t}\n}\n</script>\n\n<style scoped lang=\"scss\">\nform.guest-name-dialog {\n\tdisplay: flex;\n\twidth: calc(var(--session-max-width) - 12px);\n\n\t&:deep(img) {\n\t\tmargin: 0 !important;\n\t}\n\n\tbutton {\n\t\tmargin-inline-start: 3px;\n\t}\n}\n\nul li {\n\talign-items: center;\n\tdisplay: flex;\n\t/* to match the form */\n\twidth: calc(var(--session-max-width) - 12px);\n\n\t/* match the input in the form */\n\t.avatar-wrapper,\n\tbutton,\n\t.session-label {\n\t\tmargin-block-start: 6px;\n\t}\n\n\t.avatar-wrapper {\n\t\tmargin-inline-end: 6px;\n\t}\n\n\t.session-label {\n\t\tpadding-inline-end: 3px;\n\t\t/* keep some room for the avatar and edit button */\n\t\tmax-width: calc(var(--session-max-width) - 100px);\n\t\toverflow-wrap: break-word;\n\t}\n\n\t.guest {\n\t\tcolor: var(--color-text-maxcontrast);\n\t}\n\n\tbutton {\n\t\tmargin-inline-start: auto;\n\t}\n}\n</style>\n","<!--\n - SPDX-FileCopyrightText: 2019 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n<template>\n\t<NcPopover\n\t\t:no-focus-trap=\"!showGuestNameDialog\"\n\t\tclass=\"session-list\"\n\t\tplacement=\"bottom\">\n\t\t<template #trigger=\"{ attrs }\">\n\t\t\t<div>\n\t\t\t\t<NcButton\n\t\t\t\t\t:title=\"label\"\n\t\t\t\t\t:aria-label=\"label\"\n\t\t\t\t\ttype=\"tertiary\"\n\t\t\t\t\tclass=\"avatar-list\"\n\t\t\t\t\tv-bind=\"attrs\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<AccountMultipleOutlineIcon :size=\"20\" />\n\t\t\t\t\t\t<AvatarWrapper\n\t\t\t\t\t\t\tv-for=\"session in sessionsForTriggerButton\"\n\t\t\t\t\t\t\t:key=\"session.id\"\n\t\t\t\t\t\t\t:session=\"session\" />\n\t\t\t\t\t</template>\n\t\t\t\t</NcButton>\n\t\t\t</div>\n\t\t</template>\n\t\t<template #default>\n\t\t\t<div class=\"session-menu\">\n\t\t\t\t<slot name=\"lastSaved\" />\n\t\t\t\t<ul>\n\t\t\t\t\t<GuestNameDialog\n\t\t\t\t\t\tv-if=\"showGuestNameDialog\"\n\t\t\t\t\t\t:session.sync=\"currentGuestSession\" />\n\t\t\t\t\t<li\n\t\t\t\t\t\tv-for=\"session in sessionList\"\n\t\t\t\t\t\t:key=\"session.id\"\n\t\t\t\t\t\t:style=\"avatarStyle(session)\">\n\t\t\t\t\t\t<AvatarWrapper :session=\"session\" />\n\t\t\t\t\t\t<span\n\t\t\t\t\t\t\tclass=\"session-label\"\n\t\t\t\t\t\t\t:class=\"!session.userId && 'guest'\">\n\t\t\t\t\t\t\t{{ displayNameOrGuestName(session) }}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</li>\n\t\t\t\t</ul>\n\t\t\t</div>\n\t\t</template>\n\t</NcPopover>\n</template>\n\n<script>\nimport { t } from '@nextcloud/l10n'\nimport NcButton from '@nextcloud/vue/components/NcButton'\nimport NcPopover from '@nextcloud/vue/components/NcPopover'\nimport AccountMultipleOutlineIcon from 'vue-material-design-icons/AccountMultipleOutline.vue'\nimport { useEditorFlags } from '../../composables/useEditorFlags.ts'\nimport { useSessions } from '../../composables/useSessions.ts'\nimport { useSyncService } from '../../composables/useSyncService.ts'\nimport { COLLABORATOR_IDLE_TIME } from '../../services/SyncService.ts'\nimport AvatarWrapper from './AvatarWrapper.vue'\nimport GuestNameDialog from './GuestNameDialog.vue'\n\nexport default {\n\tname: 'SessionList',\n\tcomponents: {\n\t\tAccountMultipleOutlineIcon,\n\t\tAvatarWrapper,\n\t\tGuestNameDialog,\n\t\tNcButton,\n\t\tNcPopover,\n\t},\n\tsetup() {\n\t\tconst { isPublic } = useEditorFlags()\n\t\tconst { syncService } = useSyncService()\n\t\tconst { currentGuestSession, currentSession, sessions } =\n\t\t\tuseSessions(syncService)\n\t\treturn { currentGuestSession, currentSession, sessions, isPublic }\n\t},\n\tcomputed: {\n\t\tlabel() {\n\t\t\treturn t('text', 'Active people')\n\t\t},\n\t\tsessionList() {\n\t\t\treturn this.showGuestNameDialog ? this.remoteSessions : this.sessions\n\t\t},\n\t\tremoteSessions() {\n\t\t\treturn this.sessions.filter(\n\t\t\t\t(session) => session.id !== this.currentSession?.id,\n\t\t\t)\n\t\t},\n\t\tshowGuestNameDialog() {\n\t\t\treturn this.isPublic && this.currentGuestSession\n\t\t},\n\t\tavatarStyle() {\n\t\t\treturn (session) => {\n\t\t\t\treturn {\n\t\t\t\t\topacity:\n\t\t\t\t\t\tsession.lastContact\n\t\t\t\t\t\t> Date.now() / 1000 - COLLABORATOR_IDLE_TIME\n\t\t\t\t\t\t\t? 1\n\t\t\t\t\t\t\t: 0.5,\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tsessionsForTriggerButton() {\n\t\t\treturn this.remoteSessions.slice(0, 3)\n\t\t},\n\t},\n\tmethods: {\n\t\tt,\n\t\tdisplayNameOrGuestName: (session) => {\n\t\t\tif (session.userId) {\n\t\t\t\treturn session.displayName\n\t\t\t}\n\t\t\tconst guestName = session.guestName || t('text', 'Guest')\n\t\t\treturn `${guestName} (${t('text', 'guest')})`\n\t\t},\n\t},\n}\n</script>\n\n<style scoped lang=\"scss\">\n.session-list {\n\theight: var(--default-clickable-area);\n}\n\n/* Needs to be more specific than 0,2,0 (NcButton) */\n.button-vue--icon-only.avatar-list {\n\twidth: min-content !important;\n\tpadding-inline: var(--default-grid-baseline);\n\n\t:deep(.button-vue__icon) {\n\t\tdisplay: inline-flex;\n\t\tflex-direction: row-reverse;\n\t\twidth: min-content;\n\n\t\t.avatar-wrapper {\n\t\t\tmargin: 3px -12px 3px 0;\n\t\t\tz-index: 1;\n\t\t}\n\t}\n}\n\n.session-menu {\n\t--session-max-width: 280px;\n\tmax-width: var(--session-max-width);\n\tpadding-block-start: 6px;\n\tpadding-block-end: 6px;\n\n\tul li {\n\t\talign-items: center;\n\t\tdisplay: flex;\n\t\tpadding: 6px;\n\n\t\t.avatar-wrapper {\n\t\t\tmargin-inline-end: 6px;\n\t\t}\n\n\t\t.session-label {\n\t\t\tpadding-inline-end: 3px;\n\t\t\t/* keep some room for the avatar and edit button */\n\t\t\tmax-width: calc(var(--session-max-width) - 60px);\n\t\t\toverflow-wrap: break-word;\n\t\t}\n\n\t\t.guest-label,\n\t\t.guest {\n\t\t\tcolor: var(--color-text-maxcontrast);\n\t\t}\n\n\t\t.guest-label {\n\t\t\tpadding-inline-start: 3px;\n\t\t}\n\t}\n}\n\nlabel {\n\tdisplay: block;\n\tmargin: 8px;\n}\n\n.hint {\n\tmargin: 8px;\n\tcolor: var(--color-text-maxcontrast);\n}\n</style>\n"],"names":["_sfc_main","useSessions","syncService","openData","useConnection","currentSession","ref","sessions","shallowRef","watch","val","currentGuestSession","computed","isGuest","newValue","updateSessions","updated","cutoff","COLLABORATOR_DISCONNECT_TIME","session","a","b","uniqueUserId","currentUpdatedSession","onMounted","onUnmounted","readonly","idx","arr","NcAvatar","AccountOutlineIcon","connection","editor","useEditor","updateUser","useEditorMethods","editing","loading","guestName","props","newName","showError","t","previousGuestName","update","e","emit","error","showWarning","AccountMultipleOutlineIcon","AvatarWrapper","GuestNameDialog","NcButton","NcPopover","isPublic","useEditorFlags","useSyncService","COLLABORATOR_IDLE_TIME"],"mappings":"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","x_google_ignoreList":[0,2]} |