From 55db9709504d4b511142a33e518ebbeaa91406f7 Mon Sep 17 00:00:00 2001 From: Arthur Rouzoul Date: Wed, 4 Mar 2026 16:07:09 +0100 Subject: [PATCH 01/26] Rebrand Directus 9 -> d9: docs, app, logos, config Complete rebrand across 150+ files: - All prose "Directus" -> "d9" in docs (123 markdown files) - Preserved code identifiers (@directus/, directus_*, DIRECTUS_*) - Replaced all logos and favicons (docs + app) with d9 branding - Updated VitePress config: title, nav, removed tracking scripts - Updated constants: URLs, emails -> support@webcapsule.io - Console branding: logo, emojis, startup messages - Rewrote key pages: introduction, quickstart, architecture - Localized CDN images to docs/public/images/ - Updated code_of_conduct, contributing, security, readme Co-Authored-By: Claude Opus 4.6 --- .../DISCUSSION_TEMPLATE/docs-suggestions.yml | 2 +- .github/ISSUE_TEMPLATE/config.yml | 6 +- api/package.json | 2 +- api/src/cli/utils/create-env/env-stub.liquid | 4 +- app/public/favicon.ico | Bin 1150 -> 15406 bytes app/public/img/directus-white.png | Bin 14915 -> 20067 bytes app/public/img/icons/mstile-150x150.png | Bin 1630 -> 3221 bytes app/public/img/icons/safari-pinned-tab.svg | 48 +--- app/public/manifest.webmanifest | 4 +- app/src/assets/logo-dark.svg | 14 +- app/src/assets/logo.svg | 14 +- app/src/assets/sprite.svg | 214 +++++++++--------- app/src/constants.ts | 43 ++-- app/src/main.ts | 8 +- app/src/views/public/logo-dark.svg | 12 +- app/src/views/public/logo-light.svg | 12 +- code_of_conduct.md | 2 +- contributing.md | 35 ++- directus/readme.md | 67 ++---- .../.vitepress/components/ArticleFeedback.vue | 2 +- docs/.vitepress/config.js | 67 +----- docs/.vitepress/constants.js | 29 +-- docs/.vitepress/theme/overrides.css | 9 +- docs/app/activity-log.md | 13 +- docs/app/content.md | 7 +- docs/app/content/collections.md | 29 +-- docs/app/content/items.md | 23 +- docs/app/content/shares.md | 20 +- docs/app/data-model.md | 82 +++---- docs/app/data-model/collections.md | 61 +---- docs/app/data-model/fields.md | 29 +-- docs/app/data-model/fields/groups.md | 10 +- docs/app/data-model/fields/other.md | 6 +- docs/app/data-model/fields/presentation.md | 8 +- docs/app/data-model/fields/relational.md | 18 +- docs/app/data-model/fields/selection.md | 24 +- docs/app/data-model/fields/text-numbers.md | 14 +- docs/app/data-model/relationships.md | 58 ++--- docs/app/display-templates.md | 7 +- docs/app/faq.md | 2 +- docs/app/file-library.md | 41 +--- docs/app/filters.md | 32 +-- docs/app/flows.md | 34 +-- docs/app/flows/operations.md | 39 ++-- docs/app/flows/triggers.md | 18 +- docs/app/import-export.md | 13 +- docs/app/insights.md | 46 ++-- docs/app/layouts.md | 23 +- docs/app/overview.md | 4 +- docs/app/presets-bookmarks.md | 9 - docs/app/project-settings.md | 25 +- docs/app/settings.md | 3 - docs/app/translation-strings.md | 9 - docs/app/user-directory.md | 24 +- docs/app/users-roles-permissions.md | 39 ++-- .../users-roles-permissions/permissions.md | 18 +- docs/app/users-roles-permissions/roles.md | 16 +- docs/app/users-roles-permissions/users.md | 12 - docs/contributing/codebase-overview.md | 12 +- docs/contributing/github-ci.md | 4 +- docs/contributing/introduction.md | 26 +-- docs/contributing/running-locally.md | 14 +- docs/contributing/translations.md | 4 +- docs/extensions/bundles.md | 4 +- docs/extensions/creating-extensions.md | 16 +- docs/extensions/displays.md | 12 +- docs/extensions/email-templates.md | 2 +- docs/extensions/endpoints.md | 2 +- docs/extensions/hooks.md | 8 +- docs/extensions/interfaces.md | 14 +- docs/extensions/introduction.md | 8 +- docs/extensions/layouts.md | 12 +- docs/extensions/migrations.md | 12 +- docs/extensions/modules.md | 14 +- docs/extensions/operations.md | 8 +- docs/extensions/panels.md | 10 +- docs/extensions/themes.md | 8 +- docs/getting-started/architecture.md | 28 +-- docs/getting-started/backing-directus.md | 94 ++------ docs/getting-started/glossary.md | 28 +-- docs/getting-started/introduction.md | 99 ++++---- docs/getting-started/quickstart.md | 94 +++----- docs/getting-started/resources.md | 27 +-- docs/getting-started/support.md | 64 ++---- docs/guides/flows/flows-for-loop.md | 2 +- docs/guides/flows/generate-work-reports.md | 4 +- .../flows/slugify-text-with-run-script.md | 2 +- .../guides/headless-cms/approval-workflows.md | 8 +- .../build-static-website/next-13.md | 42 ++-- .../build-static-website/nuxt-3.md | 46 ++-- .../headless-cms/reusable-components.md | 33 ++- .../schedule-content/dynamic-sites.md | 12 +- .../schedule-content/static-sites.md | 12 +- .../trigger-static-builds/index.md | 4 +- .../trigger-static-builds/netlify.md | 12 +- .../trigger-static-builds/vercel.md | 12 +- docs/guides/migration/hoppscotch.md | 26 +-- docs/guides/migration/index.md | 8 +- docs/guides/migration/node.md | 12 +- docs/guides/template_shell.md | 2 +- docs/public/favicon.ico | Bin 0 -> 15406 bytes docs/public/favicon.png | Bin 0 -> 1107 bytes docs/public/favicon.svg | 13 +- .../images/200-200-cover-100-20220216A.jpg | Bin 0 -> 37653 bytes .../images/200-200-cover-25-20220216A.jpg | Bin 0 -> 3769 bytes .../images/200-200-cover-50-20220216A.jpg | Bin 0 -> 5564 bytes .../images/200-200-cover-75-20220216A.jpg | Bin 0 -> 8239 bytes docs/public/images/2fa-role.webp | Bin 0 -> 59038 bytes docs/public/images/2fa-user.webp | Bin 0 -> 25976 bytes ...end-edit-delete-shares-menu-20220217A.webp | Bin 0 -> 68470 bytes ...activity-log-default-fields-20220816A.webp | Bin 0 -> 77264 bytes .../images/admin-options-20220222A.webp | Bin 0 -> 73058 bytes .../images/and-or-groups-20220303A.webp | Bin 0 -> 127786 bytes .../public/images/another-flow-20220602A.webp | Bin 0 -> 56678 bytes docs/public/images/app-overview-d9.svg | 95 ++++++++ docs/public/images/apply.webp | Bin 0 -> 77226 bytes docs/public/images/block-cardgroup.webp | Bin 0 -> 22986 bytes docs/public/images/block-hero.webp | Bin 0 -> 13720 bytes docs/public/images/block-richtext.webp | Bin 0 -> 48552 bytes .../images/collection-page-20220415A.webp | Bin 0 -> 166632 bytes docs/public/images/columns-20220805A.webp | Bin 0 -> 133508 bytes docs/public/images/complex-schema.webp | Bin 0 -> 89714 bytes docs/public/images/condition-20220603A.webp | Bin 0 -> 59780 bytes docs/public/images/create-data-20220603A.webp | Bin 0 -> 71334 bytes ...eate-edit-delete-dashboards-20220216A.webp | Bin 0 -> 63124 bytes docs/public/images/create-item-20220217A.webp | Bin 0 -> 31768 bytes ...reating-and-edit-roles-menu-20220217A.webp | Bin 0 -> 56102 bytes docs/public/images/cron-20220602A.webp | Bin 0 -> 50956 bytes docs/public/images/custom-permissions.webp | Bin 0 -> 30908 bytes .../images/d9-architecture-20220512A.webp | Bin 0 -> 682820 bytes .../images/dashboards-overview-20220216A.webp | Bin 0 -> 49048 bytes .../database-backend-frontend-20220805A.webp | Bin 0 -> 130260 bytes .../images/database-schema-20220805A.webp | Bin 0 -> 125236 bytes docs/public/images/datatable-20220805A.webp | Bin 0 -> 133308 bytes .../datatable-cell-value-20220805A.webp | Bin 0 -> 141668 bytes .../images/datatable-to-schema-20220805A.webp | Bin 0 -> 72534 bytes docs/public/images/delete-data-20220603A.webp | Bin 0 -> 69760 bytes docs/public/images/diff.webp | Bin 0 -> 146370 bytes .../images/duplicate-data-20220829A.webp | Bin 0 -> 152276 bytes docs/public/images/empty-state-20220217A.webp | Bin 0 -> 35232 bytes docs/public/images/event-hook-20220602A.webp | Bin 0 -> 80070 bytes .../public/images/file-details-20220305A.webp | Bin 0 -> 96380 bytes .../public/images/file-library-20220307A.webp | Bin 0 -> 175250 bytes .../public/images/file-sidebar-20220305A.webp | Bin 0 -> 105472 bytes docs/public/images/files-20220305A.webp | Bin 0 -> 101368 bytes docs/public/images/filters-20220303A.webp | Bin 0 -> 130742 bytes docs/public/images/folders-20220305A.webp | Bin 0 -> 154832 bytes .../public/images/foreign-keys-20220805A.webp | Bin 0 -> 83254 bytes .../general-project-settings-20220811A.webp | Bin 0 -> 124236 bytes .../images/global-variable-220624A.webp | Bin 0 -> 48382 bytes .../images/imports-exports-20220416A.webp | Bin 0 -> 105932 bytes docs/public/images/interface-accordion.webp | Bin 0 -> 9786 bytes .../public/images/interface-autocomplete.webp | Bin 0 -> 8662 bytes .../images/interface-buttonlinks-new.webp | Bin 0 -> 26092 bytes docs/public/images/interface-buttonlinks.webp | Bin 0 -> 4488 bytes .../images/interface-checkboxes-tree.webp | Bin 0 -> 10694 bytes docs/public/images/interface-checkboxes.webp | Bin 0 -> 6472 bytes docs/public/images/interface-code.webp | Bin 0 -> 5140 bytes docs/public/images/interface-color.webp | Bin 0 -> 8688 bytes docs/public/images/interface-datetime.webp | Bin 0 -> 22240 bytes .../images/interface-detailgroup-closed.webp | Bin 0 -> 3582 bytes .../images/interface-detailgroup-open.webp | Bin 0 -> 17118 bytes docs/public/images/interface-divider.webp | Bin 0 -> 8066 bytes .../images/interface-dropdown-multiple.webp | Bin 0 -> 9368 bytes docs/public/images/interface-dropdown.webp | Bin 0 -> 7278 bytes docs/public/images/interface-file.webp | Bin 0 -> 9940 bytes docs/public/images/interface-files.webp | Bin 0 -> 31848 bytes .../public/images/interface-group-filter.webp | Bin 0 -> 57360 bytes docs/public/images/interface-hash-secure.webp | Bin 0 -> 4878 bytes docs/public/images/interface-hash.webp | Bin 0 -> 4088 bytes docs/public/images/interface-icon.webp | Bin 0 -> 51812 bytes docs/public/images/interface-image.webp | Bin 0 -> 8920 bytes docs/public/images/interface-input.webp | Bin 0 -> 1972 bytes docs/public/images/interface-m2a.webp | Bin 0 -> 60516 bytes docs/public/images/interface-m2m.webp | Bin 0 -> 16650 bytes docs/public/images/interface-m2o.webp | Bin 0 -> 4350 bytes docs/public/images/interface-map.webp | Bin 0 -> 55274 bytes docs/public/images/interface-markdown.webp | Bin 0 -> 15522 bytes docs/public/images/interface-notice.webp | Bin 0 -> 6224 bytes docs/public/images/interface-o2m.webp | Bin 0 -> 12040 bytes .../images/interface-radio-buttons.webp | Bin 0 -> 6252 bytes docs/public/images/interface-rawgroup.webp | Bin 0 -> 13780 bytes .../images/interface-repeater-open.webp | Bin 0 -> 15342 bytes docs/public/images/interface-repeater.webp | Bin 0 -> 5784 bytes docs/public/images/interface-slider.webp | Bin 0 -> 2630 bytes docs/public/images/interface-tags.webp | Bin 0 -> 5730 bytes docs/public/images/interface-textarea.webp | Bin 0 -> 4584 bytes docs/public/images/interface-toggle.webp | Bin 0 -> 2850 bytes .../public/images/interface-translations.webp | Bin 0 -> 66554 bytes docs/public/images/interface-treeview.webp | Bin 0 -> 13252 bytes docs/public/images/interface-wysiwyg.webp | Bin 0 -> 16508 bytes docs/public/images/item-page-20220215A.webp | Bin 0 -> 96378 bytes .../images/label-panel-options-20220216A.webp | Bin 0 -> 64582 bytes .../images/list-panel-options-20220216A.webp | Bin 0 -> 51754 bytes .../images/log-to-console-20220603A.webp | Bin 0 -> 69532 bytes docs/public/images/m2a-20220805A.webp | Bin 0 -> 119906 bytes docs/public/images/m2m-20220805A.webp | Bin 0 -> 81322 bytes docs/public/images/m2o-20221026A.webp | Bin 0 -> 73736 bytes docs/public/images/manual-20230227A.webp | Bin 0 -> 81410 bytes .../manual-confirmation-dialog-20230227A.webp | Bin 0 -> 33222 bytes .../manual-input-settings-20230227A.webp | Bin 0 -> 59486 bytes .../mapping-project-settings-20220815A.webp | Bin 0 -> 86180 bytes .../metric-panel-options-20220216A.webp | Bin 0 -> 63532 bytes docs/public/images/next-blog-listing.webp | Bin 0 -> 31212 bytes docs/public/images/next-blog-single.webp | Bin 0 -> 89104 bytes docs/public/images/next-global-config.webp | Bin 0 -> 5616 bytes docs/public/images/nuxt-blog-listing.webp | Bin 0 -> 31212 bytes docs/public/images/nuxt-blog-single.webp | Bin 0 -> 89104 bytes docs/public/images/nuxt-global-config.webp | Bin 0 -> 5616 bytes docs/public/images/o2m-20221026A.webp | Bin 0 -> 73892 bytes .../images/o2m-translations-20220805A.webp | Bin 0 -> 88168 bytes docs/public/images/o2o-20221026A.webp | Bin 0 -> 74400 bytes .../images/o2o-duplicate-20221026A.webp | Bin 0 -> 79550 bytes .../images/o2o-inefficient-20221026A.webp | Bin 0 -> 77482 bytes docs/public/images/original-20220216A.jpg | Bin 0 -> 602058 bytes .../panel-header-options-20220216A.webp | Bin 0 -> 57512 bytes .../images/panels-bar-options-230223A.webp | Bin 0 -> 87342 bytes .../images/panels-line-options-230223A.webp | Bin 0 -> 82812 bytes .../images/panels-meter-options-230223A.webp | Bin 0 -> 73426 bytes .../images/panels-overview-20220216A.webp | Bin 0 -> 136252 bytes .../panels-pie-donut-options-230223A.webp | Bin 0 -> 77916 bytes docs/public/images/permissions-20220217A.webp | Bin 0 -> 59506 bytes docs/public/images/permissions-20220907A.webp | Bin 0 -> 108796 bytes .../public/images/primary-keys-20220805A.webp | Bin 0 -> 140998 bytes docs/public/images/read-data-20220603A.webp | Bin 0 -> 69340 bytes .../reusable-page-components-folders.webp | Bin 0 -> 111614 bytes .../reusable-page-components-m2a-screen.webp | Bin 0 -> 54594 bytes ...reusable-page-components-translations.webp | Bin 0 -> 117748 bytes docs/public/images/roles-20220907A.webp | Bin 0 -> 84768 bytes docs/public/images/row-20220805A.webp | Bin 0 -> 140264 bytes docs/public/images/rows-and-columns.webp | Bin 0 -> 134698 bytes docs/public/images/sample-page.webp | Bin 0 -> 103534 bytes ...ling-content-create-content-published.webp | Bin 0 -> 67358 bytes ...ling-content-create-content-scheduled.webp | Bin 0 -> 67508 bytes .../images/scheduling-content-flow-setup.webp | Bin 0 -> 38808 bytes .../scheduling-content-publish-date.webp | Bin 0 -> 45034 bytes .../images/scheduling-content-trigger.webp | Bin 0 -> 21966 bytes .../scheduling-content-update-articles.webp | Bin 0 -> 57352 bytes .../security-project-settings-20220811A.webp | Bin 0 -> 115286 bytes .../images/security-project-settings.webp | Bin 0 -> 39810 bytes .../select-existing-role-menu-20220217A.webp | Bin 0 -> 53552 bytes docs/public/images/send-email-20220603A.webp | Bin 0 -> 57104 bytes .../images/send-notification-20220603A.webp | Bin 0 -> 62706 bytes .../images/share-options-menu-20220217A.webp | Bin 0 -> 59174 bytes docs/public/images/sleep-20220603A.webp | Bin 0 -> 54222 bytes docs/public/images/snapshot.webp | Bin 0 -> 114212 bytes docs/public/images/spreadsheet-20220805A.webp | Bin 0 -> 105154 bytes .../images/static-site-build-condition.webp | Bin 0 -> 33316 bytes .../images/static-site-build-trigger.webp | Bin 0 -> 44316 bytes .../images/static-site-build-webhook.webp | Bin 0 -> 42634 bytes .../time-series-panel-options-20220216A.webp | Bin 0 -> 78630 bytes .../images/transform-payload-20220603A.webp | Bin 0 -> 61406 bytes .../public/images/trigger-flow-20220603A.webp | Bin 0 -> 62254 bytes .../images/unfilterable-fields-20220303A.webp | Bin 0 -> 66722 bytes docs/public/images/update-data-20220603A.webp | Bin 0 -> 67254 bytes .../images/user-directory-20220222A.webp | Bin 0 -> 40724 bytes ...er-directory-layout-options-20220222A.webp | Bin 0 -> 57162 bytes .../images/user-preferences-20220222A.webp | Bin 0 -> 75142 bytes .../public/images/user-profile-20220222A.webp | Bin 0 -> 54096 bytes ...profile-sidebar-information-20220309A.webp | Bin 0 -> 55134 bytes docs/public/images/users-20220807A.webp | Bin 0 -> 192544 bytes .../users-roles-permissions-20220907A.webp | Bin 0 -> 51250 bytes docs/public/images/webhook-20220602A.webp | Bin 0 -> 65098 bytes docs/public/images/webhook-20220603A.webp | Bin 0 -> 64118 bytes .../public/images/whats-a-flow-20220603A.webp | Bin 0 -> 98632 bytes docs/public/images/workflows-20220909A.webp | Bin 0 -> 70538 bytes docs/public/images/workflows-20220909B.webp | Bin 0 -> 46824 bytes docs/public/logo-dark.png | Bin 0 -> 21982 bytes docs/public/logo-dark.svg | 21 +- docs/public/logo-light.png | Bin 0 -> 21773 bytes docs/public/logo-light.svg | 21 +- docs/readme.md | 23 +- docs/reference/authentication.md | 4 +- docs/reference/files.md | 14 +- docs/reference/filter-rules.md | 4 +- docs/reference/introduction.md | 10 +- docs/reference/items.md | 8 +- docs/reference/query.md | 8 +- docs/reference/sdk.md | 24 +- docs/reference/system/activity.md | 4 +- docs/reference/system/collections.md | 4 +- docs/reference/system/dashboards.md | 4 +- docs/reference/system/extensions.md | 2 +- docs/reference/system/fields.md | 10 +- docs/reference/system/flows.md | 6 +- docs/reference/system/folders.md | 6 +- docs/reference/system/notifications.md | 4 +- docs/reference/system/operations.md | 6 +- docs/reference/system/panels.md | 4 +- docs/reference/system/permissions.md | 4 +- docs/reference/system/presets.md | 6 +- docs/reference/system/relations.md | 6 +- docs/reference/system/revisions.md | 6 +- docs/reference/system/roles.md | 4 +- docs/reference/system/schema.md | 4 +- docs/reference/system/server.md | 8 +- docs/reference/system/settings.md | 2 +- docs/reference/system/shares.md | 4 +- docs/reference/system/users.md | 6 +- docs/reference/system/utilities.md | 4 +- docs/reference/system/webhooks.md | 4 +- docs/self-hosted/cli.md | 26 +-- docs/self-hosted/config-options.md | 88 +++---- docs/self-hosted/docker-guide.md | 20 +- docs/self-hosted/quickstart.md | 23 +- docs/self-hosted/sso-examples.md | 12 +- docs/self-hosted/sso.md | 22 +- docs/self-hosted/upgrades-migrations.md | 26 +-- docs/use-cases/headless-cms/introduction.md | 8 +- docs/use-cases/headless-cms/security.md | 20 +- packages/specs/README.md | 28 +-- packages/specs/src/openapi.yaml | 8 +- readme.md | 113 ++++----- security.md | 8 +- tests/blackbox/assets/directus.png | Bin 7136 -> 29773 bytes tests/blackbox/assets/layers.png | Bin 883407 -> 891191 bytes 316 files changed, 1269 insertions(+), 1757 deletions(-) create mode 100644 docs/public/favicon.ico create mode 100644 docs/public/favicon.png create mode 100644 docs/public/images/200-200-cover-100-20220216A.jpg create mode 100644 docs/public/images/200-200-cover-25-20220216A.jpg create mode 100644 docs/public/images/200-200-cover-50-20220216A.jpg create mode 100644 docs/public/images/200-200-cover-75-20220216A.jpg create mode 100644 docs/public/images/2fa-role.webp create mode 100644 docs/public/images/2fa-user.webp create mode 100644 docs/public/images/Copy-send-edit-delete-shares-menu-20220217A.webp create mode 100644 docs/public/images/activity-log-default-fields-20220816A.webp create mode 100644 docs/public/images/admin-options-20220222A.webp create mode 100644 docs/public/images/and-or-groups-20220303A.webp create mode 100644 docs/public/images/another-flow-20220602A.webp create mode 100644 docs/public/images/app-overview-d9.svg create mode 100644 docs/public/images/apply.webp create mode 100644 docs/public/images/block-cardgroup.webp create mode 100644 docs/public/images/block-hero.webp create mode 100644 docs/public/images/block-richtext.webp create mode 100644 docs/public/images/collection-page-20220415A.webp create mode 100644 docs/public/images/columns-20220805A.webp create mode 100644 docs/public/images/complex-schema.webp create mode 100644 docs/public/images/condition-20220603A.webp create mode 100644 docs/public/images/create-data-20220603A.webp create mode 100644 docs/public/images/create-edit-delete-dashboards-20220216A.webp create mode 100644 docs/public/images/create-item-20220217A.webp create mode 100644 docs/public/images/creating-and-edit-roles-menu-20220217A.webp create mode 100644 docs/public/images/cron-20220602A.webp create mode 100644 docs/public/images/custom-permissions.webp create mode 100644 docs/public/images/d9-architecture-20220512A.webp create mode 100644 docs/public/images/dashboards-overview-20220216A.webp create mode 100644 docs/public/images/database-backend-frontend-20220805A.webp create mode 100644 docs/public/images/database-schema-20220805A.webp create mode 100644 docs/public/images/datatable-20220805A.webp create mode 100644 docs/public/images/datatable-cell-value-20220805A.webp create mode 100644 docs/public/images/datatable-to-schema-20220805A.webp create mode 100644 docs/public/images/delete-data-20220603A.webp create mode 100644 docs/public/images/diff.webp create mode 100644 docs/public/images/duplicate-data-20220829A.webp create mode 100644 docs/public/images/empty-state-20220217A.webp create mode 100644 docs/public/images/event-hook-20220602A.webp create mode 100644 docs/public/images/file-details-20220305A.webp create mode 100644 docs/public/images/file-library-20220307A.webp create mode 100644 docs/public/images/file-sidebar-20220305A.webp create mode 100644 docs/public/images/files-20220305A.webp create mode 100644 docs/public/images/filters-20220303A.webp create mode 100644 docs/public/images/folders-20220305A.webp create mode 100644 docs/public/images/foreign-keys-20220805A.webp create mode 100644 docs/public/images/general-project-settings-20220811A.webp create mode 100644 docs/public/images/global-variable-220624A.webp create mode 100644 docs/public/images/imports-exports-20220416A.webp create mode 100644 docs/public/images/interface-accordion.webp create mode 100644 docs/public/images/interface-autocomplete.webp create mode 100644 docs/public/images/interface-buttonlinks-new.webp create mode 100644 docs/public/images/interface-buttonlinks.webp create mode 100644 docs/public/images/interface-checkboxes-tree.webp create mode 100644 docs/public/images/interface-checkboxes.webp create mode 100644 docs/public/images/interface-code.webp create mode 100644 docs/public/images/interface-color.webp create mode 100644 docs/public/images/interface-datetime.webp create mode 100644 docs/public/images/interface-detailgroup-closed.webp create mode 100644 docs/public/images/interface-detailgroup-open.webp create mode 100644 docs/public/images/interface-divider.webp create mode 100644 docs/public/images/interface-dropdown-multiple.webp create mode 100644 docs/public/images/interface-dropdown.webp create mode 100644 docs/public/images/interface-file.webp create mode 100644 docs/public/images/interface-files.webp create mode 100644 docs/public/images/interface-group-filter.webp create mode 100644 docs/public/images/interface-hash-secure.webp create mode 100644 docs/public/images/interface-hash.webp create mode 100644 docs/public/images/interface-icon.webp create mode 100644 docs/public/images/interface-image.webp create mode 100644 docs/public/images/interface-input.webp create mode 100644 docs/public/images/interface-m2a.webp create mode 100644 docs/public/images/interface-m2m.webp create mode 100644 docs/public/images/interface-m2o.webp create mode 100644 docs/public/images/interface-map.webp create mode 100644 docs/public/images/interface-markdown.webp create mode 100644 docs/public/images/interface-notice.webp create mode 100644 docs/public/images/interface-o2m.webp create mode 100644 docs/public/images/interface-radio-buttons.webp create mode 100644 docs/public/images/interface-rawgroup.webp create mode 100644 docs/public/images/interface-repeater-open.webp create mode 100644 docs/public/images/interface-repeater.webp create mode 100644 docs/public/images/interface-slider.webp create mode 100644 docs/public/images/interface-tags.webp create mode 100644 docs/public/images/interface-textarea.webp create mode 100644 docs/public/images/interface-toggle.webp create mode 100644 docs/public/images/interface-translations.webp create mode 100644 docs/public/images/interface-treeview.webp create mode 100644 docs/public/images/interface-wysiwyg.webp create mode 100644 docs/public/images/item-page-20220215A.webp create mode 100644 docs/public/images/label-panel-options-20220216A.webp create mode 100644 docs/public/images/list-panel-options-20220216A.webp create mode 100644 docs/public/images/log-to-console-20220603A.webp create mode 100644 docs/public/images/m2a-20220805A.webp create mode 100644 docs/public/images/m2m-20220805A.webp create mode 100644 docs/public/images/m2o-20221026A.webp create mode 100644 docs/public/images/manual-20230227A.webp create mode 100644 docs/public/images/manual-confirmation-dialog-20230227A.webp create mode 100644 docs/public/images/manual-input-settings-20230227A.webp create mode 100644 docs/public/images/mapping-project-settings-20220815A.webp create mode 100644 docs/public/images/metric-panel-options-20220216A.webp create mode 100644 docs/public/images/next-blog-listing.webp create mode 100644 docs/public/images/next-blog-single.webp create mode 100644 docs/public/images/next-global-config.webp create mode 100644 docs/public/images/nuxt-blog-listing.webp create mode 100644 docs/public/images/nuxt-blog-single.webp create mode 100644 docs/public/images/nuxt-global-config.webp create mode 100644 docs/public/images/o2m-20221026A.webp create mode 100644 docs/public/images/o2m-translations-20220805A.webp create mode 100644 docs/public/images/o2o-20221026A.webp create mode 100644 docs/public/images/o2o-duplicate-20221026A.webp create mode 100644 docs/public/images/o2o-inefficient-20221026A.webp create mode 100644 docs/public/images/original-20220216A.jpg create mode 100644 docs/public/images/panel-header-options-20220216A.webp create mode 100644 docs/public/images/panels-bar-options-230223A.webp create mode 100644 docs/public/images/panels-line-options-230223A.webp create mode 100644 docs/public/images/panels-meter-options-230223A.webp create mode 100644 docs/public/images/panels-overview-20220216A.webp create mode 100644 docs/public/images/panels-pie-donut-options-230223A.webp create mode 100644 docs/public/images/permissions-20220217A.webp create mode 100644 docs/public/images/permissions-20220907A.webp create mode 100644 docs/public/images/primary-keys-20220805A.webp create mode 100644 docs/public/images/read-data-20220603A.webp create mode 100644 docs/public/images/reusable-page-components-folders.webp create mode 100644 docs/public/images/reusable-page-components-m2a-screen.webp create mode 100644 docs/public/images/reusable-page-components-translations.webp create mode 100644 docs/public/images/roles-20220907A.webp create mode 100644 docs/public/images/row-20220805A.webp create mode 100644 docs/public/images/rows-and-columns.webp create mode 100644 docs/public/images/sample-page.webp create mode 100644 docs/public/images/scheduling-content-create-content-published.webp create mode 100644 docs/public/images/scheduling-content-create-content-scheduled.webp create mode 100644 docs/public/images/scheduling-content-flow-setup.webp create mode 100644 docs/public/images/scheduling-content-publish-date.webp create mode 100644 docs/public/images/scheduling-content-trigger.webp create mode 100644 docs/public/images/scheduling-content-update-articles.webp create mode 100644 docs/public/images/security-project-settings-20220811A.webp create mode 100644 docs/public/images/security-project-settings.webp create mode 100644 docs/public/images/select-existing-role-menu-20220217A.webp create mode 100644 docs/public/images/send-email-20220603A.webp create mode 100644 docs/public/images/send-notification-20220603A.webp create mode 100644 docs/public/images/share-options-menu-20220217A.webp create mode 100644 docs/public/images/sleep-20220603A.webp create mode 100644 docs/public/images/snapshot.webp create mode 100644 docs/public/images/spreadsheet-20220805A.webp create mode 100644 docs/public/images/static-site-build-condition.webp create mode 100644 docs/public/images/static-site-build-trigger.webp create mode 100644 docs/public/images/static-site-build-webhook.webp create mode 100644 docs/public/images/time-series-panel-options-20220216A.webp create mode 100644 docs/public/images/transform-payload-20220603A.webp create mode 100644 docs/public/images/trigger-flow-20220603A.webp create mode 100644 docs/public/images/unfilterable-fields-20220303A.webp create mode 100644 docs/public/images/update-data-20220603A.webp create mode 100644 docs/public/images/user-directory-20220222A.webp create mode 100644 docs/public/images/user-directory-layout-options-20220222A.webp create mode 100644 docs/public/images/user-preferences-20220222A.webp create mode 100644 docs/public/images/user-profile-20220222A.webp create mode 100644 docs/public/images/user-profile-sidebar-information-20220309A.webp create mode 100644 docs/public/images/users-20220807A.webp create mode 100644 docs/public/images/users-roles-permissions-20220907A.webp create mode 100644 docs/public/images/webhook-20220602A.webp create mode 100644 docs/public/images/webhook-20220603A.webp create mode 100644 docs/public/images/whats-a-flow-20220603A.webp create mode 100644 docs/public/images/workflows-20220909A.webp create mode 100644 docs/public/images/workflows-20220909B.webp create mode 100644 docs/public/logo-dark.png create mode 100644 docs/public/logo-light.png diff --git a/.github/DISCUSSION_TEMPLATE/docs-suggestions.yml b/.github/DISCUSSION_TEMPLATE/docs-suggestions.yml index 4581646160..599a6f4dd5 100644 --- a/.github/DISCUSSION_TEMPLATE/docs-suggestions.yml +++ b/.github/DISCUSSION_TEMPLATE/docs-suggestions.yml @@ -4,7 +4,7 @@ body: value: | Hi, thank you for taking the time to create a docs suggestion! - Please do be aware that this is _not_ the place to ask a question. To ask a question, [join our Discord server](https://directus.chat) instead! + Please do be aware that this is _not_ the place to ask a question. To ask a question, use [GitHub Discussions](https://github.com/LaWebcapsule/directus9/discussions) instead! - type: input attributes: diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index c38520819c..9f81e8b6e7 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -2,10 +2,10 @@ blank_issues_enabled: false contact_links: - name: Request a new feature url: https://github.com/LaWebcapsule/directus9/discussions/new?category=feature-requests - about: Share your ideas on how to make Directus better. + about: Share your ideas on how to make d9 better. - name: Suggest improvements for the docs url: https://github.com/LaWebcapsule/directus9/discussions/new?category=docs-suggestions - about: Share your ideas on how to improve the documentation of Directus. + about: Share your ideas on how to improve the documentation of d9. - name: Ask a question - url: https://directus.chat/ + url: https://github.com/LaWebcapsule/directus9/discussions about: Please ask and answer questions here. diff --git a/api/package.json b/api/package.json index 2bb50ac3c5..3d5ae22078 100644 --- a/api/package.json +++ b/api/package.json @@ -22,7 +22,7 @@ "framework", "vue" ], - "homepage": "https://directus.io", + "homepage": "https://d9.dev", "bugs": { "url": "https://github.com/LaWebcapsule/directus9/issues" }, diff --git a/api/src/cli/utils/create-env/env-stub.liquid b/api/src/cli/utils/create-env/env-stub.liquid index 5af59a8394..710aa71463 100644 --- a/api/src/cli/utils/create-env/env-stub.liquid +++ b/api/src/cli/utils/create-env/env-stub.liquid @@ -307,8 +307,8 @@ EXTENSIONS_AUTO_RELOAD=false #################################################################################################### ### Email -# Email address from which emails are sent ["no-reply@directus.io"] -EMAIL_FROM="no-reply@directus.io" +# Email address from which emails are sent ["no-reply@d9.dev"] +EMAIL_FROM="no-reply@d9.dev" # What to use to send emails. One of # sendmail, smtp, mailgun, sendgrid, ses. diff --git a/app/public/favicon.ico b/app/public/favicon.ico index 6edbfd8239aff78fbd6f98e5cfd98354b2a6c64d..f9b22fcda3ac74c54633f30d8263c7d2b10f1aaf 100644 GIT binary patch literal 15406 zcmeI2*`HL!700iiDysDP}>rm{znW!RKK6jX2lL>3Wb z5fBEqQNRt^6&OTCbU+0}7R6uAmzv|PY5Fof-91Btb3UK$y0>oCsZ-0@D@iU${*YXF zVPa*wr1Kw>!}pV70`ztUdqa(}w=X(tiHb^%2{b$E5o2v-{6l z8uo4WYu+oAn~W~j^8PAm%dYJHzJ7Px`i*&3T2U)aTOi%^fW+L`n^kMG`!lbO4g0sm z_HWXQw)aNMZrhV#Q>4qgNYB4|=KkQ|{PZ0!O?W{X`h;{%kI;v`AMte4{j=7Wd2}9L zeE;iug*jy5FQPuLP-sRaa;BaA{$@YqQx;^Nxguz8!)0gmd|Wqp;~C@khmBYN+4Jno z@e<>GcpjO*&SZA=Ea}$%XNQ)KrnAr?znqjl-y8Ho&(YF9I<+i4$hmRP2U*HFyK}Jg z-Y2O{-)}l#?ut-f&U1K)&1>qspywFv=U=2bHjc~RVN<2UM^ZX|{Z)GFL))Js?Sz>2 zE4rq0-1D_GYMOL)gWQkXG1lkyJqGl0zX_%7$(tVpj7#56WjwY}@3GQ=>YzWJj_b`P z*=^?`h97^DZtPba4a^l--Jo01ljzM{J7Qa%)Wz%o=(yz}>Clg-y8ZTt{&yM+Eji13 z>!t4x1)hih;JYk1e!}dCF=3pMri)|Pva|W)-)A-nFk^A(J85=!Khys=2hu&-x+`sY z;D_dq|MbhDe~(e2Z|>Pju{VA~MzO}oN{2(n8-=dBw_8{fdSmCp1IAJX!HgwgEY1pN z5BTn28OAS=0N*d>@wUkT02%4?DztoRe(3w#`WucyV94ZjEMyk&(YCa%(DD8J&1_gt z^i5N+Z+|#{*P5KZYeSNn0m^W`_ekBV&| z)`ht*GyQPV?13Z3bNDEXgPs7cH~*lywZ_XG2c3-F zoLk>o@4d%KgC0M7DAx8V#~Q(Z<-l_uKaT3#6=kZx@ zn_Jud{;tjde#oOUEM{VMJTZE571*=q5|2agz)8})l@hTS{NgIhL6FPACpuT=a;5n! z#HffX?A|MV`(4PL;OE|M_2Q|rDu6f^KFfkt(j!kvH$NDB-%6MZ{`@PerRBA0-W1;u{}Nw)-+?d({)xd7|HNlq zw5D;KvNh)defXrWz7f{eDI|srUAOd454y@7R7Bls@JTaLiZ%G}7 z1pZ}TveuBk{U=JqP4fY`$N{(H90pHL^9}VTD~W}Z|8<(#8~7Jl!;e@;{GE2hefDR} z0Y2v*LQCina^27j?6dtQPUY*3J{x5EZ2s#Zm$hxT$(uTfI}Fb)lDgS>@;OpI_^8Et z_Mbv^+8^;3a@TSDQlFvE?^O^#hIYrveF@G!XA1d}3-BmshM4JJYDv6*k~?n_%v_;}%*oWp0XxST#A?7_b9?K<>$95wUvgR%E{e_rgl0 z+xzFEpYvM^KtFQ9$6#N{=Q)&Ga=>Y)#3%h?Uy5zb`o`bmw#|Kx z`4=0^`*Sy~SinYbJd~WF_|66QAmZ<(Jma5}O9S9Lm!G}Hgq&9RQusf)`|C_+LlZf( zF2lp~i_20R=;l&rj{9Php>xq+oY5X;fAJmtMScwXpim&kIL>@C$N$*OV9)Z-9YhE2 zq5PlH?}cD#SXMkbfb{gAx&o6(KEOupFXjqGGD?493{#l8jVO_yO;IsS5$_;~I= zQ4X*pxwZv3nUxfFCHL2aiI`~@C9zYHuPvddR^$e}Z2ER+h znP&Ysubd;_k9a)h#C?@MGsY`_YB*d|7|KVUNc3<)S;r1AgpA;y$t6!ua@9 z@HlZEzES4@Z!)LYes;XbBii%b>sq7iFvR?-RbfBi3G7mM1e+ThgEPLhPMR_=@I)3( z;GqvOf~+u6Z16x+W8>rFC+GV5P4%mk@5BVS8+hXbP0zJb zXpZS%&xoDG@;Lrp>Cf0j+`*}IIeM#P_r22V Y(Cd{>V;g}_8 zBz&_BY?s)MfjNLRp@|l6X9sX?Hu1Q5OS4%ma&jPN@~F^Qw!B5+Ok7LJj=aeyLP>i; z(z+kb$&JKxP5ZU(gJXTSxulD}RHcSyC<0QIDpf@3RYI?V5TpbUDI%TFrAhBi2vSW# zlM+Cr1Ox;ENdFz4&-Z$-_m5mjc4zOIo!v7#yXW5bdOB+KG&g8KAP~KVy2>*Uh!lJI zp}GQ;{B@Kp1-_`=)t`HUK(x%49}-Y{20Ktl;`vNX2~;t{MF9Sg+rhM9AW(HY?Wr{d z@Sg#$Y691HvxWOuzj+OM>|p0&omHJ;0|IH|HB?{*z9gG-8_Ar82T}{07ycdb?_Wey z^{I&73=_NhLj|M~8U>09Ak*PL{KK=z|C zW*z4OAW$emn`LdojD>JWIS zFcQFm9_bf$%FXVXP0OYwUy7{cKJ^hHv%RTK1}gWvt9~K-f-g)Q^dpH)(#~4=@>lv| z;`}7OOOV_Flp_VSinwfL>-+oAnB*Z7iX;?I#~9lm9!?EF#~YFGUjvG`2}vuj{?|4% z`#D91dcqZuzjzw|aLFZz@wBY;djN#Ejtga`0-9Bxv$&JOZh+RtWB#uoYkqc?3df~= z*{+^O`opEPR<^hrGXS1dPKvw@SSw#6M*Cj@{<(Yq(@S8VFmbi3mlpkh1!bYPE){GG zO8>qK*b}PYfaC?5QenAZ0Cd$t!eupxmFo>Tpx%C%UDvJ)qRR(JI0HS<05C&^VCnn- zCa4~O_+J5wLzW8Ac(WdKw_m;vU5iZap#PNKgF!L)F4(2A!yvBz3KxO|uw0i)0B{E*5=y|$AiUJ< z?5rH4?>oR3e{&%VSAqU?B8HMyp8n@(ef0dDF!A_H?-$Ai95^F+<;mrg0EmAHSAFH4 zTw=i;4X1xIaNhxJ5yJ8h|Gc!)hZ*IU03fySGg)B zC8gXce`&pHNUvP2kGsfaUxRrlXO#iy#_VYE!%Nky!_`xw)e8v$m$M;eg$Db-MxiI4 zX1m({Ywc->Vh+O2YFrv5ZkHh06fS#d2cv%Ciq8M^-^cR#xbt7S29p8vr)mtp?67E( zY-1Aeqt-sw4;UIUK(up7Yir?uKMYVup+Keh>dzWGo1wwq3<{T{EaytqsCubKVwI{@ zylKg=llu~NJmWuy2V6S5hYH)O_MeE4sz24#EudBTHI&T#|Kw(2(}E88|H_W7hMYv3 z!h<1|N9>&rkEuA@ALn^C^KIT>gwtm z8G8B9cxT>G*EJ%6017vu#tHTJXx%PdRyM+d5|aKcbm?4&p${wNb|j!5#h*2Xwufu% zMipq9i*5qW5Fgdv;=P>cDS#`SFWvfjl?Ka0IR~f)Ww}x{^Ir}z=aO7xPQazbI6~rM zz~b}+;|#RBr>6~~XXMi7XpXRoOQnM&5_Pw#d#qRgheU@}{vmPcfS)qqM8)v`iPU<# zOI|{GMCLdF-#@;JjjSFG4-YfJH34L4{Qtg9CHws7VGWm_U3%_5CH6m*BJbPEKQ6mu zKLK=N1dO_1fp0tqfyDo;tgLk4diJD~?tK~5&wQ2$c-3d3wDzj+88DeZI{9t+`j^U@ z#YQ%kax^bQKv2;+f9fw6o?EUIvKncVPf17 z{#S?&*$Qgo`G{x?C0sZiF8iXFE?x#ebZN8B2ds*=X&2l%E@JkM@2&yi<@z0wX$^?9 z%bSGu^HqH1cG>OJSB?AsatNa*KE)&P_v|}HI)a7lm01i>vcLnxmRdHT?A+r4J?Gdb zUvAn|xIKH%xLLo7d�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 diff --git a/app/public/img/icons/mstile-150x150.png b/app/public/img/icons/mstile-150x150.png index 6259913816fa04a7b82c3d50abfcbdbbca0afbbf..545b6134acc7868b097b51aa88608f4d167838a1 100644 GIT binary patch literal 3221 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 Hu0mjf^Xndn literal 1630 zcmdUv={wX56vwH@lE`uq5?RJ_$x?SLKgJMaiLs8cFV_+!`x2&1jZ~Hj*(I9B7-m#s zZN`>_42dBbiK4MJri+>^xpTSC{R4V?KhJZX?>Xl=-{+iHC)3%{Mnp(Xh=+$q#Lm{r zm4}D-$bJYO-0L_+A1dAxg0lkxwx`_x11j$zk$blqCb&Af@oe*bBMBdXi~U?>4vlkw zV}iX@$&X!rZcvT2_YGBfQD7OE?$Ql>sp^$5&&ix?$;yf&alzWpc}=u^K*_&Gf>{y@qn|EJvhfU?HgqGR{sjq zcM0KAZ#GgPaLwY$)5P8icjB^7(tJhaR`;`x%;{PV&V^x;U|sA$Y<6i4wzg~rr% zQ)f{v+OmIWl!rLYsb{}>QDutxz}8}=6aW%TqCoszh)AsZC?6G4ZuYuFe39P|aUAZo zR_Kq#AzUM=B(mmqu4Wst+D!iKWD{rCPf$ z{C*FoG~+P0$Z%s-`>NkCKl_A8MQ&gg0lrv7eq~fs*f>}#XC&+PCHtI9)^^SY@0jQh z?Q)4hOW;%c@CDGqgy!v$xm4P!#{jEQey&Qza0S>^65eg`{_`tPphVD*iVVmMUvBWl zE?Sqr4WTO}jvLl2lTMIJ1F5QmivazwK#GT?Hr$Zf4p2Th%DKsURNo1c-Irkkm(~ z6)hbo?MWjAxd{2m>0F`gnh}wwFv=}U`D%AjqQ_`T!U6r|o$7ein-)g}#piPu(Z2Vm zfY8{Y`IP$0>-D)=M#ve80a!W@o|51;;{@X{VR-v9{vJ+k!C(NFmSzR8Z9tmem9uqn zy>)Xuf`aJoD@pMU7Y19*w{q~bU|ER9V1gnwq{JTG{v}RcxGx|0VEL%SmVfNQiyi6l zTWoX14R4b-CS()A-$^nOnVn86jTq0d1HH)S6@uk3#=)a zzbcd7Y2hI=Y*eeX(GJyLAxlmvOD+ZWPXK-v(Q&ajrJCMT-ciV`h&;5QEg?LZn$>Ih zqzsG{Mt_j-|1uEHG14=S1KRIa#M>I^P^}2g`e$z~5iIlA7n++)Js8!>K z!yb95DU^iNRcsyg^lKF2-Vr%IhV<3~ zJX)Z~CR&P{jonF*vuxe}?!Q9URQf^Q{XvVrCseeZ|4sk%sc%YhTic9poZPSNV2)Og&je!r0SD+q A - - - -Created by potrace 1.11, written by Peter Selinger 2001-2013 - - - + + + + + + + + + diff --git a/app/public/manifest.webmanifest b/app/public/manifest.webmanifest index 8e0c547698..3591db1035 100644 --- a/app/public/manifest.webmanifest +++ b/app/public/manifest.webmanifest @@ -1,6 +1,6 @@ { - "name": "Directus", - "short_name": "Directus", + "name": "d9", + "short_name": "d9", "theme_color": "#263238", "background_color": "#263238", "display": "standalone", diff --git a/app/src/assets/logo-dark.svg b/app/src/assets/logo-dark.svg index 6f58b53d8f..cd02b55b2b 100644 --- a/app/src/assets/logo-dark.svg +++ b/app/src/assets/logo-dark.svg @@ -1,3 +1,11 @@ - - - \ No newline at end of file + + + + + + + + + + + diff --git a/app/src/assets/logo.svg b/app/src/assets/logo.svg index 64123071af..a7ffe4a2b5 100644 --- a/app/src/assets/logo.svg +++ b/app/src/assets/logo.svg @@ -1,3 +1,11 @@ - - - \ No newline at end of file + + + + + + + + + + + diff --git a/app/src/assets/sprite.svg b/app/src/assets/sprite.svg index f2fd82339b..74b54948d7 100644 --- a/app/src/assets/sprite.svg +++ b/app/src/assets/sprite.svg @@ -1,112 +1,102 @@ - - - - Directus App v8 Sprite Final - Created with Sketch. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/constants.ts b/app/src/constants.ts index b711124b6f..98e8f60d30 100644 --- a/app/src/constants.ts +++ b/app/src/constants.ts @@ -2,26 +2,27 @@ import { Type } from '@wbce-d9/types'; export const VALIDATION_TYPES = ['FAILED_VALIDATION', 'RECORD_NOT_UNIQUE']; -export const DIRECTUS_LOGO = ` - -⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣶⣦⣤⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ -⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⠀⠻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣦⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ -⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⣿⣿⣿⣷⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ -⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣤⣿⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠛⠛⠿⠿⠿⠿⠿⠛⠛⠉⠀⢰⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ -⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢰⣿⣿⣿⣿⣶⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ -⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣶⣶⣦⣤⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ -⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣶⣶⣶⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠿⠿⠛⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ -⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ -⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ -⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡌⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ -⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣤⣶⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠁⠛⠛⠿⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣶⣶⣤⣤⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ -⠀⠀⠀⠀⠀⠀⠀⠀⢀⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠟⠁⠀⠀⠀⠀⠀⠀⠀⠉⠛⣿⣿⣿⣿⣿⡆⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣶⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ -⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⣿⣿⣿⣿⡿⠿⠛⠛⠋⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠛⠿⣿⣄⠈⠻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣦⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ -⠀⠀⠀⠀⠀⠀⠀⣾⣿⣿⣿⣿⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠉⠉⠉⠉⠀⠀⠀⠀⠀⠀⠀⠉⢿⣿⣿⣿⣷⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ -⠀⠀⠀⠀⠀⣤⣿⣿⣿⣿⠟⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ -⠀⠀⠀⣴⣿⣿⣿⣿⠟⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ -⠀⠀⠀⠀⠉⠉⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ - +export const D9_LOGO = ` +%c + ██████████████████████████ + ████████████████████████████████ + ██████████ ██████████ ██ +████████ ████████ ████ +███████ ████████████████ ███████ ████ +██████ ██████████████████████ ██████ █████ +██████ ████████ ████████ █████ █████ +██████ ███████ ██████ ███████ █████ █████ +██████ ███████ ██████ ███████ █████ █████ +██████ ████████ ████████ █████ █████ +██████ ██████████████████████ ██████ ████ +███████ ████████████████ ██████ ████ +████████ ████████ ███ + ██████████ ██████████ ██ + ████████████████████████████████ ██ + ██████████████████████████ ██ + ██ + █ +%c `; /** @@ -65,7 +66,7 @@ export const MODULE_BAR_DEFAULT = [ enabled: true, name: '$t:documentation', icon: 'help', - url: 'https://docs.directus.io', + url: 'https://docs.d9.dev', }, { type: 'module', diff --git a/app/src/main.ts b/app/src/main.ts index e1136c44f0..d2c70dadd9 100644 --- a/app/src/main.ts +++ b/app/src/main.ts @@ -5,7 +5,7 @@ import { createPinia } from 'pinia'; import { createApp } from 'vue'; import App from './app.vue'; import { registerComponents } from './components/register'; -import { DIRECTUS_LOGO } from './constants'; +import { D9_LOGO } from './constants'; import { registerDirectives } from './directives/register'; import { i18n } from './lang/'; import { router } from './router'; @@ -16,13 +16,13 @@ import { loadExtensions, registerExtensions } from './extensions'; init(); async function init() { - console.log(DIRECTUS_LOGO); + console.log(D9_LOGO, 'color:#6644ff', ''); console.info( - `Hey! Interested in helping build this open-source data management platform?\nIf so, join our growing team of contributors at: https://directus.chat` + `Hey! Interested in helping build this open-source data platform?\nJoin us at: https://github.com/LaWebcapsule/directus9` ); - console.info(`%c🐰 Starting Directus...`, 'color:Green'); + console.info(`%c☄️ Starting d9...`, 'color:#6644ff'); console.time('🕓 Application Loaded'); diff --git a/app/src/views/public/logo-dark.svg b/app/src/views/public/logo-dark.svg index d781d2fbf3..cd02b55b2b 100644 --- a/app/src/views/public/logo-dark.svg +++ b/app/src/views/public/logo-dark.svg @@ -1,3 +1,11 @@ - - + + + + + + + + + + diff --git a/app/src/views/public/logo-light.svg b/app/src/views/public/logo-light.svg index a5b0c2d0d9..a7ffe4a2b5 100644 --- a/app/src/views/public/logo-light.svg +++ b/app/src/views/public/logo-light.svg @@ -1,3 +1,11 @@ - - + + + + + + + + + + diff --git a/code_of_conduct.md b/code_of_conduct.md index 0df06c7a81..113b8a2333 100644 --- a/code_of_conduct.md +++ b/code_of_conduct.md @@ -44,7 +44,7 @@ event. Representation of a project may be further defined and clarified by proje ## Enforcement Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at -info@directus.io. All complaints will be reviewed and investigated and will result in a response that is deemed +support@webcapsule.io. All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. diff --git a/contributing.md b/contributing.md index 8a7e5b14cb..eebb860f4f 100644 --- a/contributing.md +++ b/contributing.md @@ -1,23 +1,23 @@ # Contributing -Heya! Welcome to Directus, and thank you for taking the time to contribute back to Open Source Software! ❤️ We want -everybody to be able to contribute to Directus, no matter your background or expertise. In order to facilitate that, +Heya! Welcome to d9, and thank you for taking the time to contribute back to Open Source Software! We want +everybody to be able to contribute to d9, no matter your background or expertise. In order to facilitate that, we've put together a couple tips and tricks below. Our team truly appreciates every single contributor, community -member, GitHub star, pull-request, bug report, and feature request. Keeping Directus completely free and open-source is +member, GitHub star, pull-request, bug report, and feature request. Keeping d9 completely free and open-source is our way of saying: **Thank you!** > We're here to help! > -> If you have _any_ questions along your contributor journey, please feel free to come chat with us on -> [our Discord server](https://directus.chat). +> If you have _any_ questions along your contributor journey, please feel free to reach out on +> [GitHub Discussions](https://github.com/LaWebcapsule/directus9/discussions) or via [email](mailto:support@webcapsule.io). ## Code of Conduct -**The Directus [Code of Conduct](https://github.com/LaWebcapsule/directus9/blob/main/code_of_conduct.md) is one of the +**The d9 [Code of Conduct](https://github.com/LaWebcapsule/directus9/blob/main/code_of_conduct.md) is one of the ways we put our values into practice. We expect all of our staff, contractors and contributors to know and follow this code.** -**Our contributors and maintainers work extremely hard to build Directus as premium open-source software. Please be +**Our contributors and maintainers work extremely hard to build d9 as open-source software. Please be respectful of those efforts throughout our ecosystem. Trolling, harassing, insulting, or other unacceptable behavior by participants will not be tolerated.** @@ -54,13 +54,13 @@ Discussion on our GitHub Discussions board: https://github.com/LaWebcapsule/dire ### Document the Project -The [Directus Docs](https://github.com/directus/docs) are living documents that can always be improved on. Notice any +The [d9 Docs](https://github.com/LaWebcapsule/directus9/tree/docs-d9/docs) are living documents that can always be improved on. Notice any parts of the docs in dire need of some tender love and care? Feel free to open a Pull Request! ### Helping Others -The Directus community is growing quickly, which also means there's more and more people that have questions. Helping -out your fellow developers by answering questions on [Discord](https://directus.chat) or +The d9 community is growing quickly, which also means there's more and more people that have questions. Helping +out your fellow developers by answering questions on [GitHub Discussions](https://github.com/LaWebcapsule/directus9/discussions/categories/q-a) is a great way to help the project. @@ -81,9 +81,9 @@ have been triaged, accepted, and are ready to be implemented. #### Implementing Features -With the continuous growth of Directus, more and more people are relying on Directus for (critical) data workloads in -various use cases. This means we need to be careful with any changes that might affect the stability, security, -performance, or scalability of Directus. For this reason, it's important that any new feature is properly thought +With the continuous growth of d9, more and more people are relying on d9 for (critical) data workloads in +various use cases. This means we need to be careful with any changes that might affect the stability, +performance, or scalability of d9. For this reason, it's important that any new feature is properly thought through and discussed before being implemented. Before you start writing code to implement your new feature idea, please read through and understand our triaging @@ -96,8 +96,7 @@ Feature Request Discussions that are deemed ready to be implemented with the dis "Accepted" and converted into an Issue, at which point the feature is ready to be implemented. New feature ideas reported directly to issues might be converted into a Discussion for further triaging at -[the core team](https://github.com/orgs/directus/people)'s discretion first. This is often due to a lack of detail, or -lack of proven interest. +the core team's discretion first. This is often due to a lack of detail, or lack of proven interest. Each Pull Request that comes in is required to resolve [an open Issue](https://github.com/LaWebcapsule/directus9/issues) that is labeled "Bug", "Improvement", or "New Feature". This ensures that any code change made implements a known @@ -105,13 +104,13 @@ actionable item, be it a feature or otherwise. ### Reporting Security Vulnerabilities -If you believe you have discovered a security issue within a Directus product or service, please reach out to us -directly over email: [security@directus.io](mailto:security@directus.io). We will then open a +If you believe you have discovered a security issue within a d9 product or service, please reach out to us +directly over email: [support@webcapsule.io](mailto:support@webcapsule.io). We will then open a [GitHub Security Advisory](https://github.com/LaWebcapsule/directus9/security/advisories) for tracking the fix. We value the members of the independent security research community who find security vulnerabilities and work with our team so that proper fixes can be issued to users. Our policy is to credit all researchers in the fix's release notes. In order to receive credit, security researchers must follow responsible disclosure practices, including: -- They do not publish the vulnerability prior to the Directus team releasing a fix for it +- They do not publish the vulnerability prior to the d9 team releasing a fix for it - They do not divulge exact details of the issue, e.g., through exploits or proof-of-concepts diff --git a/directus/readme.md b/directus/readme.md index 9f9ab00e11..128ac8001c 100644 --- a/directus/readme.md +++ b/directus/readme.md @@ -1,30 +1,19 @@

 

-
Logo +d9 Logo

 

-**This repository is a fork of the Directus 9. Directus 9 was under GPLv3 license and so is this repository. As Directus -10 is now a premium open-source software, this repository aims to maintain a standard openSource version of -Directus 9. This repository is not bound to the directus core team.** - -## Scope of the fork - -Our main goal with this repository is to release security updates and some fixes of the directus 9 version. All -contributions are welcome. - -:exclamation: :construction_worker: The documentation is provided in the state it was for the directus 9 version and has -link toward the directus platform. However the directus platform is now in v10 and the informations you can find there -may not be reliable for the v9. +**d9 is an open-source fork of Directus 9 (GPLv3), maintained independently by [La Webcapsule](https://github.com/LaWebcapsule). This repository is not affiliated with the Directus core team.** ## Introduction -**Directus 9 is a free and open-source data platform for headless content management**. It can be installed on top of +**d9 is a free and open-source data platform for headless content management**. It can be installed on top of any new or existing SQL database, instantly providing a dynamic API (REST+GraphQL) and accompanying App for managing -content. Built entirely in TypeScript (in Node and Vue), Directus is completely modular and end-to-end extensible... +content. Built entirely in TypeScript (in Node and Vue), d9 is completely modular and end-to-end extensible... with absolutely no paywalls or artificial limitations. -Modern and intuitive, the Directus App enables no-code data discovery, allowing for even the most non-technical users to +Modern and intuitive, the d9 App enables no-code data discovery, allowing for even the most non-technical users to view, author, and manage your raw database content. Our performant and flexible API is able to adapt to any relational schema, and includes rule-based permissions, event/web hooks, custom endpoints, numerous auth options, configurable storage adapters, and much more. @@ -35,24 +24,15 @@ Aurora/Redshift or Google Cloud Platform SQL. Learn more at... - [GitHub](https://github.com/LaWebcapsule/directus9) - -**All the following links are for Directus v10 ; contribution are welcome to make specific documentation for the -Directus 9** - -- [Website](https://directus.io/) -- [Documentation](https://docs.directus.io/) -- [Community](https://directus.chat/) -- [Twitter](https://twitter.com/directus) -- [Cloud](https://directus.cloud/) -- [Marketplace](https://directus.market/) +- [Documentation](https://docs.d9.dev)

 

## Installing -Directus requires NodeJS 10+. +d9 requires NodeJS 18+. -Install Directus9 : +Install d9: ``` npm install @wbce-d9/directus9 @@ -77,7 +57,7 @@ creation of your first admin user. ## Updating -To update an existing Directus project, navigate to your project directory and run: +To update an existing d9 project, navigate to your project directory and run: ``` npm update @@ -87,7 +67,7 @@ npm update ## Migrating from directus@9.0.0^ to @wbce-d9@9.0.0^ -You need to change your dependencies : +You need to change your dependencies: 1. In package.json @@ -96,27 +76,27 @@ You need to change your dependencies : "@directus/some-package" --> "@wbce-d9/some-package" ``` -2. Update your dependencies : +2. Update your dependencies: ``` npm update ``` -3. If you have some code : +3. If you have some code: ```ts import {...} from "directus" import {...} from "@directus/some-package" ``` -should become : +should become: ```ts import {...} from "@wbce-d9/directus9" import {...} from "@wbce-d9/some-package" ``` -4. You don't have to do any changes to your databases. Directus9 use the same schema as directus@9.0.0^. As a +4. You don't have to do any changes to your databases. d9 uses the same schema as directus@9.0.0^. As a consequence, you don't need other changes than the three steps below. ## Contributing @@ -124,23 +104,12 @@ import {...} from "@wbce-d9/some-package" Please report any and all issues [on our GitHub](https://github.com/LaWebcapsule/directus9/issues/new). Pull-requests are more than welcome, and always appreciated. Please be sure to read our -[Contributors Guide](https://docs.directus.io/contributing/introduction/) before starting work on a new feature/fix, or -reach out a member of the Core Team via [GitHub](https://github.com/LaWebcapsule/directus9/discussions) or -[Discord](https://directus.chat) with any questions. - -

 

- -## Supporting - -This is a fork of directus9. We welcome contribution and no support is asked. +[Contributors Guide](https://docs.d9.dev/contributing/introduction/) before starting work on a new feature/fix, or +reach out via [GitHub Discussions](https://github.com/LaWebcapsule/directus9/discussions) with any questions.

 

## License -Directus is released under the [GPLv3 license](./license). Monospace Inc owns all Directus trademarks, logos, and -intellectual property on behalf of our project's community. Copyright © 2004-2020, Monospace Inc. - -**This repository is a fork of the Directus 9. Directus 9 was under GPLv3 license and so is this repository. As Directus -10 is now a premium open-source software, this repository aims to maintain a standard openSource version of -Directus 9. This repository is not bound to the directus core team.** +d9 is released under the [GPLv3 license](./license). This repository is a fork of Directus 9, which was released under GPLv3 by Monospace Inc. +d9 is an independent project maintained by La Webcapsule. diff --git a/docs/.vitepress/components/ArticleFeedback.vue b/docs/.vitepress/components/ArticleFeedback.vue index 26e91ce371..772d845efe 100644 --- a/docs/.vitepress/components/ArticleFeedback.vue +++ b/docs/.vitepress/components/ArticleFeedback.vue @@ -30,7 +30,7 @@ const prompts = [ 'Make it count', 'Leave some feedback', 'Help us improve', - `We're all ears 🐰`, + `We're all ears ☄️`, 'Tell us what is missing', 'Your thoughts matter to us', 'Feedback is a gift', diff --git a/docs/.vitepress/config.js b/docs/.vitepress/config.js index ae4905f26a..3d36b4e0f2 100644 --- a/docs/.vitepress/config.js +++ b/docs/.vitepress/config.js @@ -5,26 +5,15 @@ import { URLS, EMAILS } from './constants.js'; function markdownVariablesPlugin() { const replacements = { '{{WEBSITE_URL}}': URLS.WEBSITE, - '{{CLOUD_URL}}': URLS.CLOUD, '{{DOCS_URL}}': URLS.DOCS, - '{{CDN_URL}}': URLS.CDN, '{{GITHUB_URL}}': URLS.GITHUB, '{{GITHUB_DIRECTUS_URL}}': URLS.GITHUB_DIRECTUS, '{{GITHUB_COMMUNITY_URL}}': URLS.GITHUB_COMMUNITY, '{{LOCALES_URL}}': URLS.LOCALES, - '{{TWITTER_URL}}': URLS.TWITTER, - '{{DISCORD_CHAT_URL}}': URLS.DISCORD_CHAT, - '{{DISCORD_INVITE_URL}}': URLS.DISCORD_INVITE, - '{{AWESOME_URL}}': URLS.AWESOME, - '{{YOUTUBE_URL}}': URLS.YOUTUBE, '{{EXAMPLE_URL}}': URLS.EXAMPLE, '{{LDAP_URL}}': URLS.LDAP, '{{NPM_URL}}': URLS.NPM, '{{DOCKER_HUB_URL}}': URLS.DOCKER_HUB, - '{{G2_REVIEWS_URL}}': URLS.G2_REVIEWS, - '{{CAPTERRA_URL}}': URLS.CAPTERRA, - '{{TRUSTRADIUS_URL}}': URLS.TRUSTRADIUS, - '{{PRODUCTHUNT_URL}}': URLS.PRODUCTHUNT, '{{SECURITY_EMAIL}}': EMAILS.SECURITY, '{{INFO_EMAIL}}': EMAILS.INFO, '{{SUPPORT_EMAIL}}': EMAILS.SUPPORT, @@ -52,8 +41,8 @@ function markdownVariablesPlugin() { export default defineConfig({ base: '/', lang: 'en-US', - title: 'Directus Docs', - description: 'Directus. An Instant App & API for your SQL Database.', + title: 'd9 Docs', + description: 'd9 — Open Data Platform. An Instant App & API for your SQL Database.', ignoreDeadLinks: true, vite: { plugins: [markdownVariablesPlugin()], @@ -65,52 +54,6 @@ export default defineConfig({ }, }, head: [ - [ - 'script', - { - type: 'text/javascript', - async: true, - defer: true, - src: 'https://js-na1.hs-scripts.com/20534155.js', - }, - ], - [ - 'script', - { - type: 'text/javascript', - async: true, - src: 'https://ws.zoominfo.com/pixel/636535e8d10f825332bbd795', - 'referrer-policy': 'unsafe-url', - }, - ], - [ - 'script', - { - type: 'text/javascript', - async: true, - defer: false, - src: 'https://www.googletagmanager.com/gtag/js?id=UA-24637628-7', - }, - ], - [ - 'script', - {}, - `(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': - new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], - j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= - 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); - })(window,document,'script','dataLayer','GTM-PTLT3GH');`, - ], - [ - 'script', - {}, - `window.dataLayer = window.dataLayer || []; -function gtag(){dataLayer.push(arguments);} -gtag('js', new Date()); - -gtag('config', 'UA-24637628-7'); - `, - ], ['link', { rel: 'shortcut icon', type: 'image/svg+xml', href: '/favicon.svg' }], [ 'link', @@ -179,9 +122,6 @@ gtag('config', 'UA-24637628-7'); }, nav: [ { text: 'Docs', link: '/' }, - // { text: 'Cookbook', link: '/cookbook/add-a-recipe', activeMatch: '/cookbook/' }, - { text: 'Website', link: URLS.WEBSITE }, - { text: 'Cloud', link: URLS.CLOUD }, { text: 'GitHub', link: URLS.GITHUB }, ], algolia: { @@ -190,7 +130,6 @@ gtag('config', 'UA-24637628-7'); indexName: 'directus', }, sidebar: { - // '/cookbook/': sidebarCookbooks(), '/': sidebar(), }, editLink: { @@ -221,7 +160,7 @@ function sidebar() { link: '/getting-started/support', }, { - text: 'Backing Directus', + text: 'Supporting d9', link: '/getting-started/backing-directus', }, { diff --git a/docs/.vitepress/constants.js b/docs/.vitepress/constants.js index c7d729426e..1ad2635070 100644 --- a/docs/.vitepress/constants.js +++ b/docs/.vitepress/constants.js @@ -1,29 +1,18 @@ export const URLS = { - WEBSITE: 'https://directus.io/', - CLOUD: 'https://directus.cloud', - DOCS: 'https://docs.directus.io', - CDN: 'https://cdn.directus.io', + WEBSITE: 'https://d9.dev/', + DOCS: 'https://docs.d9.dev', GITHUB: 'https://github.com/LaWebcapsule/directus9', - GITHUB_DIRECTUS: 'https://github.com/directus', - GITHUB_COMMUNITY: 'https://github.com/directus-community', + GITHUB_DIRECTUS: 'https://github.com/LaWebcapsule', + GITHUB_COMMUNITY: 'https://github.com/LaWebcapsule/directus9/discussions', LOCALES: 'https://locales.directus.io', - TWITTER: 'https://twitter.com/directus', - DISCORD_CHAT: 'https://directus.chat', - DISCORD_INVITE: 'https://discord.com/invite/directus', - AWESOME: 'https://github.com/directus-community/awesome-directus', - YOUTUBE: 'https://www.youtube.com/c/DirectusVideos', EXAMPLE: 'https://example.directus.io', LDAP: 'ldap://ldap.directus.io', - NPM: 'https://www.npmjs.com/package/directus', - DOCKER_HUB: 'https://hub.docker.com/r/directus/directus', - G2_REVIEWS: 'https://www.g2.com/products/directus/reviews', - CAPTERRA: 'https://www.capterra.com/p/156619/Directus', - TRUSTRADIUS: 'https://www.trustradius.com/products/directus/reviews', - PRODUCTHUNT: 'https://www.producthunt.com/posts/directus-9', + NPM: 'https://www.npmjs.com/package/@wbce-d9/directus9', + DOCKER_HUB: 'https://github.com/LaWebcapsule/directus9/pkgs/container/directus9', }; export const EMAILS = { - SECURITY: 'security@directus.io', - INFO: 'info@directus.io', - SUPPORT: 'support@directus.io', + SECURITY: 'support@webcapsule.io', + INFO: 'support@webcapsule.io', + SUPPORT: 'support@webcapsule.io', }; diff --git a/docs/.vitepress/theme/overrides.css b/docs/.vitepress/theme/overrides.css index 2eac325789..89a2b032f6 100644 --- a/docs/.vitepress/theme/overrides.css +++ b/docs/.vitepress/theme/overrides.css @@ -23,10 +23,15 @@ } /** - * Make logo size of the sidebar + * Logo sizing * -------------------------------------------------------------------------- */ .VPNav .VPNavBar .VPNavBarTitle .logo { - height: unset; + height: 36px; + width: auto; +} +.VPSidebar .VPSidebarNav .logo { + height: 36px; + width: auto; } /** diff --git a/docs/app/activity-log.md b/docs/app/activity-log.md index 28905f66e5..6a17c6d946 100644 --- a/docs/app/activity-log.md +++ b/docs/app/activity-log.md @@ -25,11 +25,8 @@ To manage the Activity Log programmatically, please see our guide on the ## Overview - -The Activity Log is the only Module in Directus Core that is not found in the [Module Bar](/app/overview#_1-module-bar). +The Activity Log is the only Module in d9 Core that is not found in the [Module Bar](/app/overview#_1-module-bar). Instead, it is accessed via the notifications tray of the [Sidebar](/app/overview#_4-sidebar). The Activity Log page has the same features and functionality as the [Collection Page](/app/content/collections). @@ -49,7 +46,7 @@ please see [Revert an Item](/app/content/items#revert-an-item). ## View an Activity Log Item -![Activity Log Default Fields]({{CDN_URL}}/docs/v9/configuration/activity-log/activity-log-20220816/activity-log-default-fields-20220816A.webp) +![Activity Log Default Fields](/images/activity-log-default-fields-20220816A.webp) Click any item in the Activity Log and a side drawer will open, displaying its logged details. The following information is stored for each item. @@ -65,18 +62,12 @@ is stored for each item. ## Filter by Activity - In addition to the filter and display functionality inherited from the [Collection Page](/app/content/collections), you can also filter items by activity from the Navigation Bar. ## Modify an Activity - To ensure proper accountability, system collections are **read only** by design. However, users with an Admin role have the ability to reopen, view, and modify an item's values in activities from non-system collections (where the name does diff --git a/docs/app/content.md b/docs/app/content.md index 8a41caef2a..a25a8cd77e 100644 --- a/docs/app/content.md +++ b/docs/app/content.md @@ -27,7 +27,7 @@ Link to tutorial ## Collection Page -![Collection Overview]({{CDN_URL}}/docs/v9/app-guide/content/content/content-20220415A/collection-page-20220415A.webp) +![Collection Overview](/images/collection-page-20220415A.webp) The Content Module consists of Collection Pages and Item Pages. Use the Navigation Bar on the left to move between Collections. Each Collection Page displays all Items in its Collection and comes with highly configurable @@ -45,7 +45,7 @@ results in changes to the data model. To learn more, see our guide on ## Item Page -![Article Overview]({{CDN_URL}}/docs/v9/app-guide/content/content/content-20220415A/item-page-20220215A.webp) +![Article Overview](/images/item-page-20220215A.webp) When you click an Item on the Collection page, its Item Page will open. The Item Page is a form that enables you to view, edit or delete an Item and its field values. You can also comment on, share, archive, or revert an Item from this @@ -53,9 +53,6 @@ form. To learn more, see our guide on the [Item Page](/app/content/items). ## Shares - In any project, certain Collections will have limited access permissions. In some cases, you may need to share one of the Items within the collection with an individual or group of individuals who don't yet have permission. In this case, diff --git a/docs/app/content/collections.md b/docs/app/content/collections.md index e908417254..91da70eb9c 100644 --- a/docs/app/content/collections.md +++ b/docs/app/content/collections.md @@ -24,9 +24,6 @@ Link to tutorial ## Toggle Hidden Collections - Some projects may have dozens or even hundreds of collections, which can be overwhelming to sort through. To ease this problem, Admins can choose to @@ -47,9 +44,6 @@ like to block users' access permissions, please see ## Adjust Page Layout - Layouts determine how you view or interact with Items in a Collection. Whether your Collection contains blog posts, project management tasks, geo-coordinates, temporal data or beyond; Layouts present Items in a more human-friendly way. @@ -57,9 +51,6 @@ project management tasks, geo-coordinates, temporal data or beyond; Layouts pres ## Search Items - Find all Items with one or more Fields containing your searched value, excluding any Items which have been [filtered out](#filter-items). To search through a Collection's Items, follow these steps. @@ -70,9 +61,6 @@ Find all Items with one or more Fields containing your searched value, excluding ## Filter Items - Filters allow you to conditionally select Items from a Collection. Use-cases include customizing Item search results, restricting Item access permissions for specific Users or Roles, building dashboard analytics with the Insights module, @@ -80,9 +68,6 @@ and more. To Learn More, see our guide on [Filters](/app/filters). ## Manually Sort Items - Drag and drop Items to custom sort them as desired. This is only possible on certain Layouts, such as the default [Table Layout](/app/layouts#table-layout). To sort a Collection's Items, follow these steps. @@ -111,9 +96,6 @@ This means that while the values in this Sort Field do get updated and modified, ## Automatically Sort Items - Sort Items alphabetically or numerically, in ascending or descending order. Sorting is not possible on certain Layouts, such as the Map Layout. Layouts that do support automatic sorting have controls in slightly different locations. To @@ -127,9 +109,6 @@ Automatic sorting is a non-destructive action which does not change your data. ## View Archived Items - The no-code app allows you to hide archived Items, display them alongside other Items, or display archived Items only. To learn how to archive an Item, see our guide on the [Item Page](/app/content/items#archive-an-item). To change whether @@ -150,9 +129,6 @@ Only available if an [Archive field](/configuration/data-model/collections#archi ## Create a Bookmark - Save how a Collection Page looks so that you can return to the exact same view later. This includes details such as the Layout, search queries, filters, custom sort & order, etc. To create a Bookmark from the Collection Page, follow these @@ -173,7 +149,7 @@ To learn more, see our guide on [Presets and Bookmarks](/configuration/presets-b ## Import / Export Items -![Import and Export Items]({{CDN_URL}}/docs/v9/app-guide/content/content-collections/content-collections-20220415A/imports-exports-20220416A.webp) +![Import and Export Items](/images/imports-exports-20220416A.webp) The Content, User Directory and File Library modules allow importing and exporting of multiple Items stored as files. This makes it quick and easy to handle tasks like uploading and downloading new customer information; pulling down sales @@ -182,10 +158,7 @@ data for transformation, reports, analysis, and beyond. To learn more, see how t ## Batch Delete, Archive or Edit Items - It is possible to delete, archive, or edit multiple Items at once from the Collection Page. Deletion will permanently delete Items from the database, this cannot be reverted. When batch editing, the Item Page opens, allowing you to make diff --git a/docs/app/content/items.md b/docs/app/content/items.md index 2eb17bbee7..0adec9aff1 100644 --- a/docs/app/content/items.md +++ b/docs/app/content/items.md @@ -27,9 +27,6 @@ Add links once "archive item" is created ## Create an Item - To create an Item, follow these steps. @@ -47,9 +44,6 @@ model settings, the App will skip step two above and automatically open the Item ## Edit an Item - To edit an Item's field values, follow these steps. @@ -79,9 +73,6 @@ automatically open the Item Page. ## Advanced Save Options - To do an advanced save when you create or edit an item, follow these steps. @@ -95,9 +86,6 @@ To do an advanced save when you create or edit an item, follow these steps. ## Archive an Item - To archive an Item, follow these steps. @@ -115,11 +103,8 @@ model settings. ## Revert an Item - -As you update Field Values on Items, Directus saves these [Revisions](/getting-started/glossary#revisions), and they can +As you update Field Values on Items, d9 saves these [Revisions](/getting-started/glossary#revisions), and they can be compared side-by-side to the current state. To revert an Item, follow these steps. 1. Navigate to the Content Module and select the desired Collection. @@ -145,9 +130,6 @@ You can also revert Items [programmatically via the API](/reference/system/revis ## Comment on an Item - Comments is a collaborative tool that are left on an Item in the sidebar and remain there for you and other team members to view. To create a comment, follow these steps. @@ -175,9 +157,6 @@ to delete the comment. ## Delete an Item - To delete an Item, follow these steps. diff --git a/docs/app/content/shares.md b/docs/app/content/shares.md index af9bccd1ee..7d092efb7c 100644 --- a/docs/app/content/shares.md +++ b/docs/app/content/shares.md @@ -3,10 +3,6 @@ > The Shares utility enables you to share an Item with anyone, regardless of their permissions, even if they are not > users within the project. - @@ -79,7 +79,7 @@ tables are further broken down into columns and rows. ### Columns -![A Column]({{CDN_URL}}/docs/v9/configuration/data-model/data-model-20220805/columns-20220805A.webp) +![A Column](/images/columns-20220805A.webp) Columns are categories that store one kind of information. Each column has a unique, descriptive name and stores one unit of information in each of its [cell values](#cell-values). Columns keep the data organized, consistent, and easily @@ -89,7 +89,7 @@ accessible. The columns you choose to add to a data table will completely depend ### Cell Values -![Cell Values]({{CDN_URL}}/docs/v9/configuration/data-model/data-model-20220805/datatable-cell-value-20220805A.webp) +![Cell Values](/images/datatable-cell-value-20220805A.webp) Each value in a column is stored in its own cell. In general, you want to create columns that save _atomic_ values. That means create the column to store the smallest indivisible units There is no restriction for the kinds of information to @@ -115,14 +115,14 @@ unexpected and even dangerous behaviors in your program. ### Rows -![Rows]({{CDN_URL}}/docs/v9/configuration/data-model/data-model-20220805/row-20220805A.webp) +![Rows](/images/row-20220805A.webp) Each row stores data associated to a unique record, event, object, entity, observation, etc. Data tables can contain millions, _even billions and trillions_ of rows of data. ### Primary Keys -![Primary Key]({{CDN_URL}}/docs/v9/configuration/data-model/data-model-20220805/primary-keys-20220805A.webp) +![Primary Key](/images/primary-keys-20220805A.webp) In order to uniquely identify and track each row, every data table must have a primary key column. A primary key is a unique ID that identifies a specific row. Any pattern or system could be used to generate primary keys, so long as it @@ -132,7 +132,7 @@ differentiate it from other rows. ### Foreign Keys -![Foreign Keys]({{CDN_URL}}/docs/v9/configuration/data-model/data-model-20220805/foreign-keys-20220805A.webp) +![Foreign Keys](/images/foreign-keys-20220805A.webp) Since primary keys uniquely identify each and every row in a data table, they are the perfect tool to create relationships. If you want to relationally link rows between two data tables, you create a column to store _foreign @@ -163,12 +163,12 @@ There are several ways you can relationally link tables: M2M relationships, M2As require a junction data table as well as an additional column on the junction table to store the related tables' names. -To learn more about how these relationships work conceptually, as well as how they are handled within Directus, see our +To learn more about how these relationships work conceptually, as well as how they are handled within d9, see our guide on [relationships](/configuration/data-model/relationships). ### Database Schemas -![Data Table to schema]({{CDN_URL}}/docs/v9/configuration/data-model/data-model-20220805/datatable-to-schema-20220805A.webp) +![Data Table to schema](/images/datatable-to-schema-20220805A.webp) In our examples so far, we have seen and described actual [data tables](#data-tables). As you design your relational data model, you will need to create a schema to keep track of its complexity. @@ -205,7 +205,7 @@ irrelevant to the current learning point, we omit their details so you can focus Please note too, that with more complex schemas, containing dozens _(or maybe hundreds!)_ of relationally linked data tables, you usually include datatype information as well as a visualization of how each and every table interlinks. -![A Complex Schema]({{CDN_URL}}/docs/v9/configuration/data-model/data-model-20220805/complex-schema.webp) +![A Complex Schema](/images/complex-schema.webp) ### Avoid Data Duplication @@ -245,7 +245,7 @@ data is displayed on each user profile page, for chat messaging and other types situation in many projects_. In this case, the author name and other details would also need to exist in the `users` table. -![Duplicate Data]({{CDN_URL}}/docs/v9/configuration/data-model/data-model-20220805/duplicate-data-20220829A.webp) +![Duplicate Data](/images/duplicate-data-20220829A.webp) This creates duplicate data. There are two big problems with this: @@ -315,7 +315,7 @@ between `blog` and `users`. ### Working With Relational Data Models -![Database, Backend, Frontend]({{CDN_URL}}/docs/v9/configuration/data-model/data-model-20220805/database-backend-frontend-20220805A.webp) +![Database, Backend, Frontend](/images/database-backend-frontend-20220805A.webp) Once you've designed your data model conceptually, you typically build and interact with it using SQL, or Structured Querying Language. This language is used to create, read & query, update, and delete anything and everything in the @@ -346,14 +346,11 @@ Therefore, developers need to build front-ends with polished UIs and custom disp human-friendly. However, even for developers with strong SQL database skills, building out APIs and GUIs to build and manage a data model is time consuming. -## Data Models in Directus +## Data Models in d9 - -All relational data model concepts listed above apply in Directus. You get complete, un-opinionated, relational data -model design and configuration. The difference is that Directus handles all SQL, builds the API, and provides a Data +All relational data model concepts listed above apply in d9. You get complete, un-opinionated, relational data +model design and configuration. The difference is that d9 handles all SQL, builds the API, and provides a Data Studio which lets business users work with data in a human-friendly way. The Data Studio also offers features and functionalities to display and interact with your data intuitively. Once your @@ -370,16 +367,13 @@ You have the power to do the following things, without a line of code or SQL: - Configure how data is interacted with by users in the Data Studio. - Translate any and all text in the Data Studio into any language. -Directus replaces traditional relational database jargon with more user-friendly terms and concepts. Please keep in mind -that while traditional relational database jargon strictly encompasses database concepts, some of the new Directus terms +d9 replaces traditional relational database jargon with more user-friendly terms and concepts. Please keep in mind +that while traditional relational database jargon strictly encompasses database concepts, some of the new d9 terms encompass these relational database concepts _plus display and interaction logic_. The following sections will introduce -Directus terms and map them to classic relational database concepts. +d9 terms and map them to classic relational database concepts. ## Collections - A collection _is a set of [items](#items)_. This can be a 1-1 match-up with a data table in SQL, a group of other collections, or a readonly view. @@ -390,23 +384,17 @@ Data Model**. From there, click a collection to open its configurations page. To ## Fields - Fields are database columns, but with a twist. Remember, SQL database columns store pure, raw data. From there, developers build out custom logic and UIs to determine -how this data is displayed and interacted with. In Directus, fields encompass column configurations, as well as custom -configuration over how to the data is displayed and interacted with in the Data Studio. Directus also has +how this data is displayed and interacted with. In d9, fields encompass column configurations, as well as custom +configuration over how to the data is displayed and interacted with in the Data Studio. d9 also has [alias fields](/getting-started/glossary#alias), which are virtual and do not match directly to a column. To learn more, see our guide on [fields](/configuration/data-model/fields/). ## Items - Items are data table rows, but with a twist. @@ -420,17 +408,14 @@ You access items from other app modules, such as [Content](/app/content), [User ## Data Type Superset -Directus abstracts type differences between SQL vendors with a +d9 abstracts type differences between SQL vendors with a [Data Type Superset](/getting-started/glossary#data-type-superset). ## Keys and IDs - -Primary keys are called IDs in Directus fairly frequently. When you -[create a collection](/configuration/data-model/collections#create-a-collection), you must add an `id` field. Directus +Primary keys are called IDs in d9 fairly frequently. When you +[create a collection](/configuration/data-model/collections#create-a-collection), you must add an `id` field. d9 supports the following types of IDs: - **Auto-Incremented Integer** — IDs increment `1`, `2`, `3` up to `2^31-1` or `2,147,483,647`. @@ -443,9 +428,6 @@ supports the following types of IDs: ## Relationships - -Directus supports all standard [types of relationships](#types-of-relationships), as well as a few more of its own +d9 supports all standard [types of relationships](#types-of-relationships), as well as a few more of its own compound types. To learn more, see our guide on [relationships](/configuration/data-model/relationships). diff --git a/docs/app/data-model/collections.md b/docs/app/data-model/collections.md index fb61f4b435..87768282be 100644 --- a/docs/app/data-model/collections.md +++ b/docs/app/data-model/collections.md @@ -19,21 +19,15 @@ API documentation ## Overview - Collections are data tables. Typically, you access items within a collection in the [Content Module](/app/content). ## System Collections - System collections store the data and configuration details required to power your project. -Since system collections store information that powers your Directus project. You cannot reconfigure system collections +Since system collections store information that powers your d9 project. You cannot reconfigure system collections or any of their default fields, as any reconfigurations would break your project. However, you _can_ create and configure new fields on a system collection. This lets you safely customize your data model as desired. @@ -42,7 +36,7 @@ each system collection is responsible for, as well as where to find relevant App | System Collection | Purpose | APP | API | | ----------------- | ------------------------------------------------------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------- | ------------------------------------------------ | -| Activity | Tracks and stores all events within Directus, giving full accountability over everything. | [Activity Log](/configuration/activity-log) | [Activity](/reference/system/activity) | +| Activity | Tracks and stores all events within d9, giving full accountability over everything. | [Activity Log](/configuration/activity-log) | [Activity](/reference/system/activity) | | Collections | Stores data table & configuration details each and every Collection. | [Collections](/configuration/data-model/collections) | [Collections](/reference/system/collections) | | Dashboards | Stores dashboard configuration details and all relationally linked panels. | [Insights](/app/insights) | **N/A** | | Fields | Stores configuration details for each field. | [Fields](/configuration/data-model/fields/) | [Fields](/reference/system/fields) | @@ -56,7 +50,7 @@ each system collection is responsible for, as well as where to find relevant App | Permissions | This stores the access permissions configured for roles. | [Users, Roles & Permissions](/configuration/users-roles-permissions) | [Permissions](/reference/system/permissions) | | Presets | This stores details for presets and bookmarks. | [Presents & Bookmarks](/configuration/presets-bookmarks) | [Presets](/reference/system/presets) | | Relations | This stores information about relationships between collections. | [Relationships](/configuration/data-model/relationships) | [Relations](/reference/system/relations) | -| Revisions | Revisions are changes/edits made to Items. Directus keeps track of edits made, so you're able to revert to a previous state at will. | [Revert an Item](/app/content/items#revert-an-item) | [Revisions](/reference/system/revisions) | +| Revisions | Revisions are changes/edits made to Items. d9 keeps track of edits made, so you're able to revert to a previous state at will. | [Revert an Item](/app/content/items#revert-an-item) | [Revisions](/reference/system/revisions) | | Roles | Stores information about each role created. | [Users, Roles, and Permissions](/configuration/users-roles-permissions) | [Roles](/reference/system/roles) | | Sessions | Stores information about each user session, for system purposes. | **N/A** | **N/A** | | Settings | Stores all configurations made within **Settings > Project Settings**. | [Project Settings](/configuration/project-settings) | [settings](/reference/system/settings) | @@ -66,10 +60,7 @@ each system collection is responsible for, as well as where to find relevant App ## Create a Collection - To create a collection, follow these steps. @@ -99,30 +90,27 @@ displayed with [Collection Naming Translations](#collection-setup). :::warning Composite Keys -Directus does not currently support composite keys. If your project uses composite keys, you will need to make an +d9 does not currently support composite keys. If your project uses composite keys, you will need to make an adjustment to the data model. ::: :::warning SQL Views -Directus does not currently support creation of virtual tables via SQL Views. +d9 does not currently support creation of virtual tables via SQL Views. ::: ::: tip Database Tables Remember, a collection is simply a database table. Therefore, you can import or create a table directly in the database -and it will automatically appear within your Directus project. The first time you manage that table, a +and it will automatically appear within your d9 project. The first time you manage that table, a `directus_collections` record will be created with default values. ::: ## Toggle Collection Visibility - To toggle whether a collection is hidden by default in the Content Module, follow these steps. @@ -140,9 +128,6 @@ Collections**. ## Create a Folder - Folders allow you to sub-nest and group how collections are displayed. This feature simply changes how the collections are displayed under **Settings > Data Model** and in the Content Module. It has no impact on the data model. To create a @@ -156,9 +141,6 @@ folder, follow these steps. ## Toggle Folder Display - To toggle folder display, follow these steps. @@ -170,9 +152,6 @@ To toggle folder display, follow these steps. ## Sort and Nest Collections - To sort and nest collections in **Settings > Data Model** and **Content Module**, follow these steps. @@ -182,9 +161,6 @@ To sort and nest collections in **Settings > Data Model** and **Content Module** ## Configure a Collection - To configure a collection, follow these steps. @@ -201,9 +177,6 @@ To configure a collection, follow these steps. ### Fields & Layout - This section allows you to create and configure fields, as well as configure how fields are displayed on the [Item Details Page](/app/content/items). To learn more, please see the documentation on @@ -211,9 +184,6 @@ This section allows you to create and configure fields, as well as configure how ### Collection Setup - These controls allow you to modify how the collection is displayed within the Content Module. @@ -235,7 +205,7 @@ These controls allow you to modify how the collection is displayed within the Co :::tip Collection Naming Translations -By default, Directus uses the [Title Formatter](/getting-started/glossary#title-formatter) to display collection keys as +By default, d9 uses the [Title Formatter](/getting-started/glossary#title-formatter) to display collection keys as human readable names, but you can also use translations to explicitly rename more technical table keys. ::: @@ -248,9 +218,6 @@ A collection that only contains one single item. For example, a website's **Abou ### Archive - Selects a field to handle archiving items. This provides a _soft-delete_ functionality for items in a collection. Archived items will still exist in the collection and database, but are filtered within the Data Studio. To configure an @@ -286,9 +253,6 @@ filtered out. This gives you the flexibility to manage archived items however yo ### Sort Field - The sort feature enables users to [manually sort Items](/app/content/collections#manually-sort-items) within the Data Studio. This is typically shown on the **Content Module > Collection Page**. It can also be used for sorting items @@ -330,11 +294,8 @@ You can also set this field to be **Hidden** so it doesn't show up within the It ### Accountability - -By default, your Directus Project tracks all [activity](/reference/system/activity) and +By default, your d9 Project tracks all [activity](/reference/system/activity) and [revisions](/reference/system/revisions) for collections. However, you can override this and choose what data is tracked. @@ -353,9 +314,6 @@ Accountability is a log of _who does what_ in your project. It is for your team' ### Duplication - The **Save as Copy** option on the Item Details Page offers a way to effectively duplicate the current item. Since there may be unique or relational data within the item, it's important to control exactly what will be copied. Duplication @@ -365,9 +323,6 @@ lets you configure which parent & relational field values will be copied when yo ## Delete a Collection - To delete a collection, follow these steps. diff --git a/docs/app/data-model/fields.md b/docs/app/data-model/fields.md index 5852a12b55..6c875d206a 100644 --- a/docs/app/data-model/fields.md +++ b/docs/app/data-model/fields.md @@ -6,9 +6,6 @@ ## Overview - To access a collection's fields, navigate to **Settings > Data Model > [Collection]**. From here, you can click a field to access its **Configuration Drawer** and make advanced configurations. You also have the following controls for each @@ -34,9 +31,6 @@ Context Menu** and **Field Configuration Drawer**, described below. ## Create a Field (Standard) - To make field configuration as intuitive and easy as possible, a template wizard is provided so that you can create fields pre-configured for common use-cases. When you create a field this way, you will still have full power to @@ -53,9 +47,6 @@ fields pre-configured for common use-cases. When you create a field this way, yo ## Create a Field (Advanced) - This field creation method opens the **Field Configuration Drawer** so you can customize every field detail from the start. To create a field in advanced mode, follow these steps. @@ -70,15 +61,12 @@ start. To create a field in advanced mode, follow these steps. ::: tip Database Columns Remember, a field is a database column. Therefore, you can create a column directly in the database and it will -automatically appear within Directus. You can then enhance the experience further by configuring it as desired. +automatically appear within d9. You can then enhance the experience further by configuring it as desired. ::: ## Configure a Field - Fields are configured in the **Field Configuration Drawer**, which is composed of eight sections. These provide extensive customization options, from the database column's details, to how it is displayed and interacted with, and @@ -107,9 +95,6 @@ create new fields within system collections. ## Duplicate a Field - To duplicate a field, follow these steps. @@ -133,9 +118,6 @@ field will not be copied. ## Toggle Field Visibility (for Admins) - For users with any _non-admin_ role, a field's visibility can be adjusted via [access permissions](/configuration/users-roles-permissions.md). However, you may want to hide certain fields for admins @@ -143,9 +125,6 @@ as well. This is handy if the field is distracting or has no need to be seen on ## Adjust Field Width - Adjusting the field width in **Fields and Layout** will change field width on the [Item Detail Page](/app/content#item-page). To adjust field width, follow these steps. @@ -158,9 +137,6 @@ Adjusting the field width in **Fields and Layout** will change field width on th ## Manually Sort Fields - Adjusting the field order in **Fields and Layout** will change its order on the [Item Page](/app/content/collections#item-page). To manually sort fields, click drag_indicator to @@ -168,9 +144,6 @@ drag and drop the field as desired. ## Delete a Field - To permanently delete a field and all its stored values, follow these steps. diff --git a/docs/app/data-model/fields/groups.md b/docs/app/data-model/fields/groups.md index 40fdea3d70..e2afbc1f77 100644 --- a/docs/app/data-model/fields/groups.md +++ b/docs/app/data-model/fields/groups.md @@ -4,7 +4,7 @@ ## Accordion -![An accordion interface that allows use to expand and collapse different fields.]({{CDN_URL}}/docs/v9/configuration/data-model/fields/interfaces-20230308/interface-accordion.webp) +![An accordion interface that allows use to expand and collapse different fields.](/images/interface-accordion.webp) Group interface that allows user to show and hide certain fields within the group by clicking on each field. @@ -13,9 +13,9 @@ Group interface that allows user to show and hide certain fields within the grou ## Detail Group -![A group of form fields that are currently hidden behind a toggle.]({{CDN_URL}}/docs/v9/configuration/data-model/fields/interfaces-20230308/interface-detailgroup-closed.webp) +![A group of form fields that are currently hidden behind a toggle.](/images/interface-detailgroup-closed.webp) -![A group of form fields that are currently visible but can be hidden behind a toggle.]({{CDN_URL}}/docs/v9/configuration/data-model/fields/interfaces-20230308/interface-detailgroup-open.webp) +![A group of form fields that are currently visible but can be hidden behind a toggle.](/images/interface-detailgroup-open.webp) Group interface that allows user to show or hide all fields within the group by clicking on the header toggle. @@ -25,7 +25,7 @@ Group interface that allows user to show or hide all fields within the group by ## Raw Group -![A group of form fields]({{CDN_URL}}/docs/v9/configuration/data-model/fields/interfaces-20230308/interface-rawgroup.webp) +![A group of form fields](/images/interface-rawgroup.webp) Interface that groups multiple fields together, but always displays them. @@ -36,4 +36,4 @@ Interface that groups multiple fields together, but always displays them. Any fields that you add within a Group will also maintain that grouping throughout the App Studio in filters, dropdowns, and more. -![Content collection interface that shows a highlighted dropdown with several different groups of fields.]({{CDN_URL}}/docs/v9/configuration/data-model/fields/interfaces-20230308/interface-group-filter.webp) +![Content collection interface that shows a highlighted dropdown with several different groups of fields.](/images/interface-group-filter.webp) diff --git a/docs/app/data-model/fields/other.md b/docs/app/data-model/fields/other.md index 6fa891cd62..c1844afb52 100644 --- a/docs/app/data-model/fields/other.md +++ b/docs/app/data-model/fields/other.md @@ -4,9 +4,9 @@ ## Hash -![Form text input. Value is "value to hash on save"]({{CDN_URL}}/docs/v9/configuration/data-model/fields/interfaces-20230308/interface-hash.webp) +![Form text input. Value is "value to hash on save"](/images/interface-hash.webp) -![Form text input that shows the value is securely hashed.]({{CDN_URL}}/docs/v9/configuration/data-model/fields/interfaces-20230308/interface-hash-secure.webp) +![Form text input that shows the value is securely hashed.](/images/interface-hash-secure.webp) Text input that allows users to hash the value on save. Both the API and SDK provide methods to [verify the hash]({{DOCS_URL}}/reference/system/utilities.html#verify-a-hash). @@ -17,7 +17,7 @@ Text input that allows users to hash the value on save. Both the API and SDK pro ## Slider -![A standard form text input]({{CDN_URL}}/docs/v9/configuration/data-model/fields/interfaces-20230308/interface-slider.webp) +![A standard form text input](/images/interface-slider.webp) Range input that allows users to select a number with an interactive slider. diff --git a/docs/app/data-model/fields/presentation.md b/docs/app/data-model/fields/presentation.md index 91a12791d1..6d8f6209b3 100644 --- a/docs/app/data-model/fields/presentation.md +++ b/docs/app/data-model/fields/presentation.md @@ -4,7 +4,7 @@ ## Divider -![A horizontal divider between two form fields]({{CDN_URL}}/docs/v9/configuration/data-model/fields/interfaces-20230308/interface-divider.webp) +![A horizontal divider between two form fields](/images/interface-divider.webp) A horizontal divider to separate fields into different sections. @@ -15,9 +15,9 @@ A horizontal divider to separate fields into different sections. ## Button Links -![A group of two buttons. One primary button. One default button.]({{CDN_URL}}/docs/v9/configuration/data-model/fields/interfaces-20230308/interface-buttonlinks.webp) +![A group of two buttons. One primary button. One default button.](/images/interface-buttonlinks.webp) -![A form for creating new Button Links. Form has four fields: "Label", "Icon", "Type", "URL"]({{CDN_URL}}/docs/v9/configuration/data-model/fields/interfaces-20230308/interface-buttonlinks-new.webp) +![A form for creating new Button Links. Form has four fields: "Label", "Icon", "Type", "URL"](/images/interface-buttonlinks-new.webp) Group of one or more buttons that link to a preset or dynamic url. @@ -30,7 +30,7 @@ Group of one or more buttons that link to a preset or dynamic url. ## Notice -![A standard warning notice in yellow with a hazard icon.]({{CDN_URL}}/docs/v9/configuration/data-model/fields/interfaces-20230308/interface-notice.webp) +![A standard warning notice in yellow with a hazard icon.](/images/interface-notice.webp) An alert or notice interface to notify users of important information. diff --git a/docs/app/data-model/fields/relational.md b/docs/app/data-model/fields/relational.md index a3196a4c20..4d2892f03a 100644 --- a/docs/app/data-model/fields/relational.md +++ b/docs/app/data-model/fields/relational.md @@ -6,7 +6,7 @@ ## File -![A file type form input where user can pick from three options: "Upload File From Device", "Choose Files from Library", "Import File from URL"]({{CDN_URL}}/docs/v9/configuration/data-model/fields/interfaces-20230308/interface-file.webp) +![A file type form input where user can pick from three options: "Upload File From Device", "Choose Files from Library", "Import File from URL"](/images/interface-file.webp) Interface that allows uses to upload a single file of any mime-type, choose an existing file from the [File Library](/app/file-library), or import a file from a URL. @@ -15,7 +15,7 @@ Interface that allows uses to upload a single file of any mime-type, choose an e ## Image -![A file type form input where user can pick from three options: "Upload File From Device", "Choose Files from Library", "Import File from URL"]({{CDN_URL}}/docs/v9/configuration/data-model/fields/interfaces-20230308/interface-image.webp) +![A file type form input where user can pick from three options: "Upload File From Device", "Choose Files from Library", "Import File from URL"](/images/interface-image.webp) Interface that allows uses to upload a single image file, choose an existing image from the [File Library](/app/file-library), or import an image from a URL. @@ -25,7 +25,7 @@ Interface that allows uses to upload a single image file, choose an existing ima ## Files -![A file type form input where user can select and upload multiple files.]({{CDN_URL}}/docs/v9/configuration/data-model/fields/interfaces-20230308/interface-files.webp) +![A file type form input where user can select and upload multiple files.](/images/interface-files.webp) Interface that allows uses to upload multiple files, choose an existing image from the [File Library](/app/file-library), or import an image from a URL. @@ -43,7 +43,7 @@ collection when added to the [Data Model](/configuration/data-model) for your ## Builder (M2A) -![A form interface that allows users to create a relationship from the current item by selecting different items from multiple, distinct Collections.]({{CDN_URL}}/docs/v9/configuration/data-model/fields/interfaces-20230308/interface-m2a.webp) +![A form interface that allows users to create a relationship from the current item by selecting different items from multiple, distinct Collections.](/images/interface-m2a.webp) Interface that allows users to create relationships between the current item and multiple items from multiple, distinct collections. See [Many-to-Any (M2A) Relationships](/configuration/data-model/relationships#many-to-any-m2a). @@ -58,7 +58,7 @@ Useful in many different contexts including ## Many To Many -![A form interface that allows users to select multiple different items from a single collection. Buttons for "Create New" and "Add Existing".]({{CDN_URL}}/docs/v9/configuration/data-model/fields/interfaces-20230308/interface-m2m.webp) +![A form interface that allows users to select multiple different items from a single collection. Buttons for "Create New" and "Add Existing".](/images/interface-m2m.webp) Interface that allows users to create relationships between the current item and many different items from a single collection. @@ -78,7 +78,7 @@ collection when added to the [Data Model](/configuration/data-model) for your ## One to Many -![A form interface that allows users to select multiple items from a single collection. Buttons for "Create New" and "Add Existing".]({{CDN_URL}}/docs/v9/configuration/data-model/fields/interfaces-20230308/interface-o2m.webp) +![A form interface that allows users to select multiple items from a single collection. Buttons for "Create New" and "Add Existing".](/images/interface-o2m.webp) Interface that allows users to create a relationship between the current item and many items from a single collection. @@ -96,7 +96,7 @@ Adding a One To Many field to the data model will create a corresponding Many to ## Tree View -![A form interface that shows multiple parent and child items from the same collection. Buttons for "Create New" and "Add Existing".]({{CDN_URL}}/docs/v9/configuration/data-model/fields/interfaces-20230308/interface-treeview.webp) +![A form interface that shows multiple parent and child items from the same collection. Buttons for "Create New" and "Add Existing".](/images/interface-treeview.webp) Special One-to-Many (O2M) interface that allows users to create and manage recursive relationships between items from the same collection. @@ -113,7 +113,7 @@ The Tree View interface is only available on self-referencing (recursive) relati ## Many to One -![A form interface that allows a user to select a single item from a collection."]({{CDN_URL}}/docs/v9/configuration/data-model/fields/interfaces-20230308/interface-m2o.webp) +![A form interface that allows a user to select a single item from a collection."](/images/interface-m2o.webp) Interface that allows users to create a relationship between the current item and a single item from a single collection. @@ -128,7 +128,7 @@ See [Many-to-One (M20) Relationships](/configuration/data-model/relationships#ma ## Translations -![A form interface with two columns and two fields per column - "Title" and "Content". One column contains the English translation for each field. Second column contains the French translation for each field.]({{CDN_URL}}/docs/v9/configuration/data-model/fields/interfaces-20230308/interface-translations.webp) +![A form interface with two columns and two fields per column - "Title" and "Content". One column contains the English translation for each field. Second column contains the French translation for each field.](/images/interface-translations.webp) Special relational Interface designed specifically to handle translations. See [Translations (O2M)](/configuration/data-model/relationships#translations-o2m). diff --git a/docs/app/data-model/fields/selection.md b/docs/app/data-model/fields/selection.md index 3ef1c36958..8bbcef4803 100644 --- a/docs/app/data-model/fields/selection.md +++ b/docs/app/data-model/fields/selection.md @@ -4,7 +4,7 @@ ## Toggle -![A toggle form input with label named "Enabled"]({{CDN_URL}}/docs/v9/configuration/data-model/fields/interfaces-20230308/interface-toggle.webp) +![A toggle form input with label named "Enabled"](/images/interface-toggle.webp) A checkbox input that allows user to toggle value between on and off / true and false. @@ -18,7 +18,7 @@ A checkbox input that allows user to toggle value between on and off / true and ## Datetime -![A date picker input. User can select a calendar date and input a time. ]({{CDN_URL}}/docs/v9/configuration/data-model/fields/interfaces-20230308/interface-datetime.webp) +![A date picker input. User can select a calendar date and input a time. ](/images/interface-datetime.webp) Date picker input that allows user to select a date and time. @@ -28,9 +28,9 @@ Date picker input that allows user to select a date and time. ## Repeater -![A standard form text input]({{CDN_URL}}/docs/v9/configuration/data-model/fields/interfaces-20230308/interface-repeater.webp) +![A standard form text input](/images/interface-repeater.webp) -![A standard form text input]({{CDN_URL}}/docs/v9/configuration/data-model/fields/interfaces-20230308/interface-repeater-open.webp) +![A standard form text input](/images/interface-repeater-open.webp) Interface for repeating groups of fields. @@ -56,7 +56,7 @@ Value is stored as a JSON array of objects. ## Map -![An interactive map interface that shows a single point on the east coast of the United States. Map has buttons for zoom, search, and full screen.]({{CDN_URL}}/docs/v9/configuration/data-model/fields/interfaces-20230308/interface-map.webp) +![An interactive map interface that shows a single point on the east coast of the United States. Map has buttons for zoom, search, and full screen.](/images/interface-map.webp) Interface that shows geospatial data on an interactive map. @@ -65,7 +65,7 @@ Interface that shows geospatial data on an interactive map. ## Color -![A text input for color hex codes that allows user to select color modes ]({{CDN_URL}}/docs/v9/configuration/data-model/fields/interfaces-20230308/interface-color.webp) +![A text input for color hex codes that allows user to select color modes ](/images/interface-color.webp) A color picker interface that allows users to input color codes and convert between different color modes. @@ -75,7 +75,7 @@ A color picker interface that allows users to input color codes and convert betw ## Dropdown -![A select input with a dropdown of options.]({{CDN_URL}}/docs/v9/configuration/data-model/fields/interfaces-20230308/interface-dropdown.webp) +![A select input with a dropdown of options.](/images/interface-dropdown.webp) Input that allows user to select a value from a list of options. @@ -90,7 +90,7 @@ Input that allows user to select a value from a list of options. ## Icon -![A select input with a dropdown grid of icon choices.]({{CDN_URL}}/docs/v9/configuration/data-model/fields/interfaces-20230308/interface-icon.webp) +![A select input with a dropdown grid of icon choices.](/images/interface-icon.webp) Search input that allows user to select from a list of icons. @@ -98,7 +98,7 @@ Search input that allows user to select from a list of icons. ## Checkboxes -![A form input with multiple checkboxes.]({{CDN_URL}}/docs/v9/configuration/data-model/fields/interfaces-20230308/interface-checkboxes.webp) +![A form input with multiple checkboxes.](/images/interface-checkboxes.webp) Input that allows user to select multiple checkboxes. @@ -114,7 +114,7 @@ Input that allows user to select multiple checkboxes. ## Checkboxes (Tree) -![A form input with a nested tree of multiple parent and child checkboxes.]({{CDN_URL}}/docs/v9/configuration/data-model/fields/interfaces-20230308/interface-checkboxes-tree.webp) +![A form input with a nested tree of multiple parent and child checkboxes.](/images/interface-checkboxes-tree.webp) Nested tree of checkboxes that can be expanded or collapsed. @@ -127,7 +127,7 @@ Nested tree of checkboxes that can be expanded or collapsed. ## Dropdown (Multiple) -![A select input where user can select multiple options from a dropdown.]({{CDN_URL}}/docs/v9/configuration/data-model/fields/interfaces-20230308/interface-dropdown-multiple.webp) +![A select input where user can select multiple options from a dropdown.](/images/interface-dropdown-multiple.webp) Input that allows user to select multiple values from a list of options. @@ -142,7 +142,7 @@ Input that allows user to select multiple values from a list of options. ## Radio Buttons -![A radio button form input with different options to select]({{CDN_URL}}/docs/v9/configuration/data-model/fields/interfaces-20230308/interface-radio-buttons.webp) +![A radio button form input with different options to select](/images/interface-radio-buttons.webp) Radio button input that allows users to select a single value from multiple choices. diff --git a/docs/app/data-model/fields/text-numbers.md b/docs/app/data-model/fields/text-numbers.md index 6848dfff48..c789932678 100644 --- a/docs/app/data-model/fields/text-numbers.md +++ b/docs/app/data-model/fields/text-numbers.md @@ -5,7 +5,7 @@ ## Input -![A standard form text input]({{CDN_URL}}/docs/v9/configuration/data-model/fields/interfaces-20230308/interface-input.webp) +![A standard form text input](/images/interface-input.webp) A standard form input. @@ -19,7 +19,7 @@ A standard form input. ## Autocomplete Input (API) -![An autocomplete form text input that shows a dropdown list of options based on a search query]({{CDN_URL}}/docs/v9/configuration/data-model/fields/interfaces-20230308/interface-autocomplete.webp) +![An autocomplete form text input that shows a dropdown list of options based on a search query](/images/interface-autocomplete.webp) A search input that will populate dropdown choices by making a request to a given URL. @@ -33,7 +33,7 @@ A search input that will populate dropdown choices by making a request to a give ## Code -![A code editor input]({{CDN_URL}}/docs/v9/configuration/data-model/fields/interfaces-20230308/interface-code.webp) +![A code editor input](/images/interface-code.webp) Code editor for pre-formatted text. @@ -46,7 +46,7 @@ Code editor for pre-formatted text. ## Textarea -![A standard form textarea input]({{CDN_URL}}/docs/v9/configuration/data-model/fields/interfaces-20230308/interface-textarea.webp) +![A standard form textarea input](/images/interface-textarea.webp) Textarea input for longer plain text. @@ -55,7 +55,7 @@ Textarea input for longer plain text. ## WYSIWYG -![A What You See Is What You Get (WYSIWYG) form input that has a toolbar for formatting]({{CDN_URL}}/docs/v9/configuration/data-model/fields/interfaces-20230308/interface-wysiwyg.webp) +![A What You See Is What You Get (WYSIWYG) form input that has a toolbar for formatting](/images/interface-wysiwyg.webp) The What You See Is What You Get (WYSIWYG) interface provides a text area with rich formatting options in the toolbar. @@ -71,7 +71,7 @@ The What You See Is What You Get (WYSIWYG) interface provides a text area with r ## Markdown -![A markdown text editor with a toolbar with formatting options. Edit and preview tabs.]({{CDN_URL}}/docs/v9/configuration/data-model/fields/interfaces-20230308/interface-markdown.webp) +![A markdown text editor with a toolbar with formatting options. Edit and preview tabs.](/images/interface-markdown.webp) Markdown text editor with formatting options in the toolbar. You can switch between Edit and Preview modes. @@ -86,7 +86,7 @@ Markdown text editor with formatting options in the toolbar. You can switch betw ## Tags -![A standard form text input where user can select, add, and remove tags.]({{CDN_URL}}/docs/v9/configuration/data-model/fields/interfaces-20230308/interface-tags.webp) +![A standard form text input where user can select, add, and remove tags.](/images/interface-tags.webp) A text input that allows users to apply any number of tags. When adding new tag, press Enter to save the tag. diff --git a/docs/app/data-model/relationships.md b/docs/app/data-model/relationships.md index e2b694a2a1..d171ae32cb 100644 --- a/docs/app/data-model/relationships.md +++ b/docs/app/data-model/relationships.md @@ -1,13 +1,13 @@ # Relationships -> Relationships are a crucial part of any relational database. Directus supports all standard relationship types, as +> Relationships are a crucial part of any relational database. d9 supports all standard relationship types, as > well as a few more of its own _compound_ types, which are custom-tailored to make certain _common but complex_ tasks a > breeze. :::tip Before You Begin Regardless of the relationship you want to configure, we recommend you read every section of this document, in order, at -least once. This is because you must understand how M2Os work in Directus to understand O2Ms, you must understand M2Os +least once. This is because you must understand how M2Os work in d9 to understand O2Ms, you must understand M2Os and O2Ms to understand M2Ms, etc. ::: @@ -15,26 +15,26 @@ and O2Ms to understand M2Ms, etc. ## Overview The Data Studio makes _the process_ of configuring relational data models easier, faster, and more intuitive by offering -no-code configuration. Directus _does not_ enforce opinionated schemas, rule systems, or other arbitrary limitations to +no-code configuration. d9 _does not_ enforce opinionated schemas, rule systems, or other arbitrary limitations to your data models. Therefore, aside from any technical limitations of your project's infrastructure or core requirements for any relational data model, _like having a primary key field for every collection or a data type assigned to every field,_ you are free to build the data model as you want. In this guide, we will go over the following topics: -- What kinds of relationships exist within Directus. +- What kinds of relationships exist within d9. - How to configure a desired relationship within the Data Studio. - How relationships are implemented in the data model and displayed in the Data Studio. - When it might be appropriate to use a given type of relationship. -By the end, you'll understand everything needed to start building data models in Directus, even if relational data model +By the end, you'll understand everything needed to start building data models in d9, even if relational data model concepts are a new concept to you. -### Directus vs Classic Data Model Terms +### d9 vs Classic Data Model Terms When we use classic data model terms, _such as data table, column, row, etc..._ this signals that the explanation is -focused strictly on what happens in the database. When Directus terminology is used, _such as collection, field, item, -etc..._ this signals that the explanation includes Directus logic and functionality. +focused strictly on what happens in the database. When d9 terminology is used, _such as collection, field, item, +etc..._ this signals that the explanation includes d9 logic and functionality. ## Many-to-One (M2O) @@ -49,7 +49,7 @@ To create an M2O relationship, we add a foreign key field to the parent collecti collection to items in the related collection. If we have two tables, `cities` and `countries`, we can create a `cities.country_id` foreign key field. -![Many-to-One Relational Diagram]({{CDN_URL}}/docs/v9/configuration/data-model/relationships/relations-20221026/m2o-20221026A.webp) +![Many-to-One Relational Diagram](/images/m2o-20221026A.webp) Let's take a look at the schema. @@ -69,11 +69,11 @@ countries Note the following things from the schema above: - An M2O relationship requires just one column within the parent table. -- When an M2O relational field is configured in Directus, an Item Page on the parent collection will enable access to +- When an M2O relational field is configured in d9, an Item Page on the parent collection will enable access to the item from the related collection. So in our example above, an Item Page in `cities` will enable access to the related country from the `countries` table. -However, in the Directus Data Studio, an M2O field does not automatically provide access to the parent collection's +However, in the d9 Data Studio, an M2O field does not automatically provide access to the parent collection's items within the related collection. In our example, this means that when you open an Item Page in `countries`, you will not see related cities. @@ -90,12 +90,12 @@ the template wizard. ## One-to-Many (O2M) Within a relational database, an O2M relationship is the exact same type of relationship as an M2O. Remember, at the end -of the [M2O](#many-to-one-m2o) section, we learned that configuring an M2O in Directus does not let us access related -items within an Item Page on the related collection. In Directus, configuring an O2M creates an +of the [M2O](#many-to-one-m2o) section, we learned that configuring an M2O in d9 does not let us access related +items within an Item Page on the related collection. In d9, configuring an O2M creates an [Alias](/getting-started/glossary#alias) field, which lets us access related items. To demonstrate this, let's continue with the `cities` and `countries` example relationship used in the M2O section. -![One-to-Many Relational Diagram]({{CDN_URL}}/docs/v9/configuration/data-model/relationships/relations-20221026/o2m-20221026A.webp) +![One-to-Many Relational Diagram](/images/o2m-20221026A.webp) Let's take a look at the schema. @@ -113,7 +113,7 @@ cities - country_id (the M2O field) ``` -Note the following points from the schema above. When we create an O2M in Directus: +Note the following points from the schema above. When we create an O2M in d9: - Since the perspective is flipped, we now consider `countries` to be the parent collection. - It isn't always necessary to create an O2M. In some cases, you won't want or need to access items from both sides. @@ -136,7 +136,7 @@ type from the template wizard. ## One-to-One (O2O) -Directus does not include a dedicated One-to-One (O2O) relationship type or Interface. However, in the database, O2O is +d9 does not include a dedicated One-to-One (O2O) relationship type or Interface. However, in the database, O2O is almost exactly the same as an M2O. The only difference is that an O2O enforces _cardinality_. In other words, one item from the parent collection can be linked with one item on the related collection, and vice-versa. @@ -148,11 +148,11 @@ of the capital city directly. But this would create [duplicate data](/configurat because the same city would exist in both `countries.capital_city` as well as `cities.name`. But remember, we want to _avoid duplicate data!_ -![Duplicate Data from Capital Cities]({{CDN_URL}}/docs/v9/configuration/data-model/relationships/relations-20221026/o2o-duplicate-20221026A.webp) +![Duplicate Data from Capital Cities](/images/o2o-duplicate-20221026A.webp) Instead, we want to use an O2O relationship. Let's try adding a `cities.capital_of` field. -![An inefficient One-to-One Relationship]({{CDN_URL}}/docs/v9/configuration/data-model/relationships/relations-20221026/o2o-inefficient-20221026A.webp) +![An inefficient One-to-One Relationship](/images/o2o-inefficient-20221026A.webp) Let's take a look at the schema. @@ -176,7 +176,7 @@ O2O onto. But in this case it is sub-optimal. Since _most cities_ are not capita `NULL` values. However, every single country has a capital city. So if we create the O2O on the `countries` collection, it will be much more efficient. -![A One-to-One Relationship]({{CDN_URL}}/docs/v9/configuration/data-model/relationships/relations-20221026/o2o-20221026A.webp) +![A One-to-One Relationship](/images/o2o-20221026A.webp) Let's take a look at the schema. @@ -195,11 +195,11 @@ cities - country_id ``` -Note the following points from the schema above. When we create an O2O in Directus: +Note the following points from the schema above. When we create an O2O in d9: - We can add the O2O field on either collection. However, in some cases it is more efficient to add it to a specific collection. -- Since the O2O field is really just an M2O field behind the scenes, and since Directus doesn't automatically display +- Since the O2O field is really just an M2O field behind the scenes, and since d9 doesn't automatically display M2O fields in the related collection, you may want to [configure an O2M field](#one-to-many-o2m) so that you can access items from the related collection as well. @@ -230,7 +230,7 @@ relationships between rows, no matter how many exist. To demonstrate this, let's think about the relationship between recipes and ingredients: a _recipe_ can have many _ingredients_, and _ingredients_ can be in many _recipes_. -![Many-to-Many Relational Diagram]({{CDN_URL}}/docs/v9/configuration/data-model/relationships/relationships-20220805/m2m-20220805A.webp) +![Many-to-Many Relational Diagram](/images/m2m-20220805A.webp) Let's take a look at the schema. @@ -255,11 +255,11 @@ ingredients - name ``` -Note the following points from the schema above. When we create an M2M in Directus: +Note the following points from the schema above. When we create an M2M in d9: - Our junction collection, `recipe_ingredients`, each row contains two foreign key columns. This is what creates the relationships between the two tables. -- Assuming the M2M alias field is created within the `recipes` collection, Directus does not automatically add a field +- Assuming the M2M alias field is created within the `recipes` collection, d9 does not automatically add a field to display recipes within the `ingredients` collection. However, you can configure an alias field within `ingredients` if desired: @@ -291,7 +291,7 @@ the template wizard. ## Many-to-Any (M2A) Sometimes called a _matrix field_ or _replicator_, an M2A relationship allows you to link items from the parent -collection to any item in any collection in the database. When you configure an M2A in Directus, an M2A +collection to any item in any collection in the database. When you configure an M2A in d9, an M2A [Alias](/getting-started/glossary#alias) field is created as well as a junction collection, like we saw on M2M relationships. The difference is that the junction collection on an M2A also has a field to store the **collection key** _(the name of the collection)_ for related collections. @@ -299,7 +299,7 @@ _(the name of the collection)_ for related collections. One common example of when M2As are used is for _page builders_, which have a `pages` collection that combines multiple collections for each type of page section, such as `heading`, `text_bodies`, `image`, `video`, _etc_. -![Many-to-Any Relational Diagram]({{CDN_URL}}/docs/v9/configuration/data-model/relationships/relationships-20220805/m2a-20220805A.webp) +![Many-to-Any Relational Diagram](/images/m2a-20220805A.webp) Let's take a look at the schema: @@ -336,7 +336,7 @@ images - file ``` -Note the following points from the schema above. When we create an M2A in Directus: +Note the following points from the schema above. When we create an M2A in d9: - Compared to the M2O and M2M relationships, there may be a lower likelihood that you will need to configure alias fields on related collections, such as `headings`, `text_bodies` and `images`, as these collections may not be as @@ -360,7 +360,7 @@ Interface from the template wizard. ## Translations (O2M) -Directus provides this special relational Interface designed specifically to handle translations. When you create a +d9 provides this special relational Interface designed specifically to handle translations. When you create a Translations O2M in the Data Studio, the following things happen within your data model. A Translations O2M alias field is created. A junction collection and a `languages` collection are created. All your translations are stored within context fields, configured by you, on the junction collection. Therefore, when you create a Translations O2M, you also @@ -370,7 +370,7 @@ the Translations O2M alias field. But behind the scenes, it is powered by an M2M To demonstrate, let's create a Translations O2M relationship for `articles`, a common content type that you may want to translate. -![Translations O2M]({{CDN_URL}}/docs/v9/configuration/data-model/relationships/relationships-20220805/o2m-translations-20220805A.webp) +![Translations O2M](/images/o2m-translations-20220805A.webp) Let's take a look at the schema. diff --git a/docs/app/display-templates.md b/docs/app/display-templates.md index 75fb5029c2..4d475a3bd8 100644 --- a/docs/app/display-templates.md +++ b/docs/app/display-templates.md @@ -1,20 +1,17 @@ --- description: - Display Templates, a utility used throughout Directus, allow you to set Field Values and custom text in order to + Display Templates, a utility used throughout d9, allow you to set Field Values and custom text in order to better represent the Items in a Collection. readTime: 1 min read --- # Display Templates -> Display Templates, a utility used throughout Directus, allow you to set Field Values and custom text in order to +> Display Templates, a utility used throughout d9, allow you to set Field Values and custom text in order to > better represent the Items in a Collection. ## How it Works - Display Templates can be found in various places all throughout the App, such as [Layout Options](/app/layouts) and the [List Panel](/app/insights#lists) in Insights. Display Templates are easy to setup, just follow these steps: diff --git a/docs/app/faq.md b/docs/app/faq.md index 08f6a05c75..4f648c52b1 100644 --- a/docs/app/faq.md +++ b/docs/app/faq.md @@ -10,6 +10,6 @@ You can do this with the following command: npx directus users passwd --email admin@example.com --password newpasswordhere ``` -## Why isn't Directus properly saving Chinese characters or emoji? +## Why isn't d9 properly saving Chinese characters or emoji? Please ensure that the encoding for your database, tables, and fields are set to `utf8mb4`. diff --git a/docs/app/file-library.md b/docs/app/file-library.md index 07e1f00e13..78e613a489 100644 --- a/docs/app/file-library.md +++ b/docs/app/file-library.md @@ -1,15 +1,15 @@ --- -description: The File Library Module aggregates all files within the Directus Project into one consolidated library. +description: The File Library Module aggregates all files within the d9 Project into one consolidated library. readTime: 7 min read --- # File Library -> The File Library Module aggregates all files within the Directus Project into one consolidated library. It is a +> The File Library Module aggregates all files within the d9 Project into one consolidated library. It is a > full-featured Digital Asset Management (DAM) system for storing, organizing, browsing, and transforming your various > files and assets. -![File Library]({{CDN_URL}}/docs/v9/app-guide/file-library/file-library-20220305A/file-library-20220307A.webp) +![File Library](/images/file-library-20220307A.webp) ::: warning More Documents on Folder and File Management @@ -34,12 +34,9 @@ the API. Any type of file can be uploaded, _not just images_. When a Folder is s [File Listing Page](#folders) is presented. This page has all the same features and functionalities as the [Collections Page](/app/content/collections). - 1. Select a Folder. There are two options: - Choose desired Folder from the Navigation Bar. @@ -57,7 +54,7 @@ When a file is clicked in the File Listing Page, the File Details Page appears. and embeds, with core Fields included out-of-the-box (see below), and the ability for Administrators to add additional custom Fields. This page has the same features and functionality as the [Item Page](/getting-started/glossary#items). -![Files]({{CDN_URL}}/docs/v9/app-guide/file-library/file-library-20220305A/files-20220305A.webp) +![Files](/images/files-20220305A.webp) ### Action Buttons @@ -72,7 +69,7 @@ Notice the following Buttons in the Header: ::: tip Deleting Files Linked to Items -By default, Directus will not allow you to delete a File until you remove it from any and all related Items. However, +By default, d9 will not allow you to delete a File until you remove it from any and all related Items. However, this behavior can be reconfigured so that Files automatically update when the image is deleted by setting the relational constraint of your File Field to `SET NULL` or `CASCADE` when the File is deleted. @@ -83,7 +80,7 @@ constraint of your File Field to `SET NULL` or `CASCADE` when the File is delete The Files Collection comes pre-configured with the following Fields out of the box. New Fields can be created and customized as needed in **Settings > Data Model**. However the pre-configured Fields cannot be changed or deleted. -![File Details]({{CDN_URL}}/docs/v9/app-guide/file-library/file-library-20220305A/file-details-20220305A.webp) +![File Details](/images/file-details-20220305A.webp) - **Preview** – A preview of the image or file. - **Title** – A title for the File. @@ -98,7 +95,7 @@ customized as needed in **Settings > Data Model**. However the pre-configured Fi The file sidebar also includes the following details, which are not editable and serve as metadata. -![File Sidebar]({{CDN_URL}}/docs/v9/app-guide/file-library/file-library-20220305A/file-sidebar-20220305A.webp) +![File Sidebar](/images/file-sidebar-20220305A.webp) - **Type** – The MIME type of the file, displayed in the App as a formatted media type. - **Dimensions** – _Images only_. The width and height of the image in pixels. @@ -114,9 +111,6 @@ The file sidebar also includes the following details, which are not editable and Rotate, crop, flip, or adjust aspect ratios of an image. - 1. From the **File Library**, click a file to open its detail page. 2. Click the tune button in the top right to open the image editor. @@ -139,9 +133,6 @@ be [uploaded programmatically via the API](/reference/files). When a file is replaced, its existing info and all relationships are kept. - 1. Click the Image Preview on the File Detail page. A popup will appear. 2. Upload your file. You have 3 options: @@ -153,7 +144,7 @@ When a file is replaced, its existing info and all relationships are kept. Folders provide the organization system for Files. -![Folders]({{CDN_URL}}/docs/v9/app-guide/file-library/file-library-20220305A/folders-20220305A.webp) +![Folders](/images/folders-20220305A.webp) They can be named, renamed, and nested as sub-folders anywhere in the Folder hierarchy. Once a Folder is selected from the Navigation Bar, File Listing Page opens. The File Listing Page displays all Files within a Folder. It also enables @@ -163,9 +154,6 @@ batch deleting, sorting, filtering, searching, etc. Folders can also be managed ## Create a Folder - 1. From the **File Library**, click on the create_new_folder button located in the Header. 2. Fill in a Folder name as desired. @@ -173,9 +161,6 @@ batch deleting, sorting, filtering, searching, etc. Folders can also be managed ## Rename a Folder - 1. From the **File Library**, right-click on the Folder you wish to rename and select "Rename Folder". 2. Update the Folder name as desired. @@ -183,9 +168,6 @@ batch deleting, sorting, filtering, searching, etc. Folders can also be managed ## Move a Folder - 1. From the **File Library**, right-click on the folder you wish to move and select **"Move to Folder"**. A popup will appear. @@ -194,9 +176,6 @@ batch deleting, sorting, filtering, searching, etc. Folders can also be managed ## Delete a Folder - 1. From the **File Library**, right-click on the Folder you wish to delete and select **"Delete Folder"**. 2. Click **"Delete"**. @@ -209,5 +188,5 @@ When you delete a Folder, any nested Files and Folders will be moved one level u ## More Help -Looking for technical support for your non-enterprise project? Chat with thousands of engineers within our growing -[Community on Discord]({{DISCORD_INVITE_URL}}) +Looking for technical support? Join our growing +[community on GitHub Discussions]({{GITHUB_COMMUNITY_URL}}) or reach out at [support@webcapsule.io](mailto:{{SUPPORT_EMAIL}}). diff --git a/docs/app/filters.md b/docs/app/filters.md index 9cdece6b1c..d103809445 100644 --- a/docs/app/filters.md +++ b/docs/app/filters.md @@ -12,7 +12,7 @@ readTime: 5 min read > restricting Item access permissions for specific Users or Roles, building dashboard analytics with the Insights > module, and more. -![Filters]({{CDN_URL}}/docs/v9/app-guide/filters/filters-20220303A/filters-20220303A.webp) +![Filters](/images/filters-20220303A.webp) ::: warning There Are Two Filters Documents @@ -35,9 +35,6 @@ A basic filter is composed of 3 parts: A **Field** from the Collection being Fil [Operator](/reference/filter-rules#filter-operators), and some specified **Value** to filter for within each Item's Field. - 2. Click filter_list or **"Add Filter"**. 3. Select the Field to filter by. @@ -62,7 +59,7 @@ automatically display. An exhaustive list of Operators and what they do can be f `AND` Groups give the option to filter for Items that meet _all of several criteria_. On the other hand, `OR` Groups filter for Items that meet _any one of several criteria_. -![AND/OR Groups]({{CDN_URL}}/docs/v9/app-guide/filters/filters-20220303A/and-or-groups-20220303A.webp) +![AND/OR Groups](/images/and-or-groups-20220303A.webp) 1. Click "Add Filter". 2. Click "And/OR Group" at the very top of the dropdown menu. @@ -85,11 +82,8 @@ conditions inside of OR Groups. The following video shows how to filter for Blog posts written within the past 60 days. - -The following Dynamic Variables are built into Directus to make Filtering easier: `$CURRENT_USER`, `$CURRENT_ROLE`, +The following Dynamic Variables are built into d9 to make Filtering easier: `$CURRENT_USER`, `$CURRENT_ROLE`, `$NOW` and `$NOW()`. For more information, please see the Dynamic Variables section in [Filter Rules](/reference/filter-rules). @@ -112,9 +106,6 @@ one of these Fields, you can run Filters on the current Collection by Field valu Here are step-by-step instructions on how to filter by Fields in other Collections: - 1. Click "Add Filter". 2. Click the desired relational Field. This will pop down and display the related Collection Fields. @@ -123,7 +114,7 @@ Here are step-by-step instructions on how to filter by Fields in other Collectio ## Unfilterable Fields -![Unfilterable Fields]({{CDN_URL}}/docs/v9/app-guide/filters/filters-20220303A/unfilterable-fields-20220303A.webp) +![Unfilterable Fields](/images/unfilterable-fields-20220303A.webp) Not all Fields can be filtered. As seen above in [Filtering by Related Collections](#filtering-by-related-collections), Alias Fields cannot be filtered; they instead provide a dropdown menu to access Fields from a related Collection. @@ -132,22 +123,15 @@ Filters. ## Extensibility Options -Directus Core is completely open-source, modular and extensible. Extensions allow you to expand or modify any part of -Directus to fit your needs. Here are some great resources to get started down that track. +d9 Core is completely open-source, modular and extensible. Extensions allow you to expand or modify any part of +d9 to fit your needs. Here are some great resources to get started down that track. - [Extensions > Introduction](/extensions/introduction) - [Extensions > Creating Extensions](/extensions/creating-extensions) - [Contributing > Introduction](/contributing/introduction) - [Contributing > Codebase Overview](/contributing/codebase-overview) -::: tip Accelerated Development - -Working on an enterprise project and looking to outsource or financially sponsor the development of a Shares extension? -Contact [our team]({{WEBSITE_URL}}contact) - -::: - ## More Help -Looking for technical support for your non-enterprise project? Chat with thousands of engineers within our growing -[Community on Discord]({{DISCORD_INVITE_URL}}) +Looking for technical support? Join our growing +[community on GitHub Discussions]({{GITHUB_COMMUNITY_URL}}) or reach out at [support@webcapsule.io](mailto:{{SUPPORT_EMAIL}}). diff --git a/docs/app/flows.md b/docs/app/flows.md index 8343c1bd25..f05f951045 100644 --- a/docs/app/flows.md +++ b/docs/app/flows.md @@ -1,13 +1,13 @@ --- description: - Flows enable custom, event-driven data processing and task automation within Directus. Each flow is composed of one + Flows enable custom, event-driven data processing and task automation within d9. Each flow is composed of one trigger, followed by a series of operations. readTime: 5 min read --- # Flows -> Flows enable custom, event-driven data processing and task automation within Directus. Each flow is composed of one +> Flows enable custom, event-driven data processing and task automation within d9. Each flow is composed of one > trigger, followed by a series of operations. :::tip Before You Begin @@ -55,12 +55,11 @@ Async/Sync -> ## What's a Flow? -![What's a Flow?]({{CDN_URL}}/docs/v9/configuration/flows/flows/flows-20220603A/whats-a-flow-20220603A.webp) +![What's a Flow?](/images/whats-a-flow-20220603A.webp) Each flow is made up of three elements: A trigger, operations, and a data chain. @@ -77,9 +76,9 @@ manage data: _send off emails, push in-app notifications, send webhooks, and bey To put it in conceptual terms, operations do three things: -- **Get data** from Directus or another outside service. +- **Get data** from d9 or another outside service. - **Process data** a.k.a. transform it, validate it, or whatever. -- **Send data** to Directus or another outside service. +- **Send data** to d9 or another outside service. :::tip Developers @@ -115,9 +114,6 @@ create a flow, which we discuss in the next section. ## Configure A Flow - ### Create a Flow @@ -148,7 +144,7 @@ You'll now see your trigger in an empty grid area. Its time to start adding oper 5. On the trigger panel, click add and the **Create Operation** side drawer will open. 6. Choose a **Name**, an [operation](/configuration/flows/operations) type, and configure as desired.\ - Directus will convert the name into a unique operation key, used on the [data chain](#the-data-chain).\ + d9 will convert the name into a unique operation key, used on the [data chain](#the-data-chain).\ If you don't choose a name, the system will auto-generate a name and key for you. 7. Next, click done in the page header to confirm and return to the flow grid area. 8. From here, you can make the following optional configurations: @@ -195,11 +191,6 @@ Now that we know how to create and configure a flow, it's time to get a firmer u ## The Data Chain - Remember, each flow creates its own JSON object to store any data generated. @@ -261,11 +252,6 @@ Remember, `$trigger`, `$accountability`, and `$last` begin with `$`, but not `op ## Data Chain Variables - While [configuring your operations](#configure-an-operation), you can use keys from the data chain as variables to access data. Simply wrap the variable with quotes and _double mustaches_. For example: @@ -318,17 +304,9 @@ Certain operations use dropdowns, toggles, checkboxes, and other input options. input raw values directly with [Toggle to Raw Editor](#configure-an-operation). You can use double-moustache syntax to access data dynamically in these input options as well. - ## Logs - Accessible from the sidebar, logs store information for each flow execution. Each log will display information from triggers as well as each operation in the flow. To access a flow's logs, follow these steps. diff --git a/docs/app/flows/operations.md b/docs/app/flows/operations.md index a706d934da..aa81a94ade 100644 --- a/docs/app/flows/operations.md +++ b/docs/app/flows/operations.md @@ -1,6 +1,6 @@ --- description: - Operations are the individual actions in a flow. They enable you to do things like manage data within Directus, + Operations are the individual actions in a flow. They enable you to do things like manage data within d9, transform the flow's data, send information off to outside services, set conditional logic, trigger other flows, and beyond! readTime: 5 min read @@ -8,7 +8,7 @@ readTime: 5 min read # Operations -> Operations are the individual actions in a flow. They enable you to do things like manage data within Directus, +> Operations are the individual actions in a flow. They enable you to do things like manage data within d9, > transform the flow's data, send information off to outside services, set conditional logic, trigger other flows, _and > beyond!_ @@ -22,7 +22,7 @@ configuration options, as well as any well as other relevant details. We will as ## Condition -![Condition]({{CDN_URL}}/docs/v9/configuration/flows/operations/operations-20220603A/condition-20220603A.webp) +![Condition](/images/condition-20220603A.webp) A **Condition** operation lets you choose a **success path** or **failure path** by validating data passed into it with [Filter Rules](/reference/filter-rules). @@ -51,7 +51,6 @@ flow ends with a condition that executes with a `reject` path, it will cancel yo This operation lets you add a custom script using vanilla JavaScript or TypeScript. The script will be executed securely @@ -130,7 +129,7 @@ Script** operation is no longer supported. If your script requires a third-party ## Create Data -![Create Data]({{CDN_URL}}/docs/v9/configuration/flows/operations/operations-20220603A/create-data-20220603A.webp) +![Create Data](/images/create-data-20220603A.webp) This operation creates item(s) in a collection. @@ -149,7 +148,7 @@ An array with the ID(s) of all items created will be appended under its `.items.create` which contains an operation that then tries to create another item in that ``. This would throw an infinite loop where the @@ -166,7 +165,7 @@ To learn about payload requirements when creating an item, see [API Reference > ## Delete Data -![Delete Data]({{CDN_URL}}/docs/v9/configuration/flows/operations/operations-20220603A/delete-data-20220603A.webp) +![Delete Data](/images/delete-data-20220603A.webp) This operation deletes item(s) from a collection. @@ -186,7 +185,7 @@ An array with the ID(s) of all items deleted will be appended under its `.items.delete` which contains an operation that then tries to delete another item in that ``. This would throw an infinite loop where the @@ -197,7 +196,7 @@ triggers other event hooks. ## Read Data -![Read Data]({{CDN_URL}}/docs/v9/configuration/flows/operations/operations-20220603A/read-data-20220603A.webp) +![Read Data](/images/read-data-20220603A.webp) This operation reads item(s) from a collection and adds them onto the data chain. You may select Items by their ID or by running a query. @@ -218,7 +217,7 @@ An array containing all items read will be appended under its ``. :::warning -**Emit Events** toggles the event's _visibility_ throughout Directus. For example, if togged on, this operation will +**Emit Events** toggles the event's _visibility_ throughout d9. For example, if togged on, this operation will trigger relevant event hooks in other flows or custom extensions. If toggled off, the operation will not trigger other event hooks. Imagine a situation where you have a flow being triggered by `.items.read` which contains an operation that then tries to read another item in that ``. This would throw an infinite loop where the @@ -229,7 +228,7 @@ triggers other event hooks. ## Update Data -![Update Data]({{CDN_URL}}/docs/v9/configuration/flows/operations/operations-20220603A/update-data-20220603A.webp) +![Update Data](/images/update-data-20220603A.webp) This operation updates item(s) in a collection. You may select item(s) to update by their ID or by running a query. @@ -250,7 +249,7 @@ An array containing all items updated will be appended under its ` :::warning -**Emit Events** toggles the event's _visibility_ throughout Directus. For example, if togged on, this operation will +**Emit Events** toggles the event's _visibility_ throughout d9. For example, if togged on, this operation will trigger relevant event hooks in other flows or custom extensions. If toggled off, the operation will not trigger other event hooks. Imagine a situation where you have a flow being triggered by `.items.update` which contains an operation that then tries to update another item in that ``. This would throw an infinite loop where the @@ -267,7 +266,7 @@ To learn about `payload` requirements when updating an item, see [API Reference ## Log to Console -![Log to Console]({{CDN_URL}}/docs/v9/configuration/flows/operations/operations-20220603A/log-to-console-20220603A.webp) +![Log to Console](/images/log-to-console-20220603A.webp) This operation outputs information to the server-side console as well as the [Logs](/configuration/flows#logs) within the Data Studio. This is a key tool for troubleshooting flow configuration. A Log operation's key will have a null value @@ -288,7 +287,7 @@ For more details, see the section on [Logs](/configuration/flows#logs). ## Send Email -![Send Email]({{CDN_URL}}/docs/v9/configuration/flows/operations/operations-20220603A/send-email-20220603A.webp) +![Send Email](/images/send-email-20220603A.webp) This operation sends off emails. @@ -320,9 +319,9 @@ may send it there automatically. ## Send Notification -![Send Notification]({{CDN_URL}}/docs/v9/configuration/flows/operations/operations-20220603A/send-notification-20220603A.webp) +![Send Notification](/images/send-notification-20220603A.webp) -This operation pushes notifications to Directus Users. If the operation executes successfully, a list containing the IDs +This operation pushes notifications to d9 Users. If the operation executes successfully, a list containing the IDs of all sent notifications generated is appended under this operation's key. **Options** @@ -347,7 +346,7 @@ You can input an array of UUIDs in the `To` input option to send off multiple em ## Webhook / Request URL -![Webhook / Request URL]({{CDN_URL}}/docs/v9/configuration/flows/operations/operations-20220603A/webhook-20220603A.webp) +![Webhook / Request URL](/images/webhook-20220603A.webp) This operation makes a request to another URL. @@ -364,7 +363,7 @@ When an operation completes successfully, the `response` is appended under its ` ## Sleep -![Sleep]({{CDN_URL}}/docs/v9/configuration/flows/operations/operations-20220603A/sleep-20220603A.webp) +![Sleep](/images/sleep-20220603A.webp) This operation creates a delay in the Flow for a given amount of milliseconds, then continues to the next operation. @@ -378,7 +377,7 @@ This operation does not generate data. It will append a `null` value on its `ope ## Transform Payload -![Transform Payload]({{CDN_URL}}/docs/v9/configuration/flows/operations/operations-20220603A/transform-payload-20220603A.webp) +![Transform Payload](/images/transform-payload-20220603A.webp) This operation lets you custom define your own JSON payload for use in subsequent operations. This enables you to take multiple sources of data and "tidy them up" into a single payload. @@ -412,7 +411,7 @@ Then you could stitch together all this data to create a new JSON object, like s ## Trigger Flow -![Trigger Flow]({{CDN_URL}}/docs/v9/configuration/flows/operations/operations-20220603A/trigger-flow-20220603A.webp) +![Trigger Flow](/images/trigger-flow-20220603A.webp) This operation starts another flow and _(optionally)_ passes data into it. It should be used in combination with the [Another Flow](/configuration/flows/triggers#another-flow) trigger. diff --git a/docs/app/flows/triggers.md b/docs/app/flows/triggers.md index 0212e8c6e3..4a9de38f26 100644 --- a/docs/app/flows/triggers.md +++ b/docs/app/flows/triggers.md @@ -19,7 +19,7 @@ Please be sure to read the overview documentation on [Flows](/configuration/flow ## Event Hook -![Event Hooks]({{CDN_URL}}/docs/v9/configuration/flows/triggers/triggers-20220603A/event-hook-20220602A.webp) +![Event Hooks](/images/event-hook-20220602A.webp) Event Hooks are triggered by events within the platform. The logic is based on [Custom API Hooks](/extensions/hooks). Any data generated by the event will be nested in the `$trigger`. @@ -54,7 +54,7 @@ the database. For example, let's say you configure the scope to be `item.create`. -- A request to create an item is sent to Directus. +- A request to create an item is sent to d9. - The create item event halts. - The event's `payload` is copied into the `$trigger` of the flow. - The flow runs. @@ -87,7 +87,7 @@ desired. For example, let's imagine once more that you configure the scope to be `item.create`. -- A request to create an item is sent to Directus. +- A request to create an item is sent to d9. - The create item event is transacted. - The event's `payload` is copied into the `$trigger` of the flow. - The flow runs. @@ -98,7 +98,7 @@ control over the event transaction. ## Webhook -![Webhook]({{CDN_URL}}/docs/v9/configuration/flows/triggers/triggers-20220603A/webhook-20220602A.webp) +![Webhook](/images/webhook-20220602A.webp) Triggers on an incoming HTTP request to: `/flows/trigger/:this-webhook-trigger-id` which you can copy from the webhook trigger panel. @@ -126,7 +126,7 @@ finish and return whatever value is in **Response Body**. This slows the API, bu ## Schedule (CRON) -![Schedule a Cron Job]({{CDN_URL}}/docs/v9/configuration/flows/triggers/triggers-20220603A/cron-20220602A.webp) +![Schedule a Cron Job](/images/cron-20220602A.webp) This trigger enables you to create data at scheduled intervals, via [6-point cron job syntax](https://github.com/node-cron/node-cron#cron-syntax). @@ -149,7 +149,7 @@ This trigger enables you to create data at scheduled intervals, via ## Another Flow -![Another Flow]({{CDN_URL}}/docs/v9/configuration/flows/triggers/triggers-20220603A/another-flow-20220602A.webp) +![Another Flow](/images/another-flow-20220602A.webp) This trigger executes by the [trigger flow](/configuration/flows/operations#another-flow) operation, allowing you to chain flows. @@ -168,7 +168,7 @@ If you pass an array to this trigger, it will run once for each item in the arra ## Manual -![A pane is open in front of a Flow. It shows various options detailed below.]({{CDN_URL}}/docs/v9/configuration/flows/triggers-20230227A/manual-20230227A.webp) +![A pane is open in front of a Flow. It shows various options detailed below.](/images/manual-20230227A.webp) This Trigger starts your flow on a manual click of a button within the Data Studio. When you use this trigger, a **Flows** menu containing a button will appear in the sidebar of the specified collection page(s) and/or its item pages. @@ -190,7 +190,7 @@ whether the flow ran successfully. ### Confirmation Dialog -![A modal is shown reading "Please provide alert information" with two text fields - one for text and one for content.]({{CDN_URL}}/docs/v9/configuration/flows/triggers-20230227A/manual-confirmation-dialog-20230227A.webp) +![A modal is shown reading "Please provide alert information" with two text fields - one for text and one for content.](/images/manual-confirmation-dialog-20230227A.webp) If enabled, a confirmation dialog will be shown in a modal before the flow is executed. There are further options to set up a confirmation dialog. @@ -198,7 +198,7 @@ up a confirmation dialog. - **Confirmation Description** - Text shown at the top of the modal. - **Confirmation Input Fields** - Set up one or more inputs to be filled by users before executing the flow. -![A pane is open in front of a Flow. It shows various options detailed below.]({{CDN_URL}}/docs/v9/configuration/flows/triggers-20230227A/manual-input-settings-20230227A.webp) +![A pane is open in front of a Flow. It shows various options detailed below.](/images/manual-input-settings-20230227A.webp) Each input field can have its own data type, interface, and display options. Some convenience options are also provided to immediately alter the user input (such as trimming whitespace and slugifying text). diff --git a/docs/app/import-export.md b/docs/app/import-export.md index c446b3b53a..cbdcdff921 100644 --- a/docs/app/import-export.md +++ b/docs/app/import-export.md @@ -32,9 +32,6 @@ This page details Importing and Exporting of Items as files via the no-code app. ## Import Items - To import Items from a file, follow the steps below. @@ -45,7 +42,7 @@ To import Items from a file, follow the steps below. 4. Select the desired file and click **"open"**. 5. Click **"Start Import"** to import the Items. -The Items will now be in the Collection. The file itself will not be stored in the Directus Project. +The Items will now be in the Collection. The file itself will not be stored in the d9 Project. :::tip Importing Relational Files @@ -61,10 +58,7 @@ Add link ## Export Items - When exporting Items, the [Export Items Menu](#export-items-menu) provides granular control over exactly which Items and Fields are exported, how they are exported, and where they are exported. To export Items, follow the steps below. @@ -85,7 +79,7 @@ Export your file to CSV to seamlessly open in excel. :::tip Exporting to File Library -When downloading 2,500 or more Items, you will be required to download into the Directus Project's File Library. After +When downloading 2,500 or more Items, you will be required to download into the d9 Project's File Library. After exporting, go to the File Library to download your file locally. ::: @@ -101,9 +95,6 @@ permissions for the related Collection and a firm understanding of the relationa ## Export Items Menu - This menu provides granular control over exactly which Items and Fields are exported, how they are exported, and where they are exported. diff --git a/docs/app/insights.md b/docs/app/insights.md index c3f154b295..3a640b8f88 100644 --- a/docs/app/insights.md +++ b/docs/app/insights.md @@ -1,23 +1,17 @@ --- -description: Insights is a Module in Directus that allows rapid, no-code build-out of analytics dashboards. +description: Insights is a Module in d9 that allows rapid, no-code build-out of analytics dashboards. readTime: 9 min read --- # Insights -> Insights is a Module in Directus that allows rapid, no-code build-out of analytics dashboards. Regardless of your +> Insights is a Module in d9 that allows rapid, no-code build-out of analytics dashboards. Regardless of your > use-case _(be it business intelligence, user progress tracking, web traffic conversions, or whatever!)_ you will be > able to setup key data metrics in just a few clicks. - ## How it Works - First, create a Dashboard, then fill the Dashboard with Panels. @@ -33,9 +27,9 @@ First, create a Dashboard, then fill the Dashboard with Panels. ## Dashboards Overview -![Dashboard Grid Area]({{CDN_URL}}/docs/v9/app-guide/insights/insights-20220216A/dashboards-overview-20220216A.webp) +![Dashboard Grid Area](/images/dashboards-overview-20220216A.webp) -Each Directus Dashboard provides a drag-and-drop canvas where you can create and arrange different Panels to easily +Each d9 Dashboard provides a drag-and-drop canvas where you can create and arrange different Panels to easily build out customized analytics. The Dashboard area automatically expands as you add more and more Panels. In theory, a Dashboard area can expand infinitely large... but in practice, users will probably only want to build Dashboards as large as the screen they will be viewing on. You are able to create as many Dashboards as you need. Additionally, the @@ -50,14 +44,14 @@ The Auto Refresh menu in the [Sidebar](/app/overview#_4-sidebar) lets you select ## Create, Edit, and Delete Dashboards -![How to Add, Edit and Delete Dashboards in Directus Insights]({{CDN_URL}}/docs/v9/app-guide/insights/insights-20220216A/create-edit-delete-dashboards-20220216A.webp) +![How to Add, Edit and Delete Dashboards in d9 Insights](/images/create-edit-delete-dashboards-20220216A.webp) 1. Click the add icon in the page header to create a new Dashboard. 2. Click the item option to edit or delete a Dashboard. ## Panels Overview -![Directus Dashboard Panels]({{CDN_URL}}/docs/v9/app-guide/insights/insights-20220216A/panels-overview-20220216A.webp) +![d9 Dashboard Panels](/images/panels-overview-20220216A.webp) Panels are the building-blocks we add onto Insights dashboards to create, save and display data analytics. There are five types of Panels, and each one provides some unique analytics tool. @@ -71,7 +65,7 @@ five types of Panels, and each one provides some unique analytics tool. ## Panel Header Options -![Panel Header Options]({{CDN_URL}}/docs/v9/app-guide/insights/insights-20220216A/panel-header-options-20220216A.webp) +![Panel Header Options](/images/panel-header-options-20220216A.webp) All panel types let you set custom text to provide quick and clear context about what a Panel represents. Panel Header options are exactly the same for all four Panel types. Headers are also totally optional and can be hidden. @@ -84,7 +78,7 @@ options are exactly the same for all four Panel types. Headers are also totally ## Labels -![Label Panel Options]({{CDN_URL}}/docs/v9/app-guide/insights/insights-20220216A/label-panel-options-20220216A.webp) +![Label Panel Options](/images/label-panel-options-20220216A.webp) As the name implies, this panel simply allows you to _label_ a group of other panels. Labels do not provide analytics. Labels simply help visually group the other panels (_which do provide analytics_) and give context to your dashboard. @@ -94,7 +88,7 @@ Labels simply help visually group the other panels (_which do provide analytics_ ## Lists -![List Panel Options]({{CDN_URL}}/docs/v9/app-guide/insights/insights-20220216A/list-panel-options-20220216A.webp) +![List Panel Options](/images/list-panel-options-20220216A.webp) List panels display some number of Items from a Collection, _as a list!_ These Items displayed can be filtered by other criteria as well. So for example, you could show your top 5 selling products, 3 worst performing sales regions, 10 @@ -111,7 +105,7 @@ list that could be generated from your dataset. ## Metrics -![Metrics Panel Options]({{CDN_URL}}/docs/v9/app-guide/insights/insights-20220216A/metric-panel-options-20220216A.webp) +![Metrics Panel Options](/images/metric-panel-options-20220216A.webp) Metrics Panels allow you to aggregate all Items in a Field down to a single value. @@ -162,7 +156,7 @@ grayed out and unselectable in the `field dropdown list`. ## Time Series -![Time Series Panel Options]({{CDN_URL}}/docs/v9/app-guide/insights/insights-20220216A/time-series-panel-options-20220216A.webp) +![Time Series Panel Options](/images/time-series-panel-options-20220216A.webp) The Time Series Panel allows you to build graphs and see how data changes over time. @@ -197,7 +191,7 @@ type in `3 years`, `1 month`, `2 weeks`, `5 days`, etc. ## Global Variable -![Global Variables]({{CDN_URL}}/docs/v9/app-guide/insights/insights-220624A/global-variable-220624A.webp) +![Global Variables](/images/global-variable-220624A.webp) - **Variable Key** — Sets your variable. Use this key to access the variable in other Insights panels. - **Type** — Sets the data type of your variable. @@ -260,11 +254,11 @@ or JSON variable in a place that requires Datetime data. ## Bar Chart -![Dashboard edit page with a bar chart options panel visible.]({{CDN_URL}}/docs/v9/app-guide/insights/20220223/panels-bar-options-230223A.webp) +![Dashboard edit page with a bar chart options panel visible.](/images/panels-bar-options-230223A.webp) :::info Availability -The Bar Chart Panel is only available in Directus Cloud and Enterprise Self-Hosted projects. +The Bar Chart Panel is only available in d9 Cloud and Enterprise Self-Hosted projects. ::: @@ -282,11 +276,11 @@ The Bar Chart Panel allows you to build vertical and horizontal bar charts from ## Line Chart -![Dashboard edit page with a line chart options panel visible.]({{CDN_URL}}/docs/v9/app-guide/insights/20220223/panels-line-options-230223A.webp) +![Dashboard edit page with a line chart options panel visible.](/images/panels-line-options-230223A.webp) :::info Availability -The Line Chart Panel is only available in Directus Cloud and Enterprise Self-Hosted projects. +The Line Chart Panel is only available in d9 Cloud and Enterprise Self-Hosted projects. ::: @@ -310,11 +304,11 @@ data. ## Meter -![Dashboard edit page with a meter options panel visible.]({{CDN_URL}}/docs/v9/app-guide/insights/20220223/panels-meter-options-230223A.webp) +![Dashboard edit page with a meter options panel visible.](/images/panels-meter-options-230223A.webp) :::info Availability -The Meter Panel is only available in Directus Cloud and Enterprise Self-Hosted projects. +The Meter Panel is only available in d9 Cloud and Enterprise Self-Hosted projects. ::: @@ -334,11 +328,11 @@ The Meter Panel takes a maximum value and allows you to show a completion percen ## Pie or Donut Chart -![Dashboard edit page with a pie or donut options panel visible.]({{CDN_URL}}/docs/v9/app-guide/insights/20220223/panels-pie-donut-options-230223A.webp) +![Dashboard edit page with a pie or donut options panel visible.](/images/panels-pie-donut-options-230223A.webp) :::info Availability -The Pie and Donut Chart Panels are only available in Directus Cloud and Enterprise Self-Hosted projects. +The Pie and Donut Chart Panels are only available in d9 Cloud and Enterprise Self-Hosted projects. ::: diff --git a/docs/app/layouts.md b/docs/app/layouts.md index 5f731a666e..821004ec62 100644 --- a/docs/app/layouts.md +++ b/docs/app/layouts.md @@ -10,9 +10,6 @@ readTime: 9 min read ## What's a Layout? - Data models vary drastically in shape and purpose, from eCommerce platforms to IoT fleets and everything in between. While excel-style data tables often closely resemble how the data is stored in the database, this is not always the most @@ -20,9 +17,6 @@ human-friendly way to view the data. Layouts provide intuitive displays to view ## How it Works - To adjust an Item's Layout, follow these steps. @@ -72,9 +66,6 @@ As you go through Layouts, it may be helpful to keep the following points in min ## Table Layout - This Layout supports all forms of data, as it directly reflects how data is stored in a Collection. This is the default Layout used in the Content Module. It includes the following controls. @@ -111,10 +102,7 @@ Data Model Settings. ## Card Layout - This tiled Layout is ideal for Collections that prioritize an image _(e.g. a user or blog post)_. This is the default for both the [User Directory](/app/user-directory) and [File Library](/app/file-library). It includes the following @@ -142,9 +130,6 @@ controls. ## Calendar Layout - This Layout is ideal for Collections with time-oriented data _(e.g. events and appointments)_. It includes the following controls. @@ -175,9 +160,6 @@ start time, but ideally two datetime Fields _(to set a start time and end time)_ ## Map Layout - This Layout is ideal for Collections that emphasize geospatial data. It provides a world map, with Items displayed as points, lines, and other geometry. The following options are available: @@ -216,13 +198,10 @@ Link to Map Field ## Kanban Layout - :::info Availability -The Kanban Layout is only available in Directus Cloud and Enterprise Self-Hosted projects. +The Kanban Layout is only available in d9 Cloud and Enterprise Self-Hosted projects. ::: diff --git a/docs/app/overview.md b/docs/app/overview.md index 712829098d..3e5fd17166 100644 --- a/docs/app/overview.md +++ b/docs/app/overview.md @@ -8,13 +8,13 @@ readTime: 3 min read > The App is a no-code presentation layer for your data, content, and assets. It uses an intuitive left-to-right visual > hierarchy for general organization and navigation. -Directus Application Overview +d9 Application Overview ## 1. Module Bar The leftmost section of the App is the module bar, which includes the: -- **Project Logo** — Displays your configured project logo and project color (defaults to the Directus logo and color). +- **Project Logo** — Displays your configured project logo and project color (defaults to the d9 logo and color). If configured, clicking this component will navigate to the Project URL. During platform activity, an indeterminate progress indicator will also be shown here. - **Module Navigation** — Allows navigating between the different modules your user has access to. Customizing the diff --git a/docs/app/presets-bookmarks.md b/docs/app/presets-bookmarks.md index e2c2162932..8992daf39a 100644 --- a/docs/app/presets-bookmarks.md +++ b/docs/app/presets-bookmarks.md @@ -33,9 +33,6 @@ Admins can access and manage all presets under **Settings > Presets and Bookmark ## Create a Preset - There are two types or presets, Defaults and Bookmarks. @@ -73,9 +70,6 @@ is: User, then Role, then Global. ## Edit a Preset - 1. Navigate to **Settings > Presets & Bookmarks > [preset]**. 2. Reconfigure your preset as desired. @@ -83,9 +77,6 @@ is: User, then Role, then Global. ## Delete a Preset - 1. Navigate to **Settings > Presets & Bookmarks > [preset]**. 2. Click delete in the page header and a popup will appear. Click **Confirm**. diff --git a/docs/app/project-settings.md b/docs/app/project-settings.md index c3371fb4a2..2f0bf63c3e 100644 --- a/docs/app/project-settings.md +++ b/docs/app/project-settings.md @@ -18,9 +18,6 @@ To manage your project settings programmatically, see our API documentation on [ ## Configure Project Settings - To configure Project Settings, follow these steps. @@ -32,7 +29,7 @@ All configuration options are described in detail below. ## General -![How to Configure General Project Settings]({{CDN_URL}}/docs/v9/configuration/project-settings/project-settings-20220815/general-project-settings-20220811A.webp) +![How to Configure General Project Settings](/images/general-project-settings-20220811A.webp) - **Project Name** — Sets the name on the [Navigation Bar](/app/overview.html#_2-navigation-bar), as well as login and public pages. @@ -42,9 +39,6 @@ All configuration options are described in detail below. ## Branding & Style - - **Project Color** — Sets color on the project logo, FavIcon and login/public pages. - **Project Logo** — Adds a 40x40px logo at the top of the [Module Bar](/app/overview.html#_1-module-bar) and on the @@ -62,15 +56,12 @@ All configuration options are described in detail below. ::: tip Browser FavIcon & Title The Project Color is also used to set a dynamic FavIcon and the Project Name is used in the browser's page title, making -it easier to identify different Directus projects. +it easier to identify different d9 projects. ::: ## Modules - - **Module Bar** — Allows the following customization of links displayed in the [Module Bar](/app/overview.html#_1-module-bar). @@ -80,11 +71,11 @@ it easier to identify different Directus projects. - **Add Link** — To add a new custom link, click **Add Link** and fill in the details below. - **Name** — Sets the title of the module link, also shown in a tooltip on hover. - **Icon** — Selects an icon for the module button. - - **URL** — Should start with a `/` for links within the [Directus Data Studio](/app/overview). + - **URL** — Should start with a `/` for links within the [d9 Data Studio](/app/overview). ## Security -![How to Configure Security in Project Settings]({{CDN_URL}}/docs/v9/configuration/project-settings/project-settings-20220815/security-project-settings-20220811A.webp) +![How to Configure Security in Project Settings](/images/security-project-settings-20220811A.webp) - **Auth Password Policy** — Sets a policy requirement for all user's passwords via a JavaScript regex. Supports the following options: @@ -97,9 +88,6 @@ it easier to identify different Directus projects. ## Files & Storage - The platform's file middleware allows for cropping and transforming image assets on the fly. This means you can simply request an original image, include any desired parameters, and you'll be served the new asset as a response. @@ -129,7 +117,7 @@ To learn more, please see the API guide on [transformation presets](/reference/f ## Mapping -![How to Configure Mapping in Directus]({{CDN_URL}}/docs/v9/configuration/project-settings/project-settings-20220815/mapping-project-settings-20220815A.webp) +![How to Configure Mapping in d9](/images/mapping-project-settings-20220815A.webp) - **Mapbox Access Token** — Create a [Mapbox Access Token](https://docs.mapbox.com/help/glossary/access-token) and enter it here to improve the platform's mapping experience. @@ -142,9 +130,6 @@ To learn more, please see the API guide on [transformation presets](/reference/f ## Image Editor - - **Custom Aspect Ratios** — Adds custom aspect ratios in the [image editor](/app/file-library#edit-an-image). - **Text** — Sets a name to identify the aspect ratio. diff --git a/docs/app/settings.md b/docs/app/settings.md index 525736f4b7..af514d421d 100644 --- a/docs/app/settings.md +++ b/docs/app/settings.md @@ -9,9 +9,6 @@ readTime: 2 min read > The Settings Module is where your entire Project is configured, making it the first place to go after installation. To > maintain project safety and integrity, this module is only available to Administrators. - ::: warning Administrators Only diff --git a/docs/app/translation-strings.md b/docs/app/translation-strings.md index a6062bb045..147e92aaa5 100644 --- a/docs/app/translation-strings.md +++ b/docs/app/translation-strings.md @@ -10,15 +10,9 @@ readTime: 3 min read > Translation Strings are multilingual key-value pairs that you can use throughout the app. They enable you to translate > things like dropdown options, placeholder text, field notes, and more. - ## Create a Translation String - To create a Translation String, follow these steps. @@ -33,9 +27,6 @@ To create a Translation String, follow these steps. ## Use a Translation String - Throughout the Settings Module, you will notice certain input fields have a translate icon on them. While can always type static text into these input fields, this translate icon indicates that you diff --git a/docs/app/user-directory.md b/docs/app/user-directory.md index 46e6ac7191..f84581738e 100644 --- a/docs/app/user-directory.md +++ b/docs/app/user-directory.md @@ -9,7 +9,7 @@ readTime: 7 min read > are the individual accounts for logging in to the App. Each User belongs to a [Role](/getting-started/glossary#roles) > which defines its [Permissions](/getting-started/glossary#permissions). -![User Directory Page]({{CDN_URL}}/docs/v9/app-guide/user-directory/user-directory-20220222A/user-directory-20220222A.webp) +![User Directory Page](/images/user-directory-20220222A.webp) +**You can create perfect software, but if no one knows about it, it's all for naught.** **GitHub Stars**\ As an open-source project, stars are a primary metric by which we measure our success. It only takes a few seconds to head -to the [Directus GitHub Repo]({{GITHUB_URL}}) and click the star. With enough activity in a short -period of time, we get _even more exposure_ on GitHub's trending page! - -**Social Posts**\ -Engage with us on social media. Follow us! A quick post mentioning [@directus]({{TWITTER_URL}}) goes a long -way! _Plus, we re-tweet the team's favorite shout-outs to our 45K+ followers._ +to the [d9 GitHub Repo]({{GITHUB_URL}}) and click the star. **Testimonials**\ -_One sentence._ Even that was a sentence and it was only two words! If you're a fan of Directus, we'd love to hear why with -a short endorsement... More importantly, potential new users _need to hear your testimonial_ to see if the product is right -for them! Shoot us an [email](mailto:{{INFO_EMAIL}}), [Tweet]({{TWITTER_URL}}), or [Discord]({{DISCORD_CHAT_URL}}) -message with your name, title, and company. - -**Reviews**\ -The following popular rating platforms allow you to post your rating and testimonial publicly, which automatically gives -it more exposure. - -- [G2]({{G2_REVIEWS_URL}}) -- [Capterra]({{CAPTERRA_URL}}) -- [TrustRadius]({{TRUSTRADIUS_URL}}) -- [Product Hunt]({{PRODUCTHUNT_URL}}) +If you're a fan of d9, we'd love to hear why with a short endorsement. Shoot us an +[email](mailto:{{INFO_EMAIL}}) with your name, title, and company. ## Community Engagement -**While the Directus Core Team spearheads development, community engagement is an essential part of the Directus -mission. We need your help in order to make Directus all it can be.** - -**GitHub Sponsors**\ -The core team is funded. All monthly donations via [GitHub Sponsors](https://github.com/sponsors/directus) form a budget -to compensate the top community contributors. Donate to sponsor more [community developers](https://github.com/orgs/directus/people) +**While the d9 Core Team spearheads development, community engagement is an essential part of the d9 +mission. We need your help in order to make d9 all it can be.** **Code Pull Requests**\ -Squashing bugs, optimizing the codebase, increasing test coverage, and adding new features, are all extremely valuable. Obviously, -you're making the platform better for yourself as well. _That's a double whammy!_ [Go make your PR on GitHub!]({{GITHUB_DIRECTUS_URL}}) +Squashing bugs, optimizing the codebase, increasing test coverage, and adding new features, are all extremely valuable. +[Go make your PR on GitHub!]({{GITHUB_DIRECTUS_URL}}) Not quite a software engineer yet? We have plenty of documentation that can always use some extra attention. Learn more in our [Contributors Guide](/contributing/introduction). - - **Bug Reporting**\ -If you find an issue in Directus, no matter how small, we'd love to hear about it. Proper bug reporting helps our team improve +If you find an issue in d9, no matter how small, we'd love to hear about it. Proper bug reporting helps our team improve platform stability. [Report a bug on GitHub]({{GITHUB_URL}}/issues/new) **App Translations**\ @@ -72,37 +41,6 @@ Every button, element, or other line of text in the app is [fully translatable]( make our app an international platform. Our [Crowdin integration]({{LOCALES_URL}}) makes polishing existing translations or creating new ones a breeze. -## Financial Support - -**Talented full-time and part-time staff, infrastructure, and third-party services are just some of our organization's -many expenses. Here are a few support avenues that help us keep the lights on.** - -**Premium Support**\ -_Software engineering is hard!_ Let our Core Team help you better manage your Directus project with a dedicated Premium Support -agreement so your devs can focus on your app's core business logic. [Contact the Team]({{WEBSITE_URL}}contact) for more -info. - -**Sponsored Work**\ -[Commissioned Features](/getting-started/support#commissioned-features) and [Expedited Fixes](/getting-started/support#expedited-fixes) -are great ways to financially support the development of Directus and improve the codebase for the community _and for your -project!_ - -**Directus Cloud**\ -Cloud architecture, software updates, and configuration optimizations require fully dedicated effort. Cut through all that -digital red-tape and run your projects on [Directus Cloud](/cloud/overview). You get production-ready projects with zero -vendor lock-in, 90 second average build times, incredibly fair pricing, scaling at the click of a button, automatic updates -with no downtime and a constant stream of new [Cloud Exclusive Extensions](/cloud/glossary#extensions). - -We do everything we can to make hosting on [Directus Cloud](/cloud/overview) a no-brainer. - -:::tip Ready to try out Cloud? - -Test out Directus Cloud now with the [Quickstart Guide](/getting-started/quickstart). - -::: - -:::tip Enterprise Cloud - -Need total customization, unlimited scalability, and dedicated support? [Contact us]({{WEBSITE_URL}}contact) +## Contact -::: +For any question or support request, reach out at [support@webcapsule.io](mailto:{{SUPPORT_EMAIL}}). diff --git a/docs/getting-started/glossary.md b/docs/getting-started/glossary.md index 347852ce82..29c687d7e9 100644 --- a/docs/getting-started/glossary.md +++ b/docs/getting-started/glossary.md @@ -1,5 +1,5 @@ --- -description: A glossary of key Directus terminology. +description: A glossary of key d9 terminology. readTime: 15 min read --- @@ -67,9 +67,9 @@ group data based on department, objective, business process or anything you choo ## Database Abstraction -Directus supports mirroring all the most widely used SQL databases, including PostgreSQL, MySQL, Microsoft SQL Server, +d9 supports mirroring all the most widely used SQL databases, including PostgreSQL, MySQL, Microsoft SQL Server, SQLite, OracleDB, MariaDB, CockroachDB, and other variants. Each vendor has subtle (and sometimes not so subtle) -differences in how they function, so Directus includes an abstraction layer that helps it avoid writing different code +differences in how they function, so d9 includes an abstraction layer that helps it avoid writing different code for each type. This means there is also the possibility of supporting other datastores in the future, such as NoSQL options like @@ -82,7 +82,7 @@ Displays are the smaller, read-only counterpart to [Interfaces](#interfaces), de displayed inline throughout the App. For example, you may have a "Status" field that uses a _Dropdown_ Interface on the Item Detail page, and a smaller -_Badge_ Display when the field is referenced throughout the rest of the App. Directus includes many Displays +_Badge_ Display when the field is referenced throughout the rest of the App. d9 includes many Displays out-of-the-box, below are the some key examples: - **Raw** — The exact value, straight from the API @@ -141,7 +141,7 @@ is an excellent Digital Asset Management system. ### Material Icons -Full list of icons [can be found here](https://fonts.google.com/icons). Directus supports both filled & outlined +Full list of icons [can be found here](https://fonts.google.com/icons). d9 supports both filled & outlined variants of Material icons. ### Social Icons @@ -193,7 +193,7 @@ connect data. For instance, if you have a `recipes` collection and an `ingredien ## Layouts Layouts determine how you view or interact with a Collection. In most cases, they offer a way to browse items based on a -specific type of data, but can also be used to visualize or interact with data. Directus includes several Layout options +specific type of data, but can also be used to visualize or interact with data. d9 includes several Layout options out-of-the-box, each with different features and configuration options. - **Table** — Works with any type of data, showing items as rows and their fields as columns. @@ -238,7 +238,7 @@ Multitenancy is an architecture that allows multiple tenants (e.g., customers) t two main ways to achieve multitenancy: - **Project Scoping** — Creating a super-admin layer that provisions new tenant projects has been made easier by the - Cloud-native model of Directus 9+. This method involves developing custom code that can dynamically spin up/down + Cloud-native model of d9. This method involves developing custom code that can dynamically spin up/down projects, but is also the most flexible, supporting scoped extensions and differentiated project settings. - **Role Scoping** — In this method, you create one Role per tenant, and configure their permissions to properly scope them within a single project. This direction allows for tenants to share a single schema using _item_ scoped @@ -279,7 +279,7 @@ often called `id`. ## Projects A Project is a complete instance of the platform. Each project represents a **Database**, but also encapsulates a config -file, asset storage, and any custom extensions. Projects are the highest level of organization in Directus. +file, asset storage, and any custom extensions. Projects are the highest level of organization in d9. - [Creating a Project](/self-hosted/quickstart) - [Configuring a Project](/self-hosted/config-options) @@ -299,7 +299,7 @@ purpose. [Learn more about Relationships](/configuration/data-model/relationship ## Revisions Revisions are created whenever an Item is updated. These alternate versions are tracked so that previous states can be -recovered. Every change made to items in Directus is stored as a complete versioned snapshot and a set of specific +recovered. Every change made to items in d9 is stored as a complete versioned snapshot and a set of specific changes made (the delta). The revisions system is tightly coupled to the activity logs system, with each revision linked to the activity event where it was created. @@ -308,7 +308,7 @@ to the activity event where it was created. Roles define a specific set of access permissions, and are the primary organizational structure for Users within the platform. You can create an unlimited number of roles, so organize your users in whatever way feels most appropriate. -During the installation process, Directus automatically creates an "Administrators" Role, which is used to provide the +During the installation process, d9 automatically creates an "Administrators" Role, which is used to provide the initial admin user with full platform access. However this is just a _normal_ role, and so it can still be updated, renamed, or even deleted. Keep in mind that your project must maintain at least one role with Admin Access at all times. @@ -324,14 +324,14 @@ There is also a "Public" role that determines access for unauthenticated access. ## Singleton -- **Directus** - A collection that only contains one single item +- **d9** - A collection that only contains one single item - [**Design pattern**](https://www.patterns.dev/posts/singleton-pattern/) - Classes which can be instantiated once and can be accessed globally. This single instance can be shared throughout our application, which makes singletons great for managing global state in an application. ## Storage Adapters -Storage adapters allow project files to be stored in different locations or services. By default, Directus includes the +Storage adapters allow project files to be stored in different locations or services. By default, d9 includes the following drivers: - **Local Filesystem** — The default, any file system location or network-attached storage @@ -367,9 +367,9 @@ cause data loss, so types are locked within the platform after a field is create ### Data Type Superset -Directus uses its built-in database abstraction to properly support all the different SQL vendors. However, these +d9 uses its built-in database abstraction to properly support all the different SQL vendors. However, these vendors do not share support for the same data types, instead, each SQL vendor maintains their own list. To standardize -all of these differences, Directus has a single _superset_ of types that map to the vendor-specific ones. +all of these differences, d9 has a single _superset_ of types that map to the vendor-specific ones. - **String** — A shorter set of characters with a configurable max length - **Text** — A longer set of characters with no real-world max length diff --git a/docs/getting-started/introduction.md b/docs/getting-started/introduction.md index 51ff01d826..62df116c53 100644 --- a/docs/getting-started/introduction.md +++ b/docs/getting-started/introduction.md @@ -1,54 +1,58 @@ --- -description: An introduction to what Directus is, how it works, who it is for, and when to use it. +description: An introduction to what d9 is, how it works, who it is for, and when to use it. readTime: 8 min read --- # Introduction -> These Docs will help you get Directus up-and-running quickly, guide you through advanced features, and explain the -> core concepts that make Directus so unique. +> These Docs will help you get d9 up-and-running quickly, guide you through advanced features, and explain the +> core concepts that make d9 so unique. -## What is Directus? +## About d9 -::: tip Directus +**d9** is an open-source fork of Directus 9 (GPLv3), maintained independently by [La Webcapsule](https://github.com/LaWebcapsule). While Directus 10+ moved to a premium licensing model, d9 preserves a fully open-source data platform with a focus on **performance** and **European regulatory compliance**. -Directus ([duh REKT iss](http://audio.pronouncekiwi.com/Salli/Directus)) is Latin for: _laid straight, arranged in -lines_.\ -The broadest goal of our platform is to present data in a simple, orderly, and intuitive way. +d9 is not affiliated with the Directus core team. It is a community-driven project that ensures long-term open-source availability of the Directus 9 codebase. + +::: info Etymology + +The name "d9" comes from **D**irectus **9**. The word _Directus_ ([duh REKT iss](http://audio.pronouncekiwi.com/Salli/Directus)) is Latin for: _laid straight, arranged in lines_. The broadest goal of our platform is to present data in a simple, orderly, and intuitive way. ::: +## What is d9? + -**Directus is an Open Data Platform built to democratize the database.**\ +**d9 is an Open Data Platform built to democratize the database.**\ This platform provides everyone on your team, _regardless of technical skill_, equal access to data and digital file asset -management, for any data model or project. First, link Directus to your desired SQL database and file storage adapter. After -that, Directus enables you to perform CRUD operations, create users, assign roles with fully configurable permissions, build +management, for any data model or project. First, link d9 to your desired SQL database and file storage adapter. After +that, d9 enables you to perform CRUD operations, create users, assign roles with fully configurable permissions, build complex and granular queries, configure event-driven webhooks and task automation... _the list goes on!_ **Database Introspection & Abstraction**\ -SQL flavors all come with slightly different data types and idiosyncrasies. Directus uses [Database Introspection](#how-it-works) +SQL flavors all come with slightly different data types and idiosyncrasies. d9 uses [Database Introspection](#how-it-works) to read your database structure and create an abstraction layer to handle all the nitty-gritty details behind the scenes. -This technique works seamlessly with any major SQL database. It also lets you link Directus to your new or pre-existing database +This technique works seamlessly with any major SQL database. It also lets you link d9 to your new or pre-existing database or remove it anytime, with no impact on your existing data model. That means you'll never encounter vendor lock-in. **The App and APIs**\ -Once your database is introspected and abstracted, Directus dynamically generates REST and GraphQL API endpoints to manage +Once your database is introspected and abstracted, d9 dynamically generates REST and GraphQL API endpoints to manage your data with granular control. You also get CLI tools for file management and a complete JavaScript SDK. The API and CLI power the no-code App. In other words, the App is just a GUI that provides no-code access to the API. -This architecture is how Directus democratizes the database and provides control to [the whole team](#who-s-it-for). +This architecture is how d9 democratizes the database and provides control to [the whole team](#who-s-it-for). **Open-Source, Modular, Extensible, Scalable**\ -At the highest level, Directus organizes its features and functionality into Modules. Each Module allows you to interact +At the highest level, d9 organizes its features and functionality into Modules. Each Module allows you to interact with data in some specific way, such as data and content management, digital file asset management, drag and drop analytics -dashboard creation, or whatever. If you find Directus is missing something that your project needs, no problem! +dashboard creation, or whatever. If you find d9 is missing something that your project needs, no problem! -Built entirely in Typescript, primarily on [Node.js](https://nodejs.dev) and [Vue.js](https://vuejs.org), Directus is +Built entirely in Typescript, primarily on [Node.js](https://nodejs.dev) and [Vue.js](https://vuejs.org), d9 is 100% open-source, modular and extensible, ensuring your project never hits a hard feature ceiling. The platform scales without issue, _and some Projects have hundreds of millions of users._ @@ -61,13 +65,13 @@ _and much more._ :::tip Ready to dive in? -Get a project running in minutes. Learn Directus hands-on in the [Quickstart Guide](/getting-started/quickstart). +Get a project running in minutes. Learn d9 hands-on in the [Quickstart Guide](/getting-started/quickstart). ::: ## How It Works -**Directus is installed as a _layer_ on top of your new or existing SQL database.** +**d9 is installed as a _layer_ on top of your new or existing SQL database.** The App and API dynamically _"mirror"_ your actual schema and content in real-time. This is similar to how technical database clients (like _phpMyAdmin_) work. However, Database Introspection has many unique advantages: @@ -79,8 +83,8 @@ database clients (like _phpMyAdmin_) work. However, Database Introspection has m - Significant performance improvements through optimizations and indexing. In contrast, other platforms typically use a predefined or proprietary _one-size-fits-all_ data model to store content . -That is not the case with Directus. Directus gives you direct access to your pure and unaltered data. That means you -have the option to bypass the Directus middleware (API, SDK, App) and connect to your data with proper SQL queries. This +That is not the case with d9. d9 gives you direct access to your pure and unaltered data. That means you +have the option to bypass the d9 middleware (API, SDK, App) and connect to your data with proper SQL queries. This effectively removes all bottlenecks, latency overhead, and proprietary access limitations. ::: ## Why Use It? -**Directus is a simple, data-first solution to complex problems with no downsides.** +**d9 is a simple, data-first solution to complex problems with no downsides.** -Directus was created in 2004 and has been slowly, iteratively improved on for a long time. The core team has carefully +d9 was created in 2004 and has been slowly, iteratively improved on for a long time. The core team has carefully thought through the app, beginning to end, and strives to make this platform is an all-benefit and no downside experience. It is also plug-and-play, so you're free to link or remove it anytime, with zero impact on your data. You have no vendor lock-in whatsoever, _your data is yours_. There are no artificial data limits _(e.g. limits on users or @@ -178,40 +182,27 @@ roles)_. Consider competing platforms in the four general use cases [mentioned above](#when-to-use-it). Due diligence to select a viable solution from one of these categories can easily take six months to ensure the feature list, pricing, -scalability, migration options, etc.. all match the project in question. However, with Directus, that's not the case! +scalability, migration options, etc.. all match the project in question. However, with d9, that's not the case! You can test it immediately on an existing database or build a new data model from scratch, _with no impact on your data and no long-term commitments._ The following core principles guide this platform: - **Pure** — No predefined or proprietary schema. All system metadata is stored separately. -- **Open** — Directus Core is open source, with no obfuscated or cloud-only code. +- **Open** — d9 Core is open source, with no obfuscated or cloud-only code. - **Portable** — No vendor lock-in. Your database can be exported or migrated anytime. - **Limitless** — No arbitrary limits or paywalls on users, roles, translations, and data. - **Extensible** — Every aspect of this platform is modular to avoid any hard feature ceiling. - **Unopinionated** — Choose the stack, database, and architecture as you wish. -## Directus Cloud - -**Directus Cloud is the fastest and easiest way to get your Directus Projects going.** +## Self-Hosted -Cloud architecture can be complicated and resource-intensive. Directus Cloud provides scalable, optimized storage and -infrastructure, and automatic updates so developers can focus on the app's core business logic. Directus Cloud also -offers [Cloud Exclusive Extensions](/cloud/glossary#cloud-exclusives), enhancing Directus Core with even more features. +**d9 is designed to be self-hosted on your own infrastructure.** -With your free Directus Cloud account, you can set up Teams to organize Projects, Project billing, and other Team -Members however you need. You'll be able to get a Project running in about 90 seconds. Then as Project growth changes -over time, scale service up or down as needed at the click of a button. The cloud dashboard also provides simple, -straightforward analytics to help understand traffic and inform scaling decisions. - -:::tip Ready to try Directus Cloud? - -Set up your free Cloud account and learn Directus hands-on in the [Quickstart Guide](/getting-started/quickstart). - -::: +You have full control over your data, your deployment, and your infrastructure. Run d9 with Docker, on bare metal, or on any cloud provider of your choice. -:::tip Enterprise Cloud +:::tip Ready to get started? -Need advanced configuration, unlimited scalability, and dedicated support? [Contact us]({{WEBSITE_URL}}contact) +Deploy your own d9 instance in minutes with the [Quickstart Guide](/getting-started/quickstart) or the [Docker Guide](/self-hosted/docker-guide). ::: diff --git a/docs/getting-started/quickstart.md b/docs/getting-started/quickstart.md index 0d865b5800..120dd1d7c5 100644 --- a/docs/getting-started/quickstart.md +++ b/docs/getting-started/quickstart.md @@ -1,74 +1,48 @@ --- description: - Get up and running with Directus Cloud in minutes. Learn the basics of building your data model and managing + Get up and running with d9 in minutes. Learn the basics of building your data model and managing permissions. readTime: 7 min read --- # Quickstart Guide -> This quickstart guide is designed to get you up and running with a Directus Cloud Project in a snap. Along the way, -> you will better understand what Directus is, setup your free Directus Cloud Account, get a _hands-on introduction_ to -> the App and API, and find more resources to deep-dive into. +> This quickstart guide is designed to get you up and running with a d9 Project in a snap. Along the way, +> you will better understand what d9 is, get a _hands-on introduction_ to the App and API, and find more +> resources to deep-dive into. -## 1. Create Cloud Account and Login +## 1. Install & Start d9 -First, you'll need to [create an Account and log in](/cloud/accounts#create-account-and-login) on -[Directus Cloud]({{CLOUD_URL}}/login) +The fastest way to get started is with Docker: -Your Directus Cloud Account allows you to create and manage any number of Projects. We've made life easier by giving you -the option to create and log in to your free Cloud Account automatically with GitHub. If you don't have a GitHub account -or prefer not to use this login method, email-and-password login is available as well. - -The very first time you log in to your cloud account, you will be prompted to create a Team. Teams are totally free to -create. Each Directus Cloud Project exists within the scope of one Team. They allow you to organize Team Members, -Projects and Project Billing as desired. - -Once your Team is created, it's time to create your Directus Cloud Project! - -:::tip Learn More About Cloud - -- [Overview](/cloud/overview) -- [Cloud Accounts](/cloud/accounts) -- [Cloud Teams](/cloud/teams) - -::: - -## 2. Create and Access Project - -To create a Project, follow the steps below: - -1. Open the Team Menu in the Dashboard Header and select or [create](/cloud/teams#create-a-team) the desired Team. -2. Navigate to **"Projects"** and click **"Create Project"**. -3. Set the Project Name and tier. -4. Scroll to the bottom of the screen and choose the **"Empty Project"** Starting Template.\ - Note: The **"Demo Project"** adds in dummy data for in-depth feature demonstrations. -5. Click **"Create Project"**. - -_It should take around 90 seconds for the Cloud Project to build out. During this time, a link will be sent to the email -associated with your Cloud Account. The email will contain your Project URL as well as an email and password to login. -If you used GitHub to create your account, this will be your GitHub email. Once the build is complete, it's time log -in!_ - -7. You can [access a Project](/cloud/projects#access-a-project) from within the Cloud Dashboard or type the URL into - your browser. -8. Log in with your username and password from the email. +```bash +docker run -d \ + -p 8055:8055 \ + -e KEY=some-random-key \ + -e SECRET=another-random-key \ + -e ADMIN_EMAIL=admin@example.com \ + -e ADMIN_PASSWORD=your-password \ + -e DB_CLIENT=sqlite3 \ + -e DB_FILENAME=/directus/database/data.db \ + ghcr.io/lawebcapsule/directus9:latest +``` -:::tip Check All Inbox Folders +Or with npm: -Due to the algorithms used by some email providers, it is possible the email containing your Project login information -will end up in another folder like "Social" or "Promotions". +```bash +npm init @wbce-d9/directus-project@latest +``` -::: +Once running, open `http://localhost:8055` in your browser and log in with the admin credentials you set above. -:::tip Learn More About Cloud Projects +:::tip Learn More About Self-Hosting -- [Overview](/cloud/overview) -- [Cloud Projects](/cloud/projects) +- [Docker Guide](/self-hosted/docker-guide) +- [Config Options](/self-hosted/config-options) ::: -## 3. Create a Collection +## 2. Create a Collection Once logged in, you're greeted with the option to create your first [Collection](/getting-started/glossary#collections). @@ -89,14 +63,14 @@ Once logged in, you're greeted with the option to create your first [Collection] ::: -## 4. Create a Field +## 3. Create a Field With your first Collection created, it's time to start adding some [Fields](/getting-started/glossary#fields). 1. Navigate to **Settings Module > Data Model > `Collection-Name`**. 2. Click the **"Create Field"** button and select the **"Input"** Field type. 3. Fill in a Field name under **Key**. We'll be calling our Field `title`.\ - Directus offers powerful Field customization options, but let's stick to the defaults for now. + d9 offers powerful Field customization options, but let's stick to the defaults for now. 4. Select **"Save"**. ::: tip Learn More About Fields @@ -105,7 +79,7 @@ With your first Collection created, it's time to start adding some [Fields](/get ::: -## 5. Create an Item +## 4. Create an Item Now that we have a Collection with a Field configured, it's time to add an [Item](/getting-started/glossary#). @@ -121,15 +95,15 @@ Now that we have a Collection with a Field configured, it's time to add an [Item ::: -## 6. Set Roles & Permissions +## 5. Set Roles & Permissions -Directus comes with two built-in roles: Public and Admin. The Public Role determines what data is returned to +d9 comes with two built-in roles: Public and Admin. The Public Role determines what data is returned to non-authenticated users. Public comes with all permissions turned off and can be reconfigured with fully granular control to expose exactly what you want unauthenticated Users to see. The Admin role has full permissions and this cannot be changed. Aside from these built-in Roles, any number of new Roles can be created, all with fully customized, granular permissions. -By Default, content entered into Directus will be considered private. So permissions always start off set to the default +By Default, content entered into d9 will be considered private. So permissions always start off set to the default of block **No Access**, with full ability to reconfigure as desired. So, in order to have the API return our Items, let's add some read permissions. For simplicity's sake, we'll do this on the Public Role, instead of creating a new Role. @@ -145,13 +119,13 @@ of creating a new Role. ::: -## 7. Connect to the API +## 6. Connect to the API Now that your Project has some content in it which is exposed to the Public, it's time to start using this content externally! Data can be accessed in a number of ways, including the REST and GraphQL API endpoints. In this case, we'll use the `/items/` [REST API endpoint](/reference/items) to retrieve the Item we just created. -1. Open `http://your-project-url.directus.app/items/articles`.\ +1. Open `http://localhost:8055/items/articles`.\ You can use the browser or an API tool like [Postman](http://postman.com) or [Paw](https://paw.cloud) _And there it is! The Article Item you just created is being served in beautiful JSON, ready to be used anywhere and diff --git a/docs/getting-started/resources.md b/docs/getting-started/resources.md index 8f433850a2..5a0fbd0588 100644 --- a/docs/getting-started/resources.md +++ b/docs/getting-started/resources.md @@ -1,31 +1,24 @@ --- -description: Additional resources to the Directus community. +description: Additional resources for the d9 community. readTime: 1 min read --- # Resources -## Cloud - -- **[Directus Cloud]({{CLOUD_URL}})** — The best way to get your Project up and running. -- **[Enterprise Cloud]({{WEBSITE_URL}}contact)** — Custom-tailored solutions for industrial scale projects. -- **[Cloud Documentation](/cloud/overview)** — Docs for Directus cloud. -- **[System Status](https://status.directus.cloud)** — Up-to-date information on our various cloud systems. - ## Developer Resources - **[GitHub]({{GITHUB_URL}})** — The open-source repository and version control. -- **[NPM Package]({{NPM_URL}})** — The official Directus node package. -- **[Docker Image]({{DOCKER_HUB_URL}})** — The official Directus docker image. -- **[Documentation]({{DOCS_URL}})** — Docs for the most recent version of Directus. +- **[NPM Package]({{NPM_URL}})** — The official d9 node package. +- **[Docker Image]({{DOCKER_HUB_URL}})** — The official d9 docker image. +- **[Documentation]({{DOCS_URL}})** — Docs for the most recent version of d9. - **[Crowdin]({{LOCALES_URL}})** — Service for managing the App's many language translations. ## Community -- **[YouTube]({{YOUTUBE_URL}})** — Checkout our channel with video tutorials and feature - overviews. -- **[Discord]({{DISCORD_CHAT_URL}})** — A growing community of 4K+ developers. -- **[Twitter]({{TWITTER_URL}})** — The latest product info and sneak-peeks. +- **[GitHub Discussions]({{GITHUB_COMMUNITY_URL}})** — Ask questions, share ideas, and get help from the community. +- **[GitHub Issues]({{GITHUB_URL}}/issues)** — Report bugs or request features. - **[Website]({{WEBSITE_URL}})** — General information, resources, and team info. -- **[Awesome List]({{AWESOME_URL}})** — A list of awesome things related - Directus. + +## Contact + +For any question or support request, reach out at [support@webcapsule.io](mailto:{{SUPPORT_EMAIL}}). diff --git a/docs/getting-started/support.md b/docs/getting-started/support.md index 40a67cc013..e22259bce0 100644 --- a/docs/getting-started/support.md +++ b/docs/getting-started/support.md @@ -1,19 +1,19 @@ --- -description: How to get support for your Directus project. -readTime: 4 min read +description: How to get support for your d9 project. +readTime: 3 min read --- # Help & Support -> If you have questions while working with Directus, there are many resources to help you get up-and-running smoothly. +> If you have questions while working with d9, there are many resources to help you get up-and-running smoothly. ## Troubleshooting Steps -If you're experiencing issues or think you have found a problem in Directus, be sure to follow these steps before +If you're experiencing issues or think you have found a problem in d9, be sure to follow these steps before [Reporting a Bug](/contributing/introduction#bug-reporting): 1. Ensure your server and database meet the [minimum requirements](/self-hosted/docker-guide.html#supported-databases). -2. Ensure you’re on the [latest version]({{GITHUB_URL}}/releases/latest) of Directus. +2. Ensure you're on the [latest version]({{GITHUB_URL}}/releases/latest) of d9. 3. Stop `CTRL+C` and restart the server `npx directus start`. 4. Run the database migration script: `directus database migrate:latest`\ _Note: backup your database first._ @@ -23,78 +23,46 @@ If you're experiencing issues or think you have found a problem in Directus, be 8. Check for [existing Issues]({{GITHUB_URL}}/issues?q=is%3Aissue) (and [Discussions]({{GITHUB_URL}}/discussions)) that match your problem. -If you're still experiencing a problem after completing the above steps, you can chat through things on our +If you're still experiencing a problem after completing the above steps, you can reach out via [community support](#community-support) or [report a bug](/contributing/introduction#bug-reporting). -## Support Tiers - -### Community Support +## Community Support [GitHub Discussions]({{GITHUB_URL}}/discussions) is a great first place to reach out for help. Our community and core developers often check this platform and answer posts. It has the added benefit of being an archival resource for others developers with similar questions. -Our [Discord Community]({{DISCORD_CHAT_URL}}) is another great way to get assistance. Please keep all questions in the -help channels, be considerate, and remember that you are getting free help from the community. - :::warning No Guaranteed Response Time -While the Directus Core Team plays an active and engaged role in community discussions, there is no guaranteed response +While the d9 Core Team plays an active and engaged role in community discussions, there is no guaranteed response time for Community Support. ::: -### Basic and Premium Support - -Basic and Premium Support offer direct communication with the Directus Core Team. Basic support is included on all -Enterprise Projects, and Premium Support adds 24/7 response times for critical software issues only. - -Cloud customers and Self-Hosted users interested in learning more about our monthly retainer agreements should contact -us at [{{SUPPORT_EMAIL}}](mailto:{{SUPPORT_EMAIL}}). - -## Sponsored Work +## Direct Support -### Commissioned Features - -If you need a specific feature added to Directus faster than the normal development timeline, -[reach out to us]({{WEBSITE_URL}}contact) for a quote. Our parent agency will often help subsidize the cost of -developing new features if they pass our [80/20 Rule](/contributing/introduction#feature-requests) and can be merged -into the core codebase. Other custom/proprietary development will be built bespoke within our robust extension system. - -### Expedited Fixes - -We triage all reported bugs based on priority and how long the fix is estimated to take. If you need a specific issue -resolved sooner, [reach out to us]({{WEBSITE_URL}}contact) for a quote. +For any question or support request, reach out at [support@webcapsule.io](mailto:{{SUPPORT_EMAIL}}). ## Frequently Asked Questions -### Does Directus support Mongo/NoSQL? +### Does d9 support Mongo/NoSQL? -Not currently. Directus has been built specifically for wrapping _relational_ databases. While we could force Mongo to +Not currently. d9 has been built specifically for wrapping _relational_ databases. While we could force Mongo to use tables, columns, and rows via Mongoose object modeling, that approach of "faking" a relational structure in a non-structured environment like Mongo doesn't make a lot of sense. We do realize many users are interested in this feature, and will continue to explore its possibility. ### Why haven't you added this feature, or fixed that issue yet? -Directus is an open-source project, maintained by a small core team and community contributors who have limited time and +d9 is an open-source project, maintained by a small core team and community contributors who have limited time and resources. Our platform is feature-rich, however we strictly adhere to our -[80/20 Rule](/contributing/introduction#feature-requests) to avoid a messy/bloated codebase. Directus is also quite +[80/20 Rule](/contributing/introduction#feature-requests) to avoid a messy/bloated codebase. d9 is also quite stable, however new issues still arise, some of which may be triaged with a lower prioritization. -If you need, you can contact us about [sponsoring expedited fixes](#expedited-fixes) or -[commissioning new features](#commissioned-features). You can also -[submit a pull request]({{GITHUB_URL}}/pulls) — after all, it is open-source! +You can also [submit a pull request]({{GITHUB_URL}}/pulls) — after all, it is open-source! ### Can you give an ETA for this feature/fix? -If it is sponsored work, then yes, delivery dates are part of our statement of work agreements. Otherwise, most likely -not. This is open-source software, work is prioritized internally, and all timelines are subject to change. - -### But this is an emergency, my very important project requires it now! - -We understand, and are here to help. If you need something prioritized, you can reach out to us to discuss -[premium support](#basic-and-premium-support), [sponsoring expedited fixes](#expedited-fixes) or -[commissioning new features](#commissioned-features). +Most likely not. This is open-source software, work is prioritized internally, and all timelines are subject to change. diff --git a/docs/guides/flows/flows-for-loop.md b/docs/guides/flows/flows-for-loop.md index 37b6d81161..b21f05ee1e 100644 --- a/docs/guides/flows/flows-for-loop.md +++ b/docs/guides/flows/flows-for-loop.md @@ -17,7 +17,7 @@ author: Eron Powell -**Directus Version:** {{$frontmatter.directus_version}} +**d9 Version:** {{$frontmatter.directus_version}} diff --git a/docs/guides/flows/generate-work-reports.md b/docs/guides/flows/generate-work-reports.md index e9b32f47fb..8244a80429 100644 --- a/docs/guides/flows/generate-work-reports.md +++ b/docs/guides/flows/generate-work-reports.md @@ -1,5 +1,5 @@ --- -description: This recipe outlines a method to generate reports using Directus Flows. +description: This recipe outlines a method to generate reports using d9 Flows. tags: [] skill_level: directus_version: 9.18.1 @@ -19,7 +19,7 @@ Pairs well with [workflows](/cookbook/permissions/workflows.md) -**Directus Version:** {{$frontmatter.directus_version}} +**d9 Version:** {{$frontmatter.directus_version}} diff --git a/docs/guides/flows/slugify-text-with-run-script.md b/docs/guides/flows/slugify-text-with-run-script.md index a551c55d07..45e061adf4 100644 --- a/docs/guides/flows/slugify-text-with-run-script.md +++ b/docs/guides/flows/slugify-text-with-run-script.md @@ -15,7 +15,7 @@ author: Eron Powell -**Directus Version:** {{$frontmatter.directus_version}} +**d9 Version:** {{$frontmatter.directus_version}} diff --git a/docs/guides/headless-cms/approval-workflows.md b/docs/guides/headless-cms/approval-workflows.md index c70e9da655..5452adec3b 100644 --- a/docs/guides/headless-cms/approval-workflows.md +++ b/docs/guides/headless-cms/approval-workflows.md @@ -17,7 +17,7 @@ author: Eron Powell -**Directus Version:** {{$frontmatter.directus_version}} +**d9 Version:** {{$frontmatter.directus_version}} @@ -38,7 +38,7 @@ content creation process. There are an infinite number of possible workflows you could configure. But for this recipe, we will configure a simple workflow where `writers` and `editors` work together to create, co-edit and publish `articles`. -![A Workflow]({{CDN_URL}}/docs/v9/configuration/users-roles-permissions/workflows-20220909/workflows-20220909B.webp) +![A Workflow](/images/workflows-20220909B.webp) For this recipe, our workflow will have three stages, `draft`, `under review`, and `published`, which will be defined in a `status` field. @@ -53,7 +53,7 @@ a `status` field. This whole workflow is created with permissions. All we need to do to create these stages is change the `author` and `editor` permissions for each item in `articles` conditionally, based on the value of `status`. -![A Workflow]({{CDN_URL}}/docs/v9/configuration/users-roles-permissions/workflows-20220909/workflows-20220909A.webp) +![A Workflow](/images/workflows-20220909A.webp) ## How-To Guide @@ -62,7 +62,7 @@ This whole workflow is created with permissions. All we need to do to create the To implement a workflow, you'll need: - An understanding of [permissions](/configuration/users-roles-permissions.md) and [filters](/reference/filter-rules.md) - in Directus. + in d9. - A collection with some kind of content. In this recipe, we'll use a collection called `articles`. - A field on that collection to validate conditionally. We'll use a `status` field. - Two _(or more)_ roles that will work to author content. We'll use `writer` and `editor` roles. diff --git a/docs/guides/headless-cms/build-static-website/next-13.md b/docs/guides/headless-cms/build-static-website/next-13.md index 28aeb8bcb2..8579fd5857 100644 --- a/docs/guides/headless-cms/build-static-website/next-13.md +++ b/docs/guides/headless-cms/build-static-website/next-13.md @@ -1,5 +1,5 @@ --- -description: This guide shows you how build a website with Next 13 and Directus as a Headless CMS. +description: This guide shows you how build a website with Next 13 and d9 as a Headless CMS. tags: [] skill_level: directus_version: 9.21.4 @@ -7,23 +7,23 @@ author_override: author: Kevin Lewis --- -# Build a Website With Next 13 and the Directus JavaScript SDK +# Build a Website With Next 13 and the d9 JavaScript SDK > {{ $frontmatter.description }} [Next](https://nextjs.org/) is a popular JavaScript framework based on React.js. In this tutorial, you will learn how to -build a website using Directus as a CMS. You will store, retrieve, and use global metadata such as the site title, -create new pages dynamically based on Directus items, and build a blog. +build a website using d9 as a CMS. You will store, retrieve, and use global metadata such as the site title, +create new pages dynamically based on d9 items, and build a blog. ## Before You Start You will need: - To install Node.js and a code editor on your computer. -- To sign up for a Directus Cloud account. +- To sign up for a d9 Cloud account. - Some knowledge of React.js and Next. -Create a new Directus Cloud project - any tier and configuration is suitable for this tutorial. +Create a new d9 Cloud project - any tier and configuration is suitable for this tutorial. Open your terminal and run the following command to create a new Next project: @@ -45,7 +45,7 @@ Open `my-website` in your code editor. ## Create Helper For @wbce-d9/sdk -To share a single instance of the Directus JavaScript SDK between multiple pages in this project, create a single helper +To share a single instance of the d9 JavaScript SDK between multiple pages in this project, create a single helper file that can be imported later. Create a new directory called `lib` and a new file called `directus.js` inside of it. ```js @@ -54,11 +54,11 @@ const directus = new Directus('https://your-project-id.directus.app/'); export default directus; ``` -Ensure your Project URL is correct when initializing the Directus JavaScript SDK. +Ensure your Project URL is correct when initializing the d9 JavaScript SDK. ## Using Global Metadata and Settings -In your Directus project, navigate to Settings -> Data Model and create a new collection called `global`. Under the +In your d9 project, navigate to Settings -> Data Model and create a new collection called `global`. Under the Singleton option, select 'Treat as a single object', as this collection will have just a single entry containing global website metadata. @@ -68,7 +68,7 @@ Navigate to the content module and enter the global collection. Collections will as a singleton, it will launch directly into the one-item form. Enter information in the title and description field and hit save. -![A form named "Global" has two inputs - a title and a description, each filled with some text.]({{CDN_URL}}/docs/v9/headless-cms/how-to-packet-20220222A/next-global-config.webp) +![A form named "Global" has two inputs - a title and a description, each filled with some text.](/images/next-global-config.webp) By default, new collections are not accessible to the public. Navigate to Settings -> Roles & Permissions -> Public and give Read access to the Global collection. @@ -95,10 +95,10 @@ export default async function HomePage() { ``` Type `npm run dev` in your terminal to start the Next development server and open `http://localhost:3000` in your -browser. You should see data from your Directus Global collection in your page. Some additional files will be created by +browser. You should see data from your d9 Global collection in your page. Some additional files will be created by Next that it expects, but do not yet exist - these can be safely ignored for now. -## Creating Pages With Directus +## Creating Pages With d9 Create a new collection called `pages` - make the Primary ID Field a "Manually Entered String" called `slug`, which will correlate with the URL for the page. For example `about` will later correlate to the page `localhost:3000/about`. @@ -134,14 +134,14 @@ export default async function DynamicPage({ params }) { } ``` -Go to `http://localhost:3000/about`, replacing `about` with any of your item slugs. Using the Directus JavaScript SDK, +Go to `http://localhost:3000/about`, replacing `about` with any of your item slugs. Using the d9 JavaScript SDK, the single item with that slug is retrieved, and the page should show your data. `readOne()` only checks against your `slug` Primary ID Field. _Note that we check if a returned value exists, and return a 404 if not. Please also note that [`dangerouslySetInnerHTML` should only be used for trusted content](https://reactjs.org/docs/dom-elements.html#dangerouslysetinnerhtml)._ -## Creating Blog Posts With Directus +## Creating Blog Posts With d9 Create a new collection called `authors` with a single text input field called `name`. Create one or more authors. @@ -213,7 +213,7 @@ Update the returned HTML: Visit `http://localhost:3000` and you should now see a blog post listing, with latest items first. -![A page with a title of "Blog". On it is a list of three items - each with a title, author, and date. The title is a link.]({{CDN_URL}}/docs/v9/headless-cms/how-to-packet-20220222A/next-blog-listing.webp) +![A page with a title of "Blog". On it is a list of three items - each with a title, author, and date. The title is a link.](/images/next-blog-listing.webp) ### Create Blog Post Listing @@ -249,19 +249,19 @@ export default async function DynamicPage({ params }) { Some key notes about this code snippet. -- In the `` tag, `directus.url` is the value provided when creating the Directus plugin. -- The `width` attribute demonstrates Directus' built-in image transformations. +- In the `` tag, `directus.url` is the value provided when creating the d9 plugin. +- The `width` attribute demonstrates d9' built-in image transformations. - Once again, `dangerouslySetInnerHTML` should only be used if all content is trusted. - Because almost-all fields are used in this page, including those from the `image` relational field, the `fields` - property when using the Directus JavaScript SDK can be set to `*.*`. + property when using the d9 JavaScript SDK can be set to `*.*`. Click on any of the blog post links, and it will take you to a blog post page complete with a header image. -![A blog post page shows an image, a title, and a number of paragraphs.]({{CDN_URL}}/docs/v9/headless-cms/how-to-packet-20220222A/next-blog-single.webp) +![A blog post page shows an image, a title, and a number of paragraphs.](/images/next-blog-single.webp) ## Add Navigation -While not strictly Directus-related, there are now several pages that aren't linked to each other. In `app/layout.tsx`, +While not strictly d9-related, there are now several pages that aren't linked to each other. In `app/layout.tsx`, above the `{children}` rendering, add a navigation. Don't forget to use your specific page slugs. ```html @@ -276,7 +276,7 @@ above the `{children}` rendering, add a navigation. Don't forget to use your spe ## Next Steps -Through this guide, you have set up a Next project, created a Directus helper, and used it to query data. You have used +Through this guide, you have set up a Next project, created a d9 helper, and used it to query data. You have used a singleton collection for global metadata, dynamically created pages, as well as blog listing and post pages. If you want to change what is user-accessible, consider setting up more restrictive roles and accessing only valid data diff --git a/docs/guides/headless-cms/build-static-website/nuxt-3.md b/docs/guides/headless-cms/build-static-website/nuxt-3.md index d5195ef2c6..1006d4d290 100644 --- a/docs/guides/headless-cms/build-static-website/nuxt-3.md +++ b/docs/guides/headless-cms/build-static-website/nuxt-3.md @@ -1,5 +1,5 @@ --- -description: This guide shows you how build a website with Nuxt 3 and Directus as a Headless CMS. +description: This guide shows you how build a website with Nuxt 3 and d9 as a Headless CMS. tags: [] skill_level: directus_version: 9.21.4 @@ -7,25 +7,25 @@ author_override: author: Kevin Lewis --- -# Build a Website With Nuxt 3 and the Directus JavaScript SDK +# Build a Website With Nuxt 3 and the d9 JavaScript SDK > {{ $frontmatter.description }} [Nuxt](https://nuxt.com/) is a popular JavaScript framework based on Vue.js. In this tutorial, you will learn how to -build a website using Directus as a CMS. You will store, retrieve, and use global metadata such as the site title, -create new pages dynamically based on Directus items, and build a blog. +build a website using d9 as a CMS. You will store, retrieve, and use global metadata such as the site title, +create new pages dynamically based on d9 items, and build a blog. ## Before You Start You will need: - To install Node.js and a code editor on your computer. -- To sign up for a Directus Cloud account. +- To sign up for a d9 Cloud account. - Some knowledge of Vue.js and Nuxt. -Create a new Directus Cloud project - any tier and configuration is suitable for this tutorial. +Create a new d9 Cloud project - any tier and configuration is suitable for this tutorial. -Open your terminal and run the following commands to create a new Nuxt project and the Directus JavaScript SDK: +Open your terminal and run the following commands to create a new Nuxt project and the d9 JavaScript SDK: ``` npx nuxt init my-website @@ -53,7 +53,7 @@ export default defineNuxtPlugin(() => { }); ``` -Ensure your Project URL is correct when initializing the Directus JavaScript SDK. +Ensure your Project URL is correct when initializing the d9 JavaScript SDK. Inside of your `app.vue` entry file, add the following to the bottom to test that your plugin works: @@ -61,14 +61,14 @@ Inside of your `app.vue` entry file, add the following to the bottom to test tha ``` -Refresh your browser, and check the console. You should see the Directus instance logged, which means you have access to -all of the Directus JavaScript SDK methods by using the `useNuxtApp()` composable in any page or component. +Refresh your browser, and check the console. You should see the d9 instance logged, which means you have access to +all of the d9 JavaScript SDK methods by using the `useNuxtApp()` composable in any page or component. Once you've confirmed this, remove the ` ``` -Refresh your browser. You should see data from your Directus Global collection in your page. +Refresh your browser. You should see data from your d9 Global collection in your page. -## Creating Pages With Directus +## Creating Pages With d9 Create a new collection called `pages` - make the Primary ID Field a "Manually Entered String" called `slug`, which will correlate with the URL for the page. For example `about` will later correlate to the page `localhost:3000/about`. @@ -134,14 +134,14 @@ of the top-level pages. ``` -Go to `http://localhost:3000/about`, replacing `about` with any of your item slugs. Using the Directus JavaScript SDK, +Go to `http://localhost:3000/about`, replacing `about` with any of your item slugs. Using the d9 JavaScript SDK, the single item with that slug is retrieved, and the page should show your data. `readOne()` only checks against your `slug` Primary ID Field. _Note that we check if a returned value exists, and return a 404 if not. Please also note that [`v-html` should only be used for trusted content.](https://vuejs.org/api/built-in-directives.html#v-html)_ -## Creating Blog Posts With Directus +## Creating Blog Posts With d9 Create a new collection called `authors` with a single text input field called `name`. Create one or more authors. @@ -204,7 +204,7 @@ Update the `