Add urql to frontend

This commit is contained in:
Ramon Wenger 2022-11-22 16:18:52 +01:00
parent c694b1d3e5
commit 84d17ff732
4 changed files with 992 additions and 0 deletions

View File

@ -11,7 +11,9 @@
"@headlessui/vue": "^1.6.7",
"@sentry/tracing": "^7.20.0",
"@sentry/vue": "^7.20.0",
"@urql/vue": "^1.0.2",
"d3": "^7.6.1",
"graphql": "^16.6.0",
"lodash": "^4.17.21",
"loglevel": "^1.8.0",
"pinia": "^2.0.21",
@ -261,6 +263,14 @@
"node": "*"
}
},
"node_modules/@graphql-typed-document-node/core": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/@graphql-typed-document-node/core/-/core-3.1.1.tgz",
"integrity": "sha512-NQ17ii0rK1b34VZonlmT2QMJFI70m0TRwbknO/ihlbatXyaktDhN/98vBiUU6kNBPljqGqyIrl2T4nY2RpFANg==",
"peerDependencies": {
"graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0"
}
},
"node_modules/@hapi/hoek": {
"version": "9.3.0",
"resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz",
@ -1226,6 +1236,31 @@
"url": "https://opencollective.com/typescript-eslint"
}
},
"node_modules/@urql/core": {
"version": "3.0.5",
"resolved": "https://registry.npmjs.org/@urql/core/-/core-3.0.5.tgz",
"integrity": "sha512-6/1HG+WEAcPs+hXSFnxWBTWkNUwa8dj2cHysWokMaFIbAioGtUaSdxp2q9FDMtWAIGdc640NFSt2B8itGLdoAA==",
"dependencies": {
"@graphql-typed-document-node/core": "^3.1.1",
"wonka": "^6.0.0"
},
"peerDependencies": {
"graphql": "^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0"
}
},
"node_modules/@urql/vue": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/@urql/vue/-/vue-1.0.2.tgz",
"integrity": "sha512-TBfMfu+aGmuudqAz4lE+VxlN+2y5xM0ubiQCTFsojCB4CkSa/D0n914ibhqbDtDzs2Ww5dlB/vof1ep1LGRMow==",
"dependencies": {
"@urql/core": "^3.0.0",
"wonka": "^6.0.0"
},
"peerDependencies": {
"graphql": "^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0",
"vue": "^2.7.0 || ^3.0.0"
}
},
"node_modules/@vitejs/plugin-vue": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-3.2.0.tgz",
@ -4077,6 +4112,14 @@
"integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==",
"dev": true
},
"node_modules/graphql": {
"version": "16.6.0",
"resolved": "https://registry.npmjs.org/graphql/-/graphql-16.6.0.tgz",
"integrity": "sha512-KPIBPDlW7NxrbT/eh4qPXz5FiFdL5UbaA0XUNz2Rp3Z3hqBSkbj0GVjwFDztsWVauZUWsbKHgMg++sk8UX0bkw==",
"engines": {
"node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0"
}
},
"node_modules/has": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
@ -6909,6 +6952,11 @@
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/wonka": {
"version": "6.1.1",
"resolved": "https://registry.npmjs.org/wonka/-/wonka-6.1.1.tgz",
"integrity": "sha512-shBtyZ0KFvUadtnDGlTRA4mF4pgcRoyZKikdputKhmShoXWcZDvlg6CUw6Jx9nTL7Ub8QUJoIarPpxdlosg9cw=="
},
"node_modules/word-wrap": {
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
@ -7201,6 +7249,12 @@
}
}
},
"@graphql-typed-document-node/core": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/@graphql-typed-document-node/core/-/core-3.1.1.tgz",
"integrity": "sha512-NQ17ii0rK1b34VZonlmT2QMJFI70m0TRwbknO/ihlbatXyaktDhN/98vBiUU6kNBPljqGqyIrl2T4nY2RpFANg==",
"requires": {}
},
"@hapi/hoek": {
"version": "9.3.0",
"resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz",
@ -7985,6 +8039,24 @@
"eslint-visitor-keys": "^3.3.0"
}
},
"@urql/core": {
"version": "3.0.5",
"resolved": "https://registry.npmjs.org/@urql/core/-/core-3.0.5.tgz",
"integrity": "sha512-6/1HG+WEAcPs+hXSFnxWBTWkNUwa8dj2cHysWokMaFIbAioGtUaSdxp2q9FDMtWAIGdc640NFSt2B8itGLdoAA==",
"requires": {
"@graphql-typed-document-node/core": "^3.1.1",
"wonka": "^6.0.0"
}
},
"@urql/vue": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/@urql/vue/-/vue-1.0.2.tgz",
"integrity": "sha512-TBfMfu+aGmuudqAz4lE+VxlN+2y5xM0ubiQCTFsojCB4CkSa/D0n914ibhqbDtDzs2Ww5dlB/vof1ep1LGRMow==",
"requires": {
"@urql/core": "^3.0.0",
"wonka": "^6.0.0"
}
},
"@vitejs/plugin-vue": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-3.2.0.tgz",
@ -10071,6 +10143,11 @@
"integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==",
"dev": true
},
"graphql": {
"version": "16.6.0",
"resolved": "https://registry.npmjs.org/graphql/-/graphql-16.6.0.tgz",
"integrity": "sha512-KPIBPDlW7NxrbT/eh4qPXz5FiFdL5UbaA0XUNz2Rp3Z3hqBSkbj0GVjwFDztsWVauZUWsbKHgMg++sk8UX0bkw=="
},
"has": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
@ -11979,6 +12056,11 @@
"is-typed-array": "^1.1.10"
}
},
"wonka": {
"version": "6.1.1",
"resolved": "https://registry.npmjs.org/wonka/-/wonka-6.1.1.tgz",
"integrity": "sha512-shBtyZ0KFvUadtnDGlTRA4mF4pgcRoyZKikdputKhmShoXWcZDvlg6CUw6Jx9nTL7Ub8QUJoIarPpxdlosg9cw=="
},
"word-wrap": {
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",

View File

@ -17,7 +17,9 @@
"@headlessui/vue": "^1.6.7",
"@sentry/tracing": "^7.20.0",
"@sentry/vue": "^7.20.0",
"@urql/vue": "^1.0.2",
"d3": "^7.6.1",
"graphql": "^16.6.0",
"lodash": "^4.17.21",
"loglevel": "^1.8.0",
"pinia": "^2.0.21",

View File

@ -3,6 +3,8 @@ import * as log from "loglevel";
import { createPinia } from "pinia";
import { createApp, markRaw } from "vue";
import urql from "@urql/vue";
import App from "./App.vue";
import { loadLocaleMessages, setupI18n } from "./i18n";
import router from "./router";
@ -42,6 +44,9 @@ loadLocaleMessages(i18n, "de").then(() => {
});
app.use(pinia);
app.use(i18n);
app.use(urql, {
url: "http://localhost:8000/server/graphql/",
});
app.mount("#app");
});

