directus 9.6.0 → 9.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (99) hide show
  1. package/dist/app.js +3 -1
  2. package/dist/auth/drivers/oauth2.js +3 -0
  3. package/dist/auth/drivers/openid.js +3 -0
  4. package/dist/cache.d.ts +4 -1
  5. package/dist/cache.js +29 -7
  6. package/dist/cli/commands/schema/apply.d.ts +1 -0
  7. package/dist/cli/commands/schema/apply.js +9 -5
  8. package/dist/cli/index.js +1 -0
  9. package/dist/controllers/assets.js +9 -1
  10. package/dist/controllers/utils.js +18 -1
  11. package/dist/database/helpers/date/dialects/default.d.ts +3 -0
  12. package/dist/database/helpers/date/dialects/default.js +7 -0
  13. package/dist/database/helpers/date/dialects/sqlite.d.ts +0 -9
  14. package/dist/database/helpers/date/dialects/sqlite.js +0 -24
  15. package/dist/database/helpers/date/index.d.ts +6 -6
  16. package/dist/database/helpers/date/index.js +13 -13
  17. package/dist/database/helpers/date/types.d.ts +0 -9
  18. package/dist/database/helpers/{date → fn}/dialects/mssql.d.ts +3 -2
  19. package/dist/database/helpers/{date → fn}/dialects/mssql.js +14 -3
  20. package/dist/database/helpers/{date → fn}/dialects/mysql.d.ts +3 -2
  21. package/dist/database/helpers/{date → fn}/dialects/mysql.js +14 -3
  22. package/dist/database/helpers/{date → fn}/dialects/oracle.d.ts +3 -2
  23. package/dist/database/helpers/{date → fn}/dialects/oracle.js +14 -3
  24. package/dist/database/helpers/{date → fn}/dialects/postgres.d.ts +3 -2
  25. package/dist/database/helpers/{date → fn}/dialects/postgres.js +14 -3
  26. package/dist/database/helpers/fn/dialects/sqlite.d.ts +13 -0
  27. package/dist/database/helpers/fn/dialects/sqlite.js +42 -0
  28. package/dist/database/helpers/fn/index.d.ts +7 -0
  29. package/dist/database/helpers/fn/index.js +17 -0
  30. package/dist/database/helpers/fn/types.d.ts +18 -0
  31. package/dist/database/helpers/fn/types.js +27 -0
  32. package/dist/database/helpers/index.d.ts +4 -1
  33. package/dist/database/helpers/index.js +7 -1
  34. package/dist/database/index.js +0 -3
  35. package/dist/database/migrations/20220308A-add-bookmark-icon-and-color.d.ts +3 -0
  36. package/dist/database/migrations/20220308A-add-bookmark-icon-and-color.js +17 -0
  37. package/dist/database/migrations/20220314A-add-translation-strings.d.ts +3 -0
  38. package/dist/database/migrations/20220314A-add-translation-strings.js +15 -0
  39. package/dist/database/migrations/20220322A-rename-field-typecast-flags.d.ts +3 -0
  40. package/dist/database/migrations/20220322A-rename-field-typecast-flags.js +77 -0
  41. package/dist/database/migrations/20220323A-add-field-validation.d.ts +3 -0
  42. package/dist/database/migrations/20220323A-add-field-validation.js +17 -0
  43. package/dist/database/migrations/20220325A-fix-typecast-flags.d.ts +3 -0
  44. package/dist/database/migrations/20220325A-fix-typecast-flags.js +49 -0
  45. package/dist/database/migrations/20220325B-add-default-language.d.ts +3 -0
  46. package/dist/database/migrations/20220325B-add-default-language.js +28 -0
  47. package/dist/database/migrations/run.js +1 -1
  48. package/dist/database/run-ast.js +11 -3
  49. package/dist/database/system-data/fields/activity.yaml +4 -4
  50. package/dist/database/system-data/fields/collections.yaml +4 -4
  51. package/dist/database/system-data/fields/fields.yaml +17 -8
  52. package/dist/database/system-data/fields/files.yaml +2 -2
  53. package/dist/database/system-data/fields/panels.yaml +2 -2
  54. package/dist/database/system-data/fields/permissions.yaml +4 -4
  55. package/dist/database/system-data/fields/presets.yaml +17 -3
  56. package/dist/database/system-data/fields/relations.yaml +1 -1
  57. package/dist/database/system-data/fields/revisions.yaml +2 -2
  58. package/dist/database/system-data/fields/roles.yaml +4 -4
  59. package/dist/database/system-data/fields/settings.yaml +19 -4
  60. package/dist/database/system-data/fields/users.yaml +2 -2
  61. package/dist/database/system-data/fields/webhooks.yaml +4 -4
  62. package/dist/env.js +6 -2
  63. package/dist/exceptions/database/dialects/mysql.js +23 -17
  64. package/dist/logger.js +2 -1
  65. package/dist/middleware/respond.js +7 -28
  66. package/dist/services/activity.js +4 -1
  67. package/dist/services/authorization.d.ts +1 -1
  68. package/dist/services/authorization.js +156 -14
  69. package/dist/services/collections.js +222 -198
  70. package/dist/services/fields.js +184 -173
  71. package/dist/services/files.js +69 -3
  72. package/dist/services/graphql.js +2 -2
  73. package/dist/services/import-export.d.ts +34 -0
  74. package/dist/services/import-export.js +270 -0
  75. package/dist/services/index.d.ts +2 -1
  76. package/dist/services/index.js +2 -1
  77. package/dist/services/items.js +1 -0
  78. package/dist/services/payload.js +11 -9
  79. package/dist/services/permissions.js +10 -10
  80. package/dist/services/relations.js +93 -78
  81. package/dist/services/server.js +1 -0
  82. package/dist/services/shares.js +2 -1
  83. package/dist/services/users.js +3 -1
  84. package/dist/utils/apply-query.js +21 -3
  85. package/dist/utils/get-column.d.ts +6 -5
  86. package/dist/utils/get-column.js +16 -8
  87. package/dist/utils/get-date-formatted.d.ts +1 -0
  88. package/dist/utils/get-date-formatted.js +14 -0
  89. package/dist/utils/get-local-type.js +2 -2
  90. package/dist/utils/get-permissions.js +1 -1
  91. package/dist/utils/get-schema.d.ts +1 -1
  92. package/dist/utils/get-schema.js +16 -11
  93. package/dist/utils/track.js +3 -2
  94. package/dist/utils/url.d.ts +1 -1
  95. package/dist/utils/url.js +1 -1
  96. package/dist/utils/validate-storage.js +3 -1
  97. package/package.json +13 -12
  98. package/dist/services/import.d.ts +0 -13
  99. package/dist/services/import.js +0 -118
