Upgrade "@nextcloud/vue": "^7.2.0" and use md icons consistently

Signed-off-by: Marcel Klehr <mklehr@gmx.net>
This commit is contained in:
Marcel Klehr 2022-12-12 17:44:09 +01:00
parent 3a2d033ecc
commit aa5ec41906
24 changed files with 4928 additions and 16490 deletions

20238
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -27,7 +27,7 @@
"@nextcloud/event-bus": "^2.1.1",
"@nextcloud/initial-state": "^1.2.1",
"@nextcloud/router": "^2.0.0",
"@nextcloud/vue": "^5.4.0",
"@nextcloud/vue": "^7.2.0",
"@nextcloud/vue-dashboard": "^2.0.1",
"async-parallel": "^1.2.3",
"clone-deep": "^4.0.1",
@ -50,9 +50,9 @@
"devDependencies": {
"@nextcloud/babel-config": "^1.0.0",
"@nextcloud/browserslist-config": "^2.3.0",
"@nextcloud/eslint-config": "^6",
"@nextcloud/eslint-config": "^8.1.4",
"@nextcloud/stylelint-config": "^2",
"@nextcloud/webpack-vue-config": "^4",
"@nextcloud/webpack-vue-config": "^5.4.0",
"@vue/test-utils": "^1.3.0"
},
"engines": {

View File

@ -5,8 +5,7 @@
-->
<template>
<Item
:title="bookmark.title"
<Item :title="bookmark.title"
:tags="bookmark.tags"
:rename-placeholder="t('bookmarks', 'Enter new title')"
:select-label="t('bookmarks', 'Select bookmark')"
@ -26,76 +25,76 @@
<div class="bookmark__title">
<h3 :title="bookmark.title">
<span v-if="bookmark.preliminary" class="icon-loading-small bookmark__icon" />
<figure
v-else
<figure v-else
class="bookmark__icon"
:style="{ backgroundImage: 'url(' + iconUrl + ')' }" />
{{ bookmark.title }}
</h3>
<span
v-if="bookmark.description"
<span v-if="bookmark.description"
v-tooltip="bookmark.description"
class="bookmark__description"><figure class="icon-file" />
{{ bookmark.description }}</span>
</div>
</template>
<template #actions>
<ActionButton
icon="icon-info"
:close-after-click="true"
<NcActionButton :close-after-click="true"
@click="onDetails">
<template #icon>
<InformationVariantIcon />
</template>
{{ t('bookmarks', 'Details') }}
</ActionButton>
<ActionCheckbox @change="onSelect">
</NcActionButton>
<NcActionCheckbox @change="onSelect">
{{ t('bookmarks', 'Select bookmark') }}
</ActionCheckbox>
<ActionButton
icon="icon-rename"
:close-after-click="true"
</NcActionCheckbox>
<NcActionButton :close-after-click="true"
@click="onRename">
<template #icon>
<PencilIcon />
</template>
{{ t('bookmarks', 'Rename') }}
</ActionButton>
<ActionButton
:close-after-click="true"
</NcActionButton>
<NcActionButton :close-after-click="true"
@click="onCopyUrl">
<template #icon>
<ContentCopyIcon :fill-color="colorMainText" />
<ContentCopyIcon />
</template>
{{ t('bookmarks', 'Copy link') }}
</ActionButton>
<ActionButton :close-after-click="true" @click="onMove">
</NcActionButton>
<NcActionButton :close-after-click="true" @click="onMove">
<template #icon>
<FolderMoveIcon
:fill-color="colorMainText" />
<FolderMoveIcon />
</template>
{{ t('bookmarks', 'Move') }}
</ActionButton>
<ActionButton :close-after-click="true" @click="onCopy">
</NcActionButton>
<NcActionButton :close-after-click="true" @click="onCopy">
<template #icon>
<FolderPlusIcon
:fill-color="colorMainText" />
<FolderPlusIcon />
</template>
{{ t('bookmarks', 'Add to folders') }}
</ActionButton>
<ActionButton
icon="icon-delete"
:close-after-click="true"
</NcActionButton>
<NcActionButton :close-after-click="true"
@click="onDelete">
<template #icon>
<DeleteIcon />
</template>
{{ t('bookmarks', 'Delete') }}
</ActionButton>
</NcActionButton>
</template>
</Item>
</template>
<script>
import Item from './Item'
import ActionButton from '@nextcloud/vue/dist/Components/ActionButton'
import ActionCheckbox from '@nextcloud/vue/dist/Components/ActionCheckbox'
import FolderPlusIcon from 'vue-material-design-icons/FolderPlus'
import FolderMoveIcon from 'vue-material-design-icons/FolderMove'
import ContentCopyIcon from 'vue-material-design-icons/ContentCopy'
import Item from './Item.vue'
import { NcActionButton, NcActionCheckbox } from '@nextcloud/vue'
import FolderPlusIcon from 'vue-material-design-icons/FolderPlus.vue'
import FolderMoveIcon from 'vue-material-design-icons/FolderMove.vue'
import ContentCopyIcon from 'vue-material-design-icons/ContentCopy.vue'
import PencilIcon from 'vue-material-design-icons/Pencil.vue'
import InformationVariantIcon from 'vue-material-design-icons/InformationVariant.vue'
import DeleteIcon from 'vue-material-design-icons/Delete.vue'
import { getCurrentUser } from '@nextcloud/auth'
import { generateUrl } from '@nextcloud/router'
import { actions, mutations } from '../store/'
import { actions, mutations } from '../store/index.js'
import copy from 'copy-text-to-clipboard'
import axios from '@nextcloud/axios'
@ -103,11 +102,14 @@ export default {
name: 'Bookmark',
components: {
Item,
ActionButton,
ActionCheckbox,
NcActionButton,
NcActionCheckbox,
FolderPlusIcon,
FolderMoveIcon,
ContentCopyIcon,
PencilIcon,
InformationVariantIcon,
DeleteIcon,
},
props: {
bookmark: {

View File

@ -13,26 +13,27 @@
</template>
<div v-else-if="bookmark.textContent" class="content" v-html="content" />
<div v-else>
<EmptyContent icon="icon-download">
{{ t('bookmarks', 'Content pending') }}
<template #desc>
{{ t('bookmarks', 'This content is being downloaded for offline use. Please check back later.') }}
<NcEmptyContent :title="t('bookmarks', 'Content pending')"
:description="t('bookmarks', 'This content is being downloaded for offline use. Please check back later.')">
<template #icon>
<DownloadIcon />
</template>
</EmptyContent>
</NcEmptyContent>
</div>
</div>
</template>
<script>
import DownloadIcon from 'vue-material-design-icons/Download.vue'
import sanitizeHtml from 'sanitize-html'
import { generateUrl, generateRemoteUrl } from '@nextcloud/router'
import EmptyContent from '@nextcloud/vue/dist/Components/EmptyContent'
import { NcEmptyContent } from '@nextcloud/vue'
const MIN_TEXT_LENGTH = 350
export default {
name: 'BookmarkContent',
components: { EmptyContent },
components: { NcEmptyContent, DownloadIcon },
computed: {
isActive() {
if (!this.$store.state.sidebar) return false
@ -68,7 +69,7 @@ export default {
<style>
.bookmark-content {
position: absolute;
top: 50px;/* nc header bar */
top: 0;
left: 0;
right: max( min(27vw, 500px), 300px); /* side bar */
bottom: 0;

View File

@ -6,62 +6,77 @@
<template>
<div class="bulkediting">
<Actions :primary="true" :menu-title="selectionDescription">
<ActionButton icon="icon-external" close-after-click @click="onBulkOpen">
{{ t('bookmarks', 'Open all selected') }}
</ActionButton>
<ActionButton close-after-click @click="onBulkMove">
<NcActions :primary="true" :menu-title="selectionDescription">
<NcActionButton close-after-click @click="onBulkOpen">
<template #icon>
<FolderMoveIcon :fill-color="colorMainText" class="action-button-mdi-icon" />
<OpenInNewIcon />
</template>
{{ t('bookmarks', 'Open all selected') }}
</NcActionButton>
<NcActionButton close-after-click @click="onBulkMove">
<template #icon>
<FolderMoveIcon />
</template>
{{ t('bookmarks', 'Move selection') }}
</ActionButton>
<ActionButton v-if="!selectedFolders.length" close-after-click @click="onBulkCopy">
</NcActionButton>
<NcActionButton v-if="!selectedFolders.length" close-after-click @click="onBulkCopy">
<template #icon>
<FolderPlusIcon :fill-color="colorMainText" class="action-button-mdi-icon" />
<FolderPlusIcon />
</template>
{{ t('bookmarks', 'Add to folders') }}
</ActionButton>
<ActionInput
v-if="!selectedFolders.length"
</NcActionButton>
<NcActionInput v-if="!selectedFolders.length"
:value="selectionTags"
icon="icon-tag"
type="multiselect"
:options="allTags"
:multiple="true"
:taggable="true"
@tag="onBulkTag([...selectionTags, $event])"
@input="onBulkTag">
<template #icon>
<TagIcon />
</template>
{{ t('bookmarks', 'Edit tags of selection') }}
</ActionInput>
<ActionButton icon="icon-delete" close-after-click @click="onBulkDelete">
</NcActionInput>
<NcActionButton close-after-click @click="onBulkDelete">
<template #icon>
<DeleteIcon />
</template>
{{ t('bookmarks', 'Delete selection') }}
</ActionButton>
<ActionSeparator />
<ActionButton icon="icon-checkmark" @click="onSelectAll">
</NcActionButton>
<NcActionSeparator />
<NcActionButton @click="onSelectAll">
<template #icon>
<SelectAllIcon />
</template>
{{ t('bookmarks', 'Select all') }}
</ActionButton>
<ActionButton icon="icon-close" @click="onCancelSelection">
</NcActionButton>
<NcActionButton @click="onCancelSelection">
<template #icon>
<SelectOffIcon />
</template>
{{ t('bookmarks', 'Cancel selection') }}
</ActionButton>
</Actions>
</NcActionButton>
</NcActions>
</div>
</template>
<script>
import Actions from '@nextcloud/vue/dist/Components/Actions'
import ActionInput from '@nextcloud/vue/dist/Components/ActionInput'
import ActionButton from '@nextcloud/vue/dist/Components/ActionButton'
import ActionSeparator from '@nextcloud/vue/dist/Components/ActionSeparator'
import FolderPlusIcon from 'vue-material-design-icons/FolderPlus'
import FolderMoveIcon from 'vue-material-design-icons/FolderMove'
import { actions, mutations } from '../store'
import intersection from 'lodash/intersection'
import { NcActions, NcActionSeparator, NcActionButton, NcActionInput } from '@nextcloud/vue'
import FolderPlusIcon from 'vue-material-design-icons/FolderPlus.vue'
import FolderMoveIcon from 'vue-material-design-icons/FolderMove.vue'
import OpenInNewIcon from 'vue-material-design-icons/OpenInNew.vue'
import TagIcon from 'vue-material-design-icons/Tag.vue'
import SelectAllIcon from 'vue-material-design-icons/SelectAll.vue'
import SelectOffIcon from 'vue-material-design-icons/SelectOff.vue'
import DeleteIcon from 'vue-material-design-icons/Delete.vue'
import { actions, mutations } from '../store/index.js'
import intersection from 'lodash/intersection.js'
export default {
name: 'BulkEditing',
components: { ActionInput, ActionSeparator, FolderPlusIcon, FolderMoveIcon, ActionButton, Actions },
components: { NcActionInput, NcActionSeparator, FolderPlusIcon, FolderMoveIcon, NcActionButton, NcActions, OpenInNewIcon, TagIcon, SelectAllIcon, SelectOffIcon, DeleteIcon },
data() {
return {
selectionTags: [],
@ -151,5 +166,6 @@ export default {
opacity: 1 !important;
padding: 0 !important;
margin-top: 1px;
min-width: 500px;
}
</style>

View File

@ -7,24 +7,28 @@
<template>
<div :class="['controls', $store.state.public && 'wide']">
<div class="controls__left">
<Actions v-if="$route.name === routes.FOLDER">
<ActionButton @click="onClickBack">
<ArrowLeftIcon slot="icon" :size="18" :fill-color="colorMainText" />
<NcActions v-if="$route.name === routes.FOLDER">
<NcActionButton @click="onClickBack">
<template #icon>
<ArrowLeftIcon />
</template>
{{ t('bookmarks', 'Go back') }}
</ActionButton>
</Actions>
</NcActionButton>
</NcActions>
<template v-if="$route.name === routes.FOLDER">
<h2><FolderIcon :size="18" :fill-color="colorMainText" /> <span>{{ folder.title }}</span></h2>
<Actions v-if="permissions.canShare">
<ActionButton icon="icon-share" :close-after-click="true" @click="onOpenFolderShare">
<h2><FolderIcon /> <span>{{ folder.title }}</span></h2>
<NcActions v-if="permissions.canShare">
<NcActionButton :close-after-click="true" @click="onOpenFolderShare">
<template #icon>
<ShareVariantIcon />
</template>
{{ t('bookmarks', 'Share folder') }}
</ActionButton>
</Actions>
</NcActionButton>
</NcActions>
</template>
<template v-if="$route.name === routes.TAGS">
<span class="icon-tag" />
<Multiselect
class="controls__tags"
<TagIcon />
<NcMultiselect class="controls__tags"
:value="tags"
:auto-limit="false"
:limit="7"
@ -33,101 +37,102 @@
:placeholder="t('bookmarks', 'Select one or more tags')"
@input="onTagsChange" />
</template>
<Actions
v-if="!isPublic"
<NcActions v-if="!isPublic"
v-tooltip="t('bookmarks', 'New')"
:title="t('bookmarks', 'New')"
:default-icon="'icon-add'">
<ActionButton
icon="icon-link"
:close-after-click="true"
:title="t('bookmarks', 'New')">
<template #icon>
<PlusIcon />
</template>
<NcActionButton :close-after-click="true"
@click="onAddBookmark">
<template #icon>
<EarthIcon />
</template>
{{
t('bookmarks', 'New bookmark')
}}
</ActionButton>
<ActionButton
icon="icon-folder"
:close-after-click="true"
</NcActionButton>
<NcActionButton :close-after-click="true"
@click="onAddFolder">
<template #icon>
<FolderIcon />
</template>
{{ t('bookmarks', 'New folder') }}
</ActionButton>
</Actions>
</NcActionButton>
</NcActions>
<BulkEditing v-if="hasSelection" />
</div>
<div class="controls__right">
<Actions>
<ActionButton
:icon="
viewMode === 'list'
? 'icon-toggle-pictures'
: 'icon-toggle-filelist'
"
@click="onToggleViewMode">
<NcActions>
<NcActionButton @click="onToggleViewMode">
<template #icon>
<ViewListIcon v-if="viewMode !== 'list'" />
<ViewGridIcon v-else />
</template>
{{ viewMode === 'list' ? t('bookmarks', 'Change to grid view') : t('bookmarks', 'Change to list view') }}
</ActionButton>
</Actions>
<Actions v-tooltip="sortingOptions[sorting].description">
</NcActionButton>
</NcActions>
<NcActions v-tooltip="sortingOptions[sorting].description">
<template #icon>
<component :is="sortingOptions[sorting].icon" :size="20" :fill-color="colorMainText" />
</template>
<ActionButton v-for="(option, key) in sortingOptions"
<NcActionButton v-for="(option, key) in sortingOptions"
:key="key"
:close-after-click="true"
@click="onChangeSorting(key)">
<template #icon>
<component :is="option.icon"
:size="20"
:fill-color="key === sorting? colorPrimaryElement : colorMainText" />
</template>
{{ option.description }}
</ActionButton>
</Actions>
<Actions force-menu>
</NcActionButton>
</NcActions>
<NcActions force-menu>
<template #icon>
<RssIcon :fill-color="colorMainText" :size="20" class="action-button-mdi-icon" />
<RssIcon />
</template>
<ActionButton
:title="t('bookmarks', 'Copy RSS Feed of current view')"
<NcActionButton :title="t('bookmarks', 'Copy RSS Feed of current view')"
:close-after-click="true"
@click="copyRssUrl">
<template #icon>
<RssIcon :fill-color="colorMainText" :size="20" class="action-button-mdi-icon" />
<RssIcon />
</template>
{{ !$store.state.public? t('bookmarks', 'The RSS feed requires authentication with your Nextcloud credentials') : '' }}
</ActionButton>
</Actions>
</NcActionButton>
</NcActions>
</div>
</div>
</template>
<script>
import Multiselect from '@nextcloud/vue/dist/Components/Multiselect'
import Actions from '@nextcloud/vue/dist/Components/Actions'
import ActionButton from '@nextcloud/vue/dist/Components/ActionButton'
import ActionInput from '@nextcloud/vue/dist/Components/ActionInput'
import ActionRouter from '@nextcloud/vue/dist/Components/ActionRouter'
import FolderIcon from 'vue-material-design-icons/Folder'
import ArrowLeftIcon from 'vue-material-design-icons/ArrowLeft'
import RssIcon from 'vue-material-design-icons/Rss'
import SortAlphabeticalAscendingIcon from 'vue-material-design-icons/SortAlphabeticalAscending'
import SortBoolAscendingIcon from 'vue-material-design-icons/SortBoolAscending'
import SortClockAscendingOutlineIcon from 'vue-material-design-icons/SortClockAscendingOutline'
import SortCalendarAscendingIcon from 'vue-material-design-icons/SortCalendarAscending'
import SortAscendingIcon from 'vue-material-design-icons/SortAscending'
import { actions, mutations } from '../store/'
import { NcMultiselect, NcActions, NcActionButton, NcActionInput, NcActionRouter } from '@nextcloud/vue'
import EarthIcon from 'vue-material-design-icons/Earth.vue'
import ViewGridIcon from 'vue-material-design-icons/ViewGrid.vue'
import ViewListIcon from 'vue-material-design-icons/ViewList.vue'
import PlusIcon from 'vue-material-design-icons/Plus.vue'
import FolderIcon from 'vue-material-design-icons/Folder.vue'
import ArrowLeftIcon from 'vue-material-design-icons/ArrowLeft.vue'
import RssIcon from 'vue-material-design-icons/Rss.vue'
import SortAlphabeticalAscendingIcon from 'vue-material-design-icons/SortAlphabeticalAscending.vue'
import SortBoolAscendingIcon from 'vue-material-design-icons/SortBoolAscending.vue'
import SortClockAscendingOutlineIcon from 'vue-material-design-icons/SortClockAscendingOutline.vue'
import SortCalendarAscendingIcon from 'vue-material-design-icons/SortCalendarAscending.vue'
import SortAscendingIcon from 'vue-material-design-icons/SortAscending.vue'
import ShareVariantIcon from 'vue-material-design-icons/ShareVariant.vue'
import TagIcon from 'vue-material-design-icons/Tag.vue'
import { actions, mutations } from '../store/index.js'
import { generateUrl } from '@nextcloud/router'
import BulkEditing from './BulkEditing'
import BulkEditing from './BulkEditing.vue'
import copy from 'copy-text-to-clipboard'
export default {
name: 'Controls',
components: {
BulkEditing,
Multiselect,
Actions,
ActionButton,
ActionInput,
ActionRouter,
NcMultiselect,
NcActions,
NcActionButton,
NcActionInput,
NcActionRouter,
RssIcon,
SortAscendingIcon,
SortCalendarAscendingIcon,
@ -136,6 +141,12 @@ export default {
SortBoolAscendingIcon,
FolderIcon,
ArrowLeftIcon,
PlusIcon,
ViewGridIcon,
ViewListIcon,
EarthIcon,
ShareVariantIcon,
TagIcon,
},
props: {},
data() {
@ -277,7 +288,7 @@ export default {
</script>
<style>
.controls {
padding: 0 8px 0 44px;
padding: 4px 8px 0 44px;
display: flex;
position: absolute;
z-index: 100;
@ -291,9 +302,8 @@ export default {
.controls h2 {
margin: 0;
margin-left: 10px;
margin-right: 10px;
display: flex;
position: relative;
top: -2px;
flex-shrink: 0;
}
@ -301,11 +311,6 @@ export default {
margin-left: 5px;
}
.controls h2 > .material-design-icon {
position: relative;
top: 3px;
}
.controls .action-item {
height: 45px;
}
@ -334,12 +339,6 @@ export default {
flex: 1;
}
.controls__tags .multiselect__tags {
border-top: none !important;
border-left: none !important;
border-right: none !important;
}
.controls__right {
flex: 2;
display: flex;

View File

@ -5,25 +5,25 @@
-->
<template>
<Modal v-if="showModal" :title="title" @close="onClose">
<NcModal v-if="showNcModal" :title="title" @close="onClose">
<div class="copy-dialog">
<FolderPicker :title="title" :filter="filterFolders" @submit="onSubmit" />
</div>
</Modal>
</NcModal>
</template>
<script>
import Modal from '@nextcloud/vue/dist/Components/Modal'
import { actions, mutations } from '../store/'
import FolderPicker from './FolderPicker'
import { NcModal } from '@nextcloud/vue'
import { actions, mutations } from '../store/index.js'
import FolderPicker from './FolderPicker.vue'
export default {
name: 'CopyDialog',
components: {
FolderPicker,
Modal,
NcModal,
},
computed: {
showModal() {
showNcModal() {
return this.$store.state.displayCopyDialog
},
selection() {
@ -40,7 +40,7 @@ export default {
methods: {
async onSubmit(folderId) {
this.$store.commit(mutations.DISPLAY_COPY_DIALOG, false)
await this.$store.dispatch(actions.COPY_SELECTION, folderId)
await this.$store.dispatch(actions.NcNcModal, folderId)
this.$store.commit(mutations.RESET_SELECTION)
},
onClose() {

View File

@ -6,41 +6,52 @@
<template>
<div class="bookmarkslist__emptyBookmarks">
<EmptyContent icon="icon-favorite">
{{ t('bookmarks', 'Welcome to Bookmarks') }}
<template #desc>
<p>{{ t('bookmarks', 'This app allows you to manage links to your favorite places on the web.') }}</p>
<p />
<p>{{ t('bookmarks', 'Sort your bookmarks into folders, label them with tags and share them with others! The app will regularly check all your links for availability and display unavailable links. If you add a link to a file on the web, the file will be automatically downloaded to your Nextcloud Files. You can also import bookmarks exported from other services or directly sync bookmarks from all your browsers with this app.') }}</p>
<p />
<NcEmptyContent :title="t('bookmarks', 'Welcome to Bookmarks')" :description="t('bookmarks', 'This app allows you to manage links to your favorite places on the web. Sort your bookmarks into folders, label them with tags and share them with others! The app will regularly check all your links for availability and display unavailable links. If you add a link to a file on the web, the file will be automatically downloaded to your Nextcloud Files. You can also import bookmarks exported from other services or directly sync bookmarks from all your browsers with this app.')">
<template #icon>
<StarShootingIcon />
</template>
<template #action>
<input ref="import"
type="file"
class="import"
size="5"
@change="onImportSubmit">
<button @click="onCreateOpen">
<NcButton @click="onCreateOpen">
<template #icon>
<PlusIcon />
</template>
{{ t('bookmarks', 'Add a bookmark') }}
</button>
<button @click="onImportOpen">
<span :class="{'icon-upload': !importing, 'icon-loading-small': importing}" /> {{ t('bookmarks', 'Import bookmarks') }}
</button>
<button @click="onSyncOpen">
<SyncIcon :fill-color="colorMainText" :size="18" :style="{opacity: 0.5, display: 'inline'}" /> {{ t('bookmarks', 'Sync with your browser') }}
</button>
</NcButton>
<NcButton @click="onImportOpen">
<template #icon>
<UploadIcon v-if="!importing" />
<NcLoadingIcon v-else />
</template>
{{ t('bookmarks', 'Import bookmarks') }}
</NcButton>
<NcButton @click="onSyncOpen">
<template #icon>
<SyncIcon />
</template>
{{ t('bookmarks', 'Sync with your browser') }}
</NcButton>
</template>
</EmptyContent>
</NcEmptyContent>
</div>
</template>
<script>
import EmptyContent from '@nextcloud/vue/dist/Components/EmptyContent'
import { actions, mutations } from '../store'
import { privateRoutes } from '../router'
import SyncIcon from 'vue-material-design-icons/Sync'
import { NcEmptyContent, NcButton, NcLoadingIcon } from '@nextcloud/vue'
import { actions, mutations } from '../store/index.js'
import { privateRoutes } from '../router.js'
import SyncIcon from 'vue-material-design-icons/Sync.vue'
import PlusIcon from 'vue-material-design-icons/Plus.vue'
import UploadIcon from 'vue-material-design-icons/Upload.vue'
import StarShootingIcon from 'vue-material-design-icons/StarShooting.vue'
export default {
name: 'FirstRun',
components: { EmptyContent, SyncIcon },
components: { NcEmptyContent, SyncIcon, NcButton, PlusIcon, UploadIcon, NcLoadingIcon, StarShootingIcon },
data() {
return { importing: false }
},
@ -84,13 +95,7 @@ export default {
left: -1000px;
}
.material-design-icon {
position: relative;
top: 4px;
display: inline-flex;
}
p {
button {
margin-bottom: 15px;
}
</style>

View File

@ -39,52 +39,69 @@
</div>
</template>
<template #actions>
<ActionButton icon="icon-info" :close-after-click="true" @click="onDetails">
<NcActionButton :close-after-click="true" @click="onDetails">
<template #icon>
<InformationVariantIcon />
</template>
{{ t('bookmarks', 'Details') }}
</ActionButton>
<ActionCheckbox @change="clickSelect">
</NcActionButton>
<NcActionCheckbox @change="clickSelect">
{{ t('bookmarks', 'Select folder') }}
</ActionCheckbox>
<ActionButton v-if="permissions.canShare"
</NcActionCheckbox>
<NcActionButton v-if="permissions.canShare"
icon="icon-share"
:close-after-click="true"
@click="onShare">
<template #icon>
<ShareVariantIcon />
</template>
{{ t('bookmarks', 'Share folder') }}
</ActionButton>
<ActionButton icon="icon-rename" :close-after-click="true" @click="onRename">
</NcActionButton>
<NcActionButton :close-after-click="true" @click="onRename">
<template #icon>
<PencilIcon />
</template>
{{ t('bookmarks', 'Rename folder') }}
</ActionButton>
<ActionButton :close-after-click="true" @click="onMove">
</NcActionButton>
<NcActionButton :close-after-click="true" @click="onMove">
<template #icon>
<FolderMoveIcon :fill-color="colorMainText" />
</template>
{{ t('bookmarks', 'Move folder') }}
</ActionButton>
<ActionButton icon="icon-delete" :close-after-click="true" @click="onDelete">
</NcActionButton>
<NcActionButton :close-after-click="true" @click="onDelete">
<template #icon>
<DeleteIcon />
</template>
{{ t('bookmarks', 'Delete folder') }}
</ActionButton>
</NcActionButton>
</template>
</Item>
</template>
<script>
import { getCurrentUser } from '@nextcloud/auth'
import FolderMoveIcon from 'vue-material-design-icons/FolderMove'
import FolderIcon from 'vue-material-design-icons/Folder'
import ShareVariantIcon from 'vue-material-design-icons/ShareVariant'
import ActionButton from '@nextcloud/vue/dist/Components/ActionButton'
import ActionCheckbox from '@nextcloud/vue/dist/Components/ActionCheckbox'
import { actions, mutations } from '../store/'
import Item from './Item'
import FolderMoveIcon from 'vue-material-design-icons/FolderMove.vue'
import FolderIcon from 'vue-material-design-icons/Folder.vue'
import ShareVariantIcon from 'vue-material-design-icons/ShareVariant.vue'
import DeleteIcon from 'vue-material-design-icons/Delete.vue'
import PencilIcon from 'vue-material-design-icons/Pencil.vue'
import InformationVariantIcon from 'vue-material-design-icons/InformationVariant.vue'
import { NcActionButton, NcActionCheckbox } from '@nextcloud/vue'
import { actions, mutations } from '../store/index.js'
import Item from './Item.vue'
export default {
name: 'Folder',
components: {
Item,
ActionButton,
ActionCheckbox,
NcActionButton,
NcActionCheckbox,
FolderIcon,
FolderMoveIcon,
ShareVariantIcon,
DeleteIcon,
PencilIcon,
InformationVariantIcon,
},
props: {
folder: {

View File

@ -5,16 +5,16 @@
-->
<template>
<AppContentList :show-details="showDetails" @update:show-details="$emit('update:show-details', $event)">
<NcAppContentList :show-details="showDetails" @update:show-details="$emit('update:show-details', $event)">
<TreeFolder v-for="folder in rootFolder.children"
:key="folder.id"
:folder="folder"
@select="onSelect($event)" />
</AppContentList>
</NcAppContentList>
</template>
<script>
import AppContentList from '@nextcloud/vue/dist/Components/AppContentList'
import { NcAppContentList } from '@nextcloud/vue'
import TreeFolder from './TreeFolder'
import { privateRoutes } from '../router'
@ -22,7 +22,7 @@ export default {
name: 'FolderOverview',
components: {
TreeFolder,
AppContentList,
NcAppContentList,
},
props: {
showDetails: {

View File

@ -8,12 +8,12 @@
<div class="folderpicker">
<h2>{{ title }}</h2>
<div class="currentfolder">
<Actions v-if="currentFolder.id !== -1">
<ActionButton @click="onSelect(currentFolder.parent_folder)">
<NcActions v-if="currentFolder.id !== -1">
<NcActionButton @click="onSelect(currentFolder.parent_folder)">
<ArrowLeftIcon slot="icon" :size="18" :fill-color="colorMainText" />
{{ t('bookmarks', 'Go back') }}
</ActionButton>
</Actions>
</NcActionButton>
</NcActions>
<h2 v-if="currentFolder.id !== -1">
<FolderIcon :fill-color="colorMainText" /><span>{{ currentFolder.title }}</span>
</h2>
@ -35,19 +35,18 @@
</template>
<script>
import Actions from '@nextcloud/vue/dist/Components/Actions'
import ActionButton from '@nextcloud/vue/dist/Components/ActionButton'
import FolderIcon from 'vue-material-design-icons/Folder'
import ArrowLeftIcon from 'vue-material-design-icons/ArrowLeft'
import HomeIcon from 'vue-material-design-icons/Home'
import TreeFolder from './TreeFolder'
import { NcActions, NcActionButton } from '@nextcloud/vue'
import FolderIcon from 'vue-material-design-icons/Folder.vue'
import ArrowLeftIcon from 'vue-material-design-icons/ArrowLeft.vue'
import HomeIcon from 'vue-material-design-icons/Home.vue'
import TreeFolder from './TreeFolder.vue'
export default {
name: 'FolderPicker',
components: {
TreeFolder,
Actions,
ActionButton,
NcActions,
NcActionButton,
FolderIcon,
ArrowLeftIcon,
HomeIcon,

View File

@ -5,21 +5,21 @@
-->
<template>
<Modal v-if="show" :title="t('bookmarks', 'Select folder')" @close="onClose">
<NcModal v-if="show" :title="t('bookmarks', 'Select folder')" @close="onClose">
<div class="folderpicker-dialog">
<FolderPicker :title="t('bookmarks', 'Select folder')" @submit="onSelect" />
</div>
</Modal>
</NcModal>
</template>
<script>
import Modal from '@nextcloud/vue/dist/Components/Modal'
import FolderPicker from './FolderPicker'
import { NcModal } from '@nextcloud/vue'
import FolderPicker from './FolderPicker.vue'
export default {
name: 'FolderPickerDialog',
components: {
FolderPicker,
Modal,
NcModal,
},
props: {
value: {

View File

@ -5,8 +5,7 @@
-->
<template>
<div
v-drop-target="{allow: allowDrop, drop: (e) => $emit('drop', e)}"
<div v-drop-target="{allow: allowDrop, drop: (e) => $emit('drop', e)}"
:class="{
item: true,
active,
@ -16,16 +15,14 @@
:draggable="draggable && !renaming"
@dragstart="onDragStart">
<template v-if="!renaming">
<a
:href="url"
<a :href="url"
class="item__clickLink"
tabindex="0"
target="_blank"
@click="onClick"
@contextmenu="onRightClick">
<div v-if="editable && selectable" ref="checkbox" class="item__checkbox">
<input :checked="selected" class="checkbox" type="checkbox"><label
v-tooltip="selectLabel"
<input :checked="selected" class="checkbox" type="checkbox"><label v-tooltip="selectLabel"
:aria-label="selectLabel"
@click="$event.preventDefault(); $event.stopImmediatePropagation(); $emit('select');" />
</div>
@ -38,48 +35,46 @@
</div>
<div v-if="editable && !selected"
ref="actions"
class="item__actions"
class="item__NcActions"
@click="$event.preventDefault(); $event.stopPropagation()">
<Actions ref="actions">
<NcActions ref="actions">
<slot name="actions" />
</Actions>
</NcActions>
</div>
</a>
</template>
<div v-else class="item__rename">
<slot name="icon" />
<input
ref="input"
<input ref="input"
v-model="newTitle"
type="text"
:placeholder="renamePlaceholder"
@keyup.enter="onRenameSubmit">
<Actions>
<ActionButton icon="icon-checkmark" @click="onRenameSubmit">
<NcActions>
<NcActionButton icon="icon-checkmark" @click="onRenameSubmit">
{{ t('bookmarks', 'Submit') }}
</ActionButton>
</Actions>
<Actions>
<ActionButton icon="icon-close" @click="$emit('rename-cancel')">
</NcActionButton>
</NcActions>
<NcActions>
<NcActionButton icon="icon-close" @click="$emit('rename-cancel')">
{{ t('bookmarks', 'Cancel') }}
</ActionButton>
</Actions>
</NcActionButton>
</NcActions>
</div>
</div>
</template>
<script>
import Vue from 'vue'
import Actions from '@nextcloud/vue/dist/Components/Actions'
import ActionButton from '@nextcloud/vue/dist/Components/ActionButton'
import TagLine from './TagLine'
import DragImage from './DragImage'
import { mutations } from '../store'
import { NcActions, NcActionButton } from '@nextcloud/vue'
import TagLine from './TagLine.vue'
import DragImage from './DragImage.vue'
import { mutations } from '../store/index.js'
export default {
name: 'Item',
components: {
Actions,
ActionButton,
NcActions,
NcActionButton,
TagLine,
},
props: {
@ -308,7 +303,7 @@ export default {
box-shadow: #aaa 0 0 3px inset;
}
.item__actions {
.item__NcActions {
flex: 0;
}

View File

@ -1,17 +1,17 @@
<template>
<Modal v-if="showModal" :can-close="false">
<NcModal v-if="showNcModal" :can-close="false">
<div class="loading icon-loading">
<h3>{{ title }}</h3>
</div>
</Modal>
</NcModal>
</template>
<script>
import Modal from '@nextcloud/vue/dist/Components/Modal'
import { NcModal } from '@nextcloud/vue'
export default {
name: 'LoadingModal',
components: {
Modal,
NcModal,
},
data() {
return {
@ -22,7 +22,7 @@ export default {
moveSelection: this.t('bookmkarks', 'Moving selection'),
copySelection: this.t('bookmkarks', 'Adding selection to folders'),
},
showModal: false,
showNcModal: false,
showTimeout: null,
}
},
@ -43,11 +43,11 @@ export default {
state(newState, previous) {
if (this.state && !previous) {
this.showTimeout = setTimeout(() => {
this.showModal = true
this.showNcModal = true
}, 500)
} else if (!this.state && previous) {
clearTimeout(this.showTimeout)
this.showModal = false
this.showNcModal = false
}
},
},

View File

@ -5,25 +5,25 @@
-->
<template>
<Modal v-if="showModal" :title="title" @close="onClose">
<NcModal v-if="showNcModal" :title="title" @close="onClose">
<div class="move-dialog">
<FolderPicker :title="title" :filter="filterFolders" @submit="onSubmit" />
</div>
</Modal>
</NcModal>
</template>
<script>
import Modal from '@nextcloud/vue/dist/Components/Modal'
import { actions, mutations } from '../store/'
import FolderPicker from './FolderPicker'
import { NcModal } from '@nextcloud/vue'
import { actions, mutations } from '../store/index.js'
import FolderPicker from './FolderPicker.vue'
export default {
name: 'MoveDialog',
components: {
FolderPicker,
Modal,
NcModal,
},
computed: {
showModal() {
showNcModal() {
return this.$store.state.displayMoveDialog
},
selection() {

View File

@ -5,142 +5,140 @@
-->
<template>
<AppNavigation class="navigation">
<NcAppNavigation class="navigation">
<template #list>
<AppNavigationItem key="menu-home"
<NcAppNavigationItem key="menu-home"
:to="{ name: routes.HOME }"
icon="icon-home"
:title="t('bookmarks', 'All bookmarks')"
:exact="true">
<AppNavigationCounter slot="counter">
<HomeIcon slot="icon" />
<NcAppNavigationCounter slot="counter">
{{ allBookmarksCount | largeNumbers }}
</AppNavigationCounter>
</AppNavigationItem>
<AppNavigationItem key="menu-recent"
</NcAppNavigationCounter>
</NcAppNavigationItem>
<NcAppNavigationItem key="menu-recent"
:to="{ name: routes.RECENT }"
:title="t('bookmarks', 'Recent')">
<HistoryIcon slot="icon" :size="18" :fill-color="colorMainText" />
</AppNavigationItem>
<AppNavigationItem
key="menu-shared-folders"
<HistoryIcon slot="icon" />
</NcAppNavigationItem>
<NcAppNavigationItem key="menu-shared-folders"
:to="{ name: routes.SHARED_FOLDERS }"
:title="t('bookmarks', 'Shared with you')">
<ShareVariantIcon slot="icon" :size="18" :fill-color="colorMainText" />
<AppNavigationCounter v-show="Boolean(sharedFoldersCount)" slot="counter">
<ShareVariantIcon slot="icon" />
<NcAppNavigationCounter v-show="Boolean(sharedFoldersCount)" slot="counter">
{{ sharedFoldersCount | largeNumbers }}
</AppNavigationCounter>
</AppNavigationItem>
<AppNavigationItem
key="menu-archived"
</NcAppNavigationCounter>
</NcAppNavigationItem>
<NcAppNavigationItem key="menu-archived"
:to="{ name: routes.ARCHIVED }"
:title="t('bookmarks', 'Files')">
<FileDocumentMultipleIcon slot="icon"
:size="18"
:fill-color="colorMainText" />
<AppNavigationCounter v-show="Boolean(archivedBookmarksCount)" slot="counter">
<FileDocumentMultipleIcon slot="icon" />
<NcAppNavigationCounter v-show="Boolean(archivedBookmarksCount)" slot="counter">
{{ archivedBookmarksCount }}
</AppNavigationCounter>
</AppNavigationItem>
<AppNavigationItem
key="menu-duplicated"
</NcAppNavigationCounter>
</NcAppNavigationItem>
<NcAppNavigationItem key="menu-duplicated"
:to="{ name: routes.DUPLICATED }"
:title="t('bookmarks', 'Duplicates')">
<VectorLinkIcon slot="icon" :size="18" :fill-color="colorMainText" />
<AppNavigationCounter v-show="Boolean(duplicatedBookmarksCount)" slot="counter">
<VectorLinkIcon slot="icon" />
<NcAppNavigationCounter v-show="Boolean(duplicatedBookmarksCount)" slot="counter">
{{ duplicatedBookmarksCount | largeNumbers }}
</AppNavigationCounter>
</AppNavigationItem>
<AppNavigationItem
key="menu-unavailable"
</NcAppNavigationCounter>
</NcAppNavigationItem>
<NcAppNavigationItem key="menu-unavailable"
:to="{ name: routes.UNAVAILABLE }"
:title="t('bookmarks', 'Broken links')">
<LinkVariantOffIcon slot="icon" :size="18" :fill-color="colorMainText" />
<AppNavigationCounter v-show="Boolean(unavailableBookmarksCount)" slot="counter">
<LinkVariantOffIcon slot="icon" />
<NcAppNavigationCounter v-show="Boolean(unavailableBookmarksCount)" slot="counter">
{{ unavailableBookmarksCount | largeNumbers }}
</AppNavigationCounter>
</AppNavigationItem>
<AppNavigationSpacer />
<AppNavigationNewItem key="menu-new-tag"
</NcAppNavigationCounter>
</NcAppNavigationItem>
<NcAppNavigationSpacer />
<NcAppNavigationNewItem key="menu-new-tag"
:title="t('bookmarks', 'New tag')"
@new-item="onNewTag">
<TagPlusIcon slot="icon" :size="18" :fill-color="colorMainText" />
</AppNavigationNewItem>
<TagPlusIcon slot="icon" />
</NcAppNavigationNewItem>
<template v-if="Boolean(tags.length)">
<AppNavigationItem key="menu-tags"
<NcAppNavigationItem key="menu-tags"
:title="t('bookmarks', 'Search tags')"
@click="onSearchTags">
<TagMultipleIcon slot="icon" :size="18" :fill-color="colorMainText" />
</AppNavigationItem>
<AppNavigationItem v-for="tag in tags"
<TagMultipleIcon slot="icon" />
</NcAppNavigationItem>
<NcAppNavigationItem v-for="tag in tags"
:key="'tag-'+tag.name"
v-drop-target="{allow: (e) => allowDropOnTag(tag.name, e), drop: (e) => onDropOnTag(tag.name, e)}"
icon="icon-tag"
:to="tag.route"
:force-menu="true"
:edit-label="t('bookmarks', 'Rename')"
:editable="!isPublic"
:title="tag.name"
@update:title="onRenameTag(tag.name, $event)">
<AppNavigationCounter slot="counter">
<TagIcon slot="icon" />
<NcAppNavigationCounter slot="counter">
{{ tag.count | largeNumbers }}
</AppNavigationCounter>
</NcAppNavigationCounter>
<template v-if="!isPublic" slot="actions">
<ActionButton icon="icon-delete" :close-after-click="true" @click="onDeleteTag(tag.name)">
<NcActionButton :close-after-click="true" @click="onDeleteTag(tag.name)">
<template #icon>
<DeleteIcon />
</template>
{{ t('bookmarks', 'Delete') }}
</ActionButton>
</NcActionButton>
</template>
</AppNavigationItem>
<AppNavigationItem key="menu-untagged"
</NcAppNavigationItem>
<NcAppNavigationItem key="menu-untagged"
:to="{ name: routes.UNTAGGED }"
:title="t('bookmarks', 'Untagged')">
<TagOffIcon slot="icon" :size="18" :fill-color="colorMainText" />
</AppNavigationItem>
<TagOffIcon slot="icon" />
</NcAppNavigationItem>
</template>
<template v-if="Number(bookmarksLimit) > 0">
<AppNavigationSpacer />
<AppNavigationItem :pinned="true" icon="icon-quota" :title="t('bookmarks', '{used} bookmarks of {available} available', {used: allBookmarksCount, available: bookmarksLimit})">
<NcAppNavigationSpacer />
<NcAppNavigationItem :pinned="true" :title="t('bookmarks', '{used} bookmarks of {available} available', {used: allBookmarksCount, available: bookmarksLimit})">
<template #icon>
<GaugeIcon />
</template>
<ProgressBar :val="allBookmarksCount" :max="bookmarksLimit" />
</AppNavigationItem>
</NcAppNavigationItem>
</template>
</template>
<template #footer>
<AppNavigationSettings v-if="!isPublic">
<NcAppNavigationSettings v-if="!isPublic">
<Settings />
</AppNavigationSettings>
</NcAppNavigationSettings>
</template>
</AppNavigation>
</NcAppNavigation>
</template>
<script>
import AppNavigation from '@nextcloud/vue/dist/Components/AppNavigation'
import AppNavigationItem from '@nextcloud/vue/dist/Components/AppNavigationItem'
import AppNavigationNewItem from '@nextcloud/vue/dist/Components/AppNavigationNewItem'
import AppNavigationCounter from '@nextcloud/vue/dist/Components/AppNavigationCounter'
import AppNavigationSettings from '@nextcloud/vue/dist/Components/AppNavigationSettings'
import AppNavigationSpacer from '@nextcloud/vue/dist/Components/AppNavigationSpacer'
import ActionButton from '@nextcloud/vue/dist/Components/ActionButton'
import HistoryIcon from 'vue-material-design-icons/History'
import TagOffIcon from 'vue-material-design-icons/TagOff'
import LinkVariantOffIcon from 'vue-material-design-icons/LinkVariantOff'
import ShareVariantIcon from 'vue-material-design-icons/ShareVariant'
import FileDocumentMultipleIcon from 'vue-material-design-icons/FileDocumentMultiple'
import TagPlusIcon from 'vue-material-design-icons/TagPlus'
import TagMultipleIcon from 'vue-material-design-icons/TagMultiple'
import VectorLinkIcon from 'vue-material-design-icons/VectorLink'
import { NcActionButton, NcAppNavigation, NcAppNavigationItem, NcAppNavigationNewItem, NcAppNavigationCounter, NcAppNavigationSettings, NcAppNavigationSpacer } from '@nextcloud/vue'
import HomeIcon from 'vue-material-design-icons/Home.vue'
import HistoryIcon from 'vue-material-design-icons/History.vue'
import TagOffIcon from 'vue-material-design-icons/TagOff.vue'
import LinkVariantOffIcon from 'vue-material-design-icons/LinkVariantOff.vue'
import ShareVariantIcon from 'vue-material-design-icons/ShareVariant.vue'
import FileDocumentMultipleIcon from 'vue-material-design-icons/FileDocumentMultiple.vue'
import TagPlusIcon from 'vue-material-design-icons/TagPlus.vue'
import TagMultipleIcon from 'vue-material-design-icons/TagMultiple.vue'
import VectorLinkIcon from 'vue-material-design-icons/VectorLink.vue'
import TagIcon from 'vue-material-design-icons/Tag.vue'
import DeleteIcon from 'vue-material-design-icons/Delete.vue'
import GaugeIcon from 'vue-material-design-icons/Gauge.vue'
import ProgressBar from 'vue-simple-progress'
import Settings from './Settings'
import { actions, mutations } from '../store/'
import Settings from './Settings.vue'
import { actions, mutations } from '../store/index.js'
export default {
name: 'Navigation',
components: {
AppNavigation,
AppNavigationItem,
AppNavigationNewItem,
AppNavigationCounter,
AppNavigationSettings,
AppNavigationSpacer,
ActionButton,
NcAppNavigation,
NcAppNavigationItem,
NcAppNavigationNewItem,
NcAppNavigationCounter,
NcAppNavigationSettings,
NcAppNavigationSpacer,
NcActionButton,
Settings,
ProgressBar,
HistoryIcon,
@ -151,6 +149,10 @@ export default {
FileDocumentMultipleIcon,
ShareVariantIcon,
VectorLinkIcon,
HomeIcon,
TagIcon,
DeleteIcon,
GaugeIcon,
},
filters: {

View File

@ -6,57 +6,79 @@
<template>
<div class="bookmarkslist__emptyBookmarks">
<EmptyContent v-if="$route.name === routes.ARCHIVED">
{{ t('bookmarks', 'No bookmarked files') }}
<template #desc>
{{ t('bookmarks', 'Bookmarks to files like photos or PDFs will automatically be saved to your Nextcloud files, so you can still find them even when the link goes offline.') }}
<NcEmptyContent v-if="$route.name === routes.ARCHIVED"
:title="t('bookmarks', 'No bookmarked files')"
:description="t('bookmarks', 'Bookmarks to files like photos or PDFs will automatically be saved to your Nextcloud files, so you can still find them even when the link goes offline.')">
<template #icon>
<FileDocumentMultipleIcon />
</template>
</EmptyContent>
<EmptyContent v-else-if="$route.name === routes.UNAVAILABLE">
{{ t('bookmarks', 'No broken links') }}
<template #desc>
{{ t('bookmarks', 'Bookmarked links are checked regularly and the ones that cannot be reached are listed here.') }}
</NcEmptyContent>
<NcEmptyContent v-else-if="$route.name === routes.UNAVAILABLE"
:title="t('bookmarks', 'No broken links')"
:description="t('bookmarks', 'Bookmarked links are checked regularly and the ones that cannot be reached are listed here.')">
<template #icon>
<LinkVariantOffIcon />
</template>
</EmptyContent>
<EmptyContent v-else-if="$route.name === routes.SHARED_FOLDERS">
{{ t('bookmarks', 'No shared folders') }}
<template #desc>
{{ t('bookmarks', 'You can share bookmark folders with others. All folders shared with you are listed here.') }}
</NcEmptyContent>
<NcEmptyContent v-else-if="$route.name === routes.SHARED_FOLDERS"
:title="t('bookmarks', 'No shared folders')"
:description="t('bookmarks', 'You can share bookmark folders with others. All folders shared with you are listed here.')">
<template #icon>
<ShareVariantIcon />
</template>
</EmptyContent>
<EmptyContent v-else-if="$route.name === routes.DUPLICATED">
{{ t('bookmarks', 'No duplicated bookmarks') }}
<template #desc>
{{ t('bookmarks', 'One bookmark can be in multiple folders at once. Updating it will update all copies. All duplicated bookmarks are listed here for convenience.') }}
</NcEmptyContent>
<NcEmptyContent v-else-if="$route.name === routes.DUPLICATED"
:title="t('bookmarks', 'No duplicated bookmarks')"
:description="t('bookmarks', 'One bookmark can be in multiple folders at once. Updating it will update all copies. All duplicated bookmarks are listed here for convenience.')">
<template #icon>
<VectorLinkIcon />
</template>
</EmptyContent>
<EmptyContent v-else icon="icon-favorite">
{{ t('bookmarks', 'No bookmarks here') }}
<template v-if="!isPublic" #desc>
<p>{{ t('bookmarks', 'Add bookmarks manually or import bookmarks from a HTML file.') }}</p>
</NcEmptyContent>
<NcEmptyContent v-else
:title="t('bookmarks', 'No bookmarks here')"
:description="t('bookmarks', 'Add bookmarks manually or import bookmarks from a HTML file.')">
<template #icon>
<StarShootingIcon />
</template>
<template v-if="!isPublic" #action>
<input ref="import"
type="file"
class="import"
size="5"
@change="onImportSubmit">
<button @click="onCreateOpen">
<NcButton @click="onCreateOpen">
<template #icon>
<PlusIcon />
</template>
{{ t('bookmarks', 'Add a bookmark') }}
</button>
<button @click="onImportOpen">
<span :class="{'icon-upload': !importing, 'icon-loading-small': importing}" /> {{ t('bookmarks', 'Import bookmarks') }}
</button>
</NcButton>
<NcButton @click="onImportOpen">
<template #icon>
<UploadIcon v-if="!importing" />
<NcLoadingIcon v-else />
</template>
{{ t('bookmarks', 'Import bookmarks') }}
</NcButton>
</template>
</EmptyContent>
</NcEmptyContent>
</div>
</template>
<script>
import EmptyContent from '@nextcloud/vue/dist/Components/EmptyContent'
import { actions, mutations } from '../store'
import { privateRoutes } from '../router'
import { NcEmptyContent, NcButton, NcLoadingIcon } from '@nextcloud/vue'
import { actions, mutations } from '../store/index.js'
import { privateRoutes } from '../router.js'
import StarShootingIcon from 'vue-material-design-icons/StarShooting.vue'
import UploadIcon from 'vue-material-design-icons/Upload.vue'
import PlusIcon from 'vue-material-design-icons/Plus.vue'
import ShareVariantIcon from 'vue-material-design-icons/ShareVariant.vue'
import VectorLinkIcon from 'vue-material-design-icons/VectorLink.vue'
import LinkVariantOffIcon from 'vue-material-design-icons/LinkVariantOff.vue'
import FileDocumentMultipleIcon from 'vue-material-design-icons/FileDocumentMultiple.vue'
export default {
name: 'NoBookmarks',
components: { EmptyContent },
components: { NcEmptyContent, StarShootingIcon, NcButton, NcLoadingIcon, UploadIcon, PlusIcon, ShareVariantIcon, VectorLinkIcon, LinkVariantOffIcon, FileDocumentMultipleIcon },
data() {
return { importing: false }
},
@ -97,13 +119,7 @@ export default {
left: -1000px;
}
.material-design-icon {
position: relative;
top: 4px;
display: inline-flex;
}
p {
button {
margin-bottom: 15px;
}
</style>

View File

@ -5,8 +5,7 @@
-->
<template>
<AppSidebar
v-if="isActive"
<NcAppSidebar v-if="isActive"
class="sidebar"
:title="bookmark.title"
:title-editable="editingTitle"
@ -19,50 +18,70 @@
@dismiss-editing="onEditTitleCancel"
@close="onClose">
<template v-if="!editingTitle" slot="secondary-actions">
<ActionButton icon="icon-rename" @click="onEditTitle" />
<NcActionButton @click="onEditTitle">
<template #icon>
<PencilIcon />
</template>
</NcActionButton>
</template>
<template v-if="editingTitle" slot="secondary-actions">
<ActionButton icon="icon-close" @click="onEditTitleCancel" />
<NcActionButton @click="onEditTitleCancel">
<template #icon>
<CloseIcon />
</template>
</NcActionButton>
</template>
<AppSidebarTab
id="bookmark-details"
<NcAppSidebarTab id="bookmark-details"
:name="t('bookmarks', 'Details')"
icon="icon-info"
:order="0">
<template #icon>
<InformationVariantIcon />
</template>
<div>
<div v-if="!editingUrl" class="details__line">
<span class="icon-external" :aria-label="t('bookmarks', 'Link')" :title="t('bookmarks', 'Link')" />
<OpenInNewIcon :aria-label="t('bookmarks', 'Link')" :title="t('bookmarks', 'Link')" />
<a class="details__url" :href="bookmark.url">{{ bookmark.url }}</a>
<Actions v-if="isEditable" class="details__action">
<ActionButton icon="icon-rename" @click="onEditUrl" />
</Actions>
<NcActions v-if="isEditable" class="details__action">
<NcActionButton @click="onEditUrl">
<template #icon>
<PencilIcon />
</template>
</NcActionButton>
</NcActions>
</div>
<div v-else class="details__line">
<span class="icon-external" :aria-label="t('bookmarks', 'Link')" :title="t('bookmarks', 'Link')" />
<OpenInNewIcon :aria-label="t('bookmarks', 'Link')" :title="t('bookmarks', 'Link')" />
<input v-model="url" class="details__url">
<Actions class="details__action">
<ActionButton icon="icon-confirm" @click="onEditUrlSubmit" />
</Actions>
<Actions class="details__action">
<ActionButton icon="icon-close" @click="onEditUrlCancel" />
</Actions>
<NcActions class="details__action">
<NcActionButton @click="onEditUrlSubmit">
<template #icon>
<ArrowRightIcon />
</template>
</NcActionButton>
</NcActions>
<NcActions class="details__action">
<NcActionButton @click="onEditUrlCancel">
<template #icon>
<CloseIcon />
</template>
</NcActionButton>
</NcActions>
</div>
<div class="details__line">
<FolderIcon :fill-color="colorMainText" size="18" />
<FolderIcon />
<div class="folders">
<span v-for="folderId in bookmark.folders"
:key="folderId"
v-tooltip="getFolderPath(folderId)"
class="folders__folder"
@click="onOpenFolder(folderId)">
<FolderIcon :fill-color="colorMainText" /> {{ getFolder(folderId).title || (getFolder(folderId).parent_folder ? t('bookmarks', 'Untitled folder') : t('bookmarks', 'Root folder')) }}
<FolderIcon /> {{ getFolder(folderId).title || (getFolder(folderId).parent_folder ? t('bookmarks', 'Untitled folder') : t('bookmarks', 'Root folder')) }}
</span>
</div>
</div>
<div class="details__line">
<span class="icon-tag" :aria-label="t('bookmarks', 'Tags')" :title="t('bookmarks', 'Tags')" />
<Multiselect
class="tags"
<TagIcon :aria-label="t('bookmarks', 'Tags')" :title="t('bookmarks', 'Tags')" />
<NcMultiselect class="tags"
:value="tags"
:auto-limit="false"
:limit="7"
@ -76,12 +95,10 @@
@tag="onAddTag" />
</div>
<div class="details__line">
<span class="icon-edit"
role="figure"
<PencilBoxIcon role="figure"
:aria-label="t('bookmarks', 'Notes')"
:title="t('bookmarks', 'Notes')" />
<RichContenteditable
:value.sync="bookmark.description"
<NcRichContenteditable :value.sync="bookmark.description"
:contenteditable="isEditable"
:auto-complete="() => {}"
:placeholder="t('bookmarks', 'Notes for this bookmark …')"
@ -95,40 +112,31 @@
<a class="button" :href="archivedFileUrl" target="_blank"><FileDocumentIcon :size="18" :fill-color="colorMainText" /> {{ t('bookmarks', 'Open file') }}</a>
<a class="button" :href="archivedFile" target="_blank"><span class="icon-files-dark" /> {{ t('bookmarks', 'Open file location') }}</a>
</div>
</AppSidebarTab>
<AppSidebarTab v-if="!isPublic"
id="bookmark-projects"
:name="t('bookmarks', 'Projects')"
icon="icon-projects"
:order="1">
<CollectionList v-if="bookmark"
:id="''+bookmark.id"
:name="bookmark.title"
type="bookmarks" />
</AppSidebarTab>
</AppSidebar>
</NcAppSidebarTab>
</NcAppSidebar>
</template>
<script>
import AppSidebar from '@nextcloud/vue/dist/Components/AppSidebar'
import AppSidebarTab from '@nextcloud/vue/dist/Components/AppSidebarTab'
import Multiselect from '@nextcloud/vue/dist/Components/Multiselect'
import Actions from '@nextcloud/vue/dist/Components/Actions'
import ActionButton from '@nextcloud/vue/dist/Components/ActionButton'
import RichContenteditable from '@nextcloud/vue/dist/Components/RichContenteditable'
import FileDocumentIcon from 'vue-material-design-icons/FileDocument'
import FolderIcon from 'vue-material-design-icons/Folder'
import { CollectionList } from 'nextcloud-vue-collections'
import { NcAppSidebar, NcRichContenteditable, NcActionButton, NcActions, NcMultiselect, NcAppSidebarTab } from '@nextcloud/vue'
import FileDocumentIcon from 'vue-material-design-icons/FileDocument.vue'
import FolderIcon from 'vue-material-design-icons/Folder.vue'
import InformationVariantIcon from 'vue-material-design-icons/InformationVariant.vue'
import PencilIcon from 'vue-material-design-icons/Pencil.vue'
import ArrowRightIcon from 'vue-material-design-icons/ArrowRight.vue'
import TagIcon from 'vue-material-design-icons/Tag.vue'
import OpenInNewIcon from 'vue-material-design-icons/OpenInNew.vue'
import CloseIcon from 'vue-material-design-icons/Close.vue'
import PencilBoxIcon from 'vue-material-design-icons/PencilBox.vue'
import { getCurrentUser } from '@nextcloud/auth'
import { generateRemoteUrl, generateUrl } from '@nextcloud/router'
import humanizeDuration from 'humanize-duration'
import { actions, mutations } from '../store/'
import { actions, mutations } from '../store/index.js'
const MAX_RELATIVE_DATE = 1000 * 60 * 60 * 24 * 7 // one week
export default {
name: 'SidebarBookmark',
components: { AppSidebar, AppSidebarTab, Multiselect, Actions, ActionButton, RichContenteditable, FileDocumentIcon, FolderIcon, CollectionList },
components: { NcAppSidebar, NcAppSidebarTab, NcMultiselect, NcActions, NcActionButton, NcRichContenteditable, FileDocumentIcon, FolderIcon, InformationVariantIcon, PencilIcon, ArrowRightIcon, TagIcon, OpenInNewIcon, CloseIcon, PencilBoxIcon },
data() {
return {
title: '',

View File

@ -5,29 +5,29 @@
-->
<template>
<AppSidebar
<NcAppSidebar
v-if="isActive"
class="sidebar"
:title="folder.title"
:active.sync="activeTab"
@close="onClose">
<AppSidebarTab id="folder-details"
<NcAppSidebarTab id="folder-details"
:name="t('bookmarks', 'Details')"
icon="icon-info"
:order="0">
<h3>{{ t('bookmarks', 'Owner') }}</h3>
<UserBubble :user="folder.userId" :display-name="folder.userId" />
<NcUserBubble :user="folder.userId" :display-name="folder.userId" />
<h3>{{ t('bookmarks', 'Bookmarks') }}</h3>
{{ bookmarkCount }}
</AppSidebarTab>
<AppSidebarTab v-if="isSharable"
</NcAppSidebarTab>
<NcAppSidebarTab v-if="isSharable"
id="folder-sharing"
:name="t('bookmarks', 'Sharing')"
icon="icon-shared"
:order="1">
<div class="participant-select">
<figure :class="{'icon-user': true, 'share__avatar': true }" />
<Multiselect v-model="participant"
<NcMultiselect v-model="participant"
label="displayName"
track-by="user"
class="participant-select__selection"
@ -52,27 +52,27 @@
:fill-color="colorMainText" />
</div>
</div>
<Actions class="share__actions">
<NcActions class="share__actions">
<template v-if="publicLink">
<ActionButton icon="icon-clippy" @click="onCopyPublicLink">
<NcActionButton icon="icon-clippy" @click="onCopyPublicLink">
{{ t('bookmarks', 'Copy link') }}
</ActionButton>
<ActionButton icon="icon-clippy" @click="onCopyRssLink">
</NcActionButton>
<NcActionButton icon="icon-clippy" @click="onCopyRssLink">
{{ t('bookmarks', 'Copy RSS feed') }}
</ActionButton>
<ActionSeparator />
<ActionButton icon="icon-delete" @click="onDeletePublicLink">
</NcActionButton>
<NcActionSeparator />
<NcActionButton icon="icon-delete" @click="onDeletePublicLink">
{{ t('bookmarks', 'Delete link') }}
</ActionButton>
</NcActionButton>
</template>
<ActionButton v-else icon="icon-add" @click="onAddPublicLink">
<NcActionButton v-else icon="icon-add" @click="onAddPublicLink">
{{ t('bookmarks', 'Create public link') }}
</ActionButton>
</Actions>
</NcActionButton>
</NcActions>
</div>
<div v-for="share of shares" :key="share.id">
<div class="share">
<Avatar :user="share.participant" class="share__avatar" :size="44" />
<NcAvatar :user="share.participant" class="share__avatar" :size="44" />
<h3 class="share__title">
{{ share.participant }}
</h3>
@ -98,21 +98,21 @@
:fill-color="colorMainText" />
</div>
</div>
<Actions class="share__actions">
<ActionCheckbox :checked="share.canWrite" @update:checked="onEditShare(share.id, {canWrite: $event, canShare: share.canShare})">
<NcActions class="share__actions">
<NcActionCheckbox :checked="share.canWrite" @update:checked="onEditShare(share.id, {canWrite: $event, canShare: share.canShare})">
{{ t('bookmarks', 'Allow editing') }}
</ActionCheckbox>
<ActionCheckbox :checked="share.canShare" @update:checked="onEditShare(share.id, {canWrite: share.canWrite, canShare: $event})">
</NcActionCheckbox>
<NcActionCheckbox :checked="share.canShare" @update:checked="onEditShare(share.id, {canWrite: share.canWrite, canShare: $event})">
{{ t('bookmarks', 'Allow resharing') }}
</ActionCheckbox>
<ActionButton icon="icon-delete" @click="onDeleteShare(share.id)">
</NcActionCheckbox>
<NcActionButton icon="icon-delete" @click="onDeleteShare(share.id)">
{{ t('bookmarks', 'Remove share') }}
</ActionButton>
</Actions>
</NcActionButton>
</NcActions>
</div>
</div>
</AppSidebarTab>
<AppSidebarTab v-if="!isPublic"
</NcAppSidebarTab>
<NcAppSidebarTab v-if="!isPublic"
id="bookmark-projects"
:name="t('bookmarks', 'Projects')"
icon="icon-projects"
@ -121,19 +121,11 @@
:id="''+folder.id"
:name="folder.title"
type="bookmarks-folder" />
</AppSidebarTab>
</AppSidebar>
</NcAppSidebarTab>
</NcAppSidebar>
</template>
<script>
import AppSidebar from '@nextcloud/vue/dist/Components/AppSidebar'
import AppSidebarTab from '@nextcloud/vue/dist/Components/AppSidebarTab'
import Avatar from '@nextcloud/vue/dist/Components/Avatar'
import Multiselect from '@nextcloud/vue/dist/Components/Multiselect'
import Actions from '@nextcloud/vue/dist/Components/Actions'
import ActionButton from '@nextcloud/vue/dist/Components/ActionButton'
import ActionCheckbox from '@nextcloud/vue/dist/Components/ActionCheckbox'
import ActionSeparator from '@nextcloud/vue/dist/Components/ActionSeparator'
import UserBubble from '@nextcloud/vue/dist/Components/UserBubble'
import { NcAppSidebar, NcUserBubble, NcActionSeparator, NcActionCheckbox, NcActionButton, NcActions, NcMultiselect, NcAvatar, NcAppSidebarTab } from '@nextcloud/vue'
import { getCurrentUser } from '@nextcloud/auth'
import { generateUrl, generateOcsUrl } from '@nextcloud/router'
import axios from '@nextcloud/axios'
@ -146,7 +138,7 @@ import { CollectionList } from 'nextcloud-vue-collections'
export default {
name: 'SidebarFolder',
components: { AppSidebar, AppSidebarTab, Avatar, Multiselect, ActionButton, ActionCheckbox, Actions, UserBubble, ActionSeparator, EyeIcon, PencilIcon, ShareAllIcon, CollectionList },
components: { NcAppSidebar, NcAppSidebarTab, NcAvatar, NcMultiselect, NcActionButton, NcActionCheckbox, NcActions, NcUserBubble, NcActionSeparator, EyeIcon, PencilIcon, ShareAllIcon, CollectionList },
data() {
return {
participantSearchResults: [],

View File

@ -8,14 +8,12 @@
<div id="bookmarks">
<figure v-if="loading" class="icon-loading loading" />
<figure v-if="!loading && success" class="icon-checkmark success" />
<SettingsSection
:title="t('bookmarks', 'Privacy')"
<NcSettingsSection :title="t('bookmarks', 'Privacy')"
:description="t('bookmarks',
'Bookmarks will try to access web pages that you add to automatically add information about them.'
)">
<p>
<input
id="enableScraping"
<input id="enableScraping"
v-model="settings['privacy.enableScraping']"
type="checkbox"
class="checkbox"
@ -26,9 +24,8 @@
)
}}</label>
</p>
</SettingsSection>
<SettingsSection
:title="t('bookmarks', 'Performance') "
</NcSettingsSection>
<NcSettingsSection :title="t('bookmarks', 'Performance') "
:description="t('bookmarks',
'In an installation with a lot of users it may be useful to restrict the number of bookmarks per account.'
)">
@ -46,9 +43,8 @@
step="1"
@input="onChange"></label>
</p>
</SettingsSection>
<SettingsSection
:title="t('bookmarks', 'Previews')"
</NcSettingsSection>
<NcSettingsSection :title="t('bookmarks', 'Previews')"
:description="t('bookmarks',
'In order to display real screenshots of your bookmarked websites, Bookmarks can use third-party services to generate previews.'
)">
@ -62,32 +58,28 @@
</p>
<p>
<label>{{ t('bookmarks', 'Screeenly API URL') }}
<input
v-model="settings['previews.screenly.url']"
<input v-model="settings['previews.screenly.url']"
type="text"
placeholder="https://screeenly.example.com/api/v1/fullsize"
@input="onChange"></label>
</p>
<p>
<label>{{ t('bookmarks', 'Screeenly API key') }}
<input
v-model="settings['previews.screenly.token']"
<input v-model="settings['previews.screenly.token']"
type="text"
@input="onChange"></label>
</p>
<h3>{{ t('bookmarks', 'Webshot') }}</h3>
<p>
<label>{{ t('bookmarks', 'Webshot API URL') }}
<input
v-model="settings['previews.webshot.url']"
<input v-model="settings['previews.webshot.url']"
type="text"
@input="onChange"></label>
</p>
<h3>{{ t('bookmarks', 'ScreenshotMachine') }}</h3>
<p>
<label>{{ t('bookmarks', 'ScreenshotMachine API key') }}
<input
v-model="settings['previews.screenshotmachine.key']"
<input v-model="settings['previews.screenshotmachine.key']"
type="text"
@input="onChange"></label>
</p>
@ -99,18 +91,17 @@
</p>
<p>
<label>{{ t('bookmarks', 'Pageres ENV variables') }}
<input
v-model="settings['previews.pageres.env']"
<input v-model="settings['previews.pageres.env']"
placeholder="CHROMIUM_PATH=/usr/bin/chromium-browser PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=false"
type="text"
@input="onChange"></label>
</p>
</SettingsSection>
</NcSettingsSection>
</div>
</template>
<script>
import SettingsSection from '@nextcloud/vue/dist/Components/SettingsSection'
import { NcSettingsSection } from '@nextcloud/vue'
import { loadState } from '@nextcloud/initial-state'
const SETTINGS = [
@ -125,7 +116,7 @@ const SETTINGS = [
export default {
name: 'ViewAdmin',
components: { SettingsSection },
components: { NcSettingsSection },
data() {
const settings = loadState('bookmarks', 'adminSettings')
for (const setting of SETTINGS) {

View File

@ -5,7 +5,7 @@
-->
<template>
<Content app-name="bookmarks">
<NcContent app-name="bookmarks">
<div class="bookmarklet">
<h2><figure :class="loading? 'icon-loading-small' : 'icon-link'" /> {{ t('bookmarks', 'Add a bookmark') }}</h2>
<div v-if="exists" class="bookmarklet__exists">
@ -18,8 +18,7 @@
<input v-model="bookmark.url" type="text" :placeholder="t('bookmarks', 'Enter bookmark URL')">
</label>
<label><figure class="icon-tag" /> {{ t('bookmarks', 'Tags') }}
<Multiselect
class="sidebar__tags"
<NcMultiselect class="sidebar__tags"
:value="bookmark.tags"
:auto-limit="false"
:limit="7"
@ -38,8 +37,7 @@
<FolderPickerDialog v-model="folder" :show="showPicker" @close="showPicker = false" />
</label>
<label>{{ t('bookmarks', 'Notes') }}</label>
<div
class="bookmarklet__notes"
<div class="bookmarklet__notes"
contenteditable
@input="onNotesChange">
{{ description }}
@ -48,21 +46,20 @@
<span class="icon-confirm-white" />{{ t('bookmarks', 'Save') }}
</button>
</div>
</Content>
</NcContent>
</template>
<script>
import Content from '@nextcloud/vue/dist/Components/Content'
import Multiselect from '@nextcloud/vue/dist/Components/Multiselect'
import { actions } from '../store/'
import FolderPickerDialog from './FolderPickerDialog'
import { NcContent, NcMultiselect } from '@nextcloud/vue'
import { actions } from '../store/index.js'
import FolderPickerDialog from './FolderPickerDialog.vue'
export default {
name: 'ViewBookmarklet',
components: {
FolderPickerDialog,
Content,
Multiselect,
NcContent,
NcMultiselect,
},
props: {
title: {

View File

@ -5,39 +5,38 @@
-->
<template>
<Content app-name="bookmarks">
<NcContent app-name="bookmarks">
<Navigation />
<AppContent :show-details.sync="showDetails">
<NcAppContent :show-details.sync="showDetails">
<template v-if="isFolderView && !smallScreen && folders.length" #list>
<FolderOverview :show-details.sync="showDetails" />
</template>
<Controls />
<BookmarksList />
</AppContent>
</NcAppContent>
<SidebarBookmark />
<SidebarFolder />
<MoveDialog />
<CopyDialog />
<LoadingModal />
<BookmarkContent />
</Content>
</NcContent>
</template>
<script>
import Content from '@nextcloud/vue/dist/Components/Content'
import AppContent from '@nextcloud/vue/dist/Components/AppContent'
import Navigation from './Navigation'
import FolderOverview from './FolderOverview'
import BookmarksList from './BookmarksList'
import Controls from './Controls'
import SidebarBookmark from './SidebarBookmark'
import SidebarFolder from './SidebarFolder'
import MoveDialog from './MoveDialog'
import CopyDialog from './CopyDialog'
import { privateRoutes } from '../router'
import { actions, mutations } from '../store/'
import LoadingModal from './LoadingModal'
import BookmarkContent from './BookmarkContent'
import { NcContent, NcAppContent } from '@nextcloud/vue'
import Navigation from './Navigation.vue'
import FolderOverview from './FolderOverview.vue'
import BookmarksList from './BookmarksList.vue'
import Controls from './Controls.vue'
import SidebarBookmark from './SidebarBookmark.vue'
import SidebarFolder from './SidebarFolder.vue'
import MoveDialog from './MoveDialog.vue'
import CopyDialog from './CopyDialog.vue'
import { privateRoutes } from '../router.js'
import { actions, mutations } from '../store/index.js'
import LoadingModal from './LoadingModal.vue'
import BookmarkContent from './BookmarkContent.vue'
import { getCurrentUser } from '@nextcloud/auth'
export default {
@ -46,8 +45,8 @@ export default {
BookmarkContent,
LoadingModal,
Navigation,
Content,
AppContent,
NcContent,
NcAppContent,
FolderOverview,
Controls,
BookmarksList,
@ -210,14 +209,7 @@ export default {
}
</script>
<style>
#app-content {
max-width: calc(100vw - 300px);
min-width: 0;
}
@media only screen and (max-width: 720px) {
#app-content {
max-width: 100%;
}
.app-content {
position: relative !important;
}
</style>

View File

@ -5,29 +5,28 @@
-->
<template>
<Content app-name="bookmarks">
<AppContent>
<NcContent app-name="bookmarks">
<NcAppContent>
<Controls />
<BookmarksList :loading="!!loading.bookmarks" :bookmarks="bookmarks" />
</AppContent>
</NcAppContent>
<BookmarkContent />
</Content>
</NcContent>
</template>
<script>
import Content from '@nextcloud/vue/dist/Components/Content'
import AppContent from '@nextcloud/vue/dist/Components/AppContent'
import BookmarksList from './BookmarksList'
import Controls from './Controls'
import { actions, mutations } from '../store/'
import BookmarkContent from './BookmarkContent'
import { NcContent, NcAppContent } from '@nextcloud/vue'
import BookmarksList from './BookmarksList.vue'
import Controls from './Controls.vue'
import { actions, mutations } from '../store/index.js'
import BookmarkContent from './BookmarkContent.vue'
export default {
name: 'ViewPublic',
components: {
BookmarkContent,
Content,
AppContent,
NcContent,
NcAppContent,
Controls,
BookmarksList,
},

View File

@ -6,8 +6,9 @@
'use strict'
import { version } from '../package.json'
import PackageJson from '../package.json'
const { version } = PackageJson
const rev = '#1'
const DYNAMIC_CACHE = `dynamic-cache-${version}` + rev