903
server/schema.graphql Normal file
View File

@ -0,0 +1,903 @@
schema {
query: Query
}
type BlockQuoteBlock implements StreamFieldInterface {
id: String
blockType: String!
field: String!
rawValue: String!
value: String!
}
type BooleanBlock implements StreamFieldInterface {
id: String
blockType: String!
field: String!
rawValue: String!
value: Boolean!
}
type CharBlock implements StreamFieldInterface {
id: String
blockType: String!
field: String!
rawValue: String!
value: String!
}
type ChoiceBlock implements StreamFieldInterface {
id: String
blockType: String!
field: String!
rawValue: String!
value: String!
choices: [ChoiceOption!]!
}
type ChoiceOption {
key: String!
value: String!
}
type Circle implements PageInterface {
id: ID
path: String!
depth: Int
numchild: Int!
translationKey: UUID!
title: String!
draftTitle: String!
slug: String!
contentType: String!
live: Boolean!
hasUnpublishedChanges: Boolean!
urlPath: String!
owner: User
seoTitle: String!
showInMenus: Boolean!
searchDescription: String
goLiveAt: DateTime
expireAt: DateTime
expired: Boolean!
locked: Boolean
lockedAt: DateTime
lockedBy: User
firstPublishedAt: DateTime
lastPublishedAt: DateTime
latestRevisionCreatedAt: DateTime
aliasOf: Page
pageType: String
url: String
parent: PageInterface
children(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
siblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
nextSiblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
previousSiblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
descendants(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
ancestors(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
}
type CollectionObjectType {
id: ID!
path: String!
depth: Int!
numchild: Int!
name: String!
descendants: [CollectionObjectType]!
ancestors: [CollectionObjectType]!
}
type CompetencePage implements PageInterface {
id: ID
path: String!
depth: Int
numchild: Int!
translationKey: UUID!
title: String!
draftTitle: String!
slug: String!
contentType: String!
live: Boolean!
hasUnpublishedChanges: Boolean!
urlPath: String!
owner: User
seoTitle: String!
showInMenus: Boolean!
searchDescription: String
goLiveAt: DateTime
expireAt: DateTime
expired: Boolean!
locked: Boolean
lockedAt: DateTime
lockedBy: User
firstPublishedAt: DateTime
lastPublishedAt: DateTime
latestRevisionCreatedAt: DateTime
aliasOf: Page
pageType: String
url: String
parent: PageInterface
children(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
siblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
nextSiblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
previousSiblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
descendants(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
ancestors(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
}
type CompetenceProfilePage implements PageInterface {
id: ID
path: String!
depth: Int
numchild: Int!
translationKey: UUID!
title: String!
draftTitle: String!
slug: String!
contentType: String!
live: Boolean!
hasUnpublishedChanges: Boolean!
urlPath: String!
owner: User
seoTitle: String!
showInMenus: Boolean!
searchDescription: String
goLiveAt: DateTime
expireAt: DateTime
expired: Boolean!
locked: Boolean
lockedAt: DateTime
lockedBy: User
firstPublishedAt: DateTime
lastPublishedAt: DateTime
latestRevisionCreatedAt: DateTime
aliasOf: Page
pageType: String
url: String
parent: PageInterface
children(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
siblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
nextSiblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
previousSiblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
descendants(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
ancestors(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
}
type Course {
id: ID
}
type CourseCategory {
id: ID
}
type CourseCompletion {
id: ID
}
type CoursePage implements PageInterface {
id: ID
path: String!
depth: Int
numchild: Int!
translationKey: UUID!
title: String!
draftTitle: String!
slug: String!
contentType: String!
live: Boolean!
hasUnpublishedChanges: Boolean!
urlPath: String!
owner: User
seoTitle: String!
showInMenus: Boolean!
searchDescription: String
goLiveAt: DateTime
expireAt: DateTime
expired: Boolean!
locked: Boolean
lockedAt: DateTime
lockedBy: User
firstPublishedAt: DateTime
lastPublishedAt: DateTime
latestRevisionCreatedAt: DateTime
aliasOf: Page
pageType: String
url: String
parent: PageInterface
children(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
siblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
nextSiblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
previousSiblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
descendants(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
ancestors(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
}
type CourseSession {
id: ID
}
type CourseSessionUser {
id: ID
}
type DateBlock implements StreamFieldInterface {
id: String
blockType: String!
field: String!
rawValue: String!
value(format: String): String!
}
scalar DateTime
type DateTimeBlock implements StreamFieldInterface {
id: String
blockType: String!
field: String!
rawValue: String!
value(format: String): String!
}
type DecimalBlock implements StreamFieldInterface {
id: String
blockType: String!
field: String!
rawValue: String!
value: Float!
}
type DocumentChooserBlock implements StreamFieldInterface {
id: String
blockType: String!
field: String!
rawValue: String!
document: LibraryDocument!
}
type EmailBlock implements StreamFieldInterface {
id: String
blockType: String!
field: String!
rawValue: String!
value: String!
}
type EmbedBlock implements StreamFieldInterface {
id: String
blockType: String!
field: String!
rawValue: String!
value: String!
url: String!
embed: String
rawEmbed: JSONString
}
type FloatBlock implements StreamFieldInterface {
id: String
blockType: String!
field: String!
rawValue: String!
value: Float!
}
type ImageChooserBlock implements StreamFieldInterface {
id: String
blockType: String!
field: String!
rawValue: String!
image: ImageObjectType!
}
type ImageObjectType {
id: ID!
collection: CollectionObjectType!
title: String!
file: String!
width: Int!
height: Int!
createdAt: DateTime!
uploadedByUser: User
focalPointX: Int
focalPointY: Int
focalPointWidth: Int
focalPointHeight: Int
fileSize: Int
fileHash: String!
renditions: [ImageRenditionObjectType!]!
src: String! @deprecated(reason: "Use the `url` attribute")
url: String!
aspectRatio: Float!
sizes: String!
tags: [TagObjectType!]!
rendition(max: String, min: String, width: Int, height: Int, fill: String, format: String, bgcolor: String, jpegquality: Int, webpquality: Int): ImageRenditionObjectType
srcSet(sizes: [Int], format: String): String
}
type ImageRenditionObjectType {
id: ID!
filterSpec: String!
file: String!
width: Int!
height: Int!
focalPointKey: String!
image: ImageObjectType!
title: String!
createdAt: DateTime!
focalPointX: Int
focalPointY: Int
focalPointWidth: Int
focalPointHeight: Int
fileSize: Int
fileHash: String!
src: String! @deprecated(reason: "Use the `url` attribute")
url: String!
aspectRatio: Float!
sizes: String!
collection: CollectionObjectType!
tags: [TagObjectType!]!
}
type IntegerBlock implements StreamFieldInterface {
id: String
blockType: String!
field: String!
rawValue: String!
value: Int!
}
scalar JSONString
type LearningContent implements PageInterface {
id: ID
path: String!
depth: Int
numchild: Int!
translationKey: UUID!
title: String!
draftTitle: String!
slug: String!
contentType: String!
live: Boolean!
hasUnpublishedChanges: Boolean!
urlPath: String!
owner: User
seoTitle: String!
showInMenus: Boolean!
searchDescription: String
goLiveAt: DateTime
expireAt: DateTime
expired: Boolean!
locked: Boolean
lockedAt: DateTime
lockedBy: User
firstPublishedAt: DateTime
lastPublishedAt: DateTime
latestRevisionCreatedAt: DateTime
aliasOf: Page
pageType: String
url: String
parent: PageInterface
children(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
siblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
nextSiblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
previousSiblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
descendants(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
ancestors(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
}
type LearningPath implements PageInterface {
id: ID
path: String!
depth: Int
numchild: Int!
translationKey: UUID!
title: String!
draftTitle: String!
slug: String!
contentType: String!
live: Boolean!
hasUnpublishedChanges: Boolean!
urlPath: String!
owner: User
seoTitle: String!
showInMenus: Boolean!
searchDescription: String
goLiveAt: DateTime
expireAt: DateTime
expired: Boolean!
locked: Boolean
lockedAt: DateTime
lockedBy: User
firstPublishedAt: DateTime
lastPublishedAt: DateTime
latestRevisionCreatedAt: DateTime
aliasOf: Page
pageType: String
url: String
parent: PageInterface
children(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
siblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
nextSiblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
previousSiblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
descendants(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
ancestors(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
}
type LearningSequence implements PageInterface {
id: ID
path: String!
depth: Int
numchild: Int!
translationKey: UUID!
title: String!
draftTitle: String!
slug: String!
contentType: String!
live: Boolean!
hasUnpublishedChanges: Boolean!
urlPath: String!
owner: User
seoTitle: String!
showInMenus: Boolean!
searchDescription: String
goLiveAt: DateTime
expireAt: DateTime
expired: Boolean!
locked: Boolean
lockedAt: DateTime
lockedBy: User
firstPublishedAt: DateTime
lastPublishedAt: DateTime
latestRevisionCreatedAt: DateTime
aliasOf: Page
pageType: String
url: String
parent: PageInterface
children(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
siblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
nextSiblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
previousSiblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
descendants(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
ancestors(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
}
type LearningUnit implements PageInterface {
id: ID
path: String!
depth: Int
numchild: Int!
translationKey: UUID!
title: String!
draftTitle: String!
slug: String!
contentType: String!
live: Boolean!
hasUnpublishedChanges: Boolean!
urlPath: String!
owner: User
seoTitle: String!
showInMenus: Boolean!
searchDescription: String
goLiveAt: DateTime
expireAt: DateTime
expired: Boolean!
locked: Boolean
lockedAt: DateTime
lockedBy: User
firstPublishedAt: DateTime
lastPublishedAt: DateTime
latestRevisionCreatedAt: DateTime
aliasOf: Page
pageType: String
url: String
parent: PageInterface
children(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
siblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
nextSiblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
previousSiblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
descendants(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
ancestors(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
}
type LibraryDocument {
id: ID
collection: CollectionObjectType!
title: String!
file: String!
createdAt: DateTime!
fileSize: Int
fileHash: String!
url: String!
tags: [TagObjectType!]!
}
type ListBlock implements StreamFieldInterface {
id: String
blockType: String!
field: String!
rawValue: String!
items: [StreamFieldInterface!]!
}
type MediaCategoryPage implements PageInterface {
id: ID
path: String!
depth: Int
numchild: Int!
translationKey: UUID!
title: String!
draftTitle: String!
slug: String!
contentType: String!
live: Boolean!
hasUnpublishedChanges: Boolean!
urlPath: String!
owner: User
seoTitle: String!
showInMenus: Boolean!
searchDescription: String
goLiveAt: DateTime
expireAt: DateTime
expired: Boolean!
locked: Boolean
lockedAt: DateTime
lockedBy: User
firstPublishedAt: DateTime
lastPublishedAt: DateTime
latestRevisionCreatedAt: DateTime
aliasOf: Page
pageType: String
url: String
parent: PageInterface
children(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
siblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
nextSiblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
previousSiblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
descendants(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
ancestors(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
}
type MediaLibraryPage implements PageInterface {
id: ID
path: String!
depth: Int
numchild: Int!
translationKey: UUID!
title: String!
draftTitle: String!
slug: String!
contentType: String!
live: Boolean!
hasUnpublishedChanges: Boolean!
urlPath: String!
owner: User
seoTitle: String!
showInMenus: Boolean!
searchDescription: String
goLiveAt: DateTime
expireAt: DateTime
expired: Boolean!
locked: Boolean
lockedAt: DateTime
lockedBy: User
firstPublishedAt: DateTime
lastPublishedAt: DateTime
latestRevisionCreatedAt: DateTime
aliasOf: Page
pageType: String
url: String
parent: PageInterface
children(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
siblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
nextSiblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
previousSiblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
descendants(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
ancestors(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
}
type Page implements PageInterface {
id: ID
path: String!
depth: Int
numchild: Int!
translationKey: UUID!
title: String!
draftTitle: String!
slug: String!
contentType: String!
live: Boolean!
hasUnpublishedChanges: Boolean!
urlPath: String!
owner: User
seoTitle: String!
showInMenus: Boolean!
searchDescription: String
goLiveAt: DateTime
expireAt: DateTime
expired: Boolean!
locked: Boolean
lockedAt: DateTime
lockedBy: User
firstPublishedAt: DateTime
lastPublishedAt: DateTime
latestRevisionCreatedAt: DateTime
aliasOf: Page
sitesRootedHere: [SiteObjectType!]!
aliases: [Page!]!
coursepage: CoursePage
learningpath: LearningPath
topic: Topic
circle: Circle
learningsequence: LearningSequence
learningunit: LearningUnit
learningcontent: LearningContent
competenceprofilepage: CompetenceProfilePage
competencepage: CompetencePage
performancecriteria: PerformanceCriteria
medialibrarypage: MediaLibraryPage
mediacategorypage: MediaCategoryPage
pageType: String
url: String
parent: PageInterface
children(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
siblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
nextSiblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
previousSiblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
descendants(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
ancestors(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
}
type PageChooserBlock implements StreamFieldInterface {
id: String
blockType: String!
field: String!
rawValue: String!
page: PageInterface!
}
interface PageInterface {
id: ID
title: String!
slug: String!
contentType: String!
pageType: String
live: Boolean!
url: String
urlPath: String!
depth: Int
seoTitle: String!
searchDescription: String
showInMenus: Boolean!
locked: Boolean
firstPublishedAt: DateTime
lastPublishedAt: DateTime
parent: PageInterface
children(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
siblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
nextSiblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
previousSiblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
descendants(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
ancestors(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
}
type PerformanceCriteria implements PageInterface {
id: ID
path: String!
depth: Int
numchild: Int!
translationKey: UUID!
title: String!
draftTitle: String!
slug: String!
contentType: String!
live: Boolean!
hasUnpublishedChanges: Boolean!
urlPath: String!
owner: User
seoTitle: String!
showInMenus: Boolean!
searchDescription: String
goLiveAt: DateTime
expireAt: DateTime
expired: Boolean!
locked: Boolean
lockedAt: DateTime
lockedBy: User
firstPublishedAt: DateTime
lastPublishedAt: DateTime
latestRevisionCreatedAt: DateTime
aliasOf: Page
pageType: String
url: String
parent: PageInterface
children(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
siblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
nextSiblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
previousSiblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
descendants(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
ancestors(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
}
scalar PositiveInt
type Query {
redirects: [RedirectType!]!
collections(limit: PositiveInt, offset: PositiveInt, order: String, id: ID): [CollectionObjectType]!
tag(id: ID): TagObjectType
tags(limit: PositiveInt, offset: PositiveInt, order: String, id: ID): [TagObjectType!]!
search(query: String): [Search!]!
document(id: ID): LibraryDocument
documents(collection: ID, limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [LibraryDocument!]!
documentType: String!
image(id: ID): ImageObjectType
images(collection: ID, limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [ImageObjectType!]!
imageType: String!
site(hostname: String, id: ID): SiteObjectType
sites(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [SiteObjectType!]!
pages(contentType: String, inSite: Boolean = false, site: String, ancestor: ID, parent: ID, limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
page(id: Int, slug: String, urlPath: String, token: String, contentType: String, inSite: Boolean = false, site: String): PageInterface
}
type RawHTMLBlock implements StreamFieldInterface {
id: String
blockType: String!
field: String!
rawValue: String!
value: String!
}
type RedirectType {
oldPath: String!
oldUrl: String!
newUrl: String!
page: PageInterface
isPermanent: Boolean!
}
type RegexBlock implements StreamFieldInterface {
id: String
blockType: String!
field: String!
rawValue: String!
value: String!
}
type RichTextBlock implements StreamFieldInterface {
id: String
blockType: String!
field: String!
rawValue: String!
value: String!
}
union Search = CoursePage | LearningPath | Topic | Circle | LearningSequence | LearningUnit | LearningContent | CompetenceProfilePage | CompetencePage | PerformanceCriteria | MediaLibraryPage | MediaCategoryPage | Page | LibraryDocument | User | SecurityRequestResponseLog | Course | CourseCategory | CourseCompletion | CourseSession | CourseSessionUser
type SecurityRequestResponseLog {
id: ID
}
type SiteObjectType {
id: ID!
hostname: String!
port: Int!
siteName: String!
rootPage: Page!
isDefaultSite: Boolean!
pages(contentType: String, limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
page(id: Int, slug: String, urlPath: String, token: String, contentType: String): PageInterface
}
type StaticBlock implements StreamFieldInterface {
id: String
blockType: String!
field: String!
rawValue: String!
value: String!
}
type StreamBlock implements StreamFieldInterface {
id: String
blockType: String!
field: String!
rawValue: String!
blocks: [StreamFieldInterface!]!
}
type StreamFieldBlock implements StreamFieldInterface {
id: String
blockType: String!
field: String!
rawValue: String!
value: String!
}
interface StreamFieldInterface {
id: String
blockType: String!
field: String!
rawValue: String!
}
type StructBlock implements StreamFieldInterface {
id: String
blockType: String!
field: String!
rawValue: String!
blocks: [StreamFieldInterface!]!
}
type TagObjectType {
id: ID!
name: String!
}
type TextBlock implements StreamFieldInterface {
id: String
blockType: String!
field: String!
rawValue: String!
value: String!
}
type TimeBlock implements StreamFieldInterface {
id: String
blockType: String!
field: String!
rawValue: String!
value(format: String): String!
}
type Topic implements PageInterface {
id: ID
path: String!
depth: Int
numchild: Int!
translationKey: UUID!
title: String!
draftTitle: String!
slug: String!
contentType: String!
live: Boolean!
hasUnpublishedChanges: Boolean!
urlPath: String!
owner: User
seoTitle: String!
showInMenus: Boolean!
searchDescription: String
goLiveAt: DateTime
expireAt: DateTime
expired: Boolean!
locked: Boolean
lockedAt: DateTime
lockedBy: User
firstPublishedAt: DateTime
lastPublishedAt: DateTime
latestRevisionCreatedAt: DateTime
aliasOf: Page
pageType: String
url: String
parent: PageInterface
children(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
siblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
nextSiblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
previousSiblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
descendants(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
ancestors(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
}
type URLBlock implements StreamFieldInterface {
id: String
blockType: String!
field: String!
rawValue: String!
value: String!
}
scalar UUID
type User {
id: ID
}