Rename collection presets to presets

This commit is contained in:
rijkvanzanten
2020-07-09 16:41:51 -04:00
parent b260720252
commit 994dc72aea
31 changed files with 111 additions and 125 deletions

View File

@@ -1,4 +1,4 @@
import { useCollectionPreset } from './use-collection-preset';
import { usePreset } from './use-collection-preset';
export { useCollectionPreset };
export default useCollectionPreset;
export { usePreset };
export default usePreset;

View File

@@ -5,7 +5,7 @@ export type Filter = {
value: string | number;
};
export type CollectionPreset = {
export type Preset = {
id: number;
collection: string;
filters: null | Filter[];

View File

@@ -1,25 +1,25 @@
import useCollectionPresetStore from '@/stores/collection-presets';
import usePresetStore from '@/stores/presets';
import { ref, Ref, computed, watch } from '@vue/composition-api';
import { debounce } from 'lodash';
import useUserStore from '@/stores/user';
import { Filter, CollectionPreset } from '@/stores/collection-presets/types';
import { Filter, Preset } from '@/stores/presets/types';
export function useCollectionPreset(collection: Ref<string>, bookmark: Ref<number | null> = ref(null)) {
const collectionPresetsStore = useCollectionPresetStore();
export function usePreset(collection: Ref<string>, bookmark: Ref<number | null> = ref(null)) {
const presetsStore = usePresetStore();
const userStore = useUserStore();
const bookmarkExists = computed(() => {
if (!bookmark.value) return false;
return !!collectionPresetsStore.state.collectionPresets.find((preset) => preset.id === bookmark.value);
return !!presetsStore.state.collectionPresets.find((preset) => preset.id === bookmark.value);
});
const localPreset = ref<Partial<CollectionPreset>>({});
const localPreset = ref<Partial<Preset>>({});
initLocalPreset();
const savePreset = async (preset?: Partial<CollectionPreset>) => {
const updatedValues = await collectionPresetsStore.savePreset(preset ? preset : localPreset.value);
const savePreset = async (preset?: Partial<Preset>) => {
const updatedValues = await presetsStore.savePreset(preset ? preset : localPreset.value);
localPreset.value.id = updatedValues.id;
@@ -147,13 +147,13 @@ export function useCollectionPreset(collection: Ref<string>, bookmark: Ref<numbe
function initLocalPreset() {
if (bookmark.value === null) {
localPreset.value = {
...collectionPresetsStore.getPresetForCollection(collection.value),
...presetsStore.getPresetForCollection(collection.value),
};
} else {
if (bookmarkExists.value === false) return;
localPreset.value = {
...collectionPresetsStore.getBookmark(+bookmark.value),
...presetsStore.getBookmark(+bookmark.value),
};
}
}
@@ -167,7 +167,7 @@ export function useCollectionPreset(collection: Ref<string>, bookmark: Ref<numbe
*
* @param overrides Individual overrides for the collection preset
*/
async function saveCurrentAsBookmark(overrides: Partial<CollectionPreset>) {
async function saveCurrentAsBookmark(overrides: Partial<Preset>) {
const data = {
...localPreset.value,
...overrides,

View File

@@ -3,7 +3,7 @@ import api from '@/api';
import useCollection from '@/composables/use-collection';
import Vue from 'vue';
import { isEqual } from 'lodash';
import { Filter } from '@/stores/collection-presets/types';
import { Filter } from '@/stores/presets/types';
import filtersToQuery from '@/utils/filters-to-query';
import { orderBy } from 'lodash';
import moveInArray from '@/utils/move-in-array';
@@ -141,12 +141,6 @@ export function useItems(collection: Ref<string>, query: Query) {
}
}
// Make sure we always fetch the image data for the directus_files collection when opening
// the file library
if (collection.value === 'directus_files' && fieldsToFetch.includes('data') === false) {
fieldsToFetch.push('data');
}
// Filter out fake internal columns. This is (among other things) for a fake $file m2o field
// on directus_files
fieldsToFetch = fieldsToFetch.filter((field) => field.startsWith('$') === false);

View File

@@ -3,7 +3,7 @@ import { useCollectionsStore } from '@/stores/collections/';
import { useFieldsStore } from '@/stores/fields/';
import { useUserStore } from '@/stores/user/';
import { useRequestsStore } from '@/stores/requests/';
import { useCollectionPresetsStore } from '@/stores/collection-presets/';
import { usePresetsStore } from '@/stores/presets/';
import { useSettingsStore } from '@/stores/settings/';
//
import { useLatencyStore } from '@/stores/latency';
@@ -24,7 +24,7 @@ export function useStores(
useFieldsStore,
useUserStore,
useRequestsStore,
useCollectionPresetsStore,
usePresetsStore,
useSettingsStore,
useLatencyStore,
useRelationsStore,

View File

@@ -1,4 +1,4 @@
import { Filter } from '@/stores/collection-presets/types';
import { Filter } from '@/stores/presets/types';
import { Relation } from '@/stores/relations/types';
import { Field } from '@/stores/fields/types';
import { Ref, ref, computed } from '@vue/composition-api';

View File

@@ -69,7 +69,7 @@ import useCollectionsStore from '@/stores/collections';
import useFieldsStore from '@/stores/fields';
import ModalDetail from '@/views/private/components/modal-detail';
import ModalBrowse from '@/views/private/components/modal-browse';
import { Filter } from '@/stores/collection-presets/types';
import { Filter } from '@/stores/presets/types';
import { Header } from '@/components/v-table/types';
export default defineComponent({

View File

@@ -130,13 +130,14 @@
<script lang="ts">
import { defineComponent, PropType, toRefs, inject, computed, ref } from '@vue/composition-api';
import { Filter } from '@/stores/collection-presets/types';
import { Filter } from '@/stores/presets/types';
import useSync from '@/composables/use-sync/';
import useCollection from '@/composables/use-collection/';
import useItems from '@/composables/use-items';
import Card from './components/card.vue';
import getFieldsFromTemplate from '@/utils/get-fields-from-template';
import { render } from 'micromustache';
import useRelationsStore from '@/stores/relations';
import CardsHeader from './components/header.vue';
import i18n from '@/lang';
@@ -206,6 +207,8 @@ export default defineComponent({
},
},
setup(props, { emit }) {
const relationsStore = useRelationsStore();
const layoutElement = ref<HTMLElement | null>(null);
const mainElement = inject('main-element', ref<Element | null>(null));
@@ -223,7 +226,14 @@ export default defineComponent({
);
const fileFields = computed(() => {
return [...availableFields.value.filter((field) => field.system.special === 'file')];
return availableFields.value.filter((field) => {
if (field.field === '$file') return true;
return !!relationsStore.state.relations.find((relation) => {
return (
relation.collection_many === props.collection && relation.collection_one === 'directus_files'
);
});
});
});
const { size, icon, imageSource, title, subtitle, imageFit } = useViewOptions();
@@ -354,7 +364,9 @@ export default defineComponent({
if (imageSource.value) {
fields.push(`${imageSource.value}.type`);
fields.push(`${imageSource.value}.data`);
fields.push(`${imageSource.value}.filename_disk`);
fields.push(`${imageSource.value}.storage`);
fields.push(`${imageSource.value}.links`);
}
const sortField = sort.value.startsWith('-') ? sort.value.substring(1) : sort.value;

View File

@@ -32,17 +32,12 @@
<script lang="ts">
import { defineComponent, PropType, computed } from '@vue/composition-api';
import router from '@/router';
import getRootPath from '@/utils/get-root-path';
type File = {
[key: string]: any;
id: string;
type: string;
data: {
full_url: string;
thumbnails: {
key: string;
url: string;
}[];
};
};
export default defineComponent({
@@ -100,17 +95,13 @@ export default defineComponent({
if (props.file.type.startsWith('image') === false) return null;
if (props.file.type.includes('svg')) return null;
let key = 'directus-medium-crop';
let key = 'directus-medium-cover';
if (props.crop === false) {
key = 'directus-medium-contain';
}
const thumbnail = props.file.data.thumbnails.find((thumbnail) => thumbnail.key === key);
if (!thumbnail) return null;
return thumbnail.url;
return getRootPath() + `assets/${props.file.id}?key=${key}`;
});
const svgSource = computed(() => {
@@ -118,7 +109,7 @@ export default defineComponent({
if (props.file.type.startsWith('image') === false) return null;
if (props.file.type.includes('svg') === false) return null;
return props.file.data.full_url;
return getRootPath() + `assets/${props.file.id}`;
});
const selectionIcon = computed(() => {

View File

@@ -163,7 +163,7 @@ import Draggable from 'vuedraggable';
import useCollection from '@/composables/use-collection';
import useItems from '@/composables/use-items';
import { render } from 'micromustache';
import { Filter } from '@/stores/collection-presets/types';
import { Filter } from '@/stores/presets/types';
import i18n from '@/lang';
import adjustFieldsForDisplays from '@/utils/adjust-fields-for-displays';
import hideDragImage from '@/utils/hide-drag-image';

View File

@@ -36,7 +36,7 @@ import { defineComponent, computed, ref } from '@vue/composition-api';
import ActivityNavigation from '../../components/navigation/';
import { i18n } from '@/lang';
import { LayoutComponent } from '@/layouts/types';
import useCollectionPreset from '@/composables/use-collection-preset';
import usePreset from '@/composables/use-collection-preset';
import marked from 'marked';
type Item = {
@@ -50,7 +50,7 @@ export default defineComponent({
setup() {
const layout = ref<LayoutComponent | null>(null);
const { viewOptions, viewQuery } = useCollectionPreset(ref('directus_activity'));
const { viewOptions, viewQuery } = usePreset(ref('directus_activity'));
const { breadcrumb } = useBreadcrumb();
return {

View File

@@ -30,7 +30,7 @@
<script lang="ts">
import { defineComponent, computed } from '@vue/composition-api';
import useNavigation from '../../composables/use-navigation';
import useCollectionPresetsStore from '@/stores/collection-presets';
import usePresetsStore from '@/stores/presets';
export default defineComponent({
props: {
@@ -40,11 +40,11 @@ export default defineComponent({
},
},
setup() {
const collectionPresetsStore = useCollectionPresetsStore();
const presetsStore = usePresetsStore();
const { customNavItems, navItems } = useNavigation();
const bookmarks = computed(() => {
return collectionPresetsStore.state.collectionPresets
return presetsStore.state.collectionPresets
.filter((preset) => {
return preset.title !== null && preset.collection.startsWith('directus_') === false;
})

View File

@@ -141,7 +141,7 @@ import api from '@/api';
import { LayoutComponent } from '@/layouts/types';
import CollectionsNotFound from '../not-found/';
import useCollection from '@/composables/use-collection';
import useCollectionPreset from '@/composables/use-collection-preset';
import usePreset from '@/composables/use-collection-preset';
import LayoutDrawerDetail from '@/views/private/components/layout-drawer-detail';
import SearchInput from '@/views/private/components/search-input';
import BookmarkAdd from '@/views/private/components/bookmark-add';
@@ -222,7 +222,7 @@ export default defineComponent({
bookmarkExists,
saveCurrentAsBookmark,
title: bookmarkName,
} = useCollectionPreset(collection, bookmarkID);
} = usePreset(collection, bookmarkID);
const { confirmDelete, deleting, batchDelete } = useBatchDelete();
const {

View File

@@ -107,7 +107,7 @@ import FilesNavigation from '../../components/navigation/';
import { i18n } from '@/lang';
import api from '@/api';
import { LayoutComponent } from '@/layouts/types';
import useCollectionPreset from '@/composables/use-collection-preset';
import usePreset from '@/composables/use-collection-preset';
import FilterDrawerDetail from '@/views/private/components/filter-drawer-detail';
import LayoutDrawerDetail from '@/views/private/components/layout-drawer-detail';
import AddFolder from '../../components/add-folder';
@@ -127,7 +127,7 @@ export default defineComponent({
const layout = ref<LayoutComponent | null>(null);
const selection = ref<Item[]>([]);
const { viewType, viewOptions, viewQuery, filters, searchQuery } = useCollectionPreset(ref('directus_files'));
const { viewType, viewOptions, viewQuery, filters, searchQuery } = usePreset(ref('directus_files'));
const { addNewLink, batchLink } = useLinks();
const { confirmDelete, deleting, batchDelete } = useBatchDelete();
const { breadcrumb } = useBreadcrumb();

View File

@@ -199,7 +199,7 @@ export default defineComponent({
loading.value = true;
try {
const response = await api.get(`/collection_presets`, {
const response = await api.get(`/presets`, {
params: {
fields: [
'id',
@@ -280,7 +280,7 @@ export default defineComponent({
try {
const IDs = selection.value.map((item) => item.id).join(',');
await api.delete(`/collection_presets/${IDs}`);
await api.delete(`/presets/${IDs}`);
selection.value = [];
await getPresets();
confirmDelete.value = false;

View File

@@ -32,7 +32,7 @@ export default defineComponent({
loading.value = true;
try {
const response = await api.get(`/collection_presets`, {
const response = await api.get(`/presets`, {
params: {
[`filter[title][nnull]`]: 1,
fields: ['id'],

View File

@@ -81,13 +81,13 @@
import { defineComponent, computed, ref } from '@vue/composition-api';
import SettingsNavigation from '../../../components/navigation';
import { CollectionPreset, Filter } from '@/stores/collection-presets/types';
import { Preset, Filter } from '@/stores/presets/types';
import api from '@/api';
import i18n from '@/lang';
import useCollectionsStore from '@/stores/collections';
import layouts from '@/layouts';
import router from '@/router';
import useCollectionPresetsStore from '@/stores/collection-presets';
import usePresetsStore from '@/stores/presets';
import marked from 'marked';
type User = {
@@ -123,7 +123,7 @@ export default defineComponent({
},
setup(props) {
const collectionsStore = useCollectionsStore();
const collectionPresetsStore = useCollectionPresetsStore();
const presetsStore = usePresetsStore();
const { backLink } = useLinks();
const isNew = computed(() => props.id === '+');
@@ -166,7 +166,7 @@ export default defineComponent({
async function save() {
saving.value = true;
const editsParsed: Partial<CollectionPreset> = {};
const editsParsed: Partial<Preset> = {};
if (edits.value.name) editsParsed.title = edits.value.name;
if (edits.value.name?.length === 0) editsParsed.title = null;
@@ -186,12 +186,12 @@ export default defineComponent({
try {
if (isNew.value === true) {
await api.post(`/collection_presets`, editsParsed);
await api.post(`/presets`, editsParsed);
} else {
await api.patch(`/collection_presets/${props.id}`, editsParsed);
await api.patch(`/presets/${props.id}`, editsParsed);
}
await collectionPresetsStore.hydrate();
await presetsStore.hydrate();
edits.value = {};
} catch (err) {
@@ -213,7 +213,7 @@ export default defineComponent({
deleting.value = true;
try {
await api.delete(`/collection_presets/${props.id}`);
await api.delete(`/presets/${props.id}`);
router.push(`/settings/presets`);
} catch (error) {
console.error(error);
@@ -304,7 +304,7 @@ export default defineComponent({
function usePreset() {
const loading = ref(false);
const error = ref(null);
const preset = ref<CollectionPreset | null>(null);
const preset = ref<Preset | null>(null);
fetchPreset();
@@ -314,7 +314,7 @@ export default defineComponent({
loading.value = true;
try {
const response = await api.get(`/collection_presets/${props.id}`);
const response = await api.get(`/presets/${props.id}`);
preset.value = response.data.data;
} catch (err) {

View File

@@ -1,18 +1,7 @@
<template>
<drawer-detail icon="info_outline" :title="$t('information')" close>
<dl v-if="project">
<div>
<dt>{{ $t('php_api') }}</dt>
<dd>{{ project.server.general.php_api }}</dd>
</div>
<div>
<dt>{{ $t('php_version') }}</dt>
<dd>{{ project.server.general.php_version.split('-')[0] }}</dd>
</div>
<div>
<dt>{{ $t('max_upload_size') }}</dt>
<dd>{{ bytes(project.server.max_upload_size) }}</dd>
</div>
<!-- @todo -->
</dl>
</drawer-detail>
</template>

View File

@@ -73,7 +73,7 @@ import SettingsNavigation from '../../../components/navigation/';
import { i18n } from '@/lang';
import api from '@/api';
import { LayoutComponent } from '@/layouts/types';
import useCollectionPreset from '@/composables/use-collection-preset';
import usePreset from '@/composables/use-collection-preset';
import marked from 'marked';
import LayoutDrawerDetail from '@/views/private/components/layout-drawer-detail';
@@ -90,7 +90,7 @@ export default defineComponent({
const selection = ref<Item[]>([]);
const { viewType, viewOptions, viewQuery } = useCollectionPreset(ref('directus_webhooks'));
const { viewType, viewOptions, viewQuery } = usePreset(ref('directus_webhooks'));
const { addNewLink, batchLink } = useLinks();
const { confirmDelete, deleting, batchDelete } = useBatchDelete();
const { breadcrumb } = useBreadcrumb();

View File

@@ -81,7 +81,7 @@ import UsersNavigation from '../../components/navigation/';
import { i18n } from '@/lang';
import api from '@/api';
import { LayoutComponent } from '@/layouts/types';
import useCollectionPreset from '@/composables/use-collection-preset';
import usePreset from '@/composables/use-collection-preset';
import FilterDrawerDetail from '@/views/private/components/filter-drawer-detail';
import LayoutDrawerDetail from '@/views/private/components/layout-drawer-detail';
import SearchInput from '@/views/private/components/search-input';
@@ -105,7 +105,7 @@ export default defineComponent({
const selection = ref<Item[]>([]);
const { viewType, viewOptions, viewQuery, filters, searchQuery } = useCollectionPreset(ref('directus_users'));
const { viewType, viewOptions, viewQuery, filters, searchQuery } = usePreset(ref('directus_users'));
const { addNewLink, batchLink } = useLinks();
const { confirmDelete, deleting, batchDelete } = useBatchDelete();
const { breadcrumb } = useBreadcrumb();

View File

@@ -1,14 +0,0 @@
import { CollectionPreset } from './types';
const defaultCollectionPreset: Omit<CollectionPreset, 'collection'> = {
title: null,
role: null,
user: null,
search_query: null,
filters: null,
view_type: null,
view_query: null,
view_options: null,
};
export default defaultCollectionPreset;

View File

@@ -1,4 +0,0 @@
import { useCollectionPresetsStore } from './collection-presets';
export { useCollectionPresetsStore };
export default useCollectionPresetsStore;

View File

@@ -0,0 +1,14 @@
import { Preset } from './types';
const defaultPreset: Omit<Preset, 'collection'> = {
title: null,
role: null,
user: null,
search_query: null,
filters: null,
view_type: null,
view_query: null,
view_options: null,
};
export default defaultPreset;

View File

@@ -0,0 +1,4 @@
import { usePresetsStore } from './presets';
export { usePresetsStore };
export default usePresetsStore;

View File

@@ -1,14 +1,14 @@
import { createStore } from 'pinia';
import { CollectionPreset } from './types';
import { Preset } from './types';
import { useUserStore } from '@/stores/user/';
import api from '@/api';
import defaultCollectionPreset from './default-collection-preset';
import defaultPreset from './default-preset';
export const useCollectionPresetsStore = createStore({
id: 'collectionPresetsStore',
export const usePresetsStore = createStore({
id: 'presetsStore',
state: () => ({
collectionPresets: [] as CollectionPreset[],
collectionPresets: [] as Preset[],
}),
actions: {
async hydrate() {
@@ -18,20 +18,20 @@ export const useCollectionPresetsStore = createStore({
const values = await Promise.all([
// All user saved bookmarks and presets
api.get(`/collection_presets`, {
api.get(`/presets`, {
params: {
'filter[user][eq]': id,
},
}),
// All role saved bookmarks and presets
api.get(`/collection_presets`, {
api.get(`/presets`, {
params: {
'filter[role][eq]': role.id,
'filter[user][null]': 1,
},
}),
// All global saved bookmarks and presets
api.get(`/collection_presets`, {
api.get(`/presets`, {
params: {
'filter[role][null]': 1,
'filter[user][null]': 1,
@@ -44,15 +44,15 @@ export const useCollectionPresetsStore = createStore({
async dehydrate() {
this.reset();
},
async create(newPreset: Partial<CollectionPreset>) {
const response = await api.post(`/collection_presets`, newPreset);
async create(newPreset: Partial<Preset>) {
const response = await api.post(`/presets`, newPreset);
this.state.collectionPresets.push(response.data.data);
return response.data.data;
},
async update(id: number, updates: Partial<CollectionPreset>) {
const response = await api.patch(`/collection_presets/${id}`, updates);
async update(id: number, updates: Partial<Preset>) {
const response = await api.patch(`/presets/${id}`, updates);
this.state.collectionPresets = this.state.collectionPresets.map((preset) => {
const updatedPreset = response.data.data;
@@ -66,7 +66,7 @@ export const useCollectionPresetsStore = createStore({
return response.data.data;
},
async delete(id: number) {
await api.delete(`/collection_presets/${id}`);
await api.delete(`/presets/${id}`);
this.state.collectionPresets = this.state.collectionPresets.filter((preset) => {
return preset.id !== id;
@@ -85,8 +85,8 @@ export const useCollectionPresetsStore = createStore({
const { id: userID, role: userRole } = userStore.state.currentUser;
const defaultPreset = {
...defaultCollectionPreset,
const defaultPresetWithCollection = {
...defaultPreset,
collection: collection,
user: userID,
};
@@ -104,7 +104,7 @@ export const useCollectionPresetsStore = createStore({
return false;
});
if (availablePresets.length === 0) return defaultPreset;
if (availablePresets.length === 0) return defaultPresetWithCollection;
if (availablePresets.length === 1) return availablePresets[0];
// In order of specificity: user-role-collection
@@ -130,7 +130,7 @@ export const useCollectionPresetsStore = createStore({
* preset already exists, but doesn't have a user associated, it will create a preset for
* the user. If the preset already exists and is for a user, we update the preset.
*/
async savePreset(preset: CollectionPreset) {
async savePreset(preset: Preset) {
const userStore = useUserStore();
if (userStore.state.currentUser === null) return null;
const { id: userID } = userStore.state.currentUser;

View File

@@ -28,7 +28,7 @@ export type Filter = {
locked?: boolean;
};
export type CollectionPreset = {
export type Preset = {
id?: number;
title: string | null;
user: number | null;

View File

@@ -1,4 +1,4 @@
import { Filter } from '@/stores/collection-presets/types';
import { Filter } from '@/stores/presets/types';
export default function filtersToQuery(filters: readonly Filter[]) {
const query: Record<string, any> = {};

View File

@@ -35,7 +35,7 @@
<script lang="ts">
import { defineComponent, PropType, computed } from '@vue/composition-api';
import { Filter } from '@/stores/collection-presets/types';
import { Filter } from '@/stores/presets/types';
import useFieldsStore from '@/stores/fields';
import getAvailableOperatorsForType from './get-available-operators-for-type';
import FilterInput from './filter-input.vue';

View File

@@ -38,7 +38,7 @@
<script lang="ts">
import { defineComponent, PropType, computed, ref, watch } from '@vue/composition-api';
import { Filter } from '@/stores/collection-presets/types';
import { Filter } from '@/stores/presets/types';
import { Field } from '@/stores/fields/types';
import useFieldsStore from '@/stores/fields';
import useRelationsStore from '@/stores/relations';

View File

@@ -52,7 +52,7 @@
<script lang="ts">
import { defineComponent, PropType, computed } from '@vue/composition-api';
import { FilterOperator } from '@/stores/collection-presets/types';
import { FilterOperator } from '@/stores/presets/types';
export default defineComponent({
props: {

View File

@@ -20,8 +20,8 @@
<script lang="ts">
import { defineComponent, PropType, ref, computed, toRefs, onUnmounted } from '@vue/composition-api';
import { Filter } from '@/stores/collection-presets/types';
import useCollectionPreset from '@/composables/use-collection-preset';
import { Filter } from '@/stores/presets/types';
import usePreset from '@/composables/use-collection-preset';
export default defineComponent({
props: {
@@ -53,7 +53,7 @@ export default defineComponent({
const { collection } = toRefs(props);
const { viewType, viewOptions, viewQuery } = useCollectionPreset(collection);
const { viewType, viewOptions, viewQuery } = usePreset(collection);
// This is a local copy of the viewtype. This means that we can sync it the layout without
// having use-collection-preset auto-save the values