@@ -0,0 +1,18 @@
1
+ import { SchemaOverview } from '@directus/shared/types';
2
+ import { Knex } from 'knex';
3
+ import { DatabaseHelper } from '../types';
4
+ export declare abstract class FnHelper extends DatabaseHelper {
5
+ protected knex: Knex;
6
+ protected schema: SchemaOverview;
7
+ constructor(knex: Knex, schema: SchemaOverview);
8
+ abstract year(table: string, column: string): Knex.Raw;
9
+ abstract month(table: string, column: string): Knex.Raw;
10
+ abstract week(table: string, column: string): Knex.Raw;
11
+ abstract day(table: string, column: string): Knex.Raw;
12
+ abstract weekday(table: string, column: string): Knex.Raw;
13
+ abstract hour(table: string, column: string): Knex.Raw;
14
+ abstract minute(table: string, column: string): Knex.Raw;
15
+ abstract second(table: string, column: string): Knex.Raw;
16
+ abstract count(table: string, column: string): Knex.Raw;
17
+ protected _relationalCount(table: string, column: string): Knex.Raw;
18
+ }
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FnHelper = void 0;
4
+ const types_1 = require("../types");
5
+ class FnHelper extends types_1.DatabaseHelper {
6
+ constructor(knex, schema) {
7
+ super(knex);
8
+ this.knex = knex;
9
+ this.schema = schema;
10
+ this.schema = schema;
11
+ }
12
+ _relationalCount(table, column) {
13
+ const relation = this.schema.relations.find((relation) => { var _a; return relation.related_collection === table && ((_a = relation === null || relation === void 0 ? void 0 : relation.meta) === null || _a === void 0 ? void 0 : _a.one_field) === column; });
14
+ const currentPrimary = this.schema.collections[table].primary;
15
+ if (!relation) {
16
+ throw new Error(`Field ${table}.${column} isn't a nested relational collection`);
17
+ }
18
+ return this.knex.raw('(' +
19
+ this.knex
20
+ .count('*')
21
+ .from(relation.collection)
22
+ .where(relation.field, '=', this.knex.raw(`??.??`, [table, currentPrimary]))
23
+ .toQuery() +
24
+ ')');
25
+ }
26
+ }
27
+ exports.FnHelper = FnHelper;
@@ -1,10 +1,13 @@
1
+ import { SchemaOverview } from '@directus/shared/types';
1
2
  import { Knex } from 'knex';
