Merge branch 'main' into aggregation

This commit is contained in:
rijkvanzanten
2021-06-16 11:32:01 -04:00
164 changed files with 1761 additions and 857 deletions

View File

@@ -1,3 +1,2 @@
node_modules
dist
app/vite.config.js

View File

@@ -1,9 +1,9 @@
const defaultRules = {
// No console statements in production
'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off',
'no-console': process.env.NODE_ENV !== 'development' ? 'error' : 'off',
// No debugger statements in production
'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off',
// Enforce prettier formating
'no-debugger': process.env.NODE_ENV !== 'development' ? 'error' : 'off',
// Enforce prettier formatting
'prettier/prettier': 'error',
};

View File

@@ -1,2 +1,3 @@
dist
node_modules
app/src/lang/translations/*.yaml

View File

@@ -1,6 +1,6 @@
{
"name": "directus",
"version": "9.0.0-rc.75",
"version": "9.0.0-rc.76",
"license": "GPL-3.0-only",
"homepage": "https://github.com/directus/directus#readme",
"description": "Directus is a real-time API and App dashboard for managing SQL database content.",
@@ -66,14 +66,14 @@
"example.env"
],
"dependencies": {
"@directus/app": "9.0.0-rc.75",
"@directus/drive": "9.0.0-rc.75",
"@directus/drive-azure": "9.0.0-rc.75",
"@directus/drive-gcs": "9.0.0-rc.75",
"@directus/drive-s3": "9.0.0-rc.75",
"@directus/format-title": "9.0.0-rc.75",
"@directus/schema": "9.0.0-rc.75",
"@directus/specs": "9.0.0-rc.75",
"@directus/app": "9.0.0-rc.76",
"@directus/drive": "9.0.0-rc.76",
"@directus/drive-azure": "9.0.0-rc.76",
"@directus/drive-gcs": "9.0.0-rc.76",
"@directus/drive-s3": "9.0.0-rc.76",
"@directus/format-title": "9.0.0-rc.76",
"@directus/schema": "9.0.0-rc.76",
"@directus/specs": "9.0.0-rc.76",
"@godaddy/terminus": "^4.9.0",
"argon2": "^0.28.1",
"async": "^3.2.0",
@@ -102,7 +102,7 @@
"graphql": "^15.5.0",
"graphql-compose": "^9.0.1",
"icc": "^2.0.0",
"inquirer": "^8.1.0",
"inquirer": "^8.1.1",
"joi": "^17.3.0",
"js-yaml": "^4.1.0",
"js2xmlparser": "^4.0.1",
@@ -125,6 +125,7 @@
"otplib": "^12.0.1",
"pino": "^6.11.3",
"pino-colada": "^2.1.0",
"prettier": "^2.3.1",
"qs": "^6.9.4",
"rate-limiter-flexible": "^2.2.2",
"resolve-cwd": "^3.0.0",
@@ -138,7 +139,7 @@
"connect-memcached": "^1.0.0",
"connect-redis": "^6.0.0",
"connect-session-knex": "^2.1.0",
"ioredis": "^4.27.2",
"ioredis": "^4.27.6",
"keyv-memcache": "^1.2.5",
"memcached": "^2.2.2",
"mysql": "^2.18.1",

View File

@@ -1,3 +1,5 @@
/* eslint-disable no-console */
import getDatabase from '../../../database';
export default async function count(collection: string): Promise<void> {

View File

@@ -1,3 +1,5 @@
/* eslint-disable no-console */
import runMigrations from '../../../database/migrations/run';
import installSeeds from '../../../database/seeds/run';
import getDatabase from '../../../database';

View File

@@ -1,3 +1,5 @@
/* eslint-disable no-console */
import run from '../../../database/migrations/run';
import getDatabase from '../../../database';

View File

@@ -1,3 +1,5 @@
/* eslint-disable no-console */
import argon2 from 'argon2';
import chalk from 'chalk';
import execa from 'execa';

View File

@@ -1,3 +1,5 @@
/* eslint-disable no-console */
import { getSchema } from '../../../utils/get-schema';
import { RolesService } from '../../../services';
import getDatabase from '../../../database';

View File

@@ -1,3 +1,5 @@
/* eslint-disable no-console */
import { getSchema } from '../../../utils/get-schema';
import { UsersService } from '../../../services';
import getDatabase from '../../../database';

View File

@@ -1,3 +1,5 @@
/* eslint-disable no-console */
import argon2 from 'argon2';
import { getSchema } from '../../../utils/get-schema';
import { UsersService } from '../../../services';

View File

@@ -1,5 +1,7 @@
#!/usr/bin/env node
/* eslint-disable no-console */
import program from 'commander';
import start from '../start';
import bootstrap from './commands/bootstrap';

View File

@@ -28,7 +28,11 @@ export default function getDatabase(): Knex {
if (env.DB_CLIENT && env.DB_CLIENT === 'sqlite3') {
requiredEnvVars.push('DB_FILENAME');
} else if (env.DB_CLIENT && env.DB_CLIENT === 'oracledb') {
requiredEnvVars.push('DB_USER', 'DB_PASSWORD', 'DB_CONNECT_STRING');
if (!env.DB_CONNECT_STRING) {
requiredEnvVars.push('DB_HOST', 'DB_PORT', 'DB_DATABASE', 'DB_USER', 'DB_PASSWORD');
} else {
requiredEnvVars.push('DB_USER', 'DB_PASSWORD', 'DB_CONNECT_STRING');
}
} else {
if (env.DB_CLIENT === 'pg') {
if (!env.DB_CONNECTION_STRING) {

View File

@@ -1,4 +1,6 @@
import { Knex } from 'knex';
// @ts-ignore
import Client_Oracledb from 'knex/lib/dialects/oracledb';
import env from '../../env';
async function oracleAlterUrl(knex: Knex, type: string): Promise<void> {
@@ -10,7 +12,7 @@ async function oracleAlterUrl(knex: Knex, type: string): Promise<void> {
}
export async function up(knex: Knex): Promise<void> {
if (env.DB_CLIENT === 'oracledb') {
if (knex.client instanceof Client_Oracledb) {
await oracleAlterUrl(knex, 'CLOB');
return;
}

View File

@@ -1,4 +1,6 @@
import { Knex } from 'knex';
// @ts-ignore
import Client_Oracledb from 'knex/lib/dialects/oracledb';
import env from '../../env';
async function oracleAlterCollections(knex: Knex, type: string): Promise<void> {
@@ -10,7 +12,7 @@ async function oracleAlterCollections(knex: Knex, type: string): Promise<void> {
}
export async function up(knex: Knex): Promise<void> {
if (env.DB_CLIENT === 'oracledb') {
if (knex.client instanceof Client_Oracledb) {
await oracleAlterCollections(knex, 'CLOB');
return;
}

View File

@@ -1,3 +1,5 @@
/* eslint-disable no-console */
import formatTitle from '@directus/format-title';
import fse from 'fs-extra';
import { Knex } from 'knex';

View File

@@ -50,6 +50,7 @@ const defaults: Record<string, any> = {
CACHE_TTL: '10m',
CACHE_NAMESPACE: 'system-cache',
CACHE_AUTO_PURGE: false,
CACHE_CONTROL_S_MAXAGE: '0',
OAUTH_PROVIDERS: '',

View File

@@ -2,6 +2,7 @@ import { RequestHandler } from 'express';
import cache from '../cache';
import env from '../env';
import asyncHandler from '../utils/async-handler';
import { getCacheControlHeader } from '../utils/get-cache-headers';
import { getCacheKey } from '../utils/get-cache-key';
const checkCacheMiddleware: RequestHandler = asyncHandler(async (req, res, next) => {
@@ -17,18 +18,11 @@ const checkCacheMiddleware: RequestHandler = asyncHandler(async (req, res, next)
const cachedData = await cache.get(key);
if (cachedData) {
// Set cache-control header, but only for the public role
if (env.CACHE_AUTO_PURGE !== true && !!req.accountability?.role === false) {
const expiresAt = await cache.get(`${key}__expires_at`);
const maxAge = `max-age=${expiresAt - Date.now()}`;
res.setHeader('Cache-Control', `public, ${maxAge}`);
} else {
// This indicates that the browser/proxy is allowed to cache, but has to revalidate with
// the server before use. At this point, we don't include Last-Modified, so it'll always
// recreate the local cache. This does NOT mean that cache is disabled all together, as
// Directus is still pulling the value from it's internal cache.
res.setHeader('Cache-Control', 'no-cache');
}
const cacheExpiryDate = (await cache.get(`${key}__expires_at`)) as number | null;
const cacheTTL = cacheExpiryDate ? cacheExpiryDate - Date.now() : null;
res.setHeader('Cache-Control', getCacheControlHeader(req, cacheTTL));
res.setHeader('Vary', 'Origin, Cache-Control');
return res.json(cachedData);
} else {

View File

@@ -7,6 +7,7 @@ import env from '../env';
import asyncHandler from '../utils/async-handler';
import { getCacheKey } from '../utils/get-cache-key';
import { parse as toXML } from 'js2xmlparser';
import { getCacheControlHeader } from '../utils/get-cache-headers';
export const respond: RequestHandler = asyncHandler(async (req, res) => {
if (
@@ -19,20 +20,12 @@ export const respond: RequestHandler = asyncHandler(async (req, res) => {
const key = getCacheKey(req);
await cache.set(key, res.locals.payload, ms(env.CACHE_TTL as string));
await cache.set(`${key}__expires_at`, Date.now() + ms(env.CACHE_TTL as string));
const noCacheRequested =
req.headers['cache-control']?.includes('no-cache') || req.headers['Cache-Control']?.includes('no-cache');
// Set cache-control header
if (env.CACHE_AUTO_PURGE !== true && noCacheRequested === false) {
const maxAge = `max-age=${ms(env.CACHE_TTL as string)}`;
const access = !!req.accountability?.role === false ? 'public' : 'private';
res.setHeader('Cache-Control', `${access}, ${maxAge}`);
}
if (noCacheRequested) {
res.setHeader('Cache-Control', 'no-cache');
}
res.setHeader('Cache-Control', getCacheControlHeader(req, ms(env.CACHE_TTL as string)));
res.setHeader('Vary', 'Origin, Cache-Control');
} else {
// Don't cache anything by default
res.setHeader('Cache-Control', 'no-cache');
res.setHeader('Vary', 'Origin, Cache-Control');
}
if (req.sanitizedQuery.export) {

View File

@@ -9,6 +9,7 @@ import logger from '../../logger';
import { AbstractServiceOptions, Accountability, SchemaOverview } from '../../types';
import getMailer from '../../mailer';
import { Transporter, SendMailOptions } from 'nodemailer';
import prettier from 'prettier';
const liquidEngine = new Liquid({
root: [path.resolve(env.EXTENSIONS_PATH, 'templates'), path.resolve(__dirname, 'templates')],
@@ -61,6 +62,11 @@ export class MailService {
html = await this.renderTemplate(template.name, templateData);
}
if (typeof html === 'string') {
// Some email clients start acting funky when line length exceeds 75 characters. See #6074
html = prettier.format(html as string, { parser: 'html', printWidth: 70, tabWidth: 0 });
}
try {
await this.mailer.sendMail({ ...emailOptions, from, html });
} catch (error) {

View File

@@ -24,7 +24,7 @@ import { clone } from 'lodash';
*
* The conversion is lifted straight from `ms`.
*/
export function adjustDate(date: Date, adjustment: string) {
export function adjustDate(date: Date, adjustment: string): Date | undefined {
date = clone(date);
const subtract = adjustment.startsWith('-');

View File

@@ -0,0 +1,42 @@
import env from '../env';
import { Request } from 'express';
/**
* Returns the Cache-Control header for the current request
*
* @param req Express request object
* @param ttl TTL of the cache in ms
*/
export function getCacheControlHeader(req: Request, ttl: number | null): string {
// When the resource / current request isn't cached
if (ttl === null) return 'no-cache';
// When the API cache can invalidate at any moment
if (env.CACHE_AUTO_PURGE === true) return 'no-cache';
const noCacheRequested =
req.headers['cache-control']?.includes('no-cache') || req.headers['Cache-Control']?.includes('no-cache');
// When the user explicitly asked to skip the cache
if (noCacheRequested) return 'no-cache';
// Cache control header uses seconds for everything
const ttlSeconds = Math.round(ttl / 1000);
const access = !!req.accountability?.role === false ? 'public' : 'private';
let headerValue = `${access}, max-age=${ttlSeconds}`;
// When the s-maxage flag should be included
if (env.CACHE_CONTROL_S_MAXAGE !== false) {
// Default to regular max-age flag when true
if (env.CACHE_CONTROL_S_MAXAGE === true) {
headerValue += `, s-maxage=${ttlSeconds}`;
} else {
// Set to custom value
headerValue += `, s-maxage=${env.CACHE_CONTROL_S_MAXAGE}`;
}
}
return headerValue;
}

View File

@@ -5,8 +5,6 @@ import logger from '../logger';
* Check if url matches allow list either exactly or by domain+path
*/
export default function isUrlAllowed(url: string, allowList: string | string[]): boolean {
console.log(url, allowList);
const urlAllowList = toArray(allowList);
if (urlAllowList.includes(url)) return true;

View File

@@ -1,6 +1,6 @@
{
"name": "@directus/app",
"version": "9.0.0-rc.75",
"version": "9.0.0-rc.76",
"private": false,
"description": "Directus is an Open-Source Headless CMS & API for Managing Custom Databases",
"author": "Rijk van Zanten <rijk@rngr.org>",
@@ -28,8 +28,8 @@
},
"gitHead": "24621f3934dc77eb23441331040ed13c676ceffd",
"devDependencies": {
"@directus/docs": "9.0.0-rc.75",
"@directus/format-title": "9.0.0-rc.75",
"@directus/docs": "9.0.0-rc.76",
"@directus/format-title": "9.0.0-rc.76",
"@fullcalendar/core": "^5.7.2",
"@fullcalendar/daygrid": "^5.7.2",
"@fullcalendar/interaction": "^5.7.2",
@@ -38,7 +38,7 @@
"@popperjs/core": "^2.9.2",
"@rollup/plugin-yaml": "^3.0.0",
"@sindresorhus/slugify": "^2.1.0",
"@tinymce/tinymce-vue": "^4.0.0",
"@tinymce/tinymce-vue": "^4.0.3",
"@types/base-64": "^1.0.0",
"@types/bytes": "^3.1.0",
"@types/codemirror": "^5.60.0",
@@ -62,7 +62,7 @@
"base-64": "^1.0.0",
"codemirror": "^5.61.1",
"copyfiles": "^2.4.1",
"cropperjs": "^1.5.11",
"cropperjs": "^1.5.12",
"date-fns": "^2.21.1",
"dompurify": "^2.2.9",
"escape-string-regexp": "^5.0.0",
@@ -79,7 +79,7 @@
"pretty-ms": "^7.0.1",
"qrcode": "^1.4.4",
"rimraf": "^3.0.2",
"sass": "^1.34.1",
"sass": "^1.35.1",
"tinymce": "^5.7.1",
"typescript": "^4.2.4",
"vite": "^2.3.7",

View File

@@ -274,7 +274,12 @@ export default defineComponent({
url: url.value,
});
emit('input', response.data.data);
if (props.multiple) {
emit('input', [response.data.data]);
} else {
emit('input', response.data.data);
}
activeDialog.value = null;
url.value = '';
} catch (err) {

View File

@@ -20,10 +20,12 @@ export async function registerDisplays(app: App): Promise<void> {
const result = await import(/* @vite-ignore */ `${getRootPath()}extensions/displays/${displayName}/index.js`);
displays.push(result.default);
} catch (err) {
// eslint-disable-next-line no-console
console.warn(`Couldn't load custom displays "${displayName}":`, err);
}
});
} catch {
// eslint-disable-next-line no-console
console.warn(`Couldn't load custom displays`);
}

View File

@@ -5,7 +5,7 @@
<interface-select-multiple-checkbox
v-else
:choices="items"
@input="emit('input', $event)"
@input="$emit('input', $event)"
:value="value"
:disabled="disabled"
/>

View File

@@ -100,6 +100,7 @@ export default defineComponent({
const resultsArray = get(result.data, props.resultsPath);
if (Array.isArray(resultsArray) === false) {
// eslint-disable-next-line no-console
console.warn(`Expected results type of array, "${typeof resultsArray}" recieved`);
return;
} else {
@@ -108,6 +109,7 @@ export default defineComponent({
.filter((val: unknown) => val);
}
} catch (err) {
// eslint-disable-next-line no-console
console.warn(err);
}
};

View File

@@ -4,9 +4,8 @@
ref="editorElement"
:init="editorOptions"
:disabled="disabled"
model-events="change keydown blur focus paste ExecCommand SetContent"
model-events="change keydown blur focus paste ExecCommand"
v-model="internalValue"
@change="onChange"
@onFocusIn="setFocus(true)"
@onFocusOut="setFocus(false)"
/>
@@ -242,6 +241,7 @@ export default defineComponent({
editorRef,
imageToken
);
const {
mediaDrawerOpen,
mediaSelection,
@@ -344,9 +344,6 @@ export default defineComponent({
closeCodeDrawer,
saveCode,
sourceCodeButton,
onChange(a: any) {
console.log(a);
},
};
function setup(editor: any) {
@@ -374,9 +371,12 @@ export default defineComponent({
});
</script>
<style lang="scss" scoped>
<style lang="scss">
@import 'tinymce/skins/ui/oxide/skin.css';
@import './tinymce-overrides.css';
</style>
<style lang="scss" scoped>
@import '@/styles/mixins/form-grid';
.body {

View File

@@ -26,7 +26,7 @@ type UsableImage = {
imageButton: ImageButton;
};
export default function useImage(editor: Ref<any>, imageToken: Ref<string>): UsableImage {
export default function useImage(editor: Ref<any>, imageToken: Ref<string | undefined>): UsableImage {
const imageDrawerOpen = ref(false);
const imageSelection = ref<ImageSelection | null>(null);

View File

@@ -31,7 +31,7 @@ type UsableMedia = {
mediaButton: MediaButton;
};
export default function useMedia(editor: Ref<any>, imageToken: Ref<string>): UsableMedia {
export default function useMedia(editor: Ref<any>, imageToken: Ref<string | undefined>): UsableMedia {
const mediaDrawerOpen = ref(false);
const mediaSelection = ref<MediaSelection | null>(null);
const openMediaTab = ref(['video']);
@@ -151,7 +151,8 @@ export default function useMedia(editor: Ref<any>, imageToken: Ref<string>): Usa
}
function onMediaSelect(media: Record<string, any>) {
const source = addTokenToURL(getPublicURL() + 'assets/' + media.id, imageToken.value);
const url = getPublicURL() + 'assets/' + media.id;
const source = imageToken.value ? addTokenToURL(url, imageToken.value) : url;
mediaSelection.value = {
source,

View File

@@ -9,6 +9,7 @@ import { computed, defineComponent, PropType } from 'vue';
import { Field } from '@/types';
export default defineComponent({
emits: ['input'],
props: {
fieldData: {
type: Object as PropType<Field>,

View File

@@ -23,10 +23,12 @@ export async function registerInterfaces(app: App): Promise<void> {
);
interfaces.push(result.default);
} catch (err) {
// eslint-disable-next-line no-console
console.warn(`Couldn't load custom interface "${interfaceName}":`, err);
}
});
} catch {
// eslint-disable-next-line no-console
console.warn(`Couldn't load custom interfaces`);
}

View File

@@ -71,7 +71,7 @@
:collection="relatedCollection.collection"
:primary-key="currentPrimaryKey"
:edits="edits"
:circular-field="relation.meta.one_field"
:circular-field="relation.meta?.one_field"
@input="stageEdits"
/>
@@ -325,7 +325,7 @@ export default defineComponent({
});
const relatedCollection = computed(() => {
return collectionsStore.getCollection(relation.value.related_collection)!;
return collectionsStore.getCollection(relation.value.related_collection!)!;
});
const { primaryKeyField: relatedPrimaryKeyField } = useCollection(relatedCollection.value.collection);

View File

@@ -420,7 +420,6 @@ export default defineComponent({
};
});
} catch (err) {
console.log(err);
error.value = err;
previewItems.value = [];
} finally {

View File

@@ -26,6 +26,7 @@ export async function setLanguage(lang: Language): Promise<boolean> {
i18n.global.mergeLocaleMessage(lang, translations);
loadedLanguages.push(lang);
} catch (err) {
// eslint-disable-next-line no-console
console.warn(err);
}
}

View File

@@ -20,7 +20,6 @@ create_role: إنشاء دور أو صلاحية
create_user: إضافة مستخدم
create_webhook: إنشاء Webhook
invite_users: دعوة مستخدمين
email_examples: 'admin@example.com, user@example.com...'
invite: دعوة
email_already_invited: البريد الإلكتروني {email} تم دعوته مسبقاً
emails: البريد الإلكتروني

View File

@@ -20,7 +20,6 @@ create_role: Създаване на роля
create_user: Създаване на потребител
create_webhook: Създаване на уеб-кука
invite_users: Покана към потребители
email_examples: 'admin@example.com, potrebitel@example.com...'
invite: Покана
email_already_invited: Вече е изпратена покана в пощата на "{email}"
emails: E-пощи

View File

@@ -16,7 +16,6 @@ create_role: Crea un rol
create_user: Crear usuari
create_webhook: Crear Webhook
invite_users: Convidar usuaris
email_examples: 'admin@exemple.com, usuari@exemple.com...'
invite: Convida
emails: Correus electrònics
connection_excellent: Connexió excel·lent

View File

@@ -20,7 +20,6 @@ create_role: Vytvořit roli
create_user: Vytvořit uživatele
create_webhook: Vytvořit webhook
invite_users: Pozvat uživatele
email_examples: 'admin@example.com, user@example.com...'
invite: Pozvat
email_already_invited: E-mail "{email}" již byl pozván
emails: E-mail

View File

@@ -20,7 +20,6 @@ create_role: Opret Rolle
create_user: Opret bruger
create_webhook: Opret Webhook
invite_users: Inviter brugere
email_examples: 'admin@eksempel.dk, bruger@eksempel.dk...'
invite: Inviter
emails: E-mail
connection_excellent: Udmærket forbindelse

View File

@@ -20,7 +20,7 @@ create_role: Rolle erstellen
create_user: Benutzer erstellen
create_webhook: Webhook erstellen
invite_users: Benutzer einladen
email_examples: 'admin@beispiel.org, benutzer@beispiel.org...'
email_examples: "admin{'@'}beispiel.de, benutzer{'@'}beispiel.de..."
invite: Einladen
email_already_invited: E-Mail "{email}" wurde bereits eingeladen
emails: E-Mails

View File

@@ -20,7 +20,6 @@ create_role: Δημιουργία ρόλου
create_user: Δημιουργία Χρήστη
create_webhook: Δημιουργία Webhook
invite_users: Πρόσκληση Χρηστών
email_examples: 'admin@example.com, user@example.com...'
invite: Πρόσκληση
email_already_invited: To email "{email}" έχει ήδη προσκληθεί
emails: Emails

View File

@@ -19,7 +19,7 @@ create_role: Create Role
create_user: Create User
create_webhook: Create Webhook
invite_users: Invite Users
email_examples: 'admin@example.com, user@example.com...'
email_examples: "admin{'@'}example.com, user{'@'}example.com..."
invite: Invite
email_already_invited: Email "{email}" has already been invited
emails: Emails

View File

@@ -20,7 +20,6 @@ create_role: Crear rol
create_user: Crear Usuario
create_webhook: Crear un gancho web
invite_users: Invitar Usuarios
email_examples: 'admin@ejemplo.com, usuario@ejemplo.com...'
invite: Invita
email_already_invited: El correo electrónico "{email}" ya fue invitado con anterioridad
emails: Correos electrónicos
@@ -906,9 +905,23 @@ interfaces:
presentation-divider:
divider: Separador
description: Etiqueta y divide los campos en secciones
title_placeholder: Ingresar un título...
inline_title: Título seguido por línea
inline_title_label: Mostrar título seguido por línea
margin_top: Margen superior
margin_top_label: Aumentar Margen Superior
select-dropdown:
description: Seleccione un valor de una lista desplegable
choices_placeholder: Agregar una nueva opción
allow_other: Permitir otro
allow_other_label: Permitir otros valores
allow_none: Permitir "Nada"
allow_none_label: Permitir "Sin selección"
choices_name_placeholder: Ingrese un nombre...
choices_value_placeholder: Ingresa un valor...
select-multiple-dropdown:
select-multiple-dropdown: Lista Desplegable (Múltiple)
description: Seleccione múltiples valores de una lista de selección
file:
file: Archivo
description: Seleccionar o subir un archivo
@@ -917,14 +930,39 @@ interfaces:
description: Seleccionar o subir múltiples archivos
input-hash:
hash: Hash
description: Introduzca un valor para ser cifrado
masked: Enmascarado
masked_label: Ocultar los valores reales
select-icon:
icon: Ícono
description: Seleccione un ícono de la lista desplegable
search_for_icon: Buscar un ícono...
file-image:
image: Imagen
description: Seleccionar o subir una imagen
system-interface:
interface: Interfaz
description: Seleccionar una interfaz existente
placeholder: Seleccionar una interfaz...
system-interface-options:
interface-options: Opciones de Interfaz
description: Una ventana modal para seleccionar opciones de una interfaz
list-m2m:
many-to-many: Muchos a Muchos
description: Seleccionar múltiples elementos de unión relacionados
select-dropdown-m2o:
many-to-one: Muchos a Uno
description: Seleccionar un elemento único relacionado
display_template: Plantilla de Presentación
input-rich-text-md:
markdown: Markdown
description: Ingresar y previsualizar Markdown
customSyntax: Bloques personalizados
customSyntax_label: Añadir tipos de sintaxis personalizados
customSyntax_add: Añadir sintaxis personalizada
box: Bloque / Alineación
imageToken: Token de Imagen
imageToken_label: Qué token (estático) añadir a las fuentes de la imagen
slider:
slider: Deslizador
description: Seleccionar un número usando un deslizador
@@ -943,6 +981,8 @@ interfaces:
alphabetize: Alfabetización
alphabetize_label: Forzar Orden Alfabético
add_tags: Agregar etiquetas...
input:
mask: Enmascarado
boolean:
toggle: Alternar
label_default: Habilitado

View File

@@ -20,7 +20,6 @@ create_role: Crear Rol
create_user: Crear usuario
create_webhook: Crear un webhook(conección)
invite_users: Invitar usuarios
email_examples: 'admin@ejemplo.com, usuario@ejemplo.com...'
invite: Invitar
email_already_invited: El correo electrónico "{email}" ya ha sido invitado
emails: Correos electrónicos
@@ -906,9 +905,23 @@ interfaces:
presentation-divider:
divider: Separador
description: Etiqueta y divide los campos en secciones
title_placeholder: Ingresar un título...
inline_title: Título seguido por línea
inline_title_label: Mostrar título seguido por línea
margin_top: Margen superior
margin_top_label: Aumentar Margen Superior
select-dropdown:
description: Seleccione un valor de una lista desplegable
choices_placeholder: Agregar una nueva opción
allow_other: Permitir otro
allow_other_label: Permitir otros valores
allow_none: Permitir "Nada"
allow_none_label: Permitir "Sin selección"
choices_name_placeholder: Ingrese un nombre...
choices_value_placeholder: Ingrese un valor...
select-multiple-dropdown:
select-multiple-dropdown: Lista Desplegable (Múltiple)
description: Seleccione múltiples valores de una lista de selección
file:
file: Archivo
description: Seleccionar o subir un archivo
@@ -917,14 +930,39 @@ interfaces:
description: Seleccionar o subir múltiples archivos
input-hash:
hash: Hash
description: Introduzca un valor para ser cifrado
masked: Enmascarado
masked_label: Ocultar los valores reales
select-icon:
icon: Icono
description: Seleccione un ícono de la lista desplegable
search_for_icon: Buscar un ícono...
file-image:
image: Imagen
description: Seleccionar o subir una imagen
system-interface:
interface: Interfaz
description: Seleccionar una interfaz existente
placeholder: Seleccionar una interfaz...
system-interface-options:
interface-options: Opciones de Interfaz
description: Una ventana modal para seleccionar opciones de una interfaz
list-m2m:
many-to-many: Muchos a Muchos
description: Seleccionar múltiples elementos de unión relacionados
select-dropdown-m2o:
many-to-one: Muchos a Uno
description: Seleccionar un elemento único relacionado
display_template: Plantilla de Presentación
input-rich-text-md:
markdown: Markdown
description: Ingresar y previsualizar Markdown
customSyntax: Bloques personalizados
customSyntax_label: Añadir tipos de sintaxis personalizados
customSyntax_add: Añadir sintaxis personalizada
box: Bloque / Alineación
imageToken: Token de Imagen
imageToken_label: Qué token (estático) añadir a las fuentes de la imagen
slider:
slider: Deslizador
description: Seleccionar un número usando un deslizador
@@ -943,6 +981,8 @@ interfaces:
alphabetize: Alfabetización
alphabetize_label: Forzar Orden Alfabético
add_tags: Agregar etiquetas...
input:
mask: Enmascarado
boolean:
toggle: Alternar
label_default: Habilitado

View File

@@ -20,7 +20,6 @@ create_role: Crear Rol
create_user: Crear Usuario
create_webhook: Crear Webhook
invite_users: Invitar Usuarios
email_examples: 'admin@example.com, user@example.com...'
invite: Invitar
email_already_invited: El correo electrónico "{email}" ya ha sido invitado
emails: Correos Electrónicos

View File

@@ -20,7 +20,6 @@ create_role: Loo roll
create_user: Loo kasutaja
create_webhook: Loo veebikonks
invite_users: Kutsu kasutajaid
email_examples: 'admin@example.com, user@example.com...'
invite: Kutsu
email_already_invited: Meilile "{email}" on kutse juba saadetud
emails: E-mail
@@ -855,7 +854,6 @@ template: Mall
translation: Tõlge
value: Väärtus
view_project: Näita projekti
weeks: { }
report_error: Raporteeri viga
interfaces:
presentation-links:

View File

@@ -20,7 +20,6 @@ create_role: Luo rooli
create_user: Luo käyttäjä
create_webhook: Luo webhook
invite_users: Kutsu käyttäjiä
email_examples: 'yllapitaja@example.com, kayttaja@example.com...'
invite: Kutsu
email_already_invited: Sähköposti "{email}" on jo kutsuttu
emails: Sähköpostit

View File

@@ -20,7 +20,7 @@ create_role: Créer un rôle
create_user: Créer un utilisateur
create_webhook: Créer un webhook
invite_users: Inviter des utilisateurs
email_examples: 'admin@exemple.com, utilisateur@exemple.com...'
email_examples: "admin{'@'}example.com, user{'@'}example.com..."
invite: Inviter
email_already_invited: '"{email}" a déjà été invité'
emails: E-mails

View File

@@ -20,7 +20,7 @@ create_role: भूमिका बनाएं
create_user: यूजर बनाएं
create_webhook: Webhook बनाएं
invite_users: यूज़र आमंत्रित करें
email_examples: 'admin@example.com, user@example.com...'
email_examples: "good"
invite: आमंत्रित करें
email_already_invited: ईमेल "{email}" पहले ही आमंत्रित किया जा चुका है
emails: इमेल्स

View File

@@ -15,7 +15,6 @@ create_role: Szerepkör létrehozása
create_user: Felhasználó létrehozása
create_webhook: Webhook létrehozása
invite_users: Felhasználók meghívása
email_examples: 'admin@example.com, felhaszalo@pelda.hu...'
invite: Meghívás
emails: Emailek
connection_excellent: Kiváló kapcsolat

View File

@@ -20,7 +20,6 @@ create_role: Buat Peran
create_user: Buat User
create_webhook: Buat Webhook
invite_users: Undang Pengguna Lain
email_examples: 'admin@website.com, user@website.com...'
invite: Undang
email_already_invited: Email "{email}" sudah diundang
emails: Surel

View File

@@ -20,7 +20,6 @@ create_role: Crea ruolo
create_user: Crea utente
create_webhook: Crea webhook
invite_users: Invita utenti
email_examples: 'admin@example.com, user@example.com...'
invite: Invita
email_already_invited: Email "{email}" è già stata invitata
emails: Email

View File

@@ -17,7 +17,6 @@ create_role: Kurti vaidmenį
create_user: Sukurti vartotojo paskyrą
create_webhook: Sukurti Webhook'ą
invite_users: Pakviesti vartotojus
email_examples: 'admin@example.com, user@example.com...'
invite: Pakviesti
emails: El. pašto adresai
connection_excellent: Puiki ryšio kokybė

View File

@@ -20,7 +20,7 @@ create_role: Үүрэг үүсгэх
create_user: Хэрэглэгч үүсгэх
create_webhook: Webhook үүсгэх
invite_users: Хэрэглэгч урих
email_examples: 'admin@example.com, user@example.com...'
email_examples: "admin{'@'}example.com, user{'@'}example.com..."
invite: Урих
email_already_invited: '"{email}" имэйл хаягийг өмнө нь урьсан байна'
emails: Имэйл
@@ -43,6 +43,22 @@ logoutReason:
SIGN_OUT: Сайтаас гарсан
SESSION_EXPIRED: Холболтын хугацаа дууссан
public: Нийтийн
public_description: Нэвтэрч ороогүй үед API- ны ямар өгөгдөл авч болохыг удирдана.
not_allowed: Зөвшөөрөгдөөгүй
directus_version: Directus хувилбар
node_version: Node хувилбар
node_uptime: Node ажиллаж буй хугацаа
os_type: Үйлдлийн системийн төрөл
os_version: Үйлдлийн системийн хувилбар
os_uptime: Үйлдлийн системийн ажиллаж буй хугацаа
os_totalmem: Үйлдлийн системийн санах ой
archive: Архивлах
archive_confirm: Та энэ мэдээллийг архивлахыг хүсч байна уу?
archive_confirm_count: >-
Ямар нэг зүйл сонгогдоогүй | Та үүнийг архивлахдаа итгэлтэй байна уу? | Та энэ {count}
зүйлсийг архивлахдаа итгэлтэй байна уу?
reset_system_permissions_to: 'Системийн зөвшөөрлийг буцааж хэвэнд нь оруулах:'
reset_system_permissions_copy: Энэ үйлдлийг хийснээр өмнө нь тохируулсан зөвшөөрлийн тохиргоо дарагдана. Хийх үү?
fields:
directus_fields:
translation: Талбарын нэрний орчуулга

View File

@@ -11,6 +11,7 @@ add_field: Voeg Veld Toe
role_name: Rol Naam
db_only_click_to_configure: 'Alleen in de Database: Klik om te configureren '
show_archived_items: Toon Gearchiveerde Items
edited: Waarde bewerkt
required: Vereist
required_for_app_access: Vereist voor toegang tot de app
requires_value: Vereist waarde
@@ -19,8 +20,9 @@ create_role: Maak rol
create_user: Gebruiker Aanmaken
create_webhook: Webhook Aanmaken
invite_users: Gebruikers Uitnodigen
email_examples: 'admin@example.nl, gebruiker@example.nl...'
email_examples: "admin{'@'}voorbeeld.nl, gebruiker{'@'}voorbeeld.nl..."
invite: Nodig uit
email_already_invited: E-mailadres "{email}" is al uitgenodigd
emails: E-mails
connection_excellent: Uitstekende Verbinding
connection_good: Goede Verbinding
@@ -80,9 +82,12 @@ validationError:
nnull: Waarde kan niet "null" zijn
required: Waarde is vereist
unique: Waarde moet uniek zijn
regex: Waarde heeft niet de juiste vorm
all_access: Alle toegang
no_access: Geen toegang
use_custom: Gebruik aangepaste
allow_null_value: NULL waarde toestaan
enter_value_to_replace_nulls: Voer een nieuwe waarde in om alle NULL's in dit veld te vervangen.
field_standard: Standaard
field_presentation: Presentatie & Aliasen
field_file: Enkel bestand
@@ -137,6 +142,7 @@ decimal: Decimaal
float: Float
integer: Integer
json: JSON
xml: XML
string: String
text: Tekst
time: Tijd
@@ -145,6 +151,11 @@ uuid: UUID
hash: Hash
not_available_for_type: Niet beschikbaar voor dit type
create_translations: Vertalingen aanmaken
auto_refresh: Automatische verversen
refresh_interval: Verversingsinterval
no_refresh: Niet verversen
refresh_interval_seconds: Ververs onmiddellijk | Elke seconde | Elke {seconds} seconden
refresh_interval_minutes: Elke minuut | Elke {minutes} minuten
auto_generate: Genereer automatisch
this_will_auto_setup_fields_relations: Dit zal automatisch alle vereiste velden en relaties instellen.
click_here: Klik hier
@@ -152,7 +163,9 @@ to_manually_setup_translations: om de vertalingen handmatig in te stellen.
click_to_manage_translated_fields: >-
Er zijn nog geen vertaalde velden. Klik hier om ze aan te maken. | Er is één vertaald veld. Klik hier om het te beheren. | Er zijn {count} vertaalde velden. Klik hier om ze te beheren.
fields_group: Veld-Groep
no_collections_found: Geen collecties gevonden.
new_data_alert: 'Het volgende wordt aangemaakt in uw datamodel:'
search_collection: Collectie doorzoeken...
new_field: 'Nieuw veld'
new_collection: 'Nieuwe collectie'
add_m2o_to_collection: 'Many-to-one toevoegen aan "{collection}"'
@@ -219,6 +232,7 @@ item_delete_success: Item Verwijderd | Items Verwijderd
this_collection: Deze collectie
related_collection: Gerelateerde collecties
related_collections: Gerelateerde collecties
translations_collection: Vertalingscollectie
languages_collection: Talen Collectie
export_data: Gegevens exporteren
format: Format
@@ -305,6 +319,10 @@ save_and_create_new: Opslaan en nieuwe aanmaken
save_and_stay: Sla op en blijf bewerken
save_as_copy: Sla op als een kopie
add_existing: Bestaande toevoegen
creating_items: Items aanmaken
enable_create_button: Aanmaakknop inschakelen
selecting_items: Items selecteren
enable_select_button: Selecteerknop inschakelen
comments: Reacties
no_comments: Nog geen reacties
click_to_expand: Klik om uit te breiden
@@ -319,6 +337,7 @@ interface_not_found: 'Interface "{interface}" niet gevonden.'
reset_interface: Interface resetten
display_not_found: 'Display "{display}" niet gevonden.'
reset_display: Reset Display
list-m2a: Bouwer (M2A)
item_count: 'Geen items | Één item | {count} items'
no_items_copy: Er zijn nog geen items in deze collectie.
file_count: 'Geen bestanden | Één Bestand | {count} bestanden'
@@ -384,6 +403,9 @@ errors:
ITEM_LIMIT_REACHED: Item limiet bereikt
ITEM_NOT_FOUND: Item niet gevonden
ROUTE_NOT_FOUND: Niet gevonden
RECORD_NOT_UNIQUE: Verdubbelde waarde gedetecteerd
USER_SUSPENDED: Gebruiker geschorst
CONTAINS_NULL_VALUES: Veld bevat NULL waarden
UNKNOWN: Onverwachte fout
INTERNAL_SERVER_ERROR: Onverwachte fout
value_hashed: Waarde veilig opgeslagen
@@ -461,6 +483,8 @@ operators:
has: Bevat enkele van deze keys
loading: Aan het laden...
drop_to_upload: Sleep hier om te uploaden
item: Item
items: Items
upload_file: Upload Bestand
upload_file_indeterminate: Bestand uploaden...
upload_file_success: Bestand geüpload
@@ -478,6 +502,8 @@ value_unique: Waarde moet uniek zijn
all_activity: Alle activiteiten
create_item: Item aanmaken
display_template: Weergavesjabloon
language_display_template: Taalweergavesjabloon
translations_display_template: Vertalingsweergavesjabloon
n_items_selected: 'Geen Items Geselecteerd | 1 Item Geselecteerd | {n} Items Geselecteerd'
per_page: Per pagina
all_files: Alle bestanden
@@ -508,8 +534,19 @@ toggle: Schakel
icon_on: Icoon aan
icon_off: Icoon Uit
label: Label
image_url: Afbeeldings-url
alt_text: Alternatieve tekst
media: Media
width: Breedte
height: Hoogte
source: Bron
url_placeholder: Voer een URL in...
display_text: Weergegeven tekst
display_text_placeholder: Enter weergegeven tekst...
unlimited: Onbeperkt
open_link_in: Open link in
new_tab: Nieuw tabblad
current_tab: Huidig tabblad
wysiwyg_options:
aligncenter: Align Center
alignjustify: Align Justify
@@ -529,7 +566,10 @@ wysiwyg_options:
bullist: Opsomming
numlist: Genummerde lijst
hr: Horizontale lijn
link: Link toevoegen/bewerken
unlink: Link verwijderen
media: Media toevoegen/bewerken
image: Afbeelding toevoegen/bewerken
copy: Kopieer
cut: Knippen
paste: Plakken
@@ -551,6 +591,7 @@ wysiwyg_options:
selectall: Alles selecteren
table: Tabel
visualaid: Onzichtbare elementen weergeven
source_code: Broncode bewerken
fullscreen: Volledig scherm
directionality: Richting
dropdown: Keuzemenu
@@ -563,6 +604,8 @@ adding_user: Gebruiker toevoegen
unknown_user: Onbekende gebruiker
creating_in: 'Item maken in {collection}'
editing_in: 'Item bewerken in {collection}'
creating_unit: '{unit} aan het aanmaken'
editing_unit: '{unit} aan het bewerken'
editing_in_batch: '{count} items aan het wijzigen'
no_options_available: Geen opties beschikbaar
settings_data_model: Data model
@@ -570,8 +613,11 @@ settings_permissions: Rollen & Permissies
settings_project: Project Instellingen
settings_webhooks: Webhooks
settings_presets: Voorkeuren & Bladwijzers
one_or_more_options_are_missing: Eén of meer opties ontbreken
scope: Bereik
select: Selecteer...
layout: Lay-out
tree_view: Boomstructuurweergave
changes_are_permanent: Wijzigingen zijn permanent
preset_search_placeholder: Zoekterm...
editing_preset: Voorkeur aan het Wijzigen
@@ -818,7 +864,11 @@ interfaces:
presentation-divider:
divider: Scheidingslijn
select-dropdown:
choices_name_placeholder: Voer een naam in...
choices_value_placeholder: Voer een waarde in...
select-multiple-dropdown:
select-multiple-dropdown: Dropdown (meerdere)
description: Selecteer meerdere waarden in een dropdown
file:
file: Bestand
description: Selecteer of upload een bestand
@@ -827,14 +877,41 @@ interfaces:
description: Selecteer of upload meerdere bestanden
input-hash:
hash: Hash
description: Voer een waarde in om te hashen
masked: Gemaskeerd
masked_label: Verberg de echte waarden
select-icon:
icon: Icoon
description: Selecteer een waarde in een dropdown
search_for_icon: Zoek naar een icoon...
file-image:
image: Afbeelding
description: Selecteer of upload een afbeelding
system-interface:
interface: Interface
description: Selecteer een bestaande interface
placeholder: Selecteer een interface...
system-interface-options:
interface-options: Interface-opties
description: Een modal voor het selecteren van een interface
list-m2m:
description: Selecteer meerdere gerelateerde items
select-dropdown-m2o:
description: Selecteer één gerelateerd item
display_template: Weergavesjabloon
input-rich-text-md:
markdown: Markdown
customSyntax: Aangepaste blokken
box: Blok / Inline
imageToken: Afbeeldingstoken
presentation-notice:
notice: Melding
description: Een korte melding weergeven
select-radio:
radio-buttons: Keuzerondjes
list:
repeater: Herhaler
edit_fields: Velden bewerken
slider:
slider: Schuifregelaar
description: Selecteer een nummer met een slider
@@ -853,8 +930,15 @@ interfaces:
alphabetize: Alfabetische volgorde
alphabetize_label: Alfabetische volgorde forceren
add_tags: Tags toevoegen...
input:
mask: Gemaskeerd
mask_label: Verberg de werkelijke waarde
clear_label: Opslaan als lege tekst
minimum_value: Minimale waarde
maximum_value: Maximale waarde
boolean:
toggle: Schakel
label_placeholder: Voer een label in...
label_default: Ingeschakeld
translations:
display_template: Weergavesjabloon
@@ -867,6 +951,11 @@ interfaces:
auto: Automatisch
dropdown: Keuzemenu
modal: Modal
input-rich-text-html:
wysiwyg: WYSIWYG
toolbar: Werkbalk
custom_formats: Aangepaste vorm
options_override: Overschrijf opties
displays:
boolean:
boolean: Boolean
@@ -969,3 +1058,5 @@ layouts:
comfortable: Comfortabel
compact: Compact
cozy: Knus
calendar:
calendar: Kalender

View File

@@ -20,7 +20,6 @@ create_role: Opprett rolle
create_user: Opprett bruker
create_webhook: Lag Webhook
invite_users: Invitere brukere
email_examples: 'admin@example.com, user@example.com...'
invite: Inviter
emails: E-post
connection_excellent: Utmerket tilkobling

View File

@@ -20,7 +20,6 @@ create_role: Stwórz rolę
create_user: Utwórz użytkownika
create_webhook: Stwórz webhook
invite_users: Zaproś użytkowników
email_examples: 'admin@example.com, użytkownik@example.com...'
invite: Zaproś
email_already_invited: E-mail "{email}" został już zaproszony
emails: E-maile
@@ -855,7 +854,6 @@ template: Szablon
translation: Tłumaczenia
value: Wartość
view_project: Zobacz projekt
weeks: { }
report_error: Zgłoś błąd
interfaces:
presentation-links:

View File

@@ -20,7 +20,7 @@ create_role: Criar Função
create_user: Criar usuário
create_webhook: Criar Webhook
invite_users: Convidar Usuários
email_examples: 'admin@example.com, usuário@example.com...'
email_examples: "admin{'@'}exemplo.com, usuário{'@'}exemplo.com..."
invite: Convidar
email_already_invited: Um convite já foi enviado para o email "{email}"
emails: Emails
@@ -503,6 +503,8 @@ value_unique: O valor deve ser único
all_activity: Todas as atividades
create_item: Criar item
display_template: Modelo de exibição
language_display_template: Modelo de Exibição do Idioma
translations_display_template: Modelos de Exibição da Aplicação
n_items_selected: 'Não há itens selecionados | 1 item selecionado | {n} itens selecionados'
per_page: Por página
all_files: Todos os arquivos
@@ -784,8 +786,12 @@ save_current_datetime: Salvar data/hora atual
block: Bloco
inline: Em linha
comment: Comentário
relational_triggers: Gatilhos Relacionais
referential_action_field_label_m2o: Ao Excluir de {collection}...
referential_action_field_label_o2m: Em Desmarcar {collection}...
referential_action_no_action: Evitar a exclusão
referential_action_cascade: Excluir o item {collection} (cascade)
referential_action_set_default: Definir {field} para o seu valor padrão
choose_action: Escolha uma ação
continue: Continuar
continue_as: >-
@@ -996,6 +1002,7 @@ interfaces:
add_tags: Adicionar tags...
input:
input: Entrada
description: Digite manualmente um valor
trim: Recortar
trim_label: Remover espaços do início e fim
mask: Mascarado

View File

@@ -20,7 +20,6 @@ create_role: Criar estatuto
create_user: Criar utilizador
create_webhook: Criar webhook
invite_users: Convidar utlizadores
email_examples: 'admin@example.com, user@example.com...'
invite: Convidar
email_already_invited: Este e-mail já foi convidado
emails: Emails

View File

@@ -18,7 +18,6 @@ create_role: Creează Rol
create_user: Creează utilizator
create_webhook: Creează Webhook
invite_users: Invită utilizatori
email_examples: 'admin@exemplu.com, utilizator@exemplu.com...'
invite: Invită
emails: E-mailuri
connection_excellent: Conexiune excelentă

View File

@@ -20,7 +20,6 @@ create_role: Создать Роль
create_user: Создать Пользователя
create_webhook: Создать Веб-хук
invite_users: Пригласить Пользователей
email_examples: 'admin@example.com, user@example.com...'
invite: Пригласить
email_already_invited: На адрес "{email}" уже было отправлено приглашение
emails: Email-адреса

View File

@@ -5,6 +5,7 @@ duplicate_field: Dupliraj
half_width: Pola širine
full_width: Puna širina
fill_width: Popunjeno
field_name_translations: Prevodi Polja
enter_password_to_enable_tfa: Unesite vašu lozinku kako biste uključili dvostruku potvrdu autentičnosti
add_field: Dodaj Polje
role_name: Naziv uloge
@@ -14,9 +15,12 @@ edited: Vrijednost izmijenjena
required: Obavezno
required_for_app_access: Obavezno za pristup aplikaciji
requires_value: Zahtijeva vrijednost
create_preset: Napravi Izgled
create_role: Napravi ulogu
create_user: Napravi korisnika
create_webhook: Napravi Webhook
invite_users: Pozovi korisnike
email_examples: "admin{'@'}primjer.com, user{'@'}primjer.com..."
invite: Pozovi
email_already_invited: Na ovu "{email}" adresu je već poslat poziv
emails: Email adrese
@@ -42,6 +46,12 @@ public: Javno
public_description: Kontroliše koji podaci sa API su dostupni bez potrebe za provjerom autentičnosti korisnika.
not_allowed: Nije dozvoljeno
directus_version: Directus verzija
node_version: Node Verzija
node_uptime: Node Aktivno vrijeme rada
os_type: OS tip
os_version: OS Verzija
os_uptime: OS Aktivno vrijeme rada
os_totalmem: OS Memorija
archive: Arhiviraj
archive_confirm: Da li ste sigurni da želite da arhivirate ovu stavku?
archive_confirm_count: >-
@@ -75,9 +85,12 @@ validationError:
regex: Vrijednost ne sadrži ispravan format
all_access: Potpun Pristup
no_access: Bez Pristupa
use_custom: Koristi Prilagođen
nullable: Prazno
allow_null_value: Dozvoli NULL vrijednost
enter_value_to_replace_nulls: Molimo unesite novu vrijednost kako biste zamijenili sve NULL vrijednosti u sklopu ovog polja.
field_standard: Uobičajeno
field_presentation: Prezentacija & Pseudonimi
field_file: Single File
field_files: Multiple Files
field_m2o: M2O Relacija
@@ -88,8 +101,12 @@ field_translations: Prevodi
item_permissions: Dozvole na stavkama
field_permissions: Dozvole na Poljima
field_validation: Validacija Polja
field_presets: Podrazumijevani Izgledi Polja
permissions_for_role: 'Sve stavke {role} Role mogu {action}.'
fields_for_role: 'Sva polja {role} Role mogu {action}.'
validation_for_role: 'Polje {action} upravlja ulogom {role}.'
presets_for_role: 'Podrazumijevane vrijednosti polja za ulogu {role}.'
presentation_and_aliases: Prezentacija & Pseudonimi
revision_post_update: Ovako će ova stavka izgledati nakon ažuriranja...
changes_made: Postoje specifične izmjene koji su napravljene...
no_relational_data: Zapamtite da ovo ne uključuje relacione podatke.
@@ -107,12 +124,15 @@ camera: Kamera
exposure: Ekspozicija
shutter: Okidač
iso: ISO
focal_length: Žižna Daljina
schema_setup_key: Naziv kolone ovog polja u bazi i API ključ
create_field: Kreiraj Polje
creating_new_field: 'Novo Polje ({collection})'
field_in_collection: '{field} ({collection})'
reset_page_preferences: Resetuj Podešavanja Stranice
hidden_field: Sakriveno Polje
hidden_on_detail: Sakriveno u sekciji Detalji
disabled_editing_value: Onemogući izmjenu vrijednosti
key: Ključ
alias: Alias
bigInteger: Big Integer
@@ -134,18 +154,24 @@ not_available_for_type: Nije Dostupno za ovaj Tip
create_translations: Kreiraj Prevode
auto_refresh: Automatsko osvjеžavanjе
refresh_interval: Period Osvježavanja
no_refresh: Bey osvježavanja
refresh_interval_seconds: Trenutno Osvježavanje | Svake Sekunde | Svakih {seconds} Sekundi
refresh_interval_minutes: Svake Minute | Svakih {minutes} Minuta
auto_generate: Automatsko generisanje
this_will_auto_setup_fields_relations: Ovo će automatski podesiti sva obavezna polja i relacije.
click_here: Klikni ovdje
to_manually_setup_translations: za ručno podešavanje prevoda.
click_to_manage_translated_fields: >-
Trenutno ne postoje prevedena polja. Kliknite ovdje da ih kreirate. | Postoji jedno prevedeno polje. Kliknite ovdje za uređivanje. | Postoji {count} prevedenih polja. Kliknite ovdje da uređivanje.
fields_group: Grupe Polja
no_collections_found: Kolekcije nisu pronađene.
new_data_alert: 'Sljedeće će biti kreirano u sklopu Modela Podataka:'
search_collection: Pretraži Kolekciju...
new_field: 'Novo Polje'
new_collection: 'Nova Kolekcija'
add_m2o_to_collection: 'Dodaj Many-to-One relaciju na "{collection}"'
add_o2m_to_collection: 'Dodaj One-to-Many relaciju na "{collection}"'
add_m2m_to_collection: 'Dodaj Many-to-Many relaciju na "{collection}"'
choose_a_type: Izaberi Tip...
determined_by_relationship: Određeno Relacijom
add_note: Dodaj korisnu napomenu korisnicima...
@@ -153,18 +179,30 @@ default_value: Podrazumijevana Vrijednost
standard_field: Standardno Polje
single_file: Single File
multiple_files: Multiple Files
m2o_relationship: Many to One Relacija
o2m_relationship: One to Many Relacija
m2m_relationship: Many to Many Relacija
m2a_relationship: Many to Any Relacija
invalid_item: Nevažeća Stavka
next: Sljedeća
field_name: Naziv Polja
translations: Prevodi
note: Napomena
enter_a_value: Unesi vrijednost...
enter_a_placeholder: Unesi rezervni tekst...
length: Dužina
precision_scale: Preciznost & Skaliranje
readonly: Samo za čitanje
unique: Jedinstveno
updated_on: Ažurirano
updated_by: Ažurirano od strane
primary_key: Primarni Ključ
foreign_key: Strani Ključ
finish_setup: Završi podešavanje
dismiss: Ignoriši
raw_value: Vrijednost
edit_raw_value: Izmijeni Vrijednost
enter_raw_value: Unesi vrijednost...
clear_value: Obriši vrijednost
reset_to_default: Vrati na podrazumijevano
undo_changes: Poništi izmjene
@@ -173,15 +211,19 @@ show_all_activity: Prikaži svu aktivnost
page_not_found: Stranica nijе pronađеna
page_not_found_body: Stranica koju tražite nije moguće pronaći.
confirm_revert: Potvrdi Vraćanje
confirm_revert_body: Ova akcija će vratiti stavku na odabrano stanje.
display: Prikaz
settings_update_success: Podešavanja ažurirana
title: Naslov
revision_delta_created: Kreiran
revision_delta_created_externally: Eksterno Napravljeno
revision_delta_updated: 'Ažurirano 1 Polje | Ažuirano {count} Polja'
revision_delta_deleted: Obrisano
revision_delta_reverted: Vraćeno na staro
revision_delta_other: Revizija
revision_delta_by: '{date} po {user}'
private_user: Privatni Korisnik
revision_preview: Pregled Revizija
updates_made: Napravljena Ažuriranja
leave_comment: Ostavi komentar...
post_comment_success: Komentar objavljen
@@ -189,7 +231,9 @@ item_create_success: Stavka Kreirana | Stavke Kreirane
item_update_success: Stavka Ažurirana | Stavke Ažurirane
item_delete_success: Stavka Obrisana | Stavke Obrisane
this_collection: Ova Kolekcija
related_collection: Povezane Kolekcije
related_collections: Povezane Kolekcije
translations_collection: Prevod Kolekcije
languages_collection: Jezička Kolekcija
export_data: Izvoz Podataka
format: Format
@@ -205,6 +249,7 @@ submit: Pošalji
move_to_folder: Prebaci u fasciklu
move: Premjesti
system: Sistem
add_field_related: Dodaj Polje u Povezanu Kolekciju
interface: Interfejs
today: Danas
yesterday: Juče
@@ -249,20 +294,28 @@ zoom: Uvеćanjе
download: Preuzmi
open: Otvori
open_in_new_window: Otvori u Novom Prozoru
foreground_color: Primarna Boja
background_color: Boja Pozadine
upload_from_device: Otpremi Fajl sa Uređaja
choose_from_library: Odaberi Fajl iz Biblioteke
import_from_url: Uvezi Fajl sa URL adrese
replace_from_device: Zamijeni Fajl iz Uređaja
replace_from_library: Zamijeni Fajl iz Biblioteke
replace_from_url: Zamijeni Fajl sa URL-a
no_file_selected: Nema odabranih fajlova
download_file: Preuzmi Fajl
collection_key: Ključ Kolekcije
name: Ime
primary_key_field: Polje za Primarni Ključ
type: Tip
creating_new_collection: Kreiranje Nove Kolekcije
created_by: Kreirao
created_on: Kreirano
creating_collection_info: Imenuj kolekciju i podesi polje kao jedinstveni "ključ"...
creating_collection_system: Omogući ili preimenuj bilo koji od ponuđenih neobaveznih polja.
auto_increment_integer: Povećavajući broj
generated_uuid: Kreiran UUID
manual_string: Ručno unešen niz znakova
save_and_create_new: Sačuvaj i Napravi Novi
save_and_stay: Sačuvaj i Ostani
save_as_copy: Sačuvaj kao Kopiju
@@ -285,12 +338,15 @@ interface_not_found: 'Interfejs "{interface}" nije pronađen.'
reset_interface: Resetuj Interfejs
display_not_found: 'Prikaz "{display}" nije pronađen.'
reset_display: Resetuj Prikaz
list-m2a: Kreiranje (M2A)
item_count: 'Nema Stavki | Jedna Stavka | {count} stavki'
no_items_copy: Trenutno ne postoji nijedna stavka u ovoj kolekciji.
file_count: 'Nema Fajlova | Jedan Fajl | {count} Fajlova'
no_files_copy: Ovdje nema fajlova.
user_count: 'Nema Korisnika | Jedan Korisnik | {count} Korisnika'
no_users_copy: Ne postoji nijedan korisnik u ovoj roli.
webhooks_count: 'Ne postoje Webhooks | Jedan Webhook | {count} Webhooks'
no_webhooks_copy: Trenutno ne postoji nijedan "webhook".
all_items: Sve Stavke
csv: CSV
no_collections: Nema Kolekcija
@@ -301,8 +357,10 @@ relationship_not_setup: Relacija nije konfigurisana ispravno
display_template_not_setup: Šablon za grafički prikaz nije ispravno konfigurisan
collection_field_not_setup: Polje u kolekciji nije ispravno konfigurisano
select_a_collection: Izaberi Kolekciju
active: Aktivan
users: Korisnici
activity: Aktivnost
webhooks: Webhooks
field_width: Širina Polja
add_filter: Dodaj Filter
upper_limit: Gornja granica...
@@ -312,6 +370,7 @@ documentation: Dokumentacija
sidebar: Bočna traka
duration: Trajanje
charset: Set karaktera
second: Sekundi
file_moved: Fajl je premješten
collection_created: Kolekcija Napravljena
modified_on: Izmijenjeno
@@ -319,6 +378,7 @@ card_size: Veličina Kartice
sort_field: Polje za Sortiranje
add_sort_field: Dodaj Polje za Sortiranje
sort: Sortiranje
status: Status
toggle_manual_sorting: Uključi Ručno Sortiranje
bookmark_doesnt_exist: Oznaka ne postoji
bookmark_doesnt_exist_copy: Oznaku koju pokušavate otvoriti nije moguće pronaći.
@@ -327,6 +387,7 @@ select_an_item: Odaberi stavku...
edit: Izmijeni
enabled: Omogućen
disable_tfa: Isključi 2FA
tfa_scan_code: Skenirajte kod unutar aplikacije za autentikaciju kako biste kompletirali podešavanje 2FA
enter_otp_to_disable_tfa: Unesite OTP kako biste isključili 2FA
create_account: Napravi Korisnički nalog
account_created_successfully: Korisnički nalog je uspješno kreiran
@@ -338,6 +399,9 @@ errors:
FORBIDDEN: Zabranjeno
INVALID_CREDENTIALS: Pogrešno korisničko ime ili lozinka
INVALID_OTP: Pogrešna jednokratna lozinka
INVALID_PAYLOAD: Neispravan oblik objekta za slanje
INVALID_QUERY: Neispravan upit
ITEM_LIMIT_REACHED: Ograničenje stavke je dostignuto
ITEM_NOT_FOUND: Stavka nije pronađena
ROUTE_NOT_FOUND: Nije pronađeno
RECORD_NOT_UNIQUE: Detektovana je dupla vrijednost
@@ -345,10 +409,12 @@ errors:
CONTAINS_NULL_VALUES: Polje sadrži null vrijednosti
UNKNOWN: Neočekivana greška
INTERNAL_SERVER_ERROR: Neočekivana greška
value_hashed: Vrijednost je Sigurno Skladištena
bookmark_name: Naziv oznake...
create_bookmark: Napravi Oznaku
edit_bookmark: Ažuriraj Oznaku
bookmarks: Oznake
presets: Izgledi
unexpected_error: Neočekivana greška
unexpected_error_copy: Desila se neočekivana greška. Molimo pokušajte kasnije.
copy_details: Kopiraj Detalje
@@ -362,6 +428,7 @@ square: Kvadrat
free: Slobodan
flip_horizontal: Okreni Horizontalno
flip_vertical: Okreni Vertikalno
aspect_ratio: Omjer
rotate: Rotiraj
all_users: Svi korisnici
delete_collection: Obriši Kolekciju
@@ -380,18 +447,22 @@ show_hidden_collections: Prikaži Sakrivene Kolekcije
hide_hidden_collections: Sakrij Sakrivene Kolekcije
unmanaged_collections: Nekonfigurisane Kolekcije
system_collections: Sistemske Kolekcije
placeholder: Rezervisano mjesto
icon_left: Ikonica Lijevo
icon_right: Ikonica Desno
count_other_revisions: '{count} Ostalih Revizija'
font: Font
sans_serif: Sans Serif
serif: Serif
monospace: Fiksni razmak
divider: Djelilac
color: Boja
circle: Krug
empty_item: Prazna Stavka
log_in_with: 'Prijavite se sa {provider}'
advanced_filter: Napredni Filter
delete_advanced_filter: Obriši Filter
change_advanced_filter_operator: Izmijeni Operator
operators:
eq: Jednako
neq: Nije jednako
@@ -415,7 +486,13 @@ loading: Učitavanje...
drop_to_upload: Prenesi za Otpremanje
item: Stavka
items: Stavke
upload_file: Otpremi Fajl
upload_file_indeterminate: Otpremanje Fajla...
upload_file_success: Fajl Otpremljen
upload_files_indeterminate: 'Otpremanje fajlova {done}/{total}'
upload_files_success: '{count} Fajlova Otpremljeno'
upload_pending: Otpremanje na Čekanju
drag_file_here: Prevuci Fajl ovdje
click_to_browse: Klikni za Pretraživanje
layout_options: Opcije Izgleda
rows: Redova
@@ -440,38 +517,64 @@ replace_file: Zamijeni Fajl
no_results: Nema rezultata
no_results_copy: Prilagodi ili obriši filtere pretrage kako biste vidjeli rezultate.
clear_filters: Poništi Filtere
saves_automatically: Spašeno Automatski
role: Uloga
user: Korisnik
no_presets: Nema Izgleda
no_presets_copy: Trenutno ne postoje sačuvane oznake ili podrazumijevani setovi izgleda.
no_presets_cta: Dodaj Izgled
create: Kreiraj
on_create: Na Kreiranje
on_update: Na Ažuriranje
read: Čitanje
update: Ažuriranje
select_fields: Odaberi Polja
format_text: Formatiraj Tekst
bold: Podebljano
toggle: Isključi / Uključi
icon_on: Ikonica Na
icon_off: Bez Ikonice
label: Oznaka
image_url: Url slike
alt_text: Alternativni tekst
media: Medij
width: Širina
height: Visina
source: Izvor
url_placeholder: Unesi url...
display_text: Prikaži tekst
display_text_placeholder: Unesi tekst za prikaz...
tooltip: Pomoćni prozor
tooltip_placeholder: Unesi vrijednost u prozoru za pomoć...
unlimited: Neograničeno
open_link_in: Otvori vezu u
new_tab: Nova kartica
current_tab: Trenutna kartica
wysiwyg_options:
aligncenter: Poravnanje po sredini
alignjustify: Blok Poravnanje
alignleft: Lijevo poravnanje
alignnone: Bez Poravnanja
alignright: Desno poravnanje
forecolor: Primarna Boja
backcolor: Boja Pozadine
bold: Podebljano
italic: Kurziv
underline: Podvučeno
strikethrough: Precrtano
subscript: Indeks
superscript: Natpis
codeblock: Kod
blockquote: Citat
bullist: Tačkasta Lista
numlist: Numerisana lista
hr: Vodoravno pravilo
link: Dodaj/Uredi Vezu
unlink: Ukloni link
media: Dodaj/Uredi Multimediju
image: Dodaj/Uredi Sliku
copy: Kopiraj
cut: Isjeci
paste: Nalijepi
heading: Naslov
h1: Zaglavlje 1
@@ -483,6 +586,7 @@ wysiwyg_options:
fontselect: Odaberi Pismo
fontsizeselect: Odaberi Veličinu Pisma
indent: Uvlačenje
outdent: Uvlačenje
undo: Poništi
redo: Vrati poništeno
remove: Ukloni
@@ -492,8 +596,10 @@ wysiwyg_options:
visualaid: Pregledaj Nevidljive elemente
source_code: Uredi Izvorni Kod
fullscreen: Pun ekran
directionality: Usmjerenost
dropdown: Padajuća lista
choices: Izbori
choices_option_configured_incorrectly: Izbori su nepravilno konfigurisani
deselect: Odznači
deselect_all: Odznači sve
other: Ostalo...
@@ -503,120 +609,551 @@ creating_in: 'Kreiranje Stavke u {collection}'
editing_in: 'Uređivanje Stavke u {collection}'
creating_unit: 'Kreiranje {unit}'
editing_unit: 'Uređivanje {unit}'
editing_in_batch: 'Grupna izmjena {count} stavki'
no_options_available: Nema dostupnih opcija
settings_data_model: Model Podataka
settings_permissions: Uloge & Dozvole
settings_project: Podešavanje Projekta
settings_webhooks: Webhooks
settings_presets: Izgledi & Oznake
one_or_more_options_are_missing: Jedna ili više opcija nedostaje
scope: Opseg
select: Odaberite...
layout: Izgled
tree_view: Izgled Stabla
changes_are_permanent: Izmjene su trajne
preset_name_placeholder: Služi kao podrazumijevana vrijednost kada je prazno...
preset_search_placeholder: Upit za pretragu...
editing_preset: Izmjena Izgleda
layout_preview: Pregled Izgleda
layout_setup: Podešavanje Izgleda
unsaved_changes: Nesačuvane izmjene
unsaved_changes_copy: Da li ste sigurni da želite da napustite ovu stranicu?
discard_changes: Poništi Promjene
keep_editing: Nastavi uređivanje
page_help_collections_overview: '**Pregled Kolekcija** - Lista svih kolekcija kojima imate pristup.'
page_help_collections_collection: >-
**Pretraga Stavki** — Lista svih {collection} stavki kojima imate pristup. Prilagodite izgled, filtere, i način sortiranja kako odgovara vašim potrebama, pa čak i sačuvajte oznake ovih različitih konfiguracija za brzi pristup.
page_help_collections_item: >-
**Detalji Stavke** - Forma za pregled i uređivanje ove stavke. Ova bočna traka takođe sadrži kompletnu istoriju svih revizija, i ubačenih komentara.
page_help_activity_collection: >-
**Pregled Aktivnosti** - Sveobuhvatan popis svih korisničkih sistemskih aktivnosti i sadržaja.
page_help_docs_global: >-
**Pregled Dokumentacije** — Dokumenta prilagođena isključivo ovoj verziji projekta i šemi.
page_help_files_collection: >-
**Biblioteka Fajlova** — Lista svih stavki koje su skladištene unutar ovog projekta. Prilagodite izgled, filtere, i način sortiranja kako odgovara vašim potrebama, pa čak sačuvajte i oznake ovih različitih konfiguracija za brzi pristup.
page_help_files_item: >-
**Detalji Fajla** — Forma za uređivanje metapodataka fajla, izmjena originalnog stanja, i ažuriranje podešavanja pristupa.
page_help_settings_project: "**Podešavanje Projekta** — Globalna konfiguraciona podešavanja projekta."
page_help_settings_datamodel_collections: >-
**Model Podataka: Kolekcije** — Lista svih dostupnih kolekcija. Ovo uključuje vidljive, sakrivene, i sistemske kolekcije, kao i neuređene tabele baze podataka koje mogu biti dodane.
page_help_settings_datamodel_fields: >-
**Model Podataka: Kolekcija** — Forma za uređivanje ove kolekcije i njenih odgovarajućih polja.
page_help_settings_roles_collection: '**Pregled Uloga** — Prikazuje Administratorske, Javne i prilagođene Korisničke Uloge.'
page_help_settings_roles_item: "**Detalji Uloge** — Upravljanje dozvolama uloga i druga podešavanja."
page_help_settings_presets_collection: >-
**Pregled Izgleda** — Lista svih kreiranih setova izgleda u sklopu projekta, uključujući: korisnik, uloga, i globalne oznake, kao i podrazumijevane preglede.
page_help_settings_presets_item: >-
**Detalji Izgleda** — Forma za upravljanje oznakama i podrazumijevanim setovima izgleda kolekcije.
page_help_settings_webhooks_collection: '**Pregled Webhooks** — Lista svih dostupnih "webhooks" u sklopu projekta.'
page_help_settings_webhooks_item: '**Detalji Webhook" — Forma za pravljenje i uređivanje "webhooks" u sklopu projekta.'
page_help_users_collection: '**Direktorijum Korisnika** — Lista svih sistemskih korisnika u sklopu projekta.'
page_help_users_item: >-
**Detalji Korisnika** — Upravljajte informacijama vašeg korisničkog računa, ili pregledajte detalje ostalih korisnika.
activity_feed: Pregled Aktivnosti
add_new: Dodaj Novi
create_new: Kreiraj Novi
all: Svi
none: Nijedan
no_layout_collection_selected_yet: Nema još odabranog izgleda/kolekcije
batch_delete_confirm: >-
Ne postoje stavke koje su selektovane | Da li ste sigurni da želite da obrišete ovu stavku? Ova akcija je trajna i ne može biti poništena. | Da li ste sigurni da želite da obrišete ove {count} stavke? Ova akcija je trajna i ne može biti poništena.
cancel: Odustani
collection: Kolekcija
collections: Kolekcije
singleton: Singleton
singleton_label: Tretiraj kao jedinstven objekat
system_fields_locked: Sistemska polja su zaključana i ne mogu se uređivati
fields:
directus_activity:
item: Primarni Ključ Stavke
action: Akcija
collection: Kolekcija
timestamp: Akcija Na
user: Akcija Od
comment: Komentar
user_agent: Korisnički Agent
ip: IP adresa
revisions: Revizije
directus_collections:
collection: Kolekcija
icon: Ikonica
note: Napomena
display_template: Šablon za Prikaz
hidden: Sakriveno
singleton: Singleton
translations: Prevodi Imena Kolekcije
archive_app_filter: Filter za Arhivu
archive_value: Arhiviraj Vrijednost
unarchive_value: Poništi arhiviranje vrijednosti
sort_field: Polje za Sortiranje
accountability: Aktivnost & Praćenje Revizija
directus_files:
$thumbnail: Sličica
title: Naslov
description: Opis
tags: Tagovi
location: Lokacija
storage: Skladište
filename_disk: Ime Fajla (Disk)
filename_download: Ime Fajla (Za preuzimanje)
metadata: Meta podaci
type: Mime Tip
filesize: Veličina
modified_by: Izmijenjeno Od
modified_on: Izmijenjeno
created_on: Kreirano
created_by: Kreirao
embed: Ugradi
uploaded_by: Otpremljeno Od
folder: Fascikla
width: Širina
uploaded_on: Otpremljeno
height: Visina
charset: Set karaktera
duration: Trajanje
directus_users:
first_name: Ime
last_name: Prezime
email: Email adresa
password: Lozinka
avatar: Avatar
location: Lokacija
title: Naslov
description: Opis
tags: Tagovi
language: Jezik
theme: Tema
tfa_secret: Dvostruka potvrda Autentičnosti
status: Status
role: Uloga
token: Token
last_page: Posljednja Stranica
last_access: Posljednji Pristup
directus_settings:
project_name: Ime Projekta
project_url: URL projekta
project_color: Boja Projekta
project_logo: Logotip Projekta
public_foreground: Javna Pozadina
public_background: Javna Pozadina
public_note: Opis Projekta
auth_password_policy: Polisa Lozinke za autentikaciju
auth_login_attempts: Broj pokušaja prijave
storage_asset_presets: Izgled prostora za skladištenje
storage_asset_transform: Transformacija sredstava za skladištenje
custom_css: Prilagođeni CSS
directus_fields:
collection: Ime Kolekcije
icon: Ikonica Kolekcije
note: Napomena
hidden: Sakriveno
singleton: Singleton
translation: Prevodi Polja
display_template: Šablon
directus_roles:
name: Naziv uloge
icon: Ikonica Uloge
description: Opis
app_access: Potpun Pristup aplikaciji
admin_access: Administratorski pristup
ip_access: IP pristup
enforce_tfa: Traži 2FA
users: Svi korisnici ove Uloge
module_list: Navigacija Modula
collection_list: Navigacija Kolekcije
field_options:
directus_collections:
track_activity_revisions: Prati Aktivnost & Revizije
only_track_activity: Samo Prati Aktivnost
do_not_track_anything: Bez praćenja
no_fields_in_collection: 'Trenutno ne postoji nijedno polje u "{collection}" kolekciji'
do_nothing: Ne radi ništa
generate_and_save_uuid: Generiši i Sačuvaj UUID
save_current_user_id: Sačuvaj ID vrijednost Trenutnog korisnika
save_current_user_role: Sačuvaj Trenutnu Korisničku Ulogu
save_current_datetime: Sačuvaj Trenutni Datum/Vrijeme
block: Blok
inline: Linijski
comment: Komentar
relational_triggers: Relacioni Okidači
referential_action_field_label_m2o: Kod Brisanja {collection}...
referential_action_field_label_o2m: Kod Poništenog odabira {collection}...
referential_action_no_action: Zaustavi brisanje
referential_action_cascade: Obriši {collection} stavku (kaskadno)
referential_action_set_null: Poništi vrijednost {field} polja
referential_action_set_default: Postavi {field} na njegovu podrazumijevanu vrijednost
choose_action: Izaberi Radnju
continue: Nastavi
continue_as: >-
<b>{name}</b> je trenutno autorizovan. Ukoliko prepoznajete ovaj korisnički račun, pritisnite nastavi.
editing_role: '{role} Uloga'
creating_webhook: Kreiranje Webhook-a
default: Podrazumijevano
delete: Obriši
delete_are_you_sure: >-
Ova akcija je trajna i ne može biti poništena. Da li ste sigurni da želite da nastavite?
delete_field_are_you_sure: >-
Da li ste sigurni da želite da obrišete polje "{field}"? Ova operacija ne može biti poništena.
description: Opis
done: Urađeno
duplicate: Dupliraj
email: Email adresa
embed: Ugradi
fallback_icon: IkonicaPrethodnog stanja
field: Polje | Polja
file: Fajl
file_library: Biblioteka Fajlova
forgot_password: Zaboravljena lozinka
hidden: Sakriveno
icon: Ikonica
info: Informacija
normal: Normalno
success: Uspješno
warning: Upozorenje
danger: Opasnost
junction_collection: Kolekcija spajanja
latency: Latencija
login: Prijavi se
my_activity: Moja Aktivnost
not_authenticated: Nije Autorizovan
authenticated: Autorizovan
options: Opcije
otp: Kratkoročna Lozinka
password: Lozinka
permissions: Dozvole
relationship: Relacija
reset: Resetuj
reset_password: Reset Lozinke
revisions: Revizije
revert: Vrati
save: Sačuvaj
schema: Šema
search: Pretraga
select_existing: Izaberite postojeće
select_field_type: Odaberi tip polja
select_interface: Odaberi Interfejs
settings: Podešavanja
sign_in: Prijavite se
sign_out: Odjavite se
sign_out_confirm: Da li ste sigurni da želite da se odjavite?
something_went_wrong: Došlo je do greške.
sort_direction: Smjer sortiranja
sort_asc: Opadajuće sortiranje
sort_desc: Rastuće sortiranje
template: Šablon
translation: Prevodi
value: Vrijednost
view_project: Pregledaj Projekat
weeks: { }
report_error: Prijavi Grešku
interfaces:
presentation-links:
presentation-links: Linkovi dugmeta
links: Linkovi
description: Podesivi linkovi za otvaranje dinamičkih URL-ova
style: Stil
primary: Primarni
link: Linkovi
button: Dugmad
error: Radnja se ne može izvršiti
select-multiple-checkbox:
checkboxes: Potvrdni okviri
description: Odaberi između više opcija uz okvire za potvrdu
allow_other: Omogući Druge
show_more: 'Prikaži {count} više'
items_shown: Stavki Prikazano
input-code:
code: Kod
description: Napiši ili podijeli isječke koda
line_number: Broj Linije
placeholder: Unesite kod ovde...
system-collection:
collection: Kolekcija
description: Odaberi između postojećih kolekcija
include_system_collections: Uključi Sistemske Kolekcije
system-collections:
collections: Kolekcije
description: Odaberi između postojećih kolekcija
include_system_collections: Uključi Sistemske Kolekcije
select-color:
color: Boja
description: Unesi ili odaberi vrijednost boje
placeholder: Izaberi boju...
preset_colors: Boje Izgleda
preset_colors_add_label: Dodaj novu boju...
name_placeholder: Unesite ime boje...
datetime:
datetime: Datum i vrijeme
description: Unesi datume i vremena
include_seconds: Uključujući Sekunde
set_to_now: Postavi na Sadašnji
use_24: Koristi 24-časovni Format
system-display-template:
display-template: Šablon za Prikaz
description: Miješanje statičnih tekstualnih i dinamičkih vrijednosti polja
collection_field: Polje Kolekcije
collection_field_not_setup: Polje u kolekciji nije ispravno konfigurisano
select_a_collection: Izaberi Kolekciju
presentation-divider:
divider: Djelilac
description: Označi i podijeli polja u sekcije
title_placeholder: Unesi naslov...
inline_title: Linijski Naslov
inline_title_label: Prikaži naslov u liniji
margin_top: Gornja Margina
margin_top_label: Povećaj Gornju Marginu
select-dropdown:
description: Odaberi vrijednost iz padajuće liste
choices_placeholder: Dodaj novi odabir
allow_other: Omogući Druge
allow_other_label: Dozvoli Ostale Vrijednosti
allow_none: Ne dozvoli
allow_none_label: Dozvoli Bez Odabira
choices_name_placeholder: Unesi ime...
choices_value_placeholder: Unesi vrijednost...
select-multiple-dropdown:
select-multiple-dropdown: Padajuća lista (Više opcija)
description: Odaberi više od jedne vrijednosti iz padajuće liste
file:
file: Fajl
description: Odaberi ili otpremi fajl
files:
files: Fajlovi
description: Odaberi ili otpremi više fajlova
input-hash:
hash: Hash
description: Unesi vrijednost koja će biti sigurno skladištena
masked: Maskirano
masked_label: Sakrij "true" vrijednosti
select-icon:
icon: Ikonica
description: Odaberi ikonicu iz padajuće liste
search_for_icon: Traži ikonicu...
file-image:
image: Slika
description: Odaberi ili otpremi sliku
system-interface:
interface: Interfejs
description: Odaberi postojeći interfejs
placeholder: Odaberi Interfejs...
system-interface-options:
interface-options: Opcije Interfejsa
description: Modalni prozor za odabir opcija interfejsa
list-m2m:
many-to-many: Many to Many
description: Odaberi više povezanih stavki
select-dropdown-m2o:
many-to-one: Many to One
description: Odaberi samo jednu povezanu stavku
display_template: Šablon za Prikaz
input-rich-text-md:
markdown: Smanjenje
description: Unesi i pregledaj opcije smanjenja
customSyntax: Prilagođeni Blokovi
customSyntax_label: Dodaj prilagođene tipove sintakse
customSyntax_add: Dodaj prilagođenu sintaksu
box: Blok / Linijski
imageToken: Token Fotografije
imageToken_label: Koji (statični) token prikačiti na izvore slika
presentation-notice:
notice: Napomеna
description: Prikaži kratku napomenu
text: Unesi sadržaj napomene ovde...
list-o2m:
one-to-many: One to Many
description: Odaberi više povezanih stavki
no_collection: Kolekciju nije moguće pronaći
select-radio:
radio-buttons: Radio dugmići
description: Odaberi jednu od više ponuđenih opcija
list:
repeater: Ponavljanje
description: Napravi više upisa od postojeće strukture
edit_fields: Izmijeni Polja
add_label: '"Napravi Novi" Labela'
field_name_placeholder: Unesi ime polja...
field_note_placeholder: Unesi napomenu polja...
slider:
slider: Slajder
description: Odaberi broj uz pomoć slajdera
always_show_value: Uvijek prikaži vrijednost
tags:
tags: Tagovi
description: Odaberi ili dodaj tagove
whitespace: Razmak
hyphen: Zamijeni sa crticom
underscore: Zamijeni sa podrctanom linijom
remove: Ukloni razmak
capitalization: Uvećanje
uppercase: Konvertuj velika slova
lowercase: Konvertuj mala slova
auto_formatter: Koristi automatski format naslova
alphabetize: Po abecedi
alphabetize_label: Abecedni red
add_tags: Dodaj tagove...
input:
input: Unos
description: Ručno unesite vrijednost
trim: Odsjecanje
trim_label: Odsjecanje sa početka i kraja
mask: Maskirano
mask_label: Sakrij pravu vrijednost
clear: Poništena Vrijednost
clear_label: Sačuvaj kao praznu sekvencu karaktera
minimum_value: Minimalna Vrijednost
maximum_value: Maksimalna Vrijednost
step_interval: Interval
slug: Slugify
slug_label: Omogući unijetu vrijednost sigurnu u sklopu URL
input-multiline:
textarea: Polje Teksta
description: Unesi višelinijski čisti-tekst
boolean:
toggle: Isključi / Uključi
description: Prebaci između uključeno i isključeno
label_placeholder: Unesi ime...
label_default: Omogućen
translations:
display_template: Šablon za Prikaz
no_collection: Nema Kolekcije
list-o2m-tree-view:
description: Prikaz Stabla za ugnježđene rekurzivne one-to-many stavke
recursive_only: Interfejs u prikazu stabla radi samo u slučajevima rekurzivnih relacija.
user:
user: Korisnik
description: Odaberi postojećeg directus korisnika
select_mode: Način Odabira
modes:
auto: Automatski
dropdown: Padajuća lista
modal: Modalni
input-rich-text-html:
wysiwyg: WYSIWYG
description: Uređivač teksta koji piše HTML sadržaj
toolbar: Traka sa alatkama
custom_formats: Prilagođeni Formati
options_override: Opcije Prepisivanja
input-autocomplete-api:
input-autocomplete-api: Autokompletirani Ulaz (API)
description: Tip pretrage za spoljašne API vrijednosti.
results_path: Putanja Rezultata
value_path: Putanja Vrijednosti
trigger: Okidač
rate: Ocjena
displays:
boolean:
boolean: Boolean
description: Prikaži uključena i isključena stanja
label_on: Oznaka Uključeno
label_on_placeholder: Unesi oznaku za uključeno...
label_off: Oznaka Isključeno
label_off_placeholder: Unesi oznaku za isključeno...
icon_on: Ikonica Na
icon_off: Bez Ikonice
color_on: Boja Uključena
color_off: Boja Isključena
collection:
collection: Kolekcija
description: Prikaži kolekciju
icon_label: Prikaži ikonicu kolekcije
color:
color: Boja
description: Prikaži obojenu tačku
default_color: Podrazumijevana Boja
datetime:
datetime: Datum i vrijeme
description: Prikaži vrijednosti povezane sa vremenom
format: Format
format_note: >-
Prilagođeni format prihvata __[Date Field Symbol Table](https://www.unicode.org/reports/tr35/tr35-dates.html#Date_Field_Symbol_Table)__
long: Dugo
short: Kratko
relative: Relativno
relative_label: 'Prikaži relativno vrijeme, primjer: prije 5 minuta'
file:
file: Fajl
description: Prikaži fajlove
filesize:
filesize: Veličina Fajla
description: Prikaži veličinu fajla
formatted-value:
formatted-value: Formatirana Vrijednost
description: Prikaži formatiranu verziju teksta
format_title: Formatiraj Naslov
format_title_label: Automatsko formatiranje naslova
bold_label: Koristi podebljan stil
formatted-json-value:
formatted-json-value: Formatirana JSON vrijednost
description: Prikaži formatiranu verziju objekta
icon:
icon: Ikonica
description: Prikaži ikonicu
filled: Popunjeno
filled_label: Koristi popunjenu varijantu
image:
image: Slika
description: Prikaži umanjeni pregled slike
circle: Krug
circle_label: Prikaži kao krug
labels:
labels: Oznake
description: Prikaži jednu ili listu oznaka
default_foreground: Podrazumijevana Početna pozadina
default_background: Podrazumijevana Pozadina
format_label: Formatiraj svaku oznaku
show_as_dot: Prikaži kao Tačku
choices_value_placeholder: Unesi vrijednost...
choices_text_placeholder: Unesi tekst...
mime-type:
mime-type: MIME Tip
description: Prikaži MIME-Tip fajla
extension_only: Samo Nastavak
extension_only_label: Samo prikaži nastavak fajla
rating:
rating: Ocjena
description: Prikaži brojeve vizuelno u stilu zvjezdica relativno maksimalnoj vrijednosti
simple: Jednostavan
simple_label: Prikaži zvjezdice u jednostavnom formatu
raw:
raw: Vrijednost
related-values:
related-values: Povezane Vrijednosti
description: Prikaži povezane vrijednosti
user:
user: Korisnik
description: Prikaži directus korisnika
avatar: Avatar
name: Ime
both: Oba
circle_label: Prikaži korisnika u obliku kruga
layouts:
cards:
cards: Kartice
image_source: Izvor Slike
image_fit: Uklapanje Slike
crop: Isjecanje
contain: Sadržano
title: Naslov
subtitle: Pod naslov
tabular:
tabular: Tabela
fields: Polja
spacing: Razmak
comfortable: Udobno
compact: Kompaktno
cozy: Prijatno
calendar:
calendar: Kalendar
start_date_field: Polje Početnog Datuma
end_date_field: Polje Završnog Datuma

View File

@@ -20,7 +20,6 @@ create_role: Skapa roll
create_user: Skapa användare
create_webhook: Skapa webhook
invite_users: Bjud in användare
email_examples: 'admin@example.com, user@example.com...'
invite: Bjud in
email_already_invited: E-postadressen "{email}" har redan blivit inbjuden
emails: E-postadresser

View File

@@ -19,7 +19,6 @@ create_role: สร้างบทบาท
create_user: สร้างผู้ใช้งาน
create_webhook: สร้างเว็บฮุก
invite_users: เชิญชวนผู้ใช้งาน
email_examples: 'admin@example.com, user@example.com...'
invite: เชิญชวน
emails: อีเมล
connection_excellent: สัญญาณดีมาก

View File

@@ -20,7 +20,6 @@ create_role: Rol Oluştur
create_user: Kullanıcı Oluştur
create_webhook: Webhook Oluşturun
invite_users: Kullanıcıları Davet Et
email_examples: 'admin@example.com, user@example.com...'
invite: Davet et
email_already_invited: '"{email}" bu e-posta zaten davet edildi'
emails: E-postalar

View File

@@ -19,7 +19,6 @@ create_role: Tạo vai trò (phân quyền)
create_user: Tạo Người dùng
create_webhook: Tạo Webhook
invite_users: Mời Người dùng
email_examples: 'admin@example.com, user@example.com...'
invite: Mời
emails: Email
connection_excellent: Kết nối Tuyệt vời

View File

@@ -18,7 +18,6 @@ create_role: 创建角色
create_user: 创建用户
create_webhook: 创建Web钩子
invite_users: 邀请用户
email_examples: 'admin@example.com, user@example.com...'
invite: 邀请
emails: 邮箱
connection_excellent: 优秀的连接状态

View File

@@ -21,10 +21,12 @@ export async function registerLayouts(app: App): Promise<void> {
const result = await import(/* @vite-ignore */ `${getRootPath()}extensions/layouts/${layoutName}/index.js`);
layouts.push(result.default);
} catch (err) {
// eslint-disable-next-line no-console
console.warn(`Couldn't load custom layout "${layoutName}":`, err);
}
});
} catch {
// eslint-disable-next-line no-console
console.warn(`Couldn't load custom layouts`);
}

View File

@@ -1,3 +1,5 @@
/* eslint-disable no-console */
import { createPinia } from 'pinia';
import { createApp } from 'vue';
import { version } from '../package.json';

View File

@@ -455,7 +455,7 @@ export default defineComponent({
data: batchPrimaryKeys,
});
await layoutState.refresh();
await layoutState.value?.refresh?.();
selection.value = [];
confirmDelete.value = false;
@@ -482,7 +482,7 @@ export default defineComponent({
confirmArchive.value = false;
selection.value = [];
await layoutState.refresh();
await layoutState.value?.refresh?.();
} catch (err) {
error.value = err;
} finally {

View File

@@ -26,8 +26,11 @@ const md = new MarkdownIt({
if (lang && hljs.getLanguage(lang)) {
try {
return hljs.highlight(str, { language: lang }).value;
} catch {
} catch (err) {
// eslint-disable-next-line no-console
console.warn('There was an error highlighting in Markdown');
// eslint-disable-next-line no-console
console.error(err);
}
}
@@ -99,7 +102,8 @@ export default defineComponent({
pageClass.value = attributes?.pageClass;
const htmlString = md.render(markdown);
// Un-escape zero-width characters to allow breaking up character sequences automatically replaced by vite
const htmlString = md.render(markdown).replaceAll('\\u200b', '\u200b');
html.value = htmlString;

View File

@@ -26,10 +26,12 @@ export async function loadModules(): Promise<void> {
modules.push(result.default);
} catch (err) {
// eslint-disable-next-line no-console
console.warn(`Couldn't load custom module "${moduleName}":`, err);
}
});
} catch {
// eslint-disable-next-line no-console
console.warn(`Couldn't load custom modules`);
}

View File

@@ -73,7 +73,7 @@ export default defineComponent({
### Project details
Directus Version: ${parsedInfo.value?.directus.version}
Environment: ${import.meta.env.DEV}
Environment: ${import.meta.env.MODE}
OS: ${parsedInfo.value?.os.type} ${parsedInfo.value?.os.version}
Node: ${parsedInfo.value?.node.version}
`;

View File

@@ -15,6 +15,7 @@ export function unexpectedError(error: Error | RequestError | APIError): void {
const message = (error as RequestError).response?.data?.errors?.[0]?.message || error.message || undefined;
// eslint-disable-next-line no-console
console.warn(error);
store.add({

View File

@@ -47,7 +47,7 @@ export default defineComponent({
### Project details
Directus Version: ${parsedInfo.value?.directus.version}
Environment: ${import.meta.env.DEV}
Environment: ${import.meta.env.MODE}
OS: ${parsedInfo.value?.os.type} ${parsedInfo.value?.os.version}
Node: ${parsedInfo.value?.node.version}

View File

@@ -2,6 +2,52 @@
_Changes marked with a :warning: contain potential breaking changes depending on your use of the package._
## v9.0.0-rc.76 (June 14, 2021)
### :sparkles: New Features
- **API**
- [#6221](https://github.com/directus/directus/pull/6221) Add support for date distance adjustment in `$NOW` filter variable ([@rijkvanzanten](https://github.com/rijkvanzanten))
- [#6216](https://github.com/directus/directus/pull/6216) Added support for nodemailer ignoreTLS option ([@nichols-green](https://github.com/nichols-green))
### :rocket: Improvements
- **API**
- [#6211](https://github.com/directus/directus/pull/6211) Optimized oracle schema overview query ([@aidenfoxx](https://github.com/aidenfoxx))
### :bug: Bug Fixes
- **API**
- [#6267](https://github.com/directus/directus/pull/6267) Fix issue that would cause emails to be displayed incorrectly in certain email clients ([@rijkvanzanten](https://github.com/rijkvanzanten))
- [#6225](https://github.com/directus/directus/pull/6225) Fix Oracle env error ([@aidenfoxx](https://github.com/aidenfoxx))
- [#6208](https://github.com/directus/directus/pull/6208) Moved special check above localTypeMap check. ([@Oreilles](https://github.com/Oreilles))
- [#6190](https://github.com/directus/directus/pull/6190) Fix type casting of boolean env var ([@rijkvanzanten](https://github.com/rijkvanzanten))
- **App**
- [#6264](https://github.com/directus/directus/pull/6264) Fixed issue that could cause the HTML interface to emit a change on first load ([@rijkvanzanten](https://github.com/rijkvanzanten))
- [#6263](https://github.com/directus/directus/pull/6263) Fixed issue that would prevent the m2o from working on foreign keys with no meta row ([@rijkvanzanten](https://github.com/rijkvanzanten))
- [#6262](https://github.com/directus/directus/pull/6262) Fixes issue that would prevent the layout from refreshing on batch operations ([@rijkvanzanten](https://github.com/rijkvanzanten))
- [#6258](https://github.com/directus/directus/pull/6258) Fix collection selection in system-collections interface ([@nickrum](https://github.com/nickrum))
- [#6236](https://github.com/directus/directus/pull/6236) Fix missing styling for WYSIWYG ([@masterwendu](https://github.com/masterwendu))
- [#6212](https://github.com/directus/directus/pull/6212) Fix proxying to the app from a subpath ([@nickrum](https://github.com/nickrum))
- **specs**
- [#6179](https://github.com/directus/directus/pull/6179) Fix OpenAPI specs ([@paescuj](https://github.com/paescuj))
### :memo: Documentation
- [#6232](https://github.com/directus/directus/pull/6232) Update the app extension docs to work with Vue 3 ([@nickrum](https://github.com/nickrum))
- [#6209](https://github.com/directus/directus/pull/6209) Add note on file env vars ([@rijkvanzanten](https://github.com/rijkvanzanten))
### :package: Dependency Updates
- [#6240](https://github.com/directus/directus/pull/6240) Bump cropperjs from 1.5.11 to 1.5.12 ([@dependabot[bot]](https://github.com/apps/dependabot))
- [#6239](https://github.com/directus/directus/pull/6239) Bump npm-watch from 0.9.0 to 0.10.0 ([@dependabot[bot]](https://github.com/apps/dependabot))
- [#6238](https://github.com/directus/directus/pull/6238) Bump eslint-plugin-vue from 7.11.0 to 7.11.1 ([@dependabot[bot]](https://github.com/apps/dependabot))
- [#6237](https://github.com/directus/directus/pull/6237) Bump aws-sdk from 2.926.0 to 2.927.0 ([@dependabot[bot]](https://github.com/apps/dependabot))
- [#6201](https://github.com/directus/directus/pull/6201) Bump rollup from 2.51.1 to 2.51.2 ([@dependabot[bot]](https://github.com/apps/dependabot))
- [#6200](https://github.com/directus/directus/pull/6200) Bump eslint-plugin-vue from 7.10.0 to 7.11.0 ([@dependabot[bot]](https://github.com/apps/dependabot))
- [#6199](https://github.com/directus/directus/pull/6199) Bump aws-sdk from 2.925.0 to 2.926.0 ([@dependabot[bot]](https://github.com/apps/dependabot))
- [#6198](https://github.com/directus/directus/pull/6198) Bump gatsby-source-filesystem from 3.7.0 to 3.7.1 ([@dependabot[bot]](https://github.com/apps/dependabot))
## v9.0.0-rc.75 (June 10, 2021)
### 🚨 App Extensions

View File

@@ -2,6 +2,7 @@ const path = require('path');
const fse = require('fs-extra');
const dirTree = require('directory-tree');
// eslint-disable-next-line no-console
console.log('Building docs...');
const tree = dirTree('.', {
@@ -15,6 +16,7 @@ const index = `export default ${generateIndex(tree.children)};`;
fse.ensureDirSync('dist');
fse.writeFileSync('dist/index.js', index);
// eslint-disable-next-line no-console
console.log('Built docs');
function generateIndex(tree) {

View File

@@ -5,22 +5,25 @@
## Troubleshooting Steps
If you're experiencing issues or think you have found a problem in Directus, be sure to follow these steps before [Reporting a Bug](/contributing/introduction/#bug-reporting):
If you're experiencing issues or think you have found a problem in Directus, be sure to follow these steps before
[Reporting a Bug](/contributing/introduction/#bug-reporting):
1. Ensure your server/database meet the [minimum requirements](/guides/installation/cli/#_1-confirm-minimum-requirements)
1. Ensure your server/database meet the
[minimum requirements](/guides/installation/cli/#_1-confirm-minimum-requirements)
2. Ensure youre on the [latest version of Directus](https://github.com/directus/directus/releases/latest)
3. Stop (`CTRL+C`) and restart the server (`npx directus start`)
5. Run the database migration script: `directus database migrate:latest` (backup your database first)
6. Disable any data-caching within your project
7. Test any App issues with browser extensions and cache disabled (eg: Incognito Mode)
8. Confirm the issue is not related to your own custom code
9. Check for [existing Issues](https://github.com/directus/directus/issues?q=is%3Aissue) (and [Discussions](https://github.com/directus/directus/discussions)) that match your problem
4. Run the database migration script: `directus database migrate:latest` (backup your database first)
5. Disable any data-caching within your project
6. Test any App issues with browser extensions and cache disabled (eg: Incognito Mode)
7. Confirm the issue is not related to your own custom code
8. Check for [existing Issues](https://github.com/directus/directus/issues?q=is%3Aissue) (and
[Discussions](https://github.com/directus/directus/discussions)) that match your problem
::: tip Source Contributors
Those who have installed from source should also remove all dependencies (`npx lerna clean -y`) and then reinstall them (`npm install`).
:::
::: tip Source Contributors Those who have installed from source should also remove all dependencies
(`npx lerna clean -y`) and then reinstall them (`npm install`). :::
If you're still experiencing a problem after completing the above steps, you can chat through things on our [community support](#community-support) or [report a bug](/contributing/introduction/#bug-reporting).
If you're still experiencing a problem after completing the above steps, you can chat through things on our
[community support](#community-support) or [report a bug](/contributing/introduction/#bug-reporting).
## Community Support

View File

@@ -98,7 +98,7 @@ To be read by the Admin App, your custom display's Vue component must first be b
recommend bundling your code using Rollup. To install this and the other development dependencies, run this command:
```bash
npm i -D rollup @rollup/plugin-commonjs @rollup/plugin-node-resolve rollup-plugin-terser rollup-plugin-vue@5 vue-template-compiler
npm i -D rollup @rollup/plugin-commonjs @rollup/plugin-node-resolve @rollup/plugin-replace rollup-plugin-terser rollup-plugin-vue @vue/compiler-sfc
```
You can then use the following Rollup configuration within `rollup.config.js`:
@@ -106,6 +106,7 @@ You can then use the following Rollup configuration within `rollup.config.js`:
```js
import { nodeResolve } from '@rollup/plugin-node-resolve';
import commonjs from '@rollup/plugin-commonjs';
import replace from '@rollup/plugin-replace';
import { terser } from 'rollup-plugin-terser';
import vue from 'rollup-plugin-vue';
@@ -115,7 +116,16 @@ export default {
format: 'es',
file: 'dist/index.js',
},
plugins: [vue(), nodeResolve(), commonjs(), terser()],
plugins: [
vue(),
nodeResolve(),
commonjs(),
replace({
'process\u200b.env.NODE_ENV': JSON.stringify('production'),
preventAssignment: true,
}),
terser(),
],
};
```

View File

@@ -55,6 +55,7 @@ for more info on what can go into this object.
<script>
export default {
emits: ['input'],
props: {
value: String,
},
@@ -88,7 +89,7 @@ To be read by the Admin App, your custom interface's Vue component must first be
We recommend bundling your code using Rollup. To install this and the other development dependencies, run this command:
```bash
npm i -D rollup @rollup/plugin-commonjs @rollup/plugin-node-resolve rollup-plugin-terser rollup-plugin-vue@5 vue-template-compiler
npm i -D rollup @rollup/plugin-commonjs @rollup/plugin-node-resolve @rollup/plugin-replace rollup-plugin-terser rollup-plugin-vue @vue/compiler-sfc
```
You can then use the following Rollup configuration within `rollup.config.js`:
@@ -96,6 +97,7 @@ You can then use the following Rollup configuration within `rollup.config.js`:
```js
import { nodeResolve } from '@rollup/plugin-node-resolve';
import commonjs from '@rollup/plugin-commonjs';
import replace from '@rollup/plugin-replace';
import { terser } from 'rollup-plugin-terser';
import vue from 'rollup-plugin-vue';
@@ -105,7 +107,16 @@ export default {
format: 'es',
file: 'dist/index.js',
},
plugins: [vue(), nodeResolve(), commonjs(), terser()],
plugins: [
vue(),
nodeResolve(),
commonjs(),
replace({
'process\u200b.env.NODE_ENV': JSON.stringify('production'),
preventAssignment: true,
}),
terser(),
],
};
```

View File

@@ -131,7 +131,7 @@ To be read by the Admin App, your custom layouts's Vue component must first be b
recommend bundling your code using Rollup. To install this and the other development dependencies, run this command:
```bash
npm i -D rollup @rollup/plugin-commonjs @rollup/plugin-node-resolve rollup-plugin-terser rollup-plugin-vue@5 vue-template-compiler
npm i -D rollup @rollup/plugin-commonjs @rollup/plugin-node-resolve @rollup/plugin-replace rollup-plugin-terser rollup-plugin-vue @vue/compiler-sfc
```
You can then use the following Rollup configuration within `rollup.config.js`:
@@ -139,6 +139,7 @@ You can then use the following Rollup configuration within `rollup.config.js`:
```js
import { nodeResolve } from '@rollup/plugin-node-resolve';
import commonjs from '@rollup/plugin-commonjs';
import replace from '@rollup/plugin-replace';
import { terser } from 'rollup-plugin-terser';
import vue from 'rollup-plugin-vue';
@@ -148,7 +149,16 @@ export default {
format: 'es',
file: 'dist/index.js',
},
plugins: [vue(), nodeResolve(), commonjs(), terser()],
plugins: [
vue(),
nodeResolve(),
commonjs(),
replace({
'process\u200b.env.NODE_ENV': JSON.stringify('production'),
preventAssignment: true,
}),
terser(),
],
};
```

View File

@@ -25,7 +25,7 @@ export default {
icon: 'box',
routes: [
{
path: '/',
path: '',
component: ModuleComponent,
},
],
@@ -35,7 +35,8 @@ export default {
- `id` — The unique key for this module. It is good practice to scope proprietary interfaces with an author prefix.
- `name` — The human-readable name for this module.
- `icon` — An icon name from the material icon set, or the extended list of Directus custom icons.
- `routes` — Details the routes in your module per the Vue router.
- `routes` — Details the routes in your module. The routes are registered as nested routes with the module's `id`
serving as the base path.
::: tip TypeScript
@@ -130,7 +131,7 @@ To be read by the Admin App, your custom module's Vue component must first be bu
recommend bundling your code using Rollup. To install this and the other development dependencies, run this command:
```bash
npm i -D rollup @rollup/plugin-commonjs @rollup/plugin-node-resolve rollup-plugin-terser rollup-plugin-vue@5 vue-template-compiler
npm i -D rollup @rollup/plugin-commonjs @rollup/plugin-node-resolve @rollup/plugin-replace rollup-plugin-terser rollup-plugin-vue @vue/compiler-sfc
```
You can then use the following Rollup configuration within `rollup.config.js`:
@@ -138,6 +139,7 @@ You can then use the following Rollup configuration within `rollup.config.js`:
```js
import { nodeResolve } from '@rollup/plugin-node-resolve';
import commonjs from '@rollup/plugin-commonjs';
import replace from '@rollup/plugin-replace';
import { terser } from 'rollup-plugin-terser';
import vue from 'rollup-plugin-vue';
@@ -147,7 +149,16 @@ export default {
format: 'es',
file: 'dist/index.js',
},
plugins: [vue(), nodeResolve(), commonjs(), terser()],
plugins: [
vue(),
nodeResolve(),
commonjs(),
replace({
'process\u200b.env.NODE_ENV': JSON.stringify('production'),
preventAssignment: true,
}),
terser(),
],
};
```

View File

@@ -1,7 +1,7 @@
{
"name": "@directus/docs",
"private": false,
"version": "9.0.0-rc.75",
"version": "9.0.0-rc.76",
"description": "",
"main": "dist/index.js",
"scripts": {
@@ -34,7 +34,7 @@
"fs-extra": "^10.0.0",
"lodash.get": "^4.4.2",
"micromark": "^2.10.1",
"npm-watch": "^0.9.0",
"npm-watch": "^0.10.0",
"slugify": "^1.5.3",
"vuepress": "^1.7.1",
"vuepress-plugin-clean-urls": "^1.1.2"

View File

@@ -125,13 +125,14 @@ needs, you can extend the above environment variables to configure any of
## Cache
| Variable | Description | Default Value |
| ------------------ | ----------------------------------------------------------------------- | ---------------- |
| `CACHE_ENABLED` | Whether or not caching is enabled. | `false` |
| `CACHE_TTL` | How long the cache is persisted. | `30m` |
| `CACHE_AUTO_PURGE` | Automatically purge the cache on `create`/`update`/`delete` actions. | `false` |
| `CACHE_NAMESPACE` | How to scope the cache data. | `directus-cache` |
| `CACHE_STORE` | Where to store the cache data. Either `memory`, `redis`, or `memcache`. | `memory` |
| Variable | Description | Default Value |
| ------------------------ | -------------------------------------------------------------------------------------- | ---------------- |
| `CACHE_ENABLED` | Whether or not caching is enabled. | `false` |
| `CACHE_TTL` | How long the cache is persisted. | `30m` |
| `CACHE_CONTROL_S_MAXAGE` | Whether to not to add the s-maxage expiration flag. Set to a number for a custom value | `0` |
| `CACHE_AUTO_PURGE` | Automatically purge the cache on `create`/`update`/`delete` actions. | `false` |
| `CACHE_NAMESPACE` | How to scope the cache data. | `directus-cache` |
| `CACHE_STORE` | Where to store the cache data. Either `memory`, `redis`, or `memcache`. | `memory` |
Based on the `CACHE_STORE` used, you must also provide the following configurations:

View File

@@ -68,6 +68,27 @@ The storage implementation. See [Storage](#storage) for more information.
Defaults to an instance of `MemoryStorage` when in node.js, and `LocalStorage` when in browsers.
**NOTE:**
If you plan to use multiple SDK instances at once, keep in mind that they will share the Storage across them, leading to unpredictable behaviors. This scenario might be a case while writing tests.
For example, the SDK instance that executed last the `login()` method writes the resulting `access_token` into the Storage and **overwrites** any prior fetched `access_token` from any other SDK instance. That might mix up your test scenario by granting false access rights to your previous logged-in users.
Adding prefixes to your Storage instances would solve this error:
```js
import { Directus, MemoryStorage } from "@directus/sdk";
import { randomBytes } from "crypto";
// ...
const prefix = randomBytes(8).toString("hex");
const storage = new MemoryStorage(prefix);
const url = `http://${host}:${port}`;
const directus = new Directus(url, { storage });
```
#### `options.transport`
The transport implementation. See [Transport](#transport) for more information.

View File

@@ -5,7 +5,7 @@
"docs",
"api"
],
"version": "9.0.0-rc.75",
"version": "9.0.0-rc.76",
"command": {
"bootstrap": {
"npmClientArgs": [

503
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -10,7 +10,7 @@
"lint": "npm-run-all --parallel --continue-on-error lint:*",
"lint:eslint": "eslint .",
"lint:stylelint": "stylelint \"**/*.{css,scss,vue}\"",
"format": "prettier --write \"**/*.{js,ts,vue,md}\"",
"format": "prettier --write \"**/*.{js,ts,vue,md,yaml}\"",
"dev": "lerna run dev --stream --parallel",
"build": "lerna run build",
"release": "lerna publish --force-publish --exact",
@@ -26,15 +26,15 @@
"@types/listr": "^0.14.3",
"@types/node": "^15.12.0",
"@types/supertest": "^2.0.11",
"@typescript-eslint/eslint-plugin": "^4.25.0",
"@typescript-eslint/parser": "^4.26.0",
"@typescript-eslint/eslint-plugin": "^4.27.0",
"@typescript-eslint/parser": "^4.27.0",
"axios": "^0.21.1",
"dockerode": "^3.3.0",
"eslint": "^7.27.0",
"eslint-config-prettier": "^8.3.0",
"eslint-plugin-prettier": "^3.4.0",
"eslint-plugin-prettier-vue": "^3.1.0",
"eslint-plugin-vue": "^7.11.0",
"eslint-plugin-vue": "^7.11.1",
"globby": "^11.0.3",
"jest": "^27.0.4",
"knex": "^0.95.6",
@@ -65,7 +65,7 @@
},
"lint-staged": {
"*.{js,ts,vue}": "eslint --fix",
"*.md": "prettier --write",
"*.{md,yaml}": "prettier --write",
"*.{css,scss,vue}": "stylelint --fix"
}
}

View File

@@ -32,6 +32,7 @@ async function main(run) {
process.exit(error ? 1 : 0);
} catch (error) {
// eslint-disable-next-line no-console
console.error(error);
process.exit(1);
}

View File

@@ -1,6 +1,6 @@
{
"name": "@directus/cli",
"version": "9.0.0-rc.75",
"version": "9.0.0-rc.76",
"description": "The official Directus CLI",
"repository": {
"type": "git",
@@ -41,8 +41,8 @@
"author": "João Biondo <wolfulus@gmail.com>",
"license": "MIT",
"dependencies": {
"@directus/format-title": "9.0.0-rc.75",
"@directus/sdk": "9.0.0-rc.75",
"@directus/format-title": "9.0.0-rc.76",
"@directus/sdk": "9.0.0-rc.76",
"@types/yargs": "^17.0.0",
"app-module-path": "^2.2.0",
"chalk": "^4.1.0",

View File

@@ -1,12 +1,14 @@
/* eslint-disable no-console */
const chalk = require('chalk');
module.exports = function checkRequirements() {
const nodeVersion = process.versions.node;
const major = +nodeVersion.split('.')[0];
if (major < 10) {
if (major < 12) {
console.error(`You are running ${chalk.red(`Node ${nodeVersion}`)}.`);
console.error(`Directus requires ${chalk.green(`Node 10`)} and up.`);
console.error(`Directus requires ${chalk.green(`Node 12`)} and up.`);
console.error('Please update your Node version and try again.');
process.exit(1);
}

View File

@@ -29,6 +29,7 @@ async function create(directory) {
const stat = await fse.stat(rootPath);
if (stat.isDirectory() === false) {
// eslint-disable-next-line no-console
console.log(`Destination ${chalk.red(directory)} already exists and is not a directory.`);
process.exit(1);
}
@@ -36,6 +37,7 @@ async function create(directory) {
const files = await fse.readdir(rootPath);
if (files.length > 0) {
// eslint-disable-next-line no-console
console.log(`Destination ${chalk.red(directory)} already exists and is not an empty directory.`);
process.exit(1);
}

View File

@@ -1,6 +1,6 @@
{
"name": "create-directus-project",
"version": "9.0.0-rc.75",
"version": "9.0.0-rc.76",
"description": "A small installer util that will create a directory, add boilerplate folders, and install Directus through npm.",
"main": "lib/index.js",
"bin": "./lib/index.js",

View File

@@ -1,6 +1,6 @@
{
"name": "@directus/drive-azure",
"version": "9.0.0-rc.75",
"version": "9.0.0-rc.76",
"description": "Azure Blob driver for @directus/drive",
"license": "MIT",
"main": "dist/index.js",
@@ -35,7 +35,7 @@
],
"dependencies": {
"@azure/storage-blob": "^12.6.0",
"@directus/drive": "9.0.0-rc.75",
"@directus/drive": "9.0.0-rc.76",
"normalize-path": "^3.0.0"
},
"devDependencies": {

View File

@@ -1,6 +1,6 @@
{
"name": "@directus/drive-gcs",
"version": "9.0.0-rc.75",
"version": "9.0.0-rc.76",
"description": "Google Cloud Storage driver for @directus/drive",
"license": "MIT",
"main": "dist/index.js",
@@ -33,7 +33,7 @@
"dev": "npm run build -- -w --preserveWatchOutput --incremental"
},
"dependencies": {
"@directus/drive": "9.0.0-rc.75",
"@directus/drive": "9.0.0-rc.76",
"@google-cloud/storage": "^5.8.5",
"normalize-path": "^3.0.0"
},

View File

@@ -1,6 +1,6 @@
{
"name": "@directus/drive-s3",
"version": "9.0.0-rc.75",
"version": "9.0.0-rc.76",
"description": "AWS S3 driver for @directus/drive",
"license": "MIT",
"main": "dist/index.js",
@@ -34,8 +34,8 @@
"dev": "npm run build -- -w --preserveWatchOutput --incremental"
},
"dependencies": {
"@directus/drive": "9.0.0-rc.75",
"aws-sdk": "^2.926.0",
"@directus/drive": "9.0.0-rc.76",
"aws-sdk": "^2.928.0",
"normalize-path": "^3.0.0"
},
"devDependencies": {

View File

@@ -1,6 +1,6 @@
{
"name": "@directus/drive",
"version": "9.0.0-rc.75",
"version": "9.0.0-rc.76",
"description": "Flexible and Fluent way to manage storage in Node.js.",
"license": "MIT",
"main": "dist/index.js",

View File

@@ -1,6 +1,6 @@
{
"name": "@directus/format-title",
"version": "9.0.0-rc.75",
"version": "9.0.0-rc.76",
"description": "Custom string formatter that converts any string into [Title Case](http://www.grammar-monster.com/lessons/capital_letters_title_case.htm)",
"keywords": [
"title-case",
@@ -37,7 +37,7 @@
"@rollup/plugin-json": "^4.1.0",
"@rollup/plugin-node-resolve": "^13.0.0",
"rimraf": "^3.0.2",
"rollup": "^2.51.2",
"rollup": "^2.52.0",
"rollup-plugin-sourcemaps": "^0.6.3",
"rollup-plugin-terser": "^7.0.2",
"rollup-plugin-typescript2": "^0.30.0",

Some files were not shown because too many files have changed in this diff Show More