2
3
  import * as dateHelpers from './date';
4
+ import * as fnHelpers from './fn';
3
5
  import * as geometryHelpers from './geometry';
4
6
  import * as schemaHelpers from './schema';
5
7
  export declare function getHelpers(database: Knex): {
6
- date: dateHelpers.postgres | dateHelpers.oracle | dateHelpers.sqlite | dateHelpers.mysql | dateHelpers.mssql;
8
+ date: dateHelpers.postgres | dateHelpers.sqlite;
7
9
  st: geometryHelpers.postgres | geometryHelpers.redshift | geometryHelpers.oracle | geometryHelpers.sqlite | geometryHelpers.mysql | geometryHelpers.mssql;
8
10
  schema: schemaHelpers.postgres | schemaHelpers.cockroachdb | schemaHelpers.oracle;
9
11
  };
12
+ export declare function getFunctions(database: Knex, schema: SchemaOverview): fnHelpers.postgres | fnHelpers.oracle | fnHelpers.sqlite | fnHelpers.mysql | fnHelpers.mssql;
10
13
  export declare type Helpers = ReturnType<typeof getHelpers>;
@@ -19,9 +19,10 @@ var __importStar = (this && this.__importStar) || function (mod) {
19
19
  return result;
20
20
  };
21
21
  Object.defineProperty(exports, "__esModule", { value: true });
22
- exports.getHelpers = void 0;
22
+ exports.getFunctions = exports.getHelpers = void 0;
23
23
  const __1 = require("..");
24
24
  const dateHelpers = __importStar(require("./date"));
25
+ const fnHelpers = __importStar(require("./fn"));
25
26
  const geometryHelpers = __importStar(require("./geometry"));
26
27
  const schemaHelpers = __importStar(require("./schema"));
27
28
  function getHelpers(database) {
@@ -33,3 +34,8 @@ function getHelpers(database) {
33
34
  };
34
35
  }
35
36
  exports.getHelpers = getHelpers;
37
+ function getFunctions(database, schema) {
38
+ const client = (0, __1.getDatabaseClient)(database);
39
+ return new fnHelpers[client](database, schema);
40
+ }
41
+ exports.getFunctions = getFunctions;
@@ -235,9 +235,6 @@ exports.validateDatabaseExtensions = validateDatabaseExtensions;
235
235
  async function validateDatabaseCharset(database) {
236
236
  database = database !== null && database !== void 0 ? database : getDatabase();
237
237
  if (getDatabaseClient(database) === 'mysql') {
238
- if (env_1.default.DB_CHARSET) {
239
- logger_1.default.warn(`Using custom DB_CHARSET "${env_1.default.DB_CHARSET}". Using a charset different from the database's default can cause problems in relationships. Omitting DB_CHARSET is strongly recommended.`);
240
- }
241
238
  const { collation } = await database.select(database.raw(`@@collation_database as collation`)).first();
242
239
  const tables = await database('information_schema.tables')
243
240
  .select({ name: 'TABLE_NAME', collation: 'TABLE_COLLATION' })
@@ -0,0 +1,3 @@
1
+ import { Knex } from 'knex';
2
+ export declare function up(knex: Knex): Promise<void>;
3
+ export declare function down(knex: Knex): Promise<void>;
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.down = exports.up = void 0;
4
+ async function up(knex) {
5
+ await knex.schema.alterTable('directus_presets', (table) => {
6
+ table.string('icon', 30).notNullable().defaultTo('bookmark_outline');
7
+ table.string('color').nullable();
8
+ });
9
+ }
10
+ exports.up = up;
11
+ async function down(knex) {
12
+ await knex.schema.alterTable('directus_presets', (table) => {
13
+ table.dropColumn('icon');
14
+ table.dropColumn('color');
15
+ });
16
+ }
17
+ exports.down = down;
@@ -0,0 +1,3 @@
1
+ import { Knex } from 'knex';
2
+ export declare function up(knex: Knex): Promise<void>;
3
+ export declare function down(knex: Knex): Promise<void>;
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.down = exports.up = void 0;
4
+ async function up(knex) {
5
+ await knex.schema.alterTable('directus_settings', (table) => {
6
+ table.json('translation_strings');
7
+ });
8
+ }
9
+ exports.up = up;
10
+ async function down(knex) {
11
+ await knex.schema.alterTable('directus_settings', (table) => {
12
+ table.dropColumn('translation_strings');
13
+ });
14
+ }
15
+ exports.down = down;
@@ -0,0 +1,3 @@
1
+ import { Knex } from 'knex';
2
+ export declare function up(knex: Knex): Promise<void>;
3
+ export declare function down(knex: Knex): Promise<void>;
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.down = exports.up = void 0;
4
+ const utils_1 = require("@directus/shared/utils");
5
+ const lodash_1 = require("lodash");
6
+ async function up(knex) {
7
+ const fields = await knex
8
+ .select('id', 'special')
9
+ .from('directus_fields')
10
+ .whereNotNull('special')
11
+ .orWhere('special', '<>', '');
12
+ for (const { id, special } of fields) {
13
+ let parsedSpecial;
14
+ try {
15
+ parsedSpecial = (0, utils_1.toArray)(special);
16
+ }
17
+ catch {
18
+ continue;
19
+ }
20
+ if (parsedSpecial && (0, lodash_1.isArray)(parsedSpecial)) {
21
+ let updateRequired = false;
22
+ parsedSpecial = parsedSpecial.map((special) => {
23
+ switch (special) {
24
+ case 'boolean':
25
+ case 'csv':
26
+ case 'json':
27
+ updateRequired = true;
28
+ return 'cast-' + special;
29
+ default:
30
+ return special;
31
+ }
32
+ });
33
+ if (updateRequired) {
34
+ await knex('directus_fields')
35
+ .update({ special: parsedSpecial.join(',') })
36
+ .where({ id });
37
+ }
38
+ }
39
+ }
40
+ }
41
+ exports.up = up;
42
+ async function down(knex) {
43
+ const fields = await knex
44
+ .select('id', 'special')
45
+ .from('directus_fields')
46
+ .whereNotNull('special')
47
+ .orWhere('special', '<>', '');
48
+ for (const { id, special } of fields) {
49
+ let parsedSpecial;
50
+ try {
51
+ parsedSpecial = (0, utils_1.toArray)(special);
52
+ }
53
+ catch {
54
+ continue;
55
+ }
56
+ if (parsedSpecial && (0, lodash_1.isArray)(parsedSpecial)) {
57
+ let updateRequired = false;
58
+ parsedSpecial = parsedSpecial.map((special) => {
59
+ switch (special) {
60
+ case 'cast-boolean':
61
+ case 'cast-csv':
62
+ case 'cast-json':
63
+ updateRequired = true;
64
+ return special.replace('cast-', '');
65
+ default:
66
+ return special;
67
+ }
68
+ });
69
+ if (updateRequired) {
70
+ await knex('directus_fields')
71
+ .update({ special: parsedSpecial.join(',') })
72
+ .where({ id });
73
+ }
74
+ }
75
+ }
76
+ }
77
+ exports.down = down;
@@ -0,0 +1,3 @@
1
+ import { Knex } from 'knex';
2
+ export declare function up(knex: Knex): Promise<void>;
3
+ export declare function down(knex: Knex): Promise<void>;
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.down = exports.up = void 0;
4
+ async function up(knex) {
5
+ await knex.schema.alterTable('directus_fields', (table) => {
6
+ table.json('validation');
7
+ table.text('validation_message');
8
+ });
9
+ }
10
+ exports.up = up;
11
+ async function down(knex) {
12
+ await knex.schema.alterTable('directus_fields', (table) => {
13
+ table.dropColumn('validation');
14
+ table.dropColumn('validation_message');
15
+ });
16
+ }
17
+ exports.down = down;
@@ -0,0 +1,3 @@
1
+ import { Knex } from 'knex';
2
+ export declare function up(knex: Knex): Promise<void>;
3
+ export declare function down(_knex: Knex): Promise<void>;
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.down = exports.up = void 0;
4
+ const utils_1 = require("@directus/shared/utils");
5
+ const lodash_1 = require("lodash");
6
+ async function up(knex) {
7
+ const fields = await knex
8
+ .select('id', 'special')
9
+ .from('directus_fields')
10
+ .whereNotNull('special')
11
+ .orWhere('special', '<>', '');
12
+ for (const { id, special } of fields) {
13
+ let parsedSpecial;
14
+ try {
15
+ if (special.includes('{')) {
16
+ // Fix invalid data in Postgres
17
+ parsedSpecial = (0, utils_1.toArray)(special.replace(/{/g, '').replace(/}/g, '').replace(/"/g, ''));
18
+ }
19
+ else {
20
+ parsedSpecial = (0, utils_1.toArray)(special);
21
+ }
22
+ }
23
+ catch {
24
+ continue;
25
+ }
26
+ if (parsedSpecial && (0, lodash_1.isArray)(parsedSpecial)) {
27
+ // Perform the update again in case it was not performed prior
28
+ parsedSpecial = parsedSpecial.map((special) => {
29
+ switch (special) {
30
+ case 'boolean':
31
+ case 'csv':
32
+ case 'json':
33
+ return 'cast-' + special;
34
+ default:
35
+ return special;
36
+ }
37
+ });
38
+ const parsedSpecialString = parsedSpecial.join(',');
39
+ if (parsedSpecialString !== special) {
40
+ await knex('directus_fields').update({ special: parsedSpecialString }).where({ id });
41
+ }
42
+ }
43
+ }
44
+ }
45
+ exports.up = up;
46
+ async function down(_knex) {
47
+ // Do nothing
48
+ }
49
+ exports.down = down;
@@ -0,0 +1,3 @@
1
+ import { Knex } from 'knex';
2
+ export declare function up(knex: Knex): Promise<void>;
3
+ export declare function down(knex: Knex): Promise<void>;
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.down = exports.up = void 0;
4
+ const helpers_1 = require("../helpers");
5
+ async function up(knex) {
6
+ const helper = (0, helpers_1.getHelpers)(knex).schema;
7
+ await knex.schema.alterTable('directus_settings', (table) => {
8
+ table.string('default_language').notNullable().defaultTo('en-US');
9
+ });
10
+ await helper.changeToString('directus_users', 'language', {
11
+ nullable: true,
12
+ default: null,
13
+ length: 255,
14
+ });
15
+ }
16
+ exports.up = up;
17
+ async function down(knex) {
18
+ const helper = (0, helpers_1.getHelpers)(knex).schema;
19
+ await knex.schema.alterTable('directus_settings', (table) => {
20
+ table.dropColumn('default_language');
21
+ });
22
+ await helper.changeToString('directus_users', 'language', {
23
+ nullable: true,
24
+ default: 'en-US',
25
+ length: 255,
26
+ });
27
+ }
28
+ exports.down = down;
@@ -63,7 +63,7 @@ async function run(database, direction, log = true) {
63
63
  await database.insert({ version: nextVersion.version, name: nextVersion.name }).into('directus_migrations');
64
64
  }
65
65
  async function down() {
66
- const lastAppliedMigration = (0, lodash_1.orderBy)(completedMigrations, ['timestamp'], ['desc'])[0];
66
+ const lastAppliedMigration = (0, lodash_1.orderBy)(completedMigrations, ['timestamp', 'version'], ['desc', 'desc'])[0];
67
67
  if (!lastAppliedMigration) {
68
68
  throw Error('Nothing to downgrade');
69
69
  }
@@ -64,7 +64,10 @@ async function runAST(originalAST, schema, options) {
64
64
  }
65
65
  }
66
66
  else {
67
- nestedItems = (await runAST(nestedNode, schema, { knex, nested: true }));
67
+ const node = (0, lodash_1.merge)({}, nestedNode, {
68
+ query: { limit: -1 },
69
+ });
70
+ nestedItems = (await runAST(node, schema, { knex, nested: true }));
68
71
  if (nestedItems) {
69
72
  // Merge all fetched nested records with the parent items
70
73
  items = mergeWithParentItems(schema, nestedItems, items, nestedNode);
@@ -148,7 +151,7 @@ function getColumnPreprocessor(knex, schema, table) {
148
151
  if (field.type.startsWith('geometry')) {
149
152
  return helpers.st.asText(table, field.field);
150
153
  }
151
- return (0, get_column_1.getColumn)(knex, table, fieldNode.name, alias);
154
+ return (0, get_column_1.getColumn)(knex, table, fieldNode.name, alias, schema);
152
155
  };
153
156
  }
154
157
  function getDBQuery(schema, knex, table, fieldNodes, query) {
@@ -238,7 +241,12 @@ function mergeWithParentItems(schema, nestedItem, parentItem, nestedNode) {
238
241
  ((_a = nestedItem[nestedNode.relation.field]) === null || _a === void 0 ? void 0 : _a[schema.collections[nestedNode.relation.related_collection].primary]) == parentItem[schema.collections[nestedNode.relation.related_collection].primary]);
239
242
  });
240
243
  parentItem[nestedNode.fieldKey].push(...itemChildren);
241
- parentItem[nestedNode.fieldKey] = parentItem[nestedNode.fieldKey].slice(0, (_a = nestedNode.query.limit) !== null && _a !== void 0 ? _a : 100);
244
+ if (nestedNode.query.offset && nestedNode.query.offset >= 0) {
245
+ parentItem[nestedNode.fieldKey] = parentItem[nestedNode.fieldKey].slice(nestedNode.query.offset);
246
+ }
247
+ if (nestedNode.query.limit !== -1) {
248
+ parentItem[nestedNode.fieldKey] = parentItem[nestedNode.fieldKey].slice(0, (_a = nestedNode.query.limit) !== null && _a !== void 0 ? _a : 100);
249
+ }
242
250
  parentItem[nestedNode.fieldKey] = parentItem[nestedNode.fieldKey].sort((a, b) => {
243
251
  // This is pre-filled in get-ast-from-query
244
252
  const sortField = nestedNode.query.sort[0];
@@ -46,19 +46,19 @@ fields:
46
46
  width: half
47
47
 
48
48
  - field: comment
49
- display: formatted-text
49
+ display: formatted-value
50
50
  display_options:
51
- subdued: true
51
+ color: 'var(--foreground-subdued)'
52
52
  width: half
53
53
 
54
54
  - field: user_agent
55
- display: formatted-text
55
+ display: formatted-value
56
56
  display_options:
57
57
  font: monospace
58
58
  width: half
59
59
 
60
60
  - field: ip
61
- display: formatted-text
61
+ display: formatted-value
62
62
  display_options:
63
63
  font: monospace
64
64
  width: half
@@ -42,21 +42,21 @@ fields:
42
42
  width: full
43
43
 
44
44
  - field: hidden
45
- special: boolean
45
+ special: cast-boolean
46
46
  interface: boolean
47
47
  options:
48
48
  label: $t:field_options.directus_collections.hidden_label
49
49
  width: half
50
50
 
51
51
  - field: singleton
52
- special: boolean
52
+ special: cast-boolean
53
53
  interface: boolean
54
54
  options:
55
55
  label: $t:singleton_label
56
56
  width: half
57
57
 
58
58
  - field: translations
59
- special: json
59
+ special: cast-json
60
60
  interface: list
61
61
  options:
62
62
  template: '{{ translation }} ({{ language }})'
@@ -115,7 +115,7 @@ fields:
115
115
 
116
116
  - field: archive_app_filter
117
117
  interface: boolean
118
- special: boolean
118
+ special: cast-boolean
119
119
  options:
120
120
  label: $t:field_options.directus_collections.archive_app_filter
121
121
  width: half
@@ -17,7 +17,7 @@ fields:
17
17
  - collection: directus_fields
18
18
  field: special
19
19
  hidden: true
20
- special: csv
20
+ special: cast-csv
21
21
  width: half
22
22
 
23
23
  - collection: directus_fields
@@ -27,7 +27,7 @@ fields:
27
27
  - collection: directus_fields
28
28
  field: options
29
29
  hidden: true
30
- special: json
30
+ special: cast-json
31
31
  width: half
32
32
 
33
33
  - collection: directus_fields
@@ -37,25 +37,25 @@ fields:
37
37
  - collection: directus_fields
38
38
  field: display_options
39
39
  hidden: true
40
- special: json
40
+ special: cast-json
41
41
  width: half
42
42
 
43
43
  - collection: directus_fields
44
44
  field: readonly
45
45
  hidden: true
46
- special: boolean
46
+ special: cast-boolean
47
47
  width: half
48
48
 
49
49
  - collection: directus_fields
50
50
  field: hidden
51
51
  hidden: true
52
- special: boolean
52
+ special: cast-boolean
53
53
  width: half
54
54
 
55
55
  - collection: directus_fields
56
56
  field: required
57
57
  hidden: true
58
- special: boolean
58
+ special: cast-boolean
59
59
  width: half
60
60
 
61
61
  - collection: directus_fields
@@ -73,7 +73,7 @@ fields:
73
73
  - collection: directus_fields
74
74
  field: translations
75
75
  hidden: true
76
- special: json
76
+ special: cast-json
77
77
  width: half
78
78
 
79
79
  - collection: directus_fields
@@ -83,4 +83,13 @@ fields:
83
83
  - collection: directus_fields
84
84
  field: conditions
85
85
  hidden: true
86
- special: json
86
+ special: cast-json
87
+
88
+ - collection: directus_fields
89
+ field: validation
90
+ hidden: true
91
+ special: cast-json
92
+
93
+ - collection: directus_fields
94
+ field: validation_message
95
+ hidden: true
@@ -23,7 +23,7 @@ fields:
23
23
  interface: tags
24
24
  options:
25
25
  iconRight: local_offer
26
- special: json
26
+ special: cast-json
27
27
  width: full
28
28
  display: labels
29
29
  display_options:
@@ -71,7 +71,7 @@ fields:
71
71
 
72
72
  - field: metadata
73
73
  hidden: true
74
- special: json
74
+ special: cast-json
75
75
 
76
76
  - field: type
77
77
  display: mime-type
@@ -9,13 +9,13 @@ fields:
9
9
  - field: note
10
10
  - field: type
11
11
  - field: show_header
12
- special: boolean
12
+ special: cast-boolean
13
13
  - field: position_x
14
14
  - field: position_y
15
15
  - field: width
16
16
  - field: height
17
17
  - field: options
18
- special: json
18
+ special: cast-json
19
19
  - field: date_created
20
20
  special: date-created
21
21
  - field: user_created
@@ -4,12 +4,12 @@ table: directus_permissions
4
4
  fields:
5
5
  - field: permissions
6
6
  hidden: true
7
- special: json
7
+ special: cast-json
8
8
  width: half
9
9
 
10
10
  - field: presets
11
11
  hidden: true
12
- special: json
12
+ special: cast-json
13
13
  width: half
14
14
 
15
15
  - field: role
@@ -23,11 +23,11 @@ fields:
23
23
 
24
24
  - field: fields
25
25
  width: half
26
- special: csv
26
+ special: cast-csv
27
27
 
28
28
  - field: action
29
29
  width: half
30
30
 
31
31
  - field: validation
32
32
  width: half
33
- special: json
33
+ special: cast-json
@@ -3,21 +3,29 @@ table: directus_presets
3
3
  fields:
4
4
  - field: filter
5
5
  hidden: true
6
- special: json
6
+ special: cast-json
7
7
 
8
8
  - field: layout_query
9
9
  hidden: true
10
- special: json
10
+ special: cast-json
11
11
 
12
12
  - field: layout_options
13
13
  hidden: true
14
- special: json
14
+ special: cast-json
15
15
 
16
16
  - field: role
17
17
  width: half
18
+ special: m2o
19
+ display: related-values
20
+ display_options:
21
+ template: '{{ name }}'
18
22
 
19
23
  - field: user
20
24
  width: half
25
+ special: m2o
26
+ display: related-values
27
+ display_options:
28
+ template: '{{ email }}'
21
29
 
22
30
  - field: id
23
31
  width: half
@@ -25,6 +33,12 @@ fields:
25
33
  - field: bookmark
26
34
  width: half
27
35
 
36
+ - field: icon
37
+ width: half
38
+
39
+ - field: color
40
+ width: half
41
+
28
42
  - field: search
29
43
  width: half
30
44
 
@@ -20,7 +20,7 @@ fields:
20
20
  width: half
21
21
 
22
22
  - field: one_allowed_collections
23
- special: csv
23
+ special: cast-csv
24
24
  width: half
25
25
 
26
26
  - field: junction_field
@@ -15,11 +15,11 @@ fields:
15
15
 
16
16
  - field: data
17
17
  hidden: true
18
- special: json
18
+ special: cast-json
19
19
 
20
20
  - field: delta
21
21
  hidden: true
22
- special: json
22
+ special: cast-json
23
23
 
24
24
  - field: parent
25
25
  